IMD 1.18: 19/12/2012 10:08:43  Disk Descriptor30à?€00M4åååååååååååååå0 ( ) *!+",#-$.%/ 0 '&åååååååååååååååååååååååååååååååååååååååååååååååå0 ( ) *!+",#-$.%/ 0 '&ISASI111Z80€ ISASI111Z800HDISK100DEF ISHA101 DEF contents (D1..7). ; ; 1.6 - 3 MAY 84 GRH ; Change block move subroutine to allow for 1..65,536 byte moves. ; Fix bugs in å TO S100 BUS ; LOCPRTS EQU 0 ;BASE ADDRESS OF LOCAL PORTS LOCMEM EQU 0 ;BASE ADDRESS OF LOCAL RAM ; S1PRTS EQU 80H ;BASE************************************** ; ; REVISIONS: ; 1.0 - 28 DEC 83 GRH ; DIAGNOSTIC VERSION FOR TESTING THE BOARD. ;ISASI10 DEF ISASI110Z80€!"#$%&'()*+,-./0ISASI110Z80I12345ISASI112Z80€6789:;<=>?@ABCDEJade driver. Add printer output diagnostic. ; ; 1.7 - 2 JUN 84 GRH ; Fix bug in HSTIN & HSTOUT macros outputting bit 7 dataå ADDRESS OF S100 PORTS ; S1MEM EQU 8000H ;BASE ADDRESS OF S100 MEMORY WINDOW ; LOCROM EQU LOCMEM ;BASE ADDRESS OF LOCAL RO 1.1 - 2 JAN 84 GRH ; ADD HARD DISK CONTROLLER FIRMWARE. ; 1.2 - 1 APR 84 GRH ; Fix Bug in host xfer subr. that caused prISASI112Z80;FGHIJKLMNOPQISASI113Z80€RSTUVWXYZ[\]^_`aISASI113Z80 0 LD A,#DATA ;OUTPUT DATA ENDIF OUT (#PORT OR 80H),A ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@E ERROR ; CNOTF: LD A,1 SHL HSERRB ;PLAIN ERROR JR CMDR1 ; ; ; NO ERROR FROM COMMAND ; CNOERR: XOR A ;CLEAR BUSY & E ERROR ENCOUNTERED ; MEMERR: LD A,FERR01 ;PASS ERROR TO HOST & HALT OUT (HDATA),A LD A,HFERR OUT (HSTAT),A OUT (HINTC) FALSE THEN WAIT BIT SREQ,A JR Z,AA#SYM ; INI ;GET DATA ; ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@--------------------------------------- ; ; ALL COMMANDS RETURN HERE ; ENTRY- CF= ERROR ; A= 0: NOT FIRMWARE ERROR ; /0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; HOST INPUT MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@RROR FLAGS JR CMDR1 ; ;############################################################################ ; ; COMMAND TABLE FOR ,A ;CLEAR PENDING INTERRUPT HALT IF $ > 38H CONMSG **** ERROR! RESET CODE OVERLAPS INTERRUPT CODE! **** ENDIF ;------@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; PUTDATA MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: ERROR CODE ; ;---------------------------------------------------------------------------- CMDRET: JR NC,CNOERR ;IF NOT E@@@@@@@ HSTIN: MACRO #PORT IF #PORT < 80H XOR A ELSE LD A,#PORT ;SET UP BIT 7 ENDIF OUT (HXAD15),A ; IN ANON-IOPB COMMANDS ; ;############################################################################ CMDTBL: DW IOPBLO ;(1) SET---------------------------------------------------------------------- ; ; INTERRUPT ENTRY VECTOR FOR MODE 1 ; ;------------@@@ PUTDATA MACRO AC#SYM: CALL GETSTAT ;IF REQUEST NOT TRUE THEN WAIT BIT SREQ,A JR Z,AC#SYM ; OUTI ;ASSUME CALLER SRROR THEN SAY SO ; OR A ;IF A= 0 THEN NO ERROR JR Z,CNOTF ; OUT (HDATA),A ;PUT ERROR IN DATA REG LD A,HFERR ;SET FIR,(#PORT OR 80H) ;FETCH DATA ENDM SUBTTL CODE ;************************************************ ; ; PROCESSOR REGISTER U IOPB LO COMMAND DW IOPBHI ;(3) SET IOPB HI COMMAND DW IOPBX ;(5) SET IOPB XADDR COMMAND DW DIAG0 ;(7) DUMP LOCAL MEMOR---------------------------------------------------------------- ORG LOCROM + 38H ; ; CHECK FOR SASI INTERRUPT ; IN A,(ET UP ; DON'T WAIT ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; BUFFER HALFMWARE ERROR ; CMDR1: OUT (HSTAT),A ;PASS ERROR TO HOST ; POP HL ;WASTE RETURN ADDRESS TO WAIT RTN ; LD HL,-1 ;SET TIMOSAGE: ; IX= PTR TO CURRENT DISK DRIVE TABLE ; IY= PTR TO CURRENT COMMAND DESCRIPTOR BLOCK ; ;*******************************Y DIAGNOSTIC CMD DW DIAG1 ;(9) SET OUTPUT PORTS DIAG. COMMAND DW DIAG2 ;(B) TEST S100 MEMORY ACCESS COMMAND DW DIAG3 ;(HCMD) ;GET COMMAND BIT HINTRB,A ;IF NOT HOST INTERRUPT THEN MUST BE SASI JP Z,SASINT ; ; CHECK FOR IOPB EXECUTE INTERRUP SELECT MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SELCTBUF MACRO LD HL,HDSECB ;UT TIME HWAITC: LD (TIMOUT),HL ; OUT (HINTC),A ;CLEAR HOST INTERRUPT & BUSY FLAG ; ; ; MAIN INTERRUPTED LOOP ; HWAIT:***************** ORG LOCROM ; RESETV: ; ; INIT SOME THINGS ; OUT (HINTS),A ;SET BUSY FLAG ; XOR A ;PASS NOT -1 TD) BLOCK MOVE 01000H TO 02000H COMMAND DW PRINT ;(F) PRINT ASCII STRING TO PORT COMMAND DW RETVERS ;(11) RETURN FIRMWARE VT ; BIT HIOPBB,A ;IF IOPB BIT SET THEN EXECUTE IOPB JP NZ,EXIOPB ; ; COMMAND INTERRUPT ; AND 00011110B ;MASK OFF UNUASSUME 1ST HALF LD A,(IOPB + PBSECO) ;IF SECTOR IS ODD THEN SELECT UPPER HALF AND 1 JR Z,BB#SYM ; LD HL,HDSECB + 128 B EI ;ALLOW INTERRUPTS ; ; IF TIMED OUT THEN CONTINUE TO WAIT ; LD HL,(TIMOUT) ;IF TIMED OUT THEN JUST WAIT LD A,H O BOOT OUT (HSTAT),A ; IM 1 ;ONLY 1 INTERRUPT ; LD SP,STACK ;INIT STACK ; ; TEST RAM ; LD HL,LOCRAM ;DO RAM TESTERSION NUMCMDS EQU ($ - CMDTBL) / 2 ;NUMBER OF COMMANDS SUBTTL COMMANDS ;+++++++++++++++++++++++++++++++++++++++++++++++++SED COMMANDS ; CP NUMCMDS * 2 ;IF COMMAND ERROR THEN RETURN FIRMWARE ERR JR C,CMDOK ; ; ILLEGAL COMMAND, RETURN ERROR B#SYM: ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; HOST OUTPUT MACRO ; ;@@@@ OR L JR Z,HWAIT ; ; ELSE DELAY SOME MORE ; DEC HL LD (TIMOUT),HL LD A,H ;IF TIME OUT JUST WENT TO 0 THEN OR L  LD BC,RAMSIZE ; MTLP: LD A,(HL) ;COMPLEMENT & TEST CPL LD (HL),A CP (HL) JR NZ,MEMERR ;IF NO COMPARE THEN ERROR ;+++++++++++++++++++++++++++ ; ; SET IOPB LOW ADDRESS COMMAND 1 ; MUST BE INITIALIZED BEFORE DISK ACCESS ; ENTRY- A= LOW BYTE; LD A,FERR03 SCF JR CMDRET ; ; ; FETCH COMMAND VECTOR FROM TABLE ; CMDOK: LD HL,CMDTBL ADD L LD L,A LD A,0 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ HSTOUT: MACRO #PORT, #DATA IF #PORT < 80H XOR A  CPL ;RESTORE LD (HL),A ; INC HL ;NEXT LOCATION DEC BC LD A,B OR C JR NZ,MTLP ; ; INIT THE REMAINDER ;  OF IOPB ADDRESS ; EXIT - HDATA= OLD DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IO ADC A,H LD H,A LD E,(HL) INC HL LD D,(HL) EX DE,HL ; ; PREFETCH DATA FOR COMMAND ; IN A,(HDATA) ; ; CALL T ELSE LD A,#PORT ;SET UP BIT 7 ENDIF OUT (HXAD15),A ; IF (#DATA = 0) AND (#PORT <> 0) XOR A ENDIF IF  ;NO INTERRUPTS UNTIL FINISHED OUT (SASICMD),A LD A,[1 SHL SERRCLR] OUT (SASICMD),A EI JR HWAIT ; ; ; NOT FIRMWARCALL INIT ;ANY OTHER INITIALIZATION ; ; GO WAIT FOR HOST COMMAND ; LD HL,0 ;FORCE NO TIMEOUT JP HWAITC ; ; ; RAM JR NZ,HWAIT ; ; TIMED OUT, DESELECT SASI BUS ; XOR A OUT (SASIDATA),A LD A,[1 SHL SSELECT] OR [1 SHL SERRCLR] DI 0 ( ) *!+",#-$.%/ &0 'PBLO: LD HL,IOPBL ;POINT TO LOW BYTE TO ALTER JR IOPBST ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ANOTHER DATA WORD IS WRITTEN TO THE DATA ; REGISTER BY THE HOST. ; ; ENTRY- A= 0: BLOCK MOVE FROM 1000H TO 2000H ; 1:  IMAGE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIAG0: ;*** COMMENTED OUT FOR NOW *** XOR A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; PRINT TEXT ON THE PRINTER++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIAG1: OUT (HDATA),A OUT (HSTAT),A JP DIAGR ;++++++++++++++ ; ; SET IOPB HIGH ADDRESS COMMAND 3 ; MUST BE INITIALIZED BEFORE DISK ACCESS ; ENTRY- A= HIGH BYTE OF IOPB ADDRREAD FROM 1000H (SCOPING TEST) ; 2: WRITE TO 1000H (SCOPING TEST) ; 3: BLOCK MOVE FROM E000H TO E800H ; ALL OTHE ; OUT (HXADDR),A ;USE DATA FOR EXTENDED ADDRESS XOR A ;BOTTOM 32K OUT (HXADDR),A OUT (HXAD15),A ; ; DUMP LOCAL RA COMMAND 15 ; EXERCISES THE I/O CAPABILITY ; ENTRY- A= PORT # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DIAG2 COMMAND 11 TESTS S100 MEMORY READS & WRIESS ; EXIT - HDATA= OLD DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IOPBHI: LD HL,IRS: NOP ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIAG3: ; ; IF SUBCOMMAND 0 THEN GM 1ST ; LD HL,LOCRAM ;DUMP LOCAL RAM TO S100 RAM LD DE,S1MEM + 4000H ;DUMP TO HOST AT 4000H LD BC,RAMSIZE ;USE ALL RAM +++++++++++++++++ PRINT: OUT (HXAD15),A ;SET PORT TO DATA SET 7,A ;MAP TO HOST LD C,A ; ; OUTPUT NEW LINE ; CALL CRTES FROM XX1000H TO XX1FFFH ; EXIT- XX0FF2H= LAST LOCATION CHECKED ; XX0FF4H= 0: OK ; READ DATA IF ERROR ; XX0FF5H= CONOPBH ;POINT TO HIGH BYTE TO ALTER JR IOPBST ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O DO MOVE ; OR A JR Z,DOMOVE ; ; LOOP ON COMMAND ; D3LP: IN A,(HDATA) ;IF DATA CHANGED THEN CHECK ; CP 2 JR C,D LDIR ; ; FOLLOW WITH ROM IMAGE ; LD HL,LOCROM ;FOLLOW WITH ROM IMAGE LD BC,ROMSIZE LDIR ; ; FOLLOW THAT WITH TLF ; ; OUTPUT A LINE ; LD E,'0' ;START WITH '0' LD B,80 ;DO 1 LINE PRINT1: CALL PRT INC E DJNZ PRINT1 ; ; OUTPTENTS OF LAST LOCATION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIAG2: ; ; SET UP  ; ; SET IOPB EXTENDED ADDRESS COMMAND 5 ; MUST BE INITIALIZED BEFORE DISK ACCESS ; ENTRY- A= EXTENDED ADDRESS BYTE OF IOPB OREAD ;IF SUBCOMMAND == READ ADDRESS THEN EXIT ; JR Z,DOWRITE ;IF SUBCOMMAND == WRITE THEN THEN EXIT CP 3 JR Z,DOBLKHHE JADE CONTROLLER BANK 0 ; HSTOUT DDPORT,DDMB0 ;FOLLOW WITH FDC BANK 0 LD HL,(FDADDR) LD BC,1024 PUSH HL LDIR ; ;UT A NEW LINE ; CRLF: LD E,0DH CALL PRT LD E,0AH CALL PRT ; ; NO POSSIBLE ERRORS TO RETURN ; XOR A RET ;--FOR TEST ; LD HL,S1MEM + 1000H LD BC,ROMSIZE + RAMSIZE ; ; TEST THE S100 ACCESS ; D2LP: LD A,(HL) CPL LD (HL),A ADDRESS ; EXIT - HDATA= OLD DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IOPBX: LD H ;IF SUBCOMMAND == HIGH BLOCK MOVE THEN EXIT ; ; UNSUPPORTED SUBCOMMAND, QUIT WITH NO ERRORS ; XOR A RET ; ; ;  THEN THE JADE CONTROLLER BANK 1 ; HSTOUT DDPORT,DDMB1 ;FOLLOW WITH FDC BANK 1 POP HL LD BC,1024 LDIR ; ; REMOVE-------------------------------------------------------------------------- ; ; RETURN FIRMWARE VERSION COMMAND 17 ; EXIT - HD CP (HL) CPL ;RESTORE LD (HL),A JR NZ,D2ERR ; INC HL DEC BC LD A,B OR C JR NZ,D2LP ; ; ERROR OR DONE, PASL,IOPBXA ;POINT TO EXTENDED BYTE TO ALTER ; ; COMMON CODE ; IOPBST: LD C,(HL) ;SAVE OLD DATA LD (HL),A ;SET NEW DATA WRITE TO SINGLE LOCATION SUBCOMMAND ; DOWRITE: LD (S1MEM + 1000H),A JR D3LP ; ; ; READ FROM SINGLE LOCATION SUBCOMMAN THE JADE WINDOW ; HSTOUT DDPORT,DDOUT ;REMOVE DD WINDOW SO HOST WON'T CRASH ; ; RETURN NO POSSIBLE ERRORS ; XOR A ;NATA= VERSION # (HEX) ; ;---------------------------------------------------------------------------- RETVERS: LD A,VERSN ;S BACK THE DATA ; D2ERR: LD (S1MEM + 0FF2H),HL ;FAILURE LOCATION LD (S1MEM + 0FF4H),A ;ORIGINAL DATA LD A,(HL) ;MEMORY D LD A,C ;PASS OLD DATA TO HOST OUT (HDATA),A ; XOR A ;RETURN NO ERRORS (PREVENTS DATA OVERWRITE) RET ;++++++++++++D ; DOREAD: LD A,(S1MEM + 1000H) JR D3LP ; ; ; BLOCK MOVE IN LOW HOST MEMORY THEN RETURN SUBCOMMAND ; DOMOVE: LD O ERRORS OUT (HSTAT),A ; ; RETURN DIRECTLY TO WAIT ROUTINE, OTHERWISE DATA OVERWRITTEN ; DIAGR: LD SP,STACK ;DIRECT RETULOAD DATA REGISTER WITH VERSION OUT (HDATA),A ; ; RETURN NO ERRORS ; XOR A RET ;********************************ATA LD (S1MEM + 0FF5H),A ; ; RETURN NO ERRORS ; XOR A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DIAGNOSTIC DUMP COMMAND 7 LOADS HOST MEMORY WITH RAM IMAGHL,S1MEM + 1000H LD DE,S1MEM + 2000H LD BC,1000H LDIR ; XOR A RET ; ; ; BLOCK MOVE IN HIGH HOST MEMORY THEN RETURN, FLUSH RETURN ADDR FROM STACK LD HL,(TIMOUT) ;PASS TIMEOUT JP HWAITC ;++++++++++++++++++++++++++++++++++++++++++++++******************************************** ; ; PRINT A CHARACTER TO HOST PORT ; ENTRY- C= PORT # ; E= CHARACTER TO OUTPUT+++++++++++++++++++++++ ; ; DIAG3 COMMAND 13 DOES S100 MEMORY ACCESSES DEPENDING ON DATA ; NOTE: SCOPING TESTS CONTINUE UNTILE ; ENTRY- A= BANK ADDRESS ; EXIT - XX4000H..XX47FFH= RAM IMAGE ; XX4800H..XX4FFFH= ROM IMAGE ; XX5000H..XX57FFH= JADE FDCRN SUBCOMMAND ; DOBLKH: LD A,1 SHL A15B ;SET HIGH PAGE OUT (HXAD15),A LD HL,0E000H LD DE,0E800H LD BC,800H LDIR ; ++++++++++++++++++++++++++++++ ; ; DIAGNOSTIC 1 COMMAND 9 LOADS DATA INTO DATA OUT & STATUS REGS ; ENTRY- A= DATA ; ;++++++0 ( ) *!+",#-$.%/ &0 ' ; ;**************************************************************************** PRT: IN A,(C) ;IF BUSY THEN WAIT AND 1 JJADE IOPB COMMANDS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE CONTROLLER LOGON COSK SO CHECK FOR JADE DISK ; CHKJAD: LD HL,JADCMDS ;ASSUME JADE CISK COMMAND SUB JADBASD ;4..11 -> 0..7 CP JADNDRV JAL BUFFER ; LD HL,JADSECB ;GET DATA TO BUFFER CALL HDHSTR ; ; XFER LOCAL BUFFER TO JADE CONTROLLER ; HSTOUT DDPORT,D######## JADCMDS: DW JADLOG ;0: LOG ON DISK DW JADREAD ;1: READ SECTOR DW JADWRT ;2: WRITE SECTOR DW JADFORM ;3: FOR NZ,PRT ; ; OUTPUT STROBE* ON BIT 7 ; LD A,E ;OUTPUT CHARACTER WITH STROBE HIGH SET 7,A OUT (C),A ; RES 7,A OUTMMAND IS SAME AS READ ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADLOG: ;+++++++++R NC,XILDRV ; LD (IOPB + PBDRVO),A ;CHANGE DRIVE ; ; CHECK IF COMMAND IS ILLEGAL ; XTABL: LD A,(IOPB + PBCMDO) ;CHECK IDMB1 ;GET FDC WINDOW LD HL,(FDADDR) EX DE,HL LD HL,JADSECB LD BC,128 XOR A CALL MOV2HST ; ; EXECUTE THE COMMAND RMAT TRACK DW JADRDAD ;4: READ ADDRESS DW JADEXEC ;5: EIA OUTPUT DW JADEXEC ;6: EIA STATUS DW JADEXEC ;7: IDLE DW  (C),A ; SET 7,A OUT (C),A ; RET SUBTTL SASI INTERRUPT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE CONTROLLER READ SECTOR COMMAND ; ;+++++++++++++F LEGAL CP MAXCMDS JR NC,XILCMD ; ; COMPUTE DRIVER ADDRESS ; LD E,A LD D,0 ADD HL,DE ;MULTIPLY CMD BY 2 FOR OFF ; CALL FDSKEX ;EXECUTE WRITE SECTOR CMD PUSH AF ;SAVE ERROR STATUS ; ; REMOVE THE JADE WINDOW ; HSTOUT DDPORT,DDOUJADEXEC ;8: RETURN FIRMWARE VERSION DW JADEXEC ;9: SET DISK FLAGS DW JADEXEC ;10: LOAD HEAD & IDLE DW JADEXEC ;11: SEE+++++++++++++++++++ ; ; INTERRUPT WITHOUT HOST BIT SET ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADREAD: ; ; EXECUTE THE READ COMMAND ; HSTOUT DDPORT,DDSET ADD HL,DE LD A,(HL) ;GET COMMAND FROM TABLE INC HL LD H,(HL) LD L,A ; ; CALL THE COMMAND ; LD DE,XRET ;PT ;REMOVE WINDOW ; ; RETURN ERROR STATUS ; POP AF ;ERROR STATUS RET ;++++++++++++++++++++++++++++++++++++++++++++K TRACK DW JADEXEC ;12: SET DRIVE PARAMETERS DW JADEXEC ;13: RETURN DRIVE STATUS DW JADEXEC ;14: SET EIA BAUD RATES D++++++++++ SASINT: ; ; THIS VERSION DOESN'T SUPPORT THE INTERRUPT! ; LD A,FERR04 ;OUTPUT ERROR FOR NOW SCF JP CMDREMB0 ;SWITCH DD INTO MEMORY CALL FDSKEX PUSH AF ;SAVE ERROR STATUS ; ; XFER THE JADE CONTROLLER DATA TO LOCAL BUFFER ; UT RETURN ADDRESS ON STACK PUSH DE JP (HL) ;EXECUTE COMMAND ; ; THIS RETURN MUST RETURN IOPB TO HOST FOR STATUS UPDATE++++++++++++++++++++++++++++++++ ; ; JADE CONTROLLER FORMAT COMMAND ; (NOT IMPLEMENTED) ; ;++++++++++++++++++++++++++++++++W JADEXEC ;15: CLEAR ; HDCMDS: DW HDLOG ;0: LOG ON DISK (SELECT DISK) DW HDREAD ;1: READ DEBLOCKED SECTOR DW HDWRT ;T SUBTTL IOPB EXECUTION ;---------------------------------------------------------------------------- ; ; EXECUTE IOPB  HSTOUT DDPORT,DDMB1 ;DATA IN BANK 1 LD HL,(FDADDR) ;GET FDC ADDRESS LD DE,JADSECB EX DE,HL LD BC,128 ;FETCH SECTOR DA ; XRET: PUSH AF ;SAVE POSSIBLE ERROR CODE ; ; MOVE LOCAL IOPB TO HOST IOPB AREA FOR STATUS RETURN ; LD HL,IOPB ;SOUR++++++++++++++++++++++++++++++++++++++++++++ JADFORM: ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++2: WRITE DEBLOCKED SECTOR DW HDFORM ;3: FORMAT TRACK DW HDCERR ;4: READ ADDRESS DW HDCERR ;5: EIA OUTPUT DW HDCERR ;COMMAND ; ;---------------------------------------------------------------------------- EXIOPB: ; ; MOVE HOST IOPB INTO OTA XOR A CALL MOVFHST ; ; REMOVE THE JADE CONTROLLER WINDOW ; HSTOUT DDPORT,DDOUT ; ; XFER THE SECTOR DATA FROM TCE := LOCAL IOPB IMAGE LD DE,(IOPBL) ;GET ADDRESS OF IOPB IN USER RAM LD A,(IOPBXA) ; SET BANK # ; LD BC,IOPBSZ ; CAL+++++++++ ; ; JADE CONTROLLER READ ADDRESS COMMAND ; (NOT IMPLEMENTED) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++6: EIA STATUS DW HDCERR ;7: IDLE DW HDCERR ;8: RETURN FIRMWARE VERSION DW HDCERR ;9: SET DISK FLAGS & SECTORS DW HDCEUR LOCAL IOPB ; LD HL,IOPB ;DESTINATION := LOCAL IOPB IMAGE LD DE,(IOPBL) ;GET ADDRESS OF IOPB IN USER RAM ; LD A,(IOHE LOCAL BUFFER TO THE HOST MEMORY ; LD HL,JADSECB ;NOW WRITE TO HOST CALL HDHSTW ; ; RETURN ERROR STATUS ; POP AF L MOV2HST ; ; RETURN ERROR CODE ; POP AF JP CMDRET ; ; ; ILLEGAL DRIVE ERROR ; XILDRV: LD A,FERR05 SCF JP CM+++++++++++++++++++++++++++ JADRDAD: ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADRR ;10: LOAD HEAD & IDLE DW HDSEEK ;11: SEEK TRACK (NORMALLY IMPLIED) DW HDCERR ;12: SET DRIVE PARAMETERS DW HDCERR ;1PBXA) ; SET BANK # LD BC,IOPBSZ ; CALL MOVFHST ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PBSTATO),A ; ; CHEC RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE CONTROLLER WRITE SECTOR COMMADRET ; ; ; ILLEGAL COMMAND ERROR ; XILCMD: LD A,FERR06 SCF JP CMDRET ;##########################################E CONTROLLER ILLEGAL COMMAND(S) ; (NOT IMPLEMENTED) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3: RETURN DRIVE STATUS DW HDCERR ;14: SET EIA BAUD RATES DW HDCERR ;15: CLEAR ; MAXCMDS EQU ($ - HDCMDS) / 2 SUBTTL K FOR HARD DISK ; LD A,(IOPB + PBDRVO) LD HL,HDCMDS ;ASSUME HARD DISK COMMAND CP HDNDRV JR C,XTABL ; ; NOT HARD DIND ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADWRT: ; ; XFER DATA FROM HOST TO LOC################################## ; ; IOPB COMMANDS ; ;####################################################################0 ( ) *!+",#-$.%/ &0 '++++++ JADEXEC: LD A,FERR05 ;UNSUPPORTED FOR NOW! SCF RET SUBTTL JADE FDC SUBR ;++++++++++++++++++++++++++++++++++++BUF ;REFRESH BUFFER WITH SECTOR DATA RET C ; ; SELECT THE BUFFER HALF ; SELCTBUF ; ; XFER THE DATA FROM THE HOST M SUBTTL HARD DISK IOPB COMMANDS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; UNSUPPORT SELECT DRIVE ; CALL HDSELCT RET C ; ; USE PRIMITIVE ; JP RECALC ;++++++++++++++++++++++++++++++++++++++++++++ ; LD HL,HDSECB ;WRITE ID SECTOR TO HOST CALL HDHSTW ; ; FLUSH BUFFER OF DESCRIPTOR SECTOR ; CALL CLRBUFR ; ; D++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE COMMAND BLOCK FUNC. ; EXIT - NZ, CF= ERROR ; A= 0 (NOT FIRMWARE) EMORY ; CALL HDHSTR ;READ HOST BUFFER ; ; WRITE THE SECTOR BUFFER ; JP HDWRBUF ;WRITE TO DISK ;++++++++++++++++ED COMMAND ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDCERR: LD A,FERR06 SCF RET ++++++++++++++++++++++++++++++++ ; ; SEEK COMMAND ; EXIT - CF= ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++ONE, RETURN NO ERRORS ; HDLOG1: XOR A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FDSKEX: ; ; CHANGE LOGICAL SECTOR {0..N-1}++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT TRACK COMMAND ; ;+++++++++++++++++++++++++++++++++++ ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DRIVE SELECT/LOG-ON COMMAND ; EXIT - CF=+++++++++++++++++++++++++ HDSEEK: ; ; SELECT DRIVE ; CALL HDSELCT ;IMPLIED SELECT RET C ; ; SET UP CDB ; LD IY ; ; READ DEBLOCKED SECTOR COMMAND ; EXIT - CF= ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TO PHYSICAL {1..N} ; LD A,(IOPB + PBSECO) INC A LD (IOPB + PBSECO),A ; ; MOVE IOPB INTO JADE CONTROLLER ; LD DE,D+++++++++++++++++++++++++++++++++++++++++ HDFORM: ; ; SELECT THE DRIVE ; CALL HDSELCT ;IMPLIED SELECT RET C ; ; S ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDLOG: ; ; SELECT THE CONTROLLER ,LAXCDB ;USE XFER CDB LD (IY+CMD),SCSEEK ;SEEK COMMAND CALL GETLUN CALL GETLAD ;GET USER'S BLOCK ; ; EXECUTE THE SEEK++++++++++ HDREAD: ; ; SELECT DRIVE ; CALL HDSELCT ;IMPLIED SELECT RET C ; ; SET UP AND READ THE SECTOR ; LD IDCBO ;OFFSET OF IOPB IN MEMORY BANK 0 LD HL,(FDADDR) ;BASE ADDRESS OF JADE MEMORY BANKS ADD HL,DE EX DE,HL LD HL,IOPB ET UP THE CDB ; LD IY,LAXCDB ;ELSE USE XFER CDB LD (IY + CMD),SCFMTT ; LD A,(IOPB + PBSECO) ;SECTOR BYTE HAS INTERLEAVE ; CALL HDSELCT RET C ; ; READ THE ID SECTOR ; LD IY,IDRCDB ;READ THE ID SECTOR CALL GETLUN CALL HDRDBUF RET C  ; CALL XCDB6 ;SEND CDB RET C ; ; RETURN THE RESULTS ; JP GETRES ;GET ANY ERRORS SUBTTL HARD DISK SUBROUTINES Y,LAXCDB ;USE XFER CDB CALL GETLUN CALL GETLAD CALL HDRDBUF RET C ; ; SELECT THE BUFFER HALF ; SELCTBUF ; ; WLD BC,PBDMAXO + 1 ;COUNT, INCLUSIVE XOR A CALL MOV2HST ; ; ISSUE COMMAND TO JADE CONTROLLER ; HSTOUT DDPORT,DDEXC ;IFACTOR AND 00011111B ;MASK OFF HEAD BITS LD (IY+ILV),A ; ; FORCE SECTOR TO 0 FOR CLEANLINESS ; XOR A LD (IOPB + PBS ; ; CHECK FOR LEGAL ID SECTOR ; LD DE,IDTXT ;TXT PTR LD HL,HDSECB ;TEXT IN SECTOR BUFFER LD B,IDSZE ;SIZE ; HDCKID ;**************************************************************************** ; ; CLEAR CONTROLLER SUBR ; ;****************RITE THE SECTOR BUFFER TO THE HOST MEMORY ; CALL HDHSTW ; ; RETURN NO ERRORS ; XOR A RET ;+++++++++++++++++++++SSUE COMMAND ; ; SET UP FOR RETURN ; LD BC,IOPBSZ - PBSTATO ;SET UP TO MOVE STATUS DOWN ; ; WAIT FOR JADE CONTROLLER ECO),A ; ; SET UP CDB FROM IOPB ; CALL GETLUN ;GET DRIVE CALL GETLAD ;GET LOGICAL ADDRESS ; ; EXECUTE ; CALL X: LD A,(DE) ;COMPARE CP (HL) JR NZ,HDNTID ;IF NOT SAME THEN EXIT ; INC HL ;NEXT CHAR INC DE DJNZ HDCKID ;DO UNTIL ************************************************************ INIT: ; ; INIT VARIABLES ; LD A,-1 LD (CURDRV),A ;CURRENT+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE SECTOR COMMAND ; EXIT - CF= ERROR ; ;++++++++++++++++++++TO FINISH ; FDSKWT: HSTIN DDPORT ;WAIT UNTIL DONE AND DDSHLT JR NZ,FDSKWT ; ; DONE, GET WINDOW ; HSTOUT DDPORT,DDCDB6 RET C ;ERR? ; ; RESTORE ILV BYTE OF CDB FOR SUBSEQUENT OPS ; LD (IY+ILV),0 ;RESTORE ILV BYTE TO 0 ; ; RETURN DONE ; ; ID CHECKS, RETURN VALID ID FLAG ; LD A,-2 JR HDLOG2 ; ; NO ID, USE DEFAULT ; HDNTID: LD HL,DEFDSEC ;P DRIVE = NONE ; ; INIT COMMAND DESCRIPTOR BLOCKS (CDB) ; LD HL,NULCDB ;ZERO CDBS LD B,CDBINIT INITRAM: LD (HL),0 I++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDWRT: ; ; SELECT THE DRIVE ; CALL HDSELCT ;IMPLIED SELECT RMB0 ;GET WINDOW ; ; FETCH COMMAND RESULT STATUS ; XOR A CALL MOVFHST ; ; CHECK FOR ERRORS ; LD A,(IOPB + PBSTATRESULTS ; JP GETRES ;FINISH UP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RECAASS BACK DEFAULT DESCRIPTOR SECTOR LD DE,HDSECB LD BC,128 LDIR ; LD A,-2 ;DEFAULT IS EXTENDED TYPE ; ; RETURN THENC HL DJNZ INITRAM ; ; RESET THE HARD DISK CONTROLLER ; LD A,1 SHL SRESET ;RESET CONTROLLER OUT SASICMD,A ; EX (SPET C ; ; PREREAD THE SECTOR BUFFER, IF APPLICABLE ; LD IY,LAXCDB ;USE XFER CDB CALL GETLUN CALL GETLAD ; CALL HDRDO) ;IF NO ERROR THEN RETURN 0, NC OR A RET Z ; LD A,0 ;NOT FIRMWARE ERROR SCF ; BUT ERROR JUST THE SAME RET L COMMAND ; EXIT - CF= ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDRECAL: ; ;  DESCRIPTOR SECTOR FLAG TO HOST ; HDLOG2: LD (IOPB + PBST2O),A ;STORE THE DESCRIPTOR SECTOR TYPE ; ; WRITE THE HOST BUFFER0 ( ) *!+",#-$.%/ &0 '),HL ;GIVE A LITTLE EXTRA TIME EX (SP),HL ; LD A,1 SHL SERRCLR ;RELEASE RESET OUT SASICMD,A ; ; CLEAR THE SECTOR BUF********** ; ; WRITE HD SECTOR FROM BUFFER SUBR ; ENTRY- IY= CDB PTR ; CDB= SET UP ; ;***********************************TR ; CDB= SET UP ; EXIT - CF= ERROR ; ;**************************************************************************** HDRDBU BUFFER THE SAME FUNCTION ; EXIT - ZF= SAME ; NZ= NOT SAME ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++T DISK DATA POP AF RET NC ; ; ELSE CHECK RETRIES ; PUSH AF ;SAVE ERROR CODE LD A,(RETRYS) SUB A,1 LD (RETRYS),FER ; CALL CLRBUFR ;START WITH FRESH BUFFER READ ; ; SET UP THE JADE CONTROLLER POINTERS ; HSTIN DDPORT ;FETCH FDC A***************************************** HDWRBUF: ; ; SET UP CDB ; LD (IY+CMD),SCWRIT ;WRITE COMMAND ; LD (IY+NBK),1F: ; ; IF BUFFER DATA VALID THEN SKIP PREREAD ; CALL QBUFR RET Z ; ; SET UP RETRY COUNT ; LD C,4 ;ASSUME RETRIE+++++++++++++++ QBUFR: ; ; IF NOT SAME DRIVE THEN RETURN NZ ; LD A,(IOPB + PBDRVO) ;CHECK DRIVE 1ST LD HL,BUFDRV CP A JR C,HDRDNOT ;RETRIES EXHAUSTED IF TRUE ; POP AF ;ELSE TRY AGAIN JP HDRDRTY ; ; ERROR OCCURRED, CLEAR BUFFER PTRS DDRESS AND DDSASW RLCA OR HIGH DDBASE LD H,A LD L,0 LD (FDADDR),HL ; ; ALL DONE ; RET ;+++++++++++++++++ ;ALLWAYS USE 1 BLOCK (SECTOR) ; ; EXECUTE THE COMMAND 1ST ; CALL XCDB6 ;SEND CDB RET C ; ; SET UP FOR DATA XFER S ; LD HL,IOPB + PBFLGO LD A,(HL) ;FETCH FLAGS BIT PBRTRY,A JR Z,HDRTRY1 ; LD C,0 ;IF NO RETRIES ALLOWED THEN COUN(HL) RET NZ ; ; IF SECTORE NOT SAME THEN RETURN NZ ; LD DE,(IOPB + PBSECO) ;NOW CHECK SECTOR ; RES 0,E ;CLEAR BLOCKTO FORCE SUBSEQUENT READ ; HDRDNOT: CALL CLRBUFR ;BUFFER CONTAMINATED ; ; RETURN ERROR STATUS ; POP AF RET ; ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; EXIT - CY= NC: NORMAL ; CF: ERR; LD BC,[HDBUFSZ SHL 8] + SASIDATA ;SET COUNT, PORT LD HL,HDSECB ; ; WAIT FOR DATA REQUEST ; HDWRLP: CALL GETSTAT ;IFT = 0 ; HDRTRY1: LD A,C LD (RETRYS),A ; ; SEND RETRY DISABLE FLAG TO CONTROLLER ; LD A,(HL) ;CHECK FOR CONTROLLER ING BIT ; LD HL,(BUFSEC) SBC HL,DE RET NZ ; ; IF TRACK NOT = THEN RETURN NZ ; LD DE,(IOPB + PBTRKO) ;LAST, CHECK T; DATA REQUEST TRUE, XFER THE DATA ; HDRD2: INI ;*PTR++ = SASI DATA; CNT-- JP NZ,HDRDLP ; ; XFER OVERFLOW (CONTROLLEOR, A= CODE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDSELCT: ; ; IF CURRENT DRIVE READY THEN BIT SREQ,A JR Z,HDWRLP ; ; IF DATA REQUEST THEN GO XFER IT ; AND SSXMSK ; IF DATA READY THEN PUT IT RETRY DISABLE AND 80H LD (IY + RTY),A ; ; EXECUTE THE READ COMMAND ; HDRDRTY: LD (IY+CMD),SCREAD ;READ COMMAND LD RACK LD HL,(BUFTRK) SBC HL,DE RET ;**************************************************************************** ; ;R REQUESTED MORE DATA THAN 1 SECTOR'S WORTH) ; DETERMINE WHAT CONTROLLER WANTS & RE-SYNC SASI BUS ; HDRDOV: CALL GETSTAT ; == REQUESTED DRIVE THEN RETURN ; LD A,(IOPB + PBDRVO) ;IF REQUESTED DRIVE = CURRENT DRIVE THEN SUB A,(CURDRV) RET Z ; CP SGTDAT JP Z,HDWR2 ; ; IF STATUS MODE THEN GET IT ; CP SSNDST ; ELSE IF READY FOR STATUS THEN GET IT JP NZ,HDRWF(IY+NBK),1 ;ALLWAYS USE 1 BLOCK (SECTOR) ; CALL XCDB6 ;SEND CDB RET C ;IF ERROR HERE THEN HARD ERROR! ; ; SET UP FOR  CLEAR BUFFER SUBR ; EXIT - A= -1 ; ;**************************************************************************** CLRBUFR: IF READY THEN INPUT DATA BIT SREQ,A JR Z,HDRDOV ; AND SSXMSK CP SSNDST ;IF READY FOR STATUS THEN GET IT JP Z,HDRDDN  RETURN ; ; TEST DRIVE READY ; LD IY,NULCDB ;USE NUL CDB LD (IY+CMD),SCRDY ;TEST READY COMMAND ; CALL GETLUN ;REQUEER ; ELSE UNKNOWN CONDITION! ; JP GETRES ; ; ; DATA REQUEST, XFER DATA ; HDWR2: OUTI ;SASI DATA = *PTR++; CNT-- DATA XFER ; LD BC,[HDBUFSZ SHL 8] + SASIDATA ;SET COUNT, PORT LD HL,HDSECB ;XFER PTR ; ; WAIT FOR DATA REQUEST ; HDRD; ; STORING -1 INTO DRIVE FORCES A READ ; LD A,-1 LD (BUFDRV),A RET ;******************************************** ; ; IGNORE THE EXCESS DATA ; HDWASTE: CALL HDXWST ;OVERFLOW, WASTE DATA CALL GETRES ;FINISH UP ; ; ASSUME DATA BST LUN FROM USER CALL XCDB6 ;EXECUTE CDB JR C,SELERR ;NOT READY, EXIT ; ; GET RESULTS ; CALL GETRES ;GET RESULT BYTJP NZ,HDWRLP ; ; DATA XFER COUNT EXHAUSTED, BETTER BE REQUESTING STATUS NOW ; HDWROV: CALL GETSTAT ;OVERFLOW, WASTE DATA LP: CALL GETSTAT ;IF NOT READY THEN WAIT BIT SREQ,A JR Z,HDRDLP ; AND SSXMSK ; IF DATA READY THEN GET IT CP SSNDD******************************** ; ; MAKE BUFFER PTRS = PB PTRS ; ;*********************************************************UFFER CONTAMINATED, CLEAR IT! ; HDRWFER: CALL CLRBUFR ;BUFFER CONTAMINATED ; ; RETURN UNKNOWN FIRMWARE ERROR ; LD A,E RET C ;CAN'T EVEN GET RESULT STATUS..HARD ERROR ; ; RETURN NO ERRORS ; SELERR: XOR A ;NO ERRORS RET ;****** BIT SREQ,A JR Z,HDWROV ; AND SSXMSK CP SSNDST JP NZ,HDWASTE ;IF NOT STATUS THEN WASTE DATA ; ; STATUS IS BEING REAT JP Z,HDRD2 ; CP SSNDST ; ELSE IF NOT READY FOR STATUS THEN ERR JR NZ,HDRWFER ; ; OPERATION DONE, GET RESULTS ;******************* MAKSAME: ; ; STORE IOPB PTRS INTO BUFFER PTRS ; LD A,(IOPB + PBDRVO) LD (BUFDRV),A LD HL,(IOPB +FERR08 ; UNKNOWN CONDITION, USE HANDSHAKE SCF RET ;**************************************************************************************************************************************** ; ; READ HD SECTOR INTO BUFFER SUBR ; ENTRY- IY= CDB PQUESTED, GO GET IT ; JP GETRES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; QUERY HDRDDN: CALL GETRES ; ; BUFFER CONTAINS GOOD DATA, SET BUFFER PTRS ; PUSH AF CALL NC,MAKSAME ;MAKE BUFFER PTRS REFLEC 0 ( ) *!+",#-$.%/ &0 ' PBTRKO) LD (BUFTRK),HL LD HL,(IOPB + PBSECO) RES 0,L ;CLEAR BLOCKING BIT 1ST LD (BUFSEC),HL RET ;**************EXIT ; MOV3: JP PO,MOV5 ;IF DONE THEN RETURN ; ; IF NO ROLLOVER THEN DO NEXT ; EX AF,AF' BIT 7,D ;IF NOT ROLLOVER T********************* HDHSTW: LD DE,(IOPB + PBDMAO) ;GET DESTINATION PTR LD A,(IOPB + PBDMAXO) ;SET BANK REGISTER LD BC,128OMMAND ; LD IY,NULCDB LD (IY+CMD),SCREC ;RECAL COMMAND CALL GETLUN ; CALL XCDB6 ; ; RETURN THE RESULTS ; JP GE DIRECTION FLAGS ARE SET ; EX AF,AF' ;SET FLAGS OR A EX AF,AF' ; ; SET UP BIT 15 REGISTER ; LD A,D ;SET BIT 15 ************************************************************** ; ; READ DATA FROM HOST IOPB SUBR ; MOVES 128 BYTES FROM (PBHEN REPEAT JP NZ,MOV4 ; ; ELSE TOGGLE BIT 15 ; LD A,I ;TOGGLE BIT 15 XOR 80H LD I,A OUT (HXAD15),A ; ; IF BI ;MOVE 128 BYTES ;**************************************************************************** ; ; BLOCK MOVE TO HOST STRES ;FINISH UP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET STATUS FUNCTION ; OUT (HXAD15),A ; ; CHECK FOR LONG MOVE ; DEC BC ;IF > 32K MOVE THEN DO LONG WAY LD A,B CP 32768 / 256 JR NC,DOLONDMA) TO (HL) ; ENTRY- HL= DESTINATION PTR ; EXIT - BC, DE, HL= ? ; ;********************************************************T 15 TOGGLED TO 0 THEN BUMP EXTENDED ADDRESS ; BIT 7,A ;IF TOGGLED TO 0 THEN BUMP BANK JP NZ,NO64KX ; LD A,(MOVX) INCUBR ; ENTRY- HL= LOCAL PTR (SRC) ; DE= HOST PTR (DST) ; BC= BYTE COUNT ; A= BANK ADDRESS (DST) ; ;********************* EXIT- A= STATUS WORD ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETSTAT: IN A,SASIST G ; LD A,E ;IF 64K CROSS THEN DO LONG WAY ADD C LD A,D ADC B JR C,DOLONG ; XOR D ;IF 32K CROSS THEN DO LONG WAY ******************** HDHSTR: LD DE,(IOPB + PBDMAO) ;GET DESTINATION PTR LD A,(IOPB + PBDMAXO) ;SET BANK REGISTER LD BC,128  A LD (MOVX),A OUT (HXADDR),A JP NO64KX ; ; ; RETURN NO ERRORS ; MOV5: EX AF,AF' ;BALANCE UP XOR A RET ;******************************************************** MOV2HST: ; ; SET UP EXTENDED ADDRESS REGISTER ; LD (MOVX),A ;SAV;GET STATUS WORD AND SSTMSK ;REMOVE UNUSED BITS XOR SSTINV ;INVERT SOME RET ;++++++++++++++++++++++++++++++++++++++ JP M,DOLONG ; ; SET UP FOR BLOCK MOVE INSTRUCTION ; INC BC ;RESTORE COUNT ; SET 7,D ;INSURE S100 MAP ; ; SET D ;MOVE 128 BYTES ;**************************************************************************** ; ; BLOCK MOVE FROM HOST S*************************************************************************** ; ; WASTE OVERFLOW DATA SUBR ; ;****************E EXTENDED ADDRESS VALUE FOR BUMPING LD (HXADDR),A ; ; PASS DIRECTION TO MOVER ; LD A,1 ;TRANSFER TO S100 OR A EX ++++++++++++++++++++++++++++++++++++++ ; ; TRANSMIT CDB FUNCTION ; ENTRY- (CDBPTR)= CDB TO XMIT ; EXIT - CF= ERROR ; BC= ?IRECTION ; EX AF,AF' ;IF FROM S100 THEN JP NZ,MOV1 ; EX DE,HL ; SWAP ; ; DO FAST MOVE ; MOV1: LDIR ; ; RESTUBR ; ENTRY- HL= LOCAL PTR (DST) ; DE= HOST PTR (SRC) ; BC= BYTE COUNT ; A= BANK ADDRESS (SRC) ; ;********************************************************************************* HDXWST: ; ; WAIT UNTIL DATA REQUEST ; CALL GETSTAT ;IF REAAF,AF' ;**************************************************************************** ; ; MOVE SUBR CHECKS FOR A MOVE CROS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XCDB6: ; ; ISSUE CONTROLLER SELECT PER SHUORE PTRS ; JP NZ,MOV6 ; EX DE,HL ; SWAP BACK ; ; RETURN NO ERRORS ; MOV6: EX AF,AF' XOR A RET ; ; ; LONG ******************************************************* MOVFHST: ; ; SET EXTENDED ADDRESS REGISTER ; LD (MOVX),A ;SAVE EDY THEN INPUT DATA BIT SREQ,A JR Z,HDXWST ; ; IF READY FOR STATUS THEN RETURN FOR STATUS ; AND SSXMSK CP SSNDST ;ISING ANY 32K BOUNDARY ; AND SELECTING A FAST BLOCK MOVE IF NOT, AND A SLOWER BLOCK MOVE ; WHICH CHECKS AFTER EACH BYTE FOR AN GART MANUAL ; LD A,[1 SHL HDCONT] ;SELECT DB0 OUT SASIDATA,A ; LD A,[1 SHL SSELECT] OR [1 SHL SERRCLR] ;OUTPUT STROBE TRANSFER PART TESTS EACH BYTE FOR THRESHOLDS ; DOLONG: ; ; SET UP ; INC BC ;RESTORE COUNT ; LD A,D ;SET UP CURRENTXTENDED ADDRESS FOR BUMPING OUT (HXADDR),A ; ; PASS DIRECTION TO MOVER ; XOR A ;TRANSFER FROM S100 EX AF,AF' JP MOF READY FOR STATUS THEN GET IT RET Z ; ; XFER DATA & IGNORE ; LD A,0E5H ;OUTPUT WILL ALSO DO FOR INPUT OUT SASIDATA,OVERFLOW CONDITION IF TRUE. ; ENTRY- HL= LOCAL MEMORY PTR ; DE= S100 MEMORY PTR ; BC= BYTE COUNT TO TRANSFER ; AF'= 0: XFOUT SASICMD,A ; ; INIT TIMEOUT COUNT ; LD BC,0 ; ; WAIT FOR BUSY ; BSYWT2: CALL GETSTAT ;WAIT FOR BUSY BIT SBUSY BIT 15 LD I,A ; NO64KX: SET 7,D ;INSURE S100 ; ; SET DIRECTION ; MOV4: EX AF,AF' ;IF HL= S100 THEN JP NZ,MOV2 ; VIT ;**************************************************************************** ; ; WRITE DATA TO HOST IOPB SUBR ; MA JR HDXWST ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RECALIBRATE FUNCTION ; EER FROM S100 MEMORY TO LOCAL MEMORY ; 1: XFER FROM LOCAL MEMORY TO S100 MEMORY ; ; EXIT - AF, AF'= ? ; BC= 0 ; HL= ,A JR NZ,BSYOK2 ; DEC BC ;CHECK FOR TIMEOUT LD A,C OR B JR NZ,BSYWT2 ; ; TIMED OUT, RETURN TIMEOUT ERROR ; LD EX DE,HL ; ; MOVE 1 BYTE ; MOV2: LDI ; ; RESTORE PTRS ; JP NZ,MOV3 ; EX DE,HL ; ; IF COUNT EXHAUSTED THEN OVE 128 BYTES OF DATA FROM (HL) TO (PBDMA) ; ENTRY- HL= SOURCE PTR ; ;*******************************************************XIT - CF= ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RECALC: ; ; EXECUTE THE CHL + BC ; DE= DE + BC ; ;**************************************************************************** MOVIT: ; ; INSURE 0 ( ) *!+",#-$.%/ &0 ' A,FERR07 ;HANDSHAKE TIMEOUT ERR SCF RET ; ; ; CONTROLLER WENT BUSY, CLEAR SELECT STROBE ; BSYOK2: LD A,1 SHL SERRCLRPENS TO BE IN A ; ; RETURN NO ERRORS ; XOR A RET SUBTTL CONSTANTS ;###############################################A JR NZ,HDPERR ; ; IF NO ERROR THEN RETURN ZF ; LD A,(RSTAT) ;IF ERROR THEN GO REQUEST STATUS AND 00000011B RET Z  ;############################################################################ IOPBL DS 1 ;LOW ADDRESS OF IOPB TO EXECUTE IOP= CDB PTR ; BC, DE, AF= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETLUN: ; ; S ;REMOVE SELECT STROBE OUT SASICMD,A ; ; CHECK FOR COMMAND MODE ; XCDB2: CALL GETSTAT BIT SREQ,A ; WAIT FOR REQUEST ############################# ; ; ID SECTOR TEXT ; ;########################################################################; ; CHECK FOR CONTROLLER PARITY ERROR ; BIT 1,A ;IF CONTROLLER PARITY ERROR THEN EXIT JR Z,HDPERR ; ; ISSUE REQUESTBH DS 1 ;HIGH ADDRESS OF IOPB IOPBXA DS 1 ;BANK ADDRESS OF IOPB ;#######################################################AVE CDB POINTER ; LD (CDBPTR),IY ;SAVE CDB PTR ; ; FETCH & SAVE THE DRIVE # ; LD A,(IOPB + PBDRVO) ;FETCH DRIVE # AN JR Z,XCDB2 ; BIT SCD,A ;IF NOT COMMAND THEN ??? JR NZ,XOK ; ; NOT COMMAND MODE, RETURN CONTROLLER SYNC ERROR ; XCD#### IDTXT DB 'Disk Descriptor Sector' IDSZE EQU $ - IDTXT ;############################################################# SENSE COMMAND ; LD (IY+CMD),SCSNSE ;REQUEST SENSE COMMAND CALL XCDB6 RET C ;HARD ERROR ; ; READ 4 BYTES OF STATUS I##################### ; ; I/O PARAMETER BLOCK SAVE AREA ; ;#################################################################D 00000011B LD (LUNSV),A ;SAVE IT FOR OTHERS ; ; PUT DRIVE # INTO PROPER CDB FIELD ; RRCA RRCA RRCA ; ; STORE IBER: LD A,FERR08 ;CONTROLLER SYNC ERROR SCF RET ; ; ; READY FOR COMMAND, SET UP FOR CDB XFER ; XOK: LD BC,[6 SHL 8] +############### ; ; DEFAULT DISK DESCRIPTOR SECTOR FOR LOGON ; ;############################################################NTO IOPB ; GETR1: LD HL,IOPB + PBSTATO ;READ SENSE STATUS BYTES LD BC,[4 SHL 8] + SASIDATA ; GETR2: GETDATA JR NZ,GETR2 ########### IOPB DS IOPBSZ ; PBRTRY EQU PBNRT ;RETRY DISABLE BIT ;#####################################################NTO ALL CDBS ; LD (NULCDB + LUN), A LD (LAXCDB + LUN), A LD (IDRCDB + LUN), A ; ; RETURN THE CDB POINTER ; LD HL,( SASIDATA ;BYTE COUNT IN B ; ; CHECK DIRECTION ; BIT SIO,A ;IF DIRECTION NOT OUT THEN ERR JR NZ,XCDBER ; ; SET XF################ DEFDSEC: DB 0,0,0 ;POSSIBLE JUMP VECTOR DB 'Disk Descriptor Sector' ; REPT DEFDSEC + 20H - $ LIST OF ; ; READ STATUS OF SENSE COMMAND ; GETR3: CALL GETSTAT ;FINISH OUT COMMAND BIT SREQ,A JR Z,GETR3 ; ; IF NO ERROR ####################### ; ; HARD DISK SECTOR BUFFER ; ;#####################################################################CDBPTR) ;RETURN CDB PTR RET ;**************************************************************************** ; ; GET LOGICER PTR PUSH IY POP HL ; ; XFER CDB DATA ; XCDB3: PUTDATA ;GET CDB DATA JR NZ,XCDB3 ; ; DONE WITH CDB, CONTROF DB 0 LIST ON ENDM DW 128 ;SPT DB 5 ;BSH DB 31 ;BLM DB 1 ;EXM DW 1015 ;DSM DW 1152 / 2 ;DRM DB 0FFH ;IN SENSE COMMAND THEN RETURN CF ; IN A,(C) ;GET RESULT BYTE OF COMMAND AND 00000011B ;IF ERROR THEN HARD ERROR SCF ;ER####### HDBUFSZ EQU 256 HDSECB DS HDBUFSZ ; RSTAT DS 1 ;COMMAND STATUS RETURNED ; BIT 1: ERROR (ISSUE SENSE COMMAND) ; AL ADDR FROM IOPB SUBR ; ENTRY- IY= CDB PTR ; IX= DRIVE TABLE PTR ; ;******************************************************LLER SHOULD BE WAITING FOR DATA XFER OR RESULT ; XOR A ;RETURN NO ERRORS RET ;+++++++++++++++++++++++++++++++++++++++AL0 DB 80H ;AL1 DW 0 ;CKS DW 2 ;OFF ; REPT DEFDSEC + 30H - $ LIST OFF DB 0 LIST ON ENDM DB 0 ;STAGGER (NOROR ANYWAY RET Z ; ; SENSE STATUS ERROR, RETURN ERROR CODE ; LD A,FERR09 ;SENSE STATUS ERROR RET ; ; ; PARITY ER BIT 5..7: LUN BUFDRV DS 1 ;BUFFER CONTENTS DRIVE BYTE BUFSEC DS 2 ;BUFFER CONTENTS SECTOR WORD BUFTRK DS 2 ;BUFFER CONTENT********************** GETLAD: ; ; XFER COUNT = SECTOR SIZE ; LD HL,256 ;SECTOR SIZE LD (BYTCNT),HL ; ; CALCULATE+++++++++++++++++++++++++++++++++++++ ; ; GET CONTROLLER RESULTS FUNCTION ; EXIT - CF= HARD ERROR ; ;++++++++++++++++++++++T USED) DB 01101000B DB 64,64,64 ;PHYSICAL SPT (0,1,DATA) ; REPT DEFDSEC + 128 - $ LIST OFF DB 0 LIST ON ENDM ROR ENCOUNTERED ; HDPERR: ; ; CLEAR THE PARITY ERROR LATCH ; XOR A ;CLEAR ERROR OUT (SASICMD),A LD A,1 SHL SERRCLRS TRACK WORD ;############################################################################ ; ; JADE SECTOR BUFFER ; ;## LOGICAL ADDRESS FROM SECTOR & TRACK ; LD A,(IOPB + PBSECO) ;FETCH SECTOR LD E,A ; LD A,(IOPB + PBTRKO) ;PICK UP TRACK L++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETRES: ; ; SET UP TO RETURN RESULT IN IOPB ; LD HL,RSTAT ;INSURE IF $ >= (LOCROM + ROMSIZE) ; PROTECTION MESSAGE CONMSG **** ERROR! CODE TOO LARGE FOR DECLARED PROM SIZE! **** ENDIF  OUT (SASICMD),A ; ; RETURN PARITY ERROR CODE ; LD A,FERR11 ;RETURN PARITY ERROR SCF RET ;++++++++++++++++++++########################################################################## JADSECB DS 256 ;###############################SB & PUT INTO LA0 BIT 7 SRL A ; SECTOR BIT 0 IS WASTED RR E LD (IY+LA0),E ;PHEW! LA0 DONE ; LD (IY+LA1),A ;LA1 HAP DESTINATION CORRECT LD C,SASIDATA GETDATA ;GET RESULT STATUS BYTE ; ; CHECK FOR HARDWARE PARITY ERROR ; BIT SPERR, SUBTTL RAM AREA ORG LOCRAM ;############################################################################ ; ; VARIABLES ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET LUN FROM USER FUNCTION ; ENTRY- IY= CDB PTR ; EXIT - IY, HL 0 ( ) *!+",#-$.%/ &0 '############################################# ; ; DISK CONTROLLER COMMAND DESCRIPTOR BLOCKS (CDB) ; ;#######################åBLES ; ;############################################################################ LUNSV DS 1 ;LUN # CURDRV DS 1 ;CURRENT HABAS EQU 0D8H ;BASE ADDRESS OF ISHA PORTS HDATA EQU ISHABAS + 1 ;HOST INTERFACE DATA I/O PORT ; ;==========================E SECTOR HDFREL DS 1 ;(48) TRACK FREE SPACE SECTOR COUNT ; HDCCPS DS 1 ;(3) START SECTOR OF CP/M CCP HDCCPL DS 1 ;(16) CP/M ##################################################### CDBPTR DS 2 ;PTR TO CURRENT COMMAND CDB ; NULCDB: DS 6 ;NO TRANSFER CåDRIVE SELECTED BYTCNT DS 2 ;SECTOR SIZE RETRYS DS 1 ;RETRY COUNT MOVX DS 1 ;HOST BANK ADDRESS SAVE FOR BLOCK MOVE SUBRS FDAD================================================== ; ; STATUS PORT ; ;===================================================CCP SECTOR COUNT ; HDBDOSS DS 1 ;(19) START SECTOR OF CP/M BDOS HDBDOSL DS 1 ;(28) CP/M BDOS SECTOR COUNT ; HDBLTS DS 1 ;(5DB LAXCDB: DS 6 ;MAIN XFER CDB IDRCDB DS 6 ;ID SECTOR READ CDB CDBINIT EQU $ - NULCDB ; ; CDB OFFSETS ; STRUCT 0 CMD åDR DS 2 ;FDC ADDRESS PTR TIMOUT DS 2 ;UNSELECT SASI DELAY ;###############################################################========================= HSTATUS EQU ISHABAS ;HOST INTERFACE CONTROL/STATUS INPUT PORT ; ; 7 0 ; | | | | | | | | |4) START SECTOR OF JADE CONTROLLER BLT HDBLTL DS 1 ;(1) JADE CONTROLLER BLT SECTOR COUNT ; HDDCMS DS 1 ;(56) START SECTOR OF DS 1 ;COMMAND LUN DS 1 ;LOGICAL UNIT NUMBER IN BITS 5..7 LA2 EQU LUN ;LOGICAL ADDRESS 2 IN BITS 0..4 LA1 DS 1 ;LOGICAL ADDRES SUBTTL INTELLIGENT SASI HOST ADAPTER HOST DEFINITIONS ;***********************************************************************############# ; ; STACK AREA ; ;############################################################################ IF $ > (LOCRA ; ^ ^ ^___ 1: ADAPTOR BUSY, 0: ADAPTOR FREE ; | |_____ 1: FIRMWARE ERROR ; |_________________ 1: ERROR ; JADE CONTROLLER DCM HDDCML DS 1 ;(9) JADE CONTROLLER DCM SECTOR COUNT ; HDBIOSS DS 1 ;(65) START SECTOR OF CP/M BIOS HDBIOSLS 1 LA0 DS 1 ;LOGICAL ADDRESS 0 ILV DS 1 ;FORMAT COMMAND INTERLEAVE FACTOR NBK EQU ILV ;XFER COMMANDS BLOCK (SECTOR) COUNT R***** ; ; THIS MODULE DEFINES THE ISHA DEFINITIONS NEEDED BY A HOST COMPUTER TO ; INTERFACE ITS SOFTWARE TO THE ISHA BOARD ANM + RAMSIZE - 32) CONMSG **** ERROR! DATA TOO LARGE FOR DECLARED RAM SIZE! **** ENDIF DS 32 STACK EQU LOCRAM + RAMSIZE  ; BIT DEFINITIONS: HBUSYB EQU 0 ;HOST BUSY STATUS BIT HFERRB EQU 1 ;HOST FIRMWARE ERROR BIT HERRB EQU 7 ;HOST ERROR BIT DS 1 ;(14) CP/M BIOS SECTOR COUNT ENDM ; HCCPSEC EQU 3 ;1ST SECTOR OF CCP HBDOSEC EQU 19 ;1ST SECTOR OF BDOS HBLTSEC EQU TY DS 1 ;RETRY FLAG 0: RETRY 3 TIMES, 80H: NO RETRYS LUND EQU RTY ;COPY COMMAND DEST. LUN IN BITS 5..7 LA2D EQU RTY ;COPY COMMD ITS FIRMWARE. ; ;**************************************************************************** ; ; REVISIONS: ; ; 1.0 - 1 END  ; ;============================================================================ ; ; HOST COMMAND PORT ; ;==============54 ;1ST SECTOR OF JADE BIOS LOADER TRANSIENT HDCMSEC EQU 56 ;1ST SECTOR OF JADE DISK CONTROLLER MODULE HBIOSEC EQU 65 ;1ST SECAND DEST. LOGICAL ADDR 2 IN BITS 0..4 FDD EQU RTY ;DEFINE FLOPPY PARAMS COMMAND ;BIT 0: 0= SINGLE SIDE, 1= DOUBLE SIDED 8 MAR 84 GRH ; Removed from the HDMON program and extended for the Boot PROM. ; ; 1.1 - 22 FEB 86 GRH ; Removed extraneo;**************************************************************************** ; ; M5B HARD DISK DEFINITION FILE ; ;********============================================================== HCMD EQU HSTATUS ;HOST INTERFACE COMMAND PORT ; ; 7 0TOR OF CBIOS HFRESEC EQU 79 ;1ST SECTOR OF FREE SECTORS  ;BIT 1: 0= SINGLE DENSITY, 1= DOUBLE DENSITY ;BITS 2..3: 00= 128 BYTES, 01= 256 BYTES LA1D DS 1 ;COPY COMMAND DEST. LOGICAus definitions already defined in 'COMIOPB.DEF' file. ; Improved the bit definitions. ; Changed 'ISASI' to 'ISHA'. ; ;************************************************************************** ; ; REVISIONS: ; ; 1.0 - 13 FEB 86 GRH ; RELEASE ;  ; | | |0| | | | | | ; ^ ^ \_____/ ^___ 1: HOST INTERRUPT FOR COMMAND ; | | |________ COMMANDS (SEE BELOW) ; | |_____åL ADDR 1 LA0D DS 1 ;COPY COMMAND DEST. LOGICAL ADDR 0 CDBSPR DS 1 ;COPY COMMAND SPARE RTYD DS 1 ;COPY COMMAND RETRY FLAG CDB********************************************************************** ;===================================================== ;**************************************************************************** ; HIDSEC EQU 0 ;DISK DESCRIPTOR SECTOR HDIRSEC__________ 1: EXECUTE IOPB COMMAND ; |_________________ 1: RESET, 0: RELEASE THE ADAPTOR ; ; BIT DEFINITIONS: HINT EQU 0 åSIZ DS 0 ERRCOD DS 1 ;############################################################################ ; ; DISCRETE VARIA======================= ; ; DATA PORT ; ;============================================================================ IS EQU 2 ;SYSTEM TRACK DIRECTORY SECTOR STRUCT 0 HDNTS DS 1 ;(6) NUMBER OF DIRECTORY ENTRIES HDFRES DS 1 ;(79) TRACK FREE SPAC 0 ( ) *!+",#-$.%/ &0 ' ;HOST INTERRUPT (CMD EXECUTE) BIT HXIOPBB EQU 6 ;HOST EXECUTE IOPB COMMAND BIT HRESET EQU 7 ;HOST ADAPTER RESET BIT ; ; D EQU 6 ;SPARE DEFCMD EQU 7 ;DEFINE FLOPPY DISK COMMAND PBDRV EQU 1 ;DRIVE BYTE PBTRK EQU 2 ;TRACK WORD PBSEC EQU 4 ;Såå*************************** ; ; PORTS & BITS ; ISASIBAS EQU 0D8H ;BASE ADDRESS OF ISASI PORTS HDATA EQU ISASIBAS + 1 ;HOST COMMANDS: ; HIOPBL EQU 00000001B ;SET IOPB LO ADDR CMD HIOPBH EQU 00000011B ;SET IOPB HI ADDR CMD HIOPBX EQU 00000101B ;SETECTOR WORD (FORMAT INTERLEAVE, FLOPPY PARAMS) PBFLG EQU 6 ;FLAGS (LOG- 0: FULL, BLOCKING (SAME AS CP/M)) PBLOG EQU 0 ;LOGON åå INTERFACE DATA I/O PORT HSTATUS EQU ISASIBAS ;HOST INTERFACE CONTROL/STATUS INPUT PORT HBUSYB EQU 0 ;HOST BUSY STATUS BIT  IOPB XADDR CMD HDIAG0 EQU 00000111B ;DUMP FIRMWARE DIAGNOSTIC HDIAG1 EQU 00001001B ;ECHO DATA IN TO DATA OUT & STATUS REGS HREQUEST BIT # PBRTRY EQU 7 ;DISABLE RETRYS BIT PBDMA EQU 7 ;XFER ADDRESS WORD PBDMAX EQU 9 ;XFER BANK ADDRESS BYTE PBSåå HFERRB EQU 1 ;HOST FIRMWARE ERROR BIT HERRB EQU 7 ;HOST ERROR BIT HCMD EQU HSTATUS ;HOST INTERFACE COMMAND PORT HINT EQDIAG2 EQU 00001011B ;TEST HOST MEMORY R/W HDIAG3 EQU 00001101B ;BLOCK MOVE HDIAG4 EQU 00001111B ;PRINT ASCII TEXT TO PORT HRETAT EQU 10 ;SENSE STATUS WORDS (4 BYTES) PBSP1 EQU 14 ;SPARES PBSP2 EQU 15 IOPBSIZ EQU 16 ;SIZE OF THIS IOPB ååU 0 ;HOST INTERRUPT (CMD EXECUTE) BIT HXIOPBB EQU 6 ;HOST EXECUTE IOPB COMMAND BIT HRESET EQU 7 ;HOST ADAPTER RESET BIT TF EQU 00010001B ;RETURN FIRMWARE VERSION ; HEXEC EQU (1 SHL HXIOPBB) + (1 SHL HINT) ;EXECUTE IOPB COMMAND ; ; END FILE åååHIOPBL EQU 01H ;SET IOPB LO ADDR CMD HIOPBH EQU 03H ;SET IOPB HI ADDR CMD HIOPBX EQU 05H ;SET IOPB XADDR CMD HDIAG0 EQU 07ååååH ;DUMP FIRMWARE DIAGNOSTIC HDIAG1 EQU 09H ;ECHO DATA IN TO DATA OUT & STATUS REGS HDIAG2 EQU 0BH ;TEST HOST MEMORY R/W HDåå SUBTTL INTELLIGENT SASI INTERFACE HOST DEFINITIONS ;************************************************************************* åIAG3 EQU 0DH ;BLOCK MOVE HSPAR1 EQU 0FH ;SPARE HEXEC EQU (1 SHL HXIOPBB) + (1 SHL HINT) ;EXECUTE IOPB COMMAND ; ; IOåå ; ; THIS MODULE DEFINES THE ISASI DEFINITIONS NEEDED BY A HOST ; COMPUTER TO INTERFACE ITS SOFTWARE TO THE ISASI BOARD AND ITåPB OFFSETS ; PBCMD EQU 0 ;COMMAND BYTE LOGCMD EQU 0 ;LOG ON DISK DRIVE COMMAND RDCMD EQU 1 ;READ SECTOR COMMAND WRCMD EQU 2ååS ; FIRMWARE. ; ;************************************************************************* ; ; REVISIONS: ; ; 1.0 - 18 MAå ;WRITE SECTOR COMMAND FMTCMD EQU 3 ;FORMAT TRACK COMMAND RECCMD EQU 4 ;RECALIBRATE COMMAND SEKCMD EQU 5 ;SEEK COMMAND SPRCMååR 84 GRH ; Removed from the HDMON program and extended for the Boot PROM. ; ;********************************************** 0 ( ) *!+",#-$.%/ &0 ' TITLE INTELLIGENT SASI HOST ADAPTOR INTERFACE LIST NOCOND ;***************************************************************** |________ SASI PARITY ERROR CLEAR (0) ; |__________ HOST VECTORED INTERRUPT (1) ; SINTE EQU 0 ;SASI INTERRUPT BIT # command after getting ; results command issued. ; ; 1.4 - 28 APR 84 GRH ; Add Jade FDC routines. Change host block move suTS EQU LOCPRTS + 3 ;HOST INTERRUPT SET PORT (OUT, DATA= X) HSTAT EQU LOCPRTS + 4 ;HOST STATUS PORT ; ; 7 6 5 4 3 2 1 0 Bdisk installed. ; VERSN EQU 1AH ;************************************************************************** FALSE EQU 0 TRU********* ; ; THIS MODULE CONTAINS THE INTELLIGENT HOST ADAPTER FIRMWARE. ; ;***********************************************SRESET EQU 1 ;SASI RESET BIT # SSELECT EQU 2 ;SASI DEVICE SELECT STROBE BIT # SERRCLR EQU 3 ;SASI PARITY ERROR CLEAR* BIT #brs into general ; purpose subrs. ; ; 1.5 - 30 APR 84 GRH ; Change hardware to reflect the state of the interrupt flip-flIT DEFINITION ; ^ ^ ^__ ISASI BUSY (1) ; | |____ FIRMWARE ERROR (1) ; |________________ ERROR (1) ; HBUE EQU NOT FALSE DEBUG EQU FALSE *INCLUDE JDDCONT.DEF SUBTTL DEFINITIONS S100D EQU 0D8H ;DATA PORT VISIBLE TO S100 BU*************************** ; ; IOPB CONFIGURATION: ; ; DRIVE USAGE ; 0 SASI physical drive 0 ; 1 SASI physical dri HINT EQU 4 ;HOST VECTORED INTERRUPT BIT # SASIST EQU LOCPRTS + 1 ;SASI BUS STATUS PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITIop ; as the busy bit (D0). Hardware will now allow software setting of ; the interrupt flip-flop to allow passing a busy stateSY EQU 0 ;HOST BUSY STATUS BIT HFERRB EQU 1 ;HOST FIRMWARE ERROR BIT HSERRB EQU 7 ;HOST ERROR STATUS BIT HFERR EQU (1 SHL S S100S EQU S100D + 1 ;STATUS PORT VISIBLE TO S100 BUS S100C EQU S100S ;COMMAND PORT VISIBLE TO S100 BUS LOCPRTS EQU 0 ;Bve 1 ; 2 SASI physical drive 2 ; 3 SASI physical drive 3 ; 4 JADE floppy disk controller physical drive 0 ; 5 JAONS ; ^ ^ ^ ^ ^ ^__ SASI BUSY (1) ; | | | | |____ SASI MESSAGE (1) ; | | | |______ SASI COMMAND (1) / DATA (0) ; if required. ; Normally this change will allow transparent operation of the soft- ; ware, without concern to the busy status.HSERRB) + (1 SHL HFERRB) ;FIRMWARE ERROR BYTE HCMD EQU LOCPRTS + 4 ;HOST COMMAND PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITIONS ASE ADDRESS OF LOCAL PORTS LOCMEM EQU 0 ;BASE ADDRESS OF LOCAL RAM S1PRTS EQU 80H ;BASE ADDRESS OF S100 PORTS S1MEM EQU 8DE floppy disk controller physical drive 1 ; 6 JADE floppy disk controller physical drive 2 ; 7 JADE floppy disk control | | |________ SASI REQUEST (1) ; | |__________ SASI INPUT (1) / OUTPUT (0) ; |________________ SASI PARITY ERROR (1)  All other status bits ; reflect the software status register contents (D1..7). ; ; 1.6 - 3 MAY 84 GRH ; Change block move ; ^ ^ \_____/ ^__ HOST INTERRUPTED (1) ; | | |_______ NON-IOPB COMMAND CODE (0..F) ; | |______________ HOST EXECUTE IO000H ;BASE ADDRESS OF S100 MEMORY WINDOW LOCROM EQU LOCMEM ;BASE ADDRESS OF LOCAL ROM LOCRAM EQU LOCMEM + 4000H ;BASE ADDRler physical drive 3 ; ;************************************************************************** ; ; REVISIONS: ; 1.0 - 2 ; SBUSY EQU 0 ;SASI BUSY BIT SMSG EQU 1 ;SASI MESSAGE BIT SCD EQU 2 ;SASI C/D BIT SREQ EQU 3 ;SASI REQUEST* BIT SIO EQ subroutine to allow for 1..65,536 byte moves. ; Fix bugs in Jade driver. Add printer output diagnostic. ; ; 1.7 - 2 JUN 84 PB (1) ; |________________ LOCAL RESET (1) ; HINTRB EQU 0 ;HOST INTERRUPT REQUEST BIT HIOPBB EQU 6 ;HOST EXECUTE IOPB BIT ESS OF LOCAL RAM RAMSIZE EQU 2048 ;SIZE OF LOCAL RAM ROMSIZE EQU 2048 ;SIZE OF LOCAL ROM ;=============================8 DEC 83 GRH ; DIAGNOSTIC VERSION FOR TESTING THE BOARD. ; 1.1 - 2 JAN 84 GRH ; ADD HARD DISK CONTROLLER FIRMWARE. ; 1.2U 4 ;SASI I/O* BIT SPERR EQU 7 ;SASI PARITY ERROR DETECTED BIT SSTMSK EQU 10011111B ;STATUS BIT MASK SSTINV EQU 00011000B ; GRH ; Fix bug in HSTIN & HSTOUT macros outputting bit 7 data to XADDR ; register instead of to HXAD15 register. ; Add JADE HRESB EQU 7 ;HOST RESET LOCAL PROCESSOR BIT HDATA EQU LOCPRTS + 5 ;HOST DATA TRANSFER PORT HXAD15 EQU LOCPRTS + 6 ;HOST ========= ; ; LOCAL PORT DEFINITIONS ; ;====================================== SASIDATA EQU LOCPRTS ;SASI BUS DATA PORT  - 1 APR 84 GRH ; Fix Bug in host xfer subr. that caused problems on 32k boundary ; crossings. Enable parity checking for reSTATUS BIT INVERSION MASK SSXMSK EQU 00010110B ;XFER CONTROL MASK SGTCMD EQU 1 SHL SCD ;GET COMMAND FROM H/A SGTDAT EQU 0 ;G FDC dump to dump diagnostic command. ; ; 1.8 - 2 JUN 84 GRH ; Change floppy disk read/write sector to logical sector for uA15 SET PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITION ; ^________________ BIT APPLIED TO HOST BUS A15 WHEN ACCESSING ITS ;  SASICMD EQU LOCPRTS + 1 ;SASI BUS CONTROL PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITIONS ; ^ ^ ^ ^ ^__ SASI INTERRUPT ON REceived data. Enable ; controller retrys. ; 1.3 - 2 APR 84 GRH ; Fix Bug in read buffer routine which caused 1st 4 bytes of ET DATA FROM H/A SSNDDAT EQU 1 SHL SIO ;SEND DATA TO H/A SSNDST EQU (1 SHL SIO) + (1 SHL SCD) ;SEND STATUS TO H/A SCMDDN EQU niformity ; in IOPB parameters. (0..N-1 now changed to 1..N) ; ; 1.9 - 3 OCT 84 GRH ; Fix bug in Jade driver which alloMEMORY A15B EQU 7 ;HOST A15 BIT HXADDR EQU LOCPRTS + 7 ;EXTENDED ADDRESS PORT (A16..A23) ; ; 7 6 5 4 3 2 1 0 BIT DEFINITQUEST ENABLE (1), HOST (0) ; | | | |____ SASI RESET BIT (1) ; | | |______ SASI DEVICE SELECT STROBE (1) ; |sector ; to be 0 and read not retryed but sense status to be issued instead. ; The CDB had to be re-initialized with the read (1 SHL SIO) + (1 SHL SCD) + (1 SHL SMSG) ;COMMAND DONE HINTC EQU LOCPRTS + 2 ;HOST INTERRUPT CLEAR PORT (OUT, DATA= X) HINwed errors to go undetected. ; ; 1.A - 18 APR 85 GRH ; Fix logon problem. Code is only now showing bugs with 2nd hard ; 0 ( ) *!+",#-$.%/ &0 'ION ; ^ ^ ^ ^ ^ ^ ^ ^__ A16 ; | | | | | | |____ A17 ; | | | | | |______ A18 ; | | | | |________ A19 ; | | | |__________ A20OMPLEMENT & TEST CPL LD (HL),A CP (HL) JR NZ,MEMERR CPL ;RESTORE LD (HL),A INC HL ;NEXT LOCATION DEC BC  1 ;RECALIBRATE SCSNSE EQU 3 ;REQUEST SENSE SCFMTD EQU 4 ;FORMAT ENTIRE DRIVE SCFMTT EQU 6 ;FORMAT TRACK SCFMTBT EQU 7 ;FORM ; ENTRY- CF= ERROR ; A= 0: NOT FIRMWARE ERROR ; /0: ERROR CODE ; ;-------------------------------------- CMDRET: JR  A JR Z,BB#SYM BIT DFDBL,(IX + DTFLG) ;IF NOT 256 BYTE SECTORS THEN DO JR Z,BB#SYM ; 1ST HALF ONLY BA#SYM: LD A,(PB ; | | |____________ A21 ; | |______________ A22 ; |________________ A23 ;====================================== ; ; F LD A,B OR C JR NZ,MTLP CALL INIT ;ANY OTHER INITIALIZATION LD HL,0 ;FORCE NO TIMEOUT JP HWAITC ;------------AT BAD TRACK SCREAD EQU 8 ;READ SECTOR(S) SCWRIT EQU 10 ;WRITE SECTOR(S) SCSEEK EQU 11 ;SEEK TRACK SCCOPY EQU 20H ;COPY BLNC,CNOERR ;IF NOT ERROR THEN SAY SO OR A ;IF A= 0 THEN NO ERROR JR Z,CNOTF OUT (HDATA),A ;PUT ERROR IN DATA REG LD SEC) ;IF SECTOR IS ODD THEN SELECT UPPER HALF AND 1 JR Z,BB#SYM LD HL,HDSECB + 128 BB#SYM: ENDM ;; ;; HOST OUTPUTIRMWARE ERROR CODES ; IN HOST DATA REGISTER IF HOST STATUS ; BIT 1 SET ; ;====================================== FERR00 EQU-------------------------- ; ; RAM ERROR ENCOUNTERED ; ;-------------------------------------- MEMERR: LD A,FERR01 ;PASS EROCK(S) SCDEF EQU 0C0H ;DEFINE FLOPPY DISK PARAMETERS ;============================ ; ; JADE DEFINITIONS ; ;=========A,HFERR ;SET FIRMWARE ERROR CMDR1: OUT (HSTAT),A ;PASS ERROR TO HOST POP HL ;WASTE RETURN ADDRESS TO WAIT RTN LD HL MACRO ;; HSTOUT: MACRO #PORT, #DATA IF #PORT < 80H XOR A ELSE LD A,#PORT ;SET UP BIT 7 ENDIF OUT (HXAD15),A  0 ;UNKNOWN ERROR FERR01 EQU 1 ;RAM TEST FAILURE FERR02 EQU 2 ;ROM TEST FAILURE FERR03 EQU 3 ;ILLEGAL COMMAND FERR04 EQU 4 ;ROR TO HOST & HALT OUT (HDATA),A LD A,HFERR OUT (HSTAT),A OUT (HINTC),A ;CLEAR PENDING INTERRUPT HALT IF $ > 38H =================== JADBASD EQU 4 ;BASE DRIVE # OF JADE CONTROLLER JADNDRV EQU 4 ;NUMBER OF LOGICAL JADE CONTROLLER DRIVES ,-1 ;SET TIMOUT TIME HWAITC: LD (TIMOUT),HL OUT (HINTC),A ;CLEAR HOST INTERRUPT & BUSY FLAG ;------------------------IF (#DATA = 0) AND (#PORT <> 0) XOR A ENDIF IF #DATA <> 0 LD A,#DATA ;OUTPUT DATA ENDIF OUT (#PORT OR 80H),A ENDMILLEGAL INTERRUPT FERR05 EQU 5 ;ILLEGAL IOPB DRIVE SPEC FERR06 EQU 6 ;ILLEGAL IOPB COMMAND FERR07 EQU 7 ;CONTROLLER HANDSHAKE CONMSG **** ERROR! RESET CODE OVERLAPS INTERRUPT CODE! **** ENDIF ;---------------------------- ; ; INTERRUPT ENTRY VECTOR SUBTTL MACROS ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GET DATA MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GETDATA MACRO AA#SYM: C---- ; ; MAIN INTERRUPTED LOOP ; ;---------------------------- HWAIT: EI ;ALLOW INTERRUPTS LD HL,(TIMOUT) ;IF TIMED ;; ;; HOST INPUT MACRO ;; HSTIN: MACRO #PORT IF #PORT < 80H XOR A ELSE LD A,#PORT ;SET UP BIT 7 ENDIF OUT (H TIMOUT FERR08 EQU 8 ;CONTROLLER SYNC ERROR ??? FERR09 EQU 9 ;CONTROLLER SENSE STATUS ERROR FERR10 EQU 10 ;ILLEGAL IOPB PARAM ; ;---------------------------- ORG LOCROM + 38H IN A,(HCMD) ;GET COMMAND BIT HINTRB,A ;IF NOT HOST INTERRUPT THEN MUALL GETSTAT ;IF REQUEST FALSE THEN WAIT BIT SREQ,A JR Z,AA#SYM INI ;GET DATA ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@ OUT THEN JUST WAIT LD A,H OR L JR Z,HWAIT DEC HL LD (TIMOUT),HL LD A,H ;IF TIME OUT JUST WENT TO 0 THEN OR L XAD15),A IN A,(#PORT OR 80H) ;FETCH DATA ENDM SUBTTL CODE ORG LOCROM ;*********************************************ETER FERR11 EQU 11 ;PARITY ERROR FERR12 EQU 12 ;====================================== ; ; HARD DISK DEFINITIONS ; ;=ST BE SASI JP Z,SASINT BIT HIOPBB,A ;IF IOPB BIT SET THEN EXECUTE IOPB JP NZ,EXIOPB AND 00011110B ;MASK OFF UNUSED C@@@ ; ; PUTDATA MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PUTDATA MACRO AC#SYM: CALL GETSTAT ;IF REQUEST NOT TRUE THEN WAIT  JR NZ,HWAIT XOR A ; DESELECT SASI BUS OUT (SASIDATA),A LD A,[1 SHL SSELECT] OR [1 SHL SERRCLR] DI OUT (SASICMD),*** ; ; PROCESSOR REGISTER USAGE: ; IX= PTR TO CURRENT DISK DRIVE TABLE ; IY= PTR TO CURRENT COMMAND DESCRIPTOR BLOCK ; ;*===================================== HDCONT EQU 0 ;THIS CONTROLLER'S ADDRESS BIT HDBASD EQU 0 ;BASE DRIVE # OF HD CONTROLLEOMMANDS CP NUMCMDS * 2 ;IF COMMAND ERROR THEN RETURN FIRMWARE ERR JR C,CMDOK LD A,FERR03 SCF JR CMDRET CMDOK: L BIT SREQ,A JR Z,AC#SYM OUTI ;ASSUME CALLER SET UP ;DON'T WAIT ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;A LD A,[1 SHL SERRCLR] OUT (SASICMD),A EI JR HWAIT CNOTF: LD A,1 SHL HSERRB ;PLAIN ERROR JR CMDR1 CNOERR: XOR *********************************************** RESETV: OUT (HINTS),A ;SET BUSY FLAG XOR A ;PASS NOT -1 TO BOOT OUT (HSTR HDNDRV EQU 4 ;NUMBER OF PHYSICAL DRIVES SUPPORTED HDNLUN EQU HDNDRV INLEV EQU 6 ;INTERLEAVE FACTOR FOR FORMAT ;=======D HL,CMDTBL ADD L LD L,A LD A,0 ADC A,H LD H,A LD E,(HL) INC HL LD D,(HL) EX DE,HL IN A,(HDATA) LD DE,CM ; BUFFER HALF SELECT MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SELCTBUF MACRO LD HL,HDSECB ;ASSUME 1ST HALF BITA ;CLEAR BUSY & ERROR FLAGS JR CMDR1 ; ; COMMAND TABLE FOR NON-IOPB COMMANDS ; CMDTBL: DW IOPBLO ;(1) SET IOPB LO COAT),A IM 1 ;ONLY 1 INTERRUPT LD SP,STACK ;INIT STACK LD HL,LOCRAM ;DO RAM TEST LD BC,RAMSIZE MTLP: LD A,(HL) ;C===================== ; ; SASI DEFINITIONS ; ;============================ SCRDY EQU 0 ;TEST DRIVE READY COMMAND SCREC EQUDRET ;PUT RETURN ADDRESS ON STACK PUSH DE JP (HL) ;-------------------------------------- ; ; ALL COMMANDS RETURN HERE  DFHARD,(IX + DTFLG) ;IF HARD DISK THEN DO SELECTION JR NZ,BA#SYM LD A,(PBTRK) ;ELSE IF TRK 00 THEN USE 1ST HALF ONLY OR0 ( ) *!+",#-$.%/ &0 'MMAND DW IOPBHI ;(3) SET IOPB HI COMMAND DW IOPBX ;(5) SET IOPB XADDR COMMAND DW DIAG0 ;(7) DUMP LOCAL MEMORY DIAGNOSTI),A LD HL,0E000H LD DE,0E800H LD BC,800H LDIR XOR A RET ;------------------------------------------------ ; ;OR NOW *** ; OUT (HXADDR),A ;USE DATA FOR EXTENDED ADDRESS XOR A ;BOTTOM 32K OUT (HXADDR),A OUT (HXAD15),A LD HL,LOCSE LDIR ENDIF LD A,(PBDRV) ;IF HARD DISK CONTROLLER THEN DO IT LD HL,HDCMDS CP HDBASD ;IF WITHIN HARD DISK DRIVES + 1000H LD BC,ROMSIZE + RAMSIZE D2LP: LD A,(HL) CPL LD (HL),A CP (HL) CPL ;RESTORE LD (HL),A JR NZ,D2ERR C CMD DW DIAG1 ;(9) SET OUTPUT PORTS DIAG. COMMAND DW DIAG2 ;(B) TEST S100 MEMORY ACCESS COMMAND DW DIAG3 ;(D) BLOCK MO PRINT TEXT ON THE PRINTER COMMAND ; EXERCISES THE I/O CAPABILITY ; ENTRY- A= PORT # ; ;------------------------------------RAM ;DUMP LOCAL RAM TO S100 RAM LD DE,S1MEM + 4000H ;DUMP TO HOST AT 4000H LD BC,RAMSIZE ;USE ALL RAM LDIR LD HL,LOC THEN EXIT JR C,CHKJAD CP HDBASD + HDNDRV JR C,XTABL CHKJAD: LD HL,JADCMDS SUB JADBASD ;BIAS DOWN TOO JR C,XILDRV INC HL DEC BC LD A,B OR C JR NZ,D2LP D2ERR: LD (S1MEM + 0FF2H),HL LD (S1MEM + 0FF4H),A LD A,(HL) LD (S1MEM + 0VE 01000H TO 02000H COMMAND DW PRINT ;(F) PRINT ASCII STRING TO PORT COMMAND DW RETVERS ;(11) RETURN FIRMWARE VERSION NUM------------ PRINT: OUT (HXAD15),A ;SET PORT TO DATA SET 7,A ;MAP TO HOST LD C,A CALL CRLF LD E,'0' ;START WITH '0ROM ;FOLLOW WITH ROM IMAGE LD BC,ROMSIZE LDIR HSTOUT DDPORT,DDMB0 ;FOLLOW WITH FDC BANK 0 LD HL,(FDADDR) LD BC,102 ;IF NOT JADE THEN DOESN'T EXIST CP JADNDRV JR NC,XILDRV LD (BTDRV),A ;PRESTORE DRIVE IN COMMAND BLOCK XTABL: LD A,FF5H),A XOR A RET ;---------------------------------------------------------- ; ; DIAG3 DOES S100 MEMORY ACCESSES DCMDS EQU 9 ;NUMBER OF COMMANDS SUBTTL COMMANDS ;-------------------------------------- ; ; SET IOPB ADDRESS COMMANDS ; ' LD B,80 ;DO 1 LINE PRINT1: CALL PRT INC E DJNZ PRINT1 CRLF: LD E,0DH CALL PRT LD E,0AH CALL PRT XOR A RET 4 PUSH HL LDIR HSTOUT DDPORT,DDMB1 ;FOLLOW WITH FDC BANK 1 POP HL LD BC,1024 LDIR HSTOUT DDPORT,DDOUT ;REMOVE(PBCMD) ;CHECK IF LEGAL CP MAXCMDS JR NC,XILCMD ADD A,A ;MULTIPLY CMD BY 2 FOR OFFSET ADD L LD L,A LD A,0 ADCEPENDING ON DATA ; NOTE: SCOPING TESTS CONTINUE UNTIL ANOTHER DATA WORD IS ; WRITTEN TO THE DATA REGISTER BY THE HOST. ; ENMUST BE INITIALIZED BEFORE DISK ACCESS ; ENTRY- A= DATA ; EXIT - HDATA= OLD DATA ; ;--------------------------------------  PRT: IN A,(C) ;IF BUSY THEN WAIT AND 1 JR NZ,PRT LD A,E SET 7,A OUT (C),A RES 7,A OUT (C),A SET 7,A O DD WINDOW SO HOST WON'T CRASH XOR A ;NO ERRORS OUT (HSTAT),A DIAGR: LD SP,STACK ;DIRECT RETURN, FLUSH RETURN ADDR FRO A,H LD H,A LD E,(HL) ;GET COMMAND FROM TABLE INC HL LD D,(HL) EX DE,HL LD DE,XRET ;PUT RETURN ADDRESS ON STACKTRY- A= 0: BLOCK MOVE FROM 1000H TO 2000H ; 1: READ FROM 1000H (SCOPING TEST) ; 2: WRITE TO 1000H (SCOPING TEST) ; IOPBLO: LD HL,IOPBL ;POINT TO BYTE TO ALTER JR IOPBST IOPBHI: LD HL,IOPBH JR IOPBST IOPBX: LD HL,IOPBXA IOPBSUT (C),A RET SUBTTL SASI INTERRUPT ;------------------------------------------------ ; ; INTERRUPT WITHOUT HOST BIT SM STACK LD HL,(TIMOUT) ;PASS TIMEOUT JP HWAITC ;--------------------------------------------------------------- ; ; D PUSH DE JP (HL) ;EXECUTE COMMAND ; ; THIS RETURN MUST RETURN IOPB TO HOST FOR STATUS UPDATE ; XRET: PUSH AF ;SAVE  3: BLOCK MOVE FROM E000H TO E800H ; ALL OTHERS: NOP ; ;---------------------------------------------------------- DIAT: LD C,(HL) ;SAVE OLD DATA LD (HL),A ;SET NEW DATA LD A,C ;PASS OLD DATA TO HOST OUT (HDATA),A XOR A ;RETURN NO EET ; ;----------------------------------------------- SASINT: LD A,FERR04 ;OUTPUT ERROR FOR NOW SCF JP CMDRET SUBTIAGNOSTIC 1 LOADS DATA INTO DATA OUT & STATUS REGS ; ENTRY- A= DATA ; ;------------------------------------------------------POSSIBLE ERROR CODE LD HL,PBCMD ;SOURCE := LOCAL IOPB IMAGE LD DE,(IOPBL) ;GET ADDRESS OF IOPB IN USER RAM LD A,D ; SEG3: OR A JR Z,DOMOVE D3LP: IN A,(HDATA) ;IF DATA CHANGED THEN CHECK CP 2 JR C,DOREAD JR Z,DOWRITE CP 3 JR Z,DORRORS (PREVENTS DATA OVERWRITE) RET ;---------------------------------------------------------- ; ; DIAGNOSTIC DUMP LOATL IOPB EXECUTION ;---------------------------- ; ; EXECUTE IOPB ; ;---------------------------- EXIOPB: LD DE,PBCMD ;D--------- DIAG1: OUT (HDATA),A OUT (HSTAT),A JP DIAGR ;------------------------------------------------ ; ; DIAG2 TET A15 OUT (HXAD15),A SET 7,D ;INSURE HOST MEMORY LD A,(IOPBXA) ; SET BANK # OUT (HXADDR),A LD BC,IOPBSIZE IF FBLKH XOR A RET DOWRITE: LD (S1MEM + 1000H),A JR D3LP DOREAD: LD A,(S1MEM + 1000H) JR D3LP DOMOVE: LD HLDS HOST MEMORY WITH RAM IMAGE ; ENTRY- A= BANK ADDRESS ; EXIT - XX4000H..XX47FFH= RAM IMAGE ; XX4800H..XX4FFFH= ROM IMAGE ;ESTINATION := LOCAL IOPB IMAGE LD HL,(IOPBL) ;GET ADDRESS OF IOPB IN USER RAM LD A,H ; SET A15 OUT (HXAD15),A SET STS S100 MEMORY READS & WRITES ; FROM XX1000H TO XX1FFFH ; EXIT- XX0FF2H= LAST LOCATION CHECKED ; XX0FF4H= 0: OK ; READ ALSE CALL MOV2HST ELSE LDIR ENDIF POP AF JP CMDRET ;---------------------------- ; ; ERROR EXITS ; ;-----,S1MEM + 1000H LD DE,S1MEM + 2000H LD BC,1000H LDIR XOR A RET DOBLKH: LD A,1 SHL A15B ;SET HIGH PAGE OUT (HXAD15 XX5000H..XX57FFH= JADE FDC IMAGE ; ;---------------------------------------------------------- DIAG0: ;*** COMMENTED OUT F7,H ;INSURE HOST MEMORY AREA LD A,(IOPBXA) ; SET BANK # OUT (HXADDR),A LD BC,IOPBSIZE IF FALSE CALL MOVFHST ELDATA IF ERROR ; XX0FF5H= CONTENTS OF LAST LOCATION ; ;------------------------------------------------ DIAG2: LD HL,S1MEM0 ( ) *!+",#-$.%/ &0 '----------------------- XILDRV: LD A,FERR05 SCF JP CMDRET XILCMD: LD A,FERR06 SCF JP CMDRET ;------------------AG <> 0 THEN SKIP LOG-ON OR A JR NZ,HDLOG1 LD A,(LUNSV) ;INIT THE DRIVE TABLE LD (IX+DTDRV),A LD (IX+DTVEC),0 LD ESS LD DE,DDBUF ADD HL,DE LD DE,JADSECB EX DE,HL LD BC,128 ;FETCH SECTOR DATA XOR A CALL MOVFHST HSTOUT DDPOROST BUFFER JP HDWRBUF ;WRITE TO DISK ;-------------------------------------- ; ; FORMAT TRACK COMMAND ; ;-----------;++++++++++++++++++++++++++++++++++++++ FDSKEX: LD A,(PBCMD) ;BUILD THE COMMAND BLOCK LD (BTCMD),A LD A,(PBTRK) LD (BTT------------------------- ; ; RETURN FIRMWARE VERSION COMMAND ; ;------------------------------------------- RETVERS: LD (IX+ [DTVEC + 1]),0 LD (IX+DTFLG),0 ;ASSUME SINGLE DENSITY LD IY,IDRCDB ;READ THE ID SECTOR CALL GETLUN CALL HDRDBUFT,DDOUT ;REMOVE FDC WINDOW LD HL,JADSECB ;NOW WRITE TO HOST CALL HDHSTW POP AF ;ERROR STATUS RET ;--------------------------------------- HDFORM: CALL HDSELCT ;IMPLIED SELECT RET C LD IY,LAXCDB ;ELSE USE XFER CDB LD (IY + CMD),SRK),A LD A,(PBSEC) INC A ;CHANGE FROM LOGICAL ADDR TO SECTOR # LD (BTSEC),A LD A,(PBFLG) LD (BTMOD),A LD DE,DDCMDA,VERSN ;LOAD DATA REGISTER WITH VERSION OUT (HDATA),A XOR A RET ;---------------------------- ; ; IOPB COMMANDS  RET C LD DE,IDTXT ;CHECK FOR LEGAL ID LD HL,HDSECB LD B,IDSZE HDCKID: LD A,(DE) CP (HL) JR NZ,HDNTID INC ---------------- ; ; WRITE SECTOR COMMAND ; ;---------------------------- JADWRT: LD HL,JADSECB ;GET DATA TO BUFFER CALCFMTT LD A,(PBSEC) ;SECTOR BYTE HAS INTERLEAVE FACTOR AND 00011111B ;MASK OFF HEAD BITS LD (IY+ILV),A XOR A ;FORCE  ;MOVE COMMAND BLOCK INTO FDC LD HL,(FDADDR) ADD HL,DE EX DE,HL LD HL,BTCMD LD BC,7 XOR A CALL MOV2HST HSTOUT; ;---------------------------- MAXCMDS EQU 8 JADCMDS: DW JADLOG ;LOG ON DISK DW JADREAD ;READ SECTOR DW JADWRT ;WRIHL INC DE DJNZ HDCKID ; ; ID CHECKS, SET UP ; LD A,(HDSECB + IDFLGO) ;FETCH FLAGS LD (IX+DTFLG),A HDNTID: LD HL,HDL HDHSTR HSTOUT DDPORT,DDMRQ ;GET FDC WINDOW LD DE,DDBUF ;PUT DATA FROM BUFFER INTO FDC LD HL,(FDADDR) ADD HL,DE EX SECTOR TO 0 FOR CLEANLINESS LD (PBSEC),A CALL GETLUN ;GET DRIVE CALL GETLAD ;GET LOGICAL ADDRESS CALL XCDB6 RE DDPORT,DDEXC ;ISSUE COMMAND LD BC,5 ;SET UP TO MOVE STATUS DOWN FDSKWT: HSTIN DDPORT ;WAIT UNTIL DONE AND DDSHLT TE SECTOR DW JADFORM ;FORMAT TRACK DW JADRDAD ;READ ADDRESS DW JADEXEC DW JADEXEC DW JADEXEC ;IDLE HDCMDS: DW SECB ;WRITE ID SECTOR TO HOST CALL HDHSTW CALL CLRBUFR ;FLUSH BUFFER OF IOPB SECTOR (DON'T CARE) HDLOG1: XOR A RET DE,HL LD HL,JADSECB LD BC,128 XOR A CALL MOV2HST CALL FDSKEX ;EXECUTE WRITE SECTOR CMD PUSH AF ;SAVE ERROR STATUT C ;ERR? LD (IY+ILV),0 ;RESTORE ILV BYTE TO 0 JP GETRES ;FINISH UP ;-------------------------------------- ; ; JR NZ,FDSKWT HSTOUT DDPORT,DDMRQ ;GET WINDOW XOR A CALL MOVFHST LD A,(BTSTS) ;IF NO ERROR THEN RETURN 0, NC HDLOG ;LOG ON DISK (SELECT DISK) DW HDREAD ;READ DEBLOCKED SECTOR DW HDWRT ;WRITE DEBLOCKED SECTOR DW HDFORM ;FORMAT T ;-------------------------------------- ; ; READ DEBLOCKED SECTOR COMMAND ; ;-------------------------------------- HDRES HSTOUT DDPORT,DDOUT ;REMOVE WINDOW POP AF ;ERROR STATUS RET ;---------------------------- ; ; FORMAT COMMAND  RECAL COMMAND ; ;-------------------------------------- HDRECAL: CALL HDSELCT RET C JP RECALC ;----------------LD (PBSTAT),A OR A RET Z LD A,0 ;NOT FIRMWARE ERROR SCF ; BUT ERROR JUST THE SAME RET SUBTTL HARD DISK IORACK DW HDRECAL ;RECAL DW HDSEEK ;SEEK TRACK (NORMALLY IMPLIED) DW HDCERR DW HDDEFF ;DEFINE FLOPPY CHARACTERISTICS AD: CALL HDSELCT ;IMPLIED SELECT RET C LD IY,LAXCDB ;USE XFER CDB CALL GETLUN CALL GETLAD CALL HDRDBUF RET C ; (NOT IMPLEMENTED) ; ;---------------------------- JADFORM: ;---------------------------- ; ; READ ADDRESS COMMAND ;---------------------- ; ; SEEK COMMAND ; ;-------------------------------------- HDSEEK: CALL HDSELCT ;IMPLIED SELECT RPB COMMANDS ;-------------------------------------- ; ; UNSUPPORTED COMMAND ; ;-------------------------------------- HDCE SUBTTL JADE IOPB COMMANDS ;-------------------------------------- ; ; LOGON COMMAND IS SAME AS READ ; ;------------------SELCTBUF CALL HDHSTW ;WRITE TO HOST XOR A ;NO ERRORS RET ;-------------------------------------- ; ; WRITE SECT (NOT IMPLEMENTED) ; ;---------------------------- JADRDAD: ;---------------------------- ; ; IDLE COMMAND ; (NOT IMPLEET C LD IY,LAXCDB ;USE XFER CDB LD (IY+CMD),SCSEEK ;SEEK COMMAND CALL GETLUN CALL GETLAD ;GET USER'S BLOCK CALL XCDRR: LD A,FERR06 SCF RET ;-------------------------------------- ; ; DRIVE SELECT/LOG-ON COMMAND ; CHECK DRIVE READY -------------------- JADLOG: ;---------------------------- ; ; READ SECTOR COMMAND ; ;---------------------------- JAOR COMMAND ; ;-------------------------------------- HDWRT: CALL HDSELCT ;IMPLIED SELECT RET C LD IY,LAXCDB ;USE XFER MENTED) ; ;---------------------------- JADEXEC: LD A,FERR05 ;UNSUPPORTED FOR NOW! SCF RET SUBTTL JADE FDC SUBR ;+B6 ;SEND CDB RET C JP GETRES ;GET ANY ERRORS ;------------------------------------------------ ; ; DEFINE FLOPPY  ; ENTRY- (PBFLG)= 0: FULL LOG ; ;-------------------------------------- HDLOG: CALL HDSELCT RET C LD A,(PBFLG) ;IF FLDREAD: HSTOUT DDPORT,DDMRQ ;SWITCH DD INTO MEMORY CALL FDSKEX PUSH AF ;SAVE ERROR STATUS LD HL,(FDADDR) ;GET FDC ADDRCDB CALL GETLUN CALL GETLAD CALL HDRDBUF ;REFRESH BUFFER WITH SECTOR DATA RET C SELCTBUF CALL HDHSTR ;READ H+++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE COMMAND BLOCK FUNC. ; EXIT - NZ, CF= ERROR ; A= 0 (NOT FIRMWARE) ; 0 ( ) *!+",#-$.%/ &0 'DISK PARAMS COMMAND ; ;------------------------------------------------ HDDEFF: LD IY,NULCDB ;USE NUL CDB LD (IY+CMD),SCDEFPORT LD HL,HDSECB HDWRLP: CALL GETSTAT ;IF READY THEN BIT SREQ,A JR Z,HDWRLP AND SSXMSK ; IF DATA READY THEN PUEN SUB A,HDBASD AND 00000011B SUB A,(IX+DTDRV) RET Z ; RETURN LD IY,NULCDB ;USE NUL CDB LD (IY+CMD),SCRDY ;TESTB PTRS ; ;************************************** MAKSAME: LD A,(PBDRV) LD (BUFDRV),A LD HL,(PBTRK) LD (BUFTRK),HL LXMSK ; IF DATA READY THEN GET IT CP SSNDDAT JP Z,HDRD2 CP SSNDST ; ELSE IF NOT READY FOR STATUS THEN ERR JR NZ,H ;DEFINE CMD CALL GETLUN LD A,(PBSEC) ;USE SECTOR BYTE TO PASS FLOPPY DEFINITION LD (IY + FDD),A ;SET DEFINE BYTE TO SIDT IT CP SGTDAT JP Z,HDWR2 CP SSNDST ; ELSE IF READY FOR STATUS THEN GET IT JP NZ,HDRWFER ; ELSE UNKNOWN CONDITION READY COMMAND CALL GETLUN ;REQUEST LUN FROM USER CALL XCDB6 ;EXECUTE CDB JR C,SELERR CALL GETRES ;GET RESULT BYTD HL,(PBSEC) RES 0,L LD (BUFSEC),HL RET ;************************************** ; ; READ DATA FROM HOST IOPB SUBR DRWFER HDRDDN: CALL GETRES PUSH AF CALL NC,MAKSAME ;MAKE BUFFER PTRS REFLECT DISK DATA POP AF RET NC PUSH AF ;SAES & DENSITY CALL XCDB6 ;EXECUTE RET C JP GETRES ;IF ERR THEN OUTPUT IT SUBTTL HARD DISK SUBROUTINES ;*********! JP GETRES HDWR2: OUTI ;SASI DATA = *PTR++; CNT-- JP NZ,HDWRLP HDWROV: CALL GETSTAT ;OVERFLOW, WASTE DATA BIE JR C,SELERR LD A,(LUNSV) ;SELECT DRIVE TABLE ADD A,A ADD A,A LD IX,HDDTBL LD E,A LD D,0 ADD IX,DE XOR A ; ENTRY- HL= DESTINATION PTR ; ;************************************** HDHSTR: LD DE,(PBDMA) ;GET DESTINATION PTR LD A,(PBDVE ERROR CODE LD A,(RETRYS) SUB A,1 LD (RETRYS),A JR C,HDRDNOT POP AF JP HDRDRTY HDRDNOT: CALL CLRBUFR ;BUFF***************************** ; ; CLEAR CONTROLLER SUBR ; ;************************************** INIT: LD IX,HDDMY ;INIT DT SREQ,A JR Z,HDWROV AND SSXMSK CP SSNDST JP NZ,HDWASTE ;IF NOT STATUS THEN WASTE DATA JP GETRES ;+++++++++++ ;NO ERRORS RET SELERR: LD IX,HDDMY ;IF DRIVE SELECT ERR THEN POINT TO DUMMY RET ; RETURN SELECT ERROR ;******MAX) ;SET BANK REGISTER LD BC,128 ;MOVE 128 BYTES ;************************************** ; ; BLOCK MOVE FROM HOST SUBER CONTAMINATED POP AF RET HDRD2: INI ;*PTR++ = SASI DATA; CNT-- JP NZ,HDRDLP HDRDOV: CALL GETSTAT ;IF READY THUMMY DISK DRIVE TABLE ENTRY PTR LD HL,DTIMG ;MOVE DEFAULT DRIVE TABLES TO RAM LD DE,HDDTBL LD BC,DTICNT LDIR LD HL+++++++++++++++++++++++++++ ; ; QUERY BUFFER THE SAME FUNCTION ; EXIT - ZF= SAME ; NZ= NOT SAME ; ;++++++++++++++++++++++******************************** ; ; READ HD SECTOR INTO BUFFER SUBR ; ENTRY- IY= CDB PTR ; CDB= SET UP ; EXIT - CF= ERRORR ; ENTRY- HL= LOCAL PTR (DST) ; DE= HOST PTR (SRC) ; BC= BYTE COUNT ; A= BANK ADDRESS (SRC) ; ;***********************EN INPUT DATA BIT SREQ,A JR Z,HDRDOV AND SSXMSK CP SSNDST ;IF READY FOR STATUS THEN GET IT JP Z,HDRDDN HDWASTE: ,NULCDB ;ZERO CDBS LD B,CDBINIT INITRAM: LD (HL),0 INC HL DJNZ INITRAM LD A,1 SHL SRESET ;RESET CONTROLLER OUT SA++++++++++++++++ QBUFR: LD A,(PBDRV) ;CHECK DRIVE 1ST LD HL,BUFDRV CP (HL) RET NZ LD DE,(PBSEC) ;NOW CHECK SECTOR O ; ;************************************** HDRDBUF: CALL QBUFR ;IF BUFFER DATA VALID THEN SKIP READ RET Z LD C,10 ;*************** MOVFHST: LD (MOVX),A ;SAVE EXTENDED ADDRESS FOR BUMPING OUT (HXADDR),A XOR A ;TRANSFER FROM S100 EX CALL HDXWST ;OVERFLOW, WASTE DATA CALL GETRES ;FINISH UP HDRWFER: CALL CLRBUFR ;BUFFER CONTAMINATED LD A,FERR08 ; UNSICMD,A EX (SP),HL ;GIVE A LITTLE EXTRA TIME EX (SP),HL LD A,1 SHL SERRCLR ;RELEASE RESET OUT SASICMD,A CALL CLR A ;IF DRIVE 0 THEN SKIP TRACK TEST JR Z,QBBLK LD A,(PBTRK) ;IF TRACK 0 OF FLOPPY THEN NO BLOCKING OR A JR Z,QBNBLK ASSUME RETRIES LD HL,PBFLG LD A,(HL) ;FETCH FLAGS BIT PBRTRY,A JR Z,HDRTRY1 LD C,0 HDRTRY1: LD A,C LD (RETRYAF,AF' JP MOVIT ;************************************** ; ; WRITE DATA TO HOST IOPB SUBR ; ENTRY- HL= SOURCE PTR ; ;KNOWN CONDITION, USE HANDSHAKE SCF RET ;************************************** ; ; WRITE HD SECTOR FROM BUFFER SUBR RBUFR ;START WITH FRESH BUFFER READ HSTIN DDPORT ;FETCH FDC ADDRESS AND DDSASW RLCA OR HIGH DDBASE LD H,A LD L,0 QBBLK: RES 0,E ;CLEAR BLOCKING BIT QBNBLK: LD HL,(BUFSEC) SBC HL,DE RET NZ LD DE,(PBTRK) ;LAST, CHECK TRACK LD S),A LD A,(HL) ;CHECK FOR CONTROLLER RETRY DISABLE RLA OR (HL) AND 80H LD (IY + RTY),A HDRDRTY: LD (IY+CMD),SC************************************** HDHSTW: LD DE,(PBDMA) ;GET DESTINATION PTR LD A,(PBDMAX) ;SET BANK REGISTER LD BC,12; ENTRY- IY= CDB PTR ; CDB= SET UP ; ;************************************** HDWRBUF: LD (IY+CMD),SCWRIT ;WRITE COMMAND  LD (FDADDR),HL RET ;++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; EXIT - CY= NC: NORMAL ; HL,(BUFTRK) SBC HL,DE RET ;************************************** ; ; CLEAR BUFFER SUBR ; ;************************READ ;READ COMMAND LD (IY+NBK),1 ;ALLWAYS USE 1 BLOCK (SECTOR) CALL XCDB6 ;SEND CDB RET C LD BC,[HDBUFSZ * 256] + S8 ;MOVE 128 BYTES ;************************************** ; ; BLOCK MOVE TO HOST SUBR ; ENTRY- HL= LOCAL PTR (SRC) ;  LD (IY+NBK),1 ;ALLWAYS USE 1 BLOCK (SECTOR) CALL XCDB6 ;SEND CDB RET C LD BC,[HDBUFSZ * 256] + SASIDATA ;SET COUNT,  CF: ERROR, A= CODE ; ;++++++++++++++++++++++++++++++++++++++ HDSELCT: LD A,(PBDRV) ;IF REQUESTED DRIVE = CURRENT DRIVE TH************** CLRBUFR: LD A,-1 LD (BUFDRV),A RET ;************************************** ; ; MAKE BUFFER PTRS = PASIDATA ;SET COUNT, PORT LD HL,HDSECB HDRDLP: CALL GETSTAT ;IF NOT READY THEN WAIT BIT SREQ,A JR Z,HDRDLP AND SS0 ( ) *!+",#-$.%/ &0 ' DE= HOST PTR (DST) ; BC= BYTE COUNT ; A= BANK ADDRESS (DST) ; ;************************************** MOV2HST: LD (MOV PUSH IY POP HL XCDB3: PUTDATA ;GET CDB DATA JR NZ,XCDB3 XOR A ;RETURN NO ERRORS RET ;++++++++++++++++++LDIR JP NZ,MOV6 EX DE,HL ; SWAP BACK MOV6: EX AF,AF' XOR A RET ; ; LONG TRANSFER PART TESTS EACH BYTE FOR THR+++++++++++++++++++++ GETLUN: LD (CDBPTR),IY ;SAVE CDB PTR LD A,(PBDRV) ;FETCH DRIVE # SUB A,HDBASD AND 00000011B LD ++++++++++++ ; ; GET STATUS FUNCTION ; EXIT- A= STATUS WORD ; ;+++++++++++++++++++++++++++++++++++++ GETSTAT: IN A,SASISX),A ;SAVE EXTENDED ADDRESS VALUE FOR BUMPING LD (HXADDR),A LD A,1 ;TRANSFER TO S100 OR A EX AF,AF' ;***********++++++++++++++++++++ ; ; GET CONTROLLER RESULTS FUNCTION ; EXIT - CF= HARD ERROR ; ;++++++++++++++++++++++++++++++++++++++ ESHOLDS ; DOLONG: INC BC ;RESTORE COUNT LD A,D ;SET UP CURRENT BIT 15 LD I,A NO64KX: SET 7,D ;INSURE S100 MOV4: E(LUNSV),A ;SAVE IT FOR OTHERS RRCA ;PUT IN PROPER FIELD RRCA RRCA LD (NULCDB + LUN), A LD (LAXCDB + LUN), A LD (T ;GET STATUS WORD AND SSTMSK ;REMOVE UNUSED BITS XOR SSTINV ;INVERT SOME RET ;++++++++++++++++++++++++++++++++++++********************************************************* ; ; MOVE SUBR CHECKS FOR A MOVE CROSSING ANY 32K BOUNDARY ; AND SEL GETRES: LD HL,RSTAT ;INSURE DESTINATION CORRECT LD C,SASIDATA GETDATA ;GET RESULT STATUS BYTE ;CHECK FOR HARDWARE X AF,AF' ;IF HL= S100 THEN JP NZ,MOV2 EX DE,HL MOV2: LDI JP NZ,MOV3 EX DE,HL MOV3: JP PO,MOV5 ;IF DONE THEN RETURN IDRCDB + LUN), A LD HL,(CDBPTR) ;RETURN CDB PTR RET ;******************************************* ; ; GET LOGICAL AD++ ; ; TRANSMIT CDB FUNCTION ; ENTRY- (CDBPTR)= CDB TO XMIT ; EXIT - CF= ERROR ; BC= ? ; ;++++++++++++++++++++++++++++++ECTING A FAST BLOCK MOVE IF NOT, AND A SLOWER BLOCK MOVE ; WHICH CHECKS AFTER EACH BYTE FOR AN OVERFLOW CONDITION IF TRUE. ; EPARITY ERROR BIT SPERR,A JR NZ,HDPERR LD A,(RSTAT) ;IF ERROR THEN GO REQUEST STATUS AND 00000011B RET Z BIT 1,A  EX AF,AF' BIT 7,D ;IF NOT ROLLOVER THEN REPEAT JP NZ,MOV4 LD A,I ;TOGGLE BIT 15 XOR 80H LD I,A OUT (HXAD15),ADR FROM IOPB SUBR ; ENTRY- IY= CDB PTR ; IX= DRIVE TABLE PTR ; ;******************************************* GETLAD: BIT DF++++++++ XCDB6: ; ; ISSUE CONTROLLER SELECT PER SHUGART MANUAL ; LD A,[1 SHL HDCONT] ;SELECT DB0 OUT SASIDATA,A LD ANTRY- HL= LOCAL MEMORY PTR ; DE= S100 MEMORY PTR ; BC= BYTE COUNT TO TRANSFER ; AF'= 0: XFER FROM S100 MEMORY TO LOCAL MEM ;IF CONTROLLER PARITY ERROR THEN EXIT JR Z,HDPERR LD (IY+CMD),SCSNSE ;REQUEST SENSE COMMAND CALL XCDB6 RET C GETR1 BIT 7,A ;IF TOGGLED TO 0 THEN BUMP BANK JP NZ,NO64KX LD A,(MOVX) INC A LD (MOVX),A OUT (HXADDR),A JP NO64KX HARD,(IX + DTFLG) ;IF HARD DISK THEN SPLIT JR NZ,HDLAX ;-------------------------------------- ; ; FLOPPY DISK LAD CALCUL,[1 SHL SSELECT] OR [1 SHL SERRCLR] ;OUTPUT STROBE OUT SASICMD,A LD BC,0 ;TIMEOUT BSYWT2: CALL GETSTAT ;WAIT FOR BUSYORY ; 1: XFER FROM LOCAL MEMORY TO S100 MEMORY ; ; EXIT - AF, AF'= ? ; BC= 0 ; HL= HL + BC ; DE= DE + BC ; ;***: LD HL,PBSTAT ;READ SENSE STATUS BYTES LD BC,[4 * 256] + SASIDATA ;4 BYTES GETR2: GETDATA JR NZ,GETR2 GETR3: CALL GE MOV5: EX AF,AF' ;BALANCE UP XOR A RET ;************************************** ; ; WASTE OVERFLOW DATA SUBR ; ;*ATION ; ;-------------------------------------- LD HL,128 ;ASSUME SECTOR SIZE OF 128 BYTES LD A,(PBTRK) ;IF TRACK 00 TH BIT SBUSY,A JR NZ,BSYOK2 DEC BC LD A,C OR B JR NZ,BSYWT2 LD A,FERR07 ;HANDSHAKE TIMEOUT ERR SCF RET BS***************************************************************** MOVIT: EX AF,AF' ;SET FLAGS OR A EX AF,AF' LD A,D ;TSTAT ;FINISH OUT COMMAND BIT SREQ,A JR Z,GETR3 IN A,(C) ;GET RESULT BYTE OF COMMAND AND 00000011B ;IF ERROR THEN HA************************************* HDXWST: CALL GETSTAT ;IF READY THEN INPUT DATA BIT SREQ,A JR Z,HDXWST AND SSXMSKEN USE 128 JR Z,GETLAD1 BIT DFDBL,(IX + DTFLG) ;IF SINGLE DENSITY THEN USE 128 JR Z,GETLAD1 ADD HL,HL ;ELSE USE 256YOK2: LD A,1 SHL SERRCLR ;REMOVE SELECT STROBE OUT SASICMD,A XCDB2: CALL GETSTAT ;CHECK FOR COMMAND ACCEPT BIT SREQ,A SET BIT 15 OUT (HXAD15),A DEC BC ;IF > 32K MOVE THEN DO LONG WAY LD A,B CP 32768 / 256 JR NC,DOLONG LD A,E ;IFRD ERROR SCF ;ERROR ANYWAY RET Z LD A,FERR09 ;SENSE STATUS ERROR RET HDPERR: XOR A ;CLEAR ERROR OUT (SASICMD), CP SSNDST ;IF READY FOR STATUS THEN GET IT RET Z LD A,0E5H ;OUTPUT WILL ALSO DO FOR INPUT OUT SASIDATA,A JR HDXWS GETLAD1: LD (BYTCNT),HL LD DE,(PBTRK) ;GET TRACK LD A,76 ;CHECK LIMITS SUB A,D JR C,PARERR PUSH DE ;LA = TR; WAIT FOR REQUEST JR Z,XCDB2 BIT SCD,A ;IF NOT COMMAND THEN ??? JR NZ,XOK XCDBER: LD A,FERR08 ;CONTROLLER SYNC ERRO 64K CROSS THEN DO LONG WAY ADD C LD A,D ADC B JR C,DOLONG XOR D ;IF 32K CROSS THEN DO LONG WAY JP M,DOLONG IA LD A,1 SHL SERRCLR OUT (SASICMD),A LD A,FERR11 ;RETURN PARITY ERROR SCF RET ;++++++++++++++++++++++++++++++++T ;************************************** ; ; RECALIBRATE SUBR ; ;************************************** RECALC: LD IYACK * 26 + SECTOR POP HL ADD HL,HL ;X * 26 = 8X + 5X * 2 ADD HL,HL ADD HL,HL ADD HL,DE ; +5X ADD HL,DE ADD HL,DER SCF RET XOK: LD BC,[6 * 256] + SASIDATA ;BYTE COUNT IN B BIT SIO,A ;IF DIRECTION NOT OUT THEN ERR JR NZ,XCDBER NC BC ;RESTORE COUNT SET 7,D ;INSURE S100 MAP EX AF,AF' ;IF FROM S100 THEN JP NZ,MOV1 EX DE,HL ; SWAP MOV1: ++++++ ; ; GET LUN FROM USER FUNCTION ; ENTRY- IY= CDB PTR ; EXIT - IY, HL= CDB PTR ; BC, DE, AF= ? ; ;+++++++++++++++++,NULCDB LD (IY+CMD),SCREC ;RECAL COMMAND CALL GETLUN CALL XCDB6 JP GETRES ;FINISH UP ;+++++++++++++++++++++++++0 ( ) *!+",#-$.%/ &0 ' ADD HL,DE ADD HL,DE ADD HL,HL ; * 2 LD A,(PBSEC) ;FETCH SECTOR LD E,A LD A,26 ;CHECK FOR LIMIT SUB A,E JR N LA2 EQU 1 ;LOGICAL ADDRESS 2 IN BITS 0..4 LA1 EQU 2 ;LOGICAL ADDRESS 1 LA0 EQU 3 ;LOGICAL ADDRESS 0 ILV EQU 4 ;FORMAT COMMAIF $ >= (LOCROM + ROMSIZE) ;############################ ; ; PROTECTION MESSAGE ; ;############################ CONMSG ** AREA ; ;------------------ IF $ > (LOCRAM + RAMSIZE - 32) CONMSG **** ERROR! DATA TOO LARGE FOR DECLARED RAM SIZE! **** ########################## HDBUFSZ EQU 256 HDSECB DS HDBUFSZ RSTAT DS 1 ;COMMAND STATUS RETURNED ;BIT 1: ERROR (ISSUE SC,SECOK PARERR: LD A,FERR10 ;ILLEGAL PARAMETER SCF RET SECOK: ADD HL,DE ;ADD IN SECTOR BIT DFT0D,(IX + DTFLG) ;IFND INTERLEAVE FACTOR NBK EQU 4 ;XFER COMMANDS BLOCK (SECTOR) COUNT RTY EQU 5 ;RETRY FLAG 0: RETRY 3 TIMES, 80H: NO RETRYS LUN** ERROR! CODE TOO LARGE FOR DECLARED PROM SIZE! **** ENDIF SUBTTL RAM AREA ORG LOCRAM ;############################ ; ENDIF DS 32 STACK EQU LOCRAM + RAMSIZE END ENSE COMMAND) ;BIT 5..7: LUN BUFDRV DS 1 ;BUFFER CONTENTS DRIVE BYTE BUFSEC DS 2 ;BUFFER CONTENTS SECTOR WORD BUFTRK DS 2 DOUBLE DENSITY THEN LESS 26 JR Z,HDFDOK LD DE,26 SBC HL,DE HDFDOK: LD (IY+LA0),L LD (IY+LA1),H XOR A ;RETURN D EQU 5 ;COPY COMMAND DEST. LUN IN BITS 5..7 LA2D EQU 5 ;COPY COMMAND DEST. LOGICAL ADDR 2 IN BITS 0..4 FDD EQU 5 ;DEFINE FLOP ; VARIABLES ; ;############################ IOPBL DS 1 ;LOW ADDRESS OF IOPB TO EXECUTE IOPBH DS 1 ;HIGH ADDRESS OF IOPB å ;BUFFER CONTENTS TRACK WORD ;###################################### ; ; JADE SECTOR BUFFER ; ;##########################NO ERRORS RET ;---------------------------- ; ; SET UP HARD DISK CDB ; ;---------------------------- HDLAX: LD HL,256 PY PARAMS COMMAND ;BIT 0: 0= SINGLE SIDE, 1= DOUBLE SIDED ;BIT 1: 0= SINGLE DENSITY, 1= DOUBLE DENSITY ;BITS 2..3: 0 IOPBXA DS 1 ;BANK ADDRESS OF IOPB ;###################################### ; ; I/O PARAMETER BLOCK SAVE AREA ; ;########å############ JADSECB DS 256 ;###################################### ; ; JADE COMMAND BLOCK ; ;######################## ;SECTOR SIZE LD (BYTCNT),HL LD A,(PBSEC) ;FETCH SECTOR LD E,A LD A,(PBTRK) ;PICK UP TRACK LSB & PUT INTO LA0 BIT 7 0= 128 BYTES, 01= 256 BYTES LA1D EQU 6 ;COPY COMMAND DEST. LOGICAL ADDR 1 LA0D EQU 7 ;COPY COMMAND DEST. LOGICAL ADDR 0 RTYD ############################## PBCMD DS 1 ;COMMAND BYTE PBDRV DS 1 ;DRIVE BYTE PBTRK DS 2 ;TRACK # PBSEC DS 2 ;SECTOR #,å############## BTCMD DS 1 ;COMMAND BTDRV DS 1 ;DRIVE BTTRK DS 1 ;TRACK BTSEC DS 1 ;SECTOR DS 2 ;SPARES BTMOD DS 1 ;MODE ( SRL A ; SECTOR BIT 0 IS WASTED RR E LD (IY+LA0),E ;PHEW! LA0 DONE LD (IY+LA1),A ;LA1 HAPPENS TO BE IN A XOR A ;EQU 9 ;COPY COMMAND RETRY FLAG ERRCOD DS 1 ;####################### ; ; DRIVE TABLES ; ;####################### HDD FORMAT INTERLEAVE, FLOPPY PARAMS PBFLG DS 1 ;INPUT FLAG BYTE (LOG-ON, BLOCKING FLAGS) ; SELECT DISK - 0: NOT SELECTED BEåFLAGS) BTSTS DS 1 ;STATUS BTLAD DS 2 ;BIOS LOAD ADDR BTLNG DS 2 ;BIOS LENGTH ;##########################################RETURN NO ERRORS RET SUBTTL CONSTANTS ;########################################################## ; ; INITIAL DISK DRIVTBL: DS 4 ;HD PHYSICAL DRIVE 0 DS 4 ; 1 DS 4 ; 2 DS 4 ; 3 HDDMY DS 4 ;DUMMY ; DTDRV EQU 0 ;DRIVE BYTE OFFFORE ; BLOCKING - 0: NORMAL WRITE (READ-WRITE) ; 1: DIRECTORY WRITE (READ-WRITE) ; 2: UNALLOCATED WRITEå################ ; ; DISK CONTROLLER COMMAND DESCRIPTOR BLOCKS (CDB) ; ;####################################################E TABLES ARE MOVED TO RAM BY INIT ; ;########################################################## DTIMG: DB 0,0,0,01100000B ;LUSET ; DTVEC EQU 1 ;DRIVE VECTOR OFFSET DTFLG EQU 3 ;DRIVE FLAGS OFFSET ;####################### ; ; DISCRETE VARIABLES  (NO READ) PBLOG EQU 0 ;LOGON REQUEST BIT PBRTRY5 EQU 6 ;RETRY 5 TIMES BIT (ALONG WITH BIT 7 SET) PBRTRY EQU 7 ;DISABLE REå###### CDBPTR DS 2 ;PTR TO CURRENT COMMAND CDB NULCDB: DS 6 ;NO TRANSFER CDB LAXCDB: DS 6 ;MAIN XFER CDB IDRCDB DS 6 ;N0 DB 1,0,0,0 ;LUN1 DB 2,0,0,0 ;LUN2 DB 3,0,0,0 ;LUN3 DB -1,0,0,0 ;DUMMY DRIVE TABLE USED ON ERROR DTICNT EQU $ - DT ; ;####################### LUNSV DS 1 ;LUN # BYTCNT DS 2 ;SECTOR SIZE RETRYS DS 1 ;RETRY COUNT MOVX DS 1 ;HOST BANK ADDRESTRYS BIT PBDMA DS 2 ;TRANSFER ADDRESS PBDMAX DS 1 ;TRANSFER BANK ADDRESS PBSTAT DS 4 ;SENSE STATUS BYTES (IF ERROR) DSåID SECTOR READ CDB CDBINIT EQU $ - NULCDB ; ; CDB OFFSETS ; CMD EQU 0 ;COMMAND LUN EQU 1 ;LOGICAL UNIT NUMBER IN BITS 5..7IMG ;####################### ; ; ID SECTOR TEXT ; ;####################### IDTXT DB 'Jade DD ' IDSZE EQU $ - IDTXT S SAVE FOR BLOCK MOVE SUBRS FDADDR DS 2 ;FDC ADDRESS PTR TIMOUT DS 2 ;UNSELECT SASI DELAY ;------------------ ; ; STACK 2 ;SPARES IOPBSIZE EQU $ - PBCMD ;###################################### ; ; HARD DISK SECTOR BUFFER ; ;############0 ( ) *!+",#-$.%/ &0 ' TITLE INTELLIGENT SASI HOST ADAPTOR INTERFACE LIST NOCOND ;*****************************************************************==================================================================== S1MEM EQU 8000H ;BASE ADDRESS OF S100 MEMORY WINDOW ; Lcommand after getting ; results command issued. ; ; 1.4 - 28 APR 84 GRH ; Add Jade FDC routines. Change host block move su__ SASI COMMAND (1) / DATA (0) ; | | |________ SASI REQUEST (1) ; | |__________ SASI INPUT (1) / OUTPUT (0) ; |______disk installed. ; ; 1.B - 21 FEB 87 GRH ; Add error return to IOPB.PBSTAT thus allowing user to only check ; this byte f********* ; ; THIS MODULE CONTAINS THE INTELLIGENT HOST ADAPTER FIRMWARE. ; ;***********************************************OCROM EQU LOCMEM ;BASE ADDRESS OF LOCAL ROM LOCRAM EQU LOCMEM + 4000H ;BASE ADDRESS OF LOCAL RAM ; RAMSIZE EQU 2048 ;SIZE Obrs into general ; purpose subrs. ; ; 1.5 - 30 APR 84 GRH ; Change hardware to reflect the state of the interrupt flip-fl__________ SASI PARITY ERROR (1) ; SBUSY EQU 0 ;SASI BUSY BIT SMSG EQU 1 ;SASI MESSAGE BIT SCD EQU 2 ;SASI C/D BIT SREQ or errors rather than checking HSTATUS and then HDATA. ; ; 1.12 - 25 MAY 87 GRH ; Change JADE code to allow interim communi*************************** ; ; IOPB CONFIGURATION: ; ; DRIVE USAGE ; 0 SASI physical drive 0 ; 1 SASI physical driF LOCAL RAM ROMSIZE EQU 2048 ;SIZE OF LOCAL ROM ;========================================================================op ; as the busy bit (D0). Hardware will now allow software setting of ; the interrupt flip-flop to allow passing a busy stateEQU 3 ;SASI REQUEST* BIT SIO EQU 4 ;SASI I/O* BIT SPERR EQU 7 ;SASI PARITY ERROR DETECTED BIT SSTMSK EQU 10011111B ;STATUScation with new JADE ; firmware. ; Change version # to decimal number. ; VERSN EQU 112 ;**********************************ve 1 ; 2 SASI physical drive 2 ; 3 SASI physical drive 3 ; 4 JADE floppy disk controller physical drive 0 ; 5 JA=== ; ; LOCAL PORT DEFINITIONS ; ;=========================================================================== SASIDATA EQU  if required. ; Normally this change will allow transparent operation of the soft- ; ware, without concern to the busy status. BIT MASK SSTINV EQU 00011000B ;STATUS BIT INVERSION MASK SSXMSK EQU 00010110B ;XFER CONTROL MASK SGTCMD EQU 1 SHL SCD ;GET C**************************************** FALSE EQU 0 TRUE EQU NOT FALSE DEBUG EQU FALSE ; ;*INCLUDE JDDCONT.DEF ; LISTDE floppy disk controller physical drive 1 ; 6 JADE floppy disk controller physical drive 2 ; 7 JADE floppy disk controlLOCPRTS ;SASI BUS DATA PORT ; SASICMD EQU LOCPRTS + 1 ;SASI BUS CONTROL PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITIONS ;  All other status bits ; reflect the software status register contents (D1..7). ; ; 1.6 - 3 MAY 84 GRH ; Change block moveOMMAND FROM H/A SGTDAT EQU 0 ;GET DATA FROM H/A SSNDDAT EQU 1 SHL SIO ;SEND DATA TO H/A SSNDST EQU (1 SHL SIO) + (1 SHL SCD) OFF *INCLUDE JDDCONT.DEF LIST ON SUBTTL DEFINITIONS ;==================================================================ler physical drive 3 ; ;************************************************************************** ; ; REVISIONS: ; 1.0 - 2^ ^ ^ ^ ^__ SASI INTERRUPT ON REQUEST ENABLE (1), HOST (0) ; | | | |____ SASI RESET BIT (1) ; | | |______ SASI DEV subroutine to allow for 1..65,536 byte moves. ; Fix bugs in Jade driver. Add printer output diagnostic. ; ; 1.7 - 2 JUN 84  ;SEND STATUS TO H/A SCMDDN EQU (1 SHL SIO) + (1 SHL SCD) + (1 SHL SMSG) ;COMMAND DONE ; HINTC EQU LOCPRTS + 2 ;HOST INTERRUP========= ; ; I/O PORTS ; ;=========================================================================== S100D EQU 0D8H ;DAT8 DEC 83 GRH ; DIAGNOSTIC VERSION FOR TESTING THE BOARD. ; 1.1 - 2 JAN 84 GRH ; ADD HARD DISK CONTROLLER FIRMWARE. ; 1.2ICE SELECT STROBE (1) ; | |________ SASI PARITY ERROR CLEAR (0) ; |__________ HOST VECTORED INTERRUPT (1) ; SINT GRH ; Fix bug in HSTIN & HSTOUT macros outputting bit 7 data to XADDR ; register instead of to HXAD15 register. ; Add JADET CLEAR PORT (OUT, DATA= X) ; HINTS EQU LOCPRTS + 3 ;HOST INTERRUPT SET PORT (OUT, DATA= X) ; HSTAT EQU LOCPRTS + 4 ;HOST A PORT VISIBLE TO S100 BUS S100S EQU S100D + 1 ;STATUS PORT VISIBLE TO S100 BUS S100C EQU S100S ;COMMAND PORT VISIBLE TO S100 - 1 APR 84 GRH ; Fix Bug in host xfer subr. that caused problems on 32k boundary ; crossings. Enable parity checking for reE EQU 0 ;SASI INTERRUPT BIT # SRESET EQU 1 ;SASI RESET BIT # SSELECT EQU 2 ;SASI DEVICE SELECT STROBE BIT # SERRCLR EQU 3  FDC dump to dump diagnostic command. ; ; 1.8 - 2 JUN 84 GRH ; Change floppy disk read/write sector to logical sector for uSTATUS PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITION ; ^ ^ ^__ ISASI BUSY (1) ; | |____ FIRMWARE ERROR (1) ; BUS ; LOCPRTS EQU 0 ;BASE ADDRESS OF LOCAL PORTS LOCMEM EQU 0 ;BASE ADDRESS OF LOCAL RAM ; S1PRTS EQU 80H ;BASE ADDRESSceived data. Enable ; controller retrys. ; 1.3 - 2 APR 84 GRH ; Fix Bug in read buffer routine which caused 1st 4 bytes of  ;SASI PARITY ERROR CLEAR* BIT # HINT EQU 4 ;HOST VECTORED INTERRUPT BIT # ; SASIST EQU LOCPRTS + 1 ;SASI BUS STATUS PORT ;niformity ; in IOPB parameters. (0..N-1 now changed to 1..N) ; ; 1.9 - 3 OCT 84 GRH ; Fix bug in Jade driver which allo |________________ ERROR (1) ; HBUSY EQU 0 ;HOST BUSY STATUS BIT HFERRB EQU 1 ;HOST FIRMWARE ERROR BIT HSERRB EQU 7 ;HOST OF S100 PORTS ;=========================================================================== ; ; MEMORY AREAS ; ;=======sector ; to be 0 and read not retryed but sense status to be issued instead. ; The CDB had to be re-initialized with the read  ; 7 6 5 4 3 2 1 0 BIT DEFINITIONS ; ^ ^ ^ ^ ^ ^__ SASI BUSY (1) ; | | | | |____ SASI MESSAGE (1) ; | | | |____wed errors to go undetected. ; ; 1.A - 18 APR 85 GRH ; Fix logon problem. Code is only now showing bugs with 2nd hard ; 0 ( ) *!+",#-$.%/ &0 ' ERROR STATUS BIT HFERR EQU (1 SHL HSERRB) + (1 SHL HFERRB) ;FIRMWARE ERROR BYTE ; HCMD EQU LOCPRTS + 4 ;HOST COMMAND PORT ; TRUE THEN WAIT BIT SREQ,A JR Z,AC#SYM ; OUTI ;ASSUME CALLER SET UP ; ;DON'T WAIT ENDM ;@@@@@@@@@@@@@@@@@@@@=================== FERR00 EQU -1 ;UNKNOWN ERROR FERR01 EQU 43H ;RAM TEST FAILURE FERR02 EQU 47H ;ROM TEST FAILURE FERR03 EQ 80H),A ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;; ;; HOST INPUT MACRO ;; ;ECTOR(S) SCWRIT EQU 10 ;WRITE SECTOR(S) SCSEEK EQU 11 ;SEEK TRACK ; SCCOPY EQU 20H ;COPY BLOCK(S) ; SCDEF EQU 0C0H ;DEFINE ; 7 6 5 4 3 2 1 0 BIT DEFINITIONS ; ^ ^ \_____/ ^__ HOST INTERRUPTED (1) ; | | |_______ NON-IOPB COMMAND CODE (0..F)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; BUFFER HALF SELECT MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@U 20H ;ILLEGAL COMMAND FERR04 EQU 48H ;ILLEGAL INTERRUPT FERR05 EQU 40H ;ILLEGAL IOPB DRIVE SPEC FERR06 EQU 20H ;ILLEGAL IOPB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ HSTIN: MACRO #PORT ;; ;; SELECT PROPER INSTRUCT FLOPPY DISK PARAMETERS ;=========================================================================== ; ; JADE DEFINITIO ; | |______________ HOST EXECUTE IOPB (1) ; |________________ LOCAL RESET (1) ; HINTRB EQU 0 ;HOST INTERRUPT REQUEST BIT @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SELCTBUF MACRO ; ; ASSUME 1ST HALF ; LD HL,HDSECB ; ; SELECT BUFFER HALF BAS COMMAND FERR07 EQU 49H ;CONTROLLER HANDSHAKE TIMOUT FERR08 EQU 4AH ;CONTROLLER SYNC ERROR ??? FERR09 EQU 1FH ;CONTROLLER SENION BASED ON PORT BIT 7 ;; ; ; SELECT BIT 7 OF PORT ; IF #PORT < 80H XOR A ELSE LD A,#PORT ;SET UP BIT 7 ENDIF NS ; ;=========================================================================== JADBASD EQU 4 ;BASE DRIVE # OF JADE CONTROHIOPBB EQU 6 ;HOST EXECUTE IOPB BIT HRESB EQU 7 ;HOST RESET LOCAL PROCESSOR BIT ; HDATA EQU LOCPRTS + 5 ;HOST DATA TRANSFERED ON FLAGS ; BIT DFHARD,(IX + DTFLG) ;IF HARD DISK THEN DO SELECTION JR NZ,BA#SYM ; LD A,(PBTRK) ;ELSE IF TRK 00 THEN USE STATUS ERROR FERR10 EQU 51H ;ILLEGAL IOPB PARAMETER FERR11 EQU 4BH ;PARITY ERROR ;FERR12 EQU 12 ;==================== OUT (HXAD15),A ; ; INPUT DATA ; IN A,(#PORT OR 80H) ;FETCH DATA ENDM SUBTTL MAIN CODE ORG LOCROM ;-------------LLER JADNDRV EQU 4 ;NUMBER OF LOGICAL JADE CONTROLLER DRIVES DDPORT EQU DDPORT8 DDOUT EQU DDFREE DDMRQ EQU DDMB0 DDBUF EQU PORT ; HXAD15 EQU LOCPRTS + 6 ;HOST A15 SET PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITION ; ^________________ BIT APPLIED TO HOSE 1ST HALF ONLY OR A JR Z,BB#SYM ; BIT DFDBL,(IX + DTFLG) ;IF NOT 256 BYTE SECTORS THEN DO JR Z,BB#SYM ; 1ST HALF ON======================================================= ; ; HARD DISK DEFINITIONS ; ;=======================================-------------------------------------------------------------- ; ; PROCESSOR REGISTER USAGE: ; IX= PTR TO CURRENT DISK DRIVE  0380H DDCMD EQU DDCBO IDFLGO EQU 0031H DFHARD EQU 5 DFDBL EQU 6 DFT0D EQU 0 SUBTTL MACROS ;@@@@@@@@@@@@@@@@@@@@@@@@@@ST BUS A15 WHEN ACCESSING ITS ; MEMORY A15B EQU 7 ;HOST A15 BIT ; HXADDR EQU LOCPRTS + 7 ;EXTENDED ADDRESS PORT (A16.LY ; BA#SYM: LD A,(PBSEC) ;IF SECTOR IS ODD THEN SELECT UPPER HALF AND 1 JR Z,BB#SYM ; LD HL,HDSECB + 128 BB#SYM: EN==================================== HDCONT EQU 0 ;THIS CONTROLLER'S ADDRESS BIT HDBASD EQU 0 ;BASE DRIVE # OF HD CONTROLLERTABLE ; IY= PTR TO CURRENT COMMAND DESCRIPTOR BLOCK ; ;----------------------------------------------------------------------@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GET DATA MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.A23) ; ; 7 6 5 4 3 2 1 0 BIT DEFINITION ; ^ ^ ^ ^ ^ ^ ^ ^__ A16 ; | | | | | | |____ A17 ; | | | | | |______ A18 ; | | | DM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;; ;; HOST OUTPUT MACRO ;; ;@@@@@@@@@@@ HDNDRV EQU 4 ;NUMBER OF PHYSICAL DRIVES SUPPORTED HDNLUN EQU HDNDRV INLEV EQU 6 ;INTERLEAVE FACTOR FOR FORMAT ;======----- ; ; MAIN CODE FROM RESET ; RESETV: ; ; SET BUSY FLAG UNTIL WE'RE DONE ; OUT (HINTS),A ; ; PASS 0 TO HOST @@@@@@@@@@@@@@@@@@@@@@@ GETDATA MACRO AA#SYM: CALL GETSTAT ;IF REQUEST FALSE THEN WAIT BIT SREQ,A JR Z,AA#SYM ; INI | |________ A19 ; | | | |__________ A20 ; | | |____________ A21 ; | |______________ A22 ; |________________ A23 ;======@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ HSTOUT: MACRO #PORT, #DATA ;; ;; SELECT INSTRUCTION BASED ===================================================================== ; ; SASI COMMANDS ; ;===============================IN STATUS ; XOR A,A OUT (HSTAT),A ; ; SET UP INTERRUPT ; IM 1 ; ; SET UP STACK ; LD SP,STACK ;INIT STACK ; ;GET DATA ; ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; PUTDATA MACRO ; ;@===================================================================== ; ; FIRMWARE ERROR CODES ; RETURNED IN HOST DATA REGISTON EFFICIENCY ;; ; ; SET BIT 7 OF PORT ; IF #PORT < 80H XOR A ELSE LD A,#PORT ENDIF OUT (HXAD15),A ; ; OUT============================================ SCRDY EQU 0 ;TEST DRIVE READY COMMAND SCREC EQU 1 ;RECALIBRATE SCSNSE EQU 3 ;REQ; DO RAM TEST 1ST ; LD HL,LOCRAM LD BC,RAMSIZE ; MTLP: LD A,(HL) ;COMPLEMENT & TEST CPL LD (HL),A CP (HL) JR N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PUTDATA MACRO AC#SYM: CALL GETSTAT ;IF REQUEST NOTER IF HOST STATUS BIT 1 SET AND IN IOPB.PBSTATO ; IF APPLICABLE. ; ;========================================================PUT DATA ; IF (#DATA = 0) AND (#PORT <> 0) XOR A ENDIF IF #DATA <> 0 LD A,#DATA ;OUTPUT DATA ENDIF OUT (#PORT ORUEST SENSE SCFMTD EQU 4 ;FORMAT ENTIRE DRIVE SCFMTT EQU 6 ;FORMAT TRACK SCFMTBT EQU 7 ;FORMAT BAD TRACK SCREAD EQU 8 ;READ S0 ( ) *!+",#-$.%/ &0 'Z,MEMERR ; CPL ;RESTORE LD (HL),A ; INC HL ;NEXT LOCATION DEC BC LD A,B OR C JR NZ,MTLP ; ; RAM OK. DO AN3) SET IOPB HI COMMAND DW IOPBX ;(5) SET IOPB XADDR COMMAND DW DIAG0 ;(7) DUMP LOCAL MEMORY DIAGNOSTIC CMD DW DIAG1 ;(9ERROR THEN RETURN FIRMWARE ERR JR C,CMDOK ; ; ILLEGAL DIRECT COMMAND. RETURN ERROR TO HOST ; LD A,FERR03 SCF JR CMD ADDRESS ; EXIT - XX4000H..XX47FFH= RAM IMAGE ; XX4800H..XX4FFFH= ROM IMAGE ; XX5000H..XX57FFH= JADE FDC IMAGE ; ;+++++++------------------------------------------------------------------ HWAIT: ; ; ALLOW INTERRUPTS NOW ; EI ;ALLOW INTERRUY OTHER INITIALIZATION ; CALL INIT ;ANY OTHER INITIALIZATION ; ; WAIT FOR HOST COMMAND WITHOUT TIMEOUT ; LD HL,0 ;FO) SET OUTPUT PORTS DIAG. COMMAND DW DIAG2 ;(B) TEST S100 MEMORY ACCESS COMMAND DW DIAG3 ;(D) BLOCK MOVE 01000H TO 02000H CRET ; ; ; COMMAND OK. PERFORM COMPUTED GOSUB TO EXECUTE IT ; CMDOK: LD HL,CMDTBL ;POINT TO TABLE ADD A,L ;COMPUTE ENTR++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIAG0: ; ;*** COMMENTED OUT FOR NOW *** ; ; OUT (HXADDPTS ; ; IF ALREADY TIMED OUT THEN WAIT IN THIS LOOP ; LD HL,(TIMOUT) LD A,H OR A,L JR Z,HWAIT ; ; NOT TIMED OUTRCE NO TIMEOUT JP HWAITC ; ; ; RAM ERROR ENCOUNTERED ; MEMERR: ; ; PASS ERROR TO HOST ; LD A,FERR01 ;PASS ERROR TOOMMAND DW PRINT ;(F) PRINT ASCII STRING TO PORT COMMAND DW RETVERS ;(11) RETURN FIRMWARE VERSION ; NUMCMDS EQU ($ - CMDTY ADDRESS LD L,A LD A,0 ADC A,H LD H,A LD E,(HL) ;FETCH EXECUTION ADDRESS INC HL LD D,(HL) EX DE,HL IN A,(HDAR),A ;USE DATA FOR EXTENDED ADDRESS ; ; SET UP FOR LOWER 32K ; XOR A,A OUT (HXADDR),A OUT (HXAD15),A ; ; DUMP LO YET. WAIT IN THIS LOOP UNTIL TIMEOUT ; DEC HL LD (TIMOUT),HL LD A,H OR A,L JR NZ,HWAIT ; ; TIMEOUT OCCURRED. DES HOST & HALT OUT (HDATA),A ; ; SET ERROR FLAG TO HOST ; LD A,HFERR OUT (HSTAT),A ; ; CLEAR PENDING INTERRUPT & GOBL) / 2 ;NUMBER OF COMMANDS SUBTTL COMMANDS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;TA) ;PREFETCH ARGUMENT ; LD DE,CMDRET ;PUT RETURN ADDRESS ON STACK PUSH DE JP (HL) ; ; ; ; ALL COMMANDS RETURN HERE CAL RAM TO S100 RAM AT 4000H ; LD HL,LOCRAM LD DE,S1MEM + 4000H LD BC,RAMSIZE LDIR ; ; DUMP LOCAL ROM TO S100 RAM AELECT SASI TO DESELECT DRIVE ; XOR A,A OUT (SASIDATA),A LD A,[1 SHL SSELECT] OR [1 SHL SERRCLR] ; DI ;NO INTERRUPTS TO SLEEP ; OUT (HINTC),A HALT IF $ > 38H CONMSG **** ERROR! RESET CODE OVERLAPS INTERRUPT CODE! **** ENDIF ;--- ; SET IOPB ADDRESS FUNCTION ; MUST BE INITIALIZED BEFORE DISK ACCESS ; ENTRY- A= DATA ; EXIT - A= 0 ; ;++++++++++++++++++; ENTRY- CF= ERROR ; A= 0: NOT FIRMWARE ERROR ; /0: ERROR CODE ; CMDRET: ; ; IF NO ERROR THEN PASS IT TO HOST ; JT 4800H ; LD HL,LOCROM LD BC,ROMSIZE LDIR ; ; JUST FOR GRINS.. DUMP JADE CONTROLLER BANK 0 TO HOST RAM AT 5000H ;  WHILE THIS IS GOING ON ; OUT (SASICMD),A LD A,[1 SHL SERRCLR] OUT (SASICMD),A ; EI ;SAFE TO ALLOW INTERRUPTS AGAIN------------------------------------------------------------------------ ; ; INTERRUPT ENTRY VECTOR OCCURRS WHEN HOST INTERRUP+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET LOW BYTE ; IOPBLO: LD HL,IOPBL ;POINT TO BYTE TO ALTERR NC,CNOERR ; OR A ;IF A= 0 THEN NO ERROR JR Z,CNOTF ; ; ELSE PASS ERROR CODE TO HOST IN DATA REGISTER ; OUT (HDATAHSTOUT DDPORT,DDMB0 ;FOLLOW WITH FDC BANK 0 LD HL,(FDADDR) LD BC,1024 PUSH HL LD A,H ;SET BUS BIT 15 OUT (HXAD15),A ; ; GO BACK TO WAITING FOR HOST INTERRUPT AGAIN ; JR HWAIT ; ; ; NOT FIRMWARE ERROR ; CNOTF: LD A,1 SHL HSERRB ;PTS OR IF SASI IS ; IMPLEMENTED WITH INTERRUPT THEN MEANS SASI IS REQUESTING SOMETHING. ; ;---------------------------------- JR IOPBST ; ; SET HIGH BYTE ; IOPBHI: LD HL,IOPBH JR IOPBST ; ; SET EXTENDED ADDRESS BYTE ; IOPBX: LD HL,IO),A ;PUT ERROR IN DATA REG ; ; PASS FIRMWARE ERROR MESSAGE TO HOST IN STATUS REGISTER ; LD A,HFERR ;SET FIRMWARE ERROR  LDIR ; ; NOW JADE BANK 1 AT 5400H ; HSTOUT DDPORT,DDMB1 ;FOLLOW WITH FDC BANK 1 POP HL LD A,H ;SET BUS BIT 15 LAIN ERROR JR CMDR1 ; ; ; NO ERROR. PASS BACK 0 TO HOST ; CNOERR: XOR A ;CLEAR BUSY & ERROR FLAGS JR CMDR1 ;#####----------------------------------------- ORG LOCROM + 38H ; ; GET HOST COMMAND ; IN A,(HCMD) ; ; IF NOT HOST INTERPBXA ; ; COMMON SET CODE ; IOPBST: LD C,(HL) ;SAVE OLD DATA LD (HL),A ;SET NEW DATA LD A,C ;PASS OLD DATA TO HOST ; CMDR1: OUT (HSTAT),A ;PASS ERROR TO HOST ; ; SET UP FOR TERMINATION ; POP HL ;WASTE RETURN ADDRESS TO WAIT RTN ; LOUT (HXAD15),A LD BC,1024 LDIR ; HSTOUT DDPORT,DDOUT ;REMOVE DD WINDOW SO HOST WON'T CRASH ; ; PASS NO ERRORS TO HOST###################################################################### ; ; COMMAND TABLE FOR NON-IOPB COMMANDS ; ;##########RUPT THEN ASSUME SASI ; BIT HINTRB,A JP Z,SASINT ; ; IF IOPB COMMAND THEN GO EXECUTE IT ; BIT HIOPBB,A JP NZ,EXIOP OUT (HDATA),A ; ; RETURN NO ERRORS ; XOR A ;RETURN NO ERRORS (PREVENTS DATA OVERWRITE) RET ;++++++++++++++++++++D HL,-1 ;SET TIMOUT TIME ; HWAITC: LD (TIMOUT),HL ; ; TELL HOST WE'RE DONE ; OUT (HINTC),A ; ; FALL INTO MAIN LOOP ; XOR A ;NO ERRORS OUT (HSTAT),A ; ; DIRECT RETURN TO WAIT LOOP ; DIAGR: LD SP,STACK ;DIRECT RETURN, FLUSH RETURN A################################################################# CMDTBL: DW IOPBLO ;(1) SET IOPB LO COMMAND DW IOPBHI ;(B ; ; MUST BE DIRECT COMMAND FOR EXECUTION ; AND A,00011110B ;MASK OFF UNUSED COMMANDS ; CP A,NUMCMDS * 2 ;IF COMMAND +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DIAGNOSTIC DUMP LOADS HOST MEMORY WITH RAM IMAGE ; ENTRY- A= BANK ; ;--------------------------------------------------------------------------- ; ; MAIN INTERRUPTED LOOP ; ;---------0 ( ) *!+",#-$.%/ &0 'DDR FROM STACK ; LD HL,(TIMOUT) ;PASS TIMEOUT JP HWAITC ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ ; ; INTERRUPT WITHOUT HOST BIT SET ; ;------------------------------------------------------------------- ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DIAG3 DOES S100 MEMORY ACCESSES DEPENDINXTABL: ; ; IF ILLEGAL COMMAND THEN RETURN ERROR TO HOST ; LD A,(PBCMD) ;CHECK IF LEGAL CP A,MAXCMDS JR NC,XILCMD ;  ; ONLY DO THIS ONE ONCE ALSO ; XOR A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DIAGNOSTIC 1 LOADS DATA INTO DATA OUT & STATUS REGS ; ENTRY- A= DATA ; ;++++++++++++++++++++++++++++++++-------- SASINT: ; ; THIS INTERRUPT NOT IMPLEMENTED. RETURN ERROR TO HOST ; LD A,FERR04 ;OUTPUT ERROR FOR NOW SCF JG ON DATA ; NOTE: SCOPING TESTS CONTINUE UNTIL ANOTHER DATA WORD IS ; WRITTEN TO THE DATA REGISTER BY THE HOST. ; ENTRY- A= 0 ; VALID COMMAND. DO COMPUTED GOSUB TO COMMAND ; ADD A,A ;MULTIPLY CMD BY 2 FOR OFFSET ADD A,L LD L,A LD A,0 ADC ++ ; ; PRINT TEXT ON THE PRINTER COMMAND EXERCISES THE I/O CAPABILITY ; ENTRY- A= PORT # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIAG1: ; ; SET DATA & STATUS REGISTERS WITH HOST ARGUMENT ; OUT (HDATA),A P CMDRET SUBTTL IOPB EXECUTION ;--------------------------------------------------------------------------- ; ; EXECUTE: BLOCK MOVE FROM 1000H TO 2000H ; 1: READ FROM 1000H (SCOPING TEST) ; 2: WRITE TO 1000H (SCOPING TEST) ; 3: BLOA,H LD H,A LD E,(HL) ;GET COMMAND FROM TABLE INC HL LD D,(HL) EX DE,HL ; LD DE,XRET ;PUT RETURN ADDRESS ON STACK++++++++++++++++++++++++++++++++++++++++++++ PRINT: ; ; USE HOST ARGUMENT AS PORT # ; OUT (HXAD15),A ;SET PORT TO DATA OUT (HSTAT),A ; ; DIRECT RETURN TO WAIT LOOP ; JP DIAGR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IOPB ; ;--------------------------------------------------------------------------- EXIOPB: ; ; MOVE HOST'S IOPB TO LOCACK MOVE FROM E000H TO E800H ; ALL OTHERS: NOP ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PUSH DE JP (HL) ;EXECUTE COMMAND ; ; ; IOPB COMMANDS RETURN HERE. ; THIS RETURN MUST RETURN IOPB TO HOST FOR STATUS U SET 7,A ;MAP TO HOST LD C,A ; CALL CRLF ; LD E,'0' ;START WITH '0' LD B,80 ;DO 1 LINE PRINT1: CALL PRT ; ; NEXT++++++++++++++++ ; ; DIAG2 TESTS S100 MEMORY READS & WRITES FROM XX1000H TO XX1FFFH ; EXIT- XX0FF2H= LAST LOCATION CHECKED ;L ARRAY ; LD DE,PBCMD LD HL,(IOPBL) ;GET ADDRESS OF IOPB IN USER RAM LD A,H ; SET A15 OUT (HXAD15),A ; SET 7,H +++ DIAG3: ; ; DO TESTS BASED ON HOST ARGUMENT ; OR A,A JR Z,DOMOVE ; D3LP: IN A,(HDATA) ;IF DATA CHANGED THEN CHECPDATE ; XRET: PUSH AF ;SAVE POSSIBLE ERROR CODE ; ; RETURN ERROR IN IOPB ALSO (REV 1.B) ; LD (PBSTAT),A ; ; XFE CHAR ; INC E DJNZ PRINT1 ; ; END WITH A NEWLINE ; CRLF: LD E,0DH CALL PRT LD E,0AH CALL PRT ; ; RETURN NO  XX0FF4H= 0: OK ; READ DATA IF ERROR ; XX0FF5H= CONTENTS OF LAST LOCATION ; ;++++++++++++++++++++++++++++++++++++++++++ ;INSURE HOST MEMORY AREA ; LD A,(IOPBXA) ; SET BANK # OUT (HXADDR),A ; LD BC,IOPBSIZE IF FALSE CALL MOVFHST ELSK CP 2 JR C,DOREAD JR Z,DOWRITE CP 3 JR Z,DOBLKH ; ; IF UNKNOWN COMMAND THEN QUIT WITHOUT ERROR ; XOR A RET R LOCAL IOPB DATA TO HOST'S IOPB ; LD HL,PBCMD ;SOURCE := LOCAL IOPB IMAGE LD DE,(IOPBL) ;GET ADDRESS OF IOPB IN USER RAM ERRORS ; XOR A RET ;*************************************************************************** ; ; PRINT THE CHAR S+++++++++++++++++++++++++++++++++ DIAG2: ; ; SET UP TO TEST HOST MEMORY ; LD HL,S1MEM + 1000H LD BC,ROMSIZE + RAMSIZE E LDIR ENDIF ; ; SELECT SASI OR JADE BASED ON IOPB.PBDRV ; LD A,(PBDRV) ;IF HARD DISK CONTROLLER THEN DO IT LD HL,; ; ; CONTINUOUS WRITES COMMAND ; DOWRITE: LD (S1MEM + 1000H),A ;USE ARGUMENT AS DATA JR D3LP ; ; ; CONTINUOUS RE LD A,D ; SET A15 OUT (HXAD15),A ; SET 7,D ;INSURE HOST MEMORY ; LD A,(IOPBXA) ; SET BANK # OUT (HXADDR),A LD BCUBROUTINE ; ENTRY- E= CHAR TO OUTPUT ; C= PORT # ; ;*********************************************************************** ; ; DO TEST ; D2LP: LD A,(HL) CPL LD (HL),A CP A,(HL) CPL ;RESTORE LD (HL),A JR NZ,D2ERR ; ; TEST OK. DOHDCMDS CP A,HDBASD ;IF WITHIN HARD DISK DRIVES THEN EXIT JR C,CHKJAD ; CP A,HDBASD + HDNDRV JR C,XTABL ; ; CHECK IADS COMMAND ; DOREAD: LD A,(S1MEM + 1000H) JR D3LP ; ; ; BLOCK MOVE COMMAND TO LOW MEMORY ; DOMOVE: LD HL,S1MEM +,IOPBSIZE IF FALSE CALL MOV2HST ELSE LDIR ENDIF ; ; RETURN ERROR STATUS TO HOST ; POP AF JP CMDRET ;++++**** PRT: IN A,(C) ;IF BUSY THEN WAIT AND 1 JR NZ,PRT ; LD A,E ;OUTPUT THE CHAR SET 7,A OUT (C),A ; RES 7,A OUT NEXT ; INC HL ; ; CHECK FOR DONE ; DEC BC LD A,B OR C JR NZ,D2LP ; ; PASS ERROR DATA TO HOST MEMORY ; D2EF JADE CONTROLLER ; CHKJAD: LD HL,JADCMDS SUB A,JADBASD ;BIAS DOWN TOO JR C,XILDRV ;IF NOT JADE THEN DOESN'T EXIST ; 1000H LD DE,S1MEM + 2000H LD BC,1000H LDIR ; ; ONLY DO THIS ONE ONCE ; XOR A RET ; ; ; BLOCK MOVE TO HIGH M+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ERROR EXITS ; ;+++++++++++++++++++++++++++++++ (C),A ; SET 7,A OUT (C),A ; RET SUBTTL SASI INTERRUPT ;---------------------------------------------------------RR: LD (S1MEM + 0FF2H),HL LD (S1MEM + 0FF4H),A LD A,(HL) LD (S1MEM + 0FF5H),A ; ; RETURN NO ERRORS ; XOR A,A RET  CP A,JADNDRV JR NC,XILDRV ; LD (PBDRV),A ;IS JADE, OFFSET DRIVE # ; ; COMMAND EXECUTION ADDRESS TABLE SELECTED ; EMORY COMMAND ; DOBLKH: LD A,1 SHL A15B ;SET HIGH PAGE OUT (HXAD15),A LD HL,0E000H LD DE,0E800H LD BC,800H LDIR ; 0 ( ) *!+",#-$.%/ &0 '++++++++++++++++++++++++++++++++++++++++++++ ; ; ILLEGAL DRIVE REQUESTED ; XILDRV: LD A,FERR05 SCF JP CMDRET ; ; +++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE COMMAND BLOCK FUNC. ; EXIT - NZ, CF= ERROR ; A= 0 (NOT SUBTTL JADE IOPB COMMANDS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON COMMAND ERROR ; LD A,FERR06 SCF RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DR; OPEN JADE FDC WINDOW ; HSTOUT DDPORT,DDMB1 ; ; XFER LOCAL BUFFER DATA TO JADE FDC BUFFER ; LD HL,(FDADDR) EX DE,; ILLEGAL COMMAND REQUESTED ; XILCMD: LD A,FERR06 SCF JP CMDRET ;++++++++++++++++++++++++++++++++++++++++++++++++++ FIRMWARE) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FDSKEX: ; ; FORMAT DATA ; LDD IS SAME AS READ ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADLOG: ; ; FALL INTO REIVE SELECT/LOG-ON COMMAND ; CHECK DRIVE READY ; ENTRY- (PBFLG)= 0: FULL LOG ; ;+++++++++++++++++++++++++++++++++++++++++++++HL LD HL,JADSECB LD BC,128 XOR A CALL MOV2HST ; ; EXECUTE THE WRITE COMMAND ; CALL FDSKEX ; ; REMOVE JADE FDC+++++++++++++++++++++++++ ; ; RETURN FIRMWARE VERSION COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ A,(PBSEC) INC A ;CHANGE FROM LOGICAL ADDR TO SECTOR # LD (PBSEC),A ; ; OUTPUT IOPB TO THE CONTROLLER ; HSTOUT DDPORAD COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ SECTOR COMMAND ; ++++++++++++++++++++++++++++++ HDLOG: ; ; SELECT DRIVE ; CALL HDSELCT RET C ; ; IF FLAG != 0 THEN SKIP LOGON ;  WINDOW ; PUSH AF ;SAVE ERROR STATUS HSTOUT DDPORT,DDOUT ;REMOVE WINDOW POP AF ; ; RETURN ERROR STATUS ; RET ++++++++++++++++ RETVERS: LD A,VERSN ;LOAD DATA REGISTER WITH VERSION OUT (HDATA),A ; ; RETURN NO ERRORS ; XOR A T,DDMRQ ;GET BANK 0 ; LD DE,DDCMD ;CALCULATE FDC ADDRESS LD HL,(FDADDR) ADD HL,DE EX DE,HL LD HL,PBCMD LD BC,PBST;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADREAD: ; ; SWITCH JADE FDC INTO HOST MEMORY LD A,(PBFLG) OR A,A JR NZ,HDLOG1 ; ; INITIALIZE THE DRIVE TABLE FOR THIS DRIVE ; LD A,(LUNSV) LD (IX+DTDRV),A LD  ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT COMMAND ; (NOT IMPLEMENTED) ; ;+RET ;########################################################################### ; ; IOPB COMMAND EXECUTION TABLES ; ;AT - PBCMD XOR A CALL MOV2HST ; ; HAVE JADE FDC EXECUTE THE COMMAND ; HSTOUT DDPORT,DDEXC ;ISSUE COMMAND ; FDSKWT: ; HSTOUT DDPORT,DDMRQ ; ; EXECUTE COMMAND ; CALL FDSKEX ; ; XFER DATA TO LOCAL BUFFER ; PUSH AF ;SAVE ERROR ST(IX+DTVEC),0 LD (IX+ [DTVEC + 1]),0 LD (IX+DTFLG),0 ;ASSUME SINGLE DENSITY ; ; NOW READ THE DISK DESCRIPTOR SECTOR ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADFORM: ;+++++++++++++++++++++++++++++++++++++########################################################################### ; ; JADE FLOPPY CONTROLLER COMMANDS ; JADCMDS: HSTIN DDPORT ;WAIT UNTIL DONE AND A,DDSHLT JR NZ,FDSKWT ; ; MOVE STATUS BYTES TO LOCAL IOPB ; HSTOUT DDPORT,DDMRQ ATUS ; HSTOUT DDPORT,DDMB1 ;GET BANK 1 FOR SECTOR BUFFER LD HL,(FDADDR) ;GET FDC ADDRESS LD DE,JADSECB EX DE,HL LD BC LD IY,IDRCDB CALL GETLUN CALL HDRDBUF RET C ; ; VERIFY THE SECTOR AS A LEGAL DESCRIPTOR SECTOR ; LD DE,IDTXT LD ++++++++++++++++++++++++++++++++++++++ ; ; READ ADDRESS COMMAND ; (NOT IMPLEMENTED) ; ;++++++++++++++++++++++++++++++++++ DW JADLOG ;LOG ON DISK DW JADREAD ;READ SECTOR DW JADWRT ;WRITE SECTOR DW JADFORM ;FORMAT TRACK DW JADRDAD ;READ ;GET WINDOW LD BC,[PBCMD + IOPBSIZE] - PBSTAT ; XOR A CALL MOVFHST ; ; PASS ERROR STATUS TO HOST ; LD A,(PBSTAT) ,128 ;FETCH SECTOR DATA XOR A CALL MOVFHST ; ; REMOVE JADE FDC WINDOW ; HSTOUT DDPORT,DDOUT ; ; XFER LOCAL BUFFEHL,HDSECB LD B,IDSZE ; HDCKID: LD A,(DE) CP (HL) JR NZ,HDNTID ; INC HL INC DE DJNZ HDCKID ; ; ID CHECKS, SET +++++++++++++++++++++++++++++++++++++++++ JADRDAD: ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ADDRESS DW JADEXEC ;EIA OUTPUT DW JADEXEC ;EIA STATUS DW JADEXEC ;IDLE ; MAXCMDS EQU ($ - JADCMDS) / 2 HDCMDS:  ;IF NO ERROR THEN RETURN 0, NC OR A RET Z ; LD A,0 ;NOT FIRMWARE ERROR SCF ; BUT ERROR JUST THE SAME RET R DATA TO HOST ; LD HL,JADSECB CALL HDHSTW ; ; RETURN JADE ERROR STATUS TO HOST ; POP AF RET ;+++++++++++++++UP DATA ; LD A,(HDSECB + IDFLGO) ;FETCH FLAGS LD (IX+DTFLG),A ; ; XFER ID SETOR TO HOST BUFFER ; HDNTID: LD HL,HDSECB+++++ ; ; IDLE COMMAND ; (NOT IMPLEMENTED) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DW HDLOG ;LOG ON DISK (SELECT DISK) DW HDREAD ;READ DEBLOCKED SECTOR DW HDWRT ;WRITE DEBLOCKED SECTOR DW HDFORM ;FORMASUBTTL HARD DISK IOPB COMMANDS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; UNSUPPORTED++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE SECTOR COMMAND ; ;+++++++++++++++++++++++++++++++++ CALL HDHSTW CALL CLRBUFR ;FLUSH BUFFER OF IOPB SECTOR (DON'T CARE) ; ; RETURN NO ERRORS TO HOST ; HDLOG1: XOR A RE JADEXEC: ; ; RETURN ILLEGAL COMMAND ERROR ; LD A,FERR05 SCF RET SUBTTL JADE FDC SUBR ;++++++++++++++++++++++++T TRACK DW HDRECAL ;RECAL DW HDSEEK ;SEEK TRACK (NORMALLY IMPLIED) DW HDCERR DW HDDEFF ;DEFINE FLOPPY CHARACTERISTICS COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDCERR: ; ; RETURN ILLEGAL COMMAN++++++++++++++++++++++++++++++++++++++++++ JADWRT: ; ; XFER HOST DATA TO LOCAL BUFFER ; LD HL,JADSECB CALL HDHSTR ; 0 ( ) *!+",#-$.%/ &0 'T ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ DEBLOCKED SECTOR COMMAND ; ;++D IX,HDDMY ; ; INITIALIZE VARIABLES WITH BASE VALUES ; LD HL,DTIMG ;MOVE DEFAULT DRIVE TABLES TO RAM LD DE,HDDTBL LD +++++++++++++ ; ; FORMAT TRACK COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDF ; CALL GETRES ;GET RESULT BYTE JR C,SELERR ; ; DRIVE IS READY. SELECT DRIVE TABLE ; LD A,(LUNSV) ;SELECT DRIVE TABLELECT DRIVE ; CALL HDSELCT RET C ; ; SET UP CDB DATA ; LD IY,LAXCDB ;USE XFER CDB LD (IY+CMD),SCSEEK ;SEEK COMMAND+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDREAD: ; ; SELECT DRIVE ; CALL HDSELCT RET BC,DTICNT LDIR ; LD HL,NULCDB ;ZERO CDBS LD B,CDBINIT INITRAM: LD (HL),0 INC HL DJNZ INITRAM ; ; RESET SASI COORM: ; ; SELECT DRIVE ; CALL HDSELCT RET C ; ; SET UP FOR FORMAT ; LD IY,LAXCDB LD (IY + CMD),SCFMTT ; ; FE ADD A,A ADD A,A LD IX,HDDTBL LD E,A LD D,0 ADD IX,DE ; ; RETURN NO ERRORS ; XOR A ;NO ERRORS RET ;+ CALL GETLUN CALL GETLAD ;GET USER'S BLOCK ; ; SEND THE COMMAND TO THE SASI CONTROLLER ; CALL XCDB6 RET C ; ; C ; ; SET UP FOR READ ; LD IY,LAXCDB ;USE XFER CDB CALL GETLUN CALL GETLAD ; ; READ SECTOR INTO LOCAL BUFFER ; NTROLLER ; LD A,1 SHL SRESET OUT SASICMD,A ; EX (SP),HL ;GIVE A LITTLE EXTRA TIME EX (SP),HL ; LD A,1 SHL SERRCLR ETCH INTERLEAVE FACTOR FROM SECTOR DATA ; LD A,(PBSEC) ;SECTOR BYTE HAS INTERLEAVE FACTOR AND A,00011111B ;MASK OFF HEAD BI++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT ERROR EXIT ; EXIT- IX= DUMMY TABLE PTR RETURN THE COMMAND STATUS TO HOST ; JP GETRES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CALL HDRDBUF RET C ; ; DEBLOCK DATA BUFFER ; SELCTBUF ; ; XFER DATA TO HOST ; CALL HDHSTW ;WRITE TO HOST ; ;;RELEASE RESET OUT SASICMD,A ; ; FLUSH SECTOR BUFFER ; CALL CLRBUFR ;START WITH FRESH BUFFER READ ; ; INITIALIZE JTS LD (IY+ILV),A ; XOR A,A ;FORCE SECTOR TO 0 FOR CLEANLINESS LD (PBSEC),A ; ; SET UP CDB ; CALL GETLUN ;GET DRI ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELERR: LD IX,HDDMY ;IF DRIVE SELECT ERR THE++ ; ; DEFINE FLOPPY DISK PARAMS COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HD SUCCESSFUL READ. RETURN NO ERRORS ; XOR A ;NO ERRORS RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++ADE FDC ADDRESS PTR ; HSTIN DDPORT ;FETCH FDC ADDRESS AND A,DDSASW RLCA OR A,HIGH DDBASE LD H,A LD L,0 LD (FDADDVE CALL GETLAD ;GET LOGICAL ADDRESS ; ; SEND THE FORMAT COMMAND TO THE SASI CONTROLLER ; CALL XCDB6 RET C ; ; REN POINT TO DUMMY RET ; RETURN SELECT ERROR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DEFF: ; ; SET UP CDB FOR COMMAND ; LD IY,NULCDB ;USE NUL CDB LD (IY+CMD),SCDEF ;DEFINE CMD CALL GETLUN ; ; USE SE+++++++++++++++++++ ; ; WRITE SECTOR COMMAND ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++R),HL ; ; DONE. RETURN TO MAIN CODE ; RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++STORE INTERLEAVE BYTE OF THE CDB TO 0 ; LD (IY+ILV),0 ;RESTORE ILV BYTE TO 0 ; ; RETURN RESULT STATUS TO HOST ; JP GET++ ; ; READ HD SECTOR INTO BUFFER FUCTION ; ENTRY- IY= CDB PTR ; CDB= SET UP ; EXIT - CF= ERROR ; ;+++++++++++++++++++++CTOR BYTE TO PASS FLOPPY DEFINITION ; LD A,(PBSEC) LD (IY + FDD),A ;SET DEFINE BYTE TO SIDES & DENSITY ; ; SEND THE COM+ HDWRT: ; ; SELECT DRIVE ; CALL HDSELCT ;IMPLIED SELECT RET C ; ; SET UP DATA TO PRE-READ SECTOR ; LD IY,LAXC++ ; ; SELECT DRIVE FUNCTION ; EXIT - CY= NC: NORMAL ; CF: ERROR, A= CODE ; ;++++++++++++++++++++++++++++++++++++++++RES ;FINISH UP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RECAL COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDRDBUF: ; ; IF BUFFER DATA VALID THEN RETURN ; CALL QBUFR RET MAND TO THE SASI CONTROLLER ; CALL XCDB6 RET C ; ; RETURN COMMAND STATUS TO HOST ; JP GETRES SUBTTL HARD DISK SUDB ;USE XFER CDB CALL GETLUN CALL GETLAD ; ; PRE-READ SECTOR ; CALL HDRDBUF ;REFRESH BUFFER WITH SECTOR DATA RET C+++++++++++++++++++++++++++++++++++ HDSELCT: ; ; IF SAME DRIVE AS LAST OPERATION THEN JUST RETURN NO ERRORS ; LD A,(PBDR++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDRECAL: ; ; SELECT DRIVE ; CALL HDSELCT RET Z ; ; SET UP TO READ SECTOR INTO BUFFER ; LD C,10 ;ASSUME RETRIES LD HL,PBFLG ; LD A,(HL) ;IF HOST REQUESTS NO RETBROUTINES ;*************************************************************************** ; ; ADDITIONAL INITIALIZATION CODE ;  ; ; BLOCK SECTOR ; SELCTBUF ; ; XFER HOST DATA TO LOCAL BUFFER ; CALL HDHSTR ;READ HOST BUFFER ; ; WRITE SECV) SUB A,HDBASD AND A,00000011B SUB A,(IX+DTDRV) RET Z ; ; SEE IF REQUESTED DRIVE IS READY ; LD IY,NULCDB ;USE NUC ; ; CONTINUE WITH RECAL FUNCTION ; JP RECALC ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++RY THEN RETRIES = 0 BIT PBRTRY,A JR Z,HDRTRY1 LD C,0 HDRTRY1: LD A,C LD (RETRYS),A ; ; PASS HOST REQUEST FOR CO ;*************************************************************************** INIT: ; ; SET DRIVE TABLE PTR TO DUMMY ; LTOR & RETURN STATUS TO HOST ; JP HDWRBUF ;WRITE TO DISK ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++L CDB LD (IY+CMD),SCRDY ;TEST READY COMMAND ; CALL GETLUN ;REQUEST LUN FROM USER CALL XCDB6 ;EXECUTE CDB JR C,SELERR +++++++ ; ; SEEK COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDSEEK: ; ; S0 ( ) *!+",#-$.%/ &0 'NTROLLER RETRY DISABLE TO SASI CONTROLLER ; LD A,(HL) RLA OR A,(HL) AND A,80H LD (IY + RTY),A ; ; SEND READ SECTO************************************************************ ; ; CLEAR BUFFER SUBR ; ;**************************************L GETSTAT ;IF READY THEN INPUT DATA BIT SREQ,A JR Z,HDRDOV ; AND A,SSXMSK CP A,SSNDST ;IF READY FOR STATUS THEN GET IT ; A= BANK ADDRESS (SRC) ; ;*************************************************************************** MOVFHST: ; ; SEILL XFER'G DATA ; HDWR2: OUTI ;SASI DATA = *PTR++; CNT-- JP NZ,HDWRLP ; ; XFER COUNT EXHAUSTED. CHECK IF SASI DONE ; R COMMAND TO SASI CONTROLLER ; HDRDRTY: LD (IY+CMD),SCREAD ;READ COMMAND LD (IY+NBK),1 ;ALLWAYS USE 1 BLOCK (SECTOR) ; ************************************* CLRBUFR: ; ; JUST SET DRIVE TO NON-EXISTENT # SO FAILS COMPARE ; LD A,-1 LD (BUF JP Z,HDRDDN ; ; SASI STILL REQUESTING DATA. TREAT AS HANDSHAKE ERROR ; HDWASTE: CALL HDXWST ;OVERFLOW, WASTE DATA T UP EXTENDED ADDRESS REGISTER ; LD (MOVX),A ;SAVE EXTENDED ADDRESS FOR BUMPING OUT (HXADDR),A ; ; SET FLAGS TO XFER FR HDWROV: CALL GETSTAT BIT SREQ,A JR Z,HDWROV ; ; IF SASI XFER NOT DONE THEN GO PAD DATA WITH ?? ; AND A,SSXMSK CP ACALL XCDB6 ;SEND CDB RET C ; LD BC,[HDBUFSZ * 256] + SASIDATA ;SET COUNT, PORT LD HL,HDSECB ; HDRDLP: CALL GETSTAT DRV),A RET ;*************************************************************************** ; ; MAKE BUFFER PTRS = PB PTRS CALL GETRES ;FINISH UP ; HDRWFER: CALL CLRBUFR ;BUFFER CONTAMINATED. FLUSH DOWN DRAIN LD A,FERR08 ; UNKNOWN CONDITION,OM S100 ; XOR A,A EX AF,AF' JP MOVIT ;*************************************************************************** ;,SSNDST JP NZ,HDWASTE ;IF NOT STATUS THEN WASTE DATA ; ; SASI DONE. RETURN COMMAND RESULTS STATUS ; JP GETRES ;+++;IF NOT READY THEN WAIT BIT SREQ,A JR Z,HDRDLP ; AND A,SSXMSK ; IF DATA READY THEN GET IT CP A,SSNDDAT JP Z,HDRD2  ; ;*************************************************************************** MAKSAME: LD A,(PBDRV) ;BUFFER_DRIVE = CURREN USE HANDSHAKE SCF RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE HD SECT ; WRITE DATA TO HOST IOPB SUBR ; ENTRY- HL= SOURCE PTR ; ;*****************************************************************++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; QUERY BUFFER THE SAME FUNCTION ; EXIT - ZF= SAME; CP A,SSNDST ; ELSE IF NOT READY FOR STATUS THEN ERR JR NZ,HDRWFER ; ; READ COMMAND DONE. GET COMMAND STATUS ; HDRDT_DRIVE LD (BUFDRV),A ; LD HL,(PBTRK) ;BUFFER_TRACK = CURRENT_TRACK LD (BUFTRK),HL ; LD HL,(PBSEC) ;BUFFER_SECTOR = CUOR FROM BUFFER FUNCTION ; ENTRY- IY= CDB PTR ; CDB= SET UP ; EXIT - CF= ERROR (A= ERROR #) ; ;++++++++++++++++++++++++++++********** HDHSTW: ; ; SET UP DATA ; LD DE,(PBDMA) ;GET DESTINATION PTR LD A,(PBDMAX) ;SET BANK REGISTER LD BC,128  ; NZ= NOT SAME ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ QBUFR: ; ; IF DRIVE NOT DN: CALL GETRES ; ; MAKE BUFFER = DISK ADDRESS ; PUSH AF CALL NC,MAKSAME POP AF ; ; IF NO ERROR THEN RETURN ; RRENT_SECTOR & FEH RES 0,L LD (BUFSEC),HL ; RET ;*******************************************************************+++++++++++++++++++++++++++++++++++++++++++++++ HDWRBUF: ; ; SEND WRITE SECTOR COMMAND TO SASI CONTROLLER ; LD (IY+CMD),;MOVE 128 BYTES ; ; FALL INTO MOVE ROUTINE ; ;************************************************************************SAME THEN RETURN NZ ; LD A,(PBDRV) LD HL,BUFDRV CP A,(HL) RET NZ ; ; IF SECTOR NOT SAME THEN RETURN NZ ; LD DE,(RET NC ; ; IF ERROR THEN CHECK FOR RETRIES ; PUSH AF ;SAVE ERROR CODE LD A,(RETRYS) SUB A,1 LD (RETRYS),A JR C,H******** ; ; READ DATA FROM HOST IOPB SUBR ; ENTRY- HL= DESTINATION PTR ; ;************************************************SCWRIT ;WRITE COMMAND ; LD (IY+NBK),1 ;ALLWAYS USE 1 BLOCK (SECTOR) CALL XCDB6 ;SEND CDB RET C ; ; SET UP TO WRITE T*** ; ; BLOCK MOVE TO HOST SUBR ; ENTRY- HL= LOCAL PTR (SRC) ; DE= HOST PTR (DST) ; BC= BYTE COUNT ; A= BANK ADDRESS (DPBSEC) ;NOW CHECK SECTOR OR A,A ;IF DRIVE 0 THEN SKIP TRACK TEST JR Z,QBBLK ; LD A,(PBTRK) ;IF TRACK 0 OF FLOPPY THEN NODRDNOT ; ; RETRIES NOT EXHAUSTED. GO REPEAT ; POP AF JP HDRDRTY ; ; ; RETRIES EXHAUSTED ; HDRDNOT: ; ; BUFFE*************************** HDHSTR: ; ; SET UP FOR XFER ; LD DE,(PBDMA) ;GET DESTINATION PTR LD A,(PBDMAX) ;SET BANK RHE BUFFER ; LD BC,[HDBUFSZ * 256] + SASIDATA ;SET COUNT, PORT LD HL,HDSECB ; ; PERFORM THE WRITE XFER ; HDWRLP: CALL ST) ; ;*************************************************************************** MOV2HST: ; ; SET UP EXTENDED ADDRESS R BLOCKING OR A,A JR Z,QBNBLK ; QBBLK: RES 0,E ;CLEAR BLOCKING BIT ; QBNBLK: LD HL,(BUFSEC) SBC HL,DE RET NZ ; ; R MAY BE CONTAMINATED. FLUSH IT DOWN THE DRAIN ; CALL CLRBUFR ;BUFFER CONTAMINATED ; ; RETURN THE ERROR ; POP AF REEGISTER LD BC,128 ;MOVE 128 BYTES ; ; FALL INTO MOVE ROUTINE ; ;***************************************************GETSTAT ;IF READY THEN BIT SREQ,A JR Z,HDWRLP ; AND A,SSXMSK ; IF DATA READY THEN PUT IT CP A,SGTDAT JP Z,HDWR2 ;EGISTER ; LD (MOVX),A ;SAVE EXTENDED ADDRESS VALUE FOR BUMPING LD (HXADDR),A ; ; SET FLAGS TO XFER TO S100 ; LD A,1  IF TRACK NOT SAME THEN RETURN NZ ; LD DE,(PBTRK) ;LAST, CHECK TRACK LD HL,(BUFTRK) SBC HL,DE RET ;***************T ; ; ; STILL READING DATA ; HDRD2: INI ;*PTR++ = SASI DATA; CNT-- JP NZ,HDRDLP ; ; ALL DATA READ ; HDRDOV: CAL************************ ; ; BLOCK MOVE FROM HOST SUBR ; ENTRY- HL= LOCAL PTR (DST) ; DE= HOST PTR (SRC) ; BC= BYTE COUNT CP A,SSNDST ; ELSE IF READY FOR STATUS THEN GET IT JP NZ,HDRWFER ; ELSE UNKNOWN CONDITION! ; JP GETRES ; ; ; ST0 ( ) *!+",#-$.%/ &0 ' OR A,A EX AF,AF' ; ; FALL INTO MOVE PRIMITIVE ; ;*****************************************************************CDB6: ; ; ISSUE CONTROLLER SELECT PER SHUGART MANUAL ; LD A,[1 SHL HDCONT] ;SELECT DB0 OUT SASIDATA,A ; LD A,[1 SHL SS ; SWAP ; MOV1: LDIR ; JP NZ,MOV6 EX DE,HL ; SWAP BACK ; ; MOVE DONE. RETURN Z ; MOV6: EX AF,AF' XOR A RET ++++++++++ GETRES: ; ; GET COMMAND STATUS BYTE FROM SASI CONTROLLER ; LD HL,RSTAT ;INSURE DESTINATION CORRECT LD C,SAS ; AND A,SSXMSK CP A,SSNDST RET Z ; ; ELSE XFER ANOTHER BYTE ; LD A,0E5H ;OUTPUT WILL ALSO DO FOR INPUT OUT SAS********** ; ; MOVE SUBR CHECKS FOR A MOVE CROSSING ANY 32K BOUNDARY AND SELECTING ; A FAST BLOCK MOVE IF NOT, AND A SLOWER BELECT] OR [1 SHL SERRCLR] ;OUTPUT STROBE OUT SASICMD,A ; LD BC,0 ;TIMEOUT_COUNT = 0 ; BSYWT2: CALL GETSTAT ;WAIT FOR BU; ; ; LONG TRANSFER TESTS EACH BYTE FOR THRESHOLDS ; DOLONG: INC BC ;RESTORE COUNT LD A,D ;SET UP CURRENT BIT 15 LD I,IDATA GETDATA ;GET RESULT STATUS BYTE ; ; CHECK FOR HARDWARE PARITY ERROR ; BIT SPERR,A JR NZ,HDPERR ; ; IF NO IDATA,A JR HDXWST ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RECALIBRATE FUNCTIONLOCK MOVE WHICH CHECKS AFTER EACH ; BYTE FOR AN OVERFLOW CONDITION IF TRUE. ; ENTRY- HL= LOCAL MEMORY PTR ; DE= S100 MEMORY SY BIT SBUSY,A JR NZ,BSYOK2 ; DEC BC LD A,C OR A,B JR NZ,BSYWT2 ; ; HANDSHAKE TIMEOUT! RETURN THE ERROR ; LDA ;SAVE IN I SINCE NOT USING MODE 2 INTERRUPTS ; NO64KX: SET 7,D ;INSURE S100 ; MOV4: EX AF,AF' ;IF HL= S100 THEN JP NZERROR THEN RETURN ZF ; LD A,(RSTAT) AND 00000011B RET Z ; ; IF CONTROLLER PARITY ERROR THEN RETURN THE ERROR ; BIT ; EXIT - CF= ERROR (A= CODE #) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RECALC: ; ;PTR ; BC= BYTE COUNT TO TRANSFER ; AF'= 0: XFER FROM S100 MEMORY TO LOCAL MEMORY ; 1: XFER FROM LOCAL MEMORY TO S100  A,FERR07 SCF RET ; ; ; BUSY DETECTED. ; BSYOK2: LD A,1 SHL SERRCLR ;REMOVE SELECT STROBE OUT SASICMD,A ; XCDB2:,MOV2 ; EX DE,HL ; SWAP PTRS ; MOV2: LDI ;SINGLE BYTE MOVE JP NZ,MOV3 ; EX DE,HL ;SWAP BACK ; MOV3: JP PO,MOV5 1,A JR Z,HDPERR ; ; ERROR ENCOUNTERED. SEND REQUEST SENSE COMMAND ; LD (IY+CMD),SCSNSE CALL XCDB6 RET C ; ; GE SEND RECAL COMMAND TO SASI CONTROLLER ; LD IY,NULCDB LD (IY+CMD),SCREC ;RECAL COMMAND CALL GETLUN ; CALL XCDB6 ; MEMORY ; ; EXIT - AF, AF'= ? ; BC= 0 ; HL= HL + BC ; DE= DE + BC ; ;************************************************** CALL GETSTAT ;CHECK FOR COMMAND ACCEPT BIT SREQ,A ; WAIT FOR REQUEST JR Z,XCDB2 ; BIT SCD,A ;IF NOT COMMAND THEN ???  ;IF DONE THEN RETURN ; EX AF,AF' ; ; IF NO ROLLOVER THEN REPEAT ; BIT 7,D JP NZ,MOV4 ; ; S100 PTR ROLLED OVER T STATUS BYTES ; GETR1: LD HL,PBSTAT LD BC,[4 * 256] + SASIDATA ;4 BYTES ; GETR2: GETDATA JR NZ,GETR2 ; GETR3: CALL G ; RETURN COMMAND RESULTS STATUS ; JP GETRES ;FINISH UP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++************************* MOVIT: ; ; SET FLAGS TO ACCUMULATOR DATA (Z/NZ) ; EX AF,AF' OR A,A EX AF,AF' ; ; SET B JR NZ,XOK ; ; CONTROLLER HANDSHAKE STATUS UNEXPECTED. SYNC ERROR ; XCDBER: LD A,FERR08 SCF RET ; ; ; GET SET TO32K BOUNDARY ; LD A,I ;TOGGLE BIT 15 XOR A,80H LD I,A OUT (HXAD15),A ; BIT 7,A ;IF TOGGLED TO 0 THEN BUMP BANK JETSTAT ;FINISH OUT COMMAND BIT SREQ,A JR Z,GETR3 ; ; CHECK IF SENSE STATUS COMMAND ERROR (FATAL) ; IN A,(C) ;GET RE+++++++++++++++ ; ; GET STATUS FUNCTION ; EXIT- A= STATUS WORD ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++IT 15 REGISTER TO PTR BIT 15 ; LD A,D ;SET BIT 15 OUT (HXAD15),A ; ; TEST MOVE BOUNDARIES ; DEC BC ;IF > 32K MOVE  SEND CDB ; XOK: LD BC,[6 * 256] + SASIDATA ;BYTE COUNT IN B ; BIT SIO,A ;IF DIRECTION NOT OUT THEN SYNC ERR JR NZ,XCDBP NZ,NO64KX ; LD A,(MOVX) INC A LD (MOVX),A OUT (HXADDR),A JP NO64KX ; ; ; MOVE DONE ; MOV5: EX AF,AF' ;BALANSULT BYTE OF COMMAND AND A,00000011B ;IF ERROR THEN HARD ERROR SCF ;ERROR ANYWAY RET Z ; ; FATAL SENSE STATUS ERROR.++++++++++++++++++ GETSTAT: IN A,SASIST ;GET STATUS WORD AND A,SSTMSK ;REMOVE UNUSED BITS XOR A,SSTINV ;INVERT SOME RETTHEN DO LONG WAY LD A,B CP A,32768 / 256 JR NC,DOLONG ; LD A,E ;IF 64K CROSS THEN DO LONG WAY ADD A,C LD A,D ADCER ; PUSH IY POP HL ; ; XFER CDB TO SASI CONTROLLER ; XCDB3: PUTDATA ;GET CDB DATA JR NZ,XCDB3 ; ; XFER COMPLCE UP XOR A RET ;*************************************************************************** ; ; WASTE OVERFLOW DATA  CAN'T GET SASI CONTOLLER TO SPILL THE BEANS ; LD A,FERR09 ;SENSE STATUS ERROR RET ; ; ; DATA XFER PARITY ERROR ; HD ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; TRANSMIT CDB FUNCTION ; ENTRY- (CDBPTR A,B JR C,DOLONG ; XOR A,D ;IF 32K CROSS THEN DO LONG WAY JP M,DOLONG ; ; NO BOUNDARY CROSSING. USE BLOCK MOVE INSTRETE. RETURN NO ERRORS ; XOR A,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;SUBR ; ;*************************************************************************** HDXWST: ; ; WAIT UNTIL READY FOR XFERPERR: XOR A,A ;CLEAR ERROR OUT (SASICMD),A LD A,1 SHL SERRCLR OUT (SASICMD),A ; ; RETURN THE ERROR ; LD A,FERR11 ;)= CDB TO XMIT ; EXIT - CF= ERROR ; BC= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XUCTION ; INC BC ;RESTORE COUNT ; SET 7,D ;INSURE S100 MAP ; EX AF,AF' ;IF FROM S100 THEN JP NZ,MOV1 ; EX DE,HL  GET CONTROLLER RESULTS FUNCTION ; EXIT - CF= HARD ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CALL GETSTAT ;IF READY THEN INPUT DATA BIT SREQ,A JR Z,HDXWST ; ; IF READY FOR STATUS THEN DONE. RETURN TO CALLER0 ( ) *!+",#-$.%/ &0 'RETURN PARITY ERROR SCF RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET LUN OPBXA DS 1 ;BANK ADDRESS OF IOPB ;########################################################################### ; ; I/O PACK 00 THEN USE 128 JR Z,GETLAD1 ; BIT DFDBL,(IX + DTFLG) ;IF SINGLE DENSITY THEN USE 128 JR Z,GETLAD1 ; ADD HL,HL ;EECTOR WORD BUFTRK DS 2 ;BUFFER CONTENTS TRACK WORD ;######################################################################ED RR E LD (IY+LA0),E ;PHEW! LA0 DONE ; LD (IY+LA1),A ;LA1 HAPPENS TO BE IN A ; ; RETURN NO ERRORS ; XOR A,A RETFROM USER FUNCTION ; ENTRY- IY= CDB PTR ; EXIT - IY, HL= CDB PTR ; BC, DE, AF= ? ; ;++++++++++++++++++++++++++++++++++++++ARAMETER BLOCK SAVE AREA ; ;########################################################################### PBCMD DS 1 ;COMMAND LSE USE 256 GETLAD1: LD (BYTCNT),HL ; LD DE,(PBTRK) ;GET TRACK LD A,76 ;CHECK LIMITS SUB A,D JR C,PARERR ; PUSH ##### ; ; JADE SECTOR BUFFER ; ;########################################################################### JADSECB DS 256  SUBTTL CONSTANTS ;########################################################################### ; ; INITIAL DISK DRIVE TAB+++++++++++++++++++++++++++++++++++++ GETLUN: ; ; SAVE CDB PTR ; LD (CDBPTR),IY ; ; COMPUTE DRIVE # ; LD A,(PBDRVBYTE PBDRV DS 1 ;DRIVE BYTE PBTRK DS 2 ;TRACK # PBSEC DS 2 ;SECTOR #, FORMAT INTERLEAVE, FLOPPY PARAMS PBFLG DS 1 ;INPUTDE ;LA = TRACK * 26 + SECTOR POP HL ADD HL,HL ;X * 26 = 8X + 5X * 2 ADD HL,HL ADD HL,HL ADD HL,DE ; +5X ADD HL,DE ;########################################################################### ; ; SASI CONTROLLER COMMAND DESCRIPTOR BLOCKLES ARE MOVED TO RAM BY INIT ; ;########################################################################### DTIMG: DB 0,0,0,0) ;FETCH DRIVE # SUB A,HDBASD AND A,00000011B LD (LUNSV),A ;SAVE IT FOR OTHERS ; RRCA ;PUT IN PROPER FIELD RRCA R FLAG BYTE (LOG-ON, BLOCKING FLAGS) ; SELECT DISK - 0: NOT SELECTED BEFORE ; BLOCKING - 0: NORMAL WRITE (READ-WRITE)  ADD HL,DE ADD HL,DE ADD HL,DE ADD HL,HL ; * 2 ; LD A,(PBSEC) ;FETCH SECTOR LD E,A LD A,26 ;CHECK FOR LIMIT SS (CDB) ; ;########################################################################### CDBPTR DS 2 ;PTR TO CURRENT COMMAND C1100000B ;LUN0 DB 1,0,0,0 ;LUN1 DB 2,0,0,0 ;LUN2 DB 3,0,0,0 ;LUN3 DB -1,0,0,0 ;DUMMY DRIVE TABLE USED ON ERROR DTICNRCA LD (NULCDB + LUN), A LD (LAXCDB + LUN), A LD (IDRCDB + LUN), A ; ; RETURN CDB PTR ; LD HL,(CDBPTR) RET ; ; 1: DIRECTORY WRITE (READ-WRITE) ; 2: UNALLOCATED WRITE (NO READ) PBLOG EQU 0 ;LOGON REQUEST BIT PBRTRY5 UB A,E JR NC,SECOK ; PARERR: LD A,FERR10 ;ILLEGAL PARAMETER SCF RET ; ; SECOK: ADD HL,DE ;ADD IN SECTOR ; BIT DFTDB ; NULCDB: DS 6 ;NO TRANSFER CDB LAXCDB: DS 6 ;MAIN XFER CDB IDRCDB DS 6 ;ID SECTOR READ CDB CDBINIT EQU $ - NULCDB ;T EQU $ - DTIMG ;########################################################################### ; ; ID SECTOR TEXT ; ;##*************************************************************************** ; ; GET LOGICAL ADDR FROM IOPB SUBR ; ENTRY- IY= EQU 6 ;RETRY 5 TIMES BIT (ALONG WITH BIT 7 SET) PBRTRY EQU 7 ;DISABLE RETRYS BIT PBDMA DS 2 ;TRANSFER ADDRESS PBDMAX DS 0D,(IX + DTFLG) ;IF DOUBLE DENSITY THEN LESS 26 JR Z,HDFDOK ; LD DE,26 SBC HL,DE ; HDFDOK: LD (IY+LA0),L LD (IY+LA1), ; CDB OFFSETS ; CMD EQU 0 ;COMMAND LUN EQU 1 ;LOGICAL UNIT NUMBER IN BITS 5..7 LA2 EQU 1 ;LOGICAL ADDRESS 2 IN BITS 0..4 ######################################################################### IDTXT DB 'Jade DD ' IDSZE EQU $ - IDTXT IF $ >= CDB PTR ; IX= DRIVE TABLE PTR ; ;*************************************************************************** GETLAD: ; ; 1 ;TRANSFER BANK ADDRESS PBSTAT DS 4 ;SENSE STATUS BYTES (IF ERROR) DS 2 ;SPARES IOPBSIZE EQU $ - PBCMD ;###########H ; ; RETURN NO ERRORS ; XOR A,A RET ; ; ;--------------------------------------------------------------------------LA1 EQU 2 ;LOGICAL ADDRESS 1 LA0 EQU 3 ;LOGICAL ADDRESS 0 ILV EQU 4 ;FORMAT COMMAND INTERLEAVE FACTOR NBK EQU 4 ;XFER COMMAND(LOCROM + ROMSIZE) CONMSG **** ERROR! CODE TOO LARGE FOR DECLARED PROM SIZE! **** ENDIF SUBTTL RAM AREA ORG LOCRAM ;# SELECT ROUTINES BASED ON HARD OR FLOPPY DISK ; BIT DFHARD,(IX + DTFLG) ;IF HARD DISK THEN SPLIT JR NZ,HDLAX ; ; ;-----################################################################ ; ; HARD DISK SECTOR BUFFER ; ;###########################- ; ; SET UP HARD DISK CDB ; ;--------------------------------------------------------------------------- HDLAX: ; ; SES BLOCK (SECTOR) COUNT RTY EQU 5 ;RETRY FLAG 0: RETRY 3 TIMES, 80H: NO RETRYS LUND EQU 5 ;COPY COMMAND DEST. LUN IN BITS 5..7 ########################################################################## ; ; VARIABLES ; ;##############################---------------------------------------------------------------------- ; ; FLOPPY DISK LAD CALCULATION ; ;------------------################################################ HDBUFSZ EQU 256 HDSECB DS HDBUFSZ ; RSTAT DS 1 ;COMMAND STATUS RETURNED T BYTE COUNT TO SECTOR SIZE ; LD HL,256 ;SECTOR SIZE LD (BYTCNT),HL ; ; COMPUTE LOGICAL ADDRESS FROM SECTOR, TRACK ;  LA2D EQU 5 ;COPY COMMAND DEST. LOGICAL ADDR 2 IN BITS 0..4 FDD EQU 5 ;DEFINE FLOPPY PARAMS COMMAND ;BIT 0: 0= SINGLE SIDE,############################################# IOPBL DS 1 ;LOW ADDRESS OF IOPB TO EXECUTE IOPBH DS 1 ;HIGH ADDRESS OF IOPB I--------------------------------------------------------- LD HL,128 ;ASSUME SECTOR SIZE OF 128 BYTES ; LD A,(PBTRK) ;IF TR ;BIT 1: ERROR (ISSUE SENSE COMMAND) ;BIT 5..7: LUN BUFDRV DS 1 ;BUFFER CONTENTS DRIVE BYTE BUFSEC DS 2 ;BUFFER CONTENTS S LD A,(PBSEC) ;FETCH SECTOR LD E,A ; LD A,(PBTRK) ;PICK UP TRACK LSB & PUT INTO LA0 BIT 7 SRL A ; SECTOR BIT 0 IS WAST0 ( ) *!+",#-$.%/ &0 ' 1= DOUBLE SIDED ;BIT 1: 0= SINGLE DENSITY, 1= DOUBLE DENSITY ;BITS 2..3: 00= 128 BYTES, 01= 256 BYTES LA1D EQU 6 ;COPY if required. ; Normally this change will allow transparent operation of the soft- ; ware, without concern to the busy status.R DECLARED RAM SIZE! **** ENDIF DS 32 STACK EQU LOCRAM + RAMSIZE END t clearing of PBSECO. This effectively ; prevented formatting other than side 0. ; VERSN EQU 113 ;*************************DE floppy disk controller physical drive 1 ; 6 JADE floppy disk controller physical drive 2 ; 7 JADE floppy disk control COMMAND DEST. LOGICAL ADDR 1 LA0D EQU 7 ;COPY COMMAND DEST. LOGICAL ADDR 0 RTYD EQU 9 ;COPY COMMAND RETRY FLAG ERRCOD DS 1 All other status bits ; reflect the software status register contents (D1..7). ; ; 1.6 - 3 MAY 84 GRH ; Change block moveå************************************************* FALSE EQU 0 TRUE EQU NOT FALSE DEBUG EQU FALSE ; ;*INCLUDE JDDCONT.DEF ler physical drive 3 ; ;************************************************************************** ; ; REVISIONS: ; 1.0 - 2 ;########################################################################### ; ; DRIVE TABLES ; ;################### subroutine to allow for 1..65,536 byte moves. ; Fix bugs in Jade driver. Add printer output diagnostic. ; ; 1.7 - 2 JUN 84 å ; LIST OFF *INCLUDE JDDCONT.DEF LIST ON SUBTTL DEFINITIONS ;=========================================================8 DEC 83 GRH ; DIAGNOSTIC VERSION FOR TESTING THE BOARD. ; 1.1 - 2 JAN 84 GRH ; ADD HARD DISK CONTROLLER FIRMWARE. ; 1.2######################################################## HDDTBL: DS 4 ;HD PHYSICAL DRIVE 0 DS 4 ; 1 DS 4 ; 2 DS GRH ; Fix bug in HSTIN & HSTOUT macros outputting bit 7 data to XADDR ; register instead of to HXAD15 register. ; Add JADEå================== ; ; I/O PORTS ; ;=========================================================================== S100D EQU 0 - 1 APR 84 GRH ; Fix Bug in host xfer subr. that caused problems on 32k boundary ; crossings. Enable parity checking for re 4 ; 3 HDDMY DS 4 ;DUMMY ; DTDRV EQU 0 ;DRIVE BYTE OFFSET ; DTVEC EQU 1 ;DRIVE VECTOR OFFSET DTFLG EQU 3 ;DRIVE FLAGS  FDC dump to dump diagnostic command. ; ; 1.8 - 2 JUN 84 GRH ; Change floppy disk read/write sector to logical sector for uåD8H ;DATA PORT VISIBLE TO S100 BUS S100S EQU S100D + 1 ;STATUS PORT VISIBLE TO S100 BUS S100C EQU S100S ;COMMAND PORT VISIBLceived data. Enable ; controller retrys. ; 1.3 - 2 APR 84 GRH ; Fix Bug in read buffer routine which caused 1st 4 bytes of OFFSET ;########################################################################### ; ; DISCRETE VARIABLES ; ;########niformity ; in IOPB parameters. (0..N-1 now changed to 1..N) ; ; 1.9 - 3 OCT 84 GRH ; Fix bug in Jade driver which alloåE TO S100 BUS ; LOCPRTS EQU 0 ;BASE ADDRESS OF LOCAL PORTS LOCMEM EQU 0 ;BASE ADDRESS OF LOCAL RAM ; S1PRTS EQU 80H ;BASsector ; to be 0 and read not retryed but sense status to be issued instead. ; The CDB had to be re-initialized with the read ################################################################### LUNSV DS 1 ;LUN # BYTCNT DS 2 ;SECTOR SIZE RETRYS DS 1 ;Rwed errors to go undetected. ; ; 1.A - 18 APR 85 GRH ; Fix logon problem. Code is only now showing bugs with 2nd hard ;  TITLE INTELLIGENT SASI HOST ADAPTOR INTERFACE LIST NOCOND ;*****************************************************************E ADDRESS OF S100 PORTS ;=========================================================================== ; ; MEMORY AREAS ; command after getting ; results command issued. ; ; 1.4 - 28 APR 84 GRH ; Add Jade FDC routines. Change host block move suETRY COUNT MOVX DS 1 ;HOST BANK ADDRESS SAVE FOR BLOCK MOVE SUBRS FDADDR DS 2 ;FDC ADDRESS PTR TIMOUT DS 2 ;UNSELECT SASI DELdisk installed. ; ; 1.B - 21 FEB 87 GRH ; Add error return to IOPB.PBSTAT thus allowing user to only check ; this byte f********* ; ; THIS MODULE CONTAINS THE INTELLIGENT HOST ADAPTER FIRMWARE. ; ;*********************************************** ;=========================================================================== S1MEM EQU 8000H ;BASE ADDRESS OF S100 MEMORY WINbrs into general ; purpose subrs. ; ; 1.5 - 30 APR 84 GRH ; Change hardware to reflect the state of the interrupt flip-flAY ;########################################################################### ; ; STACK AREA ; ;###################or errors rather than checking HSTATUS and then HDATA. ; ; 1.12 - 25 MAY 87 GRH ; Change JADE code to allow interim communi*************************** ; ; IOPB CONFIGURATION: ; ; DRIVE USAGE ; 0 SASI physical drive 0 ; 1 SASI physical driDOW ; LOCROM EQU LOCMEM ;BASE ADDRESS OF LOCAL ROM LOCRAM EQU LOCMEM + 4000H ;BASE ADDRESS OF LOCAL RAM ; RAMSIZE EQU 2048op ; as the busy bit (D0). Hardware will now allow software setting of ; the interrupt flip-flop to allow passing a busy state######################################################## IF $ > (LOCRAM + RAMSIZE - 32) CONMSG **** ERROR! DATA TOO LARGE FOcation with new JADE ; firmware. ; Change version # to decimal number. ; ; 1.13 - 11 MAY 88 GRH ; Remove hard disk formave 1 ; 2 SASI physical drive 2 ; 3 SASI physical drive 3 ; 4 JADE floppy disk controller physical drive 0 ; 5 JA0 ( ) *!+",#-$.%/ &0 ' ;SIZE OF LOCAL RAM ROMSIZE EQU 2048 ;SIZE OF LOCAL ROM ;===============================================================EGAL IOPB COMMAND FERR07 EQU 49H ;CONTROLLER HANDSHAKE TIMOUT FERR08 EQU 4AH ;CONTROLLER SYNC ERROR ??? FERR09 EQU 1FH ;CONTRIT SREQ EQU 3 ;SASI REQUEST* BIT SIO EQU 4 ;SASI I/O* BIT SPERR EQU 7 ;SASI PARITY ERROR DETECTED BIT SSTMSK EQU 10011111DEFINITIONS ; ;=========================================================================== JADBASD EQU 4 ;BASE DRIVE # OF JAEST BIT HIOPBB EQU 6 ;HOST EXECUTE IOPB BIT HRESB EQU 7 ;HOST RESET LOCAL PROCESSOR BIT ; HDATA EQU LOCPRTS + 5 ;HOST DATA============ ; ; LOCAL PORT DEFINITIONS ; ;=========================================================================== SASIOLLER SENSE STATUS ERROR FERR10 EQU 51H ;ILLEGAL IOPB PARAMETER FERR11 EQU 4BH ;PARITY ERROR ;FERR12 EQU 12 ;===========B ;STATUS BIT MASK SSTINV EQU 00011000B ;STATUS BIT INVERSION MASK SSXMSK EQU 00010110B ;XFER CONTROL MASK SGTCMD EQU 1 SHL SDE CONTROLLER JADNDRV EQU 4 ;NUMBER OF LOGICAL JADE CONTROLLER DRIVES DDPORT EQU DDPORT8 DDOUT EQU DDFREE DDMRQ EQU DDMB0  TRANSFER PORT ; HXAD15 EQU LOCPRTS + 6 ;HOST A15 SET PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITION ; ^________________ BIT APPLDATA EQU LOCPRTS ;SASI BUS DATA PORT ; SASICMD EQU LOCPRTS + 1 ;SASI BUS CONTROL PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITIONS ================================================================ ; ; HARD DISK DEFINITIONS ; ;==============================CD ;GET COMMAND FROM H/A SGTDAT EQU 0 ;GET DATA FROM H/A SSNDDAT EQU 1 SHL SIO ;SEND DATA TO H/A SSNDST EQU (1 SHL SIO) + (1DDBUF EQU 0380H DDCMD EQU DDCBO IDFLGO EQU 0031H DFHARD EQU 5 DFDBL EQU 6 DFT0D EQU 0 SUBTTL MACROS ;@@@@@@@@@@@@@@@@@IED TO HOST BUS A15 WHEN ACCESSING ITS ; MEMORY A15B EQU 7 ;HOST A15 BIT ; HXADDR EQU LOCPRTS + 7 ;EXTENDED ADDRESS P ; ^ ^ ^ ^ ^__ SASI INTERRUPT ON REQUEST ENABLE (1), HOST (0) ; | | | |____ SASI RESET BIT (1) ; | | |______============================================= HDCONT EQU 0 ;THIS CONTROLLER'S ADDRESS BIT HDBASD EQU 0 ;BASE DRIVE # OF HD C SHL SCD) ;SEND STATUS TO H/A SCMDDN EQU (1 SHL SIO) + (1 SHL SCD) + (1 SHL SMSG) ;COMMAND DONE ; HINTC EQU LOCPRTS + 2 ;HOST@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GET DATA MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ORT (A16..A23) ; ; 7 6 5 4 3 2 1 0 BIT DEFINITION ; ^ ^ ^ ^ ^ ^ ^ ^__ A16 ; | | | | | | |____ A17 ; | | | | | |______ A18  SASI DEVICE SELECT STROBE (1) ; | |________ SASI PARITY ERROR CLEAR (0) ; |__________ HOST VECTORED INTERRUPT (1)ONTROLLER HDNDRV EQU 4 ;NUMBER OF PHYSICAL DRIVES SUPPORTED HDNLUN EQU HDNDRV INLEV EQU 6 ;INTERLEAVE FACTOR FOR FORMAT  INTERRUPT CLEAR PORT (OUT, DATA= X) ; HINTS EQU LOCPRTS + 3 ;HOST INTERRUPT SET PORT (OUT, DATA= X) ; HSTAT EQU LOCPRTS +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GETDATA MACRO AA#SYM: CALL GETSTAT ;IF REQUEST FALSE THEN WAIT BIT SREQ,A JR Z,AA#SYM ; ; | | | | |________ A19 ; | | | |__________ A20 ; | | |____________ A21 ; | |______________ A22 ; |________________ A23  ; SINTE EQU 0 ;SASI INTERRUPT BIT # SRESET EQU 1 ;SASI RESET BIT # SSELECT EQU 2 ;SASI DEVICE SELECT STROBE BIT # SERRC ;=========================================================================== ; ; SASI COMMANDS ; ;====================== 4 ;HOST STATUS PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITION ; ^ ^ ^__ ISASI BUSY (1) ; | |____ FIRMWARE ERR INI ;GET DATA ; ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; PUTDATA MAC ;=========================================================================== ; ; FIRMWARE ERROR CODES ; RETURNED IN HOST DALR EQU 3 ;SASI PARITY ERROR CLEAR* BIT # HINT EQU 4 ;HOST VECTORED INTERRUPT BIT # ; SASIST EQU LOCPRTS + 1 ;SASI BUS STATU===================================================== SCRDY EQU 0 ;TEST DRIVE READY COMMAND SCREC EQU 1 ;RECALIBRATE SCSNSE EOR (1) ; |________________ ERROR (1) ; HBUSY EQU 0 ;HOST BUSY STATUS BIT HFERRB EQU 1 ;HOST FIRMWARE ERROR BIT HSERRB EQURO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PUTDATA MACRO AC#SYM: CALL GETSTAT ;IF RETA REGISTER IF HOST STATUS BIT 1 SET AND IN IOPB.PBSTATO ; IF APPLICABLE. ; ;===============================================S PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITIONS ; ^ ^ ^ ^ ^ ^__ SASI BUSY (1) ; | | | | |____ SASI MESSAGE (1) ; | QU 3 ;REQUEST SENSE SCFMTD EQU 4 ;FORMAT ENTIRE DRIVE SCFMTT EQU 6 ;FORMAT TRACK SCFMTBT EQU 7 ;FORMAT BAD TRACK SCREAD EQU  7 ;HOST ERROR STATUS BIT HFERR EQU (1 SHL HSERRB) + (1 SHL HFERRB) ;FIRMWARE ERROR BYTE ; HCMD EQU LOCPRTS + 4 ;HOST COMMANQUEST NOT TRUE THEN WAIT BIT SREQ,A JR Z,AC#SYM ; OUTI ;ASSUME CALLER SET UP ; ;DON'T WAIT ENDM ;@@@@@@@@@@@============================ FERR00 EQU -1 ;UNKNOWN ERROR FERR01 EQU 43H ;RAM TEST FAILURE FERR02 EQU 47H ;ROM TEST FAILURE | | |______ SASI COMMAND (1) / DATA (0) ; | | |________ SASI REQUEST (1) ; | |__________ SASI INPUT (1) / OUTPUT (0) 8 ;READ SECTOR(S) SCWRIT EQU 10 ;WRITE SECTOR(S) SCSEEK EQU 11 ;SEEK TRACK ; SCCOPY EQU 20H ;COPY BLOCK(S) ; SCDEF EQU 0C0D PORT ; ; 7 6 5 4 3 2 1 0 BIT DEFINITIONS ; ^ ^ \_____/ ^__ HOST INTERRUPTED (1) ; | | |_______ NON-IOPB COMMAND CO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; BUFFER HALF SELECT MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@FERR03 EQU 20H ;ILLEGAL COMMAND FERR04 EQU 48H ;ILLEGAL INTERRUPT FERR05 EQU 40H ;ILLEGAL IOPB DRIVE SPEC FERR06 EQU 20H ;ILL; |________________ SASI PARITY ERROR (1) ; SBUSY EQU 0 ;SASI BUSY BIT SMSG EQU 1 ;SASI MESSAGE BIT SCD EQU 2 ;SASI C/D BH ;DEFINE FLOPPY DISK PARAMETERS ;=========================================================================== ; ; JADE DE (0..F) ; | |______________ HOST EXECUTE IOPB (1) ; |________________ LOCAL RESET (1) ; HINTRB EQU 0 ;HOST INTERRUPT REQU0 ( ) *!+",#-$.%/ &0 '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ SELCTBUF MACRO ; ; ASSUME 1ST HALF ; LD HL,HDSECB ; ; SELECT BUFFERPUTE ENTRY ADDRESS LD L,A LD A,0 ADC A,H LD H,A LD E,(HL) ;FETCH EXECUTION ADDRESS INC HL LD D,(HL) EX DE,HL  INSTRUCTION BASED ON PORT BIT 7 ;; ; ; SELECT BIT 7 OF PORT ; IF #PORT < 80H XOR A ELSE LD A,#PORT ;SET UP BIT 7 TIMED OUT YET. WAIT IN THIS LOOP UNTIL TIMEOUT ; DEC HL LD (TIMOUT),HL LD A,H OR A,L JR NZ,HWAIT ; ; TIMEOUT OCCU ERROR TO HOST & HALT OUT (HDATA),A ; ; SET ERROR FLAG TO HOST ; LD A,HFERR OUT (HSTAT),A ; ; CLEAR PENDING INTER HALF BASED ON FLAGS ; BIT DFHARD,(IX + DTFLG) ;IF HARD DISK THEN DO SELECTION JR NZ,BA#SYM ; LD A,(PBTRK) ;ELSE IF TRK IN A,(HDATA) ;PREFETCH ARGUMENT ; LD DE,CMDRET ;PUT RETURN ADDRESS ON STACK PUSH DE JP (HL) ; ; ; ; ALL COMMANDS RETU ENDIF OUT (HXAD15),A ; ; INPUT DATA ; IN A,(#PORT OR 80H) ;FETCH DATA ENDM SUBTTL MAIN CODE ORG LOCROM ;----RRED. DESELECT SASI TO DESELECT DRIVE ; XOR A,A OUT (SASIDATA),A LD A,[1 SHL SSELECT] OR [1 SHL SERRCLR] ; DI ;NO IRUPT & GO TO SLEEP ; OUT (HINTC),A HALT IF $ > 38H CONMSG **** ERROR! RESET CODE OVERLAPS INTERRUPT CODE! **** EN00 THEN USE 1ST HALF ONLY OR A JR Z,BB#SYM ; BIT DFDBL,(IX + DTFLG) ;IF NOT 256 BYTE SECTORS THEN DO JR Z,BB#SYM ; 1SRN HERE ; ENTRY- CF= ERROR ; A= 0: NOT FIRMWARE ERROR ; /0: ERROR CODE ; CMDRET: ; ; IF NO ERROR THEN PASS IT TO HO----------------------------------------------------------------------- ; ; PROCESSOR REGISTER USAGE: ; IX= PTR TO CURRENT DINTERRUPTS WHILE THIS IS GOING ON ; OUT (SASICMD),A LD A,[1 SHL SERRCLR] OUT (SASICMD),A ; EI ;SAFE TO ALLOW INTERRUDIF ;--------------------------------------------------------------------------- ; ; INTERRUPT ENTRY VECTOR OCCURRS WHEN HOSTT HALF ONLY ; BA#SYM: LD A,(PBSEC) ;IF SECTOR IS ODD THEN SELECT UPPER HALF AND 1 JR Z,BB#SYM ; LD HL,HDSECB + 128 BB#ST ; JR NC,CNOERR ; OR A ;IF A= 0 THEN NO ERROR JR Z,CNOTF ; ; ELSE PASS ERROR CODE TO HOST IN DATA REGISTER ; OSK DRIVE TABLE ; IY= PTR TO CURRENT COMMAND DESCRIPTOR BLOCK ; ;-------------------------------------------------------------PTS AGAIN ; ; GO BACK TO WAITING FOR HOST INTERRUPT AGAIN ; JR HWAIT ; ; ; NOT FIRMWARE ERROR ; CNOTF: LD A,1 SHL  INTERRUPTS OR IF SASI IS ; IMPLEMENTED WITH INTERRUPT THEN MEANS SASI IS REQUESTING SOMETHING. ; ;-------------------------SYM: ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;; ;; HOST OUTPUT MACRO ;; ;@@UT (HDATA),A ;PUT ERROR IN DATA REG ; ; PASS FIRMWARE ERROR MESSAGE TO HOST IN STATUS REGISTER ; LD A,HFERR ;SET FIRMWAR-------------- ; ; MAIN CODE FROM RESET ; RESETV: ; ; SET BUSY FLAG UNTIL WE'RE DONE ; OUT (HINTS),A ; ; PASS 0HSERRB ;PLAIN ERROR JR CMDR1 ; ; ; NO ERROR. PASS BACK 0 TO HOST ; CNOERR: XOR A ;CLEAR BUSY & ERROR FLAGS JR CMDR1 -------------------------------------------------- ORG LOCROM + 38H ; ; GET HOST COMMAND ; IN A,(HCMD) ; ; IF NOT H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ HSTOUT: MACRO #PORT, #DATA ;; ;; SELECT INSTRUCTIE ERROR ; CMDR1: OUT (HSTAT),A ;PASS ERROR TO HOST ; ; SET UP FOR TERMINATION ; POP HL ;WASTE RETURN ADDRESS TO WAIT R TO HOST IN STATUS ; XOR A,A OUT (HSTAT),A ; ; SET UP INTERRUPT ; IM 1 ; ; SET UP STACK ; LD SP,STACK ;INIT S ;########################################################################### ; ; COMMAND TABLE FOR NON-IOPB COMMANDS ; ;#OST INTERRUPT THEN ASSUME SASI ; BIT HINTRB,A JP Z,SASINT ; ; IF IOPB COMMAND THEN GO EXECUTE IT ; BIT HIOPBB,A JPON BASED ON EFFICIENCY ;; ; ; SET BIT 7 OF PORT ; IF #PORT < 80H XOR A ELSE LD A,#PORT ENDIF OUT (HXAD15),A ;TN ; LD HL,-1 ;SET TIMOUT TIME ; HWAITC: LD (TIMOUT),HL ; ; TELL HOST WE'RE DONE ; OUT (HINTC),A ; ; FALL INTO TACK ; ; DO RAM TEST 1ST ; LD HL,LOCRAM LD BC,RAMSIZE ; MTLP: LD A,(HL) ;COMPLEMENT & TEST CPL LD (HL),A CP (H########################################################################## CMDTBL: DW IOPBLO ;(1) SET IOPB LO COMMAND DW I NZ,EXIOPB ; ; MUST BE DIRECT COMMAND FOR EXECUTION ; AND A,00011110B ;MASK OFF UNUSED COMMANDS ; CP A,NUMCMDS * 2 ;IF ; OUTPUT DATA ; IF (#DATA = 0) AND (#PORT <> 0) XOR A ENDIF IF #DATA <> 0 LD A,#DATA ;OUTPUT DATA ENDIF OUT MAIN LOOP ; ;--------------------------------------------------------------------------- ; ; MAIN INTERRUPTED LOOP ; ;L) JR NZ,MEMERR ; CPL ;RESTORE LD (HL),A ; INC HL ;NEXT LOCATION DEC BC LD A,B OR C JR NZ,MTLP ; ; RAM OPBHI ;(3) SET IOPB HI COMMAND DW IOPBX ;(5) SET IOPB XADDR COMMAND DW DIAG0 ;(7) DUMP LOCAL MEMORY DIAGNOSTIC CMD DW D COMMAND ERROR THEN RETURN FIRMWARE ERR JR C,CMDOK ; ; ILLEGAL DIRECT COMMAND. RETURN ERROR TO HOST ; LD A,FERR03 SCF(#PORT OR 80H),A ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;; ;; HOST INPUT MAC--------------------------------------------------------------------------- HWAIT: ; ; ALLOW INTERRUPTS NOW ; EI ;ALLOOK. DO ANY OTHER INITIALIZATION ; CALL INIT ;ANY OTHER INITIALIZATION ; ; WAIT FOR HOST COMMAND WITHOUT TIMEOUT ; LD IAG1 ;(9) SET OUTPUT PORTS DIAG. COMMAND DW DIAG2 ;(B) TEST S100 MEMORY ACCESS COMMAND DW DIAG3 ;(D) BLOCK MOVE 01000H TO JR CMDRET ; ; ; COMMAND OK. PERFORM COMPUTED GOSUB TO EXECUTE IT ; CMDOK: LD HL,CMDTBL ;POINT TO TABLE ADD A,L ;COMRO ;; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ HSTIN: MACRO #PORT ;; ;; SELECT PROPERW INTERRUPTS ; ; IF ALREADY TIMED OUT THEN WAIT IN THIS LOOP ; LD HL,(TIMOUT) LD A,H OR A,L JR Z,HWAIT ; ; NOT HL,0 ;FORCE NO TIMEOUT JP HWAITC ; ; ; RAM ERROR ENCOUNTERED ; MEMERR: ; ; PASS ERROR TO HOST ; LD A,FERR01 ;PASS 0 ( ) *!+",#-$.%/ &0 ' 02000H COMMAND DW PRINT ;(F) PRINT ASCII STRING TO PORT COMMAND DW RETVERS ;(11) RETURN FIRMWARE VERSION ; NUMCMDS EQU TRY- A= 0: BLOCK MOVE FROM 1000H TO 2000H ; 1: READ FROM 1000H (SCOPING TEST) ; 2: WRITE TO 1000H (SCOPING TEST) ; UT (HXADDR),A ;USE DATA FOR EXTENDED ADDRESS ; ; SET UP FOR LOWER 32K ; XOR A,A OUT (HXADDR),A OUT (HXAD15),A ; ; +++++++++++++++++++++++++++++++++++++++++++++++++++++ PRINT: ; ; USE HOST ARGUMENT AS PORT # ; OUT (HXAD15),A ;SET PORT ATA),A OUT (HSTAT),A ; ; DIRECT RETURN TO WAIT LOOP ; JP DIAGR ;++++++++++++++++++++++++++++++++++++++++++++++++++($ - CMDTBL) / 2 ;NUMBER OF COMMANDS SUBTTL COMMANDS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3: BLOCK MOVE FROM E000H TO E800H ; ALL OTHERS: NOP ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DUMP LOCAL RAM TO S100 RAM AT 4000H ; LD HL,LOCRAM LD DE,S1MEM + 4000H LD BC,RAMSIZE LDIR ; ; DUMP LOCAL ROM TO STO DATA SET 7,A ;MAP TO HOST LD C,A ; CALL CRLF ; LD E,'0' ;START WITH '0' LD B,80 ;DO 1 LINE PRINT1: CALL PRT ; +++++++++++++++++++++++++ ; ; DIAG2 TESTS S100 MEMORY READS & WRITES FROM XX1000H TO XX1FFFH ; EXIT- XX0FF2H= LAST LOCATION C++++++ ; ; SET IOPB ADDRESS FUNCTION ; MUST BE INITIALIZED BEFORE DISK ACCESS ; ENTRY- A= DATA ; EXIT - A= 0 ; ;+++++++++++++++++++++ DIAG3: ; ; DO TESTS BASED ON HOST ARGUMENT ; OR A,A JR Z,DOMOVE ; D3LP: IN A,(HDATA) ;IF DATA CHANGED 100 RAM AT 4800H ; LD HL,LOCROM LD BC,ROMSIZE LDIR ; ; JUST FOR GRINS.. DUMP JADE CONTROLLER BANK 0 TO HOST RAM AT 50 ; NEXT CHAR ; INC E DJNZ PRINT1 ; ; END WITH A NEWLINE ; CRLF: LD E,0DH CALL PRT LD E,0AH CALL PRT ; ; RHECKED ; XX0FF4H= 0: OK ; READ DATA IF ERROR ; XX0FF5H= CONTENTS OF LAST LOCATION ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET LOW BYTE ; IOPBLO: LD HL,IOPBL ;POINT TO BYTETHEN CHECK CP 2 JR C,DOREAD JR Z,DOWRITE CP 3 JR Z,DOBLKH ; ; IF UNKNOWN COMMAND THEN QUIT WITHOUT ERROR ; XOR 00H ; HSTOUT DDPORT,DDMB0 ;FOLLOW WITH FDC BANK 0 LD HL,(FDADDR) LD BC,1024 PUSH HL LD A,H ;SET BUS BIT 15 OUT (ETURN NO ERRORS ; XOR A RET ;*************************************************************************** ; ; PRINT T++++++++++++++++++++++++++++++++++++++++++ DIAG2: ; ; SET UP TO TEST HOST MEMORY ; LD HL,S1MEM + 1000H LD BC,ROMSIZE + TO ALTER JR IOPBST ; ; SET HIGH BYTE ; IOPBHI: LD HL,IOPBH JR IOPBST ; ; SET EXTENDED ADDRESS BYTE ; IOPBX: A RET ; ; ; CONTINUOUS WRITES COMMAND ; DOWRITE: LD (S1MEM + 1000H),A ;USE ARGUMENT AS DATA JR D3LP ; ; ; CONTHXAD15),A LDIR ; ; NOW JADE BANK 1 AT 5400H ; HSTOUT DDPORT,DDMB1 ;FOLLOW WITH FDC BANK 1 POP HL LD A,H ;SET BUS HE CHAR SUBROUTINE ; ENTRY- E= CHAR TO OUTPUT ; C= PORT # ; ;************************************************************** RAMSIZE ; ; DO TEST ; D2LP: LD A,(HL) CPL LD (HL),A CP A,(HL) CPL ;RESTORE LD (HL),A JR NZ,D2ERR ; ; TE LD HL,IOPBXA ; ; COMMON SET CODE ; IOPBST: LD C,(HL) ;SAVE OLD DATA LD (HL),A ;SET NEW DATA LD A,C ;PASS OLD DATA INUOUS READS COMMAND ; DOREAD: LD A,(S1MEM + 1000H) JR D3LP ; ; ; BLOCK MOVE COMMAND TO LOW MEMORY ; DOMOVE: LD HBIT 15 OUT (HXAD15),A LD BC,1024 LDIR ; HSTOUT DDPORT,DDOUT ;REMOVE DD WINDOW SO HOST WON'T CRASH ; ; PASS NO ERROR************* PRT: IN A,(C) ;IF BUSY THEN WAIT AND 1 JR NZ,PRT ; LD A,E ;OUTPUT THE CHAR SET 7,A OUT (C),A ; RES ST OK. DO NEXT ; INC HL ; ; CHECK FOR DONE ; DEC BC LD A,B OR C JR NZ,D2LP ; ; PASS ERROR DATA TO HOST MEMORTO HOST OUT (HDATA),A ; ; RETURN NO ERRORS ; XOR A ;RETURN NO ERRORS (PREVENTS DATA OVERWRITE) RET ;+++++++++++L,S1MEM + 1000H LD DE,S1MEM + 2000H LD BC,1000H LDIR ; ; ONLY DO THIS ONE ONCE ; XOR A RET ; ; ; BLOCK MOVE S TO HOST ; XOR A ;NO ERRORS OUT (HSTAT),A ; ; DIRECT RETURN TO WAIT LOOP ; DIAGR: LD SP,STACK ;DIRECT RETURN, FLUSH7,A OUT (C),A ; SET 7,A OUT (C),A ; RET SUBTTL SASI INTERRUPT ;------------------------------------------------Y ; D2ERR: LD (S1MEM + 0FF2H),HL LD (S1MEM + 0FF4H),A LD A,(HL) LD (S1MEM + 0FF5H),A ; ; RETURN NO ERRORS ; XOR A++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DIAGNOSTIC DUMP LOADS HOST MEMORY WITH RAM IMAGE ; ENTRYTO HIGH MEMORY COMMAND ; DOBLKH: LD A,1 SHL A15B ;SET HIGH PAGE OUT (HXAD15),A LD HL,0E000H LD DE,0E800H LD BC,800H  RETURN ADDR FROM STACK ; LD HL,(TIMOUT) ;PASS TIMEOUT JP HWAITC ;++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- ; ; INTERRUPT WITHOUT HOST BIT SET ; ;----------------------------------------------------------,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DIAG3 DOES S100 MEMORY ACCESSES- A= BANK ADDRESS ; EXIT - XX4000H..XX47FFH= RAM IMAGE ; XX4800H..XX4FFFH= ROM IMAGE ; XX5000H..XX57FFH= JADE FDC IMAGE ;  LDIR ; ; ONLY DO THIS ONE ONCE ALSO ; XOR A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DIAGNOSTIC 1 LOADS DATA INTO DATA OUT & STATUS REGS ; ENTRY- A= DATA ; ;+++++++++++++++++++++++----------------- SASINT: ; ; THIS INTERRUPT NOT IMPLEMENTED. RETURN ERROR TO HOST ; LD A,FERR04 ;OUTPUT ERROR FOR NOW  DEPENDING ON DATA ; NOTE: SCOPING TESTS CONTINUE UNTIL ANOTHER DATA WORD IS ; WRITTEN TO THE DATA REGISTER BY THE HOST. ; EN ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIAG0: ; ;*** COMMENTED OUT FOR NOW *** ; ; O+++++++++++ ; ; PRINT TEXT ON THE PRINTER COMMAND EXERCISES THE I/O CAPABILITY ; ENTRY- A= PORT # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIAG1: ; ; SET DATA & STATUS REGISTERS WITH HOST ARGUMENT ; OUT (HD!0 ( ) *!+",#-$.%/ &0 ' SCF JP CMDRET SUBTTL IOPB EXECUTION ;--------------------------------------------------------------------------- ; ; L INTO READ COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ SECTOR COM,0 ADC A,H LD H,A LD E,(HL) ;GET COMMAND FROM TABLE INC HL LD D,(HL) EX DE,HL ; LD DE,XRET ;PUT RETURN ADDRESS JADE FDC WINDOW ; PUSH AF ;SAVE ERROR STATUS HSTOUT DDPORT,DDOUT ;REMOVE WINDOW POP AF ; ; RETURN ERROR STATUS ; +++++++++++++++++++++++++ RETVERS: LD A,VERSN ;LOAD DATA REGISTER WITH VERSION OUT (HDATA),A ; ; RETURN NO ERRORS ;  EXECUTE IOPB ; ;--------------------------------------------------------------------------- EXIOPB: ; ; MOVE HOST'S IOPMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADREAD: ; ; SWITCH JADE FDC INTO HOS ON STACK PUSH DE JP (HL) ;EXECUTE COMMAND ; ; ; IOPB COMMANDS RETURN HERE. ; THIS RETURN MUST RETURN IOPB TO HOST FOR RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT COMMAND ; (NOT IMPLEMENTE XOR A RET ;########################################################################### ; ; IOPB COMMAND EXECUTION TABB TO LOCAL ARRAY ; LD DE,PBCMD LD HL,(IOPBL) ;GET ADDRESS OF IOPB IN USER RAM LD A,H ; SET A15 OUT (HXAD15),A ; T MEMORY ; HSTOUT DDPORT,DDMRQ ; ; EXECUTE COMMAND ; CALL FDSKEX ; ; XFER DATA TO LOCAL BUFFER ; PUSH AF ;SAVE STATUS UPDATE ; XRET: PUSH AF ;SAVE POSSIBLE ERROR CODE ; ; RETURN ERROR IN IOPB ALSO (REV 1.B) ; LD (PBSTAT),A ;D) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADFORM: ;++++++++++++++++++++++++++++LES ; ;########################################################################### ; ; JADE FLOPPY CONTROLLER COMMANDS ; SET 7,H ;INSURE HOST MEMORY AREA ; LD A,(IOPBXA) ; SET BANK # OUT (HXADDR),A ; LD BC,IOPBSIZE IF FALSE CALL MOVF ERROR STATUS ; HSTOUT DDPORT,DDMB1 ;GET BANK 1 FOR SECTOR BUFFER LD HL,(FDADDR) ;GET FDC ADDRESS LD DE,JADSECB EX DE,H ; XFER LOCAL IOPB DATA TO HOST'S IOPB ; LD HL,PBCMD ;SOURCE := LOCAL IOPB IMAGE LD DE,(IOPBL) ;GET ADDRESS OF IOPB IN U+++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ ADDRESS COMMAND ; (NOT IMPLEMENTED) ; ;+++++++++++++++++++++++++ JADCMDS: DW JADLOG ;LOG ON DISK DW JADREAD ;READ SECTOR DW JADWRT ;WRITE SECTOR DW JADFORM ;FORMAT TRACK DW JADRDHST ELSE LDIR ENDIF ; ; SELECT SASI OR JADE BASED ON IOPB.PBDRV ; LD A,(PBDRV) ;IF HARD DISK CONTROLLER THEN DO ITL LD BC,128 ;FETCH SECTOR DATA XOR A CALL MOVFHST ; ; REMOVE JADE FDC WINDOW ; HSTOUT DDPORT,DDOUT ; ; XFER LOSER RAM LD A,D ; SET A15 OUT (HXAD15),A ; SET 7,D ;INSURE HOST MEMORY ; LD A,(IOPBXA) ; SET BANK # OUT (HXADDR),++++++++++++++++++++++++++++++++++++++++++++++++++ JADRDAD: ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++AD ;READ ADDRESS DW JADEXEC ;EIA OUTPUT DW JADEXEC ;EIA STATUS DW JADEXEC ;IDLE ; MAXCMDS EQU ($ - JADCMDS) / 2 H LD HL,HDCMDS CP A,HDBASD ;IF WITHIN HARD DISK DRIVES THEN EXIT JR C,CHKJAD ; CP A,HDBASD + HDNDRV JR C,XTABL ; ; CAL BUFFER DATA TO HOST ; LD HL,JADSECB CALL HDHSTW ; ; RETURN JADE ERROR STATUS TO HOST ; POP AF RET ;++++++A LD BC,IOPBSIZE IF FALSE CALL MOV2HST ELSE LDIR ENDIF ; ; RETURN ERROR STATUS TO HOST ; POP AF JP CMDRET ++++++++++++++ ; ; IDLE COMMAND ; (NOT IMPLEMENTED) ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DCMDS: DW HDLOG ;LOG ON DISK (SELECT DISK) DW HDREAD ;READ DEBLOCKED SECTOR DW HDWRT ;WRITE DEBLOCKED SECTOR DW HDFOR CHECK IF JADE CONTROLLER ; CHKJAD: LD HL,JADCMDS SUB A,JADBASD ;BIAS DOWN TOO JR C,XILDRV ;IF NOT JADE THEN DOESN'T+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE SECTOR COMMAND ; ;++++++++++++++++++++++++ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ERROR EXITS ; ;+++++++++++++++++++++++++++++++ JADEXEC: ; ; RETURN ILLEGAL COMMAND ERROR ; LD A,FERR05 SCF RET SUBTTL JADE FDC SUBR ;+++++++++++++++M ;FORMAT TRACK DW HDRECAL ;RECAL DW HDSEEK ;SEEK TRACK (NORMALLY IMPLIED) DW HDCERR DW HDDEFF ;DEFINE FLOPPY CHARAC EXIST ; CP A,JADNDRV JR NC,XILDRV ; LD (PBDRV),A ;IS JADE, OFFSET DRIVE # ; ; COMMAND EXECUTION ADDRESS TABLE SELE+++++++++++++++++++++++++++++++++++++++++++++++++++ JADWRT: ; ; XFER HOST DATA TO LOCAL BUFFER ; LD HL,JADSECB CALL HD+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ILLEGAL DRIVE REQUESTED ; XILDRV: LD A,FERR05 SCF JP CMDRE++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE COMMAND BLOCK FUNC. ; EXIT - NZ, CF= ERROR ; TERISTICS SUBTTL JADE IOPB COMMANDS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGCTED ; XTABL: ; ; IF ILLEGAL COMMAND THEN RETURN ERROR TO HOST ; LD A,(PBCMD) ;CHECK IF LEGAL CP A,MAXCMDS JR NC,XHSTR ; ; OPEN JADE FDC WINDOW ; HSTOUT DDPORT,DDMB1 ; ; XFER LOCAL BUFFER DATA TO JADE FDC BUFFER ; LD HL,(FDADDR)T ; ; ; ILLEGAL COMMAND REQUESTED ; XILCMD: LD A,FERR06 SCF JP CMDRET ;+++++++++++++++++++++++++++++++++++++++++A= 0 (NOT FIRMWARE) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FDSKEX: ; ; FORMAT DATON COMMAND IS SAME AS READ ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ JADLOG: ; ; FALILCMD ; ; VALID COMMAND. DO COMPUTED GOSUB TO COMMAND ; ADD A,A ;MULTIPLY CMD BY 2 FOR OFFSET ADD A,L LD L,A LD A EX DE,HL LD HL,JADSECB LD BC,128 XOR A CALL MOV2HST ; ; EXECUTE THE WRITE COMMAND ; CALL FDSKEX ; ; REMOVE++++++++++++++++++++++++++++++++++ ; ; RETURN FIRMWARE VERSION COMMAND ; ;++++++++++++++++++++++++++++++++++++++++++++++++++"0 ( ) *!+",#-$.%/ &0 'A ; LD A,(PBSEC) INC A ;CHANGE FROM LOGICAL ADDR TO SECTOR # LD (PBSEC),A ; ; OUTPUT IOPB TO THE CONTROLLER ; HST ; ; FETCH INTERLEAVE FACTOR FROM SECTOR DATA ; LD A,(PBSEC) ;SECTOR BYTE HAS INTERLEAVE FACTOR AND A,00011111B ;MASK OF+++++++++++++++++++++++++++++++++++++++ HDLOG: ; ; SELECT DRIVE ; CALL HDSELCT RET C ; ; IF FLAG != 0 THEN SKIP LO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; DEFINE FLOPPY DISK PARAMS COMMAND ; ;++++++FFER ; CALL HDRDBUF RET C ; ; DEBLOCK DATA BUFFER ; SELCTBUF ; ; XFER DATA TO HOST ; CALL HDHSTW ;WRITE TO HOUT DDPORT,DDMRQ ;GET BANK 0 ; LD DE,DDCMD ;CALCULATE FDC ADDRESS LD HL,(FDADDR) ADD HL,DE EX DE,HL LD HL,PBCMD LF HEAD BITS LD (IY+ILV),A ; ; SET UP CDB ; CALL GETLUN ;GET DRIVE CALL GETLAD ;GET LOGICAL ADDRESS ; ; SEND THEGON ; LD A,(PBFLG) OR A,A JR NZ,HDLOG1 ; ; INITIALIZE THE DRIVE TABLE FOR THIS DRIVE ; LD A,(LUNSV) LD (IX+DTDRV+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDDEFF: ; ; SET UP CDB FOR COMMAND ; LD IY,NULCDB OST ; ; SUCCESSFUL READ. RETURN NO ERRORS ; XOR A ;NO ERRORS RET ;+++++++++++++++++++++++++++++++++++++++++++++++D BC,PBSTAT - PBCMD XOR A CALL MOV2HST ; ; HAVE JADE FDC EXECUTE THE COMMAND ; HSTOUT DDPORT,DDEXC ;ISSUE COMMAND ; FORMAT COMMAND TO THE SASI CONTROLLER ; CALL XCDB6 RET C ; ; RESTORE INTERLEAVE BYTE OF THE CDB TO 0 ; LD (IY+ILV),),A LD (IX+DTVEC),0 LD (IX+ [DTVEC + 1]),0 LD (IX+DTFLG),0 ;ASSUME SINGLE DENSITY ; ; NOW READ THE DISK DESCRIPTOR SE;USE NUL CDB LD (IY+CMD),SCDEF ;DEFINE CMD CALL GETLUN ; ; USE SECTOR BYTE TO PASS FLOPPY DEFINITION ; LD A,(PBSEC) ++++++++++++++++++++++++++++ ; ; WRITE SECTOR COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FDSKWT: HSTIN DDPORT ;WAIT UNTIL DONE AND A,DDSHLT JR NZ,FDSKWT ; ; MOVE STATUS BYTES TO LOCAL IOPB ; HSTOUT DDPO0 ;RESTORE ILV BYTE TO 0 ; ; RETURN RESULT STATUS TO HOST ; JP GETRES ;FINISH UP ;+++++++++++++++++++++++++++++++++CTOR ; LD IY,IDRCDB CALL GETLUN CALL HDRDBUF RET C ; ; VERIFY THE SECTOR AS A LEGAL DESCRIPTOR SECTOR ; LD DE,ID LD (IY + FDD),A ;SET DEFINE BYTE TO SIDES & DENSITY ; ; SEND THE COMMAND TO THE SASI CONTROLLER ; CALL XCDB6 RET C ; ++++++++++ HDWRT: ; ; SELECT DRIVE ; CALL HDSELCT ;IMPLIED SELECT RET C ; ; SET UP DATA TO PRE-READ SECTOR ; LRT,DDMRQ ;GET WINDOW LD BC,[PBCMD + IOPBSIZE] - PBSTAT ; XOR A CALL MOVFHST ; ; PASS ERROR STATUS TO HOST ; LD A,++++++++++++++++++++++++++++++++++++++++++ ; ; RECAL COMMAND ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++TXT LD HL,HDSECB LD B,IDSZE ; HDCKID: LD A,(DE) CP (HL) JR NZ,HDNTID ; INC HL INC DE DJNZ HDCKID ; ; ID CHE ; RETURN COMMAND STATUS TO HOST ; JP GETRES SUBTTL HARD DISK SUBROUTINES ;*******************************************D IY,LAXCDB ;USE XFER CDB CALL GETLUN CALL GETLAD ; ; PRE-READ SECTOR ; CALL HDRDBUF ;REFRESH BUFFER WITH SECTOR DAT(PBSTAT) ;IF NO ERROR THEN RETURN 0, NC OR A RET Z ; LD A,0 ;NOT FIRMWARE ERROR SCF ; BUT ERROR JUST THE SAME R+++++++++++++++++ HDRECAL: ; ; SELECT DRIVE ; CALL HDSELCT RET C ; ; CONTINUE WITH RECAL FUNCTION ; JP RECALC CKS, SET UP DATA ; LD A,(HDSECB + IDFLGO) ;FETCH FLAGS LD (IX+DTFLG),A ; ; XFER ID SETOR TO HOST BUFFER ; HDNTID: LD ******************************** ; ; ADDITIONAL INITIALIZATION CODE ; ;*****************************************************A RET C ; ; BLOCK SECTOR ; SELCTBUF ; ; XFER HOST DATA TO LOCAL BUFFER ; CALL HDHSTR ;READ HOST BUFFER ; ; ET SUBTTL HARD DISK IOPB COMMANDS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; UN ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SEEK COMMAND ; ;+++++++++++++++++++++HL,HDSECB CALL HDHSTW CALL CLRBUFR ;FLUSH BUFFER OF IOPB SECTOR (DON'T CARE) ; ; RETURN NO ERRORS TO HOST ; HDLOG1: X********************** INIT: ; ; SET DRIVE TABLE PTR TO DUMMY ; LD IX,HDDMY ; ; INITIALIZE VARIABLES WITH BASE VALUEWRITE SECTOR & RETURN STATUS TO HOST ; JP HDWRBUF ;WRITE TO DISK ;+++++++++++++++++++++++++++++++++++++++++++++++++++++SUPPORTED COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDCERR: ; ; RETURN ILLEG++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDSEEK: ; ; SELECT DRIVE ; CALL HDSELCT RET C ; ; SET UP CDOR A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ DEBLOCKED SECTOR COMMANS ; LD HL,DTIMG ;MOVE DEFAULT DRIVE TABLES TO RAM LD DE,HDDTBL LD BC,DTICNT LDIR ; LD HL,NULCDB ;ZERO CDBS LD B,CD++++++++++++++++++++++ ; ; FORMAT TRACK COMMAND ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++AL COMMAND ERROR ; LD A,FERR06 SCF RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ B DATA ; LD IY,LAXCDB ;USE XFER CDB LD (IY+CMD),SCSEEK ;SEEK COMMAND CALL GETLUN CALL GETLAD ;GET USER'S BLOCK ; ; D ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDREAD: ; ; SELECT DRIVE ; CALL HDSELBINIT INITRAM: LD (HL),0 INC HL DJNZ INITRAM ; ; RESET SASI CONTROLLER ; LD A,1 SHL SRESET OUT SASICMD,A ; EX++++ HDFORM: ; ; SELECT DRIVE ; CALL HDSELCT RET C ; ; SET UP FOR FORMAT ; LD IY,LAXCDB LD (IY + CMD),SCFMTT  ; ; DRIVE SELECT/LOG-ON COMMAND ; CHECK DRIVE READY ; ENTRY- (PBFLG)= 0: FULL LOG ; ;++++++++++++++++++++++++++++++++++++ SEND THE COMMAND TO THE SASI CONTROLLER ; CALL XCDB6 RET C ; ; RETURN THE COMMAND STATUS TO HOST ; JP GETRES ;CT RET C ; ; SET UP FOR READ ; LD IY,LAXCDB ;USE XFER CDB CALL GETLUN CALL GETLAD ; ; READ SECTOR INTO LOCAL BU#0 ( ) *!+",#-$.%/ &0 ' (SP),HL ;GIVE A LITTLE EXTRA TIME EX (SP),HL ; LD A,1 SHL SERRCLR ;RELEASE RESET OUT SASICMD,A ; ; FLUSH SECTOR BUFUFFER CONTAMINATED. FLUSH DOWN DRAIN LD A,FERR08 ; UNKNOWN CONDITION, USE HANDSHAKE SCF RET ;+++++++++++++++++++++++++++++++++++++++++ ; ; SELECT ERROR EXIT ; EXIT- IX= DUMMY TABLE PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SASI DONE. RETURN COMMAND RESULTS STATUS ; JP GETRES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ AND A,SSXMSK ; IF DATA READY THEN GET IT CP A,SSNDDAT JP Z,HDRD2 ; CP A,SSNDST ; ELSE IF NOT READY FOR STATUS THEN EFER ; CALL CLRBUFR ;START WITH FRESH BUFFER READ ; ; INITIALIZE JADE FDC ADDRESS PTR ; HSTIN DDPORT ;FETCH FDC ADDRE+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE HD SECTOR FROM BUFFER FUNCTION ; ENTRY- IY= CDB PTR ; CDB= +++++++++++++++++++++++++ SELERR: LD IX,HDDMY ;IF DRIVE SELECT ERR THEN POINT TO DUMMY RET ; RETURN SELECT ERROR ;+++++++++++++++++ ; ; QUERY BUFFER THE SAME FUNCTION ; EXIT - ZF= SAME ; NZ= NOT SAME ; ;++++++++++++++++++++++++++++++++RR JR NZ,HDRWFER ; ; READ COMMAND DONE. GET COMMAND STATUS ; HDRDDN: CALL GETRES ; ; MAKE BUFFER = DISK ADDRESS ; SS AND A,DDSASW RLCA OR A,HIGH DDBASE LD H,A LD L,0 LD (FDADDR),HL ; ; DONE. RETURN TO MAIN CODE ; RET ;SET UP ; EXIT - CF= ERROR (A= ERROR #) ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDWRBU+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ HD SECTOR INTO BUFFER FUCTION ; ENTRY- I+++++++++++++++++++++++++++++++++++++++++++ QBUFR: ; ; IF DRIVE NOT SAME THEN RETURN NZ ; LD A,(PBDRV) LD HL,BUFDRV  PUSH AF CALL NC,MAKSAME POP AF ; ; IF NO ERROR THEN RETURN ; RET NC ; ; IF ERROR THEN CHECK FOR RETRIES ; PUS+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; EXIT - CY= NC: NORMALF: ; ; SEND WRITE SECTOR COMMAND TO SASI CONTROLLER ; LD (IY+CMD),SCWRIT ;WRITE COMMAND ; LD (IY+NBK),1 ;ALLWAYS USE 1Y= CDB PTR ; CDB= SET UP ; EXIT - CF= ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CP A,(HL) RET NZ ; ; IF SECTOR NOT SAME THEN RETURN NZ ; LD DE,(PBSEC) ;NOW CHECK SECTOR OR A,A ;IF DRIVE 0 THEN SKIH AF ;SAVE ERROR CODE LD A,(RETRYS) SUB A,1 LD (RETRYS),A JR C,HDRDNOT ; ; RETRIES NOT EXHAUSTED. GO REPEAT ; PO ; CF: ERROR, A= CODE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDSELCT: ; ; I BLOCK (SECTOR) CALL XCDB6 ;SEND CDB RET C ; ; SET UP TO WRITE THE BUFFER ; LD BC,[HDBUFSZ * 256] + SASIDATA ;SET CO HDRDBUF: ; ; IF BUFFER DATA VALID THEN RETURN ; CALL QBUFR RET Z ; ; SET UP TO READ SECTOR INTO BUFFER ; LD C,1P TRACK TEST JR Z,QBBLK ; LD A,(PBTRK) ;IF TRACK 0 OF FLOPPY THEN NO BLOCKING OR A,A JR Z,QBNBLK ; QBBLK: RES 0,E ;CP AF JP HDRDRTY ; ; ; RETRIES EXHAUSTED ; HDRDNOT: ; ; BUFFER MAY BE CONTAMINATED. FLUSH IT DOWN THE DRAIN ; CALF SAME DRIVE AS LAST OPERATION THEN JUST RETURN NO ERRORS ; LD A,(PBDRV) SUB A,HDBASD AND A,00000011B SUB A,(IX+DTDRV) UNT, PORT LD HL,HDSECB ; ; PERFORM THE WRITE XFER ; HDWRLP: CALL GETSTAT ;IF READY THEN BIT SREQ,A JR Z,HDWRLP ; 0 ;ASSUME RETRIES LD HL,PBFLG ; LD A,(HL) ;IF HOST REQUESTS NO RETRY THEN RETRIES = 0 BIT PBRTRY,A JR Z,HDRTRY1 LLEAR BLOCKING BIT ; QBNBLK: LD HL,(BUFSEC) SBC HL,DE RET NZ ; ; IF TRACK NOT SAME THEN RETURN NZ ; LD DE,(PBTRK) ;LL CLRBUFR ;BUFFER CONTAMINATED ; ; RETURN THE ERROR ; POP AF RET ; ; ; STILL READING DATA ; HDRD2: INI ;*PTR+ RET Z ; ; SEE IF REQUESTED DRIVE IS READY ; LD IY,NULCDB ;USE NUL CDB LD (IY+CMD),SCRDY ;TEST READY COMMAND ; CALL AND A,SSXMSK ; IF DATA READY THEN PUT IT CP A,SGTDAT JP Z,HDWR2 ; CP A,SSNDST ; ELSE IF READY FOR STATUS THEN GET ITD C,0 HDRTRY1: LD A,C LD (RETRYS),A ; ; PASS HOST REQUEST FOR CONTROLLER RETRY DISABLE TO SASI CONTROLLER ; LD A,(HLAST, CHECK TRACK LD HL,(BUFTRK) SBC HL,DE RET ;**********************************************************************+ = SASI DATA; CNT-- JP NZ,HDRDLP ; ; ALL DATA READ ; HDRDOV: CALL GETSTAT ;IF READY THEN INPUT DATA BIT SREQ,A JR  GETLUN ;REQUEST LUN FROM USER CALL XCDB6 ;EXECUTE CDB JR C,SELERR ; CALL GETRES ;GET RESULT BYTE JR C,SELERR ; ;  JP NZ,HDRWFER ; ELSE UNKNOWN CONDITION! ; JP GETRES ; ; ; STILL XFER'G DATA ; HDWR2: OUTI ;SASI DATA = *PTR++; ) RLA OR A,(HL) AND A,80H LD (IY + RTY),A ; ; SEND READ SECTOR COMMAND TO SASI CONTROLLER ; HDRDRTY: LD (IY+CMD)***** ; ; CLEAR BUFFER SUBR ; ;*************************************************************************** CLRBUFR: ; ; Z,HDRDOV ; AND A,SSXMSK CP A,SSNDST ;IF READY FOR STATUS THEN GET IT JP Z,HDRDDN ; ; SASI STILL REQUESTING DATA. TREA DRIVE IS READY. SELECT DRIVE TABLE ; LD A,(LUNSV) ;SELECT DRIVE TABLE ADD A,A ADD A,A LD IX,HDDTBL LD E,A LD D,0 CNT-- JP NZ,HDWRLP ; ; XFER COUNT EXHAUSTED. CHECK IF SASI DONE ; HDWROV: CALL GETSTAT BIT SREQ,A JR Z,HDWROV ; ; ,SCREAD ;READ COMMAND LD (IY+NBK),1 ;ALLWAYS USE 1 BLOCK (SECTOR) ; CALL XCDB6 ;SEND CDB RET C ; LD BC,[HDBUFSZ * 256 JUST SET DRIVE TO NON-EXISTENT # SO FAILS COMPARE ; LD A,-1 LD (BUFDRV),A RET ;************************************T AS HANDSHAKE ERROR ; HDWASTE: CALL HDXWST ;OVERFLOW, WASTE DATA CALL GETRES ;FINISH UP ; HDRWFER: CALL CLRBUFR ;B ADD IX,DE ; ; RETURN NO ERRORS ; XOR A ;NO ERRORS RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IF SASI XFER NOT DONE THEN GO PAD DATA WITH ?? ; AND A,SSXMSK CP A,SSNDST JP NZ,HDWASTE ;IF NOT STATUS THEN WASTE DATA ] + SASIDATA ;SET COUNT, PORT LD HL,HDSECB ; HDRDLP: CALL GETSTAT ;IF NOT READY THEN WAIT BIT SREQ,A JR Z,HDRDLP ; $0 ( ) *!+",#-$.%/ &0 '*************************************** ; ; MAKE BUFFER PTRS = PB PTRS ; ;**************************************************4KX: SET 7,D ;INSURE S100 ; MOV4: EX AF,AF' ;IF HL= S100 THEN JP NZ,MOV2 ; EX DE,HL ; SWAP PTRS ; MOV2: LDI ;SIN********************************************************************** ; ; WRITE DATA TO HOST IOPB SUBR ; ENTRY- HL= SOURCE P++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RECALC: ; ; SEND RECAL COMMAND TO SASI CONTROLLER ; LD IY,NULM S100 MEMORY TO LOCAL MEMORY ; 1: XFER FROM LOCAL MEMORY TO S100 MEMORY ; ; EXIT - AF, AF'= ? ; BC= 0 ; HL= HL + B************************* MAKSAME: LD A,(PBDRV) ;BUFFER_DRIVE = CURRENT_DRIVE LD (BUFDRV),A ; LD HL,(PBTRK) ;BUFFER_TRACGLE BYTE MOVE JP NZ,MOV3 ; EX DE,HL ;SWAP BACK ; MOV3: JP PO,MOV5 ;IF DONE THEN RETURN ; EX AF,AF' ; ; IF NO ROLTR ; ;*************************************************************************** HDHSTW: ; ; SET UP DATA ; LD DE,(PBDCDB LD (IY+CMD),SCREC ;RECAL COMMAND CALL GETLUN ; CALL XCDB6 ; ; RETURN COMMAND RESULTS STATUS ; JP GETRES ;FINC ; DE= DE + BC ; ;*************************************************************************** MOVIT: ; ; SET FLAGS TO K = CURRENT_TRACK LD (BUFTRK),HL ; LD HL,(PBSEC) ;BUFFER_SECTOR = CURRENT_SECTOR & FEH RES 0,L LD (BUFSEC),HL ; RET LOVER THEN REPEAT ; BIT 7,D JP NZ,MOV4 ; ; S100 PTR ROLLED OVER 32K BOUNDARY ; LD A,I ;TOGGLE BIT 15 XOR A,80H MA) ;GET DESTINATION PTR LD A,(PBDMAX) ;SET BANK REGISTER LD BC,128 ;MOVE 128 BYTES ; ; FALL INTO MOVE ROUTINE ; ISH UP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET STATUS FUNCTION ; EXIT- A= SACCUMULATOR DATA (Z/NZ) ; EX AF,AF' OR A,A EX AF,AF' ; ; SET BIT 15 REGISTER TO PTR BIT 15 ; LD A,D ;SET BIT 15  ;*************************************************************************** ; ; READ DATA FROM HOST IOPB SUBR ; ENTRY- LD I,A OUT (HXAD15),A ; BIT 7,A ;IF TOGGLED TO 0 THEN BUMP BANK JP NZ,NO64KX ; LD A,(MOVX) INC A LD (MOVX),A OU;*************************************************************************** ; ; BLOCK MOVE TO HOST SUBR ; ENTRY- HL= LOCAL PTATUS WORD ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETSTAT: IN A,SASIST ;GET STATUS  OUT (HXAD15),A ; ; TEST MOVE BOUNDARIES ; DEC BC ;IF > 32K MOVE THEN DO LONG WAY LD A,B CP A,32768 / 256 JR NC,DOHL= DESTINATION PTR ; ;*************************************************************************** HDHSTR: ; ; SET UP FORT (HXADDR),A JP NO64KX ; ; ; MOVE DONE ; MOV5: EX AF,AF' ;BALANCE UP XOR A RET ;*****************************TR (SRC) ; DE= HOST PTR (DST) ; BC= BYTE COUNT ; A= BANK ADDRESS (DST) ; ;**********************************************WORD AND A,SSTMSK ;REMOVE UNUSED BITS XOR A,SSTINV ;INVERT SOME RET ;++++++++++++++++++++++++++++++++++++++++++++++++LONG ; LD A,E ;IF 64K CROSS THEN DO LONG WAY ADD A,C LD A,D ADC A,B JR C,DOLONG ; XOR A,D ;IF 32K CROSS THEN DO  XFER ; LD DE,(PBDMA) ;GET DESTINATION PTR LD A,(PBDMAX) ;SET BANK REGISTER LD BC,128 ;MOVE 128 BYTES ; ; FALL INTO ********************************************** ; ; WASTE OVERFLOW DATA SUBR ; ;************************************************************************** MOV2HST: ; ; SET UP EXTENDED ADDRESS REGISTER ; LD (MOVX),A ;SAVE EXTENDED ADDRESS VALUE F+++++++++++++++++++++++++++ ; ; TRANSMIT CDB FUNCTION ; ENTRY- (CDBPTR)= CDB TO XMIT ; EXIT - CF= ERROR ; BC= ? ; ;+++++LONG WAY JP M,DOLONG ; ; NO BOUNDARY CROSSING. USE BLOCK MOVE INSTRUCTION ; INC BC ;RESTORE COUNT ; SET 7,D ;INSURMOVE ROUTINE ; ;*************************************************************************** ; ; BLOCK MOVE FROM HOST SUB****************************** HDXWST: ; ; WAIT UNTIL READY FOR XFER ; CALL GETSTAT ;IF READY THEN INPUT DATA BIT SREOR BUMPING LD (HXADDR),A ; ; SET FLAGS TO XFER TO S100 ; LD A,1 OR A,A EX AF,AF' ; ; FALL INTO MOVE PRIMITIVE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XCDB6: ; ; ISSUE CONTROLLER SELECT PER SHUGART MANUAL E S100 MAP ; EX AF,AF' ;IF FROM S100 THEN JP NZ,MOV1 ; EX DE,HL ; SWAP ; MOV1: LDIR ; JP NZ,MOV6 EX DE,HL ; R ; ENTRY- HL= LOCAL PTR (DST) ; DE= HOST PTR (SRC) ; BC= BYTE COUNT ; A= BANK ADDRESS (SRC) ; ;***********************Q,A JR Z,HDXWST ; ; IF READY FOR STATUS THEN DONE. RETURN TO CALLER ; AND A,SSXMSK CP A,SSNDST RET Z ; ; ELSE X; ;*************************************************************************** ; ; MOVE SUBR CHECKS FOR A MOVE CROSSING A ; LD A,[1 SHL HDCONT] ;SELECT DB0 OUT SASIDATA,A ; LD A,[1 SHL SSELECT] OR [1 SHL SERRCLR] ;OUTPUT STROBE OUT SASICMD,SWAP BACK ; ; MOVE DONE. RETURN Z ; MOV6: EX AF,AF' XOR A RET ; ; ; LONG TRANSFER TESTS EACH BYTE FOR THRESHOLDS ;**************************************************** MOVFHST: ; ; SET UP EXTENDED ADDRESS REGISTER ; LD (MOVX),A ;SAVE EFER ANOTHER BYTE ; LD A,0E5H ;OUTPUT WILL ALSO DO FOR INPUT OUT SASIDATA,A JR HDXWST ;+++++++++++++++++++++++++++++NY 32K BOUNDARY AND SELECTING ; A FAST BLOCK MOVE IF NOT, AND A SLOWER BLOCK MOVE WHICH CHECKS AFTER EACH ; BYTE FOR AN OVERFLA ; LD BC,0 ;TIMEOUT_COUNT = 0 ; BSYWT2: CALL GETSTAT ;WAIT FOR BUSY BIT SBUSY,A JR NZ,BSYOK2 ; DEC BC LD A,C  DOLONG: INC BC ;RESTORE COUNT LD A,D ;SET UP CURRENT BIT 15 LD I,A ;SAVE IN I SINCE NOT USING MODE 2 INTERRUPTS ; NO6XTENDED ADDRESS FOR BUMPING OUT (HXADDR),A ; ; SET FLAGS TO XFER FROM S100 ; XOR A,A EX AF,AF' JP MOVIT ;*****++++++++++++++++++++++++++++++++++++++++++++++ ; ; RECALIBRATE FUNCTION ; EXIT - CF= ERROR (A= CODE #) ; ;+++++++++++++++++OW CONDITION IF TRUE. ; ENTRY- HL= LOCAL MEMORY PTR ; DE= S100 MEMORY PTR ; BC= BYTE COUNT TO TRANSFER ; AF'= 0: XFER FRO%0 ( ) *!+",#-$.%/ &0 'OR A,B JR NZ,BSYWT2 ; ; HANDSHAKE TIMEOUT! RETURN THE ERROR ; LD A,FERR07 SCF RET ; ; ; BUSY DETECTED. ; BSY* 26 = 8X + 5X * 2 ADD HL,HL ADD HL,HL ADD HL,DE ; +5X ADD HL,DE ADD HL,DE ADD HL,DE ADD HL,DE ADD HL,HL ; * 2 RET Z ; ; IF CONTROLLER PARITY ERROR THEN RETURN THE ERROR ; BIT 1,A JR Z,HDPERR ; ; ERROR ENCOUNTERED. SEND REQU###################################################### DTIMG: DB 0,0,0,01100000B ;LUN0 DB 1,0,0,0 ;LUN1 DB 2,0,0,0 ;LUN2 (LUNSV),A ;SAVE IT FOR OTHERS ; RRCA ;PUT IN PROPER FIELD RRCA RRCA LD (NULCDB + LUN), A LD (LAXCDB + LUN), A LD OK2: LD A,1 SHL SERRCLR ;REMOVE SELECT STROBE OUT SASICMD,A ; XCDB2: CALL GETSTAT ;CHECK FOR COMMAND ACCEPT BIT SREQ,A  ; LD A,(PBSEC) ;FETCH SECTOR LD E,A LD A,26 ;CHECK FOR LIMIT SUB A,E JR NC,SECOK ; PARERR: LD A,FERR10 ;ILLEGAL PEST SENSE COMMAND ; LD (IY+CMD),SCSNSE CALL XCDB6 RET C ; ; GET STATUS BYTES ; GETR1: LD HL,PBSTAT LD BC,[4 * 256 DB 3,0,0,0 ;LUN3 DB -1,0,0,0 ;DUMMY DRIVE TABLE USED ON ERROR DTICNT EQU $ - DTIMG ;#################################(IDRCDB + LUN), A ; ; RETURN CDB PTR ; LD HL,(CDBPTR) RET ;*******************************************************; WAIT FOR REQUEST JR Z,XCDB2 ; BIT SCD,A ;IF NOT COMMAND THEN ??? JR NZ,XOK ; ; CONTROLLER HANDSHAKE STATUS UNEXPECARAMETER SCF RET ; ; SECOK: ADD HL,DE ;ADD IN SECTOR ; BIT DFT0D,(IX + DTFLG) ;IF DOUBLE DENSITY THEN LESS 26 JR Z,] + SASIDATA ;4 BYTES ; GETR2: GETDATA JR NZ,GETR2 ; GETR3: CALL GETSTAT ;FINISH OUT COMMAND BIT SREQ,A JR Z,GETR3 ########################################## ; ; ID SECTOR TEXT ; ;#########################################################******************** ; ; GET LOGICAL ADDR FROM IOPB SUBR ; ENTRY- IY= CDB PTR ; IX= DRIVE TABLE PTR ; ;******************TED. SYNC ERROR ; XCDBER: LD A,FERR08 SCF RET ; ; ; GET SET TO SEND CDB ; XOK: LD BC,[6 * 256] + SASIDATA ;BYTE COHDFDOK ; LD DE,26 SBC HL,DE ; HDFDOK: LD (IY+LA0),L LD (IY+LA1),H ; ; RETURN NO ERRORS ; XOR A,A RET ; ; ;-; ; CHECK IF SENSE STATUS COMMAND ERROR (FATAL) ; IN A,(C) ;GET RESULT BYTE OF COMMAND AND A,00000011B ;IF ERROR THEN H################## IDTXT DB 'Jade DD ' IDSZE EQU $ - IDTXT IF $ >= (LOCROM + ROMSIZE) CONMSG **** ERROR! CODE TOO LARGE ********************************************************* GETLAD: ; ; SELECT ROUTINES BASED ON HARD OR FLOPPY DISK ; BITUNT IN B ; BIT SIO,A ;IF DIRECTION NOT OUT THEN SYNC ERR JR NZ,XCDBER ; PUSH IY POP HL ; ; XFER CDB TO SASI CONTR-------------------------------------------------------------------------- ; ; SET UP HARD DISK CDB ; ;---------------------ARD ERROR SCF ;ERROR ANYWAY RET Z ; ; FATAL SENSE STATUS ERROR. CAN'T GET SASI CONTOLLER TO SPILL THE BEANS ; LD A,FOR DECLARED PROM SIZE! **** ENDIF SUBTTL RAM AREA ORG LOCRAM ;######################################################## DFHARD,(IX + DTFLG) ;IF HARD DISK THEN SPLIT JR NZ,HDLAX ; ; ;------------------------------------------------------------OLLER ; XCDB3: PUTDATA ;GET CDB DATA JR NZ,XCDB3 ; ; XFER COMPLETE. RETURN NO ERRORS ; XOR A,A RET ;++++++++------------------------------------------------------ HDLAX: ; ; SET BYTE COUNT TO SECTOR SIZE ; LD HL,256 ;SECTOR SIZFERR09 ;SENSE STATUS ERROR RET ; ; ; DATA XFER PARITY ERROR ; HDPERR: XOR A,A ;CLEAR ERROR OUT (SASICMD),A LD A,1 ################### ; ; VARIABLES ; ;########################################################################### IOPBL DS--------------- ; ; FLOPPY DISK LAD CALCULATION ; ;-------------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET CONTROLLER RESULTS FUNCTION ; EXIT - CF= HARD ERRE LD (BYTCNT),HL ; ; COMPUTE LOGICAL ADDRESS FROM SECTOR, TRACK ; LD A,(PBSEC) ;FETCH SECTOR LD E,A ; LD A,(PBTRK)SHL SERRCLR OUT (SASICMD),A ; ; RETURN THE ERROR ; LD A,FERR11 ;RETURN PARITY ERROR SCF RET ;+++++++++++++++++ 1 ;LOW ADDRESS OF IOPB TO EXECUTE IOPBH DS 1 ;HIGH ADDRESS OF IOPB IOPBXA DS 1 ;BANK ADDRESS OF IOPB ;###############-- LD HL,128 ;ASSUME SECTOR SIZE OF 128 BYTES ; LD A,(PBTRK) ;IF TRACK 00 THEN USE 128 JR Z,GETLAD1 ; BIT DFDBL,(IX +OR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETRES: ; ; GET COMMAND STATUS BYTE FRO ;PICK UP TRACK LSB & PUT INTO LA0 BIT 7 SRL A ; SECTOR BIT 0 IS WASTED RR E LD (IY+LA0),E ;PHEW! LA0 DONE ; LD (IY+L++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET LUN FROM USER FUNCTION ; ENTRY- IY= CDB PTR ; EXIT - IY, ############################################################ ; ; I/O PARAMETER BLOCK SAVE AREA ; ;######################### DTFLG) ;IF SINGLE DENSITY THEN USE 128 JR Z,GETLAD1 ; ADD HL,HL ;ELSE USE 256 GETLAD1: LD (BYTCNT),HL ; LD DE,(PBTRM SASI CONTROLLER ; LD HL,RSTAT ;INSURE DESTINATION CORRECT LD C,SASIDATA GETDATA ;GET RESULT STATUS BYTE ; ; CHECKA1),A ;LA1 HAPPENS TO BE IN A ; ; RETURN NO ERRORS ; XOR A,A RET SUBTTL CONSTANTS ;###############################HL= CDB PTR ; BC, DE, AF= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETLUN: ; ; ################################################## PBCMD DS 1 ;COMMAND BYTE PBDRV DS 1 ;DRIVE BYTE PBTRK DS 2 ;TRACK # PBK) ;GET TRACK LD A,76 ;CHECK LIMITS SUB A,D JR C,PARERR ; PUSH DE ;LA = TRACK * 26 + SECTOR POP HL ADD HL,HL ;X  FOR HARDWARE PARITY ERROR ; BIT SPERR,A JR NZ,HDPERR ; ; IF NO ERROR THEN RETURN ZF ; LD A,(RSTAT) AND 00000011B ############################################ ; ; INITIAL DISK DRIVE TABLES ARE MOVED TO RAM BY INIT ; ;#####################SAVE CDB PTR ; LD (CDBPTR),IY ; ; COMPUTE DRIVE # ; LD A,(PBDRV) ;FETCH DRIVE # SUB A,HDBASD AND A,00000011B LD &0 ( ) *!+",#-$.%/ &0 'SEC DS 2 ;SECTOR #, FORMAT INTERLEAVE, FLOPPY PARAMS PBFLG DS 1 ;INPUT FLAG BYTE (LOG-ON, BLOCKING FLAGS) ; SELECT DISK å########################## ; ; SASI CONTROLLER COMMAND DESCRIPTOR BLOCKS (CDB) ; ;##########################################å# HDDTBL: DS 4 ;HD PHYSICAL DRIVE 0 DS 4 ; 1 DS 4 ; 2 DS 4 ; 3 HDDMY DS 4 ;DUMMY ; DTDRV EQU 0 ;DRIVE BY- 0: NOT SELECTED BEFORE ; BLOCKING - 0: NORMAL WRITE (READ-WRITE) ; 1: DIRECTORY WRITE (READ-WRITE) ; å################################# CDBPTR DS 2 ;PTR TO CURRENT COMMAND CDB ; NULCDB: DS 6 ;NO TRANSFER CDB LAXCDB: DS 6 ;MåTE OFFSET ; DTVEC EQU 1 ;DRIVE VECTOR OFFSET DTFLG EQU 3 ;DRIVE FLAGS OFFSET ;##########################################2: UNALLOCATED WRITE (NO READ) PBLOG EQU 0 ;LOGON REQUEST BIT PBRTRY5 EQU 6 ;RETRY 5 TIMES BIT (ALONG WITH BIT 7 SET) PBRTRåAIN XFER CDB IDRCDB DS 6 ;ID SECTOR READ CDB CDBINIT EQU $ - NULCDB ; ; CDB OFFSETS ; CMD EQU 0 ;COMMAND LUN EQU 1 ;LOGIå################################# ; ; DISCRETE VARIABLES ; ;###############################################################Y EQU 7 ;DISABLE RETRYS BIT PBDMA DS 2 ;TRANSFER ADDRESS PBDMAX DS 1 ;TRANSFER BANK ADDRESS PBSTAT DS 4 ;SENSE STATUS BåCAL UNIT NUMBER IN BITS 5..7 LA2 EQU 1 ;LOGICAL ADDRESS 2 IN BITS 0..4 LA1 EQU 2 ;LOGICAL ADDRESS 1 LA0 EQU 3 ;LOGICAL ADDRESå############ LUNSV DS 1 ;LUN # BYTCNT DS 2 ;SECTOR SIZE RETRYS DS 1 ;RETRY COUNT MOVX DS 1 ;HOST BANK ADDRESS SAVE FOR BLOCKYTES (IF ERROR) DS 2 ;SPARES IOPBSIZE EQU $ - PBCMD ;##################################################################åS 0 ILV EQU 4 ;FORMAT COMMAND INTERLEAVE FACTOR NBK EQU 4 ;XFER COMMANDS BLOCK (SECTOR) COUNT RTY EQU 5 ;RETRY FLAG 0: RETRY å MOVE SUBRS FDADDR DS 2 ;FDC ADDRESS PTR TIMOUT DS 2 ;UNSELECT SASI DELAY ;####################################################### ; ; HARD DISK SECTOR BUFFER ; ;########################################################################### HDBUFå3 TIMES, 80H: NO RETRYS LUND EQU 5 ;COPY COMMAND DEST. LUN IN BITS 5..7 LA2D EQU 5 ;COPY COMMAND DEST. LOGICAL ADDR 2 IN BITS å############################# ; ; STACK AREA ; ;##########################################################################SZ EQU 256 HDSECB DS HDBUFSZ ; RSTAT DS 1 ;COMMAND STATUS RETURNED ;BIT 1: ERROR (ISSUE SENSE COMMAND) ;BIT 5..7: LUNå0..4 FDD EQU 5 ;DEFINE FLOPPY PARAMS COMMAND ;BIT 0: 0= SINGLE SIDE, 1= DOUBLE SIDED ;BIT 1: 0= SINGLE DENSITY, 1= DOUBå# IF $ > (LOCRAM + RAMSIZE - 32) CONMSG **** ERROR! DATA TOO LARGE FOR DECLARED RAM SIZE! **** ENDIF DS 32 STACK EQU LO BUFDRV DS 1 ;BUFFER CONTENTS DRIVE BYTE BUFSEC DS 2 ;BUFFER CONTENTS SECTOR WORD BUFTRK DS 2 ;BUFFER CONTENTS TRACK WORD åLE DENSITY ;BITS 2..3: 00= 128 BYTES, 01= 256 BYTES LA1D EQU 6 ;COPY COMMAND DEST. LOGICAL ADDR 1 LA0D EQU 7 ;COPY COMMANDåCRAM + RAMSIZE END  ;########################################################################### ; ; JADE SECTOR BUFFER ; ;###################å DEST. LOGICAL ADDR 0 RTYD EQU 9 ;COPY COMMAND RETRY FLAG ERRCOD DS 1 ;################################################åå######################################################## JADSECB DS 256 ;#################################################å########################### ; ; DRIVE TABLES ; ;##########################################################################'0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå(0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå)0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå*0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå+0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå,0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå-0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå.0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå/0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå00 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå10 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå20 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå30 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå40 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå50 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå60 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå70 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå80 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå90 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå:0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå;0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå<0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå=0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå>0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå?0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå@0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååA0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååB0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååC0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååD0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååE0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååF0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååG0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååH0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååI0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååJ0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååK0 ( ) *!+",#-$.%/ &0 'ååååååååååååååååååååååååååååååååååååååååååååååååL0 ( ) *!+",#-$.%/ &0 'åååååååååååååååååååååååååååååååååååååååååååååååå