REM >HADFS0 v5.50 REM Source for HADFS ROM REM v5.27 Tidied up service routines REM v5.28 Move ws and num* variables REM v5.29 Added conditional GoMMC driver REM v5.30 Added conditional IDE driver REM v5.31 Moved +d TO 3, +D still 2, workspace rearranged REM 16-bit channels in 24-bit workspace, Context clashes with DFS REM v5.32 Moved to 24-bit channels REM v5.33 Start moving ws to accomodate DFS v0/v1 REM Moved OBJECT to WS+&E0, CONTEXT to WS+&24, ENABLE to WS+&C8 REM v5.40 IDE works with Tube, results translated, VFLG avoids MMC block REM v5.41 Workspace can be at &0E00, &28F inverted into opt6, REM *HADFS doesn't double select on B+ REM v5.42 Tidied up source, reclaimed code in WS preserving REM Serv7 moved to next to Serv8, NullKBD move to with TIME code REM v5.50 7-bit years in SmallDIRs : REM Should NullKBD and SoftRTC move to &0D80-&0D91? : ver$="5.41":date$=" (12 Sep 2005)" ver$="5.42":date$=" (12 May 2007)" ver$="5.50":date$=" (15 May 2007)" : IF?&20F<&80 AND ?&20F>&D PRINT"VDU redirected!!":CLOSE#0:END : REM OS Entries oscli=&FFF7:OSBYTE=&FFF4:OSWORD=&FFF1:OSWRCH=&FFEE OSNEWL=&FFE7:OSASCI=&FFE3:OSRDCH=&FFE0 OSFILE=&FFDD:OSFIND=&FFCE:OSARGS=&FFDA GSINIT=&FFC2:GSREAD=&FFC5 : REM OS Vectors FILEV=&212:FSCV=&21E : REM Initialise absent config variables: _NoInstal%=_NoInstal%:_NoInsHlp%=_NoInsHlp%:_NoFormat%=_NoFormat% _NoGBAddr%=_NoGBAddr%:_OmitCopy%=_OmitCopy%:_BasChain%=_BasChain% _FreeKilo%=_FreeKilo%:_NoCommas%=_NoCommas%:_NoYearFix%=_NoYearFix% _NoMMCDrv%=_NoMMCDrv%:_NoIDEDrv%=_NoIDEDrv%:_IDE24%=_IDE24% _SmallFSM%=_SmallFSM%:_SmallDIR%=_SmallDIR%:_NoStatus%=_NoStatus% : REM w/s variables, rearranged for 24-bit disks: WS=&1000:d=3:REM d=offset to drive byte : REM w/s variables, moved to avoid clashing with OSWORD &7F WS=&0E00 : DSKNAME=WS+0:DIRNAME=WS+&10:LIBNAME=WS+&1A CSD=WS+&24:LIB=CSD+4:URD=LIB+4 OPTFLG=WS+&37:DRVINT=WS+&34:DRVEXT=DRVINT+1 OswB0=WS+&60:Dosw90=OswB0+4:Daddr=OswB0+6:REM DoswB0=OswB0+2 Ddrv=Daddr-1:Dcmd=Daddr+5:Dtrk=Daddr+6 Dsec=Daddr+7:Dnum=Daddr+8:Dres=Daddr+9 VFLG=WS+&31:DRVTMP=VFLG+1:Ctrl=WS+&72 USERNUM=WS+&C0:OPTNUM=USERNUM+1:PRIV=OPTNUM:IAMFLG=OPTNUM+1 ENABLE=IAMFLG+1:CURR=USERNUM+4:OBJECT=WS+&E0 CHNINFO=WS+&4B:CHN26=WS+&CB:CHN25=WS+&EB myfs=2:auxfs=myfs+1:REM (ws) offsets, same as *opt number : FSM=&0F00:DIR=&1100 : REM Zero page variables: zp0=&C0 blk=zp0+4:start=zp0+6:len=zp0+9:buf=zp0+12:cptr=zp0+14 : zp1=&B0 addr=zp1+0:sect=zp1+4:drive=sect+3:num=zp1+8:action=zp1+9 shadow=zp1+10:catex=zp1+11:argnum=zp1+12:files=zp1+13:fptr=zp1+14 numflg=zp1+11:numsub=zp1+12:numstore=zp1+16:ptrstore=numstore ret=numstore+0:index=numstore+1:fcnt=numstore+2:attrc=fcnt:attrs=numstore+3 pathflg=argnum:argchn=argnum:pathabs=len+0 ws=addr:tptr=ws:tmp=ws+2:argtmp=buf : REM Other variables: progID=6:HADFSnum=16:able%=&6FF9:REM abilities IF _NoInstal%:able%=able%ANDNOT&0020 IF _OmitCopy%:able%=able%ANDNOT&0001 IF _NoIDEDrv%:able%=able%ANDNOT&4000 IF _SmallFSM%:able%=able%ANDNOT&2000 IF _SmallDIR%:able%=able%ANDNOT&2000 IF WS=&E00 :able%=able%ANDNOT&0200 : mcode%=TOP+&52FE:HIMEM=mcode% Block%=&8000:VDU15 MSKOUT=&7F:MSKIN=&80:MSKCLR=&CF : IF O%>&7BFF:VDU22,7,28,0,24,39,16:PRINT"Writing over screen." PRINT"mcode%=&";~HIMEM;" ";:IF HIMEM>&3C00:PRINT"Room for ";(&7F00-HIMEM);" bytes" ELSE PRINT PRINT "Assembling S.HADFS0" O%=mcode%:P%=Block% [OPT0 \ ---------- \ ROM HEADER \ ---------- JMP Serv3Setup:JMP Service EQUB &82:EQUB Copyright-&8000 EQUB VAL LEFT$(ver$,3) EQUS "HADFS":BRK:EQUS ver$+date$ BRK:EQUW DummyHeader-2 :\ Point to dummy module headers .Copyright BRK:EQUS "(C)J.G.Harston":BRK :\ Date is in date string : \ ---------------- \ SERVICE ROUTINES \ ---------------- .Service CMP #&01:BNE P%+5:JSR KeyboardChk :\ Check if keyboard absent CMP #&07:BEQ ServOk :\ Bypass disable check for OSBYTE PHA:LDA &DF0,X:BMI ServOff:PLA :\ Exit if disabled .ServOk CMP #&0F:BCS P%+5:JSR TimeSave :\ Preserve TIME over Ctrl-Break CMP #&12:BNE P%+5:JMP Serv12 :\ Select filing system CMP #&0B:BCC ServCall CMP #&25:BCC ServExit :\ Master-specific also uses &21-&24 CMP #&2A:BCS ServExit:SBC #&19 :\ Reduce offset for Master calls .ServCall TAX:LDA ws:PHA:LDA ws+1:PHA:LDA tmp:PHA :\ Preserve &B0/1/2 TXA:JSR ServJump :\ Call with A=service number TAX:PLA:STA tmp:PLA:STA ws+1:PLA:STA ws :\ Restore &B0/1/2 TXA:LDX &F4:PHA .ServOff PLA .ServExit:.Serv0 RTS : .ServJump:\.TableJump PHA:ASL A:TAX :\ X=offset to entry LDA ServTable+0,X:STA ws+0 :\ Get routine address LDA ServTable+1,X:STA ws+1 LDX &F4:PLA :\ Restore ROM and call number .JumpWS JMP (ws) :\ Jump to routine : .ServTable EQUW Serv0:EQUW Serv1:EQUW Serv2:EQUW Serv3 EQUW Serv4:EQUW Serv0:EQUW Serv0:EQUW Serv7 EQUW Serv8:EQUW Serv9:EQUW ServA \EQUW Serv21:\EQUW Serv22:\EQUW Serv23:\EQUW Serv24 EQUW Serv25:EQUW Serv26:EQUW Serv27:EQUW Serv28 EQUW Serv29 : \ ------------------------ \ SERVICE 0 - NULL SERVICE \ ------------------------ \.Serv20 \CLC:\ADC #18 :\ ADC#14 if Serv21-24 in table \.Serv0 \RTS : \ ----------------------------------------- \ SERVICE 1 - STATE ABSOLUTE WORKSPACE SIZE \ ----------------------------------------- .Serv1 TYA:PHA:JSR WhatOS:JSR GetDF0 :\ Get OS type and current WS byte BNE Serv1a:LDA #&30:STA &DF0,X :\ If zero, power up, set channels to 5 .Serv1a ::ORA #&10:: BCC Serv1b:AND #&CF:STA &DF0,X :\ If not Master, don't read CMOS byte JSR ReadCMOS::ORA #&10:: \JSR ReadCMOS:PHA:AND #&30 :\ Get HADFS CMOS byte LDY #&CF:JSR MaskIntoDFx :\ Copy to WS byte PLA:\PHA:JSR MaskIntoKBD:\PLA :\ Copy bit 6 from CMOS to KBD .Serv1b :\ State workspace size, A=num chns * 16 LSR A:LSR A:LSR A:LSR A :\ Move number of chans to b0-b1 AND #3:ORA #&14:STA ws+1 :\ WS address is offset from &1400 PLA:TAY:CPY ws+1:BCC serv1ok :\ If current WS&1700, use all five channels AND #3:ASL A:ASL A:ASL A:ASL A :\ Move number of chans to b4-b5 PHA:LDA #&CF:JSR OutDF0 :\ Drop b4-b5 from WS byte PLA:JSR MskDF0 :\ Put number of channels in WS byte .serv1ok LDY ws+1 :\ Get current WS address .Serv1Exit LDX &F4:LDA #1:RTS :\ Restore X and A and exit : \ ------------------------------------ \ SERVICE 2 - CLAIM RELATIVE WORKSPACE \ ------------------------------------ .Serv2 LDA &28D:BEQ Serv2a :\ Restore TIME if not Soft-Break PHP:SEI:LDX #3 :\ Disable IRQs .Serv2Lp1 LDA &3D9,X:STA &293,X:STA &298,X :\ Restore TIME from backup DEX:BNE Serv2Lp1:PLP :\ Restore IRQs .Serv2a LDA #&F0:JSR OutDF0 :\ loose the w/s pointer TYA:SEC:SBC #&14:JSR MskDF0 :\ put new pointer-&14 in TYA:PHA:STA ws+1:LDA #0:STA ws :\ point to w/s LDA &28D:CMP #2:PHP:JSR ServAgo :\ Copy info into private w/s JSR WhatOS:LDY #OPTFLG AND &FF LDA (ws),Y:AND #&7F:BCC Serv2b :\ Clear MOS 3.50 flag LDY &EED5:CPY #ASC"M":BNE Serv2b :\ Check for "MOS 3.50" string LDY &EEDB:CPY #ASC"5":BNE Serv2b ORA #&80 :\ Set MOS 3.50 flag .Serv2b LDY #OPTFLG AND &FF:STA (ws),Y :\ Update OPTFLG PLP:BCC Serv2exit :\ Exit if not Ctrl-Break LDA #0:LDY #&40:.Serv2Lp2 :\ Clear channel info if Ctrl-Break STA (ws),Y:INY:BNE Serv2Lp2 .Serv2exit JSR ClrOwnWS :\ I don't own workspace PLA:TAY:INY:LDX &F4:LDA #2:RTS :\ Claim one page and exit : .GetOwnWS JSR GetDF0:AND #64:RTS : .SetOwnWS LDA #64:BNE MskDF0 : .ClrOwnWS LDA #&BF : .OutDF0 LDX &F4:AND &DF0,X:BPL PutDF0 : .GetDF0 LDA #0 : .MskDF0 LDX &F4:ORA &DF0,X : .PutDF0 STA &DF0,X:RTS : .MaskIntoDFx:\ Mask A into &DFx with Y PHA:TYA:JSR OutDF0:PLA:PHA:JSR MskDF0:PLA:RTS : .MaskIntoKBD PHA:AND #64:EOR &28F:AND #64:EOR &28F:STA &28F:PLA:RTS : \AND #64:\LDY #&BF \STA tmp:\TYA:\AND &28F:\ORA tmp:\STA &28F:\LDA tmp:\RTS : .MaskIntoOPTFLG :\ Mask A into OPTFLG with Y PHA:TYA:JSR MaskOPTFLG:PLA .IntoOPTFLG ORA OPTFLG:STA OPTFLG:RTS .MaskOPTFLG AND OPTFLG:STA OPTFLG:RTS : \ ------------------------------ \ SERVICE 3 - BOOT FILING SYSTEM \ ------------------------------ .Serv3 TYA:PHA:LDA #&7A:JSR OSBYTE TXA:BMI Serv3Init2 LDX #&C0:CMP #&54:BEQ Serv3Key :\ 'H' pressed LDX #&D4:CMP #&40:BNE Serv3Exit :\ 'CapsLock' pressed .Serv3Key LDA #&79:JSR OSBYTE CPX #&40:BEQ Serv3Init TXA:BPL Serv3Exit LDA &28D:BEQ Serv3Exit:\ Not CTRL .RomDisable LDA #128:JSR MskDF0:JSR PrText EQUS "Press CTRL-BREAK":BRK:JMP P% .Serv3Exit PLA:TAY:LDA #3:RTS .Serv3Init LDA #&78:LDX #&D4:LDY#0:JSR OSBYTE PLA:.srv3setup:PHA .Serv3Init2 .Serv3Setup JSR PrTitle2:JSR fx143go JSR CheckClock1:BEQ srv3clkOk JSR PrText:EQUS " No date":BRK .srv3clkOk JSR OSNEWL:JSR OSNEWL PLA:BNE srv3no_boot \JSR mountX \LDA #BootTab AND 255:\STA &F2:LDX #BootTab AND 255 \LDA #BootTab DIV 256:\STA &F3:LDY #BootTab DIV 256 \LDY #0:\JSR I_Am:JSR I_AmXY .srv3no_boot:LDA #0:RTS .BootTab:EQUS "BOOT":EQUB 13 : \ ---------------------- \ SERVICE 4 - * COMMANDS \ ---------------------- .Serv4 LDX #OsTable1-CommTable .Serv4Try TXA:PHA:JSR SearchTable BNE Serv4Go PLA:TAX:LDA (&F2),Y:AND #&DF CMP #ASC"H":BNE Serv4No INY:JSR SearchTable BNE Serv4Go2 DEY .Serv4No LDA #4:RTS .Serv4Go PLA .Serv4Go2 JSR JumpWS:LDA #0:RTS : \ ------------------ \ SERVICE 7 - OSBYTE \ ------------------ .Serv7 PHA:LDA &EF:CMP #90:BNE Serv7Off LDA &F0:BEQ srv7info CMP #progID:BNE Serv7Off LDA &DF0,X:TAY LDA &F1:BMI srv7rd CMP #&40:BCS Serv7Off CMP #4:BCS srv7rd CMP #1:BEQ srv7off PHA:LDA #MSKOUT:JSR OutDF0 PLA:BEQ srv7rd:\ enabled SBC #2:JSR srv3setup:\ A now 0 TAY:BEQ srv7ok .srv7off LDA #MSKIN:JSR MskDF0 .srv7rd TYA:AND #MSKIN:STA &F0 .srv7ok PLA:LDA #0:RTS : .srv7info:\ *FX90 help routine LDA &F1:BEQ srv7hlp CMP #1:BNE Serv7Off:JSR PrText EQUS STR$ progID+": ":BRK JSR PrTitle:JMP Serv7Off .srv7hlp TAX:LDY #1:JSR Osbyte90:JMP srv7ok : .Serv7Off:PLA:RTS : \ ------------------ \ SERVICE 8 - OSWORD \ ------------------ .Serv8 LDA &EF CMP #14:BNE P%+5:JMP Osword14 :\ OSWORD 14 - Read RTC \CMP #15:\BNE P%+5:\JMP Osword15 :\ OSWORD 15 - Write RTC CMP #90:BNE P%+5:JMP Osword90 :\ OSWORD 90 - Read/Write sectors LDA #8:RTS : \ ------------------------------ \ SERVICE 10 - Release workspace \ ------------------------------ .ServA CLC:.ServAgo JSR GetOwnWS:BEQ srvAexit :\ I don't own, so ignore BCS P%+5:JSR args0_FF :\ Update buffers if not Ctrl-Break \.srvAgo2 JSR ClrOwnWS:JSR FindWS:LDY #auxfs+1:\ Clear ownership flag .srvAlp LDA WS,Y:STA (ws),Y:INY:BNE srvAlp:\ Save workspace after fsnums .srvAexit LDA #&A : \.servF \.serv10:\ Ignore, OS closes anyway RTS : \ ---------------------------------- \ SERVICE &12 - SELECT FILING SYSTEM \ ---------------------------------- .Serv12 CPY #HADFSnum:BEQ srv12init TYA:CMP #5:BCC srv12not JSR FindWS:LDY #myfs CMP (ws),Y:BEQ srv12init INY:CMP (ws),Y:BEQ srv12init .srv12not TAY:LDA #&12:RTS .srv12init JMP HadfsOn:\ Returns with A=0 : .Serv25 LDX #0:.srv25lp LDA srv25tb,X:STA (&F2),Y INX:INY:CPX #11:BNE srv25lp LDA #&25:RTS .srv25tb EQUS "HADFS ":EQUB 25:EQUB 29 EQUB HADFSnum : .Serv26:\ *SHUT JSR WhatFS:PHA:JSR Close PLA:CMP #HADFSnum:BEQ Serv26a TAY:JSR fx143fs .Serv26a LDA #&26:RTS : .Serv27:LDA #&27:RTS:\ Hard RST .Serv28:LDA #&28:RTS:\ *CONFIG. : \ ---------------------------- \ SERVICE &29 - DISPLAY STATUS \ ---------------------------- .Serv29 TAX:TYA:PHA :\ Save service number and Y JSR GetChar:BEQ Serv29a :\ - display status CMP #ASC".":BEQ Serv29a :\ '.' - display status AND #&DF:CMP #ASC"H":BNE Serv29exit :\ Not 'H', exit LDX #0 :\ Claim *STATUS call .Serv29a :\ Should really check for 'HADFS' TXA:PHA:JSR PrText:EQUS "Channels ":BRK JSR NumChns:CLC:ADC #2:JSR PrNyb LDY DRVINT:JSR GetOwnWS:BNE Serv29b JSR FindWS:LDY #DRVINT AND &FF LDA (ws),Y:TAY :\ Copy of DRVINT .Serv29b TYA:LDX #0:AND #128:JSR Serv29drv INX:LDA &28F:AND #64:EOR #64:JSR Serv29drv:\ Was INY... JSR PrText:EQUB 13:EQUS "Date ":BRK JSR Time:BNE Serv29c JSR PrText:EQUS "Unset":EQUB 13:BRK .Serv29c .Serv29exit PLA:TAX:PLA:TAY:TXA:LDX &F4:RTS :\ Restore X,Y, claim or pass on : .Serv29drv PHA:JSR PrText:EQUB 13:EQUS "Drive ":BRK TXA:ORA #48:JSR OSASCI JSR Pr2Space PLA:BEQ Serv29drv1 JSR PrText:EQUS "Ex":BRK JMP Serv29drv2 .Serv29drv1 JSR PrText:EQUS "In":BRK .Serv29drv2 JSR PrText:EQUS "ternal":BRK :]:IF _NoStatus%:z%=P%-Serv29:P%=P%-z%:O%=O%-z% RTS : .PrTitle1 JSR OSNEWL .PrTitle JSR PrTitle2:JSR PrText EQUS " "+ver$:EQUB 13:BRK RTS .PrTitle2 JSR PrText:EQUS "Harston ADFS":BRK RTS : \ -------------------------- \ SERVICE &09 - DISPLAY HELP \ -------------------------- .Serv9 TYA:PHA:LDX #HelpTable-CommTable JSR GetChar:BNE serv9b LDY #NullText-TextTable .serv9a JSR DispHelp2 .serv9exit PLA:TAY:LDA #9 RTS : .serv9b JSR SearchTable:BEQ serv9exit JSR DispHelp1 PLA:TAY:LDA (&F2),Y CMP #ASC".":BNE serv9claim TYA:PHA LDX #OsTable2-CommTable LDY #OsText-TextTable BNE serv9a .serv9claim LDA #0:RTS : .DispHelp1 LDX ws:LDY ws+1 .DispHelp2 JSR PrTitle1 : \ X points to comm table \ Y points to text table .HelpLp1 JSR Pr2Space:JSR HelpLp2 INY:INX:INX LDA CommTable,X:BNE HelpLp1 RTS : .HelpLp2 LDA CommTable,X:INX CMP #ASC"`":BCS HelpWord JSR OSWRCH:JMP HelpLp2 .HelpWord AND #&DF:JSR OSWRCH JSR PrSpace .HelpLp3 LDA TextTable,Y:BMI HelpTextEnd JSR OSWRCH:INY:BNE HelpLp3 .HelpTextEnd AND #&7F:JSR OSWRCH:JMP OSNEWL : \ X points to table start \ Y points to text string .SearchTable TYA:PHA .TableLp LDA (&F2),Y CMP #ASC".":BEQ TableDot CMP CommTable,X:BEQ TableChar CMP #ASC"@":BCC TableNxt EOR #32 CMP CommTable,X:BEQ TableChar .TableNxt JSR TableSkip .TableNxt2 INX:INX:PLA:TAY LDA CommTable,X:BNE SearchTable \ end of table \ Y=ok, A=0 RTS : .TableChar INX:INY:LDA CommTable-1,X CMP #ASC"`":BCC TableLp LDA (&F2),Y:AND #&DF CMP #ASC"Z"+1:BCS TableFound CMP #ASC"A":BCS TableNxt2 BCC TableFound .TableDot JSR TableSkip:INY .TableFound LDA CommTable+0,X:STA ws+0 LDA CommTable+1,X:STA ws+1 PLA:JSR SkipSpc:LDA #&FF RTS:\ found : .TableSkip LDA CommTable,X:INX CMP #ASC"`":BCC TableSkip RTS : : \ Tables .CommTable .HelpTable EQUS "HADFs":EQUB FileTable-CommTable:EQUB FileText-TextTable EQUS "UTILs":EQUB OsTable2-CommTable:EQUB OsText-TextTable BRK : .OsTable1 EQUS "STATUs":EQUW Status EQUS "CONFIGURe":EQUW Config EQUS "SHUt":EQUW Shut .OsTable2 EQUS "CLOSe":EQUW Close .z% EQUS "FORm":EQUW Form :]:IF _NoFormat%:z%=P%-z%:P%=P%-z%:O%=O%-z% EQUS "HADFs":EQUW Hadfs:\ Shouldn't this call fx143go ? \EQUS "HADFS-OFf":\EQUW RomDisable EQUS "SETDATe":EQUW SetDate \EQUS "SETTIMe":\EQUW SetTime EQUS "TIMe":EQUW Time BRK : .FileTable EQUS "ACCESs":EQUW Access EQUS "ACCOUNt":EQUW Account \EQUS "BACKUp":\EQUW Backup EQUS "BYe":EQUW Bye EQUS "CDIr":EQUW CDir \EQUS "COMPACt":\EQUW Compact .z% EQUS "COPy":EQUW Copy :]:IF _OmitCopy%:z%=P%-z%:P%=P%-z%:O%=O%-z% EQUS "DELETe":EQUW Delete EQUS "DIr":EQUW Dir EQUS "ENABLe":EQUW Enable EQUS "Ex":EQUW Ex EQUS "FREe":EQUW Free EQUS "INFo":EQUW Info .CommInstall EQUS "INSTALl":EQUW Install :]:IF _NoInstal%:z%=P%-CommInstall:P%=P%-z%:O%=O%-z% EQUS "I Am":EQUW I_Am EQUS "LIb":EQUW Lib EQUS "MAp":EQUW Map EQUS "MOUNt":EQUW Mount EQUS "RENAMe":EQUW Rename .z% EQUS "TITLe":EQUW Install :]:IF _NoInstal%:z%=P%-z%:P%=P%-z%:O%=O%-z% BRK : .TextTable .NullText .HelpText EQUB &80:\ and the next one .OsText:\ Mustn't be =TextTable EQUB &80 .z% EQUB 8:EQUS "nn "+128 :]:IF _NoFormat%:z%=P%-z%:P%=P%-z%:O%=O%-z% EQUB &80 \EQUB &80 EQUS "(dd/mm/yy":EQUB ASC")"+128 EQUB &80 : .FileText EQUS " "+128 EQUS " "+128 \EQUS "* "+128 EQUB &80 EQUS ""+128 \EQUS "*(":\EQUB ASC")"+128 .z% EQUS " "+128 :]:IF _OmitCopy%:z%=P%-z%:P%=P%-z%:O%=O%-z% EQUS ""+128 EQUS "(":EQUB ASC")"+128 EQUB &80 EQUS "(":EQUB ASC")"+128 EQUS "(":EQUB ASC")"+128 EQUS ""+128 .HelpInstall EQUS "( ($)) () (":EQUB ASC")"+128 :]:IF _NoInstal%:z%=P%-HelpInstall:P%=P%-z%:O%=O%-z% EQUS ""+128:\ "(;/)" EQUS ""+128 EQUS "(":EQUB ASC")"+128 EQUS "(":EQUB ASC")"+128 .z% EQUS " "+128 :]:IF _NoInstal%:z%=P%-z%:P%=P%-z%:O%=O%-z% EQUS "() "S.HADFS1"