NEIX;%X; *******************************%X; * *%X; * Module : Ultra Speed Copier *%X; * Date : 22nd December 1985 *$%X; * *.%X; *******************************8X;BAUltra Speed CopierALAProgram EquatesAVX;`#X; =============================j#X; if Boot = 1 Make Boot versiont#X; =============================~X; BOOTRTCLOCK POINTVBISTATDENSITY TEMP PASSNDRIVESONEPASS ORDER WTRACK RTRACK TRACK  WSECT RSECTTRKSCTR( BASE2 EMPTY<BANKNUMFNUM.EMPTYPTXTLUMZFORGRNDd KYBRDnVVBLKD$xSDLSTL0DDEVIC DUNITDCOMNDDSTATSDBUFALDBUFAHDTIMLODTIMHIDBYTLODBYTHI  DAUX1  DAUX2 CONSOLSKSTAT PORTBDMACTL" NMIEN,DSKINVS6 SIOVY@XITVBVbJ ERCODE0T CHKSUM1^ BUFRLO2h BUFRHI3r BYTES4| CRETRY6 DRETRY7CDEVIC:CCOMND; CAUX1< CAUX2= AUDF3 AUDF4 AUDC3 AUDC4AUDCTL PBCTLSEROUT  SERIN  IRQEN SKCTLSKREST &SETVBV\0DSKMAP: BOOTD N STRTPRGX =PROGENDSTRTPRG b STRTPRG=lv0Q>P@;;Store $FF at $4000%> BANK;;Bank oneQ@;;Test to see if $4000R>;;Contains $FFHK128;;128K Memory!START;;48K Memory K128Q>PMEMORY;;Alter Memory size%>?PUTMSZEQWRD58 PTXT68 1 I?PUTMSZE  !START*X;4X;>X;Ġ֠ŠHX;RX;\SIO%DUNITfQDRIVE8p GL77DzQ>PDRIVE8$>  L73FQ950 IL73FQ>? PDCOMND$> &DBYTLO &DBUFAL &DTIMLO0 &DBYTHI &DBUFAH Q>@$ PDSTATS. SIOV8 GL76FB QL %DUNITV PDRVCDE8` L76F$>j L7717t P9~ 2 (> HL771 "%DUNIT;;GET DEVICE UNIT NUMBER L77DC !L>0;;CALCULATE DEVICE NUMBER, PCDEVIC;;AND SAVE. QDCOMND;;GET DISK COMMAND PCCOMND;;AND SAVE. QDAUX1;;GET SECTOR LOW PCAUX1;;AND SAVE. QDAUX2;;GET SECTOR HIGH PCAUX2;;AND SAVE. QDRVCDE8;;SET BAUD RATE PAUDF3 Q> PAUDF4( @2 &;;SAVE STACK POINTER< Q>F PDRETRY;;DON'T RETRY SECTORP L7A8=;;DISABLE IRQ'SZ Q> d PCRETRYn L7ADQ>x PERCODE;;CLEAR ERROR STATUS P Q>:;;SET THE BUFFER PBUFRLO;;ADDRESS TO $23A Q> PBUFRHI Q> PBYTES;;4 BYTES TO TRANSFER. Q>4 PPBCTL , SENDBUF;;SEND THE BUFFER TO THE DEVICE. QDBUFAL;;SET ZERO PAGE PBUFRLO;;BUFFER ADDRESS QDBUFAH;;TO THE VALUES PBUFRHI;;HELD IN THE DCB. (QDBYTLO;;GET NUMBER OF BYTES TO SEND PBYTES;;AND SAVE." *DSTATS, IL7DF6 , SENDBUF;;SEND THE BUFFER TO THE DEVICE.@ L7DF"J L862T *DSTATS^ J?NORECV;;NOT RECIEVE DATAh 0 RECVBUF;;RECIEVE THE BUFFER FROM THE DEVICEr ?NORECVQ>| PAUDC4 Q PIRQEN L889 .;;ENABLE IRQ'S QERCODE;;GET ERROR CODE. FL803;;BEQ IF NO ERRORS. "DRETRY;;ANY DRETRY LEFT ? HL7A8;;BNE IF YES. "L803?;;PLACE ERROR CODE IN 'Y' : X; "X;ĠҠϠŠŠ X; SENDBUF$> ?LOOP10 H?LOOP1& # INITSER;;INITILIZE SERIAL PORT0 ,%>;;INITILIZE INDEX TO START OF BUFFER.: %Q@BUFRLO7;;GET FIRST BYTE TO SENDD /PCHKSUM;;AND USE AS INITIAL CHECKSUM VALUE.N 'PSEROUT;;SEND BYTE OVER SERIAL BUS.X /?LOOP23;;POINT INDEX TO NEXT BYTE IN BUFFERb ")BYTES;;AT THE END OF BUFFER ?l F?EXIT1;;BNE IF YES.v 'Q@BUFRLO7;;GET NEXT BYTE IN BUFFER. ' SENDBYT;;AND SEND OVER SERIAL BUS.  GCHKSUM;;GENERATE CHKSUM !?LOOP2;;REPEAT ABOVE. +?EXIT1QCHKSUM;;GET THE CHECKSUM VALUE, ) SENDBYT;;AND SEND TO THE DISK DRIVE. ?LOOP3QIRQEN M> H?LOOP3 $> %> L88D Q> PIRQEN !L869 X; X;ŠҠƠ X;͠ŠŠ* X;4 RECVBUFQ>;;INITILIZE THE> PCHKSUM;;CHECKSUM TO ZEROH PEMPTY;;Set to Sector EmptyR *%>;;INITILIZE BUFFER POINTER TO ZERO.\ 0?LOOP4 RECVBYT;;GET FIRST BYTE FROM DEVICE.f !P@BUFRLO7;;AND SAVE IN BUFFERp $ GCHKSUM;;THEN ADD TO THE CHKSUMz *3;;POINT TO THE NEXT BYTE IN THE BUFFER )BYTES;;AT END OF BUFFER ? H?LOOP4;;BNE IF NO. . RECVBYT;;GET THE CHECKSUM FROM THE DEVICE .RCHKSUM;;IS IT THE SAME AS THE COMPUTERS ? "H?ERROR1;;CHECKSUM NOT CORRECT :;;OK. ?ERROR1!TIMOUT L862$> %> L88D L869 INITSER1 Q>< PPBCTL RECVBYTR>A FL889$R>C. FL8898R>EB FDEVDONELQ>;;DEVICE NAK.V!SETERR;;SET THE ERROR FLAG`DEVDONEQ>;;DEVICE DONE.j PERCODEt L889%>~$>L88DQ>4TIMOUTP& Q>5TIMOUTP'Q> !SETVBVTIMOUTQ>SETERRPERCODE$B* GL8B0 "CRETRY  FL8B0 !L7ADL8B0!?NORECV(X;2X;Šˠ͠<X;F GCHKSUM,P OCHKSUMZO>d PCHKSUMn:xX;X;ŠŠX;RECVBYTQIRQENM>  HRECVBYTQ>߾ PIRQENQ> PIRQEN QSKSTAT PSKREST IL8DCM>  FL8DC QSERIN>" LEMPTY, PEMPTY6A@:JL8DC!TIMOUTTX;^X;ĠŠhX;r SENDBYT5|?LOOPQIRQENM> H?LOOPQ> PIRQENQ> PIRQEN7 PSEROUT:INITSERQ># *BITDATA !?INITINITSER1Q>?INITPSKCTL PSKRESTQ>(& PAUDCTL0Q>: PAUDC4DQ>N PIRQENX:b lDRIVE ===vDRVCDE ===BITDATA WADisplay ListADLIST p=p=p @ SCREEN =p==p==p =p==p==p =p==p==p BMESSAGE FLASH1 A DLISTAScreen DisplayA SCREEN / A ULTRA SPEED BACKUP 2.2 A/ A A 4TXT1 A ource Drive : D1:SLOW A*4TXT2 A estination Drive : D1:SLOW A44TXT3 A Density : Single A>4TXT4 A Reading Sector : 0000 AH4TXT5 A Writing Sector : 0000 AR4TXT6 A Memory Size : 48K A\4TXT7 A Empty Sectors : 0000 Af4TXT8 A umber of opies : 1 Ap6FLASH1 A Press Start to Begin Az6FLASH2 A Ultra Speed Backup Version 2.2 A6FLASH3 A for use with the US Doubler. A6FLASH4 A copyright (c) 31st May 1986. A6FLASH5 A Insert Source Disk & press Return A6FLASH6 A Insert Destination Disk & press Return A6FLASH7 A Formatting Disk A6FLASH8 A Disk Error on Drive 1, etry ontinue A6FLASH9 A Insert both Disk & press Return A7FLASH10 A All Copies Done, press Return A7FLASH11 A AWRD1 AD1:SLOWAWRD2 AD1:FASTAWRD3 AD2:SLOWAWRD4 AD2:FASTAWRD5 A128KAWRD6 ASingleAWRD7 ADuel A$WRD8 ADoubleA. SOURCE 8DESTINATION B COPIES L MEMORY 0VX;`X; =============jX; Update ScreentX; =============~X;UPDATEQSOURCET?T?T??$>?UPDATE1QWRD18 G?UPDATE2 PTXT1932 H?UPDATE1?UPDATE2QDESTINATION T?T?T?(?2$><?UPDATE3QWRD18F G?UPDATE4P PTXT29Z3d2n H?UPDATE3x?UPDATE4%> Q>4TXT8 PPOINT Q>5TXT8 PPOINT QCOPIES PRINTHEX:X;X; ================X; Print Hex NumberX; at (POINT),YX; ================X;"PRINTHEX5;;Save Value to printV?;;Get high nibbleV?;;in low nibble"V?;;position,V?6 ?PRNTHEX;;Print High nibble@7;;Restore Value to printJM>;;Mask out high nibbleT%?PRNTHEXR> ;;is it less then $0A^D?PRNTHEX1;;Yes !h,;;Some adjustment isrO>;;required - add 7|-?PRNTHEX1O>;;add $10 gives screen code$P@POINT7;;store in screen memory3;;point to next byte:X;X; ===============X; Display messageX; ===============X; FLASHT??"QFLASHTAB8;;Alter where anticsPMESSAGE;;Second LMS looks"QFLASHTAB8;;for screen dataPMESSAGE:X;&!X; ===========================0!X; Pointer to Flash on Message:!X; ===========================DX;N FLASHTABX# FLASH1=FLASH2=FLASH3=FLASH4b# FLASH5=FLASH6=FLASH7=FLASH8l FLASH9=FLASH10=FLASH11vX;X; =======================X; Vertical Blank InteruptX; =======================X;VBIQVBISTATHVBIOFF;;VBI Switched offQRTCLOCKM>;;Get high bit andT?;;shift into carryQRTCLOCK U?;;Shift carry in to low bitM> FLASHVBIOFF!XITVBV X;X; =================== X; Bank Switch Routine*X; Bank passed in 'Y'4X; 'Y' = 0 Normal>X; 'Y' = 1 Bank 1HX; 'Y' = 2 Bank 2RX; 'Y' = 3 Bank 3\X; 'Y' = 4 Bank 4fX; ===================pX;zBANKQPORTBM> LBNKVAL8 PPORTB 'BANKNUM:BNKVAL ==== X;X; ==================X; Access disk sectorX; and update screenX; ==================X;ACCESS%> QDCOMNDR>R F?READ$%>(.?READQDAUX28 PRINTHEXB QDAUX1L PRINTHEXVQ>` PDTIMLOjQ>@t %DCOMND~)>R F?READ1T??READ1PDSTATS QDAUX2 HGETSCTR QDAUX1R> EGETSCTR QDBYTLO5 QDBYTHI5Q>  PDBYTHIQ> PDBYTLO( GETSCTR27< PDBYTHIF7P PDBYTLOZ?OK:dGETSCTR SIOnI?OKx ERRORIGETSCTR;;etry!?OK;;ontinueX;X; =============X; Error on DiskX; =============X;ERRORQMESSAGE5QMESSAGE5, QDUNITO>PFLASH8Q>" FLASH;;Display Disk Error,?GET GETKEY6R>(;;@ F?RETRYJR>;;T H?GET^$>h G?RESUMEr?RETRY$>| ?RESUME7PMESSAGE7 PMESSAGEA:X;X; ==============X; Get Return KeyX; ==============X;GETRET GETKEYR>  HGETRET:X;X; ===========&X; Press a Key0X; ===========:X;D#GETKEYQSKSTAT;;Wait until lastNM>XFGETKEY;;releasedbQ>;;Reset keyboardlPKYBRD;;codev?GETKEYQCONSOL;;Check forR>;;START key"H?GETKEY1;;if not try keyboardQ>;;set minus flag:$?GETKEY1QKYBRD;;get key pressedG?GETKEY;;loop until plus:X;X; ======================X; Calculate next addressX; Return :-X; DBUFAL next addressX; CC okX; CS Memory Full X; ======================X;  CALCADR,*QDBUFAL;;Add the last4ODBYTLO;;address to the>PDBUFAL;;number of bytesHQDBUFAH;;in a sectorR ODBYTHI\ PDBUFAHf%MEMORY;;get memory sizepI?K48;;it is 48Kz%BANKNUM;;Get bank numberF?K48;;still in main memoryR>;;is this bank full ?E?FULL;;yes it is#?K48R>;;is main memory full ?E?FULL;;yes it is:"?FULLQMEMORY;;get memory size(GSWITCH;;if its 128K try Bank switch:;;48K no switch possible$SWITCH%BANKNUM;;Get bank number3;;increment it by one'BANKNUM;;save bank number%)>;;test to see if bank is validD?BANKOK;;yes it is:;;memory & banks full?BANKOK BANK$Q>;;Reset pointer.PDBUFAL;;to start of8Q>@;;new bankB PDBUFAHL:VX;`X; ==============jX; Set Up SegmenttX; ==============~X; START$>B!Q>4START;;Set Restart addressP  Q>5STARTP Q> PCOPIES;;Default to one copyRESTARTQ>PD;;Disable coldstartPNMIEN;;Disable NMI'sPVBISTAT;;VBI status = Menu &PFORGRND;;Forground colour - BlackQ>4DLIST;;Point antic toPSDLSTL;;look at the(Q>5DLIST;;new display2PSDLSTL;;list<Q>4VBI;;Tell OS whereFPVVBLKD;;defered VBI isP Q>5VBIZPVVBLKDdQ>nPTXTLUM;;Set text luminancexQ>@PNMIEN;;Enable NMI's#MENU UPDATE;;Update Selections?LOOP1 GETKEY GCOPYDISKR>>;;Keyboard 'S'F?CHNGSRCER>:;;Keyboard 'D'F?CHNGDESTR>;;Keyboard 'C'F?CHNGCOPYR>#;;Keyboard 'N'F?CHNGCOPY16 H?LOOP1?CHNGSRCE$SOURCE2A"M>, PSOURCE6V?;;Bit 0 in carry@6J-VDESTINATION;;Drop Bit 0 from DestinationT8^*UDESTINATION;;Make Both Bit 0 the sameh !MENUr?CHNGDEST$DESTINATION|2AM>PDESTINATIONV?;;Bit 0 in carry6#VSOURCE;;Drop Bit 0 from Source8%USOURCE;;Make Both Bit 0 the same !MENU?CHNGCOPY#COPIES HMENU #COPIES HMENU ?CHNGCOPY16, QCOPIES O>& PCOPIES0 !?CHNGCOPY: X;D X; =============N X; Copy the DiskX X; =============b X;l COPYDISK#VBISTATv X; X; ======================== X; Find Source Disk Density X; ======================== X; ?GETDENSITYQSOURCE V? , O> PDUNIT Q>S PDCOMND DSKINV I?DRVOK1! ERROR !!?GETDENSITY!?DRVOK1%> ! 'DENSITY*! Q;;Test for Double density4!M> ;;and if found skip>!%H?NOTDUEL;;test for single & duelH!%>R! 'DENSITY\!Q>Rf! PDCOMNDp!Q>z! PDAUX1!Q>! PDAUX2! Q>4BUFFER! PDBUFAL! Q>5BUFFER! PDBUFAH! DSKINV! G?NOTDUEL! #DENSITY!?NOTDUELQDENSITY!T?;;Times 2!PTEMP;;Save!T?;;Times 4"!OTEMP;;Plus times 2 - Times 6"?"$>$"?PUTDENSTYQWRD68." PTXT398"3B"2L"(>V"D?PUTDENSTY`"Q>j" PONEPASSt"PWTRACK;;Write Track~"PRTRACK;;Read Track"&PWSECT;;Write Sector 0 to 17 or 25"%PRSECT;;Read Sector 0 to 17 or 25" PPASS"PNUM.EMPTY"PNUM.EMPTY"Q>4TXT4" PPOINT"Q>5TXT4" PPOINT"%>("Q>" PRINTHEX#Q> # PRINTHEX#%>x#Q>(# PRINTHEX2#Q><# PRINTHEXF# QSOURCEP#NDESTINATIONZ#N>d#M>n#V?x# PNDRIVES# FCOPY#Q># FLASH# GETRET#COPY READ# WRITE# QRTRACK#R>(# DCOPY#Q> # FLASH# GETRET# !RESTART$X;$X; =========================$X; Sector Read & Write order"$X; =========================,$X;6$ SNGORDER@$ ;;Sectors per trackJ$ ;;Bytes per sectorT$ = == == ^$ =====h$ == == =r$USSNGLORDER|$ ;;Sectors per track$ ;;Bytes per sector$ =====$ == = = = $  =====$ DUELORDER$ ;;Sectors per track$ ;;Bytes per sector$ =====$ =====$ == == =$  == ===$  =$USDUELORDER% ;;Sectors per track% ;;Bytes per sector% =====&% == = = = 0%  =====:% =====D% =N% DBLORDERX% ;;Sectors per trackb% ;;Bytes per sectorl% = === =v%  === ==% == ===%USDBLORDER% ;;Sectors per track% ;;Bytes per sector% =====% == = = = %  =====% ORDERTAB% SNGORDER=USSNGLORDER% DUELORDER=USDUELORDER% DBLORDER=USDBLORDER%%READ UPDATE&"QSOURCE;;Make c=0 normal speed &V?;;or c=1 ultra speed&"QDENSITY;;Get density 0,1 or 2 &#U?;;Multiply by 2, bit 0 = carry*&T?;;Multiply by 24&?>&QORDERTAB8H& PORDERR&QORDERTAB8\& PORDERf& QNDRIVESp&H?OK2DRIVESz&Q>& FLASH& GETRET&?OK2DRIVESQ> & FLASH& QRSECT& PTRKSCTR& QRTRACK& PTRACK&Q>R& PDCOMND& QSOURCE&V?&,'O>' PDUNIT' GETPUTBUF$' QTRACK.' PRTRACK8' QTRKSCTRB' PRSECTL':V'`'-WRITEQDESTINATION;;Make c=0 normal speedj'V?;;or c=1 ultra speedt'QDENSITY;;get density~'#U?;;Multiply by 2, Bit 0 = carry'T?;;Multiply by 2'?'QORDERTAB8' PORDER'QORDERTAB8' PORDER' QCOPIES'5' QNDRIVES'H?OK2DRIVES'?NXTCPYQ>' FLASH( GETRET (?OK2DRIVESQPASS($H?FMTDONE;;Disk Already formated(Q>(( FLASH2( FORMAT<(?FMTDONEQ> F( FLASHP( QWTRACKZ( PTRACKd( QWSECTn( PTRKSCTRx(Q>P( PDCOMND(QDESTINATION(V?(,(O>( PDUNIT( GETPUTBUF( "COPIES(6( UPDATE(8( H?NXTCPY( #PASS)7) PCOPIES) QTRACK") PWTRACK,) QTRKSCTR6) PWSECT@):J)X;T)X; ===================^)X; Get or Put a Bufferh)X; ===================r)X;|)GETPUTBUF%>) BANK)Q>)PBASE;;Initilize base)PBASE;;sector to zero)%>) $TRACK)?INITBASE0)G?INIT.DONE),)QBASE;;Add number of)O@ORDER7;;sectors per track)PBASE;;to base sector)D?INITBASE* #BASE*H?INITBASE*?INIT.DONEQ>4BUFFER&* PDBUFAL0* Q>5BUFFER:* PDBUFAHD*Q>1N* PDDEVICX*3b* Q@ORDER7l* PDBYTLOv*3* Q@ORDER7* PDBYTHI*Q>4TXT4* PPOINT*Q>5TXT4* PPOINT*X;*X; =====================*X; Read or Write Sectors*X; until buffer is full*X; or empty if writing*X; Adjusting Sector Map*X; =====================+X; + QDCOMND+R>P + F?WRITE*+ ?READ,4+ QTRKSCTR>+O>H+?R+,\+ QBASEf+ O@ORDER7p+ PDAUX1z+ QBASE+O>+ PDAUX2+ ACCESS+,+ QDAUX1+ PTEMP+ QDAUX2+O>+ PTEMP+%>+*QEMPTY;;=0 if Sector contained no Data+ P@TEMP7+H?NOT.EMPTY,#NUM.EMPTY, H?PUT.NUM,#NUM.EMPTY$,?PUT.NUM%>x.,QNUM.EMPTY8, PRINTHEXB,QNUM.EMPTYL, PRINTHEXV,?NOT.EMPTY NEXTSCTR`,QEMPTY;;Was Sector emptyj,F?SKIP;;Yes then Skipt, CALCADR~, E?FULL,?SKIPQTRACK,R>(, D?READ,,,'?FULL:;;CC=All done, cs=Memory full,?WRITE%TRKSCTR,3,3,3,,, QBASE, O@ORDER7- PDAUX1 - PTEMP- QBASE-O>(- PDAUX22-O><- PTEMPF-%>P- Q@TEMP7Z-F?EMPTY;;Empty Sectord- ACCESSn- NEXTSCTRx- CALCADR- E?DONE-?CONTQTRACK-R>(- D?WRITE- ?DONE:-?EMPTY NEXTSCTR- !?CONT-NEXTSCTR#TRKSCTR- QTRKSCTR-%>- R@ORDER7-E?NXTTRACK-:.?NXTTRACK#TRACK. 'TRKSCTR.,". QBASE,. O@ORDER76. PBASE@. QBASEJ.O>T. PBASE^.:h.X;r.%X; *******************************|.%X; * *.%X; * Module : Disk Formatter *.%X; * Date : 22nd December 1985 *.%X; * *.%X; * Setup *.%X; * ----- *.%X; * *.%X; * DENSITY = 0 Single *.%X; * 1 Duel *.%X; * 2 Double *.%X; * *.%X; * DESTINATION = 0,1 Drive 1 *.%X; * = 2,3 Drive 2 *.%X; * */%X; *******************************/X;/&/FORMAT%DENSITY0/#Q?SCTRS8;;Set number of sectors:/P?SECTORS;;per track.D/ Q?DDNSTY8N/P?DNSTY;;Set densityX/Cb/T?l/?v/Q?DBYTES8;;Set number/P?NBYTES;;of bytes/Q?DBYTES8;;per sector./P?NBYTES/X;/X; =================/X; Set Sector Layout/X; =================/X;/ QDENSITY/T?/ PTEMP/QDESTINATION/M>0 LTEMP 0T?0? 0 Q?LYOUT8*0 PPOINT40Q?LYOUT8>0 PPOINTH0%>R0?LOOP1Q@POINT7\0 G?DONEf0 P?LAYOUT8p03z0 H?LOOP10 ?DONE0X;0X; ===================0X; Send Format Command0X; ===================0X;0Q>10 PDDEVIC0QDESTINATION0V?0,0O>0 PDUNIT1Q>f1 PDCOMND1Q>$1 PDSTATS.1Q>4?FORMAT81 PDBUFALB1Q>5?FORMATL1 PDBUFAHV1Q>`1 PDTIMLOj1Q>t1 PDTIMHI~1 PDBYTHI1 PDAUX21Q>1 PDBYTLO1Q>N1 PDAUX11 SIOV1I?OK1 ERROR1 !?DONE1?OK:1X;1 X; ==========================2 X; Data to setup Config Block 2 X; ==========================2X;2?SCTRS ==(2?DDNSTY ==22?DBYTES ==<2 ?LYOUTF2 ?SNGL=?USSNGLP2 ?DUEL=?USDUELZ2 ?DBL=?USDBLd2X;n2X; =================x2X; High speed layout2X; =================2X;2 ?USSNGL2 == =2 == = 2 === 2 ===2  ==2 ?USDUEL2 == =2 ===2  = ==2 === 3 ===3 == =3 =="3 ?USDBL,3 == =63 = ==@3 = ==J3  ===T3  ==^3X;h3X; =====================r3X; Standard Speed Layout|3X; =====================3X;3 ?SNGL3 ===3  = = =3 ===3 = = =3 ==3 ?DUEL3 ===3  = = =3 ===3 ===3 = = =4 ===4 ==4?DBL&4 ===04 == = :4  = = =D4 ===N4 ==X4X;b4X; ===================l4X; Configuration Blockv4X; ===================4X;4 ?FORMAT4?TRACKS (4 =4?SECTORS ;;18 OR 264 4?DNSTY ;;0=Single Else 44?NBYTES ;;$80 OR $1004 ===4?LAYOUT 4 PROGEND4 4 BUFFER