IMD 1.17: 11/11/2014 12:07:11 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 27 OF 30  SR27q82VKXSVRDOS 0420§n-�:˜8 ;¨7°;¸À4È;Ð4Ø-àBè1ð0ø712 *ˆREVISION�CODE‡012585�47*’CHANGED�PARAMETER�BLOCK�FOR�LOADER�SO�THAT�ATTRIBUTES*’ARE�TAKEN�FROM�THE�TASK�LIB.**ˆREVISION�CODE‡011685�48*’Changed�DCODE68K�to�output�the�displacement�of�a�MOVEP*’instruction�in�decimal.**ˆREVISION�CODE‡010485�48*’CHANGED�ASQ�MESSAGE�EVENT�SIZE�FROM�12�TO�24�SO�AS�NOT2*’TO�OVERWRITE�PART�OF�"PRINTFHS"�PARAMETER�BLOCK.**ˆREVISION�CODE‡111484�46*’UPGRADE�1-LINE�ASSEMBLER/DISASSEMBLER�TO�HANDLE�LOAD"*’MODULES�FOR�THE�68010�PROCESSOR.* ‰OPT‡FRS¯3/82*‰XREF†EDITFILE,SIMBO,RESOLVE,GETNUMDE“3/82(‰XREF†.PVTRAPD,.PVTRAPE,PARSE_ST,MM,MDDI‰XREF†FORMADDR,BESTFIT,PARSMSGS(‰XDEF†CONV,CLASCODEˆREQUIRED�BY�EDITFILE0‰XDEF†.PLJSR,.PALSTS,.PALSTSLƒREQUIRED�BY�PASCAL%‰XDEF†PROMPT,WHAT‰REQUIRED�BY�MM�3/82*‰XDEF†KEYIN,DO7OUTR,ERLL,MSG00,MSGADR“3/82#‰XDEF†ADRELOŽREQUIRED�BY�MBSRŽ11/83 *Â<<111484*’DATA�LOCATIONS†REQUIRED�BY*‰XDEF†ADR_VAL�-†-…-ƒMBSR‰XDEF†BASE�-†-…-ƒMBSR‰XDEF†BRKBUFŽ-†-…MM‰XDEF†BRKGETŽ-†-…MM‰XDEF†BRKPBGŽ-†-…MM‰XDEF†BRKPBPŽ-†-…MM‰XDEF†BRKPBUF�-†-…MM‰XDEF†BRKSORŽ-†-…MM‰XDEF†CURTCNT�SIMBO‰XDEF†DMOUTAŽ-†-…MM‰XDEF†EOL_FLG�-†-…-ƒMBSR‰XDEF†ERR_NMBRŒ-†-…MM‚MBSR‰XDEF†FHSDB0ŽSIMBO‰XDEF†FHSDB1ŽSIMBO‰XDEF†FHSOPEN�SIMBO‚IODB‰XDEF†FORTASK�SIMBO‚IODB'‰XDEF†GLOBALŽSIMBO‚IODB‚MM‚MBSR‚UTILITY‰XDEF†INP_STR�-†-…-ƒMBSR‰XDEF†INQ‘-†-…MM‚MBSR‰XDEF†INQE�-†-…MM‰XDEF†IOIN�-†-…MM‰XDEF†IOSDB�-†IODB‰XDEF†IOUT�SIMBO‚-…-ƒ-…UTILITY‰XDEF†MODNAME�SIMBO‰XDEF†OMNEXTŽSIMBO‰XDEF†OMNTBLŽSIMBO‰XDEF†OTEND�-†-…MM‰XDEF†OUTBUFŽ-†-…MM‰XDEF†OUTSTAR�-†-…MM‰XDEF†PCODE�-†-…MM‰XDEF†POOL�-†IODB‰XDEF†POOLEND�-†IODB‰XDEF†POOLPTR�-†IODB‰XDEF†PRSE_MD�SIMBO‚-…-ƒMBSR‰XDEF†PTR_INP�-†-…-ƒMBSR‰XDEF†RCVADDR�SIMBO‰XDEF†RCVBLKŽSIMBO‰XDEF†RCVBUFŽSIMBO‰XDEF†RCVSEGŽSIMBO‰XDEF†REVISIONŒSIMBO‰XDEF†SEGADDR�-†IODB‰XDEF†SEGENDŽSIMBO‰XDEF†SYM_BUF�-†-…MM ‰XDEF†SYMNAME�SIMBO‚IODB‚MM‚MBSR‰XDEF†TOKEN�-†-…MM‰XDEF†UTLWORD�-†-…MM**ˆIOS�&�TR1�EQUATES* CDFLUNƒEQU‡$5 DELAY„EQU‡$15 DEMON„EQU‡$41EXMMSKƒEQU‡$42 EXMON„EQU‡$40FHALLOƒEQU‡$80FHASGNƒEQU‡$40 FHCLOSƒEQU‡$4 FHSCLGƒEQU‡$CFHSCLNƒEQU‡$10FHSEXTƒEQU‡$1CFHSFILƒEQU‡$14FHSLRLƒEQU‡$22 FHSLUAƒEQU‡$5 FHSLUBƒEQU‡$6 FHSLUNƒEQU‡$5 FHSOPTƒEQU‡$2 FHSSESƒEQU‡$CFHSSIZƒEQU‡$24 FHSTSKƒEQU‡$8 FHSUSNƒEQU‡$A FHSVOLƒEQU‡$6FHSWCDƒEQU‡$200 FOPEW„EQU‡$3FOPPRPW‚EQU‡$4 GTASQ„EQU‡$1F GTSEG„EQU‡$1IOPBLKƒEQU‡$40IOPBRKƒEQU‡$10 IOPIMGƒEQU‡$8 IOREADƒEQU‡$1IOSCADƒEQU‡$18IOSEADƒEQU‡$10 IOSFCTƒEQU‡$0IOSLENƒEQU‡$14 IOSOPTƒEQU‡$2 IOSRRNƒEQU‡$8 IOSSADƒEQU‡$C IOWRITƒEQU‡$2ISTABRK‚EQU‡$C6 LDFLUNƒEQU‡$6 MOVELLƒEQU‡$6PSTATEƒEQU‡$44 QEVNT„EQU‡$23RDEVNTƒEQU‡$22REXMONƒEQU‡$45RSTATEƒEQU‡$43RTEVNTƒEQU‡$25SETASQƒEQU‡$21 START„EQU‡$D STOP…EQU‡$19 TERM…EQU‡$F TERMT„EQU‡$10TRPVCTƒEQU‡$1BWAKEUPƒEQU‡$14WTEVNTƒEQU‡$24* *ˆDATA�AREAS* ‰SECTIONƒ0/BˆEQU‡*‰USE�A6�FOR�SOURCE�FIELD�DATA�ADDRESSING:‰DC.B†'011685�4'ƒUTILITY�CONTROL�DATE�&�VERSAdos�RELEASE�#*$*ˆVERSAdos‚CONTROL�BLOCKS�BEGIN�HERE* STOPTASK:!‰DC.L†0,0‡*�TASK�NAME�AND�SESSION STARTTSK: ‰DC.L†0,0-‰DC.W†$A000…*�MONITOR�TASK�AND�REGS�SPECIFIED‰DC.L†0,0‡*�MONITOR�TASK�=�MBUG=TASKREGS�DS.L†16ˆREG�SAVE�AREA�IS�PART�OF�STARTTSK�PARM�BLOCKDREG6„EQU‡TASKREGS+$18**ˆLOADER�PARAMETER�BLOCK*TASKLDR‚DC.L†'TASK'„*�TASK�NAME8SESSION‚DC.L†0‰*�STANDARD�SESSION�ID�(ALL�TASKS�&�EXMON)/‰DC.W†$8000…*�CRTCB�OPTIONS�-�MONITOR�SPECIFIED)‰DC.L†0,0‡*�MONITOR�TASK�NAME�AND�SESSION)‰DC.B†50,100„*�INITIAL�AND�FINAL�PRIORITY‰DC.W†0‰*�TASK�ATTRIBUTES‰DC.L†0‰*�TASK�ENTRY�ADDRESS‰DC.W†0‰*�USER�IDDLOADOPT‚DC.W†$600E…*�USE�LIB�FOR�TASK�INFO�&�ATTRS�(CHGD�BIT�6)�1/85$LOADCLL‚DC.B†0‰*�COMMAND�LINE�LENGTH‰DC.B†0‰*�LUN�OF�LOAD�FILE‰DC.L†0,0‡*�RESERVED%LOADCLA‚DC.L†0‰*�COMMAND�LINE�ADDRESS* J* FHS PARAMETER BLOCK BEGINS - DO NOT SEPARATE THIS FROM ABOVE DEFINITIONS*FHSTASK:‰DC.B†0‰*�CODE‰DC.B†0‰*�COMMAND�=�CHECKPOINT*‰DC.W†0‰*�OPTIONS:�CONTIGUOUS,�PUBLIC�READ‰DC.B†$FF‡*�STATUS ‰DC.B†0‰*�LUNLDVOL$L‚EQU‡*-TASKLDR‰DC.L†0LDUID$W‚EQU‡*-TASKLDR‰DC.W†0‰*�USER�NUMBERLDCAT$L‚EQU‡*-TASKLDR‰DC.L†0,0‡*�CATALOGFILENAME�DC.L†0,0‡*�FILENAMEEXTENTƒDC.W†'LO'‰*�EXTENSION‰DC.W†0‰*�RESERVED‰DC.B†0,0‡*�PROTECT�CODES‰DC.W†0‰*�RECORD�LENGTH‰DC.L†0‰*�SIZE�/�POINTER**ˆGETASQ�PARAMETER�BLOCK*"ASQB…EQU‚*‹GET�ASQ�PARAMETER�BLOCK ‰DC.L‚0…TASK‰DC.L‚0ŠSESSION.‰DC.B‚5ŠSTATUS‚ASQ-MESSAGE�ENABLED-ASR�ENABLED"‰DC.B‚24‰MAX�MESSAGE�LENGTH…010485‰DC.L‚120ˆ10�MESSAGES�MAX6ASQASRV‚DC.L‚0ŠASR�SERVICE�ROUTINE�VECTOR‚(EXASR)ˆ1/82‰DC.L‚0*(*ˆATTACH�TARGET�TASK�TO�EXMON�PARM�BLOCK*)EXMONBƒEQUƒ*†ATTACH�EXMON�PARAMETER�BLOCK‰DC.L‚'„'†TARGET�TASK�NAME‰DC.L‚0‹SESSION)EXMONAME�DC.L‚0‡NAME�OF�EXCEPTION�MONITOR‰DC.L‚0ŠSESSION*$*ˆEXMON�MASK�MODIFICATION�PARM�BLOCK*"XMSKB„EQU‚*ŠEXMMSK�PARAMETER�BLOCK‰DC.L‚'TEST'…TARGET�TASK‰DC.L‚0ŠSESSION‰DC.L‚$01FFFFF1ƒMASK**ˆREXMON�PARM�BLOCK*8REXPB„DS.L†3‰TASKNAME,SESSION,A(OPTIONS�IN�STATE�BUFFER)*9*ˆMOVELL�PARM�BLOCKS�TO�SEND�&�RECEIVE�DATA�BETWEEN�TASKS*5BRKPBG‚DC.L‚'TEST',0�MOVELL�GET�CODE�FROM�TARGET�TASKBRKPBUF‚DC.L‚0,0,0BRKGET‚DC.L‚0,2*4BRKPBP‚DC.L‚0,0�MOVELL�PUT�BP�OR�CODE�TO�TARGET�TASKBRKSOR‚DC.L‚0,'TEST',0BRKBUF‚DC.L‚0,2**ˆGTSEG�PARM�BLOCK*PBGETSG‚DC.L†0‰TASK¤3/825SEGB…DC.L†0‰SESSIONƒ(SEG�BASE�ADDR�AFTER�TRAP#1)‚3/82'‰DC.W†$2000,0ƒOPT=LOGICAL‚ATTR=R/W“1/82‰DC.L†'TSKS'„SEGMENT�NAME&SEGADDR‚DC.L†0‰LOGICAL�ADDR�OF�SEGMENT3SEGLTHƒDC.L†$4000…SEGMENT�LENGTH�DEFAULT�=�16KŒ5/83**ˆRCVSA�PARM�BLOCK*+RCVBLKƒDC.L†0,0,0…TASK,SESSION,OPTIONS”3/82%RCVSEGƒDC.L†0,0,0,0ƒSEGMENT�NAMEœ3/82&RCVBUFƒDC.L†0‰RCV�FEEDBACK�BUFFER•3/82‰DC.W†0‰SEGMENT�ATTRIBUTES–3/82;RCVADDR‚DC.L†0,0,0…BEG,END�&�PHYSICAL�ADDRS�OF�SEGMENT…3/82 **ˆASQ�EVENT�BUFFER*!EVNTBLK‚DC.B†0‰ASR�RECEIVING�AREA0EVNTCODE�DC.B†0‰IS�ALWAYS�8�FOR�EXCEPTION�EVENTS"EVNTTASK�DC.L†0,0‡TASKNAME�SESSION3EVNTECOD�DC.B†0‰IDENTIFIES�NORMAL�EVENT�EXCEPTION�#)EVNTETYP�DC.B†0‰3�TYPES�=�ATT,DET,�NORMAL&‰DS.B†12ˆSPACE�NEEDED�FOR�EVENT‚010485*%*ˆFHS�TO�ASSIGN�PRINTER�OR�REMOTE�CRT**ˆLUN�UTILIZATIONF*�0=&SCT‚1=#PR‚2=#FN‚3=PF&HELP�4=REMOTE�CRT�5=KEYBOARD�6=CRT�7=DB�FILE*BPRINTFHS�DC.B…0,$40,1,$B,0,1,'PR‚'‚ALSO�USED�TO�ASSIGN�LUN#4ƒ11/83‰DC.W…0”*�USER�NUMBER‰DC.L…'ˆ'‹*�CATALOG‰DC.L…0,0’*�FILENAME"‰DC.W…0,0’*�EXTENSION�AND�RESERVED'‰DC.B…0,0’*�WRITE�AND�READ�PROTECT�CODE‰DC.W…0”*�RECORD�LENGTH‰DC.L…0”*�SIZE�/�POINTER**ˆCHANGE�LUN�FHS*4LUNFHSƒDC.B†1,$10,$80,0‰CHANGE�LU�ASSIGN‚SEND�&�KEEP%‰DC.B†0,5,5,0�STATUS�LUA�LUB�RESERVED‰DC.L†0,0‘TASKNAME�&�SESSION*.*ˆI/O�PARM�BLOCKS�FOR�DB�FILES�OF�TARGET�TASKS*7IOSDB„DC.W†$0001,$6000,$0007,0�READ,RANDOM,KEY�OF�LUN=7,‰DC.L†0,0,0,0,0‹DYNAMIC�IOSSAD,IOSEAD�FIELDS$FHSDB0ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB1ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB2ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB3ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB4ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB5ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB6ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB7ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB8ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0$FHSDB9ƒDC.W†$0040,$0100,$0007,'„',-1 ‰DC.L†0,0,0,0‰DC.W†'DB',0,256,0,0*3*ˆI/O�PARM�BLOCKS�FOR�FILE�READ�&�FILE�SAVE�(FR&FS)*4FHSFILE‚DC.B†0,$40,0,4,0,3,'„',-1,-1ƒFHS�FOR�FR�&�FS‰DC.L†'„','„','„','„'‰DC.W†'‚',0,0,256,0,23FILELTH‚EQU‡512‘LENGTH�OF�SINGLE�BLOCK�FILE�(FS&FR)IOSFILE‚DC.W†1,$40,3,0‹LUN=3(‰DC.L†0,0,0,0�ONE�BIG�BLOCK�FOR�HELP�MSG* #*ˆIOS�PARM�BLOCK�FOR�KEYBOARD�INPUT* IOIN…EQU‡*“INPUT�PARAMETER�BLOCK=‰DC.W†1,IOPBRK+IOPIMG„NOTE�BREAK�OPTION�AUGMENTED�WITH�IOPPRO‰DC.B†0,CDFLUN,0,0‰DC.L†0"‰DC.L†0�INPUT�BUFFER�START�ADDRESS‰DC.L†0�END�ADDRESS‰DC.L†02‰DC.L†0…CSA�=�ASR�ADDRESS�WHEN�IN�PROCEED�I/O�MODE*"*ˆIOS�PARM�BLOCK�FOR�SCREEN�OUTPUT*!IOUT…EQU‡*‰OUTPUT�PARAMETER�BLOCK‰DC.W†2,IOPBRK‰DC.B†0,LDFLUN,0,0‰DC.L†0"OUTSTAR‚EQU‡*‰NEEDED�FOR�XDEF™1/82+IOUTSAD‚DC.L†0ŠDYNAMIC�IOSSAD�&�IOSEAD‘1/82OTEND„DC.L†0²1/82‰DC.L†0‰DC.L†0>PTYPE„DC.L„$68000ˆHOLDS�CURRENT�PROCESSOR�TYPE�(DEFAULT=68000).PCODE„DC.L„0�HOLDS�CURRENT�PROCESSOR�TYPE�CODE *ž0�=�68000 *ž4�=�68008 *ž8�=�68010.*žC�=�68020�(FUTURE�NOT�IMPLEMENTED�YET!!!!!!)**ˆCRT�KEYBOARD�BUFFER*6INQ†COMLINEƒ80ˆCOMLINE�SERVES�AS�KEYBOARD�INPUT�BUFFER INQE…EQU‚***ˆSCREEN�MESSAGE�BUFFERS*B*ˆMSGADR�is�an�address�table�of�consecutive�messages�indexed�by�D71*�D7�is�initialized�by�branching�to�a�label�MSGxx9*�which�enters�the�message�start�&�end�addrs�into�the�IOB:MSGADRƒDC.L†QUEST1-B,QUEST2-B,QUEST3-B,OUTMESS-B,OUTSTAT-B,‰DC.L†OUTBUF-B,OUTBUFE-B,0,DEMSG-B,STATHDR-B1‰DC.L†CRMSG-B,ERMES1-B,ERMES2-B,ERMES3-B,ERMES4-B2‰DC.L†ERMES5-B,ERMES6-B,ERMES7-B,ERMES8-B,ERMES9-B7‰DC.L†ERMES10-B,ERMES11-B,ERMES12-B,ERMES13-B,ERMES14-B8‰DC.L†ERMES15-B,ERMES16-B,ERMES17-B,HELPMSG-B,HELPCONT-B0‰DC.L†DMOUTA-B,SPACES-B,MAPZAP-B,MAPMSG-B,LOST-B.‰DC.L†INTEGRTY-B,BROKE-B,OPERMSGS-B,SRPREFIX-B(*‹LAST�BUFFER�VECTOR�IS�"OPERMSGS"�MSG37(QUEST1ƒDC.B†'SYMbug'ŒSYNTAX�ERROR�PROMPTQUEST1N‚DC.B†'…WHAT?�',$07 4QUEST2ƒDC.B†'‚Z�OPTION�(K)Œ=�'‚REUSED�FOR�TASK�COUNT QUEST3ƒDC.B†'SYMbug'QUEST3N‚DC.B†'…?�',$00 OUTMESS‚DC.B†'}--->�'OUTTASK‚DC.B†'†'%OUTEVNT‚DC.B†'�'�EVENT�TYPE�GOES�HEREPCPREFIX�DC.L†'�PC='OUTPC„DC.L†0,0,0 4OUTSTAT‚DC.L†0,0,0†BUFFER�TO�DISPLAY�REGISTER�VALUES**ˆBUFFER�TO�DISPLAY�BREAKPOINTS*+OUTBUFƒDC.B†'SYMbug:�Revisionƒ3.05‘'ˆ021885 ‰DC.B†'¨' OUTBUFE‚EQU‡*0DEMSG„DC.B†'NOMAL�NOECHO‚NOBRE�HEX�IN�#CN�FILE='6STATHDR‚DC.B†'TASKSESS‚STATE�EVENT‚@PC‡PC�NOW„SR…MASK'‰DC.B†'„TCB�STATƒOP„CRT‚' CRMSG„DC.B†'CRepeating‚'-CRBUF„DS.B†68’BUFFER�FOR�COMMAND�FOLLOWING�CR**ˆERROR�MESSAGE�BUFFERS*ERMES1ƒDC.B†'NO�MEMORY�FOR�'ERMES1N‚DC.B†'ASQ�'ERMES2ƒDC.B†'BAD�TARGET�TASK�'$ERMES3ƒDC.B†'BAD�PARM�BLOCK�ADDRESS'"ERMES4ƒDC.B†'BUFFER�ADDRESS�WRONG'ERMES5ƒDC.B†'NO�ASQ'ERMES6ƒDC.B†'BRKPT�TABLE�FULL'*ERMES7ƒDC.B†'VALUE�LOCATION�INCORRECT',7,7)ERMES8ƒDC.B†'TARGET�TASK�ADDRESS�ERROR',7$ERMES9ƒDC.B†'MESSAGE�FROM�ASQ�WRONG'!ERMES10‚DC.B†'NO�ROOM�TO�ATTACH�'6NUTASKNM�DC.B†'TASK�-�BUT�TASK�IS�RUNNING�UNATTACHED�'!ERMES11‚DC.B†'ATTACH�NOT�ALLOWED'ERMES12‚DC.B†'LOAD�ERROR''ERMES13‚DC.B†'CANNOT�HANDLE�BREAKS',7,7!ERMES14‚DC.B†'EVENT�NOT�SENT',7,7ERMES15‚DC.B†'***�ERROR�TRAP�'TRAPIDƒDC.B†0,'‚ERROR�CODE:�'ERRCODƒDC.L†0,0,0CRLF…DC.W†$0D0AERMES16‚DC.B†'UNKNOWN�TASKNAME')ERMES17‚DC.B†'BRKPTS�LOCKED�IN�EXECUTION'0HELPMSG‚DC.B†'…AS„[�[�[;]]]�',‰DC.B†'ADDRESS�STOP�(On�change�or�=�Value)…'%‰DC.B†'…BF„��…'+‰DC.B†'BLOCK�FILL�Address�range�with�data†''‰DC.B†'…BM„��ƒ'-‰DC.B†'BLOCK�MOVE�Address�range�to�new�addr„'(‰DC.B†'[NO]�BR„[�[]]�....†'/‰DC.B†'BREAKPOINT�List,Set�or�Delete�Multiple‚'%‰DC.B†'…BS„��…',‰DC.B†'BLOCK�SEARCH�address�range�for�data…'‰DC.B†'…CR„–'0‰DC.B†'COMMAND�REPEAT�next�command�count�times�'‰DC.B†'…DC„—'0‰DC.B†'DEFINE�CONSTANT�in�Hex,Decimal�&�Binary�'‰DC.B†'…DE„[]“'!‰DC.B†'DEFAULT�List,Set�Options�' ‰DC.B†'…DF¡'$‰DC.B†'DISPLAY�FORMATTED�Registers�'‰DC.B†'…FR„“'-‰DC.B†'FILE�READ�Macros�&�Symbols�you�saved„'‰DC.B†'…FS„“'-‰DC.B†'FILE�SAVE�Macros�&�Symbols�for�later„'‰DC.B†'…G[O]‚[]•',‰DC.B†'GO�into�Execution�(Foreground�Task)…'‰DC.B†'[NO]�MA„[�....]�'0‰DC.B†'MACRO�Define,�Display�or�Delete�name(s)�'%‰DC.B†'…MAEƒ�[;]†'*‰DC.B†'MACRO�EDIT�redefines�a�macro�line‡' #‰DC.B†'…MD„�[]�[;DI]‡'0‰DC.B†'MEMORY�DISPLAY�(default�count=16�Bytes)�'‰DC.B†'…M[M]‚�[;]�'.‰DC.B†'MODIFY�MEMORY�interactively�until�(.)ƒ'(‰DC.B†'…MS„��[�....]‚''‰DC.B†'MEMORY�SET�also�sets�registersŠ' ‰DC.B†'…OF¡''‰DC.B†'OFFSET�Register�Ranges�DisplayŠ'‰DC.B†'…Q[UIT]�'+‰DC.B†'QUIT�(Terminate�Debugging�Session)†'‰DC.B†'…T[R]‚[]”'+‰DC.B†'TRACE�instructions�starting�at�.PC†'(‰DC.B†'…WAIT‚for�{BREAK}�key�to�prompt„'#‰DC.B†'Ž:HIT�{RETURN}�to�continue:'+HELPCONT�DC.B†'[NO]�SD„[�[]]‹'/‰DC.B†'SYMBOL�DEFINE,�Display�or�Delete�Local‚'‰DC.B†'…ATTA‚�[,<#crt>]�'/‰DC.B†'ATTACH�Task�to�SYMBUG�(Remote�crt�I/O)‚'‰DC.B†'…DETA‚[]•'0‰DC.B†'DETACH�Task�from�SYMBUG�(Continues�Exec)'$‰DC.B†'…EVEN‚[],ˆ'!‰DC.B†'EVENT�CREATED�for�a�Task�'!‰DC.B†'…LOAD‚�[]‹'!‰DC.B†'LOAD�TASK‚(with�COMLINE)�'$‰DC.B†'…MASK‚[],ˆ'‰DC.B†'MASK�Exception�Toggled’'‰DC.B†'…STAR‚[�|�ALL]�'-‰DC.B†'START�Task(s)�into�Execution�like�GO„' ‰DC.B†'…STAT‚[,]Œ'/‰DC.B†'STATUS�List�or�Set�(DORM,REDY�or�WAKE)‚'‰DC.B†'…STOP‚[�|�ALL]�'-‰DC.B†'STOP�Task(s)�Execution�&�Set�DORMANT„'"‰DC.B†'…TASK‚�[,<#notify>]Š'0‰DC.B†'TASK�becomes�FOREGROUND�with�BP�options�'‰DC.B†'…TERM‚—'‰DC.B†'TERMINATE�Taskš' **ˆMEMORY�DISPLAY�BUFFERS*DMOUTAƒDC.B†'¨' ‰DC.B†'¨'SPACESƒDC.L†'„'4MAPZAPƒDC.B†'Map�Full'ŠERROR�MESSAGES�FOR�SIMBO†3/82MAPMSGƒDC.B†'Dup�Sect'”"“3/82LOST…DC.B†'IODB�Err'”"“3/82INTEGRTY�DC.B†'VerifyDB'”"“3/82BROKE„DC.B†'*IO�Err*'”"“3/82/OPERMSGS�DC.B†'INVALID�OPTION�SPECIFIED'—111484SRPREFIX�DC.B†'�SR='D0D7…DC.B†'D0->D7‚'A0A7…DC.B†'A0->A7‚'R0R7…DC.B†'R0->7Min'ADETYPEƒDC.B†'HEX�DEC�OCT�BIN�CHR�FL.�INT�BOO�PDE�DIS�BW�LPRFN‚CN'PRLUN„EQU‡1‰LUN�OF�#PR1DEVLUNƒEQU‡2‰LUN�FOR�LOGGING�DISK�FILE�(FILENAME)&FILELUN‚EQU‡3‰LUN�FOR�FS�&�FR�COMMANDSCRTLUNƒEQU‡4‰LUN�OF�REMOTE�#CN.LTSKVECT�EQU‡32ˆBYTES�PER�TASK�IN�VECTOR�TABLE*LINCNTƒDC.W†0�NUMBER�OF�LINES�LEFT�ON�PAGE4BPVALUE‚DC.W†$4E70…RESET�INSTRUCTION�IS�A�BREAKPOINT$DECRT„DC.L†0‰EXMON�CRT�TERMINAL�NAME,TERMINAL�DC.L†0‰TERMINAL�OF�LAST�LOADED�TASK,STACKBRK�DC.L†0‰BREAK�RECOVERY�STACK�POINTER**’TABLE�FOR�EDITFILE*/CLASCODE�DC.B†0,0,0,0,0,0,0,0,0,0,0,0,0,$80,0,0%‰DC.B†0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;‰DC.B†$80,0,0,$40,$40,0,$10,0,$20,$20,$50,0,$80,$40,$20,$20?‰DC.B†$17,$17,$17,$17,$17,$17,$17,$17,$17,$17,$20,$80,0,$40,0,0E‡DC.B‚$10,$1E,$1E,$1E,$1E,$1E,$1E,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C;‰DC.B†$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,0,0,0,0,0%‰DC.B†0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0%‰DC.B†0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0* *ˆBREAK�STUFF*BREAK„DC.W†0‰THE�WORDSETBRKƒEQU‡15ˆTAKE�IO�BREAKSGOTBRKƒEQU‡14ˆGOT�IO�BREAKBPMAX„EQU‡10ˆMAX�BP�PER�TASK* *ˆBREAK�EVENT* ATTEVNT‚EQU‡*‰DS.W†1‰LENGTH�+�CODE‰DS.L†1‰DEVICE‰DS.W†1‰DEVICE�STATUS**ˆCOMMAND�PARSING�DATA�FIELDS*VFLD…DC.L†0‰VALUE(CREPEAT‚DC.L†0‰FLAGS�CR�COMMAND�IN�FORCE.CRCOUNT‚DC.L†0‰HOLDS�CR�COUNT�FOR�NEXT�COMMAND**ˆSIMBO�FIELDS*4REVISION�DC.L†1‰DB�FILE�REVISION�CODE�FOR�SIMBO‰6/83(MODNAME‚DC.L†'ˆ'ŠMODULE�NAME�BUFFERŒ3/82(SYMNAME‚DC.L†'ˆ'ŠSYMBOL�NAME�BUFFERŒ3/822OMNEXTƒDC.L†0“HIGH�H2O�MARK�IN�FILLING�OMNTBL�3/82)FHSOPEN‚DC.L†0“A(FHS�CURRENTLY�OPEN)‰3/82 *#*ˆEVENT�NOTIFICATION�MESSAGE�BUFFER*MESTYPƒDC.B‚'TRAP�0Š'‰DC.B‚'TRAP�1Š'‰DC.B‚'TRAP�2Š'‰DC.B‚'TRAP�3Š'‰DC.B‚'TRAP�4Š'‰DC.B‚'TRAP�5Š'‰DC.B‚'TRAP�6Š'‰DC.B‚'TRAP�7Š'‰DC.B‚'TRAP�8Š'‰DC.B‚'TRAP�9Š'‰DC.B‚'TRAP�10‰'‰DC.B‚'TRAP�11‰'‰DC.B‚'TRAP�12‰'‰DC.B‚'TRAP�13‰'‰DC.B‚'TRAP�14‰'‰DC.B‚'TRAP�15‰'‰DC.B‚'BUS�ERROR‡'‰DC.B‚'ADDRESS�ERRORƒ'‰DC.B‚'ILLEGAL�INST„'‰DC.B‚'ZERO�DIVIDE…'‰DC.B‚'CHK‚INST‡'‰DC.B‚'TRAPV‹'‰DC.B‚'PRIV�VIOLATION‚'‰DC.B‚'LINE�1010‡'‰DC.B‚'LINE�1111‡')UTLWORD‚DS.L†4“UNUSED�EXCEPTION�EVENT�#196ADX†DC.B‚'�ADXDORMREDYWAIT'†UNUSED�EXCEPTION�EVENT�#1AADXENDƒDC.B‚'TRACE�MAX�INST‚'‰DC.B‚'TRACE�ONE�INST‚' ‰DC.B‚'VALUE�CHANGE„'‰DC.B‚'VALUE�EQUAL…'3‰DC.B‚'STOPPED‰'…EXCEPTION�$1F�ALTERNATE�ATTACH�MSG‰DC.B‚'ATTACHEDˆ'�20‰DC.B‚'DETACHEDˆ'�21‰DC.B‚'BREAKPOINT†'�22*(*ˆINITIALIZE�PASCAL�GLOBAL�VARIABLE�AREA*BCMD_CODE�DC.B†01,27,14,18,06,21,22,15,17,29,07,16†AS,ATTA�...�ETC.)‰DC.B†30,19,20,13,12,38,02,05,31,10,08,24)‰DC.B†39,23,03,32,34,33,36,28,26,37,00,005COMMAND‚DC.B†'AS‚ATTABF‚BM‚BR‚BS‚CR‚DC‚DE‚DETADF‚DU‚'1‰DC.B†'EVENFR‚FS‚GO‚HELPLOADMA‚MAE�MASKMD‚MM‚MS‚'1‰DC.B†'OF‚QUITSD‚STARSTATSTOPTASKTERMTR‚WAIT#%$&'-DLIM_FLG�DS.B†4‰PACKED�ARRAY[1..4]�OF�BOOLEANNUM_PARM�DS.B†1‰BYTECODE…DS.B†1‰BYTEERROR„DS.B†1‰BYTETMP_CHR‚DS.B†1‰BYTETMP_PTR‚DS.B†1‰BYTEEVL_TYPE�DS.B†1‰BYTEEVL_LNG‚DS.B†1‰BYTEEVL_OUT‚DS.B†1‰BYTENO_FLGƒDS.B†1‰BOOLEANNXT_CHR‚DS.B†1‰CHARFOUND„DS.B†1‰BOOLEANCHECK„DS.B†1‰BOOLEANNEG_FLG‚DS.B†1‰BOOLEANCHK_CHAR�DS.B†1‰CHARSAV_EOL‚DS.B†1‰BOOLEANEOL_FLG‚DS.B†1‰BOOLEANDLIM_CHR�DS.B†1‰CHARPTR_MAC‚DS.B†1‰BYTEPTR_PARM�DS.B†1‰BYTENUM_PTR‚DS.B†1‰BYTEPTR_INP‚DS.B†1‰BYTENXTS_LEN�DS.B†1‰BYTEDEF_BASE�DS.B†1‰BOOLEANMACRO„DS.B†1‰BOOLEANLINE_NUM�DC.L†'010�'„STR4*SYM_BUF‚DS.B†80ˆSTRNXT_STR‚DS.B†80ˆSTRINP_BUF‚DS.B†80ˆSTRIˆDS.L†1‰INTEGERJˆDS.L†1‰INTEGERKˆDS.L†1‰INTEGERLˆDS.L†1‰INTEGERCOUNT„DS.L†1‰INTEGERSYM_VAL‚DS.L†1‰INTEGERREG_VAL‚DS.L†1‰INTEGEREA_VALƒDS.L†1‰INTEGEREXP_VAL‚DS.L†1‰INTEGERADR_VAL‚DS.L†1‰INTEGERNUM_VAL‚DS.L†1‰INTEGERMAC_NAME�DS.B†8‰STR8I*---------------------------- HANDS OFF PASCAL VALUES BELOW THIS LINE !!!/IN_CR„DC.L†0‰INTEGERƒINTERNAL�FLAG�FOR�MACRO�CR3SAVE_CNT�DC.L†0‰INTEGERƒINTERNAL�COUNT�FOR�MACRO�CRTBL_PTR‚DS.L†1‰INTEGER+TABLE„DS.B†504‡PACKED�ARRAY[1..504]�OF�CHARENDSYMB‚DC.L†505‡INTEGERENDMACƒDC.L†0‰INTEGERIN_MACRO�DC.L†0‰INTEGERINDEX„DC.L†0‰INTEGERMAC_BUF‚DS.B†80ˆSTR *°defaults)DEVICEƒDC.B†1‰BYTE†#PR‡LUN�OF�ECHO�DEVICE&LENGTHƒDC.B†4‰BYTE†WORD†DISPLAY�LENGTH"TYPES„DC.B†1‰BYTE†HEX‡DISPLAY�BASEBASE…DC.B†1‰BYTE†HEX‡INPUT�BASE+BR_ENABL�DC.B†1‰BYTE†BRE‡ENABLE�BREAKPOINTS3ECHO…DC.B†0‰BYTE†NOECHO„ECHO�DEBUG�OUTPUT�TO�DEVICE/MA_LIST‚DC.B†1‰BYTE†MAL‡EXPAND�MACROS�IN�OUTPUT‰DC.B†$20‡FILLER0OUTFILE‚DCB.B…30,$20„PACKED�ARRAY[1..30]�OF�CHAR*"INP_STR‚DC.L†0‰POINTERƒA(INQ)˜1/82REGS…DC.L†0‰POINTER1OFREGSƒDC.L†0,0,0,0,0,0,0,0…OF�BASE�REGS‚.R0->.R7*‰DC.L†0,0,0,0,0,0,0,0…OF�UPPER�LIMITS�5/839MAXTCNT‚DS.W†1‰MAXIMUM�#�OF�TASKS�TO�BE�ATTACHED�TO�EXMON*CURTCNT‚DC.W†0‰CURRENT�#�OF�TASKS�ATTACHED12#PT13…DC.L†0,0,0™TRAPS�13,14,15†1/81**ˆIODB�BUFFERS�FOR�.DB�FILES*4POOLPTR‚DC.L†0‰CIRCULAR�BUFFER�POINTER�FOR�IODBˆ3/828POOL…DCB.L…1300,-1ƒPOOL�OF�20�SECTOR�LENGTH�BUFFERSˆ3/82'POOLEND‚EQU‡*-1‡END�OF�BUFFER�POOL–3/82)DATASIZE�EQU‡(POOLEND+256-B)/256*256›3/822**************************************************;*ˆTASK�CONTROL�DATA‚(BUFFER�DYNAMICALLY�OBTAINED�VIA�GETSG)5*’includes‚TASK�VECTOR�TABLE,�BUFFERS,�OMNTBLS�&�MAPS)*’size�of�the�GTSEGed�area�=�#TASKS�*�800*'*ˆTASK�VECTOR�TABLE‚(32�BYTES�PER�TASK)**�OFFSET„CONTENTTVNAMEƒEQU‡0†TASK�NAMETVSESSƒEQU‡4†TASK�SESSIONTVBUF„EQU‡8†A(TASK�BUFFER)TVBRKPT‚EQU‡12†A(OMITTED�BRKPT))TVAGE„EQU‡16†EVENT�AGE�FLAG�(0=DISPLAYED)/TVEXECƒEQU‡17†TASK�IN�EXECUTION�FLAG�(>0�=�YES)"TVEVNTƒEQU‡18†EVENT�EXCEPTION�TYPE TVCODEƒEQU‡19ˆ"‡"…CODE TVPC…EQU‡20†PC�AT�EVENT‰(BINARY)%TVTERMƒEQU‡24†TASK�TERMINAL�VOLUME�ID%TVNOTEƒEQU‡28†TASK�NOTIFICATION�LEVEL0TVDBIDƒEQU‡30†DBID�=�TASK�NUMBER�(ZERO�RELATIVE)*1***************************************************ˆTASK�BUFFERS*=LTASKBUF�EQU‡$100†(256�BYTE�BUFFER�PER�TASK�:�FORMAT�FOLLOWS)BUFD…EQU‡0‰D0-D7BUFA…EQU‡$20‡A0-A6BUFUSPƒEQU‡$3C‡A7BUFPC„EQU‡$40‡PCBUFSR„EQU‡$44‡SRBUFMASK‚EQU‡$46‡EXMON�MASKBUFSTAT‚EQU‡$4A‡TASK�STATUSBUFDO„EQU‡$4E‡DIRECTIVE�OPTIONSBUFLOCƒEQU‡$50‡LOCATIONBUFVALƒEQU‡$54‡VALUEBUFVM„EQU‡$58‡VALUE�MASKBUFCNTƒEQU‡$5C‡MAX�COUNTBUFOMNƒEQU‡$60‡A(TASK'S�OMNTBL)BUFMAPƒEQU‡$64‡A(TASK'S�OMMAP)#BUFMAPE‚EQU‡$68‡A(END�TASK'S�OMMAP)/BUFOMHI‚EQU‡$6C‡HIGHEST�OM�CODE�IN�TASKS�OMNTBL=BUFCURO‚EQU‡$6E‡CURRENT�OBJECT�MODULE�CODE�OF�PC�(WHERE�AM�I)MAXTCNT#tasks|�:A*ˆ|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|�:A*ˆ|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|�:/*�TASKBUF|#Tasks*32�+0000„Task�Buffer‰TASK1�|�:*ˆ|Š+0100ˆ"�TASK2�|<=*ˆ|±BUFOMN....|..*ˆ|±BUFMAP----|---!%*ˆ|Š+0200ˆ"�TASK3->MAXTCNT#tasks|�:�!C*ˆ|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|�:�!C*ˆ|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|�:�!9*�OMNTBL�|#Tasks*288+0000„Object�Module�Names�TASK1�|�:�!&*ˆ|Š+OM1*14‚OM�Section�Map†TASK1�|�:�!)*ˆ|Œ+S1*8‚Object�Module�Names�TASK2�|<=�!&*ˆ|Š+OM2*14‚OM�Section�Map†TASK2�|<==!3*ˆ|Œ+S2*8‚Object�Module�Names�TASK3->MAXTCNT#tasks|*ˆ|Š+OM3*14‚OM�Section�MapŒ"�|?*ˆ|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|?*ˆ|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|*�SEGEND�|#Tasks*800±|‰PAGE&‰SECTIONƒ8‰PASCAL�ROUTINES�FROM�PASLIB$.PLJSRƒEQU‡*‰PASCAL�LONG�JSR�ROUTINE-‰MOVE.L„(A7),A4ƒGET�RETURN�ADDRESS�FROM�STACK"‰ADD.L…#4,(A7)ƒCORRECT�IT�ON�STACK$‰ADD.L…(A4),A4ƒCALCULATE�DESTINATION‰JMP‡(A4)†GOTO�IT%.PALSTS‚EQU‡*‰ALLOCATE�SPACE�ON�STACK$HPTR…EQU‡4‰STACK�TOP�OFFSET�INTO�RMABUF†EQU‡32ˆBUFFER�ZONE�AMOUNT"STKOV„EQU‡$10‡STACK�OVERFLOW�ERROR ‰EXT.L…D4.PALSTSL�EQU‡*“LONG�ENTRY�POINT4‰ADD.L…#1,D4…FORCE�D4�=�LEAST�EVEN�INTEGER�>=�OLD�D4‰ANDI.L„#-2,D4'‰SUB.L…D4,A7�ALLOCATE�D4�BYTES�OF�STACK-‰SUBA.L„#BUF,A7�ALLOCATE�BUF�ZONE�AMOUNT�MORE4‰CMP.L…HPTR(A5),A7‰IS�STACK�POINTER�>=�TOP�OF�STACK?5‰BHI.S…ALOCSTK1ŒYES,�THEN�WE�HAVE�ROOM�TO�ALLOCATE�IT.‰LEA‡BUF(A7,D4.L),A7…NO,�REMOVE�ALLOCATED�AREA0‰MOVEQ…#STKOV,D0‹GENERATE�A�STACK�OVERFLOW�ERROR ‰TRAP†#14‰DC.W†0.ALOCSTK1�LEA‡BUF(A7),A7ŠA7�=�NEW�STACK�POINTER7‰MOVE.L„(A7,D4.L),(A7)†MOVE�RETURN�ADDR�TO�TOP�OF�STACK ‰RTS›RETURN‰PAGE ‰SECTIONƒ9**ˆREGISTER�CONVENTIONS**ˆA0ˆSCRATCH�D0*ˆA1ˆA(TASK�BUFFER)†D1*ˆA2œD2*ˆA3œD3*ˆA4ˆA(CURTASK�VECTOR)ƒD4*ˆA5ˆA(INQ�KEYBD�BUFF)ƒD5*ˆA6ˆA(DATA�AREA)ˆD6&*ˆA7ˆA(STACK)ŒD7ˆINDEX�TO�CRT�MESSAGES* *ˆENTRY�POINT*-SYMBUGƒLEA‡B(PC),A6ŒGLOBAL�DATA�BASE�REGŠ3/82‰LEA‡STACK-B(A6),A7¤3/82-‰MOVEM.LƒD0-D7/A0-A7,TASKREGS-B(A6)ƒSAVE�REGS.‰MOVE.L„A0,EXMONAME-B(A6)ƒSAVE�DEBUGGER'S�NAME)‰MOVE.L„A0,ASQB-B(A6)‡INIT�ASQ�PARA�BLOCK5‰MOVE.L„A0,PBGETSG-B(A6)„TASKNAME�TO�GTSEG�PARM�BLOCK 1‰MOVE.L„A1,DECRT-B(A6)†SAVE�DEBUG�CRT�VOLUME�NAME)‰LEA‡EXASR(PC),A0ˆPUT�A(ASR)�IN�ASQBŒ1/82‰MOVE.L„A0,ASQASRV-B(A6)¢1/821‰LEA‡TASKLDR-B(A6),A0„INITIALIZE�TARGET�TASKˆ3/82"‰MOVE.L„D2,LDVOL$L(A0)†VOLUME�NAME‰MOVE.W„D3,LDUID$W(A0)†USER�ID'‰MOVEM.LƒD4-D5,LDCAT$L(A0)ƒCATALOG�NAME‰MOVE.L„D1,$04(A0)"‰MOVE.L„D1,$0E(A0)ŠMONITOR�SESSION‰MOVE.L„D1,STARTTSK+4-B(A6)‰MOVE.L„D1,STARTTSK+$0E-B(A6)(‰CLR.L…D7’D7�IS�INDEX�TO�MESSAGE�VECTORS‰BSR‡MSG05�VERSION�MESSAGE**ˆCLAIM�BREAKS*‰LEA‡IOIN-B(A6),A0¥3/82>‰MOVE.L„IOSFCT(A0),D5�SAVE�FUNCTION�&OPTIONS�FOR�BREAK�SERVICE*‰MOVE.L„#$01200200,IOSFCT(A0)‰CLAIM�BREAKS‰LEA‡TENSHUN(PC),A1¤1/82*‰MOVE.L„A1,IOSCAD(A0)‘SERVICE�ADDRESS…1/82‰TRAP†#28‰MOVE.L„D5,IOSFCT(A0)�RESTORE�NORMALCY�TO�IOS�PARM�BLOCK‰TST.L…D0ŒDID�IT�WORK?‰BEQ.S…IN.MSIZE†YES‰BSR‡MSG23‰TELL�USER�NO�BREAKS ,IN.MSIZE�MOVEQ…#1,D4�ASSUME�SINGLE�TASK�MODE#‰CMP.L…D4,D6�COMLINE�LENGTH�PASSED?,‰BGT‡IN.SING�YES�-�IMPLIES�SINGLE�TASK�DEBUG‰BSR‡MSG01�ASK�Z�OPTION’5/83"‰BSR‡KEYIN�GET�KEYBOARD�REPLYŒ5/832‰LEA‡INQ-B(A6),A5ˆA(ASCII�STRING)�FOR�GETNUMDƒ5/83$‰BSR‡GETNUMDEŒCONVERT�TO�BINARY�5/83&‰MULS†#1024,D0ŒCONVERT�TO�K�BYTESŒ5/83*‰MOVE.L„D0,SEGLTH-B(A6)…SIZE�OF�GTSEG‘5/832‰LEA‡QUEST2+2-B(A6),A0ƒCHANGE�TO�TASK�MESSAGEˆ5/83‰MOVE.L„#'MAX�',(A0)+‰MOVE.L„#'TASK',(A0)+‰MOVE.L„#'S�(1',(A0)+‰MOVE.L„#'->19',(A0)+‰MOVE.W„#')�',(A0)+*9*ˆPROMPT�USER�FOR�MAXIMUM�TASK�COUNT‚(�MULTITASKING�MODE)*+IN.MULT‚BSR‡MSG01�PROMPT�FOR�MAX�#�OF�TASKS‰BSR‡KEYIN�GET�KEYBOARD�REPLY2‰LEA‡INQ-B(A6),A5ˆA(ASCII�STRING)�FOR�GETNUMDƒ3/82$‰BSR‡GETNUMDEŒCONVERT�TO�BINARY�3/82(‰MOVE.W„D0,D4�BINARY�MAX�TASK�COUNT‰3/82#‰BLE‡IN.MULT�ZERO�TASKS�NOT�ALLOWED'‰CMP.W…#19,D4ŽVALIDATE�TASK�COUNT�LIMIT%‰BGT‡IN.MULT�INVALID�-�REISSUE�PROMPT 6‰LEA‡QUEST2+2-B(A6),A0ƒCHANGE�TO�PROC�MESSAGE†>>111484‰MOVE.L„#'PROC',(A0)+‰MOVE.L„#'�(68',(A0)+‰MOVE.L„#'000/',(A0)+‰MOVE.L„#'6801',(A0)+‰MOVE.L„#'0/68',(A0)+‰MOVE.L„#'020)',(A0)+*5*ˆPROMPT�USER�FOR�PROCESSOR�TYPE‚(�MULTITASKING�MODE)*+IN.PROC‚BSR‡MSG01�PROMPT�FOR�PROCESSOR�TYPE‰BSR‡KEYIN�GET�KEYBOARD�REPLY-‰LEA‡INQ-B(A6),A5ˆA(ASCII�STRING)�FOR�GETNUMD‰BSR‡GETNUMDEŒCONVERT�TO�BINARY*¦BINARY�PROCESSOR�TYPE�IN�D0‰CMP.L…#68000,D0‰IFˆ�THEN.S&‰MOVE.L„#$68000,PTYPE-B(A6)�SAVE�PTYPE1‰MOVE.L„#0,PCODE-B(A6)†FORCE�PCODE�BASED�ON�PTYPE‰BRA.S…IN.SING�DONE.‰ENDI ‰CMP.L…#68010,D0‰IFˆ�THEN.S&‰MOVE.L„#$68010,PTYPE-B(A6)�SAVE�PTYPE/‰MOVE.L„#8,PCODE-B(A6)†FOR�PCODE�BASED�ON�PTYPE‰BRA.S…IN.SING�DONE.‰ENDI ‰CMP.L…#68020,D0‹021885‰IFˆ�THEN.S-‰MOVE.L„#$68020,PTYPE-B(A6)�SAVE�PTYPE‚0218859‰MOVE.L„#$C,PCODE-B(A6)†FORCE�PCODE�BASED�ON�PTYPEƒ021885‰BRA.S…IN.SING�DONE‰ENDI -‰BSR‡MSG37�DISPLAY�'INVALID�OPTION�SPECIFIED'‰BRA‡IN.PROC�TRY�AGAIN“111484>> 7IN.SING‚MOVE.W„D4,MAXTCNT-B(A6)„MAXIMUM�TASK�COUNTŒ1/82*‰ASL.L…#5,D4�TIMES�32�=�LTH�OF�VECTOR�AREA.‰MOVE.L„D4,D1�LTH�OF�GTSEG�DUE�TO�VECTORSƒ5/832‰MOVE.L„D4,TASKBUF-B(A6)„A(FIRST�TASK�BUFFER)Š1/82)‰ASL.L…#3,D4�TASK�BUF�SIZE�=�#TASKS�*�256-‰ADD.L…D4,D1�PLUS�LTH�OF�GTSEG�(BUFFERS)ƒ5/83-‰MOVE.L„D1,OMNTBL-B(A6)…OFFSET�OF�OMNTBLŽ5/83*‰ASL.L…#1,D4�OMN�&�MAP�AREA�=�#TASKS�*�512.‰ADD.L…D4,D1�TOTAL�LTH�OF�GTSEG�(#TASKS�*�800)/‰ADD.L…#DATASIZE,D1ˆLENGTH�OF�NONTASK�AREAˆ5/839‰CMP.L…SEGLTH-B(A6),D1…ENOUGH�Z�FOR�THIS�MANY�TASKS?�5/83‰BLE.S…GETMEMŽYES›5/832‰MOVE.L„D1,SEGLTH-B(A6)…OVERRIDE�HIS�Z�OPTION‰5/83*5*ˆGET�DYNAMIC�SEGMENT�FOR�HIS�SYMBUG�DATA�(SECTION�0)*.GETMEMƒMOVEQ…#GTSEG,D0‹GTSEG�DIRECTIVE�CODE�=1‰LEA‡PBGETSG-B(A6),A0¢3/82 ‰TRAP†#1’ATTACH�MEMORY�FOR�TASKS‰BNE‡FATAL01XŒUNSUCCESSFUL"‰MOVE.L„A0,D0�A(GTSEGED�AREA)�3/82,‰MOVE.L„A0,SEGB-B(A6)‡SAVE�BASE�ADDRESS�3/825‰ADD.L…#DATASIZE,D0ˆOFFSET�OF�TASK�AREA�IN�GTSEG‚3/82/‰MOVE.L„D0,SEGADDR-B(A6)„SAVE�A(TASK�AREA)�1/82;‰MOVE.L„D0,FORTASK-B(A6)„ANTICIPATE�ATTACH�OF�1ST�TASK�1/82/‰ADD.L…D0,TASKBUF-B(A6)„A(1ST�TASK�BUFFER)Œ1/827‰ADD.L…D0,OMNTBL-B(A6)…OFFSET�CONVERTED�TO�ADDRESSƒ1/82 =‰MOVE.L„OMNTBL-B(A6),OMNEXT-B(A6)…HI�H2O�OMNTBL�ADDR�IN�SIMBO4‰ADD.L…SEGLTH-B(A6),D0…A(END�OF�OMN�&�MAP�AREA)†1/82:‰MOVE.L„D0,SEGEND-B(A6)…END�ADDR�OF�ENTIRE�GTSEG�AREA�1/82 7‰MOVE.L„#DATASIZE,D0ˆCOPY�13K�OF�DATA�IN�SECTION�0�3/82(‰ASR.L…#2,D0�COPY�4�BYTES�AT�A�TIMEˆ3/82(‰MOVE.L„A0,A5�SAVE�HIS�A6�BASE�ADDR‰3/82=IN.COPY‚MOVE.L„(A6)+,(A0)+‰COPY�INITIAL�DATA�AREA�TO�HIS�3/82.‰DBRA†D0,IN.COPYŠINITIALIZE�HIS�DATA�AREA†3/82*1*ˆHERE�IS�WHERE�WE�START�TALKING�TO�HIS�DATA�AREA*-‰MOVE.L„A5,A6�FROM�NOW�ON�A6�IS�HIS�DATA„3/82‰LEA‡STCK_TOP-B(A6),A7¡3/82:‰MOVE.L„A7,RMA_ST-B(A6)…DEFINE�HEAP�BOTTOM�FOR�PASCAL�3/82,‰LEA‡STACK-B(A6),A7†AND�A7�IS�HIS�STACK‹3/82 *‰MOVE.L„SEGADDR-B(A6),A0„A(TASK�AREA)’3/82-‰MOVE.W„MAXTCNT-B(A6),D0†NUMBER�OF�TASKS�3/82%‰SUBQ†#1,D0�INDEX�FOR�DBRA�IS�TASKS-1*‰MOVE.L„TASKBUF-B(A6),A1†FIRST�TASK�BUFFER)IN.TASK‚CLR.L…(A0)+�CLEAR�TASK�FIELDŽ1/82%‰CLR.L…(A0)+�CLEAR�SESSION�FIELD‹1/821‰CLR.L…8(A0)�CLEAR�EVENT�FIELDS�ESPECIALLY�TVEXEC2‰MOVE.L„A1,(A0)�LINK�TASK�BUFFERS�TO�THEIR�VECTORS+‰ADD.W…#LTSKVECT-8,A0†NEXT�TASK�VECTORŽ1/82/‰ADD.W…#LTASKBUF,A1ˆADVANCE�TO�NEXT�BUFFERˆ1/82+‰DBRA†D0,IN.TASKŠLOOP�TO�CLEAR�TASK�VECTORS* *ˆGET�AN�ASQ*‰MOVEQ…#GTASQ,D0‹GET�AN�ASQ.‰LEA‡ASQB-B(A6),A0‡ASQ�PARAMETER�BLOCK�ADDRESS‰TRAP†#1-‰BEQ.S…IN.PASC�SUCCESS�-�GO�CLAIM�BREAKS…5/83 ‰CMP.W…#8,D0‰BEQ.S…FATAL01�021885 ‰CMP.W…#6,D0&‰BEQ.S…IN.PASC�ALREADY�HAS�ASQ-OKŒ5/83 ‰CMP.W…#3,D0‰BNE.S…FATAL03�BAD�PARM�BLOCK"‰BRA.S…FATAL02�BAD�TARGET�TASKNAME:FATAL01X�MOVE.L„#'TCB�',ERMES1N-B(A6)�ALTER�MEMORY�MESSAGE‰BRA.S…FATAL01'FATAL05‚ADD.L…#4,D7�ADJUST�MSG�TO�MSG15'FATAL04‚ADD.L…#4,D7�ADJUST�MSG�TO�MSG14'FATAL03‚ADD.L…#4,D7�ADJUST�MSG�TO�MSG13'FATAL02‚ADD.L…#4,D7�ADJUST�MSG�TO�MSG12;FATAL01‚BSR‡MSG11…HANDLES�MSG11,12,13,14�WITH�D7�ADJUSTMENT#DONE…MOVEQ…#TERM,D0ŒTERMINATE�EXMON‰TRAP†#1’THAT'S�ALL�FOLKS*�1�MEANS�SINGLE�TASK�MODE0‰BLE‡PROMPT‡NO�COMLINE�IMPLIES�MULTITASKING�MODE1‰BSR‡LOADTASK†PROCESS�COMLINE�LOAD�REFERENCE�TASK%‰MOVE.L„A0,A5�PRETEND�PARMLINE�IS�INQ ‰BSR‡ATCHTASK"‰BRA‡PROMPTŽBEGIN�SINGLE�TASK�MODE‰PAGE**ˆASR‚ROUTINES�IN�NEXT�5�PAGES*!EXASR„MOVEQ…#RDEVNT,D0ŠREAD�EVENT$‰LEA‡EVNTBLK-B(A6),A0„RECEIVING�AREA‰TRAP†#1%‰BNE‡MSG15�EVENT�READ�FAILED‚(NO�ASQ) $*ˆEVENT�CODE…TYPE�EVENTŒEXMON�ACTION,*Š3ŒUSER�TASK�CREATEDƒ-�SHOULD�NOT�SEE�THESE*Š4ŒTIMEOUT�EVENT‡-‚"†"ƒ"„"1*Š5ŒTERMINATION�EVENTƒ-�DETACH�SUBTASK�FROM�EXMON,*Š7ŒSERVER�TASK�EVENTƒ-�SHOULD�NOT�SEE�THESE2*Š8ŒEXCEPTION�EVENT…-�NORMAL�TYPE�:�SUBTASK�HALTED*™#1’SUBTASK�ATTACH�TO�EXMON*™#2’SUBTASK�DETACH�FROM�EXMON%*™#3’SUBTASK�HALTED�(BREAKPOINT,etc.) =‰CMP.B…#5,EVNTCODE-B(A6)ƒSEE�IF�TASK�TERMINATED�BEFORE�DETACH ‰BEQ‡EXITASR3‰CMP.B…#8,EVNTCODE-B(A6)ƒEXCEPTION�TYPE�EVENT?‰1/82+‰BNE‡EX.019ŽNO�-�DISCARD�UNSOLICITED�EVENTS5‰MOVEM.LƒEVNTTASK-B(A6),A2-A3‡SAVE�TASKNAME�&�SESSION7‰MOVE.B„EVNTETYP-B(A6),D0ƒGET�EXCEPTION�EVENT�TYPE�CODE!‰CMP.B…#2,D0�CHECK�EXCEPTION�TYPE*‰BGT‡EXEVNT†CODE�3=�NORMAL�EXCEPTION�EVENT‰BEQ‡EXDET‡CODE�2=�DETACH‰PAGE**ˆATTACH�EVENT*(EXATT„MOVE.L„SEGADDR-B(A6),A4„A(TVTABLE),‰MOVE.B„#$20,D2�PSEUDO�EVENT�CODE�FOR�ATTACH ‰CLR.L…D0’TVID�OF�TASK�SLOT�3/82,EX.002ƒTST.L…(A4)�TEST�A�SLOT�IN�THE�TVTABLE‰BEQ.S…EX.005ŽEMPTY-USE�IT#‰CMPA.L„(A4),A2�TASK�BEING�STOPPED?-‰BEQ.S…EX.004ŽYES�-�ALTER�TO�PSEUDO�EVENT�#1F,‰ADD.W…#LTSKVECT,A4ˆA(NEXT�VECTOR�SLOT)‹1/82‰ADDQ†#1,D0�NEXT�TVID•3/821‰CMP.W…MAXTCNT-B(A6),D0„MORE�SLOTS�TO�CHECK?Š3/82‰BLT‡EX.002ŽYES›3/82.‰MOVE.L„A2,NUTASKNM-B(A6)ƒNO�-‚NAME�TO�MESSAGE‰BSR‡MSG20�TASK�LIMIT�MESSAGE#‰BRA‡EXITASR�GET�OUT�(NO�MORE�ROOM) )EX.004ƒMOVE.B„#$1F,D2�STOPPED�MESSAGE�KEY .EX.005ƒMOVE.B„D2,EVNTECOD-B(A6)ƒTO�EVENT�BLOCK#‰MOVE.L„TVBUF(A4),A1ˆA(TASK�BUFFER),‰MOVEM.LƒA2-A3,(A4)ŠSAVE�TASK�NAME�&�SESSION2‰MOVE.L„TERMINAL-B(A6),TVTERM(A4)ƒSAVE�TERMINAL�ID"‰MOVE.W„#1,TVNOTE(A4)‡NOTE�LEVEL=1&‰MOVE.W„D0,TVDBID(A4)‡SAVE�TASK'S�DBID1‰TST.W…CURTCNT-B(A6)‡FOREGROUND�TASK�EXISTS?‡1/82‰BNE.S…EX.007ŽYES)‰BSR‡FOREGRNDŒNO�-�MAKE�THIS�TASK�FORTASK9EX.007ƒADD.W…#1,CURTCNT-B(A6)„ONE�MORE�TASK�NOW�IN�EFFECT*‰LEA‡XMSKB-B(A6),A0†ADDRESS�OF�PARA.�BLOCK,‰MOVE.L„8(A0),BUFMASK(A1)ƒSAVE�MASK�FOR�TASK)‰BSR.S…SETMASK�SET�INITIAL�EXMONMASK‰3/82‰BNE‡FATAL02�BAD�TARGET�TASK5‰MOVE.L„TVBUF(A4),A0ˆGET�ADDRESS�OF�BUFFER�TO�BE�USED)‰MOVE.W„#LTASKBUF-1,D0†CLEANUP�THE�BUFFER%EX.010ƒCLR.B…(A0)+�ZERO�TASK'S�BUFFER‰DBRA†D0,EX.010‰BRA.S…READSTATŒSERVICE�MESSAGE#EX.019ƒBSR‡MSG19�UNKNOWN�EVENT�TYPE‰BRA‡EXITASR�THROW�IT�AWAY‰PAGE**ˆDETACH�EVENT*/EXDET„BSR.S…FINDTASKŒLOCATE�EVNTTASK�IN�TVTABLE‰BRA.S…EXDET1ŽSUCCESSFUL‰BRA.S…UNKNOWN�NOT�FOUND�ERROR:EXDET1ƒMOVE.W„#7,TVNOTE(A4)‡FORCE�DETACH�MESSAGE�FROM�TELL ‰CLR.L…TVSESS(A4)ŠREMOVE�SESSION0‰SUB.W…#1,CURTCNT-B(A6)„REMOVE�FROM�NO.�OF�TASKS3‰MOVE.B„#$21,EVNTECOD-B(A6)�INDEX�TO�DETACH�MESSAGE2‰CMPA.L„QUEST3N-B(A6),A2„FOREGROUND�TASK�DETACHED?‰BNE.S…GOTSTAT�NO>‰MOVE.L„SPACES-B(A6),QUEST3N-B(A6)‚BLANK�TASKNAME�FROM�PROMPTS)*�10/83‚MOVE.L„SPACES-B(A6),QUEST1N-B(A6)$‰BRA.S…GOTSTAT�SEND�DETACHED�MESSAGE *0*ˆSUBROUTINE�FIND�EVNTTASK�IN�VTASK�VECTOR�TABLE*GFINDTASK�MOVE.L„SEGADDR-B(A6),A4„ASSUMES�A2-A3�HOLD�EVNTTASK�&�EVNTSESS*‰MOVE.W„MAXTCNT-B(A6),D6„NUMBER�OF�ENTRIES‰SUBQ†#1,D6�LOOP�COUNT”3/82FINDVTƒCMP.L…(A4),A2�SAME�TASK?‰BNE.S…NEXTVTŽNO"‰CMP.L…TVSESS(A4),A3‡SAME�SESSION?‰BEQ.S…GOTVECT�YES3NEXTVTƒADD.W…#LTSKVECT,A4ˆNEXT�SLOT�IN�TVTABLEŠ1/82‰DBRA†D6,FINDVT9‰ADD.L…#2,(A7)„NOT�FOUND�EXIT�ALTERS�RETURN�ADDR�ON�STACK3GOTVECT‚RTSŒFOUND�TASK�(A4=VECTOR�ENTRY�IN�TVTABLE) 4SETMASK‚MOVE.L„BUFMASK(A1),8(A0)ƒNEW�MASK�VALUE�3/82+‰MOVEQ.Lƒ#EXMMSK,D0ŠSET�MASK�DIRECTIVEŒ3/82&‰BSR‡COPY4�COPY�TASKNAME�&�TRAP#1ˆ3/82‰RTS‰PAGE**ˆNORMAL�EVENT**EXEVNTƒBSR‡FINDTASKŒLOCATE�TASK�IN�TVTABLE!‰BRA.S…READSTATŒFOUND�TASK�VECTOR%UNKNOWN‚BSR‡MSG26�TASK�NAME�NOT�FOUND ‰BRA‡EXITASR *-*ˆREAD�TASK�STATE�AND�PROCESS�EXCEPTION�EVENT*0READSTAT�MOVEQ…#RSTATE,D0ŠSET�UP�FOR�READ�STATUS)‰MOVE.L„A4,A0�USETASK�VECTOR�AS�PARMBLOCK‰TRAP†#1)‰BEQ.S…GOTSTAT�TASK�STATE�READ�SUCCESSFULER1†CMP.W…#2,D0‰BEQ‡FATAL03�BAD�PARM�BLOCK ‰CMP.W…#3,D0+‰BEQ‡FATAL02�TASK�NONEXISTENT�OR�PRIVILEGED ‰CMP.W…#10,D0'‰BEQ‡FATAL03�TASK�NOT�ATTACHED�TO�EXMON‰BRA‡FATAL04�BAD�BUFFER�ADDR*GOTSTAT‚MOVE.L„TVBUF(A4),A1ˆBUFFER�ADDRESS7‰MOVE.L„BUFPC(A1),D2ˆPC�WILL�STAY�IN�D2�FOR�ASR�ROUTINE.‰MOVE.L„D2,TVPC(A4)‰SAVE�PC�OF�EXCEPTION�EVENT,‰CLR.B…TVEXEC(A4)ŠTASK�FLAGGED�NOT�EXECUTING**†CHECK�TRACE�AND�BREAKPOINT*4‰MOVE.W„EVNTECOD-B(A6),D0ƒGET�EVENT�CODE�&�TYPE‰3/82(‰MOVE.W„D0,TVEVNT(A4)‡SAVE�FOR�TELL‘3/82"‰LSR.W…#8,D0�EVNTECOD�IN�D0.BŽ3/82#‰MOVE.B„D0,TVAGE(A4)ˆFLAG�NEW�EVENT‰BNE.S…NOTRAP0�IS�NONZERO�FLAG0‰SUBQ.B„#1,TVAGE(A4)ˆFORCE�FLAG�TO�$FF�FOR�TRAP0%NOTRAP0‚CMP.B…#28,D0ŽSEE�IF�TRACE�ONE*‰BNE.S…NOTRACE�NO�CHECK�IF�BREAKPOINTˆ5/83)‰CMP.W…#$1800,BUFDO(A1)„STEPPING�PAST�BP?4‰BNE.S…NOTRACE�NO�-�REGULAR�TRACE�CHECK�IT&OT�LIMITS<‰MOVE.L„TVBRKPT(A4),BRKBUF-B(A6)�YES�-�INSTALL�OMITTED�BRKPT4‰MOVE.W„BUFDOSA(A1),BUFDO(A1)�RESTORE�NORMAL�OPTIONS‰LEA‡BPVALUE-B(A6),A0¢3/827‰MOVE.L„A0,BRKSOR-B(A6)…A(BRKPT)�IS�FROM�ADDR�OF�MOVELL*‰BSR‡GETDEST�PUT�BREAKPOINT�BEHIND�US†1/82‰BNE‡ERLL�UNSUCCESSFUL&‰CMP.W…#$1000,BUFDO(A1)„IS�HE�TRACING?"‰BEQ.S…NOTBP�YES�-�DO�TRACE�OUTPUT 4RERUN„CLR.B…TVAGE(A4)‹SUPPRESS�TELL�OF�TRACE�1�EVENT+‰BSR‡RUN‘TASK�CONTINUES�EXEC�WITH�BRKPTS�IN0‰BRA.S…EXITASR�RETURN�FROM�EVENT�WITHOUT�MESSAGE ,NOTRACE‚CMP.B…#22,D0ŽSEE�IF�BREAKPOINT�EVENT‰BNE.S…NOTBP�NO &‰MOVE.W„BUFBPCNT(A1),D5…GET�LOOP�COUNT ,‰BEQ.S…EXITASR�NO�BREAKPOINTS�ENTERED‚021885'‰LEA‡BUFBPTBL(A1),A2…A(FIRST�BREAKADDR)-VALIDBP‚CMP.L…(A2),D2�THIS�BRKPT?‚(CHECKS�PC)‰BEQ.S…BPFND�YES'‰LEA‡LBPENTRY(A2),A2…STEP�TO�NEXT�BRKPTééééééé‰SUB.W…#1,D5�LAST�BP�ENTRY?‰BNE‡VALIDBP�NOT�YET(‰BRA.S…NOTBP�YES�-�HAVE�TRUE�PRIV.�INST.7BPFND„SUBQ.W„#1,8(A2)ŒREDUCE�EFFECTIVE�BREAKPOINT�COUNT‰BLE.S…BPFOUND�COUNT�EXHAUSTED‰LEA‡6(A2),A3ŒA(BRK�SOURCE)2‰MOVE.L„D2,TVBRKPT(A4)†SAVE�A(BRKPT�TO�BE�REMOVED)‰BSR‡BPOUT�REMOVE�IT/‰MOVE.W„BUFDO(A1),BUFDOSA(A1)‚SAVE�TRUE�OPTIONS6‰MOVE.W„#$1800,BUFDO(A1)„FORCE�TRACE�1�MODE�PAST�BRKPT‰BRA‡RERUN�CONTINUE�EXECUTION9BPFOUND‚MOVE.B„#$22,TVAGE(A4)†INDEX�TO�BREAKPOINT�MESSAGE/NOTBP„CMP.W…#$2102,EVNTECOD-B(A6)„SEE�IF�DETACH'‰BEQ.S…EXITASR�BREAKPTS�ALREADY�REMOVED !‰MOVE.W„BUFBPCNT(A1),D5…GET�COUNT‰BEQ.S…EXITASR�NO�BP�TO�REMOVE&‰LEA‡BUFBPTBL(A1),A2…A2�GOES�TO�BRKBUF)REMOVEBP�LEA‡6(A2),A3ŒA3�IS�A(BRK�SOURCE) ‰CMP.W…#$1000,BUFDO(A1)„TRACING?‰BNE.S…PURGEBP�NO,‰CMP.L…(A2),D2�YES�-�THIS�INST�A�BREAKPOINT?,‰BNE.S…PURGEBP�NO�-�WILL�TELL�TRACED�MESSAGE6‰MOVE.B„#$22,TVAGE(A4)†YES�-�CHANGE�MESSAGE�TO�BREAKPT5‰MOVE.B„#22,TVEVNT(A4)†PRETEND�THIS�WAS�A�BRKPT�EVENT+PURGEBP‚BSR‡BPOUT�RESTORE�CODE�WHILE�IN�ASR%‰LEA‡LBPENTRY(A2),A2…POINT�TO�NEXT�BP&‰SUBQ.W„#1,D5�COUNT�BREAKPTS�TO�REMOVE$‰BNE.S…REMOVEBPŒBRANCH�IF�MORE�TO�DO *EXITASR‚MOVEQ…#RTEVNT,D0ŠRETURN�FROM�EVENT‰LEA‡1,A0�ENABLE�ASR�STATUS‰TRAP†#1L*---------------------------------------------------------------------------L*/////////////////// EXECUTION PATH RESUMES FOLLOWING WTEVENT //////////////:*///////////////////ˆEND�OF�ASR�DRIVEN�CODEŒ//////////////L*---------------------------------------------------------------------------*)*ˆATTENTION�EVENT…(BREAK�KEY�STRUCK�!!!!)*'TENSHUN‚MOVEQ…#RDEVNT,D0ŠREAD�THE�EVENT‰LEA‡ATTEVNT-B(A6),A0¢3/82‰TRAP†#1*‰BSET†#GOTBRK,BREAK-B(A6)�GOT�AN�I/O�BREAK‰BRA‡EXITASR�RETURN�FROM�EVENT >FOREGRND�MOVE.L„A4,FORTASK-B(A6)„MAKE�THIS�THE�FOREGROUND�TASK6‰MOVE.L„(A4),QUEST3N-B(A6)‚INITIALIZE�PROMPT�TASKNAMES‰MOVE.L„(A4),QUEST1N-B(A6)0‰MOVE.L„FHSOPEN-B(A6),D0„CURRENT�OPEN�FHSDBŒ3/82‰BEQ.S…FOREXIT�NONE�OPEN•3/829‰MOVE.W„TVDBID(A4),D6‡DERIVE�A(FHSDB)�OF�TASK�FROM�ITS�ID ‰EXT.L…D6°3/82$‰MULS†#38,D6ŽOFFSET�OF�A(FHSDB)Œ3/82&‰LEA‡FHSDB0-B(A6),A0…A(1ST�FHSDB)’3/82%‰ADD.L…A0,D6�A(THIS�TASKS�FHSDB)‹3/82-‰CMP.L…D0,D6�IS�IT�THE�CURRENT�OPEN�ONE?ƒ3/82‰BEQ.S…FOREXIT�YES›3/820‰MOVE.L„D0,A0�NO�-�CLOSE�CURRENT�OPEN�FHSDB�3/82"‰MOVE.W„#4,(A0)�CLOSE�COMMAND‘3/82‰TRAP†#3’DO�CLOSE–3/82&‰MOVE.L„D6,A0�A(THIS�TASKS�FHSDB)‹3/82%‰MOVE.W„#$40,(A0)‹ASSIGN�COMMAND�3/82‰TRAP†#3’OPEN�FHSDB”3/821‰MOVE.L„A0,FHSOPEN-B(A6)„REMEMBER�IT�AS�OPEN‹3/82 FOREXIT‚RTS PAGE**ˆTELL�USER�ABOUT�RECENT�EVENTS*'TELL…MOVE.L„SEGADDR-B(A6),A4„A(TVTABLE)#‰MOVE.W„MAXTCNT-B(A6),D6„LOOP�COUNT.‰CMP.W…#1,MAXTCNT-B(A6)„SINGLE�TASK�MODE?�1/82/‰BNE.S…TELLMOREŒNO�-�NO�IMPLIED�WAIT�FOR�PROMPT$‰TST.B…TVEXEC(A4)ŠTASK�IN�EXECUTION?%‰BEQ.S…TELLMOREŒNO�-�PROCESS�MESSAGES.‰MOVEQ…#WTEVNT,D0ŠWAIT�FOR�EVENT�BEFORE�PROMPT‰TRAP†#1&TELLMORE�TST.L…(A4)�TASK�IN�THIS�SLOT?‰BEQ.S…NEXTELL�NO‰CLR.L…D2’PREPARE�INDEX�REG$‰MOVE.B„TVAGE(A4),D2ˆNEW�EVENT�FLAG?!‰BEQ.S…NEXTELL�NONE�FOR�THIS�TASK*‰BGT.S…TELLMSG�USE�FLAG�AS�INDEX�TO�MESTYP'‰ADDQ.B„#1,D2�TRAP0�MSG�HAS�FLAG�OF�$FF"TELLMSG‚CLR.B…TVAGE(A4)‹CLEAR�FLAG6‰MOVE.L„TVBUF(A4),A1ˆESTABLISH�BUFFER�ADDR�FOR�GETRRID ‰CMP.B…#$22,D2�BREAKPOINT�EVENT?,‰BNE.S…NOTFORE�NO�-�SKIP�NOTE�LEVEL�ANALYSIS&‰MOVE.W„TVNOTE(A4),D1‡CHECK�NOTE�LEVEL%‰BEQ.S…NEXTELL�=0�MEANS�NO�MSG�&�HALT ‰CMP.W…#2,D13‰BEQ.S…ISFOREŽ=2�MEANS�MSG�&�HALT�&�SET�TO�FOREGRND"‰BLT.S…NOTFORE�=1�MEANS�MSG�&�HALT-‰BSR‡INSTALL�=3�OR�4�MEANS�CONTINUE�EXECUTION‰BSR‡RUN$‰MOVE.L„#$22,D2�INSTALL�CLOBBERED�D2,‰CMP.W…#3,D1�EXEC�RESTARTED�CHECK�IF�MESSAGE&‰BEQ.S…NOTFORE�=3�MEANS�MSG�&�CONTINUE/******ƒBRA.S…NEXTELL�=4�MEANS�NO�MSG�&�CONTINUE*=NEXTELL‚ADD.W…#LTSKVECT,A4ˆCHECK�NEXT�TASK�FOR�NEW�EVENT�1/82$‰SUBQ.W„#1,D6�DONE�ALL�TASK�VECTORS?‰BGT‡TELLMOREŒNOT�YET‰RTS  &ISFOREƒBSR‡FOREGRNDŒYES�-�NOTE�LEVEL=25NOTFORE‚MOVE.L„(A4),OUTTASK-B(A6)‚TASKNAME�TO�MESSAGE3‰LEA‡OUTEVNT-B(A6),A0„A(MESSAGE�VARIABLE�PART)†3/825‰LEA‡MESTYP-B(A6),A5…BASE�ADDR�OF�EVENTMSG�TABLEƒ3/82)‰LSL.L…#4,D2�SHIFT�INDEX�TO�MESTYP�OFFSET$‰ADD.W…D2,A5�A(MESSAGE�TO�BE�COPIED)1‰MOVE.L„(A5)+,(A0)+‰COPY�EVENT�MSG�TO�OUTPUT�AREA‰MOVE.L„(A5)+,(A0)+‰MOVE.L„(A5)+,(A0)+.‰MOVE.L„(A5)+,(A0)+‰ALL�MESSAGES�16�BYTES�LONG‰MOVE.L„TVPC(A4),D0‰GET�PC0‰LEA‡OUTPC-B(A6),A3†OUTPUT�LOCATION�ADDRESS‡3/82‰BSR‡MOVED0ŽPC�TO�MESSAGE-‰CLR.L…-(A3)�ERASE�LEFTOVER�RREG�DIGITS„10/83#‰LEA‡OUTPC-B-4(A6),A3„RESET�A3–5/83'‰BSR‡PCRELOŽPC�RELATIVE�TO�AN�RREGˆ5/83‰BSR‡MSG03�PRINT�EVENT�MESSAGE*(‰CMP.W…#7,TVNOTE(A4)‡JUST�DETACHED�TASK? ‰BNE.S…DISPC�NO,�DIS-ASSEMBLE�PC4‰CLR.L…(A4)�YES:EMPTY�TASK�VECTOR�SLOT�NOW!!!!!!!!!!‰BRA‡NEXTELL�CONTINUE*.*ˆDIS-ASSEMBLE�PC�WHERE�EVENT�JUST�OCCURRED�!!*?DISPC„MOVEM.LƒD6/A4,-(A7)‰SAVE�D6/A4�(TASK�COUNT/TASK�PTR)�3/82>‰MOVE.L„FORTASK-B(A6),-(A7)ƒSAVE�THE�REAL�FOREGROUND�TASK�3/827‰BSR‡FOREGRNDŠLET�RESOLVE�THINK�THIS�IS�FOREGROUND�3/82*‰MOVEQ…#1,D2�SET�DIS-ASSEMBLY��TO�1&‰MOVE.L„TVPC(A4),D1‰GET�THIS�TASK'S�PC$‰MOVE.L„A1,-(A7)ŒSAVE�FROM�MDDI�3/82!‰BSR‡MDDI�DIS-ASSEMBLE�PC�ADDRESS1‰MOVE.L„(A7)+,A1ŒRESTORE�OUR�A1�FOR�FOREGRNDƒ3/826‰MOVE.L„(A7)+,A4ŒRESTORE�THE�TRUE�FOREGROUND�TASK�3/82)‰BSR‡FOREGRNDŒMAKE�IT�THE�FOREGROUNDˆ3/82'‰MOVEM.Lƒ(A7)+,D6/A4‰RESTORE�D6/A4‘3/82‰BRA‡NEXTELL�CONTINUE PAGE**ˆGET�NEXT�COMMAND*(WHAT…BSR‡PARSMXX�DISPLAY�ERROR�TEXTŒ2/84.PROMPTƒLEA‡STACK-B(A6),A7†CLEAN�THE�STACK�5/83"‰BSR‡TELL�INTERJECT�EVENT�MESSAGES4MACRONƒLEA‡MSG02(PC),A5ˆPROMPT�FOR�NEXT�COMMAND‡5/836‰BCLR.B„#GOTBRK,BREAK-B(A6)�HAS�HE�HIT�BREAK�KEY?‰5/83‰BEQ.S…SAYWHAT�NOœ5/83+‰CLR.L…CREPEAT-B(A6)‡ZERO�REPEAT�COUNT�5/83'‰CLR.L…CRCOUNT-B(A6)‡AND�REF�COUNT‘5/835‰CLR.L…IN_MACRO-B(A6)†MACRO�ABORTED�BY�BREAK�KEY„5/83(‰BRA.S…PROMPTERŒGIVE�HIM�THE�PROMPT‹5/83>SAYWHAT‚TST.L…IN_MACRO-B(A6)†IS�PARSE�DOING�KEYBOARD�I/O?‚1/82.‰BNE.S…PARSING�YES�-�WE�ARE�PERFORMING�A�MACRO5‰SUBQ.L„#1,CREPEAT-B(A6)„NO,�BUT�CR�MAY�BE�IN�EFFECT?‰BLE.S…PROMPTERŒNO�IT�ISN'T..‰BSR‡MSG10‡DISPLAY�REPEATABLE�COMMAND�IN�CRBUF 6‰LEA‡INQ-B(A6),A0ˆYES�-�COPY�PRIOR�COMMAND�TO�INQ�3/826‰LEA‡CRBUF-B(A6),A5†FROM�CRBUF�WHERE�IT�WAS�SAVED�3/828COPYCNT‚MOVEQ.Lƒ#16,D0ŽCOPY�20�LONG�WORDS�(LOOP�COUNT-1);COPYCRƒMOVE.L„(A5)+,(A0)+‰COPYING�PRIOR�COMMAND�TO/FROM�INQ+‰DBRA†D0,COPYCR‹CONTINUE�FOR�80�BYTE�BUFFER3‰SUB.L…#1,CRCOUNT-B(A6)„REDUCE�CR�REPEAT�COUNTˆ1/82$‰BRA.S…PARSING�SKIP�PROMPT�AND�KEYIN 1PROMPTER�JSR‡(A5)�PROMPT�WITH�MSG00�OR�MSG02„5/83‰BSR‡KEYIN�READ�INPUT�MESSAGE;‰TST.L…CRCOUNT-B(A6)‡IS�THIS�THE�COMMAND�SAVED�FOR�CR?�1/82‰BEQ.S…PARSING�NO�WAY!0‰LEA‡CRBUF-B(A6),A0†OF�COURSE�IT�IS........‡3/82:‰MOVE.L„CRCOUNT-B(A6),CREPEAT-B(A6)�THIS�COUNT�COUNTS…3/820‰BRA‡COPYCNT�GO�SAVE�THIS�COMMAND�FOR�FUTURE�REF**ˆCALL�THE�PASCAL�PARSER*+PARSING‚CLR.W…BREAK-B(A6)‰SET�NO�I/O�BREAKS7‰MOVE.L„FORTASK-B(A6),A4„A(FOREGROUND�TASK�VECTOR)…3/82)‰MOVE.L„TVBUF(A4),A1ˆA(TASK�STATE�BUFFER)5‰MOVE.L„A1,REGS-B(A6)‡A(REGS)�OF�FOREGROUND�TASK„1/822‰MOVEM.LƒD7/A1/A4/A6,-(A7)ƒSAVE�REGS�FROM�PARSE_ST2‰TST.W…CURTCNT-B(A6)‡FOREGROUND�TASK�LOADED�?†1/82'‰BEQ.S…NOFGNDŽNO�FOREGROUND�TASK�LOADED6‰MOVE.L„BUFPC(A1),D7ˆGET�CURRENT�PC�OF�FOREGROUND�TASK#‰CLR.L…D0’SET�WHERE_AM_I�CODE�IN�D0%‰BSR‡RESOLVE�SET�MODULE/SECTION�CODES=NOFGNDƒLEA‡GLOBAL-B(A6),A5…PARSER�REQUIRES�REGS�A3,A5,A6ƒ3/82.‰MOVE.L„A5,A6�BOTH�A5,�A6�POINT�TO�GLOBAL�AREA7‰LEA‡.PLJSR(PC),A3‡A3�POINTS�TO�'LONG'�JSR�ROUTINE�3/82‰BSR‡PARSE_STŒCALL�IT;‰MOVEM.Lƒ(A7)+,D7/A1/A4/A6ƒRESTORE�REGS�CLOBBERED�BY�PASCAL.‰TST.B…ERR_NMBR-B(A6)†NO�-‚CHECK�ERR_NMBRŠ3/82.‰BNE‡WHAT�SYNTAX�ERROR�-�FOR�NOW�JUST�SAY�WHAT&‰CLR.L…D0’PARSED�OK.‚PREPARE�FOR�TOKEN%‰MOVE.B„TOKEN-B(A6),D0†GET�TOKEN•3/82%‰LSL.W…#2,D0�TOKEN�*�4�=�CMDTBL�INDEX/‰LEA‡CMDTBL(PC),A2‡BASE�OF�COMMAND�VECTORS‡1/82‰ADD.L…D0,A2�CMDTBL�VECTOR0‰MOVEM.LƒPARM_BLK-B(A6),D1-D6‚PRELOAD�PARMS�3/82=‰MOVE.B„PM_COUNT-B(A6),D0ƒPARM�COUNT�(NOTE�ALSO�SETS�SR)�3/82/‰JMP‡(A2)�GO�PROCESS�COMMAND�THRU�CMDTBL�VECTOR/CMDTBLƒBRA‡MACRON„START�OR�END�OF�MA�PROCESSING3‰BRA‡ASˆADDRESS�STOP�VALUE�CHANGE�(OR�EQUAL�W/MASK)1‰BRA‡MACRODEF‚MA�[�MACRO�DEFINE�(done�in�parse)�]‰BRA‡SDˆSYMBOL�DEFINE5‰BRA‡MACRODEF‚INSIDE�TRACE�(NO�LONGER�SUPPORTED�5/83):‰BRA‡MACRODEF‚MACRO�EDIT�EXISTING�LINE�DONE�IN�PARSER�5/83#‰BRA‡BRK‡BREAK�POINT�SET�OR�DISPLAY'‰BRA‡DISPLY„DISPLAY�FORMATTED�REGISTERS‰BRA‡MMOD†MODIFY�MEMORY ‰BRA‡WHAT†MM�REG�NOT�IMPLEMENTED‰BRA‡DMEM†MEMORY�DISPLAY ‰BRA‡DMEM.REG‰BRA‡HELP†HELP‹TOKEN=12 ‰BRA.S…GOˆGO!‰NOP¡PADS�SHORT�BRANCH�TO�4�BYTES‰BRA‡BFˆBLOCK�FILL‰BRA‡DCˆDEFINE�CONSTANT ‰BRA‡DUˆDUMP‰BRA‡DEFAULTƒDEFAULT�OPTIONS‰BRA‡BMˆBLOCK�MOVE‰BRA‡FRˆFILE�READ‰BRA‡FSˆFILE�SAVE‰BRA‡BSˆBLOCK�SEARCH‰BRA‡CRˆCOMMAND�REPEAT4‰BRA‡QUIT…TERMINATE�DEBUG�SESSION�&�ASSOCIATED�TASKS‰BRA‡SMEM†MEMORY�SET‰BRA‡SMEM.REG‚REGISTER�SET‰BRA‡TRACE…TRACE‰BRA‡ATTACH„ATTACH�&�START�TASK‰BRA‡TERMIN„TERMINATE�A�TASK"‰BRA‡DETACH„DETACH�TASK�FROM�EXMON#‰BRA‡EVENT…CREATE�EVENT�REMOTE�TASK&‰BRA‡MASK†ALTER�EXMON�MASK�REMOTE�TASK‰BRA‡STARTASK‚START�TASK‰BRA‡HALTTASK‚STOP�TASK ‰BRA‡DISPLATƒDISPLAY�TASK�STATUS‰BRA‡STAT†SET�TASK�STATUS‰BRA‡TASK†SET�REFERENCE�TASK$‰BRA‡WAITER„NO�PROMPT�WAIT�FOR�EVENT"‰BRA‡LOAD†LOAD�TASK�(W/WO�COMLINE)#‰BRA‡OFFSET„DISPLAY�OFREGS�.R0->.R7‰PAGE**ˆGO*GO‡BEQ.S…GOPC�NO�START�ADDR,‰MOVE.L„D1,BUFPC(A1)ˆINIT�PC�WITH�START�ADDR#GOPC…CLR.W…BUFDO(A1)‹SET�OP�=�$0000 &GOEX…BSR.S…INSTALL�INSTALL�BREAKPOINTS1‰BSR.S…RUN‘DO�PSTATE�&�REXMON�DIRECTIVES�FOR�TASK ‰BRA‡PROMPT +RUN†TST.B…TVEXEC(A4)ŠTASK�IN�EXECUTION�NOW?6‰BNE.S…RAN�YES�-�CANNOT�START�SECOND�PATH�OF�EXECUTION"‰MOVEQ.Lƒ#PSTATE,D0ŠPUT�TASK�STATE+‰MOVE.L„A4,A0‡USE�TASK�VECTOR�AS�PARM�BLOCK‰TRAP†#1ŠUPDATE�MASK,PC,ETC.‰BNE‡ER1*‰LEA‡REXPB-B(A6),A0†REXMON�PARM�BLOCK�3/82‰MOVE.L„8(A4),D01‰ADD.L…#BUFDO,D0‹COMPUTE�ADDRESS�OF�EXMON�OPTIONS‰MOVE.L„D0,8(A0),‰MOVE.B„#1,TVEXEC(A4)‡FLAG�TASK�IN�EXECUTION0‰MOVEQ.Lƒ#REXMON,D0ŠRUN�TASK�UNDER�EXMON�CONTROL&‰BSR‡COPY4�COPY�TASKNAME�&�TRAP#1ˆ3/82‰BEQ.S…RUNNING�SUCCESSFUL0‰CMP.W…#15,D0ŽCHECK�FOR�BAD�VALUE�LOCATION�ERROR ‰BNE‡ER1‘NO�-�SOME�OTHER�ERROR%‰BSR‡MSG17�BAD�VALUE�LOCATION�MESSAGERUNNING‚MOVEQ.Lƒ#DELAY,D0"‰MOVE.L„#100,A0�DELAY�FOR�1/10�SEC6‰TRAP†#1ˆIN�HOPE�THE�EVENT�WILL�OCCUR�BEFORE�WE�PROMPTRAN†RTS‰SPC‡3(INSTALL‚MOVE.W„BUFBPCNT(A1),D5…GET�COUNT‰BEQ.S…INSTALLDŒBRANCH�IF�NONE3‰TST.B…BR_ENABL-B(A6)†DEFAULT�NOBRE�IN�EFFECT?†1/82‰BEQ.S…INSTALLDŒYES(‰TST.B…TVEXEC(A4)ŠTASK�NOW�IN�EXECUTION?,‰BNE.S…INSTALLDŒYES�-�BREAKPOINTS�ALREADY�IN‰LEA‡BPVALUE-B(A6),A2¢1/82*‰MOVE.L„A2,BRKSOR-B(A6)…PUT�A(SOURCE)‘1/82"‰MOVE.L„#2,BRKGET+4-B(A6)ƒLENGTH=2‰MOVE.L„#2,BRKBUF+4-B(A6)-‰LEA‡BUFBPTBL(A1),A2…BREAKPOINT�ADDRESS�TABLE)‰MOVE.L„BUFPC(A1),D2ˆPC�SAVED�FOR�COMPARE-INSTALBP�MOVE.L„(A2),BRKPBUF-B(A6)‚GET�SOURCE)‰MOVE.L„(A2),BRKBUF-B(A6)ƒPUT�DESTINATION‰LEA‡6(A2),A0ŒA(SOURCE)'‰MOVE.L„A0,BRKGET-B(A6)…GET�DESTINATION.‰BSR‡GETSOUR�SAVE�SOURCE�CODE�FROM�TARGET‚1/82ERLLH„BNE‡ERLL�BRANCH�IF�BAD9‰MOVE.W„4(A2),8(A2)‰COPY�REFERENCE�COUNT�TO�EFFECTIVE�CNT ‰CMP.L…(A2),D2�BREAKPOINT�AT�PC?‰BNE.S…NOTATBP�NO/‰CMP.B…#22,TVEVNT(A4)†YES,�BUT�HAVE�WE�TOLD�HIM.‰BNE.S…NOTATBP�NOPE�-�SO�INSTALL�IT�AND�HIT�IT0‰MOVE.L„D2,TVBRKPT(A4)†YES�-�SAVE�THE�PC�ADDRESS/‰MOVE.W„BUFDO(A1),BUFDOSA(A1)‰SAVE�USER�OPTIONS9‰MOVE.W„#$1800,BUFDO(A1)„FORCE�TRACE�1�INSTRUCTION�OPTION*‰BRA.S…INSTLNXTŒSKIP�INSTALLING�THIS�BRKPT1NOTATBP‚BSR‡GETDEST�PUT�BREAKPOINT�IN�TARGET†1/82‰BNE‡ERLLH�BRANCH�IF�BAD4INSTLNXT�ADD.W…#LBPENTRY,A2ˆA(NEXT�BRKPT�ENTRY)‹3/82 ‰SUBQ.W„#1,D5%‰BNE.S…INSTALBPŒSTILL�MORE�TO�INSTALL*INSTALLD�RTS›ALL�BREAKPOINTS�ARE�INSTALLEDK*--------------------------------------------------------------------------+*IT‡TST.B…NO_FLG-B(A6)ˆNOIT�SPECIFIED?�1/82&*ˆBNE.S…IT.NO�YES�-�DELETE�THE�IT�FLAG9*ˆMOVEM.LƒD1-D2,BUFITLO(A1)ƒSAVE�LOW�&�HIGH�ADDRESS�RANGE4*ˆBSET†#0,BUFTRFLG(A1)…SET�BIT0�TO�SHOW�IT�IN�EFFECT&*ˆBRA.S…PROM.11�THIS�RETURNS�TO�PROMPT;*IT.NO„BCLR†#0,BUFTRFLG(A1)…CLEAR�BIT0�TO�TURN�OFF�IT�TRACE*ˆBRA.S…PROM.11K*--------------------------------------------------------------------------+*OT‡TST.B…NO_FLG-B(A6)ˆNOOT�SPECIFIED?�1/82&*ˆBNE.S…OT.NO�YES�-�DELETE�THE�OT�FLAG9*ˆMOVEM.LƒD1-D2,BUFOTLO(A1)ƒSAVE�LOW�&�HIGH�ADDRESS�RANGE4*ˆBSET†#1,BUFTRFLG(A1)…SET�BIT1�TO�SHOW�OT�IN�EFFECT*ˆBRA.S…PROM.11;*OT.NO„BCLR†#1,BUFTRFLG(A1)…CLEAR�BIT1�TO�TURN�OFF�OT�TRACEK*-------------------------------------------------------------------------- PROM.11‚EQU‡**BT‡BRA‡PROMPTŽBRANCH�TRACE�NOT�IMPLEMENTEDK*--------------------------------------------------------------------------'TRACE„MOVE.W„#$1000,D6‹SET�TRACE�OPTION‰SUBQ.L„#1,D1�COUNT�<=�ONE?$‰BLE.S…TRACING�TRACE�ONE�INSTRUCTION‰LSR.W…#1,D6�CHANGE�OP�TO�$0800‰ADD.L…#1,D1�RESTORE�TRUE�COUNT!‰MOVE.L„D1,BUFCNT(A1)‡COUNT�IN�MC"TRACING‚MOVE.W„D6,BUFDO(A1)ˆSET�OP‰BRA‡GOEX�BEGIN�EXECUTIONK*--------------------------------------------------------------------------'AS‡BEQ.S…AS.LIST�DISPLAY�EXISTING�VREGS(‰MOVE.W„#$2000,D6‹PRESET�.OP�FOR�NO�MASK*‰MOVE.L„D1,BUFLOC(A1)‡SET�NEW�.VL�LOCATION‰SUB.B…#1,D0�ONE�PARM�ONLY?"‰BEQ.S…ASTOP�YES�-�NO�.VA�PROVIDED2‰MOVE.W„#$3000,D6‹STOP�ON�EQUAL�RATHER�THAN�CHANGE&‰MOVE.L„D2,BUFVAL(A1)‡SET�NEW�VA�VALUE‰SUB.B…#1,D0�TWO�PARMS�ONLY?-‰BNE.S…AS.COMŽNO�:�NEW�.VM�MASK�ALREADY�IN�D3-ASTOP„MOVE.L„#-1,D3ŽDEFAULT�MASK�IS�$FFFFFFFF9AS.COMƒMOVE.L„D3,BUFVM(A1)ˆASTOP�EQUAL�ENTRYƒ.VM=FFXXXXXX‰BRA‡TRACING�START�EXECUTION2AS.LIST‚LEA‡BUFDO(A1),A2ˆPSEUDO�REGISTER�BASE�ADDR‰BSR‡CLEAN�A3=A(OUTBUF)‰MOVE.L„#'�OP=',(A3)+‰BSR‡MOVE2�CONVERT�OP‰ADD.L…#2,A3�2�BYTES�EXTRA�PAD‰MOVE.L„#'�VL=',-4(A3)‰MOVE.L„#'�VA=',8(A3)‰MOVE.L„#'�VM=',20(A3)‰MOVE.L„#'�MC=',32(A3)‰BSR‡MOVEV�CONVERT�VL,VA,VM,MC,‰BSR‡MSG05�DISPLAY�ASSOCIATED�AS�PSEUDO�REGS ‰BRA‡PROMPTM*----------------------------------------------------------------------------%MACRODEF�BRA‡PROMPTŽMA�DONE�BY�PARSERM*----------------------------------------------------------------------------*SD‡BRA‡PROMPTŽSYMBOL�DEFINE�DONE�BY�PARSERM*---------------------------------------------------------------------------- 7HELP…BEQ‡HELP.ALLŒNO�SPECIFIC�HELP�COMMAND�(ZERO�PARMS)‰SUBQ.L„#1,D1�COMMAND�CODE�-10‰ASL.L…#1,D1�D1�IS�OFFSET�IN�INDEX�OF�MSG�SECTOR‰LEA‡SYM_BUF-B(A6),A0¢3/82‰MOVE.L„A0,D2­1/82‰LEA‡255(A0),A0¨1/822‰MOVE.L„A0,D3�START/END�BUFFER�ADDRS�IN�D2-D3‚1/82‰LEA‡FHSFILE-B(A6),A0¢3/82,‰MOVE.L„#$00400100,(A0)…OPEN�SEQUENTIAL�FILE‰MOVE.L„SPACES-B(A6),D0£3/82&‰MOVE.L„D0,FHSVOL(A0)‡BLANK�FHS�VOLUME‰CLR.W…FHSUSN(A0)#‰MOVE.L„D0,FHSCLG(A0)‡BLANK�CATALOG‰MOVE.L„D0,FHSCLN(A0)‰MOVE.L„#'SYMB',FHSFIL(A0)‰MOVE.L„#'HELP',FHSFIL+4(A0)‰MOVE.W„#'IN',FHSEXT(A0)‰TRAP†#3’ASSIGN�HELP�FILE‰BEQ.S…HELP.OPN3HELP.E3‚MOVE.B„#46,ERR_NMBR-B(A6)‚FAILED�OPEN“10/83‰BRA‡WHAT®10/838HELP.E2‚MOVE.B„#45,ERR_NMBR-B(A6)‚SCREEN�I/O�ERRORŽ10/83‰BRA‡WHAT®10/83"HELP.OPN�LEA‡IOSFILE-B(A6),A0¢3/821‰MOVE.L„#$00016000,(A0)…READ�RANDOM�RECORD�OPTION(‰CLR.L…IOSRRN(A0)ŠREAD�INDEX�RECORD�ZERO6‰MOVEM.LƒD2-D3,IOSSAD(A0)„BUFFER�ADDRESSES�ARE�SYM_BUF‰TRAP†#2‰BNE‡HELP.E3�READ�FAILED“10/83‰MOVE.L„D2,A3�A3=A(SYM_BUF)4‰MOVE.W„(A3,D1),IOSRRN+2(A0)�GET�SECTOR�FOR�1ST�READ-‰MOVE.W„2(A3,D1),D5‰SECTOR�NUMBER�OF�NEXT�MSG?‰OR.W†#IOPIMG,IOUT+IOSOPT-B(A6)�ALL�BUT�LAST�SECTOR�IS�IMAGE�IOHELP.NXT�TRAP†#2’READ�SECTOR‰BNE.S…HELP.E3�FAILED˜10/83+‰ADDQ.L„#1,IOSRRN(A0)‡UPDATE�SECTOR�POINTER4‰CMP.W…IOSRRN+2(A0),D5…IS�THIS�THE�LAST�HELP�SECTOR?‰BNE.S…HELP.PR�NO<‰AND.W…#$FFF7,IOUT+IOSOPT-B(A6)‚YES�-�DO�FORMATTED�IO�FOR�ITHELP.PR‚LEA‡IOUT-B(A6),A0¥3/82/‰MOVEM.LƒD2-D3,IOSSAD(A0)„CRT�BUFFER�IS�SYM_BUF"‰TRAP†#2’OUTPUT�PARTIAL�MSG�TO�CRT‰BNE‡HELP.E2�FAILED-‰LEA‡IOSFILE-B(A6),A0„NOW�CHECK�FILE�IOBŒ3/82-‰CMP.W…IOSRRN+2(A0),D5…DISPLAYED�ALL�SECTORS?‰BNE‡HELP.NXTŒNOT�YET"HELP.DUN�LEA‡FHSFILE-B(A6),A0¢3/82‰MOVE.W„#FHCLOS,(A0)ˆCLOSE�FILE‰TRAP†#3‰BNE‡HELP.E3�FAILED‰BRA.S…PROM.15�SUCCESS9HELP.ALL�BSR‡MSG28�PRINT�HELP�SCREEN‚(HELP�NAME�NOT�IMPL),‰BSR‡KEYIN�AWAIT�CARRIAGE�RETURN�TO�CONTINUE ‰BSR‡MSG29�CONTINUE�HELP�MESSAGEPROM.15‚BRA‡PROMPTŽISSUE�PROMPTM*----------------------------------------------------------------------------/*ˆD0�PARMCNT�CONTROLS�DEFAULT�OPTION�PROCESSING*ˆD0=0†MEANS�DISPLAY�DEFAULTS**ˆD0=1†MEANS�PROCESS�FILE‚AS�OUTFILE�(#FN)4*ˆD0=2†MEANS�NOECHO�WHICH�CLOSES�DEVICE�(#PR�OR�#FN)8*ˆD0=3†MEANS�ECHO�WHICH�OPENS�THE�ECHO�FILE�(#PR�OR�#FN)3DEFAULT‚BEQ.S…DEF.LISTŒNO�PARMS�MEANS�LIST�DEFAULTS2‰MOVE.L„SPACES-B(A6),D5…KEEP�THE�SPACES�HANDY‰3/82 ‰SUBQ.W„#1,D0�FILENAME�PARAMETER2‰BNE.S…DEF.ECHOŒMAY�HAVE�TO�OPEN�OR�CLOSE�ECHOFILE3‰LEA‡PRINTFHS-B(A6),A1ƒA(FHS)�TO�BE�FILLED�OUT‡6/83%‰BSR‡FILLFHS�USE�EDITFILE�ON�FHS‹6/837‰MOVE.B„#$0B,FHSOPT+1(A1)ƒSET�TO�REWRITE�FILE�ON�ASSIGN)‰SUB.L…#1,A0�BACK�ADDR�UP�TO�A(DELIMITER)4‰LEA‡OUTFILE-B(A6),A3„FILENAME�IN�DEFAULT�PARMS…3/82‰LEA‡INP_BUF-B(A6),A2%‰ADD.L…D1,A2�OFFSET�TO�FILENAMEŒ10/83DEF.COPY�MOVE.B„(A2)+,(A3)+‰CMP.L…A2,A0�AT�THE�DELIMITER?‰BNE‡DEF.COPYŒNOT�YET$PROM.14‚BRA‡PROM.15�RETURN�TO�PROMPT/DEF.ECHO�LEA‡AP(PC),A2‹CALL�ATTACH�PRINTER‹1/82'‰CMP.B…#2,D0�OPEN�OR�CLOSE�ECHO�DEVICE?‰BGT‡PROM.14�NEITHER‰BEQ.S…DEF.OPENŒASSIGN�PRINTER'‰LEA‡DP(PC),A2‹CALL�DETACH�PRINTER‹1/82*DEF.OPEN�JSR‡(A2)�ATTACH�OR�DETACH�PRINTER ‰BRA‡PROM.146DEF.LIST�LEA‡DEMSG-B(A6),A2†BASIC�DEFAULT�MESSAGE‰3/82*‰BSR‡CLEAN�BLANK�OUTBUF�&�SET�A3=A(OUTBUF)&‰MOVE.L„(A3),D5�KEEP�SPACES�HANDY�3/82%‰MOVE.L„#47,D3ŽLOOP�COUNT�FOR�COPY�-18DEF.LOOP�MOVE.B„0(A2,D3),0(A3,D3)ƒCOPY�DEFAULT�BASIC�MSG‰DBRA†D3,DEF.LOOP%‰CLR.L…D1’PREPARE�FOR�BYTE�MOVESˆ1/82(‰TST.B…MA_LIST-B(A6)‡MAL�OPTION�ON?�1/82‰BEQ.S…DEF.NOMAŒNO$‰MOVE.W„D5,(A3)�BLANK�NO�PREFIX�3/82.DEF.NOMA�TST.B…ECHO-B(A6)ŠECHO�OPTION�ON?�1/82‰BEQ.S…DEF.NOE�NO"‰MOVE.W„D5,6(A3)ŒBLANK�THE�NO’3/823DEF.NOE‚TST.B…BR_ENABL-B(A6)†BREAKPTS�ENABLED?�1/82‰BEQ.S…DEF.NOB�NO#‰MOVE.W„D5,14(A3)‹BLANK�THE�NO’3/829DEF.NOB‚MOVE.B„BASE-B(A6),D1‡CONVERT�INPUT�BASE�CODE‡3/82.‰LEA‡20(A3),A0‹A(NAME�IN�OUTBUF�OF�INPUT�BASE)"‰MOVE.L„A0,D3�FIRST�PASS�FLAG�3/82)‰LEA‡DETYPE-B(A6),A2…BASENAMES�TABLE�3/82 DEF.INƒSUBQ.L„#1,D1�CODE�-1—1/82 -‰LSL.W…#2,D1�TIMES�4�=�OFFSET�INTO�TABLEƒ1/829‰MOVE.L„0(A2,D1),(A0)‡INPUT�OR�OUTPUT�BASE�NAME�TO�OUTBUF(*�5/83ƒCMP.L…D3,A0�DONE�BOTH�BASES?Ž3/82*�5/83ƒBNE.S…DEF.LTH�YES›1/825*�5/83ƒADDQ.L„#8,A0�STEP�A(BASE�NAME)�FOR�OUTPUT‚1/829*�5/83ƒMOVE.B„TYPES-B(A6),D1†NO�-�NOW�DO�OUTPUT�BASE‡3/82*�5/83ƒBRA.S…DEF.IN9DEF.LTH‚MOVE.B„LENGTH-B(A6),D1…DEFAULT�OUTPUT�LENGTH‰3/821*�5/83ƒMOVE.B„39(A2,D1),36(A3)„B,W�OR�L�CODE‘1/82‰MOVE.B„DEVICE-B(A6),D1£3/82*‰AND.B…#$FE,D1�CONVERT�CODE�1=0�(#PR)ˆ1/82)‰MOVE.W„44(A2,D1),40(A3)„#PR,#FN,#CN“1/82%‰MOVE.L„#29,D3ŽLENGTH�OF�FILENAME�MAX‰LEA‡OUTFILE-B(A6),A2¢3/829DEF.ILE‚MOVE.B„0(A2,D3),50(A3,D3)‚COPY�FILENAME�TO�OUTBUF‰DBRA†D3,DEF.ILE%‰BSR‡MSG05�PRINT�DEFAULTS�FROM�OUTBUF‰BRA.S…PROM.02�ALL�DONE**ˆTASK�RELATED�COMMANDS*6LOAD…LEA‡INP_BUF-B(A6),A0„CAN'T�BE�INQ�FOR�MACROS‡3/82‰ADD.W…D1,A0�A(TASKNAME�IN�INQ)/‰MOVEQ.Lƒ#80,D6ŽPSEUDO�COMLINE�LENGTH=80„111484:‰BSR‡LOADTASK‚PERFORM�LOAD�&�PASS�COMLINE�TO�USERTASK�1/82!PROM.02‚BRA‡PROMPTŽREISSUE�PROMPTJ*=========================================================================6ATTACHƒMOVE.L„D1,TASKLDR-B(A6)†TASKNAME�TO�BE�ATTACHED0‰BSR‡ATCHTASK‚ATTACH�TASK�&�PASS�LUNS�&�START�IT ‰BRA‡PROM.02J*=========================================================================STARTASK�BSR‡GETNAME-STARTNXT�TST.L…(A4)†TASK�EXISTS�IN�THIS�SLOT?‰BEQ.S…STARTSKP‚NO1‰MOVE.L„TVBUF(A4),A1‚YES�-�USE�ITS�A(TASK�BUFFER)(‰BSR‡INSTALLƒINSTALL�BREAKPOINTS�IN�TASK‰BSR‡RUN‡START�EXECUTION8STARTSKP�CMP.L…#'ALL�',VFLD-B(A6)„COMMAND�FOR�ALL�TASKS?‰BNE‡PROM.02ƒNO2‰ADD.W…#LTSKVECT,A4ˆPOINT�TO�NEXT�TASK�VECTOR…1/82‰SUB.W…#1,D3…REDUCE�TASKCOUNT‰BNE‡STARTNXT‚CONTINUE#‰BRA‡PROM.02ƒALL�TASKS�IN�EXECUTIONJ*=========================================================================HALTTASK�BSR‡GETNAMEHALTMORE�TST.L…(A4)�TASK�HERE?‰BEQ.S…HALTSKIPŒNO�-�TRY�NEXT(‰TST.B…TVEXEC(A4)ŠYES�-�IS�IT�EXECUTING?#‰BEQ.S…HALTSKIPŒNO�-�LEAVE�IT�ALONE-‰MOVE.L„A4,A0�USE�TASK�VECTOR�AS�STOP�PARMBLK ‰MOVEQ.Lƒ#STOP,D0ŒSTOP�DIRECTIVE‰TRAP†#1'‰BEQ.S…HALTEDŽTASK�STOPPED�SUCCESSFULLY)‰BSR.L…PARSM47�REPORT�TASK�FAILED�TO�STOP-‰BRA.S…HALTSKIPŒON�TO�THE�NEXT�IF�HALT�"ALL�"1HALTEDƒCLR.B…TVEXEC(A4)ŠTASK�NOT�NOW�IN�EXECUTION#‰MOVE.L„TVBUF(A4),A1ˆA(TASK�BUFFER)‰MOVE.L„(A4),A2�SAVE�TASKNAME,‰BSR‡DETACHTTŒTEMPORARILY�DETACH�TASK‚1114845‰MOVE.L„A2,(A4)�UNERASE�TASKNAME�IN�VECTOR�FOR�ATTACH4‰MOVE.L„A4,A1�A1�MUST�POINT�AT�TASKNAME�FOR�REDYTASK‰BSR‡REGLESS�START�WITHOUT�REGS4‰BSR‡REDYTASKŒATTACH�&�START�TASK�(WON"T�BEGIN�EXEC)1STOPPING�BSR‡STATISŽRSTATE�FOR�CURRENT�REG�VALUES+HALTSKIP�CMP.L…#'ALL�',VFLD-B(A6)‚STOP�ALL?'‰BNE.S…PROM.03�NO�-�SINGLE�TASK�STOPPED1‰ADD.W…#LTSKVECT,A4ˆSTEP�TO�NEXT�TASK�VECTOR†1/82&‰SUB.W…#1,D3�LOOP�ON�GETNAME'S�MAXTCNT4‰BNE‡HALTMOREŒLOOP�UNTIL�UNSUCCESSFUL�(FOR�ALL�MODE)‰BRA.S…PROM.03�RETURN�TO�PROMPTK*==========================================================================(TASK…BSR‡GETNAME�GET�TASKNAME�(REQUIRED)+‰CMP.B…#1,D0�NOTE�LEVEL�PARAMETER�SUPPLIED?‰BEQ.S…TASK.FORŒNO5‰MOVE.W„D2,TVNOTE(A4)‡ALTER�NOTE�LEVEL�IN�TASK�VECTOR2TASK.FOR�BSR‡FOREGRNDŒMAKE�IT�FOREGROUND�TASK‡5/83‰BRA.S…PROM.03H*=======================================================================&MASK…BSR‡GETNAME�GET�TASKNAME�(IF�ANY)‰MOVE.L„#1,D3�SET�MASK�BIT&‰TST.L…D2’RETURNED�EXCEPTION�BIT�VALUE'‰BEQ.S…MASKXOR�D3�CURRENTLY�=�1‚(BIT#0)‰LSL.L…D2,D3�SHIFT�MASK�BIT1MASKXOR‚MOVE.L„TVBUF(A4),A1ˆUSE�NAMED�TASK�BUFFER1‰EOR.L…D3,BUFMASK(A1)†INVERT�SELECTED�BIT�IN�MASK&‰LEA‡XMSKB-B(A6),A0†A(PARM�BLOCK)‘3/82‰BSR‡SETMASK«3/82.‰MOVE.L„#$01FFFFF1,8(A0)„RESTORE�STANDARD�MASKPROM.03‚BRA‡PROMPTH*=======================================================================EVENT„BSR‡GETNAME-‰LEA‡ASQB-B(A6),A0‡REUSE�THIS�PARM�BLOCK‰3/82/‰SUB.W…#12,A7ŽMAKE�ROOM�ON�STACK�FOR�EVENT‚1/82(‰MOVE.L„A7,10(A0)‹A(EVENT)�TO�PARM�BLOCK7‰MOVE.W„#$0C08,(A7)‰NORMAL�EXCEPTION�EVENT�PUT�ON�STACK ‰MOVE.L„(A4),2(A7)ŠCOPY�TASKNAME*‰MOVE.L„SESSION-B(A6),6(A7)Š&�SESSIONŒ3/82  ' /1!<)91:9:A3I7Q4Y7a5i4q7y6�;‰T‘@™1¡I©7±5¹ )‰MOVE.B„D2,10(A7)‹EXCEPTION�CODE�OF�EVENT%‰MOVE.B„#$03,11(A7)‰NORMAL�EVENT�TYPE+‰MOVEQ.Lƒ#QEVNT,D0‹DIRECTIVE�CODE�FOR�QEVNT&‰BSR‡COPY8�COPY�TASKNAME�&�TRAP#1ˆ3/82 ‰ADD.W…#12,A7ŽCLEANUP�STACK‘1/82‰TST.L…D0’CHECK�SUCCESS‰BEQ‡PROM.03�OK!‰BSR‡MSG24�FAILED ‰BRA‡PROM.03G*======================================================================TERMINƒBSR‡GETNAME"‰BSR‡QUITTER�TERMINATE�TARGET�TASK ‰BRA‡PROM.03H*======================================================================="DETACHƒBSR‡GETNAME�SPR�1043”111484‰MOVE.L„TVBUF(A4),A1#‰BSR‡DETACHT�DETACH�TASK�FROM�EXMON ‰BRA‡PROM.03H*=======================================================================:WAITERƒMOVEQ.Lƒ#WTEVNT,D0ŠWAIT�FOR�EVENT�WITHOUT�EXMON�I/O&‰TRAP†#1’ALLOWS�TARGET�TASK�TO�USE�CRT.‰BRA‡PROM.03�NOW�READY�TO�ISSUE�DEBUG�COMMANDSH*=======================================================================STAT…BSR‡GETNAME‰LSL.W…#2,D2�STATUS�*�4.‰JMP‡SLEEP(PC,D2.W)†JUMP�TO�STATUS�VECTOR‰1/824SLEEP„MOVEQ.Lƒ#STOP,D0ŒDO�STOP�TO�SET�STATUS�DORMANT‰BRA.S…TRAPPER1AAWAKE„MOVEQ.Lƒ#START,D0†DO�START�TO�SET�STATUS�READY�FROM�DORMANT‰BRA.S…TRAPPER1AUNWAITƒMOVEQ.Lƒ#WAKEUP,D0‡DO�WAKEUP�TO�SET�STATUS�READY�FROM�WAIT0TRAPPER1�LEA‡STARTTSK-B(A6),A0ƒA(PARMBLOCK)’3/823‰MOVE.W„#$8000,8(A0)ˆNO�REG�INITIALIZATION�ON�START.‰BSR‡COPY4�DO�WAKEUP,START�OR�STOP�TRAP#1�3/82:‰LEA‡STARTTSK-B(A6),A0ƒA0�CLOBBERED�BY�STOP�DIRECTIVE�3/82$‰MOVE.W„#$A000,8(A0)ˆRESTORE�OPTIONS‰TST.W…D0’DID�IT�WORK?‰BEQ.S…DISPLAT�SUCCESSFULGSTAT.ERR�MOVE.B„#47,ERR_NMBR-B(A6)‚STATUS�CHANGE�DIRECTIVE�FAILED�10/83‰BRA‡WHAT®10/83L*---------------------------------------------------------------------------DISPLAT‚BSR‡MSG09�PRINT�STATHDR3‰MOVE.L„SEGADDR-B(A6),A4„START�OF�TASK�VECTORS‰3/82,‰MOVE.W„MAXTCNT-B(A6),D2„MAX�TASK�COUNT�3/82DIS.005‚TST.L…(A4)�TASK�HERE?‰BNE.S…DIS.007�YES�-�SHOW�IT5DIS.006‚ADD.W…#LTSKVECT,A4ˆNEXT�TASK�VECTOR�SLOT‰1/82%‰SUB.W…#1,D2�LOOP�ON�ALL�TASK�VECTORS‰BNE‡DIS.005�CONTINUE2PROM.04‚BRA‡PROMPTŽALL�TASKS�STATUS�REPORTED…10/83:DIS.007‚LEA‡SPACES-B(A6),A3…BLANK�DMOUTA�FOR�80�BYTES…3/82‰BSR‡CLEAN2¬3/82‰MOVE.L„(A4),(A3)‹COPY�TASKNAME"‰MOVE.L„TVSESS(A4),4(A3)‹&‚SESSION$‰TST.B…TVEXEC(A4)ŠTASK�IN�EXECUTION?‰BEQ.S…DIS.012�NO,‰MOVE.B„#$65,9(A3)ŠYES�-�FLAG�e�BEFORE�STATEDIS.012‚LEA‡ADX-B(A6),A0¦3/82/‰MOVE.B„TVCODE(A4),D0‡INDEX�TO�A,D,X�TYPE�EVENT ‰EXT.W…D02‰MOVE.B„0(A0,D0.W),17(A3)ƒEVENT�ID�TO�PRINT�BUFFER‰MOVE.B„TVEVNT(A4),D0 ‰BSR‡CONV"‰MOVE.W„D0,18(A3)‹ASCII�EVENT�CODE‰TST.B…TVAGE(A4)‰BEQ.S…DIS.015�OLD�EVENT�FLAG"‰MOVE.B„#'!',20(A3)‰FLAG�NEW�EVENT4DIS.015‚CMP.L…FORTASK-B(A6),A4„FOREGROUND�TASK?Ž3/82‰BNE.S…DIS.020�NO‰MOVE.B„#'<',15(A3)‰YES/DIS.020‚MOVE.W„TVNOTE(A4),D0‹NOTIFICATION�LEVEL‰OR.B†#$30,D0�CONVERT�TO�ASCII‰MOVE.B„D0,16(A3)‹TO�BUFFER$‰BSR.S…STATISŽRSTATE�FOR�TASK�STATUS'‰LEA‡ADX+4-B(A6),A0†A(STATE�TABLE)�3/82!‰MOVE.L„BUFSTAT(A1),D1†TCB�STATUS‰BMI.S…DIS.030�IS�DORMANT ‰ADD.L…#4,A0‰BTST.L„#20,D1ŽREADY�BIT�IS�#20‰BNE.S…DIS.030�TASK�IS�READY ‰ADD.L…#4,A09DIS.030‚MOVE.L„(A0),10(A3)‰LITERAL�STATUS�TO�PRINT�BUFFER)‰LEA‡DMOUTA+22-B(A6),A3‚A(OUTPUT�PC)’3/82‰LEA‡20(A4),A2‹BINARY�PC‰BSR‡MOVET�CONVERT�PC�TO�ASCII2‰LEA‡DMOUTA+32-B(A6),A3‚SPACE�PAST�NOTE�LEVEL‰3/82/‰LEA‡BUFPC(A1),A2ˆCONVERSION�ADDR�IS�CURRENT�PC‰BSR‡MOVET�PC�NOW�TO�BUFFER‰BSR‡MOVE2�SR�TO�BUFFER‰BSR‡MOVET�EXMON�MASK�TO�BUFFER#‰BSR‡MOVET�TCB�HEX�STATUS�TO�BUFFER‰BSR‡MOVE2�OPTIONS�TO�BUFFER6‰MOVE.L„TVTERM(A4),(A3)…COPY�CRT�TERMINAL�ID�TO�BUFFER‰BSR‡MSG30�REPORT�STATUS‰BRA‡DIS.006�CONTINUE -STATISƒMOVE.L„A4,A0�TASK�VECTOR�IS�PARM�BLOCK+‰MOVEQ.Lƒ#RSTATE,D0ŠREAD�CURRENT�TASK�STATE‰TRAP†#1‰BNE‡ER1‘FATAL�ERROR%‰MOVE.L„TVBUF(A4),A1ˆTASK�BUFFER�ADDR‰RTS*5*ˆFIND�TASKNAME�IN�INPUT�B  UF�&�LOCATE�IN�TASK�VECTORS*;GETNAME‚MOVE.L„FORTASK-B(A6),A4„ASSUME�FOREGROUND�TASKˆ3/82#‰TST.L…D1’TASKNAME�SPECIFIED?‹10/833‰BEQ.S…GETFORE�NO�-�USE�FOREGROUND�DEFAULT�TASKNAME+‰MOVE.L„D1,A2�YES�-�MOVE�LITERAL�NAME�TO�A21‰MOVE.L„SESSION-B(A6),A3„STANDARD�SESSION�ID‹3/82*‰BSR‡FINDTASKŒMATCH�NAME�WITH�TASK�VECTORS)‰BRA.S…GETHIMŽFOUND�NAME�(A4�IS�SET)ˆ1/82(‰CMP.L…#'ALL�',D1ŠCOMMAND�FOR�ALL�TASKS?‰BNE.S…GETWHOŽNO�-�SYNTAX�ERROR:‰MOVE.L„SEGADDR-B(A6),A4„START�WITH�FIRST�TASK�VECTOR‚3/82:‰MOVE.W„MAXTCNT-B(A6),D3„WILL�HAVE�TO�CHECK�ALL�SLOTS‚3/82?GETHIMƒMOVE.L„D1,VFLD-B(A6)‡SAVE�'ALL�'�AS�TASKNAME�PARSED�1/820GETRTSƒRTS‘A5�NOW�POINTS�PAST�TASKNAME�DELIMITER(GETWHOƒBSR‡MSG26…REPORT�UNKNOWN�TASKNAME&‰ADD.L…#4,A7…POP�RETURN�ADDR�OFF�STACK‰BRA‡WHAT†EXIT�-�SYNTAX�ERROR?GETFORE‚MOVE.L„(A4),VFLD-B(A6)…NULL�TASKNAME�BECOMES�FOREGROUND‰BRA‡GETRTSŽNORMAL�EXIT PAGE**ˆDETACH�AND�EXIT*#DETACHT‚BSR‡CLRBP�CLEAR�ANY�BPS�SET#‰MOVE.W„BUFSR(A1),D0ˆGET�STATUS�REG"‰BCLR†#15,D0ŽCLEAR�TRACE�BIT�IF�ON‰MOVE.W„D0,BUFSR(A1)ˆRESTORE�SR‰CLR.L…BUFMASK(A1)‰CLEAR�MASK‰CLR.W…BUFDO(A1)‹CLEAR�OPTIONS(‰MOVEQ.Lƒ#PSTATE,D0ŠSET�UP�FOR�PUT�STATE*‰MOVE.L„A4,A0�USE�TASK�VECTOR�AS�PARMBLOCK‰TRAP†#1#‰BNE‡ER1‘PUT�STATE�DIRECTIVE�FAILED9DETACHTT�MOVE.L„A4,A0�USE�TASK�VERTOR�AS�PARMBLOCK‚111484‰MOVEQ.Lƒ#DEMON,D0*‰TRAP†#1’A0�POINTS�TO�TASK�VECTOR�AS�ABOVEH*----------------------------ASR ROUTINE GETS DETACH EVENT AT THIS POINT6‰BEQ.S…QUITTINGŠTASK�STILL�RUNNING�UNATTACHED�TO�EXMON-‰CMP.W…#1,D0�IDENTIFY�FAILURE�ERROR�OF�DETACH‰BEQ‡FATAL03�BAD�PARM�BLOCK‰BRA‡FATAL02�BAD�TASKNAME*%*ˆQUITƒ(TERMINATE�TARGET�TASKS�FIRST)*2QUIT…MOVE.W„MAXTCNT-B(A6),D1„MAX�#�OF�ACTIVE�TASKS ‰SUB.W…#1,D1+‰MOVE.L„SEGADDR-B(A6),A4„GET�TASK�LIST‘3/820QUIT.01‚BSR.S…QUITTER�TERMINATE�THIS�TARGET�TASK-‰ADD.W…#LTSKVECT,A4ˆADVANCE�TO�NEXT�TASKŠ1/82‰DBRA†D1,QUIT.01‰BRA‡DONE�TERM�EXMON &QUITTER‚TST.L…(A4)�ANY�TASKNAME�HERE�?‰BEQ.S…QUITTINGŒNO)‰MOVEQ.Lƒ#TERMT,D0‹TERMINATE�DIRECTIVE�ID‰LEA‡STOPTASK-B(A6),A0¡3/82‰BSR.S…COPY8­3/82"QUITTING�CLR.L…(A4)�CLEAR�TASKNAME'*�10/83‚CLR.L…TVSESS(A4)ŠSESSION�NUMBER‰RTS›TERMINATED�ONE�TARGET�TASK ©8„CLR.W…8(A0)�A0=A(PARMBLOCK)�3/82)COPY4„MOVE.L„(A4),(A0)‹COPY�TASKNAME‘3/82%‰MOVE.L„4(A4),4(A0)‰COPY�SESSION’3/82#‰TRAP†#1’D0�CONTAINS�DIRECTIVE‰3/82‰RTS‰PAGE**ˆPRIMITIVE�COMMANDS*0*ˆPARMCNT:1=ADDR;�2=ADDR+TYPE;�3=ADDR+LTH;�4=ALL+MMOD…BSR‡MM’CALL�DISASSEMBLER�TO�PROCESS�MM ‰BRA‡PROMPT5AMAXERR‚MOVE.B„#16,ERR_NMBR-B(A6)‚ADDRESS�RANGE�ERROR‰BRA‡WHAT�REPORT�ERRORL*---------------------------------------------------------------------------(BF‡SUB.L…D1,D2�START�-�END�ADDR�FOR�FILL!‰BMI‡AMAXERR�LOADDR�>�HIADDR�5/83!‰ADDQ.L„#1,D2�TRUE�LENGTH�OF�MOVE$‰MOVE.L„D2,D6�SAVE�TOTAL�MOVE�LENGTH!‰CMP.L…#256,D2�MORE�THAN�1�BLOCK?‰BLE.S…BF.ONEŽNO$‰MOVE.L„#256,D2�YES�-�DO�1�BLOCK�NOWEBF.ONEƒLEA‡SYM_BUF-B(A6),A3ƒBUILDING�ADDRESS�OF�VALUES�TO�BE�MOVELLED6‰MOVE.L„#1,D5�COMPENSATE�FOR�ODD�START�ADDR�IF�PRESENT ‰AND.B…D1,D5/‰ADD.L…D5,A3�IF�ODD�ADDR�WILL�BUILD�AT�SYMBUF+1$‰MOVE.L„D2,D5�WORK�REGISTER�FOR�MOVE‰CMP.B…#2,D4�WORD�MOVE?‰BGT.S…BF.LONG�NO�-�LONG�WORD‰BNE.S…BF.BYTE�NO�-�A�BYTE,BF.WORD‚MOVE.W„D3,(A3)+ŒBUILD�BLOCK�OF�WORDS‰SUB.L…#2,D5�DONE?‰BHI.S…BF.WORD�NOPE#‰BRA.S…BF.EXIT�YES�-�DONE�WORD�FILLBF.BYTE‚MOVE.B„D3,(A3)+ ‰SUB.L…#1,D5‰BHI.S…BF.BYTE‰BRA.S…BF.EXIT�DONE�BYTE�FILLBF.LONG‚MOVE.L„D3,(A3)+ ‰SUB.L…#4,D5 ‰BHI‡BF.LONG9BF.EXIT‚LEA‡SYM_BUF-B(A6),A3„A(CONTENT�FOR�MOV2TASK)‡3/82 ‰MOVE.L„D1,-(A7)ŒSAVE�D1�=�A(to)‰BSR‡MOV2TASKŒPERFORM�MOVELL#‰MOVE.L„(A7)+,D1ŒRESTORE�D1�=�A(to):‰ADD.L…D2,D1†ANTICIPATE�ANOTHER�MOVE‚A(NEXT�BLOCK�to�ADDR)%‰SUB.L…D2,D6�REDUCE�TOTAL�MOVE�LENGTH‰BEQ‡PROMPTŽDONE‰CMP.L…D2,D6�LESS�THAN�1�BLOCK?"‰BGE‡BF.EXIT�NO�-�DO�ANOTHER�BLOCK&‰MOVE.L„D6,D2�REFRESH�REMAINING�LENGTH‰BRA‡BF.EXIT�AND�TRY�AGAINL*---------------------------------------------------------------------------DC‡MOVE.L„D1,D4�SAVE�VALUE”1/82  +‰TST.W…CURTCNT-B(A6)‡FOREGROUND�TASK�?�1/82‰BEQ.S…NORSLVŽNO/‰BSR‡CLEAN�YES,�BLANK�OUTBUF�&�SET�A3=A(OUTBUF)9******ƒMOVE.L„A6,-(A7)ŒSAVE�A6�FROM�FORMADDR&BESTFIT�3/82-******ƒMOVEA.LƒA3,A6�SET�A6�TO�A(OUTBUF)‹3/82$‰MOVE.L„D1,D0�GET�ADDRESS�TO�RESOLVE*‰BSR‡FORMADDRŒFORMAT�RELATIVE�ADDRESS‡1/82‰ADD.W…#8,A3�INSERT�8�SPACES%‰MOVE.L„D1,D0�RESTORE�RESOLVE�ADDRESS,‰BSR‡BESTFIT�RESOLVE�TO�SYMBOL[+OFFSET]„1/82*******ƒMOVE.L„(A7)+,A6ŒRESTORE�OUR�A6�3/82‰MOVE.L„A3,D0�SPACE�FILLER’6/83‰ADDQ†#2,D0­6/83‰AND.B…#$FE,D0«6/83‰MOVE.L„D0,A3­6/83 ‰MOVE.L„D4,D0�REFRESH�VALUE‘6/83(‰BSR‡ADRELOŽR�REG�RELOCATION�IF�ANY‡5/83‰BSR‡MSG05�PRINT�LINE*5NORSLVƒBSR‡CLEAN�BLANK�OUTBUF�&�SET�A3=A(OUTBUF)�1/82&‰MOVE.W„#'�$',(A3)+‰FIRST�FIELD�IS�HEX ‰MOVE.L„D4,D0�REFRESH�VALUE‘1/82&‰BSR‡MOVED0ŽCONVERT�VALUE�TO�HEX�ASCII‰MOVE.L„D4,D0�REFRESH�VALUE‰BPL.S…DC.PLUS�POSITIVE�NUMBER%‰MOVE.B„#'-',-1(A3)‰PREFIX�MINUS�SIGN2‰NEG.L…D0‘COMPLEMENT�FOR�ABSOLUTE�VALUE�CONVERSION4DC.PLUS‚BSR.S…BI2ASCD�CONVERT�VALUE�TO�DECIMAL�ASCII0‰MOVE.B„SPACES-B(A6),(A3)+‚TO�WORD�BOUNDARYŽ3/82 ‰MOVE.B„#'%',(A3)+ŠBINARY�PREFIX?‰MOVE.L„#31,D1„LOOP�COUNT�AND�BIT�#�TO�CONVERT�FOR�BINARY�ASCII#DC.BINƒBTST.L„D1,D4�TEST�BINARY�BIT‰BEQ.S…DC.ZIPŽPUT�ZERO‰MOVE.B„#'1',(A3)+ŠPUT�ONE‰BRA.S…DC.LOOPDC.ZIPƒMOVE.B„#'0',(A3)+2DC.LOOP‚DBRA†D1,DC.BIN‹CONVERT�ALL�32�BITS�(31->0)‰BSR‡MSG05�PRINT�LINE5LO‡BRA‡PROMPTŽWILL�NEVER�BE�IMPLEMENTED�(LOAD�SERVES)*!*ˆCONVERT�BINARY�TO�ASCII�DECIMAL*BI2ASCD‚LEA‡POWER10(PC),A0¤1/82/‰MOVE.L„(A0)+,D3ŒFETCH�SPACES�,�ADVANCE�POINTER‰MOVE.B„D3,D1�LEAD�BLANK�FLAG BLANKIT‚MOVE.B„D3,D2�OUTPUT�BYTE SLODIVƒSUB.L…(A0),D0�SUB�(10**N) ‰BCS.S…LEAD0�TABLE�VALUE�TOO�BIG*‰ADD.L…#1,D2�INCREMENT�CURRENT�DIGIT�COUNT ‰BRA‡SLODIV9LEAD0„ADD.L…(A0)+,D0ŒRESTORE�OVERBORROW�,�ADVANCE�POINTER‰CMP.B…D1,D2�LEADING�ZERO�TEST&‰BEQ.S…LEADB�YES�:�STORE�LEADING�BLANK(‰ADD‡#16,D2ŽCONVERT�BLANK�TO�ASCII�DIGIT!‰CLR.B…D1’TURN�OFF�LEADING�BLANKS6LEADB„MOVE.B„D2,(A3)+ŒDECIMAL�CHARACTER�TO�OUTPUT�LINE‰TST.L…(A0)�DONE?‰BEQ.S…CHKALLB�YES ‰BRA‡BLANKIT�CONTINUE�NEXT�DIGITCHKALLB‚TST.B…D1’ALL�BLANKS?‰BEQ.S…BI2ASCX�NO�:�EXIT-‰ADD.B…#16,-1(A3)ŠCONVERT�LAST�BLANK�TO�ASCII BI2ASCX‚RTS%POWER10‚DC.L†'„',1000000000,1000000003‰DC.L†10000000,1000000,100000,10000,1000,100,10,1,0M*----------------------------------------------------------------------------BM‡MOVE.L„D1,A3�from�ADDR‰MOVE.L„D3,D1�to�ADDR‰MOVE.L„D2,D5�SAVE�from�ENDADDR3‰ADD.L…#1,D5�A(FIRST�BYTE�AFTER�from)�IS�A(OVERLAP)‰SUB.L…A3,D2�MOVE�LENGTH�IN�D2‰ADD.L…#1,D2�TRUE�LENGTH‰MOVE.L„D2,D6�SAVE�TOTAL�LENGTH‰CMP.L…A3,D1�BACKWARD�MOVE?‰BLE.S…BM.FWDŽYES‰CMP.L…D5,D1�MOVE�BEYOND?‰BGE.S…BM.FWDŽYES7‰MOVE.L„D1,D2ŒMOVE�OVERLAPS�-�PROPAGATION�ERROR�PROBLEM‰SUB.L…A3,D2�NONOVERLAP�LENGTH!‰BMI‡AMAXERR�LOADDR�>�HIADDR�5/83!‰MOVE.L„D5,A3�START�AT�LAST�BLOCK BM.BKWD‚MOVE.L„A3,D1�NEW�to�ADDR‰SUB.L…D2,A3�NEW�from�ADDR0BM.FWDƒMOVE.L„(A4),BRKPBP-B(A6)ƒSAME�TASK�MOVELL‰BSR‡MOV2TASKŒPERFORM�MOVELL‰SUB.L…D2,D6�DONE?‰BLE.S…BM.EXIT�YES�-�ALL�MOVED ‰CMP.L…D2,D6�PARTIAL�LAST�BLOCK?‰BGE‡BM.BKWD�NO$‰MOVE.L„D3,A3�YES�-�ORIGINAL�to�ADDR ‰BRA‡BM.BKWDBBM.EXIT‚CLR.L…BRKPBP-B(A6)ˆRESET�SOURCE�TASK�TO�EXMON�DEFAULT‚1/825‰BRA‡PROMPT‹ALL�DONE‚-‚ODD�PARITY�ADDRESSES�A�PROBLEMM*-----------------------------------------------------------------------------FS‡MOVE.L„#IOWRIT,D2ŠSET�WRITE�OPTION�FOR�IOS‰BRA.S…GET_FILE8FILLFHS‚LEA‡INP_BUF-B(A6),A0„A(INPUT�FROM�KEYBOARD)ˆ3/82‰ADD.L…D1,A0�A(FILENAME)-‰MOVE.L„D1,-(A7)ŒSAVE�NAME�DISPLACEMENTˆ10/83‰MOVE.L„A6,-(A7)ŒSAVE�BASE�REG3‰MOVE.L„42(A6),FHSVOL(A1)ƒOVERLAY�'PR‚'�VOLUME‰6/837‰MOVE.W„48(A6),FHSUSN(A1)ƒOVERLAY�ZERO�USER�NUMBER†6/836‰MOVE.L„50(A6),FHSCLG(A1)ƒOVERLAY�CATALOG�DEFAULT‡6/83 ‰MOVE.L„54(A6),FHSCLN(A1)�"“6/83#‰MOVE.L„A1,A6�FHS�FOR�EDITFILEŽ6/83$‰BSR‡EDITFILEŒEDIT�VERSADOS�FILENAME!‰BPL.S…FILLEDŽGOOD�FILENAME‘10/836‰MOVE.B„#41,ERR_NMBR-B(A6)‚BAD�VERSADOS�FILENAME‰10/830‰LEA‡WHAT(PC),A1‰RETUR  N�TO�WHAT�FOR�ERRMSG…10/83,‰MOVE.L„A1,8(A7)ŒMUST�RESTORE�A6�FIRST‰10/83FILLEDƒMOVE.L„A6,A1�A(FHS).‰MOVE.L„(A7)+,A6ŒNORMAL�BASE�REG�RESTORED†3/82+‰MOVE.L„(A7)+,D1ŒRESTORE�DISPLACEMENTŠ10/83‰RTSM*----------------------------------------------------------------------------,FR‡MOVE.L„#IOREAD,D2ŠSET�READ�OPTION�FOR�IOS"GET_FILE�LEA‡FHSFILE-B(A6),A1¢6/83*‰MOVE.W„#'‚',FHSEXT(A1)„BLANK�SUFFIX’11/83‰BSR‡FILLFHS�A(FILENAME)“6/83‰MOVE.L„A1,A0�A(FHS)˜6/83<‰MOVE.W„#$000D,FHSOPT(A0)ƒOVERWRITE,�CONTIGUOUS,�PUBLIC�FILE%FR.IO„MOVE.W„#FHASGN,(A0)ˆASSIGN�CODE‰TRAP†#3‰BEQ.S…FR.SETŽSUCCESS)‰CMPI.B„#IOWRIT,D2ŠNO,�WRITE�OPTION�SET�?$‰BEQ.S…SAVE�YES,�FS,�TRY�AN�ALLOCATE=FR.BADƒMOVE.B„#44,ERR_NMBR-B(A6)‚PROFILE�FILE�I/O�ERRORˆ10/83 ‰BRA‡WHAT FR.SETƒLEA‡IOSFILE-B(A6),A0¢3/82)‰MOVE.W„D2,(A0)�READ�OR�WRITE�CODE�TO�IOS=‰MOVE.W„#IOPBLK,IOSOPT(A0)‚RESET�OPTIONS�AFTER�HELP�IF�NEEDED‰LEA‡TABLE-B(A6),A2¤3/821‰MOVE.L„A2,IOSSAD(A0)‡HELP�CHANGED�THIS�ADDRˆ1/82‰LEA‡FILELTH-1(A2),A2¢1/82‰MOVE.L„A2,IOSEAD(A0)¥1/82‰TRAP†#2(‰BNE‡FR.BADŽPROFILE�FILE�I/O�ERRORˆ10/83!FR.GOOD‚LEA‡FHSFILE-B(A6),A0¢3/82‰MOVE.W„#FHCLOS,(A0)ˆCLOSE�CODE‰TRAP†#3 ‰BNE‡FR.BADPROM.10‚BRA‡PROMPT*&SAVE…MOVE.W„#FHALLO,(A0)ˆALLOCATE�CODE*‰CLR.W…FHSWCD(A0)ŠZERO�WRITE,PROTECT�CODES%‰MOVE.W„#256,FHSLRL(A0)…RECORD�LENGTH‰MOVE.L„#2,FHSSIZ(A0)‡2�RECORDS‰TRAP†#3’ALLOCATE�FILE%‰BEQ.S…FR.IO�OK�-�NOW�DO�ASSIGN/WRITE‰BRA‡FR.BADŽBAD�ALLOCATEK*--------------------------------------------------------------------------(BS‡CMP.L…D1,D2�VERIFY�LOADDRBS.BLKƒLEA‡NXT_STR-B(A6),A1„MY�SEARCH�ADDRESS�FOR�A�BLOCK�3/82!‰BTST.L„D7,D1�TARGET�ADDRESS�ODD?‰BEQ.S…BS.EVEN�NO/‰ADD.L…#1,A1�MAINTAIN�ADDRESS�PARITY�FOR�MOVELLBS.EVEN‚MOVE.L„D1,D2 ‰ADD.L…#80,D2$‰SUB.L…D4,D2�A(LAST�STRING�IN�BLOCK)3‰MOVE.L„A1,BRKGET-B(A6)…MY�(to)�ADDR�(NXT_STR�[+1])(‰MOVE.L„#80,BRKGET+4-B(A6)‚MOVELL�LENGTH+‰MOVE.L„D1,BRKPBUF-B(A6)„TARGET�ADDR�(from)‰BSR‡GETSOUR�DO�MOVELL•1/82‰BNE‡ERLL�FAILED&BS.BEGIN�MOVE.L„D4,D5�STRING�LENGTH�-1+BS.SAME‚MOVE.B„0(A5,D5),D0‰STRING�COMPARAND,‰CMP.B…0(A1,D5),D0‰MATCH�MEMORY�(IN�NXT_STR)‰BNE.S…BS.DIFŽNO‰DBRA†D5,BS.SAMEŠSO�FAR,�YES.‰MOVE.L„D1,D0�UNEQUIVOCABLY�YES�(WHOLE�STRING)/‰MOVEM.LƒD1/A2,-(A7)‰SAVE�REGS�FROM�MOVED0‰3/821‰BSR‡MOVED0ŽPUT�TARGET�ADDR�TO�OUTBUF�(CONVERTED)&‰MOVEM.Lƒ(A7)+,D1/A2‰RESTORE�REGS’3/82 ‰CMP.L…A2,A3�OUTBUF�FILLED?�1/82‰BLE.S…BS.MORE�NOT�YET‰MOVE.L„D1,-(A7)ŒSAVE�D1—4/82‰BSR‡MSG05�DISPLAY�OUTBUF ‰MOVE.L„(A7)+,D1ŒRESTORE�D1”4/82‰BSR‡CLEAN�REFRESH�OUTBUF�&�A30‰LEA‡OUTBUFE-12-B(A6),A2�LINE�OVERFLOW�ADDRŒ3/82,BS.MORE‚ADD.L…D4,A1�STEP�PAST�MATCHED�STRING ‰ADD.L…D4,D1,BS.DIFƒADD.L…#1,A1�A(NEXT�STRING�IN�NXT_STR)4‰ADD.L…#1,D1�CORRESPONDING�TARGET�ADDR�KEEPS�IN�STEP‰CMP.L…D6,D1�ARE�WE�DONE? ‰BGT.S…BS.DONE�YES�::::�FINALLY!5‰CMP.L…D2,D1�HAVE�WE�EXHAUSTED�THE�STRINGS�THIS�BLOCK‰BLT‡BS.BEGINŒNOT�YET'‰BRA‡BS.BLKŽMOVE�IN�A�NEW�80�BYTE�BLOCK4BS.DONE‚BSR‡MSG05�EMPTY�BUFFER�OF�ADDR�MATCHES�FOUND2PROM.13‚BRA‡PROMPTŽBLANK�LINE�OUTPUT�IF�NO�MATCHESM*----------------------------------------------------------------------------8CR‡TST.L…IN_MACRO-B(A6)†LET�PARSE�DO�CR�IF�IN�MACROƒ1/82%‰BNE‡PROM.13�YES‚THE�CR�IS�IN�A�MACRO?‰MOVE.L„D1,CRCOUNT-B(A6)„SAVE�REPEAT�COUNT�OF�NEXT�COMMAND�1/82?‰MOVE.L„#1,CREPEAT-B(A6)„TRIGGER�CR�ON�NEXT�PASS�OF�PROMPT�1/82 DU‡BRA‡PROMPT **…DISPLAY�REGISTERS*:OFFSETƒLEA‡OFREGS-B(A6),A2…ENTRY�POINT�FOR�OF�COMMAND„2/82#‰LEA‡R0R7-B(A6),A5‡PREFIX�ADDR“3/82#‰MOVE.W„#'in',6(A5)‰MIN�RANGES”5/83'‰BRA.S…DISPREGSŒCOMMON�ENTRY�POINTŒ2/82*MAXRREG‚LEA‡R0R7-B(A6),A5‡PREFIX�ADDR“5/83&‰CMP.W…#'in',6(A5)‰JUST�DID�MINS?�5/83%‰BNE‡PROM.13�NO�-�FINISHED�MAXES‹5/83#‰MOVE.W„#'ax',6(A5)‰MAX�RA  NGES”5/83&‰BRA.S…DISPREGSŒOMMON�ENTRY�POINT�5/835DISPLYƒMOVE.L„A1,A2�TASKBUF�IS�FROM�ADDRESS�FOR�MOVER#‰LEA‡D0D7-B(A6),A5‡PREFIX�ADDR’3/822DISPREGS�BSR‡CLEAN�BLANK�OUTBUF�&�SET�A3=A(OUTBUF))‰MOVE.L„(A5)+,(A3)+‰COPY�PREFIX�TO�OUTBUF‰MOVE.L„(A5)+,(A3)+‰BSR‡MOVER�CONVERT�FIRST�4�REGS9‰MOVE.B„SPACES-B(A6),(A3)+‚EXTRA�SPACE�BETWEEN�R3&R4…3/82‰BSR‡MOVER�CONVERT�NEXT�4�REGS‰BSR‡MSG05�PRINT�REGS/‰CMP.B…#'D',OUTBUF-B(A6)ƒNEED�TO�DO�A0-A7�REGS?%‰BEQ.S…DISPREGSŒYES�-�GO�DO�THEMŽ2/82(‰BGT.S…MAXRREG�NO�-�JUST�THE�OFREGSŠ5/83(‰BSR‡CLEAN�NO�-�BUT�CONVERT�PC�&�SR�NEXT"‰MOVE.L„SRPREFIX-B(A6),12(A3)�3/82!‰MOVE.L„PCPREFIX-B(A6),(A3)+ž3/82 ‰BSR‡MOVEPC‰BSR‡MOVE2ŠMOVE�SR'‰MOVE.B„#'.',D2�TRANSLATE�OPTION�OŒ5/83$‰MOVE.W„BUFSR(A1),D0ˆSTATUS�REG”5/83‰MOVE.W„D0,D1�COPIED˜5/83.‰AND.L…#$00000700,D0‡MASK�INTERRUPT�LEVELŠ5/83+‰OR.L†#'TS0X',D0ŠLEFT�HALF�TRANSLATION‰5/83‰MOVE.L„D0,(A3)�TO�OUTBUF•5/83/‰MOVE.L„#'NZVC',4(A3)‡RIGHT�HALF�TO�OUTBUFŠ5/83‰BTST†#15,D1ŽTRACE�BIT�ON?‘5/83‰BNE.S…TBIT�YES�-�LEAVE�T‘5/83%‰MOVE.B„D2,(A3)�NO�-�OVERLAY�DOTŽ5/83&TBIT…BTST†#13,D1ŽSUPERVISOR�MODE?Ž5/83‰BNE.S…SBIT�YES�-�LEAVE�S‘5/83&‰MOVE.B„D2,1(A3)ŒNO�-�OVERLAY�DOTŽ5/83/SBIT…LEA‡3(A3),A3ŒPOINT�AT�X�OF�"TS0XNZVC"†5/83,‰MOVEQ…#4,D3�LOOP�COUNT-1�=�BIT#�TESTED„5/83'SRTRANS‚BTST†D3,D1�TEST�STATUS�BIT�5/83‰BNE.S…BITON�LEAVE�LETTER’5/83 ‰MOVE.B„D2,(A3)�OVERLAY�DOT“5/83(BITON„ADD.L…#1,A3�STEP�ALONG�OUTBUF�5/83"‰DBRA†D3,SRTRANSŠTRANSLATE�SR’5/83)‰BSR.S…PCRELOŽREDISPLAY�PC�VIA�RREGSˆ5/83 ‰BSR‡MSG05PROM.09‚BRA‡PROMPTŽRETURN /PCRELOƒMOVEM.LƒD0/D1/A2/A5,-(A7)ƒSAVE�REGS•5/83)‰MOVE.L„TVBUF(A4),A2ˆA(TASKBUF�REGS)�5/83+‰MOVE.L„BUFPC(A2),D0ˆFETCH�ABSOLUTE�PC�5/83‰BRA.S…PCR.00ŽCOMMON�CODE“5/83@ADRELOƒMOVEM.LƒD0/D1/A2/A5,-(A7)ƒSAVE�REGSƒD0=ABSOLUTE�ADDR‚5/83(PCR.00ƒLEA‡OFREGS-B(A6),A5…A(RREGS)–5/83!‰MOVE.L„#28,D1ŽOFFSET�TO�.R7‘5/83(PCR.01ƒCMP.L…32(A5,D1),D0ˆPC�<�MAX?•5/83‰BHS.S…PCR.03ŽNOœ5/83"‰CMP.L…0(A5,D1),D0‰PC�>=�MIN?”9/83‰BMI.S…PCR.03ŽNOœ5/83(‰SUB.L…0(A5,D1),D0‰GET�OFFSET�IN�R0Ž9/83'‰CMP.B…#10,TOKEN-B(A6)…MD�COMMAND?“5/83#‰BEQ.S…PCR.02ŽNOT�A�PC�ADDRESSŽ5/83*‰MOVE.L„PCPREFIX-B(A6),(A3)+ƒLABEL�PC“5/83PCR.02ƒMOVE.B„#'R',(A3)+¨5/83‰LSR.W…#2,D1�RREG�OFFSET/4‘5/83&‰OR.B†#'0',D1�CONVERT�TO�ASCII�R#‹5/83‰MOVE.B„D1,(A3)+ŒTO�TEXT—5/83‰BSR‡MOVED0ŽOFFSET�TO�TEXT�5/83(‰MOVE.W„#'+$',-12(A3)‡6�BYTE�OFFSET‘5/83'‰SUB.L…#2,A3�CANCEL�PAD�OF�2�BYTES‰5/83‰BRA.S…PCR.EXITŒEXITš5/83(PCR.03ƒSUB.L…#4,D1�NEXT�RREG�OFFSETŽ5/83‰BPL‡PCR.01ŽTRY�IT˜5/834PCR.EXIT�MOVEM.Lƒ(A7)+,D0/D1/A2/A5ƒRESTORE�REGS’5/83‰RTS‰PAGE8BRK†BNE.S…BRKNEW†IF�PARMCNT�>�0�THEN�NOT�IN�DISPLAY�MODE/‰TST.B…NO_FLG-B(A6)ˆMIGHT�BE�PARMLESS�NOBRˆ1/82‰BNE.S…BRKNEWŽYES�-�IT�IS!2‰MOVE.W„BUFBPCNT(A1),D4…HERE�IF�BREAKPOINT�DISPLAY%‰BEQ.S…PROM.05�NO�BREAKPOINTS�DEFINED(‰LEA‡BUFBPTBL(A1),A2…ADDRESS�OF�BP�TABLE6BRKDISP‚BSR‡CLEAN�BLANKS�TO�OUTPUT�LINE�(A3=A(OUTBUF)))‰MOVE.L„#5,D3�LIMIT�5�BPS�OUTPUT�PER�LINE.BRKDNXT‚BSR‡MOVET�CONVERT�ADDR�&�PUT�IN�BUFFER(‰MOVE.B„#'~',-1(A3)‰TILDE�PRECEDES�COUNT‰BSR‡MOVE2�CONVERT�COUNT2‰LEA‡4(A2),A2ŒSKIP�OVER�BRSOURCE�&�EFFECTIVE�COUNT‰SUB.W…#1,D4�DID�ONE(‰BEQ.S…BRKSHOW�BRANCH�IF�DONE-PRINT�LINE‰SUB.L…#1,D3�COUNT�IT$‰BNE‡BRKDNXT�BRANCH�IF�ROOM�FOR�MORE#BRKSHOW‚BSR‡MSG05�PRINT�BREAKPOINTS‰TST.W…D4’SEE�IF�MORE�TO�DO!‰BNE‡BRKDISP�BRANCH�IF�MORE�TO�DOPROM.05‚BRA‡PROMPTŽDONE  *BRKNEWƒTST.B…TVEXEC(A4)ŠTASK�IN�EXECUTION?‰BEQ.S…ALLOWBP�NO1‰BSR‡MSG27ŽBREAKPOINTS�INSTALLED�&�LOCKED�MESSAGE‰BRA‡PROM.05�RETURN�TO�PROMPT6ALLOWBP‚LEA‡PARM_BLK-B(A6),A5ƒPOINT�A5�AT�PARMBLK‹3/82'‰MOVE.L„D0,D6�MOVE�PARMCNT�SAFELY�TO�D6(‰TST.B…NO_FLG-B(A6)ˆNOBR�SPECIFIED?�1/82&‰BNE.S…BRKDELŽYES�-�DELETE�BREAKPOINTS2BRNEWNXT�MOVEM.Lƒ(A5)+,D1-D2‰GET�BRADDR,COUNT�PAIR3‰LEA‡BUFBPTBL(A1),A2…BEGIN�SEARCH�WITH�1ST�IN�TABLE0‰MOVE.W„BUFBPCNT(A1),D5…CURRENT�BREAKPOINT�COUNT.‰BEQ.S…BRKSLOT�NO�PREVIOUS�BREAKPOINTS�DEFINED'‰CMP.W…#BPMAX,D5‹FULL�BREAKPOINT�TABLE?,‰BLT.S…BRKFIND�NO�-�SEE�IF�IT�ALREADY�EXISTS0‰BSR‡MSG16�YES�-�PRINT�BREAKPOINT�TABLE�FULL�MSG ‰BRA  ‡PROM.05*BRKFIND‚CMP.L…(A2),D1�SEE�IF�ALREADY�THERE%‰BEQ.S…BRKHAVE�YES�-�MAY�CHANGE�COUNT;‰LEA‡LBPENTRY(A2),A2…BP�ENTRY�=�ADDR,COUNT,SOURCE�=�4+2+2+2‰SUB.W…#1,D5�DECREMENT�COUNTER‰BNE.S…BRKFIND�CONTINUE�SEARCH.BRKSLOT‚MOVE.L„D1,(A2)�NEW�BREAKPOINT�TO�TABLE‰ADD.W…#1,BUFBPCNT(A1)…COUNT�IT.‰MOVE.L„D1,BRKPBUF-B(A6)„SEE�IF�ADDRESS�EXISTS"‰LEA‡6(A2),A3ŒA(BREAKPOINT�SOURCE)$‰MOVE.L„A3,BRKGET-B(A6)…A(OF�SOURCE)(‰MOVE.L„#2,BRKGET+4-B(A6)ƒLENGTH�OF�MOVE‰BSR‡GETSOUR�DO�MOVELL•1/82"‰BEQ.S…BRKHAVE�GOOD�NEW�BREAKPOINT!‰CLR.L…(A2)�REMOVE�BAD�BREAKPOINT!‰SUB.W…#1,BUFBPCNT(A1)…UNCOUNT�IT!‰BSR‡MSG18�REPORT�BAD�TARGET�ADDR.‰BRA.S…PROM.06�SKIP�ANY�REMAINING�BRKPTS�INPUT1BRKHAVE‚MOVE.W„D2,4(A2)ŒREPETITION�COUNT�TO�TABLE"‰SUB.L…#2,D6�EXHAUSTED�PARM�COUNT? ‰BGT‡BRNEWNXTŒHAVE�MORE�GO�DO�IT(‰BRA.S…PROM.06�PROCESSED�ALL�BREAKPOINTS BRKDELƒTST.W…D6’ANY�PARMS?(‰BNE.S…BRKCLR1�BRANCH�IF�WE�HAVE�A�VALUE+‰BSR.S…CLRBP�NO‚(PARMLESS�NOBR�=�CLEAR�ALL)%PROM.06‚BRA‡PROMPTŽRETURN-ALL�CLEARED DCLRBP„MOVE.W„BUFBPCNT(A1),D5…breakpoints�must�be�clear�at�this�point#‰BEQ.S…CLRBP4ŽEQUAL�MEANS�NO�BP�SET&‰LEA‡BUFBPTBL(A1),A2…A2�GOES�TO�BRKBUF%CLRBP2ƒLEA‡6(A2),A3ŒA3�GOES�TO�BRKSOR/‰BSR‡BPOUT�DO�MOVELL�TO�RETURN�SOURCE�TO�TARGET$‰CLR.L…(A2)�ERASE�BREAKPOINT�ADDRESS‰CLR.W…(A3)�ERASE�SOURCE�ENTRY7‰LEA‡LBPENTRY(A2),A2…STEP�TO�NEXT�BREAKPOINT�ENTRYƒ1/82$‰SUB.W…#1,D5�REDUCE�BREAKPOINT�COUNT&‰BNE.S…CLRBP2ŽLOOP�UNTIL�ALL�ARE�CLEAR‰CLR.W…BUFBPCNT(A1)ˆCLEAR�COUNTCLRBP4ƒRTS›RETURN 7BRKCLR1‚MOVE.W„BUFBPCNT(A1),D5…COUNT�OF�EXISTING�BRKPTS‰BEQ‡PROM.06�BRANCH�IF�NONE�SET3‰LEA‡BUFBPTBL(A1),A2…BEGIN�SEARCH�WITH�1ST�IN�TABLE7‰MOVEM.Lƒ(A5)+,D1-D2‰ADDRESS�&�COUNT(ignored)�PARM�PAIR1BRKLOOK‚CMP.L…(A2),D1�FIND�IT�IN�BREAKPOINT�TABLE‰BEQ.S…BRKSAME�FOUND�IT2‰LEA‡LBPENTRY(A2),A2…STEP�TO�NEXT�ENTRY�(10�BYTES)‰SUB.W…#1,D5�DECREMENT�COUNTER‰BNE.S…BRKLOOK�LOOK�SOME�MORE6‰MOVE.B„#30,ERR_NMBR-B(A6)‚NONEXISTENT�BRKPT�TO�DELETE‰BRA‡WHAT�DIDN'T�FIND�IT9BRKSAME‚MOVE.W„BUFBPCNT(A1),D5…CURRENT�ACTIVE�BRKPT�COUNT ‰SUB.W…#1,D5-‰MULS†#LBPENTRY,D5ˆOFFSET�OF�LAST�BRKPT�ENTRY‰LEA‡BUFBPTBL(A1),A3‰ADD.W…D5,A3�A(LAST�BRKPT�ADDR)?‰MOVE.L„(A3),(A2)+„MOVE�IT�TO�OVERLAY�THE�BRKPT�WE�ARE�CLEARING&‰CLR.L…(A3)+�CLEAR�OLD�LAST�BRKPT�ADDR4‰MOVE.L„(A3),(A2)+ŠMOVE�COUNT�AND�SOURCE�FIELDS�ALSO*‰CLR.L…(A3)+�CLEAR�OLD�LAST�COUNT�&�SOURCE&‰MOVE.W„(A3),(A2)‹MOVE�EFFECTIVE�COUNT!‰CLR.W…(A3)�CLEAR�EFFECTIVE�COUNT!‰SUB.W…#1,BUFBPCNT(A1)…UNCOUNT�IT‰SUB.W…#2,D6�REMAINING�PARMCNT‰BLE‡PROM.06�IS�EXHAUSTED#‰BRA‡BRKCLR1�CONTINUE�PARSING�PARMSI*========================================================================;DMEM…MOVE.L„A7,STACKBRK-B(A6)ƒSAVE�STACK�POINTER�FOR�BREAKS(‰BSET†#SETBRK,BREAK-B(A6)�TAKE�IO�BREAKS‰MOVE.L„D0,A5�SAVE�PARMCNT‰SUB.L…#2,D0�PARM�COUNT�>�2�?"‰BEQ.S…NOTDI�NO,�NO�TYPE�OR�LENGTH'‰CMP.B…#10,D4ŽYES,�TYPE�=�DI�(IF�ANY)�?‰BNE.S…NOTDI�NO$‰BSR‡MDDI�YES,�DISPLAY��LINES ‰BRA‡PROM.07,NOTDI„MOVE.L„D1,BRKPBUF-B(A6)„TARGET�ADDRESS‰AND.L…#1,D1�SAVE�ODD�ADDR�FLAG‰LEA‡OUTBUF-B(A6),A0£3/82'‰ADD.L…A0,D1�SAME�PARITY�ADDRESSES‰1/82#‰MOVE.L„D1,BRKGET-B(A6)…A(DMBUFFER)/DMLTH„ADD.L…#15,D2ŽROUND�UP�TO�16�BYTE�MULTIPLE%‰ASR.L…#4,D2�NUMBER�OF�16�BYTE�BLOCKS+‰MOVE.L„#16,BRKGET+4-B(A6)‚MOVE�LENGTH�PARM DMFETCH‚EQU‡*‰BSR‡GETSOUR�DO�MOVELL•1/82‰BNE‡ERLL�ERROR�HANDLER0‰MOVE.L„BRKPBUF-B(A6),D0„SAVE�START�ADDRESSŒ3/82+‰LEA‡DMOUTA-B(A6),A3…BUFFER�TO�ADDRESS�3/824‰MOVE.L„SPACES-B(A6),8(A3)‚MAY�NOT�BE�NECESSARYŠ3/82,‰BSR‡ADRELOŽDISPLAY�RREG�ADDRESS�IF�ANYƒ3/82*‰BPL.S…DMREL�ADDRESS�IS�RREG�RELATIVE†3/82'‰BSR‡MOVED0ŽDISPLAY�ADDRESS�AS�ABSOLUTE5DMREL„LEA‡DMOUTA+60-B(A6),A0‚A(ASCII�TEXT�FIELD)‹3/82.‰MOVE.W„SPACES-B(A6),(A0)+‚SPACES�BEFORE�ASCII.‰MOVE.L„BRKGET-B(A6),A2…SOURCE�TO�BE�CONVERTED‰MOVE.W„#15,D4ŽCONVERT�16�BYTES!DMBYTEƒMOVE.B„(A2)+,D0ŒGET�A�BYTE‰CMP.B…#$20,D0‰BLT.S…DMDOT�BRANCH�IF�$00-$1F‰CMP.B…#$7E,D0‰BGT.S…DMDOT�BRANCH�IF�$7F-$FF ‰MOVE.B„D0,(A0)+ŒAS-IS�TO�OUTPUT‰BRA.S…DMHEX�GO�DO�HEX(  DMDOT„MOVE.B„#'.',(A0)+ŠUNPRINTABLE�BYTE"DMHEX„BSR‡CONV�BYTE�TO�ASCII--HHLL‰CMP.W…#7,D4�AT�MIDDLE�OF�HEX?‰BNE.S…DMMID�BRANCH�IF�NO+‰MOVE.B„SPACES-B(A6),(A3)+‚EXTRA�SPACE“3/82DMMID„ROR.W…#8,D0�LLHH‰MOVE.B„D0,(A3)+ŒHH‰LSR.W…#8,D0�00LL‰MOVE.B„D0,(A3)+ŒLL%‰MOVE.B„SPACES-B(A6),(A3)+‚BLANK™3/82(‰DBRA†D4,DMBYTE‹LOOP�TO�CONVERT�16�BYTES0*‚HERE�IS�WHERE�LENGTH,TYPE�OR�DEVICE�ARGS�APPLY‰BSR‡MSG30�PRINT�DMOUTA�BUFFER.‰ADD.L…#16,BRKPBUF-B(A6)ƒNEXT�ADDRESS�TO�PRINT‰SUB.L…#1,D2�MORE�BLOCKS�TO�DO?‰BNE‡DMFETCH�BRANCH�IF�YES+PROM.07‚BRA‡PROMPTŽBACK�FOR�ANOTHER�COMMANDM*----------------------------------------------------------------------------1DMEM.REG�LEA‡OUTSTAT-B(A6),A3„12�BYTE�BUFFER�3/82‰LEA‡INP_BUF-B(A6),A5¢3/82"‰ADD.L…D2,A5�A(REGISTER�ID)�IN�INQ‰MOVE.B„(A5)+,(A3)+‰REGISTER�ID‰MOVE.B„(A5)+,(A3)+‰MOVE.W„#'=�',(A3)+7‰MOVE.L„SPACES-B(A6),4(A3)‚BLANK�IN�CASE�SHORT�REG‡3/82&‰LEA‡MOVET(PC),A5ˆASSUME�LONG�REG�1/82-‰CMP.W…#24,D1ŽREG�CODE�24->31�ARE�OFREGS„2/823‰BGE.S…DM.OF�USE�OFREGS�RATHER�THAN�A1�AS�BASE�2/82)‰MOVE.L„A1,A2�BASE�ADDR�OF�REGS�THIS�TASK+DM.COMƒLSL.L…#2,D1�PROBABLE�OFFSET�THIS�REG#‰ADD.L…D1,A2�A(REG�TO�BE�DISPLAYED)!‰CMP.W…#BUFMASK+2,D1‡XM�REGISTER?‰BLT.S…DM.SR�NO�,�BUT�MAYBE�SR ‰BEQ.S…DM.XM�YES�-�ADJUST�OFFSET$‰CMP.W…#BUFDO-2,D1‰OP�REGISTER?’2/82‰BGT.S…DM.LONG�NO"‰ADD.W…#2,A2�OFFSET�IS�$4E�NOT�$4C.DM.SHORT�LEA‡MOVE2(PC),A5ˆDISPLAY�2�BYTES�1/820DM.LONG‚JSR‡(A5)�CONVERT�REG�TO�ASCII�IN�OUTSTAT‰BSR‡MSG04�DISPLAY�REGISTER ‰BRA‡PROM.07+DM.SR„CMP.W…#BUFSR,D1‹STATUS�REGISTER?Ž2/82‰BNE‡DM.LONG�NO‰BRA‡DM.SHORTŒYES'DM.XM„SUB.W…#2,A2�OFFSET�IS�$46�NOT�$48 ‰BRA‡DM.LONG8DM.OF„LEA‡OFREGS-B(A6),A2…BASE�REG�OF�REGS�.R0->.R7…3/82%‰SUB.W…#24,D1ŽCALC�OFFSET�INTO�OFREGS‰LSL.L…#2,D1­5/83‰ADD.L…D1,A2­5/83‰JSR‡(A5)�MINIMUM�RREG’5/83‰BSR‡MSG04­5/83/‰LEA‡OUTSTAT+4-B(A6),A3‚REUSE�FOR�MAX�RREGŒ5/83‰ADD.L…#28,A2ŽA(MAX�RREG)“5/83'‰BRA‡DM.LONG�BACK�FOR�MAXIMUM�RREG‰5/83G*======================================================================2SMEM…LEA‡SYM_BUF-B(A6),A3„A(From�ADDR)‚VALUESŠ3/82‰BSR‡MOV2TASKŒPERFORM�MOVELL‰BRA.S…PROM.08�RETURN4SMEM.REG�CMP.W…#24,D1ŽCHECK�REG�CODE�FOR�OFREGS�TYPE‰BLT.S…REG.REG�NOT�AN�OFREG0‰LEA‡OFREGS-B(A6),A1…BASE�REG�INSTEAD�OF�TASKBUF*‰SUB.W…#24,D1ŽREDUCE�OFFSET�PRIOR�TO�SHIFT)‰LSL.W…#2,D1�YES�-�GET�OFFSET�OF�MIN‡5/835‰CMP.B…#2,PM_COUNT-B(A6)ƒBOTH�MIN�AND�MAX�GIVEN?‡5/83$‰BEQ.S…REG.OFŽNO�-�SET�ONLY�MIN�5/83‰CMP.L…D2,D3�MIN�<�MAX?”5/83#‰BLT‡AMAXERR�NO�-�RANGE�ERRORŽ10/83'‰MOVE.L„D3,32(A1,D1)ˆYES�-�SET�MAX‘5/83)REG.OFƒCMP.L…32(A1,D1),D2ˆMIN�<�MAX?”5/83"‰BGT‡AMAXERR�NO�-�RANGE�ERRORŽ5/83‰BRA.S…REG.L�YES�-�SET�MIN‘5/83<�FILENAME�1ST�4�CHAR?�9/83'‰BNE.S…LD.TERR�PROCEED�AT�OWN�RISK‹9/83$LD.017ƒTST.L…D0’WAS�SUCCESSFUL?�9/83‰BEQ.S…LD.015ŽYES�-�EXIT”9/83 1MAKEDORM�MOVE.L„(A0),STOPTASK-B(A6)ƒCOPY�TASKNAME ‰MOVEQ.Lƒ#STOP,D0ŒSTOP�DIRECTIVE&‰LEA‡STOPTASK-B(A6),A0ƒSTOP�PARM�BLOCK!‰TRAP†#1’STOP�TASK�ALREADY�LOADED"‰BEQ.S…REGLESS�TASK�IS�NOW�DORMANT‰CMP.W…#6,D0�TASK�NOT�RUNNING‰BEQ.S…REGLESS�IS�OK.‰BSR.S…PARSM47�TASK�FAILED�STOP�DIRECTIVE„2/849REGLESS‚MOVE.W„#$8000,STARTTSK+8-B(A6)‰START�WITHOUT�REGS LD.015ƒRTS5LD.ERRFN�MOVEM.Lƒ(A7)+,D0-D7/A0-A6ƒRESTORE�REGS’11/83*‰BSR.S…PARSM41�BAD�VERSADOS�FILENAME‰10/83‰BRA.S…LD.ERRŽ.�9/83/LD.TERR‚BSR.S…PARSM38�TASKNAME�><�FILENAMEŠ9/83-‰BRA‡LD.017ŽTRY�TO�CONTINUE�(NO�SYMBOLS)‚2/84"LD.ERRƒBSR‡MSG22�REPORT�LOAD�ERROR ‰RTS›AND�EXIT2PARSM48‚MOVE.B„#48,D0ŽFAILED�TO�PASS�LUNS�MSG‡2/84‰BRA.S…PARSMD0�.�2/842PARSM47‚MOVE.B„#47,D0ŽTASK�FAILED�TO�STOP�MSG‡2/84‰BRA.S…PARSMD0�.�2/840PARSM41‚MOVE.B„#41,D0ŽBAD�VERSADOS�FILENAME‰2/84‰BRA.S…PARSMD0�.�2/845PARSM38‚MOVE.W„#38,D0ŽTASKNAME�><�FILENAME�ERROR„2/848PARSMD0‚MOVE.B„D0,ERR_NMBR-B(A6)ƒSAVE�D0�FROM�CLEANŒ2/840PARSMXX‚BSR‡CLEAN�ESTABLISH�A3�FOR�PARSMSGS…2/84‰CLR.L…D0’.�2/84-‰MOVE.B„ERR_NMBR-B(A6),D0ƒMESSAGE�NUMBER�2/84(‰BSR.L…PARSMSGSŒFETCH�ERROR�MESSAGE‹2/84‰CLR.B…ERR_NMBR-B(A6)†.�2/84"‰BSR‡MSG05�DISPLAY�ERROR�TEXTŒ2/84‰RTS‰PAGE*2*ˆATTACH�TARGET�TASK�TO�EXMON�AND�START�(READY)�IT*/*ˆON�ENTRY‚A5=A(TERMINAL�ID�FOLLOWING�TASKNAME)CATCHTASK�LEA‡TASKLDR-B(A6),A1„CONTAINS�TASKNAME�TO�BE�ATTACHED�3/82;‰MOVE.L„DECRT-B(A6),TERMINAL-B(A6)„ASSUME�NO�TERMINAL�SPEC.6‰MOVE.L„(A1),TASKREGS+$20-B(A6)‚TASKNAME�TO�USERREG�A0‰MOVE.B„#5,D3�SAVE�OUR�LUN#50‰CMP.B…#2,D0…(2�PARMS)�REMOTE�TERMINAL�SUPPLIED?‰BNE.S…NOREMOTEŒNO‰CMP.L…#'*ƒ',D2‰RESIDENT�TASK?‰BNE.S…OPEN4�OPEN�REMOTE�CRT ‰MOVE.L„A1,A0 ‰BSR‡MAKEDORM ‰BRA.S…REDYTASKŒSKIP�LUN�PASSING'PROMPTCE‚EQU„*-1ŠDS.Wƒ0ŠXDEFƒREENTERS,REENTERE8REENTERS‚DC.Bƒ$D,$A,'SYSA:�REENTER�OUTPUT�DEVICE�NAME�>'REENTERE‚EQU„*-1ŠDS.Wƒ0ŠXDEFƒOUTERRS,OUTERRD0,OUTERRE;OUTERRSƒDC.Bƒ'SYSA:�ERROR�WRITING�TO�OUTPUT�DEVICE�-�D0�=�'OUTERRD0‚DC.Bƒ'00000000�'ŠDC.Bƒ'RETRY?�(Y/N)>'OUTERREƒEQU„*-1ŠDS.Wƒ0 BRKRCV„DC.Bƒ'SYSA:�BREAK�RVCD!!'BRKRCVEƒEQU„*-1ŠDS.Wƒ0ŠXDEFƒTSKNFND,TSKNFNDE#TSKNFNDƒDC.Bƒ'SYSA:�TASK�NOT�FOUND'TSKNFNDE‚EQU„*-1ŠPAGE* *…MESSAGES�SENT�TO�OUTPUT�DEVICE*)ŠXDEFƒPAGSLEWS,PDATE,PTIME,PTASK,PAGSLEWEPAGSLEWS‚DC.Wƒ$200C%ŠDC.Bƒ'�S�Y�S�T�E�M…A�N�A�L�Y�S�I�S‚'ŠDC.Bƒ'DATE:�'PDATE… DC.Bƒ'XX/XX/XXƒ'ŠDC.Bƒ'TIME:�'PTIME…DC.Bƒ'XX:XX:XX�'PTASK…DC.Bƒ'„'ŠENDLINEPAGSLEWE‚EQU„*-1ŠDS…0BLNKLINS‚DC.Bƒ'�',CRBLNKLINE‚EQU„*-1ŠPAGE**ƒOPERATOR�INPUT�COMMANDS*ŠXDEFƒCMDTBL,CMDTBLE CMDTBL„EQU„* ŠXREFƒPADMPŠDC.Lƒ'ADRD',PADMP-CMDTBL ŠXREFƒPCCBSŠDC.Lƒ'CCBS',PCCBS-CMDTBL ŠXREFƒPDELAYŠDC.Lƒ'DELA',PDELAY-CMDTBL ŠXREFƒPFREEŠDC.Lƒ'FREE',PFREE-CMDTBL ŠXREFƒPFREQŠDC.Lƒ'FREQ',PFREQ-CMDTBL ŠXREFƒPGSTŠDC.Lƒ'GST�',PGST-CMDTBL ŠXREFƒPHELPÒZÛ2ŠDC.Lƒ'HELP',PHELP-CMDTBL ŠXREFƒPLCTBLŠDC.Lƒ'LCT�',PLCTBL-CMDTBL ŠXREFƒPMAPŠDC.Lƒ'MAP�',PMAP-CMDTBL ŠXREFƒPMDMPŠDC.Lƒ'MD‚',PMDMP-CMDTBLŠDC.Lƒ'MEM�',PMAP-CMDTBL ŠXREFƒPNATBLŠDC.Lƒ'NAT�',PNATBL-CMDTBL ŠXREFƒPNNTBLŠDC.Lƒ'NNT�',PNNTBL-CMDTBLŠDC.Lƒ'OFFS',OFFSET-CMDTBLŠDC.Lƒ'OUTP',CHGOUT-CMDTBLŠDC.Lƒ'PAT�',PDELAY-CMDTBL ŠXREFƒPPCBTBLŠDC.Lƒ'PCB�',PPCBTBL-CMDTBLŠDC.Lƒ'QUIT',QUIT-CMDTBL ŠXREFƒPRECVQŠDC.Lƒ'RCVQ',PRECVQ-CMDTBL ŠXREFƒPREADYŠDC.Lƒ'READ',PREADY-CMDTBL ŠXREFƒPSCBTBLŠDC.Lƒ'SCB�',PSCBTBL-CMDTBL ŠXREFƒPSTCBŠDC.Lƒ'STCB',PSTCB-CMDTBL ŠXREFƒPSYSPŠDC.Lƒ'SYSP',PSYSP-CMDTBL ŠXREFƒALLTBLŠDC.Lƒ'TABL',ALLTBL-CMDTBLŠXREFƒPONETASKŠDC.Lƒ'TASK',PONETASK-CMDTBL ŠXREFƒPTCBSŠDC.Lƒ'TCBS',PTCBS-CMDTBL ŠXREFƒPTRACEŠDC.Lƒ'TRAC',PTRACE-CMDTBL ŠXREFƒPTIATŠDC.Lƒ'TRAP',PTIAT-CMDTBL ŠXREFƒPUDRTBLŠDC.Lƒ'UDR�',PUDRTBL-CMDTBL ŠXREFƒPUSRQŠDC.Lƒ'USRQ',PUSRQ-CMDTBL ŠXREFƒPUSTŠDC.Lƒ'UST�',PUST-CMDTBL ŠXREFƒPUTCBŠDC.Lƒ'UTCB',PUTCB-CMDTBL ŠXREFƒPTMITQŠDC.Lƒ'XMTQ',PTMITQ-CMDTBL CMDTBLEƒEQU„* ééé=/*=/*†SYSANAL.AF=/**=/* Chain file to assemble SYSANAL utility=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to SYSANAL.LS=/*=/IFC \1ƒ=ARG�SYSANAL.LS=/ENDIF=/*+=ASM SYSANAL.SA,SYSANAL.RO,TEMP1.LS;SRZ=100=/*{ Included files are:=/*ƒANALMACR.AI=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒANALDATA.AI=/*ƒSYSAMSG.AI=/*ƒANALMAIN.AI=/*ƒSYSARCMD.AI =/*ƒANALIO.AI=/*ƒANALUTIL.AI=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Y=/*,=ASM SYSARESP.SA,SYSARESP.RO,TEMP1.LS;RZ=100=/*{ Included files are:=/*ƒANALMACR.AI=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒSYSAMOVM.AI=/*ƒANALPDMP.AI=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*,=ASM ANALTABL.SA,ANALTABL.RO,TEMP1.LS;RZ=230=/*{ Included files are:=/*ƒANALMACR.AI=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.GST.EQ=/*ƒ9995.&.BAB.EQ=/*ƒ9995.&.PAT.EQ=/*ƒ9995.&.TIOT.EQ=/*ƒ9995.&.UST.EQ=/*ƒ9995.&.UDR.EQ=/*ƒ9995.&.MAP.EQ=/*ƒ9995.&.ASQ.EQ=/*ƒ9995.NTS.NNT.EQ=/*ƒ9995.NTS.NAT.EQ=/*ƒ9995.NTS.LCT.EQ=/*ƒ9995.SDLCPRI.TEMPLTS.EQ=/*ƒANALSYSP.AI=/*ƒANALTRAP.AI=/*ƒANALTASK.AI=/*ƒANALGST.AI=/*ƒANALUST.AI=/*ƒANALCCBS.AI=/*ƒANALMAP.AI=/*ƒANALNET.AI=/*}=/*ƒ=COPY�TEMP1.LS,TEMP 2.LS;A=/*,=ASM DUMPTRAC.SA,DUMPTRAC.RO,TEMP1.LS;RZ=100=/*{ Included files are:=/*ƒANALMACR.AI=/*ƒ9995.&.TRACE.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Aƒ=COPY�TEMP2.LS,\1;Yƒ=DEL�TEMP1.LSƒ=DEL�TEMP2.LS=/*=ENDééãO=/*=/*†SYSANAL.LF=/*(=/* Link chain file to create SYSANAL.LO=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to SYSANAL.LL=/*G=/*�Note�that�SYSPAR�is�included�in�the�link.‚SYSANAL�has�been�coded�inL=/*ƒsuch�a�way�that�we�can�include�SYSPAR�from�any�system�(VM02,�EXORmacs�orK=/*ƒother)�and�it�will�not�affect�the�way�SYSANAL�executes.‚The�load�moduleG=/*ƒhowever,�will�differ�if�different�versions�of�SYSPAR�are�linked�in.F=/*ƒSYSANAL�determines�the�memory�address�of�SYSPAR�parameters�for�theG=/*ƒfile�we�are�analyzing�from�the�command�line�'S='�option.‚If�no�'S='G=/*ƒoption�is�specified,�SYSANAL�assumes�a�default�location�of�$900�forH=/*ƒSYSPAR.‚This�is�the�normal�location�of�SYSPAR�on�an�EXORmacs�system.=/*=/IFC \1ƒ=ARG�SYSANAL.LL=/ENDIF=/*=LINK ,SYSANAL.LO,\1;HAMIXS TASK SYSA ATTRIBUTES PSEG SEG0:0,8,14 $0000INPUT 9999.C4O9.SYSPAR.RO IN„SYSANAL.ROIN„SYSARESP.ROIN„ANALTABL.ROINPUT DUMPTRAC.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééì"(SYSANALƒIDNT„4,2„ON-LINE�SYSTEM�ANALYSIS*D**********************************************************************’MODIFICATION�HISTORY**ˆREVISION�021585�4;*‰User�defined�directives,�processed�by�ANALNET,�were�being<*‰confused�by�the�users,�in�that�the�option�bytes�were�split=*‰between�a�heading�OPT�and�one�called�EXIT.‚Since�both�bytes;*‰were�really�option�bytes,�the�two�were�combined�under�one*‰heading�call�OPTIONS.*;*‰The�VM04�has�its�System�Parameters�outside�the�range�that=*‰SYSANAL�looks�at�($500-2200).‚Also,�there�is�a�spot�in�this9*‰range�that�is�not�available�to�read�($1FF0-1FFF),�which9*‰caused�an�error�during�reading.‚To�circumvent�this,�the9*‰error�handling�location�was�changed�so�as�to�ignore�the>*‰error�co ndition�and�continue�to�search�in�the�expanded�range*‰($500-2400)�for�SYSPAR.*ééééõþ,*ˆREVISION�020185�47*‰SPR�906�indicated�that�the�user�wants�to�see�all�free:*‰partitions�when�using�the�MAP�subcommand.‚Therefore,�the<*‰ANALMAP.AI�was�changed�to�look�for�either�the�user-entered;*‰partition�number�or�an�indicator�(-1)�that�all�partitions*‰are�desired.**ˆREVISION�012985�4:*‰The�memory�map�was�not�correctly�interpreted�(SPR�1166).<*‰After�V4.2�the�organization�of�memory�changed,�but�SYSANAL=*‰was�not‚updated.‚ANALMAP.AI�was�changed�to�use�the�free�map:*‰header�pointer,�MAPFMLP,�to�find�the�end�of�a�partition.*7*‰When�dumping�from�location�to�location,�using�AD,�the8*‰program�would�not�dump�the�ending�location�(SPR�1027).7*‰ANALPDMP.AI�was�changed�to�add�1�to�the�difference�in *‰locations.**ˆREVISION�012585�49*‰Several�problems�were�found�during�the�testing�of�V4.4.6*‰Most�of�these�dealt�with�the�fact�that�the�format�of&*‰the�TCB�and�ASQ�tables�were�changed.D********************************************************************‰PAGE**‰INCLUDE�ANALMACR.AI*‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�ANALDATA.AI*‰INCLUDE�SYSAMSG.AI*‰INCLUDE�ANALMAIN.AI*‰INCLUDE�SYSARCMD.AI*‰INCLUDE�ANALIO.AI*‰INCLUDE�ANALUTIL.AIŠINCLUDE�ANALMACR.AIŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�ANALDATA.AIŠINCLUDE�SYSAMSG.AIŠINCLUDE�ANALMAIN.AIŠINCLUDE�SYSARCMD.AIŠINCLUDE�ANALIO.AIŠINCLUDE�ANALUTIL.AI ŠEND„BEGINéé   ,ŠTTL„SYSARCMD.AIˆ-�System�analysis�-�SYSANALŠPAGE9**********************************************************�INCLUDE�FILE:�SYSARCMD.AI�*9***********************************************************ŠREAD�COMMAND�LINE*ŠREDIRECT�OUTPUT�IF�REQUESTED* ŠXREF.S�PARSE-COMMANDL‚LEA„CLINE(PC),A0‡COMMAND�LINE�BUFFERŠBSR„PARSEŽPARSE�COMMAND�LINEŠMOVEM.L�A1-A2,PARSAREG-MBD(A6)ŠBTSTƒ#14,D0�Any�output�field?ŠBNE.S‚COMDL16ŒBranch�if�no)ŠBSR.S‚NEWOUT�GO�TO�OUTPUT�CHANGE�ROUT INE** Analyze options field COMDL16ƒEQU„*0ŠMOVE.L�OPTSRT-MBD(A6),D0‚Start�of�options�field"ŠBEQ.S‚CMDL99�Branch�if�no�options#ŠMOVE.L�D0,A6ŽFor�OPTION�subroutine ŠXREFƒOPTION ŠBSR„OPTIONŠLEA„BEGDATA(PC),A6‰Restore�A6,ŠCMP.B‚#$40,D0ŒAre�we�done�with�the�options?ŠBEQ.S‚CMDL99�Branch�if�yes!ŠBTSTƒ#7,D0ŽAny�error�in�options?ŠBEQ.S‚OPOK1ŽBranch�if�no0OPTERR„MOVE.L�#EM_NVO,D0‰Complain�on�bad�options ŠBSR„ERRMSGŠBRA„QUIT�Quit�on�bad�options*&OPOK1…CMP.B‚#'S',D1ŒIs�the�option�'S'? ŠBNE„OPTERR�Branch�if�no�-�errorŠMOVE.L�D3,SYSPAROF-MBD(A6) ŠBLE„OPTERR* CMDL99„RTSééé*,ŠTTL„SYSARESP.SAˆ-�System�analysis�-�SYSANALŠPAGE*SYSARESP‚IDNTƒ4,2�RESPOND�TO�INPUT�REQUEST ŠXREFƒMBD*‰INCLUDE�ANALMACR.AI*‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�SYSAMOVM.AI*‰INCLUDE�ANALPDMP.AIŠNOLISTŠINCLUDE�ANALMACR.AIŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.IOE.EQŠLISTŠINCLUDE�SYSAMOVM.AIŠINCLUDE�ANALPDMP.AI,ŠTTL„SYSARESP.SAˆ-�System�analysis�-�SYSANALŠPAGE ŠSECTION�0**$*†DATA�SECTION�--�RESPOND�TO�COMMAND*SAVTNAMƒDC.Lƒ0’SAVE�TASK�NAMESAVTSESƒDC.Lƒ0’SAVE�SESSIONSAVENUMƒDC.Lƒ0’SAVE�PARTITION�#* ŠOFFSET�0TASKTNAM‚DS.Lƒ1TASKTSES‚DS.Lƒ1TASKTADR‚DS.Lƒ1TASKTESZ‚EQU„*-TASKTNAMŠPAGE ŠSECTION�8*!ŠXREF.S�BLDTASKT,TASKTCNT,TASKTBLŠXREF.S�CONVAORHŠXREF.S�CMDPRO,NEWPAGEŠXREF.S�TSKNFND,TSKNFNDE*ŠXDEFƒPONETASK PONETASK‚MOVE.L�A0,-(A7)‹SAVE�A0ŠBSR„BLDTASKT‹BUILD�TASK�TABLEŠMOVE.L�(A7)+,A0‹RESTORE�A0*!*…GET�TASK�NAME�FROM�COMMAND�LINE*ŠLEA„SAVTNAM(PC),A1ŠBSR„CONVAORH‹CONVERT�TASK�NAME)ŠBMI.S‚ONETK6�BRANCH�IF�ILLEGAL�CHARACTERŠLEA„SAVTSES(PC),A1ŠBSR„CONVAORH‹CONVERT�SESSION)ŠBMI.S‚ONETK6�BRANCH�IF�ILLEGAL�CHARACTER**…FIND�TASK�IN�TABLE*ŠLEA„TASKTBL(PC),A5ŠLEA„SAVTNAM(PC),A1)ŠMOVEM.L�(A1),D0-D1ˆTASK�NAME�AND�SESSION2ŠMOVE.W�TASKTCNT(PC),D4„NUMBER�OF�ENTRIES�IN�TABLE ŠBRA.S‚ONETK55ONETK2„CMP.L‚TASKTNAM(A5),D0„IS�THIS�THE�ONE�WE�WANT?ŠBNE.S‚ONETK4�BRANCH�IF�NOŠTST.L‚D1‘WAS�SESSION�GIVEN)ŠBEQ.S‚ONETK10ŒBRANCH�IF�NO�-�FOUND�ENTRY*ŠCMP.L‚TASKTSES(A5),D1„DOES�SESSION�MATCH?)ŠBEQ.S‚ONETK10ŒBRANCH�IF�GOOD�ENTRY�FOUND%ONETK4„LEA„TASKTESZ(A5),A5„NEXT�ENTRYONETK5„DBRAƒD4,ONETK2=ONETK6„MESGƒTSKNFND(PC),TSKNFNDE(PC)�TELL�USER�TASK�NOT�FOUND ŠBRA„CMDPRO1ONETK10ƒMOVE.L�TASKTADR(A5),A5„GET�ADDRESS�OF�TCBŠXREF.S�ONETASKŠBSR„ONETASKŒGO�PRINT�TASK�INFO ŠBRA„CMDPRO* ŠXDEFƒPTCBSŠXREF.S�TCBCHNPTCBS…BSR„NEWPAGEŠBSR„TCBCHN�PRINT�TCB�CHAIN ŠBRA„CMDPRO* ŠXDEFƒPSTCBŠXREF.S�STCBCHNPSTCB…BSR„NEWPAGE#ŠBSR„STCBCHNŒPRINT�SYSTEM�TCB�CHAINVo I  ŠBRA„CMDPRO* ŠXDEFƒPUTCBŠXREF.S�UTCBCHNPUTCB…BSR„NEWPAGE!ŠBSR„UTCBCHNŒPRINT�USER�TCB�CHAIN ŠBRA„CMDPRO* ŠXDEFƒPTRACEŠXREF.S�TRACSUBPTRACE„BSR„NEWPAGEŠBSR„TRACSUBŒPRINT�TRACE�TABLE ŠBRA„CMDPRO* ŠXDEFƒPGST ŠXREF.S�GSTBLPGST†BSR„NEWPAGE%ŠBSR„GSTBLŽPRINT�GLOBAL�SEGMENT�TABLE ŠBRA„CMDPRO* ŠXDEFƒPNNTBL ŠXREF.S�NNTBLPNNTBL„BSR„NEWPAGEŠBSR„READSP�READ�SYSTEM�PARMS#ŠBSR„NNTBLŽPRINT�NETWORK�NAME�TABLE ŠBRA„CMDPRO* ŠXDEFƒPNATBL ŠXREF.S�NATBLPNATBL„BSR„NEWPAGEŠBSR„READSP�SYSTEM�PARAMETERS&ŠBSR„NATBLŽPRINT�NETWORK�ADDRESS�TABLE ŠBRA„CMDPRO* ŠXDEFƒPLCTBL ŠXREF.S�LCTBLPLCTBL„BSR„NEWPAGE ŠBSR„READSP&ŠBSR„LCTBLŽPRINT�LOGICAL�CONNECT�TABLE ŠBRA„CMDPRO* ŠXDEFƒPPCBTBLŠXREF.S�PCBTBLPPCBTBLƒBSR„NEWPAGE$ŠBSR„READSPV2‹READ�SYSTEM�PARAMETERS'ŠBSR„PCBTBL�PRINT�PRIMARY�CONTROL�BLOCK ŠBRA„CMDPRO* ŠXDEFƒPSCBTBLŠXREF.S�SCBTBLPSCBTBLƒBSR„NEWPAGE$ŠBSR„READSPV2‹READ�SYSTEM�PARAMETERS)ŠBSR„SCBTBL�PRINT�SECONDARY�CONTROL�BLOCK ŠBRA„CMDPRO* ŠXDEFƒPUDRTBLŠXREF.S�UDRTBLPUDRTBLƒBSR„NEWPAGE"ŠBSR„READSP�READ�SYSTEM�PARAMETERS&ŠBSR„UDRTBL�PRINT�USER�DIRECTIVE�TABLE ŠBRA„CMDPRO* ŠXDEFƒPHELP ŠXREFƒHELPPHELP…BSR„NEWPAGEŠBSR„HELP�PRINT�COMMANDS ŠBRA„CMDPRO* ŠXDEFƒPFREQ ŠXREF.S�FREQPFREQ…BSR„NEWPAGE ŠBSR„READSPV2ŠBSR„FREQ�PRINT�SDLC�FREE�QUEUE ŠBRA„CMDPRO* ŠXDEFƒPUSRQ ŠXREF.S�USRQPUSRQ…BSR„NEWPAGE ŠBSR„READSPV2ŠBSR„USRQ�READ�SDLC�USER�QUEUE ŠBRA„CMDPRO* ŠXDEFƒPRECVQ ŠXREF.S�RECVQPRECVQ„BSR„NEWPAGE ŠBSR„READSPV2#ŠBSR„RECVQŽPRINT�SDLC�RECEIVE�QUEUE ŠBRA„CMDPRO* ŠXDEFƒPTMITQ ŠXREF.S�TMITQPTMITQ„BSR„NEWPAGE ŠBSR„READSPV2%ŠBSR„TMITQŽPRINT�SDLS�TRANSMIT�QUEUES ŠBRA„CMDPRO* ŠXDEFƒPUST ŠXREF.S�USTBLPUST†BSR„NEWPAGE%ŠBSR„USTBLŽPRINT�USER�SEMAPHORE�TABLE ŠBRA„CMDPRO* ŠXDEFƒPSYSPŠXREF.S�SYSPARMPSYSP…BSR„NEWPAGE$ŠBSR„SYSPARMŒPRINT�SYSTEM�PARAMETERS ŠBRA„CMDPRO* ŠXDEFƒPCCBSŠXREF.S�CRCCBS-PCCBS…BSR„CRCCBS�PRINT�CHANNEL�CONTROL�BLOCKS ŠBRA„CMDPRO* ŠXDEFƒPTIATŠXREF.S�CTRAPASGPTIAT…BSR„NEWPAGE*ŠBSR„CTRAPASG‹PRINT�TRAP�ASSIGNMENT�TABLES ŠBRA„CMDPRO* ŠXDEFƒPMAP ŠXREF.S�PRMAPPMAP†BSR„NEWPAGEŠBSR„PRMAPŽPRINT�MEMORY�MAP ŠBRA„CMDPRO* ŠXDEFƒPFREEŠXREF.S�PRFREE-PFREE…LEA„SAVENUM(PC),A1‰PLACE�TO�SAVE�PART�#ŠBSR„CONVAORH‹GET�NUMBERŠCLR.L‚D7‘DEFAULT�#�IS�0 ŠCLR.L‚D0ŠLEA„SAVENUM(PC),A1ŠMOVE.B�(A1),D0ŠCMP.B‚#$30,D0ŒIS�CHAR�<�0?ŠBLT.S‚PFREEG�IF�YES�-�USE�0ŠCMP.B‚#$39,D0ŒIS�CHAR�>�9?ŠBGT.S‚PFREEG�IF�YES�-�USE�0ŠAND.B‚#$0F,D0ŒSAVE�NUMBER�ONLYŠMOVE.L�D0,D7ŽSAVE�CHARŠLEA„SAVENUM(PC),A1ŠMOVE.B�1(A1),D0ŠCMP.B‚#$30,D0ŒIS�CHAR�<�0?ŠBLT.S‚PFREEG�IF�YES�-�USE�0ŠCMP.B‚#$39,D0ŒIS�CHAR�>�9?ŠBGT.S‚PFREEG�IF�YES�-�USE�0ŠAND.B‚#$0F,D0ŒSAVE�NUMBER�ONLY ŠMULUƒ#10,D7 ŠADD.L‚D0,D7(PFREEG„BSR„PRFREE�PRINT�FREE�MEMORY�LIST ŠBRA„CMDPRO* ŠXDEFƒPREADYŠXREF.S�READYLPREADY„BSR„NEWPAGEŠBSR„READYL�PRINT�READY�LIST ŠBRA„CMDPRO* ŠXDEFƒPDELAYŠXREF.S�DELAYLPDELAY„BSR„NEWPAGEŠBSR„DELAYL�PRINT�DELAY�LIST ŠBRA„CMDPROŠPAGE1**************************************************¯**�ALLTBL�-�PRINT�EXEC�TABLES”**¯*1************************************************** ŠXDEFƒALLTBLALLTBL„BSR„NEWPAGEŠBSR„SYSPARMŒPRINT�SYSPAR�TABLE*†BSRƒCTST10‡PRINT�STACK*ŠBSR„CTRAPASG‹PRINT�TRAP�ASSIGNMENT�TABLESŠBSR„PRMAPŽPRINT�MEMORY�MAPŠBSR„TCBCHN�PRINT�TCB�CHAIN"ŠBSR„READYL�PRINT�READY�LIST�CHAIN"ŠBSR„DELAYL�PRINT�DELAY�LIST�CHAINŠBSR„USTBLŽPRINT�USTŠBSR„GSTBLŽPRINT�GSTŠBSR„CRCCBS�PRINT�CCBSŠBSR„TRACSUBŒPRINT�TRACE�TABLE"ŠBRA„CMDPRO�RETURN�TO�COMMAND�LOOPŠENDé =/* =/*†SYSGEN.AF=/*)=/* Chain file to assemble SYSGEN utility=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to SYSGEN.LS=/*=/IFC \1ƒ=ARG�SYSGEN.LS=/ENDIF=/*"=ASM SYSGEN.SA,SYSGEN.RO,\1;RZ=160=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TCB.EQ=/*ƒ9995.&.TST.EQ=/*ƒ9995.&.CRASH.MC=/*}=/*=ENDéééééé(=/* =/*†SYSGEN.LF=/*'=/* Link chain file to create SYSGEN.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to SYSGEN.LL=/*=/IFC \1ƒ=ARG�SYSGEN.LL=/ENDIF=/*=LINK ,SYSGEN.LO,\1;HAMIX ATTRIBUTES PSEG SEG0:0,14 $0INPUT SYSGEN.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééé é1ŠPAGEŠNOLISTŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.TCB.EQŠINCLUDE�9995.&.TST.EQŠINCLUDE�9995.&.CRASH.MCŠLIST*‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.FME.EQ*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�9995.&.TCB.EQ*‰INCLUDE�9995.&.TST.EQ*‰INCLUDE�9995.&.CRASH.MC** Changes since 4.3 release:*?*‰1.�Fixed�bug�in�which�the�sysgen�utility�was�not�initializing@*�the�number�of�segments�used�field�in�the�TST�(field�TSTCSEGS).B*‰2.�Added�new�automatic�parameters�$SOPT,�and�$ROPT�which�reflect(*�the�setting�of�the�'R'�or�'P'�options.=*‰3.�Modified�equate�to�allow�nesting�of�'INCLUDE'�files�to�3 *�levels.E*‰4.�Set�the�bit�(10)�in�the�task�segment�table�(TST)�which�indicates>*�that�this�is�physical�rom.�Necessary�in�case�a�task�tries�to>*�abort�itself�and�RMS�tries�to�give�back�the�rom�memory�which?*�RMS�thinks�is�ram�unless�this�bit�is�set.�If�RMS�doesn't�know=*�that�it�is�physical�rom�the�kill�routine�will�be�invoked�by*�RMS.B*‰5.�Modified�to�ATTRIB�and�STATE�commands�can�only�affect�one�bit;*�Previously,�ATTRIB�=�'SYST'�would�set�both�bits�15�and�13?*�in�the�attributes�word�of�the�TCB�(system�task�and�critical).=*�The�new�scheme�allows�'SYST'�to�only�affect�the�system�task6*�bit.‚With�the�ATTRIB�command�you�can�specify�several:*�consecutive�commands,�each�one�affecting�a�different�bit=*�and�successive�ATTRIB�commands�need�not�destroy�information9*�set�by�previous�ATTRIB�commands.‚With�the�STATE�command=*�you�completely�wipe�out�the�effect�of�any�previously�issued=*�STATE�commands.‚The�state�command�has�the�effect�of�turning>*�one�one�bit�in�the�word�and�turning�off�all�the�others�or�of'*�turning�off�all�the�bits�in�the�word.*;*�Three�new�attributes�commands�were�added.‚ATTRIB�=�'CRIT':*�will�turn�on�the�critical�bit,‚ATTRIB�=�'NOCR'�will�turn6*�off�the�critical�bit.‚Note�that�to�have�the�critical<*�bit�be�effective�that�the�task�must�be�a�system�task.‚This3:/C.K,S:[Dc@kbsJ{1ƒa‹X“[›Z£L«Y³]»JÃ@Ë0ÓCÛDã<ëFóCûDB <:A#>;*�requirement�is�not�enforced�by�SYSGEN.‚In�other�words�you<*�are�allowed�to�set�the�critical�bit�without�being�a�system;*�task,�it�will�simply�have�no�affect�when�the�system�runs.=*�The�last�new�ATTRIB�command�is�'RTIM'�to�indicate�real�time*�task.*:*�When�a�new�TASK�command�is�encountered,�SYSGEN�no�longer@*�carries�the�old�attributes�and�state�bits�forward.‚Instead,�it3*�defaults�to�system�task,�critical,�on�ready�list.*=*‰6.�Modified�equate�to�allow�nesting�of�'INCLUDE'�files�to�4 *�levels.*4*‰7.�Modified�to�push�a�VOR�into�the�TCB�stack�area.*�MOVE.W�#$0084,TCBVOR(A0)<*�was�inserted�immediately�after�MOVE.L�LIBENT(A4),TCBPC(A0)7*�This�was�required�to�support�the�RMS68K�modifications"*�that�were�made�for�VERSAdos�4.4.* *‡122084�42*‘All�code�was�modified�where�applicable�to�ensure**‘position�independance�and�relocatability *‡010485�48*‘SPR�#1127�was�fixed;�the�mini�TCBs�no�longer�overwrite)*‘the�memory�table�in�a�ROM�based�system.*=*‰8.‚Added�code�so�that�SYSGEN�would�create�a�cross�reference9*�symbol�table�file.‚This�is�now�created�by�using�the�'C'6*�option.‚The�file�will�contain�information�about�each9*�sysgen�parameter.‚It�will�contain�the�symbol,�the�value6*�the�files�that�defined�the�symbol�and�th e�files�that8*�referenced�the�symbol.‚SGSYMBL�utility�will�need�to�be3*�run�after�SYSGEN�to�create�a�listing�file�of�this*�information.�01/10/85B******************************************************************* Changes since 4.2 release:*:*‰1.�Fixed�problem�(SPR�786)�which�was�incorrectly�parsing)*Žfile�name�on�direct�invocation�of�task.9*Ž(Example:‚The�following�line�was�not�parsed�correctly�-*Ž=:101.NET.ASM�TESTž)B*‰2.�Enhanced�so�that�user�can�specify�concatenated�files�on�input2*Žfield.‚Example:‚=SYSGEN�SYSCMD1/SYSCMD2,,LIST.LSB*‰3.�Fixed�so�that�standard�equate�file�:9995.&.TST.EQ�can�be�used2*Žinstead�of�the�special�file�:9995.SYSGEN.TST.EQ.@*ŽChanged�to�standard�equate�file�names�all�out�of�account�#9995@*‰4.�Removed�carriage�return�from�formatted�output�of�records�to8*Žlist�file.‚Before�this�was�done,�editing�the�list�file=*Žoutput�from�SYSGEN�with�the�CRT�editor�caused�garbled�lines*Žto�be�displayed.?*‰5.�Fixed�so�that�if�we�encounter�a�line�within�the�scope�of�a=*Žconditional�that�indicates�we�should�NOT�process�that�line,5*Žwe�do�not�perform�substitutions.‚Prior�to�this,�the/*Žfollowing�sequence�was�erroneously�processed:*‘IFEQ�1 *“DOG�=�2*‘ENDC*‘IFEQ�2 *“CAT�=�\DOG*‘ENDC=*ŽSysgen�complained�that�\DOG�was�undefined�when�it�shouldn't'*Žhave�processed�that�statement�anyway.@*‰6.�Fixed�so�that�any�records�encountered�in�the�sysgen�command:*Žfile�which�have�substitution�indicated�with�the�line�are7*Ždisplayed�BEFORE�the�substitution�takes�place�as�well *Žas�after.8*‰7.�Put�in�INCLUDE�file�capability�with�line�numbering.4*‰8.�Increased�maximum�literal�length�from�10�to�30.2*‰9.�Added�string�and�literal�comparison�facility.@*ˆ10.�Made�SYSGEN�multi�pass�so�you�can�use�a�symbol�before�it's *Ždefined.*ˆ11.�Added�ABORT�command.@*ˆ12.�Fix�bug�when�you�run�SYSGEN�under�user�number�0�with�a�USE=*Žof�9101�and�the�VERSADOS.SY�file�goes�to�0�instead�of�9101.>*ˆ13.�Fix�bug�of�not�detecting�symbol�table�overflow�properly.*K****************************************************************************‰Changes�since�4.0�release:*B*‰1.�SYSGEN�no�longer�terminates�with�an�error�status�when�no�boot>*Žfile�is�created.‚No�boot�file�is�not�necessarily�an�error�if:*ŽSYSGEN�is�being�used�simply�for�it's�SUBS,�ASM,�and�LINK4*Žfacility�without�producing�any�tasks�or�processes.B*‰2.�Correct�problem�of�SYSGEN�not�correctly�reflecting�the�number6*Žof�errors�encountered�in�the�RD�pseudo�register�when'*Žand�error�cause�abnormal�termination.=*‰3.�Slightly�modified�final�messages:�'START-UP�ADDRESS'�and)*Ž'TOTAL�NUMBER�OF�USER�DEFINED�SYMBOLS'.9*‰4.�Put�expression�evaluation�into�parameter�definition.=*ŽParameters�with�numeric�values�are�stored�as�a�single�ASCII,*Žhex�number�in�the�shortest�field�possible.?*‰5.�Allow�temporarily�defined�user�symbols�beginning�with�'&'.D*‰6.�When�SUBSing,�always�create�the�'X'�file�under�the�default�user;*Žnumber.‚Note�that�this�is�not�necessarily�the�same�as�the3*Žuser�number�from�which�the�raw�SUBS�file�is�read.D*‰7.�When�SUBSing,�always�create�the�'X'�file�under�the�default�user>*Žvolume�name.‚Note�that�this�name�is�not�necessarily�the�same:*Žname�as�the�volume�from�which�the�raw�SUBS�file�is�read.**=*‡***********************************************************$*‡*‹ENHANCEMENTS�SINCE�3.0�RELEASE�**‡*¹*0*‡*�1.�MISSING�ENDC�STATEMENT�ERROR�REPORTING.Ž**‡*¹*1*‡*�2.�ABORT�AND�DIAGNOSTIC�REGESTERS�HAVE�BEEN�*-*‡*„ENTERED�INTO�THE�SYMBOL�TABLE($RA,$RD).Ž**‡*¹*8*‡*�3.�ADDED�OPTION�T,�WHICH�ALLOWS�THE�USER�TO�DEFINE†*8*‡*„THE�SIZE�OF�HIS�USER�DEFINED�SYMBOL�TABLE�(DEFAULTƒ**‡*„IS�170).­**‡*¹*/*‡*�4.�ADDED�PATCHES�TO�CODE�FROM�3.0�RELEASE�**‡*¹*5*‡*�5.�ADDED�CODE�TO�DISPLAY�#�OF�SYMBOLS�IN�TABLE.‰**‡*¹*6*‡*�6.�ADDED�CODE�TO�KEEP�MAP�TABLE�FROM�OVERWRITINGˆ*4*‡*„FUNCTIONAL�PROGRAM�CODE�(NOT�IN�OVERLAY�AREA).‡*=*‡***********************************************************=*‡************************************************************ **SYSGEN BUILDS BOOT FILE**COMMAND LINE FORMAT:-*‚SYSGEN�,/,*+*…-SOURCE�FILE�CONTAINING�COMMANDS(*…-VOLUME�FOR�TEMP.�OUTPUT�FILE9*…-BOOT�LOAD�FILE�(DEFAULTS�TO�BOOT:0..VERSADOS.SY)7*…-OUTPUT�LIST�DEVICE�(DEFAULTS�TO�LOG�DEVICE) SYSGEN„IDNTƒ04,05ŽSYSGEN�COMMAND:ŠXREFƒSBARG,OPTION,PARSE,EDITFILE,BDCONV,ODATCONV,TIMECONV ŠSECTION�0B‰EQU„*’BASE�OF�SECTIONŠDC.Bƒ'011085�4'‰VERSIONVMSG†DC.Bƒ'SYSGEN�VERSION‚'(VMSGV…DC.Bƒ'Š'‡HOLDS�VERSION�FOR�DISPLAY*VTIME…DC.Bƒ'‚/‚/…:‚:‚'�HOLDS�DATE�AND�TIME VMSGE…EQU„*-1 DCNT†MACRO ŠSUB.W‚#1,\1ŠBNE„\2ŠENDM*C* PASS1 macro will perform a branch if we are not on the last pass.&*ƒWe�are�on�one�of�the�initial�passes.*+PASS1…MACRO•Bypass�branch�on�initial�passesŠMOVE.W�PASS(PC),-(A7) ŠTST.W‚(A7)+ ŠBPL.\0�\1ŠENDM*?* PASSL macro will perform a branch if we are on the last pass.*&PASSL…MACRO•Bypass�branch�on�last�passŠMOVE.W�PASS(PC),-(A7) ŠTST.W‚(A7)+ ŠBMI.\0�\1ŠENDMŠPAGE**EQUATES*F*�INCLMAX�defines�the�maximum�nesting�level�for�include�files.‚Setting5*„it�to�1�will�allow�one�level�of�include�to�be�used.:INCLMAXƒEQU„4…10/01/84…Maximum�nesting�level�for�includes.CFLUN…EQU„1’LU�FOR�COMMAND�FILE$TFLUN…EQU„2’LU�FOR�TEMP.�OUTPUT�FILEBFLUN…EQU„3’LU�FOR�BOOT�FILELSLUN…EQU„4’LU�FOR�LIST�DEVICEBSFLUN…EQU„3†LU�FOR�SUBSTITUTE�FILE�AND�ASM/LINK�SOURCE�AND�LO�FILE)XSFLUN„EQU„7’LU�FOR�NEW�FILE�SUBSTITUTION-SYLUN…EQU„8’LU�for�symbol�table�file�01/10/854SUBMAX„EQU„10‘MAX�RECURSION�DEPTH�IN�SUBS�PROCESSING%PARLEN„EQU„8’MAX.�LENGTH�OF�PARAMETER"VALLEN„EQU„30‘MAX.�LENGTH�OF�VALUE$NOPAR…EQU„170�MAX.�NO.�OF�PARAMETERS#MINPAR„EQU„0’MIN.�NO.�OF�PARAMETERS@NOTASKSƒEQU„40ŠMAX.�NO.�OF�LINES�IN�TASK�MAP�THAT�CAN�BE�PRINTED*FORMAT OF SYMBOL TABLE ENTRY ŠOFFSET�0!PARMAM„DS.BƒPARLEN�Parameter�nameVALUE…DS.BƒVALLEN�ValuePLEN†DS.Bƒ1’Parameter�lengthVLEN†DS.Bƒ1’Value�lengthPFLAG…DS.Wƒ1’Flag�word SYMLEN„EQU„*&PPASL…EQU„0’Set�=�defined�on�last�pass ŠSECTION�0 *CRˆEQU„$D‘CARRIAGE�RETURN LFˆEQU„$AFFˆEQU„$C‘FORM�FEEDAPOS†EQU„$27�APOSTROPHE*OFFSETS TO START-UP REGISTERS.DUV‡EQU„2*4�OFFSET�TO�USER�DEFAULT�VOLUME�(D2)/DUN‡EQU„3*4+2ŽOFFSET�TO�DEFAULT�USER�NO.�(D3.W)-DUC‡EQU„4*4�OFFSET�TO�DEFAULT�CATALOG�(D4,D5)!TNˆEQU„8*4�OFFSET�TO�SESSION�(A0)CLˆEQU„6*4�COMMAND�LENGTH�(D6)CTˆEQU„0*4�CALLER�TASK�(D0)!CSESS…EQU„1*4�CALLER�SESSION�(D1)*-ASQLEN„EQU„22‘LENGTH�OF�TASK�COMPLETION�EVENT**OFFSETS IN LIBLIBTSK„EQU„0’TASK"LIBMON„EQU„10‘MONITOR�TASK/SESSIONLIBENT„EQU„22‘TASK�ENTRY�PT.+LIBSAD„EQU„48‘START�OF�SEGMENT�ALLOC.�DESC."LIBSADLN‚EQU„16‘LENGTH�OF�EACH�SAD!LIBMIDLN‚EQU„4’LENGTH�OF�EACH�MID+NOSAD…EQU„8’NO.�OF�SEGMENT�ALLOCATION�DESC.%SADATT„EQU„2’OFFSET�TO�SAD�ATTRIBUTES#SADNAM„EQU„4’OFFSET�TO�SEGMENT�NAME$SADSTR„EQU„8’OFFSET�TO�SEGMENT�START&SADLEN„EQU„12‘OFFSET�TO�SEGMENT�LENGTH*LIBMID„EQU„176�START�OF�MEMORY�IMAGE�DESC.NOMID…EQU„20‘NO.�OF�MID'S$MAXSEG„EQU„4’MAXIMUM�NO.�OF�SEGMENTSŠPAGE** MINI TCB FORMAT* ŠOFFSET�0MTCB†DS.Bƒ4’!TCBMTCBNAME‚DS.Bƒ4’TASK�NAMEMTCBSESSN�DS.Bƒ4’TASK�SESSION MTCBMONƒDS.Bƒ4’MONITOR�TASK�NAMEŠDS.Bƒ4’MONITOR�TASK�SESSIONMTCBUSER‚DS.Bƒ2’USER�NUMBERMTCBLPRI‚DS.Bƒ1’PRIORITYŠDS.Bƒ1’UNUSEDMTCBSTATE�DS.Bƒ2’STATEMTCBATTR‚DS.Bƒ2’ATTRIBUTESMTCBENTRY�DS.Bƒ4’ENTRY�ADDRESSMTSTMMUƒDS.Bƒ32‘TST�MMU�INRO)TSTMMUSZ‚EQU„*-MTSTMMUŠ#BYTES�IN�MMU�INFOMTSTATTR‚DS.Bƒ32‘TST�ATTRIBUTES,TSTATTRSZ�EQU„*-MTSTATTR‰#BYTES�IN�ATTR�INFOMTCBLN„EQU„*’LENGTH�OF�MINI-TCB ŠSECTION�0%ŠDS.Lƒ20‘Expression�evaluation�stack.EXPSTACK‚DC.Lƒ07STAKSAVƒDS.Lƒ1’Save�for�stack�value�on�expression�eval.ŠDS.Lƒ40‘STACK�AREA STACK…EQU„*** OPTION FLAGS*3ROPT†EQU„0’'R'�OPTION�(READ�ONLY�MODE�FOR�ALL�CODE),POPT†EQU„1’'P'�OPTION�(PHYSCAL�ADDRESS�MODE)&SOPT†EQU„2’'S'�OPTION�(SKIP�-�RESTART)-TOPT†EQU„3’'T'�OPTION�(SET�SYMBOL�TABLE�SIZE),COPT†EQU„4’'C'�OPTION�(CROSS�REFERENCE�FILE)OPTFLG„DC.Bƒ0’OPTION�FLAG�BYTE+OPTSZE„DC.LƒNOPARŽDEFAUL T�SYMBOL�TABLE�SIZE* * Misc. flags* MSCFLG„DC.Wƒ0.INSTF…EQU„0’Set�=�symbol�inserted�on�this�pass5UNDEF…EQU„1’Undefined�symbol�encountered�on�this�pass*G*�PASS�is�initially�set�to�1�for�the�first�pass.‚On�the�last�pass,�PASSG*ƒis�set�to�-1.‚Initial�passes�are�performed�until�one�of�the�following*ƒconditions�takes�place:8*…1.�No�undefined�symbols�were�encountered�on�this�pass..*…2.�No�new�symbols�were�defined�on�this�pass.C*ƒWhen�all�the�initial�passes�have�been�perfomred,�the�last�pass�is *ƒperformed.*-PASS†DC.Wƒ0’Save�for�pass�number�(pos�or�neg)&MAPF†EQU„0’MAP�TABLE�OVERFLOW�FLAG�BIT*MAPFLG„DC.Bƒ0’MAP�TABLE�OVERFLOW�FLAG�WORD'SUBDUN„EQU„0’FLAG�FOR�SUBSTITUTION�DONESUBFLG„DC.Wƒ0’SUBS�FLAG�WORD(SUBCNT„DC.Wƒ0’RECURSION�COUNTER�FOR�SUBS-ERRCNT„DC.Wƒ0’ERROR�COUNTER�FOR�FINAL�MESSAGE*#* GET DATE AND TIME PARAMETER BLOCK* TIMBLK„DS.Lƒ1’RETURNS�DAY�NUMBER ŠDS.Lƒ1’RETURNS�MS�PAST�MIDNIGHT*'* MEMORY SEGMENT BLOCK FOR SYMBOL TABLE*MSBSYM„DC.Lƒ0’TASK�NAMEŠDC.Lƒ0’SESSION�NUMBERŠDS.Wƒ1’DIRECTIVE�OPTIONŠDC.Wƒ0’SEGMENT�ATTRIBUTESŠDC.Lƒ'SMTB'�SEGMENT�NAMEŠDC.Lƒ0’LOGICAL�ADDRESSŠDS.Lƒ1’SEGMENT�LENGTH*'* ERROR MESSAGE HANDLER PARAMETER BLOCK*4ERRPBLKƒDC.Lƒ0’USER�REG�D0�CONTAINS�ERRMSG�KEY�VALUE-ŠDC.Lƒ0’USER�REG�A0�POINTS�AT�I/O�CONTROL�BLK3ERRPOPTƒDC.Bƒ0’ERROR�OPTIONS�[BIT�0=QUERY�RESPONSE].ERRPLDFƒDC.BƒLDFLUN�USER�LDFLUN�LUN�FOR�SCREEN%ERRPQUYƒDC.Bƒ0’QUERY�RETURN�CHARACTER,ERRPCDFƒDC.BƒCDFLUN�USER�CDFLUN�FOR�KEYBOARD0ERRPLUGB‚DC.Lƒ0’BEGINNING�OF�USER�TEXT�PLUG�POOL*ERRPLUGE‚DC.Lƒ0’END�OF�USER�TEXT�PLUG�POOL)*FHS�Block�for�symbol�table�file„01/10/85SYMFHS„DC.WƒFHDELTŠDC.WƒFOPISD+FOPEREW ŠDC.Bƒ0,SYLUN ŠDC.Bƒ'„'ŠDC.Wƒ0 ŠDC.Bƒ'ˆ'ŠDC.Bƒ'SGSYMS‚' ŠDC.Bƒ'SY'ŠDC.Wƒ0 ŠDC.Bƒ0,0ŠDC.Wƒ0ŠDC.Lƒ0 *FHS BLOCK FOR TASK/PROCESS FILETSKFHS„DC.WƒFHASGN ŠDC.WƒFOPER ŠDC.Bƒ0,SFLUN ŠDC.Bƒ'„'ŠDC.Wƒ-1 ŠDC.Bƒ'ˆ' ŠDC.Bƒ'ˆ' ŠDC.Bƒ'LO'ŠDC.Wƒ0 ŠDC.Bƒ0,0ŠDC.Wƒ0ŠDC.Lƒ0*FHS BLOCK FOR COMMAND FILECMDFHS„DC.WƒFHASGN'*****************TEMP.***************** ŠDC.WƒFOPPR *DC.W FOPEREW ŠDC.Bƒ0,CFLUN ŠDC.Bƒ'„'ŠDC.Wƒ-1 ŠDC.Bƒ'ˆ' ŠDC.Bƒ'ˆ' ŠDC.Bƒ'SA'ŠDC.Wƒ0 ŠDC.Bƒ0,0ŠDC.Wƒ0ŠDC.Lƒ0$*FHS BLOCK FOR TEMPORARY OUTPUT FILETMPFHS„DC.WƒFHALLO+FHASGNŠDC.WƒFOPEREW+FOPSEQ ŠDC.Bƒ0,TFLUN ŠDC.Bƒ'„'ŠDC.Wƒ-1 ŠDC.Bƒ'ˆ' ŠDC.Bƒ'&‡' ŠDC.Bƒ'‚'ŠDC.Wƒ0 ŠDC.Bƒ0,0ŠDC.Wƒ256�RECORD�LENGTHŠDC.Lƒ0*FHS BLOCK FOR BOOT FILEBOOTFHSƒDC.WƒFHALLO+FHASGNŠDC.WƒFOPEREW+FOPCON ŠDC.Bƒ0,BFLUN ŠDC.Bƒ'„'ŠDC.Wƒ-1 ŠDC.Bƒ'ˆ'ŠDC.Bƒ'VERSADOS' ŠDC.Bƒ'SY'ŠDC.Wƒ0 ŠDC.Bƒ0,0ŠDC.Wƒ0ŠDC.Lƒ0’LENGTH�OF�BOOT�FILE7*FHS BLOCK FOR LIST DEVICE AND SOURCE FILES IN COMMANDSLISFHS„DC.WƒFHASGNŠDC.WƒFOPPW+FOPOVRT+FOPSEQ ŠDC.Bƒ0,LSLUN ŠDC.Bƒ'„'ŠDC.Wƒ-1 ŠDC.Bƒ'ˆ' ŠDC.Bƒ'ˆ' ŠDC.Bƒ'SA'ŠDC.Wƒ0 ŠDC.Bƒ0,0ŠDC.Wƒ0ŠDC.Lƒ0*FHS BLOCK TO FREE CDFLUNFREFHS„DC.WƒFHCLOSŠDC.Wƒ0ŠDC.Bƒ0,CDFLUN ŠDC.Bƒ'„'ŠDC.Wƒ-1 ŠDC.Bƒ'ˆ' ŠDC.Bƒ'ˆ' ŠDC.Bƒ'‚'ŠDC.Wƒ0 ŠDC.Bƒ0,0ŠDC.Wƒ0ŠDC.Lƒ0(*FHS BLOCK FOR SUBSTITUTION CREATED FILEŠFHS.SUB,CMDBUFN0‚DCB.B‚6,'�'ŽFor�global�line�numbers0CMDBUFNƒDCB.B‚6,'�'ŽFor�line�numbers�within�file&ŠDS.Bƒ2’FOR�LEADING�'.�'�IF�PROCESSING+CMDBUF„DS.Bƒ80‘BUFFER�FOR�COMMAND�FILE�REC.CMDBUFEƒEQU„*-1ŠDC.BƒCR‘RECORD�ENDS�WITH�CRŠDS…0*BUFFER FOR TCB AND TST,SUBBUF1ƒDS.Lƒ1’BASE�ADDRESS�OF�SECTOR�BUFFER+SUBBUF2ƒDS.Lƒ1’END�ADDRESS�OF�SECTOR�BUFFERTCBBLK„DS.Bƒ256?*SUB. INPUT FILE RECORD AND SECTOR BUFFER FOR TASK/PROCESS FILESUBBUF„DS.Bƒ256TCBBLKLƒEQU„*-TCBBLK&ŠDC.BƒCR‘MAKE�SURE�RECORD�ENDS�WITH�CRŠDS…0!LIBLK…DS.Bƒ256�LOADER�INFO.�BLOCKLIBLKE„EQU„*-1#*IOS�Block�for�symbol�fileƒ01/10/85ŠIOS.SYM�IOWRIT,IOPRRN,SYLUN,0)*IOS BLOCK FOR COMMAND FILE AND BOOT FILE BOOTIOSƒEQU„*$ŠIOS.CMD�IOREAD,IOPPOS,CFLUN,,-1,0,0*IOS BLOCK FOR TEMPORARY FILEŠIOS.TMP�IOWRIT,0,TFLUN+*IOS BLOCK FOR LIST FILE AND CONSOLE OUTPUTŠIOS.OUT�IOWRIT*IOS BLOCK FOR CONSOLE INPUTŠIOS.IN�IOREAD,0,CDFLUN,0,0,0,0N*I OS BLOCK FOR SUBSTITUTION SOURCE FILE,LINK CHAIN FILE, AND TASK/PROCESS FILEŠIOS.SUBS�IOREAD,0,SFLUN&*IOS BLOCK FOR SUBSTITUTION DEST. FILEŠIOS.SUBX�IOWRIT,0,XSFLUN,,,0*#* INCLUDE file processing data area!GLOBCNTƒDC.Lƒ0’Global�line�number%INCLNEST‚DC.Wƒ0’Current�nesting�level*CMDLNE USED FOR SUBSTITUTION OUTPUT AND ASM/LINK COMMAND LINE'COMMSG„DC.Bƒ'COMMAND�LINE�PARAMETERS:‚'CMDLNE„COMLINE�160�COMMAND�LINECMDLNL„EQU„*-CMDLNE,COMEND„DC.Lƒ0’SAVE�ADDR�FOR�COMMAND�LINE�END,CMDLNE1ƒDS.Lƒ1’ADDRESS�OF�COMMAND�LINE�BEGIN*CMDLNE2ƒDS.Lƒ1’ADDRESS�OF�COMMAND�LINE�END)EDITSVA0‚DS.Lƒ1’Save�for�A0�from�EDITFILE(EDITRTNƒDS.Lƒ1’Save�for�D0�from�EDITFILE1MONITORƒDS.Lƒ1’Save�for�task�name�that�started�me%REPLY…DS.Bƒ80‘RESTART�SUBSTRING�REPLYREPLYE„EQU„*-12BASEADDR‚DC.Lƒ0’BASE�ADDRESS�FOR�BOOT�FILE�SEGMENT;TPSW†DC.Lƒ0�0/1/-1->NOTHING/TASK�IN�PROCESS/PROCESS�IN�PROC8SEC0SW„DC.Lƒ0’0/1->BOOT�SECTOR�0�NOT�PROCESSED/PROCESSED/LDFLG…DC.Bƒ0’INDICATES�IF�LIST�DEVICE�SPECIFIED4SEGFLG„DC.Bƒ0’INDICATES�SEGMENT�DIRECTIVE�IN�PROCESS9SEGCNT„DC.Wƒ0’INIDCATES�NUMBER�OF�SEGMENT�BEING�PROCESSED&FSTART„DC.Lƒ0’SEGMENT�STARTING�ADDRESS5TSKTCB„DC.Lƒ0’SAVE�ADDRESS�FOR�TCB�DISPLAY�IN�MESSAGE#TSKLST„DC.Lƒ0’NEXT�AVAIL�TASK�SPACE#CLC‡DC.Lƒ0’CURRENT�LOCATION�COUNTER,CMDLGH„DC.Lƒ0’LENGTH�OF�READ�IN�COMMAND�LINE0REPLGH„DC.Lƒ0’LENGTH�OF�KEYED�IN�SUBSTRING�REPLY*B* VARIABLES USED IN COPYING FROM TEMPORARY FILE TO FINAL BOOT FILE*SREC†DC.Lƒ0’SOURCE�RRN�FROM�TEMPORARY�FILE(DREC†DC.Lƒ0’DESTINATION�RRN�IN�BOOT�FILE.TREC†DC.Lƒ0’RRN�TO�WRITE�NEXT�MINI-TCB�FRAM�TO5BNIN†DC.Lƒ0’NEXT�IN�POINTER�ADDRESS�TO�MINI-TCB�FRAME1STARTTCB‚DC.Lƒ0’BASE�ADDRESS�OF�TCB'S�IN�ROM�FILE+PLCTCB„DC.Wƒ0’NUMBER�OF�TCB'S�PLACED�SO�FAR8NXTTCB„DC.Lƒ0’POINTS�TO�SUCCESSIVELY�LOWER�TCB'S�IN�TEMP7TSKCNT„DC.Wƒ0’COUNT�OF�TCB�BLOCKS�PROCESSED�FOR�'R'�OPT*"* BUFFER FOR PROCESSING MINI TCB'S3ŠDS.BƒMTCBLN�OVERFLOW�BUFFER�FOR�STAGING�MINI-TCB'S BBASE…EQU„*#ŠDS.Bƒ256�I/O�BUFFER�FOR�MINI-TCB'S'BBASE1„DS.Lƒ1’HOLDS�BUFFER�BASE�ADDRESS(BBASE2„DS.Lƒ1’HOLDS�BUFFER�END�ADDRESS+1*EXCLUDED SEGMENT LIST2EXCLNUMƒDC.Wƒ0’CURRENT�NUMBER�OF�EXCLUDED�SEGMENTSEXCLLSTƒDCB.L‚MAXSEG,00SYMADR„DS.Lƒ1’HOLDS�TABLE�BASE�ADDRESS�(DYNAMIC)SYMSTR„EQU„*’SYMBOL�TABLE�START)ŠDC.Bƒ'$TCBLST�'‰STE�FOR�TCB�LIST�POINTERS‰SET„*TCBLP…DC.Bƒ'$00000000�'ŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ7,9 ŠDC.Wƒ0’Flags*+ŠDC.Bƒ'$TCBRDY�'‰STE�FOR�TCB�READY�LIST�PTRS‰SET„*TCBRP…DC.Bƒ'$00000000�'ŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ7,9 ŠDC.Wƒ0’Flags*>* NOTE THAT DATE AND TIME MUST REMAIN CONTIGUOUS IN MEMORY FOR*ƒPROPER�INITIALIZATION*ŠDC.Bƒ'$DATEƒ'3DATE†DCB.B‚VALLEN,'�'‰YYMMDD�IS�DYNAMICALLY�STUFFED ŠDC.Bƒ5,6 ŠDC.Wƒ0’Flags**ŠDC.Bƒ'$TIMEƒ'‰HHMM�IS�DYNAMICALLY�STUFFEDTIME†DCB.B‚VALLEN,'�' ŠDC.Bƒ5,4 ŠDC.Wƒ0’Flags*>* DIAGNOSTIC AND ABORT REGESTERS FOR SYSCMD FILE TO CHECK WHEN* USING ASM/LINK.* ŠDC.Bƒ'$RD…'S‰SET„*+DIAG†DC.Bƒ'$0000…'‡DIAGNOSTIC�CODE�REGESTERŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ3,5 ŠDC.Wƒ0’Flags* ŠDC.Bƒ'$RA…'S‰SET„*&ABRT†DC.Bƒ'$0000…'‡ABORT�CODE�REGESTERŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ3,5 ŠDC.Wƒ0’Flags*ŠDC.Bƒ'USER„'‰USER�parameterS‰SET„*ŠDC.Bƒ'$0000…'ŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ4,5 ŠDC.Wƒ0’Flags*"ŠDC.Bƒ'SESSION�'‰SESSION�parameterS‰SET„*ŠDC.Bƒ'$0000…'ŠDCB.B‚VALLEN-(*-S),'�' ŠDC. Bƒ7,5 ŠDC.Wƒ0’Flags*#ŠDC.Bƒ'PRIORITY'‰PRIORITY�parameterS‰SET„* ŠDC.Bƒ'$0ˆ'ŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ8,2 ŠDC.Wƒ0’Flags*ŠDC.Bƒ'PC†'‰PC�parameterS‰SET„* ŠDC.Bƒ'$0ˆ'ŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ2,2 ŠDC.Wƒ0’Flags*#ŠDC.Bƒ'$ROPTƒ'‰'R'�option�parameterS‰SET„*ROPTF…DC.Bƒ'$0ˆ'ŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ5,2 ŠDC.Wƒ0’Flags*#ŠDC.Bƒ'$POPTƒ'‰'P'�option�parameterS‰SET„*POPTF…DC.Bƒ'$0ˆ'ŠDCB.B‚VALLEN-(*-S),'�' ŠDC.Bƒ5,2 ŠDC.Wƒ0’Flags*1PDEF†EQU„*-SYMSTR‹END�OF�PREDEFINED�TABLE�ENTRIESSYMSTR1ƒDC.Lƒ1 SYMEND„DC.Lƒ06SYMCNT„DC.Wƒ0’Number�of�symbols�during�sysgen�01/10/85(NXTSYM„DC.Lƒ0’ADDR.�OF�NEXT�AVAIL.�SPACETCBLST„DC.Lƒ0’TCB�LIST�PTR TCBRDY„DC.Lƒ0’TCB�READY�LIST�PTR$PROCSTRƒDC.Lƒ0’START�OF�LAST�PROCESSGATTR†DC.Wƒ1<-1=NOT�PROCESSING*IFXXT…DS.Lƒ1’ADDRESS�OF�COMPARISON�ROUTINE**TASK COMPLETION EVENTTCOMBLKƒDS.BƒASQLEN*PARAMETER BLOCK TO SET UP ASQASQBLK„DC.Lƒ0,0�TASK/SESSIONŠDC.Bƒ0,ASQLEN ŠDC.LƒASQLENŠDC.Lƒ0’ADDR.�OF�ASR�(TSKCOM)ŠDC.Lƒ02MMUPO…DS.WƒMAXSEG�PHYSICAL�OFFSET�FOR�EACH�SEGMENTŠPAGE**LOADER PARAMETER BLOCK*LDRBLKŠDC.Lƒ0,0�TASK�NO.,�SESSION1ŠDC.Wƒ$8000ŽCREATE�TCB�OPTION�(MONITOR�SPECIFIED)ŠDC.Lƒ0,0�MONITOR�IS�SELFŠDC.Bƒ0,0�INITIAL/LIMIT�PRIORŠDC.Wƒ0’CREATE�TCB�TASK�ATTRIB.ŠDC.Lƒ0’TASK�ENTRY�POINTŠDC.Wƒ0’TASK�USER�ID.ŠDC.Wƒ$6030ŽLOADER�OPTIONS�USE�PASSED�PRIORITY!LDRCLL„DC.Bƒ0’COMMAND�LINE�LENGTHŠDC.Bƒ0’REQUESTOR'S�LUN ŠDC.Lƒ0,0LDRCL…DC.Lƒ0’COMMAND�LINE�ADDR. *FHS BLOCKLDRFHS„DC.Wƒ0,0 ŠDC.Bƒ0,0ŠDC.Bƒ'„'�VOLUMEŠDC.Wƒ0’USER�NO.ŠDC.Bƒ'ˆ'‰CATALOGLDRFN…DC.Bƒ'ˆ'‰NAME ŠDC.Bƒ'LO'ŠDC.Wƒ0 ŠDC.Bƒ0,0ŠDC.Lƒ0*"*PARAMETER BLOCK FOR TASK START UP*STRBLKŠDC.Lƒ0,0�TASK/SESSION#ŠDC.Wƒ$A000ŽNEW�MONITOR,�PASS�REGS.ŠDC.Lƒ0,0�MONITOR�IS�SELF*REGISTERS MUST FOLLOW"SAVEREGƒDS.Bƒ60‘START�UP�REGISTERS)DEFVOLNƒEQU„SAVEREG+8ŠDefault�volume�name1DEFUSRNƒEQU„SAVEREG+14‰Default�user�number�(SUBS)7CNID†EQU„SAVEREG+36‰POINTS�TO�A1�SAVE�LOC�(TERMINAL�ID)ŠPAGE**TABLE OF VALID COMMANDS**FORMAT:*„8�BYTE�COMMAND�NAME*…2�BYTE�ADDR.�OF�ROUTINECMDTBL ŠDC.Bƒ'TASK„' ŠDC.LƒTSK-BŠDC.Bƒ'PROCESS�' ŠDC.LƒPRC-BŠDC.Bƒ'SEGMENT�' ŠDC.LƒSEG-B ŠDC.Bƒ'MSG…' ŠDC.LƒMSG-BŠDC.Bƒ'PAUSEƒ' ŠDC.LƒPSE-B ŠDC.Bƒ'PC†' ŠDC.LƒPPC-B ŠDC.Bƒ'SUBS„' ŠDC.LƒSUBS-B ŠDC.Bƒ'ASM…' ŠDC.LƒASM-B ŠDC.Bƒ'LINK„' ŠDC.LƒLNK-B ŠDC.Bƒ'USER„' ŠDC.LƒUSR-BŠDC.Bƒ'SESSION�' ŠDC.LƒSES-BŠDC.Bƒ'STATEƒ' ŠDC.LƒSTE-BŠDC.Bƒ'PRIORITY' ŠDC.LƒPRI-BŠDC.Bƒ'EXCLUDE�' ŠDC.LƒEXCL-BŠDC.Bƒ'ATTRIB‚' ŠDC.LƒATT-B ŠDC.Bƒ'END…' ŠDC.LƒEND-BŠDC.Bƒ'ABORTƒ' ŠDC.LƒABT-B<* Only the following commands are executed on initial passesPASS1C„DC.Bƒ'IFEQ„' ŠDC.LƒIFEQC-B ŠDC.Bƒ'IFNE„' ŠDC.LƒIFNEC-B ŠDC.Bƒ'IFLT„' ŠDC.LƒIFLTC-B ŠDC.Bƒ'IFLE„' ŠDC.LƒIFLEC-B ŠDC.Bƒ'IFGT„' ŠDC.LƒIFGTC-B ŠDC.Bƒ'IFGE„' ŠDC.LƒIFGEC-B ŠDC.Bƒ'ENDC„' ŠDC.LƒENDCC-BŠDC.Bƒ'INCLUDE�' ŠDC.LƒINCL-BŠDC.Lƒ0’END�OF�LISTŠPAGE*I* Macro sets up byte in attribute or state table corresponding to desiredF*ƒbit�to�be�affected�in�the�associated�state�or�attribute�field�in�theE*ƒTCB.‚If�the�bit�is�to�be�turned�off,�the�bit�value�will�be�negated.* SETW†MACROŠIFC„'ON','\1' �DC.Bƒ\2,0ŠENDCŠIFC…'OFF','\1' �DC.B„-\2,0ŠENDCŠENDM**TABLE OF VALID STATES**FORMAT:?*…4�BYTE�ASCII�STATE�(mnemonic�following�STATE�command�example:*›STATE�=�'DORM'*…1�WORD�STATE�VALUE=*‰Byte�1:‚Bit�number�affected�in�state�word.‚If�negative�then-*”turn�bit�off.‚If�positive�then�turn�bit�on.*‰Byte�2:‚Reserved�(value�=�0)STETBLŠDC.Bƒ'DORM'�DORMANTŠSETWƒON,TSKSDORM ŠDC.Bƒ'SUSP'�SUSPENEDŠSETWƒON,TSKSSUSPŠDC.Bƒ'WAIT'�WAIT�(Blocked)ŠSETWƒON,TSKSBLCKŠDC.Bƒ'READ'�READYŠSETWƒON,TSK2NRDYŠDC.Lƒ0’END�OF�LISTŠPAGE**TABLE OF VALID ATTRIBUTES**FORMAT:*…4�BYTE�ASCII�ATTRIBUTE*…2�BYTE�ATTRIBUTE�VALUE*FORMAT:D*…4�BYTE�ASCII�ATRRIBUTE�(mnemonic�following�ATTRIB�command�example:*›ATTRIB�=�'USER'*…2�BYTE�ATTRIBUTE�VALUE=*‰Byte�1:‚Bit�number�affected�in�state�word.‚If�negative�then-*”turn�bit�off.‚If�positive�then�turn�bit�on.*‰Byte�2:‚Reserved�(value�=�0)ATTTBLŠDC.Bƒ'USER'�USER�TASK&ŠSETWƒOFF,TSKASYST‡Turn�off�system�bitŠDC.Bƒ'SYST'�SYSTEM�TASKŠSETWƒON,TSKASYSTŠDC.Bƒ'CRIT'�CRITICAL5ŠSETWƒON,TSKACRITˆCritical�to�OS�crash�if�task�abortsŠDC.Bƒ'NOCR'�NOT�CRITICAL0ŠSETWƒOFF,TSKACRIT‡Don't�crash�OS�if�task�abortsŠDC.Bƒ'RTIM'�REAL�TIMEŠSETWƒON,TSKARTIMŠDC.Lƒ0’END�OF�LISTŠPAGE**MESSAGES THAT ABORT*MSG3†DC.Bƒ'INPUT�FILE�REQUIRED' MSG3E…EQU„*-1ŠDS.Lƒ0#MSG4†DC.Bƒ'TEMP.�FILE�VOLUME�ERROR' MSG4E…EQU„*-1ŠDS.Lƒ0MSG5†DC.Bƒ'INPUT�FILE�ERROR' MSG5E…EQU„*-1ŠDS.Lƒ0MSG6†DC.Bƒ'BOOT�FILE�ERROR' MSG6E…EQU„*-1ŠDS.Lƒ0"MSG7†DC.Bƒ'LIST�DEVICE/FILE�ERROR' MSG7E…EQU„*-1ŠDS.Lƒ0!MSG8†DC.Bƒ'SYMBOL�TABLE�OVERFLOW' MSG8E…EQU„*-1ŠDS.Lƒ0/MSG9†DC.Bƒ'SEGMENT�END�LESS�THAT�SEGMENT�START' MSG9E…EQU„*-1ŠDS.Lƒ05MSG10…DC.Bƒ'SEGMENT�START�LESS�THAN�LOCATION�COUNTER'MSG10E„EQU„*-1ŠDS.Lƒ0MSG11…DC.Bƒ'TOO�MANY�SEGMENTS'MSG11E„EQU„*-1ŠDS.Lƒ02MSG12…DC.Bƒ'START�OF�SEGMENT�NOT�ON�PAGE�BOUNDARY'MSG12E„EQU„*-1ŠDS.Lƒ0*MSG13…DC.Bƒ'SEGMENT/MEMORY�IMAGE�CONFLICT'MSG13E„EQU„*-1ŠDS.Lƒ0#MSG14…DC.Bƒ'NO�OUTPUT�FILE�CREATED'MSG14E„EQU„*-1ŠDS.Lƒ0%MSG15…DC.Bƒ'UNMATCHED�ENDC�STATEMENT'MSG15E„EQU„*-1ŠDS.Lƒ0#MSG16…DC.Bƒ'MISSING�ENDC�STATEMENT'MSG16E„EQU„*-1ŠDS.Lƒ07MSG17…DC.Bƒ'SYMBOL�TABLE�SIZE�VIALATION,MUST�BE�0-9999'MSG17E„EQU„*-1ŠDS.Lƒ0%MSG18…DC.Bƒ'SEGMENT�ALLOCATION�ERROR'MSG18E„EQU„*-1ŠDS.Lƒ0;MSG19…DC.Bƒ'MEMORY�UNAVAILABLE�FOR�ALLOCATION�AT�THIS�TIME'MSG19E„EQU„*-1ŠDS.Lƒ0+MSG20…DC.Bƒ'EXCEEDED�INCLUDE�NESTING�LEVEL'MSG20E„EQU„*-1ŠDS.Lƒ0.MSG21…DC.Bƒ'SYNTAX�ERROR�ON�INCLUDE�FILE�NAME'MSG21E„EQU„*-1ŠDS.Lƒ0MSGT†DC.Bƒ'XXXX�ABORTED.�D0='MSGTA…DC.Bƒ'XXXX' MSGTE…EQU„*-1ŠDS.Lƒ0AMAPFM…DC.Bƒ'******�MAP�ENTRIES�MISSING,�CAN�ONLY�LIST�40�*******'MAPFME„EQU„*-1ŠDS.Lƒ0"MSGD†DC.Bƒ'-�START-UP�ADDRESS�=�$'MSGD1…DC.Bƒ'XXXXXX' MSGDE…EQU„*-1ŠDS.Lƒ04MSGOT…DC.Bƒ'TOTAL�NUMBER�OF�USER�DEFINED�SYMBOLS�=‚'MSGOT1„DC.Bƒ'XXXX'MSGOTE„EQU„*-1ŠDS.Lƒ0 MSGP†DC.Bƒ'-�FINAL�PC�VALUE�=�$'MSGFPC„DC.Bƒ'XXXXXX' MSGPE…EQU„*-1ŠDS…0&INCMSG1ƒDC.Bƒ'-�BEGIN�INCLUDE�FILE�-�'INCMSG1I‚DCB.B‚30,'�'INCFILSZ‚EQU†*-INCMSG1IINCMSG1E‚EQU„*-1ŠDS…0!INCMSG2ƒDC.Bƒ'-�RESUMING�FILE�-�'INCMSG2I‚DCB.B‚30,'�'INCMSG2E‚EQU„*-1ŠDS…00FILMSG1ƒDC.Bƒ'-�PROCESSING�COMMAND�LINE�FILE�-�'FILMSG1I‚DCB.B‚30,'�'FILMSG1E‚EQU„*-1ŠDS…0*ŠPAGE*4*PRINT ERROR MESSAGE ON LOG AND LIST DEVICE AND STOP7ERR1†MOVE.L�#EM_NVE,D0‰COMPLAIN�OF�COMMAND�SYNTAX�ERRORERR1.5„BSR„ERRMSGŠBRA.S‚ERRTERMERR0†BSR„LOGLIS** Error termination*@ERRTERMƒMOVE.W�ERRCNT(PC),D0†Number�of�errors�encountered�so�far(ŠADD.W‚#1,D0ŽBump�by�one�for�this�error.:ŠOR.Wƒ#$C000,D0ŠSet�error�code�bits�for�RD�pseudo�registerŠSWAPƒD0 ŠSUB.L‚A0,A0"ŠMOVE.W�#TERM,D0‹Error�terminationŠTRAPƒ#1*%ERR2†MOVE.L�#EM_NVO,D0‰INVALID�OPTION ŠBRA.S‚ERR1.5(ERR3†LEA„MSG3(PC),A1ŒINPUT�FILE�REQUIREDŠLEA„MSG3E(PC),A2 ŠBRA.S‚ERR0,ERR4†LEA„MSG4(PC),A1ŒTEMP.�FILE�VOLUME�ERRORŠLEA„MSG4E(PC),A2 ŠBRA.S‚ERR0%ERR5†LEA„MSG5(PC),A1ŒINPUT�FILE�ERRORŠLEA„MSG5E(PC),A2 ŠBRA.S‚ERR0$ERR6†LEA„MSG6(PC),A1ŒBOOT�FILE�ERRORŠLEA„MSG6E(PC),A2 ŠBRA.S‚ERR0&ERR7†LEA„MSG7(PC),A1ŒLIST�DEVICE�ERRORŠLEA„MSG7E(PC),A2 ŠBRA.S‚ERR0*ERR8†LEA„MSG8(PC),A1ŒSYMBOL�TABLE�OVERFLOWŠLEA„MSG8E(PC),A2ERR0A…BRA„ERR08ERR9†LEA„MSG9(PC),A1ŒSEGMENT�END�LESS�THAN�SEGMENT�STARTŠLEA„MSG9E(PC),A2 ŠBRA.S‚ERR0A>ERR10…LEA„MSG10(PC),A1‹SEGMENT�START�LESS�THAN�LOCATION�COUNTEŠLEA„M SG10E(PC),A2 ŠBRA.S‚ERR0A(ERR11…LEA„MSG11(PC),A1‹TOO�MANY�SEGMENTSŠLEA„MSG11E(PC),A2 ŠBRA.S‚ERR0AERR19…LEA„MSG19(PC),A1‹MEMORY�SPACE�NOT�AVAILABLE�AT�THIS�TIMEŠLEA„MSG19E(PC),A2 ŠBRA.S‚ERR0A5ERR20…LEA„MSG20(PC),A1‹EXCEEDED�MAXIMUM�INCLUDE�LEVELŠLEA„MSG20E(PC),A2 ŠBRA.S‚ERR0A8ERR21…LEA„MSG21(PC),A1‹SYNTAX�ERROR�ON�INCLUDE�FILE�NAMEŠLEA„MSG21E(PC),A2 ŠBRA.S‚ERR0AŠPAGE*.*ERRORS DETECTED IN COMMAND FILE THAT CONTINUE* CMSG1…DC.Bƒ'%%INVALID�PARAMETER'CMSG1E„EQU„*-1ŠDS.Lƒ0CMSG2…DC.Bƒ'%%SYNTAX�ERROR'CMSG2E„EQU„*-1ŠDS.Lƒ0CMSG3…DC.Bƒ'%%INVALID�VALUE'CMSG3E„EQU„*-1ŠDC.Lƒ0"CMSG4…DC.Bƒ'%%DUPLICATE�PARAMETER'CMSG4E„EQU„*-1ŠDS.Lƒ0CMSG5…DC.Bƒ'%%VALUE�TOO�BIG'CMSG5E„EQU„*-1ŠDS.Lƒ0)CMSG6…DC.Bƒ'%%INVALID�STATE�OR�ATTRIBUTE'CMSG6E„EQU„*-1ŠDS.Lƒ0#CMSG7…DC.Bƒ'%%NEW�PC�LESS�THAN�OLD'CMSG7E„EQU„*-1ŠDS.Lƒ0&CMSG8…DC.Bƒ'%%INVALID�FILE�DESCRIPTOR'CMSG8E„EQU„*-1ŠDS.Lƒ0 CMSG9…DC.Bƒ'%%FILE�NAME�MISSING'CMSG9E„EQU„*-1ŠDS.Lƒ0&CMSG10„DC.Bƒ'%%INVALID�LINK�STATEMENT'CMSG10EƒEQU„*-1ŠDS.Lƒ0!CMSG11„DC.Bƒ'%%INVALID�TASK�NAME'CMSG11EƒEQU„*-1ŠDS.Lƒ0/CMSG12„DC.Bƒ'%%NEW�PC�MUST�BE�ON�PAGE�BOUNDARY'CMSG12EƒEQU„*-1ŠDS.Lƒ0"CMSG13„DC.Bƒ'%%FILE�NAME�TOO�LONG'CMSG13EƒEQU„*-1ŠDS.Lƒ0$CMSG14„DC.Bƒ'%%INVALID�SEGMENT�NAME'CMSG14EƒEQU„*-1ŠDS.Lƒ0*CMSG15„DC.Bƒ'%%TOO�MANY�EXCLUDED�SEGMENTS'CMSG15EƒEQU„*-1ŠDS.Lƒ0&CMSG16„DC.Bƒ'%%XXXX�SEGMENT�NOT�FOUND'CMSG16EƒEQU„*-1ŠDS.Lƒ0%CMSG17„DC.Bƒ'%%NO�SEGMENTS�PROCESSED'CMSG17EƒEQU„*-1ŠDS.Lƒ0)CMSG18„DC.Bƒ'%%UTILITY�ENCOUNTERED�ERROR'CMSG18EƒEQU„*-1ŠDS.Lƒ0ŠPAGE*/*SEND ERROR TO LIST AND LOG DEVICE AND CONTINUE*(CERR1…LEA„CMSG1(PC),A1‹INVALID�PARAMETERŠLEA„CMSG1E(PC),A2CERR0…BSR„EMLOGLIS ŠBNE„IOERR"ŠBRA„NXTCMD‘GO�PROCESS�NEXT�RECORD#CERR2…LEA„CMSG2(PC),A1‹SYNTAX�ERRORŠLEA„CMSG2E(PC),A2 ŠBRA.S‚CERR0$CERR3…LEA„CMSG3(PC),A1‹INVALID�VALUEŠLEA„CMSG3E(PC),A2 ŠBRA.S‚CERR0*CERR4…LEA„CMSG4(PC),A1‹DUPLICATE�PARAMETERŠLEA„CMSG4E(PC),A2CERR4.5ƒBRA.S‚CERR0$CERR5…LEA„CMSG5(PC),A1‹VALUE�TOO�BIGŠLEA„CMSG5E(PC),A2 ŠBRA.S‚CERR01CERR6…LEA„CMSG6(PC),A1‹INVALID�STATE�OR�ATTRIBUTEŠLEA„CMSG6E(PC),A2 ŠBRA.S‚CERR0+CERR7…LEA„CMSG7(PC),A1‹NEW�PC�LESS�THAN�OLDŠLEA„CMSG7E(PC),A2 ŠBRA.S‚CERR0(CERR8…LEA„CMSG8(PC),A1‹INVALID�FILE�NAMEŠLEA„CMSG8E(PC),A2ŠBRA.S‚CERR4.5(CERR9…LEA„CMSG9(PC),A1‹FILE�NAME�MISSINGŠLEA„CMSG9E(PC),A2CERR0A„BRA.S‚CERR4.5/CERR10„LEA„CMSG10(PC),A1ŠINVALID�LINK�STATEMENTŠLEA„CMSG10E(PC),A2 ŠBRA.S‚CERR0A*CERR11„LEA„CMSG11(PC),A1ŠINVALID�TASK�NAMEŠLEA„CMSG11E(PC),A2 ŠBRA.S‚CERR0A4CERR12„LEA„CMSG12(PC),A1ŠNEW�PC�NOT�ON�PAGE�BOUNADRYŠLEA„CMSG12E(PC),A2 ŠBRA.S‚CERR0A+CERR13„LEA„CMSG13(PC),A1ŠFILE�NAME�TOO�LONGŠLEA„CMSG13E(PC),A2 ŠBRA.S‚CERR0A-CERR14„LEA„CMSG14(PC),A1ŠINVALID�SEGMENT�NAMEŠLEA„CMSG14E(PC),A2 ŠBRA.S‚CERR0A3CERR15„LEA„CMSG15(PC),A1ŠTOO�MANY�EXCLUDED�SEGMENTSŠLEA„CMSG15E(PC),A2 ŠBRA.S‚CERR0A0CERR18„LEA„CMSG18(PC),A1ŠUTILITY�ENCOUNTER�ERRORŠLEA„CMSG18E(PC),A2 ŠBRA.S‚CERR0A*ŠPAGE*>*ERRORS DETECTED IN PROCESSING SUBSTITUTION FILE THAT CONTINUE* SMSG1…DC.Bƒ'%%INVALID�FILE�TYPE'SMSG1E„EQU„*-1ŠDS.Lƒ0*SMSG2…DC.Bƒ'%%SUBSTITUTION�RECORD�TOO�BIG'SMSG2E„EQU„*-1ŠDS.Lƒ02SMSG3…DC.Bƒ'%%XXXXXXXX�NOT�DEFINED'�PARAMETER�NAMESMSG3E„EQU„*-1ŠDS.Lƒ0PCMSG…DC.Bƒ'-�PC�=�$'PCDSP…DC.Bƒ'XXXXXX' ŠDC.Bƒ$0DPCMSGE„EQU„*-1ŠDS…0FFS‡DC.Wƒ$200CŽFORM�FEED FFE‡EQU„*-1* ERMSGS„EQU„*5ERMSG…DC.Bƒ'†ERRORS�ENCOUNTERED'�FINAL �SYSGEN�MESSAGEERMSGE„EQU„*-1ŠDS…0ŠPAGE** RESTART MESSAGES*9RSMSG…DC.Bƒ'ENTER�CHARACTER�MATCHING�PATTERN�FOR�RESTART' ŠDC.Bƒ$0D ŠDC.Bƒ$0A ŠDC.Bƒ'>' ŠDC.Bƒ'�'RSMSGE„EQU„*-1ŠDS…09RLIST…DC.Bƒ'RESTART�OPTION�SPECIFIED�-�MATCH�PATTERN�IS:'RLISTE„EQU„*-1ŠDS…06RSTS†DC.Bƒ'-----�NORMAL�PROCESS�RESUMING�FROM�RESTART' RSTSE…EQU„*-1ŠDS…0** TABLE ALLOCATION MESSAGE*SYSG0T„CMP.B‚#'T',D1ŒIS�THIS�A�'T'�OPTION?�(SYMBOL�TABLE�SIZE)ŠBNE.S‚SYSG0S�BRANCH�IF�NO)ŠBCHGƒ#TOPT,OPTFLG-B(A6)�MARK�OPTION�FLAG.ŠBNE„ERR2�BRANCH�IF�'T'�OPTION�WAS�ALREADY�SET.ŠCMP.B‚#$10,D0ŒWAS�"="�AND�VALID�NUMBER�FOUND?ŠBNE„ERR2�BRANCH�IF�NO.ŠCMP.L‚#MINPAR,D3‰SYMBOL�TABLE�LESS�THAN�MIN.?ŠBLT„ERR17ŽBRANCH�IF�YESŠCMP.L‚#9999,D3‹OUT�OF�RANGE?ŠBGT„ERR17ŽBRANCH�IF�YES.ŠMOVE.L�D3,OPTSZE-B(A6)„SAVE�SYMBOL�TABLE�SIZE&ŠBRA„SYSG06�GO�LOOK�FOR�ANOTHER�OPTION4SYSG0S„CMP.B‚#'S',D1ŒIS�THIS�A�'S'�OPTION?�(RESTART).ŠBNE„ERR2�BRANCH�IF�NO�-�MUS�BE�ILLEGAL�OPTION)ŠBCHGƒ#SOPT,OPTFLG-B(A6)�MARK�OPTION�FLAG*ŠBNE„ERR2�BRANCH�IF�'S'�OPTION�ALREADY�SET&ŠBRA„SYSG06�GO�LOOK�FOR�ANOTHER�OPTION*INPUT FIELD MUST BE SPECIFIED>SYSG08„LEA„CMDLNE(PC),A2†SET�UP�A2�AT�BEGINING�OF�COMMAND�LINE;LOP1†CMP.B‚#0,(A2)+‹MOVE�A2�POINTER�TO�FIND�FIRST�NULL�CHAR(ŠBNE.S‚LOP1�BRANCH�IF�NOT�NULL�CHARACTER3ŠSUB.L‚#2,A2ŽA2�NOW�POINTS�TO�LAST�CHAR�ON�CMD�LINE<ŠMOVE.L�A2,COMEND-B(A6)„SAVE�END�OF�COMMAND�LINE�FOR�MESSAGE ŠMOVE.L�D5,D0ŠBTSTƒ#22,D0�INPUT�FIELD�NULL?ŠBNE„ERR3�YES-ERROR#*Check for valid input file name(s)ŠLEA„CMDLNE(PC),A0CŠMOVE.L�A0,EDITSVA0-B(A6)‚Set�up�pointer�to�next�file�name�on�input8ŠMOVE.L�#1,EDITRTN-B(A6)ƒSet�flag�for�more�on�input�line;NXTIN2„LEA„CMDFHS(PC),A0†Free�currently�assigned�input�file%ŠMOVE.W�FHSCMD(A0),-(A7)ƒSave�command6ŠMOVE.W�#FHCLOS,FHSCMD(A0)�Prepare�to�close�input�fileŠTRAPƒ#3/ŠMOVE.W�(A7)+,FHSCMD(A0)ƒRestore�former�command;ŠMOVE.L�EDITSVA0-B(A6),A0‚Save�addr�of�next�input�file�nameŠMOVE.L�EDITRTN-B(A6),D0 ŠBTSTƒ#0,D00ŠBEQ.S‚CKOBJŽBranch�if�done�checking�input�files%ŠBSR„SETDEF�PUT�DEFAULTS�IN�FHS�BLOCKŠMOVE.L�A0,-(A7)<ŠLEA„CMDFHS(PC),A6†FHS�P.B.�addr.�needed�for�EDITFILE,SETDEF ŠBSR„EDITFILEŠMOVE.L�(A7)+,A0ŠLEA„B(PC),A6�REBASE�A6 ŠTST.L‚D0ŠBMI„ERR5�INPUT�FILE�ERROR ŠBSR„NEWIN ŠBEQ.S‚NXTIN2#ŠBRA„IOERRŽComplain�on�assign�error(*INPUT FILE NAME LOOKS OKAY-CHECK OBJECT*…OUTPUT�FILE�FIELD+CKOBJ…BTSTƒ#14,D5�WAS�OUTPUT�FIELD�ENTERED? ŠBNE„SYS15ŽNO-USE�DEFAULT�VALUES7*SEE IF VOLUME:USER NO. SPECIFIED FOR TEMP. OUTPUT FILEŠLEA„TMPFHS(PC),A6 ŠBSR„EDITFILEŠLEA„B(PC),A6‹REBASE�A6ŠMOVE.L�D0,D6ŽSAVE�STATUS ŠBMI„ERR43*MAKE SURE ONLY VOLUME AND USER NO. ENTERED AT MOST ŠBTSTƒ#1,D0ŽDEVICE�NAME�ENTERED?ŠBNE„ERR4�YES-ERROR#ŠAND.L‚#$1C0000,D0ˆCAT .,�NAME,�EXT?ŠBNE„ERR4�YES-ERROR3*TEMPORARY FILE FIELD OKAY-SEE IF BOOT FILE ENTEREDŠLEA„BOOTFHS(PC),A6ŠBSR„SETDEF�SET�UP�DEFAULTSŠMOVE.W�#'SY',FHSEXT(A6) ŠBTSTƒ#0,D6ŠBEQ.S‚SYS10ŽNO�BOOT�FILE.ŠMOVE.W�#'SY',FHSEXT(A6)ƒSET�DEFAULT�EXTENSION ŠBSR„EDITFILEŠLEA„B(PC),A6‹REBASE�A6 ŠTST.L‚D0 ŠBMI„ERR6 ŠBTSTƒ#1,D0ŽDEVICE�NAME�ENTERED?ŠBNE„ERR6�YES-ERROR ŠBTSTƒ#0,D0ŠBNE„ERR6�CAN'T�HAVE�'/' *SEE IF LISTING DEVICE SPECIFIED"SYS10…CMP.B‚#CR,D1�AT�END�OF�LINE?ŠBEQ.S‚SYS15ŽYESŠCMP.B‚#';',D1ŠBEQ.S‚SYS15ŽBRANCH�IF�YESŠLEA„LISFHS(PC),A6ŠBSR„SETDEF�SET�UP�DEFAULTS3ŠMOVE.W�#'LS',FHSEXT(A6)ƒDEFAULT�TO�'.LS'�EXTENSION ŠBSR„EDITFILEŠLEA„B(PC),A6‹REBASE�A6 ŠTST.L‚D0 ŠBMI„ERR7)*DEVICE NAME OR FILE NAME MUST BE ENTERED ŠBTSTƒ#1,D0ŠBNE.S‚SYS12ŽDEVICE�NAMEŠBTSTƒ#19,D0�NAME�ENTERED?ŠBEQ„ERR7�NO�LIST�DEVICE-ERROR/SYS12…CMP.B‚#CR,D1�SHOULD�NOW�BE�AT�END�OF�LINEŠBEQ.S‚SYS14ŽBRANCH�IF�YESŠCMP.B‚#';',D1ŠBNE„ERR1�BRANCH�IF�NO*ASSIGN LIST DEVICE,SYS14…AND.W‚#(1<<14+1<<1),D0ƒSEE�IF�JUST�'#'ŠCMP.W‚#(1<<14+1<<1),D0ŠBEQ.S‚SYS15ŽBRANCH�IF�YES3ŠMOVE.B�#1,LDFLG-B(A6)…INDICATE�LIST�DEVICE�ENTEREDSYS13…LEA„LISFHS(PC),A5 ŠFHSCALL�(A5) ŠBEQ.S‚SYS20ŠCMP.B‚#FSTANNM,D0ˆNO�FILE? ŠBNE„IOERRŽNO*YES-TRY TO ALLOCATE FILE!ŠMOVE.W�#FHASGN+FHALLO,FHSCMD(A0) ŠBRA.S‚SYS137*NO LIST DEVICE-ASSIGN TO LOG DEVICE (DO SEND AND KEEP)SYS15…LEA„LISFHS(PC),A0ŠMOVE.W�#FHCHLU,FHSCMD(A0)!ŠMOVE.W�#FOPKEP+FOPSLU,FHSOPT(A0)ŠMOVE.B�#LDFLUN,FHSLUA(A0)ŠMOVE.B�#LSLUN,FHSLUB(A0)ŠCLR.L‚FHSTSK(A0)ŠCLR.L‚FHSSES(A0) ŠFHSCALL�(A0)ŠBNE„IOERRŽUNEXPECTED�ERROR'*IF TEMPORARY VOLUME NOT SPECIFIED, USE*…VOLUME�FOR�COMMAND�FILESYS20…LEA„TMPFHS(PC),A1ŠBTSTƒ#14,D5�ANY�OUTPUT?)ŠBNE.S‚SYS21ŽNO-USE�CMD�VOLUME�AS�DEFAULTŠBTSTƒ#14,D6�NULL�VOLUME?ŠBEQ.S‚SYS22ŽNO'SYS21…MOVE.L�SAVEREG+DUV(PC),FHSVOL(A1)SYS22…BTSTƒ#14,D5�ANY�OUTPUT?ŠBNE.S‚SYS23ŽNOŠBTSTƒ#13,D6�NULL�USER�NO.?ŠBEQ.S‚SYS24ŽNO+SYS23…MOVE.W�SAVEREG+DUN(PC),FHSUSN(A1)�YES-SYS24…FHSCALL�(A1)ŽALLOCATE/ASSIGN�TEMP.�FILE ŠBNE„IOERR*£01/10/85‚vvvvvŠBTST.B�#COPT,OPTFLG-B(A6)ŠIF��THEN.S=ŠLEA„SYMFHS(PC),A6†Get�the�address�of�the�FHS�parameter�block1ŠBSR„SETDEF�so�we�can�go�set�the�defaults�for�the *£filename,ŠMOVE.W�#'SY',FHSEXT(A6)ƒDefault�to�.SY�file*ŠLEA„B(PC),A6‹Reload�the�Beginning�address0ŠFHSCALL�SYMFHS(PC)ˆDelete�the�symbol�table�fileFŠMOVE.L�#$000A0000,FHSSIZ(A0)�The�key�size�for�the�symbol�table�output"*£file�will�be�10�characters�long.<ŠMOVE.W�#FHALLO,FHSCMD(A0)�Get�ready�to�allocate�symbol�file5ŠFHSCALL�SYMFHS(PC)ˆGo�allocate�the�symbol�table�file ŠBNE„IOERRŠENDI*£01/10/85‚^^^^^** LIST COMMAND LINEŠLEA„COMMSG(PC),A1ŠMOVE.L�COMEND-B(A6),A2ŠBSR„LISOUT�LIST�COMMAND�LINE ŠBNE„IOERRŠBSR„BKLISŽLIST�TWO�BLANK�LINES ŠBSR„BKLIS ŠBNE„IOERR:ŠLEA„CMDFHS(PC),A0†List�command�file�name�we're�processingŠPASS1.S�TOPT0 ŠBSR„NEWLST** GET SEGMENT FOR SYMBOL TABLE*FTOPT0…MOVE.W�#$2000,MSBSYM+8-B(A6)‚SEGMENT�DIRECTIVE�(NO�MEMORY�AVAIL)0ŠMOVE.L�OPTSZE-B(A6),D0„CALCULATE�SEGMENT�LENGTH0ŠMULU.W�#SYMLEN,D0‰SYMBOL�LENGTH*VALUE�ASKED�FOR5ŠADD.L‚#PDEF,D0‹LENGTH�ASKED�FOR�+�PREDEFINED�SYMBOLS<ŠMOVE.L�D0,MSBSYM+20-B(A6)�STUFF�SEGMENT�LENGTH�IN�MSB�TABLETOPT3…MOVE.L�#GTSEG,D0ŠLEA„MSBSYM(PC),A0†GET�SEGMENTŠTRAPƒ#1 ŠBEQ.S‚TOPT1ŽBRANCH�IF�NO�ERRORS-ŠCMP.W‚#8,D0ŽPHYSICAL�MEMORY�AVAILABLE�ERROR?ŠBEQ.S‚TOPT2ŽBRANCH�IF�YES#ŠBRA„ERR18ŽSEGMENT�ALLOCATION�ERRORTOPT4…MOVE.L�A0,SYMADR-B(A6)„SAVE�BASE�ADDRESS�OF�SYMBOL�TABLE%ŠMOVE.L�A0,A1ŽBase�address�of�segment,ŠMOVE.L�MSBSYM+20-B(A6),D0�Length�of�segment ŠADD.L‚#$FF,D0;ŠAND.L‚#$FFFFFF00,D0†Round�up�to�nearest�256�byte�boundary.'TOPT6…CLR.L‚(A1)+ŽClear�out�the�segment ŠSUB.L‚#4,D0 ŠBNE.S‚TOPT6*3* MOVE PREDEFINED SYMBOLS INTO NEW SYMBOL TABLE AND* INITIALIZE DATA AREAS.+ŠLEA„SYMSTR(PC),A1†VALUES�START�TO�BE�MOVED$ŠMOVE.L�#PDEF,D0‹#�OF�VALUES�TO�MOVESEG1L…MOVE.B�(A1)+,(A0)+ ŠDBF„D0,SEG1L ŠSUB.L‚#1,A0?ŠMOVE.L�A0,SYMSTR1-B(A6)ƒINITIALIZE�START�OF�USER�TABLE�SYMBOLS0ŠMOVE.L�A0,NXTSYM-B(A6)„POINTS�TO�NEXT�AVAILABLEŠMOVE.L�SYMADR-B(A6),D04ŠLEA„MSBSYM+20(PC),A0ƒCALCULATE�END�OF�TABLE�ADDRESSŠADD.L‚(A0),D06ŠMOVE.L�D0,SYMEND-B(A6)„INITIALIZE�END�OF�SYMBOL�TABLE*5* IF 'S' OPTION IS SPECIFIED, THEN READ START UP LINEŠBTSTƒ#SOPT,OPTFLG-B(A6)"ŠBEQ.S‚NOS�BRANCH�IF�NO�'S'�OPTION*7* 'S' OPTION SPECIFIED, TELL THEM TO ENTER RESTART LINEŠLEA„RSMSG(PC),A1ŠLEA„RSMSGE(PC),A2ŠBSR„LOGIOUTŒIMAGE�MODE�OUTPUT ŠBSR„BKLOGŠLEA„REPLY(PC),A1ŠLEA„REPLYE(PC),A2ŠBSR„LOGINŽTAKE�KEYED�IN�INPUT ŠBNE„IOERR:ŠMOVE.L�IOSLEN(A0),REPLGH-B(A6)�SAVE�LENGTH�OF�KEYED�INPUT** LIST RESTART LINEŠLEA„RLIST(PC),A1ŠLEA„RLISTE(PC),A2 ŠBSR„LOGLISŠLEA„REPLY(PC),A1 ŠMOVE.L�A1,A2ŠADD.L‚REPLGH-B(A6),A2 ŠSUB.L‚#1,A2 ŠBSR„LOGLIS ŠBSR„BKLOGLIS*#* FREE CDFLUN SINCE WE NEVER USE ITNOS‡LEA„FREFHS(PC),A0ŠTRAPƒ#3 ŠBNE„IOERR ŠBRA„DONE01.3*-*********************************************4* FROM TASKMTB TO HERE WE OVERLAY THE INITIALIZATION*ƒCODE�TO�SAVE�SPACE-*********************************************'TASKM1„DS.BƒNOTASKS*EACHENT-(*-TASKMTB)TSKMSGEƒDS.Lƒ1ŠPAGE*%* Subroutine to assign new input file6*ƒEnter�with�A0�pointing�to�filename�from�command�line *ƒOn�exit:,*†D0‡=�return�code,�0�is�OK�nonzero�is�error'*†EDITRTN‚=�saved�D0�from�EDITFILE�call(*†EDITSVA0�=�saved�A0�from�EDITFILE�call NEWIN…EQU„*ŠMOVE.L�EDITRTN-B(A6),D0 ŠBTSTƒ#0,D0,ŠCRASH.EQ�*+1ŽCrash�if�no�more�on�input�line$ŠLEA„CMDFHS(PC),A6†FHS�P.B.�location&ŠBSR„SETDEF�Set�defaults�into�FHS�P.B.*ŠBSR„EDITFILE‹Plug�file�name�into�FHS�P.B..ŠLEA„B(PC),A6‹Rebase�A6�for�pos�indep�register;ŠMOVE.L�D0,EDITRTN-B(A6)ƒBit�#0�set�if�more�on�input�field.;ŠMOVE.L�A0,EDITSVA0-B(A6)‚Save�position�of�next�input�file. ŠTST.L‚D0ŠBMI.S‚NEWINEXŠFHSCALL�CMDFHS(PC) NEWINEXƒRTSŠPAGEA*LIST DEVICE ASSIGNED-MUST ASSIGN COMMAND FILE AND TEMPORARY FILE$*ƒPoint�to�beginning�of�command�line*ƒAssign�original�command�file+*ƒSet�record�counters�back�to�initial�state1SYSIN…LEA„CMDLNE(PC),A0†Address�of�1st�input�file>ŠMOVE.L�#1,EDITRTN-B(A6)ƒInsure�that�NEWIN�thinks�there�is�one ŠBSR„NEWINŽAssign�the�input�file ŠBNE„IOERRŠMOVE.L�#-1,CMDIOS+IOSRRN-B(A6)ŠCLR.L‚GLOBCNT-B(A6).ŠCLR.L‚STKCNT-B(A6)‡Clear�IFxx�nesting�counter<ŠMOVE.L�#-1,PROCNT-B(A6)ƒReset�processing�indicator�for�IFxxŠPAGE@*ALL FILES BUT BOOT FILE HAVE BEEN ASSIGNED-PROCESS COMMAND FILEANXTCMD„ADD.L‚#1,CMDIOS+IOSRRN-B(A6)�Advance�random�record�pointer3ŠADD.L‚#1,GLOBCNT-B(A6)ƒAdd�one�to�the�global�countŠIOSCALL�CMDIOS(PC)ˆREAD�RECORD ŠBEQ„SYS32ŠCMP.B‚#ISTAEOF,D0ˆEnd�of�file?ŠBNE„IOERRŽBranch�if�no>ŠSUB.L‚#1,GLOBCNT-B(A6)ƒAdjust�global�counter�to�keep�in�sync.0ŠTST.W‚INCLNEST-B(A6)…Are�we�in�an�INCLUDE�file?0ŠBEQ.S‚NXTCMD.1‹Branch�if�no�-�we're�really�done$ŠBSR„RSTRINCŒReinstate�previous�file"ŠBRA.S‚NXTCMD�Go�read�next�command*F*�See�if�any�more�files�exist�on�input.‚If�so,�assign�them�and�proceed *ƒnormally.ANXTCMD.1‚LEA„CMDFHS(PC),A0†Free�the�currently�assigned�input�fileŠMOVE.W�FHSCMD(A0),-(A7)ŠMOVE.W�#FHCLOS,FHSCMD(A0)ŠTRAPƒ#3 ŠBNE„IOERR*ŠMOVE.W�(A7)+,FHSCMD(A0)'ŠBTSTƒ#0,EDITRTN-B+3(A6)�Is�there�more?ŠBEQ.S‚DONE01�Branch�if�no.:ŠMOVE.L�EDITSVA0-B(A6),A0‚Address�of�next�input�file�name. ŠBSR„NEWINŽAssign�new�input�file-ŠBNE„ERR5�Should�never�take�this�error�branchŠPASS1.S�NXTCMD.2 ŠBSR.S‚NEWLST�List�new�file�name2NXTCMD.2‚MOVE.L�#-1,CMDIOS+IOSRRN-B(A6)�Set�up�RRN ŠBRA.S‚NXTCMD*.* List name of new file for concatenated input<*ƒEntry�A0�-�points�to�FHS�P.B.�where�new�file�name�resides.*ƒExit‚A2,D0�destroyed*NEWL ST„MOVEM.L�A0/A1,-(A7)ŠLEA„FHSVOL(A0),A0ŠLEA„FILMSG1I(PC),A1 ŠBSR„FFNAMEŠLEA„FILMSG1(PC),A1ŠLEA„FILMSG1E(PC),A2 ŠBSR„LISOUTŠMOVEM.L�(A7)+,A0/A1ŠRTS*DONE01„PASSL.S�DONE01.59* See if we need to do one more pass before the last pass*?ŠBCLRƒ#UNDEF,MSCFLG-B(A6)�Clear�flag�indicating�undefined�syms.1ŠBEQ.S‚LPASSŽBranch�for�last�pass�if�no�undefined9ŠBCLRƒ#INSTF,MSCFLG-B(A6)�Did�we�insert�any�on�this�pass?0ŠBEQ.S‚LPASSŽBranch�if�no�-�do�last�pass�anyway.*&* We cannot perform the last pass yet.*ƒAdvance�pass�counter.*ƒPut�out�next�pass�message.*ƒGo�to�SYSIN.*DONE01.3‚ADD.W‚#1,PASS-B(A6) ŠCLR.L‚D0ŠMOVE.W�PASS-B(A6),D0 ŠBSR„BDCONVŠMOVE.L�D0,PASSNO-B(A6) ŠBSR„BKLOGŠLEA„PASS1M(PC),A1ŠLEA„PASS1ME(PC),A2 ŠBSR„LOGOUT ŠBSR„BKLOG ŠBRA„SYSIN** Set up for last pass:*ƒSet�pass�counter�negative*ƒDisplay�new�pass�message *ƒGo�to�SYSIN*/LPASS…MOVE.W�#-1,PASS-B(A6)…Advance�pass�number*#ŠBSR„BKLOGŽDisplay�new�pass�messageŠLEA„PASSLM(PC),A1ŠLEA„PASSLME(PC),A2 ŠBSR„LOGOUT ŠBSR„BKLOG* ŠBRA„SYSIN&* Do we have a missing ENDC statement?3DONE01.5‚TST.L‚STKCNT-B(A6)‡MISSING�ENDC�STATEMENT?!ŠBNE„ERR16ŽBRANCH�TO�ERROR�IF�YESŠPAGE**END OF COMMAND FILE0ŠBSR„FINTSK�WRAP�UP�PREVIOUS�TASK/PROCESS�IF�ANYB*TEMPORARY FILE HAS BEEN GENERATED-NOW MUST CREATE CONTIGUOUS FILE>*1ST POSITION TO END OF TEMP. FILE TO DETERMINE LENGTH OF FILEŠLEA„TMPIOS(PC),A0ŠMOVE.W�#IOPOST,IOSFCT(A0)ŠMOVE.W�#IOPRAN,IOSOPT(A0)ŠMOVE.L�#-1,IOSRRN(A0) ŠIOSCALL�(A0) ŠBEQ.S‚DONE02$*WAS ANYTHING WRITTEN TO TEMP. FILE?ŠCMP.B‚#ISTAEOF,D03ŠBNE.S‚DONE02�Branch�if�we�have�info�in�output�file*ŠLEA„MSG14(PC),A1‡'NO�OUTPUT�FILE�CREATED'ŠLEA„MSG14E(PC),A2 ŠBSR„LOGLIS ŠBRA„DMSG5 DONE02„EQU„**RRN=LAST RECORD IN FILEŠMOVE.L�IOSRRN(A0),D0-ŠADD.L‚#2,D0ŽD0=LENGTH�OF�FILE�(INCLUDES�LIB)2ŠBTSTƒ#ROPT,OPTFLG-B(A6)�WAS�'R'�OPTION�SPECIFIED?ŠBEQ.S‚DONE3ŽBRANCH�IF�NO*D* SINCE 'R' OPTION WAS SPECIFIED, SIZE OF FINAL OUTPUT FILE MUST NOTE*ƒINCLUDE�THE�SPACE�REQUIRED�FOR�THE�TCB'S�WHICH�ARE�TWO�BLOCKS�LONG.?*ƒIT�MUST�INSTEAD�REFLECT�THE�SIZE�REQUIRED�FOR�THE�MINI-TCB'S.**ƒCORRECT�D0�TO�REFLECT�THIS�SMALLER�SIZE.*ŠMOVE.L�D0,SREC-B(A6)5ŠSUB.L‚#2,SREC-B(A6)†WHERE�TO�BEGIN�READING�TEMP�FILE ŠCLR.L‚D11ŠMOVE.W�TSKCNT-B(A6),D1„NUMBER�OF�TASKS�PROCESSED ŠMOVE.L�D1,D24ŠLSL.L‚#1,D2Ž*�2�TO�REFLECT�BLOCK�COUNT�(FULL�TCB'S)4ŠMULUƒ#MTCBLN,D1‰REFLECTS�BYTE�LENGTH�FOR�MINI-TCB'SŠADD.L‚#255,D1,ŠLSR.L‚#8,D1ŽD1�HAS�#�BLOCKS�FOR�SHORT�TCB'S3ŠSUB.L‚D1,D2ŽD2�HAS�EXCESS�COUNT�REQ.�FOR�FULL�SIZEŠSUB.L‚D2,D0ŽCORRECT�D0�SIZE*#* SAVE START ADDRESS OF SHORT TCB'SŠMOVE.L�D0,TREC-B(A6)8ŠSUB.L‚#1,TREC-B(A6)†RRN�TO�WRIT�NEXT�SHORT�TCB�FRAME�TOŠMOVE.L�D0,STARTTCB-B(A6)4ŠSUB.L‚D1,STARTTCB-B(A6)‚BASE�ADDRESS�OF�SHORT�TCB'S*I* COMPUTE BNIN (NEXT IN TOP POINTER ADDRESS FOR SHORT TCB'S WITHIN FRAME) ŠCLR.L‚D11ŠMOVE.W�TSKCNT-B(A6),D1„NUMBER�OF�TASKS�PROCESSEDŠBEQ.S‚DONE3ŽBRANCH�IF�NONEŠMULUƒ#MTCBLN,D1 ŠDIVUƒ#256,D1 ŠCLR.W‚D1ŠSWAPƒD1ŠBNE.S‚DONE2¯010485ŠMOVE.L�BBASE2-B(A6),D1¥010485ŠBRA.S‚DONE4¯010485"DONE2…ADD.L‚BBASE1-B(A6),D1¥0104859DONE4…MOVE.L�D1,BNIN-B(A6)†TOP�NEXT�IN�ADDRESS�WITH�FRAME.DONE3…MOVE.L�D0,BOOTFHS+FHSSIZ-B(A6)�SAVE�SIZE0*REWIND TEMP. FILE TO BE READY TO READ FROM FILEŠMOVE.W�#IOREWD,IOSFCT(A0) ŠIOSCALL�(A0) ŠBNE„IOERR-*NOW ATTEMPT TO ALLOCATE AND ASSIGN BOOT FILEDONE05„FHSCALL�BOOTFHS(PC) ŠBEQ.S‚DONE08"ŠCMP.B‚#FSTADNM,D0ˆDUPLICATE�FILE?ŠBNE„IOERRŽNO-QUIT *BOOT FILE ALREADY EXISTS-DELETEŠMOVE.W�#FHDELT,FHSCMD(A0) ŠFHSCALL�(A0) ŠBNE„IOERR!ŠMOVE.W�#FHALLO+FHASGN,FHSCMD(A0) ŠBRA.S‚DONE051*READ TEMPORARY FILE AND WRITE TO CONTIGUOUS FILEDONE08„LEA„TMPIOS(PC),A0ŠLEA„BOOTIOS(PC),A1-ŠCLR.W‚IOSOPT(A1)‰Revert�to�sequential�accessŠCLR.L‚IOSRRN(A1)ŠMOVE.W�#IOREAD,IOSFCT(A0)ŠCLR.W‚IOSOPT(A0) ŠMOVE.L�SUBBUF1-B(A6),IOSSAD(A0) ŠMOVE.L�SUBBUF2-B(A6),IOSEAD(A0)ŠMOVE.L�IOSSAD(A0),IOSSAD(A1)ŠMOVE.L�IOSEAD(A0),IOSEAD(A1)ŠMOVE.W�#IOWRIT,IOSFCT(A1)ŠM OVE.B�#BFLUN,IOSLUN(A1)*BUILD LIB FOR BOOT FILEŠMOVE.L�IOSSAD(A1),A0DONE09„CLR.L‚(A0)+ŽZERO�LIBŠCMP.L‚IOSEAD(A1),A0 ŠBLS.S‚DONE09;*DON'T NEED ALL INFO. FILLED-BUT MUST HAVE SEGMENT 0 INFOL.%*FILL IN SEG LENGTH AND START ADDRESSŠMOVE.L�IOSSAD(A1),A0ŠMOVE.L�BOOTFHS+FHSSIZ-B(A6),D0ŠSUB.L‚#1,D0ŽADJUST�FOR�LIBŠMULUƒ#$100,D0.ŠMOVE.L�D0,LIBSAD+SADLEN(A0)�LENGTH�OF�SEGMENT ŠSUB.L‚#1,D0ŠADD.L‚BASEADDR-B(A6),D0(ŠASR.L‚#8,D0ŽENDING�ADDR.�OF�1ST�SEGMENTŠMOVE.W�D0,LIBMID+2(A0)ŠMOVE.L�BASEADDR-B(A6),D0 ŠLSR.L‚#8,D0'ŠMOVE.W�D0,LIBMID(A0)†MID�START�ADDRESS3ŠMOVE.L�PROCSTR-B(A6),LIBENT(A0)�SET�UP�EXEC.�ADDR.AŠMOVE.L�BASEADDR-B(A6),LIBSAD+SADSTR(A0)�SEGMENT�STARTING�ADDRESS5*SET UP TASK NAME AND SEGMENT NAME BASED ON FILE NAME.ŠMOVE.L�BOOTFHS+FHSFIL-B(A6),LIBSAD+SADNAM(A0) ŠMOVE.B�#'0',LIBSAD+SADNAM+3(A0)'ŠMOVE.L�BOOTFHS+FHSFIL-B(A6),LIBTSK(A0)*SET UP END OF SEGMENT INFO.-ŠMOVE.L�#$FFFFFFFF,LIBSAD+SADLEN+LIBSADLN(A0)ŠMOVE.W�#$FFFF,LIBMID+2+4(A0)ŠIOSCALL�(A1)ŽWRITE�OUT�LIB ŠBNE„IOERRDONE102ŠBTSTƒ#ROPT,OPTFLG-B(A6)�WAS�'R'�OPTION�SPECIFIED?ŠBNE.S‚DONE80�BRANCH�IF�YESŠIOSCALL�TMPIOS(PC) ŠBEQ.S‚DONE40ŠCMP.B‚#ISTAEOF,D0 ŠBNE„IOERR ŠBRA„DONE20C*IF THIS IS FIRST DATA SECTOR, INSERT EXEC. ADDR. IN RESTART VECTORDONE40ŠTST.L‚SEC0SW-B(A6) ŠBNE.S‚DONE45ŠMOVE.L�#1,SEC0SW-B(A6)ŠMOVE.L�BOOTIOS+IOSSAD-B(A6),A0ŠMOVE.L�PROCSTR-B(A6),4(A0)'DONE45„IOSCALL�BOOTIOS(PC)‡WRITE�SECTOR ŠBNE„IOERR ŠBRA„DONE10*I*�'R'�OPTION�WAS�SPECIFIED.‚PROCESS�TEMPORARY�BOOT�FILE�IN�REVERSE�ORDER,*ƒPLACING�TCB'S�AT�END�OF�FILE.* DONE80„EQU„*1ŠCLR.W‚PLCTCB-B(A6)‡NUMBER�OF�TCB'S�PLACED�SO�FARCŠMOVE.L�TCBLST-B(A6),NXTTCB-B(A6)�POINT�TO�BASE�ADDR�OF�HIGHEST�TCB>ŠADD.L‚#1,NXTTCB-B(A6)„POINT�TO�TST�PORTION�OF�TCB�(TEMP�FILE)!ŠMOVE.L�STARTTCB-B(A6),DREC-B(A6)6ŠSUB.L‚#1,DREC-B(A6)†WHERE�TO�PLACE�FIRST�NON-TCB�PART>ŠOR.Wƒ#IOPRAN,TMPIOS+IOSOPT-B(A6)�FORCE�RAN.�READ�OF�TEMP�FILE@ŠOR.Wƒ#IOPRAN,BOOTIOS+IOSOPT-B(A6)�FORCE�RAN.�WRITE�OF�BOOT�FILE8DONE85„MOVE.L�SREC-B(A6),D1†WHERE�TO�RETRIEVE�NEXT�BLOCKŠBMI„DONE20�BRANCH�IF�NO�BLOCKS,ŠCMP.L‚#1,D1ŽIS�THIS�1ST�REC�OF�SOURCE�FILE?*ŠBEQ.S‚DONE88�BRANCH�IF�YES�-�NO�TCB�CHECK-ŠCMP.L‚NXTTCB-B(A6),D1„IS�THIS�A�TCB�SECTION?ŠBEQ.S‚PROCTCBŒBRANCH�IF�YES*** READ TEMP FILE AND WRITE IT TO BOOT FILE/DONE88„MOVE.L�D1,TMPIOS+IOSRRN-B(A6)�SOURCE�RRN7ŠMOVE.L�DREC-B(A6),BOOTIOS+IOSRRN-B(A6)�DESTINATION�RRNŠIOSCALL�TMPIOS(PC) ŠBNE„IOERR<ŠCMP.L‚#1,DREC-B(A6)†IS�THIS�THE�FIRST�BLOCK�OF�MEMORY�IMAGEŠBNE.S‚DONE90�BRANCH�IF�NOT(* PLUG START ADDRESS INTO RESTART VECTORŠMOVE.L�BOOTIOS+IOSSAD-B(A6),A0ŠMOVE.L�PROCSTR-B(A6),4(A0)*?DONE90„IOSCALL�BOOTIOS(PC)‡WRITE�BLOCK�TO�THE�MEMORY�IMAGE�FILE ŠBNE„IOERRŠSUB.L‚#1,SREC-B(A6)ŠSUB.L‚#1,DREC-B(A6) ŠBRA.S‚DONE85*I*�BUILD�MINI�TCB�AND�PLACE�IT�IN�STAGING�BUFFER.‚WRITE�STAGING�BUFFER�OUT#*ƒIF�NEW�TCB�FILLS�OR�OVERFLOWS�IT. PROCTCBƒEQU„*6ŠMOVE.L�BNIN-B(A6),A2†TOP�ADDRESS+1�OF�MINI�TCB�OUTPUT ŠMOVE.L�A2,A11ŠSUB.L‚#MTCBLN,A1‰BASE�ADDRESS�OF�MINI�TCB�OUTPUT&ŠMOVE.L�#'!TCB',(A1)‡PLACE�EYE�CATCHER** READ TST SECTION OF TCB0*‚SREC�POINTS�TO�RRN�CONTAINING�2ND�BLOCK�OF�TCB@ŠMOVE.L�SREC-B(A6),TMPIOS+IOSRRN-B(A6)�SOURCE�RRN�FROM�TEMP�FILEŠIOSCALL�TMPIOS(PC) ŠBNE„IOERR*#* CONSTRUCT TST PORTION OF MINI-TCB@ŠMOVE.L�TMPIOS+IOSSAD-B(A6),A3ƒA3�POINTS�TO�BASE�OF�FULL�TCB+256 ŠMOVE.L�A3,A4FŠLEA�TSTBEGIN+TSTMMU-256(A4),A4�A4�POINTS�TO�TSTMMU�INFO�FROM�FULL�TCB ŠMOVE.L�A1,A5<ŠLEA„MTSTMMU(A5),A5…A5�POINTS�TO�SPOT�IN�MINI-TCB�TO�MOVE�TO'ŠMOVE.L�#TSTMMUSZ,D0‡#BYTES�IN�MMU�INFO(DONE120ƒMOVE.L�(A4)+,(A5)+ˆMOVE�MMU�INFO ŠSUB.L‚#4,D0ŠBNE.S‚DONE120 ŠMOVE.L�A3,A4G‰LEA�TSTBEGIN+TSTATTR-256(A4),A4�A4�POINTS�TO�TSTATTR�INFO�FROM�FULL�TC ŠMOVE.L�A1,A5=ŠLEA„MTSTATTR(A5),A5„A5�POINTS�TO�SPOT�IN�MINI-TCB�TO�MOVE�TO)ŠMOVE.L�#TSTATTRSZ,D0†#BYTES�IN�ATTR�INFO)DONE130ƒMOVE.L�(A4)+,(A5)+ˆMOVE�ATTR�INFO ŠSUB.L‚#4,D0ŠBNE.S‚DONE130*+* CONSTRUCT INFO FROM 1ST BLOCK OF FULL TCB:ŠSUB.L‚#1,SREC-B(A6)†POINT�TO�RECORD�IN�FILE�FOR�1ST�BLO CK&ŠMOVE.L�SREC-B(A6),TMPIOS+IOSRRN-B(A6))ŠIOSCALL�TMPIOS(PC)ˆREAD�1ST�BLOCK�OF�TCB ŠBNE„IOERR:ŠSUB.L‚#1,SREC-B(A6)†DECREMENT�SOURCE�REC�#�FOR�NEXT�FETCHŠMOVE.L�TCBALL(A3),NXTTCB-B(A6)5ŠADD.L‚#1,NXTTCB-B(A6)„POINT�TO�2ND�BLOCK�OF�NEXT�TCB ŠMOVE.L�TCBNAME(A3),MTCBNAME(A1)"ŠMOVE.L�TCBSESSN(A3),MTCBSESSN(A1)ŠMOVE.L�TCBMON(A3),MTCBMON(A1)"ŠMOVE.L�TCBMON+4(A3),MTCBMON+4(A1) ŠMOVE.W�TCBUSER(A3),MTCBUSER(A1) ŠMOVE.B�TCBLPRI(A3),MTCBLPRI(A1)"ŠMOVE.W�TCBSTATE(A3),MTCBSTATE(A1) ŠMOVE.W�TCBATTR(A3),MTCBATTR(A1)"ŠMOVE.L�TCBENTRY(A3),MTCBENTRY(A1)*** MINI-TCB HAS BEEN CONSTRUCTED IN BUFFER.B*ƒIF�BASE�OF�NEWLY�CONSTRUCTED�MINI-TCB�<=�BBASE�(BASE�OF�BUFFER),@*ƒWRITE�OUT�BUFFER�AND�ADJUST�REMAINING�PORTION�OF�TCB�TO�TOP�OF *ƒBUFFER.*+ŠMOVE.L�A1,BNIN-B(A6)†NEW�TOP�+�1�INDICATORŠCMP.L‚BBASE1-B(A6),A1*ŠBHI„DONE85�BRANCH�IF�NO�NEED�TO�WRITE�OUT*0* WRITE OUT THE MINI-TCB BUFFER TO THE BOOT FILE6ŠMOVE.L�BOOTIOS+IOSSAD-B(A6),-(A7)�SAVE�OLD�PARAMETERS"ŠMOVE.L�BOOTIOS+IOSEAD-B(A6),-(A7)"ŠMOVE.L�BOOTIOS+IOSRRN-B(A6),-(A7)7ŠMOVE.L�BBASE1-B(A6),BOOTIOS+IOSSAD-B(A6)�START�ADDRESS)ŠMOVE.L�BBASE2-B(A6),BOOTIOS+IOSEAD-B(A6)*ŠSUB.L‚#1,BOOTIOS+IOSEAD-B(A6)…END�ADDRESS'ŠMOVE.L�TREC-B(A6),BOOTIOS+IOSRRN-B(A6)ŠIOSCALL�BOOTIOS(PC) ŠBNE„IOERR:ŠSUB.L‚#1,TREC-B(A6)†ADJUST�NEXT�TCB�BUFFER�OUTPUT�ADDRESS9ŠMOVE.L�(A7)+,BOOTIOS+IOSRRN-B(A6)�RESTORE�OLD�PARAMETERS"ŠMOVE.L�(A7)+,BOOTIOS+IOSEAD-B(A6)"ŠMOVE.L�(A7)+,BOOTIOS+IOSSAD-B(A6)*/* ADJUST REMAINDER OF MINI-TCB TO TOP OF BUFFERŠADD.L‚#256,BNIN-B(A6)ŠLEA„256(A1),A2DONE140ƒCMP.L‚BBASE1-B(A6),A1(ŠBEQ„DONE85�BRANCH�IF�OVERFLOW�ALL�MOVEDŠMOVE.B�(A1)+,(A2)+ŠBRA.S‚DONE140*DONE20„LEA„TMPFHS(PC),A0ŠMOVE.W�#FHCLOS,FHSCMD(A0)ŠFHSCALL�(A0)ŽCLOSE�TEMP.�FILE ŠBNE„IOERRŠMOVE.B�#BFLUN,FHSLUN(A0)ŠFHSCALL�(A0)ŽCLOSE�BOOT�FILE ŠBNE„IOERR!*PRINT LIST OF TASK/TCB ADDRESSESŠLEA„FFEED(PC),A1 ŠLEA„1(A1),A2ŠBSR„LISOUT�OUTPUT�FORM�FEEDŠLEA„TASKMSG(PC),A1ŠLEA„TASKMTB-1(PC),A2"ŠBSR„LISOUT�OUTPUT�TASK�MAP�HEADERŠBSR„BKLISŽOUTPUT�BLANK�LINE ŠBNE„IOERRŠLEA„TASKMTB(PC),A1ŠMOVE.L�TSKLST-B(A6),A3ŠSUB.L‚#1,A3ŽEND�OF�LIST2DONE30„CMP.L‚A3,A1ŽHAVE�WE�LIST�ALL�THE�ADDRESSES?ŠBCC„DMSG�BRANCH�IF�YES*ŠLEA„EACHENT-1(A1),A2ƒEND�OF�ENTRY�TO�LIST ŠBSR„LISOUT ŠBNE„IOERR)ŠLEA„1(A2),A1‹POINT�TO�NEXT�ENTRY�TO�LIST ŠBRA„DONE30ŠPAGE**PROCESS NEXT COMMAND RECORD* SYS32…EQU„*$ŠBSR„PROC�Are�we�in�processing�mode?-ŠBNE„SYS32.5ŒBranch�if�no�-�do�not�substitute*C*�See�if�there�are�any�substitutions�to�be�made�in�this�line,‚If�soG*ƒthen�echo�the�the�line�exactly�as�it�appears�before�the�substitution.,ŠMOVE.L�IOSSAD(A0),A1†Beginning�of�line�read/ŠMOVE.L�IOSLEN(A0),D3†Number�of�characters�readSYS32.3ƒBTST.B�#COPT,OPTFLG-B(A6)�See�if�the�'C'�option�is�setŠIF��THEN.S,ŠMOVEM.L�D0/A0-A1,-(A7)„Save�users�registers=ŠLEA„SYMBUFF+2+PARLEN(PC),A1�Get�the�address�of�the�buffer�of*£where�the�filename�will�go@ŠLEA„CMDFHS+FHSCLG(PC),A0�Get�the�address�of�the�parameter�block'*£that�contains�the�filename�being�usedŠFOR.B‚D0�=�#1�TO�#18�DO.S3ŒMOVE.B�(A0)+,(A1)+†Move�the�filename�to�the�bufferŠENDF/ŠMOVEM.L�(A7)+,D0/A0-A1„Restore�users�registersŠENDI*£01/10/85‚^^^^^$ŠBSR„SUB00ŽMAKE�SYSGEN�SUBSTITUTIONS!ŠBMI.S‚SYS32.5ŒBRANCH�ON�OVERFLOW%ŠBSR„SBARGŽMAKE�SESSION�SUBSTITUTIONS!ŠBEQ.S‚SYS32.5ŒBRANCH�IF�NO�ERROR-ŠPASS1.S�SYS32.5 ‹Bypass�error�on�initial�pass.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN#ŠBRA„ERRTERMŒERROR�TERMINATION�EXIT*-SYS32.5ƒMOVE.L�IOSSAD(A0),A1†START�OF�COMMAND)ŠMOVE.L�IOSLEN(A0),D3†GET�LENGTH�OF�INPUT4ŠMOVE.L�D3,CMDLGH-B(A6)„SAVE�LENGTH�OF�COMMAND�INPUT*C* IF 'S' OPTION SPECIFIED, SEE IF THIS COMMAND SHOULD RESUME NORMAL4*ƒPROCESSING,�IF�SO�THEN�TURN�OF�RESTART�OPTION�BIT.ŠPASS1.S�SYS351ŠBTSTƒ#SOPT,OPTFLG-B(A6)�WAS�'S'�OPTION�SPECIFIEDŠBEQ.S‚SYS35ŽBRANCH�IF�NOŠMOVEM.L�A0/A1,-(A7)ŠBSR„MCHTESTŒSEE�IF�MATCH2ŠBNE.S‚SYS34ŽBRANCH�IF�THIS�COMMAND�DOES�NOT�MATCH2ŠBCLRƒ#SOPT,OPTFLG-B(A6)�CLEAR�THE�'S'�OPTION�FLAG ŠBSR„BKLOGLIS.ŠLEA„RSTS(PC),A1ˆLOG�NORMAL�PROCESSING�MESSAGEŠLEA„RSTSE(PC),A2 ŠBSR„LOGLIS ŠBSR„BKLOGLISSYS34…MOVEM.L�(A7)+,A0/A1*SYS35…MOVE.L�A1,A2*ŠADD.L‚D3,A2ŽA2=ADDR.�OF�BYTE�AFTER�RECORD$ŠMOVE.B�#CR,(A2)‹STORE�CR�AFTER�REC.3ŠSUB.L‚#2,A1ŽOUTPUT�'.�'�ONLY�IF�LINE�WAS�PROCESSEDŠMOVE.W�#'.�',(A1) ŠBSR„PROC#ŠBEQ.S‚SYS35.5ŒBRANCH�IF�PROCESSING)ŠMOVE.W�#'‚',(A1)‰INDICATE�NOT�PROCESSING#SYS35.5ƒMOVE.L�CMDIOS+IOSRRN(PC),D0)ŠADD.L‚#1,D0ŽConvert�RRN�to�1-relative...ŠBSR„BDCONŽ...line�number0ŠLEA„CMDBUFN(PC),A1…Beginning�of�line�to�display(ŠMOVE.L�D0,(A1)ŒPlug�converted�number�in)ŠMOVE.L�GLOBCNT(PC),D0…Global�line�numberŠBSR„BDCONŽConvert�to�ASCII+ŠLEA„CMDBUFN0(PC),A1„Plug�into�listing�lineŠMOVE.L�D0,(A1)ŠPASS1.S�SYS35.8 ŠBSR„LISOUT ŠBNE„IOERRSYS35.8ƒMOVE.L�IOSSAD(A0),A1*NOW PARSE COMMAND ŠBSR„SKPSPCŠCMP.B‚#CR,(A1) ŠBEQ„NXTCMD-ŠCMP.B‚#'*',(A1)ŠIF�COMMENT�LINE,�THEN�IGNORE"ŠBEQ„NXTCMD�BRANCH�IF�COMMENT�LINE-ŠCMP.B‚#'=',(A1)ŠIS�THIS�A�DIRECT�INVOCATION?ŠBEQ.S‚INVOKŽBRANCH�IF�YESŠBSR„GETPAR�GET�PARAMETER�NAME!ŠBCC.S‚SYS35.95‹INVALID�parameterŠPASS1.S�SYS35.95SYS35.9ƒBRA„CERR1*A1 POINTS TO NEXT BYTE:SYS35.95‚MOVE.B�D1,TMPSYM+PLEN-B(A6)�SAVE�PARAMETER�LENGTH1*MUST NOW DETERMINE IF PARAMETER IS KNOWN COMMANDŠLEA„CMDTBL(PC),A0SYS36…LEA„TMPSYM(PC),A2 ŠTST.L‚(A0)ŠBEQ„PAR�END�OF�TABLEŠCMP.L‚(A0)+,(A2)+ ŠBNE.S‚SYS38ŽNO�MATCH-CHECK�NEXTŠCMP.L‚(A0)+,(A2)+ŠBNE.S‚SYS39ŽNO�MATCH*PARAMETER IS VALID COMMAND/ŠBSR„PROC�ARE�WE�IN�CONDITIONAL�PROCESSING�MODE/ŠBEQ.S‚SYS36.5ŒBRANCH�IF�YES�-�PROCESS�NORMALLY.ŠCMP.W‚#'IF',-8(A0)‡IS�THIS�AN�'IFXX'�COMMAND?6ŠBEQ.S‚SYS36.5ŒIF�YES�THEN�BRANCH�AND�PROCESS�NORMALLY1ŠCMP.L‚#'ENDC',-8(A0)…IS�THIS�AND�'ENDC'�COMMAND?(ŠBNE„NXTCMD�NO�-�SO�DON'T�PROCESS�AT�ALL*(* JUMP TO APPROPRIATE ROUTINE TO PROCESSSYS36.5ƒPASSL.S�SYS36.7ŠLEA„PASS1C(PC),A24ŠCMP.L‚A2,A0ŽCan�we�execute�this�on�an�initial�pass?ŠBLO„NXTCMD�Branch�if�noSYS36.7ƒMOVE.L�(A0),A0 ŠADD.L‚A6,A0ŽADD�IN�SEGMENT�BASE ŠJMP„(A0)SYS38…TST.L‚(A0)+SYS39…TST.L‚(A0)+ ŠBRA„SYS36*1* DIRECTLY INVOKE THE PROGRAM ON THE COMMAND LINE$B+C4A<>D?LNTM\LdHlLt@|D„DŒ;”IœD¤G¬N´S¼OÄJÌJÔPÜ]ä>ì9ôIüUZ wn INVOK…EQU„*ŠPASS1.L�NXTCMDŠBSR„PROC�ARE�WE�PROCESSING?ŠBNE„NXTCMD�BRANCH�IF�NO*/ŠMOVE.L�A1,-(A7)‹SAVE�POINTER�INTO�COMMAND�LINE2ŠMOVE.L�IOSSAD(A0),A1†BASE�ADDRESS�OF�COMMAND�LINE ŠBSR„LOGOUT�LOG�THE�COMMAND�LINE2ŠMOVE.L�(A7)+,A1‹RESTORE�POINTER�INTO�COMMAND�LINE*C* DON'T PROCESS '=' INVOCATION IF WE HAVEN'T SEEN RESTART MATCH YETŠBTSTƒ#SOPT,OPTFLG-B(A6) ŠBNE„NXTCMD*ŠMOVE.L�D3,D0ŽLENGTH�OF�COMMANDŠADD.L‚#1,A1ŽBYPASS�'='%INVOK2„CMP.B‚#$0D,(A1)ŠFIND�PROG�NAME3ŠBEQ.S‚INVOK2.5‹BRANCH�IF�AT�BEGINNING�OF�PROG�NAMEŠCMP.B‚#'�',(A1)9ŠBNE.S‚INVOK2.5‹Branch�if�we're�at�beggining�of�prog�name+ŠADD.L‚#1,A1ŽContinue�search�for�prog�name. ŠBRA.S‚INVOK2$* A1 POINTS TO 1ST CHAR OF PROG NAME2* D0 CONTAINS LENGTH OF COMMAND LINE FROM A1 TO CRINVOK2.5‚MOVE.L�A1,A0<ŠLEA„LDRFHS-B(A6),A6„Point�to�FHS�parameter�block�in�LDR�PB.*ŠBSR„EDITFILE‹Let�Arnold�put�file�name�in.ŠLEA„B(PC),A6‹Rebase�A6ŠTST.L‚D0‘See�if�syntax�error!ŠBLT„CERR2ŽBranch�if�syntax�error*I* A1 pointin g to beginning of program name, move to character immediately*ƒfollowing�program�name.INVOK4„CMP.B‚#$0D,(A1).ŠBEQ.S‚INVOK5�Branch�if�at�following�characterŠCMP.B‚#'�',(A1).ŠBEQ.S‚INVOK5�Branch�if�at�following�character ŠADD.L‚#1,A1 ŠBRA.S‚INVOK4*J* We're at the blank (or carriage return) between prog name and arguments.'*ƒAdvance�to�the�argument�list�(if�any)INVOK5„CMP.B‚#'�',(A1)0ŠBNE.S‚INVOK6�Branch�when�A1�points�to�arguments ŠADD.L‚#1,A1 ŠBRA.S‚INVOK5*<* We're at beginning of argument list or at carriage return.:*„See�how�long�argument�list�is�-�put�that�number�into�D0.INVOK6„CLR.L‚D0INVOK6.5‚CMP.B‚#$0D,-1(A1,D0) ŠBEQ.S‚INVOK8 ŠADD.L‚#1,D0ŠBRA.S‚INVOK6.5*8INVOK8„BSR„CJUSTŽJUSTIFY�COMMAND�LINE�ON�EVEN�BYTE�BNDRY)ŠMOVE.B�D0,LDRCLL-B(A6)„LENGTH�OF�COMMAND'ŠMOVE.L�A1,LDRCL-B(A6)…START�OF�COMMAND*!ŠBRA„ASM34ŽGO�FINISH�LOAD�AND�RUNŠPAGE*H* SUBROUTINE TO DETERMINE IF RESTART LINE (SUBSTRING) MATCHES IN COMMAND*ƒINPUT.*D* RETURN EQ CONDITION CODES IF MATCH, NE CONTITION CODES IF NO MATCH* LENGTH OF SUBSTRING IN REPLGH* SUBSTRING BASED AT REPLY* LENGTH OF COMMAND IN CMDLGH* COMMAND BASED AT CMDBUF* A1,A2,A3,A4,A5,D4 DESTROYED* MCHTESTƒEQU„*,ŠTST.L‚REPLGH-B(A6)‡IS�SUBSTRING�ZERO�LENGTH,ŠBEQ.S‚MCHRTS�BRANCH�IF�YES�-�ALWAYS�MATCHES(ŠLEA„CMDBUF(PC),A2†ADDR�OF�INPUT�COMMAND#ŠLEA„REPLY(PC),A1‡SUBSTRING�ADDRESS ŠMOVE.L�A2,A46ŠADD.L‚CMDLGH-B(A6),A4„A4�POINTS�TO�END�OF�COMMAND�+�1 ŠMOVE.L�A1,A38ŠADD.L‚REPLGH-B(A6),A3„A3�POINTS�TO�END�OF�SUBSTRING�+�1M10‡MOVE.L�A4,D4-ŠSUB.L‚A2,D4ŽLENGTH�OF�REMAINING�COMMAND�LINEŠCMP.L‚REPLGH-B(A6),D4'ŠBLO.S‚MCHRTS�BRANCH�IF�NOT�ENOUGH�LEFT ŠMOVE.L�A2,A5ŽCOMPARISON�POINTERM15‡CMPM.B�(A1)+,(A5)+!ŠBNE.S‚M20�BRANCH�ON�NO�MATCH�YET!ŠCMP.L‚A1,A3ŽDONE�WITH�SUBSTRING?ŠBNE.S‚M15�BRANCH�IF�NO!ŠBRA.S‚MCHRTS�MATCH�-�THIS�IS�IT!.M20‡LEA„REPLY(PC),A1‡RESTORE�SUBSTRING�POINTER.ŠADD.L‚#1,A2ŽTRY�NEXT�POSITION�IN�COMMAND�LINE ŠBRA.S‚M10,MNMCH…TST.L‚(A7)�SET�UNEQUAL�CONDITION�CODES MCHRTS„RTSŠPAGE*2*PAR ASSUMES, SINCE COMMAND WAS NOT IN TABLE, THAT*…THIS�IS�A�PARAMETER�STATEMENT**…A1=POINTER�TO�BYTE�1�PAST�PARAMETER�NAME PAR‡EQU„**ŠBSR„PROC�ARE�WE�CONDITIONALLY�PROCESSING?ŠBNE„NXTCMD�BRANCH�IF�NOT%*SKIP OVER ALL SPACES AFTER PARAMETER ŠBSR„SKPSPC!*…A1�NOW�POINTS�TO�1ST�NONE�SPACEŠCMP.B‚#'=',(A1)+ŠBEQ.S‚PAR10ŽSyntax�ok2ŠPASS1.L�NXTCMDŒBad�syntax�on�initial�pass�ignored+ŠBRA„CERR2ŽBad�syntax�on�last�pass�reported*PAR10…BSR„SKPSPC�SKIP�OVER�ANY�MORE�SPACES%*NOW SHOULD BE READY TO PROCESS VALUE)*FIRST CHAR. MUST BE $, ', -, *,", OR 0-9'ŠMOVE.B�(A1),D0ŒSAVE�1ST�CHAR.�OF�VALUEŠCMP.B‚#APOS,D0‹APOSTROPHE?!ŠBEQ.S‚PSTR�YES-GO�PROCESS�STRINGŠCMP.B‚#'*',D0$ŠBEQ„PLC�VALUE�CONTAINS�LOC.�COUNTERŠCMP.B‚#'$',D0ŠBEQ.S‚PNUM�HEX�NO.ŠCMP.B‚#'"',D0ŒDOUBLE�QUOTE?+ŠBEQ.S‚PLIT�BRANCH�IF�YES�-�PROCESS�LITERAL ŠBRA.S‚PNUM�ASSUME�DECIMAL�VALUE***VALUE IS STRING FIELD-MOVE TO VALUE FIELD&*…OF�SYMBOL,�CHECKING�for�VALID�SYNTAX'*…A1=POINTER�TO�BEGINNING�OF�STRING�(') PSTR†EQU„* ŠBSR„GETSTR&VALPRC„BCC.S‚VALP09�Branch�if�no�error,ŠPASS1.L�NXTCMDŒOn�initial�pass�ignore�error2ŠBRA„CERR3ŽReport�invalid�value�error�on�last�pass8VALP09„MOVE.B�D1,TMPSYM+VLEN-B(A6)�SAVE�LENGTH�OF�STRING9VALP10„MOVE.B�TMPSYM-B(A6),D0„See�if�redefinition�symbol.ŠCMP.B‚RPTCHR(PC),D01ŠBNE.S‚VALP11�Branch�if�can't�redefine�this�type.&VALP10.5‚BSR„CHKSTI�Insert�new�symbol.*ŠBCS„ERR8�Branch�if�symbol�table�overflow.ŠBRA„NXTCMD�Go�for�next�command*5VALP11„BSR„CHKSTŽSee�if�entry�exists�in�symbol�table.$ŠBCC.S‚VALP12�Branch�if�no�duplicate1ŠPASS1.L�NXTCMDŒOn�initial�pass�ignore�duplicates1*Symbol was in table, address of symbol is in A3.=ŠBTSTƒ#PPASL,PFLAG(A3)ƒHas�symbol�been�inserted�in�last�pass?5ŠBNE„CERR4ŽReport�duplicate�symbol�error�on�last�pass&ŠBRA„VALP10.5‹Go�insert�symbol�any�way+*Symbol not in symbol table-insert if room.VALP12„BSR„INSSTŠBCS„ERR8�SYMBOL�TABLE�OVERFLOW#ŠBRA„NXTCMD�GO�PROCESS�NEXT�COMMAND*/*Val ue is a number starting with '$' or decimal*#*…A1=Pointer�to�beginning�of�stringPNUMŠBSR„EXP$ŠBCC.S‚PLC16ŽBranch�if�expression�ok,ŠPASS1.L�NXTCMDŒOn�initial�pass�ignore�error2ŠBRA„CERR3ŽReport�invalud�value�error�on�last�pass*'* VALUE STARTS WITH " - MUST BE LITERAL*'*…A1=POINTER�TO�BEGINNING�OF�STRING�(")PLIT†BSR„GETLTR ŠBRA„VALPRCŠPAGE*(*VALUE STARTS WITH *-MUST GET NUMBER AND*…CALCULATE�ACTUAL�VALUE*…A1�POINTS�TO�*PLC ŠTST.B‚(A1)+ŽPoint�to�next�byte.*MUST BE + OR - OR CR OR SPACEŠMOVE.L�CLC-B(A6),D31ŠMOVE.B�(A1),D2ŒFirst�byte�of�possible�expressionŠCMP.B‚#'�',D2 ŠBEQ.S‚PLC15 ŠCMP.B‚#CR,D2 ŠBEQ.S‚PLC15#*HEX OR DECIMAL VALUE MUST FOLLOW *.PLC10…BSR„EXP�CONVERT�DECIMAL�OR�HEX�TO�BINARYŠBCC.S‚PLC12ŽBranch�if�no�error2ŠPASS1.L�NXTCMDŒDon't�report�error�on�initial�pass2ŠBRA„CERR3ŽReport�invalid�value�error�on�last�pass*…D0=BINARY�VALUE*…D3=VALUE�OF�CLC!PLC12…ADD.L‚D0,D3ŽADD�VALUE�TO�PC.*…D3=BINARY�VALUE�TO�BE�ASSIGNED�TO�PARAMETER-*…MUST�CONVERT�TO�HEX�ASCIIPLC15…MOVE.L�D3,D04PLC16…BSR.S‚MAKTMPHŒSet�up�symbol�in�temporary�area. ŠBRA„VALP10 K*�MAKTMPH�sets�up�symbol�in�temporary�area�TMPSYM.‚Symbol�must�have�numeric*ƒvalue.,*‰ENTRY:�D0�=�Binary�number�value�of�symbol.*�TMPSYM�=�ASCII�symbol�value3*�TMPSYM+PLEN�=�Byte�value�containing�symbol�length*6*�MAKTMPH�fills�in�TMPSYM+PVAL�(value)�and�TMPSYM+VLEN*’(value�length).* MAKTMPHƒEQU„*ŠMOVEM.L�D1/A2,-(A7)5ŠMOVE.L�#PARLEN+VALLEN,D1‚Length�of�parameter�+�value<ŠLEA„TMPSYM+PARLEN+VALLEN(PC),A2�Blank�fill�from�right�side.!MAKT05„CMP.B‚TMPSYM+PLEN-B(A6),D1 ŠBEQ.S‚MAKT10>ŠMOVE.B�#'�',-(A2)‰Blank�out�value�and�right�side�of�sym�field ŠSUB.L‚#1,D1 ŠBRA.S‚MAKT05MAKT10„LEA„TMPSYM+VALUE(PC),A26ŠMOVE.B�#'$',(A2)+‰Set�in�leading�dollar�sign�for�hex.ŠBSR.S‚VLENGTH5ŠBSR„BINHEX�Convert�to�hex�and�stuff�into�value�fieldŠADD.L‚#1,D1ŽAccount�for�'$'1ŠMOVE.B�D1,TMPSYM+VLEN-B(A6)�Plug�length�of�valueŠMOVEM.L�(A7)+,D1/A2ŠRTS*I* VLENGTH returns the length of the value field required for storing this *ƒnumber.*‰ENTRY:�D0�=�Binary�number9*‰EXIT:‚D1�=�Length�required�to�store�number�in�hex�ASCII*—(not�including�the�'$').**‰Only�D1�is�altered.* VLENGTHƒEQU„*ŠMOVE.L�D0,-(A7) ŠMOVE.L�#7,D1VLEN05„LSR.L‚#4,D0 ŠTST.L‚D0 ŠBEQ.S‚VLEN10 ŠSUB.L‚#1,D1 ŠBNE.S‚VLEN05VLEN10„SUB.L‚#8,D1 ŠNEG.L‚D1ŠMOVE.L�(A7)+,D0ŠRTSŠPAGE**USR PROCESSES TASK USER NUMBER&*…A1=POINTER�TO�1ST�BYTE�AFTER�COMMAND*USR ŠBSR„SKPSPCŠCMP.B‚#'=',(A1)+ŠBNE„CERR2ŽSYNTAX�ERROR ŠBSR„SKPSPC*…A1=1ST�CHAR.�OF�VALUE$*VALUE MUST BE 2 BYTE HEX OR DECIMALŠBSR„EXPŠBCS„CERR3ŽINVALID�VALUE&*MAKE SURE VALUE NOT TOO BIG FOR WORD-'*HIGH ORDER WORD MUST BE ALL 0'S OR 1'SŠSWAPƒD0 ŠTST.W‚D0 ŠBEQ.S‚USR10 ŠCMP.W‚#-1,D0ŠBNE„CERR5ŽVALUE�TOO�BIG*VALID-SAVE USER NO. USR10…SWAPƒD0ŠMOVE.W�D0,USER-B(A6)!*Insert USER as symbol into table6ŠMOVE.L�#'USER',TMPSYM-B(A6)�Symbol�for�USER�parameter-ŠMOVE.B�#4,TMPSYM+PLEN-B(A6)�Length�of�symbolŠBSR„MAKTMPHŒMake�TMPSYM3ŠBSR„CHKSTI�Insert�into�table�even�if�already�thereŠBCS„CERR12�Error�if�table�full ŠBRA„NXTCMDŠPAGE*"*SES PROCESSES TASK SESSION NUMBER"*…A1=POINTER�TO�BYTE�AFTER�COMMAND*SES ŠBSR„SKPSPCŠCMP.B‚#'=',(A1)+ŠBNE„CERR2ŽSYNTAX�ERROR ŠBSR„SKPSPC*…A1=1ST�CHAR.�OF�VALUE*VALUE MUST BE HEX OR DECIMALŠBSR„EXPŠBCS„CERR3ŽINVALID�VALUE)ŠMOVE.L�D0,SESSION-B(A6)ƒSAVE�SESSION�NO.$*Insert SESSION as symbol into table9ŠMOVE.L�#'SESS',TMPSYM-B(A6)�Symbol�for�SESSION�parameterŠMOVE.L�#'ION�',TMPSYM+4-B(A6)-ŠMOVE.B�#7,TMPSYM+PLEN-B(A6)�Length�of�symbolŠBSR„MAKTMPHŒMake�TMPSYM3ŠBSR„CHKSTI�Insert�into�table�even�if�already�thereŠBCS„CERR12�Error�if�table�full ŠBRA„NXTCMDŠPAGE**PRI PROCESSES TASK PRIORITY&*…A1=POINTER�TO�1ST�BYTE�AFTER�COMMANDPRI ŠBSR„SKPSPCŠCMP.B‚#'=',(A1)+ŠBNE„CERR2ŽSYNTAX�ERROR ŠBSR„SKPSPC*…A1=1ST�CHAR.�OF�VALUE$*VALUE MUST BE 1 BYTE HEX OR DECIMALŠBSR„EXP ŠBCS„CERR3ŽINVALID�VALUE%*MAKE SURE VALUE NOT TOO BIG FOR BYTE*…D0=CONVERTED�VALUE ŠMOVE.L�D0,D1 ŠOR.Bƒ#$FF,D0 ŠCMP.L‚#-1,D0"ŠBEQ.S‚PRI10ŽHIGH�ORDER�BITS�ALL�1 ŠCLR.B‚D0 ŠTST.L‚D0ŠBNE„CERR5ŽVALUE�TOO�BIG*VALID-SAVE PRIORITYPRI10…MOVE.B�D1,PRIOR-B(A6) ŠMOVE.L�D1,D0%*Insert PRIORITY as symbol into table:ŠMOVE.L�#'PRIO',TMPSYM-B(A6)�Symbol�for�PRIORITY�parameterŠMOVE.L�#'RITY',TMPSYM+4-B(A6)-ŠMOVE.B�#8,TMPSYM+PLEN-B(A6)�Length�of�symbolŠBSR„MAKTMPHŒMake�TMPSYM3ŠBSR„CHKSTI�Insert�into�table�even�if�already�thereŠBCS„CERR12�Error�if�table�full ŠBRA„NXTCMDŠPAGE*A*EXCL ADDS SEGMENT NAME TO LIST OF SEGMENTS TO BE EXCLUDED FROM A*‚TASK�OR�PROCESS&*…A1=POINTER�TO�1ST�BYTE�AFTER�COMMAND* EXCL†EQU„* ŠBSR„SKPSPC ŠBSR„GETPAR1ŠBCS„CERR14�BRANCH�ON�BAD�SYNTAX�FOR�SEGMENT�NAME ŠCMP.L‚#4,D1'ŠBHI„CERR14�BRANCH�ON�SEG�NAME�TOO�LONG*** MOVE SEGMENT NAME TO LIST IF IT WILL FIT;ŠMOVE.W�EXCLNUM-B(A6),D0ƒNUMBER�OF�EXCLUDED�SEGMENTS�SO�FARŠCMP.W‚#MAXSEG,D0'ŠBEQ„CERR15�BRANCH�ON�TOO�MANY�SEGMENTS ŠADD.W‚#1,D0;ŠMOVE.W�D0,EXCLNUM-B(A6)ƒUPDATE�NUMBER�OF�EXCLUDED�SEGMENTS!ŠLSL.W‚#2,D0ŽMAKE�LONG�WORD�INDEXŠLEA„EXCLLST-4(PC),A00ŠMOVE.L�TMPSYM-B(A6),0(A0,D0.W)‚PLUG�NEW�NAME�IN ŠBRA„NXTCMDŠPAGE**STE PROCESSES TASK STATE&*…A1=POINTER�TO�1ST�BYTE�AFTER�COMMAND*STEŠLEA„STETBL(PC),A0ŠLEA„STATE(PC),A4/*COMMON PROCESSING FOR ATTRIBUTE/STATE COMMANDSSTEATT ŠBSR„SKPSPCŠCMP.B‚#'=',(A1)+ŠBNE„CERR2ŽSYNTAX�ERROR ŠBSR„SKPSPC*…A1=1ST�CHAR�OF�VALUE*VALUE MUST BE STRINGŠCMP.B‚#APOS,(A1)#ŠBNE„CERR3ŽNOT�STRING-INVALID�VALUE ŠBSR„GETSTR ŠBCS„CERR38*STRING MUST BE AT LEAST 6 BYTES (INCLUDING APOSTROPHES) ŠCMP.W‚#6,D1ŠBCS„CERR6ŽINVALID�STATE*SEARCH STATE TABLE FOR STRINGSTE10…LEA„TMPSYM+VALUE+1(PC),A2ŠTST.L‚(A0)�END�OF�TABLE?ŠBEQ„CERR6ŽYES-NOT�VALID�STATE ŠMOVE.W�#4,D3 ŠMOVE.L�A0,A3STE15…CMP.B‚(A2)+,(A3)+ŠBNE.S‚STE20ŽNO�MATCHŠDCNTƒD3,STE15 ŠTST.L‚(A0)+ ŠCLR.L‚D3 ŠCLR.L‚D0ŠLEA„ATTR(PC),A3ŠIF.L�A3��A4�THEN.S;*�We're�modifying�the�attributes�field.‚In�this�case�we�are=*�allowed�to�set�multiple�bits�with�separate�ATTRIB�commands.1�MOVE.B�(A0),D3ŒByte�to�affect�in�word�size�field3�IF��THEN.SŒIf�less�then�bit�must�be�turned�off�NEG.L‚D3ŽActual�bit�to�affect�BSETƒD3,D0‹Set�the�bit(�NOT.L‚D0ŽFix�so�'AND'�will�turn�off�bit'�AND.W‚D0,(A4)‰Turn�off�appropriate�bit�ELSE.S�BSETƒD3,D0‹Set�bit�to�affect%�OR.WƒD0,(A4)‰Turn�on�appropriate�bit�ENDIŠELSE.S8*�We're�modifying�the�state�field.‚In�this�case,�we�must9*�overwrite�the�entire�state�word.‚We�are�only�allowed�to9*�set�one�bit�for�a�specific�task�with�the�STATE�command.�MOVE.B�(A0),D3ŒBit�to�affect�IF��THEN.S.�CLR.W‚(A4)ŒTurn�off�entire�word�if�bit�is�off�ELSE.S �BSET‚D3,D0.�MOVE.W�D0,(A4)‰Set�only�this�bit�if�bit�is�on�ENDIŠENDI ŠBRA„NXTCMD!STE20…TST.L‚(A0)+ŽSKIP�OVER�STATE"ŠTST.W‚(A0)+ŽSKIP�OVER�STATE�VALUE ŠBRA.S‚STE10ŠPAGE**ATT PROCESSES TASK ATTRIBUTES&*…A1=POINTER�TO�1ST�BYTE�AFTER�COMMANDATT1ŠLEA„ATTTBL(PC),A0†SET�UP�ATTRIBUTE�TABLE�POINTER1ŠLEA„ATTR(PC),A4ˆSET�UP�POINTER�TO�ATTRIBUTE�WORD ŠBRA„STEATTŠPAGE*.*PPC CHANGES VALUE OF CURRENT LOCATION COUNTER#*…A1=POINTER�TO�CHAR.�AFTER�COMMAND*PPC ŠBSR„SKPSPCŠCMP.B‚#'=',(A1)+ŠBNE„CERR2ŽSYNTAX�ERROR ŠBSR„SKPSPC*…A1=1ST�CHAR.�OF�VALUE#ŠCLR.L‚D3‘0�CURRENT�PC�IN�CASE�NO�*%*VALUE MUST START WITH * OR BE NUMBERŠCMP.B‚#'*',(A1)ŠBNE.S‚PPC25ŽNO�*ŠTST.B‚(A1)+ŽSKIP�OVER�*-ŠMOVE.L�CLC-B(A6),D3‡GET�CURRENT�LOC.�COUNTERŠCLR.L‚D0‘ZERO�NUMBER&*CHAR AFTER * MUST BE + OR CR OR SPACEŠCMP.B‚#'�',(A1) ŠBEQ.S‚PPC30ŠCMP.B‚#CR,(A1) ŠBEQ.S‚PPC30*<*CONVERT NUMBER TO BINARY TO BE USED AS NEW LOCATION COUNTER PPC25…BSR„EXPŠBCS„CERR3ŽINVALID�VALUE%*MAKE SURE NUMBER IS ON PAGE BOUNADRY ŠMOVE.L�D0,D2ŠAND.L‚#$FF,D2 ŠBNE„CERR12�NOT�ON�PAGE�BOUNDARY#*MAKE SURE NEW VALUE .GE. OLD VALUE *…D0=NUMBER*…D3=OLD�PC�OR�0PPC30…ADD.L‚D0,D3E*IF CLC IS ZERO THEN THIS PC  COMMAND CAME BEFORE ANY TASK, PROCESS ORB*ƒSEGMENT�COMMAND.‚IN�THAT�CASE,�DO�NOT�WRITE�ZEROES�TO�TEMP�FILE,@*ƒBUT�SIMPLY�SET�CLC�AND�BASEADDR�TO�THE�COMPUTED�ADDRESS�VALUE.ŠTST.L‚CLC-B(A6)#ŠBNE.S‚PPC35ŽBRANCH�IF�NOT�1ST�TIMEŠMOVE.L�D3,CLC-B(A6)%ŠBSR.S‚PCUPDATŒUpdate�symbol�table�PCŠMOVE.L�D3,BASEADDR-B(A6) ŠBRA.S‚PPC37PPC35…CMP.L‚CLC-B(A6),D3!ŠBLT„CERR7ŽPC�LESS�THAN�OLD�VALUE/*ZERO SPACE IN BOOT FILE BETWEEN OLD AND NEW PC%ŠBEQ.S‚PPC37ŽBRANCH�IF�ZERO�FILL�DONE ŠBSR„ZERBUF ŠBRA„PPC35*PPC37…LEA„PCDSP(PC),A2 ŠMOVE.L�#6,D1ŠMOVE.L�CLC-B(A6),D0'ŠBSR„BINHEX�CONVERT�NEW�PC�VALUE�TO�HEX(ŠLEA„PCMSG(PC),A1‡DISPLAY�NEW�PC�MESSAGEŠLEA„PCMSGE(PC),A2 ŠBSR„LISOUT ŠBNE„IOERR#ŠBRA„NXTCMD.5‹BACK�FOR�NEXT�COMMAND*G*�Subroutine�to�update�symbol�table�PC�value.‚Should�be�called�whenever*ƒCLC�is�changed. PCUPDATƒEQU„*ŠMOVE.L�D0,-(A7)/ŠMOVE.L�CLC-B(A6),D0‡Binary�value�of�PC�counter1ŠMOVE.L�#'PC‚',TMPSYM-B(A6)�Symbol�for�PC�counter-ŠMOVE.B�#2,TMPSYM+PLEN-B(A6)�Length�of�symbolŠBSR„MAKTMPHŒMake�TMPSYM3ŠBSR„CHKSTI�Insert�into�table�even�if�already�thereŠMOVE.L�(A7)+,D0ŠRTSŠPAGE***MSG PROCESSING LIST COMMAND TO LOG DEVICE*MSG‡LEA„CMDBUF(PC),A1ŠLEA„CMDBUFE(PC),A2 ŠBSR„LOGOUTŠBRA.S‚NXTCMD.5***PSE LIST PAUSE COMMAND TO LOG DEVICE THEN+*„ISSUES�1�BYTE�INPUT�TO�WAIT�FOR�RESPOINSEPSE0ŠBTSTƒ#SOPT,OPTFLG-B(A6)�IS�'S'�OPTION�STILL�SET&ŠBNE„NXTCMD�BRANCH�IF�YES�-�SKIP�PAUSEH* If we're in batch mode then ignore PAUSE - just go on to next command.5*ƒWe're�in�batch�mode�if�D0�(on�startup)�says�'&BCT'.ŠCMP.L‚#'&BCT',MONITOR-B(A6) ŠBEQ„NXTCMD8* ASSIGN TERMINAL FOR INPUT USING SUBFHS PARAMETER BLOCKŠLEA„SUBFHS(PC),A6†P.B.�ADDRESS&ŠBSR„SETDEF�SET�DEFAULT�STUFF�IN�THERE ŠMOVE.L�A6,A0ŠLEA„B(PC),A6‹REBASE�A6;ŠMOVE.L�CNID-B(A6),FHSVOL(A0)�SET�UP�DEVICE�NAME�FOR�ASSIGN!ŠMOVE.W�#FHASGN,FHSCMD(A0)�ASSIGN%ŠMOVE.W�#FOPPR,FHSOPT(A0)‚PUBLIC�READ&ŠMOVE.B�#SFLUN,FHSLUN(A0)‚LOGICAL�UNITŠFHSCALL�(A0)ŽDO�THE�ASSIGN ŠBNE„IOERRŠLEA„CMDBUF(PC),A1ŠLEA„CMDBUFE(PC),A2 ŠBSR„LOGOUT ŠMOVE.L�A1,A0#ŠMOVEM.L�A0-A1,SUBSIOS+IOSSAD-B(A6)PSE.1…IOSCALL�SUBSIOS(PC)ŠBEQ.S‚NXTCMD.5ŠCMP.B‚#ISTATO,D0 ŠBEQ.S‚PSE.1 ŠBRA„IOERRNXTCMD.5‚LEA„SUBFHS(PC),A0ŠBSR„CLOSEŽCLOSE�THE�ASSIGNMENT ŠMOVE.L�A0,A6 ŠBSR„SETDEF�RESET�DEFAULT�VALUES ŠLEA„B(PC),A6 ŠBRA„NXTCMDŠPAGE*#*SUBS COMMAND SUBSTITUTES PARAMETER*…VALUES�IN�SOURCE�FILES*$*…A1=POINTER�TO�1�BYTE�AFTER�COMMAND*SUBSŠBTSTƒ#SOPT,OPTFLG-B(A6)0ŠBNE„NXTCMD�DON'T�PERFORM�IF�'S'�OPTION�STILL�ON ŠBSR„SKPSPC�SKIP�OVER�ANY�SPACES ŠMOVE.L�A1,A5&SUBS05„MOVE.L�A5,A0ŽSTART�OF�FILE�NAMEŠLEA„LISFHS(PC),A6 ŠBSR„SETDEF ŠBSR„EDITFILEŠLEA„B(PC),A6‹REBASE�A6ŠLEA„LISFHS(PC),A4 ŠTST.L‚D0ŠBMI„CERR8ŽINVALID�FILE�NAME!ŠBTSTƒ#19,D0�FILE�NAME�SPECIFIED?ŠBEQ„CERR9ŽFILE�NAME�MISSING"ŠMOVE.B�D1,D5ŽSAVE�TERMINATOR�BYTE&ŠMOVE.L�A0,A5ŽSAVE�START�OF�NEXT�FIELDC*DON'T ALLOW MORE THAN 7 CHARS. IN FILE NAME OF SUBS. FILE TO ALLOW *„FOR�'X'ŠCMP.B‚#'�',FHSFIL+7(A4)ŠBNE„CERR13�NAME�TOO�LONG *TRY TO ASSIGN SUBSTITUTION FILEŠMOVE.W�#FOPER,FHSOPT(A4)ŠMOVE.B�#SFLUN,FHSLUN(A4)ŠMOVE.W�#FHASGN,FHSCMD(A4) ŠFHSCALL�(A4) ŠBNE„IOERR+ŠMOVE.W�FHSOPT(A0),D0†SEE�WHAT�FILE�TYPE�ISŠAND.W‚#FFTBIT,D0'ŠBEQ„SERR1ŽBRANCH�IF�CONTIGUOUS�(ERROR)!*MOVE FHS INFO TO XFILE FHS BLOCKŠLEA„SUBFHS(PC),A2ŠLEA„LISFHS(PC),A0ŠMOVE.W�#FHSBLN,D0SUBS20„MOVE.B�(A0)+,(A2)+ŠDCNTƒD0,SUBS20ŠLEA„SUBFHS(PC),A0ŠMOVE.B�#XSFLUN,FHSLUN(A0)2*MOVE FILE NAME DOWN 1 BYTE AND PUT X AT BEGINNINGŠLEA„SUBFHS(PC),A0 ŠBSR„INSXK*Set in user default volume name (not volume name from which we're SUBSing)ŠMOVE.L�DEFVOLN(PC),FHSVOL(A0)K*Set in user default user number (not user number from which we're SUBSing)ŠMOVE.W�DEFUSRN(PC),FHSUSN(A0)*DELETE 'X' FILEŠMOVE.W�#FHDELT,(A0)ŠFHSCALL�(A0)ŽDO�THE�DELETE*ASSIGN 'X' FILE SEQUENTIAL1ŠMOVE.W�#FHASGN+FHALLO,FHSCMD(A0)�ASSIGN/ALLOCATECŠMOVE.W�#FOPEREW+FOPSEQ,FHSOPT(A0)�EXCLUSIVE�READ/WRITE,�SEQUENTIAL  ŠFHSCALL�(A0) ŠBNE„IOERR"*SET UP BUFFER START/END ADDRESSES*ŠMOVE.L�SUBBUF1-B(A6),SUBSIOS+IOSSAD-B(A6)*ŠMOVE.L�SUBBUF2-B(A6),SUBSIOS+IOSEAD-B(A6)ŠPAGE,*FILES ARE BOTH ASSIGNED-PROCESS EACH RECORD-SUBS35„IOSCALL�SUBSIOS(PC)‡READ�SOURCE�RECORD ŠBEQ.S‚SUBS40ŠCMP.B‚#ISTAEOF,D0!ŠBEQ.S‚SUBCON�DONE�WITH�THIS�FILE ŠBRA„IOERR SUBS40„EQU„**£01/10/85‚vvvvv7ŠBTST.B�#COPT,OPTFLG-B(A6)�See�if�the�'C'�option�is�setŠIF��THEN.S,ŠMOVEM.L�D0/A0-A1,-(A7)„Save�users�registers=ŠLEA„SYMBUFF+2+PARLEN(PC),A1�Get�the�address�of�the�buffer�on*£where�to�put�the�filename@ŠLEA„LISFHS+FHSCLG(PC),A0�Get�the�address�of�the�paramater�block)*£that�has�the�filename�that�we�are�usingŠFOR.B‚D0�=�#1�TO�#18�DO.S3ŒMOVE.B�(A0)+,(A1)+†Move�the�filename�to�the�bufferŠENDF/ŠMOVEM.L�(A7)+,D0/A0-A1„Restore�users�registersŠENDI*£01/10/85‚^^^^^*ŠBSR.S‚SUB00ŽPERFORM�ARGUMENT�SUBSTITUTION"*END OF RECORD-WRITE OUTPUT RECORD SUBS58„EQU„*ŠLEA„SUBXIOS(PC),A0ŠMOVE.L�IOSSAD(A0),IOSEAD(A0)ŠMOVE.L�SUBSIOS+IOSLEN-B(A6),D0 ŠBEQ.S‚SUBS59 ŠSUB.L‚#1,D0-SUBS59„ADD.L‚D0,IOSEAD(A0)†POINT�TO�LAST�BYTE ŠIOSCALL�(A0) ŠBNE„IOERRŠBRA„SUBS35�GO�DO�NEXT�REOCRD*/*SENDS ERROR MESSAGE TO LIST AND LOG DEVICE AND+*…CONTINUES�PROCESSING�SUBSTITUTION�COMMAND(SERR1…LEA„SMSG1(PC),A1‡INVALID�FILE�TYPEŠLEA„SMSG1E(PC),A2SERR0…BSR„EMLOGLIS ŠBNE„IOERRŠPAGE:*FILE SUBSTITUTION COMPLETE-CLOSE BOTH FILES AND GOTO NEXT*…D5=TERMINATING�CHAR.'*…A5=POINTER�TO�START�OF�NEXT�FILE�NAMESUBCON„LEA„LISFHS(PC),A0 ŠBSR.S‚CLOSEŠLEA„SUBFHS(PC),A0 ŠBSR.S‚CLOSE!*SEE IF ANOTHER FILE NAME FOLLOWSŠCMP.B‚#'/',D5ŠBEQ„CERR2ŽSYNTAX�ERRORŠCMP.B‚#',',D5ŠBEQ„SUBS05�MORE�FILESŠBRA„NXTCMD�DONE�W/SUBSTITUTION*CLOSE…MOVE.W�#FHCLOS,FHSCMD(A0) ŠFHSCALL�(A0)ŠRTSŠPAGE%*************************************-* SUBROUTINE TO PERFORM ARGUMENT SUBSTITUTION0*ƒ1.�PERFORM�SUBSTITUTION�FROM�SYSGEN'S�INTERNAL*ˆPARAMETER�SUBSTITUTION�LIST./*ƒ2.�PERFORM�SUBSTITUTION�USING�SBARG�FROM�USER*ˆDEFINED�SESSION�ARGUMENTS.9*ƒSTEP�1�IS�PERFORMED�RECURSIVELY�BY�MAKING�SUBSTITUTIONS2*…THROUGHOUT�THE�ENTIRE�LINE�AND�IF�ANY�UNRESOLVED3*…SUBSTITUTIONS�RESULT,�THE�UPDATED�LINE�IS�SCANNED5*…AGAIN.‚THE�MAXIMUM�DEPTH�OF�RECURSION�IS�DETERMINED*…BY�THE�SUBSMAX�EQUATE.*9*�ENTRY:‚A0�-�POINTS�TO�PARAMETER�BLOCK�OF�DATA�LINE�THAT*�HAS�JUST�BEEN�READ* *‰BSR„SUB00*:*�EXIT:ƒA0�-�POINTS�TO�SAME�PARAMETER�BLOCK�BUT�THE�IOSLEN'*�FIELD�HAS�BEEN�UPDATED�TO�REFLECT�THE0*�CHANGED�LENGTH�OF�THE�LINE�AFTER�SUBSTITUTIONS**�HAVE�BEEN�MADE.‚A�CARRIAGE�RETURN�ALWAYS1*�TERMINATES�THE�LINE.‚A�COPY�OF�THE�UPDATED�LINE4*�APPEARS�IN�XMDLNE�AS�WELL�AS�THE�BUFFER�ASSOCIATED *�WITH�A0.***‰CONDITION�CODES�-*ŽMINUS�IF�BUFFER�OVERFLOW1*–ERROR�MESSAGE�IS�DISPLAYED�ON�LISOUT�AND�LOGOUT*ŽEQUAL�IF�NO�BUFFER�OVERFLOW*:*ŽIF�A�PARAMETER�CANNOT�BE�FOUND,�'0'�IS�INSERTED�IN�PLACE2*�OF�THAT�PARAMETER,�AN�ERROR�MESSAGE�IS�DISPLAYED7*�TO�LISOUT�AND�LOGOUT�AND�NORMAL�PROCESSING�CONTINUES.**‰SUBSTITUTION�FLAG�SUBFLG�-0*ŽSUBDUN�SET�TO�1�IF�ANY�SUBSTITUTIONS�WERE�DONE**‰ALL�REGISTERS�ARE�PRESERVED*$*ƒXMDLNE�IS�USED�AS�A�WORKING�BUFFER%************************************** SUB00…EQU„**-ŠMOVEM.L�D0-D7/A0-A5,-(A7)�SAVE�ALL�REGISTERS1ŠCLR.W‚SUBCNT-B(A6)‡CLEAR�RECURSION�DEPTH�COUNTER7ŠBCLRƒ#SUBDUN,SUBFLG-B(A6)�CLEAR�SUBSTITUTION�DONE�FLAG*2SUB15…MOVE.L�IOSSAD(A0),A1†STARTINB�BUFFER�ADDRESS+ŠMOVE.L�IOSEAD(A0),D5†ENDING�BUFFER�ADDRESS/ŠMOVE.L�IOSLEN(A0),D4†NUMBER�OF�BYTES�JUST�READ0ŠBNE.S‚SUB16ŽBRANCH�IF�MORE�THAN�ZERO�BYTES�READ-ŠMOVE.B�#'�',XMDLNE-B(A6)‚NULL�INPUT�IS�BLANKŠMOVE.B�#'�',(A1)%ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDTION�CODES ŠBRA„SUBEXITSUB16…SUB.L‚A1,D5)ŠLEA„XMDLNE(PC),A4†WORKING�BUFFER�ADDRESS%ŠADD.L‚A4,D5ŽD5�=�LAST�LEGAL�ADDRRESS*"* INSURE THAT CR TERMINATES RECORDŠMOVE.B�#CR,0(A1,D4.L)*$SUB42…MOVE.B�(A1)+,D4‹GET�INPUT�BYTEŠCMP.B‚#CR,D4�END�OF�INPUT?5ŠBEQ„SUBAGN�BRANCH�IF�YES�-�GO�SUB�AGAIN�IF�NECESSARY**ŠCMP.L‚D5,A4ŽSEE�IF� RECORD�GROWN�TOO�LARGE)ŠBHI„SUBMIŽBRANCH�IF�SUBSTITUTION�TOO�BIGŠCMP.B‚#'\',D4+ŠBEQ.S‚SUB45ŽBRANCH�TO�GO�TRY�TO�SUBSTITUTEŠMOVE.B�D4,(A4)+ŠBRA.S‚SUB42ŽKEEP�MOVING* * PARAMETER MAY FOLLOW BACKSLASHSUB45…BSR„GETPARS*?* IF THE PARAMETER WAS LESS THAN 2 CHARS, DON'T DO SUBSTITUTION-*ƒSINCE�ASSUMED�TO�BE�MACRO�OR�SBARG�ARGUMENT ŠCMP.W‚#2,D1 ŠBCC.S‚SUB50ŽBRANCH�IF�>�2�CHARS** DON'T DO SUBSTITUTION0SUB48…MOVE.B�#'\',(A4)+‰PUT�'\'�IN�OUTPUT�BUFFERŠTST.B‚D1‘PARAMETER�LENGTH�=�0?ŠBEQ„SUB42ŽBRANCH�IF�YES* MOVE PARAMETER NAME TO OUTPUTSUB49…LEA„TMPSYM(PC),A3 ŠBRA„SUB55#* NOW SEARCH SYMBOL TABLE FOR VALUESUB50…BSR„CHKST&ŠBCS.S‚SUB52ŽBRANCH�IF�PARAMETER�FOUND1* COMPLAIN OF 'PARAMETER NOT DEFINED' AND CONTNUE@ŠBSETƒ#UNDEF,MSCFLG-B(A6)�Set�undefined�symbol�encountered�flag.%ŠPASS1.S�SUB48�Bypass�on�initial�passŠMOVEM.L�A0/A1,-(A7)ŠLEA„SMSG3+2(PC),A1ŠMOVE.L�TMPSYM-B(A6),(A1)ŠMOVE.L�TMPSYM+4-B(A6),4(A1) ŠSUB.L‚#2,A1ŠLEA„SMSG3E(PC),A2 ŠBSR„EMLOGLISŠMOVEM.L�(A7)+,A0/A1 ŠBNE„IOERR/ŠMOVE.B�#'0',(A4)+‰INSERT�0�FOR�PARAMETER�VALUE ŠBRA„SUB42* MOVE VALUE TO DEST RECORD*£01/10/85‚vvvvv�THEN.S,ŠMOVEM.L�A0/A3/A5,-(A7)„Save�users�registers9ŠLEA„SYMBUFF(PC),A5…Get�the�address�of�the�buffer�for�the*£symbol�table�file7ŠMOVE.W�#$0003,(A5)+‡This�means�that�this�parameter�was *£referenced'*£If�this�is�the�last�pass�then�we�will)*£save�this�label�and�the�filename�to�the*£symbol�table�file.>ŠIF.WƒPASS-B(A6)��#-1�THEN.S�If�this�is�the�last�pass�thenŒFOR.B‚D0�=�#1�TO�#PARLEN�DO.S1ŽMOVE.B�(A3)+,(A5)+„move�parameter�name�to�bufferŒENDF;ŒLEA„SYMFHS(PC),A0„Get�the�address�of�the�symbol�table�file*£parameter�block7ŒMOVE.W�#FHASGN,FHSCMD(A0)�Get�ready�to�assign�the�fileŒFHSCALL�SYMFHS(PC)†Go�do�it ŒBNE„IOERR<ŒLEA„SYMBUFF(PC),A0ƒGet�the�start�address�of�the�buffer�that'*£contains�the�symbol�and�the�file�that**£referenced�the�symbol�and�save�it�in�theAŒMOVE.L�A0,SYMIOS+IOSSAD-B(A6)�IOS�parameter�block�for�the�symbol *£table�file.BŒADD.L‚#PARLEN+2+18-1,A0�Get�the�ending�address�of�the�buffer�that'*£contains�the�symbol�and�the�file�that**£referenced�the�symbol�and�save�it�in�theAŒMOVE.L�A0,SYMIOS+IOSEAD-B(A6)�IOS�parameter�block�for�the�symbol *£table�file.#ŒIOSCALL�SYMIOS(PC)†Go�write�it�out ŒBNE„IOERR:ŒLEA„SYMFHS(PC),A0„Get�the�address�of�the�symbol�table�FHS*£parameter�block.6ŒMOVE.W�#FHCLOS,FHSCMD(A0)�Get�ready�to�close�the�fileŒFHSCALL�SYMFHS(PC)†Go�do�it ŒBNE„IOERRŠENDI/ŠMOVEM.L�(A7)+,A0/A3/A5„Restore�users�registersŠENDI*£01/10/85‚^^^^^#ŠMOVE.B�VLEN(A3),D1ˆLENGTH�OF�VALUE"ŠLEA„VALUE(A3),A3‡ADDRESS�OF�VALUE4ŠBSETƒ#SUBDUN,SUBFLG-B(A6)�FLAG�SUBSTITUTION�AS�DONE** D1.B = NO. OF CHARS TO MOVE*�A3ƒ=�SOURCE�ADDR.*�A4ƒ=�DEST�ADDR. SUB55…EQU„*ŠTST.B‚D1‘ARE�WE�THROUGH?SUB56…BEQ„SUB42ŽBRANCH�IF�YES ŠCMP.L‚D5,A4ŽHAVE�WE�OVERFLOWED?ŠBHI.S‚SUBMIŽBRANCH�IF�YES/ŠMOVE.B�(A3)+,(A4)+ˆMOVE�SUBSTITUTION�CHARACTER ŠSUB.B‚#1,D1 ŠBRA.S‚SUB56* * MOVE RECORD/SUBAGN„BSR.S‚SUBMOV�MOVE�RECORD�TO�ORIGINAL�LOC=ŠBCLRƒ#SUBDUN,SUBFLG-B(A6)�DID�WE�DO�ANY�SUBSTITUTIONS�SO�FARŠBEQ.S‚SUBEXITŒBRANCH�IF�NOŠMOVE.W�SUBCNT-B(A6),D0 ŠADD.L‚#1,D0.ŠMOVE.W�D0,SUBCNT-B(A6)„BUMP�RECURSION�COUNTER2ŠCMP.W‚#SUBMAX,D0‰HAVE�WE�HIT�MAX�RECURSION�DEPTH?ŠBEQ.S‚SUBMIŽBRANCH�IF�YES.ŠBRA„SUB15ŽBRANCH�IF�NO�-�GO�FOR�ANOTHER�CYCLE*+SUBMOV„MOVE.L�IOSSAD(A0),A1†MOVE�TO�ADDRESS$ŠLEA„XMDLNE(PC),A3†MOVE�FROM�ADDRESS ŠMOVE.L�A4,D0 ŠSUB.L‚A3,D05ŠMOVE.L�D0,IOSLEN(A0)†ADJUST�LENGTH�FIELD�IN�IOS�P.B.SUBMOV2ƒCMP.L‚A4,A3%ŠBHS.S‚SUBMOVEX‹BRANCH�IF�DONE�MOVINGŠMOVE.B�(A3)+,(A1)+ŠBRA.S‚SUBMOV2 SUBMOVEX‚RTS** COMPLAIN OF RECORD TOO LARGE SUBMI…EQU„*ŠPASS1.S�SUBEXITŠMOVE.L�A1,-(A7)ŠLEA„SMSG2(PC),A1ŠLEA„SMSG2E(PC),A2 ŠBSR„EMLOGLISŠMOVE.L�(A7)+,A1 ŠBNE„IOERR)ŠOR.Bƒ#$8,SR�SET�NEGATIVE�CONDITION�CODES!SUBEXITƒMOVEM.L�(A7)+,D0-D7/A0-A5ŠRTSŠPAGE**ASM SETS UP COMMAND LINE FOR*†ASSEMBLER�AND�ENVOKES� IT#*…A1=POINTERE�TO�BYTE�AFTER�COMMANDASMŠBTSTƒ#SOPT,OPTFLG-B(A6),ŠBNE„NXTCMD�DON'T�DO�IF�'S'�OPTION�STILL�SET ŠBSR„SKPSPC-ŠLEA„XMDLNE(PC),A2†COMMAND�LINE�FOR�ASSEMBLERASM05…LEA„LISFHS(PC),A6 ŠMOVE.L�A1,A05ŠBSR„SETDEF�SET�DEFAULT�VOLUME,�USER�NO.�CATALOG,�EXT*GET ASSEMBLER SOURCE FILES ŠBSR„EDITFILEŠLEA„B(PC),A6‹REBASE�A6ŠLEA„LISFHS(PC),A4 ŠTST.L‚D0ŠBMI„CERR8ŽINVALID�FILE�NAME!ŠBTSTƒ#19,D0�FILE�NAME�SPECIFIED?ŠBEQ„CERR9ŽFILE�NAME�MISSING*…D1.B=TERMINATOR*…A0=START�OF�NEXT�FIELD1*TRY TO ASSIGN FILE WITH 'X' PRECEEDING FILE NAME*‚USING�LISFHS�PARAMETER�BLOCK%ŠMOVE.L�A0,A3ŽSAVE�START�OF�NEXT�FILE!ŠMOVE.L�A4,A0ŽLISFHS�P.B.�ADDRESSŠSUB.L‚A5,A5ŽSET�UP�FOR�NO�'X'-ŠMOVE.L�D0,D5ŽSAVE�ERROR�STATUS�FROM�EDITFILE ŠBSR„INSX!ŠMOVE.W�#FHASGN,FHSCMD(A0)�ASSIGN%ŠMOVE.W�#FOPPR,FHSOPT(A0)‚PUBLIC�READ9ŠMOVE.B�#SFLUN,FHSLUN(A0)‚SOURCE�FILE�LOGICAL�UNIT�NUMBER ŠFHSCALL�(A0)ŠBNE.S‚ASM10ŽCAN'T�USE�'X'�FILE7*'X' FILE EXISTS-PUT ITS NAME IN ASSEMBLER COMMAND LINEŠMOVE.W�#FHCLOS,FHSCMD(A0)ŠFHSCALL�(A0)ŽCLOSE�FILE6*MUST DETERMINE WHERE NAME FIELD STARTS-WORK BACKWARDS&*…(SKIPPING�OVER�EXTENSION�IF�ENTERED)$ŠMOVE.L�A3,A5ŽA5=START�OF�NEXT�FIELD!ŠBTSTƒ#18,D5�EXTENSION�SPECIFIED?ŠBEQ.S‚ASM07ŽNO-*SCAN BACKWARD UNTIL START OF EXTENSION FOUNDASM06…CMP.B‚#'.',-(A5) ŠBNE.S‚ASM06(*SEARCH BACKWARD THROUGH FILE NAME UNTIL%*…BEGINNING�OF�FIELD�OR�.�ENCOUNTERED1ASM07…CMP.B‚#'.',-(A5)‰POINT�TO�LAST�BYTE�OF�NAME)ŠBEQ.S‚ASM08ŽBEGINNING�OF�FILE�NAME�FOUNDŠCMP.L‚A1,A5ŽAT�BEGINNING?ŠBHI.S‚ASM07ŽNO ŠBRA.S‚ASM091ASM08…TST.B‚(A5)+ŽPOINT�TO�1ST�CHAR.�OF�FILE�NAMEASM095*MOVE SOURCE FILE THROUGH TERMINATOR TO OUTPUT BUFFERG*A5=ADDR. OF START OF NAME FILED IF 'X' IS TO BE INSERTED (= OTHERWISE)ASM10…CMP.L‚A3,A1 ŠBCC.S‚ASM20ŠCMP.L‚A5,A1ŽMOVE�IN�'X'�YET?ŠBNE.S‚ASM15ŽNOŠMOVE.B�#'X',(A2)+‰YESASM15…MOVE.B�(A1)+,(A2)+ ŠBRA.S‚ASM10*MORE INPUT FILES?ASM20…CMP.B‚#'/',D1ŠBEQ.S‚ASM05ŽYES-GO�GET*NO-MOVE REMAINDER OF LINEASM25…CMP.B‚#CR,D1ŠBEQ.S‚ASM30ŽDONE�MOVING�DATAŠMOVE.B�(A1)+,D1ŠMOVE.B�D1,(A2)+ ŠBRA.S‚ASM25ŠPAGE*-*COMMAND LINE FOR ASSEMBLER HAS BEEN CREATED-*…READY�TO�ENVOKE�ASM *…A2=LAST�BYTE�OF�COMMAND�LINE+1ASM30(ŠSUB.L‚#1,A2ŽPOINT�A2�TO�CARRIAGE�RETURNŠLEA„XMDLNE-8(PC),A1ŠMOVE.W�#'-�',(A1))ŠMOVE.L�#'=ASM',2(A1)†FOR�MESSAGE�DISPLAYŠMOVE.W�#'‚',6(A1)*ŠBSR„LOGLIS�DISPLAY�ASSEMBLER�COMMAND�LINE1ŠSUB.L‚XMDLNE1-B(A6),A2ƒA2=LENGTH�OF�COMMAND�LINE ŠMOVE.L�A2,D00ŠMOVE.B�D0,LDRCLL-B(A6)„SAVE�COMMAND�LINE�LENGTH4ŠMOVE.L�XMDLNE1-B(A6),LDRCL-B(A6)�COMMAND�LINE�STARTŠMOVE.L�#'ASM�',LDRFN-B(A6)6*SET UP TO SEND COMMAND FILE TO TASK AS LU 5 WITH KEEPASM34…LEA„LISFHS(PC),A0ŠMOVE.B�#CFLUN,FHSLUA(A0)!ŠMOVE.W�#FOPSLU+FOPKEP,FHSOPT(A0)*%*ENTER HERE TO FINISH LINK PROCESSING* ASM35…EQU„*ŠLEA„LDRBLK(PC),A0.ŠMOVE.L�#$01,D0ŒUSE�PASSED�TASK�NAME,�PRIORITYŠTRAPƒ#4‘LOAD�ASMŠBNE„LDRERR�LOADER�ERROR9*ASM OR LINK HAS BEEN LOADED-SEND CDFLU AND LDFLU TO TASK*ŠMOVE.L�(A0),LISFHS+FHSTSK-B(A6)�TASK�NAME.ŠMOVE.L�4(A0),LISFHS+FHSSES-B(A6)�TASK�SESSION#ŠMOVE.L�(A0),STRBLK-B(A6)‚TASK�NAME)ŠMOVE.L�4(A0),STRBLK+4-B(A6)�TASK�SESSION'ŠMOVE.L�(A0),SAVEREG+TN-B(A6)�TASK�NAMEŠLEA„LISFHS(PC),A0ŠMOVE.W�#FHCHLU,FHSCMD(A0)ŠMOVE.B�#CDFLUN,FHSLUB(A0) ŠFHSCALL�(A0) ŠBNE„IOERR:ŠMOVE.W�#FOPSLU+FOPKEP,FHSOPT(A0)�SET�UP�FOR�SEND�AND�KEEP2ŠMOVE.B�#LDFLUN,FHSLUA(A0)�TRANSFER�LDFLUN�TO�TASKŠMOVE.B�#LDFLUN,FHSLUB(A0) ŠFHSCALL�(A0) ŠBNE„IOERR%*NOW START UP TASK AND WAIT FOR EVENT*…TO�INDICATE�COMPLETION ŠCLR.L‚D0ŠLEA„STRBLK(PC),A0ŠMOVE.B�LDRCLL-B(A6),D0DŠMOVE.L�D0,SAVEREG+CL-B(A6)�SAVE�COMMAND�LINE�LENGTH�IN�START�UP�REGŠERQ.START�(A0) ŠBNE„STRERRŠERQ.SETASQ�#7 ŠERQ.WTEVNT ŠBRA„NXTCMDŠPAGE*<*ASR ENTRY POINT-COMES HERE AFTER TASK WHICH WAS ENVOKED HAS *…COMPLETED*TSKCOMŠERQ.RDEVNT�TCOMBLK(PC)6*LOAD DIAGNOSTIC AND ABORT REGESTERS INTO SYMBOL TABLE!ŠMOVE.L�D0,-(A7)‹SAVE�VALUE�OF�D0 ŠCLR.L‚D0$ŠMOVE.W�$14(A0),D0‰ABORT�BINARY�CODEŠMOVE.W�#4,D1Ž4�BYTES�OF�OUTPUT4ŠMOVEƒ #ABRT-SYMSTR+1,A2‚CONVERT�BIN�TO�HEX�ASCII�ANDŠADD.L‚SYMADR-B(A6),A2ŠBSR„BINHEX�LOAD�SYMBOL�TABLE. ŠCLR.L‚D0)ŠMOVE.W�$16(A0),D0‰DIAGNOSTIC�BINARY�CODEŠMOVE.W�#4,D1Ž4�BYTES�OF�OUTPUT1ŠMOVEƒ#DIAG-SYMSTR+1,A2‚CONVERT�CODE�TO�ASCII�ANDŠADD.L‚SYMADR-B(A6),A2ŠBSR„BINHEX�LOAD�SYMBOL�TABLE.ŠMOVE.L�(A7)+,D0‹RESTORE�D0/*IF TASK ABORTED, PRINT ABORT MSG AND TERMINATE ŠCMP.B‚#$2,$12(A0)‡TASK�ABORTED?ŠBEQ„TSKERR�YES&ŠADD.L‚#66,A7�BYPASS�REGS�AND�RTR�INFO0ŠBTSTW‚#15,$16(A0)ˆWERE�ERRORS�DETECTED�BY�TASK?ŠBNE„CERR18�BRANCH�IF�YES ŠBRA„NXTCMDŠPAGE*<*LINK SETS UP COMMAND LINE FOR LINKAGE EDITOR AND ENVOKES IT$*…A1=POINTER�TO�1�BYTE�AFTER�COMMANDLNKŠBTSTƒ#SOPT,OPTFLG-B(A6),ŠBNE„NXTCMD�DON'T�DO�IF�'S'�OPTION�STILL�SET ŠBSR„SKPSPCŠLEA„LISFHS(PC),A6 ŠMOVE.L�A1,A0%ŠMOVE.L�A1,A2ŽSAVE�START�OF�FILE�NAMEŠBSR„SETDEF�SET�FILE�DEFAULTSŠMOVE.W�#'CF',FHSEXT(A6)ŠBSR„EDITFILE‹GET�FILE�NAMEŠLEA„B(PC),A6‹REBASE�A6ŠLEA„LISFHS(PC),A0 ŠTST.L‚D0"ŠBMI„CERR8ŽINVALID�FILE�DESCRIPTOR!ŠBTSTƒ#19,D0�FILE�NAME�SPECIFIED?ŠBEQ„CERR9ŽNO-ERROR-*MAKE SURE NO OTHER FILE NAME ON COMMAND LINEŠCMP.B‚#'�',D1 ŠBEQ.S‚LNK10 ŠCMP.B‚#CR,D1 ŠBNE„CERR8*USE 'X' FILE IF IT EXISTSLNK10…BSR„INSXŠMOVE.W�#FHASGN,FHSCMD(A0)ŠMOVE.W�#FOPPR,FHSOPT(A0)ŠMOVE.B�#SFLUN,FHSLUN(A0) ŠFHSCALL�(A0)ŠBEQ.S‚LNK15Ž'X'�FILE�OKAY/*'X' FILE DIDN'T ASSIGN-TRY REQUESTED FILE NAME ŠMOVE.L�A0,A6 ŠMOVE.L�A2,A0-ŠBSR„EDITFILE‹PUT�FILE�NAME�BACK�IN�FHS�BLOCK ŠFHSCALL�(A6)ŠLEA„B(PC),A6‹REBASE�A6 ŠBNE„IOERR0*CHAIN FILE FOR LINK COMMANDS HAS BEEN ASSIGNED-*…READ�1ST�LINE�FOR�COMMANDLNK15…LEA„SUBSIOS(PC),A0 ŠMOVE.L�XMDLNE1-B(A6),IOSSAD(A0) ŠMOVE.L�XMDLNE2-B(A6),IOSEAD(A0) ŠIOSCALL�(A0) ŠBNE„IOERR1*SET UP TO PASS COMMAND LINE AFTER 'LINK' TO LINKŠMOVE.L�IOSLEN(A0),D0ŠMOVE.L�IOSSAD(A0),A1ŠMOVE.B�#CR,0(A1,D0.L)!ŠCMP.B‚#'=',(A1)ŠCAN�START�WITH�= ŠBNE.S‚LNK20 ŠTST.B‚(A1)+ ŠSUB.L‚#1,D0,ŠCMP.B‚#'/',(A1)ŠALLOW�COMMENT�OF�TYPE�'=/*' ŠBNE.S‚LNK20ŠTST.B‚(A1)+ŽJUST�ADVANCE�A1ŠCMP.B‚#'*',(A1)/ŠBNE.S‚LNKERŽBRANCH�IF�NOT�COMMENT�AND�NOT�LINK1ŠBRA.S‚LNK15ŽBRANCH�FOR�NEXT�LINE�IF�JUST�COMMENTLNK20…CMP.B‚#'L',(A1)+#ŠBNE.S‚LNKERŽINVALID�LINK�STATEMENTŠCMP.B‚#'I',(A1)+ ŠBNE.S‚LNKERŠCMP.B‚#'N',(A1)+ ŠBNE.S‚LNKERŠCMP.B‚#'K',(A1)+ ŠBNE.S‚LNKERŠCMP.B‚#'�',(A1)+ ŠBNE.S‚LNKER* List the '=LINK' command lineŠMOVEM.L�D0/A1,-(A7)ŠMOVE.L�IOSLEN(A0),A2ŠMOVE.L�IOSSAD(A0),A1 ŠADD.L‚A1,A2 ŠSUB.L‚#2,A1ŠMOVE.W�#'-�',(A1)%ŠBSR„LOGLIS�DISPLAY�LINK�COMMAND�LINEŠMOVEM.L�(A7)+,D0/A1*#ŠSUB.L‚#4,D0ŽALLOW�FOR�CR�IN�BUFFER*SKIP OVER ALL SPACESŠCMP.B‚#'�',(A1) ŠBNE.S‚LNK25 ŠTST.B‚(A1)+ ŠSUB.L‚#1,D0 LNK25…EQU„*7ŠBSR.S‚CJUSTŽJUSTIFY�COMMAND�LINE�ON�EVEN�BYTE�BOUNDARY0ŠMOVE.B�D0,LDRCLL-B(A6)„SAVE�COMMAND�LINE�LENGTH'ŠMOVE.L�A1,LDRCL-B(A6)…START�OF�COMMANDŠMOVE.L�#'LINK',LDRFN-B(A6)?*SET UP TO SEND FILE ASSIGNMENT TO LINK AS LU 5 (DON'T KEEP IT)ŠLEA„LISFHS(PC),A0ŠMOVE.B�#SFLUN,FHSLUA(A0)ŠMOVE.W�#FOPSLU,FHSOPT(A0)ŠBRA„ASM35ŽGO�FINISH�LINK@*1ST RECORD DOESN'T START WITH LINK-CLOSE FILE AND PRINT MESSAGELNKER…LEA„LISFHS(PC),A0ŠMOVE.W�#FHCLOS,FHSCMD(A0) ŠFHSCALL�(A0) ŠBRA„CERR10%*************************************3* CJUST JUSTIFYS COMMAND LINE ON EVEN BYTE BOUNDARY* ENTRY:$*„A1�POINTS�TO�START�OF�COMMAND�LINE*„D0�CONTAINS�LENGTH�OF�COMMAND* EXIT:<*„COMMAND�LINE�MOVED�IF�REQUIRED�AND�A1�ADJUSTED�ACCORDINGLY* CJUST…EQU„*ŠMOVEM.L�D1/A0,-(A7)"ŠMOVE.L‚A1,D1�ADDR�OF�COMMAND�LINEŠBTSTƒ#0,D1ŽEVEN�BOUNDARY?ŠBEQ.S‚CJUSTX�BRANCH�IF�YES$ŠMOVE.L�A1,A0ŽNO�SO�MOVE�DOWN�A�BYTE ŠSUB.L‚#1,A1%ŠMOVE.L�D0,D1ŽNUMBER�OF�CHARS�TO�MOVE)CJUST2„BEQ.S‚CJUSTX�BRANCH�IF�DONE�MOVINGŠMOVE.B�(A0)+,-2(A0) ŠSUB.L‚#1,D1 ŠBRA.S‚CJUST2CJUSTX„MOVEM.L�(A7)+,D1/A0ŠRTSŠPAGE**PRC HANDLES PROCESS REQUEST&*…A1=POINTER�TO�1ST�BYTE�AFTER�COMMANDPRC(ŠBSR„FINTSK�FINISH�PREVIOUS�TASK/PROCESS ŠBSR„SKPSPC*GET PROCESS FILE NAMEŠLEA„TSKFHS(PC),A6 ŠMOVE.L�A1,A0ŠBSR„SETDEF�SET�DEFAULTSŠMOVE.W�#' LO',FHSEXT(A6) ŠBSR„EDITFILEŠLEA„B(PC),A6‹REBASE�A6 ŠTST.L‚D0ŠBMI„CERR8ŽINVALID�FILE�DESC.!ŠBTSTƒ#19,D0�FILE�NAME�SPECIFIED?ŠBEQ„CERR9ŽNO-ERROR-*MAKE SURE NO OTHER FILE NAME ON COMMAND LINEŠCMP.B‚#'�',D1 ŠBEQ.S‚PRC10 ŠCMP.B‚#CR,D1 ŠBNE„CERR82PRC10…MOVE.L�#-1,TPSW-B(A6)…INDICATE�DOING�PROCESS ŠBRA„NXTCMDŠPAGE**TSK HANDLES TASK REQUEST$*…A1POINTS�TO�1ST�BYTE�AFTER�COMMANDTSK(ŠBSR„FINTSK�FINISH�PREVIOUS�TASK/PROCESS ŠBSR„SKPSPC7* Set attributs and state words back to default values.ŠLEA„STATE(PC),A0ŠMOVE.W�#1<ŠMOVE.L�#'„',TASKN-B(A6)�SET�NME�TO�SPACES�IN�CASE�NOT�ENTEREDŠCMP.B‚#'�',D1ŠBEQ.S‚TSK10ŽNO�TASK�NAME ŠCMP.B‚#CR,D1 ŠBEQ.S‚TSK10ŠCMP.B‚#',',D1ŠBNE„CERR8ŽERROR#*A0 SHOULD BE POINTING AT TASK NAME.*…RETRIEVE�AND�MAKE�SURE�NO�MORE�THAN�4�CHARS. ŠMOVE.L�A0,A1 ŠBSR„GETPARŠBCS„CERR11�INVALID�TASK�NAME ŠCMP.L‚#4,D1ŠBHI„CERR11�TASK�NAME�TOO�LONG ŠMOVE.L�TMPSYM-B(A6),TASKN-B(A6).TSK10…MOVE.L�#1,TPSW-B(A6)†INDICATE�DOING�TASK ŠBRA„NXTCMDŠPAGE** IFXX TYPE COMMAND*IFEQC…LEA„IFEQT(PC),A0 ŠBRA.S‚IFXXCIFNEC…LEA„IFNET(PC),A0 ŠBRA.S‚IFXXCIFLTC…LEA„IFLTT(PC),A0 ŠBRA.S‚IFXXCIFLEC…LEA„IFLET(PC),A0 ŠBRA.S‚IFXXCIFGTC…LEA„IFGTT(PC),A0 ŠBRA.S‚IFXXCIFGEC…LEA„IFGET(PC),A0*3IFXXC…MOVE.L�A0,IFXXT-B(A6)…SAVE�COMPARISON�ADDRESS&ŠBSR.S‚PROC�ARE�WE�IN�PROCESSING�MODE?ŠBEQ.S‚IFXX20�BRANCH�IF�YES*B* NOT IN PROCESSING MODE - SIMPLY PUSH 1 TO INDICATE NO PROCESSING ŠMOVE.L�#1,D0 ŠBSR.S‚PUSHCŠBRA„NXTCMD�GO�FOR�NEXT�COMMAND** IN PROCESSING MODE -*ƒIF�TEST�SATIFIES*ƒTHEN *†PUSH�0�TO�PROPOGATE�PROCESSING*ƒELSE*†PUSH�1�TO�SET�NO�PROCESSING*IFXX20„BSR.S‚TESTXX,ŠBCC.S‚IFXX30�BRANCH�IF�NO�ERROR�ENCOUNTERED3ŠPASS1.S�IFXX30ŒBypass�error�processing�on�1st�pass*ŠMOVE.L�#1,D0ŽPUSH�NO�PROCESSING�FOR�ERROR ŠBSR.S‚PUSHC ŠBRA„CERR13IFXX30„BNE.S‚IFXX40�BRANCH�IF�TEST�DOES�NOT�SATISFY* TEST SATIFIES ŠCLR.L‚D0 ŠBSR.S‚PUSHC ŠBRA„NXTCMD* TEST DOES NOT SATISFYIFXX40„MOVE.L�#1,D0 ŠBSR.S‚PUSHC ŠBRA„NXTCMD%*************************************8* PROC SUBROUTINE RETURNS EQ IF PROCESSING, NE OTHERWISE*PROC†TST.L‚PROCNT-B(A6)#ŠBMI.S‚YESPROCŒBRANCH�IF�PROCESSING0ŠTST.L‚(A7)�SET�NE�COND�CODES�FOR�NOT�PROCESSINGŠBRA.S‚PROCRTS9YESPROCƒCMP.L‚D0,D0ŽSET�EQ�CONDITION�CODES�FOR�PROCESSING PROCRTSƒRTS%*************************************-* PULLC DECREASES CONDITIONAL DEPTH INDICATOR*ƒIF�WE�GO�FROM�NOT�PROCESSING*ƒTO�PROCESSING.*PULLC…SUB.L‚#1,STKCNT-B(A6)-ŠBLT„ERR15ŽBRANCH�IF�UNMATCHED�ENDC�STATEMENTŠMOVE.L�STKCNT-B(A6),D06ŠCMP.L‚PROCNT-B(A6),D0„DID�WE�CHANGE�PROCESSING�MODES?ŠBGE.S‚PULLC.XŒBRANCH�IF�NO,ŠMOVE.L�#-1,PROCNT-B(A6)ƒINDICATE�PROCESSING PULLC.XƒRTS%*************************************1* PUSHC INCREASES CONDITIONAL DEPTH INDICATOR AND-*ƒSETS�PROCNT�IF�A�TRANSITION�FROM�PROCESSING3*ƒTO�NO�PROCESSING�IS�DESIRED.‚PROCNT�WILL�INDICATE.*ƒTHE�DEPTH�AT�WHICH�PROCESSING�WAS�SUSPENDED.)* INPUT: D0 = 0 TEST SATISFY (PROCESSING)*‹=�1�TEST�FAIL�(NO�PROCESSING)**PUSHC…ADD.L‚#1,STKCNT-B(A6)ŠBSR„PROC�WERE�WE�PROCESSING?1ŠBNE.S‚PUSHC.XŒBRANCH�IF�CURRENTLY�NOT�PROCESSING$ŠTST.B‚D0‘DO�WE�CONTINUE�PROCESSING?ŠBEQ.S‚PUSHC.XŒBRANCH�IF�YESFŠMOVE.L�STKCNT-B(A6),PROCNT-B(A6)�NO�-�SET�NO�PROCESSING�DEPTH�INDICAT PUSHC.XƒRTS%*************************************'* TESTXX WILL TEST THE EXPRESSION VALUE)*ƒACCORDING�TO�THE�CONDITION�BASED�ON�THE%*ƒADDRESS�SAVED�IN�IFXXT.‚IF�THE�TEST'*ƒSATIFIES,�THEN�EQ�CONDITION�CODES�ARE)*ƒRETURNED.‚IF�TEST�DOES�NOT�SATISFY�THEN"*ƒNE�CONDITION�CODES�ARE�RETURNED.,*ƒIF�A�PARAMETER�DOES�NOT�EXIST�OR�IS�OF�THE&*ƒWRONG�TYPE�(NOT�DECIMAL�OR�HEX)�THEN)*ƒTHE�CARRY�CONDITION�IS�SET�UPON�RETURN./*ƒTHE�EX PRESSION�IS�SCANNED�IN�A�SIMPLE�LEFT�TO0*ƒRIGHT�MANNER,�EACH�ELEMENT�CAN�BE�A�PREVIOUSLY0*ƒDEFINED�PARAMETER�OR�A�DECIMAL�OR�HEX�CONSTANT-*ƒELEMENTS�ARE�SEPARATED�BY�'+'�OR�'-'�SIGNS.1*ƒTHE�EXPRESSION�IS�TERMINATED�BY�A�CR�OR�A�BLANK* * EXAMPLE*‰IFEQƒDOG+CAT-22**TESTXX„BSR„SKPSPC&TEST.05ƒBSR.S‚GETVAL�GET�VALUE�INTO�D0'ŠBCC.S‚TESTIF�Branch�if�good�expression* * ERROR ENCOUNTERED IN PARAMETERTESTX.99‚OR.Bƒ#1,SRŽSET�ERRORŠRTS*>* TESTIF FINALLY TEST CONDITION BASE ON SAVED ADDRESS IN IFXXTTESTIF„MOVE.L�IFXXT(PC),A0 ŠTST.L‚D0 ŠJSR„(A0)ŠRTS* IFEQT…RTS*IFNET…BNE.S‚EQRTN ŠBRA.S‚NERTN*IFLTT…BLT.S‚EQRTN ŠBRA.S‚NERTN*IFLET…BLE.S‚EQRTN ŠBRA.S‚NERTN*IFGTT…BGT.S‚EQRTN ŠBRA.S‚NERTN*IFGET…BGE.S‚EQRTN**NERTN…AND.B‚#0,SRŽCLEAR�C�AND�Z�CONDITIONSŠRTS#EQRTN…AND.B‚#0,SRŽCLEAR�C�CONDITION&ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODESŠRTS****************************7* GETVAL SUBROUTINE GETS VALUE OF PARAMETER OR CONSTANT *ƒINTO�D0!*ƒRETURNS�WITH�CARRY�SET�IF�ERROR*,GETVAL„MOVE.L�A1,A0ŽPOSITION�IN�INPUT�STRINGŠCMP.B‚#CR,(A0)+,ŠBEQ.S‚GETVMBAD‹BRANCH�IF�ONLY�CR�HERE�-�BAD ŠBSR„EXP�CONVERT�TO�BINARY�IN�D0ŠBRA.S‚GETVMRTS‹GO�RETURN**,GETVMBAD‚OR.Bƒ#1,SRŽSET�CARRY�FOR�BAD�RETURN* GETVMRTS‚RTSŠPAGE*6* ENDCC TERMINATES ONE LEVEL OF CONDITIONAL PROCESSING*ENDCC…BSR„PULLC ŠBRA„NXTCMDŠPAGE** INCLUDE instates include file)*ƒA2�=�pointer�to�1st�byte�after�command.7INCL†BSR„SKPSPC�A1�points�to�1st�character�of�file�name+ŠADD.W‚#1,INCLNEST-B(A6)‚Bump�nesting�levelEŠCMP.W‚#INCLMAX,INCLNEST-B(A6)�Have�we�exceeded�the�INCLUDE�nesting�?ŠBGT„ERR20ŽBranch�if�yes*4* Save the RRN and FHS P.B. of last file we were on.+ŠMOVE.L�INCLPTR-B(A6),A2ƒPoint�to�save�area:ŠMOVE.L�BOOTIOS+IOSRRN(PC),-(A2)�Save�random�record�number6ŠMOVEM.L�CMDFHS+FHSVOL(PC),D0-D5�Save�meat�of�FHS�P.B.ŠMOVEM.L�D0-D5,-(A2)-ŠMOVE.L�A2,INCLPTR-B(A6)ƒSave�updated�pointer*1* Close the file that we are currently prosessingŠLEA„CMDFHS(PC),A0,ŠMOVE.W�FHSCMD(A0),-(A7)ƒSave�former�commandŠMOVE.W�#FHCLOS,FHSCMD(A0)ŠTRAPƒ#3 ŠBNE„IOERR/ŠMOVE.W�(A7)+,FHSCMD(A0)ƒRestore�former�command*?* Set up defaults in command file FHS P.B. and perform editfile$ŠLEA„CMDFHS(PC),A6†Command�file�P.B. ŠBSR„SETDEF*ŠMOVE.L�A1,A0ŽPoints�to�file�name�to�parse ŠBSR„EDITFILE'ŠBMI„ERR21ŽBranch�if�error�in�file�name ŠLEA„B(PC),A6ŠLEA„CMDFHS(PC),A0ŠTRAPƒ#3‘Assign�the�file ŠBNE„IOERR*-* Display the file name that we just assignedŠPASS1.S�INCL08ŠLEA„INCMSG1I(PC),A1ŠLEA„CMDFHS+FHSVOL(PC),A0ŠBSR.S‚FFNAME�Format�file�nameŠLEA„INCMSG1(PC),A1ŠLEA„INCMSG1E(PC),A2%ŠMOVE.L�#'-�BE',(A1)‡Insert�'-�BEGIN'ŠMOVE.L�#'GIN�',4(A1) ŠBSR„LISOUT*"* Set RRN to zero on included file&INCL08„MOVE.L�#-1,BOOTIOS+IOSRRN-B(A6)*#* We're ready - go for next command ŠBRA„NXTCMD** Format file name for display/*ƒEntry�A0�-�points�to�volume�field�of�FHS�P.B.(*‰A1�-�points�to�place�to�move�file�name**ƒExit‚A0,A1,A2,D0�destroyed*L*ƒ30�spaces�are�blanked�out�first�to�account�for�longest�possible�file�name.*FFNAME„MOVE.L�#29,D0 ŠMOVE.L�A1,A24FFNAME2ƒMOVE.B�#'�',(A2)+‰Blank�out�receiveing�fieldŠDCNTƒD0,FFNAME2ŠMOVE.L�#4,D0ŽMove�volume�name ŠBSR.S‚MOVEIT0ŠMOVE.B�#':',(A1)+‰Place�':'�into�formatted�name ŠCLR.L‚D0(ŠMOVE.W�(A0)+,D0‹Pick�up�raw�user�numberŠBSR„BDCONV�Convert�to�ASCII0ŠMOVE.L�A1,D1ŽSee�if�we�are�on�odd�byte�boundary ŠBTSTƒ#0,D1.ŠBEQ.S‚FFNAME3ŒBranch�if�on�even�byte�boundary)ŠMOVE.B�#0,(A1)+‹Force�even�byte�boundary1FFNAME3ƒMOVE.L�D0,(A1)+‹Place�into�formatted�nameŠMOVE.B�#'.',(A1)+ ŠMOVE.L�#8,D0ŠBSR.S‚MOVEIT�CatalogŠMOVE.B�#'.',(A1)+ŠBSR.S‚MOVEIT�File�nameŠMOVE.B�#'.',(A1)+ ŠMOVE.L�#2,D0ŠBSR.S‚MOVEIT�ExtensionŠRTS*MOVEIT„MOVE.L�D0,-(A7)MOVEIT1ƒMOVE.B�(A0)+,(A1)++ŠCMP.B‚#'�',-1(A1)ˆDid�we�just�move�a�blankŠBNE.S‚MOVEIT2ŒBranch�if�no(ŠSUB.L‚#1,A1ŽYes�-�reset�move�to�pointerMOVEIT2ƒSUB.L‚#1,D0%ŠBNE.S‚MOVEIT1ŒBranch�if�more�to�mov eŠMOVE.L�(A7)+,D0ŠRTS**BDCON…BSR„BDCONV�Blank�out�null�characters ŠROL.L‚#8,D0 ŠBSR.S‚BDCONB ŠROL.L‚#8,D0 ŠBSR.S‚BDCONB ŠROL.L‚#8,D0 ŠBSR.S‚BDCONB ŠROL.L‚#8,D0ŠRTS*BDCONB„TST.B‚D0ŠBNE.S‚BDCONBXŠMOVE.B�#'�',D0 BDCONBXƒRTSŠPAGE** Restore former include file6RSTRINCƒSUB.W‚#1,INCLNEST-B(A6)‚Back�off�nesting�level(ŠCRASH.LT�*+1ŽCrash�if�this�ever�happens*1* Close the file that we are currently prosessingŠLEA„CMDFHS(PC),A0,ŠMOVE.W�FHSCMD(A0),-(A7)ƒSave�former�commandŠMOVE.W�#FHCLOS,FHSCMD(A0)ŠTRAPƒ#3 ŠBNE„IOERR/ŠMOVE.W�(A7)+,FHSCMD(A0)ƒRestore�former�command*.* Display the name of the file we are closing.ŠPASS1.S�RSTR08ŠLEA„INCMSG1(PC),A1ŠLEA„INCMSG1E(PC),A2#ŠMOVE.L�#'-�EN',(A1)‡Insert�'-�END'ŠMOVE.L�#'Dƒ',4(A1) ŠBSR„LISOUT*+* Reinstate RRN and FHS P.B. of former fileRSTR08„MOVE.L�INCLPTR(PC),A2ŠMOVEM.L�(A2)+,D0-D53ŠMOVEM.L�D0-D5,CMDFHS+FHSVOL-B(A6)�Restore�FHS�P.B..ŠMOVE.L�(A2)+,BOOTIOS+IOSRRN-B(A6)�Restore�RRNŠMOVE.L�A2,INCLPTR-B(A6)** Assign former fileŠLEA„CMDFHS(PC),A0ŠTRAPƒ#3 ŠBNE„IOERR*-* Display the file name that we just assignedŠPASS1.S�RSTR16ŠLEA„INCMSG2I(PC),A1ŠLEA„CMDFHS+FHSVOL(PC),A0 ŠBSR„FFNAME‰LEA‡INCMSG2I(PC),A1*œA1�=�Address�move�from‰LEA‡INCMSG1I(PC),A2*œA2�=�Address�move�to‰MOVE.B„#INCFILSZ,D0*œD0�=�Number�of�bytes�to�moveRSTR10:‰MOVE.B„(A1)+,(A2)+ ‰SUB.B…#1,D0 ‰BNE.S…RSTR10/*œMove�file�name�just�assigned�to�BEGIN/END�msg*œBranch�if�not�doneŠLEA„INCMSG2(PC),A1ŠLEA„INCMSG2E(PC),A2 ŠBSR„LISOUT** We're done - return to caller RSTR16„RTSŠPAGE**END ENDS TASK/PROCESS*END(ŠBSR„FINTSK�FINISH�PREVIOUS�TASK/PROCESS ŠBRA„NXTCMD**ABORT aborts sysgen*ABT‡MOVE.L�#ABORT,D0 ŠSUB.L‚A0,A0ŠTRAPƒ#1ŠPAGE**SEG HANDLES SEGMENT REQUEST%*…A1�POINTS�TO�1ST�BYTE�AFTER�COMMANDSEG(ŠBSR„FINTSK�FINISH�PREVIOUS�TASK/PROCESS ŠBSR„SKPSPC*GET SEGMENT FILE NAMEŠLEA„TSKFHS(PC),A6 ŠMOVE.L�A1,A0 ŠBSR„SETDEFŠMOVE.W�#'LO',FHSEXT(A6) ŠBSR„EDITFILEŠLEA„B(PC),A6‹REBASE�A6 ŠTST.L‚D0 ŠBMI„CERR8 ŠBTSTƒ#19,D0 ŠBEQ„CERR9&*SEE IF SEGMENT NAME FOLLOWS FILE NAME>ŠMOVE.L�#'„',TASKN-B(A6)�SET�NME�TO�SPACES�IN�CASE�NOT�ENTEREDŠCMP.B‚#'�',D1ŠBEQ„CERR14�NO�SEGMENT�NAME ŠCMP.B‚#CR,D1 ŠBEQ„CERR14ŠCMP.B‚#',',D1ŠBNE„CERR8ŽERROR&*A0 SHOULD BE POINTING AT SEGMENT NAME.*…RETRIEVE�AND�MAKE�SURE�NO�MORE�THAN�4�CHARS. ŠMOVE.L�A0,A1 ŠBSR„GETPAR ŠBCS„CERR14�INVALID�SEGMENT�NAME ŠCMP.L‚#4,D1!ŠBHI„CERR14�SEGMENT�NAME�TOO�LONG ŠMOVE.L�TMPSYM-B(A6),TASKN-B(A6).ŠMOVE.B�#1,SEGFLG-B(A6)„INDICATE�DOING�SEGMENT.ŠMOVE.L�#-1,TPSW-B(A6)…INDICATE�NOT�DOING�TASK ŠBRA„NXTCMDŠPAGE'*INSERT BOOT EXECUTION ADDR. IN MESSAGE DMSG†EQU„*+ŠBTSTƒ#MAPF,MAPFLG-B(A6)‚IS�MAP�TABLE�FULL?ŠBEQ.S‚DMSG1ŽBRANCH‚IF�NO,ŠLEA„MAPFM(PC),A1‡PRINT�OUT�MAP�FULL�MESSAGEŠLEA„MAPFME(PC),A2 ŠBSR„LOGLISDMSG1…BSR„BKLOGLIS3ŠBTSTƒ#ROPT,OPTFLG-B(A6)�IS�READ�ONLY�MEM�OPTION�ONŠBNE.S‚DMSG4ŽBRANCH�IF�YESŠMOVE.L�CLC-B(A6),D0 ŠMOVE.W�#6,D1ŠLEA„MSGFPC(PC),A2 ŠBSR„BINHEX$ŠLEA„MSGP(PC),A1ˆ'FINAL�PC�=�XXXXXX'ŠLEA„MSGPE(PC),A2 ŠBSR„LOGLISDMSG4…MOVE.L�PROCSTR-B(A6),D0 ŠMOVE.W�#6,D1ŠLEA„MSGD1(PC),A2 ŠBSR„BINHEXŠLEA„MSGD(PC),A1ˆSYSGEN�DONEŠLEA„MSGDE(PC),A2 ŠBSR„LOGLIS* PRINT OUT NUMBER OF SYMBOLS;DMSG5…LEA„SYMSTR1(PC),A0…START�ADDRESS�OF�USER�SYMBOL�TABLE=ŠMOVE.L�NXTSYM-B(A6),D0„NEXT�AVAILABLE�ADDRESS�FROM�SYMBOL�TA2ŠSUB.L‚(A0),D0ŒRESULT�=�#�OF�BYTES�IN�SYMBOL�TABLEŠDIVU.W�#SYMLEN,D0>ŠAND.L‚#$0000FFFF,D0†REGESTER�D0�CONTAINS�INTEGER�#�OF�SYMBOLSŠMOVE.W�D0,SYMCNT-B(A6)$ŠBSR„BDCONV�CONVERT�TO�DECIMAL�ASCII ŠCMP.L‚#0,D0 ŠBNE.S‚SKPA1ŠMOVE.L�#$30,D0)SKPA1…LEA„MSGOT1(PC),A2†STUFF�FOR�MESSAGEŠMOVE.L�D0,(A2)ŠLEA„MSGOT(PC),A1ŠLEA„MSGOTE(PC),A2 ŠBSR„LOGLIS*ŠBSR„BKLOGLIS‹BLANK�LINE ŠCLR.L‚D0%ŠMOVE.W�ERRCNT-B(A6),D0„ERROR�COUNTER&ŠBNE.S‚GOTERR�BRANCH�IF�WE�HAVE�ERRORS?ŠMOVE.L�#$00000030,ERMSG-B(A6)�MOVE�'0'�TO�ERROR�MESSAGE�BUFFER-ŠBRA.S‚ERMSGOUT‹GO�PUT�OUT�'0�ERRORS'�MESSAGE9GOTERR„BSR„BDC ONV�CONVERT�D0�FROM�BINARY�TO�DECIMAL�ASCII.ŠMOVE.L�D0,ERMSG-B(A6)…PLUG�INTO�ERROR�MESSAGEERMSGOUT‚LEA„ERMSGS(PC),A1ŠLEA„ERMSGE(PC),A2 ŠBSR„LOGLISŠLEA„FFS(PC),A1‰DO�FORM�FEEDŠLEA„FFE(PC),A2 ŠBSR„LISOUT*£01/10/85‚vvvvv7ŠBTST.B�#COPT,OPTFLG-B(A6)�See�if�the�'C'�option�is�set ŠIF��THEN;ŠLEA„SYMFHS(PC),A0†Get�the�address�of�the�symbol�table�file*£parameter�blockDŠMOVE.W�#FHASGN,FHSCMD(A0)�Get�ready�to�assign�the�symbol�table�fileŠFHSCALL�(A0)ŽGo�do�it ŠBNE„IOERR8ŠMOVE.L�#PDEF,D1‹Get�the�length�of�predefined�parameters;ŠDIVU.W�#SYMLEN,D1‰Divide�by�the�length�of�one�symbol�table'*£entry�to�get�the�number�of�predefined *£parameters=ŠLEA„SYMIOS(PC),A0†Get�the�address�of�the�IOS�parameter�block*£for�the�symbol�table�file>ŠLEA„SYMSTR(PC),A1†Get�the�beginning�address�of�the�predefined *£parameters.ŠFOR.W‚D2�=�#1�TO�D1�DO.S5ŒSUB.L‚#2,A1ŒBackup�2�bytes�so�that�we�can�define�the*£type�of�parameter�this�is.?ŒMOVE.W�#$0000,(A1)†This�means�that�this�symbol�is�a�predefined *£parameter.>ŒMOVE.L�A1,IOSSAD(A0)„Save�the�beginning�address�of�the�symbol**£table�entry�into�the�IOS�parameter�block>ŒADD.L‚#2+SYMLEN-1,A1ƒAdd�the�length�of�the�symbol�table�entryAŒMOVE.L�A1,IOSEAD(A0)„Save�the�ending�address�of�the�symbol�table%*£entry�into�the�IOS�parameter�block.5ŒADD.L‚#1,A1ŒAdd�1�so�that�we�will�be�pointing�to�the*£next�symbol�table�entry./ŒIOSCALL�(A0)ŒWrite�it�to�the�symbol�table�file ŒBNE.S‚IOERRŠENDF:ŠMOVE.L�SYMSTR1(PC),A1…Get�the�address�of�the�user�defined *£parameters.=ŠMOVE.W�SYMCNT(PC),D1†Get�the�number�of�symbols�in�the�symbol*£tableŠFOR.W‚D2�=�#1�TO�D1�DO.S5ŒSUB.L‚#2,A1ŒBackup�2�bytes�so�that�we�can�define�the*£type�of�parameter�this�is.?ŒMOVE.W�#$0001,(A1)†This�means�that�this�is�the�parameter�along*£with�its�value.>ŒMOVE.L�A1,IOSSAD(A0)„Save�the�beginning�address�of�the�symbol**£table�entry�into�the�IOS�parameter�block>ŒADD.L‚#2+SYMLEN-1,A1ƒAdd�the�length�of�the�symbol�table�entryAŒMOVE.L�A1,IOSEAD(A0)„Save�the�ending�address�of�the�symbol�table%*£entry�into�the�IOS�parameter�block.5ŒADD.L‚#1,A1ŒAdd�1�so�that�we�will�be�pointing�to�the*£next�symbol�table�entry./ŒIOSCALL�(A0)ŒWrite�it�to�the�symbol�table�file ŒBNE.S‚IOERRŠENDF=ŠLEA„SYMFHS(PC),A0†Get�the�address�of�the�FHS�parameter�block*£for�the�symbol�table�fileCŠMOVE.W�#FHCLOS,FHSCMD(A0)�Get�ready�to�close�the�symbol�table�fileŠFHSCALL�(A0)ŽGo�close�it ŠBNE.S‚IOERRŠENDI*£01/10/85‚^^^^^ ŠSUB.L‚A0,A02ŠMOVE.W�ERRCNT(PC),D0†Count�of�errors�encountered..ŠBEQ.S‚TERMIT�Branch�if�no�errors�encountered.5ŠOR.Wƒ#$C000,D0ŠSet�error�bits�in�RD�pseudo�register.ŠSWAPƒD0$TERMIT„MOVE.W�#TERM,D0‹Terminate�it.ŠTRAPƒ#1ŠPAGE#*PRINT I/O ERROR WITH LU AND STATUS *…D0.L=STATUS!*…A0=FHS�OR�IOS�PARM.�BLOCK�ADDR.*IOERR.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN ŠBRA„ERRTERM*PRINT LOADER ERROR WITH STATUS *„D0.L=STATUS LDRERR„EQU„*'ŠBTSTƒ#29,D0�TRAP�#4�ERROR�FROM�LOADER?ŠBNE.S‚LDRERR3ŒBRANCH�IF�YES2ŠBTSTƒ#27,D0�TRAP�#3�OR�TRAP�#1�ERROR�FROM�LOADER?-ŠBEQ.S‚LDRERR1ŒBRANCH�IF�NO�-�MUST�BE�TRAP�#2'ŠBTSTƒ#28,D0�TRAP�#3�ERROR�FROM�LOADER?,ŠBNE.S‚LDRERR2ŒBRANCH�IF�TRAP�#3�(FHS�ERROR)0LDRERR1ƒSUB.L‚A0,A0ŽTELL�EMHNDLR�NOT�TO�USE�P.B.ŠBRA.S‚LDRERR3@LDRERR2ƒLEA„LDRFHS(PC),A0†YES�-�SO�POINT�TO�FHS�PARAM�BLOCK�PARTLDRERR3ƒBSR„ERRMSGŠBRA.S‚LDRERRXŒEXIT*5LDRERR4ƒBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAINLDRERRXƒBRA„ERRTERM!*PRINT START UP ERROR WITH STATUS *…D0.L=STATUSSTRERR.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAINŠBRA„ERRTERMŒERROR�TERMINATION*PRINT TASK ABORTED ERROR#*…A0=ADDR.�OF�TASK�COMPLETION�EVENTTSKERR0ŠMOVE.L�2(A0),MSGT-B(A6)ƒSAVE�ABORTING�TASK�NAME ŠMOVE.W�20(A0),D0ŠGET�ABORT�CODEŠLEA„MSGTA(PC),A2 ŠMOVE.W�#4,D1 ŠBSR„BINHEXŠLEA„MSGT(PC),A1ŠLEA„MSGTE(PC),A2 ŠBRA„ERR0***********************2* EMLOGLIS SENDS BLANK LINE TO LOG AND LIST DEVICE**ƒFOLLOWED�BY�MESSAGE�BOUNDED�BY�A1�AND�A2*ƒFOLLOWED�BY�BLANK�LINE*   ERRCNT IS INCREMENTED*ƒALL�REGISTERS�PRESERVED5* IF I/O IS BAD, .NE. CONDITION CODES RETURNED - ELSE#*ƒZERO�CONDITION�CODES�ARE�RETURNED*1EMLOGLIS‚ADD.W‚#1,ERRCNT-B(A6)„BUMP�ERROR�COUNTERŠBSR.S‚BKLOGLIS ŠBNE.S‚EMRTN ŠBSR.S‚LOGLIS ŠBNE.S‚EMRTNŠBSR.S‚BKLOGLIS EMRTN…RTSŠPAGE*$*SKPSPC SKIPS OVER SPACES IN COMMAND* *ON CALL:%*…A1=POINTER�TO�NEXT�CHAR.�IN�COMMAND *…BSR�SKPSPC* *ON RETURN:$*…A1=POINTER�TO�CHAR.�AFTER�SPACE(S)* SKPSPC„EQU„*ŠCMP.B‚#'�',(A1)+‰SPACE?ŠBEQ.S‚SKPSPC�YES-CHECK�NEXT"ŠTST.B‚-(A1)ŽNO-POINT�TO�NON-SPACEŠRTS*#*LOGOUT SENDS MESSAGE TO LOG DEVICE$*LISOUT SENDS MESSAGE TO LIST DEVICE&*LOGLIS SENDS MESSAGE TO BOTH DEVICES.;*‚IF�NO�LISTING�DEVICE�WAS�SPECIFIED,�LISOUT�HAS�NO�EFFECT.B*‚OUTPUT�IS�FORMATTED�WITH�NO�CARRIAGE�RETURN�INCLUDED�IN�MESSAGE.?*‚IF�CARRIAGE�RETURN�IS�INCLUDED�WITHIN�MESSAGE,�ONLY�THAT�PART)*‚PRIOR�TO�THE�CARRIAGE�RETURN�IS�OUTPUT.* *ON CALL:*…A1=ADDR.�OF�MESSAGE�START*…A2=ADDR.�OF�MESSAGE�END*…BSR�LOGOUT�OR�LISOUT* *ON RETURN:*…D0=I/O�ERROR�STATUS*…A0=IOCB�ADDR.>*…A2=ADDRESS�JUST�PRIOR�TO�CARRIAGE�RETURN�IN�MESSAGE�(IF�ANY)**LOGLIS„BSR.S‚LOGOUT ŠBSR.S‚LISOUTŠRTS LOGOUT„EQU„*ŠMOVEM.L�D0/A0,-(A7)ŠMOVE.B�#LDFLUN,D0 ŠBSR.S‚LOG10ŠMOVEM.L�(A7)+,D0/A0ŠRTS LISOUT„EQU„*ŠMOVEM.L�D0/A0,-(A7)ŠTST.B‚LDFLG-B(A6)1ŠBEQ.S‚LISOUTXŒBRANCH�IF�NO�LIST�DEVICE�SPECIFIEDŠMOVE.B�#LSLUN,D0 ŠBSR.S‚LOG10LISOUTXƒMOVEM.L�(A7)+,D0/A0ŠRTS*LOG10…LEA„OUTIOS(PC),A0/ŠMOVE.B�D0,IOSLUN(A0)†Plug�logical�unit�number.3ŠMOVEM.L�A1/A2,IOSSAD(A0)‚PLUG�IN�BUFFER�BOUNDARIES ŠMOVE.L�A1,A2:LOG10.5ƒCMP.B‚#CR,(A2)‹Are�we�looking�at�a�carriage�returnŠBEQ.S‚LOG11ŽBranch�if�yes2ŠCMP.L‚IOSEAD(A0),A2†Have�we�tested�entire�buffer?ŠBEQ.S‚LOG12ŽBranch�if�yes)ŠADD.L‚#1,A2ŽNo�so�go�test�next�characterŠBRA.S‚LOG10.5)LOG11…SUB.L‚#1,A2ŽBypass�carriage�return.ŠMOVE.L�IOSEAD(A0),D03ŠMOVE.L�A2,IOSEAD(A0)†Update�end�of�message�address+ŠMOVE.L�D0,A2ŽPreserve�original�value�in�A2LOG12…IOSCALL�(A0)ŠRTS*"* BKLOG SKIPS A LINE ON LOG DEVICE#* BKLIS SKIPS A LINE ON LIST DEVICE'* BKLOGLIS SKIPS A LINE ON BOTH DEVICESBKLOGLIS‚BSR.S‚BKLOG ŠBSR.S‚BKLISŠRTS*BKLIS…MOVEM.L�A1/A2,-(A7)ŠLEA„BLANK(PC),A1 ŠMOVE.L�A1,A2 ŠBSR„LISOUTŠMOVEM.L�(A7)+,A1/A2ŠRTS*BKLOG…MOVEM.L�A1/A2,-(A7)ŠLEA„BLANK(PC),A1 ŠMOVE.L�A1,A2 ŠBSR„LOGOUTŠMOVEM.L�(A7)+,A1/A2ŠRTS*-* LOGIOUT OUTPUTS ON LOG DEVICE IN IMAGE MODE*ƒUSES�LOGOUT�SUBROUTINE;LOGIOUTƒOR.Wƒ#(1<<3),OUTIOS+IOSOPT-B(A6)�SET�IMAGE�MODE�BIT ŠBSR„LOGOUT*ŠAND.W‚#($FFFF-(1<<3)),OUTIOS+IOSOPT-B(A6)%ŠMOVE.L�D0,D0ŽSET�I/O�CONDITION�CODESŠRTS** LOGIN INPUTS FROM CDFLUN*ƒUSES�LOGOUT�SUBROUTINE&LOGIN…MOVE.W�OUTIOS+IOSFCT-B(A6),-(A7)#ŠMOVE.W�#IOREAD,OUTIOS+IOSFCT-B(A6)ŠMOVE.L�#CDFLUN,D0 ŠBSR„LOG10!ŠMOVE.W�(A7)+,OUTIOS+IOSFCT-B(A6) ŠMOVE.L�D0,D0ŠRTSŠPAGE**GETPAR GETS PARAMETER NAMEA*…VALID�NAME�ARE�FROM�2-8�CHARS�WITH�A-Z,0-9,�$,�&,�@�AND�.�VALID'*VALID TERMINATORS ARE CR, SPACE, AND =* *ON CALL:*…A1=START�OF�PARAMETER *…BSR�GETPAR* *ON RETURN:&*…D1.L=NO.�OF�CHARS.�IN�PARAMETER�NAME *…A1=BYTE�1�PAST�END�OF�PARAMTER*…CARRY=0�IF�NO�ERROR *Š=1�IF�ERROR*PARAMETER STORE IN TMPSYM0*…OUTPUT�BUFFER�SPACE-FILLED�BEFORE�STORING�DATA?*GETPARS IS SAME AS GETPAR EXCEPT ANYTHING IS VALID TERMINATORY)*…AND�OK�IF�ONLY�1�CHAR�(NEVER�GET�ERROR)**GETPARŠMOVEM.L�D0/D2/A2,-(A7)ŠCLR.L‚D2‘INDICATE�GETPAR�CALLGETP01)ŠMOVE.L�#SYMLEN,D1‰Blank�out�symbol�entryŠLEA„TMPSYM(PC),A2GETP02„MOVE.B�#'�',(A2)+ŠDCNTƒD1,GETP02ŠMOVE.W�#PARLEN,D1ŠLEA„TMPSYM(PC),A2GETP05„MOVE.B�(A1),D0ŠCMP.B‚#'$',D0 ŠBEQ.S‚GETP10ŠCMP.B‚#'.',D0 ŠBEQ.S‚GETP10ŠCMP.B‚#'&',D0 ŠBEQ.S‚GETP10/ŠCMP.B‚RPTCHR(PC),D0†Is�it�the�redefine�symbol?ŠBEQ.S‚GETP10�Branch�if�yesŠBSR.S‚CHKALPNŠBCS.S‚GETP12�END�OF�PARAMETER**CHARACTER IS VALID-STORE IN PASSED BUFFERGETP10„MOVE.B�D0,(A2)+ŠTST.B‚(A1)+ŽPOINT�TO�NEXT�CHARŠDCNTƒD1,GETP05+*MAXIM  UM NO. OF CHARS. FOUND-MAKE SURE NEXT*…CHAR.�IS�TERMINATOR1GETP12„TST.L‚D2‘DON'T�CHECK�TERMINATOR�IF�GETPARS ŠBNE.S‚GETP15ŠCMP.B‚#CR,(A1) ŠBEQ.S‚GETP15ŠCMP.B‚#'�',(A1) ŠBEQ.S‚GETP15ŠCMP.B‚#'=',(A1)-ŠBNE.S‚GETPER�INVALID�TERM.-MAKE�ERROR�RETURN$*PARAMETER IS VALID-MAKE GOOD RETURN*RETURN LENGTH OF PARAMETERGETP15„SUB.W‚#PARLEN,D1 ŠNEG.W‚D1'ŠTST.L‚D2‘DON'T�CHECK�LENGTH�IF�GETPARS ŠBNE.S‚GETPNR*ŠCMP.W‚#2,D1ŽERROR�IF�NOT�AT�LEAST�2�CHARS ŠBCS.S‚GETPERGETPNR„AND.B‚#$FE,SR ŠBRA.S‚GETPRTGETPER„OR.Bƒ#1,SRŽERROR�RETURNGETPRT„MOVEM.L�(A7)+,D0/D2/A2ŠRTS**GETPARS*GETPARSŠMOVEM.L�D0/D2/A2,-(A7)#ŠMOVE.L�#1,D2ŽINDICATE�GETPARS�CALL ŠBRA„GETP01ŠPAGE*,*CHKALPN CHECKS TO SEE IF CHAR IS 0-9 OR A-Z*CHKNUM CHECKS FOR 0-9*CHKHEX CHECKS FOR 0-9 OR A-F* *ON CALL:*…D0.B=CHAR.�TO�CHECK!*…BSR�CHKALPN�OR�CHKNUM‚OR�CHKHEX* *ON RETURN/*…CARRY=0�IF�GOOD�CHAR. *Š=1�IF�BAD*CHKALPNŠCMP.B‚#'G',D0 ŠBCS.S‚CHKHEXŠCMP.B‚#'Z',D0 ŠBHI.S‚CHKHEXCHKANR„AND.B‚#$FE,SRŠRTSCHKHEX„CMP.B‚#'A',D0 ŠBCS.S‚CHKNUMŠCMP.B‚#'F',D0 ŠBLS.S‚CHKANRCHKNUM„CMP.B‚#'0',D0 ŠBCS.S‚CHKAERŠCMP.B‚#'9',D0 ŠBLS.S‚CHKANRCHKAER„OR.Bƒ#1,SRŠRTSŠPAGE*#*BINHEX CONVERTS BINARY DATA TO HEX* *ON CALL:*…D0=BINARY�FIELD�TO�CONVERT#*…D1.W=NO.�OF�BYTES�IN�OUTPUT�(1-8)*…A2=ADDR.�OF�OUTPUT�BUFFER *…BSR�BINHEX* **ON RETURN: *…D0�ALTERED *…A2=A2+D1(*…NO�CHECK�IS�MADE�TO�MAKE�SURE�D1�VALID,BINHEX„MOVEM.L�D1-D2/A0,-(A7)„SAVE�REGISTERSŠADD.W‚D1,A2ŽGET�END�OF�DATA+1 ŠMOVE.L�A2,A0BINH10„MOVE.L�D0,D2 ŠAND.B‚#$F,D2 ŠBSR.S‚BHCVTŠMOVE.B�D2,-(A0) ŠROR.L‚#4,D0 ŠSUB.W‚#1,D1 ŠBNE.S‚BINH10ŠMOVEM.L�(A7)+,D1-D2/A0ŠRTS*$*BHCVT CONVERTS BINARY 4 BITS TO HEX* *ON CALL:*…D2.B=BINARY�BYTE *…BSR�BHCVT* *ON RETURN:*…D2.B=ASCII�HEXBHCVT ŠCMP.B‚#$A,D2 ŠBCC.S‚BHC10ŠOR.Bƒ#$30,D2Œ0-9ŠRTSBHC10…ADD.B‚#$37,D2ŒA-FŠRTSŠPAGE*$*HEXBIN CONVERTS HEX ASCII TO BINARY5*…GETHEX�ALREADY�CALLED�TO�MAKE�SURE�VALID�HEX�STRING* *ON CALL:%*…D1.W=LENGTH�OF�STRING�(INCLUDING�$)$*…TMPSYM+VALUE=HEX�STRING�TO�CONVERT *…BSR�HEXBIN* *ON RETURN:*…D0=BINARY�VALUE*…D1.W�CHANGED*HEXBINŠMOVEM.L�D2/A0,-(A7)ŠLEA„TMPSYM+VALUE(PC),A0 ŠCLR.L‚D0ŠTST.B‚(A0)+ŽSKIP�OVER�$ ŠSUB.W‚#1,D1HEXB10„ASL.L‚#4,D0ŠMOVE.B�(A0)+,D2 ŠBSR.S‚HBCVT ŠOR.BƒD2,D0ŠDCNTƒD1,HEXB10ŠMOVEM.L�(A7)+,D2/A0ŠRTS*#*HBCVT CONVERTS ASCII HEX TO BINARY!*…NO�ERROR�CHECK�FOR�VALID�DIGITS* *ON CALL:*…D2.B=ASCII�DIGIT *…BSR�HBCVT* *ON RETURN:*…D2.B=BINARY�DIGITHBCVTŠCMP.B‚#'9',D2 ŠBHI.S‚HBC10*0-9ŠSUB.B‚#$30,D2ŠRTS *ASSUME A-FHBC10…SUB.B‚#$37,D2ŠRTSŠPAGE*(*DECBIN CONVERTS DECIMAL ASCII TO BINARY9*…GETDEC�ALREADY�CALLED�TO�MAKE�SURE�VALID�DECIMAL�STRING* *ON CALL:*…D1.W=LENGTH�OF�STRING(*…TMPSYM+VALUE=DECIMAL�STRING�TO�CONVERT *…BSR�DECBIN* *ON RETURN:*…D0=BINARY�VALUE*…D1.W=CHANGED*DECBINŠMOVEM.L�A0/D2,-(A7) ŠCLR.L‚D0ŠLEA„TMPSYM+VALUE(PC),A0 ŠCMP.B‚#'-',(A0)Š1ST�CHAR�MINUS?ŠBNE.S‚DECB10�NO*YES-SKIP OVER ŠTST.B‚(A0)+ ŠSUB.W‚#1,D1(DECB10„MOVE.L�D0,-(A7)‹Multiply�D0�by�10ŠLSL.L‚#3,D0Ž*8ŠADD.L‚(A7),D0Œ*8+D0'ŠADD.L‚(A7)+,D0‹*8+D0+D0�-->�D0�=�D0*10 ŠCLR.L‚D2ŠMOVE.B�(A0)+,D2 ŠBSR„HBCVT ŠADD.L‚D2,D0ŠDCNTƒD1,DECB10*IF 1ST CHAR WAS -, NEGATEŠCMP.B‚#'-',TMPSYM+VALUE-B(A6) ŠBNE.S‚DECBRT ŠNEG.L‚D0DECBRT„MOVEM.L�(A7)+,A0/D2ŠRTSŠPAGE2* EXP gets value of arithmetic expression such as:*ƒ2-($10+3/(8-5*2))+$23* * On entry:.*ƒA1„points�to�first�character�of�input�string* * On exit:#*ƒD0„contains�evaluated�expression.(*ƒCC„carry�set�if�error,�clear�otherwise*=*�Expression�must�be�terminated�by��or�blank.‚No�embedded9*ƒblanks�are�allowed.‚All�operations�are�in�32�bit�signed=*ƒarithmetic,�overflow�is�ignored.‚Constants�preceeded�by�'$'9*ƒare�assumed�to�be�hex.‚Multiplication�and�division�have0*ƒhigher�priority�than�addition�and�subrtaction.*D* If the first character of the expression is a " or!  a ' then string7*ƒcomparison�is�assumed�and�a�branch�is�made�to�STRCPR.* * Grammar:* *„E‚-->ƒTD* *„D‚-->ƒ+TD*�-TD *�* *„E‚-->ƒT�+�T*�T�-�T*�T* *„T‚-->ƒP�*�P*�P�/�P*�P* *„P‚-->ƒ-P*�+P*�L* *„L‚-->ƒ(�E�)*�** Recursive descent algorithm:**‰getch;*†E:¢T:*‰T;¢P;*‰D;›TSUB1:�IF�ch�=�'*'*­THEN*°getch;*°P; *°multiply;*†D:¨GO�TO�TSUB1*‰IF�ch�=�'+'™ELSE*‰THEN¤IF�ch�=�'/' *Œgetch;ŸTHEN *ŒT;¦getch; *Œadd;¤P; *ŒD;¦divide;*‰ELSE§GO�TO�TSUB1; *ŒIF�ch�=�'-'*ŒTHEN*�getch;*�T; *�subrtact;*�D;***‡P:¡L:*ŠIF�ch�=�'-'˜IF�ch�=�'(' *ŠTHENŸTHEN*�getch;�getch;*�P;¡E;*�negate;œIF�ch�<>�')' *ŠELSE¢THEN*�IF�ch�=�'+'›error; *�THENœELSE*�getch;šIF�ch�=�*�PŸTHEN *�ELSE¢push; *�L;¡getch;*°ELSE*³error;* EXP‡EQU„*#ŠCMP.B‚#'"',(A1)ŠIs�this�a�literal?ŠBEQ„STRCPR�Branch�if�yes#ŠCMP.B‚#'''',(A1)‰Is�this�a�string?ŠBEQ„STRCPR�Branch�if�yesŠMOVEM.L�D1-D2/A0-A2,-(A7)>ŠMOVE.L�A7,STAKSAV-B(A6)ƒSave�stack�pointer�for�error�recovery@ŠLEA„EXPSTACK(PC),A2„Set�A2�to�first�location�of�expression�stk.#ŠMOVE.B�(A1)+,D1‹Get�next�characterŠBSR.S‚ESUB�Evaluate�expressionŠCMP.B‚#'�',D1%ŠBEQ.S‚EXPOKŽBranch�on�'�'�terminatorŠCMP.B‚#$0D,D10ŠBNE„EXPERR�Branch�if�no��or�'�'�terminator.'EXPOK…CMP.L‚D0,D0ŽClear�carry�indicatorŠMOVEM.L�(A7)+,D1-D2/A0-A2ŠRTS—Return�to�mainline*E: ESUB†EQU„* ŠBSR.S‚TSUB ŠBSR.S‚DSUB.ŠMOVE.L�(A2),D0ŒTop�element�on�stack�is�answerŠRTS**D: DSUB†EQU„*ŠCMP.B‚#'+',D1 ŠBNE.S‚DSUB04#ŠMOVE.B�(A1)+,D1‹Get�next�character ŠBSR.S‚TSUB4ŠBSR„ADDSUB�Add�top�two�elements�on�expression�stack ŠBSR.S‚DSUB*DSUB04„CMP.B‚#'-',D1 ŠBNE.S‚DSUB09#ŠMOVE.B�(A1)+,D1‹Get�next�character ŠBSR.S‚TSUB8ŠBSR.S‚SUBSUB�Subtract�top�two�elems�on�expression�stack ŠBSR.S‚DSUB* DSUB09„EQU„*ŠRTS**T: TSUB†EQU„* ŠBSR.S‚PSUBTSUB1…CMP.B‚#'*',D1 ŠBNE.S‚TSUB04#ŠMOVE.B�(A1)+,D1‹Get�next�character ŠBSR.S‚PSUB1ŠBSR.S‚MULSUB�Multiply�top�two�elements�on�stack. ŠBRA.S‚TSUB1*TSUB04„CMP.B‚#'/',D1ŠBNE.S‚TSUBRTS#ŠMOVE.B�(A1)+,D1‹Get�next�character ŠBSR.S‚PSUB.ŠBSR.S‚DIVSUB�Divide�top�two�elements�on�stack ŠBRA.S‚TSUB1 TSUBRTSƒRTS**P: PSUB†EQU„*ŠCMP.B‚#'-',D1 ŠBNE.S‚PSUB04#ŠMOVE.B�(A1)+,D1‹Get�next�character ŠBSR.S‚PSUB)ŠBSR.S‚NEGSUB�Negate�top�element�on�stackŠBRA.S‚PSUBRTS*PSUB04„CMP.B‚#'+',D1 ŠBNE.S‚PSUB09#ŠMOVE.B�(A1)+,D1‹Get�next�character ŠBSR.S‚PSUBŠBRA.S‚PSUBRTS*PSUB09„BSR.S‚LSUB PSUBRTSƒRTS**L: LSUB†EQU„*ŠCMP.B‚#'(',D1 ŠBNE.S‚LSUB04#ŠMOVE.B�(A1)+,D1‹Get�next�character)ŠBSR„ESUB�Go�evaluate�embedded�expressionŠCMP.B‚#')',D1&ŠBNE.S‚EXPERR�Error�on�mismatched�'()'#ŠMOVE.B�(A1)+,D1‹Get�next�characterŠBRA.S‚LSUBRTS*7LSUB04„BSR.S‚NUMTESTŒSee�if�we�are�pointing�to�a�number"ŠBNE.S‚EXPERR�Branch�if�no�-�error1ŠMOVE.L�D2,-(A2)‹Push�converted�number�onto�stack#ŠMOVE.B�(A1)+,D1‹Get�next�character LSUBRTSƒRTS„0*3 [%P-E5T=QETMJUO]Pe:mFu=}<…D�B•>�+C* Exit from this routine if we encounter an error in the expression* EXPERR„EQU„*6ŠMOVE.L�STAKSAV(PC),A7…Adjust�stack�pointer�for�return4ŠMOVE.L�(A2),D0ŒReturn�what�we�have�computed�so�far.ŠMOVEM.L�(A7)+,D1-D2/A0-A2-ŠMOVEƒ#1,CCR�Set�error�(carry)�condition�codeŠRTS*A* ADDSUB - Replace top two elements on expression stack with sum.* ADDSUB„EQU„*ŠMOVE.L�(A2)+,D2ŠADD.L‚(A2),D2ŠMOVE.L�D2,(A2)ŠRTS*H* SUBSUB - Replace top two elements on expression stack with difference.* SUBSUB„EQU„*ŠMOVE.L�4(A2),D2ŠSUB.L‚(A2),D2 ŠADD.L‚#4,A2ŠMOVE.L�D2,(A2)ŠRTS*E* MULSUB - Replace top two elements on expression stack with product.* MULSUB„EQU„*ŠMOVE.L�(A2)+,D2ŠMULUƒ2(A2),D2ŠMOVE.L�D2,(A2)ŠRTS*F* DIVSUB - Rep! lace top two elements on expression stack with quotient.* DIVSUB„EQU„*ŠMOVE.L�4(A2),D2ŠDIVUƒ2(A2),D2 ŠADD.L‚#4,A2'ŠAND.L‚#$0000FFFF,D2†Mask�off�remainderŠMOVE.L�D2,(A2)ŠRTS*E* NEGSUB - Replace top element on expression stack with its negation.* NEGSUB„EQU„*ŠMOVE.L�(A2),D2 ŠNEG.L‚D2ŠMOVE.L�D2,(A2)ŠRTS*G* NUMTEST - Return equal condition codes if character in D1 is a '$' orH*ƒnumber�and�return�binary�value�of�number�in�D2.‚If�D1�does�not�containE*ƒ'$'�or�number�then�return�unequal�condition�codes.‚A1�is�assumed�toD*„point�one�character�beyond�the�character�that�was�picked�up�in�D1.* NUMTESTƒEQU„*ŠCMP.B‚#'$',D1 ŠBEQ.S‚NUMT20ŠCMP.B‚#'9',D1ŠBHI.S‚NUMTERRŠCMP.B‚#'0',D1ŠBLO.S‚NUMTERR*3NUMT20„SUB.L‚#1,A1ŽPoint�A1�to�first�char�of�string-ŠMOVE.L�D1,-(A7)‹Save�thru�conversion�routine#ŠBSR„CVTBIN�Convert�to�binary�in�D0-ŠMOVEM.L�(A7)+,D1ŠDon't�alter�condition�codes-ŠBCS.S‚NUMTERRŒBeranch�if�error�in�conversionŠMOVE.L�D0,D2ŽConverted�number/ŠCMP.L‚D2,D2ŽReturn�equal�(good)�condtion�codesŠBRA.S‚NUMTRTS*7NUMTERRƒTST.L‚(A7)�Return�unequal�(bad)�condition�codes NUMTRTSƒRTSŠPAGE*G* STRCPR will compare two strings such as might appear in the following *ƒcommand:*†IFEQ†"EXORMACS","\SYSTYPE"* * On exit:C*ƒD0„contains�0�if�strings�match�-1�if�first�string�collates�first,%*‰+1�if�second�string�collates�first.)*ƒCC„carry�set�if�error,�clear�otherwise.* STRCPR„EQU„*ŠLEA„GETLTR(PC),A0ŠCMP.B‚#'"',(A1)ŠBEQ.S‚STR04ŽBranch�if�literalŠLEA„GETSTR(PC),A01STR04…JSR„(A0)�Convert�string�and�store�in�TMPSYM)ŠBCS.S‚STRRTS�Return�on�conversion�error.4* D1.W has number of characters in string or literal$* TMPSYM+VALUE has the actual value.(* A1 points one byte beyond the literal.*#* Move the string to a staging areaŠLEA„TMPSYM+VALUE(PC),A0ŠLEA„TMPVAL(PC),A2 ŠMOVE.W�D1,D0'STR06…BEQ.S‚STR08ŽBranch�if�null�stringSTR07…MOVE.B�(A0)+,(A2)+ ŠSUB.W‚#1,D0$ŠBNE.S‚STR07ŽBranch�if�not�all�moved6STR08…MOVE.W�D1,TMPLEN-B(A6)„Save�length�of�1st�string'* Scan to find beginning of next stringSTR12…CMP.B‚#CR,(A1)8ŠBEQ.S‚STRERRXŒBranch�if�carriage�return�found�too�earlyŠCMP.B‚#'"',(A1)&ŠBEQ.S‚STRLTR�Branch�if�2nd�is�literalŠCMP.B‚#'''',(A1)%ŠBEQ.S‚STRSTR�Branch�if�2nd�is�string ŠADD.L‚#1,A1 ŠBRA.S‚STR12* Convert 2nd argumentSTRLTR„BSR„GETLTR ŠBRA.S‚STR16STRSTR„BSR.S‚GETSTR2STR16…BCS.S‚STRRTS�Branch�if�error�in�2nd�argument*Compare arguments,ŠMOVE.W�TMPLEN(PC),D0†Length�of�1st�argument(ŠLEA„TMPVAL(PC),A0†Point�to�1st�argument.ŠLEA„TMPSYM+VALUE(PC),A1�Point�to�2nd�argumentSTR14…TST.W‚D0(ŠBEQ.S‚STR40ŽBranch�if�1st�argument�done ŠTST.W‚D15ŠBEQ.S‚STR1BŽBranch�if�2nd�argument�done�-�1st�biggerŠCMP.B‚(A1)+,(A0)+3ŠBHI.S‚STR1BŽBranch�if�1st�argument�collates�higher3ŠBLO.S‚STR2BŽBranch�if�2nd�argument�collates�higher ŠSUB.W‚#1,D0 ŠSUB.W‚#1,D1 ŠBRA.S‚STR14H*1st argument done, if 2nd done also then equal else 2nd collates higherSTR40…TST.W‚D1*ŠBNE.S‚STR2BŽBranch�if�2nd�collates�higher*Arguments were equal ŠCLR.L‚D0 ŠBRA.S‚STRRTS*Argument 1 collated higherSTR1B…MOVE.L�#1,D0 ŠBRA.S‚STRRTS*Argument 2 collated higherSTR2B…MOVE.L�#-1,D0 ŠBRA.S‚STRRTS*Error in commandSTRERRXƒOR.Bƒ#1,SR*Return to caller STRRTS„RTSŠPAGE*@*CVTBIN CONVERTS STRING TO HEX IF IT STARTS WITH $, ELSE DECIMAL* *ON CALL:*…A1=START�OF�STRING *…BSR�CVTBIN* *ON RETURN:*…D0.L=BINARY�VALUE*…CARRY=0�IF�NO�ERROR *Š=1�IF�ERROR(*TMPSYM+VALUE USED TO STORE ASCII STRING*CVTBINŠCMP.B‚#'$',(A1)ŠBNE.S‚CVTB10�ASSUME�DECIMAL6*CHECK FOR VALID HEX DIGITS AND THEN CONVERT TO BINARY ŠBSR„GETHEXŠBCS.S‚CVTBRT�ERROR ŠBSR„HEXBINCVTBNR„AND.B‚#$FE,SRŒNO�ERROR CVTBRT„RTS+*CHECK FOR VALID DECIMAL DIGITS AND CONVERTCVTB10„BSR„GETDEC ŠBCS.S‚CVTBRT ŠBSR„DECBINŠRTSŠPAGE**GETSTR PROCESSES STRING VALUE.*…MAXIMUM�OF�10�CHARACTERS�INCLUDING�BEGINNING*…AND�ENDING�APOSTROPHES,*STRING TERMINATES WITH CR OR SPACE or comma* *O" N CALL:$*…A1=START�OF�STRING�(KNOWN�TO�BE�') *…BSR�GETSTR* *ON RETURN:*…D1.W=NO.�OF�CHARS�IN�STRING*…A1=BYTE�1�PAST�END�OF�STRING*…CARRY=0�IF�NO�ERROR *Š=1�IF�ERROR*STRING STORED IN TMPSYM+VALUE+*…BUFFER�IS�NOT�SPACE-FILLED�BEFORE�STORING7*…STRING�IS�STORED�WITH�APOSTROPHES�INCLUDED,�THEREFORE8*‡MAXIMUM�LENGTH�FOR�TEST�IS�VALLEN-2�TO�ACCOUNT�FOR�THE"*‡TWO�APOSTROPHES�THAT�ARE�STORED.GETSTR„MOVEM.L�A0/D0,-(A7)ŠLEA„TMPSYM+VALUE(PC),A0+ŠMOVE.B�(A1)+,(A0)+ˆBYPASS�FIRST�APOSTROPHE'ŠMOVE.W�#VALLEN-1,D1‡MAX.�NO.�OF�CHARS.GETS10„CMP.B‚#APOS,(A1) ŠBNE.S‚GETS15(*FOUND APOSTROPHE-SEE IF ANOTHER FOLLOWSŠMOVE.B�(A1)+,(A0)+ˆSAVE�1ST ŠSUB.W‚#1,D1ŠCMP.B‚#APOS,(A1)&ŠBNE.S‚GETS30�BRANCH�IF�NOT�APOSTROPHE"ŠADD.L‚#1,A1ŽBYPASS�2ND�APOSTROPHE ŠBRA„GETS101*NEXT CHAR. NOT APOS-THEREFORE MUST BE TERMINATORGETS30„CMP.B‚#CR,(A1) ŠBEQ.S‚GETS20ŠCMP.B‚#'�',(A1) ŠBEQ.S‚GETS20ŠCMP.B‚#',',(A1) ŠBNE.S‚GETSER*RETURN LENGTH OF STRINGGETS20„SUB.W‚#VALLEN,D1 ŠNEG.W‚D1%GETSNR„AND.B‚#$FE,SRŒMAKE�GOOD�RETURNGETSRT„MOVEM.L�(A7)+,D0/A0ŠRTS"GETS12„TST.W‚D1‘ROOM�TO�SAVE�NEXT?ŠBNE.S‚GETS17�YES#GETSER„OR.Bƒ#1,SRŽMAKE�ERROR�RETURN ŠBRA.S‚GETSRT*ERROR IF CR BEFORE 2ND APOS.GETS15„CMP.B‚#CR,(A1) ŠBEQ.S‚GETSERGETS17„MOVE.B�(A1)+,(A0)+ŠDCNTƒD1,GETS10"ŠBRA.S‚GETSER�GOT�TO�END�W/O�APOS.ŠPAGE*GETLTR PROCESSES LITERAL VALUE2*…MAXIMUM�OF�10�CHARACTERS�NOT�INCLUDING�BEGINNING*…AND�ENDING�DOUBLE�QUOTES�(")-*LITERAL TERMINATES WITH CR OR SPACE or comma* *ON CALL:$*…A1=START�OF�STRING�(KNOWN�TO�BE�") *…BSR�GETLTR* *ON RETURN:*…D1.W=NO.�OF�CHARS�IN�LITERAL*…A1=BYTE�1�PAST�END�OF�LITERAL*…CARRY=0�IF�NO�ERROR *Š=1�IF�ERROR*STRING STORED IN TMPSYM+VALUE+*…BUFFER�IS�NOT�SPACE-FILLED�BEFORE�STORING=*…LITERAL�IS�STORED�WITHOUT�DOUBLE�QUOTES�INCLUDED,�THEREFORE$*‡MAXIMUM�LENGTH�FOR�TEST�IS�VALLEN.*GETLTR„MOVEM.L�A0/D0,-(A7)ŠLEA„TMPSYM+VALUE(PC),A0ŠADD.L‚#1,A1ŽBYPASS�1ST�"%ŠMOVE.W�#VALLEN,D1‰MAX.�NO.�OF�CHARS.GETL10„CMP.B‚#'"',(A1) ŠBNE.S‚GETL15*FOUND "-SEE IF ANOTHER FOLLOWSŠMOVE.B�(A1)+,(A0)+ˆSAVE�1ST ŠSUB.W‚#1,D1ŠCMP.B‚#'"',(A1) ŠBNE.S‚GETL30ŠADD.L‚#1,A1ŽBYPASS�2ND�" ŠBRA„GETL10.*NEXT CHAR. NOT "-THEREFORE MUST BE TERMINATOR%GETL30„ADD.W‚#1,D1ŽCORRECT�FOR�MOVE�"ŠCMP.B‚#CR,(A1) ŠBEQ.S‚GETL20ŠCMP.B‚#'�',(A1) ŠBEQ.S‚GETL20ŠCMP.B‚#',',(A1) ŠBNE.S‚GETLER*RETURN LENGTH OF STRINGGETL20„SUB.W‚#VALLEN,D1 ŠNEG.W‚D1%GETLNR„AND.B‚#$FE,SRŒMAKE�GOOD�RETURNGETLRT„MOVEM.L�(A7)+,D0/A0ŠRTS"GETL12„TST.W‚D1‘ROOM�TO�SAVE�NEXT?ŠBNE.S‚GETL17�YES#GETLER„OR.Bƒ#1,SRŽMAKE�ERROR�RETURN ŠBRA.S‚GETLRT*ERROR IF CR BEFORE 2ND APOS.GETL15„CMP.B‚#CR,(A1) ŠBEQ.S‚GETLERGETL17„MOVE.B�(A1)+,(A0)+ ŠSUB.W‚#1,D1$ŠBPL.S‚GETL10�NOT�TOO�MANY�CHARS�YET"ŠBRA.S‚GETLER�GOT�TO�END�W/O�APOS.ŠPAGE*5*GETHEX CHECKS TO MAKE SURE VALUE IS VALID HEX STRING6*…AT�LEAST�2�CHARS.�MUST�BE�ENTERED�AND�A�MAXIMUM�OF�9 *…INCLUDING�$0*STRING TERMINATES WITH NON ASCII HEX CHARACTER.* *ON CALL:(*…A1=START�OF�HEX�STRING�(KNOWN�TO�BE�$) *…BSR�GETHEX* *ON RETURN:!*…D1.W=NO.�OF�CHARS�IN�HEX�STRING*…A1=BYTE�1�PAST�END�OF�STRING*…CARRY=0�IF�NO�ERROR *Š=1�IF�ERROR*STRING STORED IN TMPSYM+VALUE*GETHEXŠMOVEM.L�D0/A0,-(A7)ŠLEA„TMPSYM+VALUE(PC),A0ŠMOVE.B�(A1)+,(A0)+ˆSAVE�'$'%ŠMOVE.W�#VALLEN-1,D1‡MAX�NO.�OF�CHARSGETH10„MOVE.B�(A1),D0ŠBSR„CHKHEX�MAKE�SURE�VALID�HEXŠBCS.S‚GETH15�END�OF�HEX*CHAR. IS VALID-STOREŠMOVE.B�D0,(A0)+ ŠTST.B‚(A1)+ ŠSUB.W‚#1,D1 ŠBPL.S‚GETH10**Too many characters entered, return error ŠBRA„GETSER)*LOOKS OKAY-MAKE SURE MORE THAN $ ENTEREDGETH15„CMP.B‚#'$',-1(A1)ŠBEQ.S‚GETLER�ONLY�$*RETURN LENGTH OF STRINGŠSUB.W‚#VALLEN,D1 ŠNEG.W‚D1 ŠBRA.S‚GETLNRŠPAGE*&*GETDEC CHECKS FOR VALID DECIMAL VALUE*…ALL�CHARS�MUST�BE�0-9.+*…MAXIMUM�OF�10�CHARS.‚MINIMUM�OF�ONE�DIGIT* *ON CALL:*…A1=POINTER�TO�1ST�CHAR *…BSR�GETDEC* *ON RETURN:*…D1.W=NO.�OF�CHARS.�IN�STRING$*…A1=POINTER�TO�1ST�BYTE�AFTER�VALUE*…CARRY=" 0�IF�NO�ERROR *Š=1�IF�ERROR*STRING STORED IN TMPSYM+VALUE*GETDECŠMOVEM.L�A0/D0,-(A7)ŠLEA„TMPSYM+VALUE(PC),A0$ŠMOVE.W�#VALLEN,D1‰MAX.�NO.�OF�CHARSGETD10„MOVE.B�(A1),D0ŠBSR„CHKNUM�MAKE�SURE�0-9ŠBCS.S‚GETD15�END�OF�DECIMAL*CHAR IS VALID-STOREŠMOVE.B�D0,(A0)+ ŠTST.B‚(A1)+ ŠSUB.W‚#1,D1 ŠBPL.S‚GETD10+*Too many characters entered, return error. ŠBRA„GETSER*RETURN LENGTH OF STRINGGETD15„SUB.W‚#VALLEN,D1 ŠNEG.W‚D1&ŠBEQ„GETSER�MUST�HAVE�AT�LEAST�1�DIGIT ŠBRA„GETSNRŠPAGE*1*CHKST CHECKS TO SEE IF SYMBOL IS IN SYMBOL TABLE* *ON CALL:;*…TMPSYM�CONTAINS�SYMBOL�BEGIN�SEARCHED�(LJF,�SPACE-FILLED) *…BSR�CHKST* *ON RETURN:)*…A3=ADDR.�OF�SYMBOL�TABLE�ENTRY�IF�FOUND*…CARRY=0�IF�NOT�FOUND *Š=1�IF�FOUND*CHKST…MOVEM.L�A0-A2/D0,-(A7) ŠBSR.S‚CHKSTAŠMOVEM.L�(A7)+,A0-A2/D0ŠRTS*H* CHKSTI inserts symbol into table in place if it is already there or at2*ƒthe�end�of�the�table�is�it�is�not�already�there.H*ƒIf�we�are�on�last�pass,�the�PPASL�flag�in�PFLAG�will�be�set�associated*ƒwith�the�inserted�symbol.*CHKSTI„MOVEM.L�A0-A2/D0,-(A7) ŠBSR.S‚CHKSTA8ŠBCC.S‚CHKSTI40‹Symbol�not�in�table�-�go�insert�normally1ŠMOVE.L�A3,A1ŽWhere�symbol�is�inserted�into�table#ŠLEA„TMPSYM(PC),A0†Symbol�to�insert.ŠMOVE.W�#SYMLEN,D0‰Length�of�symbol�definitionCHKSTI10‚MOVE.B�(A0)+,(A1)+ŠDCNTƒD0,CHKSTI10ŠPASS1.S�CHKSTI205ŠBSETƒ#PPASL,PFLAG(A3)ƒSet�inserted�in�last�pass�flagŠBSR.S‚SAVEDEF0CHKSTI20‚BRA.S‚CHKSTI50‹Symbol�inserted�-�return*CHKSTI40‚BSR.S‚SAVEDEF+ŠBSR.S‚INSSTŽInsert�symbol�at�end�of�table.CHKSTI50‚MOVEM.L�(A7)+,A0-A2/D0ŠRTS*3* Check to see is symbol is all ready in the table.7*ƒReturn�carry�clear�if�symbol�in�table,�set�otherwise.CHKSTA„LEA„TMPSYM(PC),A2.ŠMOVEA.L�SYMADR-B(A6),A3ƒSTART�OF�SYMBOL�TABLECHKST05ƒMOVE.L�A2,A0)ŠCMP.L‚NXTSYM-B(A6),A3„AT�END�OF�SYMBOLS?ŠBCS.S‚CHKST10ŒNO*YES-SYMBOL NOT IN SYMBOL TABLEŠAND.B‚#$FE,SR CHKSTRTƒRTS*SEE IF SYMBOLS MATCHCHKST10ƒMOVE.L�A3,A1ŠMOVE.W�#PARLEN,D0CHKST15ƒCMP.B‚(A1)+,(A0)+ŠBNE.S‚CHKST20ŒNO�MATCHŠDCNTƒD0,CHKST15*SYMBOLS MATCH ŠOR.Bƒ#1,SRŠBRA.S‚CHKSTRT*GO TO NEXT ENTRYCHKST20ƒADD.L‚#SYMLEN,A3 ŠBRA„CHKST05ŠPAGE*)*INSST INSERTS NEW SYMBOL IN SYMBOL TABLE* *ON CALL:.*…TMPSYM�CONTAINS�SYMBOL�TABLE�ENTRY�TO�INSERT#*…(ALREADY�MADE�SURE�NOT�DUPLICATE) *…BSR�INSST *ON RETURN:*…CARRY=0�IF�INSERTED"*Š=1�IF�NO�MORE�SYMBOL�TABLE�SPACE*8INSST…BSETƒ#INSTF,MSCFLG-B(A6)�Set�symbol�inserted�flag.ŠMOVEM.L�D0/A0-A2,-(A7)(ŠMOVE.L�NXTSYM-B(A6),A0„NEXT�AVAIL.�SLOT-ŠLEA„SYMLEN(A0),A1†End�of�symbol�will�go�here'ŠCMP.L‚SYMEND-B(A6),A1„Will�symbol�fit?ŠBLS.S‚INSS10�Branch�if�yes*NO MORE ROOM-RETURN ERROR ŠOR.Bƒ#1,SRINSSRT„MOVEM.L�(A7)+,D0/A0-A2ŠRTS*MOVE SYMBOL TO SYMBOL TABLEINSS10„LEA„TMPSYM(PC),A1ŠMOVE.W�#SYMLEN,D0,ŠMOVE.L�A0,A2ŽSave�symbol�position�in�table.INSS15„MOVE.B�(A1)+,(A0)+ŠDCNTƒD0,INSS151INSS18„MOVE.L�A0,NXTSYM-B(A6)„POINT�TO�NEXT�AVAILŠAND.B‚#$FE,SR ŠBRA.S‚INSSRTŠPAGE*£01/10/85‚vvvvvSAVEDEF7ŠBTST.B�#COPT,OPTFLG-B(A6)�See�if�the�'C'�option�is�setŠIF��THEN.S@ŠIF.WƒPASS-B(A6)��#-1�THEN.S�If�the�last�pass,�then�save�the*£label�and�who�defined�it)ŒMOVEM.L�A0-A3,-(A7)…Save�users�registers>ŒLEA„SYMBUFF(PC),A1ƒGet�the�buffer�used�to�write�to�the�symbol *£table�file7ŒMOVE.W�#$0002,(A1)+…This�means�that�this�entry�for�the)*£parameter�has�the�file�that�defined�it.<ŒLEA„TMPSYM(PC),A2„This�is�the�parameter�block�that�contains*£the�parameter.ŒFOR.B‚D0�=�#1�TO�#PARLEN�DO.S4ŽMOVE.B�(A2)+,(A1)+„Move�the�parameter�to�the�bufferŒENDF>ŒLEA„CMDFHS+FHSCLG(PC),A3�Get�the�address�of�the�filename�used*£to�define�this�parameter.ŒFOR.B‚D0�=�#1�TO�#18�DO.S+ŽMOVE.B�(A3)+,(A1)+„Move�filename�to�bufferŒENDFŒLEA„SYMFHS(PC),A0CŒMOVE.W�#FHASGN,FHSCMD(A0)�Get�ready�to�close�the�symbol�table�file ŒFHSCALL�(A0) ŒBNE„IOERRŒLEA„SYMBUFF(PC),A0CŒMOVE.L�A0,SYMIOS+IOSSAD-B(A6)�This�is�the�beginning�address�of�the)*£buffer�to�write�out�to�t# he�symbol�table*£file.@ŒADD.L‚#PARLEN+2+18-1,A0�Get�the�ending�address�of�the�buffer�to%*£write�out�to�the�symbols�table�fileŒMOVE.L�A0,SYMIOS+IOSEAD-B(A6)=ŒIOSCALL�SYMIOS(PC)†Write�the�buffer�to�the�symbol�table�file ŒBNE„IOERRŒLEA„SYMFHS(PC),A0CŒMOVE.W�#FHCLOS,FHSCMD(A0)�Get�ready�to�close�the�symbol�table�fileŒFHSCALL�(A0)ŒGo�close�it ŒBNE„IOERR,ŒMOVEM.L�(A7)+,A0-A3…Restore�users�registersŠENDIŠENDIŠRTS*£01/10/85‚^^^^^ŠPAGE*A*SETDEF PUTS DEFAULT USER NO. VOLUME AND CATALOG IN FHS BLOCK AND*…SETS�EXTENSION�TO�'SA'* *ON CALL:*…A6=ADDR.�OF�FHS�BLOCK%*…SAVEREG=REGISTERS�SAVED�AT�START�UP *…BSR�SETDEF*SETDEFŠMOVE.L�A0,-(A7)ŠLEA„SAVEREG(PC),A0ŠMOVE.L�DUV(A0),FHSVOL(A6)ŠMOVE.W�DUN(A0),FHSUSN(A6)ŠMOVE.L�DUC(A0),FHSCLG(A6)ŠMOVE.L�DUC+4(A0),FHSCLG+4(A6)ŠMOVE.W�#'SA',FHSEXT(A6)ŠMOVE.L�(A7)+,A0ŠRTS*1*INSX MOVES FILE NAME DOWN 1 POSITION AND INSERTS*†'X'�AT�BEGINNING* *ON CALL:*…A0=ADDR.�OF�FHS�BLOCK *…BSR�INSX* *ON RETURN:*…REGISTERS�UNCHANGED*INSXŠMOVEM.L�D0/A1,-(A7)ŠLEA„FHSFIL+6(A0),A1 ŠMOVE.W�#7,D0INSX10„MOVE.B�(A1),1(A1) ŠTST.B‚-(A1)ŠDCNTƒD0,INSX10ŠMOVE.B�#'X',1(A1)ŠMOVEM.L�(A7)+,D0/A1ŠRTSŠPAGE*G*ZERBUF WRITES SECTOR OF 0'S TO TEMPORARY BOOT FILE AND ADDS 256 TO CLC*#*WRTBUF WRITES SECTOR ALREADY SETUP* *ON CALL:'*…SUBBUF�IS�SETUP�SECTOR�IF�WRTBUF�CALL*…BSR�ZERBUF�OR�WRTBUF* *ON RETURN: *…CLC=CLC+256****GOES TO IOERR IF DISK ERRORZERBUFŠMOVEM.L�A0/D0,-(A7)ŠLEA„SUBBUF(PC),A0ŠMOVE.W�#256/4,D0%ZERB10„CLR.L‚(A0)+ŽZERO�SECTOR�BUFFERŠDCNTƒD0,ZERB10 ŠBRA.S‚ZERB20WRTBUFŠMOVEM.L�A0/D0,-(A7)ZERB20„LEA„TMPIOS(PC),A0 ŠMOVE.L�SUBBUF1-B(A6),IOSSAD(A0) ŠMOVE.L�SUBBUF2-B(A6),IOSEAD(A0) ŠIOSCALL�(A0) ŠBNE„IOERR)ŠADD.L‚#256,CLC-B(A6)…UPDATE�LOC.�COUNTER#ŠBSR„PCUPDATŒUpdate�symbol�table�PCŠMOVEM.L�(A7)+,D0/A0ŠRTSŠPAGE*4*FINTSK FINISHES TASK, PROCESS OR SEGMENT PROCESSING;*…BY�MERGIN�LO�FILE�INTO�TEMPORARY�OUTPUT�FILE�AND�BUILDING*…TCB/TST�IF�TASK* *ON CALL:!*…TPSW�=�0�FOR�NO�TASK�OR�PROCESS*Š>�0�FOR�TASK*Š<�0�FOR�PROCESS�OR�SEGMENT*…SEGFLG�<>�0�FOR�SEGMENT *…BSR�FINTSK* *ON RETURN:*…A1=UNCHAGNED *…OTHER�REGISTERS�MAY�BE�CHANGED*…TPSW=0 *…SEGFLG=0,****GOES TO ERROR MESSAGE AND ABORT IF ERROR*FINTSKŠTST.L‚TPSW-B(A6)‰TASK/PROCESS?ŠBNE.S‚FINT10�YESŠRTS„NO-JUSTŒRETURN FINT10„MOVE.L�A1,-(A7)‹SAVE�REG.1*MUST ASSIGN TASK OR PROCESS LO FILE AND READ LIBŠLEA„TSKFHS(PC),A0ŠMOVE.W�#FHASGN,FHSCMD(A0) ŠFHSCALL�(A0) ŠBNE„IOERRŠLEA„SUBSIOS(PC),A0ŠLEA„LIBLK(PC),A1ŠMOVE.L�A1,IOSSAD(A0)ŠLEA„LIBLKE(PC),A1ŠMOVE.L�A1,IOSEAD(A0)$ŠIOSCALL�(A0)ŽGET�LOADER�INFO.�BLOCK ŠBNE„IOERR ŠMOVE.L�SUBBUF1-B(A6),IOSSAD(A0) ŠMOVE.L�SUBBUF2-B(A6),IOSEAD(A0)*,* CONSTRUCT NAME PORTION OF TASK MAP MESSAGE:ŠMOVE.L�TSKFHS+FHSFIL-B(A6),FILNAM-B(A6)�PLUG�IN�FILE�NAME,ŠMOVE.L�TSKFHS+FHSFIL+4-B(A6),FILNAM+4-B(A6)ŠLEA„FILNAM(PC),A0†PLUG�IN�...%FINT01„CMP.B‚#'�',(A0)+‰...�EXTENSION(ŠBNE.S‚FINT01�...�WITH�BLANK�COMPRESSIONŠMOVE.B�#'.',-1(A0)!ŠMOVE.B�TSKFHS+FHSEXT-B(A6),(A0)+#ŠMOVE.B�TSKFHS+FHSEXT+1-B(A6),(A0)+BŠMOVE.L�TSKLST-B(A6),TSKTCB-B(A6)�SAVE�ADDR�TO�PLUG�IN�TCB�ADDRESS#ŠADD.L‚#TSKENT2-FILNAM,TSKTCB-B(A6)0ŠTST.B‚SEGFLG-B(A6)‡ARE�WE�PROCESSING�A�SEGMENT?ŠBNE.S‚FINT04�BRANCH�IF�YES*-* IF TASK, THEN MOVE REAL TASK NAME TO TSKENTŠTST.L‚TPSW-B(A6)‰TASK/PROCESS?ŠBMI„FINT20�BRANCH�IF�PROCESS@ŠMOVE.L�LIBLK+LIBTSK-B(A6),TSKENT-B(A6)�SAVE�TASK�NAME�FROM�FILE1ŠCMP.L‚#'„',TASKN-B(A6)�WAS�A�TASK�NAME�SUPPLIED?+ŠBEQ.S‚FINT30�BRANCH�IF�NO�-�DONE�WITH�NAME2ŠMOVE.L�TASKN-B(A6),TSKENT-B(A6)�MOVE�TASK�NAME�IN,ŠBRA.S‚FINT30�BRANCH�FOR�DONE�WITH�TASK�NAME** HANDLE SEGMENT PROCESSING)FINT04„MOVE.L�TASKN-B(A6),D1…SEGMENT�NAMEŠMOVE.L�D1,TSKENT3-B(A6)*(* SEE IF SEGMENT EXISTS, THEN PROCESS IT.ŠLEA„LIBLK+LIBSAD(PC),A0„A0�RUNS�THRU�SEGMENTS2FINT12„CMP.L‚#-1,SADLEN(A0)…LAST�SEGMENT�EXAMINED?0ŠBEQ.S‚FCERR16ŒBRANCH�IF�YES�-�SEGMENT�NOT�FOUNDŠCMP.L# ‚SADNAM(A0),D1%ŠBEQ.S‚FINT15�BRANCH�IF�SEGMENT�FOUND&ŠLEA„LIBSADLN(A0),A0„POINT�TO�NEXT�SAD ŠBRA„FINT12?FINT15„MOVE.L�SADNAM(A0),TSKENT3-B(A6)�SEGMENT�NAME�TO�MAP�LINE#ŠBSR„FINT40�GO�PROCESS�THIS�SEGMENT*-* PLUG SEGMENT START ADDRESS INTO MAP MESSAGE)ŠMOVE.L�FSTART-B(A6),D0„NUMBER�TO�CONVERT ŠMOVE.L�#6,D1ŠLEA„TSKENT1(PC),A2ŠMOVE.L�#'$',(A2)+ ŠBSR„BINHEX%ŠBSR„TSKMSG�MOVE�TASK�MESSAGE�TO�LIST ŠBRA„FINTRTN,FCERR16ƒEQU„*’COME�HERE�IF�SEGMENT�NOT�FOUND7ŠMOVE.L�D1,CMSG16+2-B(A6)‚PUT�SEGMENT�NAME�INTO�MESSAGE ŠBSR„BKLOGLISŠLEA„CMSG16(PC),A1ŠLEA„CMSG16E(PC),A2 ŠBSR„LOGLIS ŠBNE„IOERR ŠBSR„BKLOGLIS ŠBRA„FINTRTN* * HANDLE PROCESS/TASK PROCESSING/FINT20„BSR„FINS1ŽCHECK�FOR�EXCLUDED�SEGMENTS�OKG‰MOVE.L�LIBLK+LIBTSK-B(A6),TSKENT4-B(A6)�MOVE�IN�PROCESS�NAME�FROM�FILE FINT30„EQU„*+ŠLEA„LIBLK+LIBSAD(PC),A0„A0�RUNS�THRU�SAD'S3FINT22„CMP.L‚#-1,SADLEN(A0)…LAST�SEGMENT�PROCESSED?.ŠBEQ„FCERR17ŒBRANCH�IF�YES�-�NO�SEGS�PROCESSEDŠBSR„FINS2ŽSEE�IF�SEG�PASSESŠBEQ.S‚FINT24�BRANCH�IF�YES*ŠLEA„LIBSADLN(A0),A0„POINT�TO�NEXT�SEGMENTŠBRA„FINT22�GO�FOR�NEXT�SEGMENT;FINT24„CLR.W‚SEGCNT-B(A6)‡CURRENT�SEGMENT�NUMBER�PROCESSINGEFINT25„MOVE.L�SADNAM(A0),TSKENT3-B(A6)�SEGMENT�NAME�TO�MAP�LINE�IMAGE#ŠBSR„FINT40�GO�PROCESS�THIS�SEGMENT*%* PLUG START ADDRESS INTO MAP MESSAGE)ŠMOVE.L�FSTART-B(A6),D0„NUMBER�TO�CONVERT ŠMOVE.L�#6,D1ŠLEA„TSKENT1(PC),A2ŠMOVE.B�#'$',(A2)+ ŠBSR„BINHEX%ŠBSR„TSKMSG�MOVE�TASK�MESSAGE�TO�LIST ŠTST.L‚TPSW-B(A6)‰ARE�WE�A�TASK?ŠBPL.S‚FINT26�BRANCH�IF�YESAŠMOVE.L�FSTART-B(A6),PROCSTR-B(A6)�SAVE�START�ADDRESS�FOR�PROCESS** DO REMAINING SEGMENTS6FINT26„LEA„LIBSADLN(A0),A0„A0�RUNS�THRU�REMAINING�SADS-ŠCMP.L‚#-1,SADLEN(A0)…LAST�SEGMENT�PROCESSED?ŠBEQ.S‚FINT29�BRANCH�IF�YES ŠBSR„FINS2ŽSEE�IF�SEGMENT�PASSESŠBNE.S‚FINT26�BRANCH�IF�NO#ŠTST.L‚TPSW-B(A6)‰ARE�WE�A�PROCESS?ŠBMI.S‚FINT28�BRANCH�IF�YES6ŠADD.W‚#1,SEGCNT-B(A6)„BUMP�SEGMENT�IN�PROCESS�COUNTER@ŠCMP.W‚#MAXSEG,SEGCNT-B(A6)�HAVE�WE�PROCESSED�TOO�MANY�SEGMENTS?ŠBHI„ERR11ŽBRANCH�IF�SOEFINT28„MOVE.L�SADNAM(A0),TSKENT3-B(A6)�SEGMENT�NAME�TO�MAP�LINE�IMAGE"ŠBSR„FINT40�GO�PROCESS�THE�SEGMENT<ŠMOVE.L�FSTART-B(A6),D0„PLUG�SEG�START�ADDR�INTO�MAP�MESSAGE ŠMOVE.L�#6,D1ŠLEA„TSKENT1(PC),A2ŠMOVE.B�#'$',(A2)+ ŠBSR„BINHEX%ŠBSR„TSKMSG�GO�SAVE�TASK�MESSAGE�LINE.ŠBRA.S‚FINT26�CONTINUE�THRU�REMAINING�SEGMENTS* * COME HERE IF NO SEGMENTS FOUND FCERR17ƒEQU„*"ŠLEA„CMSG17(PC),A1†DISPLAY�MESSAGEŠLEA„CMSG17E(PC),A2 ŠBSR„EMLOGLIS ŠBNE„IOERR ŠBRA„FINTRTN*"* IF TASK, CONTINUE PROCESSING TCBFINT29„TST.L‚TPSW-B(A6)ŠBMI„FINTRTNŒBRANCH�IF�PROCESS** CONTINUE TCB PROCESSING-*PUT TCB ADDR. IN TASK LIST IF NOT 'R' OPTION*ŠBTSTƒ#ROPT,OPTFLG-B(A6)�IS�'R'�OPTION�SETŠBNE.S‚TCB25ŽBRANCH�IF�YES+ŠBTSTƒ#MAPF,MAPFLG-B(A6)‡IS�MAP�TABLE�FULL?ŠBNE.S‚TCB25ŽBRANCH�IF�YESŠMOVE.L�CLC-B(A6),D0 ŠMOVE.W�#6,D1ŠMOVE.L�TSKTCB-B(A6),A2ŠMOVE.L�#'$',(A2)+ ŠBSR„BINHEX TCB25…EQU„*%*MUST BUILD AND WRITE OUT TCB AND TST*…CLC�POINTS�TO�TCB�START*ZERO TCB/TST SPACE IN MEMORYŠLEA„TCBBLK(PC),A0ŠMOVE.W�#TCBBLKL/4,D0TCB29…CLR.L‚(A0)+ŠDCNTƒD0,TCB29ŠLEA„LIBLK(PC),A4ŠLEA„TCBBLK(PC),A0ŠMOVE.L�#'!TCB',TCB(A0)*SET UP TCB LIST POINTERŠMOVE.L�TCBLST-B(A6),TCBALL(A0).*IF TASK STATE IS READY, PUT TCB IN READY LISTŠCMP.W‚#1<*SAVE ADDR. OF THIS TCB IN MAP MESSAGE IF NOT USING 'R' OPTIONTCB30ŠBTSTƒ#ROPT,OPTFLG-B(A6)+ŠBNE.S‚TCB31ŽBRANCH�IF�'R'�OPTION�SPECIFIEDŠMOVE.L�CLC-B(A6),D0ŠMOVE.L�D0,TCBLST-B(A6).ŠMOVE.W�#8,D1ŽSAVE�CLC�LINK�FOR�NON�'R'�OPTIONŠMOVEƒ#TCBLP-SYMSTR+1,A2ŠADD.L‚SYMADR-B(A6),A2 ŠBSR„BINHEX ŠBRA.S‚TCB32*=* SAVE FILE ADDRESS LINK OF THIS TCB IN TCBLST FOR 'R' OPTIONTCB31…CLR.L‚D08ŠMOV$ E.W�TSKCNT-B(A6),D0„NUMBER�OF�TASKS�PROCESSED�SO�FAR ŠLSL.L‚#8,D0,ŠLSL.L‚#1,D0Ž*�512�TO�REFLECT�TCB�BYTE�COUNT&ŠADD.L‚CLC-B(A6),D0‡+�LOCATION�COUNTER'ŠSUB.L‚BASEADDR-B(A6),D0‚-�BASE�ADDRESS%ŠLSR.L‚#8,D0Ž/�256�FOR�SECTOR�ADDRESSŠMOVE.L�D0,TCBLST-B(A6)"*MOVE TASK NAME TO TCB-USE COMMAND*…LINE�NAME�UNLESS�SPACESTCB32…CMP.L‚#'„',TASKN-B(A6) ŠBNE.S‚TCB35,*NO TASK NAME ON COMMAND LINE, TAKE FROM LIBŠMOVE.L�LIBTSK(A4),TCBNAME(A0) ŠBRA.S‚TCB40$TCB35…MOVE.L�TASKN-B(A6),TCBNAME(A0)TCB402ŠMOVE.L�LIBMON(A4),TCBMON(A0)�MONITOR�TASK/SESSION!ŠMOVE.L�LIBMON+4(A4),TCBMON+4(A0)/ŠMOVE.L�SESSION-B(A6),TCBSESSN(A0)�SAVE�SESSIONŠMOVE.B�PRIOR-B(A6),D0+ŠMOVE.B�D0,TCBCPRI(A0)‚Set�current�priority)ŠMOVE.B�D0,TCBLPRI(A0)‚Set�limit�priority+ŠMOVE.B�D0,TCBRPRI(A0)‚Set�running�priority)ŠMOVE.W�ATTR-B(A6),TCBATTR(A0)ƒATTRIBUTES&ŠMOVE.W�STATE-B(A6),TCBSTATE(A0)�STATEŠMOVE.L�CLC-B(A6),D0ŠADD.L‚#TSTBEGIN,D0"ŠMOVE.L�D0,TCBTST(A0)†ADDR.�OF�TST%ŠMOVE.W�#1,TCBTSTSM(A0)„TST�SEMAPHORE ŠMOVE.W�#1,TCBASQSM(A0)„ASQ�SEM.0ŠMOVE.L�LIBENT(A4),TCBENTRY(A0)�TASK�ENTRY�POINT'ŠMOVE.W�USER-B(A6),TCBUSER(A0)ƒUSER�NO.)ŠMOVE.B�#$FA,TCBSSP(A0)„EXEC�STACK�LENGTH&ŠMOVE.L�LIBENT(A4),TCBPC(A0)�USER'S�PC"ŠMOVE.W�#$0084,TCBVOR(A0)‚Plug�VOR*NOW BUILD TSTŠLEA„TCBBLK+TSTBEGIN(PC),A0ŠMOVE.L�#'!TST',TST(A0)1ŠMOVE.B�#MAXSEG,TSTNSEGS(A0)�MAX.�NO.�OF�SEGMENTS4ŠMOVE.W�#$24,TSTLMMU(A0)ƒINDEX�TO�LAST�MMU�LOAD�LINE6ŠMOVE.W�#$44,TSTLATTR(A0)‚INDEX�TO�LAST�SEG.�ATT.�LINE*BUILD SEGMENT INFO. IN TST*ŠLEA„LIBLK+LIBSAD(PC),A4„START�OF�SEGMENTS'ŠMOVE.W�#MAXSEG,D1‰MAX.�NO.�OF�SEGMENTS/ŠLEA„MMUPO(PC),A1‡START�OF�MMU�PHYSICAL�OFFSETS%ŠLEA„TSTMMU(A0),A2†START�OF�MMU�INFO.)ŠMOVE.L�A2,A3ŽSTART�OF�SEGMENT�ATTRIBUTES#*SEE IF ALL SEGMENTS HAVE BEEN DONE,TCB65…MOVE.L�A4,A0ŽPOINT�A0�TO�START�OF�SADS%ŠBSR„FINS2ŽDO�WE�PROCESS�THIS�SEGMENTŠBEQ.S‚TCB67ŽBRANCH�IF�YES3ŠADD.L‚#1,D1ŽCOME�HERE�IF�SEGMENT�IS�TO�BE�EXCLUDED ŠBRA.S‚TCB72*TCB67…MOVE.L�SADSTR(A4),D2ŠMOVE.L�SADLEN(A4),D3ŠCMP.L‚#-1,D3�LENGTH=-1?"ŠBEQ.S‚TCB75ŽYES-DONE�ALL�SEGMENTSŠADD.L‚D2,D3ŽD3=END�ADDR.+1ŠSUB.L‚#1,D3ŽD3=END�ADDR.ŠROR.L‚#8,D2ŽGET�PAGE�STARTŠROR.L‚#8,D3ŽGET�PAGE�END'ŠMOVE.W�D2,TSTLB(A2)‡SAVE�STARTING�PAGE%ŠMOVE.W�D3,TSTLE(A2)‡SAVE�ENDING�PAGE)ŠMOVE.W�(A1)+,TSTPO(A2)„SAVE�PHYS.�OFFSET3ŠMOVE.W�#RAMCTL,TSTCTL(A2)�SET�UP�STATUS-ASSUME�RAM5*CHANGE STATUS TO ROM IF SEGMENT ATTRIBUTE BIT 14 SETŠBTSTW‚#SEGAROM,SADATT(A4) ŠBEQ.S‚TCB70ŠMOVE.W�#ROMCTL,TSTCTL(A2)5TCB70…MOVE.L�SADNAM(A4),TSTANAME(A3)�SAVE�SEMENT�NAME7ŠMOVE.W�SADATT(A4),TSTAATTR(A3)�SAVE�SEGMENT�ATTRIBUTES*MASK OFF SHARABLE SEGMENT BITSŠBCLRW‚#SEGASHR,TSTAATTR(A3)ŠBCLRW‚#SEGAGLBL,TSTAATTR(A3)-*SET BIT INDICATING THAT THIS IS PHYSICAL ROM‰BSETW…#SEGAPROM,TSTAATTR(A3)6*SEGMENT INFO. SETUP IN TST-GET READY FOR NEXT SEGMENT ŠLEA„8(A2),A2 ŠLEA„8(A3),A3TCB72…LEA„LIBSADLN(A4),A4ŠDCNTƒD1,TCB65#*SAVE ACTUAL NO. OF SEGMENTS IN TSTTCB75…SUB.W‚#MAXSEG,D1 ŠNEG.W‚D1CŠLEA„TCBBLK+TSTBEGIN(PC),A0�Point�to�Task�Segment�Table�we're�makinŠMOVE.B�D1,TSTCSEGS(A0)!*WRITE TCB AND TST TO OUTPUT FILE1ŠADD.W‚#1,TSKCNT-B(A6)„BUMP�#�OF�TASK'S�PROCESSEDŠLEA„TMPIOS(PC),A0ŠLEA„TCBBLK(PC),A2ŠMOVE.L�A2,IOSSAD(A0)ŠLEA„TCBBLK+255(PC),A2ŠMOVE.L�A2,IOSEAD(A0) ŠIOSCALL�(A0) ŠBNE„IOERRŠADD.L‚#256,IOSSAD(A0)ŠADD.L‚#256,IOSEAD(A0) ŠIOSCALL�(A0) ŠBNE„IOERR<ŠBTSTƒ#ROPT,OPTFLG-B(A6)�DO�NOT�BUMP�LOCATION�COUNTER�IF�...+ŠBNE.S‚FINTRTNŒ...�IN�ROM�MODE�('R'�OPTION))ŠADD.L‚#512,CLC-B(A6)…UPDATE�LOC.�COUNTER+ŠBSR„PCUPDATŒUpdate�symbol�table�PC�counterFINTRTN*CLOSE LO FILEŠLEA„TSKFHS(PC),A0ŠMOVE.W�#FHCLOS,FHSCMD(A0) ŠFHSCALL�(A0) ŠBNE„IOERRŠCLR.L‚TPSW-B(A6)6ŠCLR.W‚EXCLNUM-B(A6)†CLEAR�NUMBER�OF�EXCLUDED�SEGMENTS1ŠCLR.B‚SEGFLG-B(A6)‡CLEAR�SEGMENT�PROCESSING�FLAGŠCLR.L‚SUBSIOS+IOSRRN-B(A6)ŠCLR.W‚SUBSIOS+IOSOPT-B(A6)$ŠLEA„PCDSP(PC),A2‡PRINT�NEW�PC�VALUE ŠMOVE.L�#6,D1ŠMOVE.L�CLC-B(A6),D0'ŠBSR„BINHEX�CONVERT�NEW�PC�VALUE�TO�HEX(ŠLEA„PCMSG(PC),A1‡DISPLAY�NEW�PC�MESSAGEŠLEA„PCMSGE(PC),A2 ŠBSR„LISOUT ŠBNE„IOE$ RRŠMOVE.L�(A7)+,A1‹RESTORE�REG.ŠRTS*=* SUBROUTINE TO OUTPUT TO TEMPORARY BOOT FILE FOR ONE SEGMENT**�INPUT:‚A0�-�POINTS�TO�SAD9*‰REGISTERS�A0,D0�AND�D1�ARE�PRESERVED,�OTHERS�MAY�CHANGE* FINT40„EQU„*&ŠMOVEM.L�A0/D0/D1,-(A7)„SAVE�REGISTERS$ŠMOVE.L�A0,A4ŽUSE�A4�FOR�SAD�POINTER*-* ERROR IF SEGMENT NOT START ON PAGE BOUNDARY1FINT44„MOVE.L�SADSTR(A4),D2†SEGMENT�LOGICAL�START ŠTST.B‚D2 ŠBNE„ERR12** ERROR IF SEGMENT ZERO LENGTH$ŠMOVE.L�SADLEN(A4),D3†SEGMENT�LENGTH ŠBEQ„ERR9 ŠADD.L‚D2,D3)ŠSUB.L‚#1,D3ŽD3=ENDING�ADDRESS�OF�SEGMENT*F* IF 'P' OPTION SPECIFIED OR WE ARE HANDLING A PROCESS DIRECTIVE, THEN0*ƒADDRESSES�IN�LIB�MUST�MATCH�PHYSICAL�ADDRESSES9*ƒIN�OBJECT�FILE,�ELSE�STEP�OVER�OBJECT�FILE�UNTIL�EQUAL.*1ŠBTSTƒ#POPT,OPTFLG-B(A6)�WAS�'P'�OPTION�SPECIFIEDŠBNE.S‚FINT47�BRANCH�IF�YES0ŠTST.B‚SEGFLG-B(A6)‡IS�THIS�A�SEGMENT�DIRECTIVE?ŠBNE.S‚FINT52�BRANCH�IF�YES$ŠTST.L‚TPSW-B(A6)‰IS�THIS�A�PROCESS?ŠBPL.S‚FINT52�BRANCH�IF�NO3FINT47„MOVE.L�CLC-B(A6),D6‡CURRENT�LOCATION�COUNTER)FINT48„CMP.L‚D6,D2ŽCOMPARE�CLC,�SEG�STARTŠBEQ.S‚FINT52�OK�IF�EQUAL#ŠBCS„ERR10ŽERROR�IF�SEG�START�<�CLC!ŠBSR„ZERBUF�PAD�A�PAGE�WITH�ZEROSŠADD.L‚#$100,D6 ŠBRA.S‚FINT48*=* CALCULATE PHYSICAL OFFSET = CLC - SEGMENT START AND SAVE IN*ƒMMU�PHYSICAL�OFFSET�LIST*FINT52„MOVE.L�CLC-B(A6),D0ŠSUB.L‚D2,D0ŽCLC�-�SEG�START ŠROR.L‚#8,D0ŠMOVE.W�SEGCNT-B(A6),D4 ŠLSL.W‚#1,D4ŠLEA„MMUPO(PC),A1ŠMOVE.W�D0,0(A1,D4.W)** SAVE SEGMENT START IN FSTARTŠMOVE.L�CLC-B(A6),FSTART-B(A6)*+* PROCESS ALL MIDS IN RANGE OF THIS SEGMENT!ŠLEA„LIBLK+LIBMID-LIBMIDLN(PC),A5:ŠMOVE.L�#1,SUBSIOS+IOSRRN-B(A6)�RECORD�NUMBER�TO�READ�NEXT ŠBRA.S‚FINT66FINT64„CLR.L‚D4&ŠMOVE.W�2(A5),D4‹STARTING�PAGE�FOR�MIDŠSUB.W‚(A5),D4 ŠADD.L‚#1,D4Ž#PAGES�MID�OCCUPIES3ŠADD.L‚D4,SUBSIOS+IOSRRN-B(A6)�UPDATE�RECORD�NUMBER/FINT66„LEA„LIBMIDLN(A5),A5„POINT�A5�TO�NEXT�MIDŠCMP.L‚#$FFFF,(A5)ˆEND�OF�MIDS?,ŠBEQ.S‚FINT76�BRANCH�IF�YES�-�DONE�WITH�MIDS ŠCLR.L‚D6 ŠCLR.L‚D7$ŠMOVE.W�(A5),D6ŒSTARTING�PAGE�OF�MID!ŠROL.L‚#8,D6ŽSTARTING�ADDR�OF�MID#ŠMOVE.W�2(A5),D7‹ENDING�PAGE�OF�MID ŠROL.L‚#8,D7%ŠMOVE.B�#$FF,D7ŒENDING�ADDRESS�OF�MID*7* DETERMINE IF MID IN RANGE OF SEGMENT WE'RE WORKING ON*ƒD6�=�MID�START*ƒD7�=�MID�END&*ƒD2�=�CURRENT�POSITION�WITHIN�SEGMENT*ƒD3�=�SEGMENT�END*)ŠCMP.L‚D2,D6ŽIS�MID�START�<�SEG�POSITION?'ŠBCS.S‚FINT64�YES�-�GO�LOOK�AT�NEXT�MID.ŠCMP.L‚D3,D6ŽNO�-�IS�MID�START�<=�SEG�POSITION3ŠBHI.S‚FINT76�BRANCH�IF�NO�-�DONE�WITH�MIDS�FOR�SEG*4* MID START LIES IN SEGMENT - CHECK FOR GOOD MID END#ŠCMP.L‚D6,D7ŽIS�MID�END�<�MID�STARTŠBCS„ERR9�BRANCH�IF�YES�-�ERROR&ŠCMP.L‚D3,D7ŽIS�MID�END�WITHIN�SEGMENTŠBHI„ERR13ŽBRANCH�IF�NO�-�ERROR*4* FOUND MID WITHIN RANGE OF SEGMENT WE'RE PROCESSING**ƒFILL�SEGMENT�WITH�ZEROES�TO�START�OF�MID*:FINT68„CMP.L‚D2,D6ŽIS�MID�START�=�CURRENT�POSITION�IS�SEG?ŠBEQ.S‚FINT70�BRANCH�IF�YES(ŠBSR„ZERBUF�NO�SO�PAD�A�PAGE�WITH�ZEROES-ŠADD.L‚#$100,D2‹BUMP�CURRENT�SEGMENT�POSITION ŠBRA.S‚FINT68** OUTPUT THIS MIDCFINT70„MOVE.W�#IOPIMG+IOPBLK+IOPRAN,SUBSIOS+IOSOPT-B(A6)�BLOCK�READ#ŠIOSCALL�SUBSIOS(PC)‡READ�BOOT�FILE ŠBNE„IOERR ŠBSR„WRTBUF'ŠADD.L‚#$100,D2‹UPDATE�SEGMENT�POSITION"ŠADD.L‚#$100,D6‹UPDATE�MID�POSTIONŠADD.L‚#$1,SUBSIOS+IOSRRN-B(A6)ŠCMP.L‚D7,D6ŽDONE�WITH�MID?ŠBLS.S‚FINT70�BRANCH�IF�NO$ŠBRA„FINT66�CONTINUE�PROCESSING�MIDS*B* DONE WITH ALL MIDS FOR THIS SEGMENT, ZERO FILL TO END OF SEGMENT FINT76„EQU„*ŠCMP.L‚D3,D2ŽFINISHED�SEG?ŠBHI.S‚FINT80�BRANCH�IF�YES ŠBSR„ZERBUFŠADD.L‚#$100,D2 ŠBRA.S‚FINT76*.* RESTORE REGISTERS AND RETURN TO MAIN ROUTINEFINT80„MOVEM.L�(A7)+,A0/D0/D1ŠRTSŠPAGE*D* SUBROUTINE TO SEE IF ALL SEGMENTS DEFINED IN EXCLUDE STATEMENT ARE*ƒREALLY�LEGAL�SEGMENT�NAMES.7*‰IF�ILLEGAL�NAME�IS�ENCOUNTERED,�MESSAGE�IS�DISPLAYED.*ƒA0,A1,A2,D1,D2�DESTROYED*BFINS1…MOVE.W�EXCLNUM-B(A6),D2ƒD2�COUNTS�EXCEPTION�ENTRIES�RUN�THRU0ŠBEQ.S‚FINS1G�BRANCH�IF�NO�EXCEPTION�LIST�(GOO% D)/ŠLEA„EXCLLST(PC),A1…A1�RUNS�THRU�EXCEPTION�LIST9FINS12„LEA„LIBLK+LIBSAD-LIBSADLN(PC),A0„A0�RUNS�THRU�SADS>FINS14„LEA„LIBSADLN(A0),A0„POINT�A0�TO�SAD�UNDER�CONSIDERATION,ŠCMP.L‚#-1,SADLEN(A0)…ARE�WE�THRU�WITH�SAD'S+ŠBEQ.S‚FINS1B�BRANCH�IF�BAD�SEGMENT�IN�LIST+ŠMOVE.L�SADNAM(A0),D1†SEGMENT�NAME�FROM�LIBŠCMP.L‚(A1),D1 ŠBNE.S‚FINS14CFINIS16ƒMOVE.L�(A1),(A1)+‰ADVANCE�A1�TO�NEXT�ITEM�IN�EXCEPTION�LIST ŠSUB.W‚#1,D2/ŠBNE.S‚FINS12�GO�CHECK�NEXT�EXCEPTION�LIST�ITEM FINS1G„RTS@FINS1B„MOVE.L�(A1),CMSG16+2-B(A6)�MOVE�SEGMENT�NAME�INTO�MESSAGE&ŠMOVE.L�A1,-(A7)‹SAVE�A1�THRU�I/O�CALLŠLEA„CMSG16(PC),A1ŠLEA„CMSG16E(PC),A2 ŠBSR„EMLOGLIS ŠBNE„IOERRŠMOVE.L�(A7)+,A1/ŠBRA.S‚FINIS16ŒCONTINUE�EXAMINING�SEGMENT�NAMESŠPAGE*N* SUBROUTINE TO SEE IF SEGMENT IS TO BE INCLUDED (CHECKS AGAINST EXCLUDE LIST)*ƒA0�POINTS�TO�SAD.2*ƒRETURNS�EQUAL�IF�SEG�PASSES,�NOT�EQUAL�OTHERWISE*ƒNO�REGISTERS�ARE�DESTROYED* FINS2…EQU„*ŠMOVEM.L�A1/D1/D2,-(A7)4ŠMOVE.W�EXCLNUM-B(A6),D2ƒD2�COUNTS�EXCEPTION�ENTRIES,ŠBEQ.S‚FINS2G�BRANCH�IF�NO�EXCEPTION�ENTRIES/ŠLEA„EXCLLST(PC),A1…A1�RUNS�THRU�EXCEPTION�LIST+ŠMOVE.L�SADNAM(A0),D1†SEGMENT�NAME�FROM�LIBFINS24„CMP.L‚(A1)+,D1,ŠBEQ.S‚FINS2B�BRANCH�IF�SEGMENT�DOESN'T�PASS ŠSUB.W‚#1,D2ŠBNE.S‚FINS24�KEEP�CHECKING ŠBRA.S‚FINS2G*FINS2B„MOVE.W�D2,D2ŽSET�NONZERO�COND�CODESFINS2G„MOVEM.L�(A7)+,A1/D1/D2ŠRTS*F* SUBROUTINE TO MOVE TASK MESSAGE TO MESSAGE INFORMATION LIST IF ROOM.>*ƒMESSAGE�TEMPORARY�LOC�IS�BLANKED�OUT�AFTER�MESSAGE�IS�MOVED.*ƒALL�REGISTERS�PRESERVED*TSKMSG„MOVEM.L�A0/A1/D0,-(A7),ŠMOVE.L�TSKLST-B(A6),A0„WHERE�TO�STORE�ENTRY+ŠBTSTƒ#MAPF,MAPFLG-B(A6)‡IS�MAP�TABLE�FULL?ŠBNE.S‚TSKMS3�BRANCH�IS�YES(ŠCMP.L‚TSKMSGE-B(A6),A0ƒAT�END�OF�TABLE?ŠBNE.S‚TSKMS1�BRANCH�IF�NO6ŠBCHGƒ#MAPF,MAPFLG-B(A6)‡SET�MAP�FULL�BIT�IN�FLAG�WORD ŠBRA.S‚TSKMS3TSKMS1„LEA„FILNAM(PC),A1ŠMOVE.W�#EACHENT/2,D0TSKMS2„MOVE.W�(A1)+,(A0)+ŠDCNTƒD0,TSKMS2+ŠMOVE.L�A0,TSKLST-B(A6)„ADDR.�OF�NEXT�ENTRYTSKMS3„LEA„FILNAM(PC),A0,TSKMS4„MOVE.W�#'‚',(A0)+ˆBLANK�OUT�TEMPORARYŠCMP.L‚TSKENTE-B(A6),A0 ŠBLO.S‚TSKMS4TSKMS5„MOVEM.L�(A7)+,A0/A1/D0ŠRTS%*************************************)* SUBROUTINE TO USE ERROR MESSAGE HANDLER*ƒD0�-�MESSAGE�CODE'*ƒA0�-�POINTS�TO�PARAMETER�BLOCK�IF�ANY* ERRMSG„EQU„*ŠMOVEM.L�D0/A0,ERRPBLK-B(A6) ŠMOVE.L�#2,D0ŠLEA„ERRPBLK-B(A6),A0ŠTRAPƒ#4ŠMOVEM.L�ERRPBLK-B(A6),D0/A0ŠRTSPATCH…DS.Bƒ50‘PATCH�AREA ŠEND„SYSGENééé=/*=/*†TASKDUMP.AF=/*+=/* Chain file to assemble TASKDUMP utility=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to TASKDUMP.LS=/*=/IFC \1ƒ=ARG�TASKDUMP.LS=/ENDIF=/*&=ASM TASKDUMP.SA,TASKDUMP.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*}=/*=ENDé% ééééé¥=/*=/*†TASKDUMP.LF=/*)=/* Link chain file to create TASKDUMP.SY=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to TASKDUMP.LL=/*=/IFC \1ƒ=ARG�TASKDUMP.LL=/ENDIF=/*=LINK ,TASKDUMP.SY,\1;AHMIX ATTRIBUTES PSEG SEG0:0-15 $0INPUT TASKDUMP.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé®+TASKDUMP�IDNT†4,3‡VERSAdos�TASKDUMP�utilityH************************************************************************9*ˆT�A�S�K�D�U�M�P‚--‚THIS�PROGRAM�IS�AUTOMATICALLY�LOADED9*ˆBY�THE�LOADER�WHEN�YOUR�TASK�ABORTS.‚PLEASE�NOTE�THAT�A<*ˆSECTION�OF�T& HIS�PROGRAM�IS�OVERLAYED�BY�MEMORY�CONTENTS�OF9*ˆTHE�ABORTED�TASK!‚SEE�THE�WARNING�TOWARD�THE�END�OF�THE *ˆLISTING.H************************************************************************ ˆOPTƒFRS,NOCL  STORE_ADDR‚MACROŒPEA�\1(PC)‡SPR�936‚2/1/84ŒMOVE.L�(A7)+,\2ŒENDM MESGˆMACROŒLEA…MSGIOS(PC),A0ŒSTORE_ADDR�<\1>,IOSSAD(A0)ŒSTORE_ADDR�<\2>,IOSEAD(A0)ŒTRAP„#2ŒENDM* INPUT‡MACRO\@ŠMESG‚<\1>,<\2>ŒLEAƒMSGIIOS(PC),A0ŒTRAP‚#2ŒIF‚‚THEN.SŽCMP.B�#ISTATO,D0ŽBEQ�\@ ŽBRA�FATALERRŒENDI ŒBSR�SBARG ŒBNE�FATALERRŒENDM SPC 2(*****************************************‡FIELD�FORMATTING�MACRO‰*…(**************************************** SPC 2'*ƒFLD�ASM-LABEL,TEXT,DATA-SIZE,CONTINUE SPC 1 FLD„MACRO‡DC.B�\2 \1…DS.B�\3‡IFNC�'C','\4' ‡DC.B�CR,LF‡ENDC‡ENDM‡SPC�2)******************************************‹UTILITY�MACROSŽ*)*****************************************‡SPC�1.*�MOVE-HEX‚BYTE-COUNT,SOURCE-ADDR,DEST-ADDRESS‡SPC�1 MVHEX‚MACRO‡IFNCƒ'D0','\2' ‡MOVE.L‚\2,D0‡ENDC‡IFNCƒ'A1','\3' ‡LEA…\3,A1‡ENDC ‡IFNE„\1-8‡MOVE.W‚#\1,D2 ‡BSR…CVHEX‡ENDC ‡IFEQ„\1-8 ‡BSR…CVHEX8‡ENDC‡ENDM‡SPC�10*�MOVE-ASCII‚BYTE-COUNT,SOURCE-ADDR,DEST-ADDRESS‡SPC�1 MVASC‚MACRO‡MOVE.L�#\1,D1‡IFNCƒ'A0','\2' ‡LEA„\2,A0‡ENDC‡IFNCƒ'A1','\3' ‡LEA„\3,A1‡ENDC ‡BSR„MOVEASC‡ENDM**…MOVE�FILENAME�ASCII�FIELDS* MVASCN MACRO‡MOVE.L�#\1,D1‡IFNCƒ'A0','\2' ‡LEA„\2,A0‡ENDC‡IFNCƒ'A1','\3' ‡LEA„\3,A1‡ENDC ‡BSR„MOVASCN‡ENDM‡SPC�1 CR…SET‚$0D LF…SET‚$0A‰PAGEJ****************************************************************************ˆINCLUDES�OF�SYSTEM�FILES**ˆINCLUDE�9995.&.TR1.EQ*ˆINCLUDE�9995.&.IOE.EQ*·lÀFÈDÐfØUàOèJðGøNG=CK J**************************************************************************‰NOLIST‰INCLUDE�9995.&.TR1.EQ‰INCLUDE�9995.&.IOE.EQ‰LISTˆPAGE ˆSECTION‚0B…EQU‚* J***************************************************************************ˆREVISION�INFORMATION* *‚IDNT�4,3 *‡122084�42*‘All�code�was�modified�where�applicable�to�ensure**‘position�independance�and�relocatability* *‚IDNT�4,2 *‡120484�48*’With�VERSAdos�version�4.4,�the�organization�of�the�TCB8*’structure�was�changed,�as�well�as�the�placement�of�the7*’TST�structure�within�the�TCB.‚The�constant�portion�of.*’the�utility�had�to�be�changed�to�correspond. *‚IDNT�4,1@*‡02/01/84:‚(SPR�936)‚UTILITY�DID�NOT�DUMP�ANY�RAM�IMAGES.�ERROR5*’TRACED�TO�'PEA'�INSTRUCTIONS�NOT�USING�PC-RELEATIVE7*’ADDRESSING�MODE.�PARAMETER�BLOCK�BEGINNING�AND�ENDING(*’ADDRESSES�WERE�OUT�OF�THE�USER'S�AREA.*@*‡10/31/84ƒ(SPR1101)�CHECK�FOR�TASK�SUSPENDED�(SUSPD)�IS�INVALID2*’CAUSING�SESSION�TO�HANG�UP�ON�OCCASION.‚CHECK�IS*’BEING�DELETED.J************************************************************************** 'REVIS„DC.B�'122084'‡DATE�OF�LAST�CHANGE(‰DC.B�'�'ŒBLANK�INDICATES�CLEAN�ASSEMBLY(‰DC.B�'4'ŒMAJOR�VERSADOS�REVISION�NUMBER TSKINF‚EQUƒ28**†DATA�STORAGE*‰DS.L‚50 STACK„EQUƒ***…FLAGS* FLAGS„DC.W‚0+NOINP„EQUƒ7ŒINPUT�DEVICE�IS�NOT�INTERACTIVE$NOFILEƒEQUƒ6ŒDUMP�FILE�NOT�ALLOCATEDH*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 10/31/84>>>1*SUSPD„EQUƒ5ŒTASK�LU�6�BORROWED�FROM�IS�SUSPENDEDH*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 10/31/84>>>#NOGO…EQUƒ4ŒNO�ONE�TO�TALK�TO�-�QUIT*%INFOPBƒDC.L‚0,0ŠTASK�NAME�AND�SESSION‰DC.W‚$8000ˆOPTIONS�-�GET�TCB0INFOPBAD�DC.L‚0�ADDRESS�OF�SAVETCB�GETS�PUT�HERE*(*…TERMINATION�EVENT�SENT�AS�COMMAND�LINE*EVNTBUF‚COMLINE‚24*EVNTLNG‚EQUƒEVNTBUFEVNTCOD‚EQUƒEVNTBUF+1EVNTTIN‚EQUƒEVNTBUF+2EVNTPRI‚EQUƒEVNTBUF+3EVNTTSK‚EQUƒEVNTBUF+4EVNTSES‚EQUƒEVNTBUF+8EVNTUNM‚EQUƒEVNTBUF+12EVNTACOD�EQUƒEVNTBUF+14& EVNTATTR�EQUƒEVNTBUF+16EVNTRA0‚EQUƒEVNTBUF+18‰PAGE**„TASK�CONTROL�BLOCK* SAVETCB‚EQUƒ* ‰DC.L‚0…!TCB1‰DC.L‚0,0,0ƒLINKS�TO�TCBALL,TCBGROUP�AND�TCBREADYTCBNAME‚DC.L‚0‡TASK�NAMETCBSESSN�DC.L‚0‡SESSION2TCBMONƒDC.L‚0,0…MONITOR�TASK�NAME�AND�SESSION�CODE+TCBSEMƒDC.L‚0‡LINK�TO�NEXT�SEMAPHORE�WAITER3TCBCPRI‚DC.B‚0,0,0ƒPRIORITIES�-�CURRENT,LIMIT,READY+TCBIOCNT�DC.B‚0‡COUNT�OF�PENDING�I/0�EVENTSTCBATTR‚DC.W‚0‡ATTRIBUTESTCBABORT�DC.W‚0‡ABORT�CODETCBSTATE�DC.L‚0‡STATE�WORD‰DC.W‚0,0,0ƒTST�SEMAPHORE+TCBTSTƒDC.L‚0‡POINTER�TO�TASK�SEGMENT�TABLE‰DC.W‚0,0,0ƒASQ�SEMAPHORETCBASQƒDC.L‚0‡POINTER�TO�ASQ,TCBCHAN‚DC.L‚0‡LINK�TO�CHANNEL�CONTROL�BLOCK+TCBEVECT�DC.L‚0‡ADDRESS�OF�EXCEPTION�VECTOR&TCBTVECT�DC.L‚0‡ADDRESS�OF�TRAP�VECTOR *°<<120484‰DS.L‚1‡RESERVED�FOR�FUTURE�USE6TCBNAUƒDC.L‚1‡ADDRESS�OF�NAT�ENTRY�IF�THIS�TASK�IS�NAU,TCBDLAY‚DC.L‚1‡ADDRESS�OF�DELAY�ENTRY�IN�PAT *°120484>> ‰DC.L‚0,0,0,0TCBENTRY�DC.L‚0‡ENTRY�ADDRESSTCBUSER‚DC.W‚0‡USER�NUMBER‰DC.W‚0‡EXEC�STACK�DEPTH,TRAP�#‰DS.L‚15†EXEC�REGISTERS7TCBATSK‚DC.L‚0,0…NAME�AND�SESSION�OF�TASK�CAUSING�ABORT=TCBBERR‚DC.L‚0,0…8�BYTES�PUT�ON�STACK�BY�BUS�OR�ADDRESS�ERROR‰DS.B‚64†STACK�AREA*TCBD0„DS.L‚16†REGISTERS *°<<120484TCBSR„DC.W‚0‡STATUS�REGISTERTCBPC„DC.L‚0‡PROGRAM�COUNTER‰DS.W‚3‰DS.L‚5**…TASK�SEGMENT�TABLE* ‰DC.L‚0‡!TST*TSTNSEGS�DC.B‚0‡NUMBER�OF�SEGMENTS�ALLOWED5TSTCSEGS�DC.B‚0‡NUMBER�OF�SEGMENTS�CURRENTLY�EXISTING&TSTLMMU‚DC.W‚0‡INDEX�TO�LAST�MMU�ENTRY-TSTLATTR�DC.W‚0‡INDEX�TO�LAST�ATTRIBUTE�ENTRYTSTSTAT‚DC.W‚0‡MMU�STATUSTSTMMUƒDS.W‚16†MMU�LOAD�INFO'TSTATTR‚DS.W‚16†SEGMENT�ATTRIBUTE�BLOCK8TSTWTSK‚DC.L‚0‡NAME�OF�TASK�WITH�WINDOW�TO�ADDRESS�SPACE‰DS.L‚10†NOT�USED’120484>>*$TCBDATE‚DC.L‚0‡DATE�INSERTED�BY�DUMP$TCBTIME‚DC.L‚0‡TIME�INSERTED�BY�DUMP*2TCBEXMƒDC.L‚0,0…EXCEPTION�MONITOR�NAME�AND�SESSIONTCBEMMSK�DC.L‚0‡MASKTCBEVMSK�DC.L‚0‡VALUE�MASKTCBEVLOC�DC.L‚0‡VALUE�LOCATIONTCBVALU‚DC.L‚0‡VALUE�CONTENTS0TCBECNT‚DC.L‚0,0…MAX�COUNT�OF�INSTRUCTIONS,SPARE‰PAGE*#*„DATA�STORAGE�FOR�MESSAGE�ROUTINES*/CLUFHS‚DC.W‚$0110�COMMAND�=�CHANGE�LOGICAL�UNIT&ˆDC.W‚$8001�OPTIONS�=�KEEP�AND�RECEIVE CLULGU‚DC.B‚0,6,6,0‹LOGICAL�UNIT!CLUTSK‚DC.L‚0‘TASK�TO�GET�LU�FROMCLUSES‚DC.L‚0‘SESSION�OF�SAME*0ATTRFHS�DC.W‚$0180�COMMAND�=�RETREIVE�ATTRIBUTESˆDC.W‚0‘OPTIONSˆDC.B‚0,6�STATUS,LUATTRDEV�DC.L‚0‘VOLUMEˆDC.W‚0‘USER�NUMBER ˆDC.L‚0,0,0,0‹CATALOG,�FILE�NAMEˆDC.W‚0,0�EXTENT(ATTRCOD�DC.W‚0,0,0,0‹ATTRIBUTES�CODE,ETC*ASG5FHS‚DC.W‚FHASGN ‰DC.W‚FOPPRPW‰DC.W‚5ASG5DEV‚DC.L‚0‰DC.W‚0 ‰DC.B‚'’' ‰DC.L‚0,0,0*MSGIOS‚DC.W‚IOWRIT ˆDC.W‚IOPIMG ˆDC.W‚LDFLUNˆDC.W‚0ˆDC.L‚0,0,0,0,0* MSGIIOS�EQU‚* ˆDC.W‚IOREAD ˆDC.W‚IOPFOR ˆDC.W‚CDFLUN ˆDC.W‚0,0,0)ˆDC.L‚0ŽADDRESS�OF�INPTBUF�GETS�PUT�HERE.(ˆDC.L‚0ŽADDRESS�OF�INPTBUF+79�GOES�HERE. ˆDC.L‚0,80INPTBUF�DC.B‚CR ˆDCB.B‚79,0ˆDS.B‚2ŽDEAD�SPACE�FOR�SBARG*?LINEIOS�DC.W�IOWRITŠTHIS�PARAMETER�BLOCK�IS�JUST�FOR�PRINTING�AˆDC.W�0�BLANK�LINE. ˆDC.W�LDFLUNˆDC.L�0,0,0,0,0ˆPAGEDMPFHS‚DC.W„FHALLOˆDC.W„FOPEW+FOPCONˆDC.W„3DMPFVOL�DC.L„'„'DMPFUNM�DC.W„-1DMPFCAT�DC.B„'TASKDUMP'DMPFNAM�DC.B„'ˆ'DMPFEXT�DC.W„'DU'ˆDC.W…0,0,0,0,16*DMP2FHS�DC.W…FHALLO+FHASGNˆDC.W…FOPEW+FOPSEQˆDC.W…3ˆDC.L…0,0,0,0,0,0ˆDC.W…0,0,256,0,8*DMPIOS‚DC.W…IOWRITˆDC.W…IOPBIN+IOPNXT ˆDC.W…3,0ˆDC.L…0,0,0,0,0*1LDRTASK‚DC.L„'&LDR'ˆRESUME�LOADER�PARAMETER�BLOCK‰DC.L„4**MOVLLPB‚DC.L„0,0ŒINSERT�ABORTING�TASK�NAMEMOVLLADR�DC.L„0‰DC.L„0,0‹MOVE�TO�SELF/MOVLLAD2�DC.L„0�ADDRESS�OF�SEGBUF�GETS�PUT�HERE"MOVLLSIZ�DC.L„256*8ŠLENGTH�OF�MOVE*ERRTRYƒDC.W„0�COUNT�ERRORS*=MSGDKER‚DC.B„'TDMP:�DUMP�TERMINATED�--�LAST�BLOCK�ADDRESS�=�' MGDKADR‚DC.B„'XXXXXX‚SEGMENT�=�'MGDKSEG‚DC.B„'XXXX' ‰DC.B„CR,LFMSGDKERE�EQU…*-1*‰DS�0NEWLINE‚DC.B�'�'‰PAGE*$*ƒABORT�MESSAGE�AND�REGISTER�DISPLAY*‰DS�0MSGACƒDC.B‚'�'MGTSKƒDC.B‚'„'!ˆFLDƒMGTSK2,<':�ABORTED�BY�'>,4,CˆFLDƒMGACOD,<'='>,4MSGACE‚EQUƒ*-1ˆDS.W‚0 MSGR1ƒEQU�*' ˆFLDƒMGPC,<'PC�'>,8,CˆFLDƒMGSR,<'‚SR�'>,4MSGR1E‚EQUƒ*-1‰DS�0MSGD1ƒFLDƒMGD0,<'�D0�'>,8,CˆFLDƒMGD1,<'ƒD1�'>,8,CˆFLDƒMGD2,<'ƒD2�'>,8,CˆFLDƒMGD3,<'ƒD3�'>,8MSGD1LEN EQU *-MSGD1ˆFLDƒMGD4,<'�D4�'>,8,CˆFLDƒMGD5,<'ƒD5�'>,8,CˆFLDƒMGD6,<'ƒD6�'>,8,CˆFLDƒMGD7,<'ƒD7�'>,8ˆFLDƒMGA0,<'�A0�'>,8,CˆFLDƒMGA1,<'ƒA1�'>,8,CˆFLDƒMGA2,<'ƒA2�'>,8,CˆFLDƒMGA3,<'ƒA3�'>,8ˆFLDƒMGA4,<'�A4�'>,8,CˆFLDƒMGA5,<'ƒA5�'>,8,CˆFLDƒMGA6,<'ƒA6�'>,8,CˆFLDƒMGA7,<'ƒA7�'>,8MSGRSTOP�EQU‚**ˆDS.W‚0-MGASKD‚DC.B‚'TDMP:�DO�YOU�WANT�A�DUMP?(Y/N)>'MGASKDE�EQUƒ*-1* *…MESSAGES*‰DS�0MGDEFNƒDC.B‚'TDMP:�'‰DC.B‚'DEFAULT�DUMP�FILE�IS‚'MGDEFFN‚DS.Bƒ32*‰DS�0MGDMPNƒDC.B‚'TDMP:�'‰DC.B‚'ˆDUMP�FILE�IS‚'MGDMPFN‚DS.B‚32*‰DS�0'EMGALCƒDC.B‚'TDMP:�(UNABLE�TO�ALLOCATE'‰DC.B‚'�DEFAULT�FILE)' ‰DC.B‚CR,LFEMGALCE‚EQUƒ*-1*‰DS�0'EMGAL2ƒDC.B‚'TDMP:�(UNABLE�TO�ALLOCATE'‰DC.B‚'�DUMP�FILE)' ‰DC.B‚CR,LFEMGAL2E‚EQUƒ*-1*‰DS�02MGNEWFƒDC.B‚'TDMP:�ENTER�NEW�FILENAME�OR�HIT�CR�>'MGNEWFE‚EQUƒ*-1‰PAGEJ****************************************************************************’ERROR�MESSAGE�PARAMETER�BLOCK*J************************************************************************** ‰DS.W�0EM_PBLK: -EM_D0„DC.L‚0‚D0�-�IOS/FHS�RETURN�ERROR�STATUS*ª(ERROR�MSG�KEYVALUE)-EM_A0„DC.L‚0‚A0�-�ADDR�OF�I/O�PARAMETER�BLOCKEM_OPTƒDC.B‚0‚OPTIONS�FLAG*­BIT‡MEANING�IF�SET*®0ˆQUERY�RESPONSE�DESIRED+EM_TLUN‚DC.B‚0‚USER�TERMINAL�LUN�-�(LDFLUN)$EM_QRCƒDC.B‚0‚QUERY�RETURN�CHARACTER+EM_KLUN‚DC.B‚0‚USER�KEYBOARD�LUN�-�(CDFLUN)3EM_SPAƒDC.L‚0‚START�ADDRESS�FOR�USER�TEXT�PLUG�POOL1EM_EPAƒDC.L‚0‚ENDƒADDRESS�FOR�USER�TEXT�PLUG�POOLˆPAGE‰XREF‚EDITFILE,SBARGJ***************************************************************************$*ˆEXECUTION�BEGINS�HERE�FOR�TASKDUMP*J************************************************************************** ˆSECTION�0 BEGINƒEQU„*2TASKDMP�LEA„B(PC),A4�LOAD�PROGRAM�BASE�ADDRESS�AND ˆLEA„STACK(PC),A7ŒSTACK�POINTER. 0‰BSR‡SET_ADDRŒSET�ADDRESSES�IN�I/O�PARAM�BLOCKS. 2ˆMOVEM.LƒEVNTTSK-B(A4),D6-D7‚TASK�NAME�AND�SESSIONˆMOVEM.LƒD6-D7,INFOPB-B(A4)ˆERQ.TSKINF�INFOPB-B(A4)**…GO�FIND�SOMEONE�TO�TALK�TO* ˆBSRƒFNDMSGD*%*†RESUME�LOADER�-�IT�SUSPENDED�ITSELF* ˆMOVE.L‚#2,D4UDMP0ƒERQ.RESUME‚LDRTASK-B(A4) ˆBEQ.S‚UDMP1ˆERQ.DELAY‚#100ˆDBRAƒD4,UDMP0*%*…DISPLAY�ABORT�MESSAGE�AND�REGISTERS*UDMP1ƒBTST‚#NOGO,FLAGS-B(A4) ˆBNE.S�QUIT ˆBSRƒDSPABRT0ˆBTST‚#7,TCBSTATE+2-B(A4)„WAS�THIS�TASK�RUNNING?ˆBNE.S‚QUIT”IF�NO�-�QUIT ˆBSRƒDSPREGS* *…IF�USER�TALKS�-�ASK�ABOUT�DUMP*,ˆBTST‚#12,TCBATTR-B(A4)‚DOES�USER�WANT�DUMP?ˆBEQ.S�QUIT�BRANCH�IF�NO)ˆBTST‚#NOINP,FLAGS-B(A4)�CAN�USER�ANSWER?ˆBNE.S�UDMP4ŽBRANCH�IF�NO/UDMP2„IOSCALL�LINEIOS-B(A4)ƒPRINT�A�BLANK�LINE.ˆINPUT�MGASKD,MGASKDE"ˆBSRƒCHKYORNŒDID�HE�SAY�YES�OR�NO?ˆBMIƒUDMP2ŽNEITHER�-�ASK�AGAIN"ˆBEQ.S�QUIT�HE�SAID�NO�-�GO�TO�END*2*…BUILD�DUMP�FILE�NAME�--�ALLOCATE�AND�ASSIGN�FILE*>UDMP4‚ERQ.GTDTIM�TCBDATE-B(A4)‚GET�DATE�AND�TIME�-�SAVE�IN�TCB&‡BSRƒBLDNAME�RETURN�WITH�FILE�ASSIGNED*(*…WRITE�TASK'S�SEGMENTS�OUT�TO�DUMP�FILE* ‡BSR.S�DODUMP**…DUMP�FINISHED*QUIT„ERQ.RESUME�EVNTTSK-B(A4)H*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 10/31/84>>>*‡BTST‚#SUSPD,FLAGS-B(A4) *‡BEQ.S‚QUIT2H*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 10/31/84>>>ˆCLR.W‚CLUTSK+8-B(A4)3ˆERQ.START‚CLUTSK-B(A4)ˆRESUME�OTHER�TASK�USING�CRT2QUIT2ƒERQ.TERMƒ#0,#0…TERMINATE�WITH�NORMAL�STATUS.ˆPAGE8*********************************************************#*ˆSET�ADDRESSES�IN�PARAMETER�BLOCKS*8******************************************************** SET_ADDR: &‰MOVE.L„A0,-(A7)ŒSAVE�A0�ON�THE�STACK. "‰STORE_ADDR�SAVETCB,INFOPBAD-B(A4) !‰STORE_ADDR�SEGBUF,MOVLLAD2-B(A4) 5‰LEA�MSGIIOS(PC),A0ŒSET�BUFFER�START�&�END�ADDRESS�IN5‰STORE_ADDR�INPTBUF,IOSSAD(A0)�INPUT�IOS�PARAM�BLOCK.!‰STORE_ADDR�INPTBUF+79,IOSEAD(A0) ' 1‰LEA‡LINEIOS(PC),A0†SET�UP�LINEIOS�TO�PRINT�OUT�A*‰STORE_ADDR�NEWLINE,IOSSAD(A0)�BLANK�LINE. ‰STORE_ADDR�NEWLINE,IOSEAD(A0)�* '‰MOVE.L„(A7)+,A0ŒRESTORE�A0�AND�RETURN.‰RTS›*‰PAGE**‡DUMP�TASK�TO�DISK*-*‡WRITE�TASK�CONTROL�BLOCK�TO�SECTORS�1�AND�2*‡DUMP�ALL�RAM�SEGMENTS*‡DUMP�ALL�ROM�SEGMENTS* DODUMP‚EQU…**ˆLEA„0,A1‹SET�ADDR�REG�TO�ZERO�FOR�ERR�RTNˆCLR.L‚D2�CLEAR�FOR�ERR�RTN/ˆLEA„SAVETCB(PC),A3…POINT�TO�!TCB�FOR�ERROR�RTNˆLEA„DMPIOS(PC),A0%ˆCLR.W‚ERRTRY-B(A4)‚CLEAR�RETRY�COUNT>‰PEA�SAVETCB(PC)‡PUT�START�AND�END�ADDRESSES�OFƒSPR�936‚2/1/843‰MOVE.L�(A7),IOSSAD(A0)ˆTCB�SAVE�BUFFER�INTO�DMPIOS‰ADD.L�#255,(A7)�PARAM�BLOCK.‰MOVE.L�(A7)+,IOSEAD(A0)‡*"DODUMP1�TRAPƒ#2–WRITE�OUT�THE�TCB."ˆBEQ.S‚DODUMP2„BRANCH�IF�NO�ERRORSˆBSR„DUMPERR„CHECK�ERRORˆBMI„DODUMP1„GO�BACK�TO�RETRY,DODUMP2�CLR.W‚ERRTRY-B(A4)ƒCLEAR�RETRY�COUNT ˆADD.L‚#256,IOSSAD(A0)‚2ND�BLOCKˆADD.L‚#256,IOSEAD(A0)DODUMP3�TRAPƒ#2"ˆBEQ.S‚DODUMP8†BRANCH�IF�NO�ERRORSˆBSR„DUMPERR†CHECK�ERROR ˆBMI„DODUMP3**†GET�SEGMENT�TO�DUMP**DODUMP8�MOVE.L‚TCBNAME-B(A4),MOVLLPB-B(A4)#ˆBSR.SƒDODGTRAM‡GO�FIND�RAM�SEGMENTˆBNE.SƒDODUMP10‡BRANCH�IF�FOUND#ˆBSR.SƒDODGTROM‡GO�FIND�ROM�SEGMENTˆBNE.SƒDODUMP10‡BRANCH�IF�FOUNDˆRTS”RETURN�-�DUMP�COMPLETE**‡READY�TO�DUMP�ONE�SEGMENT*DODUMP10�EQU„*2‰LEA„DMPIOS(PC),A0‚PUT�THE�START�AND�END�ADDRESSES=‰PEA�SEGBUF(PC)†OF�THE�SEGMENT�BUFFER�INTO�THE„SPR�936‚2/1/84+‰MOVE.L�(A7),IOSSAD(A0)ƒDMPIOS�PARAM�BLOCK.‰ADD.L�#255,(A7)�*‰MOVE.L�(A7)+,IOSEAD(A0)‡*‰MOVE.L�A1,MOVLLADR-B(A4)‰MOVE.L�#256*8,D2…SIZE�OF�MOVE%‰CMP.L‚D2,D1‰ARE�THERE�8�BLOCKS�LEFT?‰BPL.S‚DODUMP14†BRANCH�IF�YES ‰MOVE.L�D1,D2ADODUMP14�MOVE.L�D2,MOVLLSIZ-B(A4)„PUT�SIZE�OF�MOVE�IN�PARAM�BLOCK ‰SUB.L‚D2,D1 ‰ADD.L‚D2,A1‰ERQ.MOVELL‚MOVLLPB-B(A4)*‰LEA„DMPIOS(PC),A0DODUMP16�TRAPƒ#2‰BEQ.S‚DODUMP18‰BSR.S‚DUMPERR ‰BMI„DODUMP16DODUMP18�ADD.L‚#256,IOSSAD(A0)‰ADD.L‚#256,IOSEAD(A0)‰SUB.L‚#256,D2 ‰BNE„DODUMP16‰TST.L‚D1‹ANY�MORE�TO�MOVE? ‰BNE„DODUMP10 ‰BRA„DODUMP8**‡FIND�SEGMENT�TO�DUMP*#DODGTRAM�MOVE.L‚#1,D1‰RAM�INDICATOR ‰BRA.SƒDODGT2#DODGTROM�MOVE.L‚#3,D1‰ROM�INDICATOR*+DODGT2ƒLEA…TSTMMU+32(PC),A0‚END�OF�MMU�LISTB‰PEA�TSTMMU(PC)„PUT�LOOP�TERMINATION�VALUE�ON�STACKƒSPR�936�2/1/84&DODGT3ƒLEA…-8(A0),A0…MMU�ENTRY�POINTER#‰CMP.Wƒ6(A0),D1†DOES�SEGMENT�EXIST?‰BNE.SƒDODGT3A‡BRANCH�IF�NO‰MOVE.W‚36(A0),D1…ATTRIBUTES%‰AND.Wƒ#$C00,D1†IS�THIS�MMIO�OR�PROM?‰BEQ.SƒDODGT4ˆBRANCH�IF�NO$DODGT3A‚CMP.Lƒ(A7),A0‡END�OF�SEARCH?‰BNE…DODGT3‹BRANCH�IF�NO 5‰ADD.L�#4,A7ŽPOP�THE�TERMINATION�VALUE�OFF�THE�STACK. ‰RTS–RETURN�IF�SEGMENT�NOT�FOUND*;DODGT4ƒADD.L�#4,A7ŽPOP�THE�TERMINATION�VALUE�OFF�THE�STACK.‰CLR.Wƒ6(A0)ŒCLEAR�INDICATOR(‰LEA…32(A0),A3ˆSAVE�ADDR�OF�SEGMENT�NAME ‰CLR.LƒD1‰MOVE.W‚(A0),D1ŠSTARTING�PAGE‰LSL.Lƒ#8,D1ŒCONVERT�TO�ADDRESS"‰MOVE.L‚D1,A1‹RETURN�ADDRESS�IN�A1 ‰CLR.LƒD1‰MOVE.W‚2(A0),D1ˆENDING�PAGE‰SUB.Wƒ(A0),D1‰-�STARTING�PAGE‰ADD.Wƒ#1,D1‹+�1�=�#�PAGES‰LSL.Lƒ#8,D1‹SIZE�OF�SEGMENT‰RTS**DUMPERR‚ADD.Wƒ#1,ERRTRY-B(A4)…COUNT�ERRORS‰CMP.Wƒ#6,ERRTRY-B(A4)‰BMI.SƒDUMPER2.‰SUB.LƒD2,A1ŠGET�ADDRESS�OF�DATA�IN�LAST�BLOCK‰MOVE.L‚A1,D0‰MOVE�TO�DATA�REG&‰LSL.Lƒ#8,D0‰SHIFT�-�WANT�3�BYTES�ONLY‰MVHEXƒ6,D0,MGDKADR-B(A4)‰MVASCƒ4,(A3),MGDKSEG-B(A4)‰MESG„MSGDKER,MSGDKERE ‰BRA…QUIT DUMPER2‚RTS‡PAGE ‡SECTION‚0***ƒCHECK�FOR�YES�OR�NO�RESPONSE�TO�QUESTION* *„CONDITION�CODES�SET�ON�RETURN:.*…MINUS�=�RESPONSE�NOT�GIVEN�(REPEAT�QUESTION) *…ZERO‚=�NO *…PLUS‚=�YES* CHKYORN�EQUƒ*"ˆBNE.S�CHKYE‡ERROR�RETURN�FROM�I/O)ˆLEAƒINPTBUF(PC),A1‚START�OF�INPUT�BUFFER)CHKYNX‚MOVE.B�(A1)+,D0ƒGET�NEXT�CHARACTER:ˆMOVE.B�#CR,INPTBUF-B(A4)‚ALWAYS�PUT�CR�IN�1ST�CHAR�OF�BUF ˆCMP.B‚#'Y',D0†DID�USER�SAY�YES?ˆBEQ.S‚CHKYES‡BRANCH�IF�YES#ˆCMP.B‚#CR,D0‡IS�THIS�END�OF�INPUT?ˆBEQ.S‚CHKYEˆBRANCH�IF�YESˆCMP.B‚#'N',D0†DID�USER�SAY�NO?#ˆBNE„CHKYNX‡BRANCH�IF�DIDN'T�SAY�NOˆRTS‘RETURN�IF�ANSWER�WAS�NO3CHKYEƒMOVE‚#$08,CCR†SET�CC�MINUS�-�ANSWER�NOT�GIVENˆRTS( /CHKYES‚MOVE‚#0,CCRˆSET�CC�PLUS‚-�ANSWER�WAS�YESˆRTSˆPAGE**†CONVERT�FROM�HEX�TO�ASCII* *†INPUTS:,*ŠD0�=�HEX�VALUE�(LEFT�JUSTIFIED�IN�REGISTER(*ŠA1�=�POINTER�TO�BUFFER�TO�STORE�RESULT&*ŠD2�=�NUMBER�OF�HEX�DIGITS�TO�CONVERT* CVHEX8‚EQUƒ*6ˆMOVE.W‚#8,D2…LOTS�OF�8�DIGIT�CONVERSIONS�-�SPEC�ENTRY CVHEXƒEQUƒ*%ˆROL.L�#4,D0‡PUT�NEXT�CHAR�IN�BIT�0-3 ˆMOVE.B�D0,D1ˆAND.B‚#$0F,D1„ISOLATE�4�BITSˆADD.B‚#$30,D1„CONVERT�TO�ASCII$ˆCMP.B‚#$3A,D1„IS�IT�GREATER�THAN�9?ˆBLT.S‚CVHEXB…BRANCH�IF�NO"ˆADD.L‚#7,D1†ADD�7�TO�GET�A�THRU�F)CVHEXB‚MOVE.B‚D1,(A1)+‚SAVE�IN�OUTPUT�BUFˆSUB.W‚#1,D2†DECREMENT�COUNT ˆBNE„CVHEX†GO�BACK�FOR�NEXT�CHARˆRTS***„CONVERT�BINARY�TO�DECIMAL�-�4�CHARACTERS*CONVDEC4�EQUƒ*‰AND.L‚#$3FFF,D0ˆSHORTEN�NUMBER ‰DIVUƒ#1000,D0‰ISOLATE�1ST�DIGIT ‰AND.B‚#$F,D0‰ADD.B‚#$30,D0ŠCONV�TO�ASCII‰MOVE.B‚D0,(A1)+ˆSAVE�IN�OUTPUT ‰CLR.WƒD0‰SWAP„D0ŽGET�REST�OF�NUMBER ‰DIVU„#100,D0‰ADD.Bƒ#$30,D0‰CONV�TO�ASCII‰MOVE.B‚D0,(A1)+ˆSAVE�2ND�DIGIT‰SWAP„D0***†CONVERT�BINARY�TO�DECIMAL�-�2�CHARACTERS*CONVDEC2�EQU…*‰AND.Lƒ#$FF,D0ŠSHORTEN�NUMBER‰DIVU„#10,D0‹SEPARATE�DIGITS ‰AND.Bƒ#$F,D0‰ADD.Bƒ#$30,D0ŠCONVERT�TO�ASCII‰MOVE.B‚D0,(A1)+‰SAVE�CHARACTER‰SWAP„D0‰ADD.Bƒ#$30,D0ŠCONVERT�TO�ASCII‰MOVE.B‚D0,(A1)+‰SAVE�LAST�CHAR‰RTSˆPAGE*!*„MOVE�ASCII�DATA�TO�PRINT�BUFFER*†D1�=�NUMBER�OF�CHARACTERS*†A0�=�ADDRESS�TO�MOVE�FROM*†A1�=�ADDRESS�TO�MOVE�TO* MOVEASC�EQU‚*"ˆMOVE.B�(A0)+,D0‡GET�ONE�CHARACTER+ˆCMP.B‚#$1F,D0ˆIS�IT�LESS�THAN�PRINT�RANGE?ˆBLS.S‚MOVEASC2‡BRANCH�IF�YES.ˆCMP.B‚#$7B,D0ˆIS�IT�GREATER�THAN�PRINT�RANGE?ˆBLS.S‚MOVEASC4‡BRANCH�IF�NO0MOVEASC2�MOVE.B�#'�',D0‡REPLACE�CHARACTER�WITH�05MOVEASC4�MOVE.B�D0,(A1)+†STORE�CHARACTER�IN�PRINT�BUF‰SUB.W‚#1,D1‰DECREMENT�COUNT$‰BNE„MOVEASC‡LOOP�BACK�FOR�NEXT�CHAR‰RTS*7*…MOVE�ASCII�TO�BUILD�FILE�NAME�-�ONLY�A-Z�OR�1-9�LEGAL* MOVASCN�EQU‚*"ˆMOVE.B�(A0)+,D0‡GET�ONE�CHARACTER+ˆCMP.B‚#$2F,D0ˆIS�IT�LESS�THAN�PRINT�RANGE?ˆBLS.S‚MOVASCN2‡BRANCH�IF�YES.ˆCMP.B‚#$5A,D0ˆIS�IT�GREATER�THAN�PRINT�RANGE?ˆBGT.S‚MOVASCN2‡BRANCH�IF�YES-‰MOVE.B�D0,(A1)+†STORE�CHARACTER�IN�PRINT�BUF$MOVASCN2�SUB.W‚#1,D1‰DECREMENT�COUNT$‰BNE„MOVASCN‡LOOP�BACK�FOR�NEXT�CHAR‰RTS‰PAGEJ***************************************************************************+*ˆERROR�MESSAGES�FROM�ERROR�MESSAGE�HANDLER*J***************************************************************************INVAL:7‰MOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�MESSAGE,�BUT�RETURN!‰BSR.S…C_EM_PGM‰RTS* EROPTINV:*‰MOVE.L„#EM_NVO,D0Š'INVALID�OPTION'�ERROR.‰BRA.S…FATALERR* EROPTCON:-‰MOVE.L„#EM_OPTCF,D0ˆ'OPTION�CONFLICT'�ERROR.‰BRA.S…FATALERR*ERINVAL:)‰MOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�ERROR.***J***************************************************************************2*ˆROUTINE�TO�CALL�ERROR�MESSAGE�HANDLER,�THEN�DIE.*J*************************************************************************** FATALERR:‰BSR.S…C_EM_PGM.‰BRA‡QUIT†GO�DO�SPECIAL�TERMINATION�PROCEDURE.***M****************************************************************************** *’CALL�TO�ERROR�MESSAGE�HANDLER.*’OUTPUT�GOES�TO�LU�6.**ˆCALL†BSR‡C_EM_PGM*A*ˆINPUTS„D0�AND�A0�SET�BY�IOS�OR�FHS�CALL,�OR�D0�FOR�NON�IOS/FHS.*"*ˆOUTPUTSƒNO�REGISTER�PRESERVATION*N******************************************************************************* C_EM_PGM:A‰MOVEM.LƒD0/A0,EM_PBLK-B(A4)ƒSAVE�D0,A0�IN�ERROR�MSG�PARAM�BLOCK.4‰LEA‡EM_PBLK(PC),A0ŠPOINT�A0�TO�THE�PARAMETER�BLOCK.:‰MOVE.B„#6,EM_TLUN-EM_PBLK(A0)‚SET�THE�LU�FOR�OUTPUT�TO�6. ‰MOVE.L„#2,D0‰TRAP†#4‰RTS‰PAGE?***************************************************************?*************************************************************** ****·****5****…N�O�T�E�--�THE�CODE�SPACE�FROM�HERE�DOWN�IS‡****9****…USED�AS�AN�I/O�BUFFER�IF�THE�DUMP�IS�ASKED�FOR.ƒ****8****…NATURALLY,�NONE�OF�THE�CODE�FROM�HERE�DOWN�CAN„****5****…BE�USED�AFTER�THE�DUMP�IS�STARTED.‚SO�DON'T†****( 6****…PUT�CODE�AFTER�THIS�POINT�UNLESS�YOU'RE�SURE†****8****…IT�WON'T�BE�USED�AFTER�THE�I/O�STARTS.‚A�TOTALƒ****6****…OF�2048�BYTES�IS�REQUIRED,�AND�THAT�INCLUDES†****9****…SPACE�OCCUPIED�BY�WHAT'S�LINKED�IN�FROM�UTILIB.ƒ**** ****·****?***************************************************************?*************************************************************** SEGBUF:‰PAGEG************************************************************************?*ƒGET�LOGICAL�UNITS�5�AND�6�FROM�TASK'S�MONITOR�OR�&SCT�OR�&BCT*G*********************************************************************** FNDMSGD‚EQU„***…TRY�TO�GET�SESSION'S�LU�6*)‰MOVE.L‚#$060600,CLULGU-B(A4)ƒSET�LU�TO�65‰MOVE.L‚EVNTSES-B(A4),CLUSES-B(A4)„MOVE�SESSION�TO�PB$‰MOVE.L‚#'&SCT',CLUTSK-B(A4)„TRY�SCT‰FHSCALL�CLUFHS-B(A4)$‰BEQ.SƒFNDMSOK6ˆBRANCH�IF�LU�6�FOUND+FNDMSG2‚MOVE.L‚#'&BCT',CLUTSK-B(A4)„TRY�BCT‰FHSCALL‚CLUFHS-B(A4)$‰BEQ.SƒFNDMSOK6ˆBRANCH�IF�LU�6�FOUND2‰MOVE.L‚TCBMON-B(A4),CLUTSK-B(A4)…TRY�MONITOR�TASK‰FHSCALL�CLUFHS-B(A4),‰BEQ.SƒFNDMSOK6ˆBRANCH�IF�SOMEONE�TO�TALK�TO‰BSET„#NOGO,FLAGS-B(A4)‰RTS**…CHECK�FOR�INTERACTIVE�DEVICE*FNDMSOK6�EQU…*1‰ERQ.STOP„CLUTSK-B(A4)†STOP�TASK�LU�6�TAKEN�FROM.(*¦NOTE:�&SCT�HAS�ALREADY�BEEN�STOPPED�BY&*¦.LDR,�BUT�IT�WON'T�HURT�IF�WE�TRY�TO*¦STOP�HIM�TWICE.H*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 10/31/84>>>%*ˆBSET„#SUSPD,FLAGS-B(A4)ƒREMEMBER�ITH*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 10/31/84>>>;‰BSET„#NOINP,FLAGS-B(A4)ƒNOINP�SET�=�LU5�IS�NOT�INTERACTIVE%‰FHSCALL�ATTRFHS-B(A4)ˆGET�ATTRIBUTES-‰BTST„#8,ATTRCOD-B(A4)…IS�DEVICE�INTERACTIVE?‰BEQ.SƒFNDMDRŠBRANCH�IF�NO**†ASSIGN�UNIT�6�DEVICE�TO�LU�5*#‰MOVE.L‚ATTRDEV-B(A4),ASG5DEV-B(A4)‰FHSCALL�ASG5FHS-B(A4)-‰BNE.SƒFNDMDR‰BRANCH�IF�NO�INTERACTIVE�DEVICE6‰BCLR„#NOINP,FLAGS-B(A4)ƒCLEAR�FLAG�-�CAN�TALK�TO�USER FNDMDRƒRTS‰PAGE*%*ƒDISPLAY�ABORT�MESSAGE�AND�REGISTERS* DSPABRT‚EQU„**‰IOSCALL�LINEIOS-B(A4)ŠPRINT�A�BLANK�LINE.0‰MVASC‚4,TCBNAME-B(A4),MGTSK-B(A4)ƒTASK�ABORTING6‰MVASC‚4,TCBATSK-B(A4),MGTSK2-B(A4)‚TASK�CAUSING�ABORT/‰MVHEX‚4,TCBABORT-B(A4),MGACOD-B(A4)�ABORT�CODE‰MESGƒMSGAC,MSGACE‰RTS**…DISPLAY�REGISTERS* DSPREGS‚EQU„* %‰MOVE.L�A2,-(A7)�SAVE�A2�ON�THE�STACK /‰MVHEX‚8,TCBPC-B(A4),MGPC-B(A4)†PROGRAM�COUNTER/‰MVHEX‚4,TCBSR-B(A4),MGSR-B(A4)†STATUS�REGISTER*-‰LEA„TCBD0(PC),A0ŒSTART�OF�REGISTER�SAVE�AREA/‰LEA„MGD0(PC),A1�START�OF�REGISTER�DISPLAY�AREA"‰MOVE.W�#16,D5�NUMBER�OF�REGISTERS.DSPREG2‚MOVE.L�(A0)+,D0ŠCONTENTS�OF�1�REGISTER‰BSR„CVHEX8ŒCONVERT�IT(‰LEA„6(A1),A1ŠINCREMENT�DISPLAY�REGISTER‰SUB.W‚#1,D5�DECREMENT�COUNT‰BNE„DSPREG2‹LOOP�BACK�FOR�NEXT**‰IOSCALL�LINEIOS-B(A4)„PRINT�A�BLANK�LINE,)‰MESGƒMSGR1,MSGR1E†THE�ABORT�MESSAGE,�AND$‰IOSCALL�LINEIOS-B(A4)„A�BLANK�LINE. ;‰LEA�MSGIOS(PC),A0ˆPREPARE�TO�PRINT�TO�REGISTER�CONTENTS,�A9‰LEA�MSGD1(PC),A1‰LINE�AT�A�TIME.‚A2�IS�THE�STOP�ADDRESS.‰LEA�MSGRSTOP(PC),A2†* ‰REPEAT˜FOR�EACH�LINE,<‹MOVE.L�A1,IOSSAD(A0)ˆSET�UP�START�AND�END�MESSAGE�ADDRESSES;‹ADD.L�#MSGD1LEN-1,A1ˆAND�PRINT.‚ADVANCE�ADDRESSES�FOR�NEXT‹MOVE.L�A1,IOSEAD(A0)ˆLINE.‹IOSCALL�(A0)�*‹ADD.L�#1,A1‘*‰UNTIL.L‚A1��A2‹* '‰MOVE.L�(A7)+,A2�RESTORE�A2�AND�RETURN.‰RTS›*ˆPAGE**„BUILD�DEFAULT�DUMP�FILE�NAME* BLDNAME�EQU‚*=ˆMOVE.W‚EVNTUNM-B(A4),DMPFUNM-B(A4)„PUT�USER�#�IN�PARAM�BLOCK ˆMOVE.L‚#4,D1ˆLEA…TCBNAME(PC),A0‰TASK�NAMEˆLEA…DMPFNAM(PC),A1‰FILE�NAME0ˆBSR…MOVASCNŠTASK�NAME�=�1ST�4�CHARS�OF�FILENAME*ˆMOVE.L‚TCBTIME-B(A4),D0�TIME�IN�MILLISECS'ˆDIVU„#1000*60,D0†GET�HOURS�AND�MINUTESˆAND.Lƒ#$FFFF,D0'ˆDIVU„#60,D0‹SEPARATE�HOURS�AND�MINUTESˆMOVE.L‚D0,D5ŒSAVE�MINUTES2ˆBSR…CONVDEC2‰CONVERT�HOURS�TO�ASCII�FOR�FILE�NAMEˆMOVE.L‚D5,D0ŒMINUTESˆSWAP„D0+ˆBSR…CONVDEC2‰CONVERT�MINUTES�FOR�FILE�NAME*#ˆFHSCALL�DMPFHS-B(A4)…ALLOCATE�FILE!ˆBEQ.SƒBLDNAM4ŠBRANCH�IF�NO�ERROR6ˆMOVEM.L�D0/A0,-(A7)†SAVE�ERROR�INFO�FOR�EMH�ON�STACK.6ˆBSET„#NOFILE,FLAGS-B(A4)„SET�FLAG�-�NO�FILE�ALLOCATED*) *ˆDELETE�FILE�JUST�ALLOCATED* BLDNAM4�EQU…*ˆMOVE.W‚#FHDELT,DMPFHS-B(A4)ˆFHSCALL�DMPFHS-B(A4)*ˆIOSCALL�LINEIOS-B(A4)„PRINT�A�BLANK�LINE.ˆLEA…MGDEFFN(PC),A1ˆLEA…DMPFHS(PC),A6%ˆBSR…NAMTMSG‰PUT�FILE�NAME�IN�MESSAGEˆMOVE.B‚#CR,(A1)+ˆMOVE.B‚#LF,(A1)<ˆBTST�#NOINP,FLAGS-B(A4)†IF�IT�WASN'T�A�BATCH�JOB,�PRINT�OUT2ˆIF‚‚THEN.S�THE�DEFAULT�FILENAME�FOR�THE�DUMP.ŠLEA…MSGIOS(PC),A0ˆ*ŠSTORE_ADDR�MGDEFN,IOSSAD(A0)�*ŠMOVE.L‚A1,IOSEAD(A0)ˆ* ŠTRAP„#2“*ˆENDI›*(ˆBTST„#NOFILE,FLAGS-B(A4)‚TEST�FOR�ERROR!ˆBEQ.SƒBLDNAM6‰BRANCH�IF�NO�ERROR;‰MOVEM.L�(A7)+,D0/A0‹RESTORE�ERROR�INFO�SAVED�AND�CALL�EMH.‰BSR�C_EM_PGM’*"ˆMESG„EMGALC,EMGALCEƒERROR�MESSAGE* BLDNAM6�EQU…**/*†COPY�DEFAULT�FILE�NAME�TO�NEW�PARAMETER�BLOCK*ˆLEA„DMPFHS+FHSVOL(PC),A0ˆLEA„DMP2FHS+FHSVOL(PC),A1 ˆMOVE.W�#6,D0BLDNAM8 MOVE.L (A0)+,(A1)+ ˆSUB.W‚#1,D0 ˆBNE„BLDNAM8*E*†IF�WE'RE�NOT�BEING�RUN�FROM�BATCH,�ASK�THE�USER�ABOUT�THE�FILENAME.*8‰BTST�#NOINP,FLAGS-B(A4)…IF�WE�HAVE�AN�INPUT�DEVICE,�ASK(‰IF‚‚THEN.SŽTHE�USER�FOR�A�FILENAME.‹INPUT�MGNEWF,MGNEWFEˆ*‰ENDIš**%*†PUT�NEW�FILENAME�IN�PARAMETER�BLOCK*ˆLEA„INPTBUF(PC),A0ˆLEA„DMP2FHS(PC),A6ˆBSR„EDITFILE‰GO�EDIT�FILE�NAME#ˆBGE.S‚BLDNAM10‰BRANCH�IF�NO�ERRORS%ˆBSR„C_EM_PGM‰PRINT�THE�ERROR�MESSAGEˆBRA„BLDNAM6ŠAND�ASK�AGAIN.**†ALLOCATE�AND�ASSIGN�DUMP�FILE*BLDNAM10�EQU„*‰BCLRƒ#NOFILE,FLAGS-B(A4)‰FHSCALL�DMP2FHS-B(A4)#‰BEQ.SƒBLDNAM12ˆBRANCH�IF�NO�ERRORS4‰MOVEM.L�D0/A0,-(A7)‹SAVE�INFO�ABOUT�ERROR�ON�STACK.<‰BSET„#NOFILE,FLAGS-B(A4)�MARK�THAT�WE�COULDN'T�MAKE�A�FILE.BLDNAM12�EQU…**‰IOSCALL�LINEIOS-B(A4)‰PRINT�A�BLANK�LINE.‰LEA…MGDMPFN(PC),A1‰LEA…DMP2FHS(PC),A6'‰BSR.SƒNAMTMSG‰PUT�FILE�NAME�IN�MESSAGE‰MOVE.B‚#CR,(A1)+‰MOVE.B‚#LF,(A1)‰LEA…MSGIOS(PC),A0@‰PEA…MGDMPN(PC)‚TELL�USER�THE�FINAL�DUMPFILE�NAME‚SPR�936�2/1/84‰MOVE.L‚(A7)+,IOSSAD(A0)‰MOVE.L‚A1,IOSEAD(A0)‰TRAP„#2(‰BTST„#NOFILE,FLAGS-B(A4)†TEST�FOR�ERROR"‰BNE.SƒBLDNAM14ˆBRANCH�IF�NO�ERROR‰RTSBLDNAM14�EQU…*6‰MOVEM.L�(A7)+,D0/A0‹RESTORE�A0�&�D0�FROM�THE�ERROR�ON&‰BSR�C_EM_PGM’ALLOCATION�AND�CALL�EMH.‰MESG�EMGAL2,EMGAL2E***„SUBROUTINE�TO�PUT�FILE�NAME�INTO�MESSAGE*ˆA1�POINTS�TO�MESSAGE�ADDRESS* NAMTMSG�EQU„*ˆMVASCN�4,FHSVOL(A6),A1†VOLUMEˆMOVE.B‚#':',(A1)+ˆMOVE.W‚FHSUSN(A6),D0ˆBSR…CONVDEC4‰USER�NUMBERˆMOVE.B‚#'.',(A1)+ˆMVASCN‚8,FHSCLG(A6),A1…CATALOGˆMOVE.B‚#'.',(A1)+!ˆMVASCN‚8,FHSFIL(A6),A1…FILE�NAMEˆMOVE.B‚#'.',(A1)+!ˆMVASCN‚2,FHSEXT(A6),A1…EXTENTIONˆRTS ‰END‡BEGINéééééé) =/*=/*†TRANSFER.AF=/*+=/* Chain file to assemble TRANSFER utility=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to TRANSFER.LS=/*=/IFC \1ƒ=ARG�TRANSFER.LS=/ENDIF=/*&=ASM TRANSFER.SA,TRANSFER.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*}=/*=ENDéééééé(=/*=/*†TRANSFER.LF=/*)=/* Link chain file to create TRANSFER.LO=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to TRANSFER.LL=/*=/IFC \1ƒ=ARG�TRANSFER.LL=/ENDIF=/*=LINK ,TRANSFER.LO,\1;HAMIX ATTRIBUTES PSEG SEG0:0,14 $0INPUT TRANSFER.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééé* é1 ŠTTL„ASCII�file�transfer�utilityTRANSFER‚IDNTƒ4,2 *ˆINCLUDE�9995.&.IOE.EQ‰NOLIST‰INCLUDE�9995.&.IOE.EQ‰LIST<************************************************************9*�--------------ƒTRANSFER�PROGRAM�---------------------‚**º*3*�THIS�PROGRAM�HANDLES�ASCII�FILE�TRANSFER�ON�THEŠ**�EXORMACS�(NONHOST)�SYSTEM **º*<*************************************************************º**’MODIFICATION�HISTORY”**º**ˆREVISION�012885�4¡*4*‰If�a�user�typed�ahead,�before�TRANSFER�was�begun,*3*‰TRANSFER�may�hang,�not�enabling�the�user�to�use‚*1*‰CTL-A�to�exit.‚To�fix�this,�the�ASQ�parameterƒ*1*‰block,�ASQ1,�was�changed�to�set�option‚bit�0,ƒ*!*‰enabling�the�ASQ�immediately.”**º*3*‰Also�changed�was�option�bit�2�of�the�I/O�param.‚*4*‰block�during�the�reading�of�inputs�from�the�host.*4*‰By�setting�the�Connection�Wait�bit,�TRANSFER�will*4*‰now�abort�itself�at�INPP1�if�the�host�port�is�not*3*‰free.‚(It�should�always�be�free,�unless�the�user* *‰configures�the�system�oddly.•**º**ˆREVISION�011785�4¡*3*‰HALT1�and�HALT5�needed�to�be�changed�to�accomo-‚**‰date�changes�in�IOS.�**º**ˆREVISION�111484�4¡*4*‰A�new�switch�was�added,�"R",�to�append�a�carriage*0*‰return�after�each�frame�of�data.‚The�default„**‰has�been�set�to�-R.ž**º*<************************************************************‰PAGE ŠSECTION�0 (ŠXREFƒPARSE,EDITFILE,OPTION,SBARG„111484 A‰EQU„*’BASE�OF�SEGMENT'DEFPORTƒEQU„'CN20'�DEFAULT�PORT�IS�CN208BLKLGH„EQU„200�SIZE�OF�HOST�BUFFER�(NOT�NEC.�BLOCK�SIZE)#RMAX†EQU„130�MAXIMUM�SIZE�OF�RECORD * DIRECTIVE EQUATES ABORT…EQU„14‘ABORT�SELFTERM†EQU„15‘TERMINATE�SELFDELAY…EQU„21‘DELAYRELINQ„EQU„22‘RELINQUISH)RQSTPA„EQU„29‘REQUEST�PERIODIC�ACTIVATIONGTASQ…EQU„31‘ALLOCATE�AN�ASQRDEVNT„EQU„34‘READ�EVENTWTEVNT„EQU„36‘WAIT�ON�EVENT  !BUSY†EQU„$E2�IOS�BUSY�STATUS�CODE"CNTL.A„EQU„$01�CONTROL-A�CHARACTER ŠDS.Lƒ40 STACK…EQU„*2SAVSTACK‚DS.Lƒ1’SAVE�FOR�STACK�POINTER�RESTORATION3:FCGKZS\[bcMkUsF{EƒD‹]“W›E£M«U³>»?ÃUËKÓGÛGã<ëGóFûNR JFI#J)INITREGS‚EQU„*’SAVE�FOR�INITIAL�REGISTERS ŠDS.Lƒ1’D0ŠDS.Lƒ1’D1=SESSION�NUMBERVOLNAM„DS.Lƒ1’D2=VOLUME�NAMEUSERNUMƒDS.Lƒ1’D3=USER�NUMBERCATNAM„DS.Lƒ1’D4=CATALOGUE�NAME ŠDS.Lƒ1’D5 ŠDS.Lƒ1’D6 ŠDS.Lƒ1’D7 ******************** VERSION MESSAGE ******************** /VMSGS…DC.Bƒ'ASCII�FILE�TRANSFER�-�VERSION�2.05' VMSGE…EQU„*-1ŠDS…0 ******************************** COMMAND LINE RECEIVING AREA ******************************** CLINE…COMLINE�$A0 * RETURN REGISTERS FROM PARSE 1PARSAREG‚DS.Lƒ1’A1�-�ADDRESS�OF�OUTPUT�FIELD�OR�0*ŠDS.Lƒ1’A2�-�ADDRESS�OF�OPTIONS�FIELD�OR�0  * PREAMBLE VARIABLES #COMOPT„DS.Bƒ1’COMMUNICATIONS�OPTION)CHROPT„DS.Bƒ1’CHARACTER�CONVERSION�OPTION,CHRBLK„DC.Lƒ0’NUMBER�OF�CHARACTERS�PER�BLOCK+BLKSUM„DC.Lƒ0’NUMBER�OF�BLOCKS�PER�CHECKSUM +BLKRED„DC.Lƒ0’RUNNING�NUMBER�OF�BLOCKS�READ%WBUF†DS.Lƒ1’ADDRESS�OF�WORKING�BUFFER,WLGH†DC.Lƒ0’LENGTH�OF�DATA�IN�WORKING�BUFFER,CHRNUM„DC.Lƒ0’NUMBER�OF�CHARACTERS�PER�FRAME%BLKCMAXƒDS.Lƒ1’LIMIT�ADDRESS�OF�FRAME0DPSAV…DS.Lƒ14‘SAVE�RGISTERS�FOR�DOWNLOAD�PROCESS,RESPONSE‚DC.Bƒ'‚'�RESPONSE�(ACK/NAK)�TO�HOST ŠDC.Bƒ$0DŠDS…0 DLTEMP„DS.Lƒ1’TEMPORARY*BBOUNDSƒDS.Lƒ2’BUFFER�BOUNDARIES�ON�UPLOAD3UREC1…DS.Lƒ1’ADDRESS�OF�1ST�* REC�IN�FRAME�FOR�UPLOAD4USAVCHRƒDS.Wƒ1’SAVE�FOR�CHR�REPLACED�BY�CR�IN�UPLOAD)BCHR†DS.Wƒ1’SAVE�FOR�COMPRESSED�CHARACTER * OPTIONS EQUATES AND FLAG WORD "B‰EQU„0’1=TRUNCATE�TRAILING�BLANKSC‰EQU„1’1=USE�CHECKSUMS*D‰EQU„2’1=DISPLAY�DATA�AS�IT�IS�TRANSFEREDH‰EQU„3’1=HALF�DUPLEX�MODE%R‰EQU„4’1=C/R�TO�BE�ADDED�AFTER�BLOCK OPTFLG„DC.Bƒ(1< TO TERMINATE PROGRAM'TRANME„EQU„*-1ŠDS…0 *********************** TRANSP„EQU„************************ 6* SET UP SERVICE ADDRESSES IN VARIOUS PARAMETER BLOCKS ŠLEA„HOSTIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„TERMIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)ŠLEA„TIMEV-A(A6),A0ŠMOVE.L�A0,TSVC-A(A6) ŠLEA„TRANMS-A(A6),A1ŠLEA„TRANME-A(A6),A2)ŠBSR„MSGOUT�TELL�THEM�OF�TRANSPARENT�MODE  >* PERFORM INPUT I/O AND PROCEED ON TERMINAL PORT AND HOST PORT 1ŠBTSTƒ#H,OPTFLG-A(A6)„ARE�WE�IN�HALF�DUPLEX�MODE?ŠBNE.S‚TRANS04ŒBRANCH�IF�YES-ŠBSR„INPP5C�INPUT�ONE�CHARACTER�FROM�TERMINALŠBRA.S‚TRANS05.TRANS04ƒBSR„INPP5ŽINPUT�ONE�LINE�FROM�TERMINALTRANS05ƒBSR„INPP1ŽHOST�PORT  !*********************************!* ENABLE ASQ AND WAIT FOR EVENT *!********************************* TRANSRTN‚EQU„*4ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�CURRENT�STACK�POINTER!ŠMOVE.L�#WTEVNT,D0‰ENABLE�ASQ,ASRŠTRAPƒ#1  J* IN CASE OF TIMEOUT EVENT, PERFORM INPUT I/O AND PROCEED ON TERMINAL PORT)*ƒAND�GO�BACK�AND�WAIT�FOR�ANOTHER�EVENT. TIMEV…EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTER ŠBSR„ASQREAD%ŠLEA„TIM1-A(A6),A0†ADDR�OF�TIMER�P.B.&ŠCLR.W‚8(A0)ŽCLEAR�PERIODIC�ACTIVATIONŠMOVE.L�#RQSTPA,D0ŠTRAPƒ#12ŠBTSTƒ#TBSY,TRANFLG-A(A6)�IS�TERMINAL�BUFFER�BUSY?5ŠBNE„TRANS48ŒBRANCH�IF�YES�-�QUEUE�ANOTHER�TIME�EVENT.ŠBTSTƒ#H,OPTFLG-A(A6)„NO�-�IS�HALF�DUPLEX�SET?ŠBNE.S‚TRANS07ŒBRANCH�IF�YES-ŠBSR„INPP5C�ONPUT�ONE�CHARACTER�FROM�TERMINALŠBRA.S‚TRANS09.TRANS07ƒBSR„INPP5ŽINPUT�ONE�LINE�FROM�TERMINALTRANS09ƒBRA„TRANSRTN  '* IN CASE OF BREAK EVENT, TERMINATE !!! BREAKSVƒEQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTER(BREAKSV2‚BSR„HALT1ŽHALT�I/O�ON�HOST�PORTŠBEQ.S‚BREAKSV2BREAKSV4‚BSR„HALT5ŠBEQ.S‚BREAKSV4ŠBRA„XFRTERMŒGO�TERMINATEŠPAGE *******************************************)*�EVENT�WAS�I/O�COMPLETION�ON�HOST�PORT‚********************************************  HOSTIO„EQU„*, 7ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�CURRENT�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS1H-A(A6),A0ŠBSR„HLTCHK�CHECK�FOR�HALT�I/OŠBEQ„TRANSRTN‹BRANCH�IF�YES ŠLEA„IOS1-A(A6),A0ŠCMP.B‚#$EA,4(A0)(ŠBEQ.S‚TRANS12ŒDON'T�COMPLAIN�ON�OVERRUN ŠBSR„IOERCHKŒCHECK�FOR�I/O�ERROR3TRANS12ƒCMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ.S‚TRANS55ŒBRANCH�IF�YES  3* EVENT WAS FROM INPUT OR OUTPUT WITH INPUT REQUEST /ŠBTSTƒ#2,IOS1+1-A(A6)„WAS�IT�OUTPUT�WITH�INPUT?ŠBEQ.S‚TRANS16ŒBRANCH�IF�NO;ŠMOVE.L�IOS1+8-A(A6),IOS1+12-A(A6)�CORRECT�STARTING�ADDRESS9TRANS16ƒBTSTƒ#TBSY,TRANFLG-A(A6)�IS�TERMINAL�BUFFER�FREE?ŠBEQ.S‚TRANS20ŒBRANCH�IF�YES7ŠBSETƒ#TPND,TRANFLG-A(A6)�SET�TERMINAL�I/O�PENDING�FLAGŠBRA„TRANSRTN‹RETURN�FROM�EVENT  1TRANS20ƒLEA„TBUF-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO0ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�OUTPUT�BUFFERŠBSR„PREACHKŒSEE�IF�'PREAMBLE'ŠBEQ„TRANNXTŒBRANCH�IF�YES)ŠBSR„INPP1ŽINPUT�AND�PROCEED�ON�HOST�PORT6ŠTST.L‚TERMLGH-A(A6)†LENGTH�OF�DATA�IN�TERMINAL�BUFFER*ŠBEQ.S‚TRANS52ŒBRANCH�IF�NO�DATA�TO�OUTPUTŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL7ŠBSETƒ#TBSY,TRANFLG-A(A6)�MARK�TERMINAL�BUFFER�NOT�FREE7ŠBTSTƒ#TIN,TRANFLG-A(A6)�ARE�WE�IN�TERMINAL�INPUT�MODE?ŠBNE.S‚TRANS50ŒBRANCH�IF�YES*ŠBSR„OUTP5F�OUTPUT�AND�PROCEED�TO�TERMINAL  =* SET TIMER TO ACTIVATE US A LITTLE LATER ONLY IF NOT ECHOING /TRANS48ƒLEA„TIM1-A(A6),A0†TIMER�PARAMETER�BLOCK;ŠMOVE.W�#$7000,8(A0)‡INTERVAL�ACTIVATION�AT�SPC.�SVC.�ADDR.ŠMOVE.L�#RQSTPA,D0ŠTRAPƒ#1 ŠBSR„XFRABORT+ŠBRA.S‚TRANS52ŒGO�RETURN�FROM�EVENT�SERVICE  * OUTPUT TO TERMINAL (IMAGE) /TRANS50ƒBSR„OUTW5I�OUTPUT�CHARACTER�TO�TERMINAL2ŠBCLRƒ#TBSY,TRANFLG-A(A6)�CLEAR�TERMINAL�BUSY�FLAG<ŠTST.W‚IOS5H+28-A(A6)…WAS�ANY�ACTIVE�I/O�HALTED�ON�TERMINAL?9ŠBEQ.S‚TRANS52ŒBRANCH�IF�NO�-�HAVE�I/O�COMPLETION�ALREADY,ŠBSR„INPP5C�YES�SO�TAKE�IN�ANOTHER�CHARACTERTRANS52ƒBRA„TRANSRTN  (* EVENT WAS OUTPUT COMPLETE TO HOST PORT -TRANS55ƒBSR„INPP1ŽINPUT�AND�PROCEED�FROM�HOST ŠBRA„TRANSRTNŠPAGE .**********************************************-*�EVENT�WAS�I/O�COMPLETION�ON�TERMINAL�PORT‚*.**********************************************  TERMIO„EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„TRANSRTN‹BRANCH�IF�YES  ŠLEA„IOS5-A(A6),A0 ŠBSR„IOERCHK,ŠCMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ.S‚TRANS80ŒBRANCH�IF�YES  -* EVENT WAS INPUT COMPLETION ON TERMINAL PORT 3ŠBTSTƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL-A�MODE?ŠBNE.S‚TRANS63ŒBRANCH�IF�YES1ŠCMP.B‚#CNTL.A,BUFF5S-A(A6)�WAS�THIS�A�CONTROL�A?ŠBNE.S‚TRANS60ŒBRANCH�IF�NO1ŠBSETƒ#CTLA,TRANFLG-A(A6)�SET�CONTROL�A�MODE�FLAGŠBRA.S‚TRANS637TRANS60ƒBSETƒ#TIN,TRANFLG-A(A6)�SET�TERMINAL�INPUT�FLAG ŠBSR„HALT1ŽHALT�I/O�ON�HOST�PORT0TRANS63ƒBTSTƒ#H,OPTFLG-A(A6)„IS�HALF�DUPLEX�SET?+ŠBNE.S‚TRANS70ŒYES�-�GO�OUTPUT�LINE�TO�HOST7ŠCMP.B‚#$0D,BUFF5S-A(A6)‚WAS�A�CARRIAGE�RETURN�ENTERED?ŠBEQ.S‚TRANS70ŒBRANCH�IF�YES2ŠBTSTƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL-A�MODEŠBNE.S‚TRANS66ŒBRANCH�IF�YES4ŠBSR„OIP1CŽNO�SO�GIVE�HOST�CHAR�ON�OUTPUT�WITH�INPUT.TRANS66ƒBSR„INPP5C�ASK�FOR�NEXT�TERMINAL�INPUTŠBRA.S‚TRANS88  :TRANS70ƒBCLRƒ#CTLA,TRANFLG-A(A6)�ARE�WE�IN�CONTROL�A�MODE?)ŠBNE„BREAKSVŒBRANCH�IF�YES�-�GO�TERMINATE(ŠBSR„OIP15ŽOUTPUT�THE�LINE�OR�CR�TO�HOSTŠBCLRƒ#TIN,TRANFLG-A(A6) ŠBRA„TRANS48  .* EVENT WAS OUTPUT COMPLETION ON TERMINAL PORT 5TRANS80ƒBTSTƒ#TPND,TRANFLG-A(A6)�IS�PENDING�FLAG�SET?ŠBNE.S‚TRANS86ŒBRANCH�IF�YES8ŠBCLRƒ#TBSY,TRANFLG-A(A6)�NO�SO�CLEAR�TERMINAL�BUSY�FLAGŠBRA.S‚TRANS88 1TRANS86ƒLEA„TBUF-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO)ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�BUFFERŠBSR„PREACHKŒSEE�IF�'PREAMBLE'ŠBEQ.S‚TRANNXTŒBRANCH�IF�YES$ŠBSR„INPP1ŽINPUT�AND�PROCEED�ON�HOST*ŠBSR„OUTP5F�OUTPUT�AND�PROCEED�TO�TERMINAL,ŠBCLRƒ#TPND,TRANFLG-A(A6)�CLEAR�PENDING�FLAGTRANS88ƒBRA„TRANSRTNŠPAGE 6******************************************************3*�TRANNX, T�IS�BRANCHED�TO�AFTER�READING�'PREAMBLE'„*1*ƒFROM�THE�HOST.‚HALTS�ALL�I/O�ON�LU�1�AND�LU�5ƒ*1*ƒUNITS,�DELAYS�2�SECONDS,�READS�THE�ASQ�OF�ALL„* *ƒEVENTS,�AND�PERFORMS�AN�RTS.•*6******************************************************  TRANNXTƒEQU„* ŠBSR„HALT1ŽHALT�I/O�ON�HOST�PORTŠBEQ.S‚TRANNXT,TRANNXT2‚BSR„HALT5ŽHALT�I/O�ON�TERMINAL�PORTŠBEQ.S‚TRANNXT2ŠMOVE.L�#DELAY,D0ŠMOVE.L�#2000,A0ŠTRAPƒ#1‘DELAY�2�SECONDSTRANNXT4‚BSR„ASQREADŒFLUSH�ASQŠTST.B‚ASQBUFF-A(A6) ŠBNE„TRANNXT4.ŠCLR.W‚IOS1H+28-A(A6)…INDICATE�HALT�EVENT�READ.ŠCLR.W‚IOS5H+28-A(A6)…INDICATE�HALT�EVENT�READŠRTSŠPAGE  %*************************************%* INITIATE UPLOAD/DOWNLOAD SEQUENCE *%*************************************  UPDN†EQU„*  (* INITIALIZE VARIABLES FROM THE PREAMBLE 8ŠMOVE.B�TBUF+9-A(A6),COMOPT-A(A6)�COM�OPTION/CHAR�OPTION9ŠMOVE.B�TBUF+10-A(A6),CHROPT-A(A6)�CHAR�CONVERSION�OPTION2ŠLEA„TBUF+11-A(A6),A1ƒADDRESS�OF�CHARS/BLOCK�FIELDŠMOVE.L�#3,D1Ž#CHARS�IN�FIELD"ŠBSR„ASCDBINŒBINARY�TO�ASCII�IN�D06ŠMOVE.W�D0,CHRBLK+2-A(A6)‚SET�UP�NUMBER�OF�CHARS/BLOCK7ŠLEA„TBUF+14-A(A6),A1ƒADDRESS�OF�#BLOCKS/CHECKSUM�FIELDŠMOVE.L�#1,D1Ž#CHARS�IN�FIELD"ŠBSR„ASCDBINŒBINARY�TO�ASCII�IN�D0:ŠMOVE.W�D0,BLKSUM+2-A(A6)‚SET�UP�NUMBER�OF�BLOCKS/CHECKSUMŠMULUƒCHRBLK+2-A(A6),D06ŠMOVE.L�D0,CHRNUM-A(A6)„NUMBER�OF�CHARACTERS�PER�FRAMEŠLEA„TBUF-A(A6),A0 ŠADD.L‚A0,D0.ŠSUB.L‚#1,D0ŽFRAME�LIMIT�ADDRESS�OFF�FROM�TBUFŠMOVE.L�D0,BLKCMAX-A(A6) * CLOSE ANY ASSIGNMENT TO LU 4 ŠLEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3 * INITIALIZE FRAME VARIABLES ŠBSR„DLINITF ŠCLR.W‚TRANFLG-A(A6)ŠBTSTƒ#B,OPTFLG-A(A6) ŠBEQ.S‚UPDN10=ŠMOVE.B�#'B',RESPONSE+1-A(A6)‚FLAG�TRAILING�BLANK�SUPPRESSION  /* BRANCH TO APPROPRIATE UPLOAD/DOWNLOAD ROUTINE UPDN10„CMP.B‚#'U',TBUF+8-A(A6) ŠBEQ„UPLOADŠCMP.B‚#'D',TBUF+8-A(A6) ŠBEQ„DOWNLOAD ŠBSR„XFRABORTŠPAGE ********************** DOWNLOAD SEQUENCE **********************  !DLOADMSƒDC.Bƒ'DOWNLOAD�INITIATED'DLOADMEƒEQU„*-1ŠDS…0  JREVMS DC.B 'ENTER RECEIVING FILE NAME OR ''Q'' TO RESUME TRANSPARENT MODE' REVME…EQU„*-1ŠDS…0  RDONS…DC.Bƒ'RECORD�DISPLAY�ON' RDONE…EQU„*-1ŠDS…0  RDOFS…DC.Bƒ'RECORD�DISPLAY�OFF' RDOFE…EQU„*-1ŠDS…0  "BADCCS„DC.Bƒ'BAD�CHARACTER�COUNT‚'BADCCR„DC.Bƒ'…RECEIVED�'(BADCCT„DC.Bƒ'…EXPECTED�-�RETRANSMITTING'BADCCE„EQU„*-1ŠDS…0  BADCSS„DC.Bƒ'BAD�CHECKSUMƒ'BADCSR„DC.Bƒ'…RECEIVED�'(BADCST„DC.Bƒ'…EXPECTED‚-�RETRANSMITTING'BADCSE„EQU„*-1ŠDS…0  4DTERMS„DC.Bƒ'DOWNLOAD�TERMINATED�WITH�''T''�KEY-IN�'(DTERMN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'DTERME„EQU„*-1ŠDS…0  !DDONES„DC.Bƒ'DOWNLOAD�COMPLETED‚'(DDONEN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'DDONEE„EQU„*-1ŠDS…0  BFORCMS„DC.Bƒ'**************�FORCING�CHECKSUM�MATCH�**************'FORCME„EQU„*-1ŠDS…0ŠPAGE ***************************‚DOWNLOADING‚ROUTINE‚***************************  7DOWNLOAD‚LEA„REVMS-A(A6),A1…ASK�FOR�RECEIVING�FILE�NAMEŠLEA„REVME-A(A6),A2 ŠBSR„MSGOUT*ŠBSR„INPW5ŽTAKE�THE�INPUT�(INPUT�AND�WAIT)0ŠBSR„SBARGŽCONVERT�FILENAME�TO�UPPER�CASE�111484 (ŠBSR„ASGFLD�GO�ASSIGN�THE�FILE�TO�LUN�#4&ŠBEQ.S‚DL00�BRANCH�IF�'Q'�NOT�KEYED�IN*ŠMOVE.B�#'T',D0ŒTERMINATION�ACKNOWLEDGMENT!ŠBSR„RESPOND2‹SEND�IT�TO�THE�HOST ŠBRA„QUITUPDN  DL00†BSR„LF65ŠLEA„DLOADMS-A(A6),A1ƒTELL�THEM�DOWNLOAD�IS�INITIATEDŠLEA„DLOADME-A(A6),A2 ŠBSR„MSGOUT *ŠBSR„IMSG�TELL�THEM�OF�INTERACTIVE�OPTIONS.ŠCLR.L‚IOS4+8-A(A6)‡CLEAR�RANDOM�RECORD�NUMBER  2* PLACE COMPLETION ADDRESSES INTO PARAMETER BLOCKS ŠLEA„DHIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„DTIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)  !* INITIALIZE RECORD POINTERS ETC. ŠLEA„RBUF-A(A6),A06ŠMOVE.L�A0,RPTR-A(A6)†INITIALIZE�RECORD�BUFFER�POINTERŠLEA„DPIN-A(A6),A0>ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�PROCESSING�INPUT�ADDRESS 2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL02�BRANCH�IF�NO ŠBSR„WAITDC1 DL02†M- OVE.B�#'N',D0.ŠBSR„RESPOND1‹RESPOND�TO�PREAMBLE�WITH�'NEXT?')ŠBSR„INPP5C�INPUT�AND�PROCEED�ON�TERMINAL  ********************�WAIT�FOR�EVENT‚********************  DLWAIT„EQU„*,ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�STACK�POINTERŠMOVE.L�#WTEVNT,D0(ŠTRAPƒ#1‘WAIT�FOR�HOST�OR�TERMINAL�INPUTŠPAGE ,********************************************+*�EVENT�WAS�I/O�COMPLETION�FROM�HOST�PORT‚*,********************************************  DHIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS1H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„DLWAIT�BRANCH�IF�YES ŠLEA„IOS1-A(A6),A0+ŠCMP.B‚#$EA,4(A0)‰DON'T�COMPLAIN�ON�OVERRUN ŠBEQ.S‚DL10 ŠBSR„IOERCHKŒCHECK�FOR�I/O�ERROR0DL10†CMP.W‚#$0002,(A0)ˆSEE�IF�FROM�WRITE�REQUESTŠBEQ„DL500ŽBRANCH�IF�YES  )* EVENT WAS INPUT COMPLETION ON HOST PORT /ŠBTSTƒ#2,IOS1+1-A(A6)„WAS�IT�OUTPUT�WITH�INPUT?ŠBEQ.S‚DL40�BRANCH�IF�NO;ŠMOVE.L�IOS1+8-A(A6),IOS1+12-A(A6)�CORRECT�STARTING�ADDRESS/ŠBTSTƒ#H,OPTFLG-A(A6)„IS�THIS�JUST�AN�ACK�ECHO?,ŠBEQ.S‚DL45�BRANCH�IF�YES,�PUT�UP�READ�AGAIN DL40†LEA„TBUF-A(A6),A3,ŠADD.L‚WLGH-A(A6),A3†ADDRESS�TO�MOVE�DATA�TO)ŠBSR„EDITMOV1‹MOVE�DATA�TO�WORKING�BUFFER5ŠADD.L‚#1,BLKRED-A(A6)„BUMP�#BLOCKS�READ�FOR�CHECKSUMŠMOVE.L�TERMLGH-A(A6),D0ŠLEA„TBUF-A(A6),A2?ŠADD.L‚WLGH-A(A6),A2†POINT�A2�TO�FIRST�BYTE�OF�LAST�MOVED�BLOCK 6DL42†CMP.L‚CHRBLK-A(A6),D0„DID�WE�FILL�THE�FULL�BLOCK?ŠBHS.S‚DL43�BRANCH�IF�YES0ŠMOVE.B�#'�',0(A2,D0)†FORCE�BLANKS�TO�FULL�BLOCK ŠADD.L‚#1,D0 ŠBRA„DL42 DL43†ADD.L‚WLGH-A(A6),A27ŠADD.L‚D0,WLGH-A(A6)†BUMP�DATA�LENGTH�IN�WORKING�BUFFERŠMOVE.L�BLKRED-A(A6),D0ŠCMP.L‚BLKSUM-A(A6),D0'ŠBHS.S‚DL60�BRANCH�IF�ENTIRE�FRAME�READ !DL45†BSR„INPP1ŽREAD�ANOTHER�BLOCKŠBRA„DLWAIT�GO�WAIT�FOR�EVENT  J* ENTIRE FRAME HAS BEEN RECEIVED - IF TERMINATE HAS BEEN KEYED IN, GET OUT 9DL60†BTSTƒ#TFLG,TRANFLG-A(A6)�HAS�TERMINATE�BEEN�KEYED�INŠBEQ.S‚DL90�BRANCH�IF�NO 2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL62�BRANCH�IF�NO ŠBSR„WAITDC1 DL62†MOVE.B�#'T',D0-ŠBSR„RESPOND2‹RESPOND�WITH�OUTPUT�AND�PROCEED ŠBRA„DLWAIT  A*�NO�TERMINATION�YET�-�VALIDATE�CHECKSUM.‚IF�BAD�CHECKSUM�ASK�FOR* RETRANSMISSION ?DL90†MOVE.L�CHRNUM-A(A6),D0„NUMBER�OF�CHARACTERS�WE�SHOULD�HAVEŠCMP.L‚WLGH-A(A6),D0)ŠBEQ.S‚DL100ŽBRANCH�IF�CHARACTER�COUNT�OK-ŠMOVE.L�#4,D1ŽCOMPLAIN�ON�BAD�CHARACTER�COUNTŠLEA„BADCCT-A(A6),A0-ŠBSR„BINDASCŒCONVERT�EXPECTED�CHARACTER�COUNTŠMOVE.L�WLGH-A(A6),D0ŠLEA„BADCCR-A(A6),A0-ŠBSR„BINDASCŒCONVERT�RECEIVED�CHARACTER�COUNTŠBSR„LF6ŠLEA„BADCCS-A(A6),A1ŠLEA„BADCCE-A(A6),A2*ŠBSR„MOUT�TELL�THEM�OF�BAD�CHARACTER�COUNT DL95†EQU„*2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL97�BRANCH�IF�NO ŠBSR„WAITDC1 #DL97†MOVE.L�#DELAY,D0ŠWAIT�A�SECONDŠMOVE.L�#1000,A0ŠTRAPƒ#1ŠMOVE.B�#'R',D0)ŠBSR„RESPOND1‹RESPOND�/�OUTPUT�WITH�INPUT'ŠBSR„DLINITFŒINITIALIZE�FRAME�VARIABLES ŠBRA„DLWAIT 2DL100…BTSTƒ#C,OPTFLG-A(A6)„IS�CHECKSUM�OPTION�SET?ŠBEQ.S‚DL130ŽBRANCH�IF�NO'ŠLEA„TBUF-A(A6),A1†POINT�A1�TO�CHECKSUM.ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�IN�CHECKSUMŠBSR„ASCHBINŒCONVERT�TO�ASCIIŠTST.W‚D0‘IS�CHECKSUM�WILD?'ŠBEQ.S‚DL130ŽBRANCH�IF�YES�(0�CHECKSUM)3ŠMOVE.W�D0,-(A7)‹SAVE�CHECKSUM�FOR�LATER�COMPARISON6ŠLEA„TBUF+2-A(A6),A1„WHERE�TO�BEGIN�COMPUTING�CHECKSUM ŠMOVE.L�A1,A2ŠADD.L‚WLGH-A(A6),A2!ŠSUB.L‚#2,A2ŽEND�OF�DATA�+�1�BYTE ŠCLR.L‚D0 ŠCLR.L‚D1 6DL110…MOVE.B�(A1)+,D1‹ACCUMULATE�CHECKSUM�IN�THIS�LOOP ŠADD.L‚D1,D0 ŠCMP.L‚A1,A2-ŠBNE.S‚DL110ŽBRANCH�IF�MORE�CHARACTERS�TO�SUM ŠDIVUƒ#255,D0 ŠCLR.W‚D0ŠSWAPƒD0‘SUM�MOD�255�IN�D0.W$ŠADD.W‚#1,D0ŽINSURE�NONZERO�CHECKSUM ŠCLR.L‚D20ŠMOVE.W�(A7)+,D2‹CHECKSUM�SENT�FROM�OTHER�SYSTEMŠCMP.W‚D0,D2ŽSEE�IF�IT�MATCHESŠBEQ.S‚DL130ŽBRANCH�ON�MATCH+ŠBSR„NAKRPT�SEE�IF�RETRY�COUNT�IS�EXHAUSTEDŠBNE.S‚DL115ŽBRANCH�IF�NO-ŠLEA„FORCMS-A(A6),A1„TELL�OF�FORCING�CHECKSUMŠLEA„FORCME-A(A6),A2 ŠBSR„MOUT ŠBRA.S‚DL130 0DL115…MOVE.L�#4,D1ŽCOMPLAIN�ON�CHE- CKSUM�MISMATCHŠLEA„BADCST-A(A6),A0 ŠBSR„BINDASC ŠMOVE.L�D2,D0ŠLEA„BADCSR-A(A6),A0 ŠBSR„BINDASCŠBSR„LF6ŠLEA„BADCSS-A(A6),A1ŠLEA„BADCSE-A(A6),A2%ŠBSR„MOUT�PUT�UP�BAD�CHECKSUM�MESSAGE$ŠBRA„DL95�GO�TELL�THEM�TO�RETRANSMIT  (* CHECKSUM MATCHES - GO PROCESS THE DATA ?DL130…MOVE.L�REP2-A(A6),REP1-A(A6)�RESET�CHECKSUM�RETRY�COUNTERŠLEA„TBUF-A(A6),A0%ŠADD.L‚#3,A0ŽBYPASS�CHAR�AND�CHECKSUM,ŠMOVE.L�A0,TPTR-A(A6)†SAVE�POINTER�INTO�TBUFŠBSR„DPROCESS‹PROCESS�THE�DATAŠBEQ.S‚DL140ŽBRANCH�IF�DONE  ,* COME HERE FOR FRAME PROCESSED SUCCESSFULLY 6ŠCMP.B‚#'Z',TBUF+2-A(A6)‚HAS�THE�LAST�FRAME�BEEN�READ?ŠBEQ.S‚DL140ŽBRANCH�IF�YES 2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL138ŽBRANCH�IF�NO ŠBSR„WAITDC1 DL138…MOVE.B�#'N',D0)ŠBSR„RESPOND1‹RESPOND�/�OUTPUT�WITH�INPUT&ŠBSR„DLINITFŒINITIALIZE�FOR�NEXT�FRAMEŠBRA„DLWAIT�GO�WAIT�FOR�NEXT  DL140…EQU„*2ŠCMP.B‚#'B',COMOPT-A(A6)‚'B'�COMMUNICATION�OPTION?ŠBNE.S‚DL148ŽBRANCH�IF�NO ŠBSR„WAITDC1 DL148…MOVE.B�#'T',D0-ŠBSR„RESPOND2‹RESPOND�WITH�OUTPUT�AND�PROCEED ŠBRA„DLWAIT  (* EVENT WAS OUTPUT COMPLETE ON HOST PORT DL500…EQU„*ŠBTSTƒ#TFLG,TRANFLG-A(A6)+ŠBNE.S‚DL550ŽBRANCH�IF�''T''�KEYIN�FLAG�SET * NORMAL TERMINATION )ŠMOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„DDONEN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6)ŠLEA„DDONES-A(A6),A1„'DOWNLOAD�COMPLETED'ŠLEA„DDONEE-A(A6),A2 ŠBSR„MOUT ŠBRA„QUITUPDN  * TERMINATED BT 'T' KEYIN .DL550…MOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„DTERMN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6:ŠLEA„DTERMS-A(A6),A1„'DOWNLOAD�TERMINATED�WITH�'T'�KEY-IN'ŠLEA„DTERME-A(A6),A2 ŠBSR„MOUT ŠBRA„QUITUPDNŠPAGE )*****************************************(*�EVENT�WAS�I/O�COMPLETION�ON�TERMINAL‚*)*****************************************  DTIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ„TRANSRTN‹BRANCH�IF�YES ŠMOVE.B�BUFF5S-A(A6),D0ŠCMP.B‚#'T',D0'ŠBNE.S‚DL700ŽBRANCH�IF�NOT�A�'T'�KEY�IN-ŠBSETƒ#TFLG,TRANFLG-A(A6)�YES�-�FLAG�THE�FACT ŠBRA.S‚DL800 .DL700…CMP.B‚#'D',D0ŒWAS�KEYIN�A�'D'�(DISPLAY)? ŠBNE.S‚DL800)ŠBCHGƒ#D,OPTFLG-A(A6)„CHANGE�DISPLAY�FLAG1ŠBEQ.S‚DL750ŽBRANCH�IF�DISPLAY�WAS�PREVIOUSLY�OFFŠBSR„LF61ŠLEA„RDOFS-A(A6),A1…PUT�OUT�'DISPLAY�OFF�MESSAGE'ŠLEA„RDOFE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚DL800 DL750…BSR„LF60ŠLEA„RDONS-A(A6),A1…PUT�OUT�'DISPLAY�ON�MESSAGE'ŠLEA„RDONE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 *DL800…BSR„INPP5C�TAKE�ANOTHER�CHARACTER�IN ŠBRA„DLWAITŠPAGE 2**************************************************0*�DLINITF�INITIALIZES�VARIABLES�IN�PREPARATIONƒ**‹FOR�READING�NEXT�FRAME�*2************************************************** 6DLINITFƒCLR.L‚BLKRED-A(A6)‡CLEAR�NUMBER�OF�BLOCKS�READ,ŠLEA„TBUF-A(A6),A0†ADDRESS�OF�WORKING�BUFFER/ŠMOVE.L�A0,WBUF-A(A6)†ADDRESS�IN�WORKING�BUFFER'ŠCLR.L‚WLGH-A(A6)‰CLEAR�LENGTH�OF�FRAMEŠRTS   9*********************************************************+*�DPROCESS�PROCESSES�THE�FRAME�JUST�READ.�**ƒEXIT�CONDITION�CODES�ARE:›*7*ƒEQUAL�-�FRAME�PROCESSING�OK�(LAST�RECORD�PROCESSED)�*0*ƒPLUS‚-�FRAME�PROCESSING�OK�(NOT�LAST�RECORD)‡*9*********************************************************  DPROCESS‚EQU„*=ŠMOVEM.L�DPSAV-A(A6),D0-D7/A0-A5�PICK�UP�RESUME�REGISTERS�...ŠJMP„(A0)�...�AND�GO�THERE&DPIN†BSR„GETCHR�GET�1ST�CHAR�OF�LENGTH)ŠBEQ.S‚DL910ŽBRANCH�ON�CHARACTER�OBTAINED%ŠLEA„DPIN-A(A6),A0†NEED�ANOTHER�BLOCK6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERSŠBRA„DPEXOK�TAKE�OK�EXIT *DL910…CMP.B‚#'�',D0ŒSEE�IF�NO�MORE�RECORDS&ŠBEQ„DPEXENDŒBRANCH�IF�NO�MORE�RECORDS/ŠMOVE.B�D0,DLTEMP-A(A6)„SAVE�CHARACTER�OBTAINED 'DL915…BSR„GETCHR�GET�2ND�CHAR�OF�LENGTH)ŠBEQ.S‚DL920ŽBRANCH�ON�CHARACTER�OBTAINED&ŠLEA„DL915-A. (A6),A0…NEED�ANOTHER�BLOCK6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS ŠBRA„DPEXOK DL920…MOVE.B�D0,DLTEMP+1-A(A6)0ŠLEA„DLTEMP-A(A6),A1„CONVERT�ASCII�HEX�TO�BINARY-ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERT ŠBSR„ASCHBIN(ŠMOVE.L�D0,RLGH-A(A6)†SAVE�RECORD�LENGTH 4* MOVE RECORD FROM TBUF TO RBUF - EXPANDING AS WE GO +ŠLEA„RBUF-A(A6),A3†ADDRESS�OF�RECORD�BUFFER ŠCLR.L‚D3‘'GET'�RELATIVE�COUNTER4ŠMOVE.L�RPTR-A(A6),D2†D2�=�POINTER�INTO�'PUT'�BUFFER ŠSUB.L‚A3,D2 6DL951…CMP.L‚RLGH-A(A6),D3†SEE�IF�WE'VE�MOVED�ALL�CHARSŠBHS.S‚DL1000�BRANCH�IF�YES #DL960…BSR„GETCHR�GET�NEXT�CHARACTER*ŠBEQ.S‚DL962ŽBRANCH�IF�CHARACTER�AVAILABLE"ŠLEA„DL960-A(A6),A0…RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS!ŠBRA„DPEXOK�GO�EXIT�FOR�NEW�FRAME $DL962…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER.ŠCMP.B‚#'|',D0ŒIS�IT�THE�COMPRESSION�SENTINEL?ŠBNE.S‚DL980ŽBRANCH�IF�NO )DL964…BSR„GETCHR�GET�COMPRESSED�CHARACTER*ŠBEQ.S‚DL965ŽBRANCH�IF�CHARACTER�AVAILABLE&ŠLEA„DL964-A(A6),A0…GET�RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS)ŠBRA„DPEXOK�BRANCH�FOR�NEW�FRAME�REQUIRED $DL965…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER/ŠMOVE.B�D0,BCHR-A(A6)†SAVE�COMPRESSED�CHARACTER $DL966…BSR„GETCHR�GET�COUNT�CHARACTER*ŠBEQ.S‚DL968ŽBRANCH�IF�CHARACTER�AVAILABLE&ŠLEA„DL966-A(A6),A0…GET�RESUME�ADDRESS6ŠMOVEM.L�D0-D7/A0-A5,DPSAV-A(A6)�SAVE�RESUME�REGISTERS+ŠBRA.S‚DPEXOK�BRANCH�FOR�NEW�FRAME�REQUIRED $DL968…ADD.L‚#1,D3ŽBUMP�'GET'�COUNTER2ŠSUB.B‚#'0',D0ŒCONVERT�CODE�TO�BINARY�REPEAT�VALUE ŠCMP.L‚#9,D0 ŠBLS.S‚DL970ŽBRANCH�IF�RANGE�0-9ŠSUB.B‚#7,D0ŽRANGE�10-35 *DL970…TST.B‚D0‘ARE�WE�STILL�UNCOMPRESSING?ŠBEQ.S‚DL951ŽBRANCH�IF�NO0ŠSUB.L‚#1,D0ŽDECREMENT�REMAING�COMPRESSION�COUNT*ŠMOVE.B�BCHR-A(A6),0(A3,D2.L)�MOVE�TO�BUFF"ŠADD.L‚#1,D2ŽADVANCE�'PUT'�POINTER ŠBRA.S‚DL970 9DL980…MOVE.B�D0,0(A3,D2.L)†MOVE�'RAW'�DATA�BYTE�TO�BUFFER"ŠADD.L‚#1,D2ŽADVANCE�'PUT'�POINTER ŠBRA„DL951  '* OUTPUT RECORD TO DISK AND/OR TERMINAL (DL1000„TST.L‚D2‘TEST�UNCOMPRESSED�LENGTH"ŠBHI.S‚DL1005�BRANCH�IF�LENGTH�>�0-ŠMOVE.L�#1,D2ŽIF�NOT�THEN�FORCE�LENGTH�OF�ONE$ŠMOVE.B�#'�',(A3)ŠFOR�A�BLANK�RECORD 4DL1005„MOVE.L�A3,RPTR-A(A6)†SET�POINTER�BACK�TO�RBUF2ŠLEA„IOS4-A(A6),A0†ADDRESS�OF�DISK�PARAMETER�BLOCK ŠMOVE.L�A3,12(A0)ŠBUFFER�ADDRESS$ŠADD.L‚D2,A3ŽADD�UNCOMPRESSED�LENGTH'ŠSUB.L‚#1,A3ŽPOINT�A3�TO�LAST�CHARACTER'ŠMOVE.L�A3,16(A0)ŠENDING�BUFFER�ADDRESSŠMOVE.L�#$00026028,(A0)ŠTRAPƒ#2‘OUTPUT�TO�DISK ŠBEQ.S‚DL1010�BRANCH�ON�GOOD�I/O ŠMOVE.L�D0,-(A7)‹SAVE�ERROR�CODEŠBSR„HALT5ŽHALT�THE�I/OŠMOVE.L�(A7)+,D0$ŠBSR„IOSERR�COMPLAIN�OF�BAD�DISK�I/O$ŠBRA„XABORT�ERROR�ON�BAD�DISK�OUTPUT 6DL1010„ADD.L‚#1,IOS4+8-A(A6)„BUMP�RANDOM�RECORD�NUMBER4ŠBTSTƒ#D,OPTFLG-A(A6)„ARE�WE�TO�DISPLAY�TO�TERMINAL?ŠBEQ.S‚DL1020�BRANCH�IF�NOŠMOVEM.L�$C(A0),A1/A2ŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL"ŠBSR„MSGOUT�PUT�DATA�ONTO�TERMINAL"DL1020„BRA„DPIN�GO�FOR�NEXT�RECORD  1DPEXOK„MOVE.L�#1,D0ŽINDICATE�PLUS�CONDITION�CODES ŠBRA.S‚DPIO /DPEXENDƒCLR.L‚D0‘INDICATE�EQUAL�CONDITION�CODES +DPIO†MOVEƒD0,-(A7)‹SAVE�FOR�CONDITION�CODES,ŠCMP.B‚#$FF,IOS5+4-A(A6)‚IS�I/O�IN�PROGRESS?ŠBEQ.S‚DPRTSŽBRANCH�IF�YESŠBSR„INPP5C�NO�SO�REISSUE�INPUT+DPRTS…MOVEƒ(A7)+,D0‹RESTORE�CONDITION�CODESŠRTSŠPAGE .**********************************************'*�GETCHR�GETS�ONE�CHARACTER�FROM�TBUFˆ*)*ƒPOINTED�AT�BY�TPTR.‚IF�ALL�CHARACTERSƒ*(*ƒHAVE�BEEN�FETCHED,�UNEQUAL�CONDITION…*(*ƒCODES�ARE�RETURNED.‚OTHERWISE,�EQUAL„*(*ƒCONDITION�CODES�ARE�RETURNED�AND�THE…* *ƒCHARACTER�IS�RETURNED�IN�D0.�*.**********************************************  GETCHR„MOVE.L�TPTR-A(A6),A0ŠMOVE.B�(A0),D0ŠLEA„TBUF-A(A6),A1 ŠSUB.L‚A1,A0ŠCMP.L‚CHRNUM-A(A6),A0.ŠBHS.S‚GETCNO�BRANCH�IF�NO�CHARACTER�TO�RETURN+ŠADD.L‚#1,TPTR-A(A6)†ADVANCD�BUFFER�POINTER&ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODESŠRTS/GETCNO„MOVE.L�#1,D0ŽSET�UNEQUAL�CONDITION�CODESŠRTSŠPAGE2**************************************************0*�IMSG�DISPLAYS�MESSAGE�EXPLAINING�INTERACTIVEƒ* *’OPTION. S.–*2**************************************************  JIM1S DC.B 'KEY IN ''T'' TO TERMINATE TRANSFER AND RESUME TRANSPARENT MODE' IM1E�EQU‚*-1…DSƒ0 /IM2S�DC.B�'‡''D''�TO�TOGGLE�THE�RECORD�DISPLAY' IM2E�EQU‚*-1…DSƒ0  IMSG†EQU„*ŠBSR„LF6�TWO�LINE�FEEDSŠLEA„IM1S-A(A6),A1ŠLEA„IM1E-A(A6),A2 ŠBSR„MSGOUTŠLEA„IM2S-A(A6),A1ŠLEA„IM2E-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6�TWO�LINE�FEEDSŠRTSŠPAGE %**************************************‰UPLOAD�SEQUENCE‹*%*************************************  ULOADMSƒDC.Bƒ'UPLOAD�INITIATED'ULOADMEƒEQU„*-1ŠDS…0  HSEVMS DC.B 'ENTER SENDING FILE NAME OR ''Q'' TO RESUME TRANSPARENT MODE' SEVME…EQU„*-1ŠDS…0  *NAKMS…DC.Bƒ'NAK�RECEIVED�-�RETRANSMITTING' NAKME…EQU„*-1ŠDS…0  2UTERMS„DC.Bƒ'UPLOAD�TERMINATED�WITH�''T''�KEY-IN�'(UTERMN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'UTERME„EQU„*-1ŠDS…0  UDONES„DC.Bƒ'UPLOAD�COMPLETED‚'(UDONEN„DC.Bƒ'XXXXXX�RECORDS�TRANSFERRED'UDONEE„EQU„*-1ŠDS…0ŠPAGE *************************‚UPLOADING�ROUTINEƒ*************************  3UPLOAD„LEA„SEVMS-A(A6),A1…ASK�FOR�SENDING�FILE�NAMEŠLEA„SEVME-A(A6),A2 ŠBSR„MSGOUT2ŠBSR„INPW5ŽTAKE�SENDING�FILE�NAME�(INPUT�AND�WAIT)'ŠBSR„SBARGŽCONVERT�TO�UPPER�CASE�111484 ŠBSR„ASGFLU�ASSIGN�THE�FILE&ŠBEQ.S‚UL00�BRANCH�IF�'Q'�NOT�KEYED�IN*ŠMOVE.B�#'T',D0ŒTERMINATION�ACKNOWLEDGMENT!ŠBSR„RESPOND2‹SEND�IT�TO�THE�HOST ŠBRA„QUITUPDN UL00†BSR„LF63ŠLEA„ULOADMS-A(A6),A1ƒTELL�THEM�UPLOAD�IS�INITIATEDŠLEA„ULOADME-A(A6),A2 ŠBSR„MSGOUT ŠBSR„IMSG1ŠCLR.B‚BUFF5S-A(A6)‡CLEAR�BYTE�FOR�OPERATOR�INPUT0ŠBSR„INPP5C�INPUT�AND�PROCEED�FROM�HOME�TERMINAL  2* PLACE COMPLETION ADDRESSES INTO PARAMETER BLOCKS ŠLEA„UHIO-A(A6),A0ŠMOVE.L�A0,IOS1+24-A(A6)ŠLEA„UTIO-A(A6),A0ŠMOVE.L�A0,IOS5+24-A(A6)  * INITIALIZE FOR RECORD READS /ŠLEA„IOS4-A(A6),A0†ADDR�OF�FILE�PARAMETER�BLOCK$ŠCLR.L‚8(A0)ŽCLEAR�RRN�FOR�DISK�READ#ŠLEA„RBUF-A(A6),A1†STARTING�ADDRESS(ŠLEA„RBUF+RMAX-1-A(A6),A2�ENDING�ADDRESS/ŠMOVEM.L�A1/A2,12(A0)†PLUG�IN�BUFFER�BOUNDARIES-ŠMOVE.L�#$00016020,(A0)„PLUG�IN�READ�FUNCTION!ŠLEA„TBUF-A(A6),A0†PACKING�BUFFER.ŠADD.L‚#3,A0ŽBYPASS�CHECKSUM�AND�EOF�CHARACTER6ŠMOVE.L�A0,TPTR-A(A6)†SAVE�POINTER�FOR�PACKING�RECORDS/ŠMOVE.B�#'A',-1(A0)ˆINDICATE�INTERMEDIATE�FRAME:ŠMOVE.L�A0,UREC1-A(A6)…SAVE�ADDRESS�OF�1ST�RECORD�IN�FRAME6ŠCLR.L‚USTAGEL-A(A6)†INDICATE�NO�STAGED�DISPLAY�RECORD  =* READ ANOTHER RECORD ONLY IF WE STILL HAVE ROOM IN THE FRAME 5UL10†MOVE.L�TPTR-A(A6),D0†POINTER�INTO�PACKING�BUFFER1ŠLEA„TBUF-A(A6),A0†BASE�ADDRESS�OF�PACKING�BUFFER-ŠSUB.L‚A0,D0ŽD0�=�NUMBER�OF�CHARACTERS�PACKED(ŠCMP.L‚CHRNUM-A(A6),D0„SEE�IF�FULL�FRAME!ŠBHS.S‚UL100ŽBRANCH�IF�FRAME�FULLŠLEA„IOS4-A(A6),A0ŠTRAPƒ#2‘READ�THE�RECORDŠBNE.S‚UL15�BRANCH�ON�BAD�READ  E*�READ�WAS�GOOD,�TRANSFER�RECORD�TO�TBUF�UNDER�AN�EDITING�MOVE.‚PLACED*ƒTHE�ACTUAL�NUMBER�OF�CHARACTERS�MOVED�INTO�THE�LENGTH�FIELD�OF�THE*ƒFRAME. *ŠADD.L‚#1,8(A0)‹BUMP�RANDOM�RECORD�POINTER+ŠMOVE.L�TPTR-A(A6),A3†POINT�TO�LENGTH�FIELD"ŠADD.L‚#2,A3ŽWHERE�TO�MOVE�DATA�TOŠBSR„EDITMOV2‹MOVE�DATA�TO�TBUF3ŠMOVE.L�TERMLGH-A(A6),D0ƒNUMBER�OF�CHARACTERS�MOVED ŠMOVE.L�D0,D2#ŠBSR„BINHASCŒCONVERT�TO�ASCII�IN�D1ŠMOVE.L�TPTR-A(A6),A0$ŠMOVE.B�D1,1(A0)‹2ND�DIGIT�OF�LENGTHŠROR.L‚#8,D1ŽPOSITION�1ST�DIGITŠMOVE.B�D1,(A0)ŒPLACE�1ST�DIGIT$ŠADD.L‚#2,A0ŽPOSITION�TO�DESTINATIONŠADD.L‚TERMLGH-A(A6),A0!ŠMOVE.L�A0,TPTR-A(A6)†UPDATE�TPTR"ŠBRA.S‚UL10�CONTINUE�FILLING�FRAME &UL15†CMP.B‚#$C2,D0ŒWAS�IT�END�OF�FILE?!ŠBEQ.S‚UL20�BRANCH�ON�END�OF�FILE"ŠMOVE.L�D0,-(A7)‹SAVE�ERROR�STATUSŠBSR„HALT5ŽHALT�THE�I/O%ŠMOVE.L�(A7)+,D0‹RECOVER�ERROR�STATUSŠBSR„IOSERR�COMPLAIN�ON�ERROR"ŠBRA„XABORT�ABORT�ON�BAD�DISK�READ  * BLANK FILL THE FRAME 1UL20†MOVE.L�TPTR-A(A6),A0†WHERE�TO�MOVE�BLANKS�TOŠLEA„TBUF-A(A6),A1$ŠADD.L‚CHRNUM-A(A6),A1„LAST�ADDR�+�1'UL25†MOVE.B�#'�',(A0)+‰STUFF�BLANKS�...ŠCMP.L‚A0,A1Ž...�TO�THE�END�...ŠBNE.S‚UL25�...�OF�THE�FRAME2ŠMOVE.L�A0,TPTR-A(A6/ )†SET�TPTR�TO�END�OF�FRAME�+�1-ŠMOVE.B�#'Z',TBUF+2-A(A6)‚INDICATE�LAST�FRAME  )* COMPUTE CHECKSUM FOR THIS FRAME OF DATA UL100…EQU„*-ŠBTSTƒ#C,OPTFLG-A(A6)„IS�CHECKSUM�OPTION�SET?ŠBNE.S‚UL102ŽBRANCH�IF�YES>ŠMOVE.W�#'00',TBUF-A(A6)ƒNO�SO�INSERT�ZERO�(WILDCARD)�CHECKSUM ŠBRA.S‚UL150 0UL102…LEA„TBUF+2-A(A6),A1„WHERE�TO�START�SUMMING ŠMOVE.L�A1,A2ŠADD.L‚CHRNUM-A(A6),A2ŠSUB.L‚#2,A2ŽENDING�ADDRESS�+�1ŠCLR.L‚D0‘ACCUMULATORŠCLR.L‚D1‘HOLDS�BYTE 6UL110…MOVE.B�(A1)+,D1‹ACCUMULATE�CHECKSUM�IN�THIS�LOOP ŠADD.L‚D1,D0 ŠCMP.L‚A1,A2 ŠBNE.S‚UL110 ŠDIVUƒ#255,D0ŠSWAPƒD0‘SUM�MOD�255�IN�D0.W$ŠADD.W‚#1,D0ŽINSURE�NONZERO�CHECKSUM'ŠBSR„BINHASCŒCONVERT�TO�HEX�ASCII�IN�D1&ŠMOVE.W�D1,TBUF-A(A6)†PLUG�IN�CHECKSUM  '* LOOP FOR SENDING FRAME BLOCK BY BLOCK 5UL150…LEA„TBUF-A(A6),A2†BASE�OF�FRAME�AND�FIRST�BLOCK ŠMOVE.L�A2,A1ŠADD.L‚CHRBLK-A(A6),A2+ŠSUB.L‚#1,A2ŽBRACKET�FIRST�BLOCK�WITH�A1/A2 ŠBRA.S‚UL182 UL180…EQU„*ŠMOVEM.L�BBOUNDS-A(A6),A1/A20ŠBTSTƒ#R,OPTFLG-A(A6)„ARE�WE�ADDING�C/R'SŽ111484ŠBEQ.S‚UL181ŽNOŸ111484;ŠMOVE.B�USAVCHR-A(A6),1(A2)�REPLACE�CR�WITH�SAVED�CHARACTER*ƒIF�D�OPTION�SET�THEN�DISPLAY�RECORDS�JUST�SENT�ONTO�TERMINAL "UL700…MOVE.L�REP2-A(A6),REP1-A(A6)ŠBTSTƒ#D,OPTFLG-A(A6)#ŠBEQ„UL800ŽBRANCH�IF�OPTION�NOT�SET5ŠMOVE.L�UREC1-A(A6),D0…SEE�IF�USTAGE�READY�TO�DISPLAYŠLEA„TBUF-A(A6),A0 ŠSUB.L‚A0,D0ŠCMP.L‚CHRNUM-A(A6),D0.ŠBHI„UL800ŽBRANCH�IF�USTAGE�STILL�ACCUMULATINGŠBSR„HALT5ŽHALT�I/O�ON�TERMINAL8ŠTST.L‚USTAGEL-A(A6)†DO�WE�HAVE�A�STAGED�DISPLAY�RECORD?ŠBEQ.S‚UL710ŽBRANCH�IF�NO A* DISPLAY THE STAGING BUFFER (LEFT OVER FROM LAST FRAME OVERFLOW) ŠLEA„USTAGE-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚USTAGEL-A(A6),A2 ŠSUB.L‚#1,A2 ŠBSR„MSGOUTŠCLR.L‚USTAGEL-A(A6)  M* NOW SET UP TO DISPLAY THE REST OF THE RECORDS FROM TBUF THAT HAVE JUST BEEN* SENT IN THIS FRAME. UL710…LEA„TBUF-A(A6),A35ŠADD.L‚CHRNUM-A(A6),A3„A3�=�LAST�ADDRESS�+�1�OF�FRAMEBŠMOVE.L�UREC1-A(A6),DLTEMP-A(A6)�POINTER�TO�NEXT�RECORD�TO�DISPLAY >UL720…MOVE.L�DLTEMP-A(A6),A1„ADDRESS�OF�LENGTH�FIELD�OF�RECORD8ŠCMP.B‚#'�',(A1)ŠIS�THIS�THE�LAST�RECORD�OF�ENTIRE�FILE?ŠBEQ.S‚UL790ŽBRANCH�IF�YES ŠCLR.L‚D0ŠLEA„TBUF-A(A6),A0ŠADD.L‚CHRNUM-A(A6),A0,ŠCMP.L‚A0,A1ŽARE�WE�AT�THE�END�OF�THE�FRAME?ŠBHS.S‚UL790ŽBRANCH�IF�YES =* NOT THE LAST RECORD IN TBUF SO MOVE IT TO USTAGE TO DISPLAY -ŠMOVE.L�#2,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERT-ŠBSR„ASCHBINŒCONVERT�FROM�ASCII�HEX�TO�BINARY,ŠMOVE.L�A1,A2ŽADDRESS�OF�BEGINNING�OF�RECORD)ŠADD.L‚D0,A2ŽADDRESS�+�1�OF�END�OF�RECORD4ŠMOVE.L�D0,USTAGEL-A(A6)ƒLENGTH�OF�COMPRESSED�RECORD+ŠLEA„USTAGE-A(A6),A4„BASE�OF�DISPLAY�BUFFER   * MOVE AND UNCOMPRESS RECORD*ƒA1‚-‚'FROM'�ADDRESS*ƒA4‚-‚'TO'�ADDRESS 3UL740…MOVE.B�(A1)+,D0‹CHARACTER�UNDER�CONSIDERATIONŠCMP.B‚#'|',D0/ŠBNE.S‚UL760ŽBRANCH�IF�NOT�COMPRESSION�SENTINEL%ŠMOVE.B�(A1)+,D0‹COMPRESSED�CHARACTER ŠMOVE.B�(A1)+,D1‹REPETITION�CODE ŠSUB.B‚#'0',D1ŒCONVERT�TO�BINARY ŠCMP.B‚#9,D1%ŠBLS.S‚UL750ŽBRANCH�IF�IN�RANGE�0�-�9%ŠSUB.B‚#7,D1ŽCONVERT�IN�RANGE�10�-�35 UL750…TST.B‚D1 ŠBEQ.S‚UL761*ŠMOVE.B�D0,(A4)+‹MOVE�COMPRESSED�CHARACTER ŠSUB.B‚#1,D1 ŠBRA.S‚UL750 3UL760…MOVE.B�D0,(A4)+‹MOVE�NON�COMPRESSED�CHARACTER%UL761…CMP.L‚A2,A1ŽARE�WE�DONE�MOVING?ŠBLO.S‚UL740ŽBRANCH�IF�NO 1ŠCMP.L‚A3,A2ŽSEE�IF�THIS�RECORD�FLOWS�OFF�THE�ENDŠBHI.S‚UL780ŽBRANCH�IF�YES6ŠMOVE.L�A1,DLTEMP-A(A6)„ADDRESS�OF�NEXT�RECORD�IN�TBUF  $* NOW DISPLAY THE RECORD FROM USTAGE ŠMOVE.L�A4,A2$ŠSUB.L‚#1,A2ŽLAST�ADDRESS�TO�DISPLAYŠLEA„USTAGE-A(A6),A1ŠBSR„MSGOUT�DISPLAY�THE�RECORD)ŠCLR.L‚USTAGEL-A(A6)†CLEAR�STAGING�LENGTHŠBRA„UL720ŽCONTINUE�DISPLAYING >UL780…LEA„USTAGE-A(A6),A1„CALCULATE�UNCOMPRESSED�RECORD�LENGTH ŠSUB.L‚A1,A4ŠMOVE.L�A4,USTAGEL-A(A6) /UL790…BSR„INPP5C�TAKE�INPUT�FROM�TERMINAL�AGAIN   #* ENTIRE FRAME HAS BEEN TRANSMITTED8* IF LAST FRAME, ISSUE TERMINATION OR COMPLETION MESSAGE  6UL800…CMP.B‚#'Z',TBUF+2-A(A6)‚WAS�THIS�THE�LAST�FRAME?%ŠBNE.S‚UL840ŽBRANCH�IF�NOT�LAST�FRAME0ŠBTSTƒ#TFLG,TRANFLG-A(A6)�HAS�'T'�BEEN�KEYED�IN?ŠBEQ.S‚UL830ŽBRANCH�IF�NO )ŠMOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„UTERMN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6ŠLEA„UTERMS-A(A6),A1ŠLEA„UTERME-A(A6),A2(ŠBSR„MOUT�TELL�THEM�UPLOAD�IS�TERMINATED ŠBRA„QUITUPDN .UL830…MOVE.L�IOS4+8-A(A6),D0„NUMBER�TO�CONVERT-ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�TO�CONVERTŠLEA„UDONEN-A(A6),A0)ŠBSR„BINDASCŒCONVERT�TO�ASCII�FOR�DISPLAYŠBSR„LF6ŠLEA„U0 DONES-A(A6),A1ŠLEA„UDONEE-A(A6),A2'ŠBSR„MOUT�TELL�THEM�UPLOAD�IS�COMPLETED ŠBRA„QUITUPDN 5UL840…BTSTƒ#TFLG,TRANFLG-A(A6)�HAS�'T'�BEEN�KEYED�IN?ŠBEQ.S‚UL850ŽBRANCH�IF�NO4ŠLEA„TBUF-A(A6),A0†SET�UP�TBUF�POINTER�TO�BLANK�FILL)ŠADD.L‚#3,A0ŽBYPASS�CHECKSUM�AND�SEQUENCEŠMOVE.L�A0,TPTR-A(A6)/ŠBRA„UL20�GO�CONSTRUCT�ENDING�FRAME�AND�SEND�IT  >* JUSTIFY ANY FRAME OVERFLOW AND CONTINUE SENDING DATA TO HOST 3UL850…MOVE.L�TPTR-A(A6),A2†LAST�ADDRESS�+�1�TO�MOVEŠLEA„TBUF-A(A6),A0,ŠADD.L‚CHRNUM-A(A6),A0„FIRST�ADDRESS�TO�MOVE$ŠLEA„TBUF+3-A(A6),A1„WERE�TO�MOVE�TOUL855…CMP.L‚A2,A0"ŠBHS.S‚UL900ŽBRANCH�IF�DONE�MOVINGŠMOVE.B�(A0)+,(A1)+ ŠBRA.S‚UL855:UL900…MOVE.L�A1,TPTR-A(A6)†UPDATE�TEMPORARY�BUFFER�POINTER,ŠMOVE.L�A1,UREC1-A(A6)…FIRST�RECORD�OF�FRAME5ŠMOVE.B�#'A',TBUF+2-A(A6)‚INDICATE�INTERMEDIATE�FRAMEŠBRA„UL10�GO�CONTINUE�FILLINGŠPAGE )*****************************************(*�EVENT�WAS�I/O�COMPLETION�ON�TERMINAL‚*)***************************************** UTIO†EQU„*/ŠMOVE.L�SAVSTACK-A(A6),A7‚RESTORE�STACK�POINTERŠBSR„ASQREADŒREAD�THE�EVENTŠLEA„IOS5H-A(A6),A0%ŠBSR„HLTCHK�WAS�THIS�FROM�A�HALT�I/O?ŠBEQ.S‚ULWAIT�BRANCH�IF�YES ŠMOVE.B�BUFF5S-A(A6),D0(ŠCMP.B‚#'D',D0ŒWAS�KEYIN�A�'D'�(DISPLAY) ŠBNE.S‚UTIO10ŠBCHGƒ#D,OPTFLG-A(A6)2ŠBEQ.S‚UTIO08�BRANCH�IF�DISPLAY�WAS�PREVIOUSLY�OFF*ŠCLR.L‚USTAGEL-A(A6)†CLEAR�HANGING�DISPLAYŠBSR„LF61ŠLEA„RDOFS-A(A6),A1…PUT�OUT�'DISPLAY�OFF�MESSAGE'ŠLEA„RDOFE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚UTIO99 UTIO08„BSR„LF60ŠLEA„RDONS-A(A6),A1…PUT�OUT�'DISPLAY�ON�MESSAGE'ŠLEA„RDONE-A(A6),A2 ŠBSR„MSGOUTŠBSR„LF6 ŠBRA.S‚UTIO99 (UTIO10„CMP.B‚#'T',D0ŒWAS�A�'T'�KEYED�IN?ŠBNE.S‚UTIO99�BRANCH�IF�NO5ŠBSETƒ#TFLG,TRANFLG-A(A6)�YES�SO�SET�TERMINATION�FLAG UTIO99„BSR„INPP5C   7* RESET STACK POINTER AND POINTER AND GO WAIT FOR EVENT ULWAIT„EQU„*,ŠMOVE.L�A7,SAVSTACK-A(A6)‚SAVE�STACK�POINTER!ŠMOVE.L�#WTEVNT,D0‰WAIT�FOR�EVENTŠTRAPƒ#1  2**************************************************$*�QUITUPDN�HALTS�ANY�ACTIVE�I/O�ON�*%*ƒTERMINAL�OR�HOST�PORT,�DELAYS�FORŒ*.*ƒ2�SECONDS.‚READS�ALL�THE�EVENTS�IN�THE�ASQ‚**ƒAND�PERFORMS�RTS.œ*2************************************************** QUITUPDN‚BRA„TRANNXT  <************************************************************,*�ASGFLD�ASSIGNS�THE�FILE�KEYED�IN�IN�TBUF‘*8*ƒTO�LOGICAL�UNIT�#4�FOR�UPLOAD.‚EQUAL�CONDITION�CODES‚*0*ƒRETURNED�FOR�GOOD�ASSIGN,�NE�CONDITION�CODES‹*%*ƒRETURNED�IF�OPERATOR�KEYS�IN�'Q'.–*<************************************************************  0RENTRS„DC.Bƒ'REENTER�FILE�NAME�OR�''Q''�TO�QUIT'RENTRE„EQU„*-1ŠDS…0  3OVRMSGSƒDC.Bƒ'FILE�EXISTS�-�OK�TO�OVERWRITE(Y/N)�?'OVRMSGEƒEQU„*-1ŠDS…0  ASGFLD„EQU„*!ŠBSR„EDFILŽSET�UP�PARAMETER�BLOCK&ŠBNE.S‚ASGFLD40‹BRANCH�IF�'Q'�KEYED�INŠLEA„FHS4-A(A6),A0#ŠMOVE.L�#$00400000,(A0)„ASSIGN�CODEŠTRAPƒ#38ŠBEQ.S‚ASGOVRWŒBRANCH�IF�GOOD�ASSIGN�(OVERWRITE�REQUEST)  >* ASSIGN FAILED - SEE IF NONEXISTENT FILE AND IF NOT, COMPLAIN ŠCMP.B‚#$17,D0#ŠBEQ.S‚ASALLO�BRANCH�IF�NONEXISTENT!ŠBSR„FHSERR�COMPLAIN�OF�FHS�ERROR ;ASGFLD20‚LEA„RENTRS-A(A6),A1„TELL�THEM�TO�REENTER�FILE�NAMEŠLEA„RENTRE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽGET�INPUTŠBRA„ASGFLD�GO�FOR�ANOTHER�TRY  8*�THE�FILE�ALREADY�EXISTS.‚ASK�IF�THEY�WISH�TO�OVERWRITE ASGOVRWƒLEA„OVRMSGS-A(A6),A1ŠLEA„OVRMSGE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽWAIT�FOR�THE�INPUTŠCMP.B‚#'Y',BUFF5S-A(A6) ŠBNE„ASGFLD20  ;*�THEY�WANT�TO�OVERWRITE.‚FREE�THE�FILE�AND�DELETE�IT,�THEN* REALLOCATE IT AND ASSIGN IT. ŠLEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3‘FREE�THE�FILEŠMOVE.L�#$00020000,(A0)ŠTRAPƒ#3‘DELETE�THE�FILE ASALLO„MOVE.L�#$00C00304,(A0)%ŠTRAPƒ#3‘ALLOCATE�AND�ASSIGN�THE�FILEŠBEQ.S‚ASGFLD40$ŠBSR„FHSERR�PUT�UP�FHS�ERROR�MESSAGE/ŠBRA„ASGFLD20‹GO�TELL�THEM�TO�REENTER�FILE�NAME ASGFLD40‚RTSŠPAGE <************************************************************,*�ASGFLU�ASSIGNS�THE�FILE�0 KEYED�IN�IN�TBUF‘*8*ƒTO�LOGICAL�UNIT�#4�FOR�UPLOAD.‚EQUAL�CONDITION�CODES‚*0*ƒRETURNED�FOR�GOOD�ASSIGN,�NE�CONDITION�CODES‹*&*ƒRETURNED�IF�OPERATOR�KEYS�IN�QUIT.•*<************************************************************  ASGFLU„EQU„*#ŠBSR.S‚EDFILŽSET�UP�PARAMETER�BLOCK&ŠBNE.S‚ASGFLU50‹BRANCH�IF�'Q'�KEYED�IN ŠLEA„FHS4-A(A6),A0#ŠMOVE.L�#$00400000,(A0)„ASSIGN�CODEŠTRAPƒ#3%ŠBEQ.S‚ASGFLU50‹BRANCH�ON�GOOD�ASSIGN  2* ASSIGN FAILED - COMPLAIN AND LET THEM TRY AGAIN. !ŠBSR„FHSERR�COMPLAIN�OF�FHS�ERROR3ŠLEA„RENTRS-A(A6),A1„TELL�THEM�TO�REENTER�FILE�NAMEŠLEA„RENTRE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽGET�INPUTŠBRA„ASGFLU�GO�FOR�ANOTHER�TRY 5*�THE�FILE�IS�ASSIGNED.‚RETURN�EQUAL�CONDITION�CODES. ASGFLU50‚RTSŠPAGE :**********************************************************5*�EDFIL�FREES�ANY�FILE�ATTACHED�TO�LOGICAL�UNIT�#3,†*3*ƒAND�ATTEMPTS�TO�ASSIGN�THE�FILE�KEYED�IN�IN�THE†*.*ƒBUFFER�POINTED�AT�BY�IOS5�PARAMETER�BLOCK.‹*6*ƒIF�THE�ASSIGNMENT�WAS�GOOD,�EQ�CONDITION�CODES�AREƒ*/*ƒRETURNED.‚IF�'Q'�WAS�KEYED-IN,�NE�CONTITION‰*6*ƒCODES�ARE�RETURNED.‚EDFIL�WILL�INTERACTIVELY�QUERY‚*4*ƒTHE�OPERATOR�IF�A�ERROR�WAS�MADE�IN�ENTERING�THE…**ƒFILE�NAME.«*:**********************************************************  DBADFILSƒDC.Bƒ'BAD�FILE�NAME�ENTERED�-�REENTER�NAME�OR�''Q''�TO�QUIT'BADFILEƒEQU„*-1ŠDS…0  4* FIRST FREE IF ANY FILE ATTACHED TO LOGICAL UNIT #3 EDFIL…LEA„FHS4-A(A6),A0ŠMOVE.L�#$00040000,(A0)ŠTRAPƒ#3  8* SEE IF 'Q' WAS KEYED IN - IF SO BRANCH TO QUIT ROUTINE EDFIL4„BSR„QUITCHK%ŠBEQ.S‚EDFIL8�BRANCH�IF�QUIT�KEYED�IN  /* NOW SET UP PARAMETER BLOCK TO ASSIGN THE FILE ŠLEA„FHS4-A(A6),A0ŠBSR.S‚DEFAULTS6ŠMOVE.L�IOS5+12-A(A6),A0ƒADDRESS�OF�KEYED�IN�FILE�NAME ŠMOVE.L�A0,A2ŠADD.L‚IOS5+20-A(A6),A24ŠMOVE.B�#',',1(A2)‰TERMINATE�WITH�COMMA�FOR�EDITFILEŠLEA„FHS4-A(A6),A6 ŠBSR„EDITFILE ŠLEA„A(PC),A6 ŠTST.L‚D0#ŠBPL.S‚EDFIL6�BRANCH�IF�EDITFILE�OKŠLEA„BADFILS-A(A6),A1ŠLEA„BADFILE-A(A6),A2 ŠBSR„MOUTŠBSR„INPW5ŽWAIT�FOR�THE�INPUT ŠBRA.S‚EDFIL4 ,EDFIL6„CMP.L‚D0,D0ŽSET�EQUAL�FOR�GOOD�ASSIGNŠBRA.S‚EDFILRTS 3EDFIL8„MOVE.L�#1,D0ŽSET�NE�CONDITION�CODES�FOR�QUIT EDFILRTS‚RTSŠPAGE 5*****************************************************5* RESPOND1 RESPONDS TO HOST WITH OUTPUT WITH INPUT. *+*ƒRESPONSE�VALUE�PASSED�IN�LOW�ORDER�BYTE‰***ƒOF�DO.‚INPUT�IS�DONE�INTO�BUFF1S.�THIS‰**ƒROUTINE�CALLS�OIP1.�*5*****************************************************  /RESPOND1‚MOVE.B�D0,RESPONSE-A(A6)‚SAVE�RESPONSE3ŠLEA„RESPONSE-A(A6),A1‚SET�UP�BUFFER�BOUNDARIES�...ŠMOVE.L�A1,A2Ž...�FOR�OIP1 ŠADD.L‚#2,A2 ŠBSR„OIP1ŠRTS  7*******************************************************5*�RESPOND2�RESPONDS�TO�HOST�WITH�OUTPUT�AND�PROCEEDƒ*7* WITH RESPONSE VALUE PASSED IN LOW ORDER BYTE OF D0. *7*******************************************************  RESPOND2‚EQU„*)ŠMOVE.B�D0,RESPONSE-A(A6)‚SET�UP�RESPONSE*ŠLEA„RESPONSE-A(A6),A1‚ADDRESS�OF�RESPONSE&ŠMOVE.L�A1,A2ŽSET�UP�BUFFER�BOUNDARIES ŠADD.L‚#2,A2ŠLEA„IOS1-A(A6),A0ŠMOVEM.L�A1/A2,12(A0)6ŠMOVE.L�#$0002020A,(A0)„IMAGE�WRITE,�SVC�ADDR,�PROCEED"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2 ŠBSR„XFRABORTŠRTSŠPAGE 2****************************************************�DEFAULTS�SETS�UP�DEFAULT�VALUES�IN�FHS‰*.*ƒPARAMETER�BLOCK.‚A0�CONTAINS�FHS�PARAMETER‚**ƒBLOCK�ADDRESS.Ÿ*2**************************************************  :DEFAULTS‚MOVE.W�USERNUM+2-A(A6),$A(A0)�DEFAULT�USER�NUMBER'ŠMOVE.L�VOLNAM-A(A6),$6(A0)„VOLUME�NAME(ŠMOVE.L�CATNAM-A(A6),$C(A0)„CATALOG�NAME7ŠMOVE.L�CATNAM+4-A(A6),$10(A0)�2ND�PART�OF�CATALOG�NAMEŠRTS   5*******************************************************�NAKRPT�COUNTS�DOWN�THE�REP1�COUNTER�TOŒ*-*ƒSEE�IF�THE�REPETITION�COUNT�IS�EXHAUSTED.‡*0*ƒIF�REP1�IS�ZERO,�COUNT�IS�EXHAUSTED�AND�REP1„*0*ƒIS�RESET�WITH�REP2�VALUE�AND�EQUAL�CONDITION„**ƒCODES�ARE�RETURNED.�*-*ƒOTHERWISE�REP1�IS�DECREMENTED�AND�UNEQUA1 L‡*!*ƒCONDITION�CODES�ARE�RETURNED.“*5*****************************************************   NAKRPT„TST.L‚REP1-A(A6),ŠBGT.S‚NAKRPT2ŒBRANCH�IF�COUNT�NOT�EXHAUSTED5ŠMOVE.L�REP2-A(A6),REP1-A(A6)‚EXHAUSTED�-�RESET�COUNT ŠCMP.L‚D0,D0ŠBRA.S‚NAKRRTSNAKRPT2ƒSUB.L‚#1,REP1-A(A6)'ŠTST.L‚(A7)�SET�NONZERO�CONDITION�CODES NAKRRTSƒRTSŠPAGE 3***************************************************0*�PREACHK�CHECKS�THE�TERMINAL�BUFFER�TO�SEE�IF„*+*ƒIT�CONTAINS�'PREAMBLE'.‚EQUAL�CONDITION†*0*ƒCODES�ARE�RETURNED�IF�SO,�UNEQUAL�OTHERWISE.‚*3***************************************************   2PREACHKƒLEA„PREAM-A(A6),A1…STRING�TO�CHECK�AGAINST"ŠLEA„TBUF-A(A6),A2†BUFFER�TO�CHECK ŠBSR.S‚SCHKŠRTS  8********************************************************/*�QUITCHK�CHECKS�THE�IOS5�BUFFER�TO�SEE�IF�ITŠ*4*ƒCONTAINS�'Q'.‚EQUAL�CONDITION�CODES�ARE�RETURNED‚**ƒIF�SO,�UNEQUAL�OTHERWISE.š*8********************************************************  QUITCHKƒMOVE.L�IOS5+12-A(A6),A2ŠCMP.B‚#'Q',(A2)ŠRTS  >**************************************************************<*�SCHK�CHECKS�THE�TERMINAL�BUFFER�POINTED�AT�BY�A2�FOR�THEƒ***ƒCHARACTER�STRING�SPECIFIED�BY�A1.‚UPON’*.*ƒENTRY,�A1�POINTS�TO�A�LONG�WORD�SPECIFYING�*-*ƒTHE�NUMBER�OF�CHARACTERS�IN�THE�STRING�TO�*-*ƒMATCH,�FOLLOWED�IMMEDIATELY�BY�THE�STRING�* *ƒITSELF.²*>**************************************************************  SCHK†EQU„*ŠMOVE.L�(A1)+,D0 ŠSUB.L‚#1,D0TCHK2…CMP.B‚(A1)+,(A2)+ŠDBNEƒD0,TCHK2ŠRTSŠPAGE 1*************************************************(*�MOUT�HALTS�ANY�I/O�ON�LU�5�AND�CALLSŠ*,*ƒMSGOUT�TO�OUTPUT�DATA�TO�LU�6.‚IF�A�REALƒ*-*ƒI/O�FUNCTION�WAS�ACTUALLY�HALTED�ON�LU�5,ƒ*+*ƒMOUT�WILL�REISSUE�THE�I/O�REQUEST�AFTER…**ƒCALLING�MOUT.Ÿ*1*************************************************  #MOUT†BSR„HALT5ŽHALT�I/O�ON�TERMINAL(ŠBEQ.S‚MOUT4ŽBRANCH�IF�I/O�REALLY�HALTED ŠBSR„MSGOUTŠBRA.S‚MOUTRTS MOUT4…BSR„MSGOUTŠMOVE.L�A0,-(A7)ŠLEA„IOS5-A(A6),A0"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/O!ŠTRAPƒ#2‘REISSUE�THE�PREVIOUS�I/OŠMOVE.L�(A7)+,A0 MOUTRTSƒRTS  0************************************************+*�FHSERR�PUTS�UP�A�MESSAGE�COMPLAINING�OF†*-*ƒFHS�ERROR�NUMBER�AND�LOGICAL�UNIT�NUMBER.‚*)*ƒENTERED�WITH�ERROR�CODE�IN�D0�AND�FHS†*"*ƒPARAMETER�BLOCK�ADDRESS�IN�A0.�**ƒA0,A1,A2,D0�DESTROYED–*0************************************************ FHSERR„BSR„BINHASCŠMOVE.W�D1,FHSERRS-A(A6)ŠMOVE.B�5(A0),FHSERLUN-A(A6)ŠADD.B‚#$30,FHSERLUN-A(A6)ŠLEA„FHSERRS-A(A6),A1ŠLEA„FHSERRE-A(A6),A2 ŠBSR„MOUTŠRTSŠPAGE 0************************************************+*�IOSERR�PUTS�UP�A�MESSAGE�COMPLAINING�OF†*-*ƒIOS�ERROR�NUMBER�AND�LOGICAL�UNIT�NUMBER.‚*)*ƒENTERED�WITH�ERROR�CODE�IN�D0�AND�IOS†*!*ƒPARAMETER�BLOCK�ADDRESS�IN�A0Ž**ƒA0,A1,A2,D0�DESTROYED.•*0************************************************  IOSERR„BSR„BINHASCŠMOVE.W�D1,IOSERRS-A(A6)ŠMOVE.B�5(A0),IOSERLUN-A(A6)ŠADD.B‚#$30,IOSERLUN-A(A6)ŠLEA„IOSERRS-A(A6),A1ŠLEA„IOSERRE-A(A6),A2 ŠBSR„MOUTŠRTS  2**************************************************0*�IOP�PERFORMS�I/O�REQUEST�FOR�I/O�AND�PROCEEDƒ***ƒA0�CONTAINS�ADDRESS�OF�PARAMETER�BLOCK‡*$*ƒA1�CONTAINS�BUFFER�START�ADDRESS�*"*ƒA2�CONTAINS�BUFFER�END�ADDRESS�*+*ƒSTATUS�BYTE�OF�P.B.�IS�FLAGGED�WITH�$FF†***ƒTO�SHOW�ACTIVE�I/O.‚REQUEST�IS�IGNORED†**ƒIF�I/O�IS�ALREADY�ACTIVE.”*2**************************************************  IOP‡EQU„*(ŠCMP.B‚#$FF,4(A0)‰IS�I/O�ALREADY�ACTIVE?ŠBEQ.S‚IOPRTS�BRANCH�IF�YES.ŠMOVEM.L�A1/A2,12(A0)†PLUG�IN�BUFFER�ADDRESSES"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2,ŠBSR„XFRABORT‹ABORT�ON�PARAMETER�BLOCK�ERROR IOPRTS„RTSŠPAGE 1*************************************************(*�INPP5C�PERFORMS�INPUT�AND�PROCEED�ONŠ*,*ƒLOGICAL�UNIT�5�(TERMINAL).‚ONE�CHARACTERƒ**ƒIS�INPUT�AT�BUFF5S.™* *ƒINPUT�IS�IMAGE�MODE,�NO�ECHO�*1************************************1 ************* INPP5C„LEA„BUFF5S-A(A6),A1 ŠMOVE.L�A1,A2ŠLEA„IOS5-A(A6),A03ŠMOVE.L�#$0001022A,(A0)„READ,IMAGE,SVC�ADDR,PROCEEDŠBSR„IOPŠRTS   5*****************************************************'*�INPP5�PERFORMS�INPUT�AND�PROCEED�ON�*0*ƒLOGICAL�UNIT�5�(TERMINAL).‚BUFFER�BOUNDARIESƒ**ƒARE�BUFF5S�AND�BUFF5E›* *ƒINPUT�IS�FORMATTED�WITH�ECHO”*5*****************************************************  INPP5…LEA„BUFF5S-A(A6),A1ŠLEA„BUFF5E-A(A6),A2ŠLEA„IOS5-A(A6),A0-ŠMOVE.L�#$00010202,(A0)„READ,SVC�ADDR,PROCEEDŠBSR„IOPŠRTS  ,********************************************,* INPW5 PERFORMS INPUT AND WAIT ON LOGICAL *(*ƒUNIT�5�(TERMINAL).‚BUFFER�BOUNDARIES‚**ƒARE�BUFF5S�AND�BUFF5E.‘*,******************************************** INPW5…LEA„BUFF5S-A(A6),A1ŠLEA„BUFF5E-A(A6),A2ŠLEA„IOS5-A(A6),A0ŠMOVEM.L�A1/A2,12(A0)ŠMOVE.L�#$00010000,(A0)"ŠMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2 ŠBSR„XFRABORTŠRTS )*****************************************'*�INPP1�PERFORMS�INPUT�AND�PROCEED�ONƒ*&*ƒLOGICAL�UNIT�1�(HOST�PORT).‚BUFFER�*$*ƒBOUNDARIES�ARE�BUFF1S�AND�BUFF1E„*)***************************************** INPP1…LEA„BUFF1S-A(A6),A1ŠLEA„BUFF1E-A(A6),A2ŠLEA„IOS1-A(A6),A0<ŠMOVE.L�#$0001022E,(A0)„READ,SVC�ADDR,NO�ECHO,IMAGE,PROCEED,ŠBSR„IOP�REJECT�IF�BUSY‚012885ŠRTSŠPAGE 0************************************************(*�OUTP1�PERFROMS�OUTPUT�AND�PROCEED�ON‰*&*ƒLOGICAL�UNIT�1�(HOST�PORT).‚BUFFERˆ*,*ƒARE�DEFINED�IN�A1/A2.‚THIS�ROUTINE�CALLS‚**ƒIOP.§*0************************************************  OUTP1…LEA„IOS1-A(A6),A04ŠMOVE.L�#$0002020A,(A0)„IMAGE�WRITE,SVC�ADDR,PROCEEDŠBSR„IOP ŠBSR„XFRABORTŠRTS  4****************************************************3*�OUTW5I�PERFORMS�OUTPUT�AND�WAIT�(IMAGE�MODE)�ON‚*.*ƒLOGICAL�UNIT�5�(TERMINAL�PORT).‚BOUNDARIES„*%*ƒARE�TBUF�FOR�A�LENGTH�OF�TERMLGH.Ž*,*ƒOUTPUT�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS‡**ƒIS�RETURNED.£*4****************************************************  OUTW5I„LEA„IOS5W-A(A6),A0ŠLEA„TBUF-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚TERMLGH-A(A6),A2 ŠSUB.L‚#1,A2/ŠMOVEM.L�A1/A2,12(A0)†MOVE�IN�BUFFER�BOUNDARIES(ŠMOVE.L�#$00020008,(A0)„IMAGE�WRITE,WAIT)OUTW5IAƒMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSYŠBNE.S‚OUTW5IX!ŠBSR„TINYWAIT‹WAIT�A�LITTLE�WHILEŠBRA.S‚OUTW5IA OUTW5IXƒRTS   7*******************************************************5*�OUTP5F�PERFORMS�OUTPUT�AND�PROCEED�(FORMATTED)�ONƒ*.*ƒLOGICAL�UNIT�5�(TERMINAL�PORT).‚BOUNDARIES‡*%*ƒARE�TBUF�FOR�A�LENGTH�OF�TERMLGH.‘*,*ƒOUTPUT�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUSŠ**ƒIS�RETURNED.¦*7*******************************************************  B+L4D<GD@L:T@\JdWlHtK|OUTP5F„LEA„IOS5-A(A6),A0ŠLEA„TBUF-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚TERMLGH-A(A6),A2 ŠSUB.L‚#1,A2/ŠMOVEM.L�A1/A2,12(A0)†MOVE�IN�BUFFER�BOUNDARIES5ŠMOVE.L�#$00020202,(A0)„FORMAT�WRITE,SVC�ADDR,PROCEED )OUTP5FAƒMOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSYŠBNE.S‚OUTP5FX!ŠBSR„TINYWAIT‹WAIT�A�LITTLE�WHILEŠBRA.S‚OUTP5FA OUTP5FXƒRTS   6******************************************************'*�OIP15�PERFORMS�OUTPUT�WITH�INPUT�ON�*1*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTPUT�BOUNDARIES„*(*ƒARE�DEFINED�IN�IOS5�PARAMETER�BLOCK.�***ƒINPUT�BOUNDARIES�ARE�BUFF1S�AND�BUFF1E‹*,*ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS‰*&*ƒRETURNED.‚THIS�ROUTINE�CALLS�OIP1.Ž*6******************************************************  ;OIP15…MOVE.L�IOS5+12-A(A6),A1ƒCONSTRUCT�BOUNDARIES�IN�A1/A2 ŠMOVE.L�A1,A2,ŠBTSTƒ#H,OPTFLG-A(A6)„HALF�DUPLEX�SET’111484+ŠBEQ.S‚OIP15A�NO,�OUTPUT�1�CHAR�ONLY‹1114843ŠADD.L‚IOS5+20-A(A6),A2ƒYES,�SEND�WHOLE�LINE�111484OIP15A„BSR.S‚OIP2 1°111484ŠRTSŠPAGE 4****************************************************&*�OIP1�PERFORMS�OUTPUT�WITH�INPUT�ON�*1*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTPUT�BOUNDARIES‚**ƒARE�DEFINED�IN�A1/A2.š***ƒINPUT�BOUNDARIES�ARE�BUFF1S�AND�BUFF1E‰*,*ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS‡* *ƒRETURNED.¦*4**************************************************** OIP1†LEA„IOS1-A(A6),A02ŠMOVEM.L�A1/A2,12(A0)†SET�OUTPUT�BUFFER�BOUNDARIESŠLEA„BUFF1S-A(A6),A1#ŠMOVE.L�A1,8(A0)‹INPUT�BUFFER�STARTŠLEA„BUFF1E-A(A6),A2 ŠSUB.L‚A1,A2 ŠADD.L‚#1,A2!ŠMOVE.L�A2,20(A0)ŠLENGTH�OF�INPUT>ŠMOVE.L�#$0004062A,(A0)„OUT/IN,�IMAGE,SVC�ADDR,NO�ECHO,PROCEED'OIP1A…MOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSY ŠBNE.S‚OIP1X#ŠBSR.S‚TINYWAIT‹WAIT�A�LITTLE�WHILE ŠBRA.S‚OIP1A OIP1X…RTS  2**************************************************'*�OIP1C�PERFORMS�OUTPUT�WITH�INPUT�ONŒ*-*ƒLOGICAL�UNIT�1�(HOST�PORT).�OUTUPT�IS�ONE„*)*ƒCHARACTER�FROM�BUFFER�DEFINED�IN�IOS5ˆ**ƒPARAMETER�BLOCK.�*'*ƒINPUT�IS�ONE�CHARACTER�INTO�BUFF1S.Š*,*ƒI/O�IS�ATTEMPTED�UNTIL�NO�BUSY�STATUS�IS…* *ƒRETURNED.¤*2************************************************** OIP1C…LEA„IOS1-A(A6),A0ŠMOVE.L�IOS5+12-A(A6),A1 ŠMOVE.L�A1,A2ŠADD.L‚IOS5+20-A(A6),A2 ŠSUB.L‚#1,A22ŠMOVEM.L�A1/A2,12(A0)†SET�OUTPUT�BUFFER�BOUNDARIESŠLEA„BUFF1S-A(A6),A1#ŠMOVE.L�A1,8(A0)‹INPUT�BUFFER�START!ŠMOVE.L�#1,20(A0)ŠLENGTH�OF�INPUT>ŠMOVE.L�#$0004062A,(A0)„OUT/IN,�IMAGE,SVC�ADDR,NO�ECHO,PROCEED (OIP1CA„MOVE.B�#$FF,4(A0)‰MARK�ACTIVE�I/OŠTRAPƒ#2"ŠCMP.B‚#BUSY,D0‹SEE�IF�DEVICE�BUSY ŠBNE.S‚OIP1CX#ŠBSR.S‚TINYWAIT‹WAIT�A�LITTLE�WHILE ŠBRA.S‚OIP1CA OIP1CX„RTSŠPAGE  +*********************************************�TINYWAIT�DOES�A�RELINQUISH�AND�RETURNS‚*+******************************************* TINYWAIT‚MOVE.L�#RELINQ,D0ŠTRAPƒ#1ŠRTS  :**************************************************<<011785+*�HALT1�HALTS�THE�I/O�IN�PROGRESS�ON�LU�1ˆ**°*.*‚ROUTINE�WAITS�FOR�HALT�STATUS�TO�APPEAR�IN„*.*‚IOS1H�PARAMETER�BLOCK�BEFORE�RETURNING.‚IFƒ*+*‚A�HALT�IS�ACTUALLY�EFFECTED�(0�STATUS),‡***‚THE�HALT�SYNC�COUNTER�WORD�IMMEDIATELYˆ*)*‚FOLLOWING�THE�HALT�PARAMETER�BLOCK�IS‰*,*‚INCREMENTED.‚IF�NO�I/O�HAD�TO�BE�STOPPED…*&*‚(STATUS�NE�0�&�NE�$FF,�RETURN�NOW.Œ*2************************************************** HALT1:ŠLEA„IOS1H-A(A6),A0&ŠMOVE.B�#$FF,IOSSTA(A0)„PRELOAD�STATUSŠTRAPƒ#2‘HALT�THE�I/O7ŠWHILE.B�IOSSTA(A0)��#$FF�DO.S‚WAIT�TILL�GET�ANSWER ŒBSR‚TINYWAITŠENDW 7ŠIF.BƒIOSSTA(A0)��#0�THEN.S‚WAS�THERE�I/O�TO�HALT�?4ŒADD.W‚#1,IOS1H+28-A(A6)‚YES,�BUMP�HALT�SYNC�COUNTER&ŒCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODESŠENDI HALT1RTS‚RTS   2**************************************************+*�HALT5�HALTS�THE�I/O�IN�PROGRESS�ON�LU�5ˆ**°*.*‚ROUTINE�WAITS�FOR�HALT�STATUS�TO�APPEAR�IN„*.*‚IOS5H�PARAMETER�BLOCK�BEFORE�RETURNING.‚IFƒ*+*‚A�HALT�IS�ACTUALLY�EFFECTED�(0�STATUS),‡***‚THE�HALT�SYNC�COUNTER�WORD�IMMEDIATELYˆ*)*‚FOLLOWING�THE�HALT�PARAMETER�BLOCK�IS‰*,*‚INCREMENTED.‚IF�NO�I/O�HAD�TO�BE�STOPPED…*&*‚(STATUS�NE�0�&�NE�$FF,�RETURN�NOW.Œ*2************************************************** HALT5:ŠLEA„IOS5H-A(A6),A0&ŠMOVE.B�#$FF,IOSSTA(A0)„PRELOAD�STATUSŠTRAPƒ#2‘HALT�THE�I/O7ŠWHILE.B�IOSSTA(A0)��#$FF�DO.S‚WAIT�TILL�GET�ANSWER ŒBSR‚TINYWAITŠENDW 7ŠIF.BƒIOSSTA(A0)��#0�THEN.S‚WAS�THERE�I/O�TO�HALT�?4ŒADD.W‚#1,IOS5H+28-A(A6)‚YES,�BUMP�HALT�SYNC�COUNTER&ŒCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODESŠENDIHALT5RTS‚RTS—011785>>   4****************************************************(*�HLTCHK�CHECKS�FOR�A�HALTED�I/O.‚ZEROŒ*'*ƒCONDITION�CODES�ARE�RETURNED�IF�THEŒ*&*ƒI/O�HAS�HALTED,�NONZERO�OTHERWISE.�*)*ƒTHE�ADDRESS�OF�THE�HALT�I/O�PARAMETERŠ*&*ƒBLOCK�IS�PASSED�IN�A0.‚THE�ROUTINEŒ*-*ƒCHECKS�THE�SYSC�COUNTER�(WORD�IMMEDIATELY†***ƒFOLLOWING�THE�HALT�PARAMETER�BLOCK�FOR‰*,*ƒZERO.‚IF�ZERO,�NO�HALT�HAS�BEEN�EFFECTED†*,*ƒIF�NONZERO,�A�HALT�HAS�BEEN�EFFECTED�AND‡*0*ƒTHE�ROUTINE�2 WILL�DECREMENT�THE�SYNC�COUNTER.ƒ*4****************************************************  +HLTCHK„TST.W‚28(A0)�HAS�HALT�BEEN�EFFECTED?ŠBEQ.S‚HLTCHKBŒBRANCH�IF�NO$ŠSUB.W‚#1,28(A0)ŠCHECK�OFF�THIS�HALT/ŠCMP.L‚D0,D0ŽSET�EQUAL�CONDITION�CODES�FOR�HALTŠBRA.S‚HLTCRTSŒGO�RETURN:HLTCHKBƒTST.L‚(A7)�SET�NONZERO�CONDITION�CODES�FOR�NO�HALT HLTCRTSƒRTSŠPAGE 2****************************************************�IOERCHK�CHECKS�PARAMETER�BLOCK�POINTED‰*.*ƒAT�BY�A0�FOR�ERROR.‚IF�ERROR�THEN�COMPLAIN‚**ƒWITH�MESSAGE. *2**************************************************  IOERCHKƒMOVE.B�4(A0),D0"ŠBEQ.S‚IOERRTSŒBRANCH�FOR�NO�ERROR$ŠMOVEM.L�D0/A0,-(A7)‡SAVE�ERROR�CODE!ŠBSR„IOSERR�COMPLAIN�OF�I/O�ERROR'ŠMOVEM.L�(A7)+,D0/A0‡RESTORE�ERROR�CODE IOERRTSƒRTS   :**********************************************************,*�WAITDC1�WILL�PUT�UP�A�TWO�CHARACTER�READ�*&*ƒTO�THE�HOST�PORT.‚WHEN�THE�READ�IS’*-*ƒSATISFIED�THE�ROUTINE�PERFORMS�AN�RTS.‚IF‹*/*ƒTHE�READ�IS�NOT�SATISFIED,�THE�ROUTINE�WILLŠ*2*ƒRTS�AFTER�TWO�SECONDS.‚THE�PURPOSE�IS�TO�DELAY†*6*ƒUNTIL�RECEIPT�OF�A�DC1�INDICATING�LINE�TURNAROUND.ƒ*7*ƒTHE�TWO�CHARACTERS�READ�SHOULD�BE�A�LINE�FEED�($0A)‚*"*ƒFOLLOWED�BY�A�CARRIAGE�RETURN.—*:**********************************************************  WAITDC1ƒEQU„*ŠMOVE.L�#10,D1�LOOP�COUNT+ŠLEA„WAITDRTN-A(A6),A0‚EVENT�RETURN�ADDRESSŠMOVE.L�IOS1+24-A(A6),-(A7)5ŠMOVE.L�A0,IOS1+24-A(A6)ƒSET�NEW�EVENT�RETURN�ADDRESSŠLEA„BUFF1S-A(A6),A1 ŠMOVE.L�A1,A2*ŠADD.L‚#1,A2ŽSET�UP�FOR�TWO�CHARACTER�READŠLEA„IOS1-A(A6),A0;ŠMOVE.L�#$0001022A,(A0)„READ,SVC�ADDR,NO�ECHO,IMAGE,PROCEEDŠBSR„IOPŠMOVE.L�(A7)+,IOS1+24-A(A6) 0WAITD05ƒCMP.B‚#$FF,IOS1+4-A(A6)‚IS�THE�I/O�DONE?ŠBNE.S‚WAITDRTS‹BRANCH�IF�YES(ŠSUB.L‚#1,D1ŽNO�-�DECREMENT�WAIT�COUNTER1ŠBMI.S‚WAITD08ŒBRANCH�IF�WE'VE�WAITED�LONG�ENOUGH&ŠMOVE.L�#DELAY,D0ŠWAIT�FOR�2/10�SECONDŠMOVE.L�#200,A0ŠTRAPƒ#1-ŠBRA.S‚WAITD05ŒGO�BACK�AND�CHECK�FOR�I/O�DONE WAITD08ƒBSR„HALT1ŽHALT�THE�I/O'ŠBNE.S‚WAITDRTS‹BRANCH�IF�NO�I/O�HALTED,ŠSUB.W‚#1,IOS1H+28-A(A6)‚ADJUST�SYNC�COUNTER WAITDRTS‚RTS !WAITDRTN‚BSR„ASQREADŒDUMMY�RETURN+ŠMOVE.L�#WTEVNT,D0‰JUST�READ�EVENT�AND�WAITŠTRAPƒ#1 ŠPAGE >**************************************************************/*�EDITMOV1�MOVES�DATA�THAT�HAS�JUST�BEEN�READ�*2*ƒFROM�THE�HOST�INTO�A�WORKING�BUFFER�POINTED�AT‹*+*ƒBY�A3.‚PARITY�BIT�(BIT�7)�IS�MASKED�OFF‘**ƒTHE�NUMBER�OF�CHARACTERS¡*'*ƒACTUALLY�MOVED�IS�SAVED�IN�TERMLGH.–*6*ƒONLY�DATA�IN�THE�RANGE�$20-$7E�INCLUSIVE�IS�MOVED.‡*2*ƒIF�A�CARRIAGE�RETURN�IS�ENCOUNTERED�BEFORE�ANY‹*9*ƒOTHER�DATA,�A�BLANK�IS�MOVED�IN�PLACE�OF�THE�CARRIAGE„*6*ƒRETURN.‚IF�A�LINE�FEED�IS�ENCOUNTERED�IN�THE�DATA,†*5*ƒALL�MOVEMENT�UP�TO�AND�INCLUDING�THE�LINE�FEED�ISˆ*7*ƒSCRUBBED�AND�ONLY�THE�PORTION�OF�THE�LINE�FOLLOWING†*4*ƒIS�MOVED.‚THE�BUFFER�BOUNDARIES�FOR�EDITMOV1�AREˆ***ƒIMPLIED�FROM�THE�IOS1�PARAMETER�BLOCK.“*>**************************************************************  EDITMOV1‚EQU„*ŠMOVEM.L�A1-A4/D0,-(A7)0ŠMOVE.L�IOS1+12-A(A6),A1ƒSTART�ADDRESS�FROM�HOST ŠMOVE.L�A1,A2ŠADD.L‚IOS1+20-A(A6),A2ŠSUB.L‚#1,A2ŽEND�ADDRESS�IN�A2 ŠMOVE.L�A3,A4 EDMV2…CMP.L‚A2,A1"ŠBHI.S‚EDMV4ŽBRANCH�IF�DONE�MOVING%ŠMOVE.B�(A1)+,D0‹CHARACTER�TO�EXAMINE"ŠAND.B‚#$7F,D0ŒMASK�OFF�PARITY�BIT ŠCMP.L‚A3,A4.ŠBNE.S‚EDMV3ŽBRANCH�IF�AT�LEAST�ONE�CHAR�MOVED)ŠCMP.B‚#$0D,D0ŒIS�THIS�A�CARRIAGE�RETURN?ŠBNE.S‚EDMV3ŽBRANCH�IF�NO4ŠMOVE.B�#$20,D0ŒSUBSTITUTE�BLANK�FOR�CARRIAGE�RETURN$ŠBRA.S‚EDMV5ŽFORCE�MOVEMENT�OF�BLANK &EDMV3…CMP.B‚#$0A,D0ŒIS�IT�A�LINE�FEED?+ŠBNE.S‚EDMV8ŽBRANCH�IF�NO�-�NORMAL�MOVEMENT'ŠMOVE.L�A4,A3ŽRESET�DESTINATION�POINTER(ŠBRA„EDMV2ŽCONTINUE�WITH�NORMAL�MOVEMENT EDMV8…CMP.B‚#$20,D0 ŠBLO.S‚EDMV2ŽBRANCH�ON�NON-ASCIIŠCMP.B‚#$7F,D0ŠBHS.S‚EDMV2ŽBRANCH�NON�ASCII -EDMV5…MOVE.B�D0,(A3)+‹MOVE�IN�ASCII�CHARACTER ŠBRA.S‚EDMV2 EDMV4…SUB.L‚A4,A38ŠMOVE.L�A3,TERMLGH-A(A6)ƒSAVE�NUMBER�OF�CHARACTERS�MOVEDŠMOVEM.L�(A7)+,A1-A4/D0ŠRTSŠPAGE 8****3 ****************************************************/*�EDITMOV2�MOVES�DATA�THAT�HAS�JUST�BEEN�READŠ*2*ƒVIA�IOS4�PARAMETER�BLOCK�TO�A�LOCATION�POINTED…*1*ƒTO�BY�A3.‚NUMBER�OF�CHARACTERS�ACTUALLY�MOVED…*4*ƒIS�RETURNED�IN�TERMLGH.‚THE�DATA�IS�EDITED�AS�IT‚*1*ƒIS�MOVED�IN�THE�FOLLOWING�WAY:‚ALL�CHARACTERS…*1*ƒTHAT�DO�NOT�FALL�IN�THE�CODE�RANGE�OF�$20-$7E†*2*ƒINCLUSIVE�(NON�PRINTABLE�ASCII�CHARACTERS)�ARE…*.*ƒCONVERTED�TO�BLANK�(CODE�$20).‚IN�ADDITIONˆ*5*ƒIF�COMOPT�CONTAINS�A�'B'�(OBTAINED�FROM�PREAMBLE)‚*6*ƒANY�LOWER�CASE�LETTERS�ARE�CONVERTED�TO�UPPER�CASE.*5*ƒCHARACTER�COMPRESSION�PACKET�IS�MOVED�IN�PLACE�OF‚*2*ƒANY�REPETITION�OF�4�OR�MORE�LIKE�CHARACTERS�IS…*%*ƒREPLACED�BY�A�COMPRESSION�PACKET.’*8********************************************************  EDITMOV2‚MOVEM.L�A1-A4,-(A7)*ŠMOVE.L�IOS4+12-A(A6),A1ƒMOVE�FROM�ADDRESS ŠMOVE.L�A1,A2ŠADD.L‚IOS4+20-A(A6),A2ŠSUB.L‚#1,A2ŽEND�ADDRESS�IN�A2 ŠMOVE.L�A3,A4 EDMV222ƒCMP.L‚A2,A1$ŠBHI.S‚EDMV299ŒBRANCH�IF�DONE�MOVINGŠBSR.S‚GETC�GET�NEXT�CHARACTER+ŠMOVE.B�D0,D2ŽSAVE�CHARACTER�FOR�COMPARISON*ŠMOVE.L�#1,D3ŽCOUNT�OF�MATCHING�CHARACTERS -EDMV250ƒCMP.L‚A2,A1ŽHAVE�WE�FETCHED�THE�LAST?ŠBHI.S‚EDMV262ŒBRANCH�IF�YES ŠCMP.L‚#35,D34ŠBEQ.S‚EDMV262ŒBRANCH�ON�MAX�SIZE�COMPRESSION�PACKET ŠBSR.S‚GETC ŠCMP.B‚D0,D2+ŠBNE.S‚EDMV260ŒBRANCH�ON�NO�CHARACTER�MATCH.ŠADD.L‚#1,D3ŽBUMP�COUNT�OF�MATCHING�CHARACTERSŠBRA.S‚EDMV250 7EDMV260ƒSUB.L‚#1,A1ŽPOINT�A1�TO�NEXT�CHARACTER�TO�FETCH4EDMV262ƒCMP.L‚#3,D3ŽDO�WE�NEED�A�COMPRESSION�PACKET?ŠBHI.S‚EDMV268ŒBRANCH�IF�YESŠCMP.B‚#'|',D25ŠBEQ.S‚EDMV268Œ'|'�ALWAYS�REQUIRES�COMPRESSION�PACKET ?EDMV264ƒMOVE.B�D2,(A3)+‹NO�COMPRESSION�SO�PLUG�IN�RAW�CHARACTER ŠSUB.L‚#1,D3ŠBNE.S‚EDMV264ŒKEEP�PLUGGINGŠBRA.S‚EDMV222 6EDMV268ƒMOVE.B�#'|',(A3)+‰PLUG�IN�COMPRESSION�SENTINEL-ŠMOVE.B�D2,(A3)+‹PLUG�IN�COMPRESSED�CHARACTER.ŠADD.B‚#'0',D3ŒCONVERT�D3�TO�ASCII�LENGTH�CODEŠCMP.B‚#'9',D3'ŠBLS.S‚EDMV272ŒBRANCH�IF�IN�RANGE�0�-�9-ŠADD.B‚#7,D3ŽCONVERT�IN�RANGE�10�-�35�(A�-�Z) +EDMV272ƒMOVE.B�D3,(A3)+‹PLUG�IN�LENGTH�CODEŠBRA.S‚EDMV222 EDMV299ƒSUB.L‚A4,A38ŠMOVE.L�A3,TERMLGH-A(A6)ƒSAVE�NUMBER�OF�CHARACTERS�MOVEDŠMOVEM.L�(A7)+,A1-A4ŠRTS *GETC†MOVE.B�(A1)+,D0‹CHARACTER�IN�QUESTIONŠCMP.B‚#'�',D0+ŠBLO.S‚GETC23�BRANCH�IF�NOT�PRINTABLE�ASCIIŠCMP.B‚#$7F,D0'ŠBLO.S‚GETC24�BRANCH�IF�PRINTABLE�ASCII 3GETC23„MOVE.B�#'�',D0ŒCHANGE�NON�PRINTABLE�TO�BLANK#ŠBRA.S‚GETCRTSŒGO�PLUG�IN�CHARACTER *�ASCDBIN�CONVERTS�ASCII�DECIMAL�TO�BINARY.�INPUT�POINTED�ATƒ*1*ƒBY�A1,�NUMBER�OF�CHARS�IN�D1.‚RESULT�RETURNED�*3*ƒIN�D0.‚LEADING�BLANKS�TREATED�AS�LEADING�ZEROS.‹*1*ƒSCAN�TERMINATES�AT�END�OF�FIELD�OR�UPON�FIRSTŽ*0*ƒNONNUMERIC�CHARACTER�ENCOUNTERED�AFTER�FIRST�**ƒNUMERIC�CHARACTER.©*@****************************************************************  ASCDBINƒEQU„*ŠCLR.L‚D0‘RETURN�VALUEASCDB2„BSR.S‚ASCDB200ŠBRA.S‚ASCDB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCDB2�BRANCH�ON�BLANK ASCDB4„MOVE.L�D0,-(A7) ŠLSL.L‚#3,D0ŠADD.L‚(A7),D0ŠADD.L‚(A7)+,D0‹*10ŠADD.L‚D2,D0ŽADD�IN�NEW�DIGITŠBSR.S‚ASCDB200ŠBRA.S‚ASCDB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCDB12ŒBRANCH�ON�BLANKŠBRA.S‚ASCDB4�BRANCH�ON�NUMERICASCDB12ƒRTS—MAIN�RETURN ASCDB20ƒSUB.L‚#1,D1,ŠBPL.S‚ASCDB22ŒBRANCH�IF�NOT�DONE�WITH�FIELD6ŠLEA„4(A7),A7‹BYPASS�RETURN�ADDRESS�ON�DONE�WITH�FIELD(ŠBRA.S‚ASCDB12ŒDONE�WITH�FIELD�SO�RETURN ASCDB22ƒCLR.L‚D2#ŠCMP.B‚#'�',(A1)ŠCLASSIFY�CHARACTERŠBEQ.S‚ASCDB24ŒBRANCH�ON�BLANKŠCMP.B‚#'0',(A1)$ŠBLO.S‚ASCDB30ŒBRANCH�ON�NON-NUMERICŠCMP.B‚#'9',(A1)$ŠBHI.S‚ASCDB30ŒBRANCH�ON�NON-NUMERICŠADD.L‚#2,(A7) ASCDB24ƒADD.L‚#2,(A7)"ASCDB30ƒMOVE.B�(A1)+,D2‹ADVANCE�A1ŠSUB.B‚#'0',D2ŒBINARY�TO�D2ŠRTSŠPAGE  ;***********************************************************:*�ASCHBIN�CONVERTS�ASCII�HEX�TO�BINARY.‚INPUT�POINTED�AT�*1*ƒBY�A1,�NUMBER�OF�CHARS�IN�D1.‚RESULT�RETURNEDˆ*3*ƒIN�D0.‚LEADING�BLANKS�TREATED�AS�LEADING�ZEROS.†*1*ƒSCAN�TERMINATES�AT�END�OF�FIELD�OR�UPON�FIRST‰*5*ƒNON�HEX�NUMERIC�CHARACTER�ENCOUNTERED�AFTER�FIRST…**ƒHEX�NUMERIC�CHARACTER¡*;*********************************************************** ASCHBINƒEQU„*ŠCLR.L‚D0‘RETURN�VALUEASCHB2„BSR.S‚ASCHB200ŠBRA.S‚ASCHB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCHB2�BRANCH�ON�BLANK ASCHB4„LSL.L‚#4,D0Ž*16ŠADD.B‚D2,D0ŽADD�IN�NEW�DIGITŠBSR.S‚ASCHB200ŠBRA.S‚ASCHB12ŒBRANCH�ON�NON-NUMERIC�&�NON-BLANKŠBRA.S‚ASCHB12ŒBRANCH�ON�BLANKŠBRA.S‚ASCHB4�BRANCH�ON�NUMERICASCHB12ƒRTS—MAIN�RETURN  ASCHB20ƒSUB.L‚#1,D1,ŠBPL.S‚ASCHB22ŒBRANCH�IF�NOT�DONE�WITH�FIELD6ŠLEA„4(A7),A7‹BYPASS�RETURN�ADDRESS�ON�DONE�WITH�FIELD(ŠBRA.S‚ASCHB12ŒDONE�WITH�FIELD�SO�RETURN ASCHB22ƒCLR.L‚D2#ŠCMP.B‚#'�',(A1)ŠCLASSIFY�CHARACTERŠBEQ.S‚ASCHB24ŒBRANCH�ON�BLANKŠCMP.B‚#'0',(A1)$ŠBLO.S‚ASCHB30ŒBRANCH�ON�NON-NUMERICŠCMP.B‚#'9',(A1) ŠBLS.S‚ASCHB23ŒBRANCH�IF�NUMERICŠCMP.B‚#'A',(A1) ŠBLO.S‚ASCHB30ŒBRANCH�IF�NOT�HEXŠCMP.B‚#'F',(A1) ŠBHI.S‚ASCHB30ŒBRANCH�IF�NOT�HEXŠSUB.B‚#7,D2ŽCORRECTION�FOR�A-F ASCHB23ƒADD.L‚#2,(A7)ASCHB24ƒADD.L‚#2,(A7)!ASCHB30ƒADD.B‚(A1)+,D2‹ADVANCE�A1ŠSUB.B‚#'0',D2ŒBINARY�TO�D2ŠRTSŠPAGE 9*********************************************************-*‚32�BIT�BINARY�TO�DECIMAL�ASCII�SUBROUTINEŒ**·*.*‚CONVERTS�BINARY�IN�D0�AND�PUTS�ASCII�DIGIT‹***…CHARACTERS�AT�ADDRESS�SPECIFIED�IN�A0.Œ***…LEADING�ZEROS�ARE�CONVERTED�TO�SPACES.Œ*-*…THE�FIELD�LENGTH�(NO.�CHARS)�IS�SPECIFIED‰*"*…IN�D1�IN�THE�CALLING�SEQUENCE.”**·**‚CALLING�SEQUENCE:¤*#*…MOVE.L�,�D0“**…MOVE.L�,D1š*3*…MOVE.L�,A0ƒ**…BSR�BINDASC§**·* *‚RETURNS:­**…D0�=�0�=>GOOD�CONVERSIONš**·**‚REGS�USED:‚0�1�2�3�4�5�6�7š* *ŠDƒ*�P�P¤* *ŠAƒP�P¦*9*********************************************************  !BINDASCƒMOVEM.L�D1/D2/A0/A1,-(A7)ŠMOVE.L�#8,D2ŽMAX�NO.�DIGI4 TSŠSUB.L‚D1,D2ŽNO.�DIGITS�TO�SKIP!ŠBMI.S‚BINDASC5‹BRANCH�ERROR�EXITŠLSL.L‚#2,D2ŽDOUBLE�WORD�LENGTH!ŠLEA„TENS-A(A6),A1†START�OF�TABLE"ŠADD.L‚D2,A1ŽADJUST�FOR�DIFFERENCE&ŠMOVE.W�#'‚',D2‹INITIALIZE�ACCUMULATOR %BINDASC1‚SUB.L‚(A1),D0ŒSUBTRACT�10**NŠBCS.S‚BINDASC2‹BRANCH�TOO�BIG*ŠADD.W‚#1,D2ŽINCREMENT�CURRENT�DIGIT�COUNTŠBRA„BINDASC1‹CONTINUE )BINDASC2‚ADD.L‚(A1)+,D0‹RESTORE,�ADV�PNTRŠTST.L‚(A1)�TEST�DONEŠBEQ.S‚BINDASC4‹BRANCH�DONE ŠCMP.W‚#'‚',D2‹LEADING�ZERO�TEST!ŠBEQ.S‚BINDASC3‹BRANCH�STILL�ZERO#ŠADD.B‚#$10,D2ŒBRING�TO�ASCII�DIGIT %BINDASC3‚MOVE.B�D2,(A0)+‹DEPOSIT�CHARŠLSL„#8,D2ŽSAVE�CHAR�DEPOSITED#ŠMOVE.B�#$20,D2ŒRESTORE�LS�TO�SPACEŠBRA„BINDASC1‹CONTINUE 4BINDASC4‚ADD.B‚#$10,D2ŒLAST�ONE�BECOMES�DIGIT�ALWAYS"ŠMOVE.B�D2,(A0)+‹DEPOSIT�LAST�CHAR'ŠTST.L‚D0‘SET�CONDITION�CODE,�0�IF�GOOD"BINDASC5‚MOVEM.L�(A7)+,D1/D2/A0/A1ŠRTS  7TENS†DC.Lƒ10000000,1000000,100000,10000,1000,100,10,1,0 ŠPAGE .**********************************************&*�XFRABORT�TESTS�CONDITION�CODES.‚IFˆ*$*ƒEQUAL,�RTS�IS�MADE.‚IF�NOT�EQUALˆ*$*ƒBSR�ADDRESS�FROM�STACK�IS�PLACED‰*(*ƒINTO�A0�AND�SELF�ABORT�IS�PERFORMED.…*.* XABORT ENTRY POINT UNCONDITIONALLY ABORTS. *.**********************************************  XFRABORT‚BEQ.S‚ABORTS)XABORT„MOVE.L�D0,-(A7)‹SAVE�D0�FOR�A�LOOKŠMOVE.L�#ABORT,D0ŠTRAPƒ#1 ABORTS„RTS PATCH…DS.Bƒ50‘PATCH�AREAŠEND„XFRéééééé=/* =/*†ULOAD.LF=/*&=/* Link chain file to create ULOAD.LO=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to ULOAD.LL=/*=/IFC \1ƒ=ARG�ULOAD.LL=/ENDIF=/*=LINK ,ULOAD.LO,\1;HAMIX ATTRIBUTES PINPUT ULOAD.ROLIB 0.&.PASVMDOS.ROLIB 0.&.PASCALIB.ROEND=/*=ENDéé4 éééé„=/* =/*†ULOAD.PF=/*M=/* Chain file to compile ULOAD which is associated with the TRANSFER utility=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to ULOAD.PL=/*@=/* NOTE: this chain file requires the pascal compiler reside on9=/*‡the�system�default.�The�compiler�is�not�provided�with7=/*‡this�product,�therefore�this�chain�file�will�abort.=/*=/IFC \1ƒ=ARG�ULOAD.PL=/ENDIF=/*=PASCAL ULOAD.SA,ULOAD.PC,\1=/*{ Included files are:=/*ƒ--�none�--=/*}=PASCAL2 ULOAD.PC,ULOAD.RO;-L=/*=ENDééééé�$PROGRAM UPLOAD(INPUT,OUTPUT,OUTFIL); E(*******************************************************************)C(*�THIS�PROGRAM�READS�PACKED�BLOCKS�FROM�THE�TERMINAL,�SEPARATESƒ*)?(*�INDIVUDUAL�RECORDS�AND�WRITES�THEM�TO�AN�OUTPUT�FILE.‚THE†*))(*�PROGRAM�RUNS�ON�AN�EXORMACS�SYSTEM.�*)E(*******************************************************************) "CONST�CMAX‚=‚132;Š(*�BLOCK�SIZE�*)&†RMAX‚=‚132;Š(*�MAXIMUM�RECORD�SIZE�*)5†BLKCNT=‚1;Œ(*�NUMBER�OF�BLOCKS�UNDER�ONE�CHECKSUM�*),†BMAX‚=‚5 132;Š(*�BUFFER�SIZE�=�BLKCNT*CMAX�*)/†OPTION�=�'AA';‰(*�COM/CHAR�PROTOCOL�OPTIONS�*),†CHRMAX�=�127;Š(*�MAXIMUM�CHARACTER�VALUE�*) TYPE‚CINDEXƒ=‚0..255;$†RECTYPE‚=‚ARRAY(.1..RMAX.)�OF�CHAR;*†BFTYPEƒ=‚PACKED�ARRAY(.1..BMAX.)�OF�CHAR;†BFINDEX‚=‚INTEGER;*†BKTYPEƒ=‚PACKED�ARRAY(.1..CMAX.)�OF�CHAR; VARƒQ…:‚BOOLEAN; †OUTFIL:‚TEXT;–(*�OUTPUT�FILE�*)D†ASCII�:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ASCII�CHARACTER�CODES�*)@†ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;„(*�FOR�HEX�CONVERSION�*)–›Ÿ+£7§.«E†NUMƒ:‚PACKED�ARRAY(.CHAR.)�OF�CINDEX;ƒ(*�ACCII-DECIMAL�CONVERSION�*))†RECƒ:‚RECTYPE;“(*�HOLDS�OUTPUT�RECORD�*)1†BUFFP�:‚BFINDEX;“(*�INDEX�INTO�HOLDING�BUFFER�*)$†BUFF‚:‚BFTYPE;”(*�HOLDING�BUFFER�*)3†COUNT�:‚INTEGER;“(*�HOLDS�CHAR�COUNT�FOR�RECORD�*)/†RESPONSE:�CHAR;•(*�HOLDS�RESPONSE�CHARACTER�*)4†BCNT‚:‚INTEGER;“(*�NUMBER�OF�REPEATED�CHARACTERS�*)&†BCHR‚:‚CHAR;–(*�REPEATED�CHARACTER�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; ŒCˆ:‚CHAR; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO‰BEGIN9‰ASCII(.CHR(I).)�:=�0;‰(*�INDICATE�NON-ASCII�CHARCTERS�*)‰NUM(.CHR(I).)�:=�0‰END;†REWRITE(OUTFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno');†FOR�I�:=�1�TO�36�DO‰NUM(.ASHEX(.I.).)�:=�I�-�1;†BUFFP�:=�BLKCNT*CMAX+1;†BUFF(.3.)�:=�'A';/†WRITE(OUTPUT,'PREAMBLEU');‰(*�SEND�PREAMBLE�*)(†WRITE(OUTPUT,OPTION);Ž(*�SEND�OPTION�*),†WRITE(OUTPUT,CMAX:3);Ž(*�SEND�BLOCK�SIZE�*)1†WRITELN(OUTPUT,BLKCNT:1);Š(*�SEND�BLOCK�COUNT�*)†RESPONSE�:=�'�';†END;‚(*�INITIALIZE�*)  .PROCEDURE GETREC(VAR Q:BOOLEAN; VAR P:BFINDEX;6“VAR�BUFF:BFTYPE;�VAR�REC:RECTYPE;�VAR�RESPONSE:CHAR); VARƒI,Jƒ:‚INTEGER;†C1,C2�:‚CHAR; GƒPROCEDURE�GETFRAME(VAR�BUFF:BFTYPE;�VAR�Q:BOOLEAN;�VAR�RESPONSE:CHAR);  ƒVARƒI…:‚INTEGER; ‰J…:‚INTEGER; ‰K…:‚INTEGER;‰CKSUM1:‚INTEGER;‰CKSUM2:‚INTEGER;‰TBLOCK:‚BKTYPE; †BEGIN�(*�GETFRAME�*) †IF�BUFF(.3.)�=�'Z'†THEN ‰Q�:=�TRUE; †IF�NOT�Q†THEN‰REPEATŒI�:=�1;ŒJ�:=�1;ŒIF�RESPONSE�<>�'�';ŒTHEN�WRITELN(OUTPUT,RESPONSE);�(*�RESPOND�TO�LAST�FRAME�*)ŒWHILE�J�<=�BLKCNT�DO�BEGIN�READLN(INPUT,TBLOCK); �J�:=�J�+�1;�FOR�K�:=�1�TO�CMAX�DO’BEGIN’BUFF(.I.)�:=�TBLOCK(.K.); ’I�:=�I�+�1;’END;�IF�BUFF(.1.)�=�'T'�THEN*’J�:=�BLKCNT�+�1;‚(*�FORCED�TERMINATION�*)�END;ŒQ�:=�BUFF(.1.)�=�'T'; ŒIF�NOT�QŒTHEN�BEGIN�RESPONSE�:=�'N';2�CKSUM1�:=�16*NUM(.BUFF(.1.).)�+�NUM(.BUFF(.2.).);�IF�CKSUM1�<>�0�THEN’BEGIN ’CKSUM2�:=�0;’FOR�I�:=�3�TO�BLKCNT*CMAX�DO%•CKSUM2�:=�CKSUM2+ASCII(.BUFF(.I.).); ’CKSUM2�:=�(CKSUM2�MOD�255)�+�1;’IF�CKSUM1�<>�CKSUM2’THEN•RESPONSE�:=�'R'Œ(*�NAK�*)’END;�(*THEN*) �END�(*THEN*)‰UNTIL�(RESPONSE�=�'N')�OR�(Q)†END;�(*�GETFRAME�*)  ;ƒPROCEDURE�GETC(VAR�C:CHAR;�VAR�BUFF:BFTYPE;�VAR�P:BFINDEX;•VAR�Q:BOOLEAN); †BEGIN�(*GETC*)†IF�P�<=�BLKCNT*CMAX†THEN‰BEGIN‰C�:=�BUFF(.P.); ‰P�:=�P�+�1‰END†ELSE‰BEGIN‰GETFRAME(BUFF,Q,RESPONSE);‰C�:=�BUFF(.4.);‰P�:=�5‰END†END;�(*GETC*)  ƒBEGIN�(*�GETREC�*)2ƒGETC(C1,BUFF,P,Q);‹(*�DIGIT�#1�OF�LENGTH�FIELD�*)2ƒGETC(C2,BUFF,P,Q);‹(*�DIGIT�#2�OF�LENGTH�FIELD�*)ƒIF�C1�=�'�'�THEN�Q�:=�TRUE; ƒIF�NOT�QƒTHEN†BEGIN#†COUNT�:=�NUM(.C1.)*16�+�NUM(.C2.);†J�:=�1;†I�:=�1;†WHILE�I�<=�5 COUNT�DO‰BEGIN‰GETC(REC(.J.),BUFF,P,Q);‰IF�REC(.J.)�=�'|'‰THENŒBEGIN4ŒGETC(BCHR,BUFF,P,Q);„(*�GET�COMPRESSED�CHARACTER�*)(ŒGETC(C1,BUFF,P,Q);†(*�GET�COUNT�CODE�*)8ŒBCNT�:=�NUM(.C1.);†(*�COUNT�OF�COMPRESSED�CHARACTERS�*)ŒWHILE�BCNT�>�0�DO�BEGIN5�REC(.J.)�:=�BCHR;„(*�EXPAND�COMPRESSED�CHARACTERS�*)�BCNT�:=�BCNT�-�1; �J�:=�J�+�1�END;%ŒI�:=�I�+�3Ž(*�ADVANCE�GET�COUNTER�*) ŒENDƒ(*THEN*)‰ELSEŒBEGIN&ŒI�:=�I�+�1;�(*�ADVANCE�GET�COUNTER�*)&ŒJ�:=�J�+�1;�(*�ADVANCE�PUT�POINTER�*) ŒENDƒ(*ELSE*)‰END;‚(*WHILE*)†COUNT�:=�J�-�1;†END‚(*�THEN�*)ƒEND;�(*�GETREC�*)  5PROCEDURE PUTREC(VAR COUNT:INTEGER; VAR REC:RECTYPE); ƒVARƒI‚:‚INTEGER; ƒBEGIN�(*�PUTREC�*)ƒI�:=�1;ƒWHILE�I�<=�COUNT�DO†BEGIN†WRITE(OUTFIL,REC(.I.)); †I�:=�I+1†END;ƒWRITELN(OUTFIL);ƒEND;�(*�PUTREC�*) BEGIN„(*�MAIN�*) INITIALIZE; Q := FALSE;"GETREC(Q,BUFFP,BUFF,REC,RESPONSE);WHILE NOT Q DOƒBEGINƒPUTREC(COUNT,REC);#ƒGETREC(Q,BUFFP,BUFF,REC,RESPONSE);ƒEND;,WRITELN(OUTPUT,'T')�(*�TERMINATE�WITH�'T'�*)END.…(*�MAIN�*)éé' UPLOADS AF»»rrUPLOADS LFÄÄrrUPLOADS SAÍÍW‚rrUTILIB AF&&WrrVALID AF//rrVALID LF88rrVALID SAAA¨rrDISPATCHNWZZrrDLOADFORSA__(rrE NW||?IrrERRORMSGSA½½Ý€rrREPAIR NWž �B rrSYMBUG NW è è 'rrLOADFORSA õ õBrr=/*=/*†UPLOADS.AF=/**=/* Chain file to assemble UPLOADS utility=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to UPLOADS.LS=/*=/IFC \1ƒ=ARG�UPLOADS.LS=/ENDIF=/*+=ASM UPLOADS.SA,UPLOADS.RO,TEMP1.LS;-WRZ=56=/*{ Included files are:=/*ƒ9995.&.UPLOADS.MC=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Y=/*;=ASM UPLOADS.EDTSREC.SA,UPLOADS.EDTSREC.RO,TEMP1.LS;-WRZ=46=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Aƒ=COPY�TEMP2.LS,\1;Yƒ=DEL�TEMP1.LSƒ=DEL�TEMP2.LS=/*=ENDéé6 ééé³=/*=/*†UPLOADS.LF=/*(=/* Link chain file to create UPLOADS.LO=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to UPLOADS.LL=/*=/IFC \1ƒ=ARG�UPLOADS.LL=/ENDIF=/*=LINK ,UPLOADS.LO,\1;HAMIX ATTRIBUTES PSEG SEG0:0-14 $0INPUT 0.&.UTILIB.ROINPUT UPLOADS.ROINPUT UPLOADS.EDTSREC.ROEND=/*=ENDééééé鼉NOLIST INCLUDE 9995.&.UPLOADS.MC‰LIST!‰TTL‡RECEIVE�"S"�RECORDS�VIA�MCCM‰OPT‡MEX,CRE,AO*******************************************************************************O*******************************************************************************O******************************************************************************** *ˆUPLOADS**ˆDate†Revision‚Description*ˆ----†--------‚-----------;*ˆ11/08/84‚1,1‡Enhanced�and�fixed�UPLOADS�Utility�according.*œto�SPR�#1138.‚Code�was�added�to�recognize�S3-*œand�S7�records.‚In�addition,�code�was�added+*œto�recognize�S7,�S8�and�S9�as�termination,*œrecords.‚Version�1.0�only�terminated�on�S9 *œrecords.*?*ˆ12/20/84‚2,0‡Modified�program�to�make�it�position�independent*O******6 *************************************************************************O*******************************************************************************O*******************************************************************************  PAGE5UPLOADS‚IDNT†2,0‡Accept�"S"�records�and�write�to�disk SPC 2 *ˆPARAMETER�BLOCK�SYMBOL�EQUATES SPC 1#PUBRW„EQU‡$0004…Public�-�Read/WritePUBR…EQU‡$0ˆPublic�-�Read#EREW…EQU‡$0007…Exclusive�Read/WriteSSEG…EQU‡$20‡Shared�segment#SEQ†EQU‡$100†Sequential�access�fileEOF†EQU‡$C2‡IOS�"End�of�file"#NOFILEƒEQU‡$17‡FHS�"File�not�found" SPC 3************************* EXORterm 155 Equates *************************NL‡EQU‡$00‡CRT�Null�characterLF‡EQU‡$0A‡CRT�line�feedCR‡EQU‡$0D‡CRT�carriage�return(SV‡EQU‡$E3‡CRT�set�reverse�video�(field)*RV‡EQU‡$E2‡CRT�reset�reverse�video�(field))MC‡EQU‡$C4‡CRT�move�cursor�right�1�columnND‡EQU‡$E8‡CRT�set�non-display SPC 3.CAPS…EQU‡$DF‡Mask�for�lower�case�to�upper�caseOUTOP1ƒEQU‡EREW+SEQ*REGULAR‚EQU‡$0000…Access�/�Position�-�NEXT)PRIOR„EQU‡$4000…Access�/�Position�-�PRIOR-CURRENT‚EQU‡$2000…Access�/�Position�-�CURRENT LOGOPTƒEQU‡0LOGIMAGE�EQU‡8 LOGFMTƒEQU‡0 SPC 2 PBA†EQU‡*‰DCB.L…63,0†User�task�stackMYSTACK‚DC.L†0‰* PAGEÅ?ÎCÖ8Þ6æ6î5ö.þ8;<K*********************�INPUT‚file�area�********************* SPC 1#MCCMAREA�DS.L†0‰Input�area�for�MCCM‰DCB.B…80,$0…Start�of�bufferMCCMEND‚EQU‡*-1‡Endƒof�buffer SPC 2********************* OUTPUT file area ********************* SPC 1%SRECORD‚DS.L†0‰I/O�area�for�DISK�file‰DCB.B…80,$0…Start�of�bufferSRECEND‚EQU‡*-1‡Endƒof�buffer SPC 2+*******************************************)*�Teminator�Record�(S7/S8/S9)‚HOLD‚area�*+******************************************* SPC 1@S9HOLDƒDS.L†0‰Save�area�for�last�S7/S8/S9-Record�(Only�one/file)‰DCB.B…80,$0…Start�of�bufferS9LL…DS.L†0‰Length�of�record SPC 2:**********************************************************:* Area where the COMMAND LINE is passed to the user task *:********************************************************** SPC 1COMLINE‚DS.L†0‰COMLINEƒ160‡User�command�line PAGE*********************** Register save area ***********************‰REGS.E„  PAGE&**************************************&* Parameter blocks for "OUTPUT" file *&************************************** SPC 1‰FHSPB…OUT,1,,,,,MX,,80,OUTOP1 %‰IOSPB…OUT,1,REGULAR,,SRECORD,SRECEND PAGE"**********************************"* PARAMETER BLOCK FOR "LOG" FILE *"********************************** SPC 1‰IOSPB…LOG,5,LOGIMAGE SPC 2**************************************************************>* Edit the COMLINE for optional parameters to be substituted *>************************************************************** SPC 1$START2ƒDSˆ0“*�MOVE�IN�THE�DEFAULTS�*/‰MOVE.L„D2,LONGWORK-PBA(A4)ˆD2�=�DEFAULT�volume‰XFER.B„LONGWORK,OUTVOL,#4 SPC 13‰MOVE.W„D3,OUTUSER-PBA(A4)ŠD3�=�DEFAULT�user�number SPC 1>‰MOVE.L„D4,LONGWORK-PBA(A4)…D4�=�DEFAULT�catalog�(1st�4�bytes)@‰MOVE.L„D5,LONGWORK+4-PBA(A4)ƒD5�=�DEFAULT�catalog�(2nd�4�bytes)‰XFER.B„LONGWORK,OUTCAT,#8 SPC 3(‰DSˆ0“*�MOVE�IN�ANY�PARAMETERS�ENTERED�*+‰LEA‡COMLINE(PC),A0ŠA0�=�address�of�COMLINE9‰LEA‡OUTFHSPB(PC),A6‰A6�=�S-record�parameter�block�addres8‰JSR‡EDITFILE(PC)ˆMove�file�name�parms�to�FHS�parm�block*‰BMI‡BADCMDLNŒData�moved�to�parm�block�ok? PAGE*************************** Assign the OUTPUT file *************************** SPC 1 START3ƒDSˆ0*‰XFER.B„OUTVOL,MSGVOL,#4…Move�volume�name,+‰XFER.B„OUTCAT,MSGCAT,#8…Move�catalog�name,*‰XFER.B„OUTFILE,MSGFILE,#8ƒMove�file�name,(‰XFER.B„OUTEXT,MSGEXT,#2…Move�extention. SPC 2%*************************************%* Find out if file specified exists *%************************************* SPC 1#‰ASSIGN„OUT‘Does�OUTPUT�file�exist?.‰BEQ‡POSOLDŽYes...Then�position�at�"S9"�record>‰CMP.B…#NOFILE,OUTSTAT-PBA(A4)ƒNo....Then�we�must�allocate�one ‰BNE‡ERROR�* PAGEA*****************************************************************A* File specified by user does not exist so it must be ALLOCATED *A*****************************************************************‰XFER.B„USINGNEW,MSGDISP,#41*‰ALLOCATE‚OUT‘Allocate�requested�file�name‰BEQ.S…ALLOK�* ‰BSR‡ERROR,ALLOK„ASSIGN„OUT‘Now�ASSIGN�the�file�for�use‰BEQ‡SENDHDR�Go�send�the�header ‰BSR‡ERROR PAGEH************************************************************************H* File specified by user exists, so we must position at the terminator *H************************************************************************ SPC 10POSOLDƒDSˆ0“Make�sure�this�is�an�"S"�record�file ‰GET‡OUT‘*!‰BEQ.S…SFILE�Make�sure�I/O�was�ok!‰CMP.B…#EOF,OUTIOSTA-PBA(A4)‡EOF?%‰BEQ.S…NORECSŽYes...�No�data�on�file.‰BSR‡ERROR�No....�Unknown�error SPC 2******************************** There is a file but no data ******************************** SPC 1 NORECSƒXFER.B„NODATA,MSGDISP,#41"‰BRA‡SENDHDR�Tell�user�file�empty. SPC 1.SFILE„ISIT†S0,SRECORDŠ1s7 t�record�must�be�"S0"!‰BEQ.S…SKIPOUT�* SPC 29*********************************************************9* There is a file with data, but they are not S-Records *9********************************************************* SPC 18‰XFER.B„NOTSREC,MSGDISP,#41�Tell�the�user�about�the�file#‰LEA‡HEADER(PC),A5‹Start�of�message#‰LEA‡HEADEEND(PC),A6‰ENDƒof�message0‰MOVEM.LƒA5-A6,LOGIOSOB-PBA(A4)†Set�up�IOS�block‰PUT‡LOG‘Write�msg�to�terminal‰BRA‡EXIT�Return�to�VERSAdos PAGEG***********************************************************************G* Start reading the file looking for S7 or S8 or S9 terminator record *G*********************************************************************** SPC 13SKIPOUT‚GET‡OUT‘Position�at�"S7�or�S8�or�S9"�record$‰BEQ.S…CHKATENDŒMake�sure�I/O�was�ok SPC 1)‰CMP.B…#EOF,OUTIOSTA-PBA(A4)‡End�of�file?3‰BEQ.S…NOS789ŽYes...Then�we�didn't�find�an�S7/S8/S9 ‰BSR‡ERROR�* SPC 1ENOS789ƒXFER.B„NOS9REC,MSGDISP,#41�"NO�S7/S8/S9�but�we�are�positioned"‰BRA‡SENDHDR�* SPC 2)CHKATEND�ISIT†S9,SRECORDŠIs�this�an�"S9"?.‰BEQ.S…POSOK�Yes...We�are�at�the�correct�place!‰ISIT†S8,SRECORDŠIs�this�an�"S8"?.‰BEQ.S…POSOK�Yes...We�are�at�the�correct�place!‰ISIT†S7,SRECORDŠIs�this�an�"S7"?‰BNE.S…SKIPOUT�No....Keep�going PAGE?***************************************************************?* OK, we have the S7, S8 or S9 record, delete it and continue *?***************************************************************0POSOK„DSˆ0“Output�file�is�positioned�at�S7/S8/S9B‰MOVE.W„#CURRENT,OUTIOOPT-PBA(A4)�Chg�access�position�to�"Current":‰MOVE.L„OUTIOSLL-PBA(A4),D0‰D0�=�Length�of�S7/S8/S9�record.‰LEA‡SRECORD-1(PC),A6ˆCalculate�ending�address‰ADD.L…D0,A6�*=‰MOVE.L„A6,OUTIOEOB-PBA(A4)…Move�ending�address�to�parm�block:‰XFER.B„LOWVALUE,SRECORD,D0�Stuff�I/O�area�with�low�values3‰UPDATE„OUT‘Replace�S7/S8/S9�record�with�NULL�chars$‰BEQ.S…OUTREADYŒDid�I/O�complete�OK?‰BSR‡ERROR�No... SPC 1KOUTREADY�MOVE.W„#REGULAR,OUTIOOPT-PBA(A4)�Chg�position�from�CURRENT�to�NEXT‰XFER.B„NORMALS9,MSGDISP,#41 SPC 1J**************************************************************************J* Tell user the status of the file for output and "we're ready for data" *J************************************************************************** SENDHDR‚DSˆ0“Send�header�to�user#‰LEA‡HEADER(PC),A5‹Start�of�message"‰LEA‡HEADEND(PC),A6ŠENDƒof�message0‰MOVEM.LƒA5-A6,LOGIOSOB-PBA(A4)…Set�up�IOS�block‰PUT‡LOG‘Write�msg�to�terminal PAGE6******************************************************6* Read loop waiting for data...Commands or S-Records *6****************************************************** SPC 1 GOREADƒDSˆ0(‰LEA‡MCCMAREA(PC),A5‰Start�of�input�area%‰LEA‡MCCMEND(PC),A6ŠEndƒof�input�area@‰MOVEM.LƒA5-A6,LOGIOSOB-PBA(A4)ƒMove�buffer�address�to�IOS�block SPC 1 READLOOP�DSˆ0$‰GET‡LOG‘Read�and�wait�for�next�data1‰BEQ.S…LOOKREC�Good�status?�yes...�look�at�Record'‰BSR‡ERROR�.Œno....�BUILD�IOS/FHS�Error SPC 2*********************** Is it an S-Record? *********************** SPC 1 LOOKREC‚DSˆ05‰MOVE.L„LOGIOSLL-PBA(A4),D0‰Extract�the�record�length$‰LEA‡MCCMAREA(PC),A0‰A0�=�Input�area SPC 1,EDITLOOP�DSˆ0“Examine�1st�character�for�"LF"2‰LEA‡TABLE(PC),A1Œ*�A1�=�Table�of�valid�characters/‰MOVE.B„(A0),D1�*�D1�=�Character�to�be�examined ‰ADDA†D1,A1�*%‰MOVE.B„(A1),D1�*�FF�=�bad,‚00�=�good$‰BEQ‡MOVEITŽ*�Good?‚yes...keep�going!‰SUB.L…#1,D0�*ˆno...adjust�counts‰ADD.L…#1,A0�*ˆ*"‰BRA‡EDITLOOPŒ*ˆtry�next�character PAGE SPC 2L****************************************************************************@*ˆThis�table�is�used�to�locate�characters�that�are�to�be�deleted>*ˆfrom�the�beginning�of�the�record.�(New�MCCM�firmware�3/1/81)*?*ˆThe�technique�is�similar�to�the�IBM�360/370�"TRT"�instruction*:*ˆ"00"�entry�indicates�that�the�character�is�"ok"�while�an:*ˆ"FF"�entry�indicates�that�the�character�is�to�be�deleted**ˆMACSbug‚1.32‚(68KDM),*ˆMACSbug‚2.2ƒ(EXORmacs),8 *ˆMACSbug‚3.0ƒ(USE�MACSbug)�and$*ˆVERSAbug�1.0ƒ(VERSAmodule�MACSbug)<*ˆall�build�"S-Records"�with�a�CR/LF�following�the�checksum.D*ˆSince�the�new�MCCM�firmware�now�saves�any�data�that�comes�in�afterG*ˆthe�delimiter,�(CR),�and�appends�it�to�the�beginning�of�the�followingF*ˆrecord,�we�will�be�receiving�an�extra�LF�at�the�biginning�of�all�but*ˆthe�first�record�we�receive.*ˆ(Line�feed�=�$0A)*L**************************************************************************** SPC 2‰OPT‡NOCL,NOMC,A;TABLE„TAB.0…00,00,00,00,00,00,00,00,00,00,FF,00,00,00,00,006‰TAB.1…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.2…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.3…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.4…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.5…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.6…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.7…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.8…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.9…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.A…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.B…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.C…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.D…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.E…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,006‰TAB.F…00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 PAGE ‰OPT‡MC,MEX,A MOVEITƒDSˆ03‰MOVE.L„D0,LOGIOSLL-PBA(A4)†Alter�the�record�length0‰XFER.B„(A0),SRECORD,D0‡Move�record�to�work�area*‰LEA‡SRECORD(PC),A5Š*�A5�=�Start�of�Record9‰LEA‡SRECORD-2(PC),A6ˆ*�Set�up�to�calculate�end�of�record@‰ADD.L…LOGIOSLL-PBA(A4),A6�*�A6�=�Start+length-1�(don't�want�CR)6‰MOVEM.LƒA5-A6,OUTIOSOB-PBA(A4)†*�Set�up�IOSPB�for�I/O SPC 1  7‰MOVE.W„SRECORD-PBA(A4),D0‚Examine�1st�two�chars�for�S#‰AND.L…#$0000FFF0,D0‡*‰CMP.W…#'S0',D0Œ*‰BEQ.S…SPROCESSŒ* SPC 2 ******************************** * Check for any valid commands * ******************************** SPC 15‰MOVE.B„SRECORD+1-PBA(A4),D0ˆLook�for�the�commands...2‰AND.B…#CAPS,D0ŒBoth�upper�and�lower�case�commands SPC 2J**************************************************************************J* STATUS... File name and any errors previously detected, (1st 10 chars) *J************************************************************************** SPC 18‰CMP.B…STATUS-PBA(A4),D0ƒWas�the�STATUS�command�entered?!‰BEQ‡STATRTN�Yes...�go�process�it SPC 2A*****************************************************************A* QUIT... There are no more records, (for now?), Close the file *A***************************************************************** SPC 14‰CMP.B…QUIT-PBA(A4),D0…Was�the�QUITƒcommand�entered?!‰BEQ‡QUITRTN�Yes...�go�process�it SPC 2:**********************************************************:* Unsupported commands are ignored, processing continues *:********************************************************** SPC 1‰BRA‡READLOOPŒRead�next�record PAGE************************* Process the S-Record ************************* SPC 1 SPROCESS�DSˆ02‰XREF†VALID�Set�up�external�reference�for�EDIT�RTN ‰JSR‡VALID(PC)‹Validate�S-Record‰BEQ.S…ITISOK�OK?...Yes<‰MOVE.B„D0,RTNCODE+3-PBA(A4)�......No‚Save�reason�for�status‰XFER.W„MCCMAREA,LONGWORK,#5(‰BRA‡READLOOPŒ......„Go�read�next�record SPC 2&**************************************&* Watch for trailer (S7 or S8 or S9) *&************************************** SPC 17ITISOKƒISIT†S9,SRECORDŠCheck�this�record,�S-9?�if�so...6‰BEQ.S…S789ITISŒwrite�only�at�close,�(Only�1�S7/S8/S9) SPC 1(‰ISIT†S8,SRECORDŠCheck�this�record,�S-8?6‰BEQ.S…S789ITISŒwrite�only�at�close,�(Only�1�S7/S8/S9) SPC 1(‰ISIT†S7,SRECORDŠCheck�this�record,�S-7?‰BNE.S…ITSNOTS9 SPC 1ES789ITIS�MOVE.L„LOGIOSLL-PBA(A4),D0‡Save�S7/S8/S9�for�"QUIT"�command.‰MOVE.L„D0,S9LL-PBA(A4)…*‰XFER.B„SRECORD,S9HOLD,D0ƒ*"‰BRA‡READLOOPŒGo�read�next�record. SPC 1-ITSNOTS9�PUT‡OUT‘Write�the�record�out�to8 �disk0‰BEQ‡READLOOPŒGood�status?�yes...�go�to�READLOOP'‰BSR‡ERROR�.Œno....�BUILD�IOS/FHS�Error PAGE******************* Status routine ******************* SPC 1'STATRTN‚DSˆ0“Status�command�entry�point+‰BSR‡DOSTATUSŒ-�Perform�the�STATUS�function*‰BRA‡GOREADŽ-�Then�return�to�the�read�loop SPC 39*********************************************************9* STATUS ROUTINE - Used by the STATUS and QUIT commands *9********************************************************* SPC 15DOSTATUS�DSˆ0“Common�routine�to�examine�status�bufferA‰MOVE.L„RTNCODE-PBA(A4),D0‚Check�return�code�to�see�if�any�errors,‰BEQ.S…NONEWERRŒnone?...�Go�to�NO�NEW�ERRORS SPC 1"‰CLR.L…D1’Build�message�for�STATUS2‰LEA‡VALIDERR(PC),A0‰*�Load�start�of�Message�table)MSGLOOP‚MOVE.B„(A0)+,D1Œ*�Fetch�table�arg*‰BEQ.S…ERRFOUNDŒ*�Unknown�error�exits�here!‰CMP‡D0,D1�*�Find�the�error�code?‰BEQ.S…ERRFOUNDŒ*�...Yes)‰ADD.L…#20,A0Ž*�...Noƒ*Increment�pointer*%‰BRA‡MSGLOOP�*ˆ*Go�try�the�next�one�* SPC 13ERRFOUND�XFER.B„(A0),STERR,#20†*�Move�type�of�error2‰XFER.B„LONGWORK,STDATA,#10�*�Move�S-Record�header1‰MOVE.B„#7,MSGBELL-PBA(A4)‚*�Ring�bell�for�errors PAGE***************************** Move message to I/O area ***************************** SPC 1:NONEWERR�XFER.B„TEXT,MSGDISP,#41„*�Move�text�to�status�msg.‰LEA‡STATMSG(PC),A5Š*�Set�up�IOS�block�for�I/O‰LEA‡HEADEND(PC),A6Š*!‰MOVEM.LƒA5-A6,LOGIOSOB-PBA(A4)‚*‰PUT‡LOG‘*�Send�STATUS�to�user"‰BEQ‡RSETSTATŒGo�clear�last�error. ‰BSR‡ERROR SPC 2****************************** Reset last STATUS message ****************************** SPC 11RSETSTAT�CLR.L…RTNCODE-PBA(A4)…Reset�RETURN�code.'‰MOVE.B„#'�',MSGBELL-PBA(A4)�Clear�bell.‰XFER.B„NOERRORS,STERR,#31ƒClear�data�portion. ‰RTS›Return. PAGE******************** Time to QUIT... ******************** SPC 1 QUITRTN‚DSˆ01‰ISIT.W„S9,S9HOLD‹Do�we�have�a�pending�S9�record?0‰BEQ.S…TERMS789ŒNo...�don't�re-write�last�record 1‰ISIT.W„S8,S9HOLD‹Do�we�have�a�pending�S8�record?0‰BEQ.S…TERMS789ŒNo...�don't�re-write�last�record 1‰ISIT.W„S7,S9HOLD‹Do�we�have�a�pending�S7�record?0‰BNE.S…CLOSEOUTŒNo...�don't�re-write�last�record SPC 1 0 effectively releases the hold. Syntax: >DISPATCH�‰(maximum�8,�a�greater�than­practical�limit)or &DISPATCH¥(restores�the�sysgened�value) KNote:‚This�is�a�non-memory�resident�utility;�therefore�the�entire�filename, ‡DISPATCH,�is�required�mnemonic.ééé; ééR†character�function�ITOA(�INT�) †integer‚INT ‰character„CHARS*352‰dataˆCHARS/'123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'/ ,‰if�(�(INT�.lt.�1)�.or.�(INT�.gt.�35)�)�then ŒITOA�=�'0'‰elseŒITOA�=�CHARS(�INT:INT�)‰end�if †end "†character*2�function�ITOX2(�INT�) †integer„INT ‰character„HEX*16‰integer„INDEX ‰dataˆHEX/'0123456789ABCDEF'/ -‰if�(�(INT�.lt.�0)�.or.�(INT�.gt.�255)�)�then ŒITOX2�=�'ZZ'‰elseŒINDEX�=�(INT�/�16)�+�1"ŒITOX2(�1:1�)�=�HEX(�INDEX:INDEX�)ŒINDEX�=�mod(�INT,�16�)�+�1"ŒITOX2(�2:2�)�=�HEX(�INDEX:INDEX�)‰end�if‰return †end "†subroutine�INIT(�BUFFP,�Q,�RESP�)†integer…BUFFP †logical…Q†characterƒRESP*(*) ‰include�'common' ‰characterƒPRAMBL*8‰characterƒDEST‰characterƒOPTION*2 ‰dataˆPRAMBL/'PREAMBLE'/‰dataˆDEST/'D'/‰dataˆOPTION/'AA'/ -‰open(7,file='fort.7',access='DIRECT',recl=1) ‰BUFFP�=�4 10‡continueŒwrite�(6,�2000)�PRAMBLŒwrite�(6,�2000)�DESTŒwrite�(6,�2000)�OPTION[9`;d5h5l0pŒwrite�(6,�2000)�'132'Œwrite�(6,�1000)�'1'Œread�(5,�3000)�RESP:‰if�((RESP(1:1)�.ne.�'N')�.and.�(RESP(1:1)�.ne.�'T'))�then Œgo�to�10‰end�if ‰if�(�RESP(1:1)�.eq.�'T'�)�then ŒQ�=�.true.‰end�if ‰return 1000‚format�(A)2000‚format�(A$)3000‚format�(A)†end $†subroutine�COUT(�BUFF,�P,�C,�CCNT�)†characterƒBUFF*(*) †integer…P †characterƒC †integer…CCNT ‰BUFF(�P:P�)�=�C ‰P�=�P�+�1‰CCNT�=�CCNT�+�1 ‰return †end 4†subroutine�COMPRS(�REC,�RECSIZ,�BUFF,�BUFFP,�CCNT�)†characterƒREC*(*)†integer…RECSIZ†characterƒBUFF*(*)†integer…BUFFP †integer…CCNT ‰include�'common' ‰integer…RPTR‰integer…MATCH ‰integer…I‰characterƒITOA‰characterƒCHR ‰RPTR�=�120‡if�(�RPTR�.le.�RECSIZ�)�then ŒMATCH�=�1ŒCHR�=�REC(�RPTR:RPTR�)Œdo�30�I�=�RPTR+1,�RPTR+346�if�(�(I�.le.�RECSIZ)�.and.�(REC(I:I)�.eq.�CHR)�)�then’MATCH�=�MATCH�+�1�else ’go�to�40�end�if 30Šcontinue :40Šif�((MATCH�.ge.�3)�.or.�(REC(RPTR:RPTR)�.eq.�'|'))�then$�call�COUT(�BUFF,�BUFFP,�'|',�CCNT�)1�call�COUT(�BUFF,�BUFFP,�REC(�RPTR:RPTR�),�CCNT�).�call�COUT(�BUFF,�BUFFP,�ITOA(�MATCH�),�CCNT�)�RPTR�=�RPTR�+�MATCHŒelse�do�50�I�=�1,�MATCH/’call�COUT(�BUFF,�BUFFP,�REC(RPTR:RPTR),�CCNT�)’RPTR�=�RPTR�+�1 50�continueŒend�if‰elseŒreturn‰end�if ‰go�to�20 †end 6†subroutine�GETREC(�BUFF,�P,�RESP,�EOFINF,�Q,�CHRCNT�)†characterƒBUFF*(*) †integer…P†characterƒRESP*(*)†logical…EOFINF †logical…Q†integer…CHRCNT ‰include�'common' ‰characterƒREC*132‰characterƒITOX2*2‰characterƒCHR ‰integer…I ‰integer…CPOS ‰integer…CCNT‰integer…RECSIZ ‰CPOS�=�P ‰CCNT�=�0 ‰P�=�P�+�2 ‰RECSIZ�=�0 ‰do�53�I�=�1,�RMAXŒCHRCNT�=�CHRCNT�+�1"Œread(�7,�rec=CHRCNT,�err=80�)�CHR!Œif�(�ichar(�CHR�)�.ne.�10�)�then�RECSIZ�=�RECSIZ�+�1�REC(�RECSIZ:RECSIZ�)�=�CHRŒelse �go�to�55Œend�if 53‡continue #55‡if�(�RESP(�2:2�)�.eq.�'B'�)�then; Œdo�60�I�=�1,�RECSIZ*�if�(�REC(�RECSIZ:RECSIZ�)�.eq.�'�'�)�then’RECSIZ�=�RECSIZ�-�1�else ’go�to�70�end�if 60Šcontinue‰end�if,70‡call�COMPRS(�REC,�RECSIZ,�BUFF,�P,�CCNT�)$‰BUFF(�CPOS:CPOS+1�)�=�ITOX2(�CCNT�)‰return 80‡EOFINF�=�.true.‰return 1000‚format�(A)†end -†subroutine�OUTBLK(�BUFF,�P,�RTYPE,�RESP,�Q�)†characterƒBUFF*(*) †integer…P†characterƒRTYPE†characterƒRESP*(*) †logical…Q ‰include�'common' ‰integer…C ‰integer…I‰integer…NAKCNT‰characterƒITOX2*2 ‰BUFF(�3:3�)�=�RTYPE‰C�=�0‰do�90�I�=�3,�CMAX*BLKCNTŒC�=�C�+�ichar(�BUFF(�I:I�)�) 90‡continue‰C�=�mod(C,�255)�+�1‰BUFF(�1:2�)�=�ITOX2(�C�) ‰NAKCNT�=�0 100†continueŒif�(�NAKCNT�.ge.�3�)�then�BUFF(�1:2�)�=�'00'Œend�ifŒwrite�(6,1000)�BUFF(�1:CMAX�)Œread�(5,�1000)�RESP<‰if�(�(RESP(1:1)�.ne.�'N')�.and.�(RESP(1:1)�.ne.�'T')�)�thenŒNAKCNT�=�NAKCNT�+�1 Œgo�to�100‰end�if‰Q�=�RESP(�1:1�)�.eq.�'T' ‰C�=�CMAX�+�1‰do�110�I�=�C,�P�-�1(ŒBUFF(�C-CMAX+3:C-CMAX+3�)�=�BUFF(�C:C�) ŒC�=�C�+�1 110†continue‰P�=�P�-�(CMAX�-�3)‰return 1000‚format�(A)†end .†subroutine�PUTREC(�BUFF,�P,�RESP,�EOFINF,�Q�)†characterƒBUFF*(*) †integer…P†characterƒRESP*(*)†logical…EOFINF †logical…Q ‰include�'common' ‰integer‚I $120†if�(�P�.gt.�BLKCNT*CMAX+1�)�then%Œcall�OUTBLK(�BUFF,�P,�'A',�RESP,�Q�) Œgo�to�120‰end�if‰if�(�EOFINF�)�thenŒdo�130�I�=�P-2,�BLKCNT*CMAX�BUFF(�I:I�)�=�'�' 130‰continue%Œcall�OUTBLK(�BUFF,�P,�'Z',�RESP,�Q�) ŒQ�=�.true.‰elseŒif�(�P�.gt.�BLKCNT*CMAX�)�then%�call�OUTBLK(�BUFF,�P,�'A',�RESP,�Q�)Œend�if‰end�if‰return †end †PROGRAM�DOWNLD DC…*****************************************************************)@C…*�This�program�reads�records�from�an�ascii�file,�packs�them…*)?C…*�into�blocks�and�writes�them�to�the�terminal.‚The�program…*)C…*�runs�on�VAX/UNIX.­*)CC…****************************************************************) ‰character„BUFF*268‰character„RESP*2 ‰logical„Q‰logical„EOFINF‰integer„BUFFP‰integer„CHRCNT‰character„ID*50 ‰include�'common' ,‰data‚ID/'@(#)dload.f:1.2ˆ8/4/83(13:31:50)'/‰data„CMAX/132/‰data„RMAX/132/‰data„BLKCNT/1/‰data„BMAX/268/‰data„EOTRAN/'T'/‰data„CHRMAX/127/ ‰CHRCNT�=�0 ‰Q�=�.false.‰call�INIT(�BUFFP,�Q,�RESP�)140†if�(�.not.�Q�)�then4Œcall�GETREC(�BUFF,�BUFFP,�RESP,�EOFINF,�Q,�CHRCNT�),Œcall�PUTREC(�BUFF,�BUFFP,�RESP,�EOFINF,�Q�) Œgo�to�140‰end�if †endéé LIST,*‚EDITOR�DOCUMENTATION�RELEASE‚4.30�06/14/84*‚FILENAME=E.NW*‚SOURCE�FILES:*<*‚1)0000.&.UTILIB.RO‰UTILITY�LIBRARY�TO�LINK�WITH�THE�EDITOR%*‚2)9995.&.IOE.EQŒFHS/IOS�EQUATE�FILE$*‚3)9995.&.TR1.EQŒTRAP�1�EQUATE�FILE,*‚4)9997.&.CRTD.AI‹DATA�FILE�FOR�ALL�MODULES'*‚5)9997.&.CRTE11.AI‰MAIN�EDITOR�MODULE**‚6)9997.&.CRTE2.AIŠEDITOR�COMMANDS�MODULE1*‚7)9997.&.E.AFŽCHAIN�FILE�TO�ASSEMBLE�THE�EDITOR-*‚8)9997.&.E.LFŽCHAIN�FILE�TO�LINK�THE�EDITOR *‚9)9997.&.E.NWŽEDITOR�NEWS�FILE3*�10)9997.&.E.SAŽEQUATE�FILE�FOR�ALL�EDITOR�MODULES**�11)9997.&.FMSINT.AI‰FMS�INTERFACE�MODULE**‚TO�ASSEMBLE:*.*„CREATE:E.ROŒEDITOR�RELOCATABLE�OBJECT�MODULE*„=CHAIN�E.AF�E*…CREATES�E.RO�AND�E.LS* *‚TO�LINK:* *‚CREATE:E.LOŠEDITOR�LOAD�MODULE*‚=CHAIN�E.LF�E*ƒCREATES�E.LO�AND�E.LL PAGEG*‚MISC.�INFORMATION:�FILE�E.NW�NEED�NOT�BE�INCLUEDED�IN�ANY�ASSEMBLIES.*‚THEY�ARE�DOCUMENTATION�ONLY. PAGE*‚68000�EDITOR�OPERATION*)*„The�68000�Editor�does�2�main�functions:9*‚A)CRT-MODE�e< diting�for�use�with�EXORterm�155�terminals.:*‚B)SCROLL-MODE�editing�for�use�with�any�terminals�and�the*�CHAIN�command.I*„The�normal�mode�is�CRT-MODE.�SCROLL-MODE�is�specified�via�an�'L'�in�theJ*‚the�input�command�line�option�field.�SCROLL-MODE�is�the�mode�always�usedK*‚when�editing�under�CHAIN.�In�this�case�the�'L'�option�does�not�have�to�beG*‚specified.‚The�editor�uses�FMS�for�all�file�I/O�through�an�interface-N*‚FMSINT.�This�interface�is�assembled�with�the�editor�modules.�FMSINT�consistsM*‚of�several�file�operations.�Each�operation�is�specified�by�a�unique�FMSCMD.6*‚See�the�FMSINTDC�listing�for�complete�documentation.*„The�editor�consists�of:A*‚A)a�main�line�routine�which�does�all�initial�set�up�and�ending.*‚B)a�driver�for�CRT-MODE.*‚C)a�driver�for�SCROLL-MODE.(*‚D)an�ASR�for�exclusive�break�handling.C*‚E)various�screen�handling�routines�for�PAGE-MODE�within�CRT-MODE.=*‚F)various�command�handling�routines�for�COMMAND-MODE�within *„both�CRT-MODE�and�SCROLL-MODE.t5}"…�,•-�+¥&­* *‚G)a�common�screen�I/O�routine.*L*„The�editor�is�created�as�two�segments,a�program�segment�and�a�data�segmentM*‚The�FMS�interface�uses�2�segments,one�for�file�data�and�one�for�the�extractE*‚buffer.�Therefore,the�editor�uses�4�segments.�No�more�are�avaiable. PAGE2*ƒThe�CRT-MODE�portion�of�the�editor�has�2�levels: *‚A)PAGE-MODE*‚B)COMMAND-MODEJ*„PAGE-MODE�is�invoked�when�editing�new�files,empty�existing�files,�or�theM*‚F1�key�was�depressed.�When�in�CRT-MODE�the�terminating�characters�describedH*‚in�the�EXORterm�155�manual�are�recognized�by�the�editor�and�acted�uponN*‚Each�terminating�character�routine�is�essentially�the�same.�The�operation�is(*‚A)clear�any�message�on�screen�line�21.+*‚B)make�sure�screen�protection�is�correct.#*‚C)do�any�file�change�if�required.(*‚D)do�the�terminating�character�action.>*‚E)output�end-of-file/beginning-of-file�message�if�necessary.)*‚F)reset�screen�protection�if�necessary.@*‚G)return�to�the�main�portion�of�the�editor�for�the�next�input.E*‚These�functions�are�stacked�into�an�output�buffer�while�processing.F*‚The�output�buffer�is�written�to�the�screen�at�the�end�of�processing.*H*„Any�terminating�character�is�also�recognized�during�command�editing�inK*‚CRT-MODE.�In�that�case,the�terminating�character�operation�is�performed�&J*‚the�command�is�not.‚A�carriage�return�is�the�valid�terminating�characterL*‚for�the�commands.�This�carriage�return�appears�as�a�send�page�character�toN*‚the�editor�due�to�the�screen�protection�set�for�command�mode�to�line�22�onlyE*‚File�updates�in�PAGE-MODE�are�done�by�the�editor�CKREAD�routine.�ItM*‚determines�if�the�file�change�is�a�replace�or�an�insert�&�calls�the�routineM*‚UPDATE�to�do�the�actual�file�change�via�FMSINT.�File�content�screen�writingK*‚is�done�using�WRTSCRN.�It�calls�CKREAD1�to�read�1�file�record�with�1�readK*‚command�to�FMSINT�&�write�1�record�at�a�time�using�SCROLOUT�until�20�recsM*‚have�been�written�or�end�of�file�is�reached.�The�sceen�is�changed�to�scroll8*‚mode�before�the�output�and�back�to�editmode�when�done.*G*‚Page�mode�editing�and�a�carriage�return�terminating�character�invokesI*‚proceed�I/O�for�the�screen�instead�of�wait�I/O.�This�allows�the�file�to>*‚be�updated�while�the�user�is�entering�the�next�line�of�data.*F*„COMMAND-MODE�routines�are�entered�through�the�common�routine�READCMDF*‚which�determines�which�command�is�wanted.‚Each�command�routine�works*‚essentially�the�same:0*‚A)the�command�input�line�is�parsed�by�PROCLIST(*‚B)the�command�is�executed,if�possible.A*‚C)returns�to�the�main�portion�of�the�editor�for�the�next�input.@*‚The�editor�can�only�be�exited�by�using�the�QUIT�command,unless1*‚some�I/O�error�occurs�which�terminates�editing.G*ƒPROCLIST�reads�the�input�command�lin< e�and�processes�it�according�to�aJ*‚table�set�up�for�each�command.�Each�of�these�lists�are�documented�in�theG*‚data�area�of�the�editor�listing.�The�processed�informatio‚returned�toK*‚each�command�routine�in�a�common�list�parameter�block�called�LISTPB.�ThisK*‚para.�block�contains�the�information�needed�by�each�command.�New�commandsI*‚may�be�added�by�creating�a�list�entry�for�each�command�according�to�theK*‚rules�stated�in�the�data�area�documentation,�and�adding�an�entry�into�theM*‚command�tables�CMDTBL1�and�CMDTBL4,�and�adding�the�command�routine.�CMDTBL1E*‚&�CMDTBL4�are�used�by�READCMD�to�determine�which�command�was�input.H*„Any�command�which�needs�to�write�file�data�to�the�sceeen�uses�OUTFIND.G*‚OUTFIND�determines�the�screen�position�for�the�prompt,�changes�screenK*‚protection�to�be�able�to�write�to�lines�1-20�of�the�screen,�calls�WRTSCRNJ*‚read�and�write�the�file�records,sets�the�prompt�to�the�correct�location,=*‚resets�screen�protection�to�command�protection,and�returns.H*„Any�function�which�requires�an�FMSINT�call,calls�the�routine�FMS.�ThisG*‚internal�routine�determines�the�function,�calls�FMSINT,�outputs�errorN*‚messages�if�needed,and�returns.�Some�errors�here�cause�the�file�to�be�closedH*‚and�the�editor�terminated.�See�each�routine�for�complete�info�on�this.*#*„SCROLL-MODE�editing�has�2�levels:*‚A)COMMAND�MODE*‚B)INSERT�MODEA*„Command�mode�is�the�same�as�the�CRT-MODE�command�mode.‚The�sameE*‚routines�are�used�and�the�commands�are�set�up�in�the�same�way.�EachJ*‚command�routine�checks�to�see�if�in�SCROLL-MODE�whenever�is�is�necessaryE*‚The�variable�SCROLL�is�negative�when�in�SCROLL-MODE.�SCROLL-MODE�isJ*‚determined�in�the�main�portion�of�the�editor.�Screen�I/O�is�different�inJ*‚scroll�mode.�The�routine�SCROLLOUT�is�used�for�screen�writing�instead�ofI*‚WRTSCRN.‚Insert�mode�of�the�scroll�mode�editor�is�entered�by�the�INSERTF*‚command�or�when�editing�new�files�or�empty�files.�The�insert�mode�isN*‚basically�the�same�as�any�command�except�that�it�reads�input�from�the�screenI*‚INSERT�calls�the�routine�UPDINS�to�do�file�updates.�UPDINS�fixes�up�theG*‚input�data�and�calls�FMS�to�do�the�file�updates.�The�only�terminatingH*‚character�in�scroll�mode�is�a�carriage�return.�The�editor�changes�thisB*‚to�a�send�line�code�to�match�the�crt-mode�terminating�character.**‚COMMON�VARIABLESE*ƒAll�variables�are�documented�in�the�editor�data�area.�The�followingE*ƒvariables�are�the�ones�used�the�most�to�determine�editor�status�and-*ƒthe�current�state�of�the�file�being�edited.,*ƒFILELINE�(LONG)‚current�file�record�number*”1st�file�record�number�is�0.*ƒMAXLINE‚(LONG)‚number�of�records�in�the�file6*ƒTOPLINE‚(LONG)‚current�file�record�number�at�the�top*”of�the�screen(CRT-MODE�only),*ƒCURMODE‚(BYTE)‚current�mode�0=command�mode *¡1=page�mode.*ƒEMTYFILE�(WORD)ƒnew/old�file�flag�0=old�file*¦-1=new�or�empty�file2*ƒSCROLLƒ(BYTE)ƒscroll�mode�flag‚-1=in�scroll�mode*¨0=in�crt�mode**ƒCHAIN„(BYTE)ƒchain�flag‚-1=in�chain�mode*¢0=not�in�chain�mode PAGE:*‚EDITOR�SUBROUTINES‚LISTED�IN�ORDER�OF�LISTING�APPEARANCE*–'FOR'�CODE:C=CRT-MODE*¡S=SCROLL-MODE* *SUBROUTINE*ƒNAME‡FORƒDESCRIPTIOND*----------„---ƒ----------------------------------------------------+*”THE�FOLLOWING�SUBROUTINES�ARE�IN�CRTE1.SA1*�MESSOUT†CS„output�screen�messages-non�edit�mode/*�CRTMODE†C…determine�operation�mode�&�go�there5*�SCROLMOD†S„determine�operation�mode�&�go�to�READCMD2*�UPAROW‡C…up�arrow�key-update�file�if�needed,move'*”cursor�up�1�line�with�page�wraparound0*�TESTOLD†C…determine�if�FMSINT�command�is�to�be*”INSERT�or�REPLACE0*�TESOLD1†C…determine�if�FMSINT�command�is�to�be*”INSERT�or�REPLACE4*�DNAROW‡C…down�arrow�key-update�file�if�needed,move**”cursor�douwn�1�line�with�page�wraparound3*�HOME‰C…home�the�cursor�key-update�file�if�needed,*”put�cursor�in�home�position5*�FKEY1ˆC…function�key�1-update�file�if�needed,change*”mode�page<>command5*�FKEY3ˆC…function�key�3-update�file�if�needed,scroll!*”scre= en�forward�1�page(20�lines)5*�FKEY4ˆC…function�key�4-update�file�if�needed,scroll*”screen�backward�1�page5*�FKEY5ˆC…function�key�5-update�file�if�needed,scroll*”screen�forward�1�line5*�FKEY6ˆC…function�key�6-update�file�if�needed,scroll*”screen�backward�1�line<*�FKEY11‡C…function�key11-update�file�if�need,set�a�tab�stop*”in�the�current�corsor�column<*�FKEY12‡C…function�key12-update�file�if�needed,delete�a�tab#*”stop�in�the�current�cursor�column7*�INSLIN‡C…insert�line�key-update�file�if�needed,insert*”a�blank�line�to�the�file6*�DELINE‡C…delete�line�key-delete�a�line�from�the�file?*�FKEYSTUP…C…load�output�buffer�address,build�the�clear�line�21/*”message,build�page�mode�protection�if�needed,*”update�file�if�needed%*�SETPP3‡C…build�page�mode�protection(*�SETCP3‡C…build�command�mode�protection%*�CLRMSG‡C…build�clear�line21�message=*�EOFMSG3†C…build�eof/bof�message�if�needed,reposition�cursor*”if�moved�beyond�file1*�DOOUTˆC…do�screen�output�from�the�output�buffer4*�PAGE‰C…carriage�return�key�when�on�screen�line�20-*”uses�CRTLS�code.3*�CRTLSˆC…carrige�return�key-update�file�if�needed.9*”If�editing�old�file,send�blank�line�to�screen�and�file.=*�UPDATE‡C…put�blanks�to�end�of�screen�record�and�call�FMSINT*”to�do�the�file�update6*�CRTN‰C…proceed�I/O�completion.�used�by�crt-page�mode*”PAGE�and�CRTLS�routines.:*�CKREAD‡C…update�file�pointers�and�call�UPDATE�to�do�file*”change*�CKREAD1†C…read�file�records9*�BLDCRT‡C…build�edit�mode�output�buffer�from�file�record7*�WRTSCRN†C…write�screen-read�20�file�records�and�write*”them�to�the�screen3*�HOMECUR†C…home�cursor-put�cursor�in�home�position5*�SEND1ˆC…send�one-send�any�1�byte�code�to�the�screen.*�FIXSFCR†C…fix�screen�for�carriage�return�key4*�FMSŠCS„set�up�FMSINT�packet,call�FMSINT,and�handle*”any�error�returns4*�SETNMˆC…save�the�edit�file�name�for�screen�display+*�SETPROP†C…set�page�mode�screen�protection.*�SETPROC†C…set�command�mode�screen�protection8*�PUTP‰C…position�prompt�to�correct�screen�line-column�12*�CLRP‰C…restore�virtual�screen�to�complete�screen**�CLRCOL1†C…clear�screen�column1-all�lines6*�WRTMESS†CS„write�message-if�in�crt-mode�message�goes.*”to�screen�line�21,in�scroll�mode�just�output<*�GETERR‡CS„get�error-get�D0�error�code�and�convert�to�ascii<*�READCMD†CS„output�command�line�to�screen,determine�command*”and�go�there@*�CHANGE‡CS„change�command-find�a�string�and�change�to�new�value7*�FIND‰CS„find�command-find�a�string�or�position�editor"*�QUIT‰CS„quit�command-exit�editor<*�PROCLIST…CS„process�list-process�the�list�for�each�command-*”from�the�input�command�buffer�and�build�its*”parameter�block<*�PROCSND†CS„process�string�with�no�delimiter-put�the�string,*”addresses�into�the�command�parameter�block9*�PROCSWD†CS„process�string�with�delimiter-put�the�string,*”addresses�into�the�command�parameter�block9*�PROCHAR†CS„process�character-put�the�character�into�the*”command�parameter�block:*�PROCNDN†CS„process�number�dash�number-find�the�2�numbers0*”in�the�command�input�buffer,convert�to�hex,and%*”save�in�the�command�parameter�block>*�PROCNT‡CS„find�the�count�in�the�command�input�buffer,convert+*”to�hex,save�in�to�command�parameter�block;*�PROCNC‡CS„process�number�comma�number-find�the�n,n�in�the.*”command�input�buffer,convert�to�hex�and�save *”in�the�command�parameter�block>*�PROCFN‡CS„process�filename-process�the�filename�specified�in.*”the�command�input�buffer,put�fully�qualified-*”filename�to�FMSFILES�and�addresses�into�the*”command�parameter�block<*�SETFLAG1…CS„set�flag1-set�the�flag�if�command�list�says�to>*�CHKREQDF…CS„check�required�field-see�if�a�field�not�found�in&*”the�command�input�buffer�is�required<*�GETNEXTC…CS„get�next�character�in�the�command�input�buffer>*�FINDNXTC…CS„find�the�next�non-blank�character�in�the�command*”input�buffer4*�UPDLPBP†CS„update�the�list�parameter�block�pointer%*�CVTASCBI…CS„convert�ascii�to�binary?*�SAVBINBR…CS„save�binary�number�in�the�command�parameter�block5*�GETCMD‡CS„get�command�from= �the�command�input�buffer;*�GETVRˆCS„get�vertical�ranges�from�command�parameter�block=*�GETHRˆCS„get�horizontal�ranges�from�command�parameter�blockB*�DOCHGˆCS„do�the�actual�change�to�the�file�record(change�command)1*�CHCNTˆCS„see�if�count�for�change�command�is�ALL9*�CKHR‰CS„see�if�found�string�is�within�horizontal�ranges7*�DOSRCH‡CS„set�up�FMSINT�packet�for�search�command�and*”parse�errors�returned>*�MULFIND†CS„output�found�record�to�screen�for�find�and�change;*�OUTFIND†CS„output�20�lines�to�screen�containing�the�found-*”record.�if�scroll�mode�just�output�1�record+*”THE�FOLLOWING�SUBROUTINES�ARE�IN�CRTE2.SA1*�RANGEˆCS„range�command-establist�default�ranges4*�DELETE‡CS„delete�command-delete�data�from�the�fileA*�EXTEND‡CS„extend�command-insert�data�at�the�end�of�file�records>*�ADUPLCT†CS„duplicate�with�append�command-copy�requested�data/*”into�the�xtract�buffer,append�it�to�any�other*”data�in�the�extract�buffer:*�DUPLCT‡CS„duplicate�command-copy�requested�data�into�the1*”xtract�buffer�after�deleting�the�extract�buffer>*�MERGEˆCS„merge�command-merge�an�existing�file�into�this�file;*�AMOVEˆCS„move�with�append�command-copy�the�requested�data5*”into�the�extract�buffer,append�it�to�any�other�data1*”in�the�extract�buffer.�Delete�the�data�from�the*”current�position.7*�MOVE‰CS„move�command-copy�the�requested�data�into�the2*”xtract�buffer�after�deleting�the�extract�buffer."*”Delete�from�the�current�location7*�PRINTˆCS„print�command-print�data�on�the�line�printer5*�SAVE‰CS„save�command-save�self�or�to�a�new�filename=*�XTRACT‡CS„xtract�command-move�data�in�xtract�buffer�to�file3*�INSERTˆS„insert�command-insert�data�into�the�file/*�LISTŠS„list�command-list�data�at�the�terminal>*�VERIFYˆS„verify�command-display�file�changes�at�the�terminal7*�LINECˆCS„line�command-output�current�file�line�number*�DOWN‰CS„move�the�cusor�down*�UP‹CS„move�the�cusor�up'*�TABŠCS„tab�command-set�specified�tabs0*�DTABŠS„delte�tab�command-delete�specified�tabs+*�STABŠS„set�tab�command-set�specified�tabs2*�COLMŠS„column�command-output�the�column�template:*�CKRANG‡CS„see�if�using�default�ranges�from�range�command%*�DODELˆCS„do�the�delete�file�records!*�BREAKˆCS„handle�break�condition2*�BRKSRˆCS„break�service�routine�for�the�break�ASQ*�DATAOR‡CS„handle�data�overrun=*�CKVPTRS†CS„check�for�valid�pointers�after�a�break�condition>*�UPDPTW‡CS„update�pointers�after�a�break�and�write�the�screen0*�SCROLOUT†S„output�1�file�record�in�scroll�mode-*�SCROLRD‡S„read�1�file�record,in�scroll�mode>*�UPDINSˆS„mode�insert�record�suitable�for�inserting�into�file>*�SETABS‡CS„set�tabs-set�the�tabs�specifed�in�the�option�field,*�CLRTABS†C…clear�any�set�tabs�on�the�screen/*�DOTABS‡C…do�tabs-do�actual�screen�tab�setting$*�CRTINˆCS„do�the�actual�screen�read%*�CRTOUT‡C…do�the�actual�screen�write *�CNVTHA‡CS„convert�hex�to�ascii**”THE�FOLLOWING�SUBROUTINE�IS�IN�FMSINT.SA"*�FMSINT‡CS„do�all�actual�file�I/O/*”THE�FOLLOWING�SUBROUTINES�ARE�LINKED�INTO�THE.*”EDITOR�FROM�UTILIB.RO.�THE�SOURCE�IS�PAR.SA,*”EDT.SA,AND�COD.SA;*�PARSEˆCS„return�field�addresses�of�filenames�command�line.*�EDITFILE…CS„build�a�filename�parameter�block PAGEO*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**ˆMESSAGE�NUMBER�ALLOCATION*ˆ00000000�-�000002FF‹UTILITIES(*ˆ00000300�-�000004FF‹SESSION�MANAGEMENT*ˆ00000500�-�000006FF‹SYMBUG*ˆ00000700�-�000008FF‹BASIC�M$*ˆ00001000�-�00002FFF‹PASCAL�RUNTIME*ˆ00003000�-�000035FF‹FORTRAN$*ˆ00008000�-�0000FFFF‹USER�GENERATED/*ˆ00010000�-�FFFFFFFF‹VERSADOS�OPERATING�SYSTEM*O*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~O*------------------------------------------------------------------------------*–ERROR�MESSAGE�LINE�FORMATO*------------------------------------------------------------------------------*ˆCOLUMNS„CONTENT+*�1…*�TREATS�REMAINDER�OF�LINE�AS�A�COMMENT(*Š1-�8…K> EY�VALUE�OF�ERROR�MESSAGE�IN�HEX*�9…SPACE�DELIMITER5*‰10-89…ERROR�MESSAGE�TEXT�AND�SUBSTITUTION�SENTINELSO*------------------------------------------------------------------------------*•ERROR�CODE�KEY�VALUE�FORMAT:*‹BITS„INTERPRETATION�(of�register�D0�following�trap�call)*Š0-15…ERROR�STATUS�CODE*‰16-26…DIRECTIVE�NUMBER3*‰27-30…TRAP�NUMBER‚(0�for�non-trap�related�errors)1*Œ31…RESERVED�(For�internal�error�classification)**˜BIT�POSITIONS*A*�3�3�2�2ƒ2�2�2�2ƒ2�2�2�2ƒ1�1�1�1ƒ1�1�1�1ƒ1�1�0�0ƒ0�0�0�0ƒ0�0�0�0A*�1�0�9�8ƒ7�6�5�4ƒ3�2�1�0ƒ9�8�7�6ƒ5�4�3�2ƒ1�0�9�8ƒ7�6�5�4ƒ3�2�1�0*A*�X�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�XƒX�X�X�X*O*------------------------------------------------------------------------------0*ŽSUBSTITUTION�SENTINEL�FORMAT�IS�\Soo[ll][kkkk]'*„Where�\…Is�the�required�Sentinel�Flag0*ŠS…Is�one�of�the�Sentinel�Codes�explained�below6*Šoo„Is�the�decimal�offset�from�reg�A0�to�be�converted2*’and�inserted�at�this�point�in�the�error�message.,*’A0�normally�points�at�an�FHS�or�IOS�block.3*Šll„Is�a�length�value�required�only�for�Sentinel�C2*Škkkk‚Is�a�key�value�required�only�for�Sentinel�KO*------------------------------------------------------------------------------µ.¾+Æ+Î4Ö,Þ(æ(î*ö%þ!#$#(&&./6.>?F:N1V(^(fn&v#~*†!Ž,*ŽSUBSTITUTION�SENTINEL�CODE�INTERPRETATIONS;*‚\Boo„Convert�1�byte�at�offset�oo�from�A0�to�Decimal�Ascii*‚\Woo‡"„2�bytes†"‡"‹"*‚\Loo‡"„4ƒ"ˆ"‡"‹"*‚\Xoo‡"„1�byte‡"‡"‰Hex�Ascii*‚\Yoo‡"„2�bytes†"‡"‹"*‚\Zoo‡"„4ƒ"ˆ"‡"‹"-*‚\Cooll‚Copyƒll�bytes†"‡"‰String�length�=�ll5*‚\Too„Translate�code‡"‡"‰Ascii�prose�from�this�file.2*”Error�Message�#ttoocccc�contains�the�prose�where+*£ttƒ=�original�trap�code�+�trap#4�(bit�29)*£ooƒ=�offset�from�A0�of�code%*£cccc�=�code�value�to�be�interpreted9*‚\Aoo„Convertƒregister�A0�to�Hex�Ascii�(oo�is�always�00)D*‚\Ioo„Copyƒ??�bytes�at�offset�0�from�Text�Plug�#oo�until�an�illegal&*”Ascii�char�{FF}�flags�end�of�string.I*‚\Kkkkk‚Copy‚all�of�Error�Message�#0000kkkk�expanding�any�of�it�embedded:*”sentinels�at�this�point�before�continuing�the�interpret-9*”ation�of�this�message.‚CRLF�issued�automatically�before *”the�insertion�of�message�kkkk.*J*‚\Doo„Will�eleminate�the�standard�error�message�text�of�task�name,sessionA*Šnumber,user�key�value,error�originator,and�the�variable�message6*Šsepartor�(**)�from�the�error�message�to�be�displayedO*------------------------------------------------------------------------------F*„TYPICAL�PROSE�TO�CAUSE�AN�ERROR�MESSAGE�FROM�THIS�FILE�TO�BE�PRINTED*‹.�.�.4*‹LEA‡IOSBLK,A0†Where�IOSBLK�is�usually�a�FHS�or�IOS#*‹TRAP†#n�Where�n�is�usually�2�or�31*‹BEQ‡CONT‹WHERE�CONT�IS�LABEL�FOR�GOOD�TRAP�CALL,*‹MOVEM.LƒD0/A0,ERRPBLK‚Save�regs�in�ERRPBLK5*‹LEA‡ERRPBLK,A0…Where�ERRPBLK�is�in�the�format�below,*‹MOVE.L„#2,D0ŠError�handler�is�directive�#2#*‹TRAP†#4�Invokes�the�Error�handler*‹.�.�.6*‚ERRPBLK‚DC.L†0ŽUSER�REG�D0‚CONTAINS�ERRMSG�KEY�VALUE6*‚ERRPBA0‚DC.L†0ŽUSER�REG�A0‚POINTS�AT�I/O�CONTROL�BLK)*‚ERRPOPT‚DC.B†0ŽERROR�OPTIONS�FUTURE�USE+*‚ERRPLDF‚DC.B†0ŽUSER�LDFLUN‚LUN�FOR�SCREEN*‚ERRPQUY‚DC.B†0ŽFUTURE�USE-*‚ERRPCDF‚DC.B†0ŽUSER�CDFLUN‚LUN�FOR�KEYBOARD2*‚ERRPLUGB�DC.L†0ŽBEGINNING�OF�USER�TEXT�PLUG�POOL,*‚ERRPLUGE�DC.L†0ŽEND�OF�USER�TEXT�PLUG�POOLL*„This�plug�pool�may�contain�multiple�strings�of�text�delimited�by�Hex�FF's.J*„Maximum�pool�length�is�96�bytes.‚Sentinels�\I01,\I02�....�etc.�cause�theJ*„deblocked�text�to�be�inserted�into�the�basic�error�message�format.‚PlugsL*„are�numbered�beginning�with�one�so�\I03�will�access�the�text�following�theJ*„second�FF�delimiter.‚This�plug�capability�provides�the�caller�with�a�wayH*„to�include�variable�message�content�from�a�source�external�to�the�parm!*„block�addressed�by�register�A0.O*---------------> ---------------------------------------------------------------F*„The�utility�EMFGEN�converts�the�leading�Ascii�hex�number�to�a�4�byteD*„binary�key�value�in�the�process�of�creating�the�indexed�sequential=*„file�ERRORMSY.SY�used�by�the�Trap�#4�ERROR�MESSAGE�HANDLER.)*‹NOTE�:�ERROR�MESSAGE�00000000�IS�A�NULL7*’AND�CAN�BE�USED�IN�CONJUNCTION�WITH�ERRPLUGS�TO�PRINT,*’ONLY�THE�MESSAGE�CONTAINED�IN�THE�PLUGPOOL:*’THIS�MERELY�RELIEVES�THE�CALLER�FROM�DEFINING�IOS�BLOCKSO*------------------------------------------------------------------------------*2*ˆERRORMSG�FILE�GENERATION�UTILITY�EMFGEN�MESSAGES*7*ˆTHESE�MESSAGES�MUST�BE�THE�FIRST�MESSAGES�IN�THE�FILE*D000002FE KEY VALUE \I01 WILL NOT BE ADDED TO FILE ** INPUT ERROR\D00I000002FF KEY VALUE \I01 ERROR MESSAGE ADDED BUT TRUNCATED TO 84 BYTES\D00*O*------------------------------------------------------------------------------*O*------------------------------------------------------------------------------3*ˆKEY�VALUES�MUST�BE�HEX�--�UPPER�LIMIT�IS�000000FF*00000000 \I01\D00***"0000000C CMD=\T00 OPT=\T02 LU=\B0500000000D CMD=\T00 OPT=\T02 LU=\B05 DEVICE=\C060490000000E CMD=\T00 OPT=\T02 LU=\B05 PSN=\Z08 DEVICE=\C0604.0000000F FILE=\C0604:\W10.\C1208.\C2008.\C2802+00000010 CMD=\T00 OPT=\T02 LU=\B05 PSN=\Z36100000011 USE DEFAULT VOLUME = \C0804:\W14.\C1608.00000012 USER NUMBER = \W3400000013 USER TASK = \C240400000014 SESSION = \C040400000015 TERMINAL = \C2804(00000016�TASK�=�\C0004,‚SESSION�=�\C0404&00000017�TASK�=�\C0004,‚SESSION�=�\L04%00000018 --------------------> BREAK!!00000019 OPTION(S) SET = \I01\D00O*------------------------------------------------------------------------------**ˆNON-TRAP�RELATED�MESSAGES***’REFERENCE�IOE.SA�FOR�APPROPRIATE�EQUATES*00000100 INVALID ENTRY,00000101 SUBSTITUTION CAUSED BUFFER OVERFLOW00000102 ARGUMENT NOT FOUND00000103 INVALID OPTION00000104 INSUFFICIENT MEMORY00000105 OPTION CONFLICT"00000106 COMMAND LINE SYNTAX ERROR(00000107 INVALID DEVICE NAME FOR REQUESTO*------------------------------------------------------------------------------*"*ˆUSER�SESSION�MANAGEMENT�MESSAGES*200000300 \D00\I01 START SESSION \C0404 USER = \W42000000301 \D00\I01 END SESSION \C0404 USER = \W4200000302 \D00\K0018H00000303 SYSTEM VOLUME = \C0004:\K0011\K0012\K0013\K0014\K0015\K0019\D00!00000304 OPTION(S) SET = \I01\D00 00000305 \D0000000306 \D00\I01"00000307 \D00\C0004 \C1204: LOADED 00000308 \D00\C0004 \L12: LOADED#00000309 \D00\C0004 \C0404: STOPPED!0000030A \D00\C0004 \L04: STOPPED%0000030B \D00\C0004 \C0404: CONTINUED#0000030C \D00\C0004 \L04: CONTINUED&0000030D \D00\C0004 \C0404: TERMINATED$0000030E \D00\C0004 \L04: TERMINATED#0000030F \D00\C0004 \C0404: ABORTED!00000310 \D00\C0004 \L04: ABORTED'00000311 \D00LOGON REJECTED, LOGGED OFF000000312 \D00WARNING: NO."<" NOT EQUAL TO NO.">"J00000313 \D00------>CAUTION: YOU WILL CHANGE PASSWORD FOR USER = 0 <------00000314 \D00ER: NOT USER = 0+00000315 \D00ER: "\C0008" COMMAND NOT FOUND*00000316 \D00ER: "\C0604" VOLUME NOT FOUND200000317 \D00ER: NO. ARGUMENTS EXCEEDS STACK SPACE00000318 \D00ER: TASK NOT FOUND"00000319 \D00ER: INVALID TASK NAME(0000031A \D00ER: LUN \C0001 NOT ASSIGNED50000031B \D00ER: CANNOT BE CONTINUED, MUST BE STARTED:0000031C \D00ER: MUST BE STARTED INDIVIDUALLY BY TASK NAME80000031D \D00ER: NESTING LEVEL EXCEEDS NO. LUNS PER TASKC0000031E \D00ER: NO ROOM IN RETURN STACK SPACE (TOO MANY ARGUMENTS)#0000031F \D00ER: DEVICE NOT ALLOWED$00000320 \D00ER: "IF" LEVEL EXCEEDED(00000321 \D00ER: =/ENDIF's EXCEED =/IF's%00000322 \D00ER: CHAIN COMMAND SYNTAX$00000323 \D00RX=\Y00 RA=\Y02 RD=\Y04000000324 \D00ER: BATCH NOT ALLOWED IN BATCH MODE;00000325 \D00ER: LOGON TERMINAL NOT AVAILABLE IN BATCH MODE%00000326 \D00ER: BATCH SESSION NUMBER$00000327 \D00BATCH SESSION NOT FOUND&00000328 \D00ER: USER NUMBER NOT FOUND*00000329 \D00E? R: NOT ALLOWED IN BATCH MODE0000032A \D00\C0404: QUEUED0000032B \D00\C0404: RUNNING,0000032C \D00\C0404: DONE STATUS = \Y02:\T02!0000032D \D00ER: BATCH QUEUE FULL'0000032E \D00BATCH JOB \C0404 CANCELLED!0000032F \D00ER: RECORD NOT FOUND#00000330 \D00ER: USER NO. NOT FOUND!00000331 \D00ER: INVALID USER NO.&00000332 \D00ER: MUST BE IN CHAIN MODE#00000333 \D00ER: VALUE SIZE TOO BIG(00000334 \D00ER: INVALID FILE DESCRIPTOR<00000335 \D00ER: NO CHANGE TO VOLUME,USER NUMBER, OR CATALOG+00000336 \D00ER: DEFAULT VOLUME NOT CHANGED,00000337 \D00ER: OPTION LETTERS ARE A-O ONLY:00000338 \D00ER: NOT ALLOWED ON LINE, SUBMIT IN BATCH MODE"00000339 \D00ER: INVALID LU NUMBER$0000033A \D00ER: FILE/DEVICE MISSING"0000033B \D00ER: ACCESS PERMISSION 0000033C \D00ER: VALUES REVERSED?0000033D \D00ER: YOU FAILED IN YOUR ATTEMPT TO CRASH THE SYSTEM0000033E \D00ER: COMMAND SYNTAX$0000033F \D00ER: FIELD SIZE EXCEEDED&00000340 \D00ER: FILE WAS NOT ASSIGNED+00000341 \D00ER: NUMERICAL CONVERSION ERRORO*------------------------------------------------------------------------------&*†START�OF�BASICM�ERROR�MESSAGES‚(MIL)O*------------------------------------------------------------------------------* Basic-m syntax error messagesO*------------------------------------------------------------------------------>00000701 Invalid logical expression in an IF or WHEN statement300000702 Missing THEN in an IF,ON or WHEN statement900000703 THEN must be followed by an executable statement.00000704 Incomplete bit selector (missing "]")C00000705 Illegal procedure name or bit selector not followed by "="00000706 Equal sign expected!00000707 Illegal branch statement800000708 GOTO or GOSUB not followed by valid line number700000709 CALL is not followed by a valid procedure name@0000070A Missing ")" in an argument list, selector or array size&0000070B Illegal arithmetic expression00000070C Missing ")" in an arithmetic expression#0000070D Illegal literal expression=0000070E Missing or invalid argument list in a POKE statement*0000070F Invalid unsigned integer constant00000710 Invalid exponent700000711 Filename must be a string variable or constant100000712 Invalid variable name in a DIM statement=00000713 Illegal or unspecified array size in a DIM statement>00000714 Illegal ADDRESS clause in a DIM or EXTERNAL statement=00000715 Illegal variable name in a BYTE or INTEGER statement?00000716 Missing address specification in an EXTERNAL statement-00000717 Illegal operands in a READ statement-00000718 Illegal operands in a DATA statement:00000719 Missing "#" in an OPEN, CLOSE or REWIND statement+0000071A Missing comma in an OPEN statement:0000071B Undefined data transfer mode in an OPEN statement0000071C Illegal file access30000071D "=" required in a LINE or DIGITS statement60000071E Illegal index name in a FOR or NEXT statement50000071F Index not followed by "=" in a FOR statement&00000720 Missing TO in a FOR statement&00000721 Invalid NEVER or ON statement;00000722 Invalid line number list in an ON...GOTO statement.00000723 IMAGE not followed by a format string+00000724 Illegal variable or procedure name300000725 Missing parethesis in a logical expression/00000726 Invalid line number in an EOF function$00000727 Invalid relational operator;00000728 Invalid or missing separator in an INPUT statement00000729 Invalid key70000072A No argumant list following the TAB keyword, or@0000072B Invalid operand in a MAT READ, INPUT or PRINT statement<0000072C Missing comma in a MAT INPUT or MAT PRINT statement50000072D Missing "=" in a matrix assignment statement>0000072E Expression not enclosed in [ ] in a MAT SET statement;0000072F Missing argumant in a MAT INV or MAT TRN statement"00000730 Illegal character scanned00000731 Illegal statement00000732 Statement too long:00000733 Missing argument list following a string function00000734 Invalid line number>00000735 Missing comma in argumant list of a built-in function=00000736 Missing "? (" for argument list in a built-in function00000737 Missing separator100000738 Invalid key or logical unit number (LUN).00000739 String not allowed when LUN indicated%0000073A Invalid number of dimensionsK0000073B USING not followed by line number,format string or string variable-0000073C Unrecognized characters in statementB0000073D Data Block size expected after comma in an OPEN statement<0000073E Nesting of parenthesis forbidden in a format string/0000073F Access permission expected after comma00000740 Unbalanced parenthesis00000741 "]" expected00000742 Unexpected end of line!00000743 String constant expected=00000744 FAB (File Access Block) size is expected after comma(00000745 Illegal variable or string name=00000746 Illegal character scanned in beginning of expression(00000747 Operator expected in expression'00000748 Operand expected in expression00000749 Meaningless combinatonI0000074A Illegal number of dimensions in assigned variable or "=" missing"0000074B Numeric constant expected!0000074C String variable expected:0000074D Invalid variable name or invalid numeric constant#0000074E Missing TO or SUB after GO?0000074F TAB is not allowed in PRINT statement if USING appearsJ00000750 Illegal variable or procedure name,or string variable not allowed00000751 Unbalanced bracketsG00000752 Logical or relational operator not allowed in arithmetic expr.<00000753 More than one relational operator in a logical term800000754 GOTO or GO TO are not allowed in WHEN statement<00000755 ON ERROR must not appear in an IF or WHEN statement00000756 Too many dimensions000000757 Expected variable name or constant name=00000758 String variable not allowed in arithmetic expression-00000759 Missing arguments in INPUT statement>0000075A Expected option T or D after comma in CLOSE statement,0000075B Illegal entity in string expression0000075C Missing '('0000075D Missing ')'J0000075E String matrix and arithmetic matrix not allowed in same statement<0000075F�(RECORD�FREE)„Impossible�to�update�a�contigous�fileE00000760�illegal�operation�in�string�MAT‚(only�concatenation�allowed)E00000761 ZER/CON/IDN/SET/TRN/INV can operate on numeric matrices only000000762 NEXT not allowed as secondary statement100000763 value in brackets of SET must be numericA00000764 Illegal or missing line number in beginning of statement00000765 Invalid key after AT.00000766 Invalid format string in function STR700000767 Expected I,O,U after '%' in mode of OPEN file.D00000768 Expected mode of file (%I,%U,%O,%OV,%UV) in OPEN statement.900000769 GOTO not allowed in WHEN and ON INTR statements.,0000076A TRACE must be followed by ON or OFF50000076B missing '/' before the write protection.\D00F0000076C invalid or missing integer constant for write protection.\D00!0000076D matrix name missing.\D00-0000076E missing '=' after key-word RECL.\D00-0000076F missing '=' after key-word KEYL.\D00O*------------------------------------------------------------------------------ * Basic-m general error messagesO*------------------------------------------------------------------------------&00000770 Error \Z00 in trap 4 call\D0000000771 Rms error \Z00 \D00 00000772 Command line error \D0000000773 Bad options \D00"00000774 No such option \C0001\D0000000775 Bad z option\D0000000776 No '=' after z\D0000000777 '=' not allowed\D0000000778 No input file\D00&00000779 \Z00 edit file name error\D00 0000077A \Z00 access problem\D00.0000077B Overflow! request bigger z option\D00/0000077C Waiting for \L00 k-bytes of memory\D00*0000077D Overflow! resequence not done\D00"0000077E bad function no. \L00\D000000077F file already exits\D00"00000780 symbol table overflow\D00/00000781 warning! updated file is not saved\D00700000782 Can not run, compilation errors in program\D00J00000783 Can not assign logical unit 5 to user program, run terminated\D00J00000784 Can not assign logical unit 6 to user program, run terminated\D00F00@ 000785 Can not load run-time lo, error code \A00, run terminated\D00'00000786 Illegal interupt vector number400000787 GOTO is not allowed in interrupt processing100000788 LOGEN - unable to open \P temporary file500000789 LOGEN - unable to assign run-time library LO50000078A LOGEN - error in run-time library Lo reading>0000078B LOGEN - unable to read the \P temporary file, rc = \N10000078C LOGEN - run-time routine \P not in index?0000078D LOGEN - user routine \P was not added to library indexF0000078E LOGEN - unable to write a record to a temporary file, rc = \N40000078F LOGEN - run-time library index format error500000790 WHEN is used without D option - WHEN ignored700000791 TRACE is used without D option - TRACE ignoredN00000792 LOGEN - unable to write last record on the \P temporary file, rc = \N@00000793�LOGEN�-�unable�to�rewind�the‚\P�temporary�file,�rc�=�\NO00000794 LOGEN - attempt to write \N bytes to LO. Too big (more then one block),00000795 RUN - unable to start user task\D00$00000796 illegal logical unit number00000797 illegal FAB size00000798 illegal block size00000799 illegal record length50000079A conflict between formal and actual parameter,0000079B a subscript can't be of string typeB0000079C a logical primary must be either a relation or 'EOF(lun)'$0000079D missing '[' in bit-selectorJ0000079E bit selector is allowed only for simple-variable or array-elementI0000079F left side of assignment must be simple variable or array elementA000007A0‚INTERNAL:�"bin_code"�-�Illegal�operation�code�passed:�\NA000007A1‚INTERNAL:�"bin_tert"�-�Illegal�operation�code�passed:�\NL000007A2‚INTERNAL:�"nextwork"�-�Too�many�work-registers�needed�by�"bin_code"B000007A3‚INTERNAL:�"bin_special"�-�Illegal�command-code�passed:�\NG000007A4‚INTERNAL:�"bnflsmpl"�-�Illegal�var-kind�in�simple-var�node:�\NG000007A5‚INTERNAL:�"bnflarray"�-�Illegal�var-kind�in�array-var�node:�\NM000007A6‚INTERNAL:�"bnflopnd/bnflrutn"�-�Illegal�operand�node-type�passed:�\NH000007A7‚Code�size�is�greater�than�32KB�which�conflicts�with�'-B'�optionL000007A8‚INTERNAL:�"bincre"�-�Illegal�operand�address-mode�(MDxxx)�found:�\NN000007A9‚INTERNAL:�"binpseud"�-�Illegal�operand�address-mode�(MDxxx)�found:�\NE000007AA‚INTERNAL:�"binwrt"�-�Illegal�reacod-code�(WR_xxx)�passed:�\N;000007AB‚INTERNAL:�"binclose"�-�Write�on�ro-file�failed:�\PG000007AC‚STRING-CONSTANTS�and�FORMATS�section�size�is�greater�that�32KB5000007AD‚INTERNAL:�"binopen"�-�Can't�open�ro-file:�\PC000007AE‚INTERNAL:�"bntmopen"�-�Can't�re-open�temporary�ro-file:�\PD000007AF‚INTERNAL:�"bntmread"�-�Read�of�temporary�ro-file�failed:�\P;000007B0‚INTERNAL:�"bnwrbyte"�-�Write�on�ro-file�failed:�\P@000007B1‚INTERNAL:�"bncaddoff"�-�Illegal�address�mode�passed:�\N000007B2‚bad�assignmentE000007B3‚INTERNAL:�"bin_cmnd"�-�Width�of�machine-command�is�undefinedG000007B4‚digits�cannot�be�separated�by�'�'�in�IMAGE�statement�(use�'!')&000007B5‚quotation�mark�('"')�expected(000007B6�\D00‚CLOSE�of�input�file�failed)000007B7�\D00‚Access�of�input�file�failed5000007B8�\D00‚Failed�to�check�existence�of�input�file-000007B9�\D00‚WARNING�-�input�file�not�found!.000007BA�\D00‚ALLOCATION�of�E-code�file�failed"000007BB�\D00‚Input�file�NOT�FOUND6000007BC�\D00‚Line�number�not�in�order�after�line�\L00?000007BD same matrix in both sides of '=' in MAT MULTIPLICATION2000007BE 3-dimensional array in MAT MULTIPLICATION:000007BF INTERNAL: "Code_Gen" - Unrecognizable i-operation"000007C0�\D00‚Illegal�command�line(000007C1�\D00‚Illegal�input�file-name(s)&000007C2�\D00‚Allocation�of�ASQ�failed#000007C3�\D00‚Initialization�failed@000007C4�\D00‚Open�of�E-code�file,�after�initialization,�failed.N000007C5�\D00‚WARNING:�second�file-name�with�R-option�is�illegal.�Name�ignored0000007C6�\D00‚WARNING:�Listing�file�name�ignored1000007C7‚Illegal�parameters�for�built-in�function000007C8‚Illegal�expression000007C9000007CA=000007CB�\D00‚Unable�to�close�E-CODE�file�before�LIST�or�SAVE<000007CC�\D00‚Unable�to�open@ �E-CODE�file�before�LIST�or�SAVEB000007CD�\D00‚Unable�to�assign�E-CODE�file�back�after�LIST�or�SAVE9000007CE�\D00‚Unable�to�close�EMH�FILE�after�LIST�or�SAVEG000007CF�\D00‚Unable�to�get�a�syntax-error�message�text�in�LIST�or�SAVE5000007D0�\D00‚Unable�to�output�a�line�in�LIST�or�SAVE<000007D1�\D00‚Unable�to�close�E-CODE�file�after�LIST�or�SAVEO000007D2 \D00Unable to close output file after LIST or SAVE, file may be damage1000007D3�\D00‚Unable�to�delete�the�requested�line:000007D4�\D00‚Unable�to�close�EMH�file�after�adding�a�lineN000007D5�\D00‚Unable�to�get�a�syntax-error�message�text�after�a�new�line�added9000007D6�\D00‚Unable�to�close�E-CODE�file�for�DEL�command4000007D7�\D00‚Unable�to�delete�a�line�in�DEL�command8000007D8�\D00‚Unable�to�open�E-CODE�file�for�DEL�command9000007D9�\D00‚Unable�to�position�E-CODE�file�before�RESEQ5000007DA�\D00‚Unable�to�close�E-CODE�file�befor�RESEQ4000007DB�\D00‚Unable�to�assign�E-CODE�file�for�RESEQ.000007DC�\D00‚Unable�to�open�RESEQ�output�file7000007DD�\D00‚Unable�to�close�old�E-CODE�file�for�RESEQM000007DE�\D00‚Unable�to�write�last�record�to�new�E-CODE�file�in�RESEQ�command?000007DF�\D00‚Unable�to�delete�old�E-CODE�file�in�RESEQ�command?000007E0�\D00‚Unable�to�rename�new�E-CODE�file�in�RESEQ�command>000007E1�\D00‚Unable�to�close�new�E-CODE�file�in�RESEQ�commandA000007E2�\D00‚Unable�to�open�current�E-CODE�file�in�RESEQ�commandF000007E3�\D00‚Unable�to�assign�the�new�E-CODE�file�after�RESEQ�command7000007E4�\D00‚Unable�to�output�a�line�in�SYMBOL�commandI000007E5�\D00‚Unable�to�write�last�block�of�output�file�in�SYMBOL�command;000007E6�\D00‚Unable�to�close�output�file�in�SYMBOL�commandM000007E7�\D00‚Unable�to�close�E-CODE�file�after�range�counting�in�DEL�commandK000007E8�\D00‚Unable�to�assign�E-CODE�file�to�keyed�deleting�in�DEL�commandJ000007E9�\D00‚Unable�to�position�E-CODE�file�on�first�record�to�be�deletedI000007EA�\D00‚Unable�to�position�E-CODE�file�on�last�record�to�be�deleted;000007EB�\D00‚Unable�to�close�E-CODE�file�after�DEL�command<000007EC�\D00‚Unable�to�assign�E-CODE�file�after�DEL�commandJ000007ED�\D00‚Unable�to�write�an�output�record�to�new�E-CODE�file�in�RESEQ/000007EE�\D00‚Unable�to�open�SYMBOL�output�file.000007EF�\D00‚Unable�to�display�an�output�line)000007F0�\D00‚Unable�to�get�an�input�line:000007F1�\D00‚Unable�to�add�next�record�of�E-CODE�to�block3000007F2�\D00‚Unable�to�add�a�record�to�E-CODE�file=000007F3 Missing ENDEF / nesting of DEF statements is illegal9000007F4 Expected array name - array declaration missing.B000007F5 Definition must preceed use - name in DEF is already used0000007F6 Illegal transfer into a FOR or IF block)000007F7 Reference to illegal line numberC000007F8 ELSE or ENDIF statement without cooresponding IF statement0000007F9 FOR and IF statements nested too deeply#000007FA STEP size must not be zero.000007FB Anything after a statement is illegal000007FC Illegal statement typeH000007FD LOGEN - Unable to get a segment for the generated LO, rc is \N.-000007FE Reference to non-exstent line number7000007FF type of variables missing in a LOCAL statement00000800 illegal key lengthN00000801 The argument of LOC function must be either variable or array element00000802 illegal record number!00000803 illegal number of DIGITS00000804 illegal width of LINE00000805 illegal value of TAB400000806 impossible to specify FAB to contigous file400000807 key may be specified only for indexed files300000808 bad type of argument of intrinsic function00000809 illegal expressionE0000080A�illegal�operation�in�string�MAT‚(only�concatenation�allowed)10000080B value in brackets of SET must be numericE0000080C ZER/CON/IDN/SET/TRN/INV can operate on numeric matrices only00000080D NEXT not allowed as secondary statement"0000080E expected integer constant0000080F overflow in number800000810 bit-operand is illegal in INPUT/READ statements'00000811 incorrect number of parametersD00000812 imposA sible to specify 'overwrite' option for contigous file:00000813 'T' option is not available - option 'T' ignored.00000814 underflow in number00000815 illegal real number600000816 conflict with prior definitions - illegal '('100000817 missing parameter list or array selectorC00000818 conflict with prior definitions - subroutine name expectedJ00000819 conflict with prior definitions - sub-program in left side of '='60000081A conflict with prior definitions - missing '('40000081B array selector not allowed in MAT statement-0000081C expected array name in MAT statementH0000081D conflict with prior definitions - DEF/EXTERNAL must precede useK0000081E specifications must be in one statement and precede any use of var@0000081F external procedure forbidden as parameter / illegal '('@00000820 parameter name appears more than once in parameter list=00000821 local name appears more than once in LOCAL statementA00000822 local variable has been previously declared as parameterK00000823 variable after ADDRESS must be an already declared simple variable;00000824 expected simple variable as index of FOR statement<00000825 illegal READ/INPUT - variable is a sub-program name600000826 missing parenthesis or variable is not simple700000827 type of variables missing in a LOCAL statementM00000828 LOCAL statement allowed only in sub-program - check statements order+00000829 illegal operator for string matrixA0000082A array declarator for variable missing in a DIM statement10000082B string length must be in the range 1-25530000082C data-type of string length must be numeric;0000082D adjusted string length must be passed as parameter0000082E missing ')'90000082F equivalence between local and global not allowed.00000830 fatal! check scanalyzer and getsynu()00000831 doublely defined00000832 too many dimensions=00000833 only dummy array can contain variables as dimensions@00000834 dimension in array declarator must be a simple variable/00000835 variable dimension must be a parameter00000836 illegal dimension)00000837 missing ')' for array declarator600000838 array declarator must be of numeric data type 00000839 procedure name expected+0000083A illegal delimitor in DEF statement90000083B expected parameter after comma in parameter list10000083C missing sub-program name or '(' after it20000083D internal error in elesize() - missing dtp80000083E internal error in elenum() - missing dimensions"0000083F internal error in space() 00000840 incorrect internal type!00000841 illegal number of commas.00000842 unary minus must have numeric operand<00000843 operand(s) of IAND/IOR/IEOR must be of integer typeH00000844 operand of INOT must be of integer type (BYTE/INTEGER/DINTEGER);00000845�operand�of�FLOAT�or�DFLOAT‚must�be�of�integer�type/00000846�operand�of�ATNƒmust�be�of�integer�type500000847 operand of built-in function must be numeric'00000848 operand of RND must be numeric'00000849 operand of ABS must be numeric?0000084A parameter of LEN/ASC/TRIM/VAL/STR/CHR must be a stringA0000084B disagreement between type of actual and formal parameter,0000084C first param of MID must be a string70000084D second and third params of MID must be numeric60000084E parameter of SNGL must be of DOUBLE data-type*0000084F parameter of DBLE must be numericA00000850 parameter of ISHFT and IROT must be of integer data-type-00000851 PEEK/POKE parameters must be numeric.00000852 string notallowed as parameter of EOF/00000853 illegal operator for string expression.00000854 internal - disagreement of data-types*00000855 operands in power must be numeric200000856 operand(s) of SGN must be of integer type400000857 IDN operates only on two dimensional arrays500000858 arrays in TRN must be two dimensional arrays400000859 INV operates only on two dimensional arraysC0000085A string variable with adjusted length - must be a parameter0000085B useless MAT assignment>0000085C number of dimensions in MAT assignment A does not agree(0000085D number of dimensions must agree=0000085E INTERNAL: "Execute_Op" - undefined operand data type,0000085F unrecognized operator in MAT op MAT100000860 missing parameter in a built-in function$00000861 expecting right parenthesisB00000862 POKE is a subroutine and must not appear in an expression00000863 missing comma00000864 undecodable statementI00000865 undefined one-line-function or one-line-function reference errorK00000866 disagreement between types or number of actual and dummy arguments*00000867 internal fatal error in: "expars"#00000868 expression nested too deep00000869 expecting commaF0000086A�simple�variable‚or‚array�element�expected�in�left�side�of�'='*0000086B internal fatal error in: "sontof"-0000086C value in [] of SET - must be numericH0000086D number of dimensions in new working space must agree with array80000086E internal fatal: illegal node in Match_Convert()00000086F internal: no more buffer room available700000870 INTERNAL: "Execute_Op" - unrecognized operator?00000871 INTERNAL: "Convert" - unrecognized conversion operator?00000872 NonLOCAL specification occurs in an external procedure700000873 DATA statement occurs in an external procedure(00000874 Missing NEXT or ENDIF statement 00000875 Missing ENDEF statementB00000876 No reference to statement following RETURN, STOP, or GOTO700000877 Statement other than REM follows END statement>00000878 DEF statement not preceded by GOTO or ENDEF statementG00000879 ON ERROR or ON hardware-exception is not allowed in subroutine+0000087A EVERY is not allowed in subroutine-0000087B ON INTR is not allowed in subroutine*0000087C WHEN is not allowed in subroutine-0000087D‚ILLEGAL�OPTION(S)�IN�COMMAND�LINE�\P 0000087E‚CAN'T�OPEN�LISTING�FILE:0000087F Declaration of parameter must folow DEF statement800000880�\D00‚Unable�to�close�E-CODE�file�in�NEW�command=00000881�\D00‚Unable�to�delete�old�E-CODE�file�in�NEW�command?00000882�\D00‚Unable�to�allocate�new�E-CODE�file�in�NEW�command=00000883�\D00‚Unable�to�assign�new�E-CODE�file�in�NEW�commandO*------------------------------------------------------------------------------*ˆEND�BASIC�M�MESSAGESO*------------------------------------------------------------------------------****ˆ**�TRANSLATE�TABLE�FOR�NON�TRAP�MESSAGES*#2002A006 CANCELLED WAITING IN QUEUE(2002C001 NORMAL TERMINATION FROM RUNNING 2002C006 CANCELLED WHILE RUNNING2002C009 CANCELLED DUE TO BREAK+2002C010 ABORTED DUE TO BUS ERROR (ADDRESS).2002C011 TERMINATED DUE TO BUS ERROR (ADDRESS)*O*------------------------------------------------------------------------------**ˆFHS�/�IOS�ERROR�MESSAGES*18000002 INVALID COMMAND \K000C$18000003 INVALID LOGICAL UNIT \K000C918000004 INVALID OR NONEXISTENT VOLUME \K000C VOLN=\C0604*18000005 DUPLICATE FILE NAME \K000C \K000F,18000006 FILE DESCRIPTOR ERROR \K000C \K000F)18000007 PROTECT CODE ERROR \K000C \K000F418000008 RECORD LENGTH ERROR \K000C \K000F RECL=\W34+18000009 SHARED SEGMENT ERROR \K000C \K000F31800000A INSUFFICIENT DIRECTORY SPACE \K000C \K000F.1800000B ACCESS PERMISSION ERROR \K000C \K000F01800000C INSUFFICIENT SYSTEM SPACE \K000C \K000F 1800000D ASSIGNMENT ERROR \K000C#1800000E INVALID DEVICE TYPE \K000C1800000F BUFFER OVERFLOW \K000C!18000010 INVALID TASK NAME \K000C018000011 INVALID BUFFER ADDRESS \K000C BUFF=\Z12(18000012 INVALID FILE TYPE \K000C \K000F)18000013 INTERNAL FHS ERROR \K000C \K000F,18000014 INVALID PARAM BLOCK ADDRESS A0=\A00818000015 DATA BLOCK LENGTH ERROR \K000C \K000F SIZE=\Z36+18000016 SIZE ERROR \K000C \K000F SIZE=\Z36,18000017 NONEXISTENT FILE NAME \K000C \K000F 18000018 END OF DIRECTORY \K000C118000019 KEY LENGTH ERROR \K000C \K000F SIZE=\Z3611800001A FAB LENGTH ERROR \K000C \K000F SIZE=\Z36*1800001B DEFAULT VOLUME NOT DEFINED \K000C"1800001C INVALID STATE FOR COMMAND(1800001D USER NOT OWNER OR ADMINISTRATOR&180000CD DISK SPACE FULL \K000C \K000F1180000D1 UNRECB OVERABLE DEVICE ERROR \K000C \K000F)180000D2 DATA COMPARE ERROR \K0010 \K000F+180000D3 SECTOR PROTECT ERROR \K0010 \K000F180000D4 DEVICE NOT MOUNTED'180000E1 DEVICE NOT READY \K000C \K000F"180000E2 DEVICE BUSY \K000C \K000F%180000E3 DATA CRC ERROR \K0010 \K000F-180000E4 WRITE PROTECTED DEVICE \K000C \K000F1180000E5 DELETED DATA MARK DETECTED \K0010 \K000F180000E6 TIMEOUT \K000C \K000F-180000E7 INVALID SECTOR ADDRESS \K000C \K000F%180000E8 CHECKSUM ERROR \K000C \K000F)180000E9 DISK RESTORE ERROR \K000C \K000F#180000EA DATA OVERRUN \K000C \K000F,180000EB DEVICE STATUS CHANGED \K000C \K000F0180000EC TRACK/SECTOR ID NOT FOUND \K0010 \K000F-180000ED ADDRESS MARK CRC ERROR \K0010 \K000F!180000EE SEEK ERROR \K000C \K000F!180000EF BAD SECTOR \K0010 \K000F#180000F1 CHANNEL BUSY \K000C \K000F(180000F2 CHANNEL DMA ERROR \K000C \K000F2180000F3 UNRECOVERABLE CHANNEL ERROR \K000C \K000F'180000F4 CONTROLLER ERROR \K000C \K000F1180000F5 DEVICE CONFIGURATION ERROR \K000C \K000F$180000F6 DMA BUS ERROR \K000C \K000F(180000F7 DMA MAPPING ERROR \K000C \K000F+180000F8 DMA CONTROLLER ERROR \K000C \K000F2180000F9 INDETERMINATE CHANNEL ERROR \K000C \K000FO*------------------------------------------------------------------------------)1000000C INSUFFICIENT SYSTEM SPACE \K000C 10000082 INVALID FUNCTION \K000C$10000083 INVALID LOGICAL UNIT \K000C-10000084 INVALID DATA BUFFER \K000C BUFF=\Z12.10000085 INVALID RANDOM RECORD \K000C RRN=\Z08,10000086 INVALID PARAM BLOCK ADDRESS A0=\A00"10000087 PROTECT CODE ERROR \K000C10000088 CONFIGURATION ERROR2100000C1 BUFFER OVERFLOW/RECORD SIZE TOO BIG\K000C100000C2 END OF FILE \K000C100000C3 END OF VOLUME \K000C$100000C4 INVALID OR EMPTY FAB \K000C+100000C5 INVALID TRANSFER FOR DEVICE \K000C100000C6 BREAK CONDITION \K000C!100000C7 INTERNAL IO ERROR \K000C'100000C8 FAB/DATA BLOCK CONFLICT \K000C%100000C9 RECORD DOES NOT EXIST \K000C%100000CA RECORD ALREADY EXISTS \K000C>100000CB RECORD OVERFLOW/TOO MANY RECORDS IN DATA BLOCK \K000C+100000CC KEY ERROR, FAB KEY CONFLICT \K000C100000CD DISK SPACE FULL \K000D*100000D1 UNRECOVERABLE DEVICE ERROR \K000D"100000D2 DATA COMPARE ERROR \K000E$100000D3 SECTOR PROTECT ERROR \K000E"100000D4 DEVICE NOT MOUNTED \K000D-100000D5 BEGINNING OF TAPE ENCOUNTERED \K000C2100000D7 A TAPE IS ALREADY MOUNTED ON DRIVE \K000C 100000E1 DEVICE NOT READY \K000D100000E2 DEVICE BUSY \K000D100000E3 DATA CRC ERROR \K000E&100000E4 WRITE PROTECTED DEVICE \K000D*100000E5 DELETED DATA MARK DETECTED \K000E100000E6 TIMEOUT \K000D&100000E7 INVALID SECTOR ADDRESS \K000D100000E8 CHECKSUM ERROR \K000D"100000E9 DISK RESTORE ERROR \K000D100000EA DATA OVERRUN \K000D%100000EB DEVICE STATUS CHANGED \K000D)100000EC TRACK/SECTOR ID NOT FOUND \K000E&100000ED ADDRESS MARK CRC ERROR \K000E100000EE SEEK ERROR \K000D100000EF BAD SECTOR \K000E100000F1 CHANNEL BUSY \K000D!100000F2 CHANNEL DMA ERROR \K000D3100000F3 CHANNEL UNRECOVERABLE CHANNEL ERROR \K000D 100000F4 CONTROLLER ERROR \K000D*100000F5 DEVICE CONFIGURATION ERROR \K000D100000F6 DMA BUS ERROR \K000D!100000F7 DMA MAPPING ERROR \K000D$100000F8 DMA CONTROLLER ERROR \K000D+100000F9 INDETERMINATE CHANNEL ERROR \K000D*"*ˆTRANSLATE�TABLE�FOR�IOSFCT�FIELD* 30000001 READ30000002 WRITE30000004 OUTPUT WITH INPUT30000008 UPDATE30000010 DELETE30000020 FORMAT30000101 POSITION30000102 REWIND30000104 TEST I/0 COMPLETE 30000108 WAIT30000110 HALT I/O30000120 BREAK*"*ˆTRANSLATE�TABLE�FOR�FHSCMD�FIELD*38000001 CHECKPOINT38000002 DELETE38000004 CLOSE38000008 CHANGE PROTECT CODES38000010 RENAME38000020 CHANGE ACCESS38000040 ASSIGN38000080 ALLOCATE380000C0 ALLOCATE/ASSIGN38000108 FETCH DEFAULT VOLUME38000110 CHANGE LU38000120 FETCH DEVICE MNEMONICS38000140 FETCH DIR. ENTRY38000180 RETRIEVE ATTRIBUTES38000204 DISPLAY SPOOLER QUEUE38000208 CHANGE COPIES38000210 PRINT FILE38000220 CHANGE FORMS38000240 CONTINUE SPOOLER JOB38000280 CANCEL SPOOLER JOB38008001B  SET DEFAULT VOLUME**O*------------------------------------------------------------------------------**’TRAP�1�RELATED�MESSAGES**.08010003 NONEXISTENT TARGET TASK (GTSEG)\K0016#08010005 SEGMENT TABLE FULL (GTSEG)'08010006 DUPLICATE SEGMENT NAME (GTSEG)008010007 REQUESTED MEMORY DOES NOT EXIST (GTSEG)$08010008 INSUFFICIENT MEMORY (GTSEG)(0801000A NON-DORMANT TARGET TASK (GTSEG))0801000B LOGICAL ADDRESS CONFLICT (GTSEG).08020003 NONEXISTENT TARGET TASK (DESEG)\K0016/08020007 NONEXISTENT SEGMENT NAME (DESEG)\K0016(0802000A NON-DORMANT TARGET TASK (DESEG)00803000B SEGMENT ERROR - TASK LINKED INCORRECTLY$08040005 SEGMENT TABLE FULL (ATTSEG)(08040006 DUPLICATE SEGMENT NAME (ATTSEG)008040007 NONEXISTENT SEGMENT NAME (ATTSEG)\K0016*0804000B LOGICAL ADDRESS CONFLICT (ATTSEG)'08060003 SOURCE TASK NOT FOUND (MOVELL),08060007 DESTINATION TASK NOT FOUND (MOVELL)108060009 USER TO SYSTEM TASK NOT ALLOWED (MOVELL)70806000B ADDRESSES DIFFERENT EVEN/ODD BOUNDARY (MOVELL)&08090003 TARGET TASK NOT FOUND (RCVSA)$080B0006 DUPLICATE TASK NAME (CRTCB)$080B0008 INSUFFICIENT MEMORY (CRTCB)*080D0003 TASK DOES NOT EXIST (START)\K0016*080D0023 TASK DOES NOT EXIST (START)\K0017!080D000A TASK NOT DORMANT (START)108100003 TARGET TASK DOES NOT EXIST (TERMT)\K0016108100023 TARGET TASK DOES NOT EXIST (TERMT)\K0017308100006 TARGET TASK ALREADY IN TERMINATION (TERMT):08100009 USER TASK CAN NOT TERMT SYSTEM TASK OR SELF\K0016308170003 TARGET TASK DOES NOT EXIST (TSKATTR)\K0016308170023 TARGET TASK DOES NOT EXIST (TSKATTR)\K0017,0817000A TASK IS TERMINATING (TSKATTR)\K0016008190003 TARGET TASK DOES NOT EXIST (STOP)\K0016008190023 TARGET TASK DOES NOT EXIST (STOP)\K0017$08190006 TARGET TASK ALREADY STOPPED108190009 USER TASK CAN NOT STOP SYSTEM TASK\K0016**O*------------------------------------------------------------------------------**ˆTRAP�4�RELATED�MESSAGES*#20000001 UNDEFINED DIRECTIVE NUMBER?20000012 LOAD SEGMENT LOGICAL ADDRESS EXCEEDS SEGMENT BOUNDRIES+20000013 FILE REFERENCED IS NOT A LOAD FILE****O*------------------------------------------------------------------------------;***********************************************************;*----------------------------------------------------------*-* The following are the Pascal error messages*;*----------------------------------------------------------$00001001 Case index out of range\D0000001002 Value out of range\D00%00001004 Integer division by zero\D00;00001008 Bus error - bad pointer or stack/heap overflow\D00 00001010 Stack/heap overflow\D00?00001011 Address error - bad pointer or stack/heap overflow\D00?00001012 Memory allocation error during processing Z option\D00+00001013 Data segment name must be SEG2\D00"00001022 Read past end of file\D0000001028 Illegal file name\D00*00001031 Integer expected in text file\D00'00001032 Real expected in text file\D00*00001033 Boolean expected in text file\D00?00001040 Too many files in use, or unrecognizable device ID\D00100001041 Option error in 'reset' or 'rewrite'\D00)00001042 Too many command line fields\D00#00001043 File not open at input\D00$00001044 File not open at output\D00200001051 Real number out of range in text file\D00700001052 Attempt to enable 6809 floating point trap\D00900001053 Attempt to set 6809 floating point exception\D00>00001054 Attempt to set 6809 floating point precision mode\D00200001062 Invalid base for integer in text file\D00900001063 Invalid digit for based integer in text file\D00#00001070 Attempt to take NAN(0)\D00?00001099 Illegal TRAP 14 error code - internal Pascal error\D00;*----------------------------------------------------------<* The following are the Pascal floating point error messages;*----------------------------------------------------------'00002000 No invalid operation error\D00"00002100 Illegal SQRT argument\D00500002200 (+infinity) + (-infinity) in affine mode\D00700002300 Conversion of a nC ot-a-number to an integer\D0000002400 Illegal division\D00400002500 An argument was a trapping not-a-number\D00G00002600 Unordered condition tested by predicate other than = or <>\D00300002700 Projective closure use of +/- infinity\D0000002800 0 * infinity\D00"00002900 Illegal REM arguments\D00K00002A00 Binary-to-decimal or decimal-to-binary conversion out of range\D00D00002B00 Moved single precision unnormalized to double precision\D00G00002C00 Returned unnormalized number to single or double precision\D0000002001 Invalid operation\D0000002002 Overflow\D0000002004 Underflow\D0000002008 Division by zero\D0000002010 Inexact result\D00B00002020 Overflow on conversion from floating point to integer\D00:00002040 Reserved exponent value seen as input operand\D00;*----------------------------------------------------------* End of Pascal error messages;*----------------------------------------------------------*$*ˆVERSAdos�Operating�System�Messages*+20010013 FILE REFERENCED IS NOT A LOAD FILEO*------------------------------------------------------------------------------?*--------------------------------------------------------------"* FORTRAN COMPILER ERROR MESSAGES.?*--------------------------------------------------------------900003002‚INVALID�CHARACTER�APPEARS�IN�COLUMNS�1-5�OF�LINE600003003‚THE�STATEMENT�NUMBER�HAS�ALREADY�BEEN�DEFINED?00003004‚THE�FIRST�CHARACTER�OF�THE�STATEMENT�IS�NOT�ALPHABETICL00003005‚CONTINUATION�LINE�ENCOUNTERED�WHEN�COMMENT�OR�INITIAL�LINE�EXPECTED/00003006‚LIMIT�OF�9�CONTINUATION�LINES�EXCEEDED900003007‚COLUMNS�1-5�OF�A�CONTINUATION�LINE�ARE�NOT�BLANK 00003009‚MISSING�'END'�STATEMENTI00003010‚THE�NAME�\P�IS�TOO�LONG.‚IT�HAS�BEEN�TRUNCATED�TO�SIX�CHARACTERS00003011‚SYMBOL�TABLE�OVERFLOW00003014‚REAL�CONSTANT�OVERFLOW00003015‚ILLEGAL�COMMAND�LINE 00003016‚INVALID�CONSTANT�FORMAT"00003017‚INTEGER�CONSTANT�OVERFLOW?00003018‚INTERNAL�ERROR:�illegal�node�type�found�in�"Code_Gen".$00003022‚EXPECTING�RIGHT�PARENTHESIS00003023‚EXPECTING�SINGLE�QUOTE00003025‚UNDECODABLE�STATEMENT00003026‚INVALID�CHARACTER‚\P?00003033‚INVALID�STATEMENT�AFTER�END�STATEMENT.‚IT�WAS�IGNORED.*00003035‚ILLEGAL�OPTION(S)�IN�COMMAND�LINE 00003036‚ILLEGAL�INPUT�FILE�NAME!00003037‚ILLEGAL�OUTPUT�FILE�NAME"00003038‚ILLEGAL�LISTING�FILE�NAME00003040‚MISSING�PROGRAM�NAME 00003041‚MISSING�SUBROUTINE�NAME00003042‚MISSING�FUNCTION�NAMEG00003044‚NON-SYMBOLIC�NAME�IS�SPECIFIED�IN�TYPE�SPECIFICATION�STATEMENT$00003045‚INVALID�ARRAY�DECLARATOR‚\P#00003047‚EXPECTED�COMMON�BLOCK�NAME00003048‚MISSING�COMMA100003049‚NON-SYMBOLIC�NAME�IN�AN�EQUIVALENCE�LISTG00003051‚INCORRECT�LENGTH�SPECIFICATION�IN�TYPE�SPECIFICATION�STATEMENT500003052‚MISSING�LIST�OF�NAMES�IN�INTRINSIC�STATEMENTC00003053‚INVALID�TYPE�OR�LENGTH�SPECIFICATION�IN�IMPLICIT�STATEMENT000003054‚INVALID�LETTER�IN�IMPLICIT�STATEMENTƒ\P+00003055‚INVALID�DIMENSION�DECLARATOR�IN�\PM00003056‚THE�LENGTH�OF�A�LITERAL�IS�LONGER�THAN�THE�VARIABLE�OR�ARRAY�ELEMENT200003064‚ILLEGAL�STATEMENT�IN�BLOCKDATA�SUBPROGRAMM00003065‚ATTEMPT�TO�DEFINE�A�PREVIOUSLY�DEFINED�NAME�IN�EXTERNAL�STATEMENT�\PM00003067‚NAME�IN�AN�INTRINSIC�STATEMENT�MUST�BE�AN�INTRINSIC�FUNCTION�NAME�\PN00003069‚ATTEMPT�TO�DEFINE�A�PREVIOUSLY�DEFINED�NAME�IN�INTRINSIC�STATEMENT�\PF00003070‚ATTEMPT�TO�DEFINE�A�PREVIOUSLY�DEFINED�NAME�IN�SAVE�STATEMENTD00003072‚ATTEMPT�TO�ESTABLISH�THE�TYPE�OF�A�CHARACTER�MORE�THAN�ONCEM00003073‚THE�RANGE�OF�LETTERS�IN�AN�IMPLICIT�STATEMENT�LIST�IS�NOT�ALPHABETICL00003079‚ATTEMPT�TO�DEFINE�A�PREVIOUSLY�DEFINED�NAME�AS�A�COMMON�VARIABLE�\P:00003083‚WRONG�NUMBER�OF�SUBSCRIPTS�IN�AN�EQUIVALENCE�LISTC00003085‚A�VARIABLE'S�DIMENSION�IS�NOT�A�SIMPLE�INTEGER�VARIABLE�\PC00003086‚ATTEMPTING�TO�USE�A�PREVIOUSLY�DEFINED�NAME�AS�AN�ARRAY�\PN00003087‚AN�ADJUSTABLE�ARRAY�OR�ASSUMED�SIZE�ARRAY�MUST�BE�A�DUMMY�ARGUMENT�\P000003088‚ATTEMPTING�TO�REDIMENSION�A�VARIABLE�\P<00003090‚INVALID�FORMAC T�OF�AN�ASSUMED�SIZE�ARRAY�DECLARATIONK00003092‚A�VARIABLE�DIMENSION�\P�IS�NOT�A�DUMMY�ARGUMENT�OR�COMMON�VARIABLE000003093‚MORE�THAN�3�DIMENSIONS�FOR�THE�ARRAY�\P;00003098‚INVALID�SYMBOLIC�NAME�APPEARS�IN�DATA�STATEMENT‚\PB00003099‚A�VARIABLE�WAS�PREVIOUSLY�INITIALIZED�IN�A�DATA�STATEMENTK00003100‚ATTEMPT�TO�INITIALIZE�NAMED�COMMON�ENTITY�\P�NOT�IN�BLOCK�DATA�SUB<00003101‚ATTEMPTING�TO�INITIALIZE�A�BLANK�COMMON�VARIABLE�\P/00003102‚TYPE�OF�DATA�AND�VARIABLE�DO�NOT�MATCH100003108‚A�FUNCTION�MUST�NOT�BE�OF�TYPE�CHARACTERB00003112‚ADJUSTABLE�ARRAYS�ARE�VALID�ONLY�IN�PROCEDURE�SUBPROGRAMS-00003123‚INVALID�REFERENCE�TO�SUBROUTINE�NAMEG00003126‚A�DO�LOOP�PARAMETER�IS�NOT�AN�INTEGER�EXPRESSION�OR�IS�MISSING600003131‚THE�DO�INDEX�IS�NOT�A�SIMPLE�INTEGER�VARIABLE500003133‚MISSING�INPUT/OUTPUT�LIST�IN�IMPLIED�DO�LISTD00003135‚TYPE�DISAGREEMENT�BETWEEN�LEFT�AND�RIGHT�SIDE�OF�EQUAL�SIGN=00003139‚ILLEGAL�SEQUENCE�OF�OPERATORS/OPERANDS�IN�EXPRESSION<00003143‚TYPE�DISAGREEMENT�BETWEEN�ACTUAL�AND�DUMMY�ARGUMENT00003150‚DIVIDE�BY�ZEROL00003152‚UNDEFINED�STATEMENT�FUNCTION,�OR�STATEMENT�FUNCTION�REFERENCE�ERRORN00003154‚STATEMENT�FUNCTION�STATEMENT�NAME�CONFLICTS�WITH�PRIOR�DEFINITIONS�\PJ00003155‚DISAGREEMENT�BETWEEN�TYPE�OR�NUMBER�OF�ACTUAL�AND�DUMMY�ARGUMENTSN00003156‚MISMATCH�IN�NUMBER�OF�ACTUAL�AND�DUMMY�ARGUMENTS�IN�AN�INTRINSIC�FUNC00003157‚\P�IS�DOUBLY�DEFINEDF00003158‚PROCEDURE�\P�APPEARS�AS�ARGUMENT�WITHOUT�EXTERNAL�DECLARATION?00003159‚THERE�IS�AN�ASSUMED�SIZE�ARRAY�IN�INPUT/OUTPUT�LIST�\PN00003160‚STATEMENT�FUNCTION�STATEMENT�NAME�\P�PASSED�AS�PARAMETER�OR�IN�COMMONF00003163‚THERE�IS�AN�ERROR�ON�THE�LEFT�SIDE�OF�AN�ASSIGNMENT�STATEMENT+00003166‚UNDECODABLE�TYPE�OF�GOTO�STATEMENT100003172‚LOGICAL�IF�CONTAINS�ILLEGAL�STATEMENT(S)800003174‚DO�CONTROL�VARIABLE�USED�PREVIOUSLY�IN�THE�NEST)00003175‚ILLEGAL�TERMINAL�STATEMENT�OF�DO*00003179‚RECORD�AND�EOF�SPECIFIER�CONFLICT-00003180‚FORMAT�AND�RECORD�SPECIFIER�CONFLICTF00003181‚MISSING�FORMAT�IDENTIFIER�WHERE�AN�INTERNAL�FILE�IS�SPECIFIED400003182‚INTERNAL�FILE�AND�RECORD�SPECIFIER�CONFLICT:00003183‚WRITE�STATEMENT�MUST�NOT�CONTAIN�AN�EOF�SPECIFIER500003189‚RETURN�STATEMENT�APPEARS�IN�THE�MAIN�PROGRAM+00003195‚MAIN�PROGRAM�HAS�NO�STOP�STATEMENT>00003197‚FUNCTION�VALUE�NOT�DEFINED�IN�THE�FUNCTION�SUBPROGRAM.00003199‚ANYTHING�AFTER�A�STATEMENT�IS�ILLEGAL"00003200‚EXPECTING�STATEMENT�LABEL-00003201‚EXPECTING�COMMA�OR�RIGHT�PARENTHESIS 00003203‚EXPECTING�SYMBOLIC�NAME-00003204‚EXPECTING�COMMA�OR�RIGHT�PARENTHESIS#00003205‚EXPECTING�LEFT�PARENTHESIS00003206‚EXPECTING�COMMA00003207‚EXPECTING�EQUAL�SIGNK00003208‚EXPECTING�LABEL,�SYMBOLIC�NAME,�CHARACTER�CONSTANT,�'REC'�OR�'END'00003211‚EXPECTING�'DIRECT'00003215‚EXPECTING�'THEN'00003218‚EXPECTING�'TO'*00003220‚MULTIPLE�'END'�OR�'REC'�SPECIFIEDK00003224‚NO�STATEMENT�LABEL�AFTER�ARITHMETIC�IF,�'GOTO',�'STOP'�OR�'RETURN'-00003226‚REFERENCE�TO�ILLEGAL�STATEMENT�LABELM00003227‚ILLEGAL�TRANSFER�INTO�DO�LOOP,�IF�BLOCK,�ELSE�IF�BLOCK�OR�ELSE�BLOCK(00003230‚INCREMENTAION�PARAMETER�IS�ZERO@00003235‚THE�DO�CONTROL�VARIABLE�IS�REDEFINED�WITHIN�THE�DO�LOOP-00003237‚THE�VARIABLE�MUST�BE�OF�TYPE�INTEGERF00003251‚MORE�THAN�THREE�LEVELS�OF�PARENTHESES�IN�FORMAT�SPECIFICATIONG00003254‚NUMERIC�SPECIFICATION�GREATER�THAN�255�IN�FORMAT�SPECIFICATION>00003255‚NUMERIC�SPECIFICATION�IS�ZERO�IN�FORMAT�SPECIFICATION@00003257‚DIGITS�OF�FRACTIONAL�PART�EXCEED�TOTAL�DIGITS�OF�NUMBERK00003260‚CHARACTER�CONSTANT�LENGTH�GREATER�THAN�255�IN�FORMAT�SPECIFICATION%00003261‚MISSING�'N'�OR�'Z'�AFTER�'B'K00003265‚THE�FIRST�CHARACTER�OF�A�CHARACTER�FORMAT�SPECIFICATION�IS�NOT�'('/00003267‚NO�STATEMENT�LABEL�ON�FORMAT�STATEMENT000003270‚FORMAT�INDEX�VARIABLE�MUST�BE�INTEGER*4C00003271‚Useless�data�type�-�expected�variable,array�or�function�\P=00003272‚Overflow�in�Hexadecimal�number�(more�than�8�digits).400003273‚Illegal�character�in�Hexadecimal�number.�\P200003274‚Missing�ending�'HD '�in�Hexadecimal�number.:00003275‚Unrecognized�name�of�LOGICAL/RELATIONAL�operator.'00003276‚Double-real�constant�overflow.800003277‚More�than�one�period�detected�in�real�constant.:00003278‚More�than�one�exponent�detected�in�real�constant.$00003279‚Underflow�in�real�constant.K00003281‚TWO�DIFFERENT�VARIABLE�TYPES�ARE�BOUND�BY�EQUIVALENCE�STATEMENT�\PK00003282‚TWO�EQUIVALENCED�CHARACTER�ENTITIES�DO�NOT�HAVE�THE�SAME�LENGTH�\PI00003283‚TWO�DIFFERENT�ARRAY�ELEMENTS�ARE�ASSIGNED�TO�THE�SAME�ADDRESS�\PM00003285‚CHARACTER�DATA�AND�NONCHARACTER�DATA�CANNOT�BE�IN�THE�SAME�COMMON�\PI00003287‚COMMON�BLOCK�STORAGE�CANNOT�BE�EXTENDED�UPWARD�BY�EQUIVALENCE�\PB00003289‚A�COMMON�VARIABLE�AND�A�SAVE�VARIABLE�ARE�EQUIVALENCED‚\P@00003290‚ELEMENTS�OF�DIFFERENT�COMMON�BLOCKS�ARE�EQUIVALENCED�\PC00003293‚THE�SUBSCRIPT�OF�\P�IN�AN�EQUIVALENCE�STATEMENT�IS�INVALID00003297‚CAN'T�OPEN�INPUT�FILE 00003298‚CAN'T�OPEN�LISTING�FILE00003300‚INTERNAL�ERROR'00003301‚Integer�expression�is�expected+00003302‚Number�should�be�greater�than�zero700003303‚EOF�must�not�be�specified�for�an�internal�fileB00003304‚Format�identifier,�if�any,�must�be�second�item�in�ciolist00003305‚Unexpected�equal�sign%00003306‚Illegal�format�specificationE00003307‚Implied-do�control�variable�is�not�a�simple�integer�variable900003308‚Implied-do�loop�has�too�many�simple�iolist�items900003309‚DO�control�variable�\P�is�redefined�in�an�iolistA00003310‚Implied-do�control�variable�is�redefined�in�an�iolist�\P$00003311‚Unexpected�left�parenthesis%00003312‚Unexpected�right�parenthesis00003313‚Unexpected�comma00003314‚Unexpected�slash00003315‚Unexpected�number00003316‚Unexpected�minus�sign00003317‚Unexpected�apostrophe*00003318‚Unexpected�B�format�specification'00003319‚Illegal�X�format�specification*00003320‚Unexpected�I�format�specification*00003321‚Unexpected�L�format�specification*00003322‚Unexpected�A�format�specification*00003323‚Unexpected�D�format�specification*00003324‚Unexpected�E�format�specification*00003325‚Unexpected�F�format�specification800003326‚Number�is�missing�before�P�format�specification800003327‚Number�is�missing�before�H�format�specificationA00003328‚A�non-logical�operand�\P�appears�in�a�logical�expression$00003329‚Unexpected�end-of-statement100003330‚Unexpected�character�in�format�statement00003331‚Missing�field�width)00003332‚Internal�error�-�name�not�found.&00003333‚Illegal�use�of�module�name�\PG00003334‚Attempted�to�pass�statement-function-statement�name�as�address,00003335‚Conflict�with�prior�definitions:�\P.00003336‚Illegal�attempt�to�pass�\P�as�addressC00003337‚No�INTRINSIC�statement�for�\P�but�it�is�passed�as�argument700003338‚An�attempt�was�made�to�assign�the�procedure�\P400003339‚Procedure�name�\P�appears�in�DATA�statement000003340‚Unbalanced�parentheses�in�IF�statement.L00003341‚Internal�-�name�in�attribute�table�does�not�start�with�alpha�charac$00003342‚Internal�-�hash�table�full.;00003343‚Expected�variable�name�or�array�name�instead�of�\PH00003344‚Dummy�argument�\P�appears�more�than�once�in�dummy�argument�listL00003345‚Dummy�argument�list�missing�-�parentheses�must�appear�even�if�empty00003346‚'RECL'�expected00003347‚'ACCESS'�expected-00003348‚Missing�elements�in�EQUIVALENCE�list00003349‚Slash�expectedB00003350‚Dummy�argument�or�SAVEd�entitity�\P�not�allowed�in�COMMON.00003351‚Array�elements�not�allowed�in�SAVE‚\P?00003352‚Dummy�argument�or�COMMON�entity�\P�not�allowed�in�SAVEM00003353‚SAVE�entities�must�be�simple�variables,�array�names�or�common�blocks*00003354‚Numeric�integer�constant�expected:00003355‚Dummy�argument�\P�not�allowed�in�EQUIVALENCE�list100003356‚RETURN�missing�in�function�or�subroutineJ00003357‚More�than�one�header�(PROGRAM,�FUNCTION,�SUBROUTINE�or�BLOCKDATA)$00003358‚Illegal�order�of�statements800003359‚Missing�DATA�statements�in�BLOCKDATA�subprogram&00003360‚Missing�executable�statements00003361‚Unclosed�blocks300003362‚Illegal�statements�in�BLOCKD DATA�subprogram600003363‚Illegal�characters�in�STOP�or�PAUSE�statement400003364‚Missing�dimension�number�in�attribute�of�\P700003365‚"bin_code"�-�Illegal�operation�code�passed:�\NL00003366‚INTERNAL:�"nextwork"�-�Too�many�work-registers�needed�by�"bin_code"B00003367‚INTERNAL:�"bin_special"�-�Illegal�command-code�passed:�\NG00003368‚INTERNAL:�"bnflsmpl"�-�Illegal�var-kind�in�simple-var�node:�\NG00003369‚INTERNAL:�"bnflarray"�-�Illegal�var-kind�in�array-var�node:�\NM00003370‚INTERNAL:�"bnflopnd/bnflrutn"�-�Illegal�operand�node-type�passed:�\NH00003371‚Code�size�is�greater�than�32KB�which�conflicts�with�'-B'�optionL00003372‚INTERNAL:�"bincre"�-�Illegal�operand�address-mode�(MDxxx)�found:�\NN00003373‚INTERNAL:�"binpseud"�-�Illegal�operand�address-mode�(MDxxx)�found:�\N600003374‚INTERNAL:�"binopen"�-�Cant't�open�ro-file:�\PC00003375‚INTERNAL:�"bntmopen"�-�Can't�re-open�temporary�ro-file:�\PD00003376‚INTERNAL:�"bntmread"�-�Read�of�temporary�ro-file�failed:�\PE00003377‚INTERNAL:�"binwrt"�-�Illegal�reacod-code�(WR_xxx)�passed:�\NN00003378‚SAVE+COMMON�code�is�greater�than�32KB�which�conflicts�with�'C'�option;00003379‚INTERNAL:�"bnwrbyte"�-�Write�on�ro-file�failed:�\P;00003380‚INTERNAL:�"binclose"�-�Write�on�ro-file�failed:�\P00003381‚Nesting�errorG00003382‚STRING-CONSTANTS�and�FORMATS�section�size�is�greater�that�32KB00003383‚Illegal�integer�number=00003384‚CHARACTER�LENGTH�OF�BOTH�OPERANDS�SHOULD�BE�THE�SAME(00003385‚Illegal�syntax�in�DATA�statment)00003386‚Inconsistent�subscript�reference+00003387‚Unequal�number�of�names�and�valuesM00003388‚Attempt�to�initialize�nonCOMMON�variable�\P�in�BLOCK�DATA�subprogram300003389‚Subscript�of�\P�is�not�an�integer�constant100003390‚FATAL�error�in�DATA�-�data�table�is�full?00003391‚FATAL�error�in�data/keep_gen�-�keep_gen�got�odd�offset900003393‚MISMATCH�BETWEEN�OPERAND�AND�OPERATOR�DATA�TYPES00003394‚UNDEFINED�LABEL�\N00003395‚FIXED-POINT�OVERFLOWD00003396‚FIXED-POINT�ZERO�RAISED�TO�POWER�OF�NEGATIVE�OR�ZERO�NUMBER*00003397‚Unexpected�Z�format�specification*00003398‚Unexpected�G�format�specification00003399‚PROGRAM�IS�EMPTY100003400‚INTERNAL�FATAL�ERROR�IN:ƒ"match_convert",00003401‚INTERNAL�FATAL�ERROR�IN:ƒ"subst_op".00003402‚INTERNAL�FATAL�ERROR�IN:ƒ"execute_op"+00003403‚INTERNAL�FATAL�ERROR�IN:ƒ"convert"*00003404‚INTERNAL�FATAL�ERROR�IN:ƒ"expars"=00003405‚INTERNAL�FATAL�ERROR�IN„"elesize"�(VARIABLE�NAME�\P)#00003406‚EXPRESSION�NESTED�TOO�DEEP*00003407‚INTERNAL�FATAL�ERROR�IN:ƒ"sintof"000003408‚INTERNAL:�no�more�buffer�room�available(00003409‚INTERNAL:�attributes�table�full(00003410‚INTERNAL:�an�I/O�error�occurredO*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *ˆTEST�LINEO*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~éé    ƒ=====================ƒREPAIR�SPECIFICATIONSƒ===================== 1. REPAIR PROCESS CƒREPAIR�detects�errors�in�a�VERSAdos�disk�or�diskette�which�has�badDƒdisk�control�table�information.�Errors�are�found�and�identified�and@ƒan�attempt�is�made�to�correct�errors�with�minimal�loss�of�data.BƒREPAIR�may�also�be�run�to�change�disk�contents�or�to�dump�sectorsƒor�disk�structures.DƒREPAIR�can�be�run�to�process�the�entire�volume�or�only�a�particularƒfile�on�the�volume.MƒREPAIE R�may�also�be�executed�to�recover�deleted�file(s)�as�long�as�the�file'sLƒdata�blocks�and�FABs�have�not�been�reallocated�to�other�uses�after�the�file ƒwas�deleted.  2. COMMAND LINE SYNTAX -ƒREPAIR‚voln:un[.cat.fn.ex][,#PR][;[N][C][R]]ƒorƒREPAIR�#devn[,#PR][;[N][C][R]] ƒwhere‰voln†volume�name‰unˆuser�number‰cat‡catalog�name ‰fnˆfile�name ‰exˆextension‰devn†device�mnemonic EƒVolume�repair�is�done�if�'#devn'�or�only�'voln:un'�is�given.�All�the<ƒstructures�on�the�disk�are�checked�and�processed�by�REPAIR. FƒFile�repair�is�done�if�'voln:un.cat.fn.ex'�is�given.�Only�the�primaryKƒdirectory�block�entry�and�the�file's�data�block(s)�and�FAB(s),�if�any,�areJƒchecked�and�processed.�The�other�structures�on�the�disk�are�assumed�to�be ƒcorrect. JƒREPAIR�output�can�be�duplicated�on�the�line�printer�in�the�noninteractiveHƒor�check-only�modes,�see�N�and�C�options�below.‚As�a�default�and�in�the7ƒinteractive�mode�the�output�goes�only�to�the�terminal. 3. OPTIONS ƒDefault�processing=‰-�interactive�mode.�REPAIR�process�is�under�user�control�andD‹sector(s)�or�disk�structures�may�be�updated�or�dumped.�In�this�mode>‹error�handling�is�most�effective�if�the�user�is�familiar�with@‹the�disk�control�tables.�Mode�is�referred�to�as�'IM'�for�short.?‰-�no�recovery�of�deleted�files.�All�deleted�files�are�skipped.?‰-�if�#PR�is�specified�as�output�in�command�line�it�is�ignored. ƒOptions=‰N�-�specifies�non-interactive�mode.�REPAIR�process�is�mostly �–<Ÿ,§"¯#·#¿.Ç5Ï5×=ß4ç9ï4÷0ÿ8 < B 8 ? ': /5 7; ?? GA OE W= _: g> o3 w: 9=�automatic;�the�user�cannot�update�any�disk�structures�unless:�errors�are�encountered.�No�disk�structures�are�displayed.?�If�errors�are�found‚then�one�of�three�paths�is�taken�by�REPAIR:“-�REPAIR�is�terminated�if�error�is�severe.�(REPAIR�in�the'•interactive�mode�should�be�done�next.).“-�REPAIR�sends�repair�action�message�'R:�...'•and�requests�'REPAIR�(Y/N)?'-›If�the�user�responds�with�'Y'�then�indicated›repair�is�performed.-›If�the�user�responds�with�'N'�then�depending,›on�the�error�either�REPAIR�is�terminated�or'›the�user�is�given�another�alternative.2“-�REPAIR�sends�repair�action�message�'R:�...'�and4•REPAIR�performs�the�indicated�action�automatically. (�Mode�is�referred�to�as�'NIM'�for�short.?�This�mode�is�recommended�only�if�the�user�is�not�familiar�with?�the�disk�control�tables.�The�disk�control�tables�are�explained�in�the�appendix. @�If�#PR�is�given�at�the�command�line�for�output�then�a�hard�copy.�of�REPAIR�output�is�sent�to�the�line�printer. F‰C�-�check-only�processing.�REPAIR�proceeds�as�in�non-interactive�modeC�regardless�of�N-option�status.�Any�errors�encountered�in�this�mode>�cause�REPAIR�to�be�terminated�with�appropriate�error�message,<�disk�remains�unchanged.�If�both�the�'C'�and�'N'�options�are=�specified�the�'N'�option�will�be�ignored�and�only�check�only�processing�will�be�performed. C�If�#PR�is�given�at�the�command�line�for�output�then�a�hard�copy�of,�REPAIR�output�is�given�at�the�line�printer. -�Any�IO�error�causes�REPAIR�to�be�terminated. =�A�disk�check�or�file�check�is�recommended�if�errors�are�sus-�pected. D‰R�-�specifies�file�recovery�option.�R�-�option�may�not�be�specified�together�with�C�-�option.:�During�volume�repair�all�deleted�files�are�identified�andB�the�user�has�the�option�to�skip�them�or�to�attempt�file�recovery.?�If�a�complete�file�name�and�R-option�was�specified�then�REPAIRC�will�attempt�to�recover�the�deleted�file�-�deleted�files�with�same=�file�name�are�identified�and�the�user�has�the�option�to�skip<�such�files�or�to�recover�the�deleted�file.�(Note�that�there=�may�exist�several�deleted�files�with�the�'same'�name�because@�a�deleted�file�has�the�first�character�of�its�file�name�zeroed.E :�This�first�character�is�skipped�for�the�file�name�match.);�R�-�option�is�ignored�if�the�specified�file�is�found�(i.e. �the�file�has�not�been�deleted). LƒTherefore,�REPAIR�can�be�run�to�do�volume�or�file�repair�in�the�interactiveKƒor�noninteractive�mode�with�normal�or�check-only�processing.�File�recoveryLƒcan�be�requested�in�any�mode�except�if�check-only�processing�was�requested. 4. ABOUT USING REPAIR K4.1 If allocation conflicts are detected on the disk and it is not clear toH„which�other�disk�structure(s)�the�sectors�have�also�been�allocated�thenE„REPAIR�should�be�terminated�and�a�note�made�about�the�PSN�of�sectorsK„with�allocation�conflict.�REPAIR�should�be�run�again�in�interactive�mode�&H„the�given�sectors�marked�allocated�(A�$PSN,N)�at�SAT�CHECK's�UPDATE�SATE„loop.�REPAIR�will�then�give�an�error�message‚when�it�finds�the�firstH„reference�to�the�same�sector(s).�It�is�then�up�to�the�user�to�determineC„which�structure�the�sector(s)�actually�belong�to.�Note�that�REPAIR?„assumes�that�the�first�association�is�correct�-�see�4.2�below. H4.2 REPAIR will not recognize a space allocation conflict until a second7„structure�tries�to�claim�the�same�space.�REPAIR‚alwaysD„assumes�that�the�first�association�is�correct�and�has�no�allocationH„error�because�it�has�no�information�about�structures�not�yet�processed.E„If�multiple‚allocation�errors�are�suspected�the�structures�should�beD„examined�as�they�are�displayed�to�discover�such�errors.�REPAIR�willJ„normally�give�error�messages�about�content�errors�when�multiply�allocatedH„sectors�do�not�belong�to�the�disk�structure�at�hand,�but�it�is�possibleH„that�the�wrong�sectors�pass�the�tests�for�the�structure�being�examined. J4.3 Any severe disk problems should be analyzed by an adequate dump of theC„problem�area.�Since�the�main�purpose�of�REPAIR�is�to�detect�errorsI„the�repair�process�is�improved�if�the�user�can�supply�corrections�(oftenB„REPAIR�deletes�or�truncates�some�structure�to�clear�errors�unless„directed�to�do�otherwise). G4.4�Any�particular�REPAIR�version�corresponds�to�a�version‚of�VERSAdos.H„If�a�disk�has�been�processed�by�a�later�VERSAdos�version�it�is�possibleL„that�some�reserved�fields�in�the�disk�structures�are�being�used�(non-zero).F„Therefore,�if�a�reserved�field�error�is�discovered�by�REPAIR�the�userH„has�an�option�to�inhibit�REPAIR�from�zeroing�out�the�field�(REPAIR�willG„then�terminate,�or�skip�file�if�doing�FILE�CHECK)�-�a�later�version�ofB„REPAIR�sould�be�executed�if�a�version�incompatibility�is�noticed. K4.5 If REPAIR deletes some file structures during file repair at times someH„of�the�sectors�are�not�deallocated�in�the�disk�SAT�because�REPAIR�neverG„processed�them.�Therefore,�it�is�recommended�to�run�a�disk�check�afterL„file�repair�with�extensive�truncation�or�deletion�of�data�to�check�the�SAT. 4.6 UPDATE loopG„The�following�is�a�list�of�the�disk�structure�mnemonics�used�in�REPAIR„output�(XXX�collectively)B‹VID‚volume�identification�block,�always�sector�0,�length�1�sector+‹SAT‚sector�allocation�map,�variable�lengthB‹SDB‚secondary�directory�block�(list�of�catalogs),�length�1�sector4‹SDE‚secondary�directory�block�entry�(catalog�entry)C‹PDB‚primary�directory�block�(list�of�file�names),�length�4�sectors/‹PDE‚primary�directory�block�entry�(file�entry)A‹FAB‚file�allocation�block�(list�of�data�blocks),�variable�length=‹DBƒdata�block�(block�of�sequential�records),�variable�lengthC‹HDR‚header�(first�few�bytes�of�each�SDB,�PDB,�or�FAB),�it�contains9�linkage�information�to�next�structure�of�same�type;‚FABs<�have�forward�and�backward�links,�other�structures�have�only�forward�links. K„The�UPDATE�loop�(UPDATE�XXX?)�is�entered�in�IM�for�each�new�disk�structureH„processed�by�REPAIR.�It�is�usually�preceeded�by�a�dump�of�the�structure?„or�an�error�message�and/or�a�REPAIR�action�message�('R:�...'). I„The�user�must�give�one�of�the�fF ollowing�responses�to�each�UPDATE�requestI„(note�that�for�each�particular�structure�there�is�some�variation‚to�whatG„is�allowed�and�what�not�-�see�specific�explanations�under�UPDATE�XXX): F„a.�Q�-�always�terminates�REPAIR�with�'REPAIR�TERMINATED'.�Any�sectorsD‹updated�in�memory�are�written�to�disk.�IO�errors�cause�error�msg�toA‹be�given�(IO�ERROR,�D0�=�X�FROM�WRITE�XXX,�PSN�=�X'�where�XXX�is<‹a�disk�structure�mnemonic),�otherwise�the�error�is�ignored.J„b.�R�-�if�given�as�response�to�a�REPAIR�action�for�error�('R:�...�')�thenD‹the�indicated�repair�is�enabled�and�UPDATE�loop�is�terminated,�else‹WHAT?�is�sentF„c.�D�-�delete�the�current�structure,�terminate�loop.�If�the�structure>‹contains�a�link�to�next�structure�of�the�same�type�it�is�usedB‹to�continue�processing�(the�user�may�have�changed�this�field�fromB‹its�original�value�-�the�sectors�of�the�current�structure�are�not7‹written�to�disk�no�matter�how�much�they�were�changed.)0„d.�A�-�allocate,�used�for�SAT�CHECK�step�9�onlyE„e.�D�$PSN[,N]�-�delete‚or�deallocate�sectors�from�a�structure,�where8”N,�if�given,�is�number�of�consecutive�sectors�affected,”N�defaults�to�1.;„f.�A�$PSN[,N]�-�allocate�sectors�in�SAT.�$PSN[,N]�as�aboveF„g.�$[,N]‚-�dump�the�structure�or�if�N�is�given�dump�Nth�sector�of�the2�structure�(if�N�is�greater�than�the�length�of�the/�structure�then�N�=�1�is�used).�Display�to�LDF.I„h.�$PSN[,N]�[#PR]�-�dump�any�sector(s)�to�LDF�or�printer,�N�is�number�of0˜consecutive�sectors�to�be�dumped�(default�is�1)G„i.�$PSN�offset‚XX[,XX]...�-�update�a�sector�of�the�structure�where�PSN,¡must�be�a�physical�sector�number�within�the)¡structure,�offset�is�a�hexadecimal�value/¡(0�-�$FF)�and�XX�is�either�a�hexadecimal�value+¡(0�-�$FF)�or�a�period�('.')�followed�by�an)¡ASCII�character.�The�specified�sector�is/¡changed�starting�with�the�byte�at�given�offset(¡by�giving�consecutive�bytes�new�values.'¡See�VID�CHECK�6.e.�for�sector�updates.Eƒj.�offset�XX[,XX]�-�same�as�above�but�changes�are�always�made�to�the6˜first�sector�of�the�structure.�Here�offset�must�start8˜with�a�numeric�character�(its�value�must�still�be�0-FF)Eƒk.�N�-�terminates�loop�and�turns�off�interactive�mode�till�some�next8‹structure�is�processed�or�until�an�error�is�discovered./ƒl.�carriage�return�only�-�CR�-�terminates�loop=ƒm.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-onlyDŠmode�till�done�or�error�found,�cannot�be�given�during�FILE�CHECK�ifŠR-option�is�on. MNOTE: During first REPAIR version sectors are dumped directly from disk, onlyJ†the�current�structure�is�dumped�as�it�appears�in�memory.�Therefore,�otherI†structures�that�are�also�memory�resident�are�at�times�not�displayed�with†changes�made�during�REPAIR. $ƒError�messages�to�bad�responses�are‡-�WHAT?�if�syntax�errorG‡-�PSN�ERROR�if�PSN�is�out�of�range�-�only�the�current�structure�can�be‰updated9‡-�VALUE�ERROR�if�byte�value�for�sector�change�is�invalidF‡-�OFFSET�ERROR�if�offset�is�past�sector�boundary�or�too�many�new�byteA‰values�are�given�-�updates�are�allowed�only�within�the�specified‰sector O4.7 BREAK key will abort REPAIR with 'BREAK! - REPAIR ABORTED'. Sectors changed#„in�memory�are�not�written�to�disk. M4.8 In IM during final SAT CHECK all unused sectors that are marked allocatedH„are�listed.�If�some�structure�had�to�be�deleted�or�truncated�because�ofB„bad�links�or�other�problems,�then�by�dumping�the�unused�allocatedE„sectors�the�user�may�recognize�sectors�that�belong�to�the�deleted‚orB„truncated�structure.‚REPAIR�can�then�be�reexecuted�to�reconstruct„the�structure. ==============INITIALIZATION==============  11. PROCESS LOGICAL UNIT NUMBERS AND COMMAND LINE. B- LDFLUN must be assigned and transferred to REPAIR by LOADER/SCT.5‚If�not,�REPAIR�exits�-�no�error�message�can�be�sent. B- CDFLUN must be assigned and transferred to REPAIR by LOADER/SCT.6‚If�not,�REPAIR�is�terminated�with�'CDF�NOT�ASSIGNED'. >- LUN 1 and 2 must be free for volume and printer assignments.K‚IF f�not,�REPAIR�is�terminated�with�'FREE�LOGICAL�UNIT�X'�where�X�is�1�or�2. J- Command line errors terminate REPAIR with 'COMMAND LINE ERROR'. Possible‚errors�caused�by'‰-�no�input�or�input�field�syntax�error)‰-�output�field�contains�other�then�'#PR'?‰-�other�than�C,�N,�or�R�in�options�field,�or�C�and�N�together. J2. RETRIEVE DEVICE MNEMONICS IF DEVICE NAME GIVEN IN COMMAND LINE TO CHECKƒFOR�VALID�DEVICE M- REPAIR terminates with 'INVALID DEVICE' if device mnemonic not known in the)‚system�or�device�name�not�a�disk�device. N- REPAIR terminates with 'INTERNAL ERROR 1' if device name not found but fetchK‚device�mnemonic�return�parameter�block�was�too�small�to�contain�all�random)‚access�devices�(this�should�not�happen). )3. ASSIGN VOLUME FOR EXCLUSIVE READ/WRITE J- REPAIR terminates with 'UNABLE TO ASSIGN VOLUME - ERROR X' if assignment+‚error�(X�is�the�return�code�given�by�FMS). 4. RETRIEVE DISK ATTRIBUTES :- If IO error then 'IO ERROR, D0 = X' and 'REPAIR ABORTED'G‚else�REPAIR�obtains�number�of�sectors�on�disk�and�sets�MPSN�=�last�PSN‚on�disk�(=�#�of�sectors-1). K5. 'VERSADOS REPAIR UTILITY - VERSION X' is sent where X is version number.  ========= VID CHECK ========= J1. '*** VID CHECK ***' is sent unless file repair. During this step REPAIRGƒchecks�out�the�VID�sector�-�all�the�remaining�structures�are�reachable*ƒonly�if�the�VID�is�in�tact�or�repairable. 2. Read in VID (BSR GETSEC) L-�If�error�'IO�ERROR,�D0�=�X�FROM�READ�VID,�PSN�=�0'‚or�'CRC�ERROR�FROM�READ‚VID,�PSN�=�0'‚is�sent.5‰-�If�error�during�file�repair�then�'REPAIR�ABORTED'.,‰-�If�error�with�C-option�REPAIR�terminates.1‰-�If�other�than�CRC�error�then�'REPAIR�ABORTED'.F‰-�If�CRC�error�then�VID�update�flag�is�set�-�rewrite�hopefully�clears‹error. -3. VID is checked to contain 'EXORMACS'-code. 3- If not 'ER: DISK NOT A VERSADOS VOLUME' is given.6‰-�If�C-option�or�file�repair�then�'REPAIR�TERMINATED'#‹else�'REPAIR�(Y/N)?'�is�requested.“If�'N'�then�REPAIR�exits.6“If�'Y'�then�REPAIR�continues�with�VID�update�flag�set5“(this�will�force�'EXORMACS'-code�insertion�into�VID) N4. If file repair skip till SAT segment allocation(step 9). If NIM or C-option/ƒthen�skip�till�VID�information�check�(step�7). 5. In IM dump VID (BSR DUMP). %6. In IM 'UPDATE?' loop (BSR UPDATE).‰a.�CR�or�N�-�terminate�loop#‰b.�R,�D�[$PSN],�A�[$PSN]�-�'WHAT?'‰c.�Q�-�'REPAIR�TERMINATED'1‰d.�$�-�dump�VID�again�(if�'$,N'�N�=�1�is�forced)G‰e.�$PSN�-�dump�or�update�any�sector(s);�this�is�the�only�time�that�any6“sector�on�the�disk�can�be�updated�-�later�on�only�the<“current�structure�can�be�updated�to�protect�structures�that“have�already�been�processed=“-�If�IO�error�then�'IO�ERROR,�D0�=�X�FROM�READ�SEC.,�PSN�=�X6•or�'IO�ERROR,�D0�=�X�FROM�WRITE�SEC.,�PSN�=�X'�or�CRC7•error�message�is�sent,�but�otherwise�error�is�ignored.=‰f.offset�-�not�allowed�to�prevent�accidental�wipe-out�of�VID=‰g.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-only�mode�till�done�or�error�found 7. Check VID information. ;7.1ƒAny�updated�sector�from�step�6�is�written�back�to�disk.;‡-�If�error�then�'IO�ERROR,�D0�=X�FROM�WRITE�SEC.,�PSN�=�X'‰and�'REPAIR�ABORTED' 87.2ƒVolume�name�must�be�alpha,�alphanumeric�(BSR�NAMECK)"‡-�If�error�then�'ER:�VOLUME�NAME'‘-�if�C-option�REPAIR�exits“else�"OLD�'....'�($04)"˜"NEW?"6“is�requested.�Response�should�be�upto�4�characters�to5“replace�volume�name.�Check�is�repeated�for�new�name.“Reference�NOTE�1. 07.3ƒVolume�descriptor�must�be�ASCII�(BSR�CHKASC)0‡-�If�error�then�'ER:�VOLUME�DESCRIPTOR'�is�sent‘-�if�C-option�REPAIR�exits“else�"OLD�'...…...†...'�($14)"˜"NEW?"7“is�requested.�Response�should�be�upto�20�characters�to.“replace�volume�descriptor.�Check�is�repeated. D7.4ƒSAT�length�must�equal�appropriate�size�for�disk�(must�be�able�to6†accomodate�all�sectors�on�disk�and�have�minimum�size)-‡-�If�error�then�'G ER:�SAT�LENGTH�=�X'�is�sent‘-�if�C-option�REPAIR�exits“else�'R:�RECALCULATE' •if�NIM�then�force�proper�length•if�IM�then�'REPAIR�(Y/N)?'.�If�'Y'�then�proper�length�is�entered�into�VID (size�calculated�from�MPSN)!�If�'N'�then�'REPAIR�TERMINATED'. J7.5ƒSAT�starting�PSN�must�not�be�zero�and�SAT�must�be�on�disk�(BSR�MPSNC).*‡-�If�error�then�'ER:�SAT�PSN�=�X'‚is�sent‘-�if�C-option�REPAIR�exits"‘-�if�NIM�then�'REPAIR�TERMINATED' ‘-�if�IM�then˜'NEW?'5™is�requested�(BSR�GET4HEX).�Test�is�repeated�for�new™value. A7.6ƒCheck�SDB�PSN�OK:‚zero�is�OK,�if�not�then�SDB�must�be�on�disk*‡-�If�error�then�'ER:�SDB�PSN�=�X'�is�sent‘-�if�C-option�REPAIR�exits"‘-�if�NIM�then�'REPAIR�TERMINATED' ‘-�if�IM�then˜'NEW?'5™is�requested�(BSR�GET4HEX).�Test�is�repeated�for�new!™value.�(0�deletes�the�SDB�chain) +7.6A‚Check�test�pattern�ok.�All�zero�is�ok.-ˆ-�If�error�and�if�C-option�then�REPAIR�exitsŠelse�'ER:�BAD�TEST�PATTERN'�'REPAIR�(Y/N)?'"�-�if�'N'�then�'REPAIR�TERMINATED'-�-�if�'Y'�then�correct�test�pattern�is�forced 7.6B Check check sum ok.‰-�If�error�then�'ER:�CHECKSUM'%Œ-�if�C-option�then�REPAIR�terminatesŽelse�'REPAIR�(Y/N)?'"�-�if�'N'�then�'REPAIR�TERMINATED'*�-�if�'Y'�then�correct�check�sum�is�forced 77.7ƒCheck�no�PDB�list�pointer�-�reserved�field�for�now.<‡-�If�error�then�'ER:�PDBL�RESERVED�FIELD�NOT�ZERO,�PSN�=�0'‘-�if�C-option�REPAIR�exits“else�'R:�ZERO�OUT'˜'REPAIR�(Y/N)?'˜is�requested�(BSR�RSVCHK)˜If�'Y'�then�field�is�zeroed ˜If�'N'�then�'REPAIR�TERMINATED' "7.8ƒCheck�VID�reserved�space�zero.;‡-�If�error�then�'ER:�VID�RESERVED�FIELD�NOT�ZERO,�PSN�=�0'‘-�if�C-option�REPAIR�exits“else�'R:�ZERO�OUT'˜'REPAIR�(Y/N)?'˜is�requested�(BSR�RSVCHK)˜If�'Y'�then�field�is�zeroed ˜If�'N'�then�'REPAIR�TERMINATED' '8. Write VID to disk if update flag set+‰-Force�VERSAdos�code�('EXORMACS')�into�VID=‰-if�IO�error�then�'IO�ERROR,�D0�=�X�FROM�WRITE�VID,�PSN�=�0'›'REPAIR�ABORTED' 9. Allocate SAT buffers?‰-�A�segment�is�allocated�to�accomodate�two�SAT�buffers�for�the‹disk�and�allocation�SATs=“-�the�SAT�on�disk�is�referred�to�as�'disk�SAT'�-�it�contains(•the�sector�allocation�map�for�the�disk.7•Under�normal�circumstances�the�disk�SAT�is�checked�and8•updated�as�necessary�and�at�end�of�REPAIR�it�is�written/•back�to�disk�if�changed.‚If�the�SAT�is�in�poor;•shape�the�user�has�the�option�to�have�REPAIR�recreate�it�-7•then�the�disk�SAT�is�ignored�and�the�allocation�SAT�is5•written�to�disk�at�end�of�REPAIR.�(The�SAT�cannot�be3•recreated�if�only�file�repair�is�done�because�then6•only�the�file's�sectors�are�checked�and�processed�for;•allocation�-�the�resulting�allocation�SAT�is�not�complete) ;“-�another�SAT-type�map�is�built�by�REPAIR�to�keep�track�of9•sectors�that�have�been�processed�and�have�been�allocated4•so�far.‚This�SAT�is�checked�for�multiple�allocation9•errors,�it�is�referred�to�as�'allocation�SAT'.�Note�that:•if�only�file�repair�is�done�(as�opposed�to�volume�repair);•then�REPAIR�will�not�be�able�to�detect�multiple�allocation8•errors�except�for�among�the�sectors�associated�with�the•file. ‰-�If�error�from�EXEC�call�then.“'SEGMENT�ALLOCATION�ERROR,�D0�=�X,�SEG:�SATS'“'REPAIR�ABORTED' ========= SAT CHECK ========= 21. '*** SAT CHECK ***' is sent unless file repair. 2. Read in SAT (BSR GETSEC);‰-�If�IO�error�'IO�ERROR,�D0�=�X�FROM�READ�SAT,�PSN�=�X'�or#—'CRC�ERROR�FROM�READ�SAT,�PSN�=�X' ‘-�If�C-option�then�REPAIR�exits'‘-�If�file�repair�then�'REPAIR�ABORTED'0‘-�If�other�than�CRC�error�then�'REPAIR�ABORTED'&‘-�If�CRC�error�then�'R:�RECREATE�SAT'/›-�if�IM�then�enter�'UPDATE�SAT?'�loop�(step�5)›-�if�NIM�then�'REPAIR�(Y/N)?'&§if�'Y'�then�new�SAT�created�by�REPAIR$©(the�allocation�SAT�will�be�written#©to�disk�at�the�end�of�REPAIR,�disk©SAT�is�ignored) §if�'N'�then�'REPAIR�TERMINATED' M3. If file repair skip till FILE CHECK. If NIM or C-option then skip till SATƒCHECK�step�6. 4. Dump SAT in IM. G 5. 'UPDATE SAT?' loop in IM‰a.�CR,�N�-�terminate�loop‰b.�D,�A�-�'WHAT?'6‰c.�R�-�recreate�SAT�(ignore�disk�SAT),�terminate�loop‰d.�Q�-�'REPAIR�TERMINATED'7‰e.�$PSN�-�dump�sector(s),�update�or�dump�SAT�sector(s)7‰f.�$�-�dump�SAT�sector(s);�if�'$,N'�and�N�>�SAT�length�then�N�=�1�is�used.‰g.�D�$PSN�-�deallocate�sector(s)�in�both�SATs,‰h.�A�$PSN�-�allocate�sector(s)�in�both�SATs$‰i.�offset�-�update�first�SAT�sector=‰j.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-only�mode�till�done�or�error�found 6. Check SAT initially @6.1 Check VID allocated in disk SAT (unless SAT to be recreated)6…If�error�then�'ER:�VID�NOT�ALLOCATED�IN�SAT,�PSN�=�0' ‡-�if�C-option�then�REPAIR�exits‰else‚'R:�ALLOCATE�VID'�if�NIM�then�allocate�VID�if�IM�then�'REPAIR�(Y/N)?'0“if�'Y'�then�VID�is�marked�allocated�in�disk�SAT “if�'N'�then�'REPAIR�TERMINATED' 16.2�Check�VID�not�yet�allocated‚in�allocation�SAT9…If�error�then�'ER:�VID�SPACE�ALREADY�ALLOCATED,�PSN�=�0'“'REPAIR�ABORTED'H…This�should�only�happen�if�the�user�has�allocated�the�sector�during�SAT…UPDATE�loop�(step�5). @6.3 Check SAT allocated in disk SAT (unless SAT to be recreated)6…If�error�then�'ER:�SAT�NOT�ALLOCATED�IN�SAT,�PSN�=�X'‡-�if�C-option�REPAIR�exits‰else‚'R:�ALLOCATE�SAT'Œif�NIM�then�allocate�SATŒif�IM�then�'REPAIR�(Y/N)?'0“if�'Y'�then�SAT�is�marked�allocated�in�disk�SAT “if�'N'�then�'REPAIR�TERMINATED' 16.4 Check SAT not yet allocated in allocation SAT9…If�error�then�'ER:�SAT�SPACE�ALREADY�ALLOCATED,�PSN�=�X'“'REPAIR�ABORTED'K…This�should�only�happen�if�the�user�has�allocated�the�sector(s)�during�SAT…UPDATE�loop�(step�5). N6.5 Check eXTRaneous sectors allocated in disk SAT(unless SAT to be recreated)6…If�error�then�'ER:�XTR�NOT�ALLOCATED�IN�SAT,�PSN�=�X'‡-�if�C-option�REPAIR�exits‰else‚'R:�ALLOCATE�XTR'‹if�NIM�then�allocate�sectors‹if�IM�then�'REPAIR�(Y/N)?':“if�'Y'�then�the�non-existing�sectors�are�marked�allocated “if�'N'�then�'REPAIR�TERMINATED' =6.6 The extra sectors are marked allocated in allocation SAT. M6.7 If SDB exists then check first SDB allocated (unless SAT to be recreated)6…If�error�then�'ER:�SDB�NOT�ALLOCATED�IN�SAT,�PSN�=�X'‡-�if�C-option�REPAIR�exits‰else‚'R:�ALLOCATE�SDB'‹if�NIM�then�allocate�SDB‹if�IM�then�'REPAIR�(Y/N)?'0“if�'Y'�then�SDB�is�marked�allocated�in�disk�SAT “if�'N'�then�'REPAIR�TERMINATED' D6.8 If SDB exists then check SDB not yet allocated in allocation SAT9„If�error�then�'ER:�SDB�SPACE�ALREADY�ALLOCATED,�PSN�=�X'’'REPAIR�ABORTED'H…This�should�only�happen�if�the�user�has�allocated�the�sector�during�SAT…UPDATE�loop�(step�5). 06.9 If SDB chain exists then skip till SDB CHECK 87.‚If�no�SDB�chain�exists�then�'NO�DIRECTORIES'�is�sent. D7.A Check diagnostic test area ok and allocated. Zero pointer is ok.?‰'ER:�TST�PSN�ERROR'�if�pointer�in�VID�bad�or�test�area�PSN�bad:‰'ER:�TST�NOT�ALLOCATED'�if�test�area�not�allocated�in�SAT8‰'ER:�TST�SPACE�ALREADY�ALLOCATED'�if�space�used�already 7.B Check dump area ok (VID),‰'ER:�DUMP�AREA�PSN�ERROR'�if�PSN�in�VID�badA‰'ER:�DMP�NOT�ALLOCATED�IN�SAT'�if�dump�area�not�allocated�in�SAT"‰'ER:�DMP�SPACE�ALREADY�ALLOCATED' 7.C Check SLT ok.-‰'ER:�SLT�PSN�ERROR'�if�pointer�in�VID�is�bad‰'ER:�SLT�NOT�ALLOCATED�IN�SAT'"‰'ER:�SLT�SPACE�ALREADY�ALLOCATED'(‰'ER:�SLS�PSN�BAD'�if�pointer�in�SLT�bad‰'ER:�SLS�NOT�ALLOCATED�IN�SAT'"‰'ER:�SLS�SPACE�ALREADY�ALLOCATED' F8.‚If�SAT�was�to�be�recreated�by�REPAIR�then�allocation�SAT�is�written„to�disk�as�new�SAT.F„In�later�version�allow�display�of�allocation�SAT�and�ask�if�a�new�SATI„location�is�desired�(e.g.�to�move�SAT�from�bad�sectors�to�new�location).0“-�If�IO�error�then�'IO�ERROR,�DO�=�X�FROM�WRITE#•SAT,�PSN�=�X'�and�'REPAIR�ABORTED'!•else�'DISK�OK'�and�'REPAIR�DONE' D9.‚If�SAT�was�not�to�be�recreated�by�REPAIR�then�disk�and�allocation„SATs�are�checked�to�be�equal.?‹-�If�they�are�equal�the�disk�SAT�is�written�to�disk�if�changed/�-�if�noH �error�then‚'DISK�OK'�and�'REPAIR�DONE'�-�if�IO�error�then+œ'IO�ERROR,�D0�=�X�FROM�WRITE�SAT,�PSN�=�X'œ'REPAIR�ABORTED' D‹-�If�they�are�not�equal�because�sectors�allocated�in�allocation�SATB�are�not�allocated�in�disk�SAT�then�'INTERNAL�ERROR�2'�and�'REPAIR"�ABORTED'�-�this�sould�not�happen. B‹-�If�they�are�not�equal�because�sectors�allocated�in�disk�SAT�areB�not�allocated�in�allocation�SAT�(�happens�if�disk�structures�were?�deleted�or�truncated�or�the�condition�existed�prior�to�REPAIR)�then-�'ER:�UNUSED�SECTORS�MARKED�ALLOCATED�IN�SAT'�'R:�DEALLOCATE'�'REPAIR�(Y/N)?'�(note:�C-option�ignored�now)4‘-�if�'Y'�then�allocation�SAT�is�written�to�disk�and)˜if�no�error�'DISK�OK'�and‚'REPAIR�DONE'.0˜if�error�then�'IO�ERROR,�D0�=�X�FROM�WRITE�SAT,¦PSN�=�X'�and�'REPAIR�ABORTED'?‘-�if�'N'�and�NIM�then�disk�SAT�is�written�to�disk�(this�leaves!“sectors�marked�allocated�in�SAT)"•-�if�no�error�then�'REPAIR�DONE'.2•-�if�error�then�'IO�ERROR,�D0�=�X�FROM�WRITE�SAT,¦PSN�=�X'�and�'REPAIR�ABORTED'<‘-�if�'N'�and�IM�then�all�sectors�allocated�but�not�used�are8“listed�as�'PSN�=�X'�or�'PSN�=�X,N'�depending�on�whether4“a�single�sector�or�a�block�of�sectors�was�affected.,“Then�after�all�the�sectors�have�been�listed“'UPDATE�SAT?'�is�requested.•a.�CR,�C,�Q,�offset,�D�$PSN,�A�$PSN�-�'WHAT?'9•b.�D,�R�-�deallocate�(allocation�SAT�is�written�to�disk),œ-�if�no�error�then�'DISK�OK',�'REPAIR�DONE'2œ-�if�error�then�'IO�ERROR,�D0�=�X�FROM�WRITE�SAT,­PSN�=�X'�and�'REPAIR�ABORTED'6•c.�A,�N�-�leave�allocated�-�write�disk�SAT�to�disk�if ˜necessary!�-�if�no�error�then‚'REPAIR�DONE'2�-�if�error�then�'IO�ERROR,�D0�=�X�FROM�WRITE�SAT,®PSN�=�X'�and�'REPAIR�ABORTED'/•d.�$�-�list�numbers�again�(If�'$,N'�N�ignored)6•e.�$PSN�-�dump�sector(s),�no�update�allowed�('WHAT?') ========= SDB CHECK ========= '1. '*** SDB CHECK ***' message is sent. &2. Read in first/next SDB (BSR GETSEC)B‡-�If�C-option�any�IO�error�causes�error�msg�to�be�sent�and�REPAIR ‰to�exit�elseBŒ-�if�CRC�error�then�error�msg�is�sent�and�SDB�update�flag�is�set.BŒ-�if�non-CRC�error�then�'IO�ERROR,�DO�=�X�FROM�READ�SDB,�PSN�=�X'&‘-�if�NIM�then�'R:�TRUNCATE�SDB�CHAIN'Ÿ'REPAIR�(Y/N)?'�is�requested.›-�if�'Y'�then�any�prior�SDB�is�set�to�be�last1�SDB�in�chain�(its�forward�link�set�to�0�-�REPAIR3�is�aborted�if�IO�error�from�link�update)and�REPAIR1�continues�with�PDB�CHECK.�If�no�prior�SDB�exists-�then�SDB�pointer�in�VID�is�zeroed�and�REPAIR!�continues�with�SAT�CHECK�step�7."›-�if�'N'�then�'REPAIR�TERMINATED'?‘-�if�in�IM�then�'R:�TRUNCATE�SDB�CHAIN'�and�'UPDATE�SDB?'�loop<“is�entered,�'R'�response�will�truncate�SDB�chain�(prior�SDB “is�last) 3. If IM dump SDB (BSR DUMP).3ƒIf�NIM�or�C-option‚skip�till�SDB�information�check ƒ(step�5) 4. 'UPDATE SDB?' loop‰a.�CR�-terminates�loopE‰b.�N�-�terminates�loop�and�turns�off�IM�till�PDB�CHECK�step�or�errorF‰c.�R�-�'WHAT?'�unless�UPDATE�was�preceeded�by�'R:�TRUNCATE�SDB�CHAIN'%‘in�which�case�SDB�chain�is�truncatedG‰d.�D�-�delete�current�SDB,�terminates�loop;�forward�link�used�for�next0�SDB�(if�0�then�prior�SDB�will�be�last�in�chain)‰e.�A�[$PSN],�D�$PSN�-�'WHAT?'‰f.�Q�-�'REPAIR�TERMINATED'-‰g.�$�-�dump�SDB�(�if�'$,N'�then�N=1�is�used)1‰h.�$PSN�-�dump�or�update�SDB,�dump�any�sector(s)‰i.�offset�-�update�SDB�sector=‰j.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-only�mode�till�done�or�error�found 5. Check SDB information !5.1 - Check SDB header as follows H5.1.1„-�check�next�SDB�PSN�is�OK:�zero�is�OK�or�next�SDB�must�be�on�disk ‹(BSR�MPSNC)$‘-�if�zero�then�skip�till�step�5.1.4(‘-�if�error�then�'ER:�SDB�LINK,�PSN�=�X'›-�if�C-option�REPAIR�exits&›-�if�NIM�then�'R:�TRUNCATE�SDB�CHAIN'©'REPAIR�(Y/N)?'#§if�'Y'�then�SDB�chain�is�truncated§(current�SDB�is�the�last�one) §if�'N'�then�'REPAIR�TERMINATED')›-�if�IM�then�UPDATE�SDB�loop�is�repeated I5.1.2„-�check�next�SDB�allocated�in�disk�SAT�(unless�SAT�to�be�recreated)6“if�error�then�'ER:�SDB�NOH T�ALLOCATED�IN�SAT,�PSN�=�X' ›-�if�C-option�then�REPAIR�exits ›-�if�NIM�then�'R:�ALLOCATE�SDB'(£and�SDB�is�marked�allocated�in�disk�SAT›-�if�IM�then�(BSR�DMPALC)§'DUMP�(Y/N)?'ªif�'Y'�then�dump�next�SDBªif�'N'�then�skip�dump§'R:�ALLOCATE�SDB'§'REPAIR�(Y/N)?'ªif�'Y'�then�SDB�is�allocatedªif�'N'�then�UPDATE�SDB�loop�is ®repeated >5.1.3„-�check�next�SDB�not�already�allocated�in�allocation�SAT8“if�error�then�'ER:�SDB�SPACE�ALREADY�ALLOCATED,�PSN�=X'›-�if�C-option�REPAIR�exits&›-�if�NIM�then�'R:�TRUNCATE�SDB�CHAIN'©'REPAIR�(Y/N)?'#§if�'Y'�then�SDB�chain�is�truncated¨(current�SDB�becomes�last) §if�'N'�then�'REPAIR�TERMINATED')›-�if�IM�then�UPDATE�SDB�loop�is�repeated I5.1.4„-�if�current�SDB�was�to�be�deleted‚then�prior�SDB'S�forward�link�is)‹set�equal�to�forward�link�in�current�SDB>‘-�if�IO�error�then�error�message�is�sent�and�'REPAIR�ABORTED'$“else�next�SDB�is�processed�(step�2) <5.1.5„-�check�SDB�header�reserved�space�is�zero�(BSR�RSVCHK);‘-�if�error�then�'ER:�HDR�RESERVED�FIELD�NOT�ZERO,�PSN�=�X'›-�if�C-option�REPAIR�exits�else�'R:�ZERO�OUT'¢'REPAIR�(Y/N)?'§if�'Y'�then�field�is�zeroed §if�'N'�then�'REPAIR�TERMINATED' %5.2 - Check each SDB entry as follows B5.2.1„-�PSN�of�PDB�must�be�zero�or�PDB�must�be�on�disk�(BSR�MPSNC)(‘-�if�zero�then�skip�till�next�SDB�entry(‘-�if�error�then�'ER:�PDB�LINK,�PSN�=�X'›-�if�C-option�REPAIR�exits$›-�if�NIM�then�'R:�DELETE�PDB�CHAIN'©'REPAIR�(Y/N)?' §if�'N'�then�'REPAIR�TERMINATED'&§if�'Y'�then�PDB�chain�for�the�catalog$©is�deleted�(catalog�becomes�empty�-#©all�files�in�the�catalog�are�lost) ›-�if�IM�then§'NEW?'.�is�requested.�PDB�link�is�then�checked�again.�(0�deletes�PDB�chain) F5.2.2„-�PDB�must�be�allocated�in�disk�SAT�(unless�SAT�to�be�recreated)8‘-�if�error�then�'ER:�PDB�NOT�ALLOCATED�IN�SAT,�PSN�=�X' ›-�if�C-option�then�REPAIR�exits ›-�if�NIM�then�'R:�ALLOCATE�PDB'!¥and�PDB�is�allocated�in�disk�SAT›-�if�IM�then�(BSR�DMPALC)§'DUMP�(Y/N)?'$§if�'Y'�then�dump�first�PDB�of�chain§if�'N'�then�skip�dump§'R:�ALLOCATE�PDB'§'REPAIR�(Y/N)?'#§if�'Y'�then�first�PDB�is�allocated§if�'N'�then�(BSR�GET4HEX)ª'R:�GIVE�NEW�PSN'ª'OLD�XXXXXXXX'ª'NEW?'§is�requested.�PDB�PSN�check�is§repeated.‚0�deletes�PDB�chain. ;5.2.3„-�PDB�must�not�be�already�allocated�in�allocation�SAT‘-�if�error�then+›'ER:�PDB�SPACE�ALREADY�ALLOCATED,�PSN�=�X'›-�if�C-option�REPAIR�exits$›-�if�NIM�then�'R:�DELETE�PDB�CHAIN'©'REPAIR�(Y/N)?'!§if�'Y'�then�PDB�chain�is�deleted'¨(catalog�becomes�empty�-�all�the�files¨in�the�catalog�are�lost) §if�'N'�then�'REPAIR�TERMINATED'›-�if�IM�then�(BSR�DMPQNL)§'DUMP�(Y/N)?' ¨if�'Y'�then�first�PDB�is�dumped¨if�'N'�then‚skip�dump§'QUIT�(Y/N)?' ¨if�'Y'�then�'REPAIR�TERMINATED' ¨if�'N'�then±'R:�GIVE�NEW�PSN'±'OLD�XXXXXXXX'±'NEW?'¨is�requested.�New�PDB�PSN%¨is�checked�again.�(0�deletes�chain). >5.2.4„-�Catalog�name�must�be�all�spaces�or�alpha,�alphanumeric ‹(BSR�CATCHK)#‘-�if�error�then�'ER:�CATALOG�NAME' ›-�if�C-option�then�REPAIR�exits�else�"OLD�'XXXXXXXX'�($08)"¢"NEW?"*�is�requested.�Upto�8�characters�should�be/�be�given�for�new�catalog�name.�If�the�new�name,�already�exists�then�'ER:�DUPLICATE�CATALOG'/�is�sent�and�'NEW?'�request�is�repeated�-�check �made�in�next�version�of�REPAIR.3�A�null�response�(CR�only)�will�set�catalog�name�to �all�spaces. 15.2.5„-�Check�reserved�field�in�SDB�entry�is�zero;‘-�if�error�then�'ER:�SDE�RESERVED�FIELD�NOT�ZERO,�PSN�=�X' ›-�if�C-option�then�REPAIR�exits�else�'R:�ZERO�OUT'¢'REPAIR�(Y/N)?'§if�'Y'�then�field�is�zeroed §if�'N'�then�'REPAIR�TERMINATED' 86. Write SDB to disk if marked for update. (BSR WRITSEC) >‡-�If�error�then�'IO�ERROR,�D0�=�X�FROM�WRITE�SDB,�PSN�=�X'�is‰sent�and�'REPAIR�TERMINATED'. I7. If next SDB pointer is not zero then continue with step 2 of SDB CHECKKƒ(read�in�next�SDB�and�check�it).�If�no�SDBs�left�(VID�SDB�pointer�is�zero)%I ƒthen�continue�with�SAT�CHECK�step�7. ========= PDB CHECK ========= 1. Reset IM if turned off 2. Send '*** PDB CHECK ***' 3. Get first/next SDB entry2‡-�If�no�more�SDB�entries�continue�with�FILE�CHECKD‡-�If�need�next�SDB�write�current�SDB�if�updated,�then�read�next�SDB;‘-�if�error�then�'IO�ERROR,�D0�=�X�FROM�WRITE�SDB,�PSN�=�X'¡'REPAIR�ABORTED'1“or�'IO�ERROR,�D0�=�X�FROM�READ�SDB,�PSN�=�X'�and–'REPAIR�ABORTED' K4.�Reset�IM‚if�turned�off�till�next�catalog.�If�NIM�or�C�-�option�then�send3ƒ':UN.CATALOG'�to�identify�catalog�being�processed. >5. Read first/next PDB of the catalog's PDB chain (BSR GETSEC)D‰-�If�no�more�PDBs�in�current�catalog�then�get�next�catalog�(step�3)G‰-�If�need�next�PDB�write�current�PDB�to�disk�if�flagged�for�update.�If2‹IO�error�then�send�error�msg�and�'REPAIR�ABORTED'>‰-�If�IO�error�from�read�then�'IO�ERROR,�D0�=�X�FROM�READ�PDB,3‹PSN�=�X'�or�'CRC�ERROR�FROM�READ�PDB,�PSN�=�X'�and‘-�if�C-option�REPAIR�exits‘-�if�other�than�CRC�error�then2�'R:�DELETE�PDB'�if�read�in�first�PDB�sector�OK‚or'�'R:�TRUNCATE�PDB�CHAIN'�if�didn't,�and›-�if�NIM�then�'REPAIR�(Y/N)?' §if�'Y'�then�repair�as�indicated(§(if�delete�PDB�then�check�next�PDB�link$§OK,�then�update�prior�PDB's�forward)§link�and�process�next�PDB�-�steps�9.1.2-§9.1.5)&§(if�truncate�PDB�chain�then�set�prior$§PDB's�forward�link�to�0�and�process#§next�catalog's�PDB�chain�-�step�3)"¥-�if�'N'�then�'REPAIR�TERMINATED'&›-�if�IM�then�enter�'UPDATE�PDB?'�loop.‘-�if�CRC�error�then�PDB�is�flagged�for�update ?6. If NIM or C-option skip till PDB information check (step 9). 7. Dump PDB in IM 8. 'UPDATE PDB?' loop in IM‰a.�CR�-�terminates�loop<‰b.�N�-�terminates�loop�and�turns�off�IM�till�next�catalog's�PDB�check�or�next�errorA‰c.�R�-�'WHAT?'�unless�'R:�TRUNCATE�PDB�CHAIN'�or�'R:�DELETE�PDB'*�preceeded�UPDATE�request,�loop�terminatedA‰d.�D�-�delete�current�PDB,�use�link�to�next�PDB;�terminates�loop‰e.�A�[$PSN],�D�$PSN�-�'WHAT?'‰f.�Q�-�'REPAIR�TERMINATED'1‰g.�$[,N]�-�dump�PDB,�if�N�>�4�then�N�=�1�is�used9‰h.�$PSN�-�dump�any�sector(s),�update�or�dump�PDB�sectors$‰i.�offset�-�update�first�PDB�sector=‰j.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-only�mode�till�done�or�error�found 9. Check PDB information 9.1‚Check�PDB�header H9.1.1„-�user�number�and�catalog�name�must�be�equal�to�those�in�SDB�entry'‹(test�is�skipped�if�PDB�to�be�deleted)<‘-�if�error�then�'ER:�USER�#/CATALOG�NAME�CONFLICT,�PSN�=�X'¡'SDB‚:XXXX.XXXXXXXX'¡'PDB‚:XXXX.XXXXXXXX' ›-�if�C-option�then�REPAIR�exits�else�'R:�SET�EQUAL'¢'REPAIR�(Y/N)?')§if�'Y'�then�set�SDB�user�#,�catalog�nameªinto�PDB�header §if�'N'�then¨-�if�NIM�then©'R:�TRUNCATE�PDB�CHAIN'©'REPAIR�(Y/N)?'%«if�'Y'�then�prior�PDB�is�set�last�in#¬catalog's�PDB�chain,�continue�with¬step�3. «if�'N'�then�'REPAIR�TERMINATED' ¨-�if�IM�then�UPDATE�PDB�loop�is ªrepeated E9.1.2„-�check�next�PDB�PSN�OK:�zero�is�OK�or�next�PDB�must�be�on�disk ‹(BSR�MPSNC)$‘-�if�zero�then�skip�till�step�9.1.5(‘-�if�error�then�'ER:�PDB�LINK,�PSN�=�X'›-�if�C-option�REPAIR�exits&›-�if�NIM�then�'R:�TRUNCATE�PDB�CHAIN'©'REPAIR�(Y/N)?''§if�'Y'�then�current�PDB�is�set�last�inªcatalog's�PDB�chain §if�'N'�then�'REPAIR�TERMINATED')›-�if�IM�then�UPDATE�PDB�loop�is�repeated E9.1.3„-�check�next�PDB�allocated�(unless�to�recreate�SAT)�in�disk�SAT8‘-�if�error�then�'ER:�PDB�NOT�ALLOCATED�IN�SAT,�PSN�=�X' ›-�if�C-option�then�REPAIR�exits ›-�if�NIM�then�'R:�ALLOCATE�PDB'¥and�PDB�is�allocated›-�if�IM�then�(BSR�DMPALC)§'DUMP�(Y/N)?'§if�'Y'�then�dump�next�PDB§if�'N'�then�skip�dump§'R:�ALLOCATE'§'REPAIR�(Y/N)?'§if�'Y'�then�allocate�next�PDB(§if�'N'�then�UPDATE�PDB�loop�is�repeated >9.1.4„-�check�next�PDB�not�already�allocated�in�allocation�SAT:‘-�if�error�then�'ER:�PDB�SPACE�ALREADY�ALLOCATED,�PSN�=X'›-�if�C-option�exit�REPAIR/›-�if�NIM�then�'R:�TRUNCATE�PDB�CHAIN'�if�first«PDB�sector�allocated,�or$©'R:�DELETE�PDB'�if�firsI t�sector�not«allocated,�and©'REPAIR�(Y/N)?'$ªif�'Y'�then�current�PDB�is�set�last#¬in�chain�or�next�PDB�is�deleted�by ¬obtaining�its�forward�link�(the$¬new�link�is�checked�again,�IO�error¬causes�'REPAIR�ABORTED') ªif�'N'�then�'REPAIR�TERMINATED'%›-�if�IM�then‚UPDATE�PDB?�is�repeated K9.1.5„-�if�to�delete�current�PDB�then�set�prior�PDB's�forward�link�equal�to‹current�PDB's�forward�link;‘-�if�IO�error�then�send�error�message�and�'REPAIR�ABORTED'(“else�process�next�PDB�(skip�to�step�10) ,9.1.6„-�check�PDB�header�reserved�field�zero;‘-�if�error�then�'ER:�HDR�RESERVED�FIELD�NOT�ZERO,�PSN�=�X'¡'R:�ZERO�OUT'¡'REPAIR�(Y/N)?'¡if�'Y'�then�field�is�zeroed ¡if�'N'�then�'REPAIR�TERMINATED' 29.2 No check is made on file entries at this time. "10. Get next PDB in chain (step 5) ========== FILE CHECK ========== 71. Write any updated SDB and PDB in memory back to disk:‰If�IO�error�then�send�error�message�and�'REPAIR�ABORTED'. &2. Reset IM if turned off in PDB CHECK 3. '*** FILE CHECK ***' is sent. 4. Get first/next SDB entry.EƒIf�no�more�SDB�entries�in�current�SDB�read�in�next�SDB�(SDB's�are�noBƒlonger�updated,�so�no�SDBs�are�written�to�disk�during�FILE�CHECK)<‰-�If�IO�error�then�send�error�message�and�'REPAIR�ABORTED'.>‰-�If�no�more�SDB's�and�volume�repair�then�do�FINAL�SAT�CHECK.(‰-�If�no�more�SDB's�and�file�repair�then-–'ER:�FILE�NOT�FOUND'�and�'REPAIR�TERMINATED' M5. If file repair skip all but specified catalog (i.e. skip SDB entries whoseC‰user�number�and�catalog�name�do�not�match�the�one�given�in�command‰line) !6. Get next PDB entry for catalogD‰-�If�have�to�read�in�next�PDB�write�current�PDB�to�disk�if�changed,‹then�read�in�next�PDB.E‰-�IO�errors�now�cause�error�message�and�'REPAIR�ABORTED'�to�be�sent.1‰-�If�no�more�PDB�entries�in�current�catalog�then6�-�if�doing�volume�repair�go�get�next�catalog�(step�4)2‘else�'ER:�FILE�NOT�FOUND'�and�'REPAIR�TERMINATED' K7. If empty entry skip. If deleted file entry then skip unless R-option on. *8. If file repair then check if found file‰if�not�then�skip�entry,C‰if�did�then�set�file-found�flag�to�quit�REPAIR�after�file�has�been �checked.LƒIf�to�recover�a�deleted�file�skip�all�but�deleted�entries,�then�skip�unlessF‰match�with�given�file�name�(first�character�of�file�name�is�ignored). E9. If NIM or C-option then send file's name 'UN:CATALOG.FILENAME.EXT'F…If�deleted�file�(first�character�of�file�name�zeroed)�and�R-option�on‰'RECOVER�DELETED�FILE�(Y/N)?'‰if�'N'�then�file�is�skipped ‰if�'Y'�then6‘-�if�file�repair�then�enter�given�name�into�PDB�entry“else�'GIVE�NEW�NAME'0˜'OLD�"XXXXXXXX"�($08)'ƒ(first�character�is�'.')˜'NEW?'#˜new�name�is�entered�into�PDB�entry0˜In�next�version�if�new�name�already�exists�then�'ER:�DUPLICATE�FILE�NAME'(�if�file�repair�then�'REPAIR�TERMINATED'�else�'NEW?'�is�repeated ?10. If NIM or C-option then skip till check PDB entry (step 13) 11. In IM dump PDB entry (PDE) 12. 'UPDATE PDE?' loop in IM‰a.�CR�-�terminate�loop3‰b.�N�-�turn�IM�off�till�next�catalog�or�next�errorF‰c.�R�-�recover�if�entry�for�deleted�file,�terminate�loop�-�else�WHAT??�also�WHAT?�if�user�did�not�replace�first�byte�in�file�name�(to�give�complete�file�name)#‰d.�D�-�delete�file,�terminate�loop‰e.�Q�-�'REPAIR�TERMINATED'0‰f.�$�-�dump�PDE�again�(if�'$,N'�then�N�ignored)/‰g.�$PSN�-�dump�any�sector,�updates�not�allowed‰h.�offset�-�update�PDE‰i.�A�[$PSN],�D�$PSN�-�'WHAT?'=‰j.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-only�mode�till�done�or�error�found 13.‚Check�PDE�information 813.1 If deleted file skip entry. If empty entry skip it. 713.2 File name must be alpha, alphanumeric (BSR NAMECK) †-‚If�error�then�'ER:�FILE�NAME'—'OLD�"XXXXXXXX"�($08)'—'NEW?'A‰is�requested.�If�null�(CR)�response,�'WHAT'�followed�by�'NEW'�is-‰displayed,�else�the�new�filename�is�checked.‰Reference�NOTE�1. 713.3 Extension must be alpha, alphanumeric (J BSR NAMECK) †-‚If�error�then�'ER:�EXTENSION'—'OLD�"XX"�($02)'—'NEW?'E‰is�requested.�Extension�is�checked�again.�If�null�(CR)�response�then'‰'WHAT'�followed�by�'NEW?'�is�dislayed.‰Reference�NOTE�1. N13.4 If file name was changed a check is made to insure no duplicate file name$…resulted�-�checked�in�next�version.#ˆ-�If�file�name�already�exists�then;“'ER:�DUPLICATE�FILE�NAME'�is�sent�and�new�file�name�and/or<“extension�is�requested�as�above�depending�on�which�field(s)“were�changed. ,13.5 Check reserved fields zero (BSR RSVCHK);‡-�If�error�then�'ER:�PDE�RESERVED�FIELD�NOT�ZERO,�PSN�=�X'!›(where�X�is�starting�PSN‚of�PDB)—'R:�ZERO�OUT'—'REPAIR�(Y/N)?'—if�'Y'�then�field�is�zeroed4—if�'N'�then�file�is�skipped�(continue�with�step�15) '13.6 Check attribute one of known types*‡-�If�error�then�'ER:�FILE�ATTRIBUTE�=�XX' ‘-�if�C-option�then�REPAIR�exits‘-�if‚NIM�then�'R:�DELETE�FILE' 'REPAIR�(Y/N)?' if�'Y'�then�file�is�deleted if�'N'�then�file�is�skipped)‘-�if�IM�then�UPDATE�PDE�loop�is�repeated *14. Check file depending on its attribute. 14.1 Contiguous files C14.1.1ƒ-�Check�starting�data�block�PSN�and�data�block�length�is�OK:%‹not�zero,�and�DB�on�disk�(BSR�MPSNC)8‘-�if�error�then�'ER:�DB�PSN�ERROR,�PSN�=�X,�LENGTH�=�X' ›-�if�C-option�then‚REPAIR�exits+›-�if�in�IM�then�repeate�'UPDATE�PDE?'�loop"›-�if�in�NIM�then�'R:�DELETE�FILE'¬'REPAIR�(Y/N)?'¬if�'Y'�then�file�is�deleted¬if�'N'�then�file�is�skipped I14.1.2ƒ-�If�not�recovering�a�deleted�file�then�check�DB�sectors�allocated)‹in�disk�SAT�(unless�SAT�to�be�recreated)7‘-�If�error�then�'ER:�DB�NOT�ALLOCATED�IN�SAT,�PSN�=�X' ›-�if�C-option�then�REPAIR�exits›-�if�NIM�then�'R:�ALLOCATE�DB'¥and�DB�is�allocated›-�if�IM�then�(BSR�DMPALC)§'DUMP�(Y/N)?'§if�'Y'�then�dump�DB§if�'N'�then�skip�dump§'R:�ALLOCATE�DB'§'REPAIR�(Y/N)?'§if�'Y'�then�DB�is�allocated#§if�'N'�then�repeat�UPDATE�PDE�loop I14.1.3ƒ-�Check�sectors�not�allocated�if�recovering�a�deleted�file�(unless‹SAT�to�be�recreated)8‘-�if�error�then�'ER:�DB�REALLOCATED�AFTER�FILE�DELETED, ¢PSN�=�X'�and¡'R:�DELETE�FILE'¡'REPAIR�(Y/N)?'"§if�'Y'�then�file�is�deleted�again§if�'N'�then�file�is�skipped?‘-�if�no�error�then�DB�sectors�are�marked�allocated�in�disk�SAT A14.1.4ƒ-�Check�DB�sectors�not�already�allocated�in�allocation�SAT:‘-�If�error�then�'ER:�DB�SPACE�ALREADY�ALLOCATED,�PSN�=�X' ›-�if�C-option�then�REPAIR�exits›-�if�NIM�then�'R:�DELETE�FILE'©'REPAIR�(Y/N)?'©if�'Y'�then�delete�file©if�'N'�then�skip�file$›-�if�IM�then�repeat�UPDATE�PDE�loop 014.1.5ƒ-�Check�reserved�fields�zero‚(BSR�RSVCHK)9“If�error�then�'ER:�PDE�RESERVED�FIELD�NOT�ZERO,�PSN�=�X'!¢(where�X�is�starting�PSN�of�PDB)¡'R:�ZERO�OUT'¡'REPAIR�(Y/N)?'¢if�'Y'�then�field�is�zeroed¢if�'N'�then�file�is�skipped .14.1.6ƒ-�If�IM�UPDATE�DB?�loop�in�next�version“a.�CR,�N�-�terminate�loop“b.�Q�-�'REPAIR�TERMINATED'#“c.�D�-�delete�file,�terminate�loop“d.�A�<$PSN>,�D�$PSN�-�'WHAT?':“e.�$PSN�-�dump�any�sector(s),�update�or�dump�DB�sector(s)&“f.�offset�-�update�first�sector�of�DB8“g.�$�-�dump�DB�sector(s),�if�'$,N'�and�N�>�DIRFE+1�thenšN�=�1�is�forced=“h.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-onlyšmode�till�done�or�error�found 14.2 Duplicate key indexed file C14.2.1ƒ-�Check�directory�entry�for�noncontiguous�files�(BSR�CDIRNC)-‹see�NONCONTIGUOUS�FILE�DIRECTORY�ENTRY�CHECK F14.2.2ƒ-�Check�key�size�OK:�zero�is�OK,�must�be�even,�less�than�record‹length�and�less�than�100)‘-�if�error�then�'ER:�KEY�SIZE�=�XX,�(D)'*“(where�'D'�stands‚for�duplicate�key�file) ›-�if�C-option�then�REPAIR�exits›-�if�NIM�then§'R:�ZERO�OUT'§'REPAIR�(Y/N)?'§if�'Y'�then�zero�out�key§if�'N'�then�(BSR�DELFIL)±'R:�DELETE�FILE'±'REPAIR�(Y/N)?'²if�'Y'�then�delete�file²if�'N'�then�skip�file ›-�if�IM�then(§'NEW?'�is�requested�to�get�new�one�byte §key�length§test�is�repeated�for�new�value (14.2.3ƒ-�Check�FABs�and�DBs�(BSR�FDBCHK)<‹see�FORWARD�oJ r�BACKWARD�FAB/DB�CHECK�depending�on�directoryE‹entry�check�results�-�during�first�version�only�the�forward�FAB�link ‹is�used. 14.3 Indexed file check C14.3.1ƒ-�Check�directory�entry�for�noncontiguous�files�(BSR�CDIRNC)-‹see�NONCONTIGUOUS�FILE�DIRECTORY�ENTRY�CHECK D‰-�Check�key�size�OK:�zero�is�not�OK,�must�be�even,�less�than�record‹length�and�less�than�100)‘-�if�error�then�'ER:�KEY�SIZE�=�XX,�(I)'7“(where�'I'�stands�for�indexed�file,�no�duplicate�keys) ›-�if�C-option�then�REPAIR�exits›-�if�NIM�then¤'R:�DELETE�FILE'¤'REPAIR�(Y/N)?'¤if�'Y'�then�delete�file¤if�'N'�then�skip�file ›-�if�IM�then(§'NEW?'�is�requested�to�get�new�one�byte §key�length§test�is�repeated�for�new�value (14.3.3ƒ-�Check�FABs�and�DBs‚(BSR�FDBCHK)<‹see�FORWARD�or�BACKWARD�FAB/DB�CHECK�depending�on�directory>‹entry�check�results�-�during�first�version�of�REPAIR�only�the‹forward�FAB�links�are�used. 14.4 Sequential file check C14.4.1ƒ-�Check�directory�entry�for�noncontiguous�files�(BSR�CDIRNC)-‹see�NONCONTIGUOUS�FILE�DIRECTORY�ENTRY�CHECK (14.4.2ƒ-�Check�key�size�OK:‚must�be�zero)‘-�if�error�then�'ER:�KEY�SIZE�=�XX,�(S)''“(where�'S'�stands�for�sequential�file) š-‚if�C-option�then�REPAIR�exits�else¢'R:�ZERO�OUT'¢'REPAIR�(Y/N)?'¢if�'Y'�then�zero�out�key ¢if�'N'�then¦'R:�DELETE�FILE'¦'REPAIR�(Y/N)?'§if�'Y'�then�delete�file§if�'N'�then�skip�file (14.4.3ƒ-�Check�FABs�and�DBsƒ(BSR�FDBCHK)<‹see�FORWARD�or�BACKWARD�FAB/DB�CHECK�depending�on�directory<‹entry�check�results�-�during�the�first�FAB�version�only�the‹forward�FAB�links�are�used. F15. If file found flag was set any updated sectors are written to diskD‰and�if�file�not�skipped�or�deleted�then�'FILE�OK'�and�'REPAIR�DONE'8‰else�'FILE�DELETED'�or�'FILE�SKIPPED'�and�'REPAIR�DONE'#„else�next�file�is�checked�(step�6)  ===============FINAL SAT CHECK=============== 1. '*** SAT CHECK ***' M2. Continue with SAT CHECK step 8 (check unused sectors not marked allocated)   2==================================================1NONCONTIGUOUS�FILE�DIRECTORY�ENTRY�CHECK‚(CDIRNC)2================================================== .1. Check DB size is OK: must be greater than 3#‡-�if�error�then�'ER:�DB�SIZE�=�XX' ‘-�if�C-option�then�REPAIR�exits4‘-�if�IM�then�repeate�'UPDATE�PDE?'�loop�(FILE�CHECK ˜step�12)‘-�if�NIM�then‚'R:�DELETE�FILE' 'REPAIR�(Y/N)?'�if�'Y'�then�delete�file�if�'N'�then�skip�file &2. Check last DB size equal to DB size#‡-�If�error�then�'ER:�LAST�DB�SIZE'—'DB�SIZE�=�XX' ‘-�if�C-option�then�REPAIR�exits“else�'R:�SET�EQUAL'˜'REPAIR�(Y/N)?'1™if�'Y'�then�DB�size�is�entered�into�last�DB�size�field ™if�'N'�then›-�if�NIM�then�'R:�DELETE�FILE'©'REPAIR�(Y/N)?'©if�'Y'�then�file�is�deleted©if�'N'�then�file�is�skipped(›-�if�IM�then‚repeate�'UPDATE�PDE?'�loop¨(FILE�CHECK�step�12) J3. Check record length OK: zero is OK, must be even, less than or equal to5ƒ(DB�size)*256�-�i.e.�record�must�fit�into�data�block+‡-�if�error�then�'ER:�RECORD�LENGTH�=�XXXX' ‘-�if�C-option�then�REPAIR�exits8‘-�if�IM�then�'UPDATE�PDE?'�loop�is�repeated�(FILE�CHECK —step�12)‘-�if�NIM�then�'R:�DELETE�FILE'Ÿ'REPAIR�(Y/N)?'Ÿif�'Y'�then�file�is�deletedŸif�'N'�then�file�is�skipped /4.�Check�FAB�size�OK:�not�zero‚and�less�than�20#‡-�If�error�then�'ER:�FAB�SIZE�=�X' ‘-�if�C-option�then�REPAIR�exits,‘-�if�IM�then�'UPDATE�PDE?'�loop�is�repeated‘-�if�NIM�then�'R:�DELETE�FILE'Ÿ'REPAIR�(Y/N)?'Ÿif�'Y'�then�file�is�deletedŸif�'N'�then�file�is�skipped  "5. Check EOF and EOR fields are OK4‰If�EOF�=�-1�then�EOR�must�also�be�-1�or�vice�versa,+‰EOF�can�be�zero�but�must�be�less�than�MPSN�-‚If�error�then�'ER:�EOF/EOR''›-�if�C-option�then�'REPAIR�TERMINATED'�else¡'R:�RECALCULATE'¡'REPAIR�(Y/N)?'*¡if�'Y'�then�REPAIR�will�count�sectors�and'§records�as�they�are�encountered�during)§FAB/DB�check,�the�new�values�are�entered&§into�PDE�at�the�end�of�FAB/DB�checkK �-)§EOR/EOF�is�set�to�zero�for�now,�continue§with�step�6.2 ¡if�'N'�then¥-�if�NIM�then�(BSR�DELFIL)±'R:�DELETE�FILE'±'REPAIR�(Y/N)?'²if�'Y'�file�is�deleted²if�'N'�file�is�skipped(¥-�if�IM�then�repeate�'UPDATE�PDE?'�loop J6. Check first FAB PSN (check first FAB pointer first, then if error checkMƒlast�FAB�pointer�and�check�FAB/DBs�using�backward�FAB�links�in�later�version ƒof�REPAIR) ,6.1 If EOF = EOR = -1 then FAB PSN must be 0‡-�If�error�then�'ER:�EOF/EOR''‘-�if�C-option�then�'REPAIR�TERMINATED'“else—'R:�RECALCULATE'—'REPAIR�(Y/N)?',–-�if�'Y'�then�REPAIR�will�count�sectors�and'˜records�as�they�are�encountered�during)˜FAB/DB�check,�the�new�values�are�entered3˜into�PDE,�continue�with�step�6.2�(set�EOF/EOR�=�0)–-�if�'N'�thenŸ-�if�NIM�then�(BSR�DELFIL)§'R:�DELETE�FILE'§'REPAIR�(Y/N)?'§if�'Y'�file�is�deleted§if�'N'�file�is�skipped0Ÿ-�if�IM�then�repeate�'UPDATE�PDE?'�loop�(repeat§from�FILE�CHECK�step�12) B‡-�If�no�error�then�last�FAB�PSN�must�be�also�zero�(file�is�empty)6‘-�if�error�then‚'ER:�EMPTY�FILE�-�LAST�FAB�PSN�NOT�0''•-�if�C-option�then�'REPAIR�TERMINATED'•-�if�NIM�then�'R:�ZERO�OUT'£'REPAIR�(Y/N)?'1›-�if�'Y'�then�zero�last�FAB�pointer�in�PDE,�filežcheck�is�done›-�if�'N'�then�skip�file6•-�if�IM�then�repeat�UPDATE�PDE�loop�(repeat�from�FILE›CHECK�step�12)3‘-�if�no�error�then�file�check�done�-�file�is�empty C6.2 Check first FAB PSN OK: not zero, FAB on disk (EOF/EOR .NE. -1):‡-�if�zero�and�if�last�FAB�PSN�=�0�then�'ER:�NO�FAB�LINKS'Ž'R:�SET�FILE�EMPTY'*�and�EOF/EOR�are�set�to�-1�(file�is�empty)�file's�check�is�complete7‰else�if�error�then�'ER:�BAD�FAB�FORWARD�LINK,�PSN�=�X' Œ-�if�C-option�then�REPAIR�exits)•-�If�IM�then�UPDATE�PDE�loop�is�repeated•-�If�NIM�then�'R:�DELETE�FILE'£'REPAIR�(Y/N)?'ŸIf�'Y'�then�file�is�deletedŸIf�'N'�then�file�is�skipped•(in�later�version�do�instead:!•'R:�USE�FAB�BACKWARD�LINKS�ONLY'•'REPAIR�(Y/N)?'0™if�'Y'�then�FABs�and�DBs�are�checked�using�only)�FAB�backward�links.�The�first�FAB�PSN�is1�updated�in�PDE�when�end�of�FAB�chain�is�reached.1�(first�FAB�pointer�is�set�to�zero�for�now;�it�is.�updated�when�the�end�of�the�chain�is�reached)™if�'N'‚and�NIM�then§'R:�DELETE�FILE'§'REPAIR�(Y/N)?'§if�'Y'�file�is�deleted§if�'N'�file�is�skipped4™if�'N'�and�IM�then�repeate�'UPDATE�PDE?'�loop,�FILE CHECK�step�12) K6.3 If first FAB PSN not OK then check last FAB PSN is OK: not zero and FAB„on�disk.‚(EOF/EOR�.NE.�-1),„(not�applicable�in�first�version�of�REPAIR)5‡-�If�error�then�'ER:�BAD�FAB�BACKWARD�LINK,�PSN�=�X'‰(both�FAB�links�are�bad) Œ-�if�C-option�then�REPAIR�exitsŒ-�if�NIM�then�(BSR�DELFIL)˜'R:�DELETE�FILE'˜'REPAIR�(Y/N)?'˜if�'Y'�file�is�deleted˜if�'N'�file�is�skipped=Œ-�if�IM�then�repeate�'UPDATE�PDE?'�loop�(FILE�CHECK�step�12) H6.4 If first FAB PSN OK and not recovering a deleted file then check FAB.„allocated�in�disk�SAT�(if�not�recreating�SAT)6�if�error�then�'ER:�FAB�NOT�ALLOCATED�IN�SAT,�PSN�=�X''‘-�if�C-option�then�'REPAIR�TERMINATED'‘-�if�IM�then�(BSR�DMPALC)�'DUMP�(Y/N)?'�if�'Y'�then�dump�first�FAB�if�'N'�then�skip�dump�'R:�ALLOCATE�FAB'�'REPAIR�(Y/N)?'�if�'Y'�then�allocate�FAB#�if�'N'�then�repeat�UPDATE�PDE�loop,�(during�later�version�of�REPAIR�do�instead:-�if�'N'�then�'R:�USE�FAB�BACKWARD�LINKS�ONLY'©'R:�REPAIR�(Y/N)?'(¥if�'Y'�then�first�FAB�PSN�is�zeroed�and!«last�FAB�PSN�is�checked�to�be�OK#¥if�'N'�repeate�'UPDATE�PDE?'�loop) ‘-�if�NIM�then�'R:�ALLOCATE�FAB'›and�allocate�first�FAB K6.5 If first FAB PSN not OK and not recovering deleted file then check last*„FAB�allocated�(using�backward�links�only),„(not�applicable�in�first�version�of�REPAIR)6‰if�error�then�'ER:�FAB�NOT�ALLOCATED�IN�SAT,�PSN�=�X''‘-�if�C-option�then�'REPAIR�TERMINATED'‘-�if�IM�then�(BSR�DMPALC)�'DUMP�(Y/N)?'�if�'Y'�then�dump�last�FAB�if�'N'�then�skip�dump�'R:�ALLOCATE�FAB'�'REPAIR�(Y/N)?'�if�'Y'�then�allocate�last�FAB'�if�'N'�then�repeate�'UPDATE�PDE?'�loop ‘-�iK f�NIM�then�'R:�ALLOCATE�FAB'›and�allocate�last�FAB F6.6 If first FAB PSN OK and recovering deleted file then check FAB not„allocated�in�disk�SATB‡-�if�error�then�'ER:�FAB�REALLOCATED�AFTER�FILE�DELETED,�PSN�=�X''‘-�if�C-option�then�'REPAIR�TERMINATED'—else‚'R:�DELETE�FILE'�'REPAIR�(Y/N)?'�if�'Y'�then�delete�file�if�'N'�then�skip�file ,‰-�if�no�error�then�allocate�FAB�in�disk�SAT K6.7�If�first�FAB�PSN�not�OK�and‚recovering�deleted�file�then�check�last�FAB„not�allocated‚in�disk�SAT,„(not�applicable�in�first�version�of�REPAIR)A‡-�if�error�then�'ER:�FAB�REALLOCATED�AFTER�FILE�DELETED,�PSN�=X''•-�if�C-option�then�'REPAIR�TERMINATED'—else„'R:�DELETE�FILE'Ÿ'REPAIR�(Y/N)?' if�'Y'�file�is�deleted if�'N'�file�is�skipped 0‡-�if�no�error�then�FAB�is�allocated�in�disk�SAT J6.8 If first FAB PSN OK then check that first FAB is not already allocated;‡-�if�error�then�'ER:�FAB�SPACE�ALREADY�ALLOCATED,�PSN�=�X''‘-�if�C-option�then�'REPAIR�TERMINATED'“else"—if�IM�then�repeat�UPDATE�PDE�loop —if‚NIM�then¦'R:�DELETE�FILE'¦'REPAIR�(Y/N)?'¦if�'Y'�then�delete�file¦if�'N'�then�skip�file)“(during�later�REPAIR�version�do�instead:;“else�'R:�DELETE�FAB'�if�first�sector�not�yet�allocated,�or5˜'R:�USE�FAB�BACKWARD�LINKS�ONLY'�if�first�sector�was ›allocated˜'REPAIR�(Y/N)?' �if�'Y'�then�repair�as�indicated�if�'N'�and�NIM�then¦'R:�DELETE�FILE'¦'REPAIR�(Y/N)?'¦if�'Y'�then�delete�file¦if�'N'�then�skip�file/�if�'N'�and�IM�then�repeate�'UPDATE�PDE?'�loop) E6.9 If first FAB PSN not OK then check last FAB not already allocated9‰if�error�then�'ER:�FAB�SPACE�ALREADY�ALLOCATED,�PSN�=�X',„(not�applicable�in�first�version�of�REPAIR)'‘-�if�C-option�then�'REPAIR�TERMINATED'7“else�'R:�DELETE�FAB'�if�first�sector�not�yet�allocated+˜'R:�DELETE�FILE'�if�first�sector�allocated˜'REPAIR�(Y/N)?' �if�'Y'�then�repair�as�indicated�if�'N'�and�NIM‚then�skip�file.�if�'N'�and�IM�then�repeate�'UPDATE�PDE?'�loop G6.10 If first FAB OK do forward FAB/DB check until find error or end ofD…FAB�chain�-�if�error�then�user�has�option�to�continue�with�backwardG…FAB/DB�check,�then�when�done�the�two�chain�parts�are�combined�-�duringH…first�version�only�forward�FAB�check�is�processed,�any�error�will�causeH…FAB�chain�to�be�truncated�unless�the�user�supplies�next�FAB�link�in�IM. K6.11 If first FAB not OK but last FAB OK then do backward FAB/DB check only…in�next�version. ==============================FORWARD�FAB/DB�CHECK‚-�FDBCHK============================== N‚NOTE:�THIS�IS�THE�ONLY�DIRECTION�THAT�THE�FAB'S�OF�A�CORRECT�FILE�ARE�CHECKED FˆDURING�FIRST�VERSION�THIS�IS�THE�ONLY�DIRECTION�THAT�THE�FAB�CHAIN�IS ˆPROCESSED. #1. Allocate FAB/DB segment for file>‡-�if�error�then�'SEGMENT�ALLOCATION�ERROR,�D0�=�X,�SEG:�FDBS'‰and�'REPAIR�TERMINATED' "2. Get first/next FAB (BSR GETSEC)E‡-�if�none�then�either�update�EOF/EOR�in�PDE�or�check�that�calculated&‰values�for�EOF/EOR�match�those�in�PDE2‘-�if�error�then�'ER:�EOF/EOR�AND�FAB/DB�CONFLICT''›-�if�C-option�then�'REPAIR�TERMINATED'�else¡'R:�RECALCULATE'+�and�calculated�values�are�entered�into�PDE‰File�check�is�complete2›-�if�file�repair�then�'FILE�OK'�and�'REPAIR�DONE'/�else�deallocate�FAB/DB�buffer,�check�next�file?‡-�if‚read�error�then�'IO�ERROR,�D0�=�X�FROM�READ�FAB,�PSN�=�X'&‰or�'CRC�ERROR�FROM�READ�FAB,�PSN�=�X''‘-�if�C-option�then�'REPAIR�TERMINATED'+‘-�if�CRC�error�then�FAB�update�flag�is�set‘-�if�other�than�CRC�error�then3�'R:�DELETE�FAB'�if�first�FAB�sector�was�read�in�OKž(current�FAB�is�deleted)�or3�'R:�TRUNCATE�FAB�CHAIN'�if�first�FAB�sector�was�no žread�in�OK"�(during�later�version�do�instead:1�'R:�SWITCH�TO�USING�BACKWARD�LINKS'�if�first�FAB2žsector�was�not�read�in�OK�[prior�FAB�will�be�last žgood�FAB�in�forward�FAB�chain])$�if�IM�'UPDATE�FAB?'�loop�is�entered�if�NIM�then�'REPAIR�(Y/N)?' £if�'Y'�then�repair�as�indicated£if�'N'�then�'R:�DELETE�FILE'¯'REPAIR�(Y/N)?'¯if�'Y'�then�delL ete�file¯if�'N'�then�skip�file 03. If FAB is empty then 'ER: EMPTY FAB, PSN = X'ˆif�C-option�then�REPAIR�exitsHˆelse�'R:�DELETE�FAB'�and�FAB�is�deleted�after�its�forward�link�has�been!ˆchecked�to�be�OK�(steps�6.1-6.7) 4. In IM dump FAB*ƒIf�NIM�or�C-option�then‚skip�till�step�6. 5. In IM 'UPDATE FAB?'‰a.�CR�-�terminate�loop5‰b.�N�-�terminate�loop�and�turn�off�IM�till�next�file‰c.�Q�-�'REPAIR�TERMINATED'D‰d.�D�-�delete�current�FAB,�forward�FAB�pointer�is�used�for�next�FAB?‰e.�R�-�'WHAT?'�unless�REPAIR�R-message�preceeded�in�which�case-�repair�is�done�as�indicated;�terminates�loop‰f.�A�[$PSN]�-�'WHAT?'‰g.�D�$PSN�-‚'WHAT?':‰h.�$,�$PSN�-�dump�sector(s),�dump�or�update�FAB�sector(s)1–if�'$,N'�where�N�>�FAB�size�then�N�=�1�is�forced'‰i.�offset�-�update�first�sector�of�FAB=‰j.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-only�mode�till�done�or�error�found 6. Check FAB headerHƒIf�FAB�contains�too�many�errors�then�'ER:�BAD�FAB�CONTENTS'�and�the�FABƒchain�is�truncated. 6.1 If next FAB PSN = 0 then2‰check�current�FAB�PSN‚same�as�last�FAB�PSN�in�PDE?‘-�if�same�then�after�current�FAB�is�checked�file�check�is�done7‘-�if�not�same�then�'ER:�BAD�FAB�FORWARD�LINK,�PSN�=�0'¤'LAST�FAB�PSN�=�X'%�if�C-option�then�'REPAIR�TERMINATED'�else¤'R:�TRUNCATE�FAB�CHAIN'+¢-�if�NIM�then�set�current�FAB�PSN�into�PDE¤last�FAB�pointer�field¢-�if�IM�then�'REPAIR�(Y/N)?'!¤-�if�'Y'�then�truncate�FAB�chain'¦by�setting�current�FAB's�PSN�into�last¦FAB�pointer�field�in�PDE(¦(current�FAB�is�last�one�to�be�checked)¤-�if�'N'�then©repeat�UPDATE�FAB�loop!©(during�later�version�of�REPAIR:$©'R:�SWITCH�TO�USING�BACKWARD�LINKS' ©and‚repeate�'UPDATE�FAB?'�loop) F6.2 If next FAB PSN not zero then next FAB must be on disk (BSR MPSNC)4‡-�if�error�then�'ER:�BAD�FAB�FORWARD�LINK,�PSN�=�X''‘-�if�C-option�then�'REPAIR�TERMINATED'“else�'R:�TRUNCATE�FAB�CHAIN'"–if�IM�then�repeat�UPDATE�FAB�loop:–if�NIM�then�repair�as�indicated�(current�FAB�becomes�last ˜in�chain))“(during�later�REPAIR�version�do�instead:)“else�'R:�SWITCH�TO�USING�BACKWARD�LINKS'4•(switch�is�made�after�current�FAB�has�been�checked)(–-�if�IM�then�repeate�'UPDATE�FAB?'�loop"–-�if�NIM�then�repair�as�indicated œcurrent�FAB�is�last�good�FAB�inœforward‚chain�- œlater�the�two�parts�are�joined) F6.3 If next FAB exists and not doing file recovery then check next FAB„allocated�in�disk�SAT8‡-�if�error�then�'ER:�FAB�NOT�ALLOCATED�IN�SAT,�PSN�=�X''‘-�if�C-option�then�'REPAIR�TERMINATED' ‘-�if�NIM�then�'R:�ALLOCATE�FAB'›and�allocate�FAB‘-�if�IM�then�(BSR�DMPALC)�'DUMP�(Y/N)?'�if�'Y'�then�dump�next�FAB�if�'N'�then�skip�dump�'R:�ALLOCATE�FAB'�'REPAIR�(Y/N)?'�if�'Y'�then�allocate�FAB'�if�'N'�then�repeate�'UPDATE�FAB?'�loop  F6.4 If next FAB exists and doing file recovery then check next FAB not „allocated.A‡-�if�error�then�'ER:�FAB�REALLOCATED�AFTER�FILE�DELETED,�PSN�=X''•-�if�C-option�then�'REPAIR�TERMINATED'—else—'R:�DELETE�FILE'—'REPAIR�(Y/N)?'—-�if�'Y'�then�file�is�deleted—-�if�'N'�then�file�is�skipped+‡-�if�no�error�FAB�is�allocated�in�disk�SAT 26.5 If next FAB exists check not already allocated;‡-�if�error�then�'ER:�FAB�SPACE�ALREADY�ALLOCATED,�PSN�=�X''•-‚if�C-option�then�'REPAIR�TERMINATED'˜else2—'R:�DELETE�FAB'�if�first�sector�not�allocated,�or—'R:�TRUNCATE�FAB�CHAIN'$—-�if�IM�then�repeat�UPDATE�FAB�loop6—-�if�NIM�then�repair�as�indicated�(if�delete�FAB�then3™next�FAB�link�is�obtained�and�test�is�repeated�for4™new�link;�if�truncate�then�current�FAB�becomes�last™FAB�in�the�chain))—(during�later�REPAIR�version�do�instead:4—'R:�SWITCH�TO�USING�BACKWARD�LINKS'�if�first�sector ˜allocated6—-�if‚NIM�repair�as�indicated�(if�delete�FAB�then�next2™FAB�link�is�obtained�and�test�is�repeated�for�new4™link;�if�switch�links�then�switch�after�current�FAB™has‚been�checked)$—-�if‚IM�repeate�'UPDATE�FAB?'�loop) !6.6 If FAB is empty it is deleL ted N6.7 If current FAB is to be deleted update link in prior FAB, process next FABC‰-�If�IO�error�from�read�then�error�message�and�'REPAIR�TERMINATED' I6.8 Check backward link in FAB same as PSN of prior FAB, or 0 if no prior„FAB.?‡-�force�same�if�FAB�deleted�(cannot�have�proper�backward�link)5‡-�if�error�then�'ER:�BAD�FAB�BACKWARD�LINK,�PSN�=�X'—'PRIOR�FAB�PSN�=�X''•-�if�C-option�then�'REPAIR�TERMINATED'—else-šif�forward�link‚was�also�bad�and�in�NIM�then-štruncate�FAB�chain�(prior�FAB�last�in�chain)6š(in�next�version�switch�to�backward�links);�otherwise—'R:�FIX�LINK'4—if�NIM�then�backward�link�is�set�to�equal�prior�FAB —if�IM�thenš'REPAIR�(Y/N)?'4™if�'Y'�then�backward�link�is�set�to�equal�prior�FAB™if�'N'�then�file�is�skipped :6.9 Check header key field is OK: equal to file's key size(‡-�if�error�then�'ER:�KEY�SIZE�=�XX�(H)''•-�if�C-option�then�'REPAIR�TERMINATED'—else"š'R:�SET�EQUAL�TO�FILE'S�KEY�SIZE'šif�NIM�then�set�equal šif�IM�then�'REPAIR�(Y/N)?'�if�'Y'�then�fix�key�field�if�'N'�then�'R:�DELETE�FILE'£'REPAIR�(Y/N)?'£if�'Y'�then�delete�file£if�'N'�then�skip�file /6.10�Check�header�key�not�less�than‚prior�FAB's…last�key‚if�indexed�file)‡-�if�error�'ER:�FAB/DB�KEY�CONFLICT�(H)''�-�if�C-option�then�'REPAIR�TERMINATED'’else—'R:�RECALCULATE'—if�NIM�then�set�equal —if�IM�thenœ'REPAIR�(Y/N)?'/œif�'Y'�then�set�equal�to�last�key�of�prior�FABœif�'N'�then�'R:�DELETE�FILE'¨'REPAIR�(Y/N)?'¤if�'Y'�then�delete�file¤if�'N'�then�skip�file7. Check each FAB entry C7.1†-�if�DB�PSN�=�0�then�recalculate�FAB�use�fraction�and�write�FAB?‹to�disk�if�FAB‚updated,�go�check�next�FAB‚(step�2)�(�switch�to:‹using�backward�FAB�links�if�so�indicated�in�next�version) ž ‡> �I ˜A  < ¨8 °7 ¸= ÀG ÈE ÐT Ø77.2†-�check�key�field�length�equal�to�key�size�for�file“-�if�error�then�'ER:�KEY�SIZE�=�XX�(E)'›-�if�C-option�then�'REPAIR�TERMINATED'�else"¢'R:�SET�EQUAL�TO�FILE'S�KEY�SIZE'¢if�NIM�then�set�equal ¢if�IM�then¤'REPAIR�(Y/N)?'(¤if�'Y'�then�force�key�length�into�field¤if�'N'�then�'R:�TRUNCATE�FAB'®'REPAIR�(Y/N)?'#¨if�'Y'�then�set�end�of�FAB�mark�at ªcurrent�FAB�entry,�go�to�step�8¨if�'N'�then�skip�file !7.3†-�check�DB�PSN‚OK:�DB�on�disk,‘-�if�error�then�'ER:�DB�PSN�ERROR,�PSN�=�X''›-�if�C-option�then�'REPAIR�TERMINATED' ›-�if�IM�then¡'NEW?''¡if�new�PSN�=�0�then�the�DB's�FAB�entry+¡is�deleted,�otherwise�the�test�is�repeated›-�if�NIM�then�'R:�DELETE�DB'¤and�DB's�FAB�entry�is�deleted 97.4†-�check�DB�allocated�if�not�recovering�a�deleted�file7‘-�if�error�then�'ER:�DB�NOT�ALLOCATED�IN�SAT,�PSN�=�X''›-�if�C-option�then�'REPAIR�TERMINATED'3›-�if�NIM�then�'R:�ALLOCATE�DB'�and�DB�is�allocated›-�if�IM�then�(BSR�DMPALC)§'DUMP�(Y/N)?'§if�'Y'�then�dump�DB§if�'N'�then�skip�dump§'R:�ALLOCATE�DB'§'REPAIR�(Y/N)?'§if�'Y'�then�allocate�DB §if�'N'�then�'R:�GIVE�NEW�VALUE'³'OLD�=�XXXXXXXX'³'NEW?'³if�0�then�DB�and�FAB�entry ³are�deleted³else�new�DB�PSN�is�checked³again 97.5†-�check�DB�not�allocated�if�recovering�a�deleted�file‘-�if�error�then0�'ER:�DB�REALLOCATED�AFTER�FILE�DELETED,�PSN�=X''›-�if�C-option�then�'REPAIR�TERMINATED'�else 'R:�DELETE�DB' and�delete�DB's�FAB�entry%‘-�if�OK�then�allocate�DB�in�disk�SAT $7.6†-�check�DB�not�already�allocated:‘-�if�error�then�'ER:�DB�SPACE�ALREADY�ALLOCATED,�PSN�=�X''›-�if�C-option�then�'REPAIR�TERMINATED'�else¡'R:�DELETE�DB'"¡if�NIM�then�delete�DB's�FAB�entry¡if�IM�then�'REPAIR�(Y/N)?'"§if�'Y'�then�delete�DB's�FAB�entry§if�'N'�then�'DUMP�(Y/N)?'­if�'Y'�then�dump�DB­else�skip�dump­'SKIP�(Y/N)?'­if�'Y'�then�skip�file­if�'N'�then�'R:�GIVE�NEW�PSN'¹'OLD�XXXXXXXX'¹'NEW?'®0�deletes�data�block,�else®new�PSN�is�checked�again M J7.7†-�check�DB�sectors-in-use�count�(FDB�size)�is�less�than�or�equal�to�DB‹size‚and�not�zero‘-�if�error�then�'ER:�FDB�SIZE�=�XX'�'DB�SIZE�=�XX''›-�if�C-option�then�'REPAIR�TERMINATED'›-�if�NIM�then¢'R:�DELETE�DB'�and�DB's�FAB£entry�is�deleted ›-�if�IM�then¢'R:�GIVE�NEW�VALUE' ¢'OLD�XX'¢'NEW?'2ž0�deletes�data�block�and�its�FAB�entry,�otherwisežnew�value�is�checked�again !7.8†-�read�in�DB's�sectors�in�use3‘-�if�previous�DB�was�updated�write�it�back�to�disk›-�if�IO�error�then*Ÿ'IO�ERROR,�D0�=�X�FROM�WRITE�DB,�PSN�=�X'Ÿ'R:�DELETE�DB'Ÿ'REPAIR�(Y/N)?'§if�'Y'�then�delete�DB§if�'N'�then�skip�file;‘-�if�IO�error�then�'IO�ERROR,�D0�=�X�FROM�READ�DB,�PSN�=X'%“or�'CRC�ERROR�FROM�READ�DB,�PSN�=�X'-‘-�if�IO�error�and�C-option�then�REPAIR�exits(‘-�if�CRC�error�then�set�DB�updated�flag'‘-�if�non-CRC‚error�then�'R:�DELETE�DB' ¥-�if�IM�then�do�UPDATE�DB?�loop§elseª'REPAIR�(Y/N)?'#«if�'Y'�delete�DB�and�its�FAB�entry«if�'N'�then�skip�file *7.9†-�if�NIM�or�C-option�then�skip�to�7.11 "7.10…-�if�IM�then�'UPDATE�DB?�loop“a.�CR�-�terminates�loop6“b.�N�-�terminates�loop�and�turns�off�IM�till�next�FAB“c.�Q�-�'REPAIR�TERMINATED'7“d.�$,�$PSN,�offset�-�dump�sector(s),�dump�or�update�DB"“e.�D�-�delete�DB,�terminates�loop“f.�D�$PSN,�A�[$PSN]�-�'WHAT?'8“g.�R�-�'WHAT?'�unless�REPAIR�message�preceeded�in�which2šcase�repair�is�done�as�indicated,�terminates�loop=“h.�C�-�terminates�loop,�REPAIR�continues�as�if�in�check-onlyšmode�till�done�or�error�found 7.11…-�check�DB=7.11.1�-�if�VRL�then�number�of�records�must�equal�FAB�entry's •record�count-›-�if�error�then�'ER:�FAB/DB�RECORD�CONFLICT''¢-�if�C-option�then�'REPAIR�TERMINATED'¤else«'R:�RECALCULATE'¨and�force�#�of�records¨found�in�DB�into�FAB�entry7“-�if�VRL�then�number�of�sectors�must�equal�FAB�entry's •sector�count-›-�if�error�then�'ER:�FAB/DB�SECTOR�CONFLICT''¢-�if�C-option�then�'REPAIR�TERMINATED'¤else«'R:�RECALCULATE'¨and�force�#�of�sectors¨found�in�DB�into�FAB�entry  C7.11.2�-�if�VRL�then�last�record�in�DB�must�be�either�followed�with9•a�zero�length�record�or�it�must�end�at�the�end�of�DB�and9•if�non-null�keys�record�lengths�must�be�greater�than�key•size+›-�if�error�then�'ER:�RECORD�LENGTH�=�XXXX''¢-�if�C-option�then�'REPAIR�TERMINATED'¤else¥-�if�NIM�then�'R:�TRUNCATE�DB' §and�truncate�DB�after�last�good®record%¥-�if�IM�then�repeat�'UPDATE�DB?�loop <7.11.3�-�if�FRL�then�number�of�records�specified�in�FAB�must4•fit�into�the�DB�and�remaining�DB�space�must�be�zero-›-�if�error�then�'ER:�FAB/DB�RECORD�CONFLICT, ¤PSN�=�X''¢-�if�C-option�then�'REPAIR�TERMINATED'¢-�if�NIM�then�'R:�DELETE�DB'¥and�DB�is�deleted'¢-�if�IM�then�repeate�'UPDATE�DB?'�loop @7.11.4�-�if�non-null�keys�then�check�keys�are�in�ascending�order.•and�that�keys�are�only�equal�if�duplicate�key•file,›-�if�error�then�'ER:�DB�KEY�ORDER,�PSN�=�X''ž-�if�C-option�then�'REPAIR�TERMINATED' else‚'ER:�TRUNCATE�DB'¤-�if�NIM‚then�truncate�DB¬after�last�good�record'¤-�if�IM�then�repeate�'UPDATE�DB?'�loop ?7.11.5�-�if�non-null�keys�then�check�FAB�entry�key�greater�than•or�equal�to�last�key�of�DB.›-�if�error�then�'ER:�FAB/DB�KEY�CONFLICT�(L)'"¢(where�'L'�is�for�last�key�of�DB)' -�if�C-option�then�'REPAIR�TERMINATED'¢else§'R:�RECALCULATE'(¦-�if�NIM�then�force�last�key�of�DB�into ªFAB�entry¦-�if�IM�then�'REPAIR�(Y/N)?'$ªif�'Y'�then�last�key�is�forced�into ±FAB�entry"ªif�'N'�then�repeat�UPDATE�DB�loop B7.11.6Œ-�if�non-null�keys�then�check�first�key�of�DB�not�less�than2”the�key�of�prior�FAB�entry�(maybe�FAB�header�key)%”and�equal�only�if�duplicate�key�file.›-�if�error�then�'ER:�FAB/DB�KEY�CONFLICT�(F)',�(where�'1'�is�for�first�key�of�DB�in�error)'ž-�if�C-option�then�'REPAIR�TERMINATED' else§'R:�DELETE�DB''¥-�if�IM�then�repeate�'UPDATE�DB?'�loop¥-�if�NIM�then�DB�is�deleted N8. If FAB was updated it is written to disk - IO error causes 'REPAIR ABORTED'M HƒIf�indicated�to�switch�links�continue�with�BACKWARD�FAB/DB�CHECK�step�22ƒ(later�version�of�REPAI)�else�go�process�next�FAB  ==============================BACKWARD FAB/DB CHECK - FDBCHK============================== INOTE: IF C-OPTION THEN BACKWARD LINKS ARE NEVER USED AND THIS PART IS NOT †EXECUTED +†NOT�IMPLEMENTED�IN�FIRST�VERSION�OF�REPAIR I1. If doing only backward FAB check then allocate FAB/DB segment for fileƒelse�skip�to�step�2>‡-�if�error�then�'SEGMENT�ALLOCATION�ERROR,�D0�=�X,�SEG:�FDBS'3Ž-�if�C-option�or�file�repair�then�'REPAIR�ABORTED'�else„'SKIP�(Y/N)?'˜if�'Y'�then�file�is�skipped ˜if�'N'�then�'REPAIR�TERMINATED' 62.�Get�last/next�FAB‚using�backward�links�(BSR�GETSEC)ƒ-�if�no�next�FAB�thenC‡-�if�backward�check�only�set�EOF/EOR�in�PDE�(calculated�values�areD‰entered�into�PDE),�file�check�is�complete:�prior�FAB�PSN�is�entered‰into�PDE�as�first�FAB�pointer.G‡-�if�switched�to�backward�links�then�combine�the�two�FAB�parts,�update'‰EOF/EOR�in‚PDE,�file�check�is�complete0…if�file�repair�then�'FILE�OK'�and�'REPAIR�DONE'/…else�deallocate�FAB/DB�buffer,�check�next�file ?ƒ-�if‚read�error�then�'IO�ERROR,�D0�=�X�FROM�READ�FAB,�PSN�=�X'&…or�'CRC�ERROR�FROM�READ�FAB,�PSN�=�X'+‘-�if�CRC�error�then�FAB�update�flag�is�set‘-�if�other�than�CRC�error�then,�'R:�DELETE�FAB,�PSN�=X'ƒif�first�FAB�sectoržwas�read�in�OK�or,�'R:�TRUNCATE�FAB�CHAIN'‚if�first�FAB�sector¡was�not�read�in�OK$�if�IM�'UPDATE�FAB?'�loop�is�entered�if�NIM�then�'REPAIR�(Y/N)?' £if�'Y'�then�repair�as�indicated%¦If�delete�then�backward�link�of�next¦FAB�is�obtained�and!¦new�link�is�checked�to�be�OK�(do¦steps�6.1�-6.7)(¦If�truncate�then�prior�FAB�becomes�last%¦good�FAB�in�backward�FAB�chain,�file#¦check�is�completed�(repeat�step�2)£if�'N'�then�'R:�DELETE�FILE'¯'REPAIR�(Y/N)?'¯if�'Y'�then�delete�file¯if�'N'�then�skip�file 03. If FAB is empty then 'ER: EMPTY FAB, PSN = X'˜'R:�DELETE�FAB'Lƒand�FAB�is�deleted�after�its�backward�link�has�been�checked�to�be�OK�(steps ƒ6.1�-�6.7) 4. In IM dump FABƒIf�NIM�then�skip�to�step�6. 5. In IM 'UPDATE FAB?'‰a.�CR�-�terminate�loop5‰b.�N�-�terminate�loop�and�turn�off�IM�till�next�file‰c.�Q�-�'REPAIR�TERMINATED'E‰d.�D�-�delete�current�FAB,�backward�FAB�pointer�is�used�for�next�FAB?‰e.�R�-�'WHAT?'�unless�REPAIR�R-message�preceeded�in�which�case-�repair�is�done�as�indicated,�terminates�loop‰f.�A�[$PSN]�-�'WHAT?'‰g.�D�$PSN�-‚'WHAT?':‰h.�$,�$PSN�-�dump�sector(s),�dump�or�update�FAB�sector(s)1–if�'$,N'�where�N�>�FAB�size�then�N�=�1�is�forced'‰i.�offset�-�update�first�sector�of�FAB 6. Check FAB header H6.1 If next FAB PSN = 0 (backward link = 0) and doing backward FAB checkG„only�then�after�current�FAB�is�checked�file�check�is�done�(current�FAB+„PSN�is�entered�into�PDE�first�FAB�pointer) >„If�next�FAB�PSN�=�0�and�switched�to�using�backward�links�then%“'ER:�BAD�FAB�BACKWARD�LINK,�PSN�=�0'“'R:�TRUNCATE�FAB�CHAIN'7“and‚the�forward�and�backward�chains�are�combined�after;“the�FAB�has�been�checked�(current�FAB�last�FAB�in�backward“chain) I6.2 If next FAB PSN is not zero then next FAB must be on disk (BSR MPSNC)5‡-�if�error�then�'ER:�BAD�FAB�BACKWARD�LINK,�PSN�=�X'—'R:�TRUNCATE�FAB�CHAIN'(–-�if�IM�then�repeate�'UPDATE�FAB?'�loop3–-�if�NIM�then�repair�as�indicated:‚the�current‚FAB4˜becomes�the�first�FAB�of�the�file�if�doing�backward5˜FAB�check�only,�else�the�forward�and�backward�chains5˜are�combined�after�the�FAB�has�been�checked�(current ˜FAB�last�FAB�in�backward�chain) F6.3 If next FAB exists and not doing file recovery then check next FAB „allocated.8‡-�if�error�then�'ER:�FAB�NOT�ALLOCATED�IN�SAT,�PSN�=�X'‘-�if�NIM�then�allocate�FAB‘-�if�IM�then�(BSR�DMPALC)�'DUMP�(Y/N)?'�if�'Y'�then�dump�next�FAB�if�'N'�then�skip�dump�'R:�ALLOCATE�FAB'�'REPAIR�(Y/N)?'�if�'Y'�then�allocate�FAB'�if�'N'�then�repeate�'UPDATE�FAB?'�loop N F6.4 If next FAB exists and doing file recovery then check next FAB not „allocated.A‡-�if�error�then�'ER:�FAB�REALLOCATED�AFTER�FILE�DELETED,�PSN�=X'—'R:�DELETE�FILE'—'REPAIR�(Y/N)?'—-�if�'Y'�then�file�is�deleted—-�if�'N'�then�file�is�skipped+‡-�if�no�error�FAB�is�allocated�in�disk�SAT 26.5 If next FAB exists check not already allocated;‡-�if�error�then�'ER:�FAB�SPACE�ALREADY�ALLOCATED,�PSN�=�X'2—'R:�DELETE�FAB'�if�first�sector�not�allocated,�or2—'R:�TRUNCATE�FAB�CHAIN'�if�first�sector�allocated1—-�if‚NIM�repair�as�indicated�(if�delete�FAB�then*™obtain�next�FAB�PSN�and�check�link�again)"—-�if‚IM�repeat�'UPDATE�FAB?'�loop !6.6 If FAB is empty it is deleted M6.7 If current FAB is to be deleted update link in prior FAB and process next„FAB<‰If�IO�error�then�error�message�is�sent�and�'REPAIR�ABORTED' H6.8 Check forward link in FAB same as PSN of prior FAB, or 0 if no prior„FAB.-‡-�force�same�if�FAB�deleted�(cannot�be�same)4‡-�if�error�then�'ER:�BAD�FAB�FORWARD�LINK,�PSN�=�X'—'NEXT�FAB�PSN�=�X'˜or$—'ER:�BAD�FAB�FORWARD�LINK,�PSN�=�0'—'LAST�FAB�PSN�=�X'—'R:�FIX�LINK'7—if�NIM�then�forward�link�is�set�to�equal�prior�FAB�PSN —if�IM�then›'REPAIR�(Y/N)?'7™if�'Y'�then�forward�link�is�set�to�equal�prior�FAB�PSN™if�'N'�then�file�is�skipped :6.9 Check header key field is OK: equal to file's key size$‡-�if�error�then�'ER:�KEY�SIZE�=�XX'"—'R:�SET�EQUAL�TO�FILE'S�KEY�SIZE'—if�NIM�then�set�equal —if�IM�then™'REPAIR�(Y/N)?'šif�'Y'�then�fix�key�fieldšif�'N'�then�'R:�DELETE�FILE'£'REPAIR�(Y/N)?'£if�'Y'�then�delete�file£if�'N'�then�skip�file ,6.10 Check header key not less than last keyJ…in�forward�FAB�chain(last�key�of�last�DB�in�any�such�FAB)�if�indexed�file%‡-�if�error�'ER:�FAB/DB�KEY�CONFLICT'’'R:�RECALCULATE'’if�NIM�then�set�equal ’if�IM�then•'REPAIR�(Y/N)?'6•if�'Y'�then�set�equal�to�last�key�of�last�forward�FAB5—(later�may�have�to�also�set�equal�to�next�FAB's�last—key)•if�'N'�then�'R:�DELETE�FILE'¡'REPAIR�(Y/N)?'¤if�'Y'�then�delete�file¤if�'N'�then�skip�file7. Check each FAB entry D7.1†-�if�DB�PSN�=�0�then�recalculate�FAB�use�fraction�and�update�FABC‹on�disk�if�changed;�if�not�last�FAB�of�file�then�check�last�key�of3‹FAB�not�greater�than�FAB's�header�key�in�prior�FAB(�if�error�then�'ER:�FAB/DB�KEY�CONFLICT'�'R:�DELETE�FILE'�'REPAIR�(Y/N)?'•if�'Y'�then�file�is�deleted•if�'N'�then�file�is�skipped�else‚go�check�next�FAB 77.2†-�check�key�field�length�equal�to�key�size�for�file“-�if�error�then�'ER:�KEY�SIZE�=�XX'"�'R:�SET�EQUAL�TO�FILE'S�KEY�SIZE'�if�NIM�then�set�equal �if�IM�then 'REPAIR�(Y/N)?'(¡if�'Y'�then�force�key�length�into�field¡if�'N'�then�'R:�TRUNCATE�FAB'­'REPAIR�(Y/N)?'!§if�'Y'�then�end�of�FAB�is�marked$«at�current�FAB�entry,�continue�with«step�8§if�'N'�then�file�is�skipped !7.3†-�check�DB�PSN‚OK:�DB�on�disk,‘-�if�error�then�'ER:�DB�PSN�ERROR,�PSN�=�X' ›-�if�IM�then¡'NEW?''¡if�new�PSN�=�0�then�the�DB's�FAB�entry+¡is�deleted,�otherwise�the�test�is�repeated›-�if�NIM�then�'R:�DELETE�DB'¥and�DB's�FAB�entry�is�deleted 97.4†-�check�DB�allocated�if�not�recovering�a�deleted�file7‘-�if�error�then�'ER:�DB�NOT�ALLOCATED�IN�SAT,�PSN�=�X'›-�if�NIM�then�allocate�DB›-�if�IM�then�(BSR�DMPALC)§'DUMP�(Y/N)?'§if�'Y'�then�dump�DB§if�'N'�then�skip�dump§'R:�ALLOCATE�DB'§'REPAIR�(Y/N)?'§if�'Y'�then�allocate�DB§if�'N'�then�'R:�GIVE�NEW�PSN'³'OLD�=�XXXXXXXX'³'NEW?'³if�0�then�DB�and�FAB�entry ³are�deleted³else�new�DB�PSN�is�checked³again 97.5†-�check�DB�not�allocated�if�recovering�a�deleted�file‘-�if�error�then0�'ER:�DB�REALLOCATED�AFTER�FILE�DELETED,�PSN�=X'�'R:�DELETE�DB'�and�delete�DB's�FAB�entry%‘-�if�ok�then�allocate�DB�in�disk�SAT $7.6†-�check�DB�not�already�allocated:‘-�if�error�then�'ER:�DB�SPACE�ALREADY�ALLOCATED,�PSN�=�X'¡'R:�DELETE�DB'$Ÿ-�if�NIM�then�delete�DB's�FAB�entryŸ-�if�IM�then�'REPAIR�(Y/N)?'"§if�'Y'�then�delete�DB's�FAB�entry§if�'N'�then�'DUMP�(Y/N)?'N ­if�'Y'�then�dump�DB­else�skip�dump­'SKIP�(Y/N)?'­if�'Y'�then�skip�file­if�'N'�then�'R:�GIVE�NEW�PSN'¹'OLD�XXXXXXXX'¹'NEW?'®0�deletes�data�block,�else®new�PSN�is�checked�again J7.7†-�check�DB�sectors-in-use�count�(FDB�size)�is�less�than�or�equal�to�DB‹size�and�not�zero‘-�if�error�then�'ER:�FDB�SIZE�=�XX'�'DB�SIZE�=�XX'›-�if�NIM�then£'R:�DELETE�DB'�and�DB's�FAB£entry�is�deleted›-�if�IM�then�'DUMP�(Y/N)?'§-�if�'Y'�then�dump�DB�sectors©else�skip�dump¢'R:�GIVE�NEW�SIZE' ¢'OLD�XX'¢'NEW?'2ž0�deletes�data�block�and�its�FAB�entry,�otherwisežnew�value�is�checked�again !7.8†-�read�in�DB's�sectors�in�use3‘-�if�previous�DB�was�updated�write�it�back�to�disk›-�if�IO�error�then*Ÿ'IO�ERROR,�D0�=�X�FROM�WRITE�DB,�PSN�=�X'Ÿ'R:�DELETE�DB'Ÿ'REPAIR�(Y/N)?'§if�'Y'�then�delete�DB§if�'N'�then�skip�file;‘-�if�IO�error�then�'IO�ERROR,�D0�=�X�FROM�READ�DB,�PSN�=X'%“or�'CRC�ERROR�FROM�READ�DB,�PSN�=�X'(‘-�if�CRC�error�then�set�DB�updated�flag'‘-�if�non-CRC‚error�then�'R:�DELETE�DB' ¥-�if�IM�then�do�UPDATE�DB?�loop§elseª'REPAIR�(Y/N)?'#«if�'Y'�delete�DB�and�its�FAB�entry«if�'N'�then�skip�file 7.9†-�if�NIM�then�skip�to�7.11 "7.10…-�if�IM�then�'UPDATE�DB?�loop“a.�CR�-�terminates�loop6“b.�N�-�terminates�loop�and�turns�off�IM�till�next�FAB“c.�Q�-�'REPAIR�TERMINATED'7“d.�$,�$PSN,�offset�-�dump�sector(s),�dump�or�update�DB"“e.�D�-�delete�DB,�terminates�loop“f.�D�$PSN,�A�[$PSN]�-�'WHAT?'8“g.�R�-�'WHAT?'�unless�REPAIR�message�preceeded�in�which2šcase�repair�is�done�as�indicated,�terminates�loop 7.11…-�check�DB=7.11.1�-�if�VRL�then�number�of�records�must�equal�FAB�entry's •record�count-›-�if�error�then�'ER:�FAB/DB�RECORD�CONFLICT'«'R:�RECALCULATE'«and�force�#�of�records«found�in�DB�into�FAB�entry C7.11.2�-�if�VRL�then�last�record�in�DB�must�be�either�followed�with9•a�zero�length�record�or�it�must�end�at�the�end�of�DB�and9•if�non-null�keys�record�lengths�must�be�greater�than�key•size+›-�if�error�then�'ER:�RECORD�LENGTH�=�XXXX'«'R:�TRUNCATE�DB'%¥-�if�NIM�truncate�DB�after�last�good®record%¥-�if�IM�then�repeat�'UPDATE�DB?�loop <7.11.3�-�if�FRL�then�number�of�records�specified�in�FAB�must4•fit�into�the�DB�and�remaining�DB�space�must�be�zero*›-�if�error�then�'ER:�FAB/DB�FRL�CONFLICT'!¥-�if�NIM�then�'R:�DELETE�DB'�and©DB�is�deleted.'¥-�if�IM�then�repeate�'UPDATE�DB?'�loop @7.11.4�-�if�non-null�keys�then�check�keys�are�in�ascending�order.•and�that�keys�are�only�equal�if�duplicate�key•file#›-�if�error�then�'ER:�DB�KEY�ERROR'«'R:�TRUNCATE�DB'¤-�if�NIM�then�truncate�DB¬after�last�good�record'¤-�if�IM�then�repeate�'UPDATE�DB?'�loop ?7.11.5�-�if�non-null�keys�then�check�FAB�entry�key�greater�than•or�equal�to�last�key�of�DB.›-�if�error�then�'ER:�FAB/DB�KEY�CONFLICT�(L)'"¢(where�'L'�is�for�last�key�of�DB)§'R:�RECALCULATE'&¢if�NIM�then�force�last�key�of�DB�into §FAB�entry¢if�IM�then�'REPAIR�(Y/N)?'&ªif�'Y'�then�force�last�key�of�DB�into ­FAB�entry"ªif�'N'�then�repeat�UPDATE�DB�loop B7.11.6Œ-�if�non-null�keys�then�check�first�key�of�DB�not�less�than4”last�key�of�previous�data�block‚or�the�key�of�prior/”FAB�entry‚and�equal�only�if�duplicate�key�file,”(prior�FAB�entry�may�be�the�FAB�header�key).›-�if�error�then�'ER:�FAB/DB�KEY�CONFLICT�(F)',�(where�'F'�is�for�first�key�of�DB�in�error)§'R:�DELETE�DB''¥-�if�IM�then�repeate�'UPDATE�DB?'�loop¥-�if�NIM�then�delete�DB H8. Write FAB to disk if changed. If IO error then send error message and2ƒ'REPAIR�ABORTED',�else�process�next�FAB�(step�2).                             NOTES: ‰1.ˆThe�following�edits�on�VOLUME„name�in�the�VID�FILE†name�in�the�PDE�EXTENSION�name�in�the�PDE=“will�request�a�new�VOLUME,FILE,�or�EXTENSION�name�if�the�old<“one�is�in�error.‚The�old�name�as�it�currently�exist�will�be5“displayed�with�the�period�'.'�character�representingO <“non-alphanumeric�characters.�The�number�of�characters�input4“in�the�new�name�will�replace�exactly�that�number�of0“characters�in�the�old�name�prior�to�re-editing. “EXAMPLE:�Filename�should�be�DELETE�Current�filename�is�'DE...E‚' 3“If�the�user�were�to�input�a�new�filename�of�'DELE'6“an�error�would�still�exist�on�the�re-edit�because�the!“new�filename�would�be�'DELE.E‚'. 4“If�the�user�had�input�a�new�filename�of�'DELET'�the5“re-edit�would�have�found�a�new�filename�of�'DELETE‚'6“and�the�filename�restoration�would�have�been�competed“successfully.          ééééé%Newsfile‹SYMBUG/AƒVersion�3.0•11/1/83 L‚SYMBUG�runs�as�a�globally�sharable,�position�independent�monitor�task�underMVERSAdos to perform interactive symbolic debugging of one or more user tasks.FExecution of the chainfile SYMBUG.AF will create the '.RO' modules andBexecution of the chainfile SYMBUG.LF will create the load modules,LThe file SYMBHELP.IN must reside on the system volume in the user 0 account.MConsult publication M68KSYMBG/D2 SYMBUG/A and DEbug MONITORS REFERENCE MANUAL:and the online HELP command for valid user command syntax. -FUNCTIONAL ENHANCEMENTS MADE TO Version 2.0 : E 1. New command MAE (Macro Edit) facilitates modifications to macros.K 2. Symbol resolution algorithm modified to improve disassembly performanceG„by�an�order�of�magnitude�or�more.�(Requires�.DB�file�from�Linker�1.60)K 3. Keyboard input is processed a character rather than a line at a time toD„allow�backspace,�cancel�and�delete�keys�interactive�interpretation.H�4.�Break�key�processing�refined.‚Break�also�now�aborts�the�execution�of9„a�macro�rather�than�proceeding�with�the�next�macro�line.M 5. Explanatory prose error messages disambiguate the previous WHAT response.L 6. Prompt for Z option eliminates Map Full errors from insufficient memory.K 7. The FR command in a macro will overlay the existing macros and continueL„execution�with�the�first�line�of�the�first�macro�of�the�named�profile�file.J 8. The DC command also displays the constant in symbolic relative format.H 9. DF decodes the .SR bits and displays .PC register as offset register„relative�if�appropriate.K10. OF displays minimum and maximum offset register address ranges. DisplayK„of�absolute�addresses�in�these�ranges�are�superceded�by�the�offset�format.>11. DE ECHO to disk FILE now allocates nonexistant named file.F12. External reference symbols are now included in Assembler .RS file.(13. M is now an alias of the MM command.914. BF,BM and BS commands now check for lowaddr > hiaddr.O  à  é@15. DE output base and length options deleted since unsupported.+16. IT and OT commands no longer supported.F17. Task management involving passing LUNs to existing tasks purified.L18. The STOP command no longer impacts dynamic memory Map Table utilization. >OUTSTANDING BUGS EXISTING IN RELEASE OF SYMBUG/A Version 3.0 : ‰None.éééééé‹integer�function�ATOI(�ALPHA�) ŽcharacterˆALPHA ŽcharacterˆCHARS*35 ŽintegerŠI .ŽCHARS�=�'123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' ŽATOI�=�0Ždo�3�I�=�1,�35"‘if�(ALPHA�.eq.�CHARS(�I:I�))�then ”ATOI�=�I”return‘end�if 3�continue ŽATOI�=�-1Žreturn ‹end ‹integer�function�X2TOI(�X2�) �characterˆX2*2 �characterˆHEX*16 �integerŠI�integerŠRESULT �logicalŠFND1 �logicalŠFND2 �X2TOI�=�0�HEX�=�'0123456789ABCDEF' �RESULT�=�0�FND1�=�.false.�FND2�=�.false.�do�5�I�=�1,�16$�if�(X2(�1:1�)�.eq.�HEX(�I:I�))�then!“RESULT�=�RESULT�+�((I�-�1)�*�16)“FND1�=�.true.�end�if$�if�(X2(�2:2�)�.eq.�HEX(�I:I�))�then“RESULT�=�RESULT�+�(I�-�1)“FND2�=�.true.�end�if 5Œcontinue�if�(�FND1�.and.�FND2�)�then�X2TOI�=�RESULT�else �X2TOI�=�-1�end�if�return Šend !Šsubroutine�INIT(�BUFF,�P,�RESP�) �characterˆBUFF*(*) �integerŠP�characterˆRESP �include�'common' �characterˆPRAMBL*8�characterˆDEST ñCéé