IMD 1.18: 19/12/2012 10:07:03   ååååååååååååååååDisk Descriptor20à?€ååååååååååååååå00M4åååååååååååååååååååååååååååååååååååååååååååååååååååååååååå0 %+ &, !'- "(. #)/ $*0åååååååååååååååååååååååååååååååååååååååååååååååå0 %+ &, !'- "(. #)/ $*0DCM8202 Z80€ DCM8202 Z80MDCM8200 Z80€ !"#$%DCM8200 Z80+&'(åå********************************************************* ; ; The disk controller module (DCM) resides internal to the Jade GRH ; Fix bug causing code to crash after predictable number of warm boots. ; A CALL was being made without a return in the lo; Modify module to allow EPROM at low memory & RAM at high memory. ; Add diagnostics & better error reporting. ; Add EIA I/O.  SUBTTL FIRMWARE DEFINITIONS FALSE EQU 0 TRUE EQU NOT FALSE ;======================================================== TRKS) ; ; TIMING CONSTANTS FOR 100us ; TMRFC EQU 19H ;1ST PASS TMRNC EQU 1CH ;NORMAL PASS ENDIF ;============JDDC203 DEF)*JDDC201 DEF+,FMT8201 Z80€/0123456789:;<=>FMT8201 Z80'?@AååDouble D ; Disk Controller board. This program provides a facility to read/write ; diskette sectors & format diskette tracks (gin function. ; ; 1.2 - 1 AUG 82 GRH ; ADDED RECAL FEATURE TO RECOVER FROM THE INSTANCE WHERE THE ; HEAD IS OUTSIDE TRACK  ; Change Command block structure to common IOPB structure. ; Add 5 1/4" disk hooks. ; ; 2.1 - 2 NOV 86 GRH ; Changed seek==================== ; ; ASSEMBLY TIME CONSTANTS ; ;======================================================================================================================================== ; ; INCLUDED DEFINITIONS ; ;*INCLUDE JDDLOC.DEF ;*INCLUDE FMT8200 Z80€NOPQRSTUVWXYZ[\]FMT8200 Z80^_JDDC204 DEF-.ASMBTOOLMLBBååin single & double density). ; This module sets the parameters for each drive during the "LOG-ON" ; operation. The FORMAT prog0 BUT THE SENSOR IS STILL GIVING ; THE TRACK 0 SIGNAL. IF TRK 0 SENSE IS TRUE ON ENTRY, THE ; HEAD IS STEPPED IN SEVERAL TRACK routines to allways set up new controls even if track ; is the same. This should allow the forcing of new controls to work. ==== DSIZE EQU 8 ;SIZE OF DISK DRIVES DFDFL EQU 0 ;DEFAULT DISK FLAGS IF DSIZE = 5 SDSPT EQU 16 ;SINGLE DENSITY SECTCOMIOPB.DEF ;*INCLUDE JDDDISK.DEF ;*INCLUDE JDDCONT.DEF ;*MACLIB ASMBTOOL.MLB ; ;==========================================DCM5202 Z80€CDEFGHIJKLM`abcdDCM5202 Z80Kefghiååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååram (not in this module) writes an ident- ; ification sector (T0,S1) which provides the needed information. If this ; identityS, THEN A TRK 0 SEEK IS ; PERFORMED. ; ; 1.3 - 31 AUG 83 GRH ; Add sector de-blocking algorithms for 256 byte sectors. Rem; ; 2.2 - 31 DEC 86 GRH ; Added precomp thresholds to disk table. ; Added forced interrupt to reset because FDC is not softORS PER TRK MPCST EQU 14 ;MEDIUM PRECOMP START TRACK (1/3 TRKS) HPCST EQU 27 ;HIGH PRECOMP START TRACK (2/3 TRKS) ; ; TI================================== LIST OFF *INCLUDE JDDLOC.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE JDDCONTåå TITLE DISK CONTROLLER MODULE (DCM) LIST NOCOND ;************************************************************************** sector is not present on the diskette, it is assumed to be a ; standard 8" IBM 3740 format. ; ;*****************************ove unused ; code & vars. Optimize code. ; ; 1.4 - 30 OCT 85 GRH ; Revise objects for improved include file. Add hooks forware resetable. ; and may cause a 'hang' condition. ; Add double density logon read first and if fail then try single ; denMING CONSTANTS FOR 100us ; TMRFC EQU 0CH ;1ST PASS TMRNC EQU 0EH ;NORMAL PASS ENDIF IF DSIZE = 8 SDSPT EQU 26 ;SI.DEF *MACLIB ASMBTOOL.MLB LIST ON SUBTTL MAIN FIRMWARE ;****************************************************************åå* ; ; The Disk Controller Module contains the firmware for the Jade ; Double D Disk controller board. ; ;**************************************************************** ; ; REVISION STATUS: ; ; 1.0 - 1 AUG 82 GRH ; Initial release ; ; 1.1 -  double sided ; drives. Change logon to return boolean reflecting a valid descriptor ; sector. ; ; 2.0 - 24 nov 85 grh sity read before giving up. ; VERSN EQU 0202H ; ;***************************************************************************NGLE DENSITY SECTORS PER TRK MPCST EQU 26 ;MEDIUM PRECOMP START TRACK (1/3 TRKS) HPCST EQU 52 ;HIGH PRECOMP START TRACK (2/3*********** ; ; REGISTER USAGE: ; A, B= SCRATCH ; C= 179X INVERSION CONSTANT ; DE= USED FOR R/W FLAG BY R/W SECTOR SUBR ; 0 %+ &, !'- "(. #)/ $*0DE'= SECTOR DATA FOR READ/WRITE SECTOR FUNCTIONS ; HL= PTR TO DATA XFER BY R/W SECTOR SUBR ; IX= DISK PARAMETER BLOCK PTR ; ITROLLER TIMING MODULE. ; THIS MODULE PROVIDES DELAYS WHICH ARE MULTIPLES OF 100 us. THE CONTENTS OF ; DE DETERMINES THE TOTAL ***************************************** ; ; RESTART 32 FUNCTION - COMMAND FDC ; ENTRY - A= COMMAND ; EXIT - A= A XOR C ; ******************* ; ; RESTART 48 - NOT USED ; ;***************************************************************************------- SPAR: LD HL,CMDBLK + PBSTATO ;SET COMMAND ERROR LD (HL),CMDERR RET ;****************************************** TO IT. ; EX (SP),IY RETN ;*************************************************************************** ; ; COMMANDD,0 LD E,A ;SET UP OFFSET LD HL,CMDT ;SET TABLE PTR ADD HL,DE ADD HL,DE ;DO TWICE FOR WORD PTR ; ; FETCH COMMAND R IDLE COMMANDS NCMDS EQU ($ - CMDT) / 2 ;COMMAND COUNT ;-----------------------------------------------------------------Y= 179X NMI RETURN ADDRESS ; AF'= R/W FLAGS ; BC', HL'= NOT USED ; ;********************************************************PERIOD. (DELAY= DE * 100 us). ; ENTRY- DE= 100 MICROSECOND MULTIPLIER (0= 65,536) ; EXIT - DE= A= B= 0 ; ;****************** ;**************************************************************************** ORG 32 XOR A,C OUT (WDCMD),A EX (SP),HL * ORG 48 ;**************************************************************************** ; ; RESTART 56 (MASKABLE INTERRU********************************* ; ; THIS IS THE NON-MASKABLE INTERRUPT ROUTINE USED BY THE FDC ; UPON COMMAND TERMINATION SELECTOR SUBR GETS CONTROL AFTER THE DISK CONTROLLER IS ; INTERRUPTED FROM THE HALT CONDITION. IT BRANCHES TO THE INDIVIDUAL OFFSET FROM TABLE ; LD A,(HL) ;GET ADDRESS INC HL LD H,(HL) LD L,A ; ; EXECUTE COMMAND. ALL COMMANDS RETURN TO INT----------- ; ; DRIVE LOG-ON COMMAND (0) ; READS THE IDENTITY SECTOR FROM THE DISKETTE AND MAKES THE NEEDED ENTRYS ; IN******************* ;--------------------------------------------------------------------------- ; ; JUMP IS EXECUTED WHE********************************************************** ORG 8 ;POSITION FOR RESTART 8 VECTOR ; ; USE SMALLER TIME TO O EX (SP),HL EX (SP),HL EX (SP),HL RET ;**************************************************************************** PT) FUNCTION - EXECUTE THE COMMAND BLOCK ; MASKABLE HOST INTERRUPT ROUTINE - EXECUTED WHEN RESTARTING THE LOCAL ; PROCESSOR F. THE STATUS PORT IS INTERROGATED & SAVED (SVSTS). ; ENTRY- IY= INTERRUPT RETURN ADDRESS ; EXIT - (COMMAND BLOCK STATUS)= A=  ; COMMAND ROUTINES. ; ;*************************************************************************** XCUTE: ; ; CLEAR THE ERRUPTED WAIT LOOP ; JP (HL) ;GOTO COMMAND ; ; COMMAND TABLE ; CMDT: DW LGON ;LOG-ON DRIVE DW READ ;READ SECTOR TO THE DRIVE TABLE OR DEFAULTS. THE SECTOR DATA IS ALSO LEFT IN THE SECTOR ; BUFFER FOR BIOS TO ACCESS THE DESCRIPTOR DATA IN ON THE ONBOARD Z80 IS RESET. ; ;--------------------------------------------------------------------------- ORG 0 ; XOR AFFSET CALLING TIME ; LD B,TMRFC ;SET CONSTANT DJNZ $ JP TICKE ;GOTO TICK ENTRY ; ; DELAY FOR 100 us ; TICKR: LD B; ; RESTART 40 FUNCTION - READ SECTOR ; ENTRY - HL= DATA PTR ; DE= PHYSICAL SECTOR ; EXIT - NZ= ERROR ; A, HL, B= ? ; ;ROM A HALT IN ORDER TO PROCESS A COMMAND. ; ;**************************************************************************** ORFDC STATUS ; IY= INTERRUPTED ADDRESS ; ;*************************************************************************** IF $ >HOST INTERRUPT FLOP ; IN A,(XPIRR) ; ; ASSUME NO ERROR ; XOR A,A LD (CMDBLK + PBSTATO),A LD (CMDBLK + PBST1O),A ;DW WRIT ;WRITE SECTOR DW FORM ;FORMAT TRACK DW ADDR ;READ ADDRESS DW EIAOUT ;EIA OUT DW EIAIN ;EIA IN DW IDLE ;BRDER TO FINISH THE LOG-ON ; OPERATION. ; ;---------------------------------------------------------------------------- LGON:,A ;DISABLE NMI OUT (BLCTL),A JP CLEAR ;RESET & RE-INITIALIZE Z-80 REGS ;********************************************,TMRNC ;SET NORMAL CONSTANT DJNZ $ ; ; IF MULTIPLIER NOT EXHAUSTED THEN REPEAT TIME ; TICKE: DEC DE ;COUNT -1 LD A,D**************************************************************************** ORG 40 ;POSITION CODE FOR RESTART 40D VECTOR EG 56 ;POSITION CODE FOR RESTART 56 VECTOR JP XCUTE ;-------------------------------------------------------------------- 66H ?OVRLAP NMI VECTOR,$-66H ENDIF ORG 66H ;POSITION CODE FOR NMI VECTOR LOCATION ; ; GET FDC STATUS & PUT INTO COMM ; GET FDC'S ATTENTION FOR COMMANDS ; CALL EXSTS ; ; FETCH COMMAND FROM COMMUNICATION BLOCK ; LD A,(CMDBLK + PBCMDOACKGROUND DW RETVER ;RETURN FIRMWARE VERSION DW SETFLGS ;SET DISK FLAGS DW LDHDI ;LOAD HEAD & WAIT DW SEEKTRK ;SEEK  ; ; SELECT DRIVE 1ST ; CALL SELECT RET NZ ;IF DRIVE ERROR THEN RETURN ; ; SET UP TO READ DESCRIPTOR SECTOR ; X******************************** ; ; RESTART 8 FUNCTION - 100us TIMER ; THIS SUBROUTINE IS THE ENTRY POINT FOR THE DISK CON OR A,E ;IF COUNT NOT 0 THEN REPEAT NOP NOP JR NZ,TICKR ; ; DONE ; RET ;***********************************X AF,AF' ;SET UP READ XOR A,A DEC A EX AF,AF' JP RWSECT ;*********************************************************-------- ; ; SPARE COMMAND, RETURNS COMMAND ERROR ; ;---------------------------------------------------------------------AND BLOCK FOR HOST INTERPRETATION ; IN A,(WDSTS) ;CLEARS INTERRUPT TOO XOR A,C ; ; PUT RETURN ADDRESS ON STACK & RETURN) ; ; IF ILLEGAL COMMAND THEN RETURN COMMAND ERROR ; CP NCMDS JR NC,SPAR ; ; COMPUTE COMMAND TABLE POINTER ; LD TRACK DW SETDP ;SET DISK DRIVE PARAMETERS DW RETDST ;RETURN DRIVE STATUS DW SETBAUD ;SET EIA BAUD RATES DW CLR ;CLEAOR A,A ;SET TRACK=0 LD (CMDBLK + PBTRKO),A ; LD A,2 ;SET SECTOR LD (CMDBLK + PBSECO),A ; ; SEEK TRACK ; CALL SEE0 %+ &, !'- "(. #)/ $*0K ; ; TEST IF LOGON INHIBITED ; LD A,(IX + DVLGDO) OR A,A JR NZ,NODS ; ; READ DESCRIPTOR SECTOR INTO BUFFER ;  DE,DVFLG ;COMPUTE ADDRESS OF ELEMENT CALL GETDVEL EX DE,HL ; LD HL,SBUFR + IDFLGO ;SET SIDES & DENSITIES PUSH BC LD X= PTR TO DRIVE TABLE ENTRY ; EXIT - HL= ADDRESS OF ELEMENT ; ;**************************************************************-------------------------------------------------------------- READ: LD A,-1 ;FLAG := READ OR A,A JR OPCONT ;--------------------------- ; ; FORMAT TRACK COMMAND (3) ; ;----------------------------------------------------------------------ET FORMAT FLAGS LD (IX + DVFLG),A ;RESET DRIVE FLAGS ; ; SEEK TRACK FROM COMMAND BLOCK ; CALL SEEK ; ; SET UP FOR CATUS ; NMIWT: ; ; RETURN LAST GAP BYTE COUNT ; LD (CMDBLK + PBST2O),HL ; ; MASK APPLICABLE ERRORS ; AND A,DMFER LETION VECTOR LD HL,SBUFR ;USE SECTOR BUFFER ; ; ISSUE READ ADDRESS COMMAND ; LD A,DCRDA ;ISSUE COMMAND TO FDC RST SET 0,(IX + DVFLG) ;ASSUME DOUBLE DENSITY FIRST LD HL,SBUFR ;READ INTO SECTOR BUFFER LD DE,IDSECT RST 40 JR Z,LGCHK ;IFBC,DVDFSZ LDIR POP BC ; ; RETURN NEW DESCRIPTOR FLAG ; LD A,-2 ; ; RETURN DESCRIPTOR SECTOR FLAG TO HOST ; SETF************* GETDVHLD: LD DE,DVHLDO GETDVEL: PUSH IX POP HL ADD HL,DE RET ;###################################-------------------------------------------------------------------- ; ; WRITE SECTOR COMMAND (2) ; ;--------------------------- FORM: ; ; CHECK FOR VALID DRIVER ; LD HL,(FMTBG) LD DE,0AA55H ;KEY BYTES OR A,A SBC HL,DE JR NZ,FMTINV ;OMMAND COMPLETION ; LD IY,NMIWT ;SET RETURN ADDR ; ; SET UP SIDE CONTROL AND PASS SIDE # IN D ; LD DE,(CMDBLK + PBSECO ;SET ANY ERRORS ; ; RETURN ERROR STATUS IN COMMUNICATION BLOCK ; RETERR: OR A,A ;IF NO ERROR THEN QUIT NOW RET Z ; 32 ; ; WAIT HERE FOR DATA ; RADNXT: IN A,(XPDSH) ;WAIT FOR DATA ; ; GET DATA & STORE IT ; IN A,(WDDTA) ;GET DATA  READ SUCCESSFUL THEN GO CHECK FOR ID ; RES 0,(IX + DVFLG) ;NOW TRY SINGLE DENSITY LD HL,SBUFR LD DE,IDSECT RST 40 ; FG: LD (CMDBLK + PBST2O),A RET ; ; ; ASSUME 3740 FORMAT ; I3740: ; ; SET DISK PARAMETERS TO SINGLE SIDED, SINGLE######################################## ; ; DEFAULT SINGLE SIDED - SINGLE DENSITY TABLE FOR NON ID SECTORED DISKS ; ;######------------------------------------------------------- WRIT: XOR A,A ;FLAG := WRITE OPCONT: ; ; SAVE OPERATION FLAGS  ; 3RD & 4TH BYTES CONTAIN THE CHECKSUM COUNT ; LD HL,FMTBG + 2 LD E,(HL) INC HL LD D,(HL) DEC HL ;INCLUDING THE ) LD A,D AND A,80H LD D,A ;SAVE SIDE IN D7 RRCA ;COMPUTE CONTROL BYTE RRCA LD (SIDE),A LD B,A IF DSIZE = 8 LD (CMDBLK + PBST1O),A LD A,FDCERR RETFER: LD (CMDBLK + PBSTATO),A RET ; ; FORMAT DATA ERROR ; FMTINV: LD A,FMTERR XOR A,C LD (HL),A ;STORE IT INC HL ;NEXT JP RADNXT ; ; COMMAND DONE, CHECK FOR ERRORS ; RADNMI: ; ; PASS BACK ; CHECK FOR NEW DESCRIPTOR ID TEXT ; LGCHK: LD DE,DESCID ;SET STRING PTR LD HL,SBUFR + IDLABO ;SET SECTOR BUFFER PTR TO CO DENSITY ; LD DE,DVFLG ;GET DRIVE TABLE ADDRESS CALL GETDVEL LD DE,DVSSSD EX DE,HL PUSH BC LD BC,DVDFSZ LDIR PO##################################################################### DVSSSD: DB DFDFL ;DEFAULT DRIVE FLAGS (SSSD) REPT 3 ; EX AF,AF' ;SAVE OP IN ALT REGS ; ; SELECT DRIVE 1ST ; CALL SELECT ;SELECT DRIVE ; ; IF NO ERRORS THEN SEEK TRACKEY BYTES DEC HL DEC HL LD B,0 ; ; COMPUTE CHECKSUM ; NXTCKS: LD A,(HL) ADD A,B LD B,A INC HL DEC DE LD A, JP Z,FSIDOK ; ; CHECK FOR ILLEGAL SIDE REQUEST ; IN A,(BLSTS) ;CHECK IF DRIVE CAPABLE AND A,BSTSD JP NZ,EROR ;IF NJR RETFER ;---------------------------------------------------------------------------- ; ; READ ADDRESS COMMAND (4) ;THE XFER COUNT ; LD DE,SBUFR OR A,A SBC HL,DE LD (CMDBLK + PBST4O),HL ; ; NOW TEST ERRORS ; AND A,DMRER RET Z MPARE LD B,DIDSIZ ;SET ID LENGTH ; CKNI: LD A,(DE) ;IF NOT ID THEN 3740 CP A,(HL) JR NZ,I3740 ; INC HL ;ELSE INC PTP BC ; ; RETURN INVALID DESCRIPTOR SECTOR TO HOST ; NODS: XOR A,A JR SETFFG ;**************************************DB SDSPT ;;26 SECTORS DB 0 ;;128 BYTES PER SECTOR ENDM DB MPCST,HPCST ;;PRECOMP THRESHOLDS DVDFSZ EQU $ - DVSSSD ;K ; CALL Z,SEEK ;SEEK TRACK ; ; IF SELECT OR SEEK ERROR THEN RETURN ; RET NZ ; ; SET READ PTR ; LD HL,SBUFR ;E OR A,D JP NZ,NXTCKS ; ; IF CHECKSUM NOT 0 THEN ERROR ; OR A,B JR NZ,FMTINV ; ; SELECT DRIVE 1ST ; CALL SELOT CAPABLE THEN SEEK ERROR ; FSIDOK: ENDIF LD A,(SVCTL) AND A,NOT BCDAS OR A,B CALL SETCTL ; RLC D ;PUT BIT 7  ;---------------------------------------------------------------------------- ADDR: ; ; SELECT DRIVE 1ST ; CALL SELECT ; ; ERROR ENCOUNTERED, CHECK FOR RETRY ; LD B,A ;CHECK FOR RETRYS PUSH BC CALL CHKRT POP BC JR Z,RADRTY ; ; RS INC DE DJNZ CKNI ;IF NOT DONE THEN REPEAT ; ; FOUND DESCRIPTOR SECTOR - MOVE DISK FORMAT DATA TO DRIVE TABLE ; LD************************************* ; ; RETURN ADDRESS OF DRIVE TABLE ELEMENT FUNCTION ; ENTRY- DE= OFFSET OF ELEMENT ; I---------------------------------------------------------------------------- ; ; READ SECTOR COMMAND (1) ; ;-------------- ; FETCH SECTOR DATA ; LD DE,(CMDBLK + PBSECO) JP RWSECT ;---------------------------------------------------------ECT RET NZ ;IF ERROR THEN RETURN ; ; SET DISK FLAGS TO DATA IN FLAGS BYTE OF COMMAND BLOCK ; LD A,(CMDBLK + PBFLGO) ;GINTO BIT 0 ; ; EXECUTE CODE IN BUFFER ; JP FMTPS ;ENTER PAST THE VALIDATION BYTES ; ; COMMAND DONE, RETURN FORMAT ST RET NZ ; ; RETRY COUNT = 0 ; XOR A,A LD (ERRCT),A ; ; SET UP FOR XFER ; RADRTY: LD IY,RADNMI ;SET COMMAND COMPHARD ERROR, RETURN IT ; LD A,B JP RETERR ;----------------------------------------------------------------------------0 %+ &, !'- "(. #)/ $*0 ; ; EIA OUTPUT COMMAND (5) ; ;---------------------------------------------------------------------------- EIAOUT: ; ;** SETCTL: LD (SVCTL),A ;STORE VALUE ; ; ENTRY WITHOUT SAVE ; SETCTL1: LD B,A ;SAVE ORIGINAL VALUE LD A,(EIACTL) O NOP AND A,A CALL BITOUT ; ; MAKE EIA BIT STATIC ; XOR A,A LD (EIACTL),A ; RET ;-------------------------ELSE RESET INTERRUPT REQUEST & EXIT RET ;---------------------------------------------------------------------------- ;  DRIVE TABLE ; CALL SELECT RET NZ ; ; TEST FOR COMMAND ERROR ; LD A,(CMDBLK + PBFLGO) CP A,4 JP NC,SPAR ; ; ;KICK UNLOAD TIMEOUT IN PANTS IN A,(BLSTS) ;CHECK FOR INTERRUPT AND A,BSINT JR Z,LDHDI2 ; IN A,(XPIRR) ;CLEAR PENDING ICOMMAND ERROR ; LD A,(CMDBLK + PBFLGO) CP A,2 JP NC,SPAR ; ; SET UP FOR XFER ; CALL GETDVHLD LD DE,SBUFR PUSH ------------------ ; ; SET EIA BAUD RATES COMMAND (14) ; ;---------------------------------------------------------------- TEST FOR BAUD RATE == 0 (BIT OUTPUT ONLY) ; LD A,(BAUDOUT) OR A,A JR NZ,EIAO3 ; ; STATIC OUTPUT OPTION - OUTPUT THR A,B OUT (BLCTL),A RET ; ; ; WAIT UNTIL READY TO ACCEPT CHARACTER ; EIAO3: IN A,(BLSTS) ;IF NOT READY THEN WAIT --------------------------------------------------- ; ; EIA INPUT COMMAND (6) ; ;----------------------------------------- ; RETURN FIRMWARE VERSION COMMAND (8) ; ;---------------------------------------------------------------------------- RETVSET UP FOR XFER ; LD DE,DVFLG ;FETCH PTR CALL GETDVEL LD DE,SBUFR ; ; DETERMINE DIRECTION ; BIT 0,A JR NZ,RETFLGNTERRUPT RET ;---------------------------------------------------------------------------- ; ; SEEK TRACK COMMAND (11BC LD BC,TMSIZ ; ; DECIDE WHETHER SET OR RETURN DATA ; OR A,A JR NZ,RETDP ; EX DE,HL ; RETDP: LDIR ; ; IN AN------------ SETBAUD: LD A,(CMDBLK + PBST5O) ;FETCH BAUD RATE DATA ; ; IF RATE == -1 THEN RETURN CURRENT RATE ; INC A E NEW BIT ; LD A,(CMDBLK + PBST5O) ;FETCH DATA BIT CPL ;COMPENSATE FOR DATA INVERSION AND A,1 ;MASK OUT UNUSED BITS EI ;ALLOW BREAK AND A,BSEIA JR Z,EIAO3 ; DI ;NO MORE WHILE OUTPUTTING DATA ; ; FETCH CHARACTER FROM CMD BLOCK ; ----------------------------------- EIAIN: ; ; TEST STATUS BIT ; IN A,(BLSTS) AND A,BSEIA ; ; IF BIT == 0 THEN RETER: LD HL,VERSN LD (CMDBLK + PBST2O),HL RET ;--------------------------------------------------------------------------S ; EX DE,HL ; RETFLGS: PUSH BC LD BC,DVDFSZ LDIR POP BC ; ; SELECT LOGON OPTION ; BIT 1,A LD A,0 JR NZ,) ; ;---------------------------------------------------------------------------- SEEKTRK: CALL SELECT CALL Z,SEEK RET Y CASE, TRANSFER TO CURRENT VALUES ; CALL GETDVHLD LD DE,TMHLD LD BC,TMSIZ LDIR POP BC RET ;------------------ JR NZ,SETBD3 ; LD A,(BAUDOUT) LD (CMDBLK + PBST5O),A RET ; ; ; IF OUT OF RANGE THEN RETURN ERROR ; SETBD3: DEC AREPT 3 RLCA ENDM LD (EIACTL),A ; ; USE EXISTING CONTROLS ; LD A,(SVCTL) ; FALL INTO SAVE CONTROL ;*********** LD A,(CMDBLK + PBST5O) ;FETCH CHARACTER CPL ;OUTPUT PORT IS INVERTED LD E,A ; ; SET UP ; LD HL,BAUDOUT ;BAUD RATEURN 0 ; JR Z,EIAI1 ; ; ELSE RETURN -1 ; LD A,-1 EIAI1: LD (CMDBLK + PBST2O),A RET ;----------------------------- ; ; SET DISK PARAMETERS COMMAND (9) ; ENTRY- PBFLG= 0: SET PARAMETERS FROM SECTOR BUFR & DISABLE LOGON ; 1: RETURN PASF1 ; INC A ; SF1: LD (IX + DVLGDO),A ; RET ;---------------------------------------------------------------------- ;---------------------------------------------------------------------------- ; ; SET DRIVE PARAMETERS COMMAND (12) ; ---------------------------------------------------------- ; ; RETURN DRIVE STATUS COMMAND (13) ; ;----------------------- CP A,MAXBAUD JR C,SETBD1 ; ; ARGUMENT ERROR, RETURN IT ; SETBD2: LD A,BRERR JP RETFER ; ; FETCH BAUD RATE ; S**************************************************************** ; ; SET CONTROL PORT SUBROUTINE ; ENTRY- A= VALUE TO SET TO  DIVISOR PTR LD A,(SVCTL) ;LAST CONTROLS USED ; ; SEND THE START BIT ; SCF CALL BITOUT NOP NOP LD D,8 ;DATA BI------------------------------------------------- ; ; IDLE COMMAND (7) ; ;------------------------------------------------RAMETERS IN SECTOR BUFR & DISABLE LOGON ; 2: SET PARAMETERS FROM SECTOR BUFR & ENABLE LOGON ; 3: RETURN PARAMETERS IN SECT------ ; ; LOAD HEAD & IDLE COMMAND (10) ; ;---------------------------------------------------------------------------- ENTRY- PBFLG= 0: SET PARAMETERS FROM SECTOR BUFFER ; 1: RETURN PARAMETERS IN SECTOR BUFFER ; ;--------------------------------------------------------------------------------- RETDST: ; ; SELECT DRIVE ; CALL SELECT RET NZ ; ; RETURN DRIETBD1: LD HL,BAUDS ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ; ; IF ILLEGAL BAUD RATE THEN RETURN ERROR ;  ; EXIT - A= VALUE WITH EIA BIT INCLUDED ; B= ? ; ;*************************************************************************T COUNT ; ; SEND EACH DATA BIT (39 CYCLE LOOP) ; EIAO1: RRC E CALL BITOUT DEC D JP NZ,EIAO1 ; ; SEND STOP BIT ;---------------------------- IDLE: IN A,(BLSTS) ;IF NO HOST INTERRUPT THEN WAIT AND A,BSINT JR Z,IDLE ; IN A,(XPIRR) ;OR BUFR & ENABLE LOGON ;---------------------------------------------------------------------------- SETFLGS: ; ; SELECTLDHDI: CALL SELECT RET NZ ; ; LOAD HEAD ; LD E,DCHDL CALL EXHEAD ; ; WAIT FOR INTERRUPT ; LDHDI2: IN A,(XPMTX) ------------------------------------------------ SETDP: ; ; SELECT DRIVE TABLES ; CALL SELECT RET NZ ; ; TEST FOR VE STATUS DATA ; IN A,(BLSTS) LD (CMDBLK + PBST2O),A RET ;---------------------------------------------------------- INC A JR Z,SETBD2 ; ; ELSE STORE NEW BAUD RATE ; DEC A LD (BAUDOUT),A RET BAUDS: IF DSIZE = 8 DB 0,-1,248,0 %+ &, !'- "(. #)/ $*0121,57,25,9 ELSE DB 0,248,121,57,25,9,-1 ENDIF MAXBAUD EQU $ - BAUDS ;----------------------------------------------ELAY FOR BAUD RATE ; LD B,(HL) DJNZ $ RET ;*************************************************************************ENT DRIVE ; LD A,(SVCTL) ;DESELECT CURRENT DRIVE, AND A,[NOT BCDSE] CALL SETCTL ; ; IF REQUESTED DRIVE NOT LEGAL THEND: CALL GETDVHLD LD DE,TMHLD PUSH BC LD BC,TMSIZ LDIR POP BC ; ; IF MOTOR OFF THEN START MOTOR ; SELEN: IN A,(********************************************************** HOMED: ; ; IF NOT ALREADY ON TRACK 0 THEN SKIP RECALIBRATE ;  IF > MAX TRACKS THEN RECAL ERROR ; DEC L ;IF STEPS = 255 THEN ERROR JR Z,EROR ; ; STEP ONCE ; IN A,(XPSTP) ;ISSUE *********************************************** SEEK: ; ; IF HEAD NOT LOADED THEN LOAD HEAD ; CALL EXSTS AND A,DMHDL  A,(SVCTL) OR A,BCDAS CALL SETCTL JR STEPS ; ; STEP OUT REQUIRED ; SOUT: ; ; COMPUTE TRACK COUNT ; NEG ;COM------------------------------ ; ; CLEAR COMMAND (15) ; ;-----------------------------------------------------------------** ; ; THIS SUBROUTINE IS RESPONSIBLE FOR SELECTING THE COMMAND REQUESTED DRIVE ; #. BEFORE DRIVE SELECTION, THE DRIVE MOTO RETURN ERROR ; LD A,(CMDBLK + PBDRVO) ;FETCH REQUESTED DRIVE CP A,4 JR C,SELCT1 ; LD A,SELERR OR A,A JP RETFER ;BLSTS) ;GET BOARD LEVEL STATUS AND A,BSMOF ; IN A,(XPMTX) ;ISSUE MOTOR START OR CONTINUE IN EITHER CASE ; JR Z,CKDV ; CALL EXSTS ;IF NOT TRK 0 THEN NO RECAL AND A,DMTK0 JR Z,HOME1 ; ; STEP IN 10 TRACKS TO INSURE INSIDE TRACK 0 ; LD L,STEP PULSE LD DE,(TMSTPC) ;SET DELAY RST 8 JR STEP ; ; DRIVE IS RESTORED, WAIT FOR SETTLING TIME ; EXIT: LD DE,(TMAL JR NZ,HLDD ; LD E,DCHDL CALL EXHEAD ; ; WAIT FOR HEAD SETTLING TIME ; LD DE,(TMHLD) RST 8 ; ; IF CURRENT TRACPLEMENT OFFSET ; ; IF COUNT > 127 THEN HOME, MUST BE ERROR ; JP M,HOME ; ; SET UP TO STEP OUT ; LD L,A LD A,(SVC----------- CLR: JP SLEEP ;BREAK TO START SUBTTL SUBROUTINES ;************************************************ ; ; OUTR STATE IS TESTED AND IF NEEDED, ; THEY ARE TURNED ON. ; EXIT - IX= NEW DRIVE TABLE ; AF= 0: OK, /0: ERR ; B, DE, HL= ? ; ; NOW SELECT REQUESTED DRIVE ; SELCT1: LD L,A ;SAVE NEW DRIVE LD A,(SVCTL) ;STRIP OLD DRIVE AND A,NOT (BCDSN + BCDSE); IF MOTOR STARTED AFTER TIMEOUT THEN ASSUME MOTOR ON DELAY REQUIRED ; LD DE,(TMMTO) RST 8 ; ; FETCH DRIVE READY STAT10 ;ELSE STEP IN BEYOND TRK 0 LD A,(SVCTL) ;SELECT 'IN' OR A,BCDAS CALL SETCTL ; ; STEP ONCE ; RECAL1: IN A,(XPSTP)S) ;WAIT A BIT AFTER LAST STEP RST 8 ; ; CURRENT TRACK = 0 ; XOR A,A ;SET COMPLETE FLAG & NO ERROR LD (IX+DVTRK),A ;K = REQUESTED TRACK THEN NO SEEK REQUIRED ; HLDD: LD A,(CMDBLK + PBTRKO) SUB A,(IX + DVTRK) JR Z,SKDEN ;SET UP CONTROLS ATL) AND A,NOT BCDAS ;CLEAR DIRECTION BIT CALL SETCTL ; ; STEP ONCE ; STEPS: IN A,(XPSTP) LD DE,(TMSTPC) RST 8 ; PUT EIA BIT ; ENTRY- CF= BIT TO OUTPUT ; A= BLCTL IMAGE ; HL= BAUD RATE DIVISOR PTR ; EXIT - B= 0 ; A= LAST BLCTL DATA  ;*************************************************************************** SELECT: ; ; ENABLE DRIVE SELECT & FDC INTERR OR A,L ;ADD IN NEW DRIVE OUT (BLCTL),A OR A,BCDSE ;NOW ENABLE IT CALL SETCTL ; ; SELECT NEW DRIVE TABLE ; AND US FROM FDC ; CKDV: CALL EXSTS ;SET FLAGS PER DRIVE READY AND A,DMDNR JP RETERR ;IF 0 THEN OK ;******************** LD DE,(TMSTPC) RST 8 ; ; IF NOT 10 TRACKS THEN REPEAT ; DEC L JR NZ,RECAL1 ; ; NOW STEP OUT UNTIL TRACK 0 FOUNSET TRACK VALUE ; ; RETURN NO ERROR ; RET ; ; TRACK 0 NOT FOUND ; EROR: LD A,SEEKERR ;SET FAILURE FLAG OR A,A ;SNYWAY, IN CASE CHANGED ; ; SET DIRECTION & STEP COUNT ; DSET: ; ; SAVE TRACK DIFFERENCE ; PUSH AF ; ; DELAY FOR; IF COUNT NOT EXHAUSTED THEN REPEAT ; DEC L ;IF STEPS-1 NOT 0 THEN STEP AGAIN JR NZ,STEPS ; ; WAIT FOR SETTLING TIM; ;************************************************ BITOUT: JP C,BITO1 ; ; BIT IS 0, OUTPUT 0 ; RES 3,A JP BITO2 ; UPT ; LD A,(SVCTL) OR A,BCDSE CALL SETCTL ; ; IF REQUESTED DRIVE = CURRENT DRIVE THEN OK AS IS ; LD A,(CMDBLK + PBA,BCDSN LD IX,DVTBL LD DE,DVDES ;DRIVE TABLE ARRAY SIZE ; NEXT: DEC A ;IF DRIVE = 0 THEN EXIT WITH POINTER SET JP M,SLE******************************************************* ; ; HOMED SUBROUTINE STEPS THE DISK DRIVE HEAD OUTWARD UNTIL TRACK 0D ; HOME1: LD A,(SVCTL) ;RESTORE DIRECTION AND A,NOT BCDAS CALL SETCTL ; ; SET MAX TRACKS TO STEP TO ; LD L,NBTRK ET NZ FLAG (ERROR) JP RETFER ;*************************************************************************** ; ; TRACK S STEP AFTER WRITE REQUIREMENT ; LD DE,TMSAW ;DELAY FOR STEP AFTER WRITE RST 8 ; ; RESTORE TRACK DIFFERENCE ; POP AF E ; LD DE,(TMALS) ;ELSE EXTEND LAST PULSE RST 8 ; ; SET UP TRACK DENSITY & PRECOMPENSATION LEVEL ACCORDING TO TRACK NUM; BIT IS 1, OUTPUT 1 ; BITO1: SET 3,A JP BITO2 ;EQUALIZE CLOCKS ; ; OUTPUT THE BIT ; BITO2: OUT (BLCTL),A ; ; DDRVO) SUB A,(IX + DVNBR) JR Z,SELEN ; ; UNLOAD HEAD ON CURRENT DRIVE ; LD E,DCHDU CALL EXHEAD ; ; DESELECT CURRD ; ADD IX,DE ;ELSE POINT TO NEXT ARRAY & REPEAT JR NEXT ; ; IX NOW HAS DRIVE TABLE PTR, INITIALIZE DRIVE DATA ; SLE FLAG IS ; TRUE OR 255 STEPS HAVE BEEN ISSUED. ; EXIT - AF= 0: OK, /0: TRK 0 NOT FOUND ; B, DE, HL= ? ; ;*****************;SET MAX COUNT ; ; IF ON TRACK 0 THEN DONE ; STEP: CALL EXSTS ;IF ON TRACK 0 THEN EXIT AND A,DMTK0 JR NZ,EXIT ; ; EEK SUBROUTINE ; EXIT - DENSITY & PRE-COMP CONTROLS SET ; ZF= OK, NZ= ERROR ; B, DE, L= ? ; ;**************************** ; ; IF REQUESTED < CURRENT TRACK THEN STEP OUT ; JR C,SOUT ;CARRY=STEP OUT ; ; ELSE STEP IN ; LD L,A ;COUNT LDBER ; SKDEN: LD E,BCSDS + BCPCL ;USE SD, PRECOMP LOW AS DEFAULTS ; ; IF TRACK 0 THEN USE DEFAULTS ; LD A,(CMDBLK + PBTR0 %+ &, !'- "(. #)/ $*0KO) ;IF TRACK 0 THEN USE DEFAULTS CP A,1 JR C,TRK0 ; ; IF TRACK 1 THEN DO TRACK 1 ; JR Z,TRK1 ; ; IF DATA TRACKS D THEN USE DEFAULTS JR Z,CTLS ; ; USE DOUBLE DENSITY, LOW PRECOMP ; T1DD: LD E,BCDDE + BCPCL ; ; SET CONTROLS ; CT= ? ; ;*************************************************************************** EXHEAD: ; ; USE RETURN ADDRESS FOR INTT STATUS COMMAND TO 1791 RST 32 ; ; RETURN FDC STATUS ; IN A,(WDSTS) XOR A,C RET ;****************************;USE BIT 15 FOR SIDE SELECT AND A,80H RRCA ;SHIFT INTO CONTROLS BIT RRCA LD (SIDE),A IF DSIZE = 8 JP Z,SIDOK ;  COMMAND TO FDC ; OPOK: EX AF,AF' ;RE-SAVE MODE LD A,(SIDE) ;COMPUTE SIDE FLAG FOR FDC RRCA RRCA RRCA RRCA OR A,B ; ; IF WRITE MODE THEN USE WRITE ERROR MASK ; EX AF,AF' JR NZ,RWMSK ; LD B,DMWER ;WRITE ERR MASK ; ; RETURN OP ;**************************************************************************** ; ; CHECK FOR RETRYS SUBROUTINE ; EXIT - A=ARE SINGLE DENSITY THEN USE DEFAULTS ; BIT DFDTDB,(IX + DVFLG) JR Z,CTLS ; ; *** MUST BE DOUBLE DENSITY IF MADE IT TO HLS: LD A,(SVCTL) ;ADD DENSITY, PRECOMP BITS TO CONTROL BITS AND A,NOT (BCDDE + BCPCA + BCPCB) ;CLEAR BITS 1ST OR A,E LD (IERRUPT RETURN ; POP IY ;IY=RETURN ADDR ; ; PUT TRACK # INTO DATA REGISTER ; IN A,(WDTRK) ;PERFORM SEEK TO CURRENT TRA************************************************ ; ; READ/WRITE SECTOR SUBROUTINE INITIATES DISK XFER, SEVICES THE CONTROLLE ; CHECK FOR ILLEGAL SIDE REQUEST ; IN A,(BLSTS) ;CHECK IF DRIVE CAPABLE AND A,BSTSD JP NZ,EROR ;IF NOT CAPABLE THEN S ;OUTPUT READ SECTOR COMMAND RST 32 ; ; SELECT DIRECTION ; EX AF,AF' ;IF WRITE OP THEN GO DO IT JR Z,WROP ; EX AERATION STATUS ; RWMSK: EX AF,AF' ;RE-SAVE MODE ; POP AF ;179X STATUS AND A,B RET Z ; ; SAVE THIS ERROR IN CASE R 0: OK, /0: HARD ERROR OR RETRYS EXHAUSTED ; ;**************************************************************************** CHERE *** ; ; IF TRACK < MEDIUM THRESHOLD THEN DO SAME AS TRACK 1 ; CP A,(IX + DVPCM) JR C,T1DD ; ; IF {TRACK < HIGH X + DVCTL),A ; ; SET CONTROLS ; EXITS: CALL SETCTL ; ; SET CURRENT TRACK ; LD A,(CMDBLK + PBTRKO) ;SET REQUESTED TRCK WITH HEAD LOAD OUT (WDDTA),A ; ; OUTPUT PASSED COMMAND TO FDC ; LD A,E ;OUTPUT PASSED COMMAND XOR A,C OUT (WDCMR ; CHIP DURING DATA XFER, & TERMINATES OPERATION WHEN FINISHED. ERROR ; DETECTION IS IMPLEMENTED & RETRIES ARE EXECUTED IF DAEEK ERROR ; SIDOK: ENDIF ; ; COMPUTE CONTROLS ; RWRTRY: LD HL,(RWPTR) ;RESTORE THE XFER PTR ; LD A,(SIDE) LD F,AF' ;RE-SAVE MODE ; ; READ DIRECTION ; RDREPT: ; ; OUTPUTTING TO THIS PORT GENERATES A CPU 'WAIT' UNTIL FDC READY ETRYS EXHAUSTED ; LD B,A PUSH BC ; ; SAVE SECTOR ; PUSH DE ; ; IF RETRYS NOT EXHAUSTED THEN RETRY ; CALL CHKRKRT: ; ; IF ERROR IS DRIVE NOT READY THEN HARD ERROR ; AND A,DMDNR RET NZ ; ; IF NO RETRYS ALLOWED THEN RETURN HARDTHRESHOLD} THEN DO MIDDLE VALUES ; CP A,(IX + DVPCH) LD E,BCDDE + BCPCM ;USE DOUBLE DENSITY, MEDIUM PRECOMP JR C,CTLS ;ACK LD (IX + DVTRK),A XOR A,C OUT (WDTRK),A ;SET TRACK REGISTER ; ; RETURN NO ERRORS ; XOR A,A ;SET Z FLAG RET D),A ; ; WAIT FOR FDC INTERRUPT ; JR $ ;WAIT FOR INTERRUPT ;*******************************************************TA ERRORS ARE DETECTED. ; ENTRY - D= 0: WRITE, /0: READ ; HL= XFER PTR ; DE'= PHYSICAL SECTOR # {1..N} (D15= SIDE BIT) ; EB,A LD A,(SVCTL) AND A,NOT BCDAS OR A,B CALL SETCTL ; ; SET FDC SECTOR REGISTER ; LD A,E XOR A,C OUT (WDSEC),; IN A,(XPDSH) ; ; FDC READY, XFER DATA ; IN A,(WDDTA) XOR A,C LD (HL),A INC HL ;PTR +1 JR RDREPT ; ; OPERT POP DE POP BC ;FDC ERROR JR Z,RWRTRY ; ; RESTORE ERROR & RETURN IT ; LD A,B JP RETERR ; ; EXECUTION OF NEX ERROR ; LD A,(CMDBLK + PBFLGO) AND A,1 SHL PBFNRB RET NZ ; ; KICK MOTOR ON IN THE PANTS AGAIN ; IN A,(XPMTX) ;  ; ELSE DO INNER VALUES ; LD E,BCDDE + BCPCH ;USE DOUBLE DENSITY, HIGH PRECOMP JR CTLS ; ; ; TRACK 0 ; TRK0: BIT; ; CALIBRATE TRACK # ; HOME: CALL HOMED ;HOME SELECTED DRIVE JP HLDD ;NOW SEEK TRACK ;*********************************************** ; ; GET STATUS SUBROUTINE ; EXIT - A= 1791 STATUS ; ;***********************************************XIT - NZ= ERROR ; HL, A, B= ? ; ;**************************************************************************** RWSECT: ; A ; ; SET FDC INTERRUPT RETURN VECTOR ; LD IY,RWNMI ;SET NMI VECTOR FOR RETURN ; ; DEFAULT TO READ MODE ; LD B,DCRATION DONE, CHECK STATUS ; RWNMI: ; ; PASS BACK THE XFER COUNT ; PUSH DE LD DE,(RWPTR) OR A,A SBC HL,DE POP DE T INSTRUCTION GENERATES A WAIT CONDITION UNTIL FDC READY ; WROP: EX AF,AF' ;RE-SAVE MODE ; REPTW: IN A,(XPDSH) ;HOLD FOR DA; BUMP ERROR COUNT ; LD A,(ERRCT) INC A LD (ERRCT),A ; ; IF HALF OF RETRYS EXHAUSTED THEN TRY RECALIBRATE ; CP A DFT0DB,(IX + DVFLG) ;IF SD THEN USE DEFAULTS JR Z,CTLS JP T1DD ; ; ; TRACK 1 ; TRK1: BIT DFT1DB,(IX + DVFLG) ;IF S************************************************ ; ; HEAD LOAD/UNLOAD SUBROUTINES ; ENTRY - E= HEAD COMMAND ; EXIT - IY, A**************************** EXSTS: ; ; ISSUE TERMINATE FDC OPERATION & READ FDC STATUS COMMAND ; LD A,DCSTS ;OUTPUT SE; SAVE THE XFER PTR ; LD (RWPTR),HL ; ; CLEAR ERROR COUNT ; XOR A,A LD (ERRCT),A ; ; SELECT SIDE ; LD A,D DS ; ; IF WRITE OPERATION THEN SET WRITE MODE ; EX AF,AF' OR A,A JR NZ,OPOK ; LD B,DCWRS ;WRITE OP ; ; OUTPUT LD (CMDBLK + PBST4O),HL ; ; ASSUME READ ERROR MASK ; LD B,DMRER ;IF NO ERRORS THEN RETURN PUSH AF ;SAVE 179X STATUSTA REQ ; ; OUTPUT DATA TO FDC ; LD A,(HL) XOR A,C OUT (WDDTA),A ; ; POINT TO NEXT DATA ; INC HL JR REPTW ,RTYSK JR NZ,CKLS ; CALL HOMED ;HOME SELECTED DRIVE CALL Z,SEEK ;RE-SEEK DESIRED TRACK RET NZ ;IF ERROR THEN EXIT ;0 %+ &, !'- "(. #)/ $*0 ; IF RETRYS EXHAUSTED THEN RETURN ERROR ; CKLS: CP A,RTYLS JR Z,STNZ ; ; DELAY A WHILE FOR PLL RECOVERY & RETURN WIT A,(BLSTS) AND A,BSUS0 JR NZ,STOP ; ; IF INVERTED THEN SET REGISTER TO XOR DATA WITH 0FFH ; DEC C ; ; SET DRIVE TMER: LD A,RAMERR POP BC ;RESTORE FDC POLARITY JR SETERR ; ; TEST INTERRUPT FLIP FLOP ; RTSTDN: POP BC ;RESTORE FDC DECK FDC REGISTERS LD E,A CPL OUT (WDTRK),A LD B,A EX (SP),HL ;DELAY A WHILE FOR FDC TO CATCH UP EX (SP),HL EX (SD A,00000000B RST 32 ; DFDCB2: IN A,(WDSTS) ;WAIT FOR COMMAND TO FINISH XOR A,C AND CSBSY JR NZ,DFDCB2 ; ; ALL DON########## STRUCT 0 ; ; CONTROLLER DATA ; DVNBR DS 1 ;CURRENT PHYSICAL DRIVE # DVTRK DS 1 ;CURRENT PHYSICAL TRACK # DV;HIGH PRECOMP START TRACK # ; DVSIZE DS 0 ENDM ;#######################################################################CTOR ENDM DB MPCST ;; MEDIUM PRECOMP START (1/3 TRACKS + 1) DB HPCST ;; HIGH PRECOMP START (2/3 TRACKS + 1) ENDM ; ;H NO ERRORS ; LD DE,TMPLD ;ELSE WAIT & RETURN WITH NO ERRORS RST 8 ; XOR A,A RET ; ; RETURN RETRYS EXHAUSTED (NZ) ABLE POINTER TO DUMMY ; STOP: LD IX,DTDED ;SET DRIVE TABLE PTR ; ; INITIALIZE CONTROL PORT ; XOR A,A LD (EIACTL),A ;IATA POLARITY IN A,(XPIRR) ;CLEAR INTERRUPT FF IN A,(BLSTS) ;FETCH INTERRUPT STATUS LD B,A ;SHOW IT TO HOST AND A,BSINT P),HL EX (SP),HL IN A,(WDTRK) LD D,A XOR A,B LD B,1 JR NZ,WDBAD ; IN A,(WDSEC) LD E,A CPL OUT (WDSEC),A E, SO GOING TO SLEEP ; SLEEP: LD SP,STACK EI ;DIAGNOSTICS OK, SET ALARM & GO TO SLEEP HALT ; ; WAKE-UP RETURNS HERE,SEC DS 1 ;CURRENT PHYSICAL SECTOR # DVCTL DS 1 ;LAST CONTROLS USED OFFSET DVLGDO DS 1 ;LOGON DISABLE FLAG ; ; DRIVE DATA ##### ; ; INITIAL DATA FOR RAM INITIALIZATION ; ;########################################################################## DUMMY DRIVE AS HANDLE ; DB 4,255,0,0,0 DW DFHLD,DFSTPC,DFALS,DFMTO DB 0 REPT 3 DB SDSPT,0 ENDM DB MPCST,HPCST  ; STNZ: INC A RET ;---------------------------------------------------------------------------- ; ; INITIALIZATION FNIT EIA BIT CALL SETCTL ;BASE BLCTL BITS ; ; INITIALIZE DATA AREAS FROM ROM ; PUSH BC LD HL,IDATA LD DE,DATAA LD LD A,IFFER ;PASS BACK ERROR JR Z,SETERR ; ; TEST MOTOR ON ONE-SHOT ; IN A,(XPMTX) ;TURN ON MOTOR IN A,(BLSTS) ;FET LD B,A EX (SP),HL EX (SP),HL EX (SP),HL EX (SP),HL IN A,(WDSEC) LD D,A XOR A,B LD B,2 JR Z,WDOK ; WDBAD: L SO RESTORE STACK & GO BACK TO SLEEP ; JR SLEEP SUBTTL CONSTANT DATA AREAS ;############################################; DVHLDO DS 2 ;DRIVE HEAD LOAD DELAY VALUE DVSTPO DS 2 ;DRIVE STEP MOTOR RATE VALUE DVALSO DS 2 ;DRIVE DELAY AFTER LAST STEP ## IDATA EQU $ ; ; DRIVE TABLES ; IRP #DRIVE,0,1,2,3 ; ; DRIVE TABLE FOR DRIVE #DRIVE ; DB #DRIVE ;;DRIVE # DB ;--------------------------------------------------------------------------- ; ; COMMAND BLOCK ; THIS IS THE HOST COMMROM RESET VECTOR ; THIS ROUTINE CALLS THE COLD START SUBROUTINE & RUNS THE DIAGNOSTICS. ; ;-------------------------------- BC,DATASZ LDIR ; ; INIT OTHER VARIABLES ; LD A,(BAUDS + 2) ;BAUD RATE LD (BAUDOUT),A ; ; NOW DO DIAGNOSTICS ; CH STATUS LD B,A AND A,BSMOF LD A,MTONER ;ASSUME ERROR JR NZ,SETERR ; IN A,(XPMTO) ;TURN OFF MOTOR IN A,(BLSTS) LD (CMDBLK + PBST3O),A ;PASS OUT DATA BIT ERROR (A 0= BAD) IN A,(WDSTS) ;PASS OUT FDC STATUS XOR A,C LD (CMDBLK + PBST1O),############################### ; ; DISKETTE FORMAT LABEL ; ;#############################################################VALUE DVMTOO DS 2 ;DRIVE MOTOR ON DELAY VALUE ; ; DISK FORMAT DATA ; DVFLG DS 1 ;DISK FORMAT FLAGS DVSPT0 DS 1 ;SECTORS  255 ;;LAST TRACK # (-1 = UNUSED) DB 0 ;;LAST SECTOR # DB 0C4H + #DRIVE ;;LAST CONTROLS USED DB 0 ;;0: ENABLE, /0: DISAUNICATION AREA ; ;--------------------------------------------------------------------------- REPT IOPBSZ DB 0 ENDM ; -------------------------------------------- CLEAR: ; ; SET UP HARDWARE ; LD SP,STACK ; ; SINGLE INTERRUPT MODE ; ; TEST RAM 1ST ; LD HL,BANK0 ;TEST RAM LD BC,RAMSIZ ; NXTLOC: LD A,(HL) CPL LD (HL),A CP A,(HL) CPL LD (HL),AD B,A ;PASS BACK STATUS AND A,BSMOF JR Z,SETERR ; ; TEST FDC CHIP ; DFDCBSY: LD A,DCIFI ;GET FDC'S ATTENTION FIRSTA LD A,E LD (CMDBLK + PBST4O),A LD A,D LD (CMDBLK + PBST5O),A LD A,FDCDER SETERR: LD (CMDBLK + PBSTATO),A LD A,############## DESCID DB 'Disk Descriptor ' ;NEW ID DIDSIZ EQU $ - DESCID ;##############################################PER TRACK 0 DVSSZ0 DS 1 ;SECTOR SIZE FOR TRACK 0 DVSPT1 DS 1 ;SECTORS PER TRACK 1 DVSSZ1 DS 1 ;SECTOR SIZE FOR TRACK 1 DVSPTBLE LOGON ; DW DFHLD ;;HEAD LOAD DELAY DW DFSTPC ;;STEP INTERVAL DELAY DW DFALS ;;DELAY AFTER LAST STEP DW DFMTO ;;DATASZ EQU $ - IDATA ;SIZE OF INITIALIZATION SUBTTL DATA AREA ;############################################################ IM 1 ;SINGLE INTERRUPT MODE TO RST 56 ; ; TEST FOR INVERTED BUS FDC OPTION ; LD C,0 ;DEFAULT TO NON-INVERTED DATA IN JR NZ,DRAMER ; INC HL DEC BC LD A,C OR A,B JR Z,RTSTDN JP NXTLOC ; ; RAM ERROR, RETURN ERROR TO HOST ; DRA RST 32 ; DFDCB1: IN A,(WDSTS) ;WAIT FOR RESET SEQUENCE TO FINISH XOR A,C AND CSBSY JR NZ,DFDCB1 ; IN A,(WDTRK) ;CHB ;PASS OUT TEST # LD (CMDBLK + PBST2O),A WDOK: ; ; NOW DO RECAL COMMAND THAT MAY HAVE BEEN ABORTED FROM RESET ; L############################# ; ; DRIVE TABLE OFFSETS ; ;#################################################################D DS 1 ;SECTORS PER DATA TRACKS DVSSZD DS 1 ;SECTOR SIZE FOR DATA TRACKS DVPCM DS 1 ;MEDIUM PRECOMP START TRACK # DVPCH DS 1 MOTOR ON DELAY ; DB DFDFL ;;DEFAULT SSSD FORMAT FLAGS REPT 3 DB SDSPT ;;26 SECTORS PER TRACK DB 0 ;;128 BYTES PER SE################ ; ; BANK 0 ; ;############################################################################ ORG BANK0  0 %+ &, !'- "(. #)/ $*0; ; FORMAT DRIVER BUFFER ; DS 512 ;FORMAT DRIVER BUFFER ; ; LOCAL DATA ; ORG BANK0 + 2F0H ; ; STACK GROWS TO* UNINITIALIZED DATA OVERLAPS INITIALIZED DATA! **** ENDIF ORG BANK0 + DDCBO - (DVSIZE * 5) ;POSITION BLOCK DATAA EQU $ ######### ORG BANK1 SBUFR EQU $ ;PHYSICAL SECTOR BUFFER END ********************************************************* ; ; The disk controller module (DCM) resides internal to the Jade GRH ; Fix bug causing code to crash after predictable number of warm boots. ; A CALL was being made without a return in the lo; Modify module to allow EPROM at low memory & RAM at high memory. ; Add diagnostics & better error reporting. ; Add EIA I/O. NCLUDED DEFINITIONS ; ;*INCLUDE JDDLOC.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDDISK.DEF ;*INCLUDE JDDCONT.DEF ;*MACLIB ASMB ;-------------------------------------------------------------------- ; ; JUMP IS EXECUTED WHEN THE ONBOARD Z80 IS RESET. WARD FORMAT BUFFER ; STACK EQU $ SIDE DS 1 ;SIDE SAVE {0,80H} ERRCT DS 1 ;RETRY COUNT {0..9} SVCTL DS 1 ;LAST BLCTL OUTPU; ; DRIVE TABLES ; DVTBL DS DVSIZE * 4 DTDED DS DVSIZE ;DUMMY DVDES EQU DVSIZE ;################################### ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERT TDouble D ; Disk Controller board. This program provides a facility to read/write ; diskette sectors & format diskette tracks (gin function. ; ; 1.2 - 1 AUG 82 GRH ; ADDED RECAL FEATURE TO RECOVER FROM THE INSTANCE WHERE THE ; HEAD IS OUTSIDE TRACK  ; Change Command block structure to common IOPB structure. ; VERSN EQU '20' ; ;********************************************TOOL.MLB ; ;============================================================================ LIST OFF *INCLUDE JDDLOC.DEF *INC ; ;-------------------------------------------------------------------- ORG 0 ; XOR A,A ;DISABLE NMI OUT (BLCTL),A T IMAGE EIACTL DS 1 ;EIA BIT TO OUTPUT TO CONTROL PORT BAUDOUT DS 1 ;EIA OUTPUT BAUD RATE RWPTR DS 2 ;R/W XFER POINTER ; ; ######################################## ; ; COMMAND BLOCK ; THIS IS THE HOST COMMUNICATION AREA ; ;#####################O ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A CALL COCin single & double density). ; This module sets the parameters for each drive during the "LOG-ON" ; operation. The FORMAT prog0 BUT THE SENSOR IS STILL GIVING ; THE TRACK 0 SIGNAL. IF TRK 0 SENSE IS TRUE ON ENTRY, THE ; HEAD IS STEPPED IN SEVERAL TRACK***************** SUBTTL FIRMWARE DEFINITIONS FALSE EQU 0 TRUE EQU NOT FALSE ;=======================================LUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE JDDCONT.DEF *MACLIB ASMBTOOL.MLB LIST ON SUBTTL MAIN FIRMWARE ;********JP CLEAR ;RESET & RE-INITIALIZE Z-80 REGS ;**************************************************************************** ;*** THE FOLLOWING 8 BYTES MUST BE IN THIS ORDER FOR PROPER INITIALIZATION *** ; TMHLD DS 2 ;CURRENT DRIVE HEAD LOAD DELAY TMS###################################################### CMDBLK: DS IOPBSZ ;RESERVE ENOUGH SPACE IF ($ - DATAA) <> DATASZ  ; ; RETURN DATA ; POP AF RET ;*************************************************************************** ; ; Nram (not in this module) writes an ident- ; ification sector (T0,S1) which provides the needed information. If this ; identityS, THEN A TRK 0 SEEK IS ; PERFORMED. ; ; 1.3 - 31 AUG 83 GRH ; Add sector de-blocking algorithms for 256 byte sectors. Rem===================================== ; ; ASSEMBLY TIME CONSTANTS ; ;=======================================================************************************************** ; ; REGISTER USAGE: ; A, B= SCRATCH ; C= 179X INVERSION CONSTANT ; DE= U ; RESTART 8 FUNCTION - 100us TIMER ; THIS SUBROUTINE IS THE ENTRY POINT FOR THE DISK CONTROLLER TIMING MODULE. ; THIS MODUTPC DS 2 ;CURRENT DRIVE STEP RATE TMALS DS 2 ;CURRENT DRIVE AFTER LAST STEP DELAY TMMTO DS 2 ;CURRENT DRIVE MOTOR ON DELAY TM CONMSG **** DATA INITIALIZATION PHASE ERROR **** ENDIF ;########################################################### TITLE DISK CONTROLLER MODULE (DCM) LIST NOCOND ;************************************************************************** sector is not present on the diskette, it is assumed to be a ; standard 8" IBM 3740 format. ; ;*****************************ove unused ; code & vars. Optimize code. ; ; 1.4 - 30 OCT 85 GRH ; Revise objects for improved include file. Add hooks for===================== DSIZE EQU 8 ;SIZE OF DISK DRIVES SECSIZ EQU 128 ;SIZE OF LOGICAL SECTORS IDFLD EQU 00000000B ;3740 FLSED FOR FLAG, SECTOR BY R/W SECTOR SUBR ; HL= PTR TO DATA XFER BY R/W SECTOR SUBR ; IX= DISK PARAMETER BLOCK PTR ; IY= 179X NLE PROVIDES DELAYS WHICH ARE MULTIPLES OF 100 us. THE CONTENTS OF ; DE DETERMINES THE TOTAL PERIOD. (DELAY= DE * 100 us). ; ENSIZ EQU $ - TMHLD ;SIZE OF DRIVE PARAMETERS ; ; INITIALIZED DATA ; IF $ > (BANK0 + DDCBO - (DVSIZE * 5)) CONMSG ***################ ; ; PHYSICAL SECTOR BUFFER (UP TO 1K) ; ;##################################################################* ; ; The Disk Controller Module contains the firmware for the Jade ; Double D Disk controller board. ; ;**************************************************************** ; ; REVISION STATUS: ; ; 1.0 - 1 AUG 82 GRH ; Initial release ; ; 1.1 -  double sided ; drives. Change logon to return boolean reflecting a valid descriptor ; sector. ; ; 2.0 - 24 nov 85 grh AGS DFDFL EQU 0 ;DEFAULT DISK FLAGS ;============================================================================ ; ; IMI RETURN ADDRESS ; AF'= R/W FLAGS ; BC', DE', HL'= NOT USED ; ;********************************************************** TRY- DE= 100 MICROSECOND MULTIPLIER (0= 65,536) ; EXIT - DE= A= B= 0 ; ;***************************************************** 0 %+ &, !'- "(. #)/ $*0*********************** ORG 8 ;POSITION FOR RESTART 8 VECTOR ; ; USE SMALLER TIME TO OFFSET CALLING TIME ; LD B,TMRFC RET ;**************************************************************************** ; ; RESTART 40 FUNCTION - READ SECTOR 56 VECTOR JP XCUTE ;---------------------------------------------------------------------------- ; ; SPARE COMMAND, R6H ;POSITION CODE FOR NMI VECTOR LOCATION ; ; GET FDC STATUS & PUT INTO COMMAND BLOCK FOR HOST INTERPRETATION ; IN A,(WDDS ; CALL EXSTS ; ; FETCH COMMAND FROM COMMUNICATION BLOCK ; LD A,(CMDBLK + PBCMDO) ; ; IF ILLEGAL COMMAND THEN REARE VERSION DW SETFLGS ;SET DISK FLAGS DW LDHDI ;LOAD HEAD & WAIT DW SEEKTRK ;SEEK TRACK DW SETDP ;SET DISK DRIVE PA ;IF DRIVE ERROR THEN RETURN ; ; SET UP TO READ DESCRIPTOR SECTOR ; XOR A,A ;SET TRACK=0 LD (CMDBLK + PBTRKO),A ;  DVSPT0),26 BIT DFT1DB,A LD (IX + DVSPT1),26 JR Z,LGT1OK LD (IX + DVSPT1),48 LGT1OK: BIT DFDTDB,A LD (IX + DVSPTD),26 ;SET CONSTANT DJNZ $ JP TICKE ;GOTO TICK ENTRY ; ; DELAY FOR 100 us ; TICKR: LD B,TMRNC ;SET NORMAL CONSTANT DJNZ; ENTRY - HL= DATA PTR ; E= PHYSICAL SECTOR ; EXIT - NZ= ERROR ; A, HL, B= ? ; ;*****************************************ETURNS COMMAND ERROR ; ;---------------------------------------------------------------------------- SPAR: LD HL,CMDBLK + PBSSTS) ;CLEARS INTERRUPT TOO XOR A,C LD (CMDBLK + PBST1O),A ; ; PUT RETURN ADDRESS ON STACK & RETURN TO IT. ; EX (SP),ITURN COMMAND ERROR ; CP NCMDS JR NC,SPAR ; ; COMPUTE COMMAND TABLE POINTER ; LD D,0 LD E,A ;SET UP OFFSET LD HLRAMETERS DW RETDST ;RETURN DRIVE STATUS DW SETBAUD ;SET EIA BAUD RATES DW CLR ;CLEAR IDLE COMMANDS NCMDS EQU ($ - CMDTINC A ;SET SECTOR =1 LD (CMDBLK + PBSECO),A ; ; SEEK TRACK ; CALL SEEK ; ; READ DESCRIPTOR SECTOR INTO BUFFER ;  JR Z,LGDTOK LD (IX + DVSPTD),48 ; ; RETURN JADE FORMAT DESCRIPTOR FLAG ; LGDTOK: LD A,-1 ; ; RETURN DESCRIPTOR SE $ ; ; IF MULTIPLIER NOT EXHAUSTED THEN REPEAT TIME ; TICKE: DEC DE ;COUNT -1 LD A,D OR A,E ;IF COUNT NOT 0 THEN REP*********************************** ORG 40 ;POSITION CODE FOR RESTART 40D VECTOR LD D,-1 JP RWSECT ;****************TATO ;SET COMMAND ERROR LD (HL),CMDERR RET ;******************************************************************** ; ; Y RETN ;******************************************************************** ; ; COMMAND SELECTOR SUBR GETS CONTROL A,CMDT ;SET TABLE PTR ADD HL,DE ADD HL,DE ;DO TWICE FOR WORD PTR ; ; FETCH COMMAND OFFSET FROM TABLE ; LD A,(HL) ;G) / 2 ;COMMAND COUNT ;---------------------------------------------------------------------------- ; ; DRIVE LOG-ON COM LD HL,SBUFR LD E,1 RST 40 ; ; CHECK FOR DESCRIPTOR ID TEXT ; LD DE,JADEID ;SET STRING PTR LD HL,SBUFR + IDLBLO ;SECTOR FLAG TO HOST ; SETFFG: LD (CMDBLK + PBST2O),A ; ; RETURN DISK FLAGS TO HOST AS IF DESCRIPTOR SECTOR EXISTS ; PUSH EAT NOP NOP JR NZ,TICKR ; ; DONE ; RET ;********************************************************************************************************************************** ; ; RESTART 56 (MASKABLE INTERRUPT) FUNCTION - EXECUTE THE COMMAN THIS IS THE NON-MASKABLE INTERRUPT ROUTINE USED BY THE FDC ; UPON COMMAND TERMINATION. THE STATUS PORT IS INTERROGATED & SAVEFTER THE DISK CONTROLLER IS ; INTERRUPTED FROM THE HALT CONDITION. IT BRANCHES TO THE INDIVIDUAL ; COMMAND ROUTINES. ; ;***ET ADDRESS INC HL LD H,(HL) LD L,A ; ; EXECUTE COMMAND. ALL COMMANDS RETURN TO INTERRUPTED WAIT LOOP ; JP (HL) ;GOMAND (0) ; READS THE IDENTITY SECTOR FROM THE DISKETTE AND MAKES THE NEEDED ENTRYS ; INTO THE DRIVE TABLE. THE SECTOR DATA T SECTOR BUFFER PTR TO COMPARE LD B,IDSZE ;SET ID LENGTH ; CKJI: LD A,(DE) ;IF ID NOT=JADE THEN 3740 CP A,(HL) JR NZ,CIX POP HL LD DE,SBUFR + IDFLGO LD BC,IDFSIZE - 1 LDIR RET ; ; ; CHECK FOR NEW DESCRIPTOR ID TEXT ; CKNEW: LD DE****** ; ; RESTART 32 FUNCTION - COMMAND FDC ; ENTRY - A= COMMAND ; EXIT - A= /A ; ;**************************************D BLOCK ; MASKABLE HOST INTERRUPT ROUTINE - EXECUTED WHEN RESTARTING THE LOCAL ; PROCESSOR FROM A HALT IN ORDER TO PROCESS A D (SVSTS). ; ENTRY- IY= INTERRUPT RETURN ADDRESS ; EXIT - (COMMAND BLOCK STATUS)= A= FDC STATUS ; IY= INTERRUPTED ADDRESS ***************************************************************** XCUTE: ; ; CLEAR THE HOST INTERRUPT FLOP ; IN A,(XPIRRTO COMMAND ; ; COMMAND TABLE ; CMDT: DW LGON ;LOG-ON DRIVE DW READ ;READ SECTOR DW WRIT ;WRITE SECTOR DW FORM ;FIS ALSO LEFT IN THE SECTOR BUFFER FOR ; BIOS TO ACCESS THE DESCRIPTOR DATA IN ORDER TO FINISH THE LOG-ON OPERATION. ; ;------KNEW ; INC HL ;ELSE INC PTRS INC DE DJNZ CKJI ;IF NOT DONE THEN REPEAT ; ; VALID DESCRIPTOR SECTOR FOUND, FETCH DIS,DESCID ;SET STRING PTR LD HL,SBUFR + IDLABO ;SET SECTOR BUFFER PTR TO COMPARE LD B,DIDSIZ ;SET ID LENGTH ; CKNI: LD A,(DE************************************** ORG 32 XOR A,C OUT (WDCMD),A EX (SP),HL EX (SP),HL EX (SP),HL EX (SP),HL COMMAND. ; ;**************************************************************************** ORG 56 ;POSITION CODE FOR RESTART ; ;******************************************************************** IF $ > 66H ?OVRLAP NMI VECTOR,$-66H ENDIF ORG 6) ; ; ASSUME NO ERROR ; XOR A,A LD (CMDBLK + PBSTATO),A LD (CMDBLK + PBST1O),A ; ; GET FDC'S ATTENTION FOR COMMANORMAT TRACK DW ADDR ;READ ADDRESS DW EIAOUT ;EIA OUT DW EIAIN ;EIA IN DW IDLE ;BACKGROUND DW RETVER ;RETURN FIRMW---------------------------------------------------------------------- LGON: ; ; SELECT DRIVE 1ST ; CALL SELECT RET NZK PARAMETERS ; LD A,(SBUFR + IDFLGO) ;SET SIDES & DENSITIES LD (IX + DVFLG),A ; ; SYNTHESIZE THE NEW DATA ; LD (IX +) ;IF ID NOT=JADE THEN 3740 CP A,(HL) JR NZ,I3740 ; INC HL ;ELSE INC PTRS INC DE DJNZ CKNI ;IF NOT DONE THEN REPEA 0 %+ &, !'- "(. #)/ $*0T ; LD HL,(SBUFR + IDFLGO) ;SET SIDES & DENSITIES LD (IX + DVFLG),L LD (IX + DVSPT0),H LD HL,(SBUFR + IDSPT1O) LD (IXFLAG := READ OR A,A JR OPCONT ;---------------------------------------------------------------------------- ; ; WRI ; FORMAT TRACK COMMAND (3) ; ;---------------------------------------------------------------------------- FORM: ; ; TOR BYTE OF COMMAND BLOCK ; LD A,(CMDBLK + PBSECO) ;GET FORMAT FLAGS LD (IX + DVFLG),A ;RESET DRIVE FLAGS ; ; SEEK TRAC------------------------------------------------------------- ; ; READ ADDRESS COMMAND (4) ; ;---------------------------- OR A,A SBC HL,DE LD (CMDBLK + PBST4O),HL ; ; NOW TEST ERRORS ; AND A,DMRER RET Z ; ; ERROR ENCOUNTERED, CHEC JR Z,EIAO4 ; OR A,BCEIA ;ASSUMED WRONG, CHANGE TO 1 BIT ; SETCTL: ;DOUBLES AS SUBROUTINE EIAO4: OUT (BLCTL),A LD LL BITOUT RET ;---------------------------------------------------------------------------- ; ; EIA INPUT COMMAND (6) + DVSPT1),L LD (IX + DVSPTD),H ; ; RETURN NEW DESCRIPTOR FLAG ; LD A,-2 JR SETFFG ; ; ; ASSUME 3740 FORMAT TE SECTOR COMMAND (2) ; ;---------------------------------------------------------------------------- WRIT: XOR A,A ;FLAG :=CHECK FOR VALID DRIVER ; LD HL,FMTBG ; ; 1ST BYTE MUST BE 55H ; LD A,(HL) CP A,55H JR NZ,FMTINV ; ; 2ND BYTE MK FROM COMMAND BLOCK ; CALL SEEK ; ; SET UP FOR COMMAND COMPLETION ; LD IY,NMIWT ;SET RETURN ADDR ; ; EXECUTE CODE------------------------------------------------ ADDR: ; ; SELECT DRIVE 1ST ; CALL SELECT RET NZ ; ; RETRY COUNT =K FOR RETRY ; LD B,A ;CHECK FOR RETRYS PUSH BC CALL CHKRT POP BC JR Z,RADRTY ; ; HARD ERROR, RETURN IT ; LD A(SVCTL),A ;SAVE IT TO MAINTAIN THE BIT POLARITY RET ; ; ; WAIT UNTIL READY TO ACCEPT CHARACTER ; EIAO3: IN A,(BLSTS) ;I ; ;---------------------------------------------------------------------------- EIAIN: ; ; TEST STATUS BIT ; IN A,(BL; I3740: ; ; SET DISK PARAMETERS TO SINGLE SIDED, SINGLE DENSITY ; LD A,IDFLD ;SIDE & DENSITIES FLAGS=0 LD (IX+DVFLG) WRITE OPCONT: ; ; SAVE OPERATION FLAGS ; EX AF,AF' ;SAVE OP IN ALT REGS ; ; SELECT DRIVE 1ST ; CALL SELECT ;UST BE AAH ; INC HL LD A,(HL) CP A,0AAH JR NZ,FMTINV ; ; 3RD & 4TH BYTES CONTAIN THE CHECKSUM COUNT ; INC HL L IN BUFFER ; JP FMTPS ;ENTER PAST THE VALIDATION BYTES ; ; COMMAND DONE, RETURN FORMAT STATUS ; NMIWT: ; ; RETURN  0 ; XOR A,A LD (ERRCT),A ; ; SET UP FOR XFER ; RADRTY: LD IY,RADNMI ;SET COMMAND COMPLETION VECTOR LD HL,SBUFR ;U,B JP RETERR ;---------------------------------------------------------------------------- ; ; EIA OUTPUT COMMAND (5)F NOT READY THEN WAIT EI ;ALLOW BREAK AND A,BSEIA JR Z,EIAO3 ; ; FETCH CHARACTER FROM CMD BLOCK ; LD A,(CMDBLK + STS) AND A,BSEIA ; ; IF BIT == 0 THEN RETURN 0 ; JR Z,EIAI1 ; ; ELSE RETURN -1 ; LD A,-1 EIAI1: LD (CMDBLK + PB,A LD A,26 ;ALL TRACKS = 26 SECTORS LD (IX+DVSPT0),A LD (IX+DVSPT1),A LD (IX+DVSPTD),A ; ; RETURN INVALID DESCRIPTOSELECT DRIVE ; ; IF NO ERRORS THEN SEEK TRACK ; CALL Z,SEEK ;SEEK TRACK ; ; IF SELECT OR SEEK ERROR THEN RETURN ; D E,(HL) INC HL LD D,(HL) DEC HL ;INCLUDING THE KEY BYTES DEC HL DEC HL LD B,0 ; ; COMPUTE CHECKSUM ; NXTCKS:LAST GAP BYTE COUNT ; LD (CMDBLK + PBST2O),HL ; ; MASK APPLICABLE ERRORS ; AND A,DMFER ;SET ANY ERRORS ; ; RETURNSE SECTOR BUFFER ; ; ISSUE READ ADDRESS COMMAND ; LD A,DCRDA ;ISSUE COMMAND TO FDC RST 32 ; ; WAIT HERE FOR DATA  ; ;---------------------------------------------------------------------------- EIAOUT: ; ; TEST FOR BAUD RATE == 0 (BITPBST5O) ;FETCH CHARACTER CPL ;OUTPUT PORT IS INVERTED LD E,A ; ; SET UP ; LD HL,BAUDOUT ;BAUD RATE DIVISOR LD A,(ST2O),A RET ;---------------------------------------------------------------------------- ; ; IDLE COMMAND (7) ; ;-R SECTOR TO HOST ; XOR A,A JR SETFFG ;---------------------------------------------------------------------------- ;  RET NZ ; ; SET READ PTR ; LD HL,SBUFR ; ; FETCH SECTOR DATA ; LD A,(CMDBLK + PBSECO) LD E,A ; ; RESTORE REA LD A,(HL) ADD A,B LD B,A INC HL DEC DE LD A,E OR A,D JP NZ,NXTCKS ; ; IF CHECKSUM NOT 0 THEN ERROR ; OR A, ERROR STATUS IN COMMUNICATION BLOCK ; RETERR: OR A,A ;IF NO ERROR THEN QUIT NOW RET Z ; LD (CMDBLK + PBST1O),A LD A,F; RADNXT: IN A,(XPDSH) ;WAIT FOR DATA ; ; GET DATA & STORE IT ; IN A,(WDDTA) ;GET DATA XOR A,C LD (HL),A ;STORE IT  OUTPUT ONLY) ; LD A,(BAUDOUT) OR A,A JR NZ,EIAO3 ; ; OUTPUT THE NEW BIT ; LD A,(CMDBLK + PBST5O) ;FETCH DATA BIT SVCTL) ;LAST CONTROLS USED ; ; SEND THE START BIT ; SCF CALL BITOUT NOP NOP LD D,8 ;DATA BIT COUNT ; ; SEND --------------------------------------------------------------------------- IDLE: EQU SPAR ;NOT IMPLEMENTED ; IN A,(BLSTS) ;IF ; READ SECTOR COMMAND (1) ; ;---------------------------------------------------------------------------- READ: LD A,-1 ;D FLAG ; EX AF,AF' LD D,A JP RWSECT ;---------------------------------------------------------------------------- ;B JR NZ,FMTINV ; ; SELECT DRIVE 1ST ; CALL SELECT RET NZ ;IF ERROR THEN RETURN ; ; SET DISK FLAGS TO DATA IN SECDCERR RETFER: LD (CMDBLK + PBSTATO),A RET ; ; FORMAT DATA ERROR ; FMTINV: LD A,FMTERR JR RETFER ;--------------- INC HL ;NEXT JP RADNXT ; ; COMMAND DONE, CHECK FOR ERRORS ; RADNMI: ; ; PASS BACK THE XFER COUNT ; LD DE,SBUFR CPL ;COMPENSATE FOR DATA INVERSION LD E,A ; LD A,(SVCTL) AND A,NOT BCEIA ;ASSUME A 0 BIT BIT 0,E ;NOW TEST THE BITEACH DATA BIT (39 CYCLE LOOP) ; EIAO1: RRC E CALL BITOUT DEC D JP NZ,EIAO1 ; ; SEND STOP BIT ; NOP AND A,A CA NO HOST INTERRUPT THEN WAIT ; AND A,BSINT ; JR Z,IDLE ; ; IN A,(XPIRR) ;ELSE RESET INTERRUPT REQUEST & EXIT ; RET ;-- 0 %+ &, !'- "(. #)/ $*0-------------------------------------------------------------------------- ; ; RETURN FIRMWARE VERSION COMMAND (8) ; ;---- LD L,(IX+DVFLG) LD H,(IX+DVSPT0) LD (CMDBLK + PBST2O),HL LD L,(IX+DVSPT1) LD H,(IX+DVSPTD) LD (CMDBLK + PBST4O),HL ------------------------------------------------- SETDP: ; ; SELECT DRIVE TABLES ; CALL SELECT RET NZ ; ; SAVE FLA H,(IX + DVHLDO + 1) LD (CMDBLK + PBTRKO),HL ;FETCH HEAD LOAD DELAY LD L,(IX + DVSTPO) LD H,(IX + DVSTPO + 1) LD (CMDBLK------------------------ ; ; SET EIA BAUD RATES COMMAND (14) ; ;----------------------------------------------------------1,248,121,57,25,9,-1 ELSE DB 0,248,121,57,25,9,-1,-1 ENDIF MAXBAUD EQU $ - BAUDS ;----------------------------------,A LD (SVCTL),A ; ; DELAY FOR BAUD RATE ; LD B,(HL) DJNZ $ RET ;********************************************** DRIVE ; LD A,(SVCTL) ;DESELECT CURRENT DRIVE, AND A,[NOT BCDSE] CALL SETCTL ; ; IF REQUESTED DRIVE NOT LEGAL THEN RE------------------------------------------------------------------------ RETVER: LD HL,VERSN - 3030H LD (CMDBLK + PBST2O),HL  RET ;---------------------------------------------------------------------------- ; ; LOAD HEAD & IDLE COMMAND (10) ;G ; LD A,(CMDBLK + PBFLGO) ; ; DECIDE WHETHER SET OR RETURN DATA ; OR A,A JR NZ,RETDP ; ; SET PARAMETERS ; LD + PBSECO),HL ;FETCH STEP INTERVAL LD L,(IX + DVALSO) LD H,(IX + DVALSO + 1) LD (CMDBLK + PBST2O),HL ;FETCH TIME AFTER LAS------------------ SETBAUD: LD A,(CMDBLK + PBST5O) ;FETCH BAUD RATE DATA ; ; IF RATE == -1 THEN RETURN CURRENT RATE ; ------------------------------------------ ; ; CLEAR COMMAND (15) ; ;-----------------------------------------------------********************** ; ; THIS SUBROUTINE IS RESPONSIBLE FOR SELECTING THE COMMAND ; REQUESTED DRIVE #. BEFORE DRIVE SELETURN ERROR ; LD A,(CMDBLK + PBDRVO) ;FETCH REQUESTED DRIVE CP A,4 JR C,SELCT1 ; LD A,SELERR JP RETFER ; ; NOW SE RET ;---------------------------------------------------------------------------- ; ; SET DISK FLAGS COMMAND (9) ;  ;---------------------------------------------------------------------------- LDHDI: EQU SPAR ;NOT IMPLEMENTED ;-------- HL,(CMDBLK + PBTRKO) ;FETCH HEAD LOAD DELAY LD (TMHLD),HL LD (IX + DVHLDO),L LD (IX + DVHLDO + 1),H LD HL,(CMDBLK + PBST STEP LD L,(IX + DVMTOO) LD H,(IX + DVMTOO + 1) LD (CMDBLK + PBST4O),HL ;FETCH MOTOR START DELAY RET ;------------INC A JR NZ,SETBD3 ; LD A,(BAUDOUT) LD (CMDBLK + PBST5O),A RET ; ; ; IF OUT OF RANGE THEN RETURN ERROR ; SETBD3:----------------------- CLR: JP SLEEP ;BREAK TO START SUBTTL SUBROUTINES ;**********************************************CTION, THE DRIVE MOTOR ; STATE IS TESTED AND IF NEEDED, THEY ARE TURNED ON. ; EXIT - IX= NEW DRIVE TABLE ; A= 0: OK, /0: ERLECT REQUESTED DRIVE ; SELCT1: LD L,A ;SAVE NEW DRIVE LD A,(SVCTL) ;STRIP OLD DRIVE AND A,NOT BCDSN OR A,L ;ADD IN NEW;---------------------------------------------------------------------------- SETFLGS: CALL SELECT RET NZ ; ; DECIDE IF-------------------------------------------------------------------- ; ; SEEK TRACK COMMAND (11) ; ;----------------------ECO) ;FETCH STEP INTERVAL LD (TMSTPC),HL LD (IX + DVSTPO),L LD (IX + DVSTPO + 1),H LD HL,(CMDBLK + PBST2O) ;FETCH TIME A---------------------------------------------------------------- ; ; RETURN DRIVE STATUS COMMAND (13) ; ;----------------- DEC A CP A,MAXBAUD JR C,SETBD1 ; ; ARGUMENT ERROR, RETURN IT ; SETBD2: LD A,BRERR JP RETFER ; ; FETCH BAUD RATE** ; ; OUTPUT EIA BIT ; ENTRY- CF= BIT TO OUTPUT ; A= BLCTL IMAGE ; HL= BAUD RATE DIVISOR PTR ; EXIT - B= 0 ; A= LAST R ; ;******************************************************************** SELECT: ; ; ENABLE DRIVE SELECT & FDC INTERRUPT DRIVE OUT (BLCTL),A OR A,BCDSE ;NOW ENABLE IT CALL SETCTL ; ; SELECT NEW DRIVE TABLE ; AND A,BCDSN LD IX,DVTBL  SET OR RETURN ; LD A,(CMDBLK + PBFLGO) OR A,A JR NZ,RETFLGS ; ; SET FLAGS ; LD HL,(CMDBLK + PBST2O) LD (IX+DVFL------------------------------------------------------ SEEKTRK: CALL SELECT CALL Z,SEEK RET ;-----------------------FTER LAST STEP LD (TMALS),HL LD (IX + DVALSO),L LD (IX + DVALSO + 1),H LD HL,(CMDBLK + PBST4O) ;FETCH MOTOR START DELAY ----------------------------------------------------------- RETDST: ; ; SELECT DRIVE ; CALL SELECT RET NZ ; ; RETU ; SETBD1: LD HL,BAUDS ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ; ; IF ILLEGAL BAUD RATE THEN RETURN ERRBLCTL DATA ; ;************************************************ BITOUT: JP C,BITO1 ; ; BIT IS 0, OUTPUT 0 ; RES 3,A J ; LD A,(SVCTL) OR A,BCDSE CALL SETCTL ; ; IF REQUESTED DRIVE = CURRENT DRIVE THEN OK AS IS ; LD A,(CMDBLK + PBDRV LD DE,DVDES ;DRIVE TABLE ARRAY SIZE ; NEXT: DEC A ;IF DRIVE = 0 THEN EXIT WITH POINTER SET JP M,SLED ; ADD IX,DE ;ELSG),L LD (IX+DVSPT0),H LD HL,(CMDBLK + PBST4O) LD (IX+DVSPT1),L LD (IX+DVSPTD),H RET ; ; RETURN FLAGS ; RETFLGS: ----------------------------------------------------- ; ; SET DRIVE PARAMETERS COMMAND (12) ; ;--------------------------- LD (TMMTO),HL LD (IX + DVMTOO),L LD (IX + DVMTOO + 1),H RET ; ; RETURN PARAMETERS ; RETDP: LD L,(IX + DVHLDO) LDRN DRIVE STATUS DATA ; IN A,(BLSTS) LD (CMDBLK + PBST2O),A RET ;----------------------------------------------------OR ; INC A JR Z,SETBD2 ; ; ELSE STORE NEW BAUD RATE ; DEC A LD (BAUDOUT),A RET BAUDS: IF DSIZE = 8 DB 0,-P BITO2 ; ; BIT IS 1, OUTPUT 1 ; BITO1: SET 3,A JP BITO2 ;EQUALIZE CLOCKS ; ; OUTPUT THE BIT ; BITO2: OUT (BLCTL)O) SUB A,(IX + DVNBR) JR Z,SELEN ; ; UNLOAD HEAD ON CURRENT DRIVE ; LD E,DCHDU CALL EXHEAD ; ; DESELECT CURRENTE POINT TO NEXT ARRAY & REPEAT JR NEXT ; ; IX NOW HAS DRIVE TABLE PTR, INITIALIZE DRIVE DATA ; SLED: PUSH IX POP HL  0 %+ &, !'- "(. #)/ $*0 LD DE,DVHLDO ADD HL,DE LD DE,TMHLD PUSH BC LD BC,8 LDIR POP BC ; ; IF MOTOR OFF THEN START MOTOR ; SELEN: INMED: ; ; IF NOT ALREADY ON TRACK 0 THEN SKIP RECALIBRATE ; CALL EXSTS ;IF NOT TRK 0 THEN NO RECAL AND A,DMTK0 JR Z,HIF STEPS = 255 THEN ERROR JR Z,EROR ; ; STEP ONCE ; IN A,(XPSTP) ;ISSUE STEP PULSE LD DE,(TMSTPC) ;SET DELAY RST 8 AND A,DMHDL JR NZ,HLDD ; LD E,DCHDL CALL EXHEAD ; ; WAIT FOR HEAD SETTLING TIME ; LD DE,(TMHLD) RST 8 ; ; IF OUT ; JR C,SOUT ;CARRY=STEP OUT ; ; ELSE STEP IN ; LD L,A LD A,(SVCTL) OR A,BCDAS CALL SETCTL JR STEPS ; ;FAULTS ; ; IF TRACK 0 THEN USE DEFAULTS ; LD A,(CMDBLK + PBTRKO) ;IF TRACK 0 THEN USE DEFAULTS CP A,1 JR C,CTLS ; ;D A,(SVCTL) ;ADD DENSITY, PRECOMP BITS TO CONTROL BITS AND A,NOT (BCDDE + BCPCA + BCPCB) ;CLEAR BITS 1ST OR A,E LD (IX + D) ;PERFORM SEEK TO CURRENT TRACK WITH HEAD LOAD OUT (WDDTA),A ; ; OUTPUT PASSED COMMAND TO FDC ; LD A,E ;OUTPUT PASSED A,(BLSTS) ;GET BOARD LEVEL STATUS AND A,BSMOF JR Z,CKDV ; IN A,(XPMTX) ;ISSUE MOTOR START LD DE,(TMMTO) ;WAIT FOR A WHOME1 ; ; STEP IN 10 TRACKS TO INSURE INSIDE TRACK 0 ; LD L,10 ;ELSE STEP IN BEYOND TRK 0 LD A,(SVCTL) ;SELECT 'IN' O JR STEP ; ; DRIVE IS RESTORED, WAIT FOR SETTLING TIME ; EXIT: LD DE,(TMALS) ;WAIT A BIT AFTER LAST STEP RST 8 ; ;  CURRENT TRACK = REQUESTED TRACK THEN NO SEEK REQUIRED ; HLDD: LD A,(CMDBLK + PBTRKO) SUB A,(IX + DVTRK) JR NZ,DSET ; ;  STEP OUT REQUIRED ; SOUT: ; ; COMPUTE TRACK COUNT ; NEG ;COMPLEMENT OFFSET ; ; IF COUNT > 127 THEN HOME, MUST  IF TRACK 1 THEN DO TRACK 1 ; JR Z,TRK1 ; ; IF DATA TRACKS ARE SINGLE DENSITY THEN USE DEFAULTS ; BIT DFDTDB,(IX + DVCTL),A ; ; SET CONTROLS ; EXITS: CALL SETCTL ; ; SET CURRENT TRACK ; LD A,(CMDBLK + PBTRKO) ;SET REQUESTED TRACK  COMMAND XOR A,C OUT (WDCMD),A ; ; WAIT FOR FDC INTERRUPT ; JR $ ;WAIT FOR INTERRUPT ;*************************ILE RST 8 ; ; RETRIGGER MOTOR OFF DELAY ; CKDV: IN A,(XPMTX) ;EXTEND MOTOR TIME ; ; FETCH DRIVE READY STATUS FROM FDR A,BCDAS CALL SETCTL ; ; STEP ONCE ; RECAL1: IN A,(XPSTP) LD DE,(TMSTPC) RST 8 ; ; IF NOT 10 TRACKS THEN REPEATCURRENT TRACK = 0 ; XOR A,A ;SET COMPLETE FLAG & NO ERROR LD (IX+DVTRK),A ;SET TRACK VALUE ; ; RETURN NO ERROR ; RE RETURN PREVIOUS CONTROLS ; LD A,(IX + DVCTL) ;FETCH LAST CONTROLS USED AND A,NOT BCEIA ;STRIP OLD EIA STATE LD E,A ;SABE ERROR ; JP M,HOME ; ; SET UP TO STEP OUT ; LD L,A LD A,(SVCTL) AND A,NOT BCDAS ;CLEAR DIRECTION BIT CALL SETCVFLG) JR Z,CTLS ; ; IF TRACK < 26 THEN DO SAME AS TRACK 1 ; CP A,26 JR C,T1DD ; ; IF {26 < TRACK < 52} THEN DO MI LD (IX + DVTRK),A XOR A,C OUT (WDTRK),A ;SET TRACK REGISTER ; ; RETURN NO ERRORS ; XOR A,A ;SET Z FLAG RET ; ; ************* ; ; GET STATUS SUBROUTINE ; EXIT - A= 1791 STATUS ; ;************************************** EXSTS: ; ; C ; CALL EXSTS ;SET FLAGS PER DRIVE READY AND A,DMDNR JP RETERR ;************************************************** ; DEC L JR NZ,RECAL1 ; ; NOW STEP OUT UNTIL TRACK 0 FOUND ; LD A,(SVCTL) ;RESTORE DIRECTION AND A,NOT BCDAS OUTT ; ; TRACK 0 NOT FOUND ; EROR: LD A,SEEKERR ;SET FAILURE FLAG OR A,A ;SET NZ FLAG (ERROR) JP RETFER ;**********VE IT LD A,(SVCTL) ;FETCH EIA STATE AND A,BCEIA OR A,E ;INSERT EIA STATE INTO CONTROLS JR EXITS ; ; SET DIRECTION &TL ; ; STEP ONCE ; STEPS: IN A,(XPSTP) LD DE,(TMSTPC) RST 8 ; ; IF COUNT NOT EXHAUSTED THEN REPEAT ; DEC L ;IFDDLE VALUES ; CP A,52 LD E,BCDDE + BCPCM ;USE DOUBLE DENSITY, MEDIUM PRECOMP JR C,CTLS ; ; ELSE DO INNER VALUES ;  CALIBRATE TRACK # ; HOME: CALL HOMED ;HOME SELECTED DRIVE JP HLDD ;NOW SEEK TRACK ;******************************** ISSUE TERMINATE FDC OPERATION & READ FDC STATUS COMMAND ; LD A,DCSTS ;OUTPUT SET STATUS COMMAND TO 1791 RST 32 ; ; RE****************** ; ; HOMED SUBROUTINE STEPS THE DISK DRIVE HEAD OUTWARD UNTIL ; TRACK 0 FLAG IS TRUE OR 255 STEPS HAVE B (BLCTL),A LD (SVCTL),A HOME1: ; ; SET MAX TRACKS TO 255 ; LD L,NBTRK ;SET MAX COUNT ; ; IF ON TRACK 0 THEN DONE ************************************** ; ; TRACK SEEK SUBROUTINE ; EXIT - DENSITY & PRE-COMP CONTROLS SET ; ZF= OK, NZ= STEP COUNT ; DSET: ; ; SAVE TRACK DIFFERENCE ; PUSH AF ; ; DELAY FOR STEP AFTER WRITE REQUIREMENT ; LD DE,TMSAW STEPS-1 NOT 0 THEN STEP AGAIN JR NZ,STEPS ; ; WAIT FOR SETTLING TIME ; LD DE,(TMALS) ;ELSE EXTEND LAST PULSE RST 8  LD E,BCDDE + BCPCH ;USE DOUBLE DENSITY, HIGH PRECOMP JR CTLS ; ; ; TRACK 1 ; TRK1: BIT DFT1DB,(IX + DVFLG) ;IF SD THE****** ; ; HEAD LOAD/UNLOAD SUBROUTINES ; ENTRY - E= HEAD COMMAND ; ;************************************** EXHEAD: ; TURN FDC STATUS ; IN A,(WDSTS) XOR A,C RET ;************************************************************************EEN ISSUED ; EXIT - A= 0: OK, -1: TRK 0 NOT FOUND ; ;******************************************************************** HO ; STEP: CALL EXSTS ;IF ON TRACK 0 THEN EXIT AND A,DMTK0 JR NZ,EXIT ; ; IF > 255 TRACKS THEN RECAL ERROR ; DEC L ; ERROR ; ;************************************************ SEEK: ; ; IF HEAD NOT LOADED THEN LOAD HEAD ; CALL EXSTS  ;DELAY FOR STEP AFTER WRITE RST 8 ; ; RESTORE TRACK DIFFERENCE ; POP AF ; ; IF REQUESTED < CURRENT TRACK THEN STEP; ; SET UP TRACK DENSITY & PRECOMPENSATION LEVEL ACCORDING TO TRACK NUMBER ; LD E,BCSDS + BCPCL ;USE SD, PRECOMP LOW AS DEN USE DEFAULTS JR Z,CTLS ; ; USE DOUBLE DENSITY, LOW PRECOMP ; T1DD: LD E,BCDDE + BCPCL ; ; SET CONTROLS ; CTLS: L; USE RETURN ADDRESS FOR INTERRUPT RETURN ; POP IY ;IY=RETURN ADDR ; ; PUT TRACK # INTO DATA REGISTER ; IN A,(WDTRK**** ; ; READ/WRITE SECTOR SUBROUTINE INITIATES DISK XFER, SEVICES THE CONTROLLER ; CHIP DURING DATA XFER, & TERMINATES OPE0 %+ &, !'- "(. #)/ $*0RATION WHEN FINISHED. ERROR ; DETECTION IS IMPLEMENTED & RETRIES ARE EXECUTED IF DATA ERRORS ARE DETECTED. ; ENTRY - D= 0: WRIE) LD B,A LD A,(SVCTL) AND A,NOT BCDAS OR A,B CALL SETCTL ; ; SET FDC SECTOR REGISTER ; LD A,E AND A,7FH ;REC READY ; IN A,(XPDSH) ; ; FDC READY, XFER DATA ; IN A,(WDDTA) XOR A,C LD (HL),A INC HL ;PTR +1 JR RDREPT ; NOT EXHAUSTED THEN RETRY ; CALL CHKRT POP DE POP BC ;FDC ERROR JR Z,RWRTRY ; ; RESTORE ERROR & RETURN IT ; LD ARETURN HARD ERROR ; LD A,(CMDBLK + PBFLGO) AND A,PBFNRB RET NZ ; ; KICK MOTOR ON IN THE PANTS AGAIN ; IN A,(XPMTX)ION FROM RESET VECTOR ; THIS ROUTINE CALLS THE COLD START SUBROUTINE & RUNS THE DIAGNOSTICS. ; ;--------------------------- INIT OTHER VARIABLES ; LD A,(BAUDS + 2) ;BAUD RATE LD (BAUDOUT),A ; ; NOW DO DIAGNOSTICS ; ; TEST RAM 1ST ; LD ROR JR NZ,SETERR ; IN A,(XPMTO) ;TURN OFF MOTOR IN A,(BLSTS) LD B,A ;PASS BACK STATUS AND A,BSMOF JR Z,SETERR ; TE, /0: READ ; HL= XFER PTR ; E= PHYSICAL SECTOR # (1..26) ; EXIT - NZ= ERROR ; HL, A, B= ? ; ;***********************MOVE SIDE BIT XOR A,C OUT (WDSEC),A ; ; SET FDC INTERRUPT RETURN VECTOR ; LD IY,RWNMI ;SET NMI VECTOR FOR RETURN ;  ; OPERATION DONE, CHECK STATUS ; RWNMI: ; ; PASS BACK THE XFER COUNT ; PUSH DE LD DE,(RWPTR) OR A,A SBC HL,DE ,B JP RETERR ; ; EXECUTION OF NEXT INSTRUCTION GENERATES A WAIT CONDITION UNTIL FDC READY ; WROP: REPTW: IN A,(XPDSH) ; ; ; BUMP ERROR COUNT ; LD A,(ERRCT) INC A LD (ERRCT),A ; ; IF HALF OF RETRYS EXHAUSTED THEN TRY RECALIBRATE ; ------------------------------------------------- CLEAR: ; ; SET UP HARDWARE ; LD SP,STACK ; ; SINGLE INTERRUPT MODEHL,BANK0 ;TEST RAM LD BC,RAMSIZ ; NXTLOC: LD A,(HL) CPL LD (HL),A CP A,(HL) CPL LD (HL),A JR NZ,DRAMER ; INC ; TEST FDC CHIP ; DFDCBSY: IN A,(WDSTS) ;WAIT FOR RESET SEQUENCE TO FINISH XOR A,C AND CSBSY JR NZ,DFDCBSY ; IN A***************************************************** RWSECT: ; ; SAVE THE XFER PTR ; LD (RWPTR),HL ; ; CLEAR ERROR ; DEFAULT TO READ COMMAND ; LD B,DCRDS ; ; IF WRITE OPERATION THEN SET WRITE COMMAND ; LD A,D ;SELECT OPERATION O POP DE LD (CMDBLK + PBST4O),HL ; ; ASSUME READ ERROR MASK ; LD B,DMRER ;IF NO ERRORS THEN RETURN PUSH AF ;SAVE 17HOLD FOR DATA REQ ; ; OUTPUT DATA TO FDC ; LD A,(HL) XOR A,C OUT (WDDTA),A ; ; POINT TO NEXT DATA ; INC HL J CP A,RTYSK JR NZ,CKLS ; CALL HOMED ;HOME SELECTED DRIVE CALL Z,SEEK ;RE-SEEK DESIRED TRACK RET NZ ;IF ERROR THEN EX ; IM 1 ;SINGLE INTERRUPT MODE TO RST 56 ; ; TEST FOR INVERTED BUS FDC OPTION ; LD C,0 ;DEFAULT TO NON-INVERTED DATAHL DEC BC LD A,C OR A,B JR Z,RTSTDN JP NXTLOC ; ; RAM ERROR, RETURN ERROR TO HOST ; DRAMER: LD A,RAMERR JR SET,(WDTRK) ;CHECK FDC REGISTERS LD E,A CPL OUT (WDTRK),A LD B,A EX (SP),HL ;DELAY A WHILE FOR FDC TO CATCH UP EX (SPCOUNT ; XOR A,A LD (ERRCT),A ; ; SELECT SIDE ; LD A,E AND A,80H RRCA ;SHIFT INTO CONTROLS BIT RRCA LD (SIDR A,A JR NZ,OPOK ; LD B,DCWRS ;WRITE OP ; ; OUTPUT COMMAND TO FDC ; OPOK: LD A,(SIDE) ;COMPUTE SIDE FLAG FOR FDC R9X STATUS ; ; IF WRITE OPERATION THEN USE WRITE ERROR MASK ; LD A,D ;IF WRITE OP THEN OR A,A JR NZ,RWMSK ; LD B,DR REPTW ;**************************************************************************** ; ; CHECK FOR RETRYS SUBROUTINE IT ; ; IF RETRYS EXHAUSTED THEN RETURN ERROR ; CKLS: CP A,RTYLS JR Z,STNZ ; ; DELAY A WHILE FOR PLL RECOVERY & RETUR IN A,(BLSTS) AND A,BSUS0 JR NZ,STOP ; ; IF INVERTED THEN SET REGISTER TO XOR DATA WITH 0FFH ; DEC C ; ; SET DRERR ; ; TEST INTERRUPT FLIP FLOP ; RTSTDN: POP BC ;RESTORE FDC DATA POLARITY IN A,(XPIRR) ;CLEAR INTERRUPT FF IN A,(B),HL EX (SP),HL EX (SP),HL IN A,(WDTRK) LD D,A XOR A,B LD B,1 JR NZ,WDBAD ; IN A,(WDSEC) LD E,A CPL OUTE),A JP Z,SIDOK ; ; CHECK FOR ILLEGAL SIDE REQUEST ; IN A,(BLSTS) ;CHECK IF DRIVE CAPABLE AND A,BSTSD JP NZ,EROR ;RCA RRCA RRCA RRCA OR A,B ;OUTPUT READ SECTOR COMMAND RST 32 ; ; SELECT DIRECTION ; LD A,D ;IF WRITE OP THEN MWER ;USE WRITE ERR MASK ; ; RETURN OPERATION STATUS ; RWMSK: POP AF ;179X STATUS AND A,B RET Z ; ; SAVE THIS ER; EXIT - A= 0: OK, /0: HARD ERROR OR RETRYS EXHAUSTED ; ;*********************************************************************N WITH NO ERRORS ; LD DE,TMPLD ;ELSE WAIT & RETURN WITH NO ERRORS RST 8 ; XOR A,A RET ; ; RETURN RETRYS EXHAUSTED IVE TABLE POINTER TO DUMMY ; STOP: LD IX,DTDED ;SET DRIVE TABLE PTR ; ; INITIALIZE CONTROL PORT ; XOR A,A CALL SETCTLLSTS) ;FETCH INTERRUPT STATUS LD B,A ;SHOW IT TO HOST AND A,BSINT LD A,IFFER ;PASS BACK ERROR JR Z,SETERR ; ; TEST (WDSEC),A LD B,A EX (SP),HL EX (SP),HL EX (SP),HL EX (SP),HL IN A,(WDSEC) LD D,A XOR A,B LD B,2 JR Z,WDOK IF NOT CAPABLE THEN SEEK ERROR ; ; COMPUTE CONTROLS ; RWRTRY: SIDOK: LD HL,(RWPTR) ;RESTORE THE XFER PTR ; LD A,(SIDGO DO IT OR A,A JR Z,WROP ; ; READ DIRECTION ; RDREPT: ; ; OUTPUTTING TO THIS PORT GENERATES A CPU 'WAIT' UNTIL FDROR IN CASE RETRYS EXHAUSTED ; LD B,A PUSH BC ; ; SAVE FLAG, SECTOR ; PUSH DE ;SAVE FLAG, SECTOR ; ; IF RETRYS ******* CHKRT: ; ; IF ERROR IS DRIVE NOT READY THEN HARD ERROR ; AND A,DMDNR RET NZ ; ; IF NO RETRYS ALLOWED THEN (NZ) ; STNZ: INC A RET ;---------------------------------------------------------------------------- ; ; INITIALIZAT ;BASE BLCTL BITS ; ; INITIALIZE DATA AREAS FROM ROM ; PUSH BC LD HL,IDATA LD DE,DATAA LD BC,DATASZ LDIR ; ;  MOTOR ON ONE-SHOT ; IN A,(XPMTX) ;TURN ON MOTOR IN A,(BLSTS) ;FETCH STATUS LD B,A AND A,BSMOF LD A,MTONER ;ASSUME ER ; WDBAD: LD (CMDBLK + PBST3O),A ;PASS OUT DATA BIT ERROR (A 0= BAD) IN A,(WDSTS) ;PASS OUT FDC STATUS XOR A,C LD (CMDBL0 %+ &, !'- "(. #)/ $*0K + PBST1O),A LD A,E LD (CMDBLK + PBST4O),A LD A,D LD (CMDBLK + PBST5O),A LD A,FDCDER SETERR: LD (CMDBLK + PBSTAT TABLE OFFSETS ; ;################################################ STRUCT 0 DVNBR DS 1 ;CURRENT PHYSICAL DRIVE # DVTRK DS ### IDATA EQU $ ; ; DRIVE TABLES ; IRP #DRIVE,0,1,2,3 DB #DRIVE,255,0,DFDFL,0C4H + #DRIVE,26,48,48 DW DFHLD,DFSTPC,DROWS TOWARD FORMAT BUFFER ; STACK EQU $ SIDE DS 1 ;SIDE SAVE {0,80H} ERRCT DS 1 ;RETRY COUNT {0..9} SVCTL DS 1 ;LAST BLCT############################### CMDBLK: DS IOPBSZ ;RESERVE ENOUGH SPACE IF ($ - DATAA) <> DATASZ CONMSG **** DATA INIDD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O REFLECT REV C BOARD HARDWARE CHANGES: ; MA10 IN STATUS PORT BIT 1 & DELETION OF MEMORY ACKNOWLEDGE BIT 0 ; IN STATUS PORd block definitions to a separate file ('COMIOPB.DEF'). ; Removed duplicate definitions. ; ; 2.2 6 JUL 88 GRH ; Add '?' toO),A LD A,B ;PASS OUT TEST # LD (CMDBLK + PBST2O),A WDOK: ; ; ALL DONE, SO GOING TO SLEEP ; SLEEP: LD SP,STACK 1 ;CURRENT PHYSICAL TRACK # DVSEC DS 1 ;CURRENT PHYSICAL SECTOR # DVFLG DS 1 ;DISK FORMAT FLAGS DVCTL DS 1 ;LAST CONTROLS USEFALS,DFMTO ENDM ; DB 4,255,0,0,0,0,0,0 ;DUMMY DW DFHLD,DFSTPC,DFALS,DFMTO ;-------------------------------------- ;L OUTPUT IMAGE BAUDOUT DS 1 ;EIA OUTPUT BAUD RATE RWPTR DS 2 ;R/W XFER POINTER ; ; *** THE FOLLOWING 8 BYTES MUST BE IN THISTIALIZATION PHASE ERROR **** ENDIF ;################################################ ; ; PHYSICAL SECTOR BUFFER (UP  ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++T & MOVE OF HALT FLAG FROM BIT 1 TO BIT 0 OF STATUS ; PORT. ; 1.2 - 23 OCT 83 GRH ; CLEANED UP, ADDED HEADER GRAPHICS ;  all global names. ; ; 2.3 6 AUG 88 GRH ; Change '?' to 'DD_' ; ;********************************************************EI ;DIAGNOSTICS OK, SET ALARM & GO TO SLEEP HALT ; ; WAKE-UP RETURNS HERE, SO RESTORE STACK & GO BACK TO SLEEP ; JR SD OFFSET DVSPT0 DS 1 ;SECTORS PER TRACK 0 DVSPT1 DS 1 ;SECTORS PER TRACK 1 DVSPTD DS 1 ;SECTORS PER DATA TRACKS DVHLDO DS 2  ; COMMAND BLOCK ; THIS IS THE HOST COMMUNICATION AREA ; ;-------------------------------------- REPT IOPBSZ DB 0 EN ORDER FOR PROPER INITIALIZATION *** ; TMHLD DS 2 ;CURRENT DRIVE HEAD LOAD DELAY TMSTPC DS 2 ;CURRENT DRIVE STEP RATE TMALS TO 1K) ; ;################################################ ORG BANK1 SBUFR EQU $ ;PHYSICAL SECTOR BUFFER END  SUBTTL DOUBLE D SYSTEM CONFIGURATION DEFINITIONS ;**************************************************************************** ; 1.3 - 7 JUN 85 GRH ; Added Jade format disk descriptor sector definitions. ; ; 1.4 - 29 OCT 85 GRH ; Changed disk des******************** ;============================================================================ ; ; BASE DEFINITIONSLEEP SUBTTL CONSTANT DATA AREAS ;################################################ ; ; DISKETTE FORMAT LABEL ; ;######;DRIVE HEAD LOAD DELAY VALUE DVSTPO DS 2 ;DRIVE STEP MOTOR RATE VALUE DVALSO DS 2 ;DRIVE DELAY AFTER LAST STEP VALUE DVMTOO DDM ; DATASZ EQU $ - IDATA ;SIZE OF INITIALIZATION SUBTTL DATA AREA ;#####################################################DS 2 ;CURRENT DRIVE AFTER LAST STEP DELAY TMMTO DS 2 ;CURRENT DRIVE MOTOR ON DELAY ; ; INITIALIZED DATA ; ORG BANK0 + +++++++++++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR ; ; THIS INCLUDE MODULE DEFINES THE SYSTEM TO BOARD LEVEL PARAMETERS FOR ; THE JADE DOUBLE D DISK CONTROLLER. IT SHOULD BE criptor sector format to new format. ; Clarified communication block commands. ; Added hook for log-on return of valid disk de ; ;============================================================================ DD_BASE EQU 0E000H ;DD WINDOW BASE ADDR (AD########################################## JADEID: DB 'Jade DD ' ;DISKETTE ID LABLE IDSZE: EQU $-JADEID ;LABEL LENGTH ; DES 2 ;DRIVE MOTOR ON DELAY VALUE DVSIZE DS 0 ENDM ;############################################################################################# ; ; BANK 0 ; ;############################################################################ ORG DDCBO - (DVSIZE * 5) ;POSITION BLOCK DATAA EQU $ ; ; DRIVE TABLES ; DVTBL DS DVSIZE * 4 DTDED DS DVSIZE ;DUMMY DVDES E = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HINCLUDED AS DEFINITIONS ; WHENEVER THE BOARD IS DIRECTLY INTERFACED TO BY A SOFTWARE MODULE. ; ;****************************scriptor boolean. ; Removed disk format data & command block data definitions to JDDDISK ; ; 2.0 - 24 NOV 85 GRH ; Rework DED TO STATUS BITS) ; ; PORTS ; DD_PORT3 EQU 41H ;3" DRIVE CONTROLLER DD_PORT5 EQU 42H ;5.25" DRIVE CONTROLLER DD_PORTSCID DB 'Disk Descriptor Sector' ;NEW ID DIDSIZ EQU $ - DESCID ;################################################ ; ; DRIVE###### ; ; INITIAL DATA FOR RAM INITIALIZATION ; ;#########################################################################BANK0 ; ; FORMAT DRIVER BUFFER ; DS 512 ;FORMAT DRIVER BUFFER ; ; LOCAL DATA ; ORG BANK0 + 300H ; ; STACK GQU DVSIZE ;###################################### ; ; COMMAND BLOCK ; THIS IS THE HOST COMMUNICATION AREA ; ;#######L) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 A************************************************ ; ; REVISIONS: ; 1.0 19 JUL 82 ; RELEASE ; ; 1.1 14 FEB 83 ; CHANGED Tfor prom code. ; Change command block structure to reflect Common IOPB structure. ; ; 2.1 - 22 FEB 86 GRH ; Removed comman8 EQU 43H ;8" DRIVE CONTROLLER ; ; BUFFER OFFSETS ; DD_FBFO EQU 00H ;DD FORMAT BUFFER OFFSET (BANK 1) DD_CBO EQU 0370H 0 %+ &, !'- "(. #)/ $*0 ;COMMAND BLOCK (IOPB) OFFSET ;============================================================================ ; ; DOUBLE MORY BANK 0 DD_MB1 EQU 00000011B ;SELECT MEMORY BANK 1 DD_EXC EQU 00000010B ;ISSUE DD INTERRUPT (EXECUTE COMMAND BLOCK) ; ; #SECTORS ;;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LINCLUDED AS DEFINITIONS ; WHENEVER THE BOARD IS DIRECTLY INTERFACED TO BY A SOFTWARE MODULE. ; ;****************************scriptor boolean. ; Removed disk format data & command block data definitions to JDDDISK ; ; 2.0 - 24 NOV 85 GRH ; Rework DPORT5 EQU 42H ;5 1/4" DRIVE CONTROLLER DDPORT8 EQU 43H ;8" DRIVE CONTROLLER DDCBO EQU 370H ;DCM COMMAND BLOCK OFFSET WINDOW (CPU FREE RUN) DDMB0 EQU 00000001B ;SELECT MEMORY BANK 0 DDMB1 EQU 00000011B ;SELECT MEMORY BANK 1 DDEXC EQU 00000010B FILE D PORT DEFINITIONS ; ;============================================================================ ; ; COMMAND PORT ; ;  ;============================================================================ ; ; STATUS PORT (SAME ADDRESS AS DDPORT) ; ;OWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM SUBTTL MAIN PROGRAM ORG TPA ;------------------------------************************************************ ; ; REVISIONS: ; 1.0 19 JUL 82 ; RELEASE ; ; 1.1 14 FEB 83 ; CHANGED Tfor prom code. ; Change command block structure to reflect Common IOPB structure. ; ; 2.1 - 22 FEB 86 GRH ; Removed comman;============================================================================ ; ; DOUBLE D COMMAND PORT ; ;=============== ;ISSUE DD INTERRUPT (EXECUTE COMMAND BLOCK) ;============================================================================ ++++++++++++++++++++++++++++++++++++++ FMTDSK: ; ; SELECT DRIVE ; CALL SELDR ;SELECT DRIVE RET C ;ERR- RESELECT ;  D7 D0 ; |BGN| X | X | X | X | X |MB1|MB0| ; ^ \______/ ; | |_______ 00: REMOVE MEMORY BANK FROM H D7 D0 ; | X | X | X | 0 |S12|S11|S10|HLT| ; ^ \_________/ ^_____ PROCESSOR HALT FLAG (0) ; | |____--------------------------------------------- ; ; PROGRAM ENTRY POINT ; ;-------------------------------------------------O REFLECT REV C BOARD HARDWARE CHANGES: ; MA10 IN STATUS PORT BIT 1 & DELETION OF MEMORY ACKNOWLEDGE BIT 0 ; IN STATUS PORd block definitions to a separate file ('COMIOPB.DEF'). ; Removed duplicate definitions. ; ;*********************************============================================================= ; ; D7 D0 ; |BGN| X | X | X | X | X |MB1|MB0| ; ^  ; ; STATUS PORT (SAME ADDRESS AS DDPORT) ; ;============================================================================ ;; SET UP IOPB FOR 1ST TRACK ; LD A,0 ;SET TRACK # LD (IOPB + PB_TRKO),A ; ; MAIN LOOP ; FMTDSKLP: ; ; SIDE 0 OST ; | 01: SELECT 1K MEMORY BANK 0 ; | 10: GENERATE PROCESSOR INTERRUPT ; | 11: SELECT_________ BOARD MEMORY ADDR SWITCH POS. ; |_____________________ BOARD ACKNOWLEDGE (ALLWAYS 0) ; DD_SHLT EQU 00000001B ;ST-------------------------- JP INIT ;INITIALIZE ;########################################################################T & MOVE OF HALT FLAG FROM BIT 1 TO BIT 0 OF STATUS ; PORT. ; 1.2 - 23 OCT 83 GRH ; CLEANED UP, ADDED HEADER GRAPHICS ; ******************************************* ;============================================================================  \______/ ; | |_______ 00: REMOVE MEMORY BANK FROM HOST ; | 01: SELECT 1K MEMORY BANK 0 ; | 10:  ; D7 D0 ; | X | X | X | 0 |S12|S11|S10|HLT| ; ^ \_________/ ^_____ PROCESSOR HALT FLAG (0) ; | ; LD HL,1 LD (IOPB + PB_SECO),HL ; ; FORMAT TRACK ; CALL FMTTRK RET NZ ;IF ERROR THEN RETURN ; ; WHILE ON TRAC 1K MEMORY BANK 1 ; |_________________________________ RESET BOARD PROCESSOR (1) ; ; ; COMMANDS (OUTPUT TO DDPORT) ; DATUS PORT HALT FLAG, 0= HALT, 1= BUSY DD_SASW EQU 00001110B ;STATUS PORT ADDR SW MASK DD_SACK EQU 00010000B  SUBTTL DOUBLE D SYSTEM CONFIGURATION DEFINITIONS ;**************************************************************************** ; 1.3 - 7 JUN 85 GRH ; Added Jade format disk descriptor sector definitions. ; ; 1.4 - 29 OCT 85 GRH ; Changed disk des; ; LOCATIONS ; ;============================================================================ DDBASE EQU 0E000H ;DD WINDGENERATE PROCESSOR INTERRUPT ; | 11: SELECT 1K MEMORY BANK 1 ; |_________________________________ RESET BOARD PR |_____________ BOARD MEMORY ADDR SWITCH POS. ; |_____________________ BOARD ACKNOWLEDGE (ALLWAYS 0) ; DDSHLT EQU 00K 0, WRITE THE DESCRIPTOR SECTOR ; LD A,(IOPB + PB_TRKO) OR A,A JR Z,FMTWID ; FMTDSK1: ; ; DO SECOND SIDE IF NEEDEDD_BGN EQU 10000000B ;RESET DD Z80A DD_FREE EQU 00000000B ;RELEASE MEMORY WINDOW (CPU FREE RUN) DD_MB0 EQU 00000001B ;SELECT METORS ;;ONCE FOR EACH SECTOR LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;;ADD IN SKEW FACTOR ;; IF NXTSEC >  ; ; THIS INCLUDE MODULE DEFINES THE SYSTEM TO BOARD LEVEL PARAMETERS FOR ; THE JADE DOUBLE D DISK CONTROLLER. IT SHOULD BE criptor sector format to new format. ; Clarified communication block commands. ; Added hook for log-on return of valid disk deOW BASE ADDR (ADDED TO STATUS BITS) DDFBFO EQU 00H ;DD FORMAT BUFFER OFFSET (BANK 1) DDPORT3 EQU 41H ;3" DRIVE CONTROLLER DOCESSOR (1) ; ; ; COMMANDS (OUTPUT TO DDPORT) ; DDBGN EQU 10000000B ;RESET DD Z80A DDFREE EQU 00000000B ;RELEASE MEMORY 000001B ;STATUS PORT HALT FLAG, 0= HALT, 1= BUSY DDSASW EQU 00001110B ;STATUS PORT ADDR SW MASK DDSACK EQU 00010000B ; ; END ; LD A,(IDSIMG + ID_HEADS) CP A,1 JR Z,NO2ND ; LD A,(IOPB + PB_TRKO) ;FETCH TRACK SECTOR COUNT CALL GETSPT ; INC0 %+ &, !'- "(. #)/ $*0 SUBTTL DOUBLE D SYSTEM CONFIGURATION DEFINITIONS ;**************************************************************************** ; 1.3 - 7 JUN 85 GRH ; Added Jade format disk descriptor sector definitions. ; ; 1.4 - 29 OCT 85 GRH ; Changed disk deschars. ; ;**************************************************************************** ;========================================================================== ; ; COMMAND PORT ; ; D7 D0 ; |BGN| X | X | X | X | X |MB1|MB0| ; =============== ; ; STATUS PORT (SAME ADDRESS AS DDPORT) ; ; D7 D0 ; | X | X | X | 0 |S12|S11|S10|HLT| ; EX DE,HL POP HL INC (HL) JR DECDIG ; ; ADDIT: LD A,C CPL LD E,A LD A,B CPL LD D,A INC DE ADD HL,DE EX D* ; ; KNOWN BUGS: ; ; * LEAVES LOGON DISABLED ON FDC. ; ; REVISION STATUS: ; ; X.1 - 30 DEC 86 GRH ; Fix bug causinx bug in main loop which caused drive logon to remain disabled ; when returned to BIOS. ; VERSN EQU '01' ;CHANGE HERE FOR SI ; ; THIS INCLUDE MODULE DEFINES THE SYSTEM TO BOARD LEVEL PARAMETERS FOR ; THE JADE DOUBLE D DISK CONTROLLER. IT SHOULD BE criptor sector format to new format. ; Clarified communication block commands. ; Added hook for log-on return of valid disk de=========================================== ; ; BASE DEFINITIONS ; ;======================================================^ \______/ ; | |_______ 00: REMOVE MEMORY BANK FROM HOST ; | 01: SELECT 1K MEMORY BANK 0 ; |  ^ \_________/ ^_____ PROCESSOR HALT FLAG (0) ; | |_____________ BOARD MEMORY ADDR SWITCH POS. ; |________________E,HL POP HL DEC HL RET UNIT: DS 4 TTHOU: DS 1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++g display of side 1 sector number > 32768. ; Remove sector skew for double density in order to get failure data. ; ; X.2 - 31GN-ON CHANGE ; ;*************************************************************************** SUBTTL DECLARATIONS ;========INCLUDED AS DEFINITIONS ; WHENEVER THE BOARD IS DIRECTLY INTERFACED TO BY A SOFTWARE MODULE. ; ;****************************scriptor boolean. ; Removed disk format data & command block data definitions to JDDDISK ; ; 2.0 - 24 NOV 85 GRH ; Rework ====================== DD_BASE EQU 0E000H ;DD WINDOW BASE ADDR (ADDED TO STATUS BITS) ; ; PORTS ; DD_PRT3 EQU 41H ;3" 10: GENERATE PROCESSOR INTERRUPT ; | 11: SELECT 1K MEMORY BANK 1 ; |_________________________________ R_____ BOARD ACKNOWLEDGE (ALLWAYS 0) ; DD_SHLT EQU 00000001B ;STATUS PORT HALT FLAG, 0= HALT, 1= BUSY DD_SASW EQU 00001110B ;S TITLE 8" FLOPPY DISK FORMAT UTILITY FOR JADE DD CONTROLLER LIST NOCOND ;**************************************************** DEC 86 GRH ; Reinstall double density skew factor. ; Add precomp thresholds to ID sector data & add logon to track 0 ; fo=================================================================== ; ; ASSEMBLY CONTROL ; ;================================************************************************ ; ; REVISIONS: ; 1.0 19 JUL 82 ; RELEASE ; ; 1.1 14 FEB 83 ; CHANGED Tfor prom code. ; Change command block structure to reflect Common IOPB structure. ; ; 2.1 - 22 FEB 86 GRH ; Removed comman DRIVE CONTROLLER DD_PRT5 EQU 42H ;5.25" DRIVE CONTROLLER DD_PRT8 EQU 43H ;8" DRIVE CONTROLLER ; ; BUFFER OFFSETS ; ESET BOARD PROCESSOR (1) ; ; ; COMMANDS (OUTPUT TO DDPORT) ; DD_BGN EQU 10000000B ;RESET DD Z80A DD_FREE EQU 00000000B ;TATUS PORT ADDR SW MASK DD_SACK EQU 00010000B *********************** ; ; JADE DOUBLE D DISK FORMAT PROGRAM ; ;*********************************************************rmat after writing ID sector ; ; 1.0 - 8 FEB 81 GRH ; RELEASE ; ; 2.00 5 AUG 88 GRH ; Change Format command philosophy=========================================== FALSE EQU 0 TRUE EQU NOT FALSE ; DIAG EQU TRUE ; MINVERS EQU 301 ;MINIMUM BIOO REFLECT REV C BOARD HARDWARE CHANGES: ; MA10 IN STATUS PORT BIT 1 & DELETION OF MEMORY ACKNOWLEDGE BIT 0 ; IN STATUS PORd block definitions to a separate file ('COMIOPB.DEF'). ; Removed duplicate definitions. ; ; 2.2 6 JUL 88 GRH ; Add '?' toDD_FBFO EQU 00H ;DD FORMAT BUFFER OFFSET (BANK 1) DD_CBO EQU 0370H ;COMMAND BLOCK (IOPB) OFFSET ;=======================RELEASE MEMORY WINDOW (CPU FREE RUN) DD_MB0 EQU 00000001B ;SELECT MEMORY BANK 0 DD_MB1 EQU 00000011B ;SELECT MEMORY BANK 1 DDT ; DE= VALUE TO CONVERT ; BC= DIVISOR FOR DIGIT ; EXIT - HL= PTR TO NEXT DIGIT ; DE= REMAINDER ; BC= -BC ; ;++++++++****************** ; ; FORMATn is a system utility which provides a means to write a single or ; double density format on a to table-driven. Change FORMAT8 to ; comply with new DCM8. ; Correct bug in DSDD48 which defined disk as 896k when it was onS VERSION FOR COMPATABILITY ; DSIZE EQU 8 ;=========================================================================== ;T & MOVE OF HALT FLAG FROM BIT 1 TO BIT 0 OF STATUS ; PORT. ; 1.2 - 23 OCT 83 GRH ; CLEANED UP, ADDED HEADER GRAPHICS ;  all global names. ; ; 2.3 6 AUG 88 GRH ; Change '?' to 'DD_' ; ; 2.4 26 SEP 88 GRH ; Change symbols to 8 significant ===================================================== ; ; DOUBLE D PORT DEFINITIONS ; ;===================================_EXC EQU 00000010B ;ISSUE DD INTERRUPT (EXECUTE COMMAND BLOCK) ;=============================================================++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DECDIG: PUSH HL EX DE,HL ADD HL,BC JR NC,ADDIT ; ny of the drives accessed by the DD controller. ; ;**************************************************************************ly ; 894k. ; Change ID sector to reflect new format. ; Implement BIOS call for IOPB execution. ; ; 2.01 6-9-90 GRH ; Fi ;*INCLUDE DISKS.DEF ;*INCLUDE COMIOPB.DEF ; ;=========================================================================== 0 %+ &, !'- "(. #)/ $*0LIST OFF *INCLUDE DISKS.DEF *INCLUDE COMIOPB.DEF LIST ON ;====================================================================================================== ; ; BDOS CALL VECTORS ; ;=======================================================;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS ;;ONCE FOR EACH SECTOR LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC############################ SIGNON: DB 'Jade Double D 8" disk format Utility Ver 2.' DB HIGH VERSN,LOW VERSN,CR,LF DB 'C, IS VERSION OK ; BIOSVOK: LD C,RETVERS RST BIOS ; LD DE,MINVERS ;MUST BE >= THIS OR A,A SBC HL,DE ; JR C,BIOSE LD D,(HL) LD HL,FUNRET ;SET UP RETURN ADDRESS PUSH HL EX DE,HL JP (HL) ;EXECUTE COMMAND ; ; ; FUNCTIONS RETURN LE DENSITY IBM 3740 (241K) DW FUN1 ;SINGLE SIDED SINGLE DENSITY 26SPT JADE (241K) DW FUN2 ;SINGLE SIDED DOUBLE DENSITY 48S DO48 ; ; ; FUNCTION 2: JADE SINGLE SIDED, DOUBLE DENSITY, 48 SPT ; FUN2: LD HL,SSDD48ID ;JADE FORMAT SSDD 48SPT JR DO============== ; ; CONSTANTS ; ;=========================================================================== CTRLC: EQU 3 ==================== WBOOT EQU 0000H ;SYSTEM WARM BOOT BDOS: EQU 0005H ;SYSTEM CALL ADDR ;============================= + #SKEW ;;ADD IN SKEW FACTOR ;; IF NXTSEC > #SECTORS ;;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= Lopyright (c) 1983,1986,1987,1988 GRH Enterprises' DB '$' ;-------------------------------------------------------------RR ; ; ; OUTPUT MENU ; FUNBG: LD DE,MSGFL ;OUTPUT FUNCTION LIST CALL MSGOT ; ; GET FUNCTION SELECTION FROM USER ; HERE, RE-ENABLE LOGON CAPABILITY FOR THIS DRIVE ; FUNRET: LD IX,IOPB ;USE COMMON IOPB ; LD (IX + PB_CMDO),PB_STDKC ; LDPT JADE (440K) DW FUN3 ;DOUBLE SIDED SINGLE DENSITY 26SPT (480K) DW FUN4 ;DOUBLE SIDED DOUBLE DENSITY 48SPT JADE (880K) 48 ; ; ; FUNCTION 3: DOUBLE SIDED, SINGLE DENSITY, 26 SPT ; FUN3: LD HL,DSSDID ;JADE DSSD 26SPT JR DO48 ; ; ; FUNC ;REQUEST REBOOT CPM LF: EQU 0AH ;LINE FEED CR: EQU 0DH ;CARRIAGE RETURN BS EQU 08H ;BACKSPACE ; NDRVS EQU 4 ;MAX NUMBE============================================== ; ; BIOS CALL DATA ; ;=====================================================OWEST ;;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM SUBTTL MAIN P-------------- ; ; MAIN PROGRAM CONTINUES ; ;--------------------------------------------------------------------------- IN CALL CNSIN ;GET CONSOLE CHAR LD (LTRSE),A ;SAVE CHAR FOR ERROR MESSAGE ; ; CHECK FOR RANGE ; SUB A,'0' CP A,NFUNCS HL,SECBUF ;USE SECTOR BUFFER TO RETURN PARAMETERS LD (IOPB + PB_DMAO),HL ; LD (IX + PB_FLGO),3 ;RETURN DATA AND ENABLE LOGDW NOFUN DW NOFUN DW NOFUN DW NOFUN DW CUSTOM NFUNCS EQU ($ - FUNTBL) / 2 SUBTTL FORMAT FUNCTIONS ;-------------TION 4: JADE DOUBLE SIDED, DOUBLE DENSITY, 48 SPT ; FUN4: LD HL,DSDD48ID ;JADE FORMAT DSDD 48SPT ; ; COMMON CODE ; DO48:R OF DRIVES SECSZ: EQU 128 ;128 BYTES PER SECTOR ;============================================================================================= RETVERS EQU 0 ;RETURN BIOS VERSION # IN HL XIOPBC EQU 2 ;EXECUTE IOPB IN DE FUNCTION SUBTTL MACROROGRAM ORG TPA ;--------------------------------------------------------------------------- ; ; PROGRAM ENTRY POINT ; ;IT: ; ; SET UP LOCAL STACK ; LD SP,(BDOS + 1) DEC SP DEC SP ; ; OUTPUT SIGNON MESSAGE ; LD DE,SIGNON ;OUTPUT  JR C,FUNOK ; ; UNKNOWN FUNCTION, ERROR ; FUNERR: LD DE,MSGSE ;ELSE OUTPUT ERROR MSG CALL MSGOT ; ; IF USER WANTS ON CALL EXIOPBX ; ; NEXT OPTION ; JP FUNBG ; ; ; NO SUPPORTED FUNCTION STUB ; NOFUN: POP HL ;RESTORE STACK JR-------------------------------------------------------------- ; ; SELECT PARAMETERS ; ;---------------------------------- ; ; OVERLAY DPB DATA ; LD DE,IDSIMG + ID_SPTO LD BC,ID_DPBSZ LDIR ; ; OVERLAY DISK FORMAT DATA ; LD DE,IDSIMG==== ; ; LOCATIONS ; ;=========================================================================== REBOOT: EQU 0 ;REBOOT ADS ;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;; ;; GENERATE THE TRANSLATE TABLE ;; ;;@@@@--------------------------------------------------------------------------- JP INIT ;INITIALIZE ;#######################MESSAGE CALL MSGOT ; ; IF BIOS CALL VECTOR NOT IN MONITOR THEN IMPLEMENTED ; LD A,(BIOS + 2) CP A,0F8H JR C,BIOSVOKTO CONTINUE THEN REPEAT ; CALL CNSIN CP A,'Y' JR NZ,FUNBG ;REPEAT ; ; ELSE RETURN TO CP/M ; JP 0 ; ; ; FUNCT FUNERR ;TELL ERROR ;############################################################################ ; ; FUNCTION ADDRESS----------------------------------------- ; ; ; FUNCTION 0: IBM 3740, SINGLE SIDED, SINGLE DENSITY, 26 SPT ; FUN0: LD HL, + ID_FLGO LD BC,ID_FSIZE LDIR ; ; FALL INTO FORMAT DISK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++DR BIOS EQU 28H ;BIOS FUNCTION RESTART VECTOR TPA: EQU 100H ;TRANSIENT PROGRAM AREA ;==================================@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;#################################################### ; ; COPYRIGHT NOTICE ; ;############################################### ; ; ELSE BIOS FUNCTION CALL NOT IMPLEMENTED, ABORT ; BIOSERR: LD DE,BIOSM CALL MSGOT JP 0 ; ; ; BIOS VECTOR OKION RANGE OK, COMPUTE EXECUTION ADDRESS ; FUNOK: LD HL,FUNTBL LD E,A LD D,0 ADD HL,DE ADD HL,DE LD E,(HL) INC HL TABLE ; ;############################################################################ ; FUNTBL: DW FUN0 ;SINGLE SIDED SINGSSSD40ID ;IBM 3740 SSSD 26SPT JR DO48 ; ; FUNCTION 1: JADE SINGLE SIDED, SINGLE DENSITY, 26SPT ; FUN1: LD HL,SSSDID JR+++++++++++++++++++++ ; ; FORMAT DISK FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 %+ &, !'- "(. #)/ $*0+ FMTDSK: ; ; SELECT DRIVE ; CALL SELDR ;SELECT DRIVE RET C ;ERR- RESELECT ; ; SET UP IOPB FOR 1ST TRACK ; LDIOPB + PB_SECO),A ; CALL FMTTRK RET NZ ; NO2ND: ; ; NEXT TRACK ; LD A,(IOPB + PB_TRKO) INC A LD (IOPB + PB_TRK****************** ; ; MESSAGE OUTPUT PROCEDURE ; ENTRY- DE= PTR TO '$' TERMINATED TEXT ; EXIT - ? ; ;******************************** ; ; CONSOLE OUTPUT PROCEDURE ; ENTRY- E= CHAR ; ;*************************************************************BC,-100 CALL DECDIG ; ; PROCESS TENS DIGIT ; LD BC,-10 CALL DECDIG ; ; REMAINDER IS UNITS DIGIT ; LD (HL),E ; BC POP HL DJNZ NXTDEC ; ; DONE ALL 5 DIGITS ; RET ;************************************************************ ; ADDIT: LD A,C CPL LD E,A LD A,B CPL LD D,A INC DE ADD HL,DE EX DE,HL POP HL DEC HL RET UNIT: DS 4 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT TRACK FUNCTION ; EXIT - AF= /0: ERROR ; ;+++ A,0 ;SET TRACK # LD (IOPB + PB_TRKO),A ; ; MAIN LOOP ; FMTDSKLP: ; ; SIDE 0 ; LD HL,1 LD (IOPB + PB_SECO),HL O),A ; ; IF NOT PAST LAST CYLINDER THEN REPEAT ; LD HL,IDSIMG + ID_CYLS CP A,(HL) JR C,FMTDSKLP ; ; FORMAT DONE, ******************************************************* PUTS: MSGOT: LD C,9 ;PRINT STRING FUNCTION JP BDOS ;++++++++************** CNSOT: LD C,2 ;CONSOLE OUTPUT FUNCTION # JP BDOS ;****************************************************** ; OUTPUT DIGITS WITH LEADING SPACES ; LD HL,TTHOU ;SET PTR LD BC,500H ;5 DIGITS, NOCONVERT 0 TO SPACE = FALSE ; NXTD*************** ; ; OUTPUT CRLF PROCEDURE ; EXIT - HL, DE, BC, AF= ? ; ;*************************************************** TTHOU: DS 1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE ID SECTOR FUNCTION ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FMTTRK: ; ; SELECT DISK FORMAT TABLE BASED ON SECT ; ; FORMAT TRACK ; CALL FMTTRK RET NZ ;IF ERROR THEN RETURN ; ; IF NOT ON TRACK 0, NO DESCRIPTOR SECTOR WRITE ; GO TEST FOR READ ERRORS ; CALL CHECK ;CHECK FOR READ ERRORS JP FMTDSK ;READY FOR ANOTHER DISK ; ; ; WRITE ID SECTOR ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT FUNCTION ; EXIT - A= CHAR AND 7FH ; ********************* ; ; PUT DECIMAL PROCEDURE ; ENTRY- HL= VALUE TO OUTPUT ; EXIT - HL, DE, BC, A= ? ; ;****************EC: LD A,(HL) ;FETCH DIGIT DEC HL ;NEXT DIGIT ADD A,'0' ;CONVERT TO ASCII CP A,'0' ;IF NOT 0 THEN NOCONVERT TO SPACE =************************ CRLF: LD DE,CRLFM JP PUTS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; EXIT - AF= /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ WRTID: ; ; SET UP OR SIZE & TRACK DENSITY FLAGS ; LD A,(IOPB + PB_TRKO) ;FETCH SECTOR SIZE CALL GETSSZ ; AND A,3 ;MOULO 4 ADD A,A ;X LD A,(IOPB + PB_TRKO) OR A,A JP NZ,FMTDSK1 ; ; ELSE IF NOT 3740 THEN WRITE DESCRIPTOR SECTOR ; LD A,(IDSIMG + ID_DTY ; FMTWID: CALL WRTID ;WHILE WE'RE HERE, WRITE ID SECTOR RET NZ ;ERR JP FMTDSK1 ;--------------------------------BC, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CNSIN: ; ; GET CHARACTER ;*********************************************************** PUTD: ; ; PUT DATA IN PROPER REGISTERS ; EX DE,HL ; ; IN TRUE JR NZ,FIRST ; INC C ;ELSE IF FLAG != 0 THEN DIGIT OCCURRED DEC C JR NZ,OUTNUM ; LD A,B ;AT LEAST ONE 0 DEC++++++++ ; ; CREATE DECIMAL DIGIT FUNCTION ; ENTRY- HL= PTR TO PLACE TO STORE DIGIT ; DE= VALUE TO CONVERT ; BC= DIVISOR IOPBs ; LD A,(IOPB + PB_DRVO) LD (WIDIOPB + PB_DRVO),A ; LD HL,IDSIMG LD (WIDIOPB + PB_DMAO),HL ; LD HL,ID_SECT ;SE2 LD L,A ;SAVE ; LD A,(IOPB + PB_TRKO) ;SELECT CORRECT DENSITY FLAG CP A,1 LD A,(IDSIMG + ID_FLGO) ;PREFETCH DENSITY PE) OR A,A ;3740 == 0 JR NZ,FMTWID ; FMTDSK1: ; ; DO SECOND SIDE IF NEEDED ; LD A,(IDSIMG + ID_HEADS) CP A,1 J------------------------------------------- ; ; CUSTOM FORMATTER ; ;-------------------------------------------------------- LD C,1 ;CONSOLE READ FUNCTION # CALL BDOS ; ; MASK BIT 7 ; AND A,7FH ; ; CONVERT LOWER CASE TO UPPER CASE ; IT DIGITS TO 0 ; LD HL,UNIT LD B,5 SET0: LD (HL),0 INC HL DJNZ SET0 ; ; PROCESS TENTHOUSANDS DIGIT ; DEC HL L A LD A,'0' JR Z,OUTNUM ; LD A,' ' ;PAD WITH LEADING BLANKS UNTIL DIGIT JR OUTNUM ; ; NON-0 DIGIT OCCURRED, FLAG =FOR DIGIT ; EXIT - HL= PTR TO NEXT DIGIT ; DE= REMAINDER ; BC= -BC ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++T ID SECTOR LD (WIDIOPB + PB_SECO),HL ; ; EXECUTE THE IOPB ; LD IX,WIDIOPB ;PASS PTR TO IOPB CALL EXIOPBX RET Z ; FLAGS JR Z,FMT1 ; JP NC,FMTDT ADD A,A ;SHIFT PROPER DENSITY BIT INTO BIT 3 ; FMT1: ADD A,A ; FMTDT: ADD A,A ; ; R Z,NO2ND ; LD A,(IOPB + PB_TRKO) ;FETCH TRACK SECTOR COUNT CALL GETSPT ; INC A ;ONE PAST LAST SECTOR ON SIDE 0 LD (------------------- CUSTOM: RET SUBTTL PROCEDURES & FUNCTIONS ;*********************************************************CP A,'a' RET C CP A,'z' + 1 RET NC AND A,5FH RET ;***************************************************************D BC,-10000 CALL DECDIG ; ; PROCESS THOUSANDS DIGIT ; LD BC,-1000 CALL DECDIG ; ; PROCESS HUNDREDS DIGIT ; LD  TRUE ; FIRST: INC C ; ; OUTPUT DIGIT ; OUTNUM: PUSH HL PUSH BC PUSH AF LD E,A LD C,2 CALL BDOS POP AF POP+++++++++++++++++++++++++ DECDIG: PUSH HL EX DE,HL ADD HL,BC JR NC,ADDIT ; EX DE,HL POP HL INC (HL) JR DECDIG ; ; ERROR ENCOUNTERED, TELL IT ; LD DE,MSGNC ;ELSE OUTPUT ERROR & RETURN CALL MSGOT XOR A,A DEC A RET ;++++++++ IF DOUBLE DENSITY THEN ADD 4 ; AND A,8 OR A,L ;ADD IN SECTOR SIZE OFFSET ; LD HL,TBLPTRS ;FETCH DATA PTR FROM TABLE 0 %+ &, !'- "(. #)/ $*0 ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A ; ; GOT FORMAT TABLE, SET XFER PTR TF RET Z ;IF NO ERROR THEN RETURN ; ; ERROR- TELL SO ; LD DE,MSGNC ;ELSE OUTPUT ERROR MSG CP A,PB_SEEK ;IF SEEK ERROR DRIVE {0..3} ; SUB A,'0' CP A,4 JR C,NMBRD ;IF LEGAL THEN CONTINUE ; ; ILLEGAL DRIVE, REPEAT ; LD DE,MSGSE ;PRIN************ ; ; CHECK FUNCTION CHECKS ALL TRACKS BY READING BACKWARD FROM LAST TRACK ; ;********************************* ;OFFSET FOR TEST LD (NSECTS),A ; ; START WITH 1ST SECTOR ; LD A,1 ;START WITH 1ST SECTOR ; ; READ LOOP ; RDLP:N} -> {0..N-1} ADD A,L ;CALCULATE OFFSET TO SECTOR LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH TRANSLATED SECTR LATER ; LD HL,RDIOPB + PB_SECO CP A,(HL) ;CF= SIDE 1, NC= SIDE 0 PUSH AF ;SAVE SIDE FLAG (CF) ; LD L,0 RL L P MSGOT ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- O IT ; LD (IOPB + PB_DMAO),HL ; ; CALCULATE CHECKSUM ; LD B,127 ;SAVE LAST BYTE FOR -CHECKSUM XOR A,A ;CHECKSUM =  THEN DIFFERENT MESSAGE JR NZ,FTE1 ; LD DE,SKERM ; FTE1: CALL MSGOT XOR A,A ;RETURN ERROR FLAG DEC A RET ;+++T SELECT ERROR MESSAGE CALL MSGOT JR SELDR ; ; ; DRIVE SELECTED ; NMBRD: LD (IOPB + PB_DRVO),A LD (WIDIOPB + PB_DRV****************************************** CHECK: ; ; SET UP ; LD HL,(IOPB + PB_TRKO) ;START WITH LAST TRACK FORMATTED  ; ; CHECK FOR SECTOR TRANSLATION ; LD (CURSEC),A ;SAVE THE CURRENT SECTOR ; LD A,(IDSIMG + ID_FLGO) ;FETCH FLAGS LOR ; ; SET SECTOR ; RDSOK: LD (RDIOPB + PB_SECO),A ;SAVE CURRENT SECTOR ; ; CHECK CONSOLE FOR ABORT ; LD C,11 ;GETLD H,0 CALL PUTD ; ; OUTPUT SECTOR ; LD DE,SECM CALL MSGOT ; POP AF ;SIDE FLAG (CF) POP HL ;H: SPT LD A,(RDIIX= IOPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; THIS ENTRY SETS XFER COUNT0 ; FMTCKS: ADD A,(HL) ;ADD TO BYTE INC HL ;POINT TO NEXT BYTE DJNZ FMTCKS ;IF --COUNT != 0 THEN REPEAT ; ; STORE -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; EXIT - CF= ERROR ; ;+O),A LD (RDIOPB + PB_DRVO),A ; ; PAUSE FOR READY ; LD DE,MSGXX ;PRINT TYPE CR WHEN READY MSG CALL MSGOT CALL CNSIN  DEC HL LD (RDIOPB + PB_TRKO),HL ; LD IX,RDIOPB ; ; NEW LINE ; CALL CRLF ; ; ALL SET TO DO TRACK, SET TRACK SIZED L,A LD A,(RDIOPB + PB_TRKO) ;FETCH TRACK CP A,1 ;IF TRACK 0 THEN TEST BIT 0 JR C,RDTST JR Z,RDTST1 ;IF TRACK 1 THEN CONSOLE STATUS CALL BDOS ; OR A,A JP Z,NOABRT ; LD C,1 ;FLUSH CONSOLE CHAR BEFORE ABORT CALL BDOS ; LD DE,ABRTDOPB + PB_SECO) ;IF SIDE == 0 THEN SECTOR OK LD L,A JP NC,RDSOK2 ; SUB A,H ;ELSE SECTOR -= SPT LD L,A ; RDSOK2: LD H, TO 128 ; EXIOPBX: LD (IX + PB_BCNTO),128 LD (IX + PB_BCNTO + 1),0 ; ; FALL INTO EXECUTE IOPB FUNCTION ; ; THIS ENCHECKSUM IN LAST BYTE ; NEG LD (HL),A ; ; FORMAT THE TRACK ; LD DE,FMTGM ;OUTPUT FORMATTING MESSAGE CALL MSGOT ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDR: ; ; OUTPUT PROMPT ; LD DE,MSGFD CAL ;IF NOT CR THEN REPEAT CP A,CR JR NZ,SELDR ; ; TELL CONTROLLER WHAT TYPE DISK WE'RE DOING ; LD IX,IOPB LD (IX + PB ; RDTRKL: LD HL,SSXLATE ;ASSUME SINGLE SIDED LD (XLATPTR),HL ; LD A,(RDIOPB + PB_TRKO) ;FETCH SECTORS PER TRACK CALL TEST BIT 1 ; SRL L ;ELSE TEST BIT 2 ; RDTST1: SRL L ; RDTST: BIT 0,L ;IF DOUBLE DENSITY THEN NO XLATE LD A,(CURSECM ;OUTPUT ABORTED MESSAGE JP MSGOT ; ; NOABRT: ; ; IF LAST SECTOR OF TRACK THEN DONE ; LD HL,NSECTS LD A,(CURSEC) 0 CALL PUTD ; ; EXECUTE THE READ ; LD IX,RDIOPB CALL EXIOPBX ; LD DE,ERM ;IF READ ERROR THEN OUTPUT ERROR CALLTRY ASSUMES IOPB ALL SET UP ; EXECIOPB: PUSH IX ; LD C,2 ;EXECUTE IOPB COMMAND RST BIOS ; ; TEST FOR ERROR ; PO LD HL,(IOPB + PB_TRKO) CALL PUTD ; LD DE,ENDEQM CALL MSGOT ; LD IX,IOPB LD (IX + PB_CMDO),PB_FRMTC ;INSURE IS FORL MSGOT ; ; GET RESPONSE ; CALL CNSIN ; ; IF RETURN THEN EXIT ; CP A,CR ;IF RETURN THEN EXIT SCF RET Z ; ; _CMDO),PB_STDKC ;SET DISK PARAMETERS CMD ; LD HL,IDSIMG + ID_FLGO ;SAME AS ID SECTOR DATA LD (IOPB + PB_DMAO),HL ; LD (I GETSPT LD L,A ; LD A,(IDSIMG + ID_HEADS) ;IF DOUBLE SIDED THEN SECTORS *= 2 CP A,1 LD A,L ;RESTORE SECTORS JR Z,SET) JR NZ,RDSOK ; ; IF NOT 128 BYTE SECTORS THEN NO XLATE ; LD L,A ;SAVE SECTOR LD A,(RDIOPB + PB_TRKO) CALL GETSSZ  CP A,(HL) JR NC,TDONE ; ; OUTPUT TESTING TRACK MESSAGE ; LD DE,TSTGM CALL MSGOT ; LD HL,(RDIOPB + PB_TRKO) CAL NZ,MSGOT ; ; NEXT SECTOR & REPEAT ; LD A,(CURSEC) INC A JP RDLP ; ; ; TRACK IS DONE, NEXT TRACK ; TDONE: LD P IX LD A,(IX + PB_STATO) OR A,A IF DIAG = TRUE ; ; RETURN IF OK ; RET Z ; ; OUTPUT ERROR DATA ; PUSH AF MAT COMMAND CALL EXIOPBX ;FORMAT TRACK ; ; TELL LAST PADDING ; PUSH AF LD HL,(IOPB + PB_ST2O) CALL PUTD ; POP A SAVE DRIVE LETTER IN MESSAGES ; LD (DRLTR),A ;ELSE SAVE DRIVE LETTER & TEST FOR LEGAL LD (LTRSE),A ; ; TEST FOR LEGALX + PB_FLGO),0 ;SET PARAMS & DISABLE LOGON ; JP EXIOPBX ;***************************************************************NSEC ; ; DOUBLE SIDED, DOUBLE SECTORS & XLATION TABLE ; ADD A,A ; LD HL,DSXLATE LD (XLATPTR),HL ; SETNSEC: INC A OR A,A LD A,L ;RESTORE SECTOR JP NZ,RDSOK ; ; ELSE XLATE SECTOR ; LD HL,(XLATPTR) ;POINT TO TABLE DEC A ;{1..L PUTD ; ; OUTPUT SIDE NO. ; LD DE,SIDEM CALL MSGOT ; LD A,(RDIOPB + PB_TRKO) CALL GETSPT PUSH AF ;SAVE SPT FOA,(RDIOPB + PB_TRKO) DEC A LD (RDIOPB + PB_TRKO),A ; ; IF NEXT TRACK < 0 THEN RETURN ; JP P,RDTRKL ; LD DE,OKM J LD L,A LD H,0 PUSH IX PUSH HL LD DE,IOPBERM CALL MSGOT ; POP HL CALL PUTD ; POP IX PUSH IX LD L,(IX + PB_0 %+ &, !'- "(. #)/ $*0ST1O) LD H,0 CALL PUTD POP IX POP AF ; ENDIF RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DISK FORMAT PHYSICAL SECTORL DISK DESCRIPTOR SECTOR DATA ;########################################################################### ; ; SINGLE DENSITY DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; PAD TO FORMAT DATA WITH E5H ; REPT IDSIMG + 40H - ########################################## ; ; DISK DESCRIPTOR SECTOR OVERLAYS ; ;########################################## ; DB 0 ;;DISK TYPE DW 77 ;;NUMBER OF CYLINDERS DB 1 ;;NUMBER OF HEADS DW 0 ;;REDUCED WRITE CURRENT CYL DB 26 ;;MEDIUMTORS PER TRACK, BYTES PER SECTOR ENDM ; ; ADDITIONAL DISK PHYSICAL FORMAT INFO ; DB 3 ;;DISK TYPE DW 77 ;;NUMBER OF CSKETTE PHYSICAL FORMAT DATA ; DB 00000110B ;DISKETTE FLAGS ; DB 26,0 ;;SECTORS PER TRACK, BYTES PER SECTOR DB 48,0 DB +++++++++++++++++ ; ; RETURN TRACK PHYSICAL SECTORS PER TRACK FUNCTION ; ENTRY- A= TRACK {0,1,..N-1} ; EXIT - A= PHYSICAL SE SIZE INDEX FUNCTION ; ENTRY- A= TRACK {0,1,..N-1} ; EXIT - A= SECTOR SIZE INDEX {0:128, 1:256, 2:512, 3:1024} ; ;++++++++++ DESCRIPTOR SECTOR (128 BYTES) ; TRACK 0..77= SD, (SDSPTC) 128 BYTE SECTORS ; ;##############################################$ LIST OFF DB 0E5H LIST ON ENDM ; ; DISKETTE FORMAT DATA ; DB 00000000B ;DISKETTE FLAGS ; REPT 3 DB 26,0 ;;S################################# IF DSIZE = 8 ; ; SINGLE SIDED, SINGLE DENSITY, IBM 3740 ; SSSD40ID: SSSDID: DW 26  PRECOMP START CYL DB 52 ;;HIGH PRECOMP START CYL DB 0 ;;ECC BURST LENGTH DB 0 ;;CONTROL ;-----------------------------YLINDERS DB 2 ;;NUMBER OF HEADS DW 0 ;;REDUCED WRITE CURRENT CYL DB 26 ;;MEDIUM PRECOMP START CYL DB 52 ;;HIGH PRECOMP S48,0 ; ; ADDITIONAL DISK PHYSICAL FORMAT INFO ; DB 2 ;;DISK TYPE DW 77 ;;NUMBER OF CYLINDERS DB 1 ;;NUMBER OF HEADS CTORS PER TRACK {1,2,..255} ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETSPT: ; ; TO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETSSZ: PUSH HL LD HL,IDSIMG + ID_SSZDO JP GETIDD S############################# IDSIMG: ; ; RESERVE FIRST 16 BYTES FOR BOOT, IF NEEDED ; REPT 16 LIST OFF DB 0E5H LIECTORS PER TRACK, ;; BYTES PER SECTOR {0:128, 1:256, 2:512, 3:1024} ENDM ; ; ADDITIONAL DISK PHYSICAL FORMAT INFO ; ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTOR----------------------------------------------- ; ; DOUBLE SIDED SINGLE DENSITY, 128 BYTE SECTORS ; DSSDID: DW 52 ;SECTORTART CYL DB 0 ;;ECC BURST LENGTH DB 0 ;;CONTROL ;---------------------------------------------------------------------- DW 0 ;;REDUCED WRITE CURRENT CYL DB 26 ;;MEDIUM PRECOMP START CYL DB 52 ;;HIGH PRECOMP START CYL DB 0 ;;ECC BURST LENGTH  IMPROVE SPEED DEFAULT TO DATA TRACKS ; PUSH HL LD HL,IDSIMG + ID_SPTDO ; ; COMMON GET DATA CODE ; GETIDD: CP A,1 ;TUBTTL INITIALIZED DATA ;############################################################################ ; ; SINGLE DENSITY TRANSST ON ENDM ; ; DISK DESCRIPTOR SECTOR KEY ; DB 'Disk Descriptor2' ; ; DISK PARAMETER BLOCK IMAGE, TO BE TRANSFERRED T DB 0 ;;DISK TYPE DW 77 ;;NUMBER OF CYLINDERS DB 1 ;;NUMBER OF HEADS DW 0 ;;REDUCED WRITE CURRENT CYL DB 26 ;;MEDIUM PRY MAXIMUM DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 0FH ;BLOCK MASK DB 1 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX------ ; ; SINGLE SIDED DOUBLE DENSITY, 128 BYTE SECTORS ; SSDD48ID: DW 48 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 0 ;;CONTROL ;---------------------------------------------------------------------------- ; ; DOUBLE SIDED DOUBLE DEEST TRACK NO. ; ; IF TRACK == 1 THEN SET PTR TO TRK 1 DATA ; JR Z,GFT1 ; ; ELSE TO IMPROVE SPEED, DEFAULT TO DATA TRALATION TABLE ; ;############################################################################ ; ; SINGLE SIDED ; SSXLATE:O BIOS AT LOGON TIME ; DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ECOMP START CYL DB 52 ;;HIGH PRECOMP START CYL DB 0 ;;ECC BURST LENGTH DB 0 ;;CONTROL ; FILL REMAINING SECTOR DATA WITOR DB 0 ;PHYSICAL RECORD MASK ; ; DISKETTE PHYSICAL FORMAT DATA ; DB 00000000B ;DISKETTE FLAGS ; REPT 3 DB 26,0 IMUM DB 10000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR  DB 0FH ;BLOCK MASK DB 1 ;NULL MASK DW 224 ;DISK SIZE -1 DW 63 ;DIRECTORY MAXIMUM DB 10000000B ;ALLOC 0 DB 0 ;ANSITY, 128 BYTE SECTORS ; DSDD48ID: DW 96 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 0FH ;BLOCK MASK DB 0 ;NULCKS ; JP NC,RETIT ; ; ELSE SET PTR TO TRK 0 ; DEC HL DEC HL ; GFT1: DEC HL DEC HL ; RETIT: LD A,(HL) POP HL  IF DSIZE = 8 GXLATE 26,6 ENDIF ; ; DOUBLE SIDED ; DSXLATE: IF DSIZE = 8 GXLATE 52,6 ENDIF SUBTT ;DISK SIZE -1 DW 63 ;DIRECTORY MAXIMUM DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET TH E5H ; REPT IDSIMG + 128 - $ ;FILL OUT SECTOR LIST OFF DB 0E5H LIST ON ENDM ;#################################;;SECTORS PER TRACK, ;; BYTES PER SECTOR {0:128, 1:256, 2:512, 3:1024} ENDM ; ; ADDITIONAL DISK PHYSICAL FORMAT INFO  DB 0 ;PHYSICAL RECORD MASK ; ; DISKETTE PHYSICAL FORMAT DATA ; DB 00001000B ;DISKETTE FLAGS ; REPT 3 DB 26,0 ;;SECLLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; DIL MASK DW 448 ;DISK SIZE -1 DW 127 ;DIRECTORY MAXIMUM DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 20 %+ &, !'- "(. #)/ $*0 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; DISKETTE PHYSICAL FORMAT DATA ; Dsingle density, IBM 3740 (249k)' DB CR,LF,'1. Single sided, single density, 26 SPT (249K)' DB LF DB CR,LF,'2. Single siding track $' ENDEQM DB ' End = $' TSTGM DB CR,'Testing track $' SIDEM DB ' Side $' SECM DB ' Sector $' CRLFM DB CR,LF,'$LDD512 DW TLDD102 IF DSIZE = 8 ;############################################################################ ; ; SI DB 1,2,3,4,5,6,7,8,9,10,11,12,13 DB 14,15,16,17,18,19,20,21,22,23,24,25,26 ; IF $ >= (TLSD128 + 128) ; ; USER WARN ;DATA ID MARK DB 128,0E5H ;DATA DB 128,0E5H DB 1,0F7H ;DATA CRC DB 42,0FFH ;GAP 3 DB 0 ; DB 0FFH ;GAP 4B DATA ,0F7H ;HEADER CRC DB 11,0FFH ;GAP 2 DB 6,0 ;SYNC DB 1,0FBH ;DATA ID MARK DB 255,0E5H ;DATA DB 255,0E5H DB 2,0E5H D 1,0FEH ;ID MARK DB 0 ; DB 1,3 ;SECTOR SIZE INDEX (3= 1024 BYTES) DB 1,0F7H ;HEADER CRC DB 11,0FFH ;GAP 2 DB 6,0 ;SYNB 00001110B ;DISKETTE FLAGS ; DB 26,0 ;;SECTORS PER TRACK, BYTES PER SECTOR DB 48,0 DB 48,0 ; ; ADDITIONAL DISK PHYSIed, double density, 48 SPT (460k)' DB CR,LF,'3. Double sided, single density, 52 SPT (499k)' DB CR,LF,'4. Double sided, ' OKM DB ' Ok',CR,LF,'$' ERM DB ' Error!',CR,LF,'$' ABRTDM DB ' ** ABORTED **',CR,LF,'$' IF DIAG IOPBERM DB CR,LF,'IONGLE DENSITY FORMAT TABLE ; THIS TABLE WILL COMPILE CODE WITHIN THE JADE FLOPPY CONTROLLER, WHICH ; WILL PERFORM THE ACTUAL FOING MESSAGE ; CONMSG **** WARNING! SD128 TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLSD128 + 128) - $ LIST OFF DB ; GXLATE 15,3 ; IF $ >= (TLSD256 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! SD256 TABLE EXCEEDS 128 BB 1,0F7H ;DATA CRC DB 58,0FFH ;GAP 3 DB 0 ; DB 0FFH ;GAP 4B DATA ; GXLATE 8,3 ; IF $ >= (TLSD512 + 128) ; ; C DB 1,0FBH ;DATA ID MARK DB 255,0E5H ;DATA DB 255,0E5H DB 255,0E5H DB 255,0E5H DB 4,0E5H DB 1,0F7H ;DATA CRC DCAL FORMAT INFO ; DB 4 ;;DISK TYPE DW 77 ;;NUMBER OF CYLINDERS DB 2 ;;NUMBER OF HEADS DW 0 ;;REDUCED WRITE CURRENT CYL double density, 96 SPT (921k)' ; DB CR,LF,LF,'9. Custom configuration' DB CR,LF,LF,'Any Other to Stop.' DB CR,LF,LF,'EntePB error = (status fdc status) $' ENDIF BIOSM DB CR,LF,'BIOS Not Compatable - Aborting...$' SUBTTL DISK FORMAT LISTRMAT FUNCTION ; ;############################################################################ TLSD128: DB 26 ;SPT ; DB 40 LIST ON ENDM ENDIF ;############################################################################ ; ; SINGLE DENYTES!! **** ELSE REPT (TLSD256 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF ;############################# USER WARNING MESSAGE ; CONMSG **** WARNING! SD512 TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLSD512 + 128) - $ LISB 138,0FFH ;GAP 3 DB 0 ; DB 0FFH ;GAP 4B DATA ; GXLATE 4,2 ; IF $ >= (TLSD102 + 128) ; ; USER WARNING MESSAGE  DB 26 ;;MEDIUM PRECOMP START CYL DB 52 ;;HIGH PRECOMP START CYL DB 0 ;;ECC BURST LENGTH DB 0 ;;CONTROL ENDIF ;#r function number: $' MSGSE: DB CR,LF,LF LTRSE: DB ' Is not a valid selection. Stop (Y/N) - $' MSGFD: DB CR,LF,LF,'Write f TABLES ;############################################################################ ; ; FORMAT LIST TABLE TABLE ; ;######0,0FFH ;GAP 4A DB 6,0 ;SYNC DB 1,0FCH ;INDEX MARK DB 26,0FFH ;GAP 1 DB 0 ; DB 6,0 ;SYNC DB 1,0FEH ;ID MARK DB 0 SITY 256 BYTE FORMAT TABLE ; ;############################################################################ TLSD256: DB 15 ;############################################### ; ; SINGLE DENSITY 512 BYTE FORMAT TABLE ; ;################################T OFF DB 0 LIST ON ENDM ENDIF ;############################################################################ ; ; ; CONMSG **** WARNING! SD102 TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLSD102 + 128) - $ LIST OFF DB 0 LIST ON ########################################################################## ; ; MESSAGES ; ;##############################ormat on controller drive ',7BH,'0..3',7DH DB ' (CR to reselect): $' MSGNC: DB CR,LF,LF,'Execution Error!$' SKERM: DB CR,LF,###################################################################### TBLPTRS: DW TLSD128 ;SINGLE DENSITY 128 BYTE SECTORS ; DB 1,0 ;SECTOR SIZE INDEX (0= 128 BYTES) DB 1,0F7H ;HEADER CRC DB 11,0FFH ;GAP 2 DB 6,0 ;SYNC DB 1,0FBH ;DATA ID MARSPT ; DB 40,0FFH ;GAP 4A DB 6,0 ;SYNC DB 1,0FCH ;INDEX MARK DB 26,0FFH ;GAP 1 DB 0 ; DB 6,0 ;SYNC DB 1,0FEH ;ID ############################################ TLSD512: DB 8 ;SPT ; DB 40,0FFH ;GAP 4A DB 6,0 ;SYNC DB 1,0FCH ;INDEX MA SINGLE DENSITY 1024 BYTE FORMAT TABLE ; ;############################################################################ TLSD10 ENDM ENDIF FORM ;########################################################################### ; ; DOUBLE DENSITY############################################# MSGFL: DB CR,LF,LF,'****** Functions List ******' DB CR,LF,'0. Single sided, 'Seek Error. Is Drive Double Sided?$' MSGXX: DB CR,LF,LF,'Type CR when drive ' DRLTR: DB ' is ready. $' FMTGM DB CR,'Formatt DW TLSD256 DW TLSD512 DW TLSD102 ;1024 BYTE SECTORS ; DW TLDD128 ;DOUBLE DENSITY 128 BYTE SECTORS DW TLDD256 DW TK DB 128,0E5H ;DATA DB 1,0F7H ;DATA CRC DB 27,0FFH ;GAP 3 DB 0 ; DB 0FFH ;GAP 4B DATA ; ; SECTOR SKEW TABLE ;MARK DB 0 ; DB 1,1 ;SECTOR SIZE INDEX (1= 256 BYTES) DB 1,0F7H ;HEADER CRC DB 11,0FFH ;GAP 2 DB 6,0 ;SYNC DB 1,0FBHRK DB 26,0FFH ;GAP 1 DB 0 ; DB 6,0 ;SYNC DB 1,0FEH ;ID MARK DB 0 ; DB 1,2 ;SECTOR SIZE INDEX (2= 512 BYTES) DB 12: DB 4 ;SPT ; DB 40,0FFH ;GAP 4A DB 6,0 ;SYNC DB 1,0FCH ;INDEX MARK DB 26,0FFH ;GAP 1 DB 0 ; DB 6,0 ;SYNC DB 128 TABLE ; ;########################################################################### TLDD128: DB 48 ;SPT ; DB 80,40 %+ &, !'- "(. #)/ $*0EH ;GAP 4A DB 12,0 ;SYNC DB 3,0F6H DB 1,0FCH ;INDEX MARK DB 32,4EH ;GAP 1 DB 0 ; DB 8,0 ;GAP 3 DB 3,0F5H ;G#### ; ; IBM SERIES 34 DOUBLE DENSITY TABLE (256 BYTE SECTORS) ; ;########################################################G **** WARNING! DD TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLDD256 + 128) - $ LIST OFF DB 0 LIST ON ENDM EN ;DATA OVERFLOW DB 1,0F7H ;DATA CRC DB 84,4EH ;GAP 3 DB 0 ; DB 4EH ;GAP 4 DATA ; ; DOUBLE DENSITY SKEW TABLE, S DB 1,0FEH ;ID MARK DB 0 ; DB 1,3 ;SECTOR SIZE INDEX (3= 1024 BYTES) DB 1,0F7H ;HEADER CRC DB 22,4EH ;GAP 2 DB 12########################################################## ; ; FORMAT TRACK IOPB ; IOPB: DB PB_FRMTC ;FORMAT TRACK DB 0  ;############################################################################ NSECTS DS 1 ;NUMBER OF SECTORS IN TRACK CURSEC+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT TRACK FUNCTION ; EXIT - AF= /0: ERROR ; ;+++AP A1 DB 1,0FEH ;ID MARK DB 0 ; DB 1,0 ;SECTOR SIZE INDEX (0= 128 BYTES) DB 1,0F7H ;HEADER CRC DB 22,4EH ;GAP 2 ################### TLDD256: DB 26 ;SPT ; DB 80,4EH ;GAP 4A DB 12,0 ;SYNC DB 3,0F6H DB 1,0FCH ;INDEX MARK DB 5DIF ;########################################################################### ; ; IBM SERIES 34 DOUBLE DENSITY TABLEKEW 8 SEEMS OPTIMUM ; GXLATE 15, 3 IF $ >= (TLDD512 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! DD51,0 ;SYNC DB 3,0F5H ;GAP A1 DB 1,0FBH ;DATA MARK DB 255,0E5H ;DATA DB 255,0E5H DB 255,0E5H DB 255,0E5H DB 4,0E5H ;DRIVE DW 0 ;TRACK DW 1 ;SECTOR DB 0 ;FLAG DW SECBUF ;DMA DB 0 DW 128 ;COUNT DW 0,0 ;STATUS ; ; WRITE DS 1 ;CURRENT SECTOR DTYPE DS 1 ;DISK TYPE XLATPTR DS 2 ;XLATION TABLE PTR ; ; READ SECTOR BUFFER ; SECBUF DS 1024++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FMTTRK: ; ; SELECT DISK FORMAT TABLE BASED ON SECT DB 8,0 ;SYNC DB 3,0F5H ;GAP A1 DB 1,0FBH ;DATA MARK DB 128,0E5H ;DATA DB 1,0F7H ;DATA CRC DB 24,4EH ;GAP 3 DB 0,4EH ;GAP 1 DB 0 ; DB 12,0 ;GAP 3 DB 3,0F5H ;GAP A1 DB 1,0FEH ;ID MARK DB 0 ; DB 1,1 ;SECTOR SIZE INDEX (1=  (512 BYTE SECTORS) ; ;########################################################################### TLDD512: DB 15 ;SPT ; 2 TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLDD512 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF ;######## DB 1,0E5H ;DATA OVERFLOW DB 1,0F7H ;DATA CRC DB 116,4EH ;GAP 3 DB 0 ; DB 4EH ;GAP 4 DATA ; ; DOUBLE DENSITY  ID SECTOR IOPB ; WIDIOPB: DB PB_WRITC ;WRITE SECTOR DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAG DW  ;SECTOR BUFFER END OR SIZE & TRACK DENSITY FLAGS ; LD A,(IOPB + PB_TRKO) ;FETCH SECTOR SIZE CALL GETSSZ ; AND A,3 ;MOULO 4 ADD A,A ;X0 ; DB 4EH ;GAP 4 DATA ; ; DOUBLE DENSITY SKEW TABLE, SKEW 8 SEEMS OPTIMUM ; GXLATE 48, 6 IF $ >= (TLDD128 + 12256 BYTES) DB 1,0F7H ;HEADER CRC DB 22,4EH ;GAP 2 DB 12,0 ;SYNC DB 3,0F5H ;GAP A1 DB 1,0FBH ;DATA MARK DB 255,0 DB 80,4EH ;GAP 4A DB 12,0 ;SYNC DB 3,0F6H DB 1,0FCH ;INDEX MARK DB 50,4EH ;GAP 1 DB 0 ; DB 12,0 ;GAP 3 DB ################################################################### ; ; IBM SERIES 34 DOUBLE DENSITY TABLE (1024 BYTE SECTORSKEW TABLE, SKEW 8 SEEMS OPTIMUM ; GXLATE 8, 2 IF $ >= (TLDD102 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WIDSIMG ;DMA DB 0 DW 128 ;COUNT DW 0,0 ;STATUS ; ; READ SECTOR IOPB ; RDIOPB: DB PB_READC ;READ SECTOR DB 0 ;IOPBs ; LD A,(IOPB + PB_DRVO) LD (WIDIOPB + PB_DRVO),A ; LD HL,IDSIMG LD (WIDIOPB + PB_DMAO),HL ; LD HL,ID_SECT ;SE2 LD L,A ;SAVE ; LD A,(IOPB + PB_TRKO) ;SELECT CORRECT DENSITY FLAG CP A,1 LD A,(IDSIMG + ID_FLGO) ;PREFETCH DENSITY 8) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! DD TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLDD128 + 128) - $E5H ;DATA DB 1,0E5H ;DATA OVERFLOW DB 1,0F7H ;DATA CRC DB 54,4EH ;GAP 3 DB 0 ; DB 4EH ;GAP 4 DATA ; ; DOUBLE 3,0F5H ;GAP A1 DB 1,0FEH ;ID MARK DB 0 ; DB 1,2 ;SECTOR SIZE INDEX (2= 512 BYTES) DB 1,0F7H ;HEADER CRC DB 22,4EHS) ; ;########################################################################### TLDD102: DB 8 ;SPT ; DB 80,4EH ;GAPARNING! DD102 TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLDD102 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF DRIVE DW 0 ;TRACK DW 1 ;SECTOR DB 0 ;FLAG DW SECBUF ;DMA DB 0 DW 128 ;COUNT DW 0,0 ;STATUS SUBTTL VAT ID SECTOR LD (WIDIOPB + PB_SECO),HL ; ; EXECUTE THE IOPB ; LD IX,WIDIOPB ;PASS PTR TO IOPB CALL EXIOPBX RET Z ; FLAGS JR Z,FMT1 ; JP NC,FMTDT ADD A,A ;SHIFT PROPER DENSITY BIT INTO BIT 3 ; FMT1: ADD A,A ; FMTDT: ADD A,A ; ;  LIST OFF DB 0 LIST ON ENDM ENDIF FORM ;#######################################################################DENSITY SKEW TABLE, SKEW 8 SEEMS OPTIMUM ; GXLATE 26, 6 IF $ >= (TLDD256 + 128) ; ; USER WARNING MESSAGE ; CONMS ;GAP 2 DB 12,0 ;SYNC DB 3,0F5H ;GAP A1 DB 1,0FBH ;DATA MARK DB 255,0E5H ;DATA DB 255,0E5H DB 2,0E5H DB 1,0E5H 4A DB 12,0 ;SYNC DB 3,0F6H DB 1,0FCH ;INDEX MARK DB 50,4EH ;GAP 1 DB 0 ; DB 12,0 ;GAP 3 DB 3,0F5H ;GAP A1  ENDIF ;############################################################################ ; ; IOPBS ; ;##################RIABLE DECLARATIONS ;############################################################################ ; ; UNINITIALIZED DATA ;  ; ERROR ENCOUNTERED, TELL IT ; LD DE,MSGNC ;ELSE OUTPUT ERROR & RETURN CALL MSGOT XOR A,A DEC A RET ;++++++++ IF DOUBLE DENSITY THEN ADD 4 ; AND A,8 OR A,L ;ADD IN SECTOR SIZE OFFSET ; LD HL,TBLPTRS ;FETCH DATA PTR FROM TABLE 0 %+ &, !'- "(. #)/ $*0;**************************************************************************** ; ; ASMB MACRO LIBRARY TOOLS ; ;************** **** ENDM  DRIVE {0..3} ; SUB A,'0' CP A,4 JR C,NMBRD ;IF LEGAL THEN CONTINUE ; ; ILLEGAL DRIVE, REPEAT ; LD DE,MSGSE ;PRIN********************************************************* ; ; The disk controller module (DCM) resides internal to the Jade GRH ; Fix bug causing code to crash after predictable number of warm boots. ; A CALL was being made without a return in the lo; Modify module to allow EPROM at low memory & RAM at high memory. ; Add diagnostics & better error reporting. ; Add EIA I/O.  SUBTTL FIRMWARE DEFINITIONS FALSE EQU 0 TRUE EQU NOT FALSE ;======================================================== SUBTTL MAIN FIRMWARE ;*************************************************************************** ; ; REGISTER USAGE: ;************************************************************** ; ; REVISIONS: ; ; 1.0 - 4 NOV 85 GRH ; RELEASE ; ;*** THEN DIFFERENT MESSAGE JR NZ,FTE1 ; LD DE,SKERM ; FTE1: CALL MSGOT XOR A,A ;RETURN ERROR FLAG DEC A RET ;+++T SELECT ERROR MESSAGE CALL MSGOT JR SELDR ; ; ; DRIVE SELECTED ; NMBRD: LD (IOPB + PB_DRVO),A LD (WIDIOPB + PB_DRVDouble D ; Disk Controller board. This program provides a facility to read/write ; diskette sectors & format diskette tracks (gin function. ; ; 1.2 - 1 AUG 82 GRH ; ADDED RECAL FEATURE TO RECOVER FROM THE INSTANCE WHERE THE ; HEAD IS OUTSIDE TRACK  ; Change Command block structure to common IOPB structure. ; Add 5 1/4" disk hooks. ; ; 2.1 - 2 NOV 86 GRH ; Changed seek==================== ; ; ASSEMBLY TIME CONSTANTS ; ;======================================================================== A, B= SCRATCH ; C= 179X INVERSION CONSTANT ; DE= USED FOR R/W FLAG BY R/W SECTOR SUBR ; DE'= SECTOR DATA FOR READ/WRITE SECT************************************************************************* ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; CONSOLE +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; EXIT - CF= ERROR ; ;+O),A LD (RDIOPB + PB_DRVO),A ; ; PAUSE FOR READY ; LD DE,MSGXX ;PRINT TYPE CR WHEN READY MSG CALL MSGOT CALL CNSIN in single & double density). ; This module sets the parameters for each drive during the "LOG-ON" ; operation. The FORMAT prog0 BUT THE SENSOR IS STILL GIVING ; THE TRACK 0 SIGNAL. IF TRK 0 SENSE IS TRUE ON ENTRY, THE ; HEAD IS STEPPED IN SEVERAL TRACK routines to allways set up new controls even if track ; is the same. This should allow the forcing of new controls to work. ==== DSIZE EQU 5 ;SIZE OF DISK DRIVES DFDFL EQU 0 ;DEFAULT DISK FLAGS ;================================================OR FUNCTIONS ; HL= PTR TO DATA XFER BY R/W SECTOR SUBR ; IX= DISK PARAMETER BLOCK PTR ; IY= 179X NMI RETURN ADDRESS ; AF'= RMEMORY ERROR MESSAGE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ?OVRLAP MACRO #TEXT,#DATA U DL #DATA U4 DL U / 1000H + 1 U DL U +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDR: ; ; OUTPUT PROMPT ; LD DE,MSGFD CAL ;IF NOT CR THEN REPEAT CP A,CR JR NZ,SELDR ; ; TELL CONTROLLER WHAT TYPE DISK WE'RE DOING ; LD IX,IOPB LD (IX + PBram (not in this module) writes an ident- ; ification sector (T0,S1) which provides the needed information. If this ; identityS, THEN A TRK 0 SEEK IS ; PERFORMED. ; ; 1.3 - 31 AUG 83 GRH ; Add sector de-blocking algorithms for 256 byte sectors. Rem; ; 2.2 - 31 DEC 86 GRH ; Added precomp thresholds to disk table. ; Added forced interrupt to reset because FDC is not soft============================ ; ; INCLUDED DEFINITIONS ; ;*INCLUDE JDDLOC.DEF ;*INCLUDE COMIOPB.DEF ;*INCLUDE JDDDISK.DEF /W FLAGS ; BC', HL'= NOT USED ; ;*************************************************************************** ;------------- ((U4 - 1) * 1000H) U3 DL U / 100H + 1 U DL U - ((U3 - 1) * 100H) U2 DL U / 10H + 1 U DL U - ((U2 - 1) * 10H) + 1 OVEROUTL MSGOT ; ; GET RESPONSE ; CALL CNSIN ; ; IF RETURN THEN EXIT ; CP A,CR ;IF RETURN THEN EXIT SCF RET Z ; ;  TITLE DISK CONTROLLER MODULE (DCM) LIST NOCOND ;************************************************************************** sector is not present on the diskette, it is assumed to be a ; standard 8" IBM 3740 format. ; ;*****************************ove unused ; code & vars. Optimize code. ; ; 1.4 - 30 OCT 85 GRH ; Revise objects for improved include file. Add hooks forware resetable. ; and may cause a 'hang' condition. ; Add double density logon read first and if fail then try single ; den;*INCLUDE JDDCONT.DEF ;*MACLIB ASMBTOOL.MLB ; ;============================================================================ --------------------------------------------------------------- ; ; JUMP IS EXECUTED WHEN THE ONBOARD Z80 IS RESET. ; ;-- #TEXT,0123456789ABCDEF ENDM ; OVEROUT MACRO #TEXT,#N CONMSG **** CODE OVERLAPPING #TEXT BY #N(U4)#N(U3)#N(U2)#N(U)H BYTES SAVE DRIVE LETTER IN MESSAGES ; LD (DRLTR),A ;ELSE SAVE DRIVE LETTER & TEST FOR LEGAL LD (LTRSE),A ; ; TEST FOR LEGAL* ; ; The Disk Controller Module contains the firmware for the Jade ; Double D Disk controller board. ; ;**************************************************************** ; ; REVISION STATUS: ; ; 1.0 - 1 AUG 82 GRH ; Initial release ; ; 1.1 -  double sided ; drives. Change logon to return boolean reflecting a valid descriptor ; sector. ; ; 2.0 - 24 nov 85 grh sity read before giving up. ; VERSN EQU 0202H ; ;*************************************************************************** LIST OFF *INCLUDE JDDLOC.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE JDDCONT.DEF *MACLIB ASMBTOOL.MLB LIST ON------------------------------------------------------------------------- ORG 0 ; XOR A,A ;DISABLE NMI OUT (BLCTL),A J0 %+ &, !'- "(. #)/ $*0P CLEAR ;RESET & RE-INITIALIZE Z-80 REGS ;**************************************************************************** ; 8 VECTOR ; ; USE SMALLER TIME TO OFFSET CALLING TIME ; LD B,TMRFC ;SET CONSTANT DJNZ $ JP TICKE ;GOTO TICK ENTRY ;************************************ ; ; RESTART 40 FUNCTION - READ SECTOR ; ENTRY - HL= DATA PTR ; DE= PHYSICAL SECTOR ; EN RESTARTING THE LOCAL ; PROCESSOR FROM A HALT IN ORDER TO PROCESS A COMMAND. ; ;******************************************* ; EXIT - (COMMAND BLOCK STATUS)= A= FDC STATUS ; IY= INTERRUPTED ADDRESS ; ;********************************************************* XCUTE: ; ; CLEAR THE HOST INTERRUPT FLOP ; IN A,(XPIRR) ; ; ASSUME NO ERROR ; XOR A,A LD (CMDBLK + OG-ON DRIVE DW READ ;READ SECTOR DW WRIT ;WRITE SECTOR DW FORM ;FORMAT TRACK DW ADDR ;READ ADDRESS DW EIAOUT ;EIAIOS TO ACCESS THE DESCRIPTOR DATA IN ORDER TO FINISH THE LOG-ON ; OPERATION. ; ;--------------------------------------------- ; RESTART 8 FUNCTION - 100us TIMER ; THIS SUBROUTINE IS THE ENTRY POINT FOR THE DISK CONTROLLER TIMING MODULE. ; THIS MODUL ; DELAY FOR 100 us ; TICKR: LD B,TMRNC ;SET NORMAL CONSTANT DJNZ $ ; ; IF MULTIPLIER NOT EXHAUSTED THEN REPEAT TIMEEXIT - NZ= ERROR ; A, HL, B= ? ; ;**************************************************************************** ORG 40 ;PO********************************* ORG 56 ;POSITION CODE FOR RESTART 56 VECTOR JP XCUTE ;------------------------------***************************** IF $ > 66H ?OVRLAP NMI VECTOR,$-66H ENDIF ORG 66H ;POSITION CODE FOR NMI VECTOR LOCATION PBSTATO),A LD (CMDBLK + PBST1O),A ; ; GET FDC'S ATTENTION FOR COMMANDS ; CALL EXSTS ; ; FETCH COMMAND FROM COMMUNIC OUT DW EIAIN ;EIA IN DW IDLE ;BACKGROUND DW RETVER ;RETURN FIRMWARE VERSION DW SETFLGS ;SET DISK FLAGS DW LDHDI ------------------------------- LGON: ; ; SELECT DRIVE 1ST ; CALL SELECT RET NZ ;IF DRIVE ERROR THEN RETURN ; ; SE PROVIDES DELAYS WHICH ARE MULTIPLES OF 100 us. THE CONTENTS OF ; DE DETERMINES THE TOTAL PERIOD. (DELAY= DE * 100 us). ; ENT ; TICKE: DEC DE ;COUNT -1 LD A,D OR A,E ;IF COUNT NOT 0 THEN REPEAT NOP NOP JR NZ,TICKR ; ; DONE ; RET SITION CODE FOR RESTART 40D VECTOR EX AF,AF' ;SET UP READ XOR A,A DEC A EX AF,AF' JP RWSECT ;*******************---------------------------------------------- ; ; SPARE COMMAND, RETURNS COMMAND ERROR ; ;------------------------------- ; ; GET FDC STATUS & PUT INTO COMMAND BLOCK FOR HOST INTERPRETATION ; IN A,(WDSTS) ;CLEARS INTERRUPT TOO XOR A,C ; ; ATION BLOCK ; LD A,(CMDBLK + PBCMDO) ; ; IF ILLEGAL COMMAND THEN RETURN COMMAND ERROR ; CP NCMDS JR NC,SPAR ; ; ;LOAD HEAD & WAIT DW SEEKTRK ;SEEK TRACK DW SETDP ;SET DISK DRIVE PARAMETERS DW RETDST ;RETURN DRIVE STATUS DW SETBAUET UP TO READ DESCRIPTOR SECTOR ; XOR A,A ;SET TRACK=0 LD (CMDBLK + PBTRKO),A ; LD A,2 ;SET SECTOR LD (CMDBLK + PBSERY- DE= 100 MICROSECOND MULTIPLIER (0= 65,536) ; EXIT - DE= A= B= 0 ; ;****************************************************** ;**************************************************************************** ; ; RESTART 32 FUNCTION - COMMAND FDC ; ENTRY********************************************************* ; ; RESTART 48 - NOT USED ; ;*************************************--------------------------------------------- SPAR: LD HL,CMDBLK + PBSTATO ;SET COMMAND ERROR LD (HL),CMDERR RET ;**** PUT RETURN ADDRESS ON STACK & RETURN TO IT. ; EX (SP),IY RETN ;*****************************************************COMPUTE COMMAND TABLE POINTER ; LD D,0 LD E,A ;SET UP OFFSET LD HL,CMDT ;SET TABLE PTR ADD HL,DE ADD HL,DE ;DO TWID ;SET EIA BAUD RATES DW CLR ;CLEAR IDLE COMMANDS NCMDS EQU ($ - CMDT) / 2 ;COMMAND COUNT ;---------------------------CO),A ; ; SEEK TRACK ; CALL SEEK ; ; TEST IF LOGON INHIBITED ; LD A,(IX + DVLGDO) OR A,A JR NZ,NODS ; ; RE********************** ; ; TIMING CONSTANTS FOR 100us ; IF DSIZE = 8 TMRFC EQU 19H ;1ST PASS TMRNC EQU 1CH ;NORMAL  - A= COMMAND ; EXIT - A= A XOR C ; ;**************************************************************************** ORG 32 *************************************** ORG 48 ;************************************************************************************************************************************************ ; ; THIS IS THE NON-MASKABLE INTERRUPT ROUTINE USED ********************** ; ; COMMAND SELECTOR SUBR GETS CONTROL AFTER THE DISK CONTROLLER IS ; INTERRUPTED FROM THE HALT CONDCE FOR WORD PTR ; ; FETCH COMMAND OFFSET FROM TABLE ; LD A,(HL) ;GET ADDRESS INC HL LD H,(HL) LD L,A ; ; EXECU------------------------------------------------- ; ; DRIVE LOG-ON COMMAND (0) ; READS THE IDENTITY SECTOR FROM THE DISKAD DESCRIPTOR SECTOR INTO BUFFER ; SET 0,(IX + DVFLG) ;ASSUME DOUBLE DENSITY FIRST LD HL,SBUFR ;READ INTO SECTOR BUFFER LPASS ENDIF IF DSIZE = 5 TMRFC EQU 0CH ;1ST PASS TMRNC EQU 0EH ;NORMAL PASS ENDIF ORG 8 ;POSITION FOR RESTART XOR A,C OUT (WDCMD),A EX (SP),HL EX (SP),HL EX (SP),HL EX (SP),HL RET ;******************************************* ; ; RESTART 56 (MASKABLE INTERRUPT) FUNCTION - EXECUTE THE COMMAND BLOCK ; MASKABLE HOST INTERRUPT ROUTINE - EXECUTED WHBY THE FDC ; UPON COMMAND TERMINATION. THE STATUS PORT IS INTERROGATED & SAVED (SVSTS). ; ENTRY- IY= INTERRUPT RETURN ADDRESS ITION. IT BRANCHES TO THE INDIVIDUAL ; COMMAND ROUTINES. ; ;****************************************************************TE COMMAND. ALL COMMANDS RETURN TO INTERRUPTED WAIT LOOP ; JP (HL) ;GOTO COMMAND ; ; COMMAND TABLE ; CMDT: DW LGON ;LETTE AND MAKES THE NEEDED ENTRYS ; INTO THE DRIVE TABLE OR DEFAULTS. THE SECTOR DATA IS ALSO LEFT IN THE SECTOR ; BUFFER FOR BD DE,IDSECT RST 40 JR Z,LGCHK ;IF READ SUCCESSFUL THEN GO CHECK FOR ID ; RES 0,(IX + DVFLG) ;NOW TRY SINGLE DENSITY LD0 %+ &, !'- "(. #)/ $*0 HL,SBUFR LD DE,IDSECT RST 40 ; ; CHECK FOR NEW DESCRIPTOR ID TEXT ; LGCHK: LD DE,DESCID ;SET STRING PTR LD HL,SBUFRISK PARAMETERS TO SINGLE SIDED, SINGLE DENSITY ; LD DE,DVFLG ;GET DRIVE TABLE ADDRESS CALL GETDVEL LD DE,DVSSSD EX DE,H FOR NON ID SECTORED DISKS ; ;########################################################################### DVSSSD: DB DFDFL ; ; ; SAVE OPERATION FLAGS ; EX AF,AF' ;SAVE OP IN ALT REGS ; ; SELECT DRIVE 1ST ; CALL SELECT ;SELECT DRIVE ; ;(HL) DEC HL ;INCLUDING THE KEY BYTES DEC HL DEC HL LD B,0 ; ; COMPUTE CHECKSUM ; NXTCKS: LD A,(HL) ADD A,B LD),A LD B,A LD A,(SVCTL) AND A,NOT BCDAS OR A,B CALL SETCTL ; RLC D ;PUT BIT 7 INTO BIT 0 ; ; EXECUTE CODE IN B------------------------------------------- ADDR: ; ; SELECT DRIVE 1ST ; CALL SELECT RET NZ ; ; RETRY COUNT = 0 ; RETRY ; LD B,A ;CHECK FOR RETRYS PUSH BC CALL CHKRT POP BC JR Z,RADRTY ; ; HARD ERROR, RETURN IT ; LD A,B  + IDLABO ;SET SECTOR BUFFER PTR TO COMPARE LD B,DIDSIZ ;SET ID LENGTH ; CKNI: LD A,(DE) ;IF NOT ID THEN 3740 CP A,(HL) L PUSH BC LD BC,DVDFSZ LDIR POP BC ; ; RETURN INVALID DESCRIPTOR SECTOR TO HOST ; NODS: XOR A,A JR SETFFG ;DEFAULT DRIVE FLAGS (SSSD) REPT 3 DB 26 ;;26 SECTORS DB 0 ;;128 BYTES PER SECTOR ENDM DB 14,27 ;;PRECOMP THRESHOLDS IF NO ERRORS THEN SEEK TRACK ; CALL Z,SEEK ;SEEK TRACK ; ; IF SELECT OR SEEK ERROR THEN RETURN ; RET NZ ; ; SE B,A INC HL DEC DE LD A,E OR A,D JP NZ,NXTCKS ; ; IF CHECKSUM NOT 0 THEN ERROR ; OR A,B JR NZ,FMTINV ; ; UFFER ; JP FMTPS ;ENTER PAST THE VALIDATION BYTES ; ; COMMAND DONE, RETURN FORMAT STATUS ; NMIWT: ; ; RETURN LAST  XOR A,A LD (ERRCT),A ; ; SET UP FOR XFER ; RADRTY: LD IY,RADNMI ;SET COMMAND COMPLETION VECTOR LD HL,SBUFR ;USE SEJP RETERR ;---------------------------------------------------------------------------- ; ; EIA OUTPUT COMMAND (5) ;  JR NZ,I3740 ; INC HL ;ELSE INC PTRS INC DE DJNZ CKNI ;IF NOT DONE THEN REPEAT ; ; FOUND DESCRIPTOR SECTOR - MOVE D*************************************************************************** ; ; RETURN ADDRESS OF DRIVE TABLE ELEMENT FUNCTION DVDFSZ EQU $ - DVSSSD ;---------------------------------------------------------------------------- ; ; READ SECTOR CT READ PTR ; LD HL,SBUFR ; ; FETCH SECTOR DATA ; LD DE,(CMDBLK + PBSECO) JP RWSECT ;---------------------------SELECT DRIVE 1ST ; CALL SELECT RET NZ ;IF ERROR THEN RETURN ; ; SET DISK FLAGS TO DATA IN FLAGS BYTE OF COMMAND BLOCK GAP BYTE COUNT ; LD (CMDBLK + PBST2O),HL ; ; MASK APPLICABLE ERRORS ; AND A,DMFER ;SET ANY ERRORS ; ; RETURN ERROCTOR BUFFER ; ; ISSUE READ ADDRESS COMMAND ; LD A,DCRDA ;ISSUE COMMAND TO FDC RST 32 ; ; WAIT HERE FOR DATA ; RA;---------------------------------------------------------------------------- EIAOUT: ; ; TEST FOR BAUD RATE == 0 (BIT OUTPISK FORMAT DATA TO DRIVE TABLE ; LD DE,DVFLG ;COMPUTE ADDRESS OF ELEMENT CALL GETDVEL EX DE,HL ; LD HL,SBUFR + IDFLGO  ; ENTRY- DE= OFFSET OF ELEMENT ; IX= PTR TO DRIVE TABLE ENTRY ; EXIT - HL= ADDRESS OF ELEMENT ; ;************************OMMAND (1) ; ;---------------------------------------------------------------------------- READ: LD A,-1 ;FLAG := READ OR ------------------------------------------------- ; ; FORMAT TRACK COMMAND (3) ; ;---------------------------------------- ; LD A,(CMDBLK + PBFLGO) ;GET FORMAT FLAGS LD (IX + DVFLG),A ;RESET DRIVE FLAGS ; ; SEEK TRACK FROM COMMAND BLOCK ; R STATUS IN COMMUNICATION BLOCK ; RETERR: OR A,A ;IF NO ERROR THEN QUIT NOW RET Z ; LD (CMDBLK + PBST1O),A LD A,FDCERRDNXT: IN A,(XPDSH) ;WAIT FOR DATA ; ; GET DATA & STORE IT ; IN A,(WDDTA) ;GET DATA XOR A,C LD (HL),A ;STORE IT INCUT ONLY) ; LD A,(BAUDOUT) OR A,A JR NZ,EIAO3 ; ; STATIC OUTPUT OPTION - OUTPUT THE NEW BIT ; LD A,(CMDBLK + PBST5O;SET SIDES & DENSITIES PUSH BC LD BC,DVDFSZ LDIR POP BC ; ; RETURN NEW DESCRIPTOR FLAG ; LD A,-2 ; ; RETURN D*************************************************** GETDVHLD: LD DE,DVHLDO GETDVEL: PUSH IX POP HL ADD HL,DE RET A,A JR OPCONT ;---------------------------------------------------------------------------- ; ; WRITE SECTOR COMMAND ------------------------------------ FORM: ; ; CHECK FOR VALID DRIVER ; LD HL,(FMTBG) LD DE,0AA55H ;KEY BYTES OR A,ACALL SEEK ; ; SET UP FOR COMMAND COMPLETION ; LD IY,NMIWT ;SET RETURN ADDR ; ; SET UP SIDE CONTROL AND PASS SIDE # IN RETFER: LD (CMDBLK + PBSTATO),A RET ; ; FORMAT DATA ERROR ; FMTINV: LD A,FMTERR JR RETFER ;-------------------- HL ;NEXT JP RADNXT ; ; COMMAND DONE, CHECK FOR ERRORS ; RADNMI: ; ; PASS BACK THE XFER COUNT ; LD DE,SBUFR OR) ;FETCH DATA BIT CPL ;COMPENSATE FOR DATA INVERSION AND A,1 ;MASK OUT UNUSED BITS REPT 3 RLCA ENDM LD (EIACTL),AESCRIPTOR SECTOR FLAG TO HOST ; SETFFG: LD (CMDBLK + PBST2O),A RET ; ; ; ASSUME 3740 FORMAT ; I3740: ; ; SET D ;########################################################################### ; ; DEFAULT SINGLE SIDED - SINGLE DENSITY TABLE(2) ; ;---------------------------------------------------------------------------- WRIT: XOR A,A ;FLAG := WRITE OPCONT:  SBC HL,DE JR NZ,FMTINV ; ; 3RD & 4TH BYTES CONTAIN THE CHECKSUM COUNT ; LD HL,FMTBG + 2 LD E,(HL) INC HL LD D, D ; LD DE,(CMDBLK + PBSECO) LD A,D AND A,80H LD D,A ;SAVE SIDE IN D7 RRCA ;COMPUTE CONTROL BYTE RRCA LD (SIDE-------------------------------------------------------- ; ; READ ADDRESS COMMAND (4) ; ;--------------------------------- A,A SBC HL,DE LD (CMDBLK + PBST4O),HL ; ; NOW TEST ERRORS ; AND A,DMRER RET Z ; ; ERROR ENCOUNTERED, CHECK FOR ; ; USE EXISTING CONTROLS ; LD A,(SVCTL) ; FALL INTO SAVE CONTROL ;***********************************************0 %+ &, !'- "(. #)/ $*0**************************** ; ; SET CONTROL PORT SUBROUTINE ; ENTRY- A= VALUE TO SET TO ; EXIT - A= VALUE WITH EIA BIT INCLNTROLS USED ; ; SEND THE START BIT ; SCF CALL BITOUT NOP NOP LD D,8 ;DATA BIT COUNT ; ; SEND EACH DATA BIT (------------- ; ; IDLE COMMAND (7) ; ;---------------------------------------------------------------------------- IDLE: GON ; 2: SET PARAMETERS FROM SECTOR BUFR & ENABLE LOGON ; 3: RETURN PARAMETERS IN SECTOR BUFR & ENABLE LOGON ;---------AND (10) ; ;---------------------------------------------------------------------------- LDHDI: CALL SELECT RET NZ ; ; M SECTOR BUFFER ; 1: RETURN PARAMETERS IN SECTOR BUFFER ; ;--------------------------------------------------------------------------------- RETDST: ; ; SELECT DRIVE ; CALL SELECT RET NZ ; ; RETURN DRIVE STATUS DATA ; IN A,(BLSTS) LA LD A,0 ADC A,H LD H,A LD A,(HL) ; ; IF ILLEGAL BAUD RATE THEN RETURN ERROR ; INC A JR Z,SETBD2 ; ; ELSE SUDED ; B= ? ; ;*************************************************************************** SETCTL: LD (SVCTL),A ;STORE VALU39 CYCLE LOOP) ; EIAO1: RRC E CALL BITOUT DEC D JP NZ,EIAO1 ; ; SEND STOP BIT ; NOP AND A,A CALL BITOUT ; ; IN A,(BLSTS) ;IF NO HOST INTERRUPT THEN WAIT AND A,BSINT JR Z,IDLE ; IN A,(XPIRR) ;ELSE RESET INTERRUPT REQUEST & EXIT ------------------------------------------------------------------- SETFLGS: ; ; SELECT DRIVE TABLE ; CALL SELECT RET LOAD HEAD ; LD E,DCHDL CALL EXHEAD ; ; WAIT FOR INTERRUPT ; LDHDI2: IN A,(XPMTX) ;KICK UNLOAD TIMEOUT IN PANTS IN A------------ SETDP: ; ; SELECT DRIVE TABLES ; CALL SELECT RET NZ ; ; TEST FOR COMMAND ERROR ; LD A,(CMDBLK + PBD (CMDBLK + PBST2O),A RET ;---------------------------------------------------------------------------- ; ; SET EIA BTORE NEW BAUD RATE ; DEC A LD (BAUDOUT),A RET BAUDS: IF DSIZE = 8 DB 0,-1,248,121,57,25,9 ELSE DB 0,248,121,57E ; ; ENTRY WITHOUT SAVE ; SETCTL1: LD B,A ;SAVE ORIGINAL VALUE LD A,(EIACTL) OR A,B OUT (BLCTL),A RET ; ;  MAKE EIA BIT STATIC ; XOR A,A LD (EIACTL),A ; RET ;------------------------------------------------------------- RET ;---------------------------------------------------------------------------- ; ; RETURN FIRMWARE VERSION COMMANDNZ ; ; TEST FOR COMMAND ERROR ; LD A,(CMDBLK + PBFLGO) CP A,4 JP NC,SPAR ; ; SET UP FOR XFER ; LD DE,DVFLG ;FE,(BLSTS) ;CHECK FOR INTERRUPT AND A,BSINT JR Z,LDHDI2 ; IN A,(XPIRR) ;CLEAR PENDING INTERRUPT RET ;---------------FLGO) CP A,2 JP NC,SPAR ; ; SET UP FOR XFER ; CALL GETDVHLD LD DE,SBUFR PUSH BC LD BC,TMSIZ ; ; DECIDE WHETAUD RATES COMMAND (14) ; ;---------------------------------------------------------------------------- SETBAUD: LD A,(CMDBL,25,9,-1 ENDIF MAXBAUD EQU $ - BAUDS ;---------------------------------------------------------------------------- ; ; ; WAIT UNTIL READY TO ACCEPT CHARACTER ; EIAO3: IN A,(BLSTS) ;IF NOT READY THEN WAIT EI ;ALLOW BREAK AND A,BSEIA JR--------------- ; ; EIA INPUT COMMAND (6) ; ;----------------------------------------------------------------------------  (8) ; ;---------------------------------------------------------------------------- RETVER: LD HL,VERSN LD (CMDBLK + PBST2TCH PTR CALL GETDVEL LD DE,SBUFR ; ; DETERMINE DIRECTION ; BIT 0,A JR NZ,RETFLGS ; EX DE,HL ; RETFLGS: PUSH ------------------------------------------------------------- ; ; SEEK TRACK COMMAND (11) ; ;-----------------------------HER SET OR RETURN DATA ; OR A,A JR NZ,RETDP ; EX DE,HL ; RETDP: LDIR ; ; IN ANY CASE, TRANSFER TO CURRENT VALUES K + PBST5O) ;FETCH BAUD RATE DATA ; ; IF RATE == -1 THEN RETURN CURRENT RATE ; INC A JR NZ,SETBD3 ; LD A,(BAUDOUT)  CLEAR COMMAND (15) ; ;---------------------------------------------------------------------------- CLR: JP SLEEP ;BREAK TO Z,EIAO3 ; DI ;NO MORE WHILE OUTPUTTING DATA ; ; FETCH CHARACTER FROM CMD BLOCK ; LD A,(CMDBLK + PBST5O) ;FETCH CHAR EIAIN: ; ; TEST STATUS BIT ; IN A,(BLSTS) AND A,BSEIA ; ; IF BIT == 0 THEN RETURN 0 ; JR Z,EIAI1 ; ; ELSE RO),HL RET ;---------------------------------------------------------------------------- ; ; SET DISK PARAMETERS COMMABC LD BC,DVDFSZ LDIR POP BC ; ; SELECT LOGON OPTION ; BIT 1,A LD A,0 JR NZ,SF1 ; INC A ; SF1: LD (IX + DVL----------------------------------------------- SEEKTRK: CALL SELECT CALL Z,SEEK RET ;------------------------------; CALL GETDVHLD LD DE,TMHLD LD BC,TMSIZ LDIR POP BC RET ;------------------------------------------------------ LD (CMDBLK + PBST5O),A RET ; ; ; IF OUT OF RANGE THEN RETURN ERROR ; SETBD3: DEC A CP A,MAXBAUD JR C,SETBD1 ; ;  START SUBTTL SUBROUTINES ;************************************************ ; ; OUTPUT EIA BIT ; ENTRY- CF= BIT TO OUTACTER CPL ;OUTPUT PORT IS INVERTED LD E,A ; ; SET UP ; LD HL,BAUDOUT ;BAUD RATE DIVISOR PTR LD A,(SVCTL) ;LAST COETURN -1 ; LD A,-1 EIAI1: LD (CMDBLK + PBST2O),A RET ;---------------------------------------------------------------ND (9) ; ENTRY- PBFLG= 0: SET PARAMETERS FROM SECTOR BUFR & DISABLE LOGON ; 1: RETURN PARAMETERS IN SECTOR BUFR & DISABLE LOGDO),A ; RET ;---------------------------------------------------------------------------- ; ; LOAD HEAD & IDLE COMM---------------------------------------------- ; ; SET DRIVE PARAMETERS COMMAND (12) ; ENTRY- PBFLG= 0: SET PARAMETERS FRO---------------------- ; ; RETURN DRIVE STATUS COMMAND (13) ; ;----------------------------------------------------------- ARGUMENT ERROR, RETURN IT ; SETBD2: LD A,BRERR JP RETFER ; ; FETCH BAUD RATE ; SETBD1: LD HL,BAUDS ADD A,L LD L,PUT ; A= BLCTL IMAGE ; HL= BAUD RATE DIVISOR PTR ; EXIT - B= 0 ; A= LAST BLCTL DATA ; ;********************************0 %+ &, !'- "(. #)/ $*0 TITLE 8" FLOPPY DISK FORMAT UTILITY FOR JADE DD CONTROLLER LIST NOCOND ;****************************************************Add precomp thresholds to ID sector data & add logon to track 0 ; format after writing ID sector ; ; 1.0 - 8 FEB 81 GRH ;E EQU 0 TRUE EQU NOT FALSE ; DIAG EQU TRUE ; MINVERS EQU 301 ;MINIMUM BIOS VERSION FOR COMPATABILITY ; DSIZE EQU 8 R ;=========================================================================== ; ; LOCATIONS ; ;=======================S VERSION # IN HL XIOPBC EQU 2 ;EXECUTE IOPB IN DE FUNCTION SUBTTL MACROS ;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@--------------------------------------------- ; ; PROGRAM ENTRY POINT ; ;------------------------------------------------- 1) DEC SP DEC SP ; ; OUTPUT SIGNON MESSAGE ; LD DE,SIGNON ;OUTPUT MESSAGE CALL MSGOT ; ; IF BIOS CALL VECTOR  FUNERR: LD DE,MSGSE ;ELSE OUTPUT ERROR MSG CALL MSGOT ; ; IF USER WANTS TO CONTINUE THEN REPEAT ; CALL CNSIN CP A,'Y*********************** ; ; JADE DOUBLE D DISK FORMAT PROGRAM ; ;********************************************************* RELEASE ; ; 2.00 5 AUG 88 GRH ; Change Format command philosophy to table-driven. Change FORMAT8 to ; comply with new DC;=========================================================================== ; ;*INCLUDE DISKS.DEF ;*INCLUDE COMIOPB.DEF ; ==================================================== REBOOT: EQU 0 ;REBOOT ADDR BIOS EQU 28H ;BIOS FUNCTION RESTART VECTOR @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;; ;; GENERATE THE TRANSLATE TABLE ;; ;;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-------------------------- JP INIT ;INITIALIZE ;########################################################################NOT IN MONITOR THEN IMPLEMENTED ; LD A,(BIOS + 2) CP A,0F8H JR C,BIOSVOK ; ; ELSE BIOS FUNCTION CALL NOT IMPLEMENTED,' JR NZ,FUNBG ;REPEAT ; ; ELSE RESTORE LOGON CAPABILITY TO CONTROLLER BY CLEARING ; LD A,PB_CLRC LD (IOPB + PB_CMDO)****************** ; ; FORMATn is a system utility which provides a means to write a single or ; double density format on aM8. ; Correct bug in DSDD48 which defined disk as 896k when it was only ; 894k. ; Change ID sector to reflect new format. ;;=========================================================================== LIST OFF *INCLUDE DISKS.DEF *INCLUDE COMIOPB.DETPA: EQU 100H ;TRANSIENT PROGRAM AREA ;=========================================================================== ; ; @@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SEC### ; ; COPYRIGHT NOTICE ; ;########################################################################### SIGNON: DB 'Jade Do ABORT ; BIOSERR: LD DE,BIOSM CALL MSGOT JP 0 ; ; ; BIOS VECTOR OK, IS VERSION OK ; BIOSVOK: LD C,RETVERS RST,A LD IX,IOPB CALL EXIOPBX JP 0 ; ; ; FUNCTION RANGE OK, COMPUTE EXECUTION ADDRESS ; FUNOK: LD HL,FUNTBL LD E,Any of the drives accessed by the DD controller. ; ;************************************************************************** Implement BIOS call for IOPB execution. ; VERSN EQU '00' ;CHANGE HERE FOR SIGN-ON CHANGE ; ;*******************************F LIST ON ;=========================================================================== ; ; CONSTANTS ; ;=========== BDOS CALL VECTORS ; ;=========================================================================== WBOOT EQU 0000H ;SYSTEM WATORS ;;ONCE FOR EACH SECTOR LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;;ADD IN SKEW FACTOR ;; IF NXTSEC > uble D 8" disk format Utility Ver 2.' DB HIGH VERSN,LOW VERSN,CR,LF DB 'Copyright (c) 1983,1986,1987,1988 GRH Enterprise BIOS ; LD DE,MINVERS ;MUST BE >= THIS OR A,A SBC HL,DE ; JR C,BIOSERR ; ; ; OUTPUT MENU ; FUNBG: LD DE,MSGFL  LD D,0 ADD HL,DE ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD HL,FUNBG ;SET UP RETURN ADDRESS PUSH HL EX DE,HL J* ; ; REVISION STATUS: ; ; X.1 - 30 DEC 86 GRH ; Fix bug causing display of side 1 sector number > 32768. ; Remove secto******************************************** SUBTTL DECLARATIONS ;========================================================================================================================= CTRLC: EQU 3 ;REQUEST REBOOT CPM LF: EQU 0AH ;LINE FEED CRRM BOOT BDOS: EQU 0005H ;SYSTEM CALL ADDR ;=========================================================================== ;#SECTORS ;;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 Ls' DB '$' ;--------------------------------------------------------------------------- ; ; MAIN PROGRAM CONTINUES ; ;;OUTPUT FUNCTION LIST CALL MSGOT ; ; GET FUNCTION SELECTION FROM USER ; CALL CNSIN ;GET CONSOLE CHAR LD (LTRSE),A ;SP (HL) ;EXECUTE COMMAND ; ; FUNCTION ADDRESS TABLE ; FUNTBL: DW FUN0 ;SINGLE SIDED SINGLE DENSITY IBM 3740 (241K) DW Fr skew for double density in order to get failure data. ; ; X.2 - 31 DEC 86 GRH ; Reinstall double density skew factor. ; ================== ; ; ASSEMBLY CONTROL ; ;=========================================================================== FALS: EQU 0DH ;CARRIAGE RETURN BS EQU 08H ;BACKSPACE ; NDRVS EQU 4 ;MAX NUMBER OF DRIVES SECSZ: EQU 128 ;128 BYTES PER SECTO ; BIOS CALL DATA ; ;=========================================================================== RETVERS EQU 0 ;RETURN BIOOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM SUBTTL MAIN PROGRAM ORG TPA ;--------------------------------------------------------------------------------------------------------- INIT: ; ; SET UP LOCAL STACK ; LD SP,(BDOS +AVE CHAR FOR ERROR MESSAGE ; ; CHECK FOR RANGE ; SUB A,'0' CP A,NFUNCS JR C,FUNOK ; ; UNKNOWN FUNCTION, ERROR ; UN1 ;SINGLE SIDED SINGLE DENSITY 26SPT JADE (241K) DW FUN2 ;SINGLE SIDED DOUBLE DENSITY 48SPT JADE (440K) DW FUN3 ;DOUBLE0 %+ &, !'- "(. #)/ $*0 SIDED SINGLE DENSITY 26SPT (480K) DW FUN4 ;DOUBLE SIDED DOUBLE DENSITY 48SPT JADE (880K) DW NOFUN DW NOFUN DW NOFUN 48ID ;JADE FORMAT SSDD 48SPT JR DO48 ; ; ; FUNCTION 3: DOUBLE SIDED, SINGLE DENSITY, 26 SPT ; FUN3: LD HL,DSSDID ;JADE; SET UP IOPB FOR 1ST TRACK ; LD A,0 ;SET TRACK # LD (IOPB + PB_TRKO),A ; ; MAIN LOOP ; FMTDSKLP: ; ; SIDE 0 ,(HL) JR C,FMTDSKLP ; ; FORMAT DONE, GO TEST FOR READ ERRORS ; CALL CHECK ;CHECK FOR READ ERRORS JP FMTDSK ;READY FNT STRING FUNCTION JP BDOS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE IN**************************************************************** ; ; PUT DECIMAL PROCEDURE ; ENTRY- HL= VALUE TO OUTPUT ; EXGITS, NOCONVERT 0 TO SPACE = FALSE ; NXTDEC: LD A,(HL) ;FETCH DIGIT DEC HL ;NEXT DIGIT ADD A,'0' ;CONVERT TO ASCII CP******************************************************************* CRLF: LD DE,CRLFM JP PUTS ;+++++++++++++++++++++++++DW NOFUN DW CUSTOM NFUNCS EQU ($ - FUNTBL) / 2 ; ; NO SUPPORTED FUNCTION STUB ; NOFUN: POP HL ;RESTORE STACK JR FUNE DSSD 26SPT JR DO48 ; ; ; FUNCTION 4: JADE DOUBLE SIDED, DOUBLE DENSITY, 48 SPT ; FUN4: LD HL,DSDD48ID ;JADE FORMAT DSD; LD HL,1 LD (IOPB + PB_SECO),HL ; ; FORMAT TRACK ; CALL FMTTRK RET NZ ;IF ERROR THEN RETURN ; ; WHILE ON TRACOR ANOTHER DISK ; ; ; WRITE ID SECTOR ; FMTWID: CALL WRTID ;WHILE WE'RE HERE, WRITE ID SECTOR RET NZ ;ERR JP FMTPUT FUNCTION ; EXIT - A= CHAR AND 7FH ; BC, DE, HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++IT - HL, DE, BC, A= ? ; ;*************************************************************************** PUTD: ; ; PUT DATA I A,'0' ;IF NOT 0 THEN NOCONVERT TO SPACE = TRUE JR NZ,FIRST ; INC C ;ELSE IF FLAG != 0 THEN DIGIT OCCURRED DEC C JR N+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CREATE DECIMAL DIGIT FUNCTION ; ENTRY- HL= PTR TO PLACE TO STORE DIGIRR ;TELL ERROR ;--------------------------------------------------------------------------- ; ; SELECT PARAMETERS ;D 48SPT ; ; COMMON CODE ; DO48: ; ; OVERLAY DPB DATA ; LD DE,IDSIMG + ID_SPTO LD BC,ID_DPBSZ LDIR ; ; OVERLK 0, WRITE THE DESCRIPTOR SECTOR ; LD A,(IOPB + PB_TRKO) OR A,A JR Z,FMTWID ; FMTDSK1: ; ; DO SECOND SIDE IF NEEDEDDSK1 ;--------------------------------------------------------------------------- ; ; CUSTOM FORMATTER ; ;-------------++++++++++ CNSIN: ; ; GET CHARACTER ; LD C,1 ;CONSOLE READ FUNCTION # CALL BDOS ; ; MASK BIT 7 ; AND A,7FH ; N PROPER REGISTERS ; EX DE,HL ; ; INIT DIGITS TO 0 ; LD HL,UNIT LD B,5 SET0: LD (HL),0 INC HL DJNZ SET0 ; ; Z,OUTNUM ; LD A,B ;AT LEAST ONE 0 DEC A LD A,'0' JR Z,OUTNUM ; LD A,' ' ;PAD WITH LEADING BLANKS UNTIL DIGIT JR T ; DE= VALUE TO CONVERT ; BC= DIVISOR FOR DIGIT ; EXIT - HL= PTR TO NEXT DIGIT ; DE= REMAINDER ; BC= -BC ; ;++++++++ ;--------------------------------------------------------------------------- ; ; ; FUNCTION 0: IBM 3740, SINGLE SIDED, SIAY DISK FORMAT DATA ; LD DE,IDSIMG + ID_FLGO LD BC,ID_FSIZE LDIR ; ; FALL INTO FORMAT DISK ; ;+++++++++++++++++ ; LD A,(IDSIMG + ID_HEADS) CP A,1 JR Z,NO2ND ; LD A,(IOPB + PB_TRKO) ;FETCH TRACK SECTOR COUNT CALL GETSPT ; INC-------------------------------------------------------------- CUSTOM: RET SUBTTL PROCEDURES & FUNCTIONS ;************** ; CONVERT LOWER CASE TO UPPER CASE ; CP A,'a' RET C CP A,'z' + 1 RET NC AND A,5FH RET ;******************** PROCESS TENTHOUSANDS DIGIT ; DEC HL LD BC,-10000 CALL DECDIG ; ; PROCESS THOUSANDS DIGIT ; LD BC,-1000 CALL DECOUTNUM ; ; NON-0 DIGIT OCCURRED, FLAG = TRUE ; FIRST: INC C ; ; OUTPUT DIGIT ; OUTNUM: PUSH HL PUSH BC PUSH AF ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DECDIG: PUSH HL EX DE,HL ADD HL,BC JR NC,ADDIT ; NGLE DENSITY, 26 SPT ; FUN0: LD HL,SSSD40ID ;IBM 3740 SSSD 26SPT JR DO48 ; ; FUNCTION 1: JADE SINGLE SIDED, SINGLE DENSI++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT DISK FUNCTION ; ;+++++++++++++++++++++++++++++++++++++ A ;ONE PAST LAST SECTOR ON SIDE 0 LD (IOPB + PB_SECO),A ; CALL FMTTRK RET NZ ; NO2ND: ; ; NEXT TRACK ; LD A,(************************************************************* ; ; MESSAGE OUTPUT PROCEDURE ; ENTRY- DE= PTR TO '$' TERMINATED******************************************************* ; ; CONSOLE OUTPUT PROCEDURE ; ENTRY- E= CHAR ; ;******************DIG ; ; PROCESS HUNDREDS DIGIT ; LD BC,-100 CALL DECDIG ; ; PROCESS TENS DIGIT ; LD BC,-10 CALL DECDIG ; ;  LD E,A LD C,2 CALL BDOS POP AF POP BC POP HL DJNZ NXTDEC ; ; DONE ALL 5 DIGITS ; RET ;*****************EX DE,HL POP HL INC (HL) JR DECDIG ; ; ADDIT: LD A,C CPL LD E,A LD A,B CPL LD D,A INC DE ADD HL,DE EX DTY, 26SPT ; FUN1: LD HL,SSSDID JR DO48 ; ; ; FUNCTION 2: JADE SINGLE SIDED, DOUBLE DENSITY, 48 SPT ; FUN2: LD HL,SSDD++++++++++++++++++++++++++++++++++++++ FMTDSK: ; ; SELECT DRIVE ; CALL SELDR ;SELECT DRIVE RET C ;ERR- RESELECT ; IOPB + PB_TRKO) INC A LD (IOPB + PB_TRKO),A ; ; IF NOT PAST LAST CYLINDER THEN REPEAT ; LD HL,IDSIMG + ID_CYLS CP A TEXT ; EXIT - ? ; ;*************************************************************************** PUTS: MSGOT: LD C,9 ;PRI********************************************************* CNSOT: LD C,2 ;CONSOLE OUTPUT FUNCTION # JP BDOS ;*********** REMAINDER IS UNITS DIGIT ; LD (HL),E ; ; OUTPUT DIGITS WITH LEADING SPACES ; LD HL,TTHOU ;SET PTR LD BC,500H ;5 DI********************************************************** ; ; OUTPUT CRLF PROCEDURE ; EXIT - HL, DE, BC, AF= ? ; ;********E,HL POP HL DEC HL RET UNIT: DS 4 TTHOU: DS 1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0 %+ &, !'- "(. #)/ $*0++++++++++ ; ; WRITE ID SECTOR FUNCTION ; EXIT - AF= /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELECT DISK FORMAT TABLE BASED ON SECTOR SIZE & TRACK DENSITY FLAGS ; LD A,(IOPB + PB_TRKO) ;FETCH SECTOR SIZE CALL GE BYTE FOR -CHECKSUM XOR A,A ;CHECKSUM = 0 ; FMTCKS: ADD A,(HL) ;ADD TO BYTE INC HL ;POINT TO NEXT BYTE DJNZ FMTCKS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; EXIT - CF= ERROR ; ;++++++++++++++IOPB + PB_DRVO),A ; ; PAUSE FOR READY ; LD DE,MSGXX ;PRINT TYPE CR WHEN READY MSG CALL MSGOT CALL CNSIN ;IF NOT CR T(RDIOPB + PB_TRKO),HL ; LD IX,RDIOPB ; ; NEW LINE ; CALL CRLF ; ; ALL SET TO DO TRACK, SET TRACK SIZE ; RDTRKL: ST BIT 2 ; RDTST1: SRL L ; RDTST: BIT 0,L ;IF DOUBLE DENSITY THEN NO XLATE LD A,(CURSEC) JR NZ,RDSOK ; ; IF NOT 12 ; ; NOABRT: ; ; IF LAST SECTOR OF TRACK THEN DONE ; LD HL,NSECTS LD A,(CURSEC) CP A,(HL) JR NC,TDONE ; ; OU+++++++++++++++++++ WRTID: ; ; SET UP IOPBs ; LD A,(IOPB + PB_DRVO) LD (WIDIOPB + PB_DRVO),A ; LD HL,IDSIMG LD (WTSPT ; AND A,3 ;MOULO 4 ADD A,A ;X2 LD L,A ;SAVE ; LD A,(IOPB + PB_TRKO) ;SELECT CORRECT DENSITY FLAG CP A,1 IF --COUNT != 0 THEN REPEAT ; ; STORE -CHECKSUM IN LAST BYTE ; NEG LD (HL),A ; ; FORMAT THE TRACK ; LD DE,FMTGM ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDR: ; ; OUTPUT PROMPT ; LD DE,MSGFD CALL MSGOT ; ;HEN REPEAT CP A,CR JR NZ,SELDR ; ; TELL CONTROLLER WHAT TYPE DISK WE'RE DOING ; LD IX,IOPB LD (IX + PB_CMDO),PB_STD LD A,(RDIOPB + PB_TRKO) ;FETCH SECTORS PER TRACK CALL GETSPT LD L,A ; LD A,(IDSIMG + ID_HEADS) ;IF DOUBLE SIDED THEN SE8 BYTE SECTORS THEN NO XLATE ; LD L,A ;SAVE SECTOR LD A,(RDIOPB + PB_TRKO) CALL GETSPT OR A,A LD A,L ;RESTORE SECTOTPUT TESTING TRACK MESSAGE ; LD DE,TSTGM CALL MSGOT ; LD HL,(RDIOPB + PB_TRKO) CALL PUTD ; ; OUTPUT SIDE NO. ; IDIOPB + PB_DMAO),HL ; LD HL,ID_SECT ;SET ID SECTOR LD (WIDIOPB + PB_SECO),HL ; ; EXECUTE THE IOPB ; LD HL,WIDIOPB ; LD A,(IDSIMG + ID_FLGO) ;PREFETCH DENSITY FLAGS JR Z,FMT1 ; JP NC,FMTDT ADD A,A ;SHIFT PROPER DENSITY BIT INTO BIT 3 ;OUTPUT FORMATTING MESSAGE CALL MSGOT ; LD HL,(IOPB + PB_TRKO) CALL PUTD ; LD DE,ENDEQM CALL MSGOT ; LD IX,IOPB  GET RESPONSE ; CALL CNSIN ; ; IF RETURN THEN EXIT ; CP A,CR ;IF RETURN THEN EXIT SCF RET Z ; ; SAVE DRIVE KC ;SET DISK PARAMETERS CMD ; LD HL,IDSIMG + ID_FLGO ;SAME AS ID SECTOR DATA LD (IOPB + PB_DMAO),HL ; LD (IX + PB_FLGO),CTORS *= 2 CP A,1 LD A,L ;RESTORE SECTORS JR Z,SETNSEC ; ADD A,A ; SETNSEC: INC A ;OFFSET FOR TEST LD (NSECTS),R JP NZ,RDSOK ; ; ELSE XLATE SECTOR ; LD HL,TRNTBL ;POINT TO TABLE DEC A ;{1..N} -> {0..N-1} ADD A,L ;CALCULATLD DE,SIDEM CALL MSGOT ; LD A,(RDIOPB + PB_TRKO) CALL GETSPT PUSH AF ;SAVE SPT FOR LATER ; LD HL,RDIOPB + PB_SECO PASS PTR TO IOPB CALL EXIOPBX RET Z ; ; ERROR ENCOUNTERED, TELL IT ; LD DE,MSGNC ;ELSE OUTPUT ERROR & RETURN CALL M ; FMT1: ADD A,A ; FMTDT: ADD A,A ; ; IF DOUBLE DENSITY THEN ADD 4 ; AND A,8 OR A,L ;ADD IN SECTOR SIZE OFFSET ;  CALL EXIOPBX ;FORMAT TRACK ; ; TELL LAST PADDING ; PUSH AF LD HL,(IOPB + PB_ST2O) CALL PUTD ; POP AF RET Z ;ILETTER IN MESSAGES ; LD (DRLTR),A ;ELSE SAVE DRIVE LETTER & TEST FOR LEGAL LD (LTRSE),A ; ; TEST FOR LEGAL DRIVE {0..3}0 ;SET PARAMS & DISABLE LOGON ; JP EXIOPBX ;*************************************************************************** A ; ; START WITH 1ST SECTOR ; LD A,1 ;START WITH 1ST SECTOR ; ; READ LOOP ; RDLP: ; ; CHECK FOR SECTOR TRANSLAE OFFSET TO SECTOR LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH TRANSLATED SECTOR ; ; SET SECTOR ; RDSOK: LD  CP A,(HL) ;CF= SIDE 1, NC= SIDE 0 PUSH AF ;SAVE SIDE FLAG (CF) ; LD L,0 RL L LD H,0 CALL PUTD ; ; OUTPUT SESGOT XOR A,A DEC A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FORMAT TRAC LD HL,TBLPTRS ;FETCH DATA PTR FROM TABLE ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD LF NO ERROR THEN RETURN ; ; ERROR- TELL SO ; LD DE,MSGNC ;ELSE OUTPUT ERROR MSG CP A,PB_SEEK ;IF SEEK ERROR THEN DIFFERE ; SUB A,'0' CP A,4 JR C,NMBRD ;IF LEGAL THEN CONTINUE ; ; ILLEGAL DRIVE, REPEAT ; LD DE,MSGSE ;PRINT SELECT ERRO ; ; CHECK FUNCTION CHECKS ALL TRACKS BY READING BACKWARD FROM LAST TRACK ; ;**********************************************TION ; LD (CURSEC),A ;SAVE THE CURRENT SECTOR ; LD A,(IDSIMG + ID_FLGO) ;FETCH FLAGS LD L,A LD A,(RDIOPB + PB_TRKO) ;(RDIOPB + PB_SECO),A ;SAVE CURRENT SECTOR ; ; CHECK CONSOLE FOR ABORT ; LD C,11 ;GET CONSOLE STATUS CALL BDOS ; OR CTOR ; LD DE,SECM CALL MSGOT ; POP AF ;SIDE FLAG (CF) POP HL ;H: SPT LD A,(RDIOPB + PB_SECO) ;IF SIDE == 0 THEN SEK FUNCTION ; EXIT - AF= /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FMTTRK: ; ,A ; ; GOT FORMAT TABLE, SET XFER PTR TO IT ; LD (IOPB + PB_DMAO),HL ; ; CALCULATE CHECKSUM ; LD B,127 ;SAVE LASTNT MESSAGE JR NZ,FTE1 ; LD DE,SKERM ; FTE1: CALL MSGOT XOR A,A ;RETURN ERROR FLAG DEC A RET ;++++++++++++++++R MESSAGE CALL MSGOT JR SELDR ; ; ; DRIVE SELECTED ; NMBRD: LD (IOPB + PB_DRVO),A LD (WIDIOPB + PB_DRVO),A LD (RD***************************** CHECK: ; ; SET UP ; LD HL,(IOPB + PB_TRKO) ;START WITH LAST TRACK FORMATTED DEC HL LD FETCH TRACK CP A,1 ;IF TRACK 0 THEN TEST BIT 0 JR C,RDTST JR Z,RDTST1 ;IF TRACK 1 THEN TEST BIT 1 ; SRL L ;ELSE TEA,A JP Z,NOABRT ; LD C,1 ;FLUSH CONSOLE CHAR BEFORE ABORT CALL BDOS ; LD DE,ABRTDM ;OUTPUT ABORTED MESSAGE JP MSGOTCTOR OK LD L,A JP NC,RDSOK2 ; SUB A,H ;ELSE SECTOR -= SPT LD L,A ; RDSOK2: LD H,0 CALL PUTD ; ; EXECUTE THE RE0 %+ &, !'- "(. #)/ $*0AD ; LD IX,RDIOPB CALL EXIOPBX ; LD DE,ERM ;IF READ ERROR THEN OUTPUT ERROR CALL NZ,MSGOT ; ; NEXT SECTOR & REPIOPB: PUSH IX ; LD C,2 ;EXECUTE IOPB COMMAND RST BIOS ; ; TEST FOR ERROR ; POP IX LD A,(IX + PB_STATO) OR A,AS ; PUSH HL LD HL,IDSIMG + ID_SPTDO ; ; COMMON GET DATA CODE ; GETIDD: CP A,1 ;TEST TRACK NO. ; ; IF TRACK == 1 ################################################################# ; ; SINGLE DENSITY TRANSLATION TABLE ; ;##################LOGON TIME ; DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZT CYL DB 52 ;;HIGH PRECOMP START CYL DB 0 ;;ECC BURST LENGTH DB 0 ;;CONTROL ; FILL REMAINING SECTOR DATA WITH E5H ;  ;PHYSICAL RECORD MASK ; ; DISKETTE PHYSICAL FORMAT DATA ; DB 00000000B ;DISKETTE FLAGS ; REPT 3 DB 26,0 ;;SECTORS 10000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHEAT ; LD A,(CURSEC) INC A JP RDLP ; ; ; TRACK IS DONE, NEXT TRACK ; TDONE: LD A,(RDIOPB + PB_TRKO) DEC A LD (R IF DIAG = TRUE ; ; RETURN IF OK ; RET Z ; ; OUTPUT ERROR DATA ; PUSH AF LD L,A LD H,0 PUSH IX PUSH HLTHEN SET PTR TO TRK 1 DATA ; JR Z,GFT1 ; ; ELSE TO IMPROVE SPEED, DEFAULT TO DATA TRACKS ; JP NC,RETIT ; ; ELSE SE########################################################## TRNTBL: IF DSIZE = 8 GXLATE 52,6 ENDIF SUBTTL DISK DESE -1 DW 63 ;DIRECTORY MAXIMUM DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PH REPT IDSIMG + 128 - $ ;FILL OUT SECTOR LIST OFF DB 0E5H LIST ON ENDM ;###########################################PER TRACK, ;; BYTES PER SECTOR {0:128, 1:256, 2:512, 3:1024} ENDM ; ; ADDITIONAL DISK PHYSICAL FORMAT INFO ; DB 0 YSICAL RECORD MASK ; ; DISKETTE PHYSICAL FORMAT DATA ; DB 00001000B ;DISKETTE FLAGS ; REPT 3 DB 26,0 ;;SECTORS PER TDIOPB + PB_TRKO),A ; ; IF NEXT TRACK < 0 THEN RETURN ; JP P,RDTRKL ; LD DE,OKM JP MSGOT ;++++++++++++++++++++++ LD DE,IOPBERM CALL MSGOT ; POP HL CALL PUTD ; POP IX PUSH IX LD L,(IX + PB_ST1O) LD H,0 CALL PUTD POP IX T PTR TO TRK 0 ; DEC HL DEC HL ; GFT1: DEC HL DEC HL ; RETIT: LD A,(HL) POP HL RET ;++++++++++++++++++++++++CRIPTOR SECTOR DATA ;########################################################################### ; ; SINGLE DENSITY DESCRIPTOYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; PAD TO FORMAT DATA WITH E5H ; REPT IDSIMG + 40H - $ LIST O################################ ; ; DISK DESCRIPTOR SECTOR OVERLAYS ; ;####################################################;;DISK TYPE DW 77 ;;NUMBER OF CYLINDERS DB 1 ;;NUMBER OF HEADS DW 0 ;;REDUCED WRITE CURRENT CYL DB 26 ;;MEDIUM PRECOMP SRACK, BYTES PER SECTOR ENDM ; ; ADDITIONAL DISK PHYSICAL FORMAT INFO ; DB 3 ;;DISK TYPE DW 77 ;;NUMBER OF CYLINDERS +++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; ;++++++++++++++++++ POP AF ; ENDIF RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TRACK+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DISK FORMAT PHYSICAL SECTOR SIZE INDEX FUNCTION ; ENTRY- A= TRR SECTOR (128 BYTES) ; TRACK 0..77= SD, (SDSPTC) 128 BYTE SECTORS ; ;########################################################FF DB 0E5H LIST ON ENDM ; ; DISKETTE FORMAT DATA ; DB 00000000B ;DISKETTE FLAGS ; REPT 3 DB 26,0 ;;SECTORS PER####################### IF DSIZE = 8 ; ; SINGLE SIDED, SINGLE DENSITY, IBM 3740 ; SSSD40ID: SSSDID: DW 26 ;SECTORS PTART CYL DB 52 ;;HIGH PRECOMP START CYL DB 0 ;;ECC BURST LENGTH DB 0 ;;CONTROL ;--------------------------------------- DB 2 ;;NUMBER OF HEADS DW 0 ;;REDUCED WRITE CURRENT CYL DB 26 ;;MEDIUM PRECOMP START CYL DB 52 ;;HIGH PRECOMP START CYL +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; THIS ENTRY SETS XFER COUNT TO 128 ; EXIOPBX: LD (IX + PB_B PHYSICAL SECTORS PER TRACK FUNCTION ; ENTRY- A= TRACK {0,1,..N-1} ; EXIT - A= PHYSICAL SECTORS PER TRACK {1,2,..255} ; ;+++ACK {0,1,..N-1} ; EXIT - A= SECTOR SIZE INDEX {0:128, 1:256, 2:512, 3:1024} ; ;++++++++++++++++++++++++++++++++++++++++++++++################### IDSIMG: ; ; RESERVE FIRST 16 BYTES FOR BOOT, IF NEEDED ; REPT 16 LIST OFF DB 0E5H LIST ON EN TRACK, ;; BYTES PER SECTOR {0:128, 1:256, 2:512, 3:1024} ENDM ; ; ADDITIONAL DISK PHYSICAL FORMAT INFO ; DB 0 ;;DER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAXIMUM ------------------------------------- ; ; DOUBLE SIDED SINGLE DENSITY, 128 BYTE SECTORS ; DSSDID: DW 52 ;SECTORS PER TRAC DB 0 ;;ECC BURST LENGTH DB 0 ;;CONTROL ;---------------------------------------------------------------------------- ; CNTO),128 LD (IX + PB_BCNTO + 1),0 ; ; FALL INTO EXECUTE IOPB FUNCTION ; ; THIS ENTRY ASSUMES IOPB ALL SET UP ; EXEC++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ GETSPT: ; ; TO IMPROVE SPEED DEFAULT TO DATA TRACK+++++++++++++++++++++++++++++ GETSSZ: PUSH HL LD HL,IDSIMG + ID_SSZDO JP GETIDD SUBTTL INITIALIZED DATA ;###########DM ; ; DISK DESCRIPTOR SECTOR KEY ; DB 'Disk Descriptor2' ; ; DISK PARAMETER BLOCK IMAGE, TO BE TRANSFERRED TO BIOS AT ISK TYPE DW 77 ;;NUMBER OF CYLINDERS DB 1 ;;NUMBER OF HEADS DW 0 ;;REDUCED WRITE CURRENT CYL DB 26 ;;MEDIUM PRECOMP STAR DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0K DB 4 ;BLOCK SHIFT FACTOR DB 0FH ;BLOCK MASK DB 1 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAXIMUM DB  ; SINGLE SIDED DOUBLE DENSITY, 128 BYTE SECTORS ; SSDD48ID: DW 48 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 0FH  0 %+ &, !'- "(. #)/ $*0 ;BLOCK MASK DB 1 ;NULL MASK DW 224 ;DISK SIZE -1 DW 63 ;DIRECTORY MAXIMUM DB 10000000B ;ALLOC 0 DB 0 ;ALLOC 1 D BYTE SECTORS ; DSDD48ID: DW 96 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 0FH ;BLOCK MASK DB 0 ;NULL MASK D################################################################ ; ; MESSAGES ; ;######################################## to reselect): $' MSGNC: DB CR,LF,LF,'Execution Error!$' SKERM: DB CR,LF,'Seek Error. Is Drive Double Sided?$' MSGXX: DB CR,L################# TBLPTRS: DW TLSD128 ;SINGLE DENSITY 128 BYTE SECTORS DW TLSD256 DW TLSD512 DW TLSD102 ;1024 BYTE SEF7H ;HEADER CRC DB 11,0FFH ;GAP 2 DB 6,0 ;SYNC DB 1,0FBH ;DATA ID MARK DB 128,0E5H ;DATA DB 1,0F7H ;DATA CRC DB 27,H ;INDEX MARK DB 26,0FFH ;GAP 1 DB 0 ; DB 6,0 ;SYNC DB 1,0FEH ;ID MARK DB 0 ; DB 1,1 ;SECTOR SIZE INDEX (1= 256 BY: DB 8 ;SPT ; DB 40,0FFH ;GAP 4A DB 6,0 ;SYNC DB 1,0FCH ;INDEX MARK DB 26,0FFH ;GAP 1 DB 0 ; DB 6,0 ;SYNC DB W 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; DISKETTE PHYW 448 ;DISK SIZE -1 DW 127 ;DIRECTORY MAXIMUM DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK O################################### MSGFL: DB CR,LF,LF,'****** Functions List ******' DB CR,LF,'0. Single sided, single denF,LF,'Type CR when drive ' DRLTR: DB ' is ready. $' FMTGM DB CR,'Formatting track $' ENDEQM DB ' End = $' TSTGM DB CR,'TesCTORS ; DW TLDD128 ;DOUBLE DENSITY 128 BYTE SECTORS DW TLDD256 DW TLDD512 DW TLDD102 IF DSIZE = 8 ;##########0FFH ;GAP 3 DB 0 ; DB 0FFH ;GAP 4B DATA ; ; SECTOR SKEW TABLE ; DB 1,2,3,4,5,6,7,8,9,10,11,12,13 DB 14,15,16,17,TES) DB 1,0F7H ;HEADER CRC DB 11,0FFH ;GAP 2 DB 6,0 ;SYNC DB 1,0FBH ;DATA ID MARK DB 128,0E5H ;DATA DB 128,0E5H DB1,0FEH ;ID MARK DB 0 ; DB 1,2 ;SECTOR SIZE INDEX (2= 512 BYTES) DB 1,0F7H ;HEADER CRC DB 11,0FFH ;GAP 2 DB 6,0 ;SYNC SICAL FORMAT DATA ; DB 00000110B ;DISKETTE FLAGS ; DB 26,0 ;;SECTORS PER TRACK, BYTES PER SECTOR DB 48,0 DB 48,0 ; ;FFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; DISKETTE PHYSICAL FORMAT DATA ; DB 00001110sity, IBM 3740 (249k)' DB CR,LF,'1. Single sided, single density, 26 SPT (249K)' DB LF,LF,'2. Single sided, double densityting track $' SIDEM DB ' Side $' SECM DB ' Sector $' CRLFM DB CR,LF,'$' OKM DB ' Ok',CR,LF,'$' ERM DB ' Error!',CR,LF,'################################################################## ; ; SINGLE DENSITY FORMAT TABLE ; THIS TABLE WILL COMPILE 18,19,20,21,22,23,24,25,26 ; IF $ >= (TLSD128 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! SD128 TABLE EX 1,0F7H ;DATA CRC DB 42,0FFH ;GAP 3 DB 0 ; DB 0FFH ;GAP 4B DATA ; GXLATE 15,3 ; IF $ >= (TLSD256 + 128) ; ;  DB 1,0FBH ;DATA ID MARK DB 255,0E5H ;DATA DB 255,0E5H DB 2,0E5H DB 1,0F7H ;DATA CRC DB 58,0FFH ;GAP 3 DB 0 ;  ADDITIONAL DISK PHYSICAL FORMAT INFO ; DB 2 ;;DISK TYPE DW 77 ;;NUMBER OF CYLINDERS DB 1 ;;NUMBER OF HEADS DW 0 ;;REB ;DISKETTE FLAGS ; DB 26,0 ;;SECTORS PER TRACK, BYTES PER SECTOR DB 48,0 DB 48,0 ; ; ADDITIONAL DISK PHYSICAL FORMAT, 48 SPT (460k)' DB CR,LF,'3. Double sided, single density, 52 SPT (499k)' DB CR,LF,'4. Double sided, double density, 96$' ABRTDM DB ' ** ABORTED **',CR,LF,'$' IF DIAG IOPBERM DB CR,LF,'IOPB error = (status fdc status) $' ENDIF BIOSM CODE WITHIN THE JADE FLOPPY CONTROLLER, WHICH ; WILL PERFORM THE ACTUAL FORMAT FUNCTION ; ;##################################CEEDS 128 BYTES!! **** ELSE REPT (TLSD128 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF ;################## USER WARNING MESSAGE ; CONMSG **** WARNING! SD256 TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLSD256 + 128) - $ LISDB 0FFH ;GAP 4B DATA ; GXLATE 8,3 ; IF $ >= (TLSD512 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! SD5DUCED WRITE CURRENT CYL DB 26 ;;MEDIUM PRECOMP START CYL DB 52 ;;HIGH PRECOMP START CYL DB 0 ;;ECC BURST LENGTH DB 0 ;;C INFO ; DB 4 ;;DISK TYPE DW 77 ;;NUMBER OF CYLINDERS DB 2 ;;NUMBER OF HEADS DW 0 ;;REDUCED WRITE CURRENT CYL DB 26 ;; SPT (921k)' ; DB CR,LF,LF,'9. Custom configuration' DB CR,LF,LF,'Any Other to Stop.' DB CR,LF,LF,'Enter function number:DB CR,LF,'BIOS Not Compatable - Aborting...$' SUBTTL DISK FORMAT LIST TABLES ;##################################################################################### TLSD128: DB 26 ;SPT ; DB 40,0FFH ;GAP 4A DB 6,0 ;SYNC DB 1,0FCH ;INDEX MARK########################################################## ; ; SINGLE DENSITY 256 BYTE FORMAT TABLE ; ;#####################T OFF DB 0 LIST ON ENDM ENDIF ;############################################################################ ; ;12 TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLSD512 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF ;#######ONTROL ;---------------------------------------------------------------------------- ; ; DOUBLE SIDED DOUBLE DENSITY, 128MEDIUM PRECOMP START CYL DB 52 ;;HIGH PRECOMP START CYL DB 0 ;;ECC BURST LENGTH DB 0 ;;CONTROL ENDIF ;########### $' MSGSE: DB CR,LF,LF LTRSE: DB ' Is not a valid selection. Stop (Y/N) - $' MSGFD: DB CR,LF,LF,'Write format on drive (CR################################# ; ; FORMAT LIST TABLE TABLE ; ;########################################################### DB 26,0FFH ;GAP 1 DB 0 ; DB 6,0 ;SYNC DB 1,0FEH ;ID MARK DB 0 ; DB 1,0 ;SECTOR SIZE INDEX (0= 128 BYTES) DB 1,0####################################################### TLSD256: DB 15 ;SPT ; DB 40,0FFH ;GAP 4A DB 6,0 ;SYNC DB 1,0FC SINGLE DENSITY 512 BYTE FORMAT TABLE ; ;############################################################################ TLSD512##################################################################### ; ; SINGLE DENSITY 1024 BYTE FORMAT TABLE ; ;#########!0 %+ &, !'- "(. #)/ $*0################################################################### TLSD102: DB 4 ;SPT ; DB 40,0FFH ;GAP 4A DB 6,0 ;SYN#################################################### ; ; DOUBLE DENSITY 128 TABLE ; ;#####################################NING! DD TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLDD128 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF FORATA CRC DB 54,4EH ;GAP 3 DB 0 ; DB 4EH ;GAP 4 DATA ; ; DOUBLE DENSITY SKEW TABLE, SKEW 8 SEEMS OPTIMUM ; GXLATE 1,2 ;SECTOR SIZE INDEX (2= 512 BYTES) DB 1,0F7H ;HEADER CRC DB 22,4EH ;GAP 2 DB 12,0 ;SYNC DB 3,0F5H ;GAP A1 DB 1############################## TLDD102: DB 8 ;SPT ; DB 80,4EH ;GAP 4A DB 12,0 ;SYNC DB 3,0F6H DB 1,0FCH ;INDEX  REPT (TLDD102 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF ENDIF SUBTTL VARIABLE DECLARATIONS ;########; READ SECTOR BUFFER ; SECBUF DS 1024 ;SECTOR BUFFER END C DB 1,0FCH ;INDEX MARK DB 26,0FFH ;GAP 1 DB 0 ; DB 6,0 ;SYNC DB 1,0FEH ;ID MARK DB 0 ; DB 1,3 ;SECTOR SIZE INDE###################################### TLDD128: DB 48 ;SPT ; DB 80,4EH ;GAP 4A DB 12,0 ;SYNC DB 3,0F6H DB 1,0FCH M ;########################################################################### ; ; IBM SERIES 34 DOUBLE DENSITY TABLE (256 26, 6 IF $ >= (TLDD256 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! DD TABLE EXCEEDS 128 BYTES!! **** ,0FBH ;DATA MARK DB 255,0E5H ;DATA DB 255,0E5H DB 2,0E5H DB 1,0E5H ;DATA OVERFLOW DB 1,0F7H ;DATA CRC DB 84,4EH MARK DB 50,4EH ;GAP 1 DB 0 ; DB 12,0 ;GAP 3 DB 3,0F5H ;GAP A1 DB 1,0FEH ;ID MARK DB 0 ; DB 1,3 ;SECTOR SIZE#################################################################### ; ; UNINITIALIZED DATA ; ;############################åX (3= 1024 BYTES) DB 1,0F7H ;HEADER CRC DB 11,0FFH ;GAP 2 DB 6,0 ;SYNC DB 1,0FBH ;DATA ID MARK DB 255,0E5H ;DATA DB  ;INDEX MARK DB 32,4EH ;GAP 1 DB 0 ; DB 8,0 ;GAP 3 DB 3,0F5H ;GAP A1 DB 1,0FEH ;ID MARK DB 0 ; DB 1,0 ;SECTBYTE SECTORS) ; ;########################################################################### TLDD256: DB 26 ;SPT ; DB 8 ELSE REPT (TLDD256 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF ;###########################################;GAP 3 DB 0 ; DB 4EH ;GAP 4 DATA ; ; DOUBLE DENSITY SKEW TABLE, SKEW 8 SEEMS OPTIMUM ; GXLATE 15, 3 IF $ >= ( INDEX (3= 1024 BYTES) DB 1,0F7H ;HEADER CRC DB 22,4EH ;GAP 2 DB 12,0 ;SYNC DB 3,0F5H ;GAP A1 DB 1,0FBH ;DATA MAR################################################ NSECTS DS 1 ;NUMBER OF SECTORS IN TRACK CURSEC DS 1 ;CURRENT SECTOR DTYPE å255,0E5H DB 255,0E5H DB 255,0E5H DB 4,0E5H DB 1,0F7H ;DATA CRC DB 138,0FFH ;GAP 3 DB 0 ; DB 0FFH ;GAP 4B DATA OR SIZE INDEX (0= 128 BYTES) DB 1,0F7H ;HEADER CRC DB 22,4EH ;GAP 2 DB 8,0 ;SYNC DB 3,0F5H ;GAP A1 DB 1,0FBH ;DAT0,4EH ;GAP 4A DB 12,0 ;SYNC DB 3,0F6H DB 1,0FCH ;INDEX MARK DB 50,4EH ;GAP 1 DB 0 ; DB 12,0 ;GAP 3 DB 3,0F5H################################ ; ; IBM SERIES 34 DOUBLE DENSITY TABLE (512 BYTE SECTORS) ; ;############################TLDD512 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! DD512 TABLE EXCEEDS 128 BYTES!! **** ELSE REPT (TLDK DB 255,0E5H ;DATA DB 255,0E5H DB 255,0E5H DB 255,0E5H DB 4,0E5H DB 1,0E5H ;DATA OVERFLOW DB 1,0F7H ;DATA CRC DS 1 ;DISK TYPE ; ; FORMAT TRACK IOPB ; IOPB DB PB_FRMTC ;FORMAT TRACK REPT PB_SIZE - 1 LIST OFF DB 0 LIST ON å; GXLATE 4,2 ; IF $ >= (TLSD102 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! SD102 TABLE EXCEEDS 128 BYA MARK DB 128,0E5H ;DATA DB 1,0F7H ;DATA CRC DB 24,4EH ;GAP 3 DB 0 ; DB 4EH ;GAP 4 DATA ; ; DOUBLE DENSITY SKE ;GAP A1 DB 1,0FEH ;ID MARK DB 0 ; DB 1,1 ;SECTOR SIZE INDEX (1= 256 BYTES) DB 1,0F7H ;HEADER CRC DB 22,4EH ;GAP############################################### TLDD512: DB 15 ;SPT ; DB 80,4EH ;GAP 4A DB 12,0 ;SYNC DB 3,0F6H DD512 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF ;############################################################# DB 116,4EH ;GAP 3 DB 0 ; DB 4EH ;GAP 4 DATA ; ; DOUBLE DENSITY SKEW TABLE, SKEW 8 SEEMS OPTIMUM ; GXLATE 8, 2  ENDM ; ; WRITE ID SECTOR IOPB ; WIDIOPB: DB PB_WRITC ;WRITE SECTOR REPT PB_SIZE - 1 LIST OFF DB 0 LIST ON EåTES!! **** ELSE REPT (TLSD102 + 128) - $ LIST OFF DB 0 LIST ON ENDM ENDIF FORM ;#######################W TABLE, SKEW 8 SEEMS OPTIMUM ; GXLATE 48, 6 IF $ >= (TLDD128 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WAR 2 DB 12,0 ;SYNC DB 3,0F5H ;GAP A1 DB 1,0FBH ;DATA MARK DB 255,0E5H ;DATA DB 1,0E5H ;DATA OVERFLOW DB 1,0F7H ;DB 1,0FCH ;INDEX MARK DB 50,4EH ;GAP 1 DB 0 ; DB 12,0 ;GAP 3 DB 3,0F5H ;GAP A1 DB 1,0FEH ;ID MARK DB 0 ; DB ############## ; ; IBM SERIES 34 DOUBLE DENSITY TABLE (1024 BYTE SECTORS) ; ;############################################# IF $ >= (TLDD102 + 128) ; ; USER WARNING MESSAGE ; CONMSG **** WARNING! DD102 TABLE EXCEEDS 128 BYTES!! **** ELSENDM ; ; READ SECTOR IOPB ; RDIOPB: DB PB_READC ;READ SECTOR REPT PB_SIZE - 1 LIST OFF DB 0 LIST ON ENDM ; å"0 %+ &, !'- "(. #)/ $*0**************** BITOUT: JP C,BITO1 ; ; BIT IS 0, OUTPUT 0 ; RES 3,A JP BITO2 ; ; BIT IS 1, OUTPUT 1 ; BITO1: SE CALL SETCTL ; ; IF REQUESTED DRIVE = CURRENT DRIVE THEN OK AS IS ; LD A,(CMDBLK + PBDRVO) SUB A,(IX + DVNBR) JR Z,SE;DRIVE TABLE ARRAY SIZE ; NEXT: DEC A ;IF DRIVE = 0 THEN EXIT WITH POINTER SET JP M,SLED ; ADD IX,DE ;ELSE POINT TO NEX******************* ; ; HOMED SUBROUTINE STEPS THE DISK DRIVE HEAD OUTWARD UNTIL TRACK 0 FLAG IS ; TRUE OR 255 STEPS HAVE BIRECTION AND A,NOT BCDAS CALL SETCTL ; ; SET MAX TRACKS TO STEP TO ; LD L,NBTRK ;SET MAX COUNT ; ; IF ON TRACK 0;*************************************************************************** ; ; TRACK SEEK SUBROUTINE ; EXIT - DENSITY & PD DE,TMSAW ;DELAY FOR STEP AFTER WRITE RST 8 ; ; RESTORE TRACK DIFFERENCE ; POP AF ; ; IF REQUESTED < CURRENT TRACKST PULSE RST 8 ; ; SET UP TRACK DENSITY & PRECOMPENSATION LEVEL ACCORDING TO TRACK NUMBER ; SKDEN: LD E,BCSDS + BCPCL ;UT 3,A JP BITO2 ;EQUALIZE CLOCKS ; ; OUTPUT THE BIT ; BITO2: OUT (BLCTL),A ; ; DELAY FOR BAUD RATE ; LD B,(HL) LEN ; ; UNLOAD HEAD ON CURRENT DRIVE ; LD E,DCHDU CALL EXHEAD ; ; DESELECT CURRENT DRIVE ; LD A,(SVCTL) ;DESELECT ARRAY & REPEAT JR NEXT ; ; IX NOW HAS DRIVE TABLE PTR, INITIALIZE DRIVE DATA ; SLED: CALL GETDVHLD LD DE,TMHLD PEEN ISSUED. ; EXIT - AF= 0: OK, /0: TRK 0 NOT FOUND ; B, DE, HL= ? ; ;***************************************************** THEN DONE ; STEP: CALL EXSTS ;IF ON TRACK 0 THEN EXIT AND A,DMTK0 JR NZ,EXIT ; ; IF > MAX TRACKS THEN RECAL ERROR ;RE-COMP CONTROLS SET ; ZF= OK, NZ= ERROR ; B, DE, L= ? ; ;**************************************************************** THEN STEP OUT ; JR C,SOUT ;CARRY=STEP OUT ; ; ELSE STEP IN ; LD L,A ;COUNT LD A,(SVCTL) OR A,BCDAS CALL SETCTSE SD, PRECOMP LOW AS DEFAULTS ; ; IF TRACK 0 THEN USE DEFAULTS ; LD A,(CMDBLK + PBTRKO) ;IF TRACK 0 THEN USE DEFAULTS DJNZ $ RET ;*************************************************************************** ; ; THIS SUBROUTINE IS RESPONT CURRENT DRIVE, AND A,[NOT BCDSE] CALL SETCTL ; ; IF REQUESTED DRIVE NOT LEGAL THEN RETURN ERROR ; LD A,(CMDBLK + PBUSH BC LD BC,TMSIZ LDIR POP BC ; ; IF MOTOR OFF THEN START MOTOR ; SELEN: IN A,(BLSTS) ;GET BOARD LEVEL STATUS AND********************** HOMED: ; ; IF NOT ALREADY ON TRACK 0 THEN SKIP RECALIBRATE ; CALL EXSTS ;IF NOT TRK 0 THEN NO RE DEC L ;IF STEPS = 255 THEN ERROR JR Z,EROR ; ; STEP ONCE ; IN A,(XPSTP) ;ISSUE STEP PULSE LD DE,(TMSTPC) ;SET DEL*********** SEEK: ; ; IF HEAD NOT LOADED THEN LOAD HEAD ; CALL EXSTS AND A,DMHDL JR NZ,HLDD ; LD E,DCHDL CALL EL JR STEPS ; ; STEP OUT REQUIRED ; SOUT: ; ; COMPUTE TRACK COUNT ; NEG ;COMPLEMENT OFFSET ; ; IF COUNT > 12CP A,1 JR C,TRK0 ; ; IF TRACK 1 THEN DO TRACK 1 ; JR Z,TRK1 ; ; IF DATA TRACKS ARE SINGLE DENSITY THEN USE DEFAULTSSIBLE FOR SELECTING THE COMMAND REQUESTED DRIVE ; #. BEFORE DRIVE SELECTION, THE DRIVE MOTOR STATE IS TESTED AND IF NEEDED, ; DRVO) ;FETCH REQUESTED DRIVE CP A,4 JR C,SELCT1 ; LD A,SELERR OR A,A JP RETFER ; ; NOW SELECT REQUESTED DRIVE ;  A,BSMOF ; IN A,(XPMTX) ;ISSUE MOTOR START OR CONTINUE IN EITHER CASE ; JR Z,CKDV ; ; IF MOTOR STARTED AFTER TIMEOUT TCAL AND A,DMTK0 JR Z,HOME1 ; ; STEP IN 10 TRACKS TO INSURE INSIDE TRACK 0 ; LD L,10 ;ELSE STEP IN BEYOND TRK 0 LD AY RST 8 JR STEP ; ; DRIVE IS RESTORED, WAIT FOR SETTLING TIME ; EXIT: LD DE,(TMALS) ;WAIT A BIT AFTER LAST STEP RSTXHEAD ; ; WAIT FOR HEAD SETTLING TIME ; LD DE,(TMHLD) RST 8 ; ; IF CURRENT TRACK = REQUESTED TRACK THEN NO SEEK REQ7 THEN HOME, MUST BE ERROR ; JP M,HOME ; ; SET UP TO STEP OUT ; LD L,A LD A,(SVCTL) AND A,NOT BCDAS ;CLEAR DIRECTI ; BIT DFDTDB,(IX + DVFLG) JR Z,CTLS ; ; *** MUST BE DOUBLE DENSITY IF MADE IT TO HERE *** ; ; IF TRACK < MEDIUM THTHEY ARE TURNED ON. ; EXIT - IX= NEW DRIVE TABLE ; AF= 0: OK, /0: ERR ; B, DE, HL= ? ; ;********************************* SELCT1: LD L,A ;SAVE NEW DRIVE LD A,(SVCTL) ;STRIP OLD DRIVE AND A,NOT (BCDSN + BCDSE) OR A,L ;ADD IN NEW DRIVE OUT (HEN ASSUME MOTOR ON DELAY REQUIRED ; LD DE,(TMMTO) RST 8 ; ; FETCH DRIVE READY STATUS FROM FDC ; CKDV: CALL EXSTS ;SA,(SVCTL) ;SELECT 'IN' OR A,BCDAS CALL SETCTL ; ; STEP ONCE ; RECAL1: IN A,(XPSTP) LD DE,(TMSTPC) RST 8 ; ; IF 8 ; ; CURRENT TRACK = 0 ; XOR A,A ;SET COMPLETE FLAG & NO ERROR LD (IX+DVTRK),A ;SET TRACK VALUE ; ; RETURN NO ERUIRED ; HLDD: LD A,(CMDBLK + PBTRKO) SUB A,(IX + DVTRK) JR Z,SKDEN ;SET UP CONTROLS ANYWAY, IN CASE CHANGED ; ; SET DON BIT CALL SETCTL ; ; STEP ONCE ; STEPS: IN A,(XPSTP) LD DE,(TMSTPC) RST 8 ; ; IF COUNT NOT EXHAUSTED THEN REPERESHOLD THEN DO SAME AS TRACK 1 ; CP A,(IX + DVPCM) JR C,T1DD ; ; IF {TRACK < HIGH THRESHOLD} THEN DO MIDDLE VALUES ; ****************************************** SELECT: ; ; ENABLE DRIVE SELECT & FDC INTERRUPT ; LD A,(SVCTL) OR A,BCDSE BLCTL),A OR A,BCDSE ;NOW ENABLE IT CALL SETCTL ; ; SELECT NEW DRIVE TABLE ; AND A,BCDSN LD IX,DVTBL LD DE,DVDES ET FLAGS PER DRIVE READY AND A,DMDNR JP RETERR ;IF 0 THEN OK ;******************************************************** NOT 10 TRACKS THEN REPEAT ; DEC L JR NZ,RECAL1 ; ; NOW STEP OUT UNTIL TRACK 0 FOUND ; HOME1: LD A,(SVCTL) ;RESTORE DROR ; RET ; ; TRACK 0 NOT FOUND ; EROR: LD A,SEEKERR ;SET FAILURE FLAG OR A,A ;SET NZ FLAG (ERROR) JP RETFER IRECTION & STEP COUNT ; DSET: ; ; SAVE TRACK DIFFERENCE ; PUSH AF ; ; DELAY FOR STEP AFTER WRITE REQUIREMENT ; LAT ; DEC L ;IF STEPS-1 NOT 0 THEN STEP AGAIN JR NZ,STEPS ; ; WAIT FOR SETTLING TIME ; LD DE,(TMALS) ;ELSE EXTEND LA CP A,(IX + DVPCH) LD E,BCDDE + BCPCM ;USE DOUBLE DENSITY, MEDIUM PRECOMP JR C,CTLS ; ; ELSE DO INNER VALUES ; LD E#0 %+ &, !'- "(. #)/ $*0,BCDDE + BCPCH ;USE DOUBLE DENSITY, HIGH PRECOMP JR CTLS ; ; ; TRACK 0 ; TRK0: BIT DFT0DB,(IX + DVFLG) ;IF SD THEN UALL HOMED ;HOME SELECTED DRIVE JP HLDD ;NOW SEEK TRACK ;***************************************************************TUS SUBROUTINE ; EXIT - A= 1791 STATUS ; ;*************************************************************************** EXSTS: ;**************************************************************************** RWSECT: ; ; SAVE THE XFER PTR ; LD (RWPTRECTOR ; LD IY,RWNMI ;SET NMI VECTOR FOR RETURN ; ; DEFAULT TO READ MODE ; LD B,DCRDS ; ; IF WRITE OPERATION THEN S ; ; PASS BACK THE XFER COUNT ; PUSH DE LD DE,(RWPTR) OR A,A SBC HL,DE POP DE LD (CMDBLK + PBST4O),HL ; ; ASTION UNTIL FDC READY ; WROP: EX AF,AF' ;RE-SAVE MODE ; REPTW: IN A,(XPDSH) ;HOLD FOR DATA REQ ; ; OUTPUT DATA TO FDC ;T) INC A LD (ERRCT),A ; ; IF HALF OF RETRYS EXHAUSTED THEN TRY RECALIBRATE ; CP A,RTYSK JR NZ,CKLS ; CALL HOMED SE DEFAULTS JR Z,CTLS JP T1DD ; ; ; TRACK 1 ; TRK1: BIT DFT1DB,(IX + DVFLG) ;IF SD THEN USE DEFAULTS JR Z,CTLS ; ************ ; ; HEAD LOAD/UNLOAD SUBROUTINES ; ENTRY - E= HEAD COMMAND ; EXIT - IY, A= ? ; ;*************************** ; ; ISSUE TERMINATE FDC OPERATION & READ FDC STATUS COMMAND ; LD A,DCSTS ;OUTPUT SET STATUS COMMAND TO 1791 RST 32 ;),HL ; ; CLEAR ERROR COUNT ; XOR A,A LD (ERRCT),A ; ; SELECT SIDE ; LD A,D ;USE BIT 15 FOR SIDE SELECT AND A,ET WRITE MODE ; EX AF,AF' OR A,A JR NZ,OPOK ; LD B,DCWRS ;WRITE OP ; ; OUTPUT COMMAND TO FDC ; OPOK: EX AF,AF' SUME READ ERROR MASK ; LD B,DMRER ;IF NO ERRORS THEN RETURN PUSH AF ;SAVE 179X STATUS ; ; IF WRITE MODE THEN USE WRIT LD A,(HL) XOR A,C OUT (WDDTA),A ; ; POINT TO NEXT DATA ; INC HL JR REPTW ;********************************* ;HOME SELECTED DRIVE CALL Z,SEEK ;RE-SEEK DESIRED TRACK RET NZ ;IF ERROR THEN EXIT ; ; IF RETRYS EXHAUSTED THEN RETUR; USE DOUBLE DENSITY, LOW PRECOMP ; T1DD: LD E,BCDDE + BCPCL ; ; SET CONTROLS ; CTLS: LD A,(SVCTL) ;ADD DENSITY, PRECO************************************************ EXHEAD: ; ; USE RETURN ADDRESS FOR INTERRUPT RETURN ; POP IY ;IY=RETUR ; RETURN FDC STATUS ; IN A,(WDSTS) XOR A,C RET ;****************************************************************80H RRCA ;SHIFT INTO CONTROLS BIT RRCA LD (SIDE),A IF DSIZE = 8 JP Z,SIDOK ; ; CHECK FOR ILLEGAL SIDE REQUEST  ;RE-SAVE MODE LD A,(SIDE) ;COMPUTE SIDE FLAG FOR FDC RRCA RRCA RRCA RRCA OR A,B ;OUTPUT READ SECTOR COMMAND RST E ERROR MASK ; EX AF,AF' JR NZ,RWMSK ; LD B,DMWER ;WRITE ERR MASK ; ; RETURN OPERATION STATUS ; RWMSK: EX AF,AF' ******************************************* ; ; CHECK FOR RETRYS SUBROUTINE ; EXIT - A= 0: OK, /0: HARD ERROR OR RETRYS EXHN ERROR ; CKLS: CP A,RTYLS JR Z,STNZ ; ; DELAY A WHILE FOR PLL RECOVERY & RETURN WITH NO ERRORS ; LD DE,TMPLD ;ELSE WMP BITS TO CONTROL BITS AND A,NOT (BCDDE + BCPCA + BCPCB) ;CLEAR BITS 1ST OR A,E LD (IX + DVCTL),A ; ; SET CONTROLS ;N ADDR ; ; PUT TRACK # INTO DATA REGISTER ; IN A,(WDTRK) ;PERFORM SEEK TO CURRENT TRACK WITH HEAD LOAD OUT (WDDTA),A ;************ ; ; READ/WRITE SECTOR SUBROUTINE INITIATES DISK XFER, SEVICES THE CONTROLLER ; CHIP DURING DATA XFER, & TERMIN ; IN A,(BLSTS) ;CHECK IF DRIVE CAPABLE AND A,BSTSD JP NZ,EROR ;IF NOT CAPABLE THEN SEEK ERROR ; SIDOK: ENDIF ; ;32 ; ; SELECT DIRECTION ; EX AF,AF' ;IF WRITE OP THEN GO DO IT JR Z,WROP ; EX AF,AF' ;RE-SAVE MODE ; ; READ DI ;RE-SAVE MODE ; POP AF ;179X STATUS AND A,B RET Z ; ; SAVE THIS ERROR IN CASE RETRYS EXHAUSTED ; LD B,A PUSH BAUSTED ; ;**************************************************************************** CHKRT: ; ; IF ERROR IS DRIVE NOT RAIT & RETURN WITH NO ERRORS RST 8 ; XOR A,A RET ; ; RETURN RETRYS EXHAUSTED (NZ) ; STNZ: INC A RET ;-------- EXITS: CALL SETCTL ; ; SET CURRENT TRACK ; LD A,(CMDBLK + PBTRKO) ;SET REQUESTED TRACK LD (IX + DVTRK),A XOR A,C  ; OUTPUT PASSED COMMAND TO FDC ; LD A,E ;OUTPUT PASSED COMMAND XOR A,C OUT (WDCMD),A ; ; WAIT FOR FDC INTERRUPT ATES OPERATION WHEN FINISHED. ERROR ; DETECTION IS IMPLEMENTED & RETRIES ARE EXECUTED IF DATA ERRORS ARE DETECTED. ; ENTRY - D COMPUTE CONTROLS ; RWRTRY: LD HL,(RWPTR) ;RESTORE THE XFER PTR ; LD A,(SIDE) LD B,A LD A,(SVCTL) AND A,NOT BCDASRECTION ; RDREPT: ; ; OUTPUTTING TO THIS PORT GENERATES A CPU 'WAIT' UNTIL FDC READY ; IN A,(XPDSH) ; ; FDC READY, C ; ; SAVE SECTOR ; PUSH DE ; ; IF RETRYS NOT EXHAUSTED THEN RETRY ; CALL CHKRT POP DE POP BC ;FDC ERROR JREADY THEN HARD ERROR ; AND A,DMDNR RET NZ ; ; IF NO RETRYS ALLOWED THEN RETURN HARD ERROR ; LD A,(CMDBLK + PBFLGO) -------------------------------------------------------------------- ; ; INITIALIZATION FROM RESET VECTOR ; THIS ROUTINE COUT (WDTRK),A ;SET TRACK REGISTER ; ; RETURN NO ERRORS ; XOR A,A ;SET Z FLAG RET ; ; CALIBRATE TRACK # ; HOME: C ; JR $ ;WAIT FOR INTERRUPT ;*************************************************************************** ; ; GET STA= 0: WRITE, /0: READ ; HL= XFER PTR ; DE'= PHYSICAL SECTOR # {1..N} (D15= SIDE BIT) ; EXIT - NZ= ERROR ; HL, A, B= ? ;  OR A,B CALL SETCTL ; ; SET FDC SECTOR REGISTER ; LD A,E XOR A,C OUT (WDSEC),A ; ; SET FDC INTERRUPT RETURN VXFER DATA ; IN A,(WDDTA) XOR A,C LD (HL),A INC HL ;PTR +1 JR RDREPT ; ; OPERATION DONE, CHECK STATUS ; RWNMI:  Z,RWRTRY ; ; RESTORE ERROR & RETURN IT ; LD A,B JP RETERR ; ; EXECUTION OF NEXT INSTRUCTION GENERATES A WAIT CONDI AND A,1 SHL PBFNRB RET NZ ; ; KICK MOTOR ON IN THE PANTS AGAIN ; IN A,(XPMTX) ; ; BUMP ERROR COUNT ; LD A,(ERRCALLS THE COLD START SUBROUTINE & RUNS THE DIAGNOSTICS. ; ;--------------------------------------------------------------------$0 %+ &, !'- "(. #)/ $*0-------- CLEAR: ; ; SET UP HARDWARE ; LD SP,STACK ; ; SINGLE INTERRUPT MODE ; IM 1 ;SINGLE INTERRUPT MODE TO RSTEST RAM LD BC,RAMSIZ ; NXTLOC: LD A,(HL) CPL LD (HL),A CP A,(HL) CPL LD (HL),A JR NZ,DRAMER ; INC HL DEC BCOF JR Z,SETERR ; ; TEST FDC CHIP ; DFDCBSY: LD A,DCIFI ;GET FDC'S ATTENTION FIRST RST 32 ; DFDCB1: IN A,(WDSTS) ;A LD A,D LD (CMDBLK + PBST5O),A LD A,FDCDER SETERR: LD (CMDBLK + PBSTATO),A LD A,B ;PASS OUT TEST # LD (CMDBLK + riptor ' ;NEW ID DIDSIZ EQU $ - DESCID ;########################################################################### ; ; E FOR TRACK 0 DVSPT1 DS 1 ;SECTORS PER TRACK 1 DVSSZ1 DS 1 ;SECTOR SIZE FOR TRACK 1 DVSPTD DS 1 ;SECTORS PER DATA TRACKS DVS DELAY DW DFSTPC ;;STEP INTERVAL DELAY DW DFALS ;;DELAY AFTER LAST STEP DW DFMTO ;;MOTOR ON DELAY ; DB DFDFL ;;DEFA ENDIF ;--------------------------------------------------------------------------- ; ; COMMAND BLOCK ; THIS IS THE 56 ; ; TEST FOR INVERTED BUS FDC OPTION ; LD C,0 ;DEFAULT TO NON-INVERTED DATA IN A,(BLSTS) AND A,BSUS0 JR NZ,STO LD A,C OR A,B JR Z,RTSTDN JP NXTLOC ; ; RAM ERROR, RETURN ERROR TO HOST ; DRAMER: LD A,RAMERR POP BC ;RESTORE WAIT FOR RESET SEQUENCE TO FINISH XOR A,C AND CSBSY JR NZ,DFDCB1 ; IN A,(WDTRK) ;CHECK FDC REGISTERS LD E,A CPL PBST2O),A WDOK: ; ; NOW DO RECAL COMMAND THAT MAY HAVE BEEN ABORTED FROM RESET ; LD A,00000000B RST 32 ; DFDCB2: I DRIVE TABLE OFFSETS ; ;########################################################################### STRUCT 0 ; ; CONTROSZD DS 1 ;SECTOR SIZE FOR DATA TRACKS DVPCM DS 1 ;MEDIUM PRECOMP START TRACK # DVPCH DS 1 ;HIGH PRECOMP START TRACK # ; DVSIULT SSSD FORMAT FLAGS IF DSIZE = 8 REPT 3 DB 26 ;;26 SECTORS PER TRACK DB 0 ;;128 BYTES PER SECTOR ENDM DB 26 ; HOST COMMUNICATION AREA ; ;--------------------------------------------------------------------------- REPT IOPBSZ DB 0 P ; ; IF INVERTED THEN SET REGISTER TO XOR DATA WITH 0FFH ; DEC C ; ; SET DRIVE TABLE POINTER TO DUMMY ; STOP: LD IFDC POLARITY JR SETERR ; ; TEST INTERRUPT FLIP FLOP ; RTSTDN: POP BC ;RESTORE FDC DATA POLARITY IN A,(XPIRR) ;CLEAR IOUT (WDTRK),A LD B,A EX (SP),HL ;DELAY A WHILE FOR FDC TO CATCH UP EX (SP),HL EX (SP),HL EX (SP),HL IN A,(WDTRK) N A,(WDSTS) ;WAIT FOR COMMAND TO FINISH XOR A,C AND CSBSY JR NZ,DFDCB2 ; ; ALL DONE, SO GOING TO SLEEP ; SLEEP: LD SLLER DATA ; DVNBR DS 1 ;CURRENT PHYSICAL DRIVE # DVTRK DS 1 ;CURRENT PHYSICAL TRACK # DVSEC DS 1 ;CURRENT PHYSICAL SECTOR # ZE DS 0 ENDM ;############################################################################ ; ; INITIAL DATA FOR RAM IN; MEDIUM PRECOMP START (1/3 TRACKS + 1) DB 52 ;; HIGH PRECOMP START (2/3 TRACKS + 1) ENDIF IF DSIZE = 5 REPT 3 DB ENDM ; DATASZ EQU $ - IDATA ;SIZE OF INITIALIZATION SUBTTL DATA AREA ;##################################################X,DTDED ;SET DRIVE TABLE PTR ; ; INITIALIZE CONTROL PORT ; XOR A,A LD (EIACTL),A ;INIT EIA BIT CALL SETCTL ;BASE BLCNTERRUPT FF IN A,(BLSTS) ;FETCH INTERRUPT STATUS LD B,A ;SHOW IT TO HOST AND A,BSINT LD A,IFFER ;PASS BACK ERROR JR  LD D,A XOR A,B LD B,1 JR NZ,WDBAD ; IN A,(WDSEC) LD E,A CPL OUT (WDSEC),A LD B,A EX (SP),HL EX (SP),HL P,STACK EI ;DIAGNOSTICS OK, SET ALARM & GO TO SLEEP HALT ; ; WAKE-UP RETURNS HERE, SO RESTORE STACK & GO BACK TO SLEEP DVCTL DS 1 ;LAST CONTROLS USED OFFSET DVLGDO DS 1 ;LOGON DISABLE FLAG ; ; DRIVE DATA ; DVHLDO DS 2 ;DRIVE HEAD LOAD DELAITIALIZATION ; ;############################################################################ IDATA EQU $ ; ; DRIVE TABLES 16 ;;16 SECTORS PER TRACK DB 0 ;;128 BYTES PER SECTOR ENDM DB 14 ;;MEDIUM PRECOMP START (1/3 TRACKS + 1) DB 27 ;;HI########################## ; ; BANK 0 ; ;############################################################################ OTL BITS ; ; INITIALIZE DATA AREAS FROM ROM ; PUSH BC LD HL,IDATA LD DE,DATAA LD BC,DATASZ LDIR ; ; INIT OTHERZ,SETERR ; ; TEST MOTOR ON ONE-SHOT ; IN A,(XPMTX) ;TURN ON MOTOR IN A,(BLSTS) ;FETCH STATUS LD B,A AND A,BSMOF LEX (SP),HL EX (SP),HL IN A,(WDSEC) LD D,A XOR A,B LD B,2 JR Z,WDOK ; WDBAD: LD (CMDBLK + PBST3O),A ;PASS OUT DATA ; JR SLEEP SUBTTL CONSTANT DATA AREAS ;########################################################################### ; Y VALUE DVSTPO DS 2 ;DRIVE STEP MOTOR RATE VALUE DVALSO DS 2 ;DRIVE DELAY AFTER LAST STEP VALUE DVMTOO DS 2 ;DRIVE MOTOR ON D ; IRP #DRIVE,0,1,2,3 ; ; DRIVE TABLE FOR DRIVE #DRIVE ; DB #DRIVE ;;DRIVE # DB 255 ;;LAST TRACK # (-1 = UNUSED) GH PRECOMP START (2/3 TRACKS + 1) ENDIF ENDM ; ; DUMMY DRIVE AS HANDLE ; DB 4,255,0,0,0 DW DFHLD,DFSTPC,DFALS,DFMRG BANK0 ; ; FORMAT DRIVER BUFFER ; DS 512 ;FORMAT DRIVER BUFFER ; ; LOCAL DATA ; ORG BANK0 + 2F0H ; ; STAC VARIABLES ; LD A,(BAUDS + 2) ;BAUD RATE LD (BAUDOUT),A ; ; NOW DO DIAGNOSTICS ; ; TEST RAM 1ST ; LD HL,BANK0 ;TD A,MTONER ;ASSUME ERROR JR NZ,SETERR ; IN A,(XPMTO) ;TURN OFF MOTOR IN A,(BLSTS) LD B,A ;PASS BACK STATUS AND A,BSM BIT ERROR (A 0= BAD) IN A,(WDSTS) ;PASS OUT FDC STATUS XOR A,C LD (CMDBLK + PBST1O),A LD A,E LD (CMDBLK + PBST4O),; DISKETTE FORMAT LABEL ; ;########################################################################### DESCID DB 'Disk DescELAY VALUE ; ; DISK FORMAT DATA ; DVFLG DS 1 ;DISK FORMAT FLAGS DVSPT0 DS 1 ;SECTORS PER TRACK 0 DVSSZ0 DS 1 ;SECTOR SIZ DB 0 ;;LAST SECTOR # DB 0C4H + #DRIVE ;;LAST CONTROLS USED DB 0 ;;0: ENABLE, /0: DISABLE LOGON ; DW DFHLD ;;HEAD LOADTO DB 0 IF DSIZE = 5 REPT 3 DB 16,0 ENDM DB 14,27 ENDIF IF DSIZE = 8 REPT 3 DB 26,0 ENDM DB 26,52 K GROWS TOWARD FORMAT BUFFER ; STACK EQU $ SIDE DS 1 ;SIDE SAVE {0,80H} ERRCT DS 1 ;RETRY COUNT {0..9} SVCTL DS 1 ;LAST B%0 %+ &, !'- "(. #)/ $*0LCTL OUTPUT IMAGE EIACTL DS 1 ;EIA BIT TO OUTPUT TO CONTROL PORT BAUDOUT DS 1 ;EIA OUTPUT BAUD RATE RWPTR DS 2 ;R/W XFER POIN################################################## ; ; COMMAND BLOCK ; THIS IS THE HOST COMMUNICATION AREA ; ;###########ååååååTER ; ; *** THE FOLLOWING 8 BYTES MUST BE IN THIS ORDER FOR PROPER INITIALIZATION *** ; TMHLD DS 2 ;CURRENT DRIVE HEAD LOAD ################################################################ CMDBLK: DS IOPBSZ ;RESERVE ENOUGH SPACE IF ($ - DATAA) ååååååDELAY TMSTPC DS 2 ;CURRENT DRIVE STEP RATE TMALS DS 2 ;CURRENT DRIVE AFTER LAST STEP DELAY TMMTO DS 2 ;CURRENT DRIVE MOTOR ON<> DATASZ CONMSG **** DATA INITIALIZATION PHASE ERROR **** ENDIF ;#################################################åååååå DELAY TMSIZ EQU $ - TMHLD ;SIZE OF DRIVE PARAMETERS ; ; INITIALIZED DATA ; IF $ > (BANK0 + DDCBO - (DVSIZE * 5)) ########################## ; ; PHYSICAL SECTOR BUFFER (UP TO 1K) ; ;########################################################ååååååCONMSG **** UNINITIALIZED DATA OVERLAPS INITIALIZED DATA! **** ENDIF ORG BANK0 + DDCBO - (DVSIZE * 5) ;POSITION BLOCK DAT################### ORG BANK1 SBUFR EQU $ ;PHYSICAL SECTOR BUFFER END ååååååAA EQU $ ; ; DRIVE TABLES ; DVTBL DS DVSIZE * 4 DTDED DS DVSIZE ;DUMMY DVDES EQU DVSIZE ;#########################ååååååå&0 %+ &, !'- "(. #)/ $*0åååååååååååååååååååååååååååååååååååååååååååååååå'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åååååååååååååååååååååååååååååååååååååååååååååååå