IMD 1.17: 11/11/2014 11:59:10 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 25 OF 30  SR25q82VKXSVRDOS 0420§l-)�RATHER�THAN�(!)�FOR�THE�PROMPT***‰PAGE**ˆREVISION�CODE‡090281�3*3*’RE-LINKED�SO�ALL�SECTIONS�WILL�BE�IN�SEGMENT�ZERO*‰PAGE**ˆREVISION�CODE‡112081�3*2*’CORRECT�PROBLEM‚LIB�X,Y,Z„WHERE�',Z'�WAS�IGNORED*’CORRECT�PROBLEM‚LIB�X,#CNXX!*£LIB�X,#†WHERE�XX�IS�TERMINAL�ID/*’CORRECT�PROBLEM‚LIB�XˆWHERE�X�HAS�NO�.RO�FILE7*’CORRECT�PROBLEM�OF�NOT�EDITING�FOR�SBARG�ERROR�IF�ONE *¢RETURNED:*’CORRECT�PROBLEM�OF�TERMINATING�IMMEDIATELY�IF�PROCESSING*¢A�CHAIN�FILE0*’CORRECT�PROBLEM‚>LISTˆWHERE�THE�LIBRARY�HAS�NO *°MODULESV(p0e8Y@FHJPGX„`ahOpSx[€Sˆd�d˜; J¨E°T¸MÀPÈGÐGØDàHèJðQøbWY 7*’CORRECT�PROBLEM�OF�INVALID�CMD�WHEN�CHANGING�REVISION*¢NUMBER�OR�CODE**‰PAGE***ˆREVISION�CODE‡113081�3**0*’CORRECT�PROBLEM‚LIB�X,Y†WHERE�X�DOES�NOT�EXIST *£>�LIST‡THE�MESSAGE�DOES�NOT�GO*°TO�THE�LIST�FILE**‰PAGE***ˆREVISION�CODE‡122281�3**8*’DISPLAY�ADDITIONAL�INFORMATION�WITH�THE�'LIST'�COMMAND(*’CORRECT�THE�FOLLOWING�COMMAND�SEQUENCE*œLIST�(ALL�MODULES)*œLIST�(SECIFIC�MODULE)*œLIST�(ALL�MODULES)****‰PAGE***ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**‰NOLIST‰INCLUDE�9995.&.FME.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**‰PAGE<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;**************************************************************ˆ***†L�I�B‚C�O�M�M�A�N�Dƒ*******ˆ***‰DATAƒSEGMENT„*******=****************************************************************ˆ****‚EQUATE�AREA‚******* BEGDATA‚EQU�0#STKLENƒEQU�25‹STACK�LENGTH�IN�WORDS)BUFSIZE‚EQU�160‰INPUT�COMMAND�BUFFER�SIZE DSKLUIƒEQU�1(DSKLUOƒEQU�2‹DISK�LOG�UNIT�ASSIGN�OUTPUT!LISTLUƒEQU�3‹LISTING�LOGICAL�UNIT,DSKLUI2‚EQU�4‹DISK�LOG�UNIT�FOR�SOURCE�INPUTSECLENƒEQU�256‰SECTOR�LENGTH CR‡EQU�$0D LF‡EQU�$0A SPACE„EQU�$20 SLASH„EQU�$2F COMMA„EQU�$2C*‰PAGE* ‰OFFSET�$0000 STARBUF‚EQU�*&***************************************ˆLIBRARY�COMMAND�LINE�BUFFER&*************************************** WORKBUF‚EQU�*‰DS.B�80WORKBUFE EQU *-1‰DS.L�1*.***********************************************ˆLIBRARY�BUFFER.**********************************************LIBBUFƒDS.B�SECLENLIBBUFE‚EQU�*-1‰DS.L�1*SOURBUF‚DS.B�SECLENSOURBUFE EQU *-1‰DS.L�1*3******************************************************ˆBUFFER�AREA�TO�READ�CONTIGUOUG�FILE�INTO*ŠWILL�HOLD�292�MODULE�ENTRIES*3**************************************************** DIRLIBƒEQU�* ‰DS.L�SECLEN ‰DS.L�SECLEN ‰DS.L�SECLEN ‰DS.L�SECLENDIRLIBEƒEQU�*-1‰DS.L�3* BUFENDƒEQU�*BUFSIZƒEQU‚BUFEND-STARBUF‰PAGE ‰SECTION�0(‰XREF�PARSE,OPTION,EDITFILE,SBARG,DATEOJ**ˆNEXT�WORD�BOUNDRY�MACRO***2*******************************************************„DATA�SEGMENT�(DSEG)ƒ****1*************************************************** PBA†EQU�** REV_CODE:‰DC.B†'122084�4'&*œWHERE�REV_CODE�IS�DEFINED�AS�FOLLOWS *œMMDDYYXZ*3*œMMDDYY�=�MONTH�DAY�YEAR�OF�LAST�ASSEMBLY�OR�PATCH*œX†=�REVISION�TYPE�CODE*¦SPACE�=�CLEAN�ASSEMBLY *¦P…=�PATCHED*¦C…=�CUSTOMIZED�PATCHED**#*œZ†=�VERSADOS�MAJOR�REVISION�FIELD*‰PAGE:************************************************************ ‰DS.L�STKLEN PROGSTK‚EQU�**‰DC.L�08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFIN�IS�THE�AREA�THE�COMMAND�LINE�IS.*ˆ***ƒREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFINƒCOMLINE�BUFSIZE‚***‚INPUT�BUFFER‚***-**********************************************‰DS.W�0*,********************************************(*ˆPARAMETER�TABLE�FOR�GET�SEG�FOR�BUFFER,******************************************** BUFPARƒEQU�*%‰DC.L�0,0ƒTASK�(0=SELF),SESSION�(N/A) SEG_OPTS:‰DC.W�0…OPTIONS‰DC.W�0�(RAM�SEGMENT)‰DC.L�'BUFR'ŠNAME�OF�SEGMENT‰DC.L�0�START�OF�SEGMENT‰DC.L�BUFSIZŠLENGTH�OF�BUFFER*AS_ADDR:‰DC.L†0*œADDR�OF�ALLOCATED�SEGMENT5******************************************************+*ˆ**‚IOS�PARAMETER�TABLE�FOR�DISK�READS‚***6*ˆ**‚REFER�TO�IOS�EQUATES�UNDER�IOS�PARAMETER�BLOCK‚***5******************************************************‰DS.W�0 LIBRIOS‚EQU�* ‰DC.W�IOREAD‰DC.W�IOPWAT+IOPREC‰DC.B�0 ‰DC.B�DSKLUI‰DC.B�0‰DC.B�0‰DC.L�0LIBRSAD‚DC.L�0LIBREAD‚DC.L�0‰DC.L�0‰DC.L�0&**************************************%*ˆIOS�PARAMENTER�TABLE�FOR�DISK�WRITE*$************************************* TEMPIOS‚EQU�* ‰DC.W�IOWRIT  ‰DC.W�IOPREC‰DC.B�0 ‰DC.B�DSKLUO‰DC.B�0‰DC.B�0‰DC.L�0TEMPSAD‚DC.L�0TEMPEAD‚DC.L�0‰DC.L�0‰DC.L�0*%*ˆIOS�PARAMETER�BLOCK�FOR�SOURCE�FILE* SOURIOS‚EQU�* ‰DC.W�IOREAD‰DC.W�IOPWAT+IOPREC‰DC.B�0 ‰DC.B�DSKLUI2‰DC.B�0‰DC.B�0‰DC.L�0SOURSAD‚DC.L�0SOUREAD‚DC.L�0‰DC.L�0‰DC.L�0*3*****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*3****************************************************6‰IOS.OUT6�IOWRIT,IOPASC+IOPFOR+IOPWAT,LDFLUN,0,0,0,0,0‰DS.W�07‰IOS.OUT6I�IOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0‰DS.W�0**ˆSET�UP�IOS�FOR�LISTING�LU3*6‰IOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0,0‰DS.W�0"***********************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT6*ˆCHANGE�IS�FROM�6�TO�3�--�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK4*ˆLU3�IS�USED�F0R�LISTING�AND�LU6�FOR�ERR0R�/LOGGING**3*ˆPARAMETER�TABLE�FOR�CHANG�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDART�PARAMETER�TABLE*%************************************** LU3AFHSƒEQU�*'‰DC.W�FHCHLU„COMMAND�(CHANGE�LU�ASSIGN)‰DC.W�FOPKEP…OPTION�KEEP�ASSIGN‰DC.B�0ŠSTATUS‰DC.B�LDFLUNŠSEND�LU�NUMBER‰DC.B�LISTLUŠRECEIVE�LU�NUM‰DC.B�0ŠRESERVED%‰DC.L�0ŠTASK-ID�(0�MEANS�USE�YOURSELF(‰DC.L�0ŠSESSION�#�(0�MEANS�USE�YOURSELF)**,*********************************************&*ˆPARAMETER�BLOCK�FOR‚INPUT�(TERMINAL)*,*********************************************( IOS.OUTIN IOREAD,IOPFOR,CDFLUN,,,0,0,80**)******************************************?*ˆLU3FHS�IS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTING*********************************************‰FHS.LU3�0,0,LISTLU,0,0,0,0,0 ‰DC.L�0,0,0*;************************************************************:*ˆ***�DSKFHS�IS�THE�PARAMETER�TABLE�FOR�THE�FHS�INPUT�FILE*;***********************************************************LIBFHS„DC.W�FHASGNŒCOMMAND!‰DC.W�FOPPREWŠOPTIONS�PUBLIC�READ‰DC.B�0ŠSTATUS ‰DC.B�DSKLUI†LOGICAL�UNIT�NUMBER!LIBVOL„DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUMBER"LIBCATƒDC.L�$20202020ˆCATALOG�NAME‰DC.L�$20202020 LIBNAME‚DC.L�$20202020‚FILE�NAME‰DC.L�$20202020LIBEXTƒDC.W�$2020†EXTENSION‰DC.W�0ŠRESERVED‰DC.B�0ŠWRITE�PROTECT�CODE‰DC.B�0ŠREAD�PROTECT�CODE‰DC.W�$100ŠLOGICAL�RCORD�LENGTH0‰DC.L�0ŠCONTIGUOUS�FILE�SIZE�/�DIR�ENTRY�POINTER6*ˆFOLLOWING�FHS�PARAMENTERS�FOR�SHARED�SEGMENT�REQUEST(‰DC.L�0ŠSEGMENT�STARTING�LOGICAL�ADDRESS$‰DC.L�0ŠSEGMENT�ENDING�LOGICAL�ADDR.3‰DC.L�0ŠLENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUESTLIBFHSE‚EQU�*-1‰DC.L�0*;************************************************************:*ˆ***�TMPFHS�IS�THE�PARAMETER�TABLE�FOR�THE�FHS�INPUT�FILE*;***********************************************************!TMPFHS„DC.W�FHALLO+FHASGNŒCOMMAND3‰DC.W�FOPEREW+FOPSEQŠOPTIONS�PUBLIC�READ�&�SEQ�FILE‰DC.B�0ŠSTATUS ‰DC.B�DSKLUO†LOGICAL�UNIT�NUMBER!TMPVOL„DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUMBER"TMPCATƒDC.L�$20202020ˆCATALOG�NAME‰DC.L�$20202020 TMPNAME‚DC.L�$20202020‚FILE�NAME‰DC.L�$20202020TMPEXTƒDC.W�$2020†EXTENSIONƒDC.W�0ŠRESERVED‰DC.B�0ŠWRITE�PROTECT�CODE‰DC.B�0ŠREAD�PROTECT�CODE‰DC.W�0ŠLOGICAL�RCORD�LENGTH1‰DC.L�0ŠCONTIGUOUS�FILE�SIZE�/�DIR�ENTRY�POIN2TER6*ˆFOLLOWING�FHS�PARAMENTERS�FOR�SHARED�SEGMENT�REQUEST(‰DC.L�0ŠSEGMENT�STARTING�LOGICAL�ADDRESS$‰DC.L�0ŠSEGMENT�ENDING�LOGICAL�ADDR.3‰DC.L�0ŠLENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUEST‰DC.L�0*/***********************************************5*ˆPARM�BLOCK�FOR�CHANGE�LOGICAL�UNIT�FROM�TEMP�TO�LIB/************************************************CHGLUFHS EQU *‰DC.W�FHCHLU…CHANG�LOG�UNIT�NUM‰DC.W�0‰OPTIONS‰DC.B�0ŠSTATUS‰DC.B�DSKLUOŠCHG�LU�A‰DC.B�DSKLUIŠCHG�LUB ‰DC.B�0ŠRES‰DC.L�0‰DC.L�0‰DC.L�0*$*ˆFHS�PARAMETER�BLOCK�FOR�LIB�SORUCE SOURFHSƒEQU�*‰DC.W�FHASGNŠCOMMAND‰DC.W�FOPPRPWŠOPTIONS-‰DC.B�0ŠSTATUS ‰DC.B�DSKLUI2…LOGICAL�UNIT�NUM‰DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUM‰DC.L�$20202020ˆCAT�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020 ‰DC.W�$2020‰DC.W�0‰DC.B�0ŠWRITE�PROT�CODE‰DC.B�0‰DC.W�0‰DC.L�0ŠCONT�FILE�SIZE ‰DC.L�0,0,0*8*ˆTABLE�OF�VALID�CHARACTER�FOR�THE�MODULE�VERIFY�ROUTINE* MODTABƒEQU�**�LINE�1�HEX�00�-�0F'‰DC.B�0,0,0,0,0,0,0,0,0,0,0,0,0,'T',0,0*ŒLINE�2‚HEX�10�-�1F%‰DC.B�0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*ŒLINE�3‚HEX�20�-�2F"*‘SP�!�"�#�$�%�&�'�(�)�*�+‚,‚-�.‚/+‰DC.B�'T',0,0,0,2,0,0,0,0,0,0,0,'T',0,1,'T'*‰LINE„4�HEX‚30�-�3F!*�0�1�2�3�4�5�6�7�8�9�:�;�<�=�>�?%‰DC.B�2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0*‰LINE„5�HEX�40�-�4F!*�@�A�B�C�D�E�F�G�H�I�J�K�L�M�N�O%‰DC.B�0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1*‰LINE„6‚HEX�50�-�5F*�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]%‰DC.B�1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2%‰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‰DS.W�08**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAM‚DC.L�0‰SAVE�TASK�NAMESESNUMƒDC.L�0ˆSAVE�SESSION�NUM#VOLNAMƒDC.L�0‰SAVE�VOL�DEFAULT�NAME‰DC.W�0‰TOP�HALF�OF�D3"USERNUM‚DC.W�0ŠDEFAULT�USER�NUMBER*CATNAMƒDC.L�0,0‡SAVE�DEFAULT�CATAGORY�NAME‰DS.L†1‰REG�D6REGD7„DS.L†1‰REG�D7‰DS.L†1‰REG�A0&TIDLOGON‚DC.L�0‰TERM�ID�AT�LOG�ON�TIME‰DC.W�0�TOP�HALF�OF�A2‰DC.W�0ŠLOG�ON�USER�NUMBER‰DS.L�8‰SAVE�OTHERS�REGISTERS*‰DS.W�0&DIRF…DC.L�0…DIRECTORY�SWITCH�&�POINTER.PREVDIRF�DC.L�0…PREV�DIR�FINE�(USED�IN�CHANGE) DNRR…DC.B�'‚'‡NOT�READY�RESPONSEAFLAG„DC.B�0ŠADD�FLAGDFLAG„DC.B�0ŠDELETE�FLAGCFLAG„DC.B�0ŠCOPY�FLAGCHFLAGƒDC.B�0…CHANGE�FLAGLFLAG„DC.B�0ŠLIST�FLAGQFLAG„DC.B�0…QUIT�FLAG"RFLAG„DC.B�0‰RETURN�TO�GETDIR�FLAGEXFLAGƒDC.B�0ŠEND�OF�INPUT�FLAG1FILENDƒDC.B�0…REACHED�END�OF�FILE�ON‚LIBRARY�FLAG"PASSS2„DC.B�0…SET�WHEN�IN�2ND�PASS‰DS.W�00SAVOADD„DC.L�0Š1ST�TIME�FLAG�FOR�PRT�DETAIL�LINE"HOLDLOCM�DC.L�0ŒLOCATION�OF�MODULEFLAGH„DC.B�0ŠPRINT�HEADER�FLAG+ADDMORE‚DC.B�0ŠMORE�MODULES�FOR�ADD�COMMAND-MORECHA‚DC.B�0‰MORE�ITEMS�FOR�CHANGE�CMD�FLAG#THRUMOD‚DC.B�0ŠMOD�READ�THRU�SWITCH%ATMOD„DC.B�0‚FLAG�FOR�BLD1HAF�ROUTINE,RLMSG„DC.B�0‚PRINT�ERROR�MSG�IN�READLIB�FLAG7NAMSAME‚DC.B�0ŠFLAG�FOR�REPLACE�CK�SAME�NAMES�OLD�&�NEW2BLD1END‚DC.B�0ŠREACHED�END�OF�FILE�IN�BLD1HAF�ROUT+FLAGCND‚DC.B�0ŠNO�LIB�CHANGE�ROUTINE�OPTION.RD1ST„DC.B�0ŠUSED�IN�BLD2HAF�ROUTINE�AS�A�FLAGNPFLAGƒDC.B�0…NO�PRINT�FLAGLASTLAST DS.B 5‰DS.W�0!DIRFULL‚DC.B�0‚SET�IF�DIR�IS�FULL*NEWLIBƒDC.B�0…NEW�LIBRARY�WAS�CREATED�FLAGDIREXIST�DC.B�0ŠDIR�EXISTS�FLAGLIBGOOD‚DC.B�1%DIROPTƒDC.B�0ŠDO�NOT�BUILD�DIR�OPTION!LIBPREV‚DC.B�0ŠINPUT�WAS�ASSIGNED#DIRCHGƒDC.B�0ŠCHANGE�DIRECTORY�FLAG*8TEMPIOSF�DC.B�0Šflag�to�check�temp�file�createdƒ10/24/83.***********************************************"*ˆSTART�OF�PRINT�HEADERS�&�BUFFERS.***********************************************‰DS.W�0QUESTM:‚DC.B�$0D,$0A‰DC.B†'LIBRARY�VERSION�' VERS_NBR: ‰DC.B†'ˆ' ‰DC.B†CR,LF‰DC.B�'LIBRARY�COMMANDS' ‰DC.B�$0D,$0A?‰DC.B�'ƒ(F�=�FILE�NAME„M�=�MODULE�NAME„DEFAULT�EXTENSION�=�RO)'‰DC.B�$0D,$0A,$0A;‰DC.B�'‚Add…=�(A�F)�OR�(A�F/)�OR�(A�F/M)�OR�(A�F,F/....,F)' ‰DC.B�$0D,$0A-‰DC.B�'‚CHange‚=�(CH�M)�OR�(CH�M,M,M,....,M)' ‰DC.B�$0D,$0A1‰DC.B�'‚COpy„=�(CO�F/M)�OR�(CO�F/M,F/M,....,F/M)' ‰DC.B�$0D,$0A/‰DC.B�'‚DELete‚=�(DEL�M)�OR�(DEL�M,M,M,....,M)' ‰DC.B�$0D,$0A/‰DC.B�'‚List„=�(L)‚OR‚(L�M)�OR�(L�M,M,M....,M)' ‰DC.B�$0D,$0A‰DC.B�'‚Quit„=�(Q)�OR�(QUIT)' ‰DC.B�$0D,$0A2‰DC.B�'‚Replace�=�(R�F/M)�OR�(R�F/M,F/M,....,F/M)'‰DC.B�$0D,$0A,LFQUESTME‚EQU�*-1‰DS.W�0DIRLOCƒDC.L�0�DIR�POINTERRLIBLOCƒDC.B�'Œ'‚LOC�IN�LIBRARY‰DS.W�0SECTCNT‚DC.W�0ŠCOUNT�OF�SECTORS0DIRENDƒDC.L�0ŠPOINTER�AT�NEXT�AVAIL�SPACE�IN�DIR+TOTMODƒDC.W�0ŠTOTAL�COUNT�OF�MODULES�IN�LIB‰DS.W�0*(LISTTITL�DC.B�'MODULE†VER‚REV‚LNGƒDESC…'LT_DATE: ‰DC.B†'Š'LT_TIME: ‰DC.B†'Š'LISTTITE EQU *-1‰DS.W†0**ˆDATA�AREA�FOR�LIST�FUNCTION* LISTDATA EQU *LISTMOD‚DC.B�'Š'‚MODULE�NAME ‰DC.B�'‚'LISTVER‚DC.B�'ƒ'†VERSION ‰DC.B�'‚'LISTREV‚DC.B�'ƒ'†REVISION ‰DC.B�'ƒ'LISTLANG DC.B ' ' ‰DC.B�'„'LISTDESC�DC.B�'Š' ‰DC.B�'Š' ‰DC.B�'Š' ‰DC.B�'Š' ‰DC.B�'Š'LISTDESE EQU *-1‰DS.W�0*"PROMPTM‚DC.B�'>�'‡PROMPT�CHARACTER*‰DS.W�0*PRTTOTM‚DC.B�'TOTAL�MODULES�'PRTTOTN‚DC.B�'„'PRTTOTME EQU *-1‰DS.W�0*INVMSGƒDC.B�'‚INVALID�'INV_XX: ‰DC.B†'CMD„' ‰DC.B†CR,LFINVMSGE‚EQU�*-1‰DS.W�0*X00100: ‰DC.B†'Š'*œSPACE�FOR�FILE�NAME‰DC.B†'IS�AN�INVALID�FILE�TYPE' ‰DC.B†CR,LFX00199:‚EQU‡*-1‰DS.W†0* ENTM…EQU�*‰DC.B�'ENTER�SOURCE�FILE�NAME‚' ENTME„EQU�*-1‰DS.W�0****‰DS.W�0 NOLIBMƒEQU�*‰DC.B�'LIBRARY�DOES�NOT�EXIST'NOLIBME‚EQU�*-1‰DS.W�0* MODMSGƒDC.B�'Œ'‚HOLD�MODULE�NAME*‰DC.B�'MODULE�NOT�FOUND'NOMODME‚EQU�*-1*‰DS.W�0 MODALMƒEQU�*‰DC.B�'MODULE‚'MODALMI‚DC.B�'Œ'‰DC.B�'ALREADY�IN�THE�LIBRARY'MODALME‚EQU�*-1‰DS.W�0* MODMISM‚EQU�*‰DC.B�'NO�MODULE�NAME'MODMISME‚EQU�*-1‰DS.W�0* INSM…EQU�**‰DC.B�'INSERT�AFTER�MODULE�NAME�NOT�FOUND' INSME„EQU�*-1‰DS.W�0* LIBFULM‚EQU�**‰DC.B�'**‚WARNING�DIRECTORY�WAS�FILLED�**'LIBFULME EQU *-1‰DS.W�0* INSENDM‚EQU�*!‰DC.B�'INSERT�WAS�AT�LIBRARY�END'INSENDME EQU *-1‰DS.W�0* MODMƒEQU�*‰DC.B�'INVALID�MODULE�NAME' MODME‚EQU�*-1‰DS.W�0* REPMSGƒEQU�*‰DC.B�'‚REPLACED‚'REPM1„DC.B�'Š'�OLD�MOD ‰DC.B�'�BY�'REPM2„DC.B�'Š'‚NEW�MODREPMSGE‚EQU�*-1‰DS.W�0* CHGSUCM‚EQU�*‰DC.B�'�CHANGED‚'CHGSUC1‚DC.B�'Š'CHGSUCE‚EQU�*-1‰DS.W�0*"COPSUCM‚DC.B�'SUCCESSFUL�COPY�OF‚'COPSUC1‚DC.B�'Š'COPSUCME EQU *-1‰DS.W�0* DELMSGƒEQU�*‰DC.B�'�DELETED‚'DELNAMƒDC.B�'Š'DELMSGE‚EQU�*-1‰DS.W�0 ADDMSGƒEQU�*‰DC.B�'�ADDED‚'ADDNAMƒDC.L�'Š'ADDMSGE‚EQU�*-1‰DS.W�0*)SAVNAMƒDC.B�'Š'‚SAVE�MOD�NAME�FOR�REPLACE*MODNAMƒDC.B�'Œ'‚MODULE�NAME‰DS.L�1* TEMPM„EQU�*&‰DC.B�'ERROR�-�CHECK�FOR�*TEMPLIB.RO*'TEMPMEƒEQU�*-1*‰DS.W�0*2MSM†DC.B�'WARNING�SOURCE�HAS�MORE�THEN�ONE�MODULE' MSME…EQU�*-1‰DS.W�0*&ENTCHGM‚DC.B�'ŒENTER�NEW�MODULE�NAME�'ENTCHGME EQU *-1*/ENTCM1ƒDC.B�'OLD-†ENTER�NEW�VERSION�#�(0-255)�'ENTCM1E‚EQU�*-1‰DS.W�0*0ENTCM2ƒDC.B�'OLD-†ENTER�NEW�REVISION�#�(0-255)‚'ENTCM2E‚EQU�*-1‰DS.W�0*&ENTCM3ƒDC.B�'ENTER�DESCRIPTION�UP�TO�'ENTCM3C‚DC.B�'‚'‰DC.B�'�CHARACTERS'ENTCM3E‚EQU�*-1‰DS.W†0NOIDM:‰DC.B†'NO�MODULE�ID�RECORDS'NOIDMEƒEQU‡*-1‰DS.W†0*** LIB_FLG1:‰DC.W†0*œGENERAL�LIBRARY�FLAG�1 *œBIT‡MEANING**ž0‡0�-->�NO�ID�MSG�HAS�NOT�BEEN�DISPLAYED$*¦1�-->�NO�ID�MSG�HAS…BEEN�DISPLAYED*#*ž1‡0�-->�NO�OUTPUT�FIELD�SPECIFIED*¦1�-->„OUTPUT�FIELD�SPECIFIED‰PAGE‰DS.W†0‰FORCE�WORD�BOUNDRY***’ERROR�MESSAGE�PARAMETER�BLOCK**EM_PBLK: EM_DO:ƒ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�DESIREDEM_TLUN:�DC.B†0*œUSER�TERMINAL�LUN�-�(LDFLUN)EM_QRC:‚DC.B†0*œQUERY�RETURN�CHARACTEREM_KLUN:�DC.B†0*œUSER�KEYBOARD�LUN�-(CDFLUN)EM_SPA:‚DC.L†0'*œSTART�ADDRESS�FOR�USER�TEXT�PLUG�POOLEM_EPA:‚DC.L†0%*œENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL‰PAGE ENDDATA‚EQU�*‰PAGE** BEGPROC‚EQU�**<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<***************************************************************”LIBRARY�COMMAND-*ˆ***‚PROCEDURE�SECTION�FOR�COPY�COMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************$‰LEA�PBA(PC),A7‚SET�UP�STACK�POINTER*&***************************************.*ˆ**ƒSAVE�DEFAULT�VALUE�PASSED�FROM�SYSTEM�****'*****************************************;‰MOVEM.L�D0-D7/A0-A7,STSKNAM-PBA(A7)ƒSAVE�REGISTER�CONTENTS*+*ˆD0�TO�STSKNAM�=�TASK�NAME�THAT�STARTED�ME*ˆD1�TO�SESNUM‚=�SESSION�NUM $*ˆD2�TO�VOLNAM‚=�DEFAULT�VOLUME�NAME*ˆD3�TO�USERNUM�=�USER�NUMBER*ˆD4�TO�CATNAM‚=�CATALOGUE�NAME*ˆD5�TO�CATNAM�+4**ˆD6�=‚LENGTH�OF�COMMAND�LINE)*ˆD7�=�BIT�MASK�OF�LOGICAL�UNITS�ASSIGNED*ˆA0�=�YOUR�TASK�NAME*ˆA1�=�TERMINAL�ID*ˆA2�=�ACTUAL�USER�NUMBER(*ˆA3�=�SYSTEM�VOLUME�DEFAULE(ALL�SPACES)*ˆA4�=�SYSTEM�USER�NUMBER*ˆA5�=�SYSTEM�CATALOGUE*ˆA6�=�SYSTEM�CAT�PART�2**‰PAGE***ˆINITIALIZE�STACK�POINTER&*ˆSET�UP�PROGRAM�BASE�ADDRESS�REGISTER** ‰MOVE.L„A7,A6*œA6=PROGRAM�BASE�ADDRESS‰LEA‡PROGSTK(PC),A7*œA7=STACK�ADDRESS‰PAGE‰BSET†#13,SEG_OPTS-PBA(A6)/*œSET�OTPION�FOR�OPERATING�SYSTEM�TO�ALLOCATE�A0*œSEGMENT�WHOSE�LOGICAL�ADDR�EQUALS�THE�PHYSICAL *œADDRESS‰ERQ.GTSEG�BUFPAR(PC)+*œALLOCATE�A�SEGMENT�WHOSE�PHYSICAL�ADDRESS*œEQUALS�THE�LOGICAL�ADDRESS&*œEXPANDED�MACRO�REQUEST�IS�AS�FOLLOWS*œLEA‡BUFPAR,A0*œMOVE.W„#GTSEG,D0 *œTRAP†#1* ‰BNE‡IOERPRT!*œJMP�IF�ERROR�ALLOCATING�SEGMENT‰MOVE.L„A0,AS_ADDR-PBA(A6) ‰MOVE.L„A0,A5!*œA0=A5=ADDR�OF�ALLOCATED�SEGMENT‰LEA‡REV_CODE(PC),A3‰MOVE.L„(A3)+,VERS_NBR-PBA(A6) ‰MOVE.L„(A3)+,VERS_NBR+4-PBA(A6)$*œSET�LIBRARY�VERSION�NBR�IN�MESSAGE‰PAGE**B*ˆDYNAMICALLY�SET�ADDRESSES�IN�IOS/FHS�PARAMETER�BLOCKS�INSTEAD�OFA*ˆPUTTING�THEM�IN�AT�ASSEMBLE�TIME.�THIS�WILL�ACCOMODATE�POSITION*ˆINDEPENDENT�CODE�(PIC)**‰LEA‡WORKBUF(A5),A3"‰MOVE.L„A3,OUTINIOS-PBA+IOSSAD(A6)‰LEA‡WORKBUFE(A5),A3"‰MOVE.L„A3,OUTINIOS-PBA+IOSEAD(A6)2*œSTART/END�ADDRESSES�FOR�PARAMETER�BLOCK�OUTINIOS‰LEA‡LIBBUF(A5),A3‰MOVE.L„A3,LIBRSAD-PBA(A6)‰LEA‡LIBBUFE(A5),A3‰MOVE.L„A3,LIBREAD-PBA(A6)0*œSET�START/END�ADDR�FOR�PARAMETER�BLOCK�LIBRIOS‰LEA‡SOURBUF(A5),A3‰MOVE.L„A3,SOURSAD-PBA(A6)‰LEA‡SOURBUFE(A5),A3‰MOVE.L„A3,SOUREAD-PBA(A6)/*œSTART/END�ADDRESS�FOR�PARAMETER�BLOCK�SOURIOS‰LEA‡DIRLIB(A5),A3‰MOVE.L„A3,DIRLOC-PBA(A6)‰MOVE.L„A3,DIREND-PBA(A6),*œINITIALIZE�DIRLIB�IN�APPROPRIATE�LOCATIONS‰PAGE/************************************************�***„DRIVER‚BLOCK„****.************************************************#************************************ŠCALL�COMMAND�PARSE�ROUTINE#************************************5*ˆASSIGNMENT�OF�SEND�&�RECEIVE�LU'S�IS�DONE�BY�SYSTEM*‰LEA‡BUFFIN(PC),A0*œA0=ADDR�START�PARSE ‰BSR�PARSE‰TST.L�D0‡CK�F0R�ANY�ERR0RS‰BMI�INVALERR‡BR�IF�ERR0R*:‰MOVE.L�A1,SAVOADD-PBA(A6)„SAVE�ADDR�START�OF�OUTPUT�FIELD ‰BSR�CKFOROPT**$‰BSR�INITIN…GO�TO�INPUT�INIT�ROUTINE *º10/24/83 *º10/24/838*ˆreset�flag�to�alloc�temp�file�if�it�is�needed…10/24/83 *º10/24/83$‰MOVE.B„#1,TEMPIOSF-PBA(A6)•10/24/83 *º10/24/83#‰TST.L�SAVOADD-PBA(A6)„OUTPUT�EXITS‰BNE.S�GETOUT‹YES"‰BSR�SETLU3‹ASSIGN�LU3�TO�TERMINAL ‰BRA.S�DOLIB***'GETOUTƒBSR�NEWOUT…DO�NEW�OUTPUT�ROUTINE***+*********************************************ˆLIBRARY�DRIVER�ROUTINE*+******************************************** DOLIBƒEQU�**'‰BSR�CLFLAG‚CLEAR�FROM�DIRF�TO�LASTLAST‰MOVE.W�#IOREAD,SOURIOS-PBA(A6)$‰BSR�REWINDL‰REWIND�THE�LIBRARY�FILE+*œBY�FORCING�CURRENT�RECD�POINTER�TO�BE�SET*œAT�BEGINNING�OF�FILE#‰LEA�PROMPTM(PC),A3ƒINIT�PROMPT�MSG‰LEA�PROMPTM+1-PBA(A6),A4"***********************************ˆPRINT�PROMPT�(>)�CHARACTER ********************************‰BSR�PRTIFORM„SEND�PROMPT!‰BSR�CLEARW†GO�BLANK�RECEIVE�AREA.‰IOSCALL�OUTINIOS(PC)‚RECEIVE�LIB�COMMAND�LINE ‰BNE�IOERPRT ‰BSR‡SBARG/*œCONVERT�LOWER�CASE�TO�UPPER�CASE�IF�NECESSARY ‰BNE‡IOERPRT*œBRANCH�IF�SBARG�ERROR$‰BSR†SETENDŠPUT�'CR'�AT�END�OF�INPUT'‰BSRƒPARSEIN…GO�PARSE�THE�LINE�OF�INPUT/***********************************************;*ˆBIT�0�IS�SET�IN�D0�IF�NO�OTHER�DATA�EXIST�IN�COMMAND�LINE/*********************************************** ‰TST.L�D0 ‰BMI�DOLIB*œJMP�IF�ERROR�CONDITIONA‰MOVE.L�A0,HOLDLOCM-PBA(A6)ƒLOCATION�OF�MODULE�ADDR�OR�TERMINATOR ‰BTST†#1,D0 ‰BEQ.S…CKADD!*œJMP�IF�'HELP'�CMD�NOT�REQUESTED ‰BSR‡QUESTION*œOUTPUT�HELP�PANEL ‰BRA.S…DOLIB*œGO�GET�NEXT�CMD�REQUEST**CKADD:‰MOVE.L„D0,-(A7)  *œSAVE�REG ‰BSR‡BUILDDIR&*œBUILD�DIRECTORY�EVERY�TIME�SO�WE�CAN'*œGET�AROUND�A�NULL�FILE�PROBLEM�-�THIS)*œIS�NOT�THE�BEST�SOLUTION�BUT�IT�WAS�THE+*œQUICKEST�-�LEAST�EXPENSIVE�-�AND�IT�WORKS‰MOVE.L„(A7)+,D0 *œRESTORE�REG‰TST.B�AFLAG-PBA(A6) ‰BEQ.S�CKDEL ‰BSR�DOADD ‰BRA�DOLIB*0CKDEL„TST.B�DFLAG-PBA(A6)ˆ***�DELETE�COMMAND�*** ‰BEQ.S�CKCOPY ‰BSR�DODEL ‰BRA�DOLIB*/CKCOPYƒTST.B�CFLAG-PBA(A6)ˆ***�COPY�COMMAND�*** ‰BEQ.S�CKCHG ‰BSR�DOCOPY ‰BRA�DOLIB*7CKCHG„TST.B�CHFLAG-PBA(A6)‡******‚CHANGE�COMMANDƒ****** ‰BEQ.S�CKLIST ‰BSR�DOCHG ‰BRA�DOLIB*/CKLISTƒTST.B�LFLAG-PBA(A6)‹***�LIST�COMMAND�*** ‰BEQ.S�CKREP ‰BSR�DOLIST ‰BRA�DOLIB*1CKREP„TST.B�RFLAG-PBA(A6)‹***�REPLACE�COMMAND�*** ‰BEQ.S�CKQUIT ‰BSR�DOREP ‰BRA�DOLIB*CKQUIT:‰CLR.W…TERM_FLG-PBA(A6),*œSET�TERMINATION�FLAG�TO�NORMAL�TERMINATION‰TST.B�QFLAG-PBA(A6) ‰BNE‡TERMINAT ‰BSR�INVALER ‰BRA�DOLIB***’PUT�'CR'�AT�END�OF�INPUT0SETENDƒMOVE.L�OUTINIOS-PBA+IOSSAD(A6),A0ˆST�ADDR,‰ADD.L‚OUTINIOS-PBA+IOSLEN(A6),A0†ADD�LENGTH‰MOVE.B�#CR,(A0)�SET�CR‰RTS‰PAGE.***********************************************)*ˆROUTINE�TO�BLANK�LIBRARY�COMMAND�BUFFER*,*********************************************CLEARWƒLEA�WORKBUF(A5),A4‰LEA�WORKBUFE(A5),A5(LIBCL„MOVE.L�#'„',(A4)+‚BLANK�OUT�BUFFER‰CMP.L�A4,A5…AT�END ‰BHI�LIBCL‡NO‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDR ‰RTS�.RETURN*CLFLAGƒLEA�DIRF(PC),A3‰LEA�LASTLAST(PC),A4CLAGAIN‚MOVE.L�#0,(A3)+‰CMP.L�A3,A4…AT�END‰BHI�CLAGAIN…NO‰LEA‡LIBBUF(A5),A32‰MOVE.L�A3,LIBRSAD-PBA(A6)‚INIT�LIBRARY�PARM�BLOCK‰LEA‡LIBBUFE(A5),A3‰MOVE.L�A3,LIBREAD-PBA(A6)‰LEA‡SOURBUF(A5),A31‰MOVE.L�A3,SOURSAD-PBA(A6)‚INIT�SOURCE�PARM�BLOCK‰LEA‡SOURBUFE(A5),A3‰MOVE.L�A3,SOUREAD-PBA(A6)‰RTS*-***********************************************ˆROUTINE�TO�CLOSE�LIBRARY�FILE*-*********************************************%CLOSLIB‚MOVE.W�#FHCLOS,LIBFHS-PBA(A6)‰FHSCALL�LIBFHS(PC) ‰BNE‡IOERPRT ‰RTSŒ.�RETURN*-***********************************************ˆCLOSE�SOURCE�FILE*5*****************************************************'CLOSSOUR MOVE.W #FHCLOS,SOURFHS-PBA(A6)‰FHSCALL�SOURFHS(PC)/‰MOVE.W�#FHASGN,SOURFHS-PBA(A6)�RESET�TO�ASSIGN‰RTS*'***************************************!*ˆROUTINE�TO�MOVE�MODNAM�TO�FIELD**ˆMODNAME�IS�IN�A3�&�RECEIVING�FIELD�IN�A4)*ˆA4�MUST�BE�SET�UP�BEFORE�CALLING�MOVMOD'***************************************MOVMODƒLEA�MODNAM(PC),A3‰MOVE.L�(A3)+,(A4)+‰MOVE.L�(A3)+,(A4)+‰MOVE.W�(A3),(A4)MOVMODEX�RTS�.�RETURN‰PAGE4******************************************************ˆTHIS�ROUTINE�WILL *’PARSE�THE�LIBRARY�COMMAND�LINE*"*ˆTHE�FOLLOWING�COMMANDS�ARE�VALID*’ADD‘A�OR�AD�MINIMUM*’CHANGEŽCH’MINIMUM*’COPY�CO’MINIMUM*’DELETEŽDEL‘MINIMUM*’HELP�HELP�MINIMUM*’LIST�L�OR�LI�MINIMUM*’QUIT�Q�OR�QU�MINIMUM*’REPLACE�R�OR�RE�MINIMUM* *ˆSTATUS„D0**œBIT‡MEANING�IF�SET**�31‡ERROR�CONDITION�EXIST*ž1‡HELP�CMD�REQUESTED*ž0‡CR�FOLLOWED�COMMAND*%*ˆA0�=�ADDRESS�NEXT�MODULE�TO�PROCESS*‹OR*�ADDRESS�OF�TERMINATOR**4***************************************************** PARSEIN‚EQU�* ˜CLR.L�D0 ‰LEA�WORKBUF(A5),A0�START�OF�BUF ‰LEA�WORKBUFE(A5),A1‚END�OF�BUFF‰CMP.B�#CR,(A0)'‰BEQ�PRETERŠJMP�IF�NO�COMMAND‚-->�ERROR;PBLK…CMP.B�#$20,(A0)…FOLLOWING�LOGIC�EDITS�FOR�A�BLANK�LINE ‰BNE.S�PON*œJMP�IF�NOT�A�BLANK�LINE ‰ADD.L�#1,A0 ‰CMP.L�A0,A1‰BHI�PBLKŒJMP�IF�MORE�TO�EDIT‰BRA.S�PERRŠJMP�IF�BLANK�LINE*PON†CMP.B�#'A',(A0)#‰BEQ.S�PADDŠJMP�IF�POSSIBLE�ADD�CMD‰CMP.B�#'D',(A0)#‰BEQ.S�PDELŠJMP�IF�POSSIBLE�DEL�CMD‰CMP.B�#'C',(A0)/‰BEQ.S�PCOPY‰JMP�IF�POSSIBLE�COPY�OR�CHANGE�CMD‰CMP.B�#'L',(A0)#‰BEQ�PLIST‹JMP�IF�POSSIBLE�LIST�CMD‰CMP.B�#'R',(A0)%‰BEQ�PREPŒJMP�IF�POSSIBLE�REPLACE�CMD‰CMP.B�#'Q',(A0)#‰BEQ�PQUIT‹JMP�IF�POSSIBLE�QUIT�CMD‰CMP.B…#'H',(A0)%‰BEQ.S…PHELP…JMP�IF�POSSIBLE�HELP�CMD'****************************************ˆERROR�IN�INPUT '*************************************** PERR…EQU�*‰BSR�INVALER‰INVALID�ENTRY�MSG‰BRA�PRETERŠERROR�CONDITION*'****************************************ˆ**‚A�D�D‚***'**************************************** PADD…EQU�*‰ADD.L�#1,A0…INC�ADDRESS‰CMP.B�#'D',(A0)‚CK�2ND�CHAR‰BNE.S�PADD0ˆNOT�ADD‰BSRƒPCK ‰BRA.S�PADD1 PADD0„EQU�* ‰BSR�PEND*PADD1„MOVE.B�#1,AFLAG-PBA(A6)‚SET�ADD�FLAG‰BRA�PARSEINE„EXIT*)******************************************ˆHELP)******************************************PHELP:‰CMP.L…#'HELP',(A0) ‰BNE.S…PERR*œJMP�IF�NOT�HELP�REQUEST ‰BSET.L„#1,D0*œSET�FLAG�-�HELP�CMD�REQUESTED ‰BRA‡PARSEINE*œEXIT�ROUTINE‰PAGE)******************************************ˆ**ƒD�E�L�E�T�E‚**)******************************************PDEL…ADD.L�#1,A0‰CMP.B�#'E',(A0)+ ‰BNE�PERR‰CMP.B�#'L',(A0) ‰BNE�PERR ‰BSR.S…PCK‰MOVE.B�#1,DFLAG-PBA(A6)‰BRA.S„PARSEINE*********************************************ˆ**‚C�O�P�Y‚********************************************* PCOPY„EQU�* ‰ADD.L�#1,A0‰CMP.B�#'O',(A0) ‰BEQ.S�PCOPYC‰CMP.B�#'H',(A0)‰BEQ.S�PCHANGE ‰BRA�PERR PCOPYCƒEQU�* ‰BSR.S�PCK‰MOVE.B�#1,CFLAG-PBA(A6)‰BRA.S�PARSEINE**0*************************************************ˆ**‚CHANGE‚**0*************************************************PCHANGE: ‰BSR.S�PCK‰BRA.S�PCHANGE1 PCHANG0‚EQU�* ‰BSR�PEND!PCHANGE1 MOVE.B #1,CHFLAG-PBA(A6)‰BRA.S�PARSEINE*(*****************************************ˆ**‚L�I�S�T‚**(****************************************PLIST„ADD.L�#1,A0‰CMP.B�#'I',(A0) ‰BNE.S�PLIST0 ‰BSR.S�PCK ‰BRA.S�PLIST1 PLIST0ƒEQU�* ‰BSR.S�PENDPLIST1ƒMOVE.B�#1,LFLAG-PBA(A6)‰BRA.S�PARSEINE‰PAGE(*****************************************ˆ**‚R�E�P�L�A�C�E‚**(****************************************PREP…ADD.L�#1,A0‰CMP.B�#'E',(A0) ‰BNE.S�PREP0 ‰BSR.S�PCK ‰BRA.S�PREP1 PREP0„EQU�* ‰BSR.S�PENDPREP1„MOVE.B�#1,RFLAG-PBA(A6)‰BRA.S�PARSEINE*(*****************************************ˆ**‚Q�U�I�T‚*#*********************************** PQUIT„EQU�* ‰ADD.L�#1,A0‰CMP.B�#'U',(A0) ‰BNE.S�PQUIT0 ‰BSR.S�PCK ‰BRA.S�PQUIT1 PQUIT0ƒEQU�* ‰BSR.S�PENDPQUIT1ƒMOVE.B�#1,QFLAG-PBA(A6)‰BRA.S�PARSEINE**PRETER: ‰BSR‡INVM_CFC!*œCHECK�FOR�CHAIN�FILE�PROCESSING‰BSET�#31,D0…SET�NEG�BIT*PARSEINE EQU * ‰RTS�.�RETURN**<************************************************************8*ˆPCK�WALKS�DOWN�THE�CMD�LINE�UNTIL�IF�FINDS�A�NON�BLANK*ˆOR�IS�AT�THE�END#*ˆTHE�2ND�LETTER�WAS�COMMAND�LETTER**ˆRETURN*’GOOD*œA.�CR�FOLLOWED�COMMAND!*œB.�A0=ADDR�OF�MODULE�TO�PROCESS**‘ERROR1*œIN�WHICH�CASE�RETURN�FROM�SUBROUTINE�IS�REMOVED,*œFROM�STACK�AND�CONTROL�TRANSFERRED�TO�PERR*8********************************************************* PCK†EQU�*‰ADD.L�#1,A0…INC�ADDR"PCK0…CMP.B�#CR,(A0)‚IS�IT�CARR�RET‰BNE.S�PCK1†NO"PCKSETƒBSET�#0,D0†SET�CARR�RET�BITPCKEX„RTS�.�RETURN*PCK1…CMP.B�#SPACE,(A0)+ ‰BEQ.S�PCKSP‰CMP.L�A0,A1…AT�END ‰BHI�PCK0ˆYES‰TST.L�(A7)+…RESET�STACK ‰BRA�PERRPCKSP„CMP.B�#CR,(A0) ‰BEQ�PCKSET‰CMP.B�#SPACE,(A0) ‰BNE�PCKEX ‰ADD.L�#1,A0‰CMP.L�A0,A1…AT�END ‰BHI�PCKSP‡NO ‰BRA�PCKSET***0************************************************2*ˆTHIS�ROUTINE�WAS�CALLED�BECAUSE�2ND�CHAR�WAS�NOT*ˆA�COMMAND�LETTER**’RETURN*œGOOD*¦A.�CR�FOLLOWED�COMMAND&*¦B.�A0=ADDR�OF�MODULE�TO�BE�PROCESSED**œERROR%*¦IN�WHICH�CASE�THE�RETURN�ADDRESS�IS'*¦REMOVED�FROM�THE�STACK�AND�CONTROL�IS*¦TRANSFERRED�TO�PERR*+******************************************* PEND…EQU�*‰CMP.B�#CR,(A0)‚CARR�RET‰BNE.S�PEND1…NO!PEND0„BSET�#0,D0†SET�CARR�RET�BITPENDE„RTS�.�RETURN*PEND1„CMP.B�#SPACE,(A0)+ ‰BEQ.S�PEND2‰TST.L�(A7)+…RESET�STACK ‰BRA�PERRPEND2„CMP.L�A0,A1…AT�END ‰BHI.S�PEND3 ‰BRA�PEND0PEND3„CMP.B�#SPACE,(A0) ‰BNE�PENDE ‰ADD.L�#1,A0 ‰BRA�PEND2‰PAGE.************************************************ˆADD�A�MODULE�LOGIC* '*ˆTHE�NEW�MODULE�TO�BE�ADDED�MUST�EXIST1*ˆTHE�NEW�MODULE�CANNOT�ALREADY�BE�IN�THE�LIBRARY*ˆTHE�NEW�MODULE�CAN�BE�ADDED!*’AT�THE�BEGINNING�OF�THE�LIBRARY*’AT�THE�END‡OF�THE�LIBRARY)*’AFTER�AN�EXISTING�MODULE�IN�THE�LIBRARY*0************************************************* DOADD„EQU�*7‰MOVE.L�HOLDLOCM-PBA(A6),A0‚A0=ADDR�OF�FILE�TO�BE�ADDED ‰BTST�#0,D0:‰BEQ.S�DOADD1ˆJMP�IF�A�FILE�NAME�TO�BE�ADDED�WAS�SPECIFIED-*********************************************$*ˆMSG�REQUESTING�SOURCE�NAME�IS�SENT,********************************************‰LEA�ENTM(PC),A3‰LEA�ENTME(PC),A44‰BSR�PRTIFORMˆREQUEST�USER�TO�INPUT�FILE�TO�BE�ADDED'‰BSR�CLEARWŠSPACE�FILL�THE�INPUT�BUFFER$‰IOSCALL�OUTINIOS(PC)‚WAIT�FOR�INPUT ‰BNE�IOERPRT ‰BSR‡SBARG-*œFORCE�LOWER�CASE�TO�UPPER�CASE�IF�NECESSARY ‰BNE‡IOERPRT*œJMP�IF�SBARG�ERROR$‰BSR�SETENDŠPUT�'CR'�AT�END�OF�INPUT/‰LEA�WORKBUF(A5),A0‚A0=ADDR�OF�FILE�TO�BE�ADDEDDDOADD1ƒCLR.B�ADDMORE-PBA(A6)‚INITIALIZE�FLAG�-�MORE�FILES�TO�PROCESS‰LEA�SOURFHS(PC),A6;‰BSR�INITDSK‰INITIALIZE�PARAMETER�BLOCK�WITH�DEFAULT�VALUES/‰BSR�EDITFILEˆMOVE�FILE�NAME�TO�PARAMETER�BLOCK4‰BMI.S�DOADDBAD†JMP�IF�ERROR�ENCOUNTERED�IN�EDITFILE ‰BTST�#1,D0=‰BNE.S�DOADDBAD†JMP�IF�DEVICE�SPECIFIED�AS�SOURCE�FILE�TO�ADD‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS‰CMP.B�#COMMA,D1.‰BNE.S�DOADD0ˆJMP�IF�NO�MORE�FILES�TO�BE�ADDED;‰MOVE.B�#1,ADDMORE-PBA(A6)ƒSET�FLAG�-�MORE�FILES�TO�PROCESS DOADD0ƒEQU�*9‰MOVE.L�A0,HOLDLOCM-PBA(A6)‚A0=ADDR�NEXT�FILE�TO�BE�ADDED@‰MOVE.W�#FHASGN,SOURFHS-PBA(A6)‚SET�CMD�TO�ASSIGN�FILE�(OPEN�IT)"‰FHSCALL�SOURFHS(PC)‚ASSIGN�SOURCE,‰BEQ.S�DOADDOK‡JMP�IF�FILE�ASSIGNED�(OPENED) ‰BSR‡X10000*œCALL�MESSAGE�PRGM ‰BRA�DOADDCL1*************************************************$*ˆDETERMINE�IF�SOURCE�ALREADY�IN�LIB1*************************************************DOADDOK: ‰BSR‡X20000*œEDIT�FOR�VALID�FILE�TYPE ‰BEQ‡DOADDCL*œJMP�IF�INPUT�FILE�TYPE�ERROR ‰BSR�FINDSOUR ‰CMP.L�#1,D03‰BEQ.S�DOADD2ˆJMP�IF�SOURCE�MODULE�TO�ADD�NOT�FOUND/‰BSR�MODER1ŠPRINT�ERROR�MSG�-�MODULE�IN�LIBRARY ‰BRA�DOADDCL DOADDBAD:‰LEA‡PBA(PC),A6 ‰BSR�INVALER*œA6=PROGRAM�BASE�ADDRESS ‰BRA�DOADDCL* DOADD2ƒEQU�**'****************************************ˆFIND�INSERT�LOCATION'***************************************‰LEA�ADDNAM(PC),A4>‰BSR�MOVMODŠMOVE�SOURCE�MODULE�TO�BE�ADDED�TO�CONFIRMATION�MSG%‰TST.B�LIBPREV-PBA(A6)ƒDOES�LIB�EXIST‰BEQ�ADDFIRST„NO�BUILD�ONE‰CMP.B�#CR,D1ƒIS�IT�CARR�RET‰BEQ.S�ADDTOEND„YES‰CMP.B�#COMMA,D1 ‰BNE.S�DOADD3.‰MOVE.B�#1,ADDMORE-PBA(A6)‚SET�ADD�MORE�SWITCH‰BRA.S�ADDTOENDDOADD3ƒCMP.B�#SLASH,D1‚SLASH‰BNE�DOADDBAD„NO�IS�ERROR*+‰MOVE.L�HOLDLOCM-PBA(A6),A0‚RESTORE�POINTER*ˆPROCESS�SLASH�SEPERATOR$‰CMP.B�#CR,(A0)�NEXT�CHAR�A�CARR�RET‰BEQ�ADDTOBEG„YES‰CMP.B�#COMMA,(A0) ‰BNE.S�DOADD4‰MOVE.B�#1,ADDMORE-PBA(A6) ‰ADD.L�#1,A0(‰MOVE.L�A0,HOLDLOCM-PBA(A6)‚SAVE�POINTER ‰BRA�ADDTOBEG0************************************************-*ˆMODULE�SUPPLIED�THEREFORE�IT�MUST�BE�IN�LIB*ˆOR�IT�IS�AN�ERROR�CONDITION0************************************************ DOADD4ƒEQU�* ‰MOVE.B�#1,D2 ‰BSR�MODVERB ‰TST.L�D0 ‰BMI�DOADDCL0************************************************)*ˆVALID�MODULE�NAME�EXIST�IN�MODNAM�FIELD%*ˆINSERT�LOCATION�IS�AFTER�THE�MODULE1************************************************* ‰BSR�FINDIND%‰TST.L�DIRF-PBA(A6)�IS�FOUND�FLAG�SET‰BNE.S�DOADD5„GOOD‰BSR�INSRT‡PRINT�ERR�MSG ‰BRA�DOADDCL* DOADD5ƒEQU�*9‰CLR.B�THRUMOD-PBA(A6)‚SET�SWITCH�TO�COPY�THRU�THE�MODULE ‰BSR�BLD1HAF%‰BSR�INSSOUR…INSERT�SOURCE�IN�TMP�LIB)‰BSR�BLD2HAF…ADD�REST�OF�LIB�TO�TEMP�FILE********************************************ˆTEMP�LIBRARY�IS�NOW�COMPLETE******************************************* ‰BRA�DOADDREN*3****************************************************3*ˆADD�MODULE�TO�END�OF�LIBRARY�(TEMP�FILE�NOT�USED)3**************************************************** ADDTOEND:‰MOVE.L„DIRLOC-PBA(A6),D0‰CMP.L…DIREND-PBA(A6),D0 ‰BEQ‡ADDTOBEG **œJMP�IF�INPUT�LIBRARY�FILE/DIRLIB�IS�NULL0‰MOVE.W�#IOPOST,LIBRIOS-PBA(A6)‚POSITION�COMMAND"‰MOVE.L�#-1,LIBRIOS-PBA+IOSRRN(A6)&‰MOVE.W�#IOPRAN,LIBRIOS-PBA+IOSOPT(A6)‰IOSCALL�LIBRIOS(PC) ‰BNE�IOERPRT ADDTOE1‚EQU�*‰MOVE.W�#IOWRIT,LIBRIOS-PBA(A6)=‰MOVE.W�#IOPNXT,LIBRIOS-PBA+IOSOPT(A6)‚SET�TO�NEXT�REC�OPTION‰LEA‡SOURBUF(A5),A09‰MOVE.L�A0,LIBRSAD-PBA(A6)‚MOVE�BUFFER�ADDR�TO�PARM�BLOCK‰LEA‡SOURBUFE(A5),A0‰MOVE.L�A0,LIBREAD-PBA(A6)7*******************************************************6*ˆBRANCH�TO�WRITE�SOURCE�BECAUSE�1ST�BLOCK�ALREAD�READ7*******************************************************‰BRA.S�ADDTOWRTADDTORD‚IOSCALL�SOURIOS(PC)‰BNE.S�ADDTOX1ƒCK�ERROR+‰BSR�CK2MOD†FIND�IF�MORE�THAN�1�MOD�ROUTINE‰BNE.S�ADDTOWRT‚GO�WRITE ‰BSR�PRTMSM‰BRA�DOADDCK…EXIT%ADDTOX1‚CMP.B�#ISTAEOF,D0‚END�OF�FILE!‰BEQ�DOADDCK…GO�TO�FINISH�ROUTINE ‰BRA‡IOERPRTADDTOWRT IOSCALL LIBRIOS(PC) ‰BEQ�ADDTORD ‰BRA‡IOERPRT*.***********************************************-*ˆROUTINE�TO�BUILD�THE�LIBRARY�THE�FIRST�TIME*.***********************************************ADDFIRST EQU *‰CMP.B�#COMMA,D1+‰BNE.S�ADDF1‰JMP�IF�ONLY�1�FILE�BEING�ADDED%‰MOVE.B�#1,ADDMORE-PBA(A6)‚SET�SWITCH ADDF1„EQU�*8‰MOVE.W�#FHALLO+FHASGN,LIBFHS-PBA(A6)‚ALLOC�&�ASSIGN�LIB0‰AND.W�#$FFFF-FFTBIT,LIBFHS-PBA+FHSOPT(A6)‚CLEAR6‰OR.W�#FOPSEQ,LIBFHS-PBA+FHSOPT(A6)‚SET�OPT�SEQUENTIAL5‰MOVE.L�#0,LIBFHS-PBA+FHSSIZ(A6)‚SET�SIZE�TO�NON�CONT5‰MOVE.W�#256,LIBFHS-PBA+FHSLRL(A6)‚RECORD�SIZE�IS�256‰FHSCALL�LIBFHS(PC)‰BNE�IOERPRT…ERROR‰MOVE.B�#1,LIBPREV-PBA(A6)‰MOVE.B�#1,DIREXIST-PBA(A6)‰BRA�ADDTOE1…GO�ADD�TO�FILE**2****************************************************ˆADD�TO�FRONT�OF�LIBRARY*-**********************************************ADDTOBEG EQU * *º10/24/83-*ˆdo�we�need�to�alloc�the�temp�file?�10/24/83 *º10/24/83‰BSR‡INITCONT 10/24/83 *º10/24/83‰LEA‡SOURBUF(A5),A0‰MOVE.L�A0,TEMPSAD-PBA(A6)‰LEA‡SOURBUFE(A5),A0!‰MOVE.L�A0,TEMPIOS-PBA+IOSEAD(A6)2**************************************************1*ˆWRITE�TEMP�1ST�BECAUSE�SOURCE�ALREADY�READ�INTO*ˆBUFFER�BEFORE�COMING�HERE1************************************************* ADDTOB1‚EQU�**ˆWRITE�TO�TEMP�FILE‰IOSCALL�TEMPIOS(PC)‰BEQ.S�ADDTOBRƒGO�TO�READ ‰BRA‡IOERPRT'ADDTOBR‚IOSCALL�SOURIOS(PC)‚READ�SOURCE‰BNE.S�ADDTOX2ƒCK�FOR�ERR ‰BSR�CK2MOD‰BNE�ADDTOB1…GO�WRITE ‰BSR�PRTMSM‰BRA.S�ADDTOB2ƒFINISH�IT* ADDTOX2‚CMP.B�#ISTAEOF,D0‚AT�END ‰BNE‡IOERPRT*œJMP�IF�ERROR�OTHER�THAN�EOF* ADDTOB2‚EQU�*7‰MOVE.B�#1,RD1ST-PBA(A6)‚SET�1ST�RECORD�NOT�IN�BUF�FLAG ‰BSR�BLD2HAF*DOADDREN EQU *‰BSR�RENAMLIB„CHANG�TMP�TO�LIB DOADDCK‚EQU�*‰BSR.S�ADDTODIR#‰BSR.S�ADDGOOD…PRINT�SUCCESSFUL�MSG‰LEA‡LIBBUF(A5),A07‰MOVE.L�A0,LIBRSAD-PBA(A6)‚RESET�LIB�ADDR�IN�PARM�BLOCK‰LEA‡LIBBUFE(A5),A0‰MOVE.L�A0,LIBREAD-PBA(A6) DOADDCL‚EQU�*%**************************************ˆCLOSE�SOURCE�FILE%************************************* ‰BSR�CLOSSOUR$‰TST.B�ADDMORE-PBA(A6)ƒANY�MORE�ADDS‰BEQ.S�DOADDAM…NO*#DOADDRW‚BSR�REWINDL…REWIND�LIB�FILE)‰MOVE.L�HOLDLOCM-PBA(A6),A0ƒRESET�POINTER‰BRA�DOADD1‹GO�PROC�NEXT**** DOADDAM‚EQU�*%‰BSR.S�CKMORE†CK�FOR�MORE�IN�CND�LINE ‰TST.B�D0‰BEQ�DOADDRW…YES*DOADDEXƒRTSŒ.�RETURN**6*******************************************************.*ˆROUTINE�TO�MOVE�MODULE�NAME�TO�THE�DIRECTORY+*ˆAFTER�THE�MODULE�WAS�ADDED�TO�THE�LIBRARY*6******************************************************* ADDTODIR: ‰MOVE.L„A6,A3*œA3=PROGRAM�BASE�ADDRESS*‰TST.B�DIREXIST-PBA(A3)‚DOES�THE�DIR�EXIST‰BEQ.S�ADDTODEX‚NO‰MOVE.L�DIREND-PBA(A3),A6‰LEA�DIRLIBE(A5),A5 ‰CMP.L�A6,A5‰BHI.S�ADDTOD1‰MOVE.B�#1,DIRFULL-PBA(A3)‰BSR�LIBFULRT„PRINT�MSG‰BRA.S�ADDTODEXADDTOD1ƒLEA�ADDNAM(PC),A3ƒINIT‰MOVE.L�(A3)+,(A6)+‰MOVE.L�(A3)+,(A6)+‰MOVE.W�(A3)+,(A6)+‰MOVE.W�#'**',(A6)+‰LEA‡PBA(PC),A3*œA3=PROGRAM�BASE�ADDRESS‰MOVE.L�A6,DIREND-PBA(A3)*‰MOVE.B�#1,DIRCHG-PBA(A3)…SET�CHANGED�FLAG =‰CLR.W�TOTMOD-PBA(A6)„CLEAR�TOTALS�OF�DIR�COUNT�'ITS�CHANGED' ADDTODEX:‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS ‰RTS�.�RETURN***1**************************************************%*ˆROUTINE�TO�PRINT�ADD�SUCCESSFUL�MSG*ˆMODULE�NAME�IS�ALREADY�IN�MSG*1*************************************************ADDGOOD‚LEA…ADDMSG(PC),A3‰LEA…ADDMSGE(PC),A4 ‰BSR�MSGPRT‰RTS**+********************************************)*ROUTINE TO CHECK FOR START OF NEW MODULE6*ˆSTATUS�CONDITION�OF�EQUAL�ON�MEANS�NEW�NOD�WAS�FOUND*+*******************************************CK2MODƒLEA�SOURBUF(A5),A0‰CMP.B�#'1',1(A0)‚TYPE�1�RECORD‰BNE.S�CK2MODEX‚GET�OUT‰LEA�2(A0),A0„INIT�FOR�CALL ‰BSR�MODVER‰TST.B�D0ˆSET�STATUSCK2MODEX�RTS�.�RETURN***0*************************************************4*ˆROUTINE�TO�CHECK�FOR�A�COMMA�AS�THE�NEXT�CHARACTER*0************************************************* CKMOREƒEQU�* ‰MOVE.B�#1,D0‰MOVE.L�HOLDLOCM-PBA(A6),A0‰CMP.B�#COMMA,(A0)+‰BNE.S�CKMOREX‰MOVE.L�A0,HOLDLOCM-PBA(A6)‰CLR.B�D0ˆSET�CONDITIONCKMOREX‚RTS�.�RETURN‰PAGEA******************************************************************6*ˆWILL�BUILD�THE�TEMP�LIBRARY�FROM�THE‚START�UP�TO�THE**‰MODULE�NAME�IN�MODNAM.�IF�SWITCH�THRUMOD,*ˆIS�ZERO�IT�WILL�GO�THRU�THIS�MOD�OTHERWISE**ˆIT�WILL�EXIT�AT�THE�START�OF�THIS�MODULE*A****************************************************************** BLD1HAF‚EQU�*!‰CLR.B�BLD1END-PBA(A6)ƒCLEAR�FLAG‰CLR.B�ATMOD-PBA(A6)…CLEAR�FLAG‰LEA�LIBBUFE(A5),A4‚BUF�END‰LEA�LIBBUF(A5),A5ƒBUF�START0‰MOVE.L�A5,TEMPSAD-PBA(A6)‚MOVE�TO�TMP�FILE�PARM‰MOVE.L�A4,TEMPEAD-PBA(A6)1‰AND.W�#$FFFF-IOPPOS,LIBRIOS-PBA+IOSOPT(A6)‚CLEAR$‰OR.W�#IOPNXT,LIBRIOS-PBA+IOSOPT(A6)BLD1RDƒIOSCALL�LIBRIOS(PC)‰BEQ.S�BLD1A…GOOD‰CMP.B�#ISTAEOF,D0‚AT�END ‰BNE‡IOERPRT*œJMP�IF�ERROR�OTHER�THAN�EOF4BLD1E„MOVE.B�#1,BLD1END-PBA(A6)‚SET�END�REACHED�FLAG'‰TST.B�ATMOD-PBA(A6)…AT�INSERT�FLAG�SET‰BNE.S�BLD1EX‡OK‰LEA�INSENDM(PC),A3‰LEA�INSENDME(PC),A4 ‰BSR�MSGPRT ‰BRA.S�BLD1EX* BLD1A„EQU�*‰MOVE.W�(A5),D3‰CMP.B�#'1',D3ƒTYPE�1�RECORD‰BNE.S�BLD1WRT…NO%‰LEA�2(A5),A0ƒINIT�FOR�MODVER�ROUTINE‰BSR�MODVER†VERIFY�MOD�NAME‰TST.B�D0ˆGOOD‰BNE.S�BLD1WRT…NO‰TST.B�ATMOD-PBA(A6)…AT�INSERT‰BNE.S�BLD1EX†YES!‰MOVEM.L�(A5),D3-D5‚SAVE�MOD�NAME(*ˆCOMPARE�MODULE�NAME�TO�INSERT�MOD�NAME‰CMP.W�MODNAM-PBA(A6),D3‰BNE.S�BLD1WRT‰CMP.L�MODNAM+2-PBA(A6),D4‰BNE.S�BLD1WRT‰CMP.L�MODNAM+6-PBA(A6),D5‰BNE.S�BLD1WRT)‰TST.B�THRUMOD-PBA(A6)ƒTHROUGH�SWITCH�SET‰BNE.S�BLD1EX„NO-‰MOVE.B�#1,ATMOD-PBA(A6)‚SET�EXIT�NEXT�SWITCH********************************************ˆWRITE�TO�TEMPARY�FILE******************************************* BLD1WRT‚EQU�**4*ˆif�tempfile�hasn't�been�assigned�go�do�it‰10/24/83 *º10/24/83‰BSR‡INITCONT 10/24/83 *º10/24/83‰IOSCALL�TEMPIOS(PC) ‰BEQ�BLD1RD ‰BRA‡IOERPRTBLD1EX:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS ‰RTS�.�RETURN‰PAGE1*************************************************$*ˆALLOCATE�&�ASSIGN�THE�TEMPORY�FILE0*************************************************ASSGNTMP EQU * *º10/24/83/*ˆset�flag�temp�file�has�been�assignedŽ10/24/83 *º10/24/83 ‰CLR.B…TEMPIOSF-PBA(A6)˜10/24/83 *º10/24/83%‰MOVE.W�#FHASGN+FHALLO,TMPFHS-PBA(A6)‰FHSCALL�TMPFHS(PC) ‰BNE�IOERPRT ‰RTS�.�RETURN‰PAGE'*****************************************ˆTHIS�ROUTINE�WILL>*’CHECK�FOR�A�SOURCE�MODULE�IN�THE�DIRECTORY�DIRLIB�IF�IT�EXIS>*’IF�NO�DIRECTORY�EXIST�ONE�WILL�BE�BUILT�(DIRLIB)�AND�CHECKED2*’IF�DIRECTORY�OVERFLOW�EXIST�THE�REMAINDER�OF�THE0*œLIBRARY�WILL�BE�SEARCHED�FOR�THE�SOURCE�MODULE4*’IF�FOUND�THE�MODULE�NAME�WILL�BE�MOVED�TO�'MODNAM'**ˆSTATUS*’D0ˆ1�==>�MODULE�NOT�FOUND*œ0�==>�MODULE…FOUND*›-1�==>�ERROR�CONDITION*3*****************************************************FINDSOUR‚EQU�*‰TST.B�DIREXIST-PBA(A6)$‰BNE.S�FINAŠJMP�IF�A�DIRECTORY�EXIST ‰BSR�BUILDDIRˆBUILD�A�DIRECTORY%FINA…LEA�DIRLIB(A5),A5ƒINIT�DIR�START6FINRD„IOSCALL�SOURIOS(PC)‚READ�RECD�FROM�SOURCE�MODULE ‰BNE‡IOERPRT*œJMP�IF�ERRORFINB:‰MOVE.L„A3,-(A7)‰MOVE.L„AS_ADDR-PBA(A6),A3 *œSAVE�REG*œA3=ALLOCATED�SEGMENT�ADDRESS)‰MOVEM.L�SOURBUF+2(A3),D3-D5‚GET�MOD�NAME‰MOVE.L„(A7)+,A3*œRESTORE�REG�ADDRESS‰MOVEM.L�D3-D5,MODNAM-PBA(A6)$*œMODNAM�CONTAINS�SOURCE�MODULE�NAME‰TST.B�LIBPREV-PBA(A6)%‰BEQ.S�FINSNOˆJMP�IF�NO�LIBRARY�EXIST#‰BSR�FINDIND‰SEARCH�FOR�MODULE�NAME‰TST.L�DIRF-PBA(A6):‰BNE.S�FINNOMOD†JMP�IF�SOURCE�MODULE�TO�BE�ADDED�WAS�FOUND‰TST.B�DIRFULL-PBA(A6),‰BEQ.S�FINSNOˆJMP�IF�SOURCE�MODULE�NOT�FOUND$‰TST.B�DIROPT-PBA(A6)„NO�DIR�OPT�SET‰BNE.S�FINC†YES-FINSNOƒMOVE.L�#1,D0„SET�MODULE�NOT�FOUND�FLAG ‰BRA.S�FINSEX FINC…EQU�*0‰MOVE.B�#1,RLMSG-PBA(A6)‚SET�DONT�PRINT�MSG�FLAG2‰BSR�READLIB…GO�READ�THE�REMAINDER�OF�LIB�&�SEARCH‰CLR.B�RLMSG-PBA(A6) ‰TST.L�D0*‰BNE�FINSNOŠJMP�IF�SOURCE�MODULE�NOT�FOUND$FINNOMODƒCLR.L�D0ˆSET�FOUND�MOD�FLAGFINSEX:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS ‰RTS�.�RETURN‰PAGE4*****************************************************.*ˆROUTINE�TO�MOVE�SOURCE�FILE�TO�TEMP�LIB�FILE.*ˆTHE�FIRST�SECTOR�OF�THE�SOURCE�IS�ALREADY�IN2*ˆTHE�SOURCE�BUFFER�&�THE�MODULE�NAME�WAS�VEFIFIED-*ˆTHAT�IT�DIDN'T�ALREADY�EXIST�IN�THE�LIBRARY*5******************************************=***********INSSOUR:*4*ˆif�tempfile�hasn't�been�assigned�go�do�it‰10/24/83 *º10/24/83‰BSR‡INITCONT 10/24/83 *º10/24/83‰LEA‡SOURBUFE(A5),A0‰MOVE.L„A0,TEMPEAD-PBA(A6)‰LEA�SOURBUF(A5),A5:‰MOVE.L�A5,TEMPSAD-PBA(A6)‚SOURCE�START�ADDR�TO�PARM�BLOCK‰MOVE.W�#IOREAD,SOURIOS-PBA(A6)/INSSWRT‚IOSCALL�TEMPIOS(PC)�WRITE�SOURCE�TO�TMP ‰BNE‡IOERPRT*œJMP�IF�ERROR%INSSA„IOSCALL�SOURIOS(PC)�READ�SOURCE ‰BNE.S�INSSA1‰BSR�CK2MOD†CK�FOR�END‰BNE�INSSWRT…GO�WRITE‰BSR�PRTMSM†PRT�WARNIMG�MSG ‰BRA.S�INSSEXINSSA1ƒCMP.B�#ISTAEOF,D0‚AT�END ‰BNE‡IOERPRT*œJMP�IF�ERROR�OTHER�THAN�EOFINSSEX:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS‰RTS�.�RETURN�FROM�INSSOUR‰PAGE6*******************************************************3*ˆROUTINE�TO�BUILD�THE�2ND�HALF�(PART�AFTER�INSERT)*‰OF�NEW�LIBRARY�FILE*5*****************************************************>*ˆTHE�LIBBUF�MUST�ALREADY�CONTAIN�THE�1ST�RECORD�TO�BE�WRITTEN$*ˆOR�THE�FLAG�RD1ST�MUST�BE�NON�ZERO BLD2HAF‚EQU�*$‰TST.B�BLD1END-PBA(A6)ƒAT�END�OF�LIB‰BEQ.S�BLD2OK„NO‰CLR.B�BLD1END-PBA(A6)‰BRA.S�BLD2EX†GET�OUT* BLD2OKƒEQU�*‰MOVE.W�#IOREAD,LIBRIOS-PBA(A6)‰LEA‡LIBBUFE(A5),A0‰MOVE.L�A0,TEMPEAD-PBA(A6)‰LEA�LIBBUF(A5),A5ƒINIT3‰MOVE.L�A5,TEMPSAD-PBA(A6)‚INIT�PARM�BLOCK�IN�WRITE1‰AND.W�#$FFFF-IOPPOS,LIBRIOS-PBA+IOSOPT(A6)‚CLEAR$‰OR.W�#IOPNXT,LIBRIOS-PBA+IOSOPT(A6) BLD2WRT‚EQU�*"‰TST.B�RD1ST-PBA(A6)…READ�FLAG�SET‰BEQ.S�BLD2WRTG‚NO�WRITE�IT‰CLR.B�RD1ST-PBA(A6)…CLEAR‰BRA.S�BLD2RD„GO�READ*(*****************************************ˆWRITE�TO�TEMP�FILE$************************************BLD2WRTG EQU **4*ˆif�tempfile�hasn't�been�assigned�go�do�it‰10/24/83 *º10/24/83‰BSR‡INITCONT 10/24/83 *º10/24/83‰IOSCALL�TEMPIOS(PC) ‰BNE‡IOERPRT*œJMP�IF�ERROR+********************************************ˆREAD�FROM�LIBRARY�FILE+*******************************************BLD2RDƒIOSCALL�LIBRIOS(PC)‰BEQ.S�BLD2WRTƒGOOD‰CMP.B�#ISTAEOF,D0‚AT�END ‰BNE‡IOERPRT*œJMP�IF�ERROR�OTHER�THAN�EOFBLD2EX:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS ŠRTSŒ.�RETURN*‰PAGE7********************************************************:*ˆROUTINE�TO�RENAME�THE�TEMP�FILE�TO�THE�LIBRARY�FILE�NAME3*ˆTHE�OLD�LIBRARY�IS�DELETED�AND�THEN�THE�TEMP�FILE *ˆIS�RENAMED�TO�THE�LIBRARY�NAME3*ˆIF�ANY�PROBLEMS�ARISE�THE�TEMP�FILE�IS�RENAMED�TO*‰AFILE�CALLED�TEMPLIB*7********************************************************RENAMLIB EQU *3‰MOVE.L�LIBCAT-PBA(A6),TMPCAT-PBA(A6)…MOVE�CAT�NAME)‰MOVE.L�LIBCAT+4-PBA(A6),TMPCAT+4-PBA(A6) ;‰MOVE.L�LIBNAME-PBA(A6),TMPNAME-PBA(A6)‚SET�NAME�FOR�RENAME+‰MOVE.L�LIBNAME+4-PBA(A6),TMPNAME+4-PBA(A6)6‰MOVE.W�LIBEXT-PBA(A6),TMPEXT-PBA(A6)‚MOVE�EXTENT�NAME&‰MOVE.W�#FHRENM,TMPFHS-PBA(A6)‚SET�CMD ‰BSR�CLOSLIB…CLOSE�BEFORE�DELETE4‰MOVE.W�#FHDELT,LIBFHS-PBA(A6)�DELETE�CMD�TO�LIB�FHS+********************************************ˆDO�CALL�TO�DELETE�OLD�LIBRARY+*******************************************‰FHSCALL�LIBFHS(PC) ‰BEQ.S�RENAM1 RENAMER1: ‰BSR‡X10000)*œOUTPUT�ERROR�MESSAGE�VIA�ERROR�MSG�PRGM‰BSR.S�CREATTMP"‰BRA�TERMINAT„EXIT�LIBRARY�PROGRAM *ˆGOOD�DELETE RENAM1ƒEQU�*‰FHSCALL�TMPFHS(PC) ‰BNE�RENAMER1'****************************************ˆCHANGE�LOG�UNIT�ASSGN'***************************************‰FHSCALL�CHGLUFHS(PC) ‰BNE‡IOERPRT*œJMP�IF�FHS�ERROR *Ä10/24/83)*ˆset�flag�to�alloc�new�tempfilež10/24/83 *Ä10/24/83$‰MOVE.Bƒ#1,TEMPIOSF-PBA(A6) 10/24/83 *Ä10/24/83 ‰BSR�INITCONT„REASSIGN�TEMP�FILE1‰CLR.B�NEWLIB-PBA(A6)„CLEAR�CREATE�NEW�LIB�SWITCH‰RTS�.�RETURN�FROM�RENAMLIB‰PAGE9**********************************************************@*ˆROUTINE�TO�CREATE�A�FILE�CALLED�TEMPLIB�FROM�THE�INTERMEDIATE/4*ˆNEW�LIBRARY�BECAUSE�OF�INABILITY�TO�RENAME�THE�OLD*ˆLIBRARY�FILE*9**********************************************************CREATTMP EQU *‰BSR�TEMPER…PRINT�ERROR�MSG7‰MOVE.L�#'TEMP',TMPNAME-PBA(A6)‚MOVE�NAME�TO�PARM�BLOCK!‰MOVE.L�#'LIB�',TMPNAME+4-PBA(A6)-‰MOVE.W�#'RO',TMPEXT-PBA(A6)‚CHANGE�EXTENSION%CREATT1‚MOVE.W�#FHRENM,TMPFHS-PBA(A6)‰FHSCALL�TMPFHS(PC)‰BEQ.S�CREATTEX„GOOD*‰CMP.B�#FSTADNM,D0‚DOES�FILE�ALREADY�EXITS‰BNE�IOERPRT…NO‰MOVE.W�#FHDELT,TMPFHS-PBA(A6)‰FHSCALL�TMPFHS(PC) ‰BEQ�CREATT1 ‰BRA�IOERPRT!CREATTEX‚RTS�.�RETURN�FROM�CREATE‰PAGE5******************************************************#*ˆCHANG�DATA�IN�LIB�MODULES�ROUTINE1*‰THE�MODULE�VERSION�#�REVISION�#�AND�DESCRIPTION*ˆCAN�BE�CHANGED�IN�A�MODULE*5****************************************************** DOCHG„EQU�*)‰TST.B�LIBPREV-PBA(A6)ƒDOES�OLD�LIB�EXIST‰BNE.S�DOCHG1„YES‰BSR�NOLIB‡ERROR�MSG‰BRA�DOCHGEX…EXIT*!DOCHGER‚BSR�INVALER…PRT�ERROR�MSG‰BRA�DOCHGX…EXIT* DOCHG1ƒEQU�*‰BTST�#0,D0†MOD�NAME�GIVEN‰BEQ.S�DOCHG2„YES‰BSR�MODMIS†PRT�MSG‰BRA�DOCHGEX…EXIT-DOCHGCL‚CLR.B�MORECHA-PBA(A6)ƒCLEAR�MORE�FLAG‰BRA.S�DOCHGS„CONTINUE* DOCHG2ƒEQU�*1‰MOVE.L�HOLDLOCM-PBA(A6),A0‚INIT�CMD�LINE�POINTER DOCHGLOP:"‰CLR.B�FLAGCND-PBA(A6)ƒNO�DIR�FLAG‰BSR�MODVERB…VAL�MOD�NAME*œD2=LOW�ORDER�BYTE�IS�NON�ZERO‰TST.L�D0ˆGOOD‰BMI‡DOCHGX‰NO *ˆMOVE�MODULE�NAME�TO�CHANGE�MSG‰LEA�ENTCHGM(PC),A4‰BSR�MOVMOD†GO�MOVE�MODNAM‰CMP.B�#COMMA,(A0)‚MORE�ITEMS‰BNE.S�DOCHGCLƒNO$‰TST.B�MORECHA-PBA(A6)ƒALREADY�SAVED ‰BNE.S�DOCHGS*‰MOVE.B�#1,MORECHA-PBA(A6)„SET�MORE�SWITCH*ˆSAVE�THE�COMMAND�LINE‰LEA�WORKBUF(A5),A3‰LEA�SOURBUF(A5),A4‰LEA�WORKBUFE(A5),A5‚ENDDOCHGL2‚MOVE.L�(A3)+,(A4)+‰CMP.L�A3,A5…AT�END ‰BHI�DOCHGL2‰MOVE.L„AS_ADDR-PBA(A6),A5!*œA5=ADDRESS�OF�ALLOCATED�SEGMENT DOCHGSƒEQU�*(‰MOVE.L�HOLDLOCM-PBA(A6),A0‚SAVE�POINTER ‰BSR‡X30000*œEDIT�FOR�NULL�DIRECTORY)‰TST.B�DIREXIST-PBA(A6)‚DOES�THE�DIR�EXIT$‰BEQ�DOCHGND…NO�-�PROC�WITHOUT�A�DIR%‰TST.B�DIRCHG-PBA(A6)„HAS�DIR�CHANGED‰BEQ.S�DOCHG3‰NO‰BSR�BUILDDIR‰GO�BUILD�DIR DOCHG3ƒEQU�*0************************************************'*ˆLIBRARY�DOES�EXIST�PROCESSING�FOLLOWS0************************************************‰BSR�FINDIND…FIND�IN�LIB‰TST.L�DIRF-PBA(A6)†FOUND‰BEQ�DOCHGX…ERROR�NOT�FOUND9‰MOVE.L�DIRF-PBA(A6),PREVDIRF-PBA(A6)ƒSAVE�LOC�FOR�CHANGE*/‰MOVE.W�#IOREAD,LIBRIOS-PBA(A6)‚INIT�PARM�BLOCK&‰MOVE.W�#IOPRAN,LIBRIOS-PBA+IOSOPT(A6)%‰MOVE.W�(A1),LIBRIOS-PBA+IOSRRN+2(A6))******************************************ˆREAD�LIBRARY�CORRECT�MODULE)*****************************************DOCHGRD‚IOSCALL�LIBRIOS(PC) ‰BNE‡IOERPRT*œJMP�IF�ERROR*1*************************************************(*ˆFOLLOWING�CODE�IS�TO�GET�INPUT�FOR�NEW *ˆMODULE�VERSION�REVISION�&�DESC 1************************************************* DOCHGOK‚EQU�*‰LEA�ENTCHGM(PC),A3‰LEA�ENTCHGME(PC),A4 ‰BSR�PRTIFORM‰BSR�CLEARW†CLEAR�INPUT�AREA‰IOSCALL�OUTINIOS(PC)�REC�INPUT‰BNE�IOERPRT…ERROR ‰BSR‡SBARG/*œCONVERT�LOWER�CASE�TO�UPPER�CASE�IF�NECESSARY ‰BNE‡IOERPRT*œJMP�IF�SBARG�ERROR$‰BSR�SETENDŠPUT�'CR'�AT�END�OF�INPUT%‰CMP.B�#CR,WORKBUF(A5)‚CARR�RET�INPUT‰BEQ.S�DOCHGV„YES�GET�VERSION‰LEA�WORKBUF(A5),A04‰MOVE.L�HOLDLOCM-PBA(A6),-(A7)‚SAVE�CMD�LINE�POINTER‰BSR�MODVERB…VER�NAME*œD2=LOW�ORDER�BYTE�IS�NON�ZERO‰MOVE.L�(A7)+,HOLDLOCM-PBA(A6) ‰TST.L�D0‰BMI.S…DOCHGOK4‚ERROR�TRY�AGAIN‰MOVE.B�#1,NPFLAG-PBA(A6)#‰BSR�FINDINDŠIS�NAME�IN�DIR�ALREADY+‰CLR.B�NPFLAG-PBA(A6)‰CLEAR�NO�PRT�MSG�FLAG‰TST.L�DIRF-PBA(A6)‰BEQ.S�DOCHGMVˆNO‰BSR�MODER1‹PRT�ERR�MSG DOCHGOK4: ‰BSR‡INVM_CFC!*œCHECK�FOR�CHAIN�FILE�PROCESSING‰BRA�DOCHGOKŠTRY�AGAIN* DOCHGMV‚EQU�******************************** *ˆGOOD�INPUT******************************‰LEA�LIBBUF+2(A5),A42‰MOVE.L�PREVDIRF-PBA(A6),A5†LOC�OF�MOD�NAME�IN�LIB‰LEA�MODNAM(PC),A37*******************************************************-*ˆMOVE�MODULE�NAME�TO�DATA�RECORD�&�DIRECTORY7*******************************************************‰MOVE.L�(A3),(A5)+„MOVE�TO�DIR"‰MOVE.L�(A3)+,(A4)+ƒMOVE�TO�RECORD‰MOVE.L�(A3),(A5)+‰MOVE.L�(A3)+,(A4)+‰MOVE.W�(A3),(A5)‰MOVE.W�(A3),(A4)‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDR+********************************************ˆREQUEST�VERSION�NUMBER+******************************************* DOCHGVƒEQU�**MOVE OLD VALUE TO MSG ‰CLR.L�D0‰MOVE.B�LIBBUF+12(A5),D0 ‰MOVE.L�#3,D1‰LEA�ENTCM1+4-PBA(A6),A0 ‰BSR�BINDECFJ‰LEA�ENTCM1(PC),A3‰LEA�ENTCM1E(PC),A4$‰BSR�VCHGˆGO�TO�PROC�&�VALID�ROUTINE‰TST.L�D2ˆCK�FOR�NO�RESPONSE ‰BMI.S�DOCHGR‰TST.L�D0ˆGOOD‰BMI.S�DOCHGVE‚NO'‰MOVE.B�D0,LIBBUF+12(A5)‚MOVE�TO�RECORD ‰BRA.S�DOCHGRDOCHGVE‚BSR‡INV_NTRY‰BRA�DOCHGV†TRY�AGAIN*2***************************************************ˆREQUEST�REVISION�NUMBER-********************************************* DOCHGRƒEQU�**ˆMOVE�OLD�REV�#�TO�MSG ‰CLR.L�D0‰MOVE.B�LIBBUF+13(A5),D0 ‰MOVE.L�#3,D1‰LEA�ENTCM2+4-PBA(A6),A0 ‰BSR�BINDECFJ‰LEA�ENTCM2(PC),A3‰LEA�ENTCM2E(PC),A4‰BSR�VCHGˆGO�TO�VER�&�PROC�ROUT‰TST.L�D2ˆCK�FOR�NO�RESP‰BMI.S�DOCHGD‚CONT�TO�NEXT ‰TST.L�D0‰BMI.S�DOCHGRE‚ERROR)‰MOVE.B�D0,LIBBUF+13(A5)‚MOVE�TO�DATA�REC ‰BRA.S�DOCHGDDOCHGRE‚BSR‡INV_NTRY‰BRA�DOCHGR†TRY�AGAIN**,*********************************************ˆGET�DESCRIPTION,********************************************* DOCHGDƒEQU�*‰CLR.L�D3ˆINIT%‰MOVE.B�LIBBUF(A5),D3‚GET�SIZE�OF�REC‰SUB.B�#44,D3„SUB�OFFSET$‰BLS.S�DOCHGMOV„EXIT�-�NO�DESC�EXIST‰CMP.B�#80,D3„>�THAN�80‰BCS.S�DOCHGD1!‰MOVE.B�#80,D3ƒSET�SIZE�MAX�TO�80 DOCHGD1‚EQU�**˜PRT�OLD�DESCRIPTION‰LEA�LIBBUF+44(A5),A3‰LEA�0(A3,D3),A4 ‰BSR�MSGPRT‰MOVE.L�D3,D0„VAL�TO�BE�CONV‰MOVE.L�#2,D1„REC�FIELD�SIZE‰LEA�ENTCM3C(PC),A0‚REC�LOC ‰BSR�BINDECFJ‰LEA�ENTCM3(PC),A3‰LEA�ENTCM3E(PC),A4 ‰BSR�MSGPRT‰LEA�WORKBUF(A5),A3 ‰ADD.L�D3,A3<‰MOVE.L�A3,OUTINIOS-PBA+IOSEAD(A6)‚MOVE�BUF�END�TO�PAR�BLOCK‰IOSCALL�OUTINIOS(PC) ‰BNE�IOERPRT ‰BSR‡SBARG/*œCONVERT�LOWER�CASE�TO�UPPER�CASE�IF�NECESSARY ‰BNE‡IOERPRT*œJMP�IF�SBARG�ERROR$‰BSR�SETENDŠPUT�'CR'�AT�END�OF�INPUT‰LEA‡WORKBUFE(A5),A3*‰MOVE.L�A3,OUTINIOS-PBA+IOSEAD(A6)„RESTORE*‰LEA�WORKBUF(A5),A3#‰CMP.B�#CR,(A3)‚1ST�CHAR�A�CARR�RET‰BEQ.S�DOCHGMOV‚YES�BYPASS�DESC‰LEA�LIBBUF+45(A5),A4.DOCHGDL‚MOVE.B�(A3)+,(A4)+‚MOVE�DESC�TO�BUFFER‰SUB.B�#1,D3…DEC�TOTAL�COUNT‰BEQ.S�DOCHGMOV‰CMP.B�#CR,(A3)‚AT�END%‰BEQ.S�DOCHGBLK‚GO�BLANK�REST�OF�LINE‰BRA�DOCHGDL…GET�NEXTDOCHGBLK MOVE.B #' ',(A4)+ ‰SUB.B�#1,D3 ‰BHI�DOCHGBLK*.***********************************************ˆWRITE�OUT�RECORD.**********************************************DOCHGMOV EQU *'‰TST.B�FLAGCND-PBA(A6)ƒNO�DIR�PROC�REQ?‰BNE�DOCHGND2„YES‰MOVE.W�#IOUPDR,LIBRIOS-PBA(A6)DOCHGWRT IOSCALL LIBRIOS(PC)  ‰BNE‡IOERPRT*œJMP�IF�ERROR DOCHGXƒEQU�*‰MOVE.W�#IOREAD,LIBRIOS-PBA(A6)*****‰TST.B�MORECHA-PBA(A6)ƒANY�MORE�TO�PROCESS‰BEQ.S�DOCHGEXƒNO&***************************************ˆRESTORE�COMMAND�LINE*******************************‰LEA�WORKBUF(A5),A3‰LEA�SOURBUF(A5),A4‰LEA�WORKBUFE(A5),A5DOCHGFB‚MOVE.L�(A4)+,(A3)+‰CMP.L�A3,A5…AT�END ‰BHI�DOCHGFB‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS ‰BSR�CKMORE ‰TST.B�D0 ‰BEQ�DOCHGLOP**DOCHGEX:‰CLR.W…LIBRIOS-PBA+IOSOPT(A6)!*œCLEAR�RANDOM�RECORD�READ�OPTION ‰RTS�.�RETURN‰PAGE******************************************** *ˆROUTINE�TO*’VERIFY�VERSION‚NUMBER*™REVISION�NUMBER**ˆOUTPUT'*’D2�=�NEGATIVE�VALUE�-->�NO�DATA�INPUT*)*’D1�=�NEGATIVE�VALUE�-->�ERROR�CONDITION$*—POSITIVE�VALUE�-->�CONVERTED�VALUE*)****************************************** VCHG…EQU�* ‰CLR.L�D0 ‰BSR�PRTIFORM ‰BSR�CLEARW#‰IOSCALL�OUTINIOS(PC)‚RECEIVE�INPUT‰BNE�IOERPRT…ERROR ‰BSR‡SBARG/*œCONVERT�LOWER�CASE�TO�UPPER�CASE�IF�NECESSARY ‰BNE‡IOERPRT*œJMP�IF�SBARG�ERROR$‰BSR�SETENDŠPUT�'CR'�AT�END�OF�INPUT‰CLR.L�D1ˆINIT‰MOVE.L„#-2,D2*œD2=PROCESSING�FLAG*¦-2=INITIALIZE�STATE*¦-1=PROCESSING�UNITS�POSITION*§0=PROCESSING�TENS‚POSITION*§1=PROCESSING�100'S�POSITION!*¦>1=PROCESSING�BALANCE�OF�NUMBER ‰SUB.L…#1,A0)*œA0=ADDR�OF�UNITS�POSITION�IF�DATA�INPUTV0100: ‰MOVE.L„A5,A3‰ADD.L…#WORKBUF,A3*œA3=LAST�ADDR�TO�PROCESS ‰CMP.L…A3,A0 ‰BLO.S…VCHGEX*œJMP�IF„A0�<�A3*¦NO�DATA�INPUT*¦NBR�CONVERTED‰MOVE.B„(A0),D1 ‰SUB.L…#1,A0*œA0=ADDR�PROCESS�NEXT*œD1=DIGIT�TO�PROCESS‰CMP.B…#'0',D1 ‰BCS.S…VCHGE‰CMP.B…#'9',D1 ‰BHI.S…VCHGE*œJMP�IF�DATA�NOT�IN�0-9�RANGE‰SUB.B…#$30,D1*œREMOVE�ASCII�BIAS ‰ADD.L…#1,D2)*œD2=FLAG�SETTING�FOR�POSITION�PROCESSING ‰BMI.S…V0500"*œJMP�IF�PROCESSING�UNITS�POSITION ‰BNE.S…V03000*œJMP�IF�PROCESSING�HUNDREDS�POSITION�OR�GREATER ‰MULU†#10,D1*œTENS�DIGIT�TIMES�10 ‰BRA.S…V0500*œPROCESS�TENS�DIGITV0300: ‰CMP.L…#1,D2 ‰BHI.S…V0400%*œJMP�IF�PROCESSIING�DECIMAL�POSITION*œGREATER�THAN�HUNDREDS*œD2�>�1 ‰MULU†#100,D1*œHUNDRED'S�DIGIT�TIMES�HUNDRED ‰BRA.S…V0500*œPROCESS�HUNDREDS�POSITIONV0400:‰MULU†#1000,D1V0500: ‰ADD.L…D1,D0*œD0=ACCUMULATED�VALUE ‰CMP‡#255,D0 ‰BLS.S…V0100*œJMP�IF�D0�<�OR�=�255*œCONTINUE�PROCESSING(VCHGE„MOVE.L�#-1,D0ƒSET�ERROR�INDICATION ‰ADD.L…#1,D2*œADJUST�D2�STATUSVCHGEX: ‰ADD.L…#1,D2*œADJUST�D2�STATUS ‰RTS�.�RETURN**‰PAGE*+*******************************************,*ˆPROCESS�CHANGE�WITHOUT�A�DIRECTORY�ROUTINE+******************************************** DOCHGND‚EQU�*‰MOVE.B�#1,THRUMOD-PBA(A6) ‰BSR�BLD1HAF‰CLR.B�THRUMOD-PBA(A6)&‰TST.B�BLD1END-PBA(A6)ƒWAS�END�REACHED‰BEQ.S�DOCHGND1‚NO‰CLR.B�BLD1END-PBA(A6)%**************************************ˆNO�MODULE�FOUND"********************************** ‰BSR�NOMODFND‰MOVE.W�#FHDELT,TMPFHS-PBA(A6)&***************************************ˆDELETE�TEMP�FILE'***************************************‰FHSCALL�TMPFHS(PC) ‰BNE�IOERPRT‰BSR�DOCHGEX…EXIT*"DOCHGND1 MOVE.B #1,FLAGCND-PBA(A6) ‰BRA�DOCHGOK…GO�PROC�THIS�RECORD'DOCHGND2�BSR�BLD2HAF…WRITE�REST�OF�FILE ‰BSR�RENAMLIB‰BRA�DOCHGX†CONTINUE‰PAGE4*****************************************************%*ˆROUTINE�TO�DRIVE�THE�DELETE�COMMAND*4**************************************************** DODEL„EQU�*,‰TST.B�LIBPREV-PBA(A6)ƒDID�OLD�LIBRARY�EXIST‰BNE.S�DODEL1„YES‰BSR�NOLIB‡PRINT�ERROR�MSG‰BRA.S„DODELEX DODEL1ƒEQU�*‰BTST�#0,D0†WAS�MOD�NAME�GIVEN‰BEQ.S�DODEL2„YES‰BSR�MODMIS†PRINT�ERROR‰BRA.S�DODELEX* DODEL2ƒEQU�*0‰MOVE.L�HOLDLOCM-PBA(A6),A0‚GET�MOD�POINTER�ADDR‰BSR�MODVERB…VALIDATE�MOD�NAME*œD2=LOW�ORDER�BYTE�IS�NON�ZERO‰TST.L�D0ˆGOOD‰BMI.S…DODEL5…NO1‰MOVE.L�A0,HOLDLOCM-PBA(A6)ƒSAVE�CMD�LINE�POINTER ‰BSR‡X30000*œEDIT�FOR�NULL�DIRECTORY&‰TST.B�DIREXIST-PBA(A6)‚DOES�DIR�EXIST‰BEQ.S�DODEL3„NO ‰BSR�FINDIND ‰TST.L�DIRF-PBA(A6)ƒMODULE�FOUND‰BNE.S�DODEL3„GOOD ‰BRA.S�DODEL5ƒERROR*DODELER1 EQU * ‰BSR�INVALER ‰BRA.S�DODEL5* DODEL3ƒEQU�*4‰MOVE.B�#1,THRUMOD-PBA(A6)‚SET�SWITCH�COPY�TO�MODULE‰BSR�BLD1HAF…COPY�1ST�HALF‰BSR.S�BYPASS†SKIP�PAST�MODULE!‰TST.B�FILEND-PBA(A6)„END�REACHED‰BNE.S�DODEL4„YES!‰BSR�BLD2HAF…COPY�REST�OF�LIBRARY DODEL4ƒEQU�* ‰BSR�RENAMLIB‰BSR.S�DELFMDIR8‰MOVE.B�#1,DIRCHG-PBA(A6)…SEG�FLAG�DIRECTORY�HAS�CHANGED4‰CLR.W�TOTMOD-PBA(A6)„TOTMOD�HAS�CHANGED�SO�RESET�IT‰LEA�DELNAM(PC),A4 ‰BSR�MOVMOD‰LEA�DELMSG(PC),A3‰LEA�DELMSGE(PC),A4 ‰BSR�MSGPRT DODEL5ƒEQU�* ‰BSR�CKMORE‰BNE.S�DODELEXƒNO�MORE ‰BSR�REWINDL ‰BRA�DODEL2DODELEX‚RTS�.�RETURN‰PAGE7********************************************************+*ˆROUTINE�TO�BYPASS�A�MODULE�IN�THE�LIBRARY2*ˆIF�END�OF�FILE�IS�ENCOUNTERED�THE�FLAG�FILEND�IS *ˆSET�TO�A�1*7******************************************************** BYPASSƒEQU�*‰LEA�LIBBUF(A5),A5ƒINIT�POINTERBYPASSR‚IOSCALL�LIBRIOS(PC)‰BEQ.S�BYPASS2‰CMP.B�#ISTAEOF,D0‚AT�END ‰BNE‡IOERPRT*œJMP�IF�ERROR�OTHER�THAN�EOF:BYPASSEND�MOVE.B�#1,FILEND-PBA(A6)‚SET�END�OF�FILE�REACHED‰BRA.S�BYPASSEX*BYPASS2‚MOVE.W�(A5),D3‚GET�TYPE‰CMP.B�#'1',D3ƒTYPE�1‰BNE�BYPASSR…NO(‰LEA�2(A5),A0„SET�FOR�VERIFY�OF�MOD�NAME‰BSR�MODVER†GO�VERIFY‰TST.B�D0ˆGOOD‰BNE�BYPASSR…NO‰CLR.B�FILEND-PBA(A6)* BYPASSEX:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS ‰RTS�.�RETURN*******9**********************************************************@*ˆROUTINE�TO�DELETE�THE�MODULE�NAME�IN�MODNAM�FROM�THE�DIRECTORY*8*********************************************************DELFMDIR EQU **‰TST.B�DIREXIST-PBA(A6)‚DOES�THE�DIR�EXIST‰BEQ.S�DELFMEXƒNO‰BSR�FINDIND…FIND�IN�DIR ‰TST.L�DIRF-PBA(A6)†WAS�IT�FOUND‰BEQ.S�DELFMEXƒNO‰MOVE.L�DIRF-PBA(A6),A3‰MOVE.L�#'„',(A3)+‰MOVE.L�#'„',(A3)+‰MOVE.L�#'‚',(A3)DELFMEX‚RTSŒ.�RETURN‰PAGE/************************************************&*ˆTHIS�ROUTINE�WILL�TAKE�A�MODULE�FROM$*ˆTHE�LIBRARY�FILE�AND�CREATE�A�FILE0*ˆCONTAINING�THIS�MODULE�USING�THE�NAME�SUPPLIED*/************************************************ DOCOPYƒEQU�*$‰BTST�#0,D0‚ANYTHING�IN�COMMAND�LINE‰BEQ.S�DOCOPY1ˆYES DOCOPYER:‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS ‰BSR�INVALERDOCOPERX BSR FCOMMA ‰BRA�DOCOPYCL,DOCOPY1‚TST.B�LIBPREV-PBA(A6)„DOES�LIB�EXIST‰BNE.S�DOCOPYOK‚YES‰BSR�NOLIB‚PRT�ERR�MSG ‰BRA�DOCOPYEX*0DOCOPYOK�MOVE.L�HOLDLOCM-PBA(A6),A0ƒINIT�POINTERDOCOPYL‚LEA�SOURFHS(PC),A6 ‰BSR�INITDSK ‰BSR�EDITFILE ‰BMI�DOCOPYER'‰CMP.B�#SLASH,D1‚WAS�TERMINATOR�A�SLASH‰BNE�DOCOPYER„NO‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS(‰MOVE.L�A0,HOLDLOCM-PBA(A6)ƒSAVE�POINTER*‰BSR�MODVERBŠVERIFY�MOD�NAME*œD2=LOW�ORDER�BYTE�IS�NON�ZERO‰TST.L�D0ˆGOOD‰BMI‡DOCOPERX…NO%‰TST.B�DIRCHG-PBA(A6)„HAS�DIR�CHANGED‰BEQ.S�DOCOPY2A‚NO‰BSR�BUILDDIR„REBUILD�DIR DOCOPY2A: ‰BSR‡X30000*œEDIT�FOR�NULL�DIRECTORY ‰BSR�FINDIND‰TST.L�DIRF-PBA(A6)ƒFOUND ‰BEQ�DOCOPYCLD‰MOVE.W�#FHALLO+FHASGN,SOURFHS-PBA(A6)‚ALLOCATE�&�ASSIGN�OUTPUT�FILE+‰AND.W�#$FFFF-FFTBIT,SOURFHS-PBA+FHSOPT(A6)$‰OR.W�#FOPSEQ,SOURFHS-PBA+FHSOPT(A6)‰CLR.L�SOURFHS-PBA+FHSSIZ(A6)#‰MOVE.W�#256,SOURFHS-PBA+FHSLRL(A6)‰FHSCALL�SOURFHS(PC)‰BEQ.S�DOCOPY3AˆGOOD ‰CMP.B�#5,D07‰BNE�IOERPRT‰JMP�IF�ERROR�OTHER�THAN�FILE�ALREADY�EXIST ‰BSR‡X10000*œCALL�MSG�PRGM ‰BRA�DOCOPYCLDOCOPY3A EQU *‰MOVE.W�#IOWRIT,SOURIOS-PBA(A6)‰MOVE.W�#IOREAD,LIBRIOS-PBA(A6)‰LEA‡LIBBUF(A5),A0‰MOVE.L�A0,SOURSAD-PBA(A6)‰LEA‡LIBBUFE(A5),A0‰MOVE.L�A0,SOUREAD-PBA(A6)‰TST.B�DIREXIST-PBA(A6)‰BEQ.S�DOCOPYM&‰MOVE.W�#IOPRAN,LIBRIOS-PBA+IOSOPT(A6)%‰MOVE.W�(A1),LIBRIOS-PBA+IOSRRN+2(A6)*,*********************************************ˆDO�RANDOM�READ,********************************************‰IOSCALL�LIBRIOS(PC) ‰BNE�IOERPRT+‰AND.W�#$FFFF-IOPPOS,LIBRIOS-PBA+IOSOPT(A6)$‰OR.W�#IOPNXT,LIBRIOS-PBA+IOSOPT(A6)‰CLR.W�LIBRIOS-PBA+IOSRRN(A6)*ˆMOVE�MOD�NAME�TO�MSG DOCOPYM‚EQU�*‰LEA�LIBBUF+2(A5),A3  'NR!Q)K1T9UAVI\QSYQaPiDqLyC�E‰V‘N™Y¡T©_±`¹JÁIÉWÑcÙná8‰LEA�COPSUC1(PC),A4‰MOVE�(A3)+,(A4)+‰MOVE.L�(A3)+,(A4)+‰MOVE.W�(A3),(A4)*ˆWRITE�TO�FILEDOCOPYW:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS‰IOSCALL�SOURIOS(PC) ‰BNE‡IOERPRT*œJMP�IF�ERROR DOCOPYR‚EQU�**ˆDO�READ�NEXT�CALL‰IOSCALL�LIBRIOS(PC)‰BEQ.S�DOCOPY4ƒGOOD"‰CMP.B�#ISTAEOF,D0‚END�OF�FILE�SET‰BEQ.S�DOCOPYPƒYES�OK ‰BRA‡IOERPRT DOCOPY4‚EQU�*‰LEA�LIBBUF(A5),A5‰CMP.B�#'1',1(A5)�TYPE�1�RECORD‰BNE�DOCOPYW…NO�-�GO�WRITE�IT‰LEA�2(A5),A0„INIT�POINTER‰BSR�MODVER†IS�THIS�A�MODNAME‰TST.B�D0ˆFOUND‰BNE�DOCOPYW…NO‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS DOCOPYP‚EQU�**ˆDONE*ˆPRINT�SUCCESS�MESSAGE‰LEA�COPSUCM(PC),A3‰LEA�COPSUCME(PC),A4 ‰BSR�MSGPRTDOCOPYCL EQU * ‰BSR�CLOSSOUR ‰BSR�CKMORE‰BEQ�DOCOPYL„GET�NEXTDOCOPYEX EQU *‰LEA‡SOURBUF(A5),A3+‰MOVE.L�A3,SOURSAD-PBA(A6)‚RESET�PARM�BLOCK‰LEA‡SOURBUFE(A5),A3‰MOVE.L�A3,SOUREAD-PBA(A6) ‰RTS�.�RETURN‰PAGE3****************************************************'*ˆTHIS�IS�THE�LIST�COMMAND�DRIVER�BLOCK+*ˆTHE�LIST�COMMAND�WILL�PRINT�SELECTED�INFO1*ˆNAME,�VERSION,�REVISION,�LANGUAGE�&�DESCRIPTION,*ˆABOUT�SELECT�OR�ALL�MODULES�IN�THE�LIBRARY*3**************************************************** DOLISTƒEQU�*&‰CLR.B�FLAGH-PBA(A6)…CLEAR�HEADER�FLAG,‰TST.B�LIBPREV-PBA(A6)ƒWAS�LIB�FILE�ASSIGNED‰BNE.S�LISTOK„YES‰BSR�NOLIB‡PRINT�MSG ‰BRA�LISTEX LISTOKƒEQU�*+‰LEA�LIBBUF(A5),A5ƒINIT�POINTER�FOR�LIB�BUF‰BTST�#0,D0‡NO�DATA�BIT�ON‰BNE.SƒLISTALL…YES*.***********************************************ˆLIST�A�SPECIFIC�MODULE'*ˆA0�MUST�POINT�AT�START�OF�MODULE�NAME.**********************************************"LISTONE‚MOVE.L�HOLDLOCM-PBA(A6),A0"‰CLR.L�D2ˆCLEAR�PRINT�ERR�MSG�FLAG‰BSR�MODVERB†VERIFY�MODULE�NAME ‰TST.L�D0‰BMI.S�LISTER1�NOT�VALID‰TST.L�D1ˆANY�THING�IN�LINE‰BEQ�LISTEX…NO0‰TST.B�DIREXIST-PBA(A6)‚DOES�THE�DIRECTORY�EXIST‰BEQ.S�LISTONEAƒNO* USEDIRƒEQU�**)‰TST.B�DIRCHG-PBA(A6)„HAS�THE�DIR�CHANGED‰BEQ.S�USEDIR1ƒNO‰BSR�BUILDDIR„GO�BUILD�ITUSEDIR1‚BSR�FINDIND‰TST.L�DIRF-PBA(A6) ‰BNE.S�USEGET ‰BSR�CKMORE ‰BEQ�LISTONE ‰BRA�LISTEX*LISTER1‚BSR�PRTMODM ‰BRA.S�LISTCM0************************************************&*ˆSET�UP�TO�DO�RANDOM�READ�OF�LIB�FILE0*************************************************,USEGETƒMOVE.W�#IOPRAN,LIBRIOS-PBA+IOSOPT(A6)5‰MOVE.W�(A1),LIBRIOS-PBA+IOSRRN+2(A6)‚MOVE�RAN�SECT�#‰IOSCALL�LIBRIOS(PC) ‰BNE�IOERPRT‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDR‰LEA�LIBBUF(A5),A5 ‰BRA.S�LISTPRLISTONEA‚EQU�*)‰CLR.B�RLMSG-PBA(A6)…CLEAR�PRINT�MSG�FLAG ‰BSR�READLIB‰TST.L�D0ˆGOOD‰BMI�LISTER1…NO LISTPRƒEQU�* ‰BSR�PRINTMOD LISTCMƒEQU�* ‰BSR�CKMORE‰BNE.S�LISTPRTM‰MOVE.B�#1,PASSS2-PBA(A6) ‰BRA�LISTONE*.********************************************** *LIST ALL MODULES IN THE LIBRARY-********************************************** LISTALL‚EQU�*"‰CLR.W�TOTMOD-PBA(A6)„INIT�COUNTER1‰AND.W�#$FFFF-IOPPOS,LIBRIOS-PBA+IOSOPT(A6)ƒCLEAR9‰OR.W�#IOPNXT,LIBRIOS-PBA+IOSOPT(A6)‚SET�READ�NEXT�OPTION2‰CLR.L�LIBRIOS-PBA+IOSRRN(A6)‚CLEAR�SECTOR�ADDRESS*LISTALLR�IOSCALL�LIBRIOS(PC)‚READ�LIB�FILE‰BEQ.S�LISTALL2‚GOOD‰CMP.B�#ISTAEOF,D0‚END�OF�FILE‰BEQ.S�LISTPRTM†YES‰BRA�IOERPRT…ERRORLISTALL2 EQU *‰CMP.B�#'1',1(A5)‚TYPE�1�HEADER‰BNE�LISTALLR„NO ‰LEA�2(A5),A0‰BSR�MODVER†VERIFY�MOD�NAME ‰TST.L�D0 ‰BNE�LISTALLR4‰ADD.W�#1,TOTMOD-PBA(A6)‚COUNT�OF�MODULES�IN�LIBRARY ‰BSR�PRINTMOD ‰BRA�LISTALLR* LISTPRTM: ‰CLR.L�D0-‰MOVE.W�TOTMOD-PBA(A6),D0‚INIT�FOR�CONVERSION‰MOVE.L�#4,D1„SIZE!‰LEA�PRTTOTN(PC),A0‚RECEIVE�FIELD‰BSR�BINDECFJ„CONV�TO�ASCII‰LEA‡PRTTOTM(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A6)‰LEA‡PRTTOTME(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSEAD(A6  )‰IOSCALL�OUT3IOS(PC) ‰BNE‡IOERPRT*œJMP�IF�ERROR ‰BSR‡CLR_DET*œCLEAR�THE�DETAIL�LINE‰LEA‡LISTDATA(PC),A1%*œA1=ADDR�EXPAND�FILE�DESCRIPTOR�INTO‰LEA‡LIBFHS+FHSVOL-PBA(A6),A0)*œA0=ADDRESS�FO�FILE�DESCRIPTOR�TO�EXPAND ‰BSR‡X71700*œEXPAND�THE�FILE�DESCRIPTOR‰LEA‡LISTDATA(PC),A0 ‰MOVE.L„A0,A1+*œA0=A1=RESPECTIVELY�-�ADDRESS�MOVE�FROM/TO‰MOVE.L„#$4020001E,D0*œD0=SPECIFIC�CHARACTER�REMOVAL*ŸREMOVAL�CHARACATER�=�SPACE *ŸNUMBER�OF�CHARACTER�TO�EXAMINE ‰BSR‡X70800*œCOMPRESS�FILE�DESCRIPTOR ‰BSR‡PM_06004*œSPACE�FILL�BALANCE�OF�BUFFER�FOR�START/END�ADDRESS *œTHE�SAME ‰BSR‡PRTDET*œOUTPUT�THE�LIBRARY�FILE�NAME ‰BSR‡CLR_DET*œCLEAR�THE�DETAIL�LINELISTEX:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDR‰CLR.B�PASSS2-PBA(A6) ‰RTS�.�RETURN****‰PAGE*.***********************************************'*ˆROUTINE�TO�BUILD�THE�DIRECTORY�DIRLIB*ˆUSE�REG�D0�D3�D4�D5�A5�A6* *ˆROUTINE�TO*’READ�THE�INPUT�LIBRARY�FILE#*’AND�MOVE�THE�REQUIRED�DATA�TO�THE%*’WORK�BUFFER�'DIRLIB'�DEFINED�IN�THE*’ATTATCHED�SEGMENT8*’EACH�ENTRY�CONTAINS�THE�10�CHARACTER�NAME�PLUS�2�BYTES.*œIDENTIFYING�WHERE�THIS�ENTRY�IS�IN�THE�INPUT *œLIBRARY.**********************************************BUILDDIR EQU *&‰MOVEM.L�A3/D1,-(A7)‚SAVE�REG�ON�STACK ‰MOVE.L„A6,A3*œA3=PROGRAM�BASE�ADDRESS%‰MOVE.L„DIRLOC-PBA(A6),DIREND-PBA(A6)-*œFORCE�START�AND�END�ADDRESS�OF�DIRLIB�EQUAL‰TST.B�LIBPREV-PBA(A3) ‰BEQ�BUILDEX'*œJMP�IF�AN�INPUT�FILE�WAS�NOT�ASSIGNEDB‰CLR.W�TOTMOD-PBA(A3)‚INIT�COUNTER�FOR�TOTAL�NBR�MODULES�IN�LIBARY(‰LEA�DIRLIB(A5),A6ƒINIT�AT�DIR�BUF�START"‰LEA�DIRLIBE(A5),A4‚END�OF�DIR�BUF#‰LEA�LIBBUF(A5),A5ƒSTART�OF�LIB�BUF‰MOVE.L�#-1,D6#BUILDRƒIOSCALL�LIBRIOS(PC)�READ�LIB‰BEQ.S�BUILD1„GOODB‰CMP.B�#ISTAEOF,D0‚JMP�IF�EOF‚-�LAST�RECD�IN�LIBRARY�HAS�BEEN�READ‰BEQ.S�BUILDEND‰BRA�IOERPRT…ERROR BUILD1ƒEQU�*‰ADD.L�#1,D6…INC�SECTOR�COUNT‰CMP.B�#'1',1(A5)&‰BNE�BUILDRˆJMP�IF�NOT�A�TYPE�1�RECORD‰LEA�2(A5),A0„INIT ‰BSR�MODVER‰TST.B�D0ˆGOOD‰BNE�BUILDR†NO‰BCLRW…#0,LIB_FLG1-PBA(A3)"*œSET�FLAG�-�HOUSEKEEPING�FUNCTION4‰ADD.W�#1,TOTMOD-PBA(A3)�ADD�FOR�MODULE�COUNT�IN�LIB‰CLR.B�LIBGOOD-PBA(A3)%‰MOVEM.L�D3-D5,(A6)‚MOVE�TO�DIRECTORY‰ADD.L�#10,A6„POS�POINTER%‰MOVE.W�D6,(A6)+‚MOVE�IN�SECTOR�COUNT‰CMP.L�A6,A4‚AT�END ‰BHI�BUILDR*ˆDIRECTORY�IF�FULL#‰MOVE.B�#1,DIRFULL-PBA(A3)‚SET�FLAG*ˆWAS�REQUEST�NO�DIR�OPT�SET$‰TST.B�DIROPT-PBA(A3)„NO�LIB�OPT�SET‰BEQ.S�BUILDEXƒYES#‰BSR�LIBFULRT„PRT�LIBRARTY�FULL�MSG‰BRA.S�BUILDEXBUILDEND TST.B LIBGOOD-PBA(A3) ‰BEQ.S�BUILD2 ‰MOVE.L„A3,A6*œA6=PBA ‰BSR�NOID‰BSETW…#0,LIB_FLG1-PBA(A6)-*œSET�FLAG�-�NO�ID�MESSAGE�HAS�BEEN�DISPLAYED‰BRA.S�BUILDEX!BUILD2ƒMOVE.B�#1,DIREXIST-PBA(A3)‰MOVE.L�A6,DIREND-PBA(A3)1*************************************************!*ˆRESET�FILE�POINTER�TO�BEGINNING1************************************************* ‰CLR.B�DIRCHG-PBA(A3)„CLEAR�FLAG ‰BSR�REWINDL-*œFORCE�CURRENT�RECD�POINTER�TO�START�OF�FILEBUILDEX:‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS)‰MOVEM.L�(A7)+,D1/A3‚RESET�REG�FROM�STACK‰RTS�.�RETURN�FROM�BUILDDIR‰PAGE-********************************************** *ˆROUTINE�TO"*’FIND�THE�MODULE�IN�THE�DIRECTORY*ˆINPUT&*’MODNAM�-�CONTAINS�MODULE�TO�BE�FOUND**ˆOUTPUT*’FOUND)*œDIRF�-�CONTAINS�ADDRESS�OF�MODULE�FOUND*£IN�DIR-*œA1ƒ-�CONTAINS�ADDRESS�OF�LOGICAL�SECTOR�NBR*.*œDIRF�-�CONTAINS�-1�IF�MODULE�FOUND�IN�LIBBUF*-********************************************** FINDIND‚EQU�*0‰CLR.L�DIRF-PBA(A6)†INIT�FLAG�TO�NOT�FOUND�STATE&‰TST.B�DIREXIST-PBA(A6)‡DOES�DIR�EXIST‰BNE.S�FINDIRD2‡YES‰BSR.S�FININLIB ‰BRA.S�DIREX*FINDIRD2 EQU *‰MOVE.L�DIRLOC-PBA(A6),A1ƒSTART‰MOVE.L�DIREND-PBA(A6),A2„END.‰MOVEM.L�MODNAM-PBA(A6),D3-D5‚SAVE�MODULE�NAME‰SWAP�D5‰BRA.S…DIRCKEND*œINITIATE�LOOPDIRD3„CMP.L�(A1)+,D3 ‰BEQ.S�DIRD4 ‰ADD.L�#8,A1‰BRA.S�DIRCKENDDIRD4„CMP.L�(A1)+,D4 ‰BEQ.S�DIRD5 ‰ADD.L  �#4,A1‰BRA.S�DIRCKENDDIRD5„CMP.W�(A1)+,D5 ‰BNE.S�DIR6‰SUB.L�#10,A1„RESET‰MOVE.L�A1,DIRF-PBA(A6) ‰ADD.L�#10,A1 ‰BRA.S�DIREX DIR6…EQU�* ‰ADD.L�#2,A1DIRCKEND�CMP.L�A1,A2…AT�END ‰BHI�DIRD3‡NO%‰TST.B�NPFLAG-PBA(A6)„NO�PRT�FLAG�SET ‰BNE.S�DIREX ‰TST.B�AFLAG-PBA(A6)…ADD�COMMAND!‰BNE.S�DIREX…YES�BYPASS�ERROR�MSG ‰BSR�NOMODFNDDIREX„RTSˆ.�RETURN‰PAGE*6*******************************************************:*ˆTHIS�ROUTINE�WILL�WALK�THE�LIBRARY�FOR�A�MATCH�ON�NODNAM)*ˆBECAUSE�THERE�WAS�NO�DIRECTORY�TO�CHECK6*ˆA�-1�IN�DIRF�MEANS�THE�MODULE�WAS�FOUND�AND�THE�FILE*ˆIS�IN�THE�LIBBUF*7********************************************************FININLIB EQU *‰BSR�REWINDLŠREWIND�LIB+‰AND.W�#$FFFF-IOPPOS,LIBRIOS-PBA+IOSOPT(A6)*‰OR.W�#IOPNXT,LIBRIOS-PBA(A6)ƒSET�FOR�NEXT‰LEA�LIBBUF(A5),A5#FININRƒIOSCALL�LIBRIOS(PC)‚READ�LIB‰BEQ.S�FININL1ˆGOOD‰CMP.B�#ISTAEOF,D0„AT�END ‰BNE�IOERPRT‰BRA.S�FININEXŠEXIT#FININL1‚CMP.B�#'1',1(A5)…TYPE�1�REC‰BNE�FININR‹NO ‰LEA�2(A5),A0‰BSR�MODVER‹CK�FOR�MOD ‰TST.B�D0 ‰BNE�FININR ‰CMP.L�MODNAM-PBA(A6),D3†CK�NAME ‰BNE�FININR‰CMP.L�MODNAM+4-PBA(A6),D4 ‰BNE�FININR‰SWAP�D5‰CMP.W�MODNAM+8-PBA(A6),D5 ‰BNE�FININR!**********************************ˆFOUND�THE�RECORD!*********************************!‰MOVE.L�#-1,DIRF-PBA(A6)†SET�FLAGFININEX:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS ‰RTSˆ.�RETURN*‰PAGE3****************************************************>*ˆTHIS�ROUTINE�WILL�GET�AN�IDENTIFICATION�RECORD�'31'�(TYPE�1)1*ˆ&�MATCH�THE�MODULE�NAME�WITH�THE�NAME�IN�MODNAM(*ˆIF�MATCH�FOUND�D0�=�0�OTHERWISE�D0�=�1*4***************************************************** READLIB‚EQU�* ‰MOVE.L�#-1,D6ƒINIT�SECTOR�COUNTREADLIB1�EQU�*‰IOSCALL�LIBRIOS(PC)‰BEQ.S�READLGO‰CMP.B�#ISTAEOF,D0‚END�OF�FILE‰BNE�IOERPRT…NO‰TST.B�PASSS2-PBA(A6) ‰BEQ.S�NOMOD ‰BSR�REWINDL‰CLR.B�PASSS2-PBA(A6)‰CLR.W�SECTCNT-PBA(A6) ‰BRA�READLIB NOMOD„EQU�*+‰TST.B�RLMSG-PBA(A6)…PRINT�MSG�NO�MOD�FOUND ‰BNE.S�NOMOD1 ‰BSR�NOMODFND NOMOD1ƒEQU�* ‰MOVE.L�#1,D0‰BRA.S�READLEXREADLGO:‰LEA�LIBBUFE(A5),A6‰LEA�LIBBUF(A5),A5‰ADD.W�#1,D6…INC�SECTOR�# ‰CMP.B�#'1',1(A5)‚CK�RECORD�TYPE ‰BEQ.S�READID ‰BRA�READLIB1 READIDƒEQU�*‰LEA�2(A5),A0„INIT8‰BSR�MODVER†GO�VERIFY�MODULE�WILL�LEAVE�MODNAME�IN�D3-D5 ‰TST.L�D0ˆOK ‰BNE�READLIB1‰SWAP�D5*(*ˆCHECK�MODULE�NAME�FOR�MATCH�WITH�INPUT*‰CMP.L�MODNAM-PBA(A6),D3 ‰BNE�READLIB1‰CMP.L�MODNAM+4-PBA(A6),D4 ‰BNE�READLIB1‰CMP.W�MODNAM+8-PBA(A6),D5 ‰BNE�READLIB1‰CLR.L�D0ˆSET�FOUNDREADLEX:‰MOVE.L„AS_ADDR-PBA(A6),A5*œA5=ALLOCATED�SEGMENT�ADDRESS‰RTS�.�RETURN�FROM�READLIB‰PAGE5******************************************************;*ˆTHIS�ROUTINE�PRINTS�THE�MODULE�DATA�FROM�THE�LIST�COMMAND*ˆA5�POINTS�AT�START�OF�RECORD*5******************************************************PRINTMOD EQU * ‰LEA�2(A5),A3'****************************************ˆMOVE�MODULE�NAME'***************************************‰MOVE.L�(A3)+,LISTMOD-PBA(A6)‰MOVE.L�(A3)+,LISTMOD+4-PBA(A6)‰MOVE.W�(A3)+,LISTMOD+8-PBA(A6) *ˆVERSION�# ‰CLR.L�D0‰MOVE.B�(A3)+,D0‰MOVE.L�#3,D1„REC�SIZE‰LEA�LISTVER(PC),A0 ‰BSR�BINDECFJ******************************************** *ˆREVISION�#*******************************************‰MOVE.B�(A3)+,D0 ‰MOVE.L�#3,D1‰LEA�LISTREV(PC),A0 ‰BSR�BINDECFJ‰MOVE.B�(A3)+,LISTLANG-PBA(A6)‰MOVE.L„A3,-(A7)*œA3=ADDR�OF�VOLUME�NAME*,*********************************************ˆDESCRIPTION�UP�TO�50�CHAR,********************************************‰LEA�LISTDESC(PC),A1 ‰LEA�LISTDESE(PC),A2‚END�OF�DESC‰ADD.L�#30,A3„POSIT�TO�DESC‰MOVE.B�(A5),D0‚GET�REC�SIZE‰SUB.B�#44,D0�SUB�OFFSET ‰BLS.S�PRINTMS…BR�NO�DESCRIPTION‰CMP.B�#50,D0„>�THAN�50‰BCS.S�PRINTMM‰MOVE.B�#50,D0 PRINTMM‚EQU�*‰MOVE.B�(A3)+,(A1)+ ‰SUB.B�#1,D0 ‰BNE�PRINTMMPRINTMS‚CMP.L�A1,A2…AT�END‰BCS.S�PRINTIT„YES‰MOVE.B�#SPACE,(A1)+ ‰BRA�PRINTMS*PRINTIT‚TST.B�FLAGH-PBA(A6)‰BNE.S  �PRINTDET.‰MOVE.B�#1,FLAGH-PBA(A6)�TURN�OFF�PRINT�HEADER ‰BSRƒPRTTITLPRINTDET�BSR‡PRTDET ‰BSR‡CLR_DET*œCLEAR�THE�DETAIL�LINE‰LEA‡LISTDESC+2-PBA(A6),A1*œA1=ADDR�MOVE�TO‰MOVE.L„#'SOUR',(A1)+‰MOVE.L„#'CE�F',(A1)+‰MOVE.L„#'ILE�',(A1)+‰MOVE.W„#':�',(A1)++*œMOVE�'SOURCE�FILE�:�'�TO�DESTINATION�ADDR‰MOVE.L„(A7)+,A0&*œA0=ADDR�OF�FILE�DESCRIPTOR�TO�EXPAND‰MOVE.L„A1,-(A7)*œA1=ADDR�TO�EXPAND�INTO ‰BSR‡X71700*œEXPAND�FILE�DESCRIPTOR‰MOVE.L„(A7)+,A1*œA1=ADDRESS�MOVE�TO‰MOVE.L„A0,-(A7)$*œA0=ADDRESS�OF�MODULE�CREATION�TIME ‰MOVE.L„A1,A0*œA0=ADDRESS�MOVE�FROM‰MOVE.L„#$4020001E,D0*œD0=SPECIFIC�CHTR�REMOVAL�FLAG*ŸCHTR�TO�REMVOE�=�SPACE*ŸNBR�CHTRS�TO�EXAMINE�=�30 ‰BSR‡X70800-*œREMOVE�EMBEDDED�SPACES�FROM�FILE�DESCRIPTOR ‰BSR‡PM_0600*œSPACE�FILL�BALANCE�OF�BUFFER ‰BSR.S…PRTDET*œOUTPUT�SOURCE�FILE�DATA ‰BSR‡CLR_DET*œCLEAR�THE�DETAIL�LINE‰MOVE.L„(A7)+,A3*œA3=ADDR�MODULE�CREATION�TIME‰LEA‡LISTDESC+2-PBA(A6),A0*œA0=ADDR�MOVE�TO‰MOVE.L„#'CREA',(A0)+‰MOVE.L„#'TION',(A0)+‰MOVE.L„#'�T/D',(A0)+‰MOVE.W„#':�',(A0)+-*œMOVE�'CREATION�T/D:'�TO�DESTINATION�ADDRESS ‰MOVE.B„#6,D4*œD4=LOOP�CONTROLPM_0100:*œA0=ADDR�MOVE�TO ‰MOVE.L„#2,D1*œD1=NUMBER�OF�CHTRS�TO�CONVERT ‰CLR.L…D0‰MOVE.B„(A3)+,D0*œD0=VALUE�TO�CONVERT ‰BSR‡BINHEX*œCONVERT�TO�HEX�ASCII ‰TST.B…(A2)+ ‰MOVE.L„A2,A0"*œA0=ADDRESS�NEXT�LOCATION�MOVE�TO‰CMP.B…#'�',-2(A0)‰BNE.S…PM_0110!*œJMP�IF�NOT�LEAD�SPACE�CHARACTER‰MOVE.B„#'0',-2(A0)#*œREPLACE�LEAD�SPACE�WITH�LEAD�ZEROPM_0110: ‰CMP.B…#4,D4‰BHI.S…PM_0300*œJMP�IF�LOOP�CONTROL�=�5�OR�6‰BEQ.S…PM_0400*œJMP�IF�LOOP�CONTROL�=�4 ‰CMP.B…#1,D4‰BNE.S…PM_0500*œJMP�IF�LOOP�CONTROL�=�2�OR�3PM_0200: ‰SUB.B…#1,D4‰BNE.S…PM_0100*œRETURN�TO�LOOP�IF�MORE ‰BSR.S…PRTDET*œ*�PRINT�CREATION�TIME/DATE ‰RTS�.�RETURN*PRTDET:‰LEA‡LISTDATA(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A6)‰LEA‡LISTDESE(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSEAD(A6)‰IOSCALL�OUT3IOS(PC) ‰BNE�IOERPRT ‰RTSŒ.�RETURN*PRTTITL:‰LEA‡BUFFIN(PC),A0#*œA0=ADDRESS�OF�16�BYTE�WORK�BUFFER ‰BSR‡X70000*œGET�ASCII�SYSTEM�TIME/DATE‰LEA‡LT_DATE(PC),A1*œA1=ADDR�MOVE�TO ‰MOVE.L„#8,D0*œD0=NUMBER�BYTES�TO�MVE ‰BSR‡X70800*œMOVE�CURRENT�DATE‰LEA‡LT_TIME(PC),A1*œA1=ADDR�MOVE�TO ‰MOVE.L„#8,D0*œD0=NUMBER�BYTES�TO�MOVE ‰BSR‡X70800*œMOVE�CURRENT�TIME‰LEA‡LISTTITL(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A6)‰LEA‡LISTTITE(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSEAD(A6)‰IOSCALL�OUT3IOS(PC) ‰BNE�IOERPRT ‰RTS�.�RETURNPM_0300:‰MOVE.B„#':',(A0)+*œMOVE�TIME�SEPARATOR‰BRA.S…PM_0200PM_0400:‰MOVE.B„#'�',(A0)+‰MOVE.B„#'�',(A0)+*œMOVE�TIME�/�DATE�SEPERATOR‰BRA.S…PM_0200PM_0500:‰MOVE.B„#'/',(A0)+*œMOVE�DATE�SEPERATOR‰BRA.S…PM_0200PM_0600:‰LEA‡LISTDESE(PC),A0/*œA0=ENDING�ADDRESS�WHERE�FILE�DESCIRPTOR�IS�ATPM_0700: ‰CMP.L…A0,A1‰BHI.S…PM_0800*œJMP�IF�LOOP�COMPLETE‰MOVE.B„#'�',(A1)+*œSPACE�FILL�BALANCE�OF�BUFFER‰BRA.S…PM_0700*œRETURN�TO�MAIN�LOOPPM_0800:‰RTS‰PAGE*5****************************************************** *ˆROUTINE�TO�REWIND�LIBRARY�FILE*5******************************************************REWINDL:‰MOVE.L„A6,-(A7) *œSAVE�REG‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS ‰TST.B�LIBPREV-PBA(A6)�LIB�EXIST‰BEQ.S�REWINDEX*œJMP�IF�LIBRARY�DOES�NOT�EXIST‰MOVE.W�#IOREWD,LIBRIOS-PBA(A6))*œFORCE�CURRENT�RECD�POINTER�TO�BE�SET�AT*œBEGINNING�OF�FILE+‰AND.W…#$FFFF-IOPPOS,LIBRIOS-PBA+IOSOPT(A6)1*œREMOVE�THE�POSITION�BITS�FROM�THE�OPTIONS�FIELD‰IOSCALL�LIBRIOS(PC) ‰BNE�IOERPRT‰MOVE.W�#IOREAD,LIBRIOS-PBA(A6) REWINDEX:‰MOVE.L„(A7)+,A6 *œRESTORE�REG ‰RTS�.�RETURN‰PAGE9**********************************************************#*ˆROUTINE�TO�VERIFY�THE�MODULE�NAME*ˆUSED�WITH�COMMAND�LINE�INPUT?*ˆUPON�ENTERING�THIS�ROUTINE�A0�MUST�POINT�AT�MODULE�NAME�START*‰REGISTERS�USED�A0�A2�A3�D0�D1*ˆA0�=�START�OF�DATA�TO�EXAMINE-*ˆA0�POINTS�TO�CHAR�AFTER�MOD�NAME�AT�EXIT�OR*ˆAT�TERMINATOR�CHARACTER*ˆA2�=�V  ERIFY�TABLE�STARY�ADDR$*ˆA3�=�ADDR�OF�MODULE�NAME�HOLD�AREA=*ˆD1�=�LENGTH�OF�MODULE�NAME�(GOOD�AFTER�ROUTINE�IS�COMPLETE) *ˆD0�=�STATUS#*ˆD2�=�1�MEANS�PRINT�ERROR�MSG�MODM'*ˆIF�VALID�THE�MODULE�NAME�IS�IN�MODNAM*9*********************************************************** MODVERBƒEQU�*‰CLR.L�D1ˆLENGTH‰LEA�MODNAM(PC),A3‰MOVE.L�#'„',(A3)‚INIT‰MOVE.L�#'„',4(A3)‰MOVE.W�#'‚',8(A3)‰LEA�MODTAB(PC),A2ƒINIT ‰CLR.L�D0MODLOPBƒMOVE.B�(A0),D0)‰TST.B�0(A2,D0)‚CK�TABLE�FOR�INVALID�CHAR‰BEQ.S�MODERRB"‰CMP.B�#1,0(A2,D0)‚VAL�CHAR�ALWAYS‰BEQ.S�MODGOODB‰TST.B�D1ˆ1ST�TIME‰BEQ.S�MODERRB†ERR�IF�1ST�TIME‰CMP.B�#2,0(A2,D0)‚VAL�2ND�CHAR‰BEQ.S�MODGOODB)‰CMP.B�#'T',0(A2,D0)‚CK�TAB�FOR�TERM�CHAR‰BEQ.S�MODENDB**ˆERROR�CONDITIONMODERRBƒTST.B�D2…PRINT�FLAG�SET‰BEQ.S�MODERR1B„NO ‰BSR�PRTMODMMODERR1B‚EQU�*‰MOVE.L�#-1,D0‰BRA.S�MODEXITB*%MODGOODB‚MOVE.B�(A0)+,(A3)+‚SAVE�CHAR‰ADD.B�#1,D1…ADD�FOR�SIZE‰CMP.B�#10,D1…BEYOND�END‰BHI�MODERRB†YES‰BRA�MODLOPB†CONTINUEMODENDBƒCLR.L�D0‰MOVE.L�A0,HOLDLOCM-PBA(A6)MODEXITB‚RTS�.�RETURN‰PAGE<*************************************************************<*ˆTHIS�ROUTINE�VERIFIES�THE�MODNAM�IN�TH�MODULE�-�SIZE�IS�108*ˆONCE�A�SPACE�IS�ENCOUNTER�ALL�REMAINING�MUST�BE�SPACES!*ˆA0�POINT�AT�AREA�TO�BE�VERIFIED&*ˆD0�=�0�AT�EXIT�MEANS�VERIFY�WAS�GOOD*ˆREG�USED�A0�A2�D0�D1�D3�D4�D59*ˆREG�D3�D4�D5�WILL�CONTAIN�THE�MODULE�NAME�(1ST�4�IN�D3,*ˆNEXT�4�IN�D4�AND�LAST�2�IN�D5*<************************************************************* MODVER„EQU�*1‰MOVEM.L�(A0),D3-D5‚SAVE�MODULE�NAME�IN�REGISTERS+‰LEA�MODTAB(PC),A2ƒINIT�TABLE�OF�VALID�CHAR‰MOVE.L�#9,D0„INIT�REG ‰CLR.L�D1‰MOVE.B�(A0)+,D1‚GET�BYTE(‰CMP.B�#1,0(A2,D1)‚IS�IT�OK�FOR�1ST�CHAR‰BNE.S�MODEXIT…NO$MODLOPƒMOVE.B�(A0)+,D1‚GET�NEXT�CHAR‰CMP.B�#SPACE,D1‚IS�IT�A�SPACE‰BEQ.S�MODSP…GO�TO�SPACE�PROC$‰CMP.B�#'T',0(A2,D1)‚TERMINATOR�CHAR‰BEQ.S�MODEXITƒYES%‰TST.B�0(A2,D1)‚IS�IT�AN�INVALID�CHAR‰BEQ.S�MODEXITƒYES ‰SUB�#1,D0‰BEQ.S�MODEXIT‚DONE‰BRA�MODLOP†CONTINUE*MODSP„SUB.W�#1,D0…RESET�DO‰BEQ.S�MODEXIT‰CMP.B�#SPACE,(A0)+‰BEQ�MODSP‡CONTINUEMODEXIT‚RTS�.�RETURN*‰PAGE****ˆTHE�CODE�ON�THIS�PAGE�WAS�NOT�REFERENCED*ˆSO�IT�HAS�BEEN�COMMENTED�OUT&*ˆBUT�RETAINED�FOR�HISTORICAL�PURPOSES*ˆWELL�IT�SOUNDS�GOOD�ANYWAY*:***********************************************************8*ˆROUTINE�TO�PRINT�MSG�BAD�MODULE�&�SHOW�NAME�&�SECTOR�#-*ˆREG�D3�D4�&�D5�MUST�CONTAIN�THE�MODULE�NAME*:************************************************************ERRORMOD EQU **ˆMOVEM.L�D3-D5,BADNAM*ˆMOVE.W�#'‚',BADNAM+10*ˆMOVE.L�#4,D1*ˆLEA�BADSEC,A0*ˆMOVE.L�D6,D0„SECTOR�COUNT*ˆBSR�BINHEX†CONV�TO�ASCII'*ˆMOVE.L�A5,-(A7)‚SAVE�POINTER�ON�STACK *ˆBSR�ERMODPM*ˆLEA�CONTM,A3*ˆLEA�CONTME,A4*ˆBSR�PRTIFORM*ˆIOSCALL�DNRIOS *ˆBNE�IOERPRT*ˆCMP.B�#'Y',DNRR*ˆBNE�GOBACK†EXIT�PROGRAM*ˆMOVE.L�(A7)+,A5‚RESET�POINTER*ˆRTS�.�RETURN‰PAGE-**********************************************0*ˆREPLACE�MODULE�ROUTINE�-�WILL�REPLACE�A�MODULE)*ˆIN�THE�LIBRARY�WITH�THE�MODULE�FOUND�IN+*ˆTHE�SOURCE�FILE�THE�MODULE�BEING�REPLACED+*ˆMUST�ALREADY�EXIST�&�THE�MODULE�DOING�THE3*ˆREPLACING�MUST�NOT�EXIST�IN�LIB�UNLESS�IT�HAS�THE*ˆSAME�NAME�AS�THE�LIB�MODULE*6******************************************************* DOREP„EQU�*(‰TST.B�LIBPREV-PBA(A6)ƒDID�OLD�LIB�EXIST‰BNE.S�DOREP1„YES ‰BSR�NOLIB‰BRA�DOREPEX…EXIT*'DOREP1ƒBTST�#0,D0†ANYTHING�IN�COMM�LINE‰BEQ.S�DOREP2„YES DOREPER1:‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS‰BSR�INVALER…PRT�ERROR�MSG‰BRA�DOREPEND…EXIT*�#1‚THEN.S�10/24/83‰BSR‡ASSGNTMP 10/24/83‰ENDI®10/24/83 *º10/24/83 *º10/24/83/*œ(PUT�ENTRY�IN�DIRECTORY�AND�OPEN�FOR�USE-LU2)‰RTS�.�RETURN�FROM�ROUTINE‰PAGE1**************************************************-*ˆSUBROUTINE�TO�INIT�PARM�WITH�DEFAULT�VALUES*1**************************************************INITDSK:‰MOVE.L„A0,-(A7) *œSAVE�REG‰LEA‡PBA(PC),A0*œA0=PROGRAM�BASE�ADDRESS-‰MOVE.L�VOLNAM-PBA(A0),FHSVOL(A6)‚VOLUME�NAME4‰MOVE.W�USERNUM-PBA(A0),FHSUSN(A6)‚USE�LOG�ON�USER�#+‰MOVE.L�CATNAM-PBA(A0),FHSCLG(A6)‚CATALOGUE%‰MOVE.L�CATNAM+4-PBA(A0),FHSCLG+4(A6)'‰MOVE.L�#'„',FHSFIL(A6)‚BLANK�FILE�NAME‰MOVE.L�#'„',FHSFIL+4(A6)-‰MOVE.W�#'RO',FHSEXT(A6)‚BLANK�EXTENSION�NAME‰MOVE.L„(A7)+,A0 *œRESTORE�REG ‰RTS�.�RETURN*-**********************************************.*ˆROUTINE�TO�ASSIGN�LOGICAL�UNIT�3�TO�TERMINAL+*ˆBY�SETTING�IT�UP�THE�SAME�AS�LU6�WHICH�IS"*ˆALREADY�ASSIGNED�TO�THE�TERMINAL*.*********************************************** SETLU3ƒEQU�*‰LEA�LU3AFHS(PC),A0ƒINIT�ADDR ‰FHSCALL�(A0)*ˆRETURN�FROM�FHS�CALL‰BNE�IOERPRT†BAD�RETURN ‰RTSŒ.�RETURN‰PAGE:***********************************************************;*ˆROUTINE�TO�DIRECT�OUTPUT�TO�SOMETHING�OTHER�THAN�TERMINAL*:***********************************************************NEWOUT:‰BSETW…#1,LIB_FLG1-PBA(A6)#*œSET�FLAG�-�OUTPUT�FIELD�SPECIFIED‰MOVEM.LƒA3/A6,-(A7) *œSAVE�REG ‰MOVE.L„A6,A3*œA3=PROGRAM�BASE�ADDRESS,‰LEA�LU3FHS(PC),A6ƒLU3�PARM�TABLE�ADDR�TO�A6@‰MOVE.B�#0,FHSWCD(A6)�LOAD�WRITE�PASSWORD�(USER�CAN�ALWAYS�WRITE?‰MOVE.B�#$FF,FHSRCD(A6)‚LOAD�READ�PASSWORD�(ONLY�USER�CAN�READ)3‰MOVE.W�USERNUM-PBA(A3),FHSUSN(A6)‚DEFAULT�USER�NUM-‰MOVE.L�VOLNAM-PBA(A3),FHSVOL(A6)‚VOLUME�NAME*‰MOVE.L�CATNAM-PBA(A3),FHSCLG(A6)‚CAT�NAME)‰MOVE.L�CATNAM+4-PBA(A3),FHSCLG+4(A6)‚CAT*‰MOVE.W�#'LS',FHSEXT(A6)‡LS�IS�DEFAULT�EXT7‰MOVE.L�SAVOADD-PBA(A3),A0‡OFLAG�HAD�ADDR�OF�SCAN�START*)******************************************&*ˆSET�UP�A0�WITH�ADDR�OF�START�OF�SCAN'*ˆSET�UP�A6�WITH�ADDR�OF�FHS�PARM�BLOCK*‰CALL�EDITFILE�ROUTINE�****)****************************************** ‰BSR�EDITFILE‰TST.L�D0ŠCK�FOR�ERR0R ‰BMI�INVALERR‰CMP.B…#COMMA,D1 ‰BEQ‡INVALERR**œJMP�IF�NEXT�COMMAND�LINE�CHARACTER�=�',',*œTHE�IMPLICATION�BEING�THAT�A�FILE�  HAS�BEEN*œSPECIFIED�FOR�THE�LIST�FIELD‰BTST�#1,D0†CK�FOR�DEVICE�FLAG‰BNE.S�LU3ASS†YES‰TST.B�D0ˆCK�FOR�FAMILY%‰BNE�INVALERRˆFOUND�FAMILY�INDICATION ‰BRA.S�NOTDEV)******************************************'*ˆ****ƒASSSIGN�LOGICAL�UNIT�3�(LISTING)*'****************************************LU3ASS: ‰BTSTW…#14,D0‰BEQ.S…LU3ASSC*œJMP�IF*¦DEVICE�SPECIFIED*¦VOLUME�FIELD�CONTAINS�DATA*œFALL�THRU�-->*¦DEVICE�SPECIFIED*¦VOLUME�FIELD�IS�NULL‰MOVEM.Lƒ(A7)+,A6/A3*œRESTORE�REGISTERS ‰BRA‡SETLU3*œSET�LU3�SAME�AS�LU6LU3ASSC:-‰MOVE.W�#FHASGN,FHSCMD(A6)‚SET�ASSIGN�COMMAND4‰MOVE.W�#FOPPW,FHSOPT(A6)‚SET�EXCLUSIVE�WRITE�OPTION ‰FHSCALL�(A6)!*ˆ*****ƒRETURN�FROM�FHS�CALL‚****‰BNE�IOERPRTˆERR0RNEWOUTE:‰MOVEM.L„(A7)+,A6/A3 *œRESTORE�REG‰RTSŒ.�RETURN�FROM�ROUTINE***)******************************************"*ˆ**‚OUTPUT�IS�A�FILE�NOT�A�DEVICE.*ˆ**‚A6�CONTAINS�ADDR�OF�OUTPUT�FHS�PARM�BLOCK*)****************************************** NOTDEVƒEQU�**3‰MOVE.W�#FHALLO+FHASGN,FHSCMD(A6)‚SET�ALLOC&�ASSIGN*6*******************************************************Š***‚OPTIONS�SET5******************************************************'‰MOVE.W�#FOPPW+FOPEND+FOPSEQ,FHSOPT(A6)+‰CLR.W�FHSLRL(A6)‚SET�LOGIC�REC�LENGTH�TO�0"‰CLR.L�FHSSIZ(A6)‚SIZE�CODE�=�ZERO*"NOTDEV1‚FHSCALL�(A6)‡MAKE�FHS�CALL‰BEQ�NEWOUTE‰GOOD‰CMP.B�#5,D0‰DUP�FILE‰BNE‡IOERPRTˆERR0R‰MOVE.W�#FHASGN,(A6) ‰BRA�NOTDEV1*NV_DEV:‰MOVE.L„#EM_NVDEV,D0)*œD0=KEY�VALUE�FOR�INVALID�DEVICE�MESSAGE ‰BRA‡IOERPRT‰PAGE8**********************************************************ˆ****ƒOPTIONS�ROUTINE�CALL‚***4*ˆTHIS�ROUTINE�WILL�CK�INPUT�TO�DETERMINE�IF�OPTIONS+*ˆHAVE�BEEN�REQUESTED.�OPTION�FLAGS�ARE�SET!*ˆA2�=�ADDR�START�OF�OPTION�FIELD*�IN�COMMAND�LINE*?****************************************************************CKFOROPT‚EQU�*‰CMP.L�#0,A2ˆANY�OPTIONS‰BEQ.S�ENDOPT†NO*OPTOPTƒBSR�OPTION*"***********************************@*‰**�BIT�6�IN�D0�SET�MEANS�THE�CARRAGE�RETURN�IS�THE�NEXT�CHAR�**"***********************************#‰BTST�#6,D0†CK�FOR�CARR�RETURN�FLAG‰BNE.S�ENDOPT†EXIT�WAS�CARR�RET‰TST.B�D0ˆCK�FOR�ERR0R�BITS�SET*‰BNEƒINVALERRˆFOUND�INVALID�FLAG�CONDITION*+********************************************1*‰***�CK�FOR�N�(DO�NOT�BUILD�DIRECTORY)�OPTION�***,**********************************************‰CMP.B�#'N',D1ƒIS�DO�NOT�BUILD�DIR�OPT�SET‰BNE.S�OPTER„NO(‰MOVE.B�#1,DIROPT-PBA(A6)‚SET�NO�DIR�OPT‰BRA�OPTOPT†GET�NEXT OPTER„EQU�*‰MOVE.L„#EM_NVO,D0)*œD0=KEY�VALUE�FOR�INVALID�OPTION�MESSAGE‰BRA.S…IOERPRT*ENDOPTƒRTS�.‹RETURN�FROM�ROUT‰PAGE********************************************ˆPRINT�MSG�WITHOUT�FORMAT********************************************PRTIFORM EQU *"‰MOVE.L�A3,OUT6IIOS-PBA+IOSSAD(A6)"‰MOVE.L�A4,OUT6IIOS-PBA+IOSEAD(A6)‰IOSCALL�OUT6IIOS(PC)‰BNE.S�IOERPRT ‰RTSˆ.�RETURN*-**********************************************ˆINVALID�MSG�SUBROUTINE+******************************************* INV_NTRY:‰MOVE.L„#'ENTR',INV_XX-PBA(A6)‰MOVE.W„#'Y�',INV_XX+4-PBA(A6)*œSET�'ENTRY�'�IN�MESSAGEINVALER‚LEA�INVMSG(PC),A3‰LEA�INVMSGE(PC),A4 ‰BSR‡MSGPRT‰MOVE.L„#'CMD�',INV_XX-PBA(A6)‰MOVE.W„#'‚',INV_XX+4-PBA(A6)*œRESTORE�'CMDƒ'�TO�MESSAGE INVM_CFC:‰MOVE.L„REGD7-PBA(A6),D0 ‰BTST.L„#0,D0‰BNE.S…INVM_XIT"*œJMP�IF�NOT�CHAIN�FILE�PROCESSING‰MOVE.W„#$C000,TERM_FLG-PBA(A6)2*œFORCE�TERMINATION�FLAG�TO�ERROR�TYPE�TERMINATION‰BRA.S…TERMINATE INVM_XIT:‰RTS*-**********************************************ˆPRT�BRIEF�PROG�DESCRIPTION-*********************************************QUESTION LEA QUESTM(PC),A3‰LEA�QUESTME(PC),A4‰BSR.S�PRTIFORM‰RTS*7*******************************************************+*ˆPRT�'SOURCE�HAS�MORE�THAN�ONE�MODULE�MSG'7*******************************************************PRTMSMƒLEA�MSM(PC),A3‰LEA�MSME(PC),A4 ‰BSR.S�MSGPRT ‰RTS�.�RETURN  *3****************************************************ˆPRINT�MSG‚INVALID�MODULE�NAME3*************************************************** PRTMODM‚EQU�*‰LEA�MODM(PC),A3‰LEA�MODME(PC),A4 ‰BSR.S�MSGPRT‰BRA.S…INVM_CFC*œEDIT�FOR�CHAIN�FILE�MODE‰PAGE*.***********************************************&*ˆ**‚ROUTINE�TO�PRINT�ERR0R�MESSAGE‚***,********************************************* INVALERR:‰MOVE.L„#EM_NVE,D0(*œD0=KEY�VALUE�FOR�INVALID�ENTRY�MESSAGEIOERPRT: ‰BSR‡X10000*œISSUE�CALL�TO�ERRORMSG�PRGM**2*ˆALL�UTILITIES�WILL�TERMINATE�BY�CALLINGƒERQ.TERM:*ˆHOWEVER�-�AN�INDICATION�AS�TO�WHETHER�THERE�WAS�AN�ERROR5*ˆWHICH�MIGHT�CAUSE�CHAIN�PROCESSING�TO�ABORT�MUST�BE9*ˆSPECIFIED�AT�THE�TIME�OF�THE�TERMINATION.�THE�FOLLOWING8*ˆWILL�DEFINE�THE�TYPE�OF�TERMINATION�THAT�ARE�CURRENTLY *ˆPOSSIBLE:*8*’NORMAL�TERMINATION‚-�IMPLIES�THAT�UTILITY�SUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM�#0,#0**:*’ERROR�TERMINATIONƒ-�IMPLIES�THAT�UTILITY�TERMINATED�WITH *¨AN�ERROR**¦ERQ.TERM�#0,#$C000*<*’WARNING�TERMINATION�-�IMPLIES�THAT�UTILITY�TERMINATED�WITH*¨A�WARNING�(ie.�ASSEMBLY)**¦ERQ.TERM�#0,#$1000*L********�PBA�-�IS�THE�PROGRAM�BASE�ADDRESS‚--�THIS�MAYBE�ANY�SYMBOL�THE�USER *®WOULD�LIKE�-�PBA�HAS�BEEN�USED*®HERE**** TERMINAT:‰LEA‡PBA(PC),A6‰ERQ.TERM‚#0,TERM_FLG-PBA(A6) TERM_FLG:‰DC.W†0‰TERMINATION�FLAG0*œWILL�CONTAIN�THE�APPROPRIATE�TERMINATION�VALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*‰PAGE***’ERROR�MESSAGE�CALLING�ROUTINE**ˆCALL†BSR‡C_EM_PGM**ˆINPUT!*’D0�=�AS�RETURNED�FROM�TRAP�CALL,*’D1�=�USER�LOGICAL�UNIT�NUMBER�TO�OUTPUT�TO!*’A0�=�AS�RETURNED�FROM�TRAP�CALL**ˆOUTPUT*’NO�REGISTER�PRESERVATION* EM_XCEPT:‰DC.W†$0000…TABLE�TERMINATOR2*œTHIS�TABLE�IS�USED�TO�DEFINE�EXCEPTIONS�TO�ERROR.*œMESSAGES�THAT�SHOULD�NOT�CAUSE�A�TERMINATION*œVIA�THE�ERROR�CONDITION* C_EM_PGM:‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A6)+*œSAVE�D0�AND�A0�IN�ERROR�MSG�PARAMETER�BLK‰AND.L…#$00FF,D0*œISOLATE�ERROR�STATUS�RETURN‰LEA‡EM_XCEPT(PC),A00*œA0=ADDR�OF�TBL�CONTAINING�ERROR�MSG�CODES�THAT-*ŸWILL�NOT�BE�CONSIDERED�AS�ERROR�TERMINATION *ŸCONDITIONS CEMP0100: ‰TST.W…(A0)‰BEQ.S…CEMP0200 *œJMP�IF�TABLE�HAS�BEEN�EXAMINED‰CMP.W…(A0)+,D0‰BEQ.S…CEMP0300'*œJMP�IF�ERROR�CODE�RETURN�IS�ONE�WHICH/*œWILL�RESULT�IN�BEING�AN�EXCEPTION�-�THIS�CASE**œWILL�NOT�BE�CONSIDERED�FOR�AN�ERROR�TYPE *œTERMINATION‰BRA.S…CEMP0100 *œREPEAT�LOOP CEMP0200:‰MOVE.W„#$C000,TERM_FLG-PBA(A6),*œSET�FLAG�TO�TERMINATE�WITH�ERROR�CONDITION CEMP0300:‰LEA‡EM_PBLK(PC),A0&*œA0=ADDR�USER�ERROR�MSG�PARAMETER�BLK‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)*œSET�THE�USER�LUN�TO�OUTPUT�TO ‰MOVE.L„#2,D0*œERROR�MSG�PRGM�INPUT�RQMNT‰TRAP†#4$*œISSUE�REQUEST�TO�ERROR�MSG�HANDLER ‰BSR‡INVM_CFC *œEDIT�FOR�CHAIN�FILE�PROCESSING‰RTS‰PAGE)******************************************ˆPRINT�MSG�WITH�FORMAT(***************************************** MSGPRTƒEQU�*!‰MOVE.L�A3,OUT6IOS-PBA+IOSSAD(A6)!‰MOVE.L�A4,OUT6IOS-PBA+IOSEAD(A6)‰IOSCALL�OUT6IOS(PC) ‰BNE‡IOERPRT*œJMP�IF�I/O�ERROR ‰RTS�.�RETURN*.***********************************************ˆPRT�MSG‚NO�MODULE�ID�RECORDS.***********************************************NOID:‰BTSTW…#0,LIB_FLG1-PBA(A6)‰BNE.S…NOID_XIT*œJMP�IF�MSG�ALREADY�DISPLAYED‰LEA�NOIDM(PC),A3‰LEA�NOIDME(PC),A4 ‰BSR�MSGPRT NOID_XIT:‰RTS*.**********************************************#*ˆPRINT�MSG�ERROR�CHECK�FOR�TEMPLIB.**********************************************TEMPERƒLEA�TEMPM(PC),A3‰LEA�TEMPME(PC),A4 ‰BSR�MSGPRT ‰BRA‡INVM_CFC*œEDIT�FOR�CHAIN�FILE�MODE*.********************************************** *ˆPRT�WARNING�DIRECTORY�FULL�MSG.**********************************************LIBFULRT EQU *‰LEA�LIBFULM(PC),A3‰LEA�LIBFULME(PC),A4 ‰BSR�MSGPRT ‰BRA‡INVM_CFC  *œEDIT�FOR�CHAIN�FILE�MODE*-********************************************* *ˆPRT�LIBRARY�DOES�NOT�EXIST�MSG-**********************************************NOLIB„LEA�NOLIBM(PC),A3‰LEA�NOLIBME(PC),A4‰BTSTW…#1,LIB_FLG1-PBA(A6)‰BNE.S…NOLIB10*œJMP�IF�OUTPUT�FIELD�SPECIFIED ‰BSR�MSGPRT ‰BRA‡INVM_CFC*œEDIT�FOR�CHAIN�FILE�MODENOLIB10:!‰MOVE.L„A3,OUT3IOS-PBA+IOSSAD(A6)!‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)*œSET�START/END�ADDRESSES‰IOSCALLƒOUT3IOS(PC) ‰BNE‡IOERPRT*œJMP�IF�I/O�ERROR ‰BRA‡INVM_CFC*œEDIT�FOR�CHAIN�FILE�MODE**1*************************************************!*ˆPRINT�MESSAGE�MODULE�IS�MISSING1*************************************************MODMISƒLEA�MODMISM(PC),A3‰LEA�MODMISME(PC),A4 ‰BSR�MSGPRT ‰BRA‡INVM_CFC*œEDIT�FOR�CHAIN�FILE�MODE*5******************************************************-**********************************************ˆPRINT�MSG�NO�MODULE�FOUNDNOMODFND EQU *‰LEA�MODMSG(PC),A4 ‰BSR�MOVMOD‰LEA�MODMSG(PC),A3‰LEA�NOMODME(PC),A4 ‰BSR�MSGPRT ‰BRA‡INVM_CFC*œEDIT�FOR�CHAIN�FILE�MODE*-*********************************************)*ˆPRINT�INSERT�AFTER�MODULE�NOT�FOUND�MSG-********************************************** INSRT„EQU�*‰LEA�INSM+20-PBA(A6),A4 ‰BSR�MOVMOD‰LEA�INSM(PC),A3‰LEA�INSME(PC),A4 ‰BSR�MSGPRT ‰BRA‡INVM_CFC*œEDIT�FOR�CHAIN�FILE�MODE**0************************************************+*ˆPRINT�ERR�MSG‚-�SOURCE�ALREADY�IN�LIBRARY0************************************************ MODER1ƒEQU�*‰LEA�MODALMI(PC),A4 ‰BSR�MOVMOD‰LEA�MODALM(PC),A3‰LEA�MODALME(PC),A4 ‰BSR�MSGPRT ‰BRA‡INVM_CFC*œEDIT�FOR�CHAIN�FILE�MODE‰PAGEX10000:‰MOVE.L„#LDFLUN,D1'*œD1=USER�LOGICAL�UNIT�NBR�TO�OUTPUT�TO ‰BSR‡C_EM_PGM*œISSUE�CLL�TO�ERRORMSG�PRGM‰RTS*‰PAGE** *ˆRTNE�TO,*’DETERMINE�IF�INPUT�FILE�SPECIFIED�IS�VALID(*’(VALID�-->�BINARY�NON-CONTIGIOUS�FILE)**ˆINPUT"*’A0�=�ADDR�OF�FHS�PARAMETER�BLOCK**ˆOUTPUT*’STATUS$*œNOT�EQUAL�-->�INPUT�FILE�TYPE�'OK'!* EQUAL�-->�INPUT�FILE�TYPE�ERROR* *ˆREG�STATUS*’NO�REGISTER�ALTERATION**X20000:‰CMP.W…#256,FHSLRL(A0) ‰BNE.S…X20100*œJMP�IF�NOT�BINARY�TYPE�FILE*œTHIS�IS�AN�ERROR‰MOVE.W„FHSOPT(A0),D0*œD0=OPTION�FIELD�CONTENTS‰AND.L…#FFTBIT,D0*œD0=INPUT�FILE�TYPE ‰BNE.S…X20200*œJMP�IF�VALID�FILE�TYPE*œBINARY�NON-CONTIGIOUSX20100:!‰MOVE.L„FHSFIL(A0),X00100-PBA(A6)%‰MOVE.L„FHSFIL+4(A0),X00100+4-PBA(A6)*œSET�FILE�NKAME�IN�MESSAGE‰MOVEM.LƒA0-A6,-(A7) *œSAVE�REG‰LEA‡X00100(PC),A3‰LEA‡X00199(PC),A4*œA3=MSG�START�ADDR*œA4=MSG�ENDƒADDR ‰BSR‡MSGPRT*œDISPLAY�INVALID�FILE�TYPE�MSG‰MOVEM.Lƒ(A7)+,A0-A6 *œRESTORE�REG ‰CLR.L…D0*œFORCE�RETURN�ERROR�STATUSX20200:‰RTS*‰PAGE** *ˆRTNE�TO*’EDIT�FOR�NULL�DIRECTORY**ˆINPUT *’A6�=�PBA**ˆOUTPUT/*’NULL�DIRECTORY�-->�FORCE�DIRECTORY�EXIST�FLAG*¥ELSE�NO�CHANGE**ˆREGISTER�ALTERATION**’D0=DESTROYED*X30000:‰MOVE.L„DIRLOC-PBA(A6),D0‰CMP.L…DIREND-PBA(A6),D0 ‰BNE.S…X30100*œJMP�IF�NOT�A�NULL�DIRECTORY‰MOVE.B„#1,DIREXIST-PBA(A6)*œFORCE�DIRECTORY�EXIST�FLAG�ONX30100:‰RTS‰PAGE.***********************************************%*ˆCONVERT�BINARY�TO�HEX�ASCII�ROUTINE*(*ˆRIGHT�JUSTIFY�&�BLANK�FILL�ON�THE�LEFT,*ˆTHE�LEAST�SIGNIFICANT�DIGIT�IS�NOT�BLANKED* *ˆD0�=�HEX�VALUE�TO�BE�CONVERTED *ˆD1�=�LENGTH�OF�RECEIVING�FIELD7*ˆA0�=�ADDRESS�OF�LEFT�MOST�POSITION�OF�RECEIVING�FIELD*.**********************************************(BINASCƒDC.B�'0123456789ABCDEF'…HEX�TABLE* BINHEXƒEQU�*‰LEA�BINASC(PC),A1ƒINIT�ADDR‰LEA�0(A0,D1),A2‚END�LOCATION*BINLOPƒMOVE.B�D0,D3„GET�BYTE%‰ASR.L�#4,D0†SHIFT�OFF�LAST�HEX�VALUE!‰AND.L�#$F,D3„MASK�OFF�OTHER�BITS2‰MOVE.B�0(A1,D3),-(A2)‚MOVE�FROM�TABLE�TO�REC�AREA‰CMP.L�A2,A0…ARE�WE�DONE‰BLT�BINLOP†NO*‰CMP.W�#1,D1…ONLY�1�CHAR‰BEQ.S�BINOUT„YES**ˆDO�ZERO�SUPPRESSION*‰LEA�0(A0,D1),A2‚INIT�END�LOC‰SUB.L�#1,A2…FIX�END�LOC!BINSP„CMP.B�#'0',(A0)‚AS CII�ZERO?‰BNE.S�BINOUT†NO�GET�OUT%‰MOVE.B�#'�',(A0)+‚REPLACE�WITH�BLANK‰CMP.L�A0,A2…ARE�WE�DONE ‰BGT�BINSP‡NO**BINOUTƒRTS�.�RETURN*‰PAGE-*********************************************+*‚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�,D11*…MOVE.L�,A0*…BSR�BINDECFJ* *‚RETURNS:*…D0�=�0�=>GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *ŠDƒ*�*�**ŠAƒ*�***7TENSƒDC.L�10000000,1000000,100000,10000,1000,100,10,1,0**$BINDECFJ MOVE.L #8,D2 MAX NO. DIGITS SUB.L D1,D2 NO. DIGITS TO SKIP! BMI.S BINDECF5 BRANCH ERROR EXIT LSL.L #2,D2 DOUBLE WORD LENGTH LEA TENS(PC),A1 START OF TABLE" ADD.L D2,A1 ADJUST FOR DIFFERENCE&�MOVE.W�#'‚',D2�INITIALIZE�ACCUMULATOR%BINDECF1 SUB.L (A1),D0 SUBTRACT 10**N BCS.S BINDECF2 BRANCH TOO BIG* ADD.W #1,D2 INCREMENT CURRENT DIGIT COUNT BRA BINDECF1 CONTINUE)BINDECF2 ADD.L (A1)+,D0 RESTORE, ADV PNTR TST.L (A1) TEST DONE BEQ.S BINDECF4 BRANCH DONE �CMP.W�#'‚',D2�LEADING�ZERO�TEST! BEQ.S BINDECF3 BRANCH STILL ZERO# ADD.B #$10,D2 BRING TO ASCII DIGIT%BINDECF3 MOVE.B D2,(A0)+ DEPOSIT CHAR‚LSL�#8,D2‚SAVE�CHAR�DEPOSITED#‚MOVE.B�#$20,D2‚RESTORE�LS�TO�SPACE‚BRA�BINDECF1„CONTINUE4BINDECF4�ADD.B�#$10,D2„LAST�ONE�BECOMES�DIGIT�ALWAYS‚MOVE.B�D2,(A0)+ƒDEP�LAST�CHAR‚TST.L�D0…SET�CONDITION�CODE BINDECF5 RTS*‰PAGEO******************************************************************************** *ˆROUTINE�TO3*’CONVERT�THE�SYSTEM�TIME�AND�DATE�TO�DECIMAL�ASCII**ˆCALL†BSR‡X70000**ˆINPUT'*’A0�=�ADDRESS�OF�A�16�BYTE�WORK�BUFFER**ˆOUTPUT*’A0�=�UNALTERED4*’FIRST‚8�BYTES�OF�WORK�BUFFER�CONTAIN�DATEƒMM/DD/YY5*’SECOND�8�BYTES�OF�WORK�BUFFER�CONTAIN�TIMEƒHH:MM:SS**ˆREGISTERS�DESTROYED *’D0�D1�D2�D3*O*********************************************************************************ˆCONVERT�DATE�AND�SAVE*O*******************************************************************************X70000:‰MOVEM.LƒA0-A2,-(A7) ‰MOVE.L„A0,A2*œA2=A0=ADDRESS�OF�WORK�BUFFER‰MOVE.L„#GTDTIM,D0**œD0=DIRECTIVE�TO�GET�SYSTEM�TIME�AND�DATE‰TRAP†#1*œOBTAIN�TIME/DATE�FROM�SYSTEM‰MOVE.L„(A0),D0!*œD0=ORDINAL�DATE�TO�BE�CONVERTED‰MOVE.L„4(A0),12(A0)*œ12(A0)=TIME�TO�BE�CONVERTED ‰BSR‡DATEOJ *œCONVERT�BINARY�ORDINAL�DATE�TO*¤BINARY�GREGORIAN�DATE‰MOVE.L„D0,08(A0)%*œD0=BINARY�GREGORIAN�DATE�(YYYYMMDD) ‰ASR.W…#8,D0*œD0=MONTH�IN�LOW�ORDER�BYTE‰AND.L…#$FF,D0*œD0=MONTH�ISOLATED ‰MOVE.L„#2,D1%*œD1=NUMBER�OF�DIGITS�TO�BE�CONVERTED *œA0=ADDRESS�TO�STORE�CONVERSION ‰BSR‡BINDECFJ$*œCONVERT�MONTH�TO�ASCII�AND�SAVE�IT‰MOVE.B„#'/',(A0)+(*œMOVE�SEPARATAOR�'/'�TO�DATE�CONVERSION‰MOVE.B„11(A2),D0‰AND.L…#$FF,D0*œD0=DAY�ISOLATED%*œD1=NUMBER�OF�DIGITS�TO�BE�CONVERTED *œA0=ADDRESS�TO�STORE�CONVERSION ‰BSR‡BINDECFJ"*œCONVERT�DAY�TO�ASCII�AND�SAVE�IT‰MOVE.B„#'/',(A0)+'*œMOVE�SEPARATOR�'/'�TO�DATE�CONVERSION‰MOVE.W„08(A2),D0‰AND.L…#$FFFF,D0*œD0=YEAR�ISOLATED%*œD1=NUMBER�OF�DIGITS�TO�BE�CONVERTED *œA0=ADDRESS�TO�STORE�CONVERSION ‰BSR„BINDEC *œCONVERT�YEAR�T0�4�ASCII�DIGITS‰MOVE.B„-(A0),-2(A0)‰MOVE.B„-(A0),-2(A0)/*œMOVE�2�DIGITS�OF�YEAR�TO�APPROPRIATE�POSITIONO*********************************************************************************ˆCONVERT�TIME�OF�DAY�AND�SAVE*O*******************************************************************************‰MOVE.L„4(A0),D1)*œD1=TIME�IN�MILLISECONDS�TO�BE�CONVERTED%*œA0=ADDRESS�TO�STORE�TIME�CONVERSION ‰CLR.L…D0*œD0=HOUR�COUNTERTL1†SUB.L…#1000*60*60,D1 ‰BCS.S…TL2 ‰ADD.L…#1,D0 ‰BRA.S…TL1TL2†ADD.L…#1000*60*60,D1*œADJUST�FOR�LAST�SUBTRACTION ‰MOVE.L„D1,D3 3*œD3=NUMBER�OF�MILLISECONDS�FOR�MINUTES�AND�SECONDS ‰MOVE.L„#2,D1&*œD0=NUMBER�OF�BINARY�HOURS‚TO�CONVERT *œD1=NUMBER�OF�DIGITS�TO�CONVERT *œA0=ADDRESS�TO�STORE�CONVERSION ‰BSR‡BINDECFJ"*œCONVERT�NUMBER�OF�HOURS�AND�SAVE‰MOVE.B„#':',(A0)+'*œMOVE�SEPARATOR�':'�TO�TIME�CONVERSION‰DIVU†#60*1000,D3 ‰CLR.L…D0 ‰MOVE.W„D3,D0(*œD0=NUMBER�OF�BINARY�MINUTES�TO�CONVERT *œD1=NUMBER�OF�DIGITS�TO�CONVERT*œA0=ADDRESS�STORE�CONVERSION ‰BSR†BINDECFJ$*œCONVERT�NUMBER�OF�MINUTES�AND�SAVE‰CMP.B…#'�',-2(A0) ‰BNE.S…X701004*œJMP�IF�LEAD�DIGIT�OF�MINUTES�NOT�A�SPACE�CHARACTER‰MOVE.B„#'0',-2(A0)*œREPLACE�SPACE�WITH�ASCII�ZEROX70100:‰MOVE.B„#':',(A0)+#*œMOVE�SEPARATOR�TO�TIME�CONVERSION ‰CLR.W…D3‰SWAP†D3‰DIVU†#1000,D3 ‰MOVE.W„D3,D0(*œD0=NUMBER�OF�BINARY�SECONDS�TO�CONVERT *œD1=NUMBER�OF�DIGITS�TO�CONVERT*œA0=ADDRESS�STORE�CONVERSION ‰BSR‡BINDECFJ*œCONVERT�SECONDS�AND�SAVE‰CMP.B…#'�',-2(A0) ‰BNE.S…X702004*œJMP�IF�LEAD�DIGIT�OF�SECONDS�NOT�A�SPACE�CHARACTER‰MOVE.B„#'0',-2(A0)*œREPLACE�SPACE�WITH�ASCII�ZEROX70200:‰MOVEM.Lƒ(A7)+,A0-A2*œRESTORE�REGISTERS‰RTS‰PAGEO******************************************************************************** *ˆROUTINE�TO%*’CHARACTER�FILL�A�SPECIFIED�LOCATION*A***************„THIS�ROUTINE�CAN�BE�CALLED�IN�ON�OF�THE�FOLLOWING *’METHODS*-*’METHOD�1�-�START�ADDRESS�FOR�CHARACTER�FILL *�FILL�COUNT*1*’METHOD�2�=�START/END�ADDRESS�FOR�CHARACTER�FILL**ˆCALL†BSR‡X70300**ˆINPUT*<*****************‚METHOD�1‚A0�=�ADDRESS�START�CHARACTER�FILL*œD0�=�BITS‚0-15�-->�FILL�COUNT*¡BITS�16-23�-->�FILL�CHARACTER*$*’EXAMPLEˆ0041‚<-----ƒFILL�CHARACTER*¡0020‚<-----ƒFILL�COUNT****<*****************‚METHOD�2‚A0�=�ADDRESS�START�CHARACTER�FILL$*œD0�=�BITS�16-23�-->�FILL�CHARACTER*¡BITS�31„-->�METHOD�2�SELECTED.*œA1�=�ADDRESS�LAST�LOCATION�TO�CHARACTER�FILL*$*’EXAMPLEˆ8041‚<-----ƒFILL�CHARACTER*¡0000‚<-----ƒNOT�USED****ˆOUTPUT*’A0=A0+FILL�COUNT*’A1=SAME�AS�INPUT.*’SPECIFIED�LOCATION�HAS�BEEN�CHARACTER�FILLED***ˆREGISTERS�ALTERED*’D0�D1*O*******************************************************************************X70300:‰BTST.L„#31,D0 ‰BEQ.S…X70400*œJMP�IF�METHOD�1�SPECIFIED ‰MOVE.L„A1,D1 ‰SUB.L…A0,D1&*œD1=NUMBER�OF�BYTES�TO�CHARACTER�FILL ‰BRA.S…X70500 *œCONTINUEX70400: ‰CLR.L…D1 ‰MOVE.W„D0,D1&*œD1=NUMBER�OF�BYTES�TO�CHARACTER�FILLX70500:‰SWAP†D0*œD0.B=FILL�CHARACTER ‰TST.L…D1 ‰BRA.S…X70700*œESTABLISH�D1�STATUS*œENTER�TO�MOVE�LOOPX70600:‰MOVE.B„D0,(A0)+ ‰SUB.W…#1,D1X70700: ‰BNE.S…X70600*œMOVE�FILL�CHARACTER*œJMP�IF�LOOP�INCOMPLETE‰RTS‰PAGEO******************************************************************************** *ˆROUTINE�TO(*’MOVE�DATA�FROM�ONE�LOCATION�TO�ANOTHER*œWITH�OPTION�FOR*¦SPECIFIED�CHARACTER�REMOVAL*7*’THE�USER�MAY�CALL�THE�ROUTINE�IN�ONE�OF�THE�FOLLOWING *’METHODS:*œ1.�START�ADDRESS�MOVE�FROM*ŸSTART�ADDRESS�MOVE�TO*ŸNUMBER�OF�BYTES�TO�MOVE* *œ2.�START/END�ADDRESS�MOVE�FROM*ŸSTART�ADDRESS�MOVE�TO****ˆCALL†BSR‡X70800**ˆINPUT!*’METHOD�1‚A0�=�ADDRESS�MOVE�FROM*œA1�=�ADDRESS�MOVE�T0)*œD0�=�BITS‚0-15�-->�NUMBER�BYTES�TO�MOVE(*¡BITS�30„-->�SPECIFIC�CHARACTER�REMOVAL$*¡BITS�16-23�-->�CHARACTER�TO�REMOVE***!*’METHOD�2‚A0�=�ADDRESS�MOVE�FROM*œA1�=�ADDRESS�MOVE�TO0*œD0�=�BITS�31�-->�REG�2�HAS�ENDING�FROM�ADDRESS(*¡BITS�30„-->�SPECIFIC�CHARACTER�REMOVAL$*¡BITS�16-23�-->�CHARACTER�TO�REMOVE$*œA2�=�ADDRESS�LAST�LOCATION�TO�MOVE****ˆOUTPUT*’A0=A0+MOVE�COUNT%*’A1=ADDRESS�LAST�CHARACTER�MOVED�+�1*’A2=SAME�AS�INPUT'*’DATA�MOVED�FROM�SOURCE�TO�DESTINATION***ˆREGISTERS�ALTERED*’D0�D1*O*******************************************************************************X70800:‰BTST.L„#31,D0 ‰BEQ.S…X70900*œJMP�IF�METHOD�1�SPECIFIED ‰MOVE.L„A2,D1 ‰SUB.L…A0,D1*œD1=NUMBER�OF�BYTES�TO�MOVE ‰BRA.S…X71000 *œCONTINUEX70900: ‰CLR.L…D1 ‰MOVE.W„D0,D1&*œD1=NUMBE R�OF�BYTES�TO�CHARACTER�FILLX71000:‰SWAP†D0*œPLACE�OPTIONS�IN�D0.W ‰TST.L…D1 ‰BRA.S…X71300*œESTABLISH�D1�STATUS*œENTER�TO�MOVE�LOOPX71100: ‰BTSTW…#14,D0 ‰BNE.S…X71400#*œJMP�IF�CHARACTER�REMOVAL�SELECTEDX71200:‰MOVE.B„(A0)+,(A1)+X71220: ‰SUB.W…#1,D1X71300: ‰BNE.S…X71100*œMOVE�SOURCE�TO�DESTINATION*œJMP�IF�LOOP�INCOMPLETE‰RTSX71400:‰CMP.B…(A0),D0 ‰BNE.S…X71200(*œJMP�IF�THIS�IS�NOT�CHARACTER�TO�REMOVE ‰TST.B…(A0)+!*œADJUST�PAST�CHARACTER�TO�REMOVE ‰BRA.S…X71220*œRETURN�TO�MAIN�LOOP ‰PAGEO******************************************************************************** *ˆROUTINE�TO*’EXPAND�A�FILE�DESCRIPTOR***ˆCALL†BSR‡X71700**ˆINPUT+*’A0�=�ADDRESS�OF�FILE�DESCRIPTOR�TO�EXPAND%*’A1�=�ADDRESS�EXPAND�FILE�DESCRIPTOR**’FILE�DESCRIPTOR�FORMAT* *’VOLUMEŽ4*’USER�NUMBER‰2 *’CATALOG�8 *’FILE�NAME‹8 *’EXTENSION‹2***ˆOUTPUT* *’A0�=�A0+24**’FILE�DESCRIPTOR�FORMAT0*’VOLUME:USER�NUMBER.CATALOG.FILE�NAME.EXTENSION**ˆREGISTERS�DESTORYED *’D0�D1�D2*O*******************************************************************************X71700: ‰MOVE.B„#4,D0*œNUMBER�OF�BYTES�TO�MOVEX71800:‰MOVE.B„(A0)+,(A1)+ ‰SUB.B…#1,D0 ‰BNE.S…X71800*œMOVE�VOLUME�NAME‰MOVE.B„#':',(A1)+*œFILE�SEPARATOR ‰CLR.L…D0‰MOVE.B„(A0)+,D0 ‰ASL.W…#8,D0‰MOVE.B„(A0)+,D0*œD0=USER�NUMBER�TO�CONVERT‰MOVE.L„A0,-(A7)*œA0=ADDRESS�OF�CATALOG�NAME ‰MOVE.L„A1,A0*œA0=ADDRESS�MOVE�CONVERSION�TO ‰MOVE.L„#4,D1 *œD1=NUMBER�OF�DIGITS�TO�CONVERT ‰BSR‡BINDECFJ*œCONVERT�USER�NUMBER‰MOVE.B„#'.',(A0)+*œFILE�SEPARATOR ‰MOVE.L„A0,A1*œA1=ADDRESS�MOVE�TO‰MOVE.L„(A7)+,A0*œA0=ADDRESS�MOVE�FROM‰MOVE.B„#18,D0*œD0=NUMBER�OF�BYTES�TO�MOVEX71900:‰MOVE.B„(A0)+,(A1)+ ‰SUB.B…#1,D0 ‰BEQ.S…X72100*œMOVE *¦CATALOG *¦FILE�NAME *¦EXTENSION*œJMP�WHEN�DONE ‰CMP.B…#10,D0 ‰BEQ.S…X72000 ‰CMP.B…#2,D0 ‰BEQ.S…X72000*œJMP�IF�FILE�SEPARATOR�NEEDED ‰BRA.S…X71900*œRETURN�TO�LOOPX72000:‰MOVE.B„#'.',(A1)+*œFILE�SEPARATOR ‰BRA.S…X71900*œRETURN�TO�LOOPX72100:‰RTS‰PAGECLR_DET:‰LEA‡LISTDATA(PC),A0‰LEA‡LISTDESE(PC),A1**œSET�START/END�ADDRESS�FOR�CHARACTER�FILL‰MOVE.L„#$80200000,D0*œD0�=�METHOD�2�CHARACTER�FILL*¡FILL�CHARACTER�=�SPACE ‰BSR‡X70300*œSPACE�FILL�DETAIL�LINE‰RTS‰PAGE*&*ˆ**CONVERT�BINARY�TO�ASCII�ROUTINE�**-*********************************************$*ˆBINARY�TO�DECIMAL�ASCII�SUBROUTINE*�REV�1.00‚3/27.79�GAT*�**�16�BIT�BINARY�INPUT�**4****************************************************6*ˆCONVERTS�BINARY�QUANTITY�IN�D0�TO�ASCII�STRING�WHICH *ˆIS�DEPOSITED�AT�LOCATION�(A0)+**ˆCALLING�SEQUENCE:'*‹LOAD�D0�WITH�QUANTITY�TO�BE�CONVERTED.*‹LOAD�A0�WITH�ADDRESS�TO�DEPOSIT�ASCII�STRING *‹JSR�BINDEC*!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*“D„*�* *“A„*�*�***ˆA1�POINTS�AT�BINARY�TABLE*ˆA2�POINTS�AT�ASCII�TABLE*ˆD1�IS�WORK�REGISTER**BINEQSƒDC.W�0,1,10,100,1000)BINDECƒLEA‡BINEQS+8-PBA(A6),A1ƒADDR�10**5*BINDE1ƒLEA‡BINASC(PC),A2†BASE�ADDR�ASCII�0#BINDE2ƒSUB.W�(A1),D0ŠSUBTRACT�10**N‰BCS.S�BINDE3�BRANCH�OVERBORROW&‰ADD.L�#1,A2ŒINCREMENT�NEXT�ASCII�CHAR‰BRA�BINDE2�CONTINUE'BINDE3ƒADD.W�(A1),D0ŠRESTORE�OVERBORROW!‰MOVE.B�(A2),(A0)+†PUT�ASCII�CHAR‰MOVE.W�-(A1),D1ˆTEST�DONE‰BNE�BINDE1�BRANCH�NOT�DONE‰RTS‰PAGEPRGM_SIZ�EQU‡*-PBA ‚END‚BEGPROC ‰END�BEGPROC          éé é=/* =/*†LIST.AF=/*'=/* Chain file to assemble LIST utility=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to LIST.LS=/*=/IFC \1 ƒ=ARG�LIST.LS=/ENDIF=/*=ASM LIST.SA,LIST.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*}=/*=ENDééééééé=/* =/*†LIST.LF=/*%=/* Link chain file to create LIST.LO=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to LIST.LL=/*=/IFC \1 ƒ=ARG�LIST.LL=/ENDIF=/*=LINK ,LIST.LO,\1;HAMIX ATTRIBUTES PSEG SEG0:0,14 $0 INPUT LIST.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééé ééòŠPAGELIST†IDNTƒ4,1�LIST�UTILITYŠTTL„LIST�UTILITYH*************************************************************************$* ********** LIST UTILITY ***********5*ƒPURPOSE:‚PRODUCE�A�FORMATTED�LIST�OF�FILE�OR�DEVICE*/*ƒENTRY:‚ENTRY�VIA�SCT.‚COMMAND�LINE�FORMAT�IS:**‹LIST‚FN1,FN2;OPTIONS*/*‘WHERE�FN1�AND�FN2�ARE�FILE�OR�DEVICE�NAMES�IN*‘STANDARD�FORMAT.*)*‘OPTIONS:‚I�-�GO�TO�INTERACTIVE�MODE�FOR&*ŸBEGINNING�AND�ENDING�RECORD�NUMBERS.)*›H�-�PROMPT�FOR�HEADING�TO�APPEAR�AT�TOP*ŸOF�EACH�PAGE.**›F�-�PROMPT�FOR�NON-STANDARD�PAGE�FORMAT."*›L�-�PUT�LINE�NUMBERS�IN�LISTING.)*›S�-�FORM�IS�S=N�WHERE�N�IS�A�DECIMAL�OR'*ŸHEX�NUMBER�REPRESENTING�THE�BEGINNING*ŸRECORD�NUMBER�TO�LIST.)*›T�-�FORM�IS�T=N�WHERE�N�IS�A�DECIMAL�OR$*ŸHEX�NUMBER�REPRESENTING�THE�ENDING*ŸRECORD�NUMBER�TO�LIST.*.*‘INTERACTIVE�INPUT�LINE�IS�ONE�OF�FIVE�TYPES:**‘H‰DEFINES�A�NEW�HEADING*4*‘F�NN,MMƒDEFINES�NONSTANDARD�ROW�AND�COLUMN�FORMAT.(*›NN�IS�THE�NUMBER�OF�ROWS�ON�A�PAGE�AND(*›MM�IS�THE�NUMBER�OF�COLUMNS�(MAXIMUM).'*›A�LEADING�'$'�IMPLIES�HEX�INPUT,�ELSE*›DECIMAL�IS�ASSUMED.*+*‘L�NN†PUTS�LINE�NUMBERS�IN�THE�LISTING.‚NN$*›DEFINES�THE�BASE�LINE�NUMBER�USED.**5*‘D�NN,MMƒSPECIFIES�RANGE�OF�LOGOCAL�RECORDS�TO�LIST.**›A�LEADING�'$'�SPECIFIES�HEX�NUMBER,�ELSE*›DECIMAL�IS�ASSUMED.**‘QUIT†TERMINATES�LISTING�TASK*H*************************************************************************!ŠXREFƒPARSE,OPTION,EDITFILE,SBARG**‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.FME.EQ*‰INCLUDE�9995.&.IOE.EQŠNOLISTŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.IOE.EQŠLIST* ŠSECTION�0B‰EQU„*’BEGINNING�OF�SECTION#ŠDC.Bƒ'122084�4'‰VERSION�OF�PROGRAM** LIST DATA AREA* ŠDS.Lƒ$20 STACK…EQU„*5SAVSTACK‚DS.Lƒ1’SAVE�FOR�STACK�POINTER�ON�BREAK�EVENT*#CLGH†EQU„$A0�LENGTH�OF�COMMAND�LINE-CLINE…COMLINE�CLGHŽCOMMAND�LINE�INPUT�TO�TASKŠLIST*,INITDREG‚EQU„*’D-REGS�SAVED�ON�INITIAL�ENTRY ûMH TgX$B,F4A<>DCL>TE\BdCl=tI|E„@ŒM”5œF¤L¬K´/&ŠDS.Lƒ1’D0�=�TASK�NAME�THAT�STARTED�ME+ŠDS.Lƒ1’D1�=�SESSION�NUMBER�THAT�STARTED�ME&VOLNAM„DS.Lƒ1’D2�=�DEFAULT�VOLUME�NAME'USERNUMƒDS.Lƒ1’D3�=�DEFAULT�VOLUME�NAME'CATNAM„DS.Lƒ1’D4�=�DEFAULT�CATALOG�NAME-ŠDS.Lƒ1’D5�=�2ND�HALF�OF�DEFAULT�CATALOG�NAME2CCOUNT„DS.Lƒ1’D6�=�#�OF�CHARACTERS�IN�COMMAND�LINESAVD7…DS.Lƒ1’D7�=�LU�MASKINITA0„DS.Lƒ1’A0�=�TASK�NAME*ŠDS.Lƒ1’A1�=�INTERACTIVE�DEVICE�(IE�#CN13)"*‰DS.Lƒ1’A2�=�USER�NUMBER�(BINARY)*‰DS.Lƒ1’A3�=�SESSION�NUMBER*!* PARAMETER BLOCK TO ALLOCATE ASQASQ1†DC.Lƒ'LIST'�TASK�NAME(ŠDC.Lƒ0’SESSION�CODE�(N/A�FOR�USER�TASK)$ŠDC.Bƒ8’DISABLE�REG�STACKING,ASR,ASQ#ŠDC.Bƒ20‘LONGEST�MESSAGE�ACCEPTABLE ŠDC.Lƒ$100�QUEUE�LENGTH�IF�BYTES,ŠDC.Lƒ0’ALTERNATE�SERVICE�ADDRESS�(NOT�USED)$ŠDC.Lƒ0’ASR�RECEIVING�AREA�(DYNAMIC)*"ASQBUFFƒDS.Bƒ20‘ASR�RECEIVING�AREA*%ASQDUN„DC.Wƒ-1‘FLAG�FOR�ASQ�ALLOCATED** TIME PARAMETER BLOCK*TIMBLK„DS.Lƒ1’DATE ŠDS.Lƒ1’TIME*&TMPDATEƒDS.Lƒ1’TEMPORARY�HOLD�FOR�DATEHOLDDATE‚DS.Lƒ1*%RECADJ„DC.Lƒ0’RECORD�ADJ USTMENT�VALUE*EDITSVA0‚DC.Lƒ0’SAVE�FOR�A0�AFTER�EDITFILE0EDITOUTƒDC.Lƒ0’SAVE�FOR�EDITFILE�OF�OUTPUT�FIELD** PAGE FORMAT DATA AREA*-ROWMIN„EQU„10‘MINIMUM�NUMBER�OF�ROWS�PER�PAGE/COLMIN„EQU„1’MINUMUM�NUMBER�OF�COLUMNS�PER�PAGE(COLCNT„DC.Lƒ80‘DEFAULT�NUMBER�OF�COLUMNS%ROWCNT„DC.Lƒ60‘DEFAULT�NUMBER�OF�ROWS*,LNUM†DC.Lƒ0’CURRENT�LINE�NUMBER�(IF�NONZERO)&LCNT†DC.Lƒ$7FFFFFFFŠLINE�COUNT�ON�PAGE*LNUMF…DC.Wƒ$FFFFŽLINE�NUMBERS�DESIRED�FLAGPNUM†DC.Lƒ0’PAGE�NUMBER/EJECTEDƒDC.Wƒ$FFFFŽFLAG�FOR�PAGE�EJECTED�OR�NOT*2RADIX…DC.Wƒ10‘RADIX�FOR�ASCII�TO�BINARY�CONVERSION*,DOPCNT„DS.Lƒ1’SAVE�FOR�LENGTH�OF�KEYED�INPUT+LISTED„DC.Wƒ$FFFFŽFLAG�FOR�LISTING�PRODUCED**** OPTIONS TABLE FORMAT* OPTABLSƒEQU„* ŠOFFSET�0ŠDS.Bƒ1’OPTION�LETTEROPTFL…DS.Bƒ1’OPTION�FLAG+OPTNUM„DS.Lƒ1’NUMBER�ASSOCIATED�WITH�OPTION3OPTADR1ƒDS.Lƒ1’PROC�ADDR�FOR�THIS�OPTN�ON�CMND�LINE4OPTADR2ƒDS.Lƒ1’PROC�ADDR�FOR�THIS�OPTN�INTERACTIVELY OPTELGHƒEQU„* ŠSECTION�0* OPTBL…MACROŠDC.Bƒ'\1'�LETTERŠDC.Bƒ0’FLAG�(INITIALLY�=�0)ŠDC.Lƒ0’OPTION�NUMBER/ŠDC.Lƒ\2-B�PROC�ADDR�FOR�THIS�OPTN�ON�CMND�LINE0ŠDC.Lƒ\3-B�PROC�ADDR�FOR�THIS�OPTN�INTERACTIVELYŠENDM*'HOPT†OPTBL‚H,HOPTC,HOPTI†HEADING�OPTION.ŠOPTBL‚F,FOPTC,FOPTI†NONSTANDARD�FORMAT�OPTION/ŠOPTBL‚L,LOPTC,LOPTI†SUPPLY�LINE�NUMBERS�OPTION8DOPT†OPTBL‚D,DOPTC,DOPTI†INTERACTIVE�RECORD�DISPLAY�OPTN3ŠOPTBL‚S,SOPTC,SOPTI†STARTING�RECORD�SPECIFIED�OPTN6ŠOPTBL‚T,TOPTC,TOPTI†TERMINATING�RECORD�SPECIFIED�OPTN0IOPT†OPTBL‚I,IOPTC,IOPTI†INTERACTIVE�MODE�OPTION)QOPT†OPTBL‚Q,QOPTC,QOPTI†TERMINATE�OPTION OPTABLEƒEQU„*'OPCNT…DC.Wƒ0’COUNT�OF�OPTIONS�SPECIFIED/PARSAREG‚EQU„*’SAVED�A-REGS�AFTER�CALL�TO�PARSE1OUTPSRTƒDS.Lƒ1’A1=OUTPUT�FIELD�ADDRESS�FROM�PARSE1OPTSRT„DS.Lƒ1’A2=OPTIONS�FIELD�ADDRESS�FROM�PARSE$EDITRTNƒDS.Lƒ1’RETURN�FROM�EDIT�FILE$SRTREC„DC.Lƒ0’STARTING�RECORD�NUMBER*ENDREC„DC.Lƒ$7FFFFFFFŠENDING�RECORD�NUMBER* * LU EQUATES*(INPLUN„EQU„1’ASSOCIATED�WITH�INPUT�FIELD4LISTLUNƒEQU„3’ASSOCIATED�WITH�LISTING�(OUTPUT�FIELD)*** CANNED MESSAGE AREA*"PROMPTCƒDC.Bƒ'>�'�PROMPT�CHARACTERPROMPTCE‚EQU„*-1* * A LINE FEED* LF2‡DC.Bƒ$0D ŠDC.Bƒ$0AŠDS…0* HMSGS…EQU„* ŠDC.Bƒ$0D ŠDC.Bƒ$0A.ŠDC.Bƒ'Enter�heading�-�60�characters�maximum:' ŠDC.Bƒ$0D ŠDC.Bƒ$0A HMSGE…EQU„*-1ŠDS…0’FORCE�WORD�BOUNDARY*!* AREA WHICH RECEIVES THE HEADING* FFOUTS„EQU„*ŠDC.Lƒ$200C0D00ŠFORM�FEEDFFOUTE„EQU„*-2 HLINE…EQU„* ŠDC.Bƒ'PAGE‚'&ASCIIPGƒDC.Bƒ'†'‹FOR�ASCII�PAGE�NUMBER ŠDC.Bƒ'‚'ŠDC.Bƒ'LIST�VER‚'VERSIONƒDS.Lƒ2’FOR�VERSION ŠDC.Bƒ'‚'VDATE…DC.Bƒ'XX/XX/XX‚'VTIME…DC.Bƒ'XX:XX:XX‚'* HMSGI…EQU„*HDG2†DS.Bƒ130-(*-HLINE)HMSGIE„EQU„*-1"HDGEND„DC.Lƒ0’HOLDS�HEADING�LENGTH* OPMSGS„EQU„* ŠDC.Bƒ$0D ŠDC.Bƒ$0A.ŠDC.Bƒ'Legal�options�in�interactive�mode�are:' ŠDC.Bƒ$0D ŠDC.Bƒ$0AŠDC.Bƒ'''H''�-�Define�heading' ŠDC.Bƒ$0D ŠDC.Bƒ$0A6ŠDC.Bƒ'''F''�-�Define�nonstandard�row�&�column�counts' ŠDC.Bƒ$0D ŠDC.Bƒ$0A2ŠDC.Bƒ'''L''�-�Put�line�numbers�on�listing�output' ŠDC.Bƒ$0D ŠDC.Bƒ$0A9ŠDC.Bƒ'''D''�-�Display�(list)�a�range�of�logical�records' ŠDC.Bƒ$0D ŠDC.Bƒ$0AŠDC.Bƒ'''QUIT''�-�To�quit' ŠDC.Bƒ$0D ŠDC.Bƒ$0AOPMSGE„EQU„*-1ŠDS…0 FMSGS…EQU„* ŠDC.Bƒ$0D ŠDC.Bƒ$0A7ŠDC.Bƒ'Enter�row�and�column�counts�separated�by�comma:' ŠDC.Bƒ$0D ŠDC.Bƒ$0A FMSGE…EQU„*-1ŠDS…0** DMSGS…EQU„* ŠDC.Bƒ$0D ŠDC.Bƒ$0A+ŠDC.Bƒ'Enter�starting,ending�line�numbers:' ŠDC.Bƒ$0D ŠDC.Bƒ$0A DMSGE…EQU„*-1ŠDS…0* LMSGS…EQU„* ŠDC.Bƒ$0D ŠDC.Bƒ$0AŠDC.Bƒ'Enter�base�line�number:' ŠDC.Bƒ$0D ŠDC.Bƒ$0A LMSGE…EQU„*-1*ŠDS…0’EVEN�BYTE�BOUNDARY&DSOUTS„DC.Lƒ$0D0A0D0AŠDOUBLE�LINE�FEEDDSOUTE„EQU„*-1*** DMSGBS„EQU„* ŠDC.Bƒ$0D ŠDC.Bƒ$0A(ŠDC.Bƒ'Enter�range�of�lines�as�follows:' ŠDC.Bƒ$0D ŠDC.Bƒ$0A/ŠDC.Bƒ'''D�S,T''�to�list�from�line�S�to�line�T' ŠDC.Bƒ$0D ŠDC.Bƒ$0A)ŠDC.Bƒ'A�leading�''$''�implies�hex�input' ŠDC.Bƒ$0D ŠDC.Bƒ$0A%ŠDC.Bƒ'S�and�T�must�be�larger�than�0' ŠDC.Bƒ$0D ŠDC.Bƒ$0ADMSGBE„EQU„*-1ŠDS…0’FORCE�EVEN�BOUNDARY** FM SGBS„EQU„* ŠDC.Bƒ$0D ŠDC.Bƒ$0A/ŠDC.Bƒ'Enter�row�and�column�counts�as�follows:' ŠDC.Bƒ$0D ŠDC.Bƒ$0A1ŠDC.Bƒ'''R,C''�where�R�is�the�row�count�per�page' ŠDC.Bƒ$0D ŠDC.Bƒ$0A,ŠDC.Bƒ'and�C�is�the�column�count.‚R�must�be' ŠDC.Bƒ$0D ŠDC.Bƒ$0A1ŠDC.Bƒ'greater�than�9.‚C�must�be�greater�than�0.' ŠDC.Bƒ$0D ŠDC.Bƒ$0AFMSGBE„EQU„*-1ŠDS…0*'* INPUT BUFFER FOR INTERACTIVE DIALOGUE*OPINLGHƒEQU„60‘LENGTH(BYTES)OPINPBUF‚DS.BƒOPINLGHŒBUFFERŠDS…0’EVEN�BYTE�BOUNDARY**&*ƒCHANGE�LU�ASSIGNMENT�PARAMETER�BLOCK*.LDFLSTLU‚EQU„*’CHANGE�LU�ROM�LDFLUN�TO�LISTLUN2ŠDC.WƒFHCHLU�CODE=1,�COMMAND=$10�(CHANGE�LU�ASSGN)ŠDC.WƒFOPKEP+FOPSLU†KEEP,SENDŠDC.Bƒ0’STATUS%ŠDC.BƒLDFLUN�SEND�LOGICAL�UNIT�NUMBER)ŠDC.BƒLISTLUNŒRECEIVE�LOGICAL�UNIT�NUMBERŠDC.Bƒ0’RESERVEDŠDC.Lƒ0’TASK�ID�(0=SELF)ŠDC.Lƒ0’SESSION�#(0=SELF)*7*ƒASSIGN�LISTING�LU�TO�DEVICE�SPECIFIED�IN�OUTPUT�FIELD*&ŠFHS.LIST�FHASGN,FOPEW,LISTLUN,0,0,$00*4*ƒASSIGN�INPUT�LU�TO�DEVICE�SPECIFIED�ON�INPUT�FIELD*ŠFHS.INP�FHASGN,FOPPR,INPLUN'ŠDC.Lƒ0’SHARED�SEG�LOG�STARTING�ADDRESS'ŠDC.Lƒ0’FHS�FILLS�IN�SEG�ENDING�ADDRESS(ŠDC.Lƒ0’FHS�FILLS�IN�SHARED�SEGMENT�NAME*3*‚I/O�PARAMETER�BLOCK�FOR�GENERAL�MESSAGES�(�INPUT)*$ŠIOS.MSGI�IOREAD,,CDFLUN,,,,,OPINLGH*+*�I/O�PARAMETER�BLOCK�FOR‚MESSAGES�(OUTPUT)*$ŠIOS.MSG�IOWRIT,IOPIMG+IOPCNP,LDFLUN* * I/O PARAMETER BLOCK FOR OUTPUT*ŠIOS.LST�IOWRIT,,LISTLUN*(* I/O PARAMETER BLOCK TO INPUT FROM FILE*'ŠIOS.INP�IOREAD,IOPRAN,INPLUN,0,,,,LINL*'* 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�BLK,ŠDC.Bƒ0’ERROR�OPTIONS�[BIT�0=QUERY�RESPONSE]'ŠDC.BƒLDFLUN�USER�LDFLUN�LUN�FOR�SCREENŠDC.Bƒ0’QUERY�RETURN�CHARACTER%ŠDC.BƒCDFLUN�USER�CDFLUN�FOR�KEYBOARD(ŠDC.Lƒ0’BEGINNING�OF�USER�TEXT�PLUG�POOL"ŠDC.Lƒ0’END�OF�USER�TEXT�PLUG�POOL**#DVASGMSƒDC.Bƒ'Can''t�list�a�device' ŠDC.Bƒ$0D ŠDC.Bƒ$0ADVASGMEƒEQU„*-1ŠDS…0*,CONMSGSƒDC.Bƒ'Can''t�list�a�contiguous�file' ŠDC.Bƒ$0D ŠDC.Bƒ$0ACONMSGEƒEQU„*-1ŠDS…0*:OVRMSGSƒDC.Bƒ'Output�file�exists�-‚OK�to�overwrite(Y/N)�?' ŠDC.Bƒ$0D ŠDC.Bƒ$0AOVRMSGEƒEQU„*-1ŠDS…0**9INOUTS„DC.Bƒ'Error�-�input�and�output�names�are�the�same' ŠDC.Bƒ$0D ŠDC.Bƒ$0AINOUTE„EQU„*-1ŠDS…0+IOPTMSGS‚DC.Bƒ'Only�''I''�option�processed' ŠDC.Bƒ$0D ŠDC.Bƒ$0AIOPTMSGE‚EQU„*-1ŠDS…0** * I/O BUFFER*5ŠDS.Bƒ16-((*-B)-((*-B)/16)*16)�FORCE�16-BYTE�BOUNDARY LNOUT1„DS.Bƒ6 ŠDC.Bƒ'‚' LINS†EQU„*LNOUT2„DS.Bƒ256 LINE†EQU„*-1LINL†EQU„LINE-LINS*ŠPAGEŠOPT�MEX ŠOPT�NOCLH************************************************************************* LIST CODE AREAH************************************************************************* LIST†EQU„*4ŠLEA„B(PC),A6�BASE�REGISTER�FOR�POSITION�INDEPENDENT*ŠLEA„STACK(PC),A7‹INITIALIZE�STACK�POINTER7ŠMOVEM.L�D0-D7/A0-A1,INITDREG-B(A6)�INITIAL�D-REGISTERS%************************************** INITIALIZE DATA AREAS*.ŠMOVEM.L�(A6),D0-D1ˆSET�UP�FOR�VERSION�MESSAGEŠMOVEM.L�D0-D1,VERSION-B(A6)ŠLEA„OPINPBUF(PC),A0=ŠMOVE.L�A0,MSGIIOS+IOSSAD-B(A6)�BUFFER�BASE�FOR�MESSAGE�INPUTŠLEA„OPINPBUF+OPINLGH-1(PC),A0<ŠMOVE.L�A0,MSGIIOS+IOSEAD-B(A6)�BUFFER�END�FOR�MESSAGE�INPUTŠLEA„LINS(PC),A09ŠMOVE.L�A0,INPIOS+IOSSAD-B(A6)‚BUFFER�BASE�FOR�FILE�INPUTŠLEA„LINE(PC),A08ŠMOVE.L�A0,INPIOS+IOSEAD-B(A6)‚BUFFER�END�FOR�FILE�INPUT%**************************************.* GET DATE AND TIME SET UP FOR VERSION MESSAGE*%*************************************ŠMOVE.L�#GTDTIM,D0ŠLEA„TIMBLK(PC),A0ŠTRAPƒ#1ŠMOVE.L�TIMBLK-B(A6),D0ŠBSR„DATEOJ�CONVERT�TO�JULIAN ŠBSR„DATEJG�CONVERT�TO�GREGORIAN*ŠMOVE.L�D0,TMPDATE-B(A6)ƒSAVE�ORDINAL�DATEŠAND.L‚#$FF,D0ŒMASK�TO�DAY ŠMOVE.L�#2,D1ŠLEA„VDATE+3(PC),A0,ŠBSR„BINDECFJ‹CONVERT�DAY�TO�ASCII�AND�STUFF$ŠMOVE.B�TMPDATE+2-B(A6),D0‡GET�MONTHŠLEA„VDATE(PC),A0.ŠBSR„BINDECFJ‹CONVERT�MONTH�TO�ASCII�AND�STUFFŠMOVE.W�TMPDATE-B(A6),D0‰YEARŠLEA„HOLDDATE(PC),A0+ŠBSR„BINDEC�CONV ERT�YEAR�TO�ASCII�AND�STUFF&ŠMOVE.W�HOLDDATE+2-B(A6),VDATE+6-B(A6) * CONVERT TIME OF DAY INTO ASCII*ŠMOVE.L�TIMBLK+4-B(A6),D1ˆMS�PAST�MIDNIGHTŠCLR.L‚D0‘HOUR�COUNTERTL1‡SUB.L‚#1000*60*60,D1&ŠBCS.S‚TL2�BRANCH�IF�HOURS�ALL�COUNTEDŠADD.L‚#1,D0ŽACCUMULATE�HOURS ŠBRA.S‚TL1/TL2‡ADD.L‚#1000*60*60,D1…TOTAL�#�HOURS�IS�IN�D0 ŠMOVE.L�D1,D3+ŠLEA„HOLDDATE(PC),A0ˆWHERE�TO�DEPOSIT�ASCII,ŠBSR„BINDEC�CONVERT�HOUR�TO�BINARY�AND�STUFF$ŠMOVE.W�HOLDDATE+2-B(A6),VTIME-B(A6)&ŠDIVUƒ#60*1000,D3ˆ#�OF�MINUTES�IN�D3.W ŠCLR.L‚D0%ŠMOVE.W�D3,D0ŽNUMBER�OF�MINUTES�IN�D0ŠLEA„HOLDDATE(PC),A0.ŠBSR„BINDEC�CONVERT�MINUTES�TO�BNARY�AND�STUFF&ŠMOVE.B�HOLDDATE+2-B(A6),VTIME+3-B(A6)&ŠMOVE.B�HOLDDATE+3-B(A6),VTIME+4-B(A6) ŠCLR.W‚D3ŠSWAPƒD3(ŠDIVUƒ#1000,D3‹NUMBER�OF�SECONDS�IN�D3.W ŠMOVE.W�D3,D0ŠLEA„HOLDDATE(PC),A0/ŠBSR„BINDEC�CONVERT�SECONDS�TO�BINARY�AND�STUFF&ŠMOVE.W�HOLDDATE+2-B(A6),VTIME+6-B(A6)ŠPAGE** PARSE THE COMMAND LINE*,ŠLEA„CLINE(PC),A0‹INPUT�COMMAND�LINE�ADDRESS ŠBSR„PARSE ŠTST.L‚D0&ŠBPL.S‚CMLOKŽBRANCH�IF�COMMAND�LINE�OK4CLERR…MOVE.L�#EM_NVE,D0‰COMPLAIN�OF�BAD�COMMAND�LINE ŠBSR„ERRMSGŠBRA.S‚LISTERR CMLOK…EQU„*9ŠMOVEM.L�A1-A2,PARSAREG-B(A6)�SAVE�RETURN�REGS�FROM�PARSE*@* ON RETURN FROM PARSE, A1=ADDR OF OUTPUT FIELD OR 0, A2=ADDR OF*‚OPTIONS�FIELD�OR�0.*=* GET US SET UP SO THAT LU LISTLU (3) POINTS TO PROPER OUTPUT*)ŠMOVE.L�A1,D0ŽJUST�TO�SET�CONDITION�CODES7ŠBNE.S‚GETOUT�BRANCH�IF�WE�HAVE�OUTPUT�DEVICE�SPECIFIED/ŠBSR„SETLSTLU‹CHANGE�LDFLUN�TO�LISTLUN�AND�KEEP)ŠBRA.S‚DOINPUTŒGO�ANALYZE�INPUT�PARAMETER GETOUT„EQU„*5ŠBSR.S‚CKINOUTŒCHECK�FOR�INPUT/OUTPUT�NAMES�DIFFERENT,ŠBSR„NEWOUT�SET�UP�OPERATOR�SPECIFIED�OUTPUT-ŠBSR„PRTSET�SET�PRINTER�COLUMN�AND�ROW�COUNTS*<* GET US SET UP SO THAT LU INPUTLU(1) POINTS TO PROPER INPUT* DOINPUTƒEQU„* ŠBSR„NEWIN** SET UP DEFAULT HEADING* ŠBSR„DEFHDG** NOW PROCESS OPTIONS FIELD* ŠBSR„PROCOPT *,* NOW GO HANDLE THE USERS REQUEST, THEN EXIT* ŠBSR„DOITLISTEXIT‚CLR.L‚D0 ŠERQ.TERMLISTERRƒERQ.TERM�#0,#$C000ŠPAGE$************************************G* SUBROUTINE TO SEE IF ANY INPUT FILE NAME MATCHES THE OUTPUT FILE NAME CKINOUTƒEQU„*)ŠMOVE.L�A6,A1ŽSAVE�A6�FOR�DEFAULTS‚122084(ŠLEA„LISTFHS(PC),A6‰POINT�TO�PARAM�TABLE2ŠMOVE.W�#'LS',FHSEXT(A6)ƒDEFAULT�EXTENSION�IS�'LS' ŠBSR„DEFAULTS?ŠMOVE.L�OUTPSRT-B(A1),A0ƒSTART�OF�OUTPUT�FIELD�CMND�LINE‚122084*/* DO EDIT FILE TO FILL REMANING PARAMETER BLOCK ŠBSR„EDITFILEŠLEA„B(PC),A6�REBASE�A6 ŠTST.L‚D0%ŠBMI„CLERRŽBRANCH�ON�BAD�COMMAND�LINE1ŠBTSTƒ#0,D0ŽIS�THERE�ANOTHER�FILE�ON�OUTPUT�PART? ŠBNE„CLERRŽBRANCH�IF�YES�-�ERROR2ŠMOVE.L�D0,EDITOUT-B(A6)ƒSAVE�RETURN�FROM�EDITFILE*&ŠLEA„CLINE(PC),A0‹COMMAND�LINE�ADDRESS)ŠMOVE.L�A6,A1ŽSAVE�A6�FOR�DEFAULTS‚122084ŠLEA„INPFHS(PC),A6(ŠBSR„DEFAULTS‹FILL�INPUT�FHS�PARAM�BLOCK9NEWINE1ƒMOVE.W�#'SA',FHSEXT(A6)ƒDEFAULT�EXTENSION�IS�'SA' ŠBSR„EDITFILEŠLEA„B(PC),A6�REBASE�A6ŠMOVE.L�A0,EDITSVA0-B(A6)ŠMOVE.L�D0,EDITRTN-B(A6)ŠLEA„INPFHS+FHSVOL(PC),A1ŠLEA„LISTFHS+FHSVOL(PC),A2ŠLEA„INPFHS+FHSEXT(PC),A0CMPINOUT‚CMPM.W�(A1)+,(A2)+ŠBNE.S‚NMCH�BRANCH�IF�NO�MATCH ŠCMP.L‚A0,A1ŠBLS.S‚CMPINOUT*%* INPUT FILE = OUTPUT FILE - COMPLAIN8ŠLEA„INOUTS(PC),A0Š'ERROR�-�INPUT�AND�OUTPUT�NAMES�SAME'ŠLEA„INOUTE(PC),A1 ŠBSR„MSGOUTIŠBRA„LISTERRŒABNORMAL�EXIT*NMCH†MOVE.L�EDITSVA0-B(A6),A0>ŠBTSTW‚#0,EDITRTN+2-B(A6)�IS�THERE�ANOTHER�FILE�ON�INPUT�LINE?'ŠBNE.S‚NEWINE1ŒGO�CHECK�FOR�MATCH�AGAINŠRTS„OK‘-�SO�RETURN%*************************************%* SUBROUTINE TO PROCESS OPTIONS FIELD)*ƒSCANS�UNTIL�OPTIONS�FIELD�IS�EXHAUSTED.*ƒINITIALIZES�OPTIONS�TABLE.;*ƒPUTS�UP�ERROR�MESSAGE�AND�BRANCHES�TO�LISTERR�IF�ERROR�IS*ƒENCOUNTERED.** PROCOPTƒEQU„*.ŠMOVE.L�OPTSRT-B(A6),A2ŠSTART�OF�OPTIONS�FIELD$ŠMOVE.L�A2,D0ŽTO�SET�CONDITION�CODES"ŠBEQ.S‚OPTOVR�BRANCH�IF�NO�OPTIONS NXTOPT„EQU„* ŠCLR.L‚D3 ŠBSR„OPTION ŠBTSTƒ#7,D0ŽWAS�THERE�AND�ERROR?ŠBEQ.S‚NXTOPT2ŒBRANCH�IF�NO3ŠBSR.S‚BADOPT�YES�-�COMPLAIN�VIA�ERROR�MESSAGE�HDLR ŠBRA„LIS TERR7NXTOPT2ƒCMP.B‚#$40,D0ŒHAVE�WE�FINISHED�ALL�THE�OPTIONS?ŠBEQ.S‚OPTOVR�BRANCH�IF�YES#ŠAND.B‚#$10,D0ŒSEE�IF�'='�SPECIFIEDŠBNE.S‚EQUALSPŒBRANCH�IF�NO ŠCLR.L‚D3‘FORCE�ZERO�IF�NO�EQUAL EQUALSPƒEQU„*ŠMOVE.L�A2,-(A7) ŠBSR.S‚OPTABLŠBRA.S‚OPOK�BRANCH�IF�OPTION�OK$ŠBSR.S‚BADOPT�COMPLAIN�IF�OPTION�BADŠBRA„LISTERRŒGET�OUTOPOK†MOVE.L�(A7)+,A2 ŠMOVE.L�#1,D0:ŠADD.W‚D0,OPCNT-B(A6)…BUMP�NUMBER�OF�OPTIONS�FOUND�COUNTER(ŠMOVE.L�D3,OPTNUM(A0)†SAVE�OPTION�NUMBER0ŠBNE.S‚NXTOPT�BRANCH�IF�NONZERO�NUMBER�SPECIFIED&ŠCMP.B‚#'L',D1ŒWAS�THIS�THE�'L'�OPTIONŠBNE.S‚NXTOPT�BRANCH�IF�NO8ŠMOVE.L�#1,OPTNUM(A0)†0�ILLEGAL�FOR�'L'�OPT�-�FORCE�TO�1 ŠBRA.S‚NXTOPT�GO�FOR�NEXT�OPTION3OPTOVR„TST.B‚QOPT+1-B(A6)‡WAS�'Q'�OPTION�SPECIFIED?ŠBNE.S‚OPTOVR2ŒBRANCH�IF�YES-ŠTST.B‚DOPT+1-B(A6)‡WAS�'D'�OPTION�SPECIFIED?ŠBEQ.S‚OPTOVR4ŒBRANCH�IF�NO)OPTOVR2ƒBSR.S‚BADOPT�BAD�OPTION�SPECIFIED ŠBRA„LISTERROPTOVR4ƒMOVE.L�#1,D01ŠCMP.W‚OPCNT-B(A6),D0‹SEE�IF�MORE�THAN�ONE�OPTIONŠBHS.S‚OPTOVX�BRANCH�IF�NO-ŠTST.B‚IOPT+1-B(A6)‡WAS�'I'�OPTION�SPECIFIED?ŠBEQ.S‚OPTOVX�BRANCH�IF�NOŠLEA„IOPTMSGS(PC),A0ŠLEA„IOPTMSGE(PC),A14ŠBSR„MSGOUTIŒLET�THEM�KNOW�ONLY�'I'�OPTION�PROCESSED OPTOVX„RTS* BADOPT„EQU„*2ŠMOVE.L�#EM_NVO,D0‰KEY�FOR�INVALID�OPTIONS�MESSAGE.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN,ŠBTSTƒ#0,SAVD7+3-B(A6)ƒARE�WE�IN�CHAIN�MODE?"ŠBEQ„LISTERRŒBRANCH�IF�YES�-�ERRORŠRTS$************************************E* SUBROUTINE TO HUNT FOR OPTION LETTER AMONG LEGAL LETTERS IN OPTABLS*ƒINPUT:ƒD1�-�OPTION�LETTER)*ƒOUTPUT:‚OUTPUT�FLAG�SET�IN�OPTION�TABLE*�POSITIVE�IF�NO�"-"�SPECIFIED*�NEGATIVE�IF�"-"�SPECIFIED*ŒA0�-�POINTS�TO�TABLE�ENTRY(*ŒA1�-�CONTAINS�FIRST�PROCESSING�ADDRESS)*ŒA2�-�CONTAINS�SECOND�PROCESSING�ADDRESS!*ŒRETURN�TO�PC�IF�OPTION�IS�LEGAL%*ŒRETURN�TO�PC+2�IF�OPTION�IS�ILLEGAL* OPTABL„EQU„*)ŠLEA„OPTABLS(PC),A0‰START�OF�OPTION�TABLE'ŠLEA„OPTABLE(PC),A1‰END�OF�OPTION�TABLE)CMPNXTOƒCMP.B‚(A0),D1ŒIS�THIS�THE�OPTION?,ŠBEQ.S‚OPFOUNDŒBRANCH�IF�WE�FOUND�THE�OPTION+ŠADD.W‚#OPTELGH,A0ˆEXAMINE�NEXT�TABLE�ENTRYŠCMP.L‚A0,A1ŽARE�WE�THROUGH?ŠBNE.S‚CMPNXTOŒBRANCH�IF�NOT&ŠADD.L‚#2,(A7)ŒBIAS�RETURN�FOR�NO�FINDŠBRA.S‚OPTABLRŒRETURN�TO�CALLER OPFOUNDƒEQU„*$ŠMOVEQ‚#1,D0ŽASSUME�NO�"-"�SPECIFIED ŠTST.L‚D1$ŠBHI.S‚OPFLAGSŒBRANCH�IF�I�WAS�RIGHTŠMOVEQ‚#-1,D0�FLAG�SET�TO�MINUS(OPFLAGSƒMOVE.B�D0,OPTFL(A0)‡SET�THE�FLAG)ŠMOVE.L�OPTADR1(A0),A1…PROCESSING�ADDRESS)ŠMOVE.L�OPTADR2(A0),A2…PROCESSING�ADDRESSŠADD.L‚A6,A1ŽADD�BASE�ADDRESS ŠADD.L‚A6,A2%ŠCLR.L‚D0‘SET�CONDITION�CODES�TO�ZEROOPTABLRƒRTS„BACK�TO�MAINLINEŠPAGE$************************************B* SUBROUTINE TO SET UP LISTLUN (NORMALLY 3) TO DEVICE SPECIFIED ON*ƒOUTPUT�PARAMETER.** NEWOUT„EQU„*** SEE IF OUTPUT IS A DEVICE<ŠMOVE.L�EDITOUT-B(A6),D0‰SAVED�FROM�EDITFILE�OF�OUTPUT�FIELDŠBTSTƒ#1,D0ŽIS�OUTPUT�A�DEVICE?ŠBNE.S‚YESDEV�BRANCH�IF�YES5ŠMOVE.L�#132,COLCNT-B(A6)‚ADJUST�DEFAULT�COLUMN�COUNT* TRY TO ASSIGN OUTPUT FILE6ŠMOVE.W�#FHASGN,LISTFHS+FHSCMD-B(A6)�SET�UP�FOR�ASSIGNŠLEA„LISTFHS(PC),A0ŠTRAPƒ#3%ŠBEQ.S‚OVRWRITE‹BRANCH�IF�GOOD�ASSIGN>* ASSIGN FAILED - SEE IF NONEXISTENT FILE AND IF NOT, COMPLAINŠCMP.B‚#FSTANNM,D0$ŠBEQ.S‚ASGALLOŒBRANCH�IF�NONEXISTENT.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAINŠBRA„LISTERRŒABNORMAL�EXIT*"* ASK IF THEY WISH US TO OVERWRITE7OVRWRITE‚LEA„OVRMSGS(PC),A0‰'DO�YOU�WISH�TO�OVERWRITE?'ŠLEA„OVRMSGE(PC),A1 ŠBSR„MSGOUTI ŠBSR„POUTIN ŠMOVE.B�OPINPBUF-B(A6),D0ˆANSWERŠCMP.B‚#'Y',D0ŠBNE„LISTEXIT‹BRANCH�IF�NO*B*�THEY�WISH�TO�OVERWRITE�A�FILE�THAT�ALREADY�EXISTS.‚FREE�THE�FILE1*ƒAND�DELETE�IT,�THEN�REALLOCATE�IT�AND�ASSIGN�IT2ŠMOVE.W�#FHCLOS,LISTFHS+FHSCMD-B(A6)�CLOSE�COMMANDŠLEA„LISTFHS(PC),A0ŠTRAPƒ#33ŠMOVE.W�#FHDELT,LISTFHS+FHSCMD-B(A6)�DELETE�COMMANDŠTRAPƒ#3"ŠBEQ.S‚ASGALLOŒBRANCH�IF�DELETE�OK.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN ŠBRA„LISTERR** ALLOCATE AND ASSIGN FILE2ASGALLOƒMOVE.W�#FHASGN+FHALLO,LISTFHS+FHSCMD-B(A6)3ŠCLR.L‚LISTFHS+FHSLRL-B(A6)�VARIABLE�LENGTH�RECORDS?ŠMOVE.W�#FOPSEQ+FO PEW,LISTFHS+FHSOPT-B(A6)�SEQ,�EXCLUSIVE�WRITE ŠBRA.S‚ASGIT*<* IF OUTPUT FIELD WAS JUST A '#' THEN HANDLE AS SPECIAL CASE*;YESDEV„AND.W‚#(1<<14+1<<1),D0ƒSEE�IF�JUST�'#'�WAS�SPECIFIEDŠCMP.W‚#(1<<14+1<<1),D0#ŠBNE.S‚ASGITŽBRANCH�IF�NOT�JUST�'#'*ŠBSR„SETLSTLU‹CHANGE�LU�NUMBER�FOR�LISTING ŠBRA.S‚ASGOK1** ASSIGN TO LISTLU*ASGIT…LEA„LISTFHS(PC),A0ŠTRAPƒ#3)ŠBEQ.S‚ASGOK1�BRANCH�IF�ASSIGNMENT�WAS�OK5ASGERRMƒBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAINŠBRA„LISTERRŒGET�OUT ASGOK1„RTS%*************************************:* SUBROUTINE TO ASSIGN INPUT DEVICE TO INPLUN (NORMALLY 1)* NEWIN…EQU„**NEWIN1„LEA„CLINE(PC),A0/NEWIN2„MOVE.L�A6,A1ŽSAVE�A6�FOR�DEFAULTS‚122084"ŠLEA„INPFHS(PC),A6ŠINPUT�FHS�BLOCKŠBSR.S‚DEFAULTS ŠBSR„EDITFILE ŠLEA„B(PC),A6ŠMOVE.L�A0,EDITSVA0-B(A6)2ŠMOVE.L�D0,EDITRTN-B(A6)ƒSAVE�RETURN�FROM�EDITFILEŠBMI„CLERRŽBRANCH�ON�EDIT�ERRORŠAND.L‚#$400,D0+ŠBEQ.S‚EXTSPC�BRANCH�IF�EXTENSION�SPECIFIED8ŠMOVE.W�#'SA',INPFHS+FHSEXT-B(A6)�DEFAULT�TO�EXT�OF�'SA' EXTSPC„EQU„*"* INSURE THAT THIS IS NOT A DEVICEŠMOVE.L�EDITRTN-B(A6),D1 ŠAND.B‚#2,D1)ŠBEQ.S‚NEWINOK1‹BRANCH�IF�NOT�DEVICE�(OK)5ŠLEA„DVASGMS(PC),A0‰COMPLAIN�OF�TRYING�TO�LIST�DEVICEŠLEA„DVASGME(PC),A1 ŠBSR„MSGOUTI ŠBRA„LISTERRŒGET�OUT�IMMEDIATELY*NEWINOK1‚EQU„** NOW ASSIGN THE INPUT DEVICE*%ŠLEA„INPFHS(PC),A0ŠCOMMAND�LINE�STUFFŠTRAPƒ#3#ŠBNE„ASGERRMŒBRANCH�ON�ASSIGN�ERRORŠMOVE.W�INPFHS+FHSOPT-B(A6),D0,ŠAND.W‚#FFTBIT,D0‰IS�THIS�A�CONGIGUOUS�FILE?ŠBNE.S‚NEWINOK4‹BRANCH�IF�NO6ŠLEA„CONMSGS(PC),A0‰TELL�THEM�WE�CAN'T�LIST�CONTIGUOUSŠLEA„CONMSGE(PC),A1 ŠBSR„MSGOUTIŠBRA„LISTERRŒERROR�EXIT NEWINOK4‚RTS%*************************************F* SUBROUTINE TO PUT DEFAULT VALUES INTO FHS PARAMETER BLOCK POINTED TO9*ƒBY�A6.‚BASE�REGISTER�HAS�BEEN�PUT�INTO�A1�FOR�THIS�S/R.*DEFAULTS‚EQU„*3ŠMOVE.W�USERNUM+2-B(A1),FHSUSN(A6)�DEFAULT�USER�NUM+ŠMOVE.L�VOLNAM-B(A1),FHSVOL(A6)‚VOLUME�NAME,ŠMOVE.L�CATNAM-B(A1),FHSCLG(A6)‚CATALOG�NAME8ŠMOVE.L�CATNAM+4-B(A1),FHSCLG+4(A6)�2ND�PART�OF�CAT�NAMEŠRTS%*************************************A* SUBROUTINE TO CHANGE LOGICAL UNIT NUMBER FROM LDFLUN TO LISTLUN *ƒWITH�KEEP.*SETLSTLU‚EQU„*ŠLEA„LDFLSTLU(PC),A0ŠTRAPƒ#3#ŠBEQ.S‚SETLSTEX‹BRANCH�IF�NO�ERRORS.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN ŠBRA„LISTERR SETLSTEX‚RTS%*************************************=* SUBROUTINE TO FETCH DEVICE ATTRIBUTES AND SET UP PARAMETERS;*ƒFOR�PRETTY�PRINT�IF�OUTPUT�DEVICE�SPECIFIED�WAS�A�PRINTER* PRTSET„EQU„*9ŠMOVE.W�#FHRATT,LISTFHS-B(A6)�MAKE�CODE�AND�OPTIONS�RIGHT&ŠLEA„LISTFHS(PC),A0‰RECEIVE�ATTRIBUTESŠTRAPƒ#3!ŠBEQ.S‚PRTSET2ŒBRANCH�IF�NO�ERROR ŠBSR„ERRMSG ŠBRA„LISTERR6PRTSET2ƒMOVE.W�LISTFHS+FHSWCD-B(A6),D0‚ATTRIBUTES�WORDŠBTSTƒ#9,D0ŽWAS�IT�A�PRINTER?"ŠBEQ.S‚PRTSETXŒEXIT�IF�NOT�PRINTER8ŠMOVE.L�LISTFHS+FHSSIZ-B(A6),ROWCNT-B(A6)�SAVE�ROW�COUNT6ŠSUB.L‚#6,ROWCNT-B(A6)„BIAS�FOR�TOP�AND�BOTTOM�MARGINS;ŠMOVE.W�LISTFHS+FHSLRL-B(A6),COLCNT-B(A6)�SAVE�COLUMN�COUNT PRTSETXƒRTS%*************************************>* SUBROUTINE TO OUTPUT MESSAGE, THEN SOLICIT INPUT WITH PROMPT**0*ƒINPUT:ƒA0�-�START�ADDRESS�OF�MESSAGE�TO�OUTPUT'*ŒA1�-�END�ADDRESS�OF�MESSAGE�TO�OUTPUT*ƒOUTPUT:‚A0�-�DESTROYED8*ŒZERO�STATUS�REFLECTS�GOOD�I/O�-�NONZERO�REFLECTS�ERROR4*ŒINPUT�BUFFER�IS�DEFINED�IN�MSGIIOS�PARAMETER�BLOCK*MSGOUTIN‚EQU„*ŠBSR.S‚MSGOUTIŒOUTPUT�MESSAGEŠBNE.S‚MSGOIX�BRANCH�ON�ERROR1POUTIN„LEA„PROMPTC(PC),A0‰SET�UP�TO�OUTPUT�PROMPTŠLEA„PROMPTCE(PC),A1ŠBSR.S‚MSGOUTIŒOUTPUT�PROMPTŠBNE.S‚MSGOUTER‹BRANCH�IF�ERROR ŠLEA„MSGIIOS(PC),A0‰ACCEPT�INPUTŠTRAPƒ#2ŠBEQ.S‚MSGIISUBMSGOUTER‚CMP.B‚#ISTABRK,D0 ŠBEQ„BREAKSV2PERR†BSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN ŠBRA„LISTERRMSGIISUB‚BSR„SBARG ŠBNE„PERR MSGOIX„RTS%************************************** SUBROUTINE TO OUTPUT MESSAGES**ƒENTRY:�A0�=�BEGINNING�ADDRESS�OF�MESSAGE *ŠA1�=�ENDING�ADDRESS�OF�MESSAGE*-MSGOUTIƒOR.W ƒ#(1<�-�OKŠCMP.B‚#'�',D1)ŠBNE.S‚IOPTBAD2‹BRANCH�IF�NOT�BLANK�-�BAD!IOPG2…MOVE.B�0(A1,D2.L),D1†LETTER1ŠMOVEM.L�A1/D0/D2,-(A7)„SAVE�GOOD�STUFF�THRU�CALLŠBSR„OPTABL�GO�FIND�OPTION#ŠBRA.S‚IOPTOK1ŒBRANCH�IF�OPTIONS�OK(ŠADD.L‚#12,A7�BYPASS�SAVED�REGS�ON�STACK*IOPTBAD2‚BSR„BADOPT�COMPLAIN�OF�BAD�OPTION"ŠBRA„IOPTCŽGO�TAKE�NEXT�SUBCOMMAND IOPTOK1ƒEQU„*.ŠMOVEM.L�(A7)+,A1/D0/D2„RESTORE�GOOD�REGISTERSŠJSR„(A2)�GO�HANDLE�OPTIONŠBRA„IOPTC2�GO�FOR�NEXT�OPTION%*************************************8* SUBROUTINE TO SKIP BLANKS ON LINE OF INTERACTIVE INPUT#*ƒINPUT:‚D0�=�LENGTH�OF�KEYED�INPUT9*‹D2�=�WHEN�ADDED�TO�A1,�POINTS�TO�CHARACTER�IN�TEXT�LINE*‹A1�=�BASE�OF�KEYED�INPUT*ƒOUTPUT:�PC�IF�NON�BLANK�FOUND/*‹PC+2�IF�LINE�EXHAUSTED�BEFORE�NON�BLANK�FOUND8*‹D2�=�REFLECTS�CHARACTER�POSITION�OF�NONBLANK�CHARACTER* BLNKSKPƒEQU„*-ŠCMP.L‚D0,D2ŽARE�WE�PAST�THE�END�OF�THE�LINE?ŠBHI.S‚BLNKSKX1‹BRANCH�IF�YESŠCMP.B‚#'�',0(A1,D2.L)+ŠBNE.S‚BLNKSKX2‹BRANCH�IF�NO�-�WE'VE�GOT�IT'ŠADD.L‚#1,D2ŽNO�-�SO�TRY�NEXT�CHARACTERŠBRA.S‚BLNKSKP)BLNKSKX1‚ADD.L‚#2,(A7)ŒEND�OF�LINE�RETURN BLNKSKX2‚RTS*B*  COME HERE FOR THOSE OPTIONS THAT DON'T APPLY IN INTERACTIVE MODE* IOPTI…EQU„* SOPTI…EQU„* TOPTI…EQU„*5ŠMOVE.L�#EM_NVE,D0‰LET�ERROR�MESSAGE�HANDLER�COMPLAIN ŠBSR„ERRMSG,ŠBTSTƒ#0,SAVD7+3-B(A6)ƒARE�WE�IN�CHAIN�MODE?ŠBEQ„LISTERRŒBRANCH�IF�YESŠRTS*$* S OPTION SPECIFIED ON COMMAND LINE* SOPTC…EQU„* ŠTST.L‚D0&ŠBNE.S‚SOPTC4�BRANCH�IF�NUMBER�OK�<>�0SOPTC2„MOVE.L�#EM_NVE,D0.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN ŠBRA„LISTERR7SOPTC4„SUB.L‚#1,D0ŽCORRECT�LINE�NUMBER�TO�RECORD�NUMBERŠMOVE.L�D0,SRTREC-B(A6)ŠRTS*$* T OPTION SPECIFIED ON COMMAND LINE* TOPTC…EQU„* ŠTST.L‚D0"ŠBEQ.S‚SOPTC2�BRANCH�IF�BAD�NUMBER1ŠSUB.L‚#1,D0ŽCORRECT�LINE�NUMBER�TO�RECORD�NUMBERŠMOVE.L�D0,ENDREC-B(A6)ŠRTS*$* D OPTION SPECIFIED ON COMMAND LINE* DOPTC…EQU„*ŠRTS—IGNORE�THIS�OPTIONŠPAGE*** HEADING OPTION SPECIFIED ON COMMAND LINE+*ƒCOMMAND�LINE�MODULES�ALWAYS�ENTERED�WITH:*…D0�=�OPTION�NUMBER#*…A0�=�POINTS�TO�OPTION�TABLE�ENTRY* HOPTC…EQU„*%ŠBSR.S‚BLNKHDGŒBLANK�OUT�HEADING�LINE0ŠLEA„HMSGS(PC),A0‹TELL�THEM�TO�ENTER�THE�HEADINGŠLEA„HMSGE(PC),A1 ŠBSR„MSGOUTINŠBNE„LISTERRŒBRANCH�IF�ERRORS7ŠMOVE.L�MSGIIOS+IOSLEN-B(A6),D0‚LENGTH�OF�HEADING�INPUT$ŠCLR.L‚D2‘POINTER�TO�FIRST�CHARACTERŠLEA„OPINPBUF(PC),A1#ŠBSR.S‚GETHDG�SAVE�THE�HEADING�AWAYŠBRA.S‚HOPEXITŒGET�OUT*(* HEADING OPTION SPECIFIED INTERACTIVELY**ƒINTERACTIVE�MODULES�ALWAYS�ENTERED�WITH:"*…D0�=�TOTAL�LENGTH�OF�KEYED�INPUT@*…D2�=�OFFSET�FROM�BEGINNING�OF�KEYED�INPUT�TO�SUBCOMMAND�LETTER*…A1�=�BEGINNING�OF�KEYED�INPUT** HOPTI…EQU„*%ŠADD.W‚#1,D2ŽBYPASS�SUBCOMMAND�LETTER%ŠCMP.L‚D0,D2ŽSEE�IF�OVER�END�OF�INPUT2ŠBLT.S‚HOPTI10ŒBRANCH�IF�HEADING�SPECIFIED�ON�LINE1ŠBSR.S‚HOPTCŽHANDLE�HEADING�NOT�SPECIFIED�ON�LINEŠBRA.S‚HOPRTS�GET�OUT*'HOPTI10ƒEQU„*’HEADING�SPECIFIED�ON�LINE1ŠADD.L‚#1,D2ŽPOINT�SCANNER�TO�1ST�CHAR�OF�HEADING%ŠBSR.S‚BLNKHDGŒBLANK�OUT�HEADING�LINE'ŠSUB.L‚D2,D0ŽCORRECT�LENGTH�FOR�HEADING ŠBSR.S‚GETHDGHOPEXITƒLEA„HMSGI(PC),A0*ŠADD.L‚A0,D0ŽACTUAL�HEADING�ENDING�ADDRESSŠMOVE.L�D0,HDGEND-B(A6) HOPRTS„RTS * SUBROUTINES FOR HEADING OPTION BLNKHDGƒEQU„*&ŠMOVE.L�#'„',D4‰BLANK�OUT�HEADING�LINEŠLEA„HMSGIE(PC),A3 ŠMOVE.L�A3,D3ŠLEA„HMSGI(PC),A3HOPTL1„MOVE.L�D4,(A3)+ ŠCMP.L‚D3,A3 ŠBCS.S‚HOPTL1ŠRTS6* ENTRY: D0=LENGTH, (A1,D2.L) POINT TO FIRST CHARACTER GETHDG„EQU„*#ŠLEA„HMSGI(PC),A2‹"MOVE�TO"�ADDRESS ŠADD.L‚D2,A1Ž"MOVE�FROM"�ADDRESSŠMOVE.L�D0,D1ŽLENGTH:GETHDGL1‚MOVE.B�(A1)+,(A2)+ˆMOVE�HEADING�TO�ITS�OWN�BUFFER ŠSUB.L‚#1,D1 ŠBGT„GETHDGL1ŠRTSŠPAGE*3* NONSTANDARD PAGE FORMAT SPECIFIED ON COMMAND LINE* FOPTC…EQU„*1ŠLEA„FMSGS(PC),A0‹TELL�'EM�TO�ENTER�ROW,COL�COUNTŠLEA„FMSGE(PC),A1 ŠBSR„MSGOUTINŠBNE„LISTERRŒBRANCH�IF�ERRORS/ŠMOVE.L�MSGIIOS+IOSLEN-B(A6),D0‚LENGTH�OF�INPUTŠCLR.L‚D2‘CHARACTER�OFFSET.FOPTC1„LEA„OPINPBUF(PC),A1ˆSTART�OF�INPUT�LINE ŠBSR„BLNKSKPŠBSR„ASCBIN�GET�BINARY�INTO�D04ŠCMP.L‚#ROWMIN,D0‰SEE�IF�DECLARED�ROW�SIZE�IN�BOUNDS"ŠBGE.S‚ROWOKŽBRANCH�IF�ROW�SIZE�OK2ROWSET„MOVE.L�#EM_NVE,D0‰TELL�'EM�THEY�DID�A�NO-NO.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN,ŠBTSTƒ#0,SAVD7+3-B(A6)ƒARE�WE�IN�CHAIN�MODE?ŠBEQ„LISTERRŒBRANCH�IF�YES,ŠLEA„FMSGBS(PC),A0ŠTELL�THEM�HOW�TO�ENTER�ITŠLEA„FMSGBE(PC),A1 ŠBSR„MSGOUTI&ŠBRA„FOPTCŽGO�GIVE�THEM�ANOTHER�CHANCE6ROWOK…MOVE.L�D0,ROWCNT-B(A6)„UPDATE�WITH�NEW�ROW�COUNTŠADD.L‚#1,D2ŽBYPASS�COMMA"ŠBSR„ASCBIN�GET�COLUMN�COUNT�IN�D04ŠCMP.L‚#COLMIN,D0‰SEE�IF�DECLARED�COL�SIZE�IN�BOUNDS%ŠBGE.S‚COLOKŽBRANCH�IF�COLUMN�SIZE�OK'ŠBRA.S‚ROWSET�TELL�'EM�THEY�DID�A�NO-NO>COLOK…MOVE.L�D0,COLCNT-B(A6)„UPDATE�WITH�DECLARED�COLUMN�COUNTŠBRA.S‚FOPEXIT*1* NONSTANDARD PAGE FORMAT SPECIFIED INTERACTIVELY* FOPTI…EQU„*%ŠADD.W‚#1,D2ŽBYPASS�SUBCOMMAND�LETTER ŠBSR„BLNKSKPŒFIND�FIRST�NONBLANKŠCMP.L‚D0,D2ŽANY�MORE�CHARS&ŠBLT.S‚FOPTC1�YES�GO�USE�THEM�AS�INPUT ŠBRA„FOPTCŽNO�-�GO�SOLICIT�INPUT* FOPEXITƒRTS*,* LINE NUMBER OPTION SPECIFIED INTERACTIVELY* LOPTI…EQU„*%ŠADD.W‚#1,D2ŽBYPASS�SUBCOMMAND�LETTER ŠBSR„BLNKSKP) ŠCMP.L‚D0,D2ŽANY�MORE�CHARACTERS�IN�LINE?(ŠBLT.S‚LOPT10�YES�-�GO�USE�THEM�AS�INPUT8ŠLEA„LMSGS(PC),A0‹ASK�THEM�TO�ENTER�THE�BASE�LINE�NUMBERŠLEA„LMSGE(PC),A1 ŠBSR„MSGOUTINŠBNE„LISTERRŒBRANCH�IF�ERRORS/ŠMOVE.L�MSGIIOS+IOSLEN-B(A6),D0‚LENGTH�OF�INPUT#ŠLEA„OPINPBUF(PC),A1ˆSTART�OF�INPUTŠCLR.L‚D2‘CHARACTER�POINTER'LOPT10„BSR„BLNKSKPŒSKIP�TO�NUMBER�INPUTŠBSR„ASCBIN�GO�GET�BINARY�IN�D0 ŠTST.L‚D0"ŠBEQ.S‚LOPT15�BRANCH�ON�BAD�NUMBER*9* CHECK TO INSURE NO INVALID STUFF ON THE SUBCOMMAND LINE*9ŠSUB.L‚MSGIIOS+IOSLEN-B(A6),D2‚SHOULD�BE�THROUGH�THE�LINEŠBEQ.S‚LOPTCŽBRANCH�IF�OK2LOPT15„MOVE.L�#EM_NVE,D0‰COMPLAIN�OF�INVALID�INPUT ŠBSR„ERRMSG,ŠBTSTƒ#0,SAVD7+3-B(A6)ƒARE�WE�IN�CHAIN�MODE?ŠBEQ„LISTERRŒBRANCH�IF�YES/ŠBRA.S‚LOPEXITŒGET�OUT�AND�LET�THEM�DO�IT�AGAIN*.* LINE NUMBER OPTION SPECIFIED ON COMMAND LINE* LOPTC…EQU„*&ŠMOVE.L�D0,LNUM-B(A6)†SAVE�LINE�NUMBER8ŠCLR.W‚LNUMF-B(A6)ˆFLAG�TO�PUT�IN�LINE�NUMBERS�ON�OUTPUT LOPEXITƒRTS*8* QUIT OPTION SPECIFIED ON COMMAND LINE (ILLEGAL OPTION)* QOPTC…EQU„*ŠRTS** QUIT SPECIFIED INTERACTIVELY* QOPTI…EQU„* ŠBSR„EJECTPGŠBRA„LISTEXIT‹EXIT�IMMEDIATELY**"* D OPTION SPECIFIED INTERACTIVELY* DOPTI…EQU„*%ŠADD.W‚#1,D2ŽBYPASS�SUBCOMMAND�LETTER ŠBSR„BLNKSKP%ŠCMP.L‚D0,D2ŽSEE�IF�OVER�END�OF�INPUT2ŠBLT.S‚DOPTI10ŒBRANCH�IF�DISPLAY�SPECIFIED�ON�LINE4ŠLEA„DMSGS(PC),A0‹TELL�THEM�TO�ENTER�STARTING�ENDINGŠLEA„DMSGE(PC),A1 ŠBSR„MSGOUTINŠBNE„LISTERRŒBRANCH�IF�ERROR7ŠMOVE.L�MSGIIOS+IOSLEN-B(A6),D0‚LENGTH�OF�HEADING�INPUT ŠCLR.L‚D2)ŠLEA„OPINPBUF(PC),A1ˆSTART�OF�KEYED�INPUT DOPTI10ƒEQU„*2ŠMOVE.L�D0,DOPCNT-B(A6)„SAVE�LENGTH�OF�KEYED�INPUT ŠBSR„BLNKSKP ŠBRA.S‚DOPOK1.DOPBAD„MOVE.L�#EM_NVE,D0‰TELL�OF�INVALID�ENTRY ŠBSR„ERRMSG,ŠBTSTƒ#0,SAVD7+3-B(A6)ƒARE�WE�IN�CHAIN�MODE?ŠBEQ„LISTERRŒBRANCH�IF�YESŠLEA„DMSGBS(PC),A0ŠBAD�ENTRY,ŠLEA„DMSGBE(PC),A1ŠTELL�THEM�HOW�TO�ENTER�ITŠBSR„MSGOUTIŒCORRECT�INPUTŠBRA.S‚DOPEXIT*)DOPOK1„BSR„ASCBIN�CONVERT�ASCII�TO�BINARYŠTST.L‚D0‘ZERO�IS�ILLEGAL�INPUT ŠBEQ.S‚DOPBAD1ŠSUB.L‚#1,D0ŽCORRECT�LINE�NUMBER�TO�RECORD�NUMBER9ŠMOVE.L�D0,SRTREC-B(A6)„DEPOSIT�IN�STARTING�RECORD�NUMBERŠCMP.B‚#',',0(A1,D2.L)ŠBEQ.S‚COMMAOK0ŠCMP.L‚DOPCNT-B(A6),D2ŠWAS�THAT�ALL�ON�THE�LINE?ŠBNE.S‚DOPBAD�COMPLAIN�IF�NOTŠMOVE.L�D0,ENDREC-B(A6) ŠBRA.S‚LISTIT COMMAOKƒEQU„* ŠADD.L‚#1,D2 ŠBSR„ASCBIN ŠTST.L‚D0!ŠBEQ.S‚DOPBAD�BRANCH�ON�BAD�INPUT*ŠSUB.L‚#1,D0ŽACCOUNT�FOR�RECORD�0�=�LINE�1ŠMOVE.L�D0,ENDREC-B(A6)** FINALLY, DO THE LISTING* LISTIT„EQU„* ŠBSR.S‚LISTS DOPEXITƒRTS* LISTS…EQU„*"ŠCLR.W‚LISTED-B(A6)‡FLAG�AS�LISTED.ŠMOVE.L�SRTREC-B(A6),D0ŠSTARTING�RECORD�NUMBER,ŠMOVE.L�ENDREC-B(A6),D1ŠENDING�RECORD�NUMBERLISTSL„CMP.L‚D1,D0&ŠBGT.S‚LISTEJCŒGET�OUT�IF�DONE�LISTINGŠBSR.S‚INRECŽINPUT�RECORDŠBRA.S‚LISTSEXT‹BRANCH�IF�ERRORŠBSR„OUTREC�OUTPUT�RECORDŠBRA.S‚LISTSEXT‹BRANCH�IF�ERRORŠADD.L‚#1,D0ŽGO�FOR�NEXT�RECORD ŠBRA.S‚LISTSLALISTEJCƒMOVE.L�ROWCNT-B(A6),LCNT-B(A6)‚FORCE�PAGE�EJECT�NEXT�TIMEŠADD.L‚#1,LCNT-B(A6) LISTSEXT‚RTS* * READS INPUT RECORD INTO RECBUF* RETURNS TO PC+2 IF NO ERROR *ŒPC�IF�ERROR* INREC…EQU„*ŠMOVEM.L�D0-D1,-(A7)ŠSUB.L‚RECADJ-B(A6),D0/ŠBPL.S‚INREC3�BRANCH�IF�RECORD�NUMBER�OK�SO�FAR:* REC # NEGATIVE - GO BACK TO BEGINNING OF INPUT FILE LIST,ŠADD.L‚RECADJ-B(A6),D0ŠCORRECT�RECORD�NUMBER"ŠBSR„FREEFILŒFREE�THE�CURRENT�FILE5ŠCLR.L‚RECADJ-B(A6)‡ZERO�BIAS�RECORD�ADJUSTMENT�VALUE&ŠBSR„NEWIN1�BASE�TO�FIRST�FILE�IN�LIST+ŠMOVEM.L�(A7)+,D0-D1‡RESTORE�OLD�REG�VALUESŠBRA.S‚INRECŽTRY�AGAIN=* REC # POSITIVE - TRY TO ACCESS RECORD IN CURRENT INPUT FILE9INREC3„MOVE.L�D0,INPIOS+IOSRRN-B(A6)�RANDOM�RECORD�NUMBERŠLEA„INPIOS(PC),A0ŠTRAPƒ#2‘DO�THE�INPUT ŠBEQ„INRECXOK‹BRANCH�IF�I/O�GOOD&ŠCMP.B‚#ISTAEOF,D0ˆWAS�IT�END�OF�FILE?ŠBNE.S‚NOTEOF�BRANCH�IF�NOI* RECORD NUMBER TOO LARGE FOR THIS FILE - TRY NEXT INPUT FILE IF POSSIBLE>ŠBTSTW‚#0,EDITRTN+2-B(A6)�IS�THERE�ANOTHER�FILE�ON�INPUT�LINE?ŠBNE.S‚MOREIN�BRANCH�IF�YESŠBSR„EJECTPGŒNO�-�EJECT�PAGE�--,ŠBRA .S‚INRECX�--�AND�GET�OUT�OF�THIS�ROUTINEIMOREIN„MOVE.W�#IOPOST,INPIOS+IOSFCT-B(A6)�CALCULATE�THE�LAST�LEGAL�RECORD7ŠMOVE.L�#-1,INPIOS+IOSRRN-B(A6)�POSITION�TO�END�OF�FILEŠLEA„INPIOS(PC),A0ŠTRAPƒ#2!ŠBEQ.S‚MOREIN4ŒBRANCH�IF�NO�ERROR.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN ŠBRA„LISTERR9MOREIN4ƒMOVE.L�INPIOS+IOSRRN-B(A6),D0ƒLAST�RECORD�OF�FILE(ŠADD.L‚#1,D0ŽBUMP�FOR�ONE�RELATIVE�COUNT2ŠADD.L‚D0,RECADJ-B(A6)„SET�RECORD�ADJUSTMENT�VALUE9ŠMOVE.W�#IOREAD,INPIOS+IOSFCT-B(A6)�RESTORE�READ�FUNCTION$ŠBSR.S‚FREEFILŒFREE�THE�CURRENT�FILE>ŠMOVE.L�EDITSVA0-B(A6),A0ˆRESTORE�POINTER�TO�INPUT�OF�COM�LINE!ŠBSR„NEWIN2�ASSIGN�NEW�INPUT�FILE?ŠCMP.B‚#1,HOPT+OPTFL-B(A6)�WAS�HEADING�SPECIFIED�INTERACTIVELY?ŠBEQ.S‚MOREXT�BRANCH�IF�NO2ŠBSR„DEFHDG�ADJUST�HEADING�FOR�NEW�INPUT�FILE�NAME5MOREXT„MOVEM.L�(A7)+,D0-D1‡RESTORE�ORIGINAL�REGISTERS&ŠBRA„INRECŽGO�TRY�AGAIN�FROM�BEGINNING* ERROR WAS NOT EOF NOTEOF„EQU„*&ŠCMP.B‚#ISTABRK,D0ˆWAS�A�BREAK�ENTERED+ŠBEQ.S‚INRECX�BRANCH�IF�A�BREAK�WAS�ENTERED.ŠBSR„ERRMSG�LET�ERROR�MESSAGE�HANDLER�COMPLAIN,ŠBTSTƒ#0,SAVD7+3-B(A6)ƒARE�WE�IN�CHAIN�MODE?ŠBEQ„LISTERRŒBRANCH�IF�YES/ŠMOVE.L�#$FF,LCNT-B(A6)„FORCE�ADVANCE�NEXT�TIME ŠBRA.S‚INRECX+INRECXOK‚ADD.L‚#2,8(A7)‹GOOD�RETURN�TO�PC+2,INRECX„MOVEM.L�(A7)+,D0-D1‡RESTORE�REGISTERSŠRTS%*************************************!* SUBROUTINE TO FREE CURRENT FILE*:FREEFILƒMOVE.W�#FHCLOS,INPFHS+FHSCMD-B(A6)�CLOSE�FILE�CODEŠLEA„INPFHS(PC),A0ŠTRAPƒ#37ŠMOVE.W�#FHASGN,INPFHS+FHSCMD-B(A6)�RESTORE�ASSIGN�CODEŠRTS*"* DISPLAYS RECORD ON OUTPUT DEVICE* OUTREC„EQU„*ŠMOVEM.L�D0-D1,-(A7))ŠMOVE.L�LNUM-B(A6),D0ŒDISPLAY�LINE�NUMBERŠCMP.L‚#999999,D0ŠBLS.S‚OUTREC1ŠMOVE.L�#999999,D0:ŠMOVE.L�D0,LNUM-B(A6)†INSURE�LINE�NUMBER�NOT�OVER�6�DIGITS2OUTREC1ƒLEA„LNOUT1(PC),A0ŠWHERE�TO�PUT�LINE�NUMBER,ŠMOVE.L�#6,D1ŽNUMBER�OF�CHARACTERS�IN�OUTPUT2ŠBSR„BINDECFJ‹CONVERT�RECORD�NUMBER�TO�LINE�NUMBER* PUT OUT HEADING IF REQUIREDŠMOVE.L�LCNT-B(A6),D0ŠCMP.L‚ROWCNT-B(A6),D0$ŠBLE.S‚HDGDUN�BRANCH�IF�HEADING�DONEŠBSR.S‚HDGOUT�PUT�OUT�HEADING)* COMPUTE BUFFER START ADDRESS AND LENGTH9HDGDUN„LEA„LNOUT1(PC),A1ŠADDRESS�IF�LINE�NUMBERS�INCLUDED,ŠTST.W‚LNUMF-B(A6)ˆARE�LINE�NUMBERS�REQUIREDŠBEQ.S‚ADOK�BRANCH�IF�YES&ŠLEA„LNOUT2(PC),A1ŠBYPASS�LINE�NUMBERS)ADOK†MOVE.L�INPIOS+IOSLEN-B(A6),D1ƒLENGTHŠLEA„LNOUT2-1(PC),A0ŠADD.L‚A0,D1ŽENDING�ADDRESSŠSUB.L‚A1,D1ŽLENGTHŠCMP.L‚COLCNT-B(A6),D1 ŠBLT.S‚COKŠMOVE.L�COLCNT-B(A6),D1 ŠSUB.L‚#1,D1COK‡EQU„*’LENGTH�IS�NOW�IN�D1 ŠADD.L‚A1,D1 ŠMOVE.L�A1,A0 ŠMOVE.L�D1,A1 ŠBSR„LSTOUTFŠADD.L‚#1,LCNT-B(A6)-ŠADD.L‚#1,LNUM-B(A6)†BUMP�DISPLAY�LINE�NUMBER(ŠADD.L‚#2,8(A7)‹BUMP�RETURN�FOR�GOOD�I/OŠMOVEM.L�(A7)+,D0-D1ŠRTS** PUT OUT HEADING* HDGOUT„EQU„*ŠMOVEM.L�D0-D1,-(A7)%ŠMOVE.L�#4,LCNT-B(A6)†LINE�COUNT�OF�4 * OUTPUT FORM FEED IN IMAGE MODE ŠBSR„EJECTPGŠADD.L‚#1,PNUM-B(A6)ŠMOVE.L�PNUM-B(A6),D0:ŠLEA„ASCIIPG(PC),A0‰WHERE�TO�DEPOSIT�CONVERTED�PAGE�NUMBER,ŠMOVE.L�#4,D1ŽNUMBER�OF�CHARACTERS�IN�OUTPUT ŠBSR„BINDECFJŠMOVE.L�HDGEND-B(A6),D1ŠLEA„HLINE(PC),A0 ŠSUB.L‚A0,D1ŠCMP.L‚COLCNT-B(A6),D1 ŠBLT.S‚HCOKŠMOVE.L�COLCNT-B(A6),D1 ŠSUB.L‚#1,D1 HCOK†EQU„*ŠLEA„HLINE(PC),A0‹START�ADDRESS ŠMOVE.L�A0,A1%ŠADD.L‚D1,A1ŽENDING�ADDRESS�TO�OUTPUT ŠBSR„LSTOUTF+ŠLEA„DSOUTS(PC),A0ŠPUT�OUT�DOUBLE�LINE�FEEDŠLEA„DSOUTE(PC),A1 ŠBSR„LSTOUTI%ŠSUB.L‚D0,D0ŽSEG�GOOD�CONDITION�CODESŠMOVEM.L�(A7)+,D0-D1ŠRTSŠPAGE%*************************************)* 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ŠRTS*&*ˆ**CONVERT�BINARY�TO�ASCII�ROUTINE�**-*********************************************$*ˆBINARY�TO�DECIMAL�ASCII�SUBROUTINE*�REV�1.00‚3/27.79�GAT*�**�16�BIT�BINARY�INPUT�**4****************************************************6*ˆCONVERTS�BINARY�QUANTITY�IN�D0�TO�ASCII�STRING�WHICH *ˆIS�DEPOSITED�AT�LOCATION�(A0)+* *ˆCALLING�SEQUENCE:'*‹LOAD�D0�WITH�QUANTITY�TO�BE�CONVERTED.*‹LOAD�A0�WITH�ADDRESS�TO�DEPOSIT�ASCII�STRING *‹JSR�BINDEC*!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*“D„*�* *“A„*�*�***ˆA1�POINTS�AT�BINARY�TABLE*ˆA2�POINTS�AT�ASCII�TABLE*ˆD1�IS�WORK�REGISTER*BINEQS„DC.Wƒ0,1,10,100,1000(BINASC„DC.Bƒ'0123456789ABCDEF'�HEX�TABLE*'BINDEC„LEA„BINEQS+8-B(A6),A1‚ADDR�10**5,BINDE1„LEA„BINASC-B(A6),A2„BASE�ADDR�ASCII�0#BINDE2„SUB.W‚(A1),D0ŒSUBTRACT�10**NŠBCS.S‚BINDE3�BRANCH�OVERBORROW&ŠADD.L‚#1,A2ŽINCREMENT�NEXT�ASCII�CHARŠBRA„BINDE2�CONTINUE'BINDE3„ADD.W‚(A1),D0ŒRESTORE�OVERBORROW!ŠMOVE.B�(A2),(A0)+‰PUT�ASCII�CHARŠMOVE.W�-(A1),D1‹TEST�DONEŠBNE„BINDE1�BRANCH�NOT�DONEŠRTS*-*********************************************+*‚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�,D11*…MOVE.L�,A0*…BSR�BINDECFJ* *‚RETURNS:*…D0�=�0�=>GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *ŠDƒ*�P�P*ŠAƒP�P*7TENS†DC.Lƒ10000000,1000000,100000,10000,1000,100,10,1,0*"BINDECFJ‚MOVEM.L�D1/D2/A0/A1,-(A7)ŠMOVE.L�#8,D2ŽMAX�NO.�DIGITSŠSUB.L‚D1,D2ŽNO.�DIGITS�TO�SKIP!ŠBMI.S‚BINDECF5‹BRANCH�ERROR�EXITŠLSL.L‚#2,D2ŽDOUBLE�WORD�LENGTH!ŠLEA„TENS-B(A6),A1†START�OF�TABLE"ŠADD.L‚D2,A1ŽADJUST�FOR�DIFFERENCE&ŠMOVE.W�#'‚',D2‹INITIALIZE�ACCUMULATOR%BINDECF1‚SUB.L‚(A1),D0ŒSUBTRACT�10**NŠBCS.S‚BINDECF2‹BRANCH�TOO�BIG*ŠADD.W‚#1,D2ŽINCREMENT�CURRENT�DIGIT�COUNTŠBRA„BINDECF1‹CONTINUE)BINDECF2‚ADD.L‚(A1)+,D0‹RESTORE,�ADV�PNTRŠTST.L‚(A1)�TEST�DONEŠBEQ.S‚BINDECF4‹BRANCH�DONE ŠCMP.W‚#'‚',D2‹LEADING�ZERO�TEST!ŠBEQ.S‚BINDECF3‹BRANCH�STILL�ZERO#ŠADD.B‚#$10,D2ŒBRING�TO�ASCII�DIGIT%BINDECF3‚MOVE.B�D2,(A0)+‹DEPOSIT�CHARŠLSL„#8,D2ŽSAVE�CHAR�DEPOSITED#ŠMOVE.B�#$20,D2ŒRESTORE�LS�TO�SPACEŠBRA„BINDECF1‹CONTINUE4BINDECF4‚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"BINDECF5‚MOVEM.L�(A7)+,D1/D2/A0/A1ŠRTS*ŠPAGE%************************************** * SUBROUTINE FOR DATE CONVERSION***ˆNON-LEAP�DAYS�BEFORE�TABLE*' MEND3…EQU„*-1*!MSG4†DC.Wƒ'ENTER�TASK�PRIORITY>$' MEND4…EQU„*-1*$MSG5†DC.Wƒ'ENTER�TASK�ATTRIBUTES�>$' MEND5…EQU„*-1*%MSG6†DC.Wƒ'ENTER�TASK�ENTRY�POINT�>$' MEND6…EQU„*-1*!MSG7†DC.Wƒ'ENTER�TASK�OPTIONS�>$' MEND7…EQU„*-1*!MSG11…DC.Wƒ'ENTER�SEGMENT�NAME�>'MEND11„EQU„*-1*(MSG12…DC.Wƒ'ENTER�SEGMENT�ATTRIBUTES�>$'MEND12„EQU„*-1*-MSG13…DC.Wƒ'ENTER�SEGMENT�LOGICAL�ADDRESS�>$'MEND13„EQU„*-1*$MSG14…DC.Wƒ'ENTER�SEGMENT�LENGTH�>$'MEND14„EQU„*-1**MSG15…DC.Wƒ'ENTER�COMMAND�LINE�ADDRESS�>$'MEND15„EQU„*-1*)MSG16…DC.Wƒ'ENTER�COMMAND�LINE�LENGTH�>$'MEND16„EQU„*-1*!MSG19…DC.Wƒ'ENTER�TASK�SESSION�>'MEND19„EQU„*-1*"MSG21…DC.Wƒ'**�THATS�ALL�FOLKS�**'MEND21„EQU„*-1*/MSG22…DC.Wƒ'**�ERROR�**�DUPLICATE�FILE�NAME�**'MEND22„EQU„*-1*MSG23…DC.Wƒ'REUSE�FILE�(Y/N)�>'MEND23„EQU„*-1*&MSG24…DC.Wƒ'**�FILE�HANDLING�ERROR�**'MEND24„EQU„*-1*%MSG25…DC.Wƒ'**�INPUT/OUTPUT�ERROR�**'MEND25„EQU„*-1*%MSG26…DC.Wƒ'**�COMMAND�LINE�ERROR�**'MEND26„EQU„*-1* MSG27…DC.Wƒ'**�BUFFER�ERROR�**�'MEND27„EQU„*-1*!MSG28…DC.Wƒ'**�S-RECORD�ERROR�**'MEND28„EQU„*-1*7******************************************************* ŠPAGE *** PARAMETER BLOCKS** OUTPUT FILE BLOCK*,FBLK1…DC.WƒFHALLO+FHASGN†ALLOCATE�AND�ASSIGN8ŠDC.WƒFOPEREW+FOPCON+FOPOVRT�EXCLUSIVE�W/R,�CONGIGUOUS�FŠDC.Bƒ0’STATUS ŠDC.Bƒ7’LUNŠDC.Bƒ'„'�VOLUME�NAMEŠDC.Wƒ-1‘USER�NUMBERŠDC.Bƒ'ˆ'‰CATALOGŠDC.Lƒ0,0�FILE�NAMEŠDC.Wƒ0’EXTENSIONŠDC.Wƒ0’RESERVEDŠDC.Bƒ0,0�W/R�CODEŠDC.Wƒ0’RECORD�LENGTHŠDC.Lƒ0’FILE�SIZE** INPUT FILE BLOCK*%FBLK2…DC.WƒFHASGN�ALLOCATE�AND�ASSIGNŠDC.WƒFOPPRPWŒPUBIC�READ/WRITEŠDC.Bƒ0’STATUS ŠDC.Bƒ1’LUNŠDC.Bƒ'„'�VOLUME�NAMEŠDC.Wƒ-1‘USER�NUMBERŠDC.Bƒ'ˆ'‰CATALOGŠDC.Lƒ0,0�FILE�NAMEŠDC.Wƒ0’EXTENSIONŠDC.Wƒ0’RESERVEDŠDC.Bƒ0,0�W/R�CODEŠDC.Wƒ0’RECORD�LENGTHŠDC.Lƒ0’FILE�SIZE** OUTPUT I/O BLOCK*IBLK1…DC.WƒIOWRIT�WRITE ŠDC.WƒIOPWAT+IOPRAN†WAIT,�RANDOMŠDC.Bƒ0’STATUS ŠDC.Bƒ7’LUNŠDC.Wƒ0’RESERVED ŠDC.Lƒ0’RRNŠDC.Lƒ0’START�BUFFER�ADDRESSŠDC.Lƒ0’END�BUFFER�ADDRESSŠDC.Lƒ0’XFER�LENGTHŠDC.Lƒ0’COMPLETION�ADDRESS** CONSOLE I/O BLOCK*IBLK2…DC.Wƒ0’COMMANDŠDC.Wƒ0’OPTIONSŠDC.Bƒ0’STATUS ŠDC.Bƒ0’LUNŠDC.Wƒ0’RESERVED ŠDC.Lƒ0’RRNŠDC.Lƒ0’START�BUFFER�ADDRESSŠDC.Lƒ0’END�BUFFER�ADDRESSŠDC.Lƒ0’XFER�LENGTHŠDC.Lƒ0’COMPLETION�ADDRESS** ALLOCATE SEGMENT BLOCK*SEGBLK„DC.Lƒ0’TASKŠDC.Lƒ0’SESSIONŠDC.Wƒ$2000ŽOPTIONSŠDC.Wƒ0’ATTRIBUTESŠDC.Lƒ'BLMO'�SEGMENT�NAMEŠDC.Lƒ0’LOGICAL�ADDRESSSEGSIZ„DC.Lƒ0’LENGTHŠDC.Lƒ0’POINTERSEGLEN„EQU„SEGSIZ-SEGBLK SEGNAM„EQU„$C** INPUT I/O BLOCK*IBLK3…DC.WƒIOREADŒREAD+ŠDC.WƒIOPWAT+IOPNXT+IOPBLK�WAIT,�SEQUENTIALŠDC.Bƒ0’STATUS ŠDC.Bƒ1’LUNŠDC.Wƒ0’RESERVED%ŠDC.Lƒ0’RRN�(USED�FOR�RECORD�POINTER)ŠDC.Lƒ0’START�BUFFER�ADDRESSŠDC.Lƒ0’END�BUFFER�ADDRESSŠDC.Lƒ0’XFER�LENGTHŠDC.Lƒ0’COMPLETION�ADDRESS*ŠPAGE* * BUFFERS*(CMDBUF„COMLINE�CMDLEN�COMMAND�LINE�INPUT*PARSTATƒDC.Lƒ0’PARSE�STATUS**$CATBUF„DC.Lƒ0,0�DEFAULT�CATALOG�NAME**#CONBUF„DS.Bƒ80‘CONSOLE�INPUT�BUFFER**‚***‚11/19/84F*‚The�call�to�SBARG�requires�the�input�buffer�to�be�1�character�longer*‚than�specified.*ŠDS.Bƒ4’Added�for�SBARG.**#DSKBUF„DC.Lƒ0,0,0,0,0,0ˆDISK�BUFFERŠDC.Lƒ0,0,0,0,0,0 ŠDS.Bƒ208**MSG20…DC.Bƒ'LUN�=�'LUNV†DC.Bƒ'„STATUS�=�$'STATV…DC.Wƒ'‚'MEND20„EQU„*-1** ŠDS.Bƒ$80STACK…EQU„*’STACK�AREA***TAG0†LEA„STACK(PC),A7‹SET�UP�STACK�POINTER * ŠLEA„B(PC),A5ŠMOVE.L�D4,CATBUF-B(A5)ŠMOVE.L�D5,CATBUF+4-B(A5)TAG10…LEA„MSG1(PC),A5ŠLEA„MEND1(PC),A6ŠCLR.L‚D0‘OPTION�FORMATTEDŠBSR„OUTPUT�INTRODUCE�OURSELVES!ŠLEA„CMDBUF(PC),A0ŠBUFFER�POINTER ŠBSR„PARSE ŠLEA„B(PC),A5*ŠMOVE.L�D0,PAR STAT-B(A5)ƒSAVE�PARSE�STATUSŠBTSTƒ#ERBIT,D0ŠCMD�LINE�ERROR?ŠBNE„CMDERR�YESŠBTSTƒ#INNULL,D0‰INPUT�NULL?ŠBNE„CMDERR�YES,�ERROR!ŠLEA„CMDBUF(PC),A0ŠBUFFER�POINTER#TAG12…LEA„FBLK2(PC),A6‹FHCB�POINTER)ŠMOVE.L�#'„',FHSVOL(A6)�BLANK�VOLUME�NAME.ŠMOVE.W�#-1,FHSUSN(A6)…SET�UP�DEFAULT�USER�NO.6ŠMOVE.L�CATBUF-B(A5),FHSCLG(A6)‚SET�UP�DEFAULT�CATALOG#ŠMOVE.L�CATBUF+4-B(A5),FHSCLG+4(A6)ŠBSR„EDITFILE‹FORMAT�FILE�NAME ŠLEA„B(PC),A5ŠBTSTƒ#ERBIT,D0ŠTEST�RETURNŠBEQ.S‚TAG14ŽOKŠBSR„FHSERR�ERROR ŠBRA„ENDIT&TAG14…MOVE.L�A0,A6ŽSAVE�BUFFER�POINTER"ŠMOVE.L�D0,D6ŽSAVE�EDITFILE�STATUSŠLEA„FBLK2(PC),A0ŠTRAPƒ#FHSTINŒASSIGN�FILEŠBEQ.S‚TAG15ŽOKŠBSR„FHSERR�ERROR ŠBRA„ENDIT,TAG15…MOVE.W�FHSOPT(A0),D1†PICK�UP�FILE�TYPE"ŠAND.W‚#FOPSEQ,D1‰SEQUENTIAL�FILE?ŠBNE.S‚TAG15A�YESŠMOVE.L�#FSTAFT,D0‰NO,�ERROR ŠBSR„FHSERR ŠBRA„ENDITTAG15A„CLR.L‚D1(ŠMOVE.B�FHSDAT(A0),D1†PICK�UP�BLOCK�SIZE!ŠMULSƒ#256,D1ŒCALC.�SIZE�IN�BYTES+ŠCMP.L‚SEGSIZ-B(A5),D1ŠFIND�THE�BIGGEST�ONE ŠBLT.S‚TAG15B)ŠMOVE.L�D1,SEGSIZ-B(A5)„THIS�ONE'S�BIGGER9TAG15B„CMP.B‚#LUNMAX,FHSLUN(A0)�REACHED�MAX.�INPUT�FILES?ŠBEQ.S‚TAG16ŽYES#ŠBTSTƒ#CONTFILE,D6‡MORE�INUT�FILES?ŠBEQ.S‚TAG16ŽNO$ŠMOVE.L�A6,A0ŽRESTORE�BUFFER�POINTERŠLEA„FBLK2(PC),A1ŠADD.B‚#1,FHSLUN(A1)†BUMP�LUNŠBRA„TAG12ŽCONTINUE)TAG16…BTSTƒ#CONTFILE,D6‡MORE�INPUT�FILES?ŠBNE„CMDERR�YES,�ERRORŠMOVE.L�PARSTAT-B(A5),D0#ŠBTSTƒ#OUTNULL,D0ˆOUTPUT�SPECIFIED?ŠBEQ.S‚TAG18ŽYES8ŠLEA„FBLK2+FHSVOL-B(A5),A0„NO,�DEFAULT�TO�INPUT�FILENAMEŠMOVEM.L�(A0),D0-D5ŠLEA„FBLK1+FHSVOL-B(A5),A0ŠMOVEM.L�D0-D5,(A0) ŠLEA„B(PC),A56ŠMOVE.W�#'LO',FBLK1+FHSEXT-B(A5)�SET�EXTENSION�TO�'LO' ŠBRA.S‚TAG19A(TAG18…MOVE.L�A6,A0ŽRESTOR�BUFFER�POINTERŠLEA„FBLK1(PC),A63ŠMOVE.L�CATBUF-B(A5),FHSCLG(A6)‚SET�DEFAULT�CATALOG#ŠMOVE.L�CATBUF+4-B(A5),FHSCLG+4(A6)ŠBSR„EDITFILE‹FORMAT�FILE�NAMEŠBTSTƒ#ERBIT,D0ŠTEST�RETURNŠBNE.S‚TAG19ŽERROR)ŠBTSTƒ#CONTFILE,D0‡MORE�THATN�ONE�OUTPUT?ŠBEQ.S‚TAG19A�NOTAG19…BSR„FHSERR�ERROR ŠBRA„ENDITTAG19A„ERQ.GTSEG�SEGBLK(PC)ŠBNE„BUFERR�ERROR ŠLEA„B(PC),A5,ŠMOVE.L�A0,IBLK3+IOSSAD-B(A5)�SET�UP�ADDRESSŠADD.L‚SEGSIZ-B(A5),A0 ŠSUB.L‚#1,A0ŠMOVE.L�A0,IBLK3+IOSEAD-B(A5)6ŠMOVE.B�#'1',SEGBLK+SEGNAM+3-B(A5)�CHANGE�SEGMENT�NAME*** GET TASK INFO**TAG20…LEA„DSKBUF(PC),A0#TAG21…CLR.L‚(A0)+ŽCLEAR�DISK�BUFFERŠLEA„DSKBUF+$100(PC),A5ŠCMP.L‚A5,A0ŽFINISHED?ŠBNE.S‚TAG21ŽNOŠLEA„DSKBUF(PC),A3TAG21A„LEA„MSG3(PC),A5ŠLEA„MEND3(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGEŠBSR„OUTPUT�ASK�FOR�TASK�NAMEŠBSR„INPUTŽREAD�INPUTŠTST.L‚IOSLEN(A0)‰ANY�INPUT?ŠBEQ.S‚TAG21A�NO,�ERROR'ŠMOVE.L�(A4),LDTSK(A3)…SET�UP�TASK�NAMETAG22…LEA„MSG19(PC),A5ŠLEA„MEND19(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE ŠBSR„OUTPUT�ASK�FOR�TASK�SESSIONŠBSR„INPUTŽREAD�INPUT ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG23ŽNO,�LEAVE�IT�ZEROŠBSR„CH2B�CONVERT�TO�BINARYŠBRA.S‚TAG23ŽNOT�A�NUMBER,ŠMOVE.L�D0,LDSES(A3)‡SET�UP�A�SESSION�NUMBER ŠBRA.S‚TAG251TAG23…MOVE.L�(A4),LDSES(A3)…SET�UP�SESSION�CHARS.TAG25…LEA„MSG4(PC),A5ŠLEA„MEND4(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGEŠBSR„OUTPUT�ASK�FOR�PRIORITYŠBSR„INPUTŽREAD�INPUTŠCLR.L‚LDIPR(A3)ŠINIT.�PRIORITY ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG30ŽNO,�LEAVE�IT�ZEROŠBSR„CH2B�CONVERT�TO�BINARYŠBRA.S‚TAG25ŽERROR�RETURN *£GOOD�RETURNŠMOVE.B�D0,LDIPR(A3)ŠMOVE.B�D0,LDLPR(A3)TAG30…LEA„MSG5(PC),A5ŠLEA„MEND5(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE#ŠBSR„OUTPUT�ASK�FOR�TASK�ATTRIBUTESŠBSR„INPUTŽREAD�INPUT!ŠCLR.W‚LDATR(A3)ŠINIT.�ATTRIBUTES ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG32ŽNOŠBSR„CH2B�CONVERT�HEX�TO�BINARYŠBRA.S‚TAG30ŽERROR�RETURN *£GOOD�RETURN+ŠMOVE.W�D0,LDATR(A3)‡SET�UP�TASK�ATTRIBUTESTAG32…LEA„MSG7(PC),A5ŠLEA„MEND7(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE ŠBSR„OUTPUT�ASK�FOR�TASK�OPTIONSŠBSR„INPUTŽREAD�INPUTŠCLR.W‚LDOPT(A3)ŠINIT.�OPTIONS ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG35ŽNOŠBSR„CH2B�CONVERT�HEX�TO�BINARYŠBRA.S‚TAG32ŽERROR�RETURN *£GOOD�RETURN(ŠMOVE.W�D0,LDOPT(A3)‡SET�UP�TASK�OPTIONSTAG35…LEA„MSG6(PC),A5ŠL EA„MEND6(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGEŠBSR„OUTPUT�ASK�FOR�ENTRY�POINTŠBSR„INPUTŽREAD�INPUT ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG35ŽNOŠBSR„CH2B�CONVERT�HEX�TO�BINARYŠBRA.S‚TAG35ŽERROR�RETURN *£GOOD�RETURN'ŠMOVE.L�D0,LDENT(A3)‡SET�UP�ENTRY�POINTTAG40…LEA„MSG15(PC),A5ŠLEA„MEND15(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE(ŠBSR„OUTPUT�ASK�FOR�COMMAND�LINE�ADDRESSŠBSR„INPUTŽREAD�INPUTŠMOVE.L�#-1,LDCMD(A3) ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG45ŽNOŠBSR„CH2B�CONVERT�HEX�TO�BINARYŠBRA.S‚TAG40ŽERROR�RETURN *£GOOD�RETURN0ŠMOVE.L�D0,LDCMD(A3)‡SET�UP�COMMAND�LINE�ADDRESSTAG45…LEA„MSG16(PC),A5ŠLEA„MEND16(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE'ŠBSR„OUTPUT�ASK�FOR�COMMAND�LINE�LENGTHŠBSR„INPUTŽREAD�INPUTŠCLR.B‚LDCLN(A3) ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG70ŽNOŠBSR„CH2B�CONVERT�HEX�TO�BINARYŠBRA.S‚TAG45ŽERROR�RETURN *£GOOD�RETURN"ŠMOVE.B�D0,LDCLN(A3)‡SET�UP�LENGTH*** GET SEGMENT INFO**"TAG70…ADD.L‚#LDSEG,A3ŠBUMP�POINTERTAG71…LEA„MSG11(PC),A5ŠLEA„MEND11(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE%ŠBSR„OUTPUT�ASK�FOR�DATA�SEGMENT�NAMEŠBSR„INPUTŽREAD�INPUT ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ„TAG100�NO,�FINISHED�INPUTŠMOVE.L�(A4),LDNAM(A3)ŠCMP.B‚#'/',(A4) ŠBEQ.S‚TAG100TAG75…LEA„MSG12(PC),A5ŠLEA„MEND12(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE+ŠBSR„OUTPUT�ASK�FOR�DATA�SEGMENT�ATTRIBUTESŠBSR„INPUTŽREAD�INPUTŠCLR.W‚LDSAT(A3) ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG80ŽNOŠBSR„CH2B�CONVERT�HEX�TO�BINARYŠBRA.S‚TAG75ŽERROR�RETURN *£GOOD�RETURN.ŠMOVE.W�D0,LDSAT(A3)‡SET�UP�SEGMENT�ATTRIBURESTAG80…LEA„MSG13(PC),A5ŠLEA„MEND13(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE0ŠBSR„OUTPUT�ASK�FOR�DATA�SEGMENT�LOGICAL�ADDRESSŠBSR„INPUTŽREAD�INPUT ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG80ŽNOŠBSR„CH2B�CONVERT�HEX�TO�BINARYŠBRA.S‚TAG80ŽERROR�RETURN *£GOOD�RETURN)ŠMOVE.L�D0,LDSAD(A3)‡SET�UP�START�ADDRESSTAG90…LEA„MSG14(PC),A5ŠLEA„MEND14(PC),A6ŠADD.B‚#1,D0ŽOPTION�IMAGE'ŠBSR„OUTPUT�ASK�FOR�DATA�SEGMENT�LENGTHŠBSR„INPUTŽREAD�INPUT ŠMOVE.L�IOSLEN(A0),D0†ANY�INPUT?ŠBEQ.S‚TAG90ŽNOŠBSR„CH2B�CONVERT�HEX�TO�BINARYŠBRA.S‚TAG90ŽERROR�RETURN *£GOOD�RETURN"ŠMOVE.L�D0,LDSLN(A3)‡SET�UP�LENGTHŠADD.L‚#LDLNG,A3ŠLEA„DSKBUF+SDESC(PC),A5ŠCMP.L‚A5,A3ŽEND�OF�SEGMENT?ŠBLT„TAG71ŽNO,�CONTINUE*** GOT ALL THE INFO - BUILD THE LOAD MODULE*,TAG100„LEA„DSKBUF+LDSEG(PC),A5�ANY�SEGMENTS? ŠCMP.L‚A5,A3ŠBEQ„TAG71ŽNO,�START�OVER*ŠMOVE.L�#-1,LDSLN(A3)†MARK�END�OF�SEGMENTSŠCLR.L‚LDSAD(A3)0ŠLEA„DSKBUF+LDSEG(PC),A2„SET�UP�SEGMENTS�POINTER ŠMOVE.L�#1,D02ŠLEA„DSKBUF+SDESC(PC),A1„SET�UP�MEMORY�DESCRIPTORS$TAG110„CMP.L‚#-1,LDSLN(A2)†FINISHED?ŠBEQ.S‚TAG120�YES/ŠMOVE.W�LDSAT(A2),D1‡PICK�UP�SEGMENT�ATTRIBUTESŠBSETƒ#15,D1�SET�USE�BIT/ŠMOVE.W�D1,LDSAT(A2)‡RESTORE�SEGMENT�ATTRIBUTES+ŠMOVE.L�LDSLN(A2),D1‡PICK�UP�SEGMENT�LENGTH ŠDIVSƒ#256,D1ŒCALC.�NO.�OF�PAGES ŠCLR.L‚D2 ŠMOVE.W�D1,D2 ŠAND.L‚#$FFFF0000,D1†WHOLE�PAGE?ŠBEQ.S‚TAG115�YESŠADD.L‚#1,D2ŽNO,�BUMP�COUNTTAG115„ADD.L‚D2,D0*ŠMOVE.L�LDSAD(A2),D1‡PICK�UP�START�ADDRESS ŠMOVE.L�#8,D2 ŠASR.L‚D2,D1"ŠMOVE.W�D1,0(A1)‹SET�UP�DESCRIPTORŠMOVE.L�LDSAD(A2),D1%ŠADD.L‚LDSLN(A2),D1‡CALC.�END�ADDRESS ŠSUB.L‚#1,D1 ŠASR.L‚D2,D1&ŠMOVE.W�D1,2(A1)‹SET�UP�END�DESCRIPTOR$ŠADD.L‚#4,A1ŽBUMP�DESCRIPTOR�POINTER$ŠADD.L‚#LDLNG,A2ŠBUMP�BUFFER�POINTER ŠBRA.S‚TAG110** ALLOCATE THE FILE**TAG120„CLR.W‚0(A1)ŽFLAG�END�OF�DESCRIPTORSŠMOVE.W�#-1,2(A1)ŠLEA„FBLK1(PC),A0&ŠMOVE.L�D0,FHSSIZ(A0)†SET�UP�FILE�SIZE,TAG122„TRAPƒ#FHSTINŒALLOCATE�AND�ASSIGN�FILEŠBNE„ALOERR�SOMETHING�WRONGŠLEA„IBLK1(PC),A0ŠLEA„DSKBUF(PC),A5"ŠMOVE.L�A5,IOSSAD(A0)†SET�UP�STARTŠADDA.L�#255,A5/ŠMOVE.L�A5,IOSEAD(A0)†SET�UP�END�BUFFER�ADDRESSŠTRAPƒ#IOSTINŒOUTPUT�LIB�BLOCKŠBNE„IOSERR�SOMETHING�WRONGŠADD.L‚#1,IOSRRN(A0)†BUMP�RRN*** GET DATA SEGMENT FOR SEGMENT IMAGE BUILD*ŠLEA„DSKBUF+LDSEG(PC),A1 ŠCLR.L‚D1+TAG123„CMP.L‚LDSLN(A1),D1‡THIS�ONE�GREATER?ŠBGT.S‚TAG124�NO"ŠMOVE.L�LDSLN(A1),D1‡YES,�STORE�ITTAG124„ADD.L‚#LDLNG,A1%ŠCMP.L‚# -1,LDSLN(A1)†END�OF�SEGMENTS?ŠBNE.S‚TAG123�NO1ŠLEA„SEGBLK(PC),A0ŠSET�POINTER�TO�SEGMENT�P-BLOCK#ŠMOVE.L�D1,SEGLEN(A0)†SET�UP�LENGTHŠERQ.GTSEG�(A0)ŠBNE„BUFERR�ERROR ŠMOVE.L�A0,A3(ŠLEA„IBLK1(PC),A0‹SET�UP�POINTER�TO�IOCB1ŠMOVE.L�A3,IOSSAD(A0)†SET�UP�START�BUFFER�ADDRESSŠLEA„DSKBUF+LDSEG(PC),A1*"* READ S-RECORDS INTO DATA SEGMENT*5TAG124AƒMOVE.L�LDSAD(A1),A6‡SET�UP�START�SEG.�ADDRESS ŠMOVE.L�A3,A0 ŠLEA�B(PC),A54ŠMOVE.L�SEGBLK+SEGLEN-B(A5),D1ƒSET�UP�SEGMENT�LENGTH(TAG124BƒCLR.B‚(A0)+ŽCLEAR�SEGMENT�BUFFERŠSUB.L‚#1,D1ŽFINISHED?ŠBNE„TAG124BŒNOTAG125„BSR„GETREC�READ�S-RECORDŠBEQ.S‚TAG127�OK ŠLEA„B(PC),A5'ŠCMP.B‚#ISTAEOF,IBLK3+IOSSTA-B(A5)�EOF?ŠBNE„IOSERR�NO,�ERRORŠMOVE.B�IBLK3+IOSLUN-B(A5),D1,ŠCMP.B‚FBLK2+FHSLUN-B(A5),D1„READ�ALL�FILES?ŠBEQ.S‚TAG135�YES ŠLEA„B(PC),A5%ŠADD.B‚#1,IBLK3+IOSLUN-B(A5)�BUMP�LUNŠBRA.S‚TAG125�CONTINUETAG127„MOVE.L�A0,D6**‚***‚11/19/84H*‚The�SUB.L�A6,D6�was�SUB.L�A6,A6�in�4.3�release.‚This�fix�was�added�perL*‚SPR�1107,�so�that�this�utility�can�convert�files�of�more�than�one�section.*4ŠSUB.L‚A6,D6ŽCALC.�SEGMENT�OFFSET‚***�FIXED�11/19/84+ŠBMI„TAG125�LOWER�ADDRESS,�NOT�THIS�SEGMENTŠCMP.L‚LDSLN(A1),D6ŠBGE„TAG125�NOŠMOVE.L�D0,D5ŽSAVE�DATA�LENGTH ŠMOVE.L�A3,A2TAG130„MOVE.L�#2,D0ŽBYTE�LENGTH ŠBSR„CH2B�CONVERT�BYTE�TO�BINARYŠBRA.S‚TAG133�ERROR�RETURN+ŠMOVE.B�D0,0(A2,D6.L)†MOVE,�BYTE�TO�SEGMENT ŠADD.L‚#1,A2&ŠADD.L‚#2,A4ŽBUMP�INPUT�BUFFER�POINTERŠSUB.L‚#1,D5ŽEND�OF�RECORD?ŠBNE.S‚TAG130�NO ŠBRA„TAG125TAG133„BRA„RECERR�RECORD�ERROR** WRITE SEGMENT*+TAG135„LEA„IBLK1(PC),A0‹SET�UP�IOCB�POINTERŠMOVE.L�IOSSAD(A0),IOSEAD(A0)ŠMOVE.L�LDSLN(A1),D1 ŠDIVSƒ#256,D1 ŠCLR.L‚D2 ŠMOVE.W�D1,D2(ŠAND.L‚#$FFFF0000,D1†ROUND�TO�WHOLE�PAGE ŠBEQ.S‚TAG140 ŠADD.L‚#1,D2TAG140„MOVE.L�D2,D1$ŠMULSƒ#256,D2ŒCALC.�SEGMENT�IN�BYTES ŠSUB.L‚#1,D2+ŠADD.L‚D2,IOSEAD(A0)†SET�END�BUFFER�ADDRESS$ŠTRAPƒ#IOSTINŒOUTPUT�SEGMENT�TO�FILE ŠBNE„IOSERRŠADD.L‚D1,IOSRRN(A0)†BUMP�RRN$ŠADD.L‚#LDLNG,A1ŠBUMP�BUFFER�POINTER%ŠCMP.L‚#-1,LDSLN(A1)†END�OF�SEGMENTS?ŠBEQ.S‚ENDITŽYES#ŠBSR„REWIND�NO,�REWIND�THE�FILES(S) ŠBRA„TAG124A**ABORTY„LEA„FBLK1(PC),A0ŠMOVE.W�#FHDELT,FHSCMD(A0)$ŠTRAPƒ#FHSTINŒDELETE�THE�OUTPUT�FILE**ENDIT…LEA„MSG21(PC),A5ŠLEA„MEND21(PC),A6ŠCLR.L‚D0‘OPTION�FORMATTEDŠBSR„OUTPUT�SAY�END ŠERQ.TERM**FHSERR„LEA„MSG24(PC),A5ŠLEA„MEND24(PC),A6ŠMOVE.L�D0,D6ŽSAVE�STATUSŠMOVE.L�A0,A3ŽSAVE�FHCB�POINTER ŠCLR.L‚D0ŠBSR„OUTPUT�OUTPUT�FHS�ERRORŠLEA„LUNV(PC),A51ŠMOVE.W�#'‚',(A5)‰PRIM�DESTINATION�FOR�CONVERSIONŠLEA„STATV(PC),A5ŠMOVE.W�#'‚',(A5)"ŠAND.L‚#$FF,D6ŒISOLATE�STATUS�CODE,ŠLEA„STATV(PC),A4‹SET�UP�DESTINATION�POINTERŠBSR„CB2H�CONVERT�TO�HEX!ŠMOVE.B�FHSLUN(A3),D6†PICK�UP�LUN#ŠLEA„LUNV(PC),A4ŒSET�UP�DESTINATIONŠBSR„CB2H�CONVERT�TO�HEXŠLEA„MSG20(PC),A5ŠLEA„MEND20(PC),A6 ŠCLR.L‚D0)ŠBSR„OUTPUT�OUTPUT�LUN�AND�STATUS�MESSAGE ŠRTS„RETURN**IOSERR„LEA„MSG25(PC),A5ŠLEA„MEND25(PC),A6ŠMOVE.L�D0,D6ŽSAVE�STATUSŠMOVE.L�A0,A3ŽSAVE�IOCB�POINTER ŠCLR.L‚D0ŠBSR„OUTPUT�OUTPUT�IOS�ERRORŠLEA„LUNV(PC),A51ŠMOVE.W�#'‚',(A5)‰PRIM�DESTINATION�FOR�CONVERSIONŠLEA„STATV(PC),A5ŠMOVE.W�#'‚',(A5)"ŠAND.L‚#$FF,D6ŒISOLATE�STATUS�CODE,ŠLEA„STATV(PC),A4‹SET�UP�DESTINATION�POINTERŠBSR„CB2H�CONVERT�TO�HEX!ŠMOVE.B�IOSLUN(A3),D6†PICK�UP�LUN#ŠLEA„LUNV(PC),A4ŒSET�UP�DESTINATIONŠBSR„CB2H�CONVERT�TO�HEXŠLEA„MSG20(PC),A5ŠLEA„MEND20(PC),A6 ŠCLR.L‚D0)ŠBSR„OUTPUT�OUTPUT�LUN�AND�STATUS�MESSAGE ŠBRA„ABORTY**BUFERR„LEA„MSG27(PC),A5ŠLEA„MEND27(PC),A6 ŠCLR.L‚D0ŠBSR„OUTPUT�OUTPUT�BUFFER�ERROR ŠBRA„ABORTY**RECERR„LEA„MSG28(PC),A5ŠLEA„MEND28(PC),A6 ŠCLR.L‚D0!ŠBSR„OUTPUT�OUTPUT�S-RECORD�ERROR ŠBRA„ABORTY**CMDERR„LEA„MSG26(PC),A5ŠLEA„MEND26(PC),A6 ŠCLR.L‚D0%ŠBSR„OUTPUT�OUTPUT�COMMAND�LINE�ERROR ŠBRA„ENDIT**-ALOERR„CMP.B‚#FSTADNM,D0ˆDUPLICATE�FILE�NAME?ŠBEQ.S‚ALO05ŽYESŠBSR„FHSERR�NO,�ERROR ŠBRA„ABORTYALO05…LEA„MSG22(PC),A5ŠLEA„MEND22(PC),A6ŠCLR.L‚D0‘OPTI ON�FORMATTED ŠBSR„OUTPUT�TELL�EM�'FILE�ERROR'ŠLEA„MSG23(PC),A5ŠLEA„MEND23(PC),A6ALO10…ADD.B‚#1,D0ŽOPTION�IMAGE!ŠBSR.L‚OUTPUT�ASK�'WANT�TO�REUSE'ŠBSR.S‚INPUTŽREAD�INPUTŠTST.L‚IOSLEN(A0)‰ANY�INPUT?ŠBEQ.S‚ALO10ŽNOŠCMP.B‚#'Y',(A4)ŠREUSE�FILE?ŠBNE„ENDITŽNO,�ENDŠLEA„FBLK1(PC),A0"ŠMOVE.W�FHSCMD(A0),D1†SAVE�COMMANDŠMOVE.W�#FHDELT,FHSCMD(A0)ŠTRAPƒ#FHSTINŒDELETE�THE�FILE ŠBEQ.S‚ALO20 ŠBSR„FHSERR�ERROR ŠBRA„ENDIT*ALO20…MOVE.W�D1,FHSCMD(A0)†RESTORE�COMMANDŠBRA„TAG122�TRY�AGAINŠPAGE**‰INPUT�FROM�CONSOLE***INPUT…LEA„CONBUF(PC),A5ŠCLEAR�BUFFER�FIRST ŠMOVE.L�A5,A6 ŠADD.L‚#80,A6INP10…CLR.L‚(A5)+ŠCMP.L‚A5,A6ŽFINISHED�? ŠBNE„INP10ŽNOŠLEA„CONBUF(PC),A5ŠLEA„IBLK2(PC),A0*ŠMOVE.W�#IOREAD,IOSFCT(A0)�SET�UP�FUNCTION7ŠMOVE.W�#IOPWAT+IOPFOR+IOPBRK,IOSOPT(A0)„SET�UP�OPTIONS%ŠMOVE.B�#CDFLUN,IOSLUN(A0)�SET�UP�LUN4ŠMOVE.L�A5,IOSSAD(A0)†SET�UP�START�OF�BUFFER�ADDRESS2ŠMOVE.L�A6,IOSEAD(A0)†SET�UP�END�OF�BUFFER�ADDRESSŠSUB.L‚#1,IOSEAD(A0)ŠTRAPƒ#IOSTINŒMAKE�INPUT�CALLŠBEQ.S‚INP20ŽSUCCESSFUL�!"ŠCMP.B‚#ISTABRK,IOSSTA(A0)�BREAK�?ŠBEQ.S‚RETURN�YES ŠBRA„IOSERR**‚***‚11/19/845*‚Call�to�SBARG�added�for�SPR�1006,�to�make�MBLM�work*‚correctly�with�CHAIN�files.*.INP20…BSR„SBARGŽCALL�FOR�ARGUMENT�SUBSTITUTION ŠBNE„IOSERRŠLEA„CONBUF(PC),A4 ŠRTS„RETURN**‰OUTPUT�TO�CONSOLE*OUTPUT„LEA„IBLK2(PC),A0*ŠMOVE.W�#IOWRIT,IOSFCT(A0)�SET�UP�FUNCTION7ŠMOVE.W�#IOPWAT+IOPFOR+IOPBRK,IOSOPT(A0)‚SET�UP�OPTIONS%ŠMOVE.B�#LDFLUN,IOSLUN(A0)�SET�UP�LUNŠTST.L‚D0‘IMAGE�?ŠBEQ.S‚OUT10ŽNO7ŠMOVE.W�#IOPWAT+IOPIMG+IOPBRK,IOSOPT(A0)‚SET�UP�OPTIONS9OUT10…MOVE.L�A5,IOSSAD(A0)†SET�UP�START�OF�BUFFER�ADDRESS2ŠMOVE.L�A6,IOSEAD(A0)†SET�UP�END�OF�BUFFER�ADDRESSŠTRAPƒ#IOSTINŒMAKE�OUTPUT�CALLŠBEQ.S‚OUT20ŽSUCCESSFUL�!"ŠCMP.B‚#ISTABRK,IOSSTA(A0)‚BREAK�?ŠBEQ.S‚RETURN�YESŠBRA„IOSERR�RETURN OUT20…RTS***%RETURN„TST.L‚(A7)+ŽBUMP�STACK�POINTERŠBRA„ENDITŽENDŠPAGE**‰CONVERT�HEX�TO�BINARY**‰ENTRY:�A4�=�START�BUFFER *�D0�=�LENGTH**‰RETURN:�D0�=�VALUE**'CH2B†MOVE.L�A4,A0ŽSET�UP�BUFFER�POINTER ŠADD.L‚D0,A0 ŠSUB.L‚#1,A0 ŠCLR.L‚D0 ŠCLR.L‚D2CH2B4…CLR.L‚D1"ŠCMP.B‚#'0',(A0)ŠLESS�THAN�ZERO�??ŠBLT.S‚CH2B10�YES,�ERROR$ŠCMP.B‚#'9',(A0)ŠGREATER�THAN�NINE�?ŠBGT.S‚CH2B6ŽYESŠMOVE.B�(A0),D1ŠAND.B‚#$0F,D1ŒSTRIP�ZONE ŠBRA.S‚CH2B8#CH2B6…CMP.B‚#'A',(A0)ŠLESS�THAN�A�?ŠBLT.S‚CH2B10�YES,�ERROR!ŠCMP.B‚#'F',(A0)ŠGREATER�THAN�F�?ŠBGT.S‚CH2B10�YES,�ERRORŠMOVE.B�(A0),D1ŠAND.B‚#$0F,D1ŒSTRIP�ZONEŠADD.B‚#9,D1ŽMAKE�IT�BASE�16CH2B8…ASL.L‚D2,D1ŠADD.L‚D1,D0ŽACCUMULATE ŠADD.L‚#4,D2ŠTST.B‚-(A0)ŽDECREMENTŠCMP.L‚A4,A0ŽFINISHED�?ŠBGE.S‚CH2B4ŽNOŠADD.L‚#2,(A7)ŒBUMP�PCCH2B10„RTS„RETURN**‰CONVERT�BINARY�TO�HEX**‰ENTRY:�D6�=�VALUE*�A4�=�BUFFER�POINTER**(CB2H†LEA„BINASC(PC),A1†HEX�TABLE�POINTER ŠMOVE.L�A4,A0ŠMOVE.L�#28,D1�SHIFT�VALUECB2H2…MOVE.L�D6,D0 ŠASR.L‚D1,D0!ŠAND.L‚#$F,D0�ISOLATE�A�HEX�VALUE ŠBNE.S‚CB2H4 ŠCMP.L‚A0,A4 ŠBEQ.S‚CB2H6,CB2H4…MOVE.B�0(A1,D0.L),(A0)+ƒSTORE�HEX�CHARCB2H6…SUB.L‚#4,D1 ŠBGE.S‚CB2H2ŠRTS*(BINASC„DC.Bƒ'0123456789ABCDEF'�HEX�TABLEŠPAGE**‰INPUT�S-RECORDS*"*‰RETURN:�A0�=�ADDRESS�IN�S-RECORD*‘D0�=�LENGTH�OF�DATA*‘A4�=�POINTER�TO�DATA**GETREC„LEA„IBLK3(PC),A0&ŠTST.L‚IOSRRN(A0)‰ANYTHING�IN�BUFFER�?!ŠBNE.S‚GETR5ŽYES,�SKIP�READ�BLOCK+GETR2…CLR.L‚IOSRRN(A0)‰RESET�BUFFER�POINTERŠTRAPƒ#IOSTINŒGET�RECORDŠBNE„GETR30�ERROR,�RETURNŠMOVE.L�IOSSAD(A0),A2 ŠBRA.S‚GETR80GETR5…MOVE.L�IOSRRN(A0),A2†SET�UP�BUFFER�POINTER ŠCLR.L‚D1%ŠMOVE.W�(A2),D1ŒPICK�UP�RECORD�LENGTH ŠADD.L‚D1,A2#ŠADD.L‚#2,A2ŽADD�2�FOR�LENGTH�FIELD ŠMOVE.L�A2,D1ŠBTSTƒ#0,D1ŽODD�ADDRESS�?ŠBEQ.S‚GETR7ŽNO,�OK"ŠADD.L‚#1,A2ŽADD�A�BYTE�FOR�FILLER/GETR7…MOVE.L�IOSLEN(A0),D1†PICK�UP�X-FER�LENGTHŠADD.L‚IOSSAD(A0),D1ŠCMP.L‚A2,D1ŽEND�OF�BLOCK?ŠBLE.S‚GETR2ŽYES$ŠTST.W‚(A2)�LAST�REC�IN�THIS�BLOCK�?ŠBEQ.S‚GETR2ŽYES,GETR8…MOVE.L�A2,IOSRRN(A0)†SAVE�THIS�POINTERŠADD.L‚#2,A2ŽSKIP�LENGTH�FIELD ŠM OVE.L�A2,A4ŠCMP.W‚#'S0',(A4)‰S0�RECORD�?ŠBEQ.S‚GETREC�YES,�SKIPŠCMP.W‚#'S9',(A4)‰S9�RECORD�?ŠBEQ.S‚GETREC�YES,�SKIP�ITŠCMP.W‚#'S1',(A4)+ˆS1�RECORD�? ŠBEQ.S‚GETR9ŠCMP.W‚#'S2',-2(A4)‡S2�RECORD�?#ŠBEQ.S‚GETR9ŽYES,�USE�ITƒ<<01/11/85ŠCMP.W‚#'S3',-2(A4)‡S3�RECORD�?"ŠBNE„GETREC�NO,�SKIP�ITƒ01/11/85>> GETR9…MOVE.L�#2,D0ŽSET�UP�LENGTHŠBSR„CH2B�CONVERTŠBRA.S‚GETR40�ERROR�RETURN%ŠMOVE.L�D0,-(A7)‹SAVE�LENGTH�ON�STACK ŠMOVE.L�#4,D0*ŠSUB.L‚#3,(A7)ŒADJUST�LENGTH�FOR�DATA�ONLYŠCMP.W‚#'S1',-2(A4)‡S1�?ŠBEQ.S‚GETR10�YES'ŠSUB.L‚#1,(A7)ŒASSUME�S2,�ADJUST�LENGTHŠMOVE.L�#6,D0ŽUSE�6�CHARACTERS)ŠCMP.W‚#'S3',-2(A4)‡IS�IT�S3�?‚<<01/11/85ŠBNE.S‚GETR10�NO,�ASSUME�S2/ŠSUB.L‚#1,(A7)ŒIT'S�S3,�ADJUST�LENGTH�SOME�MORE5ŠMOVE.L�#8,D0ŽUSE�8�CHARACTERS�FOR�ADDRESS‚01/11/85>>&GETR10„TST.W‚(A4)+ŽBUMP�BUFFER�POINTERŠBSR„CH2B�CONVERT�ADDRESSŠBRA.S‚GETR40�ERROR�RETURN ŠMOVE.L�D0,A0 ŠADD.L‚#4,A4ŽBUMP�BUFFER�POINTERŠCMP.W‚#'S1',-8(A4)‡S1�?ŠBEQ.S‚GETR20�YES,ŠADD.L‚#2,A4ŽADJUST�BUFFER�POINTER�FOR�AN�S2*ŠCMP.W‚#'S2',-10(A4)†IS�IT�S2�?ƒ<<01/11/85ŠBEQ.S‚GETR20�YES1ŠADD.L‚#2,A4ŽNO,�ADJUST�POINTER�FOR�S3‚01/11/85>>&GETR20„MOVE.L�(A7)+,D0‹GET�LENGTH�BACK0ŠMOVE.B‚IBLK3+IOSSTA(PC),D7�RESET�CONDITION�CODE ŠTST.BƒD7GETR30„RTS„RETURNGETR40„BRA„RECERR***‰REWIND�INPUT�FILE(S)**4REWIND„LEA„IBLK3(PC),A0‹SET�UP�POINTER�TO�FILE�BLOCK'ŠMOVE.W�IOSFCT(A0),D1†SAVE�IOCB�POINTER1ŠMOVE.W�#IOREWD,IOSFCT(A0)�SET�UP�REWIND�FUNCTION'ŠMOVE.B�#1,IOSLUN(A0)†START�WITH�LU�ONE"REW10…TRAPƒ#IOSTINŒREWIND�THE�FILEŠBNE„IOSERR�ERRORŠMOVE.B�IOSLUN(A0),D2 ŠLEA„B(PC),A5/ŠCMP.B‚FBLK2+FHSLUN-B(A5),D2„REWIND�ALL�FILES�?ŠBEQ.S‚REW20ŽYES!ŠADD.B‚#1,IOSLUN(A0)†NO,�BUMP�LUNŠBRA.S‚REW10ŽCONTINUEREW20…MOVE.B�#1,IOSLUN(A0)(ŠMOVE.W�D1,IOSFCT(A0)†RESTORE�IOCB�BLOCK ŠRTS„RETURNŠPAGE ŠEND„TAG0ééééééé=/* =/*†MIGR.AF=/**=/* Chain file to assemble MIGRate utility=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to MIGR.LS=/*=/IFC \1 ƒ=ARG�MIGR.LS=/ENDIF=/*=ASM MIGR.SA,MIGR.RO,\1;RZ=106 =/*{ Included files are:=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéééééé7=/* =/*†MIGR.LF=/*%=/* Link chain file to create MIGR.LO=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to MIGR.LL=/*=/IFC \1 ƒ=ARG�MIGR.LL=/ENDIF=/*=LINK ,MIGR.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000 INPUT MIGR.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé @ LIST MIGRATE‚IDNT†4,0‡MIGRATE�UTILITY PAGEO*********************************************************************************•PROGRAM�NAME�IS�'MIGRATOR'* *�REV�2.00‚03/18/80‚(S.�DEARING)**•***„MIGRATOR�COMMAND„****.*ˆMIGR�<#DEVICE/MDOS�FILENAME>,*$* WHERE MDOS FILENAME = FILENAME.EXT9*‚AND‚MACS�FILENAME�=�VOLUME:USERNUM.CATALOG.FILENAME.EXT*K* THIS COMMAND WILL COPY A M6800 ASCII FILE TO A M68000 ASCII FILE. NO DATA** CONVERSION IS PERFORMED DURING THE COPY.*!* REGISTERS USED: 0 1 2 3 4 5 6 7*�Dƒ*�*�*�*�*�*�**�Aƒ*�*�*�*�*�*�**** TABLES USED: NONE*O********************************************************************************‰PAGE***ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**‰NOLIST‰INCLUDE�9995.&.FME.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**‰PAGE****ˆMIGRƒMODIFICATION�HISTORY****ˆREVISION�CODE‡122084�4*!*’FORCE�POSITION�INDEPENDENT�CODE**ˆREVISION�CODE‡102881�3* *’CONTAINS�ERROR�MESSAGE�HANDLER$*’CONTAINS�POSITION�INDEPENDENT�CODE-*’CONTAINS�CURRENT�REVISION�CODE�MODIFICATION5*’CONTAINS�TERMINATION�LOGIC�FOR�USE�WITH�CHAIN�FILES1*’CONTAINS�COMMON�SUBROUTINES�PULLED�FROM�LIBRARY*’USES�THE�'SBARG'�ROUTINE3*’CONTAINS�THE�ADDED�CHARACTER�SPACE�FOR�'SBARG'�TO*œPLACE�A�'CR'**‰PAGE****ˆMIGRƒMODIFICATION�HISTORY****ˆREVISION�CODE‡120381�3*)*’CORRECT�PROBLEM�OF�INVALID�OPTION�CHECK;*’CORRECT�PROBLEM�TO�USE�STANDARD�'OK�TO�OVERWRITE'�MESSAGE2*’CORRECT�PROBLEM�OF�'EOF'�CONVERTING�AN�MDOS�FILE**‰PAGEO********************************************************************************!*’***„DATA�SEGMENT�DESCRIPTOR„****O******************************************************************************* �SECTION…0 PBA†EQU‡* REV_CODE:‰DC.B†'122084�4'&*œWHERE�REV_CODE�IS�DEFINED�AS�FOLLOWS *œMMDDYYXZ*IbRvZ_bJj:r?z:‚;Š5’?šM¢^ª13*œMMDDYY�=�MONTH�DAY�YEAR�OF�LAST�ASSEMBLY�OR�PATCH*œX†=�REVISION�TYPE�CODE*¦SPACE�=�CLEAN�ASSEMBLY *¦P…=�PATCHED*¦C…=�CUSTOMIZED�PATCHED**#*œZ†=�VERSADOS�MAJOR�REVISION�FIELD* DS.W 50 MIGRSTK EQU * TSKNAM DC.L 0 SESNUM DC.L 0 VOLNAM DC.L 0USERNUM DC.L 0CATNAM DC.L 0,0SAVINADD DC.L 0SAVOTADD DC.L 0RIBPNTR DC.L 0CLUSTNUM DC.W 0NUMCLSTR DC.W 0 LSNCNT DC.W 0 EOFLSN DC.W 0RECFLAG DC.W 0 SAVED0 DC.W 0CMDLGTH EQU 80CMDBUF COMLINE 80CMDBUFE EQU *-1MSGBUF�DC.B�'…'MSGBUFSZ�EQU‡*-MSGBUFMSGBUFND EQU *-1‰DS.B†1**œSPACE�REQUIRED�FOR�SBARG�TO�PLACE�A�'CR'INBUFF DS.L 32SECT0MID EQU * DS.L 32 SECT1 EQU * DS.L 32SECT1MID EQU * DS.L 32 SECT2 EQU * DS.L 32SECT2MID EQU * DS.L 32SECT2END EQU *-1 �DS.L�448’ DS.L 32SECTEMID EQU *-1 DS.L 32INBUFFND EQU *-1RIBUFF DS.L 29RIBUFEND EQU *-1‰DS.W†0MSG2 DC.B 'MIGR- ' DC.B 'DEVICE NAME ERROR 'MSG2ND EQU *-1‰DS.W†0MSG4 DC.B 'MIGR- ' DC.B 'INPUT FILENAME ERROR'MSG4ND EQU *-1 MSG6 DC.B 'MIGR- ' DC.B 'FILENAME NOT FOUND'MSG6ND EQU *-1‰DS.W†0MSG8 DC.B 'MIGR- ' DC.B 'OUTPUT FILENAME ERROR 'MSG8ND EQU *-1‰DS.W†0MSG11 DC.B 'MIGR- ' DC.B 'EOF ERROR 'MSG11ND EQU *-1‰DS.W†0MSG13 DC.B 'MIGR- ' DC.B 'BUFFER OVERFLOW ERROR 'MSG13ND EQU *-1MSG14:.‰DC.B†'FILE�EXISTS�-�OK�TO�OVERWRITE�(Y/N)�?�'MSG14ND EQU *-1‰DS.W†0MSG19 DC.B 'MIGR- ' DC.B 'FILE FORMAT NOT ASCII 'MSG19ND EQU *-1ENDMSG�DC.B�'**‚'‰DC.B†'MIGRATION�VER SION�' ENDMSGVN: ‰DC.B†'‰'‰DC.B†'COMPLETED'ENDMSGND EQU *-1‰DS.W†0INFHS DC.W FHASGN DC.W FOPEREW DC.B 0 �DC.B�1–;LUN1 DC.L 0 DC.W 0 DC.L $20202020 DC.L $20202020 DC.L $20202020 DC.L $20202020 DC.W $2020 DC.W 0,0,0 DC.L 0INIOCB DC.W IOREAD DC.W IOPRAN DC.B 0 �DC.B�1–LUN�1 DC.W 0�DC.L�1–RANDOM�RECORD�#�1 DC.L 0 DC.L 0 DC.L 0,0OUTFHS DC.W FHALLO+FHASGN DC.W FOPEREW+FOPTRN+FOPSEQ DC.B 0 �DC.B�2–LUN�2 DC.L 0 DC.W 0 DC.L $20202020 DC.L $20202020 DC.L $20202020 DC.L $20202020 DC.W $2020 DC.W 0,0,0 DC.L 0OUTIOCB DC.W IOWRIT DC.W IOPASC+IOPWAT DC.B 0 DC.B 2 DC.W 0 DC.L 0,0,0,0,0IN5IOS DC.W IOREAD DC.W IOPWAT DC.B 0 DC.B CDFLUN DC.W 0 DC.L 0 DC.L 0 DC.L 0 DC.L 0,0OUT6IOS DC.W IOWRIT DC.W IOPWAT DC.B 0 DC.B LDFLUN DC.W 0 DC.L 0,0,0,0,0‰PAGE***’ERROR�MESSAGE�PARAMETER�BLOCK**EM_PBLK: EM_DO:ƒ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�DESIREDEM_TLUN:�DC.B†0*œUSER�TERMINAL�LUN�-�(LDFLUN)EM_QRC:‚DC.B†0*œQUERY�RETURN�CHARACTEREM_KLUN:�DC.B†0*œUSER�KEYBOARD�LUN�-(CDFLUN)EM_SPA:‚DC.L†0'*œSTART�ADDRESS�FOR�USER�TEXT�PLUG�POOLEM_EPA:‚DC.L†0%*œENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL‰PAGE***:*ˆIN�AS�MUCH�AS�POSSIBLE�REGISTER�'A5'�WILL�BE�USED�AS�THE%*ˆPROGRAM�BASE�ADDRESS�(PBA)�REGISTER*** ‰PAGE‰XREF…PARSE,EDITFILE,SBARG*.MGRSTART LEA MIGRSTK(PC),A7 LOAD STACK POINTER‰LEA‡PBA(PC),A5*œA5=PBA*&* SAVE DEFAULT VALUES PASSED BY SYSTEM*0�MOVE.L�D0,TSKNAM-PBA(A5)…SAVE�CALLING�TASK�NAME(�MOVE.L�D1,SESNUM-PBA(A5)…SAVE�SESSION�#2�MOVE.L�D2,VOLNAM-PBA(A5)…SAVE�DEFAULT�VOLUME�NAME6�MOVE.W�D3,USERNUM-PBA(A5)„SAVE�USER�#�(16�BIT�BINARY)3�MOVE.L�D4,CATNAM-PBA(A5)…SAVE�DEFAULT�CATALOG�NAME MOVE.L D5,CATNAM+4-PBA(A5)‰LEA‡INBUFF(PC),A0 ‰MOVE.L„A0,INIOCB-PBA+IOSSAD(A5)‰LEA‡INBUFFND(PC),A0 ‰MOVE.L„A0,INIOCB-PBA+IOSEAD(A5).*œSET�START/END�ADDR�IN�INIOCB�PARAMETER�BLOCK‰LEA‡MSGBUF(PC),A0 ‰MOVE.L„A0,IN5IOS-PBA+IOSSAD(A5)‰ADD.L…#MSGBUFSZ,A0 ‰MOVE.L„A0,IN5IOS-PBA+IOSEAD(A5).*œSET�START/END�ADDR�IN�IN5IOS�PARAMETER�BLOCK)‰MOVE.L„REV_CODE-PBA(A5),ENDMSGVN-PBA(A5)-‰MOVE.L„REV_CODE+4-PBA(A5),ENDMSGVN+4-PBA(A5)**œMOVE�REVISION�CODE�TO�COMPLETION�MESSAGE** CALL COMMAND PARSE ROUTINE** LEA CMDBUF(PC),A0 GET COMMAND BUFFER ADDR BSR PARSE GO TO PARSE ROUTINE TST.L D0 TEST FOR ERROR BMI MIGRER1 BR IF ERROR ‰CMP.L…#0,A2 ‰BNE.S…X00100*œJMP�IF�OPTIONS�SPECIFIED‰LEA‡PBA(PC),A53�MOVE.L�A1,SAVOTADD-PBA(A5)‰SAVE�MACS�FILENAME�ADDR(�BSR.S‚INITMIGR�GO�TO�INPUT�INIT�ROUTINE' BSR OTITMIGR GO TO OUTPUT INIT ROUTINE BSR COPYMIGR GO TO COPY ROUTINE LEA OUT6IOS(PC),A6‰LEA‡ENDMSG(PC),A0 MOVE.L A0,IOSSAD(A6)‰LEA‡ENDMSGND(PC),A0 MOVE.L A0,IOSEAD(A6) IOSCALL (A6) ‰BNE‡EMH_020*œJMP�IF�ERROR ‰BRA‡EMH_030*œTERMINATE�NORMALX00100:‰MOVE.L„#EM_NVO,D0'*œD0=KEY�VALUE�FOR�MSG�-�INVALID�OPTION ‰BRA‡EMH_020*œTERMINATE�DE�PROGRAM PAGEO*********************************************************************************�SUBROUTINE�NAME�IS�'INITMIGR'* *�REV�1.10‚11/30/79‚(S.�DEARING)*N* THIS SUBROUTINE WILL ASSIGN THE DEVICE FOR THE INPUT MDOS FILE AND WILL READN* THE DIRECTORY AND SEARCH FOR THE INPUT FILENAME. THE 1ST CLUSTER ON THE FILE<* WILL ALSO BE READ AND THE RIB (1ST 128 BYTE SECTOR) SAVED.** CALLING SEQUENCE:*†BSR„INITMIGR*!* REGISTERS USED: 0 1 2 3 4 5 6 7 *�Dƒ*�*�*�**�Aƒ*�*�*�*ƒ*�*** SUBROUTINES CALLED: EDITFILE** TABLES USED: NONE*O*******************************************************************************INITMIGR EQU **5* CALL EDITFILE TO PUT DEVICE NAME IN FHS PARAM BLOCK*)‰LEA‡CMDBUF(PC),A0ŒADDR�OF�CMD�BUFF�START)‰LEA‡INFHS(PC),A6�ADDR�OF�INPUT�FHS�BLOCK& BSR EDITFILE CALL EDITFILE FOR DE VICE‰LEA‡PBA(PC),A5*œA5=PBA�BMI�MIGRER2‘JMP�IF�CALL�ERROR BTST #1,D0(�BEQ�MIGRER2‘JMP�IF�DEVICE�NOT�SPECIFIED BTST #0,D0=�BEQ�MIGRER2‘JMP�IF�IMPROPER�DELIMITER�AFTER�DEVICE�SPECIFIED3�MOVE.L�A0,SAVINADD-PBA(A5)ŒSAVE�MDOS�FILENAME�ADDR** ASSIGN DEVICE FOR INPUT*4 FHSCALL (A6) CALL FHS TO ASSIGN INPUT DEVICE (LUN1) ‰BNE‡EMH_020*œJMP�IF�ASSIGN�ERROR"* CALL EDITFILE FOR INPUT FILENAME*5 MOVE.L SAVINADD-PBA(A5),A0 SET UP MDOS FILENAME ADDR. BSR EDITFILE CALL EDITFILE FOR INPUT FILENAME‰LEA‡PBA(PC),A5*œA5=PBA�BMI�MIGRER4‘JMP�IF�CALL�ERROR BTST #19,D00�BEQ�MIGRER4‘JMP�IF�NO�INPUT�FILE�NAME�SPECIFIED BTST #22,D04�BNE�MIGRER4‘JMP�IF�VOLUME�SPECIFIED�FOR�INPUT�FIELD BTST #20,D05�BNE�MIGRER4‘JMP�IF�CATALOG�SPECIFIED�FOR�INPUT�FIELD BTST #18,D08�BNE.S�INIT10�JMP�IF�EXTENSION�SPECIFIED�FOR�INPUT�FIELDD MOVE.W #'SA',FHSEXT(A6) FORCE DEFAULT EXTENSION IN FHS BLOCK TO .SA*>* READ DIRECTORY FROM MDOS FILE (11 SECTORS OF 256 BYTES EACH)*(INIT10 IOSCALL INIOCB(PC) READ DIRECTORY ‰BNE‡EMH_020*N* MDOS DIRECTORY STARTS IN SECTOR 3 OF MDOS FILE (MDOS SECTORS ARE 128 BYTES).M* THIS CORRESPONDS TO THE 2ND HALF OF SECTOR 1 FOR A 256 BYTE SECTOR FOR THE * M68000 DISK.*/‰LEA‡INIOCB(PC),A0‹ADDR�OF�INPUT�IIOS�PARAM�BLK4‰LEA‡SECT0MID(PC),A1‰GET�ADDR�OF�1ST�DIRECTORY�ENTRY7INIT20 MOVE.L A1,A2 SAVE START OFF THIS DIRECTORY ENTRY2 LEA FHSFIL(A6),A3 GET INPUT FILENAME FROM FHS BLK+ CMPM.L (A2)+,(A3)+ 1ST 4 BYTES = FILENAME?* BNE.S INIT30 NO, GET NEXT DIRECTORY ENTRY+ CMPM.L (A2)+,(A3)+ 2ND 4 BYTES = FILENAME?* BNE.S INIT30 NO, GET NEXT DIRECTORY ENTRY CMPM.W (A2)+,(A3)+ EXTENTS = ?" BEQ.S INIT40 YES, DIRECTORY FOUND** FIND NEXT DIRECTORY ENTRY*4INIT30 ADD.L #16,A1 INCREMENT TO NEXT DIR ENTRY ADDR‰LEA‡SECTEMID(PC),A2.‰CMP.L…A2,A1…IS�IT�PAST�THE�END�OF�THE�BUFFER?) BMI.S INIT20 NO, GO CHECK NEXT DIR ENTRY, BRA MIGRER6 YES, ERROR - FILENAME NOT FOUND** FOUND DIRECTORY ENTRY*INIT40 CLR.L D10 MOVE.W (A2)+,D1 SAVE PSN FOR 1ST SECTOR OF FILE( MOVE.W (A2),D2 GET FILE ATTRIBUTE BYTES% AND.W #$0700,D2 GET FILE FORMAT BITS CMP.W #$0500,D2 IS IT ASCII? BNE MIGRER19 NO, ERROR*N* CALCULATE THE 1ST PHYSICAL SECTOR # OF THE FILE FOR M68000. (DIVIDE THE MDOSO* PSN BY 2). DATA WILL BE READ IN MDOS CLUSTERS; 4 128 BYTE SECTORS INTO 2 256 * BYTE SECTORS.(*ˆALL�PSN'S�IN�MDOS�ARE�A�MULTIPLE�OF�4.*! LSR.L #1,D1 DIVIDE MDOS PSN BY 2/ MOVE.L D1,IOSRRN(A0) PUT MACS PSN IN IOS BLOCK‰LEA‡SECT1(PC),A1/ MOVE.L A1,IOSSAD(A0) SET START ADDR IN IOS BLK‰LEA‡SECT2END(PC),A1- MOVE.L A1,IOSEAD(A0) SET END ADDR IN IOS BLK*D* READ RETRIEVAL INFORMATION BLOCK (RIB) AND 3 128 BYTE DATA SECTORS* IOSCALL (A0) READ RIB AND DATA‰BNE‡EMH_020‹JMP�IF�READ�ERROR+‰LEA‡SECT1(PC),A1ŠGET�ADDR�OF�RIB�IN�BUFFER, MOVE.W #116/2,D1 LOAD # WORDS TO MOVE (RIB)' LEA RIBUFF(PC),A2 LOAD RIB BUFFER ADDR. MOVE.L A2,RIBPNTR-PBA(A5) SAVE POINTER TO RIB&INIT50 MOVE.W (A1),D3 GET SDW FROM RIB& BPL.S INIT60 BR IF NOT TERMINATOR SDW% AND.W #$7FFF,D3 CLEAR TERMINATOR BIT3 MOVE.W D3,EOFLSN-PBA(A5) SAVE EOF LOGICAL SECTOR #- MOVE.W (A1),(A2) MOVE TERMINATOR SDW TO WORK+ BRA.S INIT70 GO INITIALIZE FIELDS FOR COPY5INIT60 MOVE.W (A1)+,(A2)+ MOVE RIB FROM INPUT TO WORK SUB.W #1,D1 DECREMENT COUNTER BNE.S INIT50 BR IF MORE TO MOVE*!* INITIALIZE FIELDS TO BEGIN COPY*3INIT70 SUB.W #1,LSNCNT-PBA(A5) INIT LSN COUNT TO -1* MOVE.L RIBPNTR-PBA(A5),A2 GET ADDR TO RIB$ MOVE.W (A2),D1 GET 1ST SDW FROM RIB3 AND.W #$03FF,D1 GET STARTING CLUSTER # FOR SEGMENT0 ADD.W #1,D1 ADD 1 FOR CLUSTER ALREADY READ AND MOVE.W D1,CLUSTNUM-PBA(A5) SAVE$ MOVE.W (A2),D1 GET 1ST SDW FROM RIB, AND.W #$7C00,D1 GET # CONTIGUOUS CLUSTERS-1 MOVE.L #10,D3 LOAD SHIFT COUNT- LSR.W D3,D1 SHIFT TO LOW ORDER BITS AND SAVE; MOVE.W D1,NUMCLSTR-PBA(A5) AS TRUE # CLUSTERS LEFT TO READ RTS . RETURN TO CALLER PAGEO*********************************************************************************�SUBROUTINE �NAME�IS�'OTITMIGR'* *�REV�1.10‚01/31/80‚(S.�DEARING)*D* THIS SUBROUTINE WILL ASSIGN AND ALLOCATE THE OUTPUT FILE FOR MACS.** CALLING SEQUENCE:*†BSR„OTITMIGR*!* REGISTERS USED: 0 1 2 3 4 5 6 7*�Dƒ* *�Aƒ*‰*�*** SUBROUTINES CALLED: EDITFILE** TABLES USED: NONE*O*******************************************************************************OTITMIGR EQU **'* INITIALIZE OUTPUT FHS PARAMETER BLOCK*‰LEA‡PBA(PC),A57 MOVE.L SAVOTADD-PBA(A5),A0 GET ADDR OF OUTPUT FILENAME/ LEA OUTFHS(PC),A6 GET ADDR OF OUTPUT FHS BLOCK? MOVE.L VOLNAM-PBA(A5),FHSVOL(A6) SET DEFAULT VOLUME IN FHS BLK@ MOVE.W USERNUM-PBA(A5),FHSUSN(A6) SET DEFAULT USER # IN FHS BLKC MOVE.L CATNAM-PBA(A5),FHSCLG(A6) SET DEFAULT CATLG NAME IN FHS BLK% MOVE.L CATNAM+4-PBA(A5),FHSCLG+4(A6)- LEA INFHS(PC),A1 SET ADDR OF INPUT FHS BLOCK9 MOVE.W FHSEXT(A1),FHSEXT(A6) MOVE INPUT EXTENT TO OUTPUT6‰TST.L…SAVOTADD-PBA(A5)ŒWAS�OUTPUT�FILENAME�SPECIFIED?& BNE.S OTIT10 YES, GO PROCESS FILENAME; MOVE.L FHSFIL(A1),FHSFIL(A6) MOVE INPUT FILENAME TO OUTPUT+ MOVE.L FHSFIL+4(A1),FHSFIL+4(A6) FHS BLOCK BRA.S OTIT205OTIT10 BSR EDITFILE CALL EDITFILE FOR OUTPUT FILENAME‰LEA‡PBA(PC),A5*œA5=PBA BMI MIGRER8 BR IF ERROR BTST #19,D0 WAS FILENAME FOUND? BEQ MIGRER8 NO, ERROR*!* ASSIGN AND ALLOCATE OUTPUT FILE*5OTIT20 FHSCALL (A6) ASSIGN AND ALLOCATE OUTPUT (LUN2)�BEQ.S‚OTIT40�BR�IF�NO�ERROR9 CMP.B #FSTADNM,FHSSTA(A6) IS THERE A DUPLICATE FILENAME? ‰BNE‡EMH_020%*œJMP�IF�ERROR�NOT�FOR�DUPLICATE�FILE4‡LEA�OUT6IOS(PC),A6�GET�ADDR�OF�CRT�OUTPUT�IOS�BLOCK‰MOVE.W„FHSOPT(A6),-(A7)*œSAVE�CURRENT�OPTIONS!‰MOVE.W„#IOPWAT+IOPIMG,FHSOPT(A6)*œSET�NEW�OPTIONS*¦WAIT *¦IMAGE�MODE.‰LEA‡MSG14(PC),A0ŒSET�UP�START�ADDR�OF�MESSAGE‰MOVE.L„A0,IOSSAD(A6)‰LEA‡MSG14ND(PC),A00‰MOVE.L„A0,IOSEAD(A6)‡SET�UP�END�ADDR�OF�MESSAGE. IOSCALL (A6) WRITE OUT DUPLICATE FILENAME MSG ‰BNE‡EMH_020*œJMP�IF�ERROR‰MOVE.W„(A7)+,FHSOPT(A6)*œRESTORE�OPTIONS. IOSCALL IN5IOS(PC) GET RESPONSE FROM TERMINAL ‰BNE‡EMH_020*œJMP�IF�ERROR ‰BSR‡SBARG/*œCONVERT�LOWER�CASE�TO�UPPER�CASE�IF�NECESSARY ‰BNE‡EMH_020*œJMP�IF�SBARG�ERROR4 CMP.B #'Y',MSGBUF-PBA(A5) IS FILENAME TO BE REUSED? ‰BNE‡EMH_030"*œJMP�IF�NO�AND�TERMINATE�NORMALLY4 LEA OUTFHS(PC),A6 GET ADDR OF DISK OUTPUT FHS BLOCK/ MOVE.W #FHDELT,FHSCMD(A6) SET DELETE CMND CODE! FHSCALL (A6) DELETE OLD FILENAME ‰BNE‡EMH_020*œJMP�IF�ERRORF MOVE.W #FHALLO+FHASGN,FHSCMD(A6) RESET FHS CMD TO ASSIGN AND ALLOCATE) BRA OTIT20 GO ASSIGN AND ALLOCATE OUTPUTOTIT40 RTS . RETURN TO CALLER PAGEO*********************************************************************************�SUBROUTINE�NAME�IS�'COPYMIGR'* *�REV�1.21‚01/31/80‚(S.�DEARING)*F* THIS SUBROUTINE WILL COPY INPUT MDOS RECORDS TO AN OUTPUT MACS FILE.** CALLING SEQUENCE:*†BSR„COPYMIGR*!* REGISTERS USED: 0 1 2 3 4 5 6 7 *�D…*�*�**�A…*�*�*�*�*�*** SUBROUTINES CALLED: NONE** TABLES USED: NONE*O*******************************************************************************COPYMIGR EQU */ LEA INIOCB(PC),A4 GET INPUT IOS PARAM BLK ADDR1 LEA OUTIOCB(PC),A6 GET OUTPUT IOS PARAM BLK ADDR.‰LEA‡SECT1MID(PC),A1‰GET�INPUT�DATA�START�ADDR,‰LEA‡SECT2END(PC),A2‰GET�INPUT�DATA�END�ADDRACOPY10 MOVE.L A1,IOSSAD(A6) PUT OUTPUT DATA START ADDR IN IOS BLK*M* CHECK FOR DATA ADDRESS = TO BEGINNING OF MDOS 128 BYTE SECTOR TO UPDATE LSN * COUNTER*COPY20:‰LEA‡SECT1(PC),A0-‰CMP.L…A0,A1…IS�ADDR�THE�START�OF�1ST�SECTOR?+ BEQ.S COPY30 YES, GO INCREMENT LSN COUNTER‰LEA‡SECT1MID(PC),A0-‰CMP.L…A0,A1…IS�ADDR�THE�START�OF�2ND�SECTOR?+ BEQ.S COPY30 YES, GO INCREMENT LSN COUNTER‰LEA‡SECT2(PC),A0-‰CMP.L…A0,A1…IS�ADDR�THE�START�OF�3RD�SECTOR?+ BEQ.S COPY30 YES, GO INCREMENT LSN COUNTER‰LEA‡SECT2MID(PC),A0-‰CMP.L…A0,A1…IS�ADDR�THE�START�OF�4TH�SECTOR?" BNE.S COPY40 NO, BYPASS INCREMENT3COPY30 ADD.W #1,LSNCNT-PBA(A5) ADD 1 TO LSN COUN TER)COPY40 MOVE.B (A1)+,D1 GET DATA CHARACTER' CMP.B #$0D,D1 IS IT A CARRIAGE RETURN?) BEQ.S COPY60 YES, GO WRITE OUTPUT RECORD! TST.B D1 IS IT A NULL CHARACTER?% BNE.S COPY45 NO, SET GOOD DATA FOUND3 CMP.W #1,RECFLAG-PBA(A5) HAS GOOD DATA BEEN FOUND?�BNE.SƒCOPY69�NO,�BYPASS�NULLS. BRA.S COPY50 YES, GO CHECK PAST END OF BUFFER4COPY45 MOVE.W #1,RECFLAG-PBA(A5) SET GOOD DATA FOUND5COPY50 CMP.L A1,A2 ARE WE PAST THE END OF THE BUFFER?$�BMI.S‚COPY70�YES,�GO�READ�MORE�DATA% BRA.S COPY20 GO CHECK NEXT DATA CHAR** WRITE OUTPUT RECORD*6COPY60 MOVE.W #0,RECFLAG-PBA(A5) CLEAR GOOD DATA FOUND6 MOVE.L A1,IOSEAD(A6) SAVE DATA END ADDR IN OUTPUT IOS7 SUB.L #2,IOSEAD(A6) BLOCK AND ADJUST BACK TO BEFORE CR0 MOVE.L IOSSAD(A6),A3 GET OUTPUT DATA START ADDR9 CMP.L IOSEAD(A6),A3 IS ENDING ADDR LESS THAN START ADDR?' BLE.S COPY61 NO, GO CHECK FOR ADDR ODD7 MOVE.B #' ',(A3) REPLACE CR WITH A BLANK 1 CHAR RECORD6 ADD.L #1,IOSEAD(A6) ADD 1 TO END DATA ADDR IN IOS BLK8COPY61�MOVE.L‚IOSSAD(A6),D0ƒMOVE�ADDRESS�TO�REG�FOR�TEST�BTST‚#0,D0‚IS�ADDRESS�ODD?!�BEQ.S‚COPY68�NO,�GO�WRITE�RECORD$ MOVE.L A3,A0 SET UP ADDR TO MOVE TO SUB.L #1,A09COPY62 MOVE.B (A3)+,(A0)+ SHIFT ALL BYTES LEFT 1 POSITION/ CMP.L IOSEAD(A6),A0 HAVE WE SHIFTED ALL BYTES? BNE.S COPY62 NO, GO DO MORE* SUB.L #1,IOSSAD(A6) RESET START DATA ADDR( SUB.L #1,IOSEAD(A6) RESET END DATA ADDR COPY68 IOSCALL (A6) WRITE RECORD ‰BNE‡EMH_020*œJMP�IF�WRITE�ERROR*L* Where #xxxx is a disk device mnemonic of the form #FDXX for floppy disk orN* #HDXX for hard disk and 'XX' is a drive/controller number defined by SYSgen.*B* General register usage : A0 = FHS or IOS Parameter Block address'*šA1�=�Current�configuration�PB�address *šA2�=�VID�sector�buffer�address-*šA3�=�Disk�configuration�area�buffer�address#*šA5�=�Output�message�start�address!*šA6�=�Output�message�end�address* Ä.ÍNÕCÝBå?í0õ1ý31 302%0-+50=*E3MN********************************************************************************‰MODIFICATION�HISTORY**‰REVISION‚010584�4*4*’Modified�include�file�DSKCFGCD.AI�so�as�not�to�use@*ˆtags�VOLMMTDE�and�SENDMSG,�which�are�in�INIT�only.�Instead,�anG*ˆinternal�tag�was�added�to�DSKCFGCD,�CRLF,�and�internal�tag�MSGOUT�was*ˆused�instead�of�SENDMSG.**‰REVISION‚110984�45*’Modified�include�file�DSKCFGDT.AI�for�new�attribute+*ˆfor�alternate�sector-capable�controllers.*O********************************************************************************ŠSPC„2*‰INCLUDE‚9995.&.FME.EQ*‰INCLUDE‚9995.&.TR1.EQ*‰INCLUDE‚9995.&.IOE.EQ*‰INCLUDE‚DSKCFGCD.AI*‰INCLUDE‚DSKCFGDT.AIŠSPC„22ŠTTL�Vdos�Mount�Utility�V�4.01�(Data�Declarations)ŠPAGEŠNOLISTŠINCLUDE‚9995.&.FME.EQŠINCLUDE‚9995.&.TR1.EQŠINCLUDE‚9995.&.IOE.EQŠLIST ŠSECTION‚0 PBA†EQU‡*.SDATA…DC.Bƒ'122084�4'‰Revision�number�and�dateŠSPC„2ŠDS.Bƒ$100�Stack�storage STACK…EQU„*ŠSPC„2*4* Parameter Block storage for VERSAdos system calls.*)FHSBLK„DCB.B‚FHSBLN,0‹FHS�parameter�block ** Miscellaneous storage*/COMAND„COMLINE�82�Invoking�command�line�storageCOMANDEƒEQU„*-1 +SCTREGSƒDS.Lƒ12‘Storage�for�SCT�passed�dataŠSPC„2** Disk I/O buffers*;VIDBUF„DS.Bƒ$100�Storage�for�the�VID�(sector�0)�of�the�diskVIDBUFEƒEQU„*-1�to�be�mounted. ;SECTBUFƒDS.Bƒ$100�Storage�for�the�configuration�area�of�the$SECTBUFE‚EQU„*-1�disk�to�be�mounted.ŠPAGE**‚Miscellaneous�data�flags*,VDOSFLGƒDC.Bƒ0“VERSAdos�initilized�disk�flag 7IPCFLG„DC.Bƒ0“This�flag�is�checked�prior�to�termination-*£to�determine�if�the�disk�mounted�was�an�IPC+*£type�disk�without�a�configuration�area�or,*£IPC�disk�type�code�in�the�VID.�If�the�flag**£is�set,�the�disk�type�code�is�written�to *£the�VID.ŠSPC„22CDRIVFLG‚DC.Bƒ0”This�flag�is�set�when�the�'D'�(for**£Mount�Drive)�is�specified�on�the�command*£line.ŠDS.Wƒ0*L*ƒThe�following�table�contains�a�full�configuration�parameter�block�for�eachI* of one or more IPC initialized disks. The appropriate configuration forI* a particular disk type is indexed by the disk type field of the VID for* VERSAdos initialized disks.*IPCTBL„DS.Bƒ1’StatusŠDC.BƒXTDIPC�Channel�typeŠDC.BƒXDSFDK�Device�typeŠDC.BƒIODIPC�Driver�typeŠSPC„2/ŠDC.Wƒ$FFFFŽAtttributes�mask�(must�be�non-zero).ŠDC.Wƒ$FFFFŽParameters�mask�(must�be�non-zero)ŠSPC„2*Á9/27/83�MLB*>ŠDC.Wƒ1<EDITOK„EQU„$0040BC02ŠValue�returned�in�D0�by�EDITFILE�when�the**£input�field�of�the�command�line�contains*£only�a�device�mnemonic. 2MAXIPC„EQU„2“This�is�the�maximum�value�allowed�for+*£the�IPC�disk�type�code.�Presently,�single(*£and�double�sided�floppies�are�the�only*£recognized�IPC�disk�types. *CRˆEQU„$0D‘ASCII�carriage�return�character 4SSFPY…EQU„1”These�equates�define�the�disk�type�codes2DSFPY…EQU„2’for�IPC�format�single�and�double�sided*£floppy�disks.ŠSPC„23LFˆEQU„$200A�ASCII�blank�followed�by�ASCII�linefeedŠSPC„2M*ƒGenerate�a�mask�to�clear�all�bits�in�the�attributes�and�parameters�that�areN* not media related are unmodifiable values, return only values, or are values%* related to the physical disk drive. 9MSKUNATM‚EQU„1<EXITERR2‚BSR.L‚EMHOUT�Call�the�error�message�handler�to�output7ŠBRA.L‚MTABRT10‹the�error�message�and�terminate�without*£doing�a�dismount.ŠSPC„2=MNT017„LEA.L‚IOSBLK(PC),A0‰Initialize�the�IOS�parameter�block<ŠMOVE.W�#IOSTAT,IOSFCT(A0)‚to�perform�a�configuration/status2ŠMOVE.B�#INPUTLU,IOSLUN(A0)�request�on�the�device.ŠSPC„29ŠLEA.L‚CNFGBLK(PC),A1ŒInitialize�the�buffer�start�and�end<ŠMOVE.L�A1,IOSDBP(A0)‹address�fields�of�the�IOCB�to�point�to)ŠTRAPƒ#2–the�area�where�the�configuration0ŠBNE.L‚EXITERR‘information�will�be�returned,�and'*¨issue�the�request.�There�should�never&*¨be�an�error�return�from�this�request"*¨but�the�return�status�is�checked *¨anyway.ŠPAGE9ŠMOVE.L�#EM_NVDEV,D0‰If�the�device�type�code�is�not�for�a?ŠCMP.B‚#XDSRDK,IOSDTP(A1)�floppy�or�hard�disk,�issue�an�invalid6ŠBHI.L‚EXITERRŒdevice�error.�The�device�type�is�either(*£one�or�two�for�a�disk�device.�A�device*£type�of�zero�is�impossible.ŠSPC„2<ŠCMP.B‚#XTDIPC,IOSCTP(A1)ƒIf�the�channel�type�shows�that�the.ŠBNE.S‚MNT020�drive�is�not�connected�to�an�IPC**£controller,�execution�proceeds�normally.ŠSPC„2;ŠLEA.L‚MSGIPC(PC),A5‡If�the�specified�drive�is�connected�to9ŠLEA.L‚MSGIPCE(PC),A6…an�IPC�controller,�output�a�message$*£telling�the�user�that�mount�is�not*£necessary,�and�terminate.ŠSPC„28MSGEXITƒBSR.L‚MSGOUT�Output�the�message�pointed�to�by�A55ŠBRA.L‚MTABRT�and�A6�to�the�system�log�output�device,*£and�terminate�the�utility.ŠSPC„2*À9/27/83�MLB�*@MNT020„TST.B‚IOSDST(A1)‹If�bit�7�of�the�device�status�is�clear,*7ŠBMI.S‚MNT030�the�device�is�on-line.�Since�the�device‚*@ŠLEA.L‚MSGONLN(PC),A5…should�b  e�off-line�before�calling�MOUNT,�*AŠLEA.L‚MSGONLNE(PC),A6„send�a�message�to�the�user�and�terminate�*8ŠBSR.L‚MSGOUT�without�issuing�a�Dismount�command�to�the*ŠBRA.L‚EXIT�driver.¢**À9/27/83�MLB�*ŠSPC„2EMNT030„MOVE.B�CDRIVFLG-PBA(A4),D0†If�the�configure�drive�flag�is�set,7ŠBNE.L‚CONFGDRV‹transfer�control�to�the�configure�drive *£routine.ŠSPC„2AŠMOVE.L�IOSATM(A1),-(A7)…Save�the�attributes�and�parameters�masks&*£returned�by�the�configuration�status)*£request�on�the�stack.�The�two�masks�are *£always�adjacent�16-bit�values.ŠSPC„2:ŠCLR.L‚IOSATM(A1)‹Issue�a�configure�request�to�the�driver.AŠMOVE.W�#IOCNFG,IOSFCT(A0)�Set�both�the�attributes�and�parametersFŠMOVE.W�#IOPMNT,IOSOPT(A0)�masks�to�zero�to�prevent�any�of�the�current3ŠTRAPƒ#2‘configuration�data�from�being�changed.�The9ŠBNE.L‚EXITERRŒMount�option�is�set�to�cause�the�driver�to&*£put�the�device�on-line�and�allow�I/O+*£requests�to�be�processed.�No�error�should*£be�returned�on�this�request.ŠSPC„2BŠMOVE.L�(A7)+,IOSATM(A1)…Restore�the�masks�of�supported�attributes *£and�parameters�from�the�stack.ŠPAGE<ŠLEA.L‚VIDBUF(PC),A2ˆSet�up�the�data�buffer�addresses�in�theAŠMOVE.L�A2,IOSSAD(A0)†IOCB�to�point�to�the�VID�(sector�0)�buffer.ŠLEA.L‚VIDBUFE(PC),A6ŠMOVE.L�A6,IOSEAD(A0)ŠSPC„2CŠMOVE.W�#IOREAD,IOSFCT(A0)ƒAttempt�to�read�sector�zero�of�the�disk.ŠMOVE.W�#IOPRAN,IOSOPT(A0)ŠCLR.L‚IOSRRN(A0)ŠTRAPƒ#2 ŠBEQ.S‚MNT045ŠSPC„2;ŠCMP.B‚#ISTANR,D0‹If�the�attempt�to�read�the�VID�results�in9ŠBEQ.L‚EXITERRŒa�device�not�ready�error,�perform�an�error>MNT040„BRA.L‚MNTFORNŒexit.�Any�other�I/O�error�is�treated�as�a*£foreign�disk.ŠSPC„2DMNT045„CMP.L‚#'EXOR',VIDMAC(A2)…If�the�sector�0�does�not�contain�the7ŠBNE.S‚MNT040�code�'EXORMACS',�the�disk�is�not�VERSAdos@ŠCMP.L‚#'MACS',VIDMAC+4(A2)�initialized�so�treat�it�as�a�foreignŠBNE.S‚MNT040�disk.ŠSPC„28ŠTST.L‚VIDVOL(A2)‹If�the�volume�name�field�of�the�VID�is3ŠBEQ.S‚MNT040�zero,�treat�the�disk�as�foreign.�This,*£situation�can�occur�if�the�SCRATCH�utility)*£is�used�on�a�VERSAdos�initialized�disk.ŠSPC„2>ŠLEA.L‚SCTREGS(PC),A3‡Obtain�the�requestors�log-on�user�number;ŠMOVE.L�10*4(A3),D1ˆpassed�in�A2�of�the�registers�passed�by#*£SCT�when�MOUNT�started�execution.ŠSPC„2/ŠBEQ.S‚MNT050�If�the�requestor�is�user�0�or�the:ŠCMP.W‚VIDUSN(A2),D1†requestors�log-on�user�number�matches/ŠBEQ.S‚MNT050�the�user�number�of�the�disk�owner(*£contained�in�the�VID,�proceed�with�the*£mount.ŠSPC„2<ŠLEA.L‚MSGIUSR(PC),A5‡If�the�requestor�is�not�the�disk�ownerBŠLEA.L‚MSGIUSRE(PC),A6„or�user�0,�issue�an�error�message�and�exit. ŠBRA„MSGEXITŠPAGECMNT050„LEA.L‚VDOSFLG(PC),A5‡Set�a�flag�to�indicate�that�the�disk�to,ŠST…(A5)�be�mounted�is�VERSAdos�initialized.ŠSPC„2CŠMOVE.L�VIDCAS(A2),IOSRRN(A0)‚Check�the�configuration�area�starting8ŠBEQ.S‚MNTIPCDŽsector�pointer�in�the�VID.�If�the�pointer)*¥is�zero,�there�is�no�configuration�area%*¥so�skip�the�configuration�area�read *¥routine.ŠSPC„2:ŠLEA.L‚SECTBUF(PC),A3ŒThe�starting�sector�of�the�configure9ŠMOVE.L�A3,IOSSAD(A0)‹area�has�already�been�copied�to�the;ŠLEA.L‚SECTBUFE(PC),A6‰RRN�field�of�the�IOCB.�Read�the�disk9ŠMOVE.L�A6,IOSEAD(A0)‹configuration�area�into�the�buffer..ŠTRAPƒ#2–If�an�error�is�returned�from�the�read.ŠBNE.L‚EXITERR‘request,�perform�an�error�exit.ŠSPC„29ŠTST.L‚IOSATM(A3)‹If�there�is�a�configuration�area�on�the5ŠBNE.S‚MNTCNFGŒdisk�and�the�attributes�and�parameters@MNTTYPEƒLEA.L‚MSGODSK(PC),A5…masks�of�the�configuration�block�it@ŠLEA.L‚MSGODSKE(PC),A6„contains�are�both�zero,�the�configuration5ŠBRA„MSGEXITŒblock�is�empty.�This�condition�will�only**£occur�if�the�user�is�attempting�to�mount-*£hard�disk�media�initalized�on�an�IPC�drive.**¥Since�there�is�no�planned�support�for�an-*£IPC�type�hard�disk�on�a�non-IPC�controller,+*£an�error�message�is�issued�an�the�utility*£is�terminated.ŠPAGE6MNTIPCDƒCLR.L‚D2“Control�reaches�here�when�there�is�no<ŠMOVE.B�VIDIPC(A2),D2†configuration�area�on�the�disk.�If�the4ŠBEQ.L‚NOCNFG�IPC�disk�type�flag  �in�the�VID�is�zero,**£configuration�data�must�be�obtained�from *£the�user.ŠSPC„25ŠSUB.B�#1,D2‘If�the�IPC�disk�type�field�of�the�VID�is=ŠCMP.B‚#MAXIPC,D2‰non-zero,�the�field�should�contain�an�valid6ŠBHI„MNTTYPEŒIPC�disk�type�code�supplied�in�an�earlier+*£invocation�of�the�MOUNT�utility.�The�only)*£valid�type�codes�at�this�time�are�a�one**£for�a�single�sided�floppy�or�a�two�for�a,*£double�sided�floppy.�If�the�field�contains-*£any�other�value,�issue�an�error�message�and *£terminate.ŠSPC„2:ŠMULUƒ#IOSDLN,D2‹Calculate�the�offset�in�the�configuration**£table�of�the�entry�for�the�IPC�disk�type*£specified�in�the�VID.ŠSPC„29ŠLEA.L‚IPCTBL(PC),A3ˆLoad�the�address�in�the�table�of�the2ŠADD.L‚D2,A3Žconfiguration�parameter�block�for�the*£selected�IPC�disk�type.ŠSPC„2CMNTCNFGƒMOVE.L�#MSKDRIV,D1‹From�this�point�on,�the�operation�of�the3ŠBSR.L‚CONFIG�utility�is�the�same�regardless�of�the2ŠBEQ.S‚MNT070�source�of�the�new�configuration�data+*£(i.e.�from�the�disk�configuration�area�or*£the�IPC�disk�table).**¥Call�the�configure�subroutine�to�set�the,*£media�related�attributes�and�parameters�to'*£the�correct�values�for�the�disk�being *£mounted.ŠSPC„2ŠLEA.L‚MSGFMS(PC),A5†error�message�but�leave�the�disk�mounted.=ŠLEA.L‚MSGFMSE(PC),A6…The�IPC�disk�flag�is�cleared�to�prevent5ŠBSR.L‚MSGOUT�a�possible�write�to�the�VID.�The�device$*£mnemonic�is�copied�back�to�the�FHS(*£parameter�block�so�that�the�successful,*£mount�message�is�consistent�with�the�error *£message.ŠPAGE>MNT090„LEA.L‚MSGMTOK(PC),A5‡Issue�a�message�that�the�mount�was9ŠLEA.L‚MSGMTOKE(PC),A6„successful.�If�a�VERSAdos�disk�was@ŠMOVE.L�FHSVOL(A0),(A5)„mounted,�the�message�includes�the�volume4ŠBSR.L‚MSGOUT�name�of�the�disk.�Otherwise�the�device*£mnemonic�is�included.ŠSPC„2@ŠMOVE.L�#IOSRSZB<<1,D1‡Call�the�configuration�display�suborutine2ŠMOVE.L�A3,A1Žto�tell�the�user�the�total�number�of4ŠBSR.L‚DSPCNFGŒVERSAdos�sectors�on�the�m! ounted�disk.ŠSPC„2?ŠMOVE.B�IPCFLG-PBA(A4),D1ˆIf�the�IPC�disk�type�flag�is�not�set,0ŠBEQ.S‚EXIT�a�VERSAdos�disk�has�been�mounted�but**£input�from�the�user�was�required.�If�the)*£user�specified�that�the�disk�was�an�IPC-*£initialized,�single�or�double�sided�floppy,$*£the�flag�is�set�so�the�VID�will�be,*£rewritten�to�include�the�disk�type�code�in*£the�VIDIPC�field.ŠSPC„2>ŠMOVE.B�VIDIPC(A2),D1ˆUpdate�the�least�significant�byte�of�the@ŠEOR.B‚D1,VIDCHK+1(A2)„VID�checksum�to�account�for�the�new�value*£of�the�VIDIPC�field.ŠSPC„27ŠLEA.L‚IOSBLK(PC),A0ŒPut�the�start�and�end�addresses�of3ŠMOVE.L�A2,IOSSAD(A0)Šthe�VID�buffer�into�the�IOCB.ŠLEA.L‚VIDBUFE(PC),A6ŠMOVE.L�A6,IOSEAD(A0)ŠSPC„2CŠMOVE.W�#IOWRIT,IOSFCT(A0)ƒSince�the�IPC�disk�type�field�in�the�VID<ŠCLR.L‚IOSRRN(A0)‰now�contains�the�appropriate�type�code�forBŠMOVE.W�#IOPRAN,IOSOPT(A0)�the�disk,�write�out�the�new�VID�so�that.ŠTRAPƒ#2‘the�disk�can�be�automatically�mountedŠBEQ.S‚EXIT�in�the�future.ŠSPC„24ŠBSR.L‚EMHOUT�If�the�new�VID�could�not�be�written�to@ŠLEA.L‚MSGVIDW(PC),A5…the�disk,�call�EMH�to�output�the�I/O�error=ŠLEA.L‚MSGVIDWE(PC),A6„message.�Also�output�a�message�stating8ŠBSR.L‚MSGOUT�that�the�VID�could�not�be�updated�to�allow*£automatic�configuration. 7EXIT†ERQ.TERM�#0,#0ŽPerform�a�normal�termination�with�a%*£zero�termination�code�in�D0�and�A0.5ŠTTL�Vdos�Mount�Utility�V�4.01�(Configure�Subroutine)ŠPAGE M*******************************************************************************šConfigure�Subroutine*š---------�----------*H*ƒThis�subroutine�issues�a�configure�or�configure�default�request�to�theM* driver using the parameter block pointed to by A3. The supported attributesM* and parameters masks are obtained from the current configuration pointed toN* by A1 and are masked by the contents of D1.L so that the calling routine canO* control which of the configuration values are changed. The subroutine returnsK* immediately following the completion of the trap 2 so that error handling&* may be performed by calling routine.*A*‰Entry�conditions:�A0�=ƒAddress�of�the�IOS�parameter�block�to�be-*¡used�for�the�configure�or�configure�default *¡request.-*›A1�=„Address�of�a�configure�data�block�that%*¡contains�the�current�configuration.**›A3�=„Address�of�the�configure�data�block#*¡containing�the�new�configuration.0*›D1(�bits�16-31)�=‚The�mask�of�attributes�to�be*­changed�by�the�request./*›D1�(bits�0-15)‚=‚The�mask�of�parameters�to�be*­changed�by�the�request.*=*‰Exit�conditions:‚D0�=„Status�returned�from�the�configure�or*¡configure�default�request.*#*£All�other�registers�are�preserved*N****************************************************************************** @CONFIG„MOVE.W�#IOCNFG,IOSFCT(A0)ƒSet�the�IOS�function�code�for�a!ŠBRA.S‚CONF010Œconfigure�request.ŠSPC„2ACONFIGDƒMOVE.W�#IOCHDC,IOSFCT(A0)ƒSet�the�IOS�function�code�for�a*£configure�default�requestŠSPC„2KCONF010ƒMOVE.L�IOSATM(A1),IOSATM(A3)‚Copy�the�masks�of�supported�attributes**¥and�parameters�obtained�with�the�current)*¥configuration�status�into�corresponding'*¥fields�in�the�new�configure�parameter*¥block.ŠSPC„2=ŠAND.L‚D1,IOSATM(A3)ˆForce�to�zero�all�bits�in�the�attributes**£and�parameters�mask�of�the�new�configure+*£parameter�block�that�do�not�correspond�to,*£values�that�describe�the�media.�The�values,*£that�correspond�to�the�zeroed�bits�will�be *£unchanged.ŠPAGE<ŠMOVE.L�A3,IOSDBP(A0)ŠIssue�a�configure�or�configure�defaultAŠMOVE.W�#IOPCONLY,IOSOPT(A0)�requestusing�the�configuration�block1ŠTRAPƒ#2“pointed�to�by�A3.�If�a�configure�request+*¥is�performed,�the�options�are�set�so�that&*¥neither�a�mount�nor�dismount�occurs.ŠSPC„2ŠBEQ.S‚CONF020ŠCMP.B‚#ISTADNM,D0ŠBNE.S‚CONF020 ŠCLR.B‚D0ŠSPC„2 CONF020ƒRTS8ŠTTL�Vdos�Mount�Utility�V�4.01�(User�Assisted�Configure)ŠPAGEM******************************************************************************%*“User�Assisted�Configuration�Routine%*“----�---! -----�-------------�-------*H*ƒThis�routine�is�called�when�a�VERSAdos�disk�is�to�be�mounted�that�doesN* not contain a configuration area and has a IPC disk type code of zero in theN* VID. If the disk to be mounted is a floppy, the user is asked if the disk isM* an IPC format single or double sided disk. If the user responds with an 'S'L* for single sided or with a 'D' for double sided, the appropriate disk typeI* code is written in the VID and control is transfered to the routine forM* mounting an IPC type disk. If the responds with a CR only or if the disk toI* be mounted is not a floppy, the user is prompted for configuration data=* by the same routine that is called to handle foreign disks.*M***************************************************************************** BNOCNFG„CMP.B‚#XDSFDK,IOSDTP(A1)ƒIf�the�disk�to�be�mounted�is�not�a6ŠBNE.S‚MNTFORNŒfloppy,�don't�ask�if�it�is�an�IPC�disk.ŠSPC„2GNOCNFG10‚LEA.L‚QIPCFPY(PC),A5‡Ask�the�user�if�the�disk�to�be�mounted�is;ŠLEA.L‚QIPCFPYE(PC),A6„an�IPC�format�single�or�double�sidedŠBSR.L‚OUTWINPŒfloppy.ŠSPC„29ŠCMP.B‚#CR,(A5)�If�the�response�is�a�CR�only,�treat�it�asŠBEQ.S‚MNTFORNŒan�'N'�response.ŠSPC„28ŠCMP.B‚#CR,1(A5)ŒIf�the�second�character�of�the�response5ŠBNE„NOCNFG10‹is�not�a�CR,�the�response�is�invalid�so*£re-ask�the�question.ŠSPC„22ŠCMP.B‚#'N',(A5)ŒIf�the�response�is�a�'N',�request9ŠBEQ.S‚MNTFORNŒconfiguration�information�from�the�user�as*£is�done�for�foreign�disks.ŠSPC„2>ŠMOVE.B�#SSFPY,VIDIPC(A2)„If�the�response�is�an�'S'�for�single9ŠCMP.B‚#'S',(A5)Šsided,�set�the�IPC�disk�type�code�in�the:ŠBEQ.S‚NOCNFG20‹VID�and�prepare�to�return�to�the�automatic*£mount�sequence.ŠSPC„2BŠMOVE.B�#DSFPY,VIDIPC(A2)„If�the�response�is�'D'�for�double�sided,5ŠCMP.B‚#'D',(A5)Šset�the�IPC�disk�code�in�the�VID�and7ŠBNE„NOCNFG10‹prepare�to�return.�If�the�response�is�not(*£'S',�'D',�'N',�or�CR,�it�is�invalid�so*£re-ask�the�question.ŠPAGECNOCNFG20‚LEA.L‚IPCFLG(PC),A5ˆSet�the�IPC�type�disk�flag�so�that�the2ŠST…(A5)�IPC�disk�type�code�will�be�written�to�the8ŠBRA„MNTIPCDŒVID�before�the�utility�terminates.�Transfer,*£control�to�the�automatic�mount�routine�for *£IPC�disks.3ŠTTL�Vdos�Mount�Utility�V�4.01�(Mount�Foreign�Disk)ŠPAGE M*******************************************************************************—Mount�Foreign�Disk�Routine*—-----�-------�----�-------*H*ƒThis�routine�requests�configuration�information�from�the�user�when�theB* disk to be mounted is foreign or is a VERSAdos disk for which noM* configuration information is available. The modify configuration subroutineN* is called to permit the user to make changes in the media related attributesL* and parameters that are supported by the driver. The current configurationL* values are used for any attributes or parameters that the user chooses not * to change.J*ƒAfter�the�user�has�made�any�desired�changes�to�the�configuration�data,�aJ* configure request is made to the driver. If the driver returns an error,N* an error message is issued and the modify configuration subroutine is calledM* again. If the configure request is successful, the validation subroutine isI* called to attempt to read the last sector. If the subroutine returns anO* error, the configuration is assumed to be faulty and the modify configuration* subroutine is called again.G*ƒIf�configuration�has�been�verified,�control�is�transfered�back�to�the* automatic mount sequence.*N****************************************************************************** FMNTFORNƒMOVE.L�IOSATM(A1),D1ˆCall�the�display�configuration�subroutine0ŠBSR.L‚DSPCNFGŒto�show�the�current�values�of�all$*£attributes�and�parameters�that�are*£supported�by�the�driver.ŠSPC„2=ŠLEA.L‚MSGNCFG(PC),A5‡Send�a�message�to�the�log�output�device:ŠLEA.L‚MSGNCFGE(PC),A6„that�there�is�no�configuration�data3ŠBSR.L‚MSGOUT�available�for�the�disk�to�be�mounted.ŠSPC„2AMNTF10„MOVE.L�#MSKDRIV,D1ŠLoad�a�value�that�is�to�be�ANDed�to�the,*£attribut" es�and�parameters�masks�to�prevent(*£drive�related�configuration�data�to�be*£viewed�or�changed.ŠSPC„2?ŠCMP.B‚#XDSRDK,IOSDTP(A1)ƒIf�the�device�being�mounted�is�a�hard3ŠBNE.S‚MNTF15�disk�the�configuration�attributes�for=ŠAND.W‚#-MSKUNATM,D1†track�and�data�density,�format�type,�and**£number�of�sides�do�not�apply.�These�bits(*£are�masked�so�that�this�data�cannot�be*£viewed�or�changed.ŠSPC„2?MNTF15„AND.L‚IOSATM(A1),D1ˆMask�out�the�bits�for�attributes�and7ŠBSR.L‚MODCNFGŒparameters�that�are�not�supported�by�the'*£driver�of�the�device.�Call�the�change)*£configuration�routine�to�allow�the�user *£to�modify�the�applicable�data.ŠPAGE4ŠMOVE.L�A1,A3�Attempt�to�configure�the�device�as�the.ŠBSR„CONFIG�user�specified.�Set�A3�so�that�the7ŠBEQ.S‚MNTF20�configure�subroutine�will�use�the�current'*£configuration�parameter�block.�If�the+*£configuration�is�rejected,�issue�an�error *£message.ŠSPC„26ŠBSR.S‚CONFGERR�Issue�a�configuration�error�message�to1ŠBRA„MNTF10�the�log�output�device�and�solicit�new**£configuration�information�from�the�user.ŠSPC„26MNTF20„BSR.S‚CNFGCHKŽValidate�the�new�configuration�by7ŠBEQ„MNTCFGOK‹attempting�to�read�the�last�sector�of�the,*£disk.�If�no�error�is�returned�on�the�read,(*£return�to�the�automatic�mount�sequence'*£following�configuration�verification.ŠSPC„26ŠBSR.L‚EMHOUT�Call�the�error�message�handler�to�inform**£the�user�of�the�error�that�resulted�from*£the�configuration�attemptŠSPC„2>ŠLEA.L‚MSGBCFG(PC),A5‡The�last�sector�of�the�disk�could�not�beAŠLEA.L‚MSGBCFGE(PC),A6„read�so�the�configuration�is�assumed�to�be/ŠBSR.L‚MSGOUT�faulty�so�issue�an�error�message.ŠSPC„2@ŠMOVE.L�#IOSRSZB<<1,D1‡Display�the�number�of�sectors�returned�by7ŠBSR.L‚DSPCNFGŒthe�configure�request�to�give�the�user�a5ŠBRA„MNTF10�possible�clue�as�to�why�the�configuration+*£check�failed,�and�loop�back�to�obtain�new*£configuration�data.0ŠTTL�Vdos�Mount�Utility�V�4.01�(Configure�Drive)ŠPAGEN********************************************************************************”Configure�Drive�Routine*F*ƒThis�routine�is�called�when�the�user�specifies�the�'D'�option�on�theL* invoking command line. This user zero restricted option, allows any of theG* configuration attributes or parameters to be changed by the user. TheL* configuration modification subroutine is called to allow the user to setupL* the desired configuration. The basic for the changes is always the defaultN* configuration but since this routine is called only for a dismounted device,;* the default and current configurations will be identical.*K*ƒAfter�the�user�has�made�the�desired�changes�to�the�configuration�data,�anL* attempt is made to update both the current and default configurations withN* this data. If an error is returned on either configuration attempt, an errorO* message is issued and new data is solicited from the user. When both requests1* are sucessful, the utility terminates normally.*@*‰Entry�conditions�:�A1�=�Address�of�a�configure�data�block�that%* contains�the�current�configuration.7*‰Exit�conditions‚:�The�routine�terminates�the�utility.*N****************************************************************************** DCONFGDRV‚LEA.L‚SCTREGS(PC),A2‡Obtain�the�logon�user�number�passed�by?ŠMOVE.L�10*4(A2),D1ˆSCT�in�A2�at�the�start�of�execution.�If�the6ŠBEQ.S‚CFGD010Œuser�number�is�not�zero,�issue�an�error *£message.ŠSPC„2<ŠLEA.L‚MSGZERO(PC),A5‡Issue�the�error�message�for�a�non-zero=ŠLEA.L‚MSGZEROE(PC),A6„user�number�and�terminate�the�utility. ŠBRA„MSGEXITŠSPC„24CFGD010ƒMOVE.L�A1,A3�Move�the�address�of�the�current<ŠMOVE.L�IOSATM(A3),D1†configuration�block�to�A3�and�the�mask(*£of�supported�parameters�to�D1�to�setup,*£for�the�call�to�the�configure�modification *£subroutine.ŠSPC„28ŠBSR.L‚DSPCNFGŽCall�the�configuration�display�subroutine**£to�show�the�current�values�of�attributes**£and�parameters�that�are�supported�by�the *£driver.ŠSPC„2CŠAND.W‚#-(1<" CFGDERRƒBSR.S‚CONFGERR�Call�the�configuration�error�subroutine3ŠBRA.S‚CFGD020Œto�issue�an�error�message�to�the�log-*£output�device�and�solicit�new�configuration*£data�from�the�user.?ŠTTL�Vdos�Mount�Utility�V�4.01�(Configure�Error�Message�Output)ŠPAGEN*******************************************************************************/*�Configuration�Error�Message�Output�Subroutine*F*ƒThis�subroutine�sends�an�error�message�to�the�log�output�device�thatH* the configuration error code returned in the configure data block. TheL* Error Message Handler is not used for this error because it currently doesA* not provide a way to display the configuration error code data.*C*‰Entry�conditions�:�A3�=ƒAddress�of�the�configure�data�block�which*¡returned�the�error./*‰Exit�conditions‚:‚All�registers�are�preserved*M***************************************************************************** HCONFGERR‚MOVEM.L�D0/A0/A5-A6,-(A7)ƒSave�all�registers�used�on�the�stack.ŠSPC„2:ŠLEA.L‚MSGCERR(PC),A5‡Load�the�configuration�error�message*£start�address.ŠSPC„2=ŠLEA.L‚MSGCEC(PC),A0ˆLoad�the�address�of�the�field�to�contain3ŠCLR.W‚D0‘the�configuation�error�code�on�ASII.�Call=ŠMOVE.B�IOSCEC(A3),D0†system�subroutine�BHWCVT�to�convert�the4ŠBSR„BHWCVT�value�to�ASCII�hexadecimal�and�store�the*£result�in�the�buffer.ŠSPC„2:ŠLEA.L‚-1(A0),A6ŒLoad�the�end�address�of�the�error�message4ŠBSR.L‚MSGOUT�and�send�the�message�to�the�log�output *£device.ŠSPC„2?ŠMOVEM.L�(A7)+,D0/A0/A5-A6ƒRestore�the�saved�resisters�from�the-ŠRTS—stack�and�return�to�the�calling�routine.*‰INCLUDE�DSKCFGCD.AIŠINCLUDE�DSKCFGCD.AI7ŠTTL�Vdos�Mount�Utility�V�4.01�(Symbol�Cross-Reference) ŠEND„MOUNT ééé=/*=/*†NOVALID.AF=/**=/* Chain file to assemble NOVALID utility=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to NOVALID.LS=/*=/IFC \1ƒ=ARG�NOVALID.LS=/ENDIF=/*#=ASM NOVALID.SA,NOVALID.RO,\1;RZ=83=/*{ Included files are:=/*ƒ9995.&.USM.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.EXE.EQ=/*}=/*=ENDé# éééééU=/*=/*†NOVALID.LF=/*(=/* Link chain file to create NOVALID.LO=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to NOVALID.LL=/*=/IFC \1ƒ=ARG�NOVALID.LL=/ENDIF=/*=LINK ,NOVALID.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000INPUT NOVALID.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé^MNOVALID‚IDNT�4,0‚8211031200�INVALIDATE�USER�(REMOVE�ENTRY�FROM�PASSWORD�FILE) O*********************************************************************************ˆNOVALIDATE�USER�UTILITY*<*ˆDELETES�(INVALIDATES)�ENTRIES�FOR�USER�NUMBER(S)�S# PECIFIED*ˆIN�THE�PASSWORD�FILE.**>‡HBR8O*******************************************************************************‰PAGE‰NOLIST‰INCLUDE�9995.&.USM.EQ‰INCLUDE�9995.&.TR1.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.EXE.EQ‰LIST ‰SECTION�0 ‰XDEF�NVALID‰XREF�ASCVAL,CLASCODE PBA†EQU‡*‰DC.B�'122084�4'‰DS.B�32�STACK STACK„EQU�*CMDBUFƒCOMLINE�32"ASSIPAR‚DC.W�FHASGN,FOPPW+FOPISK,1PASSNAME DC.L PWVOL ‰DC.W�PWUSR!‰DC.L�PWCAT1,PWCAT2,PWFIL1,PWFIL2)‰DC.W�PWEXT,0,PWPROT,PWRECL,PWKSIZ,PWFBLK-DELETPAR DC.W IODELR,IOPBIN+IOPIMG+IOPRRN,1,0 O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>12/17/84>>*!*ˆDC.L�0,CMDBUF,CMDBUF+PWRECL-1,0 ‰DC.L�0,0,0,0*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<12/17/84<< ERRORPAR DC.L 0,0,$60005 O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>12/17/84>>**ERRPARAM DC.L 2,ERRORPARERRPARAM DC.L 2,0*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<12/17/84<< ‰PAGE*** NVALID EQU *‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESS‰LEA‡CMDBUF-PBA(A6),A7"‰MOVE.L„A7,DELETPAR-PBA+IOSSAD(A6))*œESTABLISH�PARAMETER�BLOCK�START�ADDRESS‰LEA‡CMDBUF-PBA+PWRECL-1(A6),A7"‰MOVE.L„A7,DELETPAR-PBA+IOSEAD(A6)'*œESTABLISH�PARAMETER�BLOCK�END�ADDRESS‰LEA‡ERRORPAR-PBA(A6),A7‰MOVE.L„A7,ERRPARAM-PBA+4(A6)'*œESTABLISH�EMH�PARAMETER�BLOCK�ADDRESS. LEA STACK-PBA(A6),A7 INITIALIZE STACK POINTER CMP.L #0,A2 CHECK USER NUMBER BEQ.S NVALID0 BRANCH USER =0+ MOVE.L #EM_PRIV,D0 PRIVILEGE ERROR MESSAGE BRA ERROROUT ERROR EXIT NVALID0 EQU *8 LEA CMDBUF-PBA(A6),A0 SET POINTER TO INPUT COMMAND LINE MOVE.L A0,A3 ALSO SAVE ITgIpHx 0 LEA CLASCODE(PC),A4 CHARACTER NVALIDATION TABLE/ BSR.S BOUNDARY GET LOWER (OR ONLY) USER NUMBER MOVE.L D3,D4 SAVE LOWER BNE.S NVALID2 NOT USER = 0% MOVE.L #EM_NUSER,D0 INVALID USER NO. BRA ERROROUT ERROR EXIT NVALID2 EQU * CMP.B #$D,D1 END OF LINE?- BEQ.S NVALID10 YES LOWER IS ONLY USER NUMBER. BSR.S BOUNDARY GET UPPER BOUNDARY USER NUMBER NVALID5 EQU *% CMP.L D4,D3 CHECK UPPER IS NOT LOWER BCC.S NVALID10 OK+ MOVE.L #EM_RVRSE,D0 SEQUENCE ERROR MESSAGE BRA.S ERROROUT ERROR EXITNVALID10 EQU *. LEA ASSIPAR-PBA(A6),A0 ASSIGN PARAMETER BLOCK TRAP #3& BEQ.S NVALID20 BRANCH ASSIGNMENT GOOD8 CMP.B #FSTAAP,D0 FILE IN USE (ACCESS PERMISSION ERROR)? BNE.S ERROROUT ERROR EXIT MOVE.L #DELAY,D0 DELAY COMMAND MOVE.L #167,A0 167 MILLISECONDS TRAP #1 BRA NVALID10 TRY AGAINNVALID20 EQU *, MOVE.L A3,A0 REFETCH COMMAND BUFFER ADDRESSNVALID22 EQU *‰LEA‡CMDBUF-PBA+PWRECL(A6),A5 CMP.L A5,A0 DONE? BEQ.S NVALID25 YES CLR.B (A0)+ " BRA NVALID22 CONTINUENVALID25 EQU *! MOVE.L D4,(A3) USER NUMBER (KEY)NVALID30 EQU *A LEA DELETPAR-PBA(A6),A0 WRITE NEW RECORD PARAMETER BLOCK ADDRESS TRAP #2 BEQ.S NVALID40 BRANCH GOOD& CMP.B #ISTARN,D0 CHECK DOES NOT EXIST" BEQ.S NVALID40 OK, DOES NOT EXIST BRA.S ERROROUT ERROR EXITNVALID40 EQU *% ADD.L #1,D4 INCREMENT LOWER BOUNDARY CMP.L D4,D3 TEST DONE BCC NVALID25 BRANCH MORE CLR.L D0 RESET UPPER HALF" MOVE.L #0,A0 CLEAR ABORT REGISTERNVALIDBYE EQU *" MOVE.W #TERM,D0 TERMINATE COMMAND TRAP #1 DONE!!!**ˆ**�BOUNDARY�SUBROUTINE*BOUNDARY EQU *0 BSR ASCVAL CONVERT ASCII STRING TO BINARY VALUE TST.B D2 FIELD TERMINATOR? BMI.S BOUNDVAL OK, GO TEST SIZE CMP.B #'-',D1 DASH SEPARATOR? BEQ.S BOUNDVAL OK, GO TEST SIZE, MOVE.L #EM_NOCVT,D0 NUMBER CONVERSION ERROR BRA.S BOUNDERR ERROR EXITBOUNDVAL EQU * CMP.L #9999,D3 TEST SIZE BLS.S BOUNDARZ BRANCH OK' MOVE.L #EM_VSIZE,D0 SIZE ERROR MESSAGEBOUNDERR EQU * ADD.L #4,A7 POP RETURN BRA.S ERROROUT ERROR EXITBOUNDARZ EQU * RTS*$ ERROROUT EQU *7�MOVEM.L�D0/A0,ERRORPAR-PBA(A6)ŒSAVE�MESSAGE�PARAMETERSD MOVEM.L ERRPARAM-PBA(A6),D0/A0 SET UP CALL TO ERROR MESSAGE HANDLER TRAP #4 OUTPUT MESSAGE? MOVE.L ERRORPAR-PBA(A6),A0 ERROR CODE IN DO BECOMES ABORT CODE& MOVE.L ERRORPAR-PBA(A6),D0 ERROR CODE/ BSET #14,D0 DIAGNOSTIC BIT TO ABORT CHAIN MODE) SWAP D0 POSITION FOR DIAGNOSTIC REGISTER BRA NVALIDBYE TERMINATE* END NVALIDéééééé=/* =/*†PATCH.AF=/*(=/* Chain file to assemble PATCH utility=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to PATCH.LS=/*=/IFC \1ƒ=ARG�PATCH.LS=/ENDIF=/*&=ASM PATCH.SA,PATCH.RO,TEMP1.LS;RZ=100=/*{ Included files are:=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Y=/*5=ASM‚PATCH.CODE68M.SA,PATCH.CODE68M.RO,TEMP1.LS;RZ=86=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*/=ASM‚PATCH.MBSR.SA,PATCH.MBSR.RO,TEMP1.LS;RZ=86=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*7=ASM PATCH.DCODE68M.SA,PATCH.DCODE68M.RO,TEMP1.LS;RZ=86=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Aƒ=COPY�TEMP2.LS,\1;Yƒ=DEL�TEMP1.LS;Yƒ=DEL�TEMP2.LS;Y=/*=ENDéééé$ €.=/* =/*†PATCH.LF=/*&=/* Link chain file to create PATCH.LO=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to PATCH.LL=/*=/IFC \1ƒ=ARG�PATCH.LL=/ENDIF=/*=LINK ,PATCH.LO,\1;AHMIX ATTRIBUTES PSEG SEG0:0-15 $0INPUT PATCH.ROIN„PATCH.CODE68M.ROIN„PATCH.MBSR.ROINPUT PATCH.DCODE68M.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééé鉊PAGEPATCH…IDNTƒ100,4B******************************************************************%*�**********�PATCH�UTILITY�***********.*ƒORIGINAL�REV.�1.03�07JAN81�(TB59)�STEVE�BALL*+*ƒPURPOSE:‚ALLOW�ONE�TO�PATCH�A�LOAD�MODULE*=*ƒOPTIONS:‚P�-�DEFINES�PROCESSOR�TYPE�FOR�THE�LOAD�MODULE‰1,4,*‘BEING�MODIFIED.‚DEFAULTS�TO�THE�68000.Œ1,4*B*******************************************************************‰PAGE***ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**‰NOLIST‰INCLUDE�9995.&.FME.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**‰PAGE****ˆPATCH‚MODIFICATION�HISTORY**ˆREVISION�CODE‡011685�47*’Module�DCODE68M�changed�to�output�the�displacement�of#*’the�MOVEP�instruction�in�decimal.**ˆREVISION�CODE‡122084�4"*’FORCE�POSITION�INDEPENDENT�CODE.**ˆREVISION�CODE‡111284�46*’UPGRADE�1-LINE�ASSEMBLER/DISASSEMBLER�TO�HANDLE�LOAD2*’MODULES�FOR�THE�68010�PROCESSOR.‚THIS�ALSO�FIXES4*’THE�BUS�ERROR�WHICH�OCCURED�WHEN�A�LINE�FEED�ALONE8*’WAS�ENTERED�AS�INPUT�WHEN�IN�THE�;DI�MODE�(SPR�#1070).**ˆREVISION�CODE‡021982�35*’MODIFY�1-LINE�DISASSEMBLER�TO�CORRECTLY�DISASSEMBLE*’MOVEM�AND�SUB�INSTRUCTIONS.***ˆREVISION�CODE‡121881�37*’MODIFY�ERROR�MESSAGE�HANDLER�LOGIC�TO�TERMINATE�CHAIN5*’FILE�IMMEDIATELY�UPON�ERROR.‚ADDED�'INVALID�OPTION'4*’ERROR�MESSAGE.‚CHANGE�INPUT�FILE�CHECKS�TO�NOT�(!)6*’REQUIRE�EXTENSION�OF�.LO�OR�.SY,�AND�TO�REQUIRE�FILE5*’TYPE�TO�BE�C% ONTIGUOUS.‚REPLACES�THE�ARROW�CHARACTER4*’($0C)�WITH�A�SPACE�ON�ASSEMBLY�LANGUAGE�LINES.‚BUG$*’FIXES�IN�ASSEMBLER�&�DISASSEMBLER.**ˆREVISION�CODE‡102881�35*’CONTAINS�ASSEMBLY/DISASSEMBLY�OPTION�FOR�M�COMMAND.4*’COMMENT�LINE�IN�M�MODE�NO�LONGER�ADVANCES�POINTER.**ˆREVISION�CODE‡091081�3 *’CONTAINS�ERROR�MESSAGE�HANDLER$*’CONTAINS�POSITION�INDEPENDENT�CODE-*’CONTAINS�CURRENT�REVISION�CODE�MODIFICATION5*’CONTAINS�TERMINATION�LOGIC�FOR�USE�WITH�CHAIN�FILES ’J›F£V«t³E»IÃHË>ÓCÛBãRë@óEû;5 ;9J#W+<3S;bC'1*’CONTAINS�COMMON�SUBROUTINES�PULLED�FROM�LIBRARY*’USES�THE�'SBARG'�ROUTINE3*’CONTAINS�THE�ADDED�CHARACTER�SPACE�FOR�'SBARG'�TO*œPLACE�A�'CR'6*’WILL�ACCEPT�HEX�INPUT�WITH�OR�WITHOUT�THE�PRECEEDING(*œ$�WHICH�NORMALLY�ACCOMPANIES�HEX�INPUT5*’IF�AN�OFFSET�HAS�BEEN�IDENTIFIED�THEN�ALL�ADDRESSES**œEXAMINED�IN�THE�DISPLAY/CHANGE�MODE�WILL,*œSHOW�BOTH�THE�REQUESTED�AND�OFFSET�ADDRESS7*’THE�'HELP'�REQUEST�WILL�SHOW�THOSE�COMMANDS‚AVAILABLE*œFOR�THE�PATCH�UTILITY**‰PAGE6ŠXREFƒEDITFILE,OPTION,PARSE,SBARG,DCODE68M,CODE68Mˆ1,4* ŠSECTIONƒ0* PBA†EQU‡* REV_CODE:‰DC.B†'011685�4'¨1,4&*œWHERE�REV_CODE�IS�DEFINED�AS�FOLLOWS *œMMDDYYXZ*3*œMMDDYY�=�MONTH�DAY�YEAR�OF�LAST�ASSEMBLY�OR�PATCH*œX†=�REVISION�TYPE�CODE*¦SPACE�=�CLEAN�ASSEMBLY *¦P…=�PATCHED*¦C…=�CUSTOMIZED�PATCHED**#*œZ†=�VERSADOS�MAJOR�REVISION�FIELD*ŠDS.Wƒ100‹STACK�AREA STACK…EQU…**,INITDREG‚EQU…*ŒD-REGS�SAVED�ON�INITIAL�ENTRY+STSKNAMƒDS.L„1ŒD0=TASK�NAME�THAT�STARTED�ME/SESNUM„DS.L„1ŒD1=SESSION�NUMBER�THAT�STARTED�ME$VOLNAM„DS.L„1ŒD2=DEFAULT�VOLUME�NAME%USERNUMƒDS.L„1ŒD3=DEFAULT�USER�NUMBER'CATNAM„DS.L„1ŒD4=DEFAULT�CATALOGUE�NAME-ŠDS.L„1ŒD5=2ND�HALF�OF�DEFAULT�CATALOGUE�NAME*CCOUNT„DS.L„1ŒD6=#OF�CHARS�IN�COMMAND�LINE#LOGUNTSƒDS.L„1ŒD7=LOGICAL�UNIT�MASK**CLINE…COMLINE�$A0ŠCOMMAND�LINE*(INPLUN„EQU…1ŒASSOCIATED�WITH�INPUT�FIELD,SEGSRT„EQU…56‹OFFSET�TO�SEGMENT�START�DESCR."SEGLGH„EQU…60‹OFFSET�TO�SEG�LENGTHCR‡EQU‡$0D‡CARRIAGE�RETURNLF‡EQU‡$0A‡LINE�FEEDSPACE„EQU.B…'�'‡SPACE&ARROWCHR�EQU‡$0C‡RIGHT�ARROW�CHARACTER**&TERMCHRƒDC.B„'Q'ŠTERMINATION�CHARACTERBASM_MNEM‚DC.B„0ŠFLAG�INDICATING�WHETHER�ASSEMBLY/DIS�WAS�REQUESTED**‰DS.W…00DECNUM„DC.L„-1‹BINARY�NUMBER�INPUT�FROM�OPERATORSAVDEC„DS.L„1ŒSAVE�FOR�DECNUM&MODEC…DC.L„$F‹MODE�(0=�IN�CHANGE�MODE).INCNUM„DC.L„0ŒINCREMENT�FOR�UP�OR�DOWN�DISPLAY'PARSAREG‚EQU…*ŒSAVE�REGS�FROM�PARSE–1,45OPTPSRTƒDS.L„1ŒA1=OUTPUT�FIELD�ADDRESS�FROM�PARSEˆ1,45OPTSRT„DS.L„1ŒA2=OPTIONS�FIELD�ADDRESS�FROM�PARSE‡1,4"EDITRTNƒDS.L„1ŒSAVE�REGS�FROM�EDIT(GETIDXIX‚DS.L„1ŒINDEX�INTO‚CHANGE�BUFFER/GETIDXNM‚DS.L„1ŒVALUE�TO�PUT�INTO�CHANGE�BUFFER&RSECT…DS.L„1ŒFOR�GETIDX�SECTOR�POINTER7CHGED…DC.L„$F‹CHANGED�BUFFER�FLAG�(NONZERO=NOT�CHANGED)-BCKSM…DC.W„0ŒCHECKSUM�ACCUMULATOR�BEFORE�VALS,ACKSM…DC.W„0ŒCHECKSUM�ACCULULATOR�AFTER�VALS4QFIRST„DS.L„1ŒFIRST�PASS�FLAG�FOR�STRING�CONVERSIONS2QSAVA0„DS.L„2ŒSAVE�FOR�A0-A1�ON�STRING�CONVERSIONS7STGCHR„DS.W„1ŒSAVE�FOR�CHARACTER�ON�NUMERIC�STRING�CONV1OFFSET„DC.L„0ŒHOLDS�CURRENT�OFFSET�(ADDRESS�BIAS)BPTYPE…DC.L„$68000‡HOLDS�CURRENT�PROCESSOR�TYPE�(DEFAULT=68000)�1,42PCODE…DC.L„0ŒHOLDS�CURRENT�PROCESSOR�TYPE�CODEŒ1,4*ž0�=�68000¤1,4*ž4�=�68008¤1,4*ž8�=�68010¤1,42*žC�=�68020�(FUTURE�NOT�IMPLEMENTED�YET!!!!!!)�1,4 MSG_ADDR:‰DC.L†0-*œSTART�ADDR�OF�MSG�CONTAINING�USER�SPECIFIED*œCHANGE�REQUEST*‰DS.W†0** PARAMETER TABLES*4* ASSIGN INPUT LU TO DEVICE SPECIFIED ON INPUT FIELD*ŠFHS.INP�FHASGN,FOPEREW,INPLUN** OUTPUT MESSAGE*ŠIOS.MSGŽIOWRIT,IOPIMG,LDFLUN** INPUT MESSAGE* ŠIOS.MSGI�IOREAD,,CDFLUN,,,0,0,0** DISK INPUT/OUTPUT*OPT‡EQU…IOPIMG+IOPBLK+IOPRAN OUTIOS„EQU…* �IOS.INPƒ0,OPT,INPLUN,0,,0,0,2566INSEC„EQU‡INPIOS+IOSRRN‡SECTOR�THAT'S�IN�CHANGE�BUFFER*‰PAGE*% * * BUFFERS*‰DSˆ07OPIN_ASM�DC.B†'‚'†SPACES�REQUIRED�BY�ONE-LINE�ASSEMBLER OPIN†EQU…*(OPINS…DS.B„100ŠOPERATOR�KEY�INPUT�BUFFEROPIN_SIZ�EQU‡*-OPIN OPINE…EQU…*-1"‰DS.W†2‰REQUIRED�FOR�SBARG�ROUTINE**2DUMMY…DS.B„80‰DUMMY�BUFFER�FOR�ONE-LINE�ASSEMBLER.**CSECT…EQU…*ŒFOR�CONTROL�SECTOR ŠDS.B„256CSECTEƒEQU‡*-1/MEMIMGDƒEQU…CSECT+176„START�OF�MEM�IMAGE�DESCR.* CHGBUF„EQU…*ŠDS.B„256ŠHOLDS�CHANGE�BUFFER*‰DS.W…02CODE_BUF�DS.B…10‰HOLDS�ASSEMBLER/DISASSEMBLER�DATA‰PAGE** * MESSAGES*‰DSˆ0;OVMSGSƒDC.B†'WORK�BUFFER�OVERFLOW--TOO�MANY�OFFSETS?',CR,LFOVMSGEƒEQU‡*-1*‰DSˆ08ODDADDRS�DC.B†'INSTRUCTION�ADDRESSES�MUST�BE�EVEN',CR,LFODDADDRE�EQU‡*-1*‰DSˆ04SYNTMSGS�DC.B†'ASSEMBLY�LANGUAGE�SYNTAX�ERROR',CR,LFSYNTMSGE�EQU‡*-1 ŠDS†0*5DVASGMSƒDC.B„'INPUT�FILE�MUST�BE�A�LOAD�MODULE',CR,LFDVASGMEƒEQU…*-1ŠDS†0*NOADDRSƒDC.B„'INVALID�ADDRESS' ŠDC.B„$0D ŠDC.B„$0ANOADDREƒEQU…*-1ŠDS†0*"QUOTERRS‚DC.B„'QUOTE�STRING�ERROR' ŠDC.B„$0D ŠDC.B„$0AQUOTERRE‚EQU…*-1ŠDS†0*OFSMS…DC.B„'OFFSET�=‚'ODSPM…DC.B„'ˆ' ŠDC.W„$0D0A OFSME…EQU…*-1ŠDS†0**OFFSEGS‚DC.B†'END�OF�MEMORY�IMAGE�REACHED' ‰DC.B†$0D ‰DC.B†$0AOFFSEGE‚EQU‡*-1ŠDS†0*CKSMS…DC.B„'CHECKSUM�=‚' CKSMV…DC.B„'ˆ'ƒHOLDS�ASCII�VALUE ŠDC.B„$0D ŠDC.B„$0A CKSME…EQU…*-1ŠDS†0*"PROCMSGS‚DC.B„'PROCESSOR�=�'¥<�1.4 PROCV…DS.B„8 ŠDC.W„$0D0APROCMSGE‚EQU…*-1ŠDS†0*OFSTS…DC.B„'OFFSET„=�' OFSTV…DS.B„8 ŠDC.W„$0D0A OFSTE…EQU…*-1ŠDS†0*HEADINGƒDC.B„'PATCH�VERSIONƒ'VERSIONƒDS.B„8 ŠDC.W„$0D0AHEADINGE‚EQU…*-1ŠDS†0*(OPERMSGS‚DC.B„'INVALID�OPTION�SPECIFIED' ŠDC.W„$0D0AOPERMSGE‚EQU…*-1 ŠDS†0²1.4�>*PROMPTCƒDC.B„'>�'PROMPTCE‚EQU…*-1*‰DSˆ0A_PRMPT‚DC.B†'¨>'A_PRMPTE�EQU‡*-1*‰DSˆ0 CHGAOUTS:‰DS.L†2(*œMODIFICATION�ADDRESS�PLUS�OFFSET�VALUE ‰DC.B†'‚')ADRAOUTƒDS.L„2ŒHOLDS�MODIFICATION�ADDRESS ŠDC.B„'‚'VALAOUTƒDS.W„1ŒHOLDS�VALUE ŠDC.B„'‚' ŠDC.B„'�' ŠDC.B„''''QAOUT…DS.B„1ŒHOLDS�ASCII�VALUE ŠDC.B„'''' ŠDC.B„'ƒ'CHGAOUTE‚EQU…*-1ŠDS†0X00100: ‰DC.B†CR,LF‰DC.B†'PATCH�REVISION�CODE�'X00110: ‰DC.B†'ˆ' ‰DC.B†CR,LF‰DC.B†'PATCH�COMMANDS'‰DC.B†CR,LF,LF'‰DC.B†'M�(or�MM)�=�DISPLAY/CHANGE�MODE' ‰DC.B†CR,LF‰DC.B†'ƒM�' ‰DC.B†CR,LF‰DC.B†'†MODE�1ƒ' ‰DC.B†CR,LF‰DC.B†'†MODE�2ƒ<^>' ‰DC.B†CR,LF)‰DC.B†'†MODE�3ƒ<',$27,'c...c',$27,'>' ‰DC.B†CR,LF,‰DC.B†'†MODE�4ƒ<',$27,'c...c',$27,'><^>' ‰DC.B†CR,LF‰DC.B†'†MODE�5ƒ' ‰DC.B†CR,LF‰DC.B†'†MODE�6ƒ.'‰DC.B†CR,LF,LF‰DC.B†'ƒM�;DI' ‰DC.B†CR,LF3‰DC.B†'†MODE�1ƒ' ‰DC.B†CR,LF‰DC.B†'†MODE�2ƒ' ‰DC.B†CR,LF‰DC.B†'†MODE�3ƒ.'‰DC.B†CR,LF,LF‰DC.B†'O�=�OFFSET' ‰DC.B†CR,LF‰DC.B†'ƒO�'‰DC.B†CR,LF,LF‰DC.B†'QUIT�OR�Q'‰DC.B†CR,LF,LF X00198ƒEQU‡*-X00100‚MESSAGE�SIZEX00199ƒEQU‡*-1‡END�MESSAGE�ADDR‰PAGEJ***************************************************************************'*�ERROR�MESSAGE�HANDLER�PARAMETER�BLOCK0*‹PRESET�FOR�INPUT�FROM�CDFLUN,�OUTPUT�TO�LDFLUN*J************************************************************************** ‰DSƒ0EM_PBLK: BEM_D0„DC.L‚0‡D0�-�IOS/FHS�RETURN�ERROR�STATUS‚(ERROR�MSG�KEYVALUE)=EM_A0„DC.L‚0‡A0�-�ADDR�OF�I/O�PARAMETER�BLOCK‚(IF�APPLICABLE)EM_OPTƒDC.B‚0‡OPTIONS�FLAG*­BIT‡MEANING�IF�SET*®0ˆQUERY�RESPONSE�DESIRED!EM_TLUN‚DC.B‚LDFLUN‚LU�FOR�OUTPUT$EM_QRCƒDC.B‚0‡QUERY�RETURN�CHARACTER EM_KLUN‚DC.B‚CDFLUN‚LU�FOR�INPUT3EM_SPAƒDC.L‚0‡START�ADDRESS�FOR�USER�TEXT�PLUG�POOL1EM_EPAƒDC.L‚0‡ENDƒADDRESS�FOR�USER�TEXT�PLUG�POOLŠPAGEB******************************************************************* PATCH CODE AREAB******************************************************************** PATCH…EQU…*‰LEA‡PBA(PC),A7*œA7=PROGRAM�BASE�ADDRESS9‰MOVEM.LƒD0-D7,INITDREG-PBA(A7)‚SAVE�DATA�PASSED�BY�&SCT. ‰MOVE.L„A7,A6*œA6=PROGRAM�BASE�ADDRESS+*ŸTHIS�REGIS& TER�WILL�BE�USED�AS�THE�PROGRAM**ŸBASE�ADDRESS�FOR�THIS�PROGRAM�EXCEPT�FOR+*ŸA�COUPLE�OF�INSTANCES�WHEN�A6�IS�USED�FOR*ŸSOMETHING�ELSE‰LEA‡STACK(PC),A7*œA7=PROGRAM�STACK�ADDRESS‰LEA‡OPIN(PC),A0!‰MOVE.L„A0,MSGIIOS-PBA+IOSSAD(A6)‰LEA‡OPINE(PC),A0!‰MOVE.L„A0,MSGIIOS-PBA+IOSEAD(A6)!*œINITIALIZE�PARAMETER�BLOCK�WITH*�START/END�ADDR *�BUFFER�SIZE‰LEA‡CSECT(PC),A0 ‰MOVE.L„A0,INPIOS-PBA+IOSSAD(A6)‰LEA‡CSECTE(PC),A0 ‰MOVE.L„A0,INPIOS-PBA+IOSEAD(A6) B‰MOVE.L„REV_CODE-PBA(A6),X00110-PBA(A6)‚PUT�THE�REVISION�CODE�INTO=‰MOVE.L„REV_CODE+4-PBA(A6),X00110+4-PBA(A6)ƒTHE�HELP�MESSAGE.*+*�DISPLAY�VERSION�MESSAGE‚AND‚OPTIONSœ<�1,4*‰LEA…VERSION(PC),A1‰MOVE.L‚REV_CODE-PBA(A6),(A1)+‰MOVE.L‚REV_CODE+4-PBA(A6),(A1),‰LEA…HEADING(PC),A1…'PATCH�VERSION‚XXXXXX�X'‰LEA…HEADINGE(PC),A0 ‰BSR‡MSGOUT 1‰MOVE.L„OFFSET-PBA(A6),D0ƒD0�<--�VALUE�TO�CONVERT7‰LEA‡OFSTV(PC),A1ˆA0�<--�WHERE�TO�PLACE�CONVERTED�ASCII1‰BSR‡ASCII8ŽCONVERT�TO�ASCII�AND�PLACE�IN�MESSAGE.‰LEA‡OFSTS(PC),A1ˆ'CURRENT�OFFSET�IS‚XXXXXXXX'‰LEA‡OFSTE(PC),A03‰BSR‡MSGOUT‰PUT�OUT�MESSAGE�OF�CURRENT�OFFSET„1.4�> ** PARSE THE COMMAND LINE*2ŠLEA…CLINE(PC),A0‰PARSE�THE�COMMAND�LINE�AND�CHECKŠBSR…PARSE�FOR�PARSE�ERRORS. ŠTST.LƒD0“* ŠBMI…ER_NVE�* CMLOK…EQU†*“.�1,4;ŠMOVEM.L�A1-A2,PARSAREG-PBA(A6)„SAVE�RETURN�REGS�FROM�PARSE*=* ON RETURN FROM PARSE, A1=ADDR OF OUTPUT FIELD OR 0, A2=ADDR*ƒOF�OPTIONS�FIELD�OR�0.*5* SET US UP SO THAT INPTLU (1) POINTS TO PROPER INPUT* DOINPUTƒEQU…* ŠBSR.SƒNEWIN *%*�NOW�PROCESS�THE�OPTIONS�FIELD¦<�1,4* ‰BSR‡PROCOPT0‰MOVE.L„PTYPE-PBA(A6),D0„D0�<--�VALUE�TO�CONVERT7‰LEA‡PROCV(PC),A1ˆA0�<--�WHERE�TO�PLACE�CONVERTED�ASCII1‰BSR‡ASCII8ŽCONVERT�TO�ASCII�AND�PLACE�IN�MESSAGE‰LEA‡PROCV-PBA(A6),A1‰MOVE.W„#'‚',(A1)+‰MOVE.B„#'�',(A1)-‰LEA„PROCMSGS(PC),A1ˆ'PROCESSOR�TYPE�=„XXXXX'‰LEA„PROCMSGE(PC),A03‰BSR‡MSGOUTŠPUT�OUT�MESSAGE�OF�PROCESSOR�TYPE„1,4�> ** HANDLE REQUEST AND EXIT* ‰BSR…DOIT°1,4 ‰BSR†C_EM_PGM ;OKEXIT:‚ERQ.TERM�#0,#0†EXIT�WITH�NORMAL�TERMINATION�STATUS.*œDISPLAY�ERROR�MESSAGE‰PAGE*:* SUBROUTINE TO ASSIGN INPUT DEVICE TO INPLUN (NORMALLY 1)*NEWIN:4ŠMOVE.L‚A6,A0�CHANGE�BASE�ADDR�FOR�DEFAULTS�12/18/847ŠLEA…INPFHS(PC),A6ˆPUT�DEFAULTS�INTO�THE�FHS�PARAM�BLOC4ŠBSR.SƒDEFAULTS�FOR�INPUT�(INCLUDING�AN�EXTENSION�OF9ŠMOVE.W‚#'LO',FHSEXT(A6)…'LO'),�THEN�CALL�EDITFILE�ON�THE4ŠLEA…CLINE(PC),A0�INPUT�FIELD�FROM�THE�COMMAND�LINE.ŠBSR…EDITFILE�* ŠBMI…ER_NVE�* .ŠLEA…PBA(PC),A6‹RESTORE�BASE�ADDRESS�REGISTER. 2ŠMOVE.L‚D0,EDITRTN-PBA(A6)ƒSAVE�THE�RETURNED�INFO. /ŠMOVE.L‚#2,D1�CHECK�WHETHER�THE�INPUT�FIELD�WAS<ŠAND.LƒEDITRTN-PBA(A6),D1ƒA�DEVICE�SPECIFICATION�RATHER�THAN"ŠBNE.SƒNOTLO�A�FILE.‚IF�SO,�ERROR. *‰FHSCALL‚INPFHS(PC)‹ASSIGN�THE�INPUT�FILE.‰BNE‡FATALERRŒ* 3‰MOVE.W„#$0700,D0‹IF�IT�IS�NOT�CONTIGUOUS,�IT'S�NOT,‰AND.W…FHSOPT(A0),D0‡A�LOADMODULE,�SO�ERROR.‰BNE.S…NOTLO�* ‰RTS  9NOTLO…LEA…DVASGMS(PC),A1‡INFORM�USER�THAT�INPUT�MUST�BE�A.ŠLEA…DVASGME(PC),A0‡LOADMODULE,�AND�TERMINATE. ŠBSR…MSGOUT�*ŠBRA…ERREXITŽ*   **B* SUBROUTINE TO PLUG IN DEFAULT STUFF INTO PARAMETER BLOCK POINTED *ƒTO�BY�A6*DEFAULTS‚EQU…*5ŠMOVE.W‚USERNUM+2-PBA(A0),FHSUSN(A6)ƒDEFAULT�USER�NUM-ŠMOVE.L‚VOLNAM-PBA(A0),FHSVOL(A6)†VOLUME�NAME0ŠMOVE.L‚CATNAM-PBA(A0),FHSCLG(A6)†CATALOGUE�NAME@ŠMOVE.L‚CATNAM+4-PBA(A0),FHSCLG+4(A6)‚2ND�PART�OF�CATALOGUE�NAMEŠRTS**‰PAGE*<*�SUBROUTINE�TO�PROCESS�OPTIONS�(ONLY�P=XXXXX�ALLOWED)�<�1.4* PROCOPT‚EQU‡*<‰MOVE.L„OPTSRT-PBA(A6),A2ƒA2�<--�START�OF�OPTIONS�FIELD�ADDR‰MOVE.L„A2,D0�TEST�IT.-‰BEQ.S…OPTOVRŽIF�ZERO,�THEN�NO�OPTIONS�EXIST.‰BSR‡OPTIONŽPROCESS�OPTIONS.0‰CMP.B…#$40,D0�BIT�6�INDICATES�NO�OPTIONS�EXIST.!‰BEQ.S…OPTOVRŽBRANCH�OUT�IN�NONE..‰BTST†#7,D0�BIT�7�INDICATES�ERROR�WITH�OPTION..‰BNE.S…OPTERRŽBRANCH�TO�PROCESS�ERROR�MESSAGE.'‰CMP.B…#'P',D1�D1�<--�OPTIONS�CHARACTER*‰BNE.S…OPTERRŽ'P'�IS�THE�ONLY�VALID�OPTION/‰BTST†#4,D0�BIT�4�INDICATES�EQUAL�SIGN�PRESENT.0‰BEQ.S…O& PTERRŽBRANCH�TO�PROCESS�ERROR�IF�NO�'='. +‰CMP.L…#68000,D3‹D3�<--�VALUE�FOLLOWING�'='‰IFˆ�THEN.S(‰MOVE.L„#$68000,PTYPE-PBA(A6)�SAVE�PTYPE3‰MOVE.L„#0,PCODE-PBA(A6)„FORCE�PCODE�BASED�ON�PTYPE‰BRA.S…OPTOVRŽDONE.‰ENDI +‰CMP.L…#68008,D3‹D3�<--�VALUE�FOLLOWING�'='‰IFˆ�THEN.S(‰MOVE.L„#$68008,PTYPE-PBA(A6)�SAVE�PTYPE1‰MOVE.L„#4,PCODE-PBA(A6)„FOR�PCODE�BASED�ON�PTYPE‰BRA.S…OPTOVRŽDONE.‰ENDI +‰CMP.L…#68010,D3‹D3�<--�VALUE�FOLLOWING�'='‰IFˆ�THEN.S(‰MOVE.L„#$68010,PTYPE-PBA(A6)�SAVE�PTYPE3‰MOVE.L„#8,PCODE-PBA(A6)„FORCE�PCODE�BASED�ON�PTYPE‰BRA.S…OPTOVRŽDONE‰ENDI .OPTERRƒLEA‡OPERMSGS(PC),A1‰BEFIN�ERROR�MESSAGE&‰LEA‡OPERMSGE(PC),A0‰END�ERROR�MESSAGE.‰BSR‡MSGOUTŽDISPLAY�'INVALID�OPTION�SPECIFIED'‰BRA.L…ERREXIT�GET�OUT. OPTOVRƒRTS¹1.4�>ŠPAGE DOIT†EQU…*:ŠLEA…CHGBUF(PC),A3„CHANGE�BUFFER�ADDRESS�STAYS�IN�A3�!!!!!)ŠCLR.LƒD1‹RECORD�NUMBER�OF�CONTROL�SECTOR"ŠBSR…FILLBUF†GO�GET�CONTROL�SECTOR ‰BNE‡FATALERR *œJMP�IF�ERROR�ON�CONTROL�SECTOR*H* CONTROL SECTOR NOW IN MEMORY - SET UP PARAMETER BLOCK TO CHANGE BUFFER* ‰MOVE.L„A3,INPIOS-PBA+IOSSAD(A6)‰LEA‡255(A3),A0 ‰MOVE.L„A0,INPIOS-PBA+IOSEAD(A6)** NOW PROMPT THE OPERATOR*PROMPT1:/‰LEA‡PBA(PC),A6ŽLOAD�PROG�BASE�ADDRESS�FOR�PIC. =‰MOVE.L‚A7,MODEC-PBA(A6)„MARK�AS�NOT�IN�CHANGE�MODE�(A7�<>�0)5‰SF†ASM_MNEM-PBA(A6)„MARK�AS�NOT�IN�DISASSEMBLY�MODE.‰LEA…PROMPTC(PC),A1‰LEA…PROMPTCE(PC),A0NXTOPIN:"‰LEA‡STACK(PC),A7ŒRESET�THE�STACK!‰LEA‡OPINE(PC),A2 ‰MOVE.L„A2,D2‰LEA…OPINS(PC),A2 ‰BSR…MSGOUTIN ‰BNE‡FATALERR*œJMP�IF�INPUT�ERRORŠLEA…OPIN(PC),A0;ŠMOVE.L‚MSGIIOS-PBA+IOSLEN(A6),A1‚CALC�ENDING�INPUT�ADDRESSŠLEA…-1(A0,A1.L),A1‡* :‰TST.B�ASM_MNEM-PBA(A6)ˆIF�THE�BUFFER�CONTAINS�AN�ASSEMBLY3‰BNE�DI_ASM”LANGUAGE�STATEMENT,�DON'T�MESS�WITH�IT.*?* SCAN THE INPUT FOR A COMMENT FIELD (FIELD BEGINNING WITH '*')5*ƒIF�WE�FIND�A�COMMENT,�THEN�MOVE�THE�CARRIAGE�RETURN>*ƒTO�THE�FIRST�BLANK�FOLLOWING�THE�REGULAR�(NONCOMMENT)�INPUT.<*ƒPOINT�A1�TO�THIS�CARRIAGE�RETURN.‚IN�OTHER�WORDS,�FAKE�THE>*ƒINPUT�AS�IF�A�COMMENT�HAD�NEVER�BEEN�PRESENTED�IN�THE�INPUT.*C*ˆIN�OTHER�WORDS�REPLACE�THE�FIRST�'*'�WITH�A�'CR'�AND�THEN�PROCESS>*ˆTHE�LINE�OF�INFORMATION�INPUT�AS�IT�STANDS�WITH�THIS�CHANGE.*A*ˆTHE�'*'�WAS�ALLOWED�SO�YOU�COULD�PUT�COMMENTS�INTO�A�CHAIN�FILE?*ˆTHAT�CONTAINED�PATCHES�TO�BE�MADE�TO�FILES�REQUIRING�PATCHES.*A*ˆNOTICE�THAT�A�LINE�WHICH�CONTAINS�NO�NONBLANK�CHARACTERS�BEFORE?*ˆA�'*'�DOES�NOT�INCREMENT�THE�LOCATION�COUNTER�IN�CHANGE�MODE.*"ŠMOVE.L�A0,A5ŽA5�=�RUNNING�SCANNER"ŠLEA„-1(A0),A4ŠTERMINATING�POINTER"AST0†CMP.B‚#'*',(A5)+‰SCAN�FOR�'*'#ŠBEQ.S‚AST5�BRANCH�IF�COMMENT�FOUND!ŠCMP.L‚A1,A5ŽTEST�FOR�END�OF�SCAN#ŠBHI.S‚TAKINP�BRANCH�IF�END�OF�SCAN4ŠCMP.B‚#'�',-1(A5)ˆSEE�IF�WE�ADV�TERMINATING�POINTER$ŠBEQ.S‚AST0�BRANCH�IF�NOT�TO�ADVANCE*ŠLEA„-1(A5),A4ŠADVANCE�TERMINATING�POINTER ŠBRA„AST0*7AST5…IF.L‚A4��A0�AND.L�MODEC-PBA(A6)��#0�THEN.S6‹BRA…NOCHG2‹IF�WE'RE�IN�CHANGE�MODE�AND�ONLY�A�COMMENT%‰ENDI—WAS�ENTERED,�JUST�PROMPT�AGAIN. ŠMOVE.L�A4,A1ŽNEW�END�POINTER)ŠMOVE.B�#$0D,1(A4)‰PUT�IN�CARRIAGE�RETURN*TAKINP:ŠBRA…DECINP‡DECODE�THE�INPUT** NN WAS ENTERED* NUM‡EQU…*5ŠSF†ASM_MNEM-PBA(A6)…CHECK�FOR�OPTIONS.‚IF�THERE�WERE!ŠBSR…OPINOPTŽNONE,�SKIP�ALL�THIS. ŠBEQ.SƒNUM1‘* @ŠIF.W‚D0��#'DI'‚THEN.S‚IF�THE�OPTION�SPECIFIED�WAS�NOT�'DI',2ŒMOVE.L�#EM_NVO,D0ŠGIVE�AN�ERROR�AND�PROMPT�AGAIN.ŒBSR�C_EM_PGM�*ŒBRA�PROMPT1�*ŠENDI™* 2ŠST‡ASM_MNEM-PBA(A6)„HE�SAID�';DI',�SO�REMEMBER�TO*§DISASSEMBLE�&�ASSEMBLE. .NUM1†MOVE.L‚#1,INCNUM-PBA(A6)„SET�UP�INCREMENT ŠBRA.SƒNUM08NUMUP…MOVE.L‚#-1,INCNUM-PBA(A6)ƒSET�UP�DISPLAY�INCREMENT$ŠSUB.Lƒ#1,A1ˆPOINT�TO�END�OF�NUMERIC NUM0†EQU…*,ŠTST.LƒMODEC-PBA(A6)ˆARE�WE�IN�A�CHANGE�MODEŠBEQ.SƒCHGMOD‡BRANCH�IF�YES+ŠCLR.LƒMODEC-PBA(A6)ˆMARK�US�IN�CHANGE�MODE&ŠBSR…ASCSCAN†CHECK�FOR�ALL�ASCII�INPUT'ŠBNE.SƒNOADDR‡BRANCH�FOR�NOT�GOOD�INPUT)ŠBSR…ASCBIN‡GET�BINARY�EQUIVALENT�INTO�D0 ŠMOVE.L‚D1,D0)ŠMOVE.L‚D0' ,DECNUM-PBA(A6)„DISPLAY�ADDRESS ŠBSR…GETIDX*ŠBRA.SƒOPINOK‡BRANCH�IF�INPUT�WITHIN�RANGE*7NOADDR„LEA…NOADDRS(PC),A1ƒCOMPLAIN�IF�BAD�INPUT�ADDRESS‰LEA‡NOADDRE(PC),A0 ŠBSR…ERROUT ŠBRA…PROMPT1* OPINOK„EQU…* ŠBNE…PROMPT1†BRANCH�ON�I/O�ERROR+ŠMOVE.L‚D1,GETIDXNM-PBA(A6)‚SAVE�BYTE�VALUE ŠBRA…DISPLAY* CHGMOD„EQU…*'ŠBSR…ASCSCAN†SCAN�FOR�LEGAL�ASCII�INPUT+ŠBNE…BADINP‡BRANCH�IF�NOT�LEGAL�ASCII�INPUT:ŠMOVE.L‚DECNUM-PBA(A6),SAVDEC-PBA(A6)�SAVE�DISPLAY�ADDRESS<ŠCLR.LƒQFIRST-PBA(A6)�FLAG�AS�FIRST�TIME�THRU�(SYNTAX�CHECK)9ŠMOVEM.L‚A0-A1,QSAVA0-PBA(A6)‚SAVE�NUMERIC�INPUT�BOUNDARY NLOOP1„EQU…*"ŠMOVE.L‚A1,D1ˆEND�NUMERIC�BOUNDARY/ŠSUB.LƒA0,D1ˆD1�HAS�#�OF�INPUT�NUMERIC�CHARS�-13ŠMOVE.L‚A0,A1ˆSET�UP�FOR�ASCII�CONVERSION�OF�1�CHAR+ŠBTSTƒ#0,D1‰NE�IMPLIES�EVEN,�EQ�IMPLIES�ODD'ŠBEQ.SƒNBIN‡BRANCH�IF�ODD�#�CHARS�INPUT-ŠADD.Lƒ#1,A1ˆMUST�CONVERT�TWO�IF�EVEN�#�CHARS*'NBIN†BSR…ASCBIN‡CONVERT�A0-A1�TO�BINARY7ŠMOVE.B‚D1,STGCHR-PBA(A6)„SET�UP�FOR�DEPOSIT�SUBROUTINE*ŠLEA…STGCHR(PC),A0„POINT�A0�TO�INSERT�BYTE"ŠBSR…DEPITˆGO�DEPOSIT�THE�NEW�BYTE+ŠADD.Lƒ#2,A1ˆSET�UP�TO�PICK�UP�NEXT�2�BYTES ŠMOVE.L‚A1,A0 ŠSUB.Lƒ#1,A0*ŠCMP.LƒQSAVA0+4-PBA(A6),A1‚ARE�WE�THROUGH?ŠBLE…NBIN‰BRANCH�IF�NOT9ŠSUB.Lƒ#1,DECNUM-PBA(A6)„CORRECT�FROM�FINAL�DEPIT�ADVANCE/ŠTST.LƒQFIRST-PBA(A6)‡WAS�THIS�PASS�1�(SYNTAX?)ŠBNE.SƒNDUN‰BRANCH�IF�NO1ŠMOVE.L‚#-1,QFIRST-PBA(A6)„SET�UP�FOR�REAL�CHANGE0ŠMOVEM.L�QSAVA0-PBA(A6),A0-A1‚RESTORE�VITAL�REGS5ŠMOVE.L‚SAVDEC-PBA(A6),DECNUM-PBA(A6)‡RESTORE�ADDRESS ŠBRA…NLOOP1* NDUN†EQU…*ŠTST.LƒINCNUM-PBA(A6) ŠBPL.SƒNOCHG%ŠMOVE.L‚SAVDEC-PBA(A6),DECNUM-PBA(A6)*=NOCHG…MOVE.L‚INCNUM-PBA(A6),D1„GO�TO�NEXT�ADDRESS�FOR�DISPLAYŠADD.LƒD1,DECNUM-PBA(A6)NOCHG2„MOVE.L‚DECNUM-PBA(A6),D0 ŠBSR…GETIDX(ŠBRA.SƒNXTOK1‡BRANCH�IF�ADDRESS�STILL�OK*9OFFSEG„LEA…OFFSEGS(PC),A1ƒCOMPLAIN�THAT�WE'RE�OFF�THE�ENDŠLEA…OFFSEGE(PC),A0 ŠBSR…ERROUT ŠBRA…PROMPT1*$NXTOK1„BNE…PROMPT1†BRANCH�IF�BAD�I/O=ŠMOVE.L‚D1,GETIDXNM-PBA(A6)‚VALUE�OF�BYTE�AT�NEXT�DISPLAY�LOC* DISPLAYƒEQU…*ŒCONSTRUCT�DISPLAY,ŠMOVE.L‚DECNUM-PBA(A6),D0„ADDRESS�TO�DISPLAYŠLEA…ADRAOUT(PC),A1#ŠBSR…ASCII8‡CONVERT�&�DEPOSIT�ASCIIŠLEA‡ADRAOUT(PC),A1&*œA1=START�MSG�ADDR�IF�NO�OFFSET�VALUE‰TST.L…OFFSET-PBA(A6)‰BEQ.S…DP_0100*œJMP�IF�NO�OFFSET�VALUE�EXIST‰LEA‡CHGAOUTS(PC),A1)*œA1=START�MSG�ADDR�IF�OFFSET�VALUE�EXISTDP_0100:‰MOVE.L„A1,MSG_ADDR-PBA(A6)0*œA1=START�MSG�ADDR�TO�USE�WHEN�MSG�IS�DISPLAYED‰MOVE.L„OFFSET-PBA(A6),D0‰BEQ.S…DP_0200*œJMP�IF�NO�OFFSET�VALUE�EXIST‰ADD.L…DECNUM-PBA(A6),D0*œD0=USER�ADDR�+�OFFSET�VALUE ‰BSR‡ASCII80*œCONVERT�VALUE�AND�STORE�IN�SPECIFIED�ADDR�(A1)DP_0200::‰TST.B�ASM_MNEM-PBA(A6)ˆIF�WE'RE�DOING�'M....;DI',�THEN�GO‰BNE�DI_DISM“DISASSEMBLE.%ŠMOVE.L‚GETIDXNM-PBA(A6),D0‚OLD�VALUE ŠBSR…BINASCIIŠMOVE.W‚D1,VALAOUT-PBA(A6)&ŠCMP.Bƒ#$1F,D0†CONSTRUCT�ASCII�DISPLAY%ŠBLS.SƒDPRD‰BRANCH�IF�NOT�DISPLAYABLEŠCMP.Bƒ#$7E,D0!ŠBLS.SƒDPRC‰BRANCH�IF�DISPLAYABLE2DPRD†MOVE.B‚#'.',D0†DISPLAY�'.'�FOR�NONDISPLAYABLEDPRC†MOVE.B‚D0,QAOUT-PBA(A6)‰MOVE.L„MSG_ADDR-PBA(A6),A1‰LEA‡CHGAOUTE(PC),A0 ŠBRA…NXTOPIN‰PAGE*6* SUBROUTINE TO SCAN FROM A0 TO A1 FOR LEGAL HEX INPUT*ˆOUTPUT *’CONDITIONS*œZERO�==>�GOOD‚RETURN*˜NON-ZERO�==>�ERROR�RETURN*ASCSCAN: ‰MOVE.L„A0,D0*œD0=STATUS�FOR�ERROR�CONDITION‰CMP.B…#'$',(A0)‰BNE.S…C_ASCSCN-*œJMP�IF�1ST�CHTR�NOT�A�'$'�WHICH�WOULD�IMPLY'*œA�HEX�VALUE�WHICH�IS�ALREADY�ASSUMMED ‰TST.B…(A0)+(*œA0=START�ADDR�OF�HEX�DATA�TO�BE�EDITED C_ASCSCN:ŠMOVE.L‚A0,-(A7)ASCCMP„CMP.Bƒ#'0',(A0)ŠBLT.SƒASCB‰BRANCH�IF�NOT�ASCIIŠCMP.Bƒ#'9',(A0)ŠBLS.SƒASCX‰BRANCH�IF�ASCIIŠCMP.Bƒ#'A',(A0)ŠBLT.SƒASCB‰BRANCH�IF�NOT�ASCIIŠCMP.Bƒ#'F',(A0)ŠBGT.SƒASCB‰BRANCH�IF�NOT�ASCII*ASCX†ADD.Lƒ#1,A0 ŠCMP.LƒA1,A0+ŠBLE.SƒASCCMP‡BRANCH�IF�NOT�THRU�STRING�YES ‰CLR.L…D0*œD0=STATUS�FOR�GOOD�RETURNASCB:‰MOVE.L„(A7)+,A0 *œRESTORE�REG ‰TST.L…D0*œESTABLISH�OUTPUT�CONDITONSŠRTS*** CR1‡EQU…**ŠTST.LƒMODEC-PBA(A6)ˆARE�WE�IN�CHANGE�MODE ŠBNE…PROMPT1*œJMP�IF�NOT�IN�CHANGE�MOD' EŠMOVE.L‚#1,INCNUM-PBA(A6) ŠBRA…NOCHG*UPˆEQU…*ŒOPERATOR�ENTERED�^ŠTST.LƒMODEC-PBA(A6) ŠBNE…PROMPT1ŠMOVE.L‚#-1,INCNUM-PBA(A6) ŠBRA…NOCHG* QUOTE…EQU…*ŒHANDLE�QUOTE�STRINGSŠTST.LƒMODEC-PBA(A6)(ŠBNE…BADINP‡BRANCH�IF�NOT�IN�CHANGE�MODEŠMOVE.L‚#1,INCNUM-PBA(A6)6ŠCLR.LƒQFIRST-PBA(A6)�INDICATE�1ST�PASS�(SYNTAX�CHECK)*œPASS�1�IS�AN�EDIT�CHECK�ONLY2ŠMOVEM.L‚A0-A1,QSAVA0-PBA(A6)‚SAVE�STRING�POINTERS*:ŠMOVE.L‚DECNUM-PBA(A6),SAVDEC-PBA(A6)‡SAVE�DISPLAY�ADDRESS(QBUMP…ADD.Lƒ#1,A0ˆBUMP�CHARACTER�POINTER ŠCMP.LƒA1,A0/ŠBGT.SƒQUOTEDUN…BRANCH�IF�QUOTE�STRING�FINISHED*,ŠCMP.Bƒ#'''',(A0)ƒDO�WE�HAVE�EMBEDDED�QUOTE?.ŠBNE.SƒDEPCHR‡NO�-�GO�DEPOSIT�NORMAL�CHARACTER *žIF�PASS�2B* ENCOUNTERED A QUOTE IN THE STRING, MAY BE END QUOTE OR EMBEDDED. ŠADD.Lƒ#1,A0 ŠCMP.LƒA1,A0#ŠBGT.SƒQUOTEDUN…BRANCH�IF�END�QUOTE1ŠCMP.Bƒ#'''',(A0)ƒCHECK�FOR�DOUBLE�EMBEDDED�QUOTEŠBNE.SƒCHKUPˆIF�NOT�CHECK�FOR�^ŠBRA.SƒDEPCHR‡DEPOSIT�QUOTE*CHKUP…CMP.Bƒ#'^',(A0)&ŠBNE.SƒQUOTERR†BRANCH�IF�ERROR�(NOT�^).ŠMOVE.L‚#-1,INCNUM-PBA(A6)ƒSET�DECREMENT�COUNT#ŠADD.Lƒ#1,A0ˆBUMP�CHARACTER�POINTER ŠCMP.LƒA1,A0ŠBGE.SƒQUOTEDUNŠBRA.SƒQUOTERR*$DEPCHR„BSR.SƒDEPITˆDEPOSIT�CHARACTER ŠBRA…QBUMP*%QUOTEDUN‚EQU…*ŒDONE�WITH�QUOTE�STRING0ŠSUB.Lƒ#1,DECNUM-PBA(A6)„ADJUST�FROM�FINAL�DEPIT,ŠTST.LƒQFIRST-PBA(A6)‡WAS�THIS�THE�1ST�PASS?ŠBNE.SƒQDUN‰BRANCH�IF�NOT+ŠMOVE.B‚#-1,QFIRST-PBA(A6)ƒMARK�AS�2ND�PASS5ŠMOVEM.L�QSAVA0-PBA(A6),A0-A1‚RESTORE�VITAL�REGISTERS=ŠMOVE.L‚SAVDEC-PBA(A6),DECNUM-PBA(A6)‡RESTORE�DISPLAY�ADDRESS'ŠBRA…QBUMPˆGO�REALLY�PUT�THE�CHANGES�IN QDUN†EQU…*ŠTST.LƒINCNUM-PBA(A6) ŠBPL…NOCHGAŠMOVE.L‚SAVDEC-PBA(A6),DECNUM-PBA(A6)�ADJUST�TO�DISPLAY�PRIOR�LOC ŠBRA…NOCHG*2QUOTERRƒEQU…*ŒCOMPLAIN�OF�BAD�QUOTE�STRING�ENTEREDŠLEA…QUOTERRS(PC),A1‰LEA‡QUOTERRE(PC),A0 ŠBSR…ERROUT ŠBRA…PROMPT1*.DEPIT…EQU…*ŒDEPOSIT�CHARACTER�POINTED�AT�BY�A0‰MOVEM.LƒA0-A1,-(A7))ŠMOVE.L‚DECNUM-PBA(A6),D0„DISPLAY�ADDRESS$ŠBSR…GETIDX‡GET�LOC�IN�CHANGE�BUFFER ŠBRA.SƒQINRNG‡BRANCH�IF�IN�RANGE*œTHE�LOCATION�IN�NOT�IN�RANGE ‰MOVE.L„A7,D6'*œSET�FLAG�THAT�AFTER�CLEANUP�WE�SHOULD*œTRANSFER�CONTROL�TO�'OFFSEG'‰BRA.S…CLEANUP*œCLEANUP�THE�STACK�AND�EXIT(QINRNG„BNE.SƒCLEANUP†BRANCH�IF�I/O�ERROR,ŠTST.LƒQFIRST-PBA(A6)‡IS�THIS�THE�FIRST�PASS0ŠBNE.SƒQCHG‰BRANCH�IF�THIS�PASS�REQUIRES�CHANGES&ŠMOVEM.L�(A7)+,A0-A1‚RESTORE�REGISTERSŠBRA.SƒQNOCHG‡NO�CHANGE�EXIT QCHG†EQU…*&ŠMOVE.L‚A0,A2ˆINDEX�INTO�CHANGE�BUFFER!ŠMOVEM.LŽ(A7)+,A0-A1‚RESTORE�REGSŠCLR.LƒD1‹FOR�BYTE�LOAD(ŠMOVE.B‚0(A2,A3.L),D1‚BEFORE�CHANGE�BYTE#ŠCMP.Bƒ(A0),D1†SEE�IF�REALLY�CHANGEŠBEQ.SƒQNOCHG‡BRANCH�IF�NOT;ŠADD.WƒD1,BCKSM-PBA(A6)…ACCUMULATE�"BEFORE�CHANGE"�CHECKSUMŠMOVE.B‚(A0),D1†NEW�BYTE:ŠADD.WƒD1,ACKSM-PBA(A6)…ACCUMULATE�"AFTER�CHANGE"�CHECKSUM2ŠMOVE.B‚D1,0(A2,A3.L)‚MAKE�CHANGE�IN�CHANGE�BUFFER$ŠCLR.LƒCHGED-PBA(A6)ˆFLAG�AS�CHANGED;QNOCHG„ADD.Lƒ#1,DECNUM-PBA(A6)„BUMP�TO�NEXT�DISPLAY�ADDRESSŠRTS…0CLEANUP:‰MOVEM.Lƒ(A7)+,A0-A1*œRESTORE�REGISTERS ‰TST.L…(A7)+!*œREMOVE�RETURN�ADDRESS�OF�CALLER ‰TST.L…D6 ‰BNE‡OFFSEG/*œTRANSFER�CONTROL�IF�LOCATION�WAS�OUT�OF�RANGE ‰BRA‡PROMPT10*œTRANSFER�CONTROL�BECAUSE�AN�I/O�ERROR�OCCURRED'*œEVEN�THOUGH�THE�LOCATION�WAS�IN�RANGE* OHˆEQU…*Œ'O'�COMMAND�WAS�ENTERED"ŠCMP.LƒA0,A1ˆWAS�JUST�'O'�ENTERED?2ŠBEQ.SƒODSP‰BRANCH�IF�YES�-�DISPLAY�CURRENT�OFFSET*1* OFFSET WAS ENTERED - CONVERT TO BINARY AND SAVE%ŠADD.Lƒ#1,A0ˆBYPASS�SUBCOMMAND�LETTER)ŠBSR…BLNKSKP†SKIP�BLANKS�TO�GET�TO�NUMBER)ŠBSR…ASCSCAN†CHECK�FOR�GOOD�ASCII�ENTERED"ŠBNE.SƒBADINP‡BRANCH�IF�BAD�OFFSETŠBSR…ASCBIN‡ASCII�NOW�IN�D1-ŠMOVE.L‚D1,OFFSET-PBA(A6)„SAVE�DESIRED�OFFSET ŠBRA…PROMPT1*!* DISPLAY CURRENT VALUE OF OFFSETODSP†MOVE.L‚OFFSET-PBA(A6),D00ŠLEA…ODSPM(PC),A1…WHERE�TO�PLACE�CONVERTED�ASCII1ŠBSR…ASCII8‡CONVERT�TO�ASCII�AND�PLACE�IN�MESSAGE.ŠLEA…OFSMS(PC),A1…'CURRENT�OFFSET�IS‚XXXXXXXX'‰LEA‡OFSME(PC),A0-ŠBSR…MSGOUT‡PUT�OUT�MESSAGE�OF�CURRENT�OFFSET ŠBRA…PROMPT1*M‰EQU…*)ŠADD.Lƒ#1,A0ˆBYP( ASS�SUBCOMMAND�LETTER�'M' .ŠCMP.Bƒ#'M',(A0)ŒIF�THE�USER�TYPED�'MM',�WE'LL3ŠIF‚‚THEN.S�ACCEPT�THAT�TOO:�BYPASS�SECOND�'M'.ŒADD.L�#1,A0�*ŠENDI™* %ŠBSR…BLNKSKP†SKIP�BLANKS�UNTIL�NUMBER3ŠMOVE.L‚A7,MODEC-PBA(A6)„MARK�AS�NOT�IN�CHANGE�MODEŠBRA…NUM*Q‰EQU…*ŠTST.LƒCHGED-PBA(A6)3ŠBNE.SƒQ1‹BRANCH�IF�NO�CHANGES�TO�WRITE�OUT�TO�DISK ŠBSR…WCHBUF3Q1ˆMOVE.L‚BCKSM-PBA(A6),D0…DISPLAY�CHECKSUM�MESSAGEŠLEA…CKSMV(PC),A1 ŠBSR…ASCII8ŠLEA…CKSMS(PC),A1‰LEA‡CKSME(PC),A0 ŠBSR…MSGOUT‰BRA‡OKEXIT„EXIT�NORMALLY.*BADINP:0‰BSR‡ER_NVE1ŠDISPLAY�'INVALID�ENTRY'�MESSAGE�AND‰BRA‡PROMPT1ŠREISSUE�PROMPT.‰PAGEO********************************************************************************6*ˆHANDLE�DISASSEMBLY�OF�NEXT�INSTRUCTION�FOR�'M...;DI'*O*******************************************************************************DI_DISM: 4‰MOVE.L�DECNUM-PBA(A6),D0†COMPUTE�THE�START�ADDRESS.‰ADD.L�OFFSET-PBA(A6),D0‡* /‰BTST�#0,D0”IF�THE�START�ADDRESS�IS�ODD,�THAT'S‰IF‚‚THEN.SŽAN�ERROR.‹LEA�ODDADDRS(PC),A1�*‹LEA�ODDADDRE(PC),A0�* ‹BSR�ERROUT’*‹BRA�PROMPT1‘*‰ENDIš* 6‰MOVE.L�D0,A4’A4�<--�VALUE�OF�PC�FOR�THIS�INSTRUCTION.+‰MOVE.L�D0,-(A7)�SAVE�IT�ON�THE�STACK,�TOO.‰LEA�CODE_BUF(PC),A1�* 2*’***�GET�10�BYTES�FROM�LOAD�MODULE�AT�THIS�PC�***>‰MOVE.L�DECNUM-PBA(A6),D0†TRY�TO�GET�10�BYTES.‚IF�AN�I/O�ERROR>‰FOR.L�D7�=�#1�TO�#10�DO.S…OCCURS,�GO�BACK�TO�PROMPT1.‚EXIT�TO1‹BSR�GETIDX’DI_DISM6�PREMATURELY�IF�AN�ADDRESS�IS1‹BRA.S�DI_DISM4ŽOUT�OF�RANGE.‚BYTES�TAKEN�GO�INTO‹BRA.S�DI_DISM6ŽCODE_BUF.DI_DISM4ƒBNE�PROMPT1‘*‹MOVE.B�D1,(A1)+�*‹ADD.L�#1,D0‘*‰ENDFš* ;DI_DISM6�CMP.L�#3,D7“IF�WE�GOT�AT�LEAST�2�BYTES,�D7�WILL�BE,‰BLO�NOADDR”3.‚IF�NOT,�IT�WAS�A�BAD�ADDRESS. 8*�SET�UP�ENTRY�CONDITIONS�TO�USE�DCODE68M�SUBROUTINE•1,4;‰MOVE.L‚PCODE-PBA(A6),D3†D3�<--�CODE�FOR�PROCESSOR�TYPE„1,4G‰MOVEM.L�CODE_BUF-PBA(A6),D0-D2�LOAD�THE�DATA�INTO�D0-D2�AND�THE�ADDRES>‰LEA�OPIN+20-10-PBA(A6),A5…OF�THE�RECEIVING�BUFFER�INTO�A5.‚A4*§ALREADY�HAS�THE�CODE'S�'PC'. 4‰BSR�DCODE68M’CALL�THE�DISASSEMBLER.ON�RETURN,A6�1,47‰LEA�CHGBUF(PC),A3�POINTS�TO�THE�END�OF�THE�DISASSEMBLE1‰MOVE.L�A6,A0’INSTRUCTION.‚A4�IS�THE�NEW�PC--FIND2‰LEA�PBA(PC),A6�THE�DIFFERENCE�AND�STORE�IT�IN�THE4‰SUB.L�(A7)+,A4�VALUE�TO�INCREMENT�PC�BY.�RESTORE�A38‰MOVE.L�A4,INCNUM-PBA(A6)†BECAUSE�DCODE68M�BLEW�IT�AWAY. -‰ADD.L�#1,A0“ADD�A�CR�LF�TO�WHATEVER�THE�DIS-)‰MOVE.B�#CR,(A0)+ŽASSEMBLER�GAVE�US�BACK.‰MOVE.B�#LF,(A0)�* @‰MOVE.L�MSG_ADDR-PBA(A6),A1„TRANSFER�THE�ADDRESS�FIELDS�PREPARED4‰LEA�VALAOUT(PC),A4ŒEARLIER�TO�THE�FRONT�OF�THE�DIS-‰ADD.L�#10,A5’ASSEMBLY�BUFFER. ‰REPEAT˜*‹MOVE.B�-(A4),-(A5)Š*‰UNTIL.L‚A4��A1‹* #‰MOVE.L�A5,A1’PRINT�THE�WHOLE�MESS. ‰BSR�MSGOUT”* ;‰LEA�A_PRMPT(PC),A1ŒSET�THE�PROMPT�MESSAGE�FOR�THE�OPERATOR>‰TST.L�OFFSET-PBA(A6)ŠTO�ENTER�ASSEMBLY�SOURCE�AND�PROMPT�HIM.8‰IF.L‚‚THEN.SŒ(NOTE�THAT�WE�PRINT�OUT�10�MORE�SPACES3‹ADD.L�#10,A1�IF�THERE�IS�AN�OFFSET�SO�THAT�WE�LINE,‰ENDIšUP�WITH�THE�DISASSEMBLED�INSTRUCTION.)‰LEA�A_PRMPTE(PC),A0‰BRA�NXTOPIN“*‰PAGEO********************************************************************************-*†HANDLE�ASSEMBLY�OF�INPUT�LINE�FOR�'M...;DI'*O*******************************************************************************DI_ASM: 2‰CMP.L�A0,A1“IF�NOTHING�WAS�ENTERED,�JUST�GO�ON�TO,‰BLO�NOCHG•DISASSEMBLE�THE�NEXT�INSTRUCTION. 6‰CMP.B�#'.',(A0)�IF�'.'�WAS�ENTERED,�GET�OUT�OF�CHANGE‰BEQ�PROMPT1“MODE. 5‰CMP.B�#'*',(A0)�IF�'*'�WAS�THE�FIRST�CHARACTER,�JUST‰BEQ�NOCHG2”GO�PROMPT�AGAIN. 8*’***�FIND�THE�FIRST�CHARACTER�PAST�THE�OPCODE�FIELD�***/‰REPEAT˜LOOK�FROM�HERE�TO�THE�END�OF�THE�BUFFER?‹IF.B‚(A0)��#ARROWCHR‚THEN.S„FOR�A�NONBLANK�CHARACTER.�EXIT;�MOVE.B�#SPACE,(A0)ˆTHE�LOOP�WHEN�YOU�FIND�ONE.‚CONVERT�ANY(‹ENDI˜RIGHT�ARROW�CHARACTERS�YOU�FIND�TO‹CMP.B�#SPACE,(A0)+ŠSPACES.‹BNE.S�DI_ASM2�*‰UNTIL.L‚A0��A1‹*6‰BRA.S�DI_ASM5‘DIDN'T�FIND�ONE--SKIP�THE�SUBSTITUTION. 3DI_ASM2‚REPE( AT˜A0�POINTS�TO�THE�CHARACTER�AFTER�THE5‹CMP.B�#SPACE,(A0)‹FIRST�NONBLANK�CHARACTER.‚NOW�LOOK1‹BEQ.S�DI_ASM4�FROM�HERE�TO�THE�END�OF�THE�BUFFER5‹CMP.B�#ARROWCHR,(A0)+‡FOR�THE�FIRST�BLANK�CHARACTER.‹BEQ.S�DI_ASM3�*‰UNTIL.L‚A0��A1‹*6‰BRA.S�DI_ASM5‘DIDN'T�FIND�ONE--SKIP�THE�SUBSTITUTION. :DI_ASM3‚SUB.L�#1,A0“MOVE�THE�POINTER�BACK�TO�THE�ARROWCHR. 8DI_ASM4‚MOVE.B�#'O',D0�FIND�ALL�OCCURRENCES�OF�'O'�AS�IN?‰MOVE.L�OFFSET-PBA(A6),D1†'OCTOPUS'�BEYOND�THE�OPCODE�FIELD�AND2‰BSR�RPL_CHR“REPLACE�WITH�THE�OFFSET.‚ALSO�REPLACE)*§ALL�RIGHT�ARROW�CHARACTERS�WITH�SPACES. 7*�SET�UP�ENTRY�CONDITIONS�TO�USE�CODE68M�SUBROUTINE™1,4BDI_ASM5‚MOVE.L�PCODE-PBA(A6),D3‡D3�<--�CODE�FOR�PROCESSOR�TYPE‡1,4:‰LEA�DUMMY(PC),A3ŽWE�DON'T�NEED�THE�GENERATED�LINE,�SO�1,4>‰MOVE.L�DECNUM-PBA(A6),A4†SEND�IT�TO�A�DUMMY�BUFFER.‚A4�IS�PC.?‰ADD.L�OFFSET-PBA(A6),A4‡A5�AND�A6�ARE�THE�START�&�END+1�ADDR'S-‰LEA�OPIN_ASM(PC),A5‹OF�THE�LINE�TO�ASSEMBLE.‰LEA�1(A1),A6’* 5‰BSR�CODE68M“CALL�THE�ONE-LINE�ASSEMBLER.IF�THERE�1,4;‰LEA�CHGBUF(PC),A3�WAS�AN�ERROR,�PRINT�A�MESSAGE�AND�PROMPT‰LEA�PBA(PC),A6�AGAIN. ‰TST.L�D7–*‰IF‚‚THEN.SŽ*‰LEA�SYNTMSGS(PC),A1‹*‰LEA�SYNTMSGE(PC),A0‹* ‹BSR�ERROUT’*‹BSR�CHK_TERM�*‹BRA�PROMPT1‘*‰ENDIš* :‰LEA�CODE_BUF(PC),A0‹THE�MACHINE�CODE�IS�NOW�IN�D0-D2,�AND9‰MOVEM.L�D0-D2,(A0)ŒTHE�#�OF�BYTES�IS�IN�D6.‚PUT�THE�CODE6‰LEA�OPIN(PC),A1�IN�A�BUFFER�AND�PREPARE�TO�CONVERT�TO<‰LEA�RPL_CHRT(PC),A2‹HEX�ASCII�IN�THE�OPERATOR�INPUT�BUFFER. ‰CLR.L�D0–* ,‰REPEAT˜FOR�EACH�BYTE�(THE�LENGTH�IS�IN�D6),*§*'‹MOVE.B�(A0),D0ŽMOVE�THE�HIGH�HEXDIGIT,‹LSR.B�#4,D0‘*‹MOVE.B�(A2,D0.W),(A1)+†**§*'‹MOVE.B�(A0)+,D0�MOVE�THE�LOW�HEXDIGIT,‹AND.B�#$0F,D0�*‹MOVE.B�(A2,D0.W),(A1)+†**§*%‹SUB.L�#1,D6‘AND�REPEAT�UNTIL�D6�=�0. ‰UNTIL‚“* @‰MOVE.L�#1,INCNUM-PBA(A6)†SET�UP�THE�PC�FOR�THE�NEXT�DISASSEMBLY%*§TO�BE�JUST�BEYOND�THIS�INSTRUCTION. 3‰SUB.L�#1,A1“SET�UP�THE�START/END�ADDRESSES�FOR�THE4‰LEA�OPIN(PC),A0�MANUFACTURED�INPUT�LINE�AND�LET�THE4‰BRA�CHGMOD”REGULAR�CHANGE�MODE�ROUTINE�DO�THE�REST.‰PAGEO*******************************************************************************4*ˆROUTINE�TO�RETURN�OPTIONS�FIELD�OF�OPERATOR�INPUT.* *‚ON�INPUT:>*„A0.L‚<--‚IS�ADDR�OF�FIRST�BYTE�TO�LOOK�AT�IN�OPERATOR�INPUT.=*„A1.L‚<--‚IS�ADDR�OF�LAST‚BYTE�TO�LOOK�AT�IN�OPERATOR�INPUT. *‚ON�RETURN:H*„A1.L‚<--‚ADDR�OF�LAST�NONBLANK�CHAR�BEFORE�';'�OR�UNCHANGED�IF�NO�';�.>*„D0.L‚<--‚THE�OPTION�CHARACTERS�(NOT�THE�';')�RIGHT�JUSTIFIED*•WITH�ZERO�FILL�TO�THE�LEFT.C*„CONDITION�CODES�ARE��IF�NO�OPTION,��IF�SOME�OPTION�FOUND.O******************************************************************************* OPINOPT: ;‰MOVEM.L�A0/A2/D1,-(A7)ˆSAVE�REGISTERS�ON�STACK�&�CLEAR�THE1‰CLR.L�D0–REGISTER�WHICH�WILL�CONTAIN�THE�RESULT.1‰MOVE.L�A0,A2’INITIALIZE�'LAST�NONBLANK'�POINTER. -‰REPEAT˜FIND�THE�POSITION�OF�THE�FIRST�';'�IN5‹CMP.B�#';',(A0)�THE�DESIGNATED�BUFFER�AREA�(IF�THERE5‹BEQ.S�OPINOPT1ŽIS�NONE,�JUST�EXIT�WITH�D0=0).‚AT�THEC‹IF.B�(A0)+��#SPACE�THEN.S�SAME�TIME�UPDATE�THE�'LAST�NONBLANK'�MOVE.L�A0,A2ŽPOINTER.‹ENDI˜*‰UNTIL.L‚A0��A1‹*‰BRA.S�OPINOPT9�* 5OPINOPT1�REPEAT˜SKIP�OVER�SPACES�BETWEEN�';'�AND�NEXT ‹ADD.L�#1,A0‘NONBLANK�CHARACTER.)‰UNTIL.B�(A0)��#SPACE�OR.L�A0��A1 6*’***�MOVE�CHARACTERS�TO�D0�UNTIL�END�OF�BUFFER�OR�***5*’***�SPACE�IS�ENCOUNTERED�OR�4�CHARACTERS�MOVED.‚***#‰MOVE.L�#3,D1’LOOP�AT�MOST�4�TIMES. 8OPINOPT2�CMP.L�A1,A0“CHECK�TO�SEE�IF�WE'RE�PAST�THE�END.‰BHI.S�OPINOPT9�* ,‰LSL.W�#8,D0“STORE�THE�NEXT�CHARACTER�IN�D0.‰MOVE.B�(A0)+,D0�* 9‰CMP.B�#SPACE,(A0)�REPEAT�UNLESS�THE�NEXT�CHAR�IS�A�SPACE*‰DBEQ�D1,OPINOPT2ŽOR�WE'VE�ALREADY�DONE�4. >OPINOPT9�MOVE.B�#CR,(A2)�PUT�A�CR�AFTER�THE�LAST�NONBLANK�CHAR5‰LEA�-1(A2),A1‘BEFORE�THE�';'�AND�POINT�A1�BEFORE�IT. ?‰MOVEM.L�(A7)+,A0/A2/D1ˆRESTORE�REGISTERS,�SET�CONDITION�CODES,‰TST.L�D0–AND�RETURN.‰RTS›*‰PAGEO**************) *****************************************************************;*ˆFIND�CHAR�IN�OPIN�BUFFER�&�REPLACE�WITH�32-BIT�HEX�VALUE.6*ˆALSO�REPLACE�ALL�RIGHT�ARROW�CHARACTERS�WITH�SPACES.* *‚ON�CALL:4*„A0.L‚<--‚ADDR�AT�WHICH�TO�START�SEARCHING�FOR�CHAR*„A1.L‚<--‚END�ADDR�FOR�SEARCH"*„D0.B‚<--‚CHARACTER�TO�SEARCH�FORE*„D1.L‚<--‚HEX�VALUE�TO�PUT�IN�PLACE�OF�THE�CHARACTER�(NOT�PRESERVED) *‚ON�RETURN:<*„A1.L‚<--‚NEW�END�ADDR;�DESTROYED�IF�BUFFER�OVERFLOW�OCCURSF*„RETURNS�DIRECTLY�TO�PROMPT1�IF�BUFFER�OVERFLOW�OCCURS.‚STACK�MUST�BE*�FIXED�BY�CODE�THERE.O******************************************************************************* RPL_CHRT DC.B '0123456789ABCDEF' RPL_CHR:0‰MOVEM.L�A0/D2-D3,-(A7)ˆSAVE�REGISTERS�ON�STACK. 3‰MOVE.L‚A1,-(A7)ŽPUSH�THE�END�ADDRESS�ON�THE�STACK. ARPL_CHR1�WHILE.L‚A0��A1‚DO.S…FOR�THE�REMAINDER�OF�THE�BUFFER, :‹CMP.B�#ARROWCHR,(A0)ˆ...LOOK�FOR�THE�RIGHT�ARROW�CHAR.‚IF2‹IF‚‚THEN.SŒ...YOU�FIND�ONE,�REPLACE�IT�WITH�A�MOVE.B�#SPACE,(A0)ˆ...SPACE. ‹ENDI˜...* 3‹CMP.B�(A0)+,D0Ž...LOOK�FOR�THE�SEARCH�CHAR.‚IF�YOU4‹BEQ.S�RPL_CHR2Ž...FIND�ONE,�BRANCH�OUT�OF�THE�LOOP. ‰ENDWš* 1‰MOVE.L�(A7)+,A1�THAT'S�THE�END�OF�THE�BUFFER,�SO5‰MOVEM.L�(A7)+,A0/D2-D3ˆRESTORE�REGISTERS�AND�RETURN.‰RTS›* ;RPL_CHR2�PEA�OPINE(PC)‘CHECK�FOR�BUFFER�OVERFLOW�CONDITION:.‰PEA�8(A1)•IF�WE�CAN'T�HOLD�8�MORE�BYTES,�SEND5‰CMPM.L�(A7)+,(A7)+ŒERROR�MESSAGE�AND�GO�BACK�TO�SUB-)‰BHI.S�RPL_CHR3�COMMAND�LEVEL�AND�PROMPT.‰LEA�OVMSGS(PC),A1�*‰LEA�OVMSGE(PC),A0�* ‹BSR�ERROUT’*‹BSR�CHK_TERM�*‹BRA�PROMPT1‘* ;RPL_CHR3�ADD.L�#1,A1“MOVE�ALL�CHARACTERS�BEYOND�THE�CHAR�TO=‰WHILE.L‚A1��A0�DO.S†REPLACE�FORWARD�8�BYTES�TO�MAKE�ROOM&‹MOVE.B�-(A1),8(A1)ŠFOR�THE�HEX�VALUE.‰ENDWš* 8‰MOVE.B�#'$',-1(A0)ŒPUT�A�'$'�WHERE�THE�SEARCH�CHAR�WAS.3‰MOVE.L�#7,D3’SET�UP�TO�LOOP�8�TIMES�(8�HEXDIGITS). 8RPL_CHR4�ROL.L�#4,D1“GET�THE�HIGH�ORDER�HEXDIGIT�INTO�D24‰MOVE.B�D1,D2’AND�MOVE�THE�CORRESPONDING�TABLE�ENTRY2‰AND.W�#$000F,D2�INTO�THE�BUFFER.‚DO�THIS�8�TIMES.‰MOVE.B�RPL_CHRT(PC,D2.W),(A0)+‰DBRA�D3,RPL_CHR4Ž* 4‰ADD.L�#8,(A7)‘ADD�8�TO�BUFFER�LENGTH�(ON�STACK)�AND0‰MOVE.L�(A7),A1�GO�LOOK�FOR�THE�NEXT�OCCURRENCE.‰BRA�RPL_CHR1’*ŠPAGE*** DECODE OPERATOR INPUT*#*�INPUT:‚A0�=�ADDRESS�OF�INPUT�LINE!*‰A1=ENDING�ADDRESS�OF�INPUT�LINE(* OUTPUT: D0 = NUMBER IN BINARY (IF ANY) *‰RETURN�TO:*‰NUM„FOR�NN*‰CR1„FOR�*‰NUMUP‚FOR�NN^*‰UP…FOR�^*‰PERIOD�FOR�. *‰Q†FOR�Q*‰OH…FOR�O*‰M†FOR�M�NN*‰HELPƒFOR�HELP* DECINP„EQU…* ŠBSR…BLNKSKP'*œREMOVE�LEADING�BLANKS�FROM�INPUT�LINE* CHECK FOR BY ITSELF*ŠMOVE.L‚A1,D0ˆENDING�ADDRESS ŠCMP.LƒA0,D0"ŠBLT…CR1ŠBRANCH�IF�CARRIAGE�RETURN*!* SEE IF TERMINATOR CHARACTER 'Q'*0ŠMOVE.B‚TERMCHR-PBA(A6),D1ƒTERMINATING�CHARACTERŠCMP.Bƒ(A0),D1&ŠBEQ…QŒBRANCH�IF�TERMINATING�CHARACTER** SEE IF PERIOD*ŠCMP.Bƒ#'.',(A0)ŠBEQ…PROMPT1†BRANCH�IF�PERIOD* * SEE IF '^'*ŠCMP.Bƒ#'^',(A0)„IS�IT�A�'^'ŠBEQ…UP‹BRANCH�IF�^** SEE IF SINGLE QUOTE*ŠCMP.Bƒ#'''',(A0) ŠBEQ…QUOTE* * SEE IF 'M'*ŠCMP.Bƒ#'M',(A0)ŠBEQ…M* * SEE IF 'O'*ŠCMP.Bƒ#'O',(A0)ŠBEQ…OH‹BRANCH�FOR�'O'�ENTERED** SEE IF 'HELP'*‰CMP.L…#'HELP',(A0)!‰BEQ.S…HELPˆBRANCH�FOR�HELP�PANEL* * IT SHOULD BE NN OR NN^*3‰CMP.B…#'0',(A0)‹CHECK�TO�MAKE�SURE�THIS�IS�A�VALID*‰BLT‡BADINPŽHEXDIGIT.‚IF�NOT,�GO�PRINT�THE1‰CMP.B…#'F',(A0)‹INVALID�ENTRY�MESSAGE�AND�PROMPT‰BHI‡BADINPŽAGAIN.‰IF.B‚(A0)��#'A'‚THEN.S‚*‹CMP.Bƒ#'9',(A0)‹* ‹BHI…BADINPŽ*‰ENDIš* 3ŠCMP.Bƒ#'^',(A1)ŒIT�IS�A�VALID�HEXDIGIT.‚IF�IT�ENDS/ŠBEQ…NUMUP�WITH�AN�UPARROW,�BRANCH�FOR�NN^, ŠBRA…NUM’ELSE�BRANCH�FOR�NN.*HELP:‰LEA‡X00199(PC),A0*œA0=MESSAGE�END�ADDR‰LEA‡X00100(PC),A1*œA1=MESSAGE�START�ADDR ‰BSR‡MSGOUT*œDISPLAY�HELP�PANEL ‰BRA‡PROMPT1ŠPAGE=*�SUBROUTINE�TO�GET�BYTE�FROM�LOAD�MODULE�FILE.‚WRITE�OUT�THE=*ƒCHANGE�BUFFER�IF�REQUIRED,�AND�READ�IN�THE�PROPER�SECTOR�TO*ƒFETCH�THE�REQUESTED�BYTE.) *3*�INPUT:ƒDO=�BYTE�LOGICAL�ADDRESS�(MUST�ADD�OFFSET)*ŽHEADER�IMAGE�(GLOBAL)%*�OUTPUT:‚D1=�VALUE�OF�REQUESTED�BYTE*ŠA0=�INDEX�INTO�CHANGE�BUFFER+*ŠSTATUS�IS�ZERO�IF�GOOD,�NONZERO�OTHERWISE*-*ŠRETURN�TO�PC�IF�OPERATOR�INPUT�WITHIN�RANGE*šNONZERO�STATUS�IF�I/O�ERROR. *”PC+2�FOR�OUT�OF�BOUNDS�ADDRESS** GETIDX„EQU…*'ŠADD.LƒOFFSET-PBA(A6),D0„BIAS�BY�OFFSET1ŠMOVE.L‚#1,RSECT-PBA(A6)…ASSUME�SECTOR�1�TO�START*>* FIND THE ADDRESS IN THE FILE OF THE SECTOR IN WHICH THE BYTE*ƒIS�CONTAINED.*5ŠLEA…MEMIMGD(PC),A2ƒBEGINNING�OF�MEMORY�IMAGE�DESCRS.ŠCLR.LƒD2‹FOR�WORD�LOADS ŠCLR.LƒD4,* SEE IF WE'RE AT THE END OF THE DESCRIPTORSGETIDXL2‚CMP.Lƒ#$0000FFFF,(A2)*ŠBEQ.SƒGETIDXNO…BRANCH�IF�AT�END�(NO�FIND)<* SEE IF THE DESIRED ADDRESS IN D0 LIES WITHIN THE BOUNDS OF*ƒTHIS�MEMORY�IMAGE.5ŠMOVE.W‚(A2),D2†BEGINNING�PAGE�ADDR�OF�THIS�MEM�IMAGE#ŠLSL.L‚#8,D2‰MAKE�INTO�BYTE�ADDRESS3ŠMOVE.W‚2(A2),D4…ENDING�PAGE�ADDR�OF�THIS�MEM�IMAGE#ŠLSL.L‚#8,D4‰MAKE�INTO�BYTE�ADDRESS1ŠADD.Lƒ#$FF,D4†MAKE�HIGHEST�POSSIBLE�BYTE�ADDRESS ŠCMP.LƒD2,D0%ŠBCS.SƒNXTIMG‡BRANCH�IF�NOT�IN�BOUNDS ŠCMP.LƒD4,D0+ŠBLS.SƒFOUNDIMG…BRANCH�IF�WITHIN�THIS�IMAGE.* NOT IN THIS IMAGE - UPDATE SECTOR SKIP COUNT$NXTIMG„LSR.L‚#8,D2‰PAGE�BASE�ADDRESSŠLSR.L‚#8,D4‰PAGE�HIGH�ADDRESSŠSUB.LƒD2,D4ˆHIGH�MINUS�LO1ŠADD.Lƒ#1,D4ˆONE-RELATIVE�COUNT�OF�BLOCKS�TO�SKIP/ŠADD.LƒD4,RSECT-PBA(A6)…UPDATE�CUMULATIVE�COUNT* PROCEED TO NEXT MEMORY IMAGE ŠADD.Lƒ#4,A2 ŠBRA…GETIDXL2.* SECTOR ADDRESS OF IMAGE BASE IS NOW IN RSECTFOUNDIMG‚EQU…*#* ADJUST FOR BIAS INTO MEMORY IMAGE ŠSUB.LƒD0,D2"ŠNEG.LƒD2‹BYTE�OFFSET�INTO�SEGMENTŠLSR.L‚#8,D2‰SECTOR�OFFSET,ŠADD.LƒRSECT-PBA(A6),D2…SECTOR�ADDRESS�IN�D2-ŠCMP.LƒINSEC-PBA(A6),D2…IS�SECTOR�ALREADY�IN?ŠBEQ.SƒGOTSEC‡BRANCH�IF�YES$ŠTST.LƒCHGED-PBA(A6)ˆWAS�IT�CHANGED?ŠBNE.SƒGETBUF‡BRANCH�IF�NO&ŠBSR.SƒWCHBUF‡WRITE�OUT�CHANGED�BUFFERŠTST.BƒINPIOS-PBA+IOSSTA(A6)ŠBNE.SƒGETIDXEX,ŠMOVE.L‚#1,CHGED-PBA(A6)…MARK�AS�NOT�CHANGEDGETBUF„MOVE.L‚D2,D1ŠMOVE.L‚D0,-(A7)…SAVE�THRU�CALLŠBSR.SƒFILLBUF†GO�FILL�BUFFERŠMOVE.L‚(A7)+,D0-ŠTST.BƒINPIOS-PBA+IOSSTA(A6)‡WAS�STATUS�GOOD?ŠBNE.SƒGETIDXEX…BAD�READ GOTSEC„EQU…* ŠCLR.LƒD1ŠMOVE.B‚D0,D1ˆBYTE�OFFSET ŠMOVE.L‚D1,A0ŠMOVE.B‚(A0,A3.L),D1‡BYTE�VALUE,ŠMOVE.L‚A0,GETIDXIX-PBA(A6)‚SAVE�INDEX�VALUE&ŠCMP.LƒD0,D0ˆSET�EQUAL�CONDITION�CODES$ŠBRA.SƒGETIDXEX…EXIT�THIS�SUBROUTINE*GETIDXNO‚EQU…*3ŠADD.Lƒ#2,(A7)†CAN'T�FIND�SEGMENT�WITH�THIS�ADDRESS8GETIDXEX‚BNE.SƒGETX2ˆKEEP�CONDITION�CODES�FOR�EQ,NE�SAME.ŠSUB.LƒOFFSET-PBA(A6),D0„REBIAS�ACCESS�ADDRESS(ŠCMP.BƒD0,D0ˆFORCE�EQUAL�CONDITION�CODES ŠBRA.SƒGETX43GETX2…SUB.LƒOFFSET-PBA(A6),D0„REBIAS�ACCESS�ADDRESS*ŠCMP.Lƒ#0,A7ˆFORCE�UNEQUAL�CONDITION�CODESGETX4: ‰CLR.L…D6'*œINITIALIZE�REGISTER�FOR�USE�AS�A�FLAGŠRTS‰PAGE*** FILL THE INPUT BUFFER**�INPUT:ƒD1=�SECTOR�ADDRESS&*�OUTPUT:‚PUTS�UP�MESSAGE�ON�I/O�ERROR&*ŠD0=�0�IF�NO�ERROR,�NONZERO�OTHERWISE* FILLBUFƒEQU…*ŠLEA…INPIOS(PC),A0 ŠMOVE.L‚D1,IOSRRN(A0)‡SET�UP�RRN$ŠMOVE.W‚#IOREAD,(A0)‚SET�UP�FOR�READŠTRAPƒ#2"ŠBEQ.SƒFILLBUFX…BRANCH�IF�NO�ERRORŠMOVE.L‚D0,-(A7)…SAVE�THRU�CALL ‰BSR‡C_EM_PGM*œDISPLAY�ERROR�MESSAGEŠMOVE.L‚(A7)+,D0FILLBUFX‚RTS…0*+* ROUTINE TO WRITE OUT SECTOR CHANGE BUFFER* WCHBUF„EQU…*ŠLEA…OUTIOS(PC),A0%ŠMOVE.W‚#IOWRIT,(A0)ˆSET�UP�FOR�WRITEŠMOVE.L‚D0,-(A7)ŠTRAPƒ#2ŠBEQ.SƒWCHBUFEX ‰BSR‡C_EM_PGM*œDISPLAY�ERROR�MESSAGEWCHBUFEX‚MOVE.L‚(A7)+,D0ŠRTS…0** ROUTINE TO SKIP BLANKS1*ƒINPUT:‚A0�POINTS�TO�BEGINNING�OF�STRING�TO�SCAN$*‹A1�POINTS�TO�END�OF�STRING�TO�SCAN0*ƒOUTPUT:�A0�POINTS�TO�FIRST�NON-BLANK�CHARACTER* BLNKSKPƒEQU…* ŠCMP.LƒA0,A1'ŠBLT.SƒBLNKSKPX…BRANCH�IF�DONE�SCANNINGŠCMP.Bƒ#'�',(A0)ŠBNE.SƒBLNKSKPX ŠADD.Wƒ#1,A0ˆBUMP�TO�NEXT�LETTERŠBRA.SƒBLNKSKPBLNKSKPX‚RTS…0*:* CONVERT AXCII POINTED AT BY A0 TO BINARY RETURNED IN D1.A*ƒAFTER�CONVERSION,�A0�WILL�BE�POINTING�TO�NON-NUMERIC�CHARACTER.$*ƒINPUT�IS�ALWAYS�ASSUMED�TO�BE�HEX.* ASCBIN„EQU…* ŠBSR…BLNKSKP ŠCLR.L* ƒD1 NXTCHR„EQU…*'ŠCMP.LƒA1,A0ˆARE�WE�AT�THE�END�OF�SCAN?ŠBLE.SƒNXTCHR2†BRANCH�IF�NO)ŠMOVE.L‚A1,A0ˆREADJUST�A0�TO�POINT�TO�ENDŠBRA.SƒASCBINX†GET�OUT�NOW NXTCHR2ƒEQU…*)ŠMOVE.B‚(A0)+,D0…GET�NEXT�CHAR�TO�CONVERT'ŠCMP.Bƒ#'0'-1,D0„DETERMINE�IF�LEGAL�HEX ŠBLE.SƒASCBINX†BRANCH�IF�NOT�HEXŠCMP.Bƒ#'9',D0'ŠBLE.SƒASC09ˆBRANCH�IF�HEX�IN�RANGE�0-9ŠCMP.Bƒ#'A'-1,D0 ŠBLE.SƒASCBINX†BRANCH�IF�NOT�HEXŠCMP.Bƒ#'F',D0 ŠBGT.SƒASCBINX†BRANCH�IF�NOT�HEX"ŠSUB.Bƒ#7,D0ˆBIAS�FOR�LETTER�(A-F)#ASC09…SUB.Bƒ#'0',D0†BIAS�FOR�NUMBERŠLSL.L‚#4,D1‰X16&ŠADD.BƒD0,D1ˆNEW�DIGIT�INTO�LOW�NIBBLE ŠBRA…NXTCHR ASCBINXƒRTS…0**0* SUBROUTINE TO CONVERT BINARY TO ASCII (1-BYTE)*ƒENTRY:…BSRƒBINASCII*‹D0�-�BINARY�BYTE�(LOW�ORDER).*ƒEXIT:ƒD1�-�HEX�ASCII�VALUE�IN�LOW�ORDER�WORD*BINASCII‚EQU…* ŠCLR.LƒD1 ŠMOVE.B‚D0,D1 ŠROR.L‚#4,D1*ŠADD.Bƒ#'0',D1†CONVERT�AS�IF�DECIMAL�(0-9)ŠCMP.Bƒ#'9',D1ŠBLE.SƒBIN2‰BRANCH�IF�OK*ŠADD.Bƒ#'A'-'9'-1,D1ƒCONVERT�FOR�HEX�(A-F) BIN2†EQU…* ŠLSL.W‚#4,D1 ŠROL.L‚#4,D1*ŠADD.Bƒ#'0',D1†CONVERT�AS�IF�DECIMAL�(0-9)"ŠCMP.Bƒ#'9',D1†SEE�IF�DECIMAL�TYPEŠBLE.SƒBIN4‰BRANCH�IF�YES*ŠADD.Bƒ#'A'-'9'-1,D1ƒCONVERT�FOR�HEX�(A-F) BIN4†EQU�*ŠRTS…0*$* CONVERT NUMBER TO 8 BYTES OF ASCII*ƒINPUT:ƒD0=NUMBER�TO�CONVERT'*ŒA1=WHERE�TO�DEPOSIT�CONVERTED�ADDRESS* ASCII8„EQU…* ŠADD.Lƒ#8,A1ŠMOVE.L‚#4,D2ˆLOOP�COUNTASCII8LƒBSR…BINASCIIŠMOVE.W‚D1,-(A1) ŠROR.L‚#8,D0 ŠSUB.Lƒ#1,D2ŠBGT.SƒASCII8LŠRTS…0** * SUBROUTINES** OUTPUTS MESSAGES (IMAGE MODE))*ƒENTRY�A1�=�BEGINNING�ADDRESS�OF�MESSAGE *‰A0�=�ENDING�ADDRESS�OF�MESSAGE* MSGOUT„EQU…*.ŠMOVE.L‚A1,MSGIOS-PBA+IOSSAD(A6)„BEGIN�ADDRESS ŠMOVE.L‚A0,MSGIOS-PBA+IOSEAD(A6)ŠLEA…MSGIOS(PC),A0ŠTRAPƒ#2ŠRTS…0*"* SUBROUTINE TO OUTPUT, THEN INPUT** INPUT A1 = OUTPUT START*‡A0�=�OUTPUT�END*‡A2�=�INPUT�START*‡D2�=�INPUT�END*MSGOUTIN‚EQU…* ŠBSR…MSGOUT!ŠMOVE.L‚A2,MSGIIOS-PBA+IOSSAD(A6)!ŠMOVE.L‚D2,MSGIIOS-PBA+IOSEAD(A6)ŠLEA…MSGIIOS(PC),A0ŠTRAPƒ#2‰BNE.S…OUTIN_XT ‰BSR‡SBARG OUTIN_XT:ŠRTS**2* SUBROUTINE TO PRINT ERROR MESSAGE AND, IF WE ARE5* BEING RUN FROM A CHAIN FILE, TERMINATE IMMEDIATELY.*ERROUT: ‰BSR‡MSGOUT‰BRA.S…CHK_TERM‰PAGEJ***************************************************************************+*ˆERROR�MESSAGES�FROM�ERROR�MESSAGE�HANDLER*J************************************************************************** ER_NVE1:7‰MOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�MESSAGE,�BUT�RETURN!‰BSR.S…C_EM_PGM‰RTS ER_NVO:*‰MOVE.L„#EM_NVO,D0Š'INVALID�OPTION'�ERROR.‰BRA.S…FATALERR ER_OPTCF:-‰MOVE.L„#EM_OPTCF,D0ˆ'OPTION�CONFLICT'�ERROR.‰BRA.S…FATALERR*ER_NVE:)‰MOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�ERROR.***J***************************************************************************2*ˆROUTINE�TO�CALL�ERROR�MESSAGE�HANDLER,�THEN�DIE.*J************************************************************************** FATALERR:‰BSR.S…C_EM_PGM2ERREXIT‚ERQ.TERM‚#0,#$C000‹EXIT�WITH�ERROR�STATUS.***M****************************************************************************** *’CALL�TO�ERROR�MESSAGE�HANDLER.**ˆCALL†BSR‡C_EM_PGM*A*ˆINPUTS„D0�AND�A0�SET�BY�IOS�OR�FHS�CALL,�OR�D0�FOR�NON�IOS/FHS.*N****************************************************************************** C_EM_PGM:&‰MOVE.L„A0,-(A7)ŒSAVE�A0�ON�THE�STACK.>‰LEA‡EM_PBLK+4-PBA(A6),A0�GET�ADDR�TO�STORE�A0�IN�PARAM�BLOCK.0‰MOVE.L„(A7)+,(A0)ŠMOVE�OLD�A0�INTO�PARAM�BLOCK.*‰MOVE.L„D0,-(A0)ŒMOVE�D0�INTO�PARAM�BLOCK.0‰MOVE.L„#2,D0�LOAD�D0�WITH�'EMH�CALL'�INDICATOR."‰TRAP†#4’CALL�THE�LOADER/EMH�TASK. HCHK_TERM:�BTSTƒ#0,LOGUNTS+3-PBA(A6)‚IF�WE'RE�BEING�RUN�FROM�A�CHAINFILE,0ŠIF‚‚THEN.S�TERMINATE�IMMEDIATELY�WITH�ERRORŒERQ.TERM�#0,#$C000‰STATUS.ŠENDI™* ‰RTS  ŠEND„PATCH* ééé=/*=/*†PRTDUMP.AF=/**=/* Chain file to assemble PRTDUMP utility=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to PRTDUMP.LS=/*=/IFC \1ƒ=ARG�PRTDUMP.LS=/ENDIF=/*$=ASM PRTDUMP.SA,PRTDUMP.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*}=/*=ENDééééééK' PRTDUMP LF``rrPRTDUMP SAiiºgrrRENAME AF**rrRENAME LF33rrRENAME SA<<…crrREPAIR AFÅÅ"rrREPAIR LFÎÎrrEPAIR1 SA× ªrr+ =/*=/*†PRTDUMP.LF=/*(=/* Link chain file to create PRTDUMP.LO=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to PRTDUMP.LL=/*=/IFC \1ƒ=ARG�PRTDUMP.LL=/ENDIF=/*=LINK ,PRTDUMP.LO,\1;AHMIX ATTRIBUTES PSEG SEG0:0-14 $0INPUT PRTDUMP.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééééX)PRTDUMP‚IDNT†4,1‡VERSAdos�PRTDUMP�utilityG*************************************************************************ˆP�R�T�D�U�M�P�.�S�A*-*ˆPRINT�CONTENTS�OF�FILE�PRODUCED�BY�TASKDUMP*G************************************************************************‡REVISION�HISTORY* *‡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.*H**************************************************************************†*�INCLUDE�STATEMENTS�***ˆINCLUDE�9995.&.TR1.EQ*ˆINCLUDE�9995.&.IOE.EQ*;***********************************************************‰NOLIST‰INCLUDE�9995.&.TR1.EQ‰INCLUDE�9995.&.IOE.EQ‰LIST ˆOPTƒFRS,NOCL*0********‚TASK�DUMP�ANALYSIS�**********************…COMMAND�LINE�FORMAT:2*ˆPRTDUMP��[,#]�[;] *…OPTIONS:*ˆA�=�ALL„R�=�RAM*…INPUT�COMMANDS:5*ˆAD†�[,]�[]*ˆALL*ˆHELP1*ˆMD†�[,]�[]*ˆOFFSET‚*ˆOUTPUT‚#*ˆQUIT*ˆRAM*ˆREGS*ˆSEGM„*ˆTCB*ŒPAGE MESGˆMACROŒLEA�MSGIOS(PC),A0 ŒPEA�\1(PC)ŒMOVE.L�(A7)+,IOSSAD(A0) ŒPEA�\2(PC)ŒMOVE.L�(A7)+,IOSEAD(A0)ŒTRAP„#2ŒENDM* INPUT‡MACROŒLEA�MSGIOS(PC),A0!ŒMOVE.W�#IOPIMG+IOPCNP,IOSOPT(A0) ŒPEA�\1(PC)ŒMOVE.L�(A7)+,IOSSAD(A0) ŒPEA�\2(PC)ŒMOVE.L�(A7)+,IOSEAD(A0)ŒTRAP„#2ŒMOVE.W‚#IOPCNP,IOSOPT(A0)ŒLEAƒMSGIIOS(PC),A0ŒTRAP‚#2ŒENDM SPC 2(*****************************************‡FIELD�FORMATTING�MACRO‰*…(**************************************** SPC 2'*ƒFLD�ASM-LABEL,TEXT,DATA-SIZE,C+ ONTINUE SPC 1 FLD„MACRO‡DC.B‚\2 \1…DCB.B�\3,0‡IFNC‚'C','\4' ‡DC.B‚CR,LF‡ENDC‡ENDM‡SPC�2)******************************************‹UTILITY�MACROSŽ*)***************************************** SPC 2 aZjorjzX‚aŠB’QšE¢GªS²Kº[ÂGÊWÒBÚEâEêHòHúcJ TQ+*�RD‚BYTE-COUNT,FILE-ADDR,MEMORY-ADDR,ERROR‡SPC�1RD…MACRO‡IFNC‚'D2','\1' ‡MOVE.L�\1,D2‡ENDC‡IFNC‚'D1','\2' ‡MOVE.L�\2,D1‡ENDC‡LEA„\3(PC),A1 ‡BSR„MOVEMEM‡BNE„\4‡ENDM‡SPC�1.*�MOVE-HEX‚BYTE-COUNT,SOURCE-ADDR,DEST-ADDRESS‡SPC�1 MVHEX‚MACRO ‡IFEQƒ\1-1 ‡MOVE.B�\2,D0‡ENDC ‡IFEQ„\1-2 ‡MOVE.W‚\2,D0‡ENDC ‡IFEQ„\1-3 ‡MOVE.L‚\2,D0‡ENDC ‡IFEQ„\1-4 ‡MOVE.L‚\2,D0‡ENDC‡LEA…\3(PC),A1‡BSR…CONVHEX\1‡ENDM‡SPC�10*�MOVE-ASCII‚BYTE-COUNT,SOURCE-ADDR,DEST-ADDRESS‡SPC�1 MVASC‚MACRO‡MOVE.L�#\1,D1 ‡LEA„\2,A0 ‡LEA„\3,A1 ‡BSR„MOVEASC‡ENDM‡SPC�1*…WANT�-�CONDITIONAL�PAGE�SKIP‡SPC�1 WANTƒMACRO‡SUB.W‚\1,CNTLIN-PBA(A5) ‡BGT.S‚\@A ‡BSRƒNEWPAGE‡SUB.W‚\1,CNTLIN-PBA(A5) \@A„EQUƒ*‡ENDM‡SPC‚1*…PRINT‚-‚PRINT�A�LINE‡SPC‚1 PRINT‚MACRO‡LEA‚\1(PC),A1‡LEA‚\1E(PC),A2 ‡BSRƒPRTLXI‡ENDM * PRINTF MACRO‡LEA‚\1(PC),A1‡LEA‚\1E(PC),A2 ‡BSRƒPRTLXX‡ENDM‰PAGE CR…SET�$0D LF…SET�$0A  **„TSTMMU�EQUATES*TSTLB„EQU‡0‰LOGICAL�BEGINTSTLE„EQU‡2‰LOGICAL�ENDTSTPO„EQU‡4‰PHYSICAL�OFFSET/TSTCTLƒEQU‡6‰CONTROL�(NULL�BYTE�+�CONTROL�BYTE)ŠPAGE ŠSECTION�0 PBA†EQU�* 4REV†DC.B�'122084'‡DATE�THIS�PROGRAM�WAS�LAST�CHANGED4‰DC.B�'�'ŒBLANK�INDICATES�CLEAN�ASSEMBLY�(NOT�PATCH)‰DC.B�'4'ŒMAJOR�REVISION�NUMBER ŠDS.Lƒ$40 STACK…EQU„* INITDREG‚EQU„*.MONITORƒDC.Lƒ0,0ŠMONITOR�TASK�NAME�AND�SESSION"VOLNAMEƒDC.Lƒ0ŒDEFAULT�VOLUME�NAME"USERNUMƒDC.Lƒ0ŒDEFAULT�USER�NUMBER CATALOGƒDC.Lƒ0,0ŠDEFAULT�CATALOG!CMDLNG„DC.Lƒ0ŒCOMMAND�LINE�LENGTH%LOGUNTSƒDC.Lƒ0ŒLOGICAL�UNITS�ASSIGNEDTASKNAMƒDC.Lƒ0ŒTHIS�TASK'S�NAME"TASKSESƒDC.Lƒ0ŒTHIS�TASK'S�SESSION"USERNUML‚DC.Lƒ0ŒLOG�ON�USER�NUMBER*(CLINE…COMLINE‚80ˆBUFFER�FOR�COMMAND�LINE*PARSAREG‚EQU„*#OUTPSRTƒDC.Lƒ0‹OUTPUT�FIELD�ADDRESS"OPTSRT„DC.Lƒ0‹OPTION�FIELD�ADDRESS*2FATLCNTƒDC.Wƒ5ŠNUMBER�OF�TIMES�TO�TRY�BEFORE�ABORT)ADRBGNDƒDC.Lƒ0ŠSAVE�ADDRESS�TO�START�DUMPCNTBYTEƒDC.Lƒ0Š#�BYTES�TO�DUMP)ADROFST1‚DC.Lƒ0ŠOFFSET�TO�LOGICAL�ADDRESS3ADROFST2‚DC.Lƒ0ŠTEMP�OFFSET�GIVEN�WITH�DUMP�COMMAND/PRINTERƒDC.Wƒ0ŠNON-ZERO�IF�OUTPUT�IS�TO�PRINTER#PAGESIZƒDC.Wƒ0ŠSIZE�OF�PRINTER�PAGE(CNTLIN„DC.Wƒ0ŠCOUNT�OF�LINE�LEFT�ON�PAGE0PAGEONEƒDC.Wƒ0ŠFLAG�1ST�LINE�-�NO�SLEW�ON�HEADER'SAVERRNƒDC.Lƒ-1‰LAST�RRN�READ�FROM�DISK*"ASQPB…DC.Lƒ0,0ˆTASK,SESSION�=�SELFŠDC.Bƒ7,30‡STATUS,MAX�MSGŠDC.Lƒ200ˆSIZE�OF�QASRADDRƒDC.Lƒ0ŠASR�ADDRESSŠDC.Lƒ0ŠPAGE**…FHS�AND�IOS�PARAMETER�BLOCKS*0BRKIOSƒDC.W‚IOBRKS…CLAIM�BREAKS�FOR�THIS�SESSION ‰DC.W‚IOPCAD ‰DC.W‚5,0 ‰DC.L‚0,0,0,0)ASRADDR2�DC.L‚0ŠADDRESS�TO�GO�TO�ON�BREAK*"LISTFHS‚EQUƒ*ŠASSIGN�OUTPUT�DEVICE ‰DC.W‚FHASGN ‰DC.W‚FOPEW‰DC.W‚3 ‰DC.B‚'„'‰DC.W‚0 ‰DC.B‚'’' ‰DC.L‚$FF ‰DC.W‚0,0,0*%MSGIOSƒEQUƒ*‰SEND�MESSAGE�TO�OPERATOR ‰DC.W‚IOWRIT ‰DC.W‚IOPFOR ‰DC.W‚LDFLUN‰DC.W‚0‰DC.L‚0,0,0,0,0*(MSGIIOS‚EQUƒ*ˆREAD�COMMAND�FROM�OPERATOR ‰DC.W‚IOREAD ‰DC.W‚IOPFOR ‰DC.W‚CDFLUN ‰DC.W‚0,0,0‰DC.L‚0‰DC.L‚0 ‰DC.L‚0,80*&RBLKIOS‚EQUƒ*‹READ�CRASH�DUMP�DISKETTE ‰DC.W‚IOREAD‰DC.W‚IOPBIN+IOPRAN‰DC.W‚1 ‰DC.W‚0,0,0‰DC.L‚0‰DC.L‚0‰DC.L‚0 ‰DC.L‚256* INPFHSƒEQU„*�ASSIGN�INPUT�DEVICE ‰DC.WƒFHASGN‰DC.WƒFOPER+FOPSEQ‰DC.Wƒ1 ‰DC.Bƒ'„'‰DC.Wƒ0‰DC.Bƒ'TASKDUMPˆDU'‰DC.Wƒ0,0,256,0,0,0*&LSTIOSƒEQU„*ŠFORMATTED�WRITE�TO�OUTPUT ‰DC.WƒIOWRIT ‰DC.WƒIOPFOR‰DC.WƒLDFLUN,0‰DC.Lƒ0,0,0,0,0,0*#LSTIIOS‚EQU„*ŒIMAGE�WRITE�TO�OUTPUT ‰DC.WƒIOWRIT ‰DC.WƒIOPIMG‰DC.WƒLDFLUN,0‰DC.Lƒ0,0,0,0,0,0‰PAGE**†MESSAGES�TO�OPERATOR*‰DS.W‚0PR, OMPTCS�DC.B‚$D,$A,'PRTD:�>'PROMPTCE�EQU‚*-1‰DS.W‚08REENTERS�DC.B‚$D,$A,'PRTD:�REENTER�OUTPUT�DEVICE�NAME�>'REENTERE�EQU‚*-1‰DS.W�0RETRYSƒDC.B‚'RETRY?�(Y/N)>'RETRYEƒEQUƒ*-1‰DS.W‚0 BRKRCVƒDC.B‚'PRTD:�BREAK�RVCD!!'BRKRCVE‚EQUƒ*-1‰DS.W‚0%SGNMSGƒDC.B‚'PRTD:�SEGMENT�NOT�FOUND'SGNMSGE‚EQUƒ*-1‰DS.W‚0MGBADAR‚DC.B‚'PRTD:‚ADDRESS�')MGBADAD‚DC.B‚'XXXXXX�IS�NOT�PART�OF�TASK' ‰DC.B‚$60‰DC.B‚'S�MEMORY�SPACE'MGBADARE�EQUƒ*-1**!HELPMSGS�DC.B�'PRTDUMP„REVISION�'5REV_COPY�DC.B�'ˆ',CR,LF‰WE�MOVE�REVISION�DATA�TO�HERE"‰DC.B�'COMMAND�LINE�FORMAT:',CR,LF?‰DC.B�'ƒPRTDUMP��[,#]�[;]',CR,LF‰DC.B�'OPTIONS:',CR,LF‰DC.B�'ƒA�=�ALL„R�=�RAM',CR,LF‰DC.B�'INPUT�COMMANDS:',CR,LFB„DC.B�'ƒAD†�[,]�[]',CR,LF‰DC.B�'ƒALL',CR,LF‰DC.B�'ƒHELP',CR,LF>„DC.B�'ƒMD†�[,]�[]',CR,LF‰DC.B�'ƒOFFSET‚',CR,LF#‰DC.B�'ƒOUTPUT‚#',CR,LF‰DC.B�'ƒQUIT',CR,LF‰DC.B�'ƒRAM',CR,LF‰DC.B�'ƒREGS',CR,LF!‰DC.B�'ƒSEGM„',CR,LF‰DC.B�'ƒTCB',CR,LFHELPMSGE EQU *-1‰PAGE* *…MESSAGES�SENT�TO�OUTPUT�DEVICE*‰DS.W‚0PAGSLEWS�DC.W‚$200CMGTCB1ƒDC.B‚CR,LF!‰FLDƒPTASK,<'�DUMP�OF�TASK�'>,4,C‰FLDƒPSESN,<'('>,4,C‰FLDƒPPRI1,<')�PRI�$'>,2,C‰FLDƒPPRI2,<',$'>,2,C‰FLDƒPUSER,<'‚USER�'>,4,C‰FLDƒPDATE,<'‚DATE�'>,2,C‰FLDƒPTIME,<'/XX/XX‚TIME�'>,2,C‰DC.B‚':XX:XX'‰DC.B‚CR,LF,LFMGTCB1E‚EQUƒ*-1PAGSLEWE�EQUƒ*-1*‰DS.W‚0 MGTCB2ƒEQUƒ* MGTCB2A‚EQUƒ* MGTCB2B‚EQUƒ*‰FLDƒPENTRY,<'�ENTRY�LOC�'>,6,C"‰FLDƒPMONTK,<'‚MONITOR�TASK�'>,4,C‰FLDƒPMONSN,<'('>,4,C ‰DC.B‚')'MGTCB2E‚EQUƒ*-1‰FLDƒPASQAD,<'ƒASQ�AT�'>,6,CMGTCB2AE�EQUƒ*-1‰FLDƒPCCBAD,<'‚CCB�AT�'>,6,CMGTCB2BE�EQUƒ*-1*‰DS.W‚0MGTCB3ƒDC.B‚CR,LF"‰FLDƒPTRAPV,<'�TRAP�VECTORS�'>,6,C ‰FLDƒPEXCPV,<'ƒEXCP�VECTORS�'>,6MGTCB3E‚EQUƒ*-1‰DS.W‚0**„SEGMENT�INFORMATION�LINE*!MSGSEGM‚FLDƒMGSGNAM,<'�SEG='>,4,C‰FLDƒMGSGFRL,<'�FR�'>,6,C‰FLDƒMGSGFRP,<'�(PHY�'>,6,C‰FLDƒMGSGTOL,<')�TO�'>,6,C‰FLDƒMGSGTOP,<'�(PHY�'>,6,C‰FLDƒMGSGSIZ,<')�'>,6,C‰FLDƒMGSGATTR,<'�BYTES�'>,9,CMSGSEGME�EQUƒ*-1*‰DS.W‚0MSGCRLF‚DC.B‚$20,$20,CR,LFMSGCRLFE�EQUƒ*-1**„ABORT�MESSAGE*‰DS.W‚0 MSGAC1ƒEQUƒ* MSGAC2ƒEQUƒ*‰FLDƒMGTSK,<'�'>,4,C ‰FLDƒMGTSK2,<'�ABORTED�BY�'>,4,C‰FLDƒMGACOD,<'�CODE�'>,4,CMSGAC1E‚EQUƒ*-1‰FLDƒMGATYP,<'‚'>,4,C‰FLDƒMGASTK1,<'�ERROR�'>,4,C‰FLDƒMGASTK2,<'�'>,8,C‰FLDƒMGASTK3,<'�'>,4,CMSGAC2E‚EQUƒ*-1MSGBUSƒDC.B‚'�BUS'MSGADRƒDC.B‚'ADDR'**„PRINT�REGISTERS*‰DS.W‚0MSGR1„DC.B‚CR,LF‰FLDƒMGPC,<'�PC�'>,8,C‰FLDƒMGSR,<'‚SR�'>,4‰DC.B‚LFMSGD1„FLDƒMGD0,<'�D0�'>,8,C‰FLDƒMGD1,<'ƒD1�'>,8,C‰FLDƒMGD2,<'ƒD2�'>,8,C‰FLDƒMGD3,<'ƒD3�'>,8‰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�'>,8MSGR1EƒEQUƒ*-1*‰DS.W‚0SAMEABOV�DC.B�'Œ'?‰DC.B�'********************�SAME�AS�ABOVE�********************' ‰DC.B�'�'‰PAGE**ƒOPERATOR�INPUT�COMMANDS* CMDTBL‚EQUƒ*ˆDC.L‚'TCB�',PTCBX-BEGINˆDC.L‚'ALL�',PALLD-BEGINˆDC.L‚'MD‚',PMDMP-BEGINˆDC.L‚'ADRD',PADMP-BEGINˆDC.L‚'OFFS',OFFSET-BEGINˆDC.L‚'OUTP',CHGOUT-BEGINˆDC.L‚'RAM�',PRAMD-BEGINˆDC.L‚'REGS',PREGS-BEGINˆDC.L‚'SEGM',PSEGM-BEGINˆDC.L‚'HELP',HELP-BEGINˆDC.L‚'QUIT',QUIT-BEGIN CMDTBLE�EQUƒ*ˆPAGE*C*‡SEGMENT�TABLE�--�WE�BUILD�THIS�WITH�INFO�FROM�TASK�SEGMENT�TABLES* ‰OFFSETƒ0SEGNAME‚DS.L‚1�NAME'SEGLADD‚DS.L‚1�LOGICAL‚STARTING�ADDRESS(SEGPADD‚DS.L‚1�PHYSICAL�STARTING�ADDRESSSEGSIZE‚DS.L‚1�LENGTH�IN�BYTESSEGTYPE‚DS.W‚1�1�=�RAM,‚3�=�ROM1SEGATTR‚DS.W‚1�ATTRIBUTES�(RAM/ROM,�SHAREABILITY)8SEGRECD‚DS.W‚1�RECORD�#�WHERE�SEGMENT�STARTS�IN�DUMPFILESEGENTSZ�EQUƒ** ‰SECTION‚0SEGTABL‚DCB.B‚SEGENTSZ*8,0****ƒBUFFERS,�ETC.*‰DS.W�0MAXBUFƒEQU�$400*TABLBUF‚DS.B‚$200*, %INPTBUF‚DS.B‚80ŒHOLDS�OPERATOR�INPUT.INPTBUFE�EQUƒ*-1‹**‰DS.B‚1�THIS�EXTRA�BYTE�IS�FOR�SBARG'S�CR.*‰DS.W‚0HOLDLIN‚DS.B‚16*PRTLINƒDS.B‚80*.RBUF…DS.B‚$100ŠHOLDS�LOADER�INFORMATION�BLOCK. RBUFE„EQUƒ*-1*RDBUF„DS.B‚MAXBUFˆ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‰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<*************************************************************#*ˆPROGRAM�SECTION�FORƒP�R�T�D�U�M�P*<************************************************************ (ŒXREFƒPARSE,EDITFILE,SBARG,DATEOG,OPTION BEGIN‡EQU„* PRTDUMP…EQU„*ŒLEA„PBA(PC),A7%ŒMOVEM.L‚D0-D7/A0-A2,INITDREG-PBA(A7) ‰MOVE.L„A7,A5‰LEA�STACK-PBA(A5),A7'*œA5�WILL�HOLD�THE�PROGRAM�BASE�ADDRESS!*§USED�FOR�POSITION-INDEPENDENCE. 7‰BSR�SET_ADDRˆPUT�ADDRESSES�INTO�PARAMETER�BLOCKS,�ETC. ‰ERQ.GTASQ�ASQPB-PBA(A5)2*œTRY�TO�CLAIM�BREAKS.‚IF�WE�CAN'T�BECAUSE�WE�WERE‰IOSCALL‚BRKIOS-PBA(A5)&*œCALLED�FROM�A�CHAIN�FILE,�THAT'S�OK.%‰IF��AND.B�D0��#ISTATM�THEN.S9‹BRA�FATALERR†(NOTE:‚IF�IOS�HAS�BEEN�FIXED,�THE�CHECK�FOR‰ENDI�ISTATM�CAN�BE�REMOVED.)**†PARSE�THE�COMMAND�LINE*DUMPA2†LEA„CLINE-PBA(A5),A0 ŒBSR„PARSE ŒTST.L‚D0 ŒBMI�ERINVAL%DUMPA8†MOVEM.L‚A1-A2,PARSAREG-PBA(A5)**†SET�UP�OUTPUT�DEVICE* ŒMOVE.L‚A1,D0'ŒBEQ.SƒDUMPA12…BRANCH�IF�NONE�SPECIFIED ŒBSR…NEWOUT**‡SET�UP�INPUT�FILE*DUMPA12…BSR…NEWIN*)*‡READ�TASK�CONTROL�BLOCK�-�1ST�2�RECORDS*ŒRD…#512,#-1,SAV- ETCB,FATALERR*>*…MOVE�TASK�NAME,�SESSN,�PRIORITIES�AND�USER�#�TO�HEADING�LINE*&‹MVASCƒ4,TCBNAME-PBA(A5),PTASK-PBA(A5)'‹MVASCƒ4,TCBSESSN-PBA(A5),PSESN-PBA(A5)‹MVHEXƒ1,TCBCPRI-PBA(A5),PPRI1 ‹MVHEXƒ1,TCBCPRI-PBA+1(A5),PPRI2‹MOVE.W‚TCBUSER-PBA(A5),D0‹LEA…PUSER-PBA(A5),A1 ‹BSR…CONVDEC4**†CONVERT�TIME�FOR�HEADING�LINE*6DUMPA18…MOVE.L‚TCBTIME-PBA(A5),D0ˆTIME�FROM�SYS�PARAMSŒDIVU„#1000*60,D0ŒSWAP„D0 ŒCLR.LƒD3ŒMOVE.W‚D0,D3ŠSECONDS*1000ŒDIVU„#1000,D3‡SECONDS ŒCLR.WƒD0ŒSWAP„D0ŽHOURS*60+MINUTES ŒDIVU„#60,D0 ŒMOVE.L‚D0,D2ŒSWAP„D2ŽMINUTESŒLEA…PTIME-PBA(A5),A1ŒBSR…CONVDEC2ˆCONVERT�HOURS ŒLEA…1(A1),A1 ŒMOVE.W‚D2,D0ŒBSR…CONVDEC2ˆCONVERT�MINUTES ŒLEA…1(A1),A1 ŒMOVE.W‚D3,D0ŒBSR…CONVDEC2ˆCONVERT�SECONDS**…CONVERT�DATE�FOR�HEADING�LINE*6ˆMOVE.L‚TCBDATE-PBA(A5),D0ˆGET�DATE�FROM�SYSTEM�PARAMS ˆBSR…DATEOGŒCONVERT�TO�GREGORIANˆMOVE.L„D0,D1‹SAVE�ALL�FIELDSˆLEA…PDATE-PBA+3(A5),A1ˆBSR…CONVDEC2‹CONVERT�DAY ˆMOVE.L‚D1,D0 ˆLSR.Lƒ#8,D0ˆLEA…PDATE-PBA(A5),A1ˆBSR…CONVDEC2ŠCONVERT�MONTH ˆMOVE.L‚D1,D0ˆSWAP„D0ˆSUB.Wƒ#1900,D0ˆLEA…PDATE-PBA+6(A5),A1ˆBSR…CONVDEC2ŠCONVERT�YEAR*1*…BUILD�TABLE�OF�ADDRESSES�AND�RANDOM�REC�NUMBERS*&ˆLEA…SEGTABL-PBA(A5),A4„START�OF�TABLEˆMOVE.L‚#2,D3‰1ST�RAND�REC�#7*ˆ***�NOTE:�SEGMENTS�ARE�DUMPED�RAM�FIRST,�THEN�ROM�***,BILDA2‚MOVE.W‚#1,SEGTYPE(A4)ƒSET�TYPE�TO�RAM ˆBSR.SƒBLDGTRAM†FIND�RAM�SEGMENTˆBNE.SƒBILDA4ˆBRANCH�IF�FOUND ˆBSR.SƒBLDGTROM†FIND�ROM�SEGMENT(ˆBEQ.SƒBILDA6ˆBRANCH�IF�NO�MORE�SEGMENTS(ˆADD.Wƒ#2,SEGTYPE(A4)‚CHANGE�TYPE�TO�ROM*0BILDA4‚MOVE.L‚(A3),SEGNAME(A4)‚SAVE�SEGMENT�NAME+ˆMOVE.L‚A1,SEGLADD(A4)„SAVE�LOGICAL‚ADDRESS,ˆMOVE.L‚A2,SEGPADD(A4)„SAVE�PHYSICAL�ADDRESS1ˆMOVE.L‚D1,SEGSIZE(A4)„SAVE�SEGMENT�SIZE�IN�BYTESAˆMOVE.W‚D3,SEGRECD(A4)„SAVE�RECORD�#�WHERE�SEG�STARTS�IN�DUMPFILE.ˆMOVE.W‚D0,SEGATTR(A4)„SAVE�SEGMENT�ATTRIBUTES&ˆLSR.Lƒ#8,D1�CONVERT�SIZE�TO�#�RECORDS-ˆADD.LƒD1,D3�ADD�TO�RECORD�#�(START�NEXT�SEG)%ˆLEA…SEGENTSZ(A4),A4ƒNEXT�TABLE�ENTRY ˆBRA…BILDA2ŒGO�BACK�FOR�NEXT�SEG**BILDA6‚CLR.WƒSEGTYPE(A4)‡FLAG�END�OF�TABLE*D*‡PERFORM�SPECIFIED�OPTION,�OR�GO�TO�COMMAND�PROC�IF�THERE�ARE�NONE.*ˆMOVE.L‚OPTSRT-PBA(A5),A2.*œGET�THE�PATTERN�OF�OPTIONS�SELECTED�INTO�D7.9ˆBSR…CKFOROPT…IF�NO�OPTIONS,�GO�TO�THE�COMMAND�PROCESSOR. ˆTST.LƒD7‹* ˆBEQ…CMDPRO‡* =ˆCMP.Bƒ#1<<0,D7…IF�OPTION�A�(BIT�0�SET),�GO�TO�'ALL'�ROUTINE. ˆBEQ…PALLDˆ* =ˆCMP.Wƒ#1<<1,D7…IF�OPTION�R�(BIT�1�SET),�GO�TO�'RAM'�ROUTINE. ˆBEQ…PRAMDˆ* :ˆBRA…EROPTCON…MUST�BE�A�COMBINATION,�WHICH�IS�NOT�ALLOWED.*)*…FIND�AND�PROCESS�ONE�SEGMENT�DESCRIPTOR*#BLDGTRAM�MOVE.L‚#1,D1ˆRAM�INDICATOR ‰BRA.SƒBLDGT2#BLDGTROM�MOVE.L‚#3,D1ˆROM�INDICATOR*5BLDGT2ƒLEA…TSTMMU-PBA(A5),A2…END�OF�SEARCH�INDICATOR.)‰LEA…TSTMMU-PBA+32(A5),A0‚END�OF�MMU�LIST&BLDGT3ƒLEA…-8(A0),A0…MMU�ENTRY�POINTER&‰CMP.WƒTSTCTL(A0),D1�DOES�ENTRY�EXIST?‰BEQ.SƒBLDGT4ˆBRANCH�IF�YES‰CMP.LƒA2,A0‰END�OF�SEARCH?‰BNE…BLDGT3ˆBRANCH�IF�NO'‰BRA.SƒBLDGT5ˆRETURN�-�NO�SEGMENT�FOUND*/BLDGT4ƒMOVE.W‚36(A0),D0…SAVE�SEGMENT�ATTRIBUTES$‰BSET„#5,TSTCTL(A0)�FLAG�ENTRY�FOUND+‰LEA…32(A0),A3…SAVE�ADDRESS�OF�SEGMENT�NAME 3‰CLR.LƒD1ŒCONVERT�STARTING�LOGICAL�PAGE�TO�STARTING4‰MOVE.W‚TSTLB(A0),D1‚LOGICAL�ADDRESS�AND�SAVE�IN�A1.‰LSL.Lƒ#8,D1‰*‰MOVE.L‚D1,A1‰* 0‰CLR.LƒD1ŒCOMPUTE�STARTING�PHYSICAL�ADDRESS�FROMA‰MOVE.W‚TSTPO(A0),D1‚PHYSICAL�OFFSET�(PAGES)�AND�STARTING�LOGICAL$‰LSL.Lƒ#8,D1‰ADDRESS�AND�SAVE�IN�A2.‰LEA…(A1,D1.L),A2‚* (‰CLR.LƒD1ŒCOMPUTE�#�OF�PAGES�IN�SEGMENT,5‰MOVE.W‚TSTLE(A0),D1‚CONVERT�TO�BYTES�AND�SAVE�IN�D1.‰SUB.Wƒ(A0),D1‡*‰ADD.Wƒ#1,D1‰*‰LSL.Lƒ#8,D1‰* BLDGT5ƒRTS‰PAGE*?*‚PUT�ADDRESSES�INTO�PARAMETER�BLOCKS.‚ALL�REGISTERS�PRESERVED.* SET_ADDR: ,‰MOVEM.L�A0/A1,-(A7)‹SAVE�REGISTERS�A0�&�A1. 4‰LEA�ANSBRK(PC),A1�ADDRESS�OF�BREAK�SERVICE�ROUTINE.‰MOVE.L�A1,ASRADDR-PBA(A5)…*‰MOVE.L�A1,ASRADDR2-PBA(A5)„* :‰LEA�MSGIIOS-PBA(A5),A0ˆPUT�ADDRESS�OF�BUFFER�FOR�OPERATOR9‰LEA�INPTBUF-PBA(A5),A1ˆINPUT�INTO�INPUT�IOS�PARAM�B- LOCK.‰MOVE.L�A1,IOSSAD(A0)Š*‰LEA�INPTBUFE-PBA(A5),A1‡*‰MOVE.L�A1,IOSEAD(A0)Š* 8‰LEA�RBLKIOS-PBA(A5),A0ˆPUT�ADDRESS�OF�BUFFER�FOR�LOADER4‰LEA�RBUF-PBA(A5),A1‹INFORMATION�BLOCK�INTO�THE�DISK+‰MOVE.L�A1,IOSSAD(A0)ŠREAD�IOS�PARAM�BLOCK.‰LEA�RBUFE-PBA(A5),A1Š*‰MOVE.L�A1,IOSEAD(A0)Š* 2‰MOVEM.L�(A7)+,A0/A1‹RESTORE�REGISTERS�AND�RETURN.‰RTS›*‰PAGEL*****************************************************************************&*‘***�ROUTINE�TO�CHECK�FOR�OPTIONS�**** *ˆON�CALL:4*ŠA2.L‚<--‚ADDRESS�OF�OPTIONS�FIELD�IN�COMMAND�LINE. *ˆON�RETURN:'*ŠD7.L‚<--‚PATTERN�OF�OPTIONS�SELECTED.5*ŠA2.L‚<--‚ADDRESS�OF�BYTE�JUST�BEYOND�OPTIONS�FIELD. *ŠALL�OTHER�REGISTERS�PRESERVED.*ˆSIDE�EFFECTS:>*ŠTERMINATES�VIA�ERROR�MESSAGE�HANDLER�IF�UNRECOGNIZED�OPTION.*L*****************************************************************************TEST_FOR MACRO‰IF.B‚D1��#'\1'‚THEN.S‹OR.L„#1<<\2,D7 ‹BRA…CKFOR1‹ENDI‰ENDM** CKFOROPT: ;‰MOVEM.LƒD0-D4/A3-A4,-(A7)ƒSAVE�REGISTERS�USED�BY�'OPTION'. 1‰CLR.L…D7ˆINITIALIZE�THE�OPTION�PATTERN�REGISTER. /‰IF�A2��#0‚THEN.S‚IF�THERE�ARE�ANY�OPTIONS, :CKFOR1…BSR…OPTION„GET�THE�NEXT�OPTION�IN�THE�COMMAND�LINE.&‹BTST„#6,D0…EXIT�IF�THERE�ARE�NO�MORE.‹BNE.SƒCKFOR9„* 3*’***�USER�ENTERS�CODE�FOR�VARIOUS�OPTIONS�HERE�***&‹TEST_FOR‚A,0…IF�'A',�SET�BIT�0�OF�D7.&‹TEST_FOR‚R,1…IF�'R',�SET�BIT�1�OF�D7.**-‹BRA‡EROPTINVŠIF�YOU�GOT�TO�HERE,�IT�WASN'T�A*§VALID�OPTION.*‰ENDI >CKFOR9ƒMOVEM.L�(A7)+,D0-D4/A3-A4…RESTORE�REGISTERS�AND�RETURN.‰RTS‰PAGE**‡RESPOND�TO�BREAK* ANSBRK‚EQU‚*ˆERQ.RDEVNT‚INPTBUF-PBA(A5)!ˆLEA‚STACK-PBA(A5),A7ŠRESET�STACKˆERQ.SETASQ‚#7ˆMESG‚BRKRCV,BRKRCVE ˆBRA.S�CMDPROˆSPC‚2**‡DISK�ERROR�ROUTINE*>PDSKERS�TST.L�D0�IF�D0�=�0�THE�ERROR�IS�NOT�FROM�IOS,�SO�DON'T>ˆBEQ.S�CMDPRO‰CALL�THE�ERROR�MESSAGE�HANDLER�(E.G.�THE�ADDRESS,ˆBSR�C_EM_PGM‰MIGHT�HAVE�BEEN�OUT�OF�RANGE). **’***�NOTE--CMDPRO�(COMMAND�PROCESSOR)�***(*’***�MUST�BE�IMMEDIATELY�AFTER�THISƒ***ŒPAGE*!*…COMMAND�LINE�PROCESSING�ROUTINE*‡-�PUTS�OUT�PROMPT*‡-�READS�COMMAND�FROM�KEYBOARD%*‡-�CALLS�APPROPRIATE�COMMAND�PROCESS*‡-�HAS�ERROR�RETURN* CMDPROƒEQU‚*>‰LEA„STACK-PBA(A5),A7‚RESET�STACK�-�CAN�GET�HERE�FROM�ANYWHERE‰LEA„CMDTBLE-PBA(A5),A4‰INPUT‚PROMPTCS,PROMPTCE‰BNE.S�CMDPABRT ‰BSR�SBARG ‰BEQ.S�CMDPR2 ‰BSR�C_EM_PGM ‰BRA�CMDPRO*%*…SEARCH�FOR�COMMAND�IN�COMMAND�TABLE*+CMDPR2ƒLEAƒCMDTBL-PBA(A5),A3‰START�OF�TABLE"‰LEAƒINPTBUF-PBA(A5),A2ˆINPUT�LINE'CMDPR4ƒCMP.B‚#$D,(A2)‰IS�1ST�CHAR�A�CR?‰BEQ.S�CMDPWHATŠBRANCH�IF�YES%‰CMP.B‚#'�',(A2)+‡SKIP�LEADING�BLANKS ‰BEQƒCMDPR4*CMDPR6ƒEQU„*�START�SEARCH'‰LEA„-1(A2),A0‡START�OF�COMMAND�ENTERED"‰MOVE.L�A3,A1‹NEXT�CMD�TABLE�ENTRY#‰MOVE.B�(A0)+,D0ˆFIRST�BYTE�ENTERED"‰CMP.B‚(A1)+,D0ˆMATCH�TABLE�ENTRY?‰BNE.S‚CMDPR9ŠBRANCH�IF�NO"‰MOVE.L‚#3,D1ŠCOMPARE�3�MORE�CHARS(CMDPR7ƒMOVE.B‚(A0)+,D0‡NEXT�CHAR�ENTERED‰CMP.Bƒ#'�',D0ˆIS�IT�A�BLANK?#‰BEQ.SƒCMDPR20ˆIF�YES�-�FOUND�MATCH‰CMP.Bƒ#$D,D0‰IS�IT�A�CR?#‰BEQ.SƒCMDPR16ˆIF�YES�-�FOUND�MATCH$‰CMP.Bƒ(A1)+,D0‡MATCH�CHAR�IN�TABLE?‰BNE.SƒCMDPR9‰BRANCH�IF�NO!‰SUB.Lƒ#1,D1ŠDECREMENT�CHAR�COUNT&‰BNE…CMDPR7‰GO�BACK�TO�CHECK�NEXT�CHAR‰BRA.SƒCMDPR12ˆFOUND�COMMAND*0CMDPR9ƒADD.Lƒ#8,A3ŠINCREMENT�TO�NEXT�TABLE�ENTRY‰CMP.LƒA4,A3ŠEND�OF�TABLE?‰BNE…CMDPR6‰BRANCH�BACK�IF�NO‰BRA.SƒCMDPWHAT‡GO�SAY�WHAT?*-*†FOUND�COMMAND�IN�TABLE�-�GO�TO�SPEC�ROUTINE* CMDPR12‚EQU…*$‰MOVE.B‚(A0)+,D0‡FIND�END�OF�COMMAND‰CMP.Bƒ#$D,D0‰IS�IT�A�CR?‰BEQ.SƒCMDPR16ˆBRANCH�IF�YES‰CMP.Bƒ#'�',D0ˆIS�IT�A�BLANK?'‰BNE…CMDPR12ˆIF�NO�-�GO�CHECK�NEXT�CHAR‰BRA.SƒCMDPR20 CMDPR16‚EQU…*%‰LEA…0,A0‹INPUT�LINE�HAS�NO�MORE�INFO CCMDPR20‚MOVE.L‚4(A3),A3‰COMPUTE�ADDRESS�OF�ROUTINE�BY�ADDING�OFFSET@‰LEA…BEGIN-PBA(A5),A4�FROM�LABEL�'BEGIN'�(STORED�IN�TABLE)�TO�PC‰ADD.LƒA4,A3ŠFOR�LABEL�'BEGIN'. ‰JMP…(A3)‹GO�TO�ROUTINE�SELECTED**„COMMAND�NOT�UNDERSTOOD*CMDPWHAT�EQU…* ‰BSR…INVAL ‰BRA…CMDPRO**…CANNOT�COMMUNICATE�W. ITH�USER*CMDPABRT�EQU„*5‰SUB.W‚#1,FATLCNT-PBA(A5)‚HAVE�WE�TRIED�ENOUGH�TIMES?‰BNE„CMDPRO‹BRANCH�IF�NOCMDPABTF�ERQ.ABORT‚#$200‰PAGE**ˆPRINT�HELP�MESSAGE*HELP: 0‰LEA�REV-PBA(A5),A0–MOVE�REVISION�INFO�(8�BYTES)4‰LEA�REV_COPY-PBA(A5),A1‘FROM�TOP�OF�PROGRAM�TO�HELP‰MOVE.L�(A0)+,(A1)+–MESSAGE.‰MOVE.L�(A0),(A1)˜* -‰LEA�MSGIOS-PBA(A5),A0›TEMPORARILY�SET�UP�FOR/‰MOVE.W�#IOPIMG+IOPCNP,IOSOPT(A0)ˆIMAGE�OUTPUT. 0‰MESG�HELPMSGS,HELPMSGE’OUTPUT�THE�HELP�MESSAGE. 6‰MOVE.W�#IOPCNP,IOSOPT(A0)�RESTORE�TO�FORMATTED�OUTPUT$‰CLR.L�D0 AND�RETURN�WITH�OK�STATUS. ‰BRA�CMDPROž* ˆPAGE**‡CHANGE�TO�NEW�OUTPUT�DEVICE* CHGOUT‚EQU„*,ˆMOVE.L‚A0,OUTPSRT-PBA(A5)‚USER'S�INPUT�LINE ˆBSR…NEWOUT ˆBRA…CMDPRO**…SET�DEFAULT�OFFSET�VALUE* OFFSETƒEQU…*‰LEA…ADROFST1-PBA(A5),A1‰BSR.SƒOFFSETC ‰BNE…CMDPWHAT ‰BRA…CMDPRO* OFFSETC‚EQU…*‰BSR…HEXBIN‰CONVERT�TO�BINARY‰BNE.SƒOFFSETCR‡BRANCH�IF�ERROR ‰MOVE.L‚(A1),D0ˆGET�BINARY�VALUE'‰LSL.Lƒ#8,D0ŠSHIFT�TO�SET�BIT�15�IF�NEG‰ASR.Lƒ#8,D0ŠEXTEND�SIGN$‰MOVE.L‚D0,A6ŠEXTEND�SIGN�TO�32�BITS‰MOVE.L‚A6,(A1)ˆPUT�IT�BACK‰CLR.LƒD0ŒGOOD�RETURN�FLAG OFFSETCR RTS*+*†USER�SAYS�QUIT�--�TERMINATE�WITHOUT�ERROR8*†(NOTE:‚WE�TERMINATE�IMMEDIATELY�IF�ERROR�OCCURS�AND�WE"*‡ARE�BEING�RUN�FROM�A�CHAINFILE.)* QUIT…EQU„* ‰ERQ.TERM‰PAGE**†DUMP�ALL�OF�TASK*(PRAMD„MOVE.W�#3,D4‰TYPE�3�IS�ROM�SEGMENT ‰BRA.S‚PALLD1PALLD„CLR.W‚D4PALLD1ƒBSR„NEWPAGE#‰BSR„DSPTCBˆDUMP�TASK�CONTROL�BLOCK.‰LEA„SEGTABL-PBA(A5),A4„START�OF�SEGMENT�TABLE*PALLD2ƒTST.W‚SEGTYPE(A4)ƒDOES�ENTRY�EXIST?(‰BEQ.S‚PALLD4ˆBRANCH�IF�NO�MORE�SEGMENTS‰CMP.W‚SEGTYPE(A4),D4 ‰BEQ.S‚PALLD4‰BSR„DMPSEGˆDUMP�1�SEGMENT‰LEA„SEGENTSZ(A4),A4ƒNEXT�ENTRY ‰BRA„PALLD22PALLD4ƒTST.L‚OPTSRT-PBA(A5)�WAS�ALL�OPTION�CHOSEN?‰BNE„QUIT‹IF�YES�-�QUIT‰BRA„CMDPRO‰GO�GET�NEXT�COMMAND**…PRINT�REGISTERS* PREGS„EQU„* ‰BSR„NEWPAGE‰PRINT‚MSGCRLF‰BSR„DSPREGS†GO�DIPLAY�REGS‰PRINT‚MSGCRLF ‰BRA„CMDPRO**†PRINT�TCB�INFO* PTCBX„EQU„* ‰BSR„NEWPAGE‰BSR.S‚DSPTCB†DISPLAY�TCB ‰BRA„CMDPRO‰PAGE**†DUMP�ONE�SEGMENT* PSEGM„EQU„*!‰MOVE.L�A0,D0‡TEST�BUFFER�ADDRESS%‰BEQ.S‚PSEGM8†BRANCH�IF�NO�NAME�GIVENPSEGM1ƒMOVE.B�(A0)+,D0"‰CMP.B‚#'�',D0…SKIP�LEADING�BLANKS ‰BEQ„PSEGM19‰LEA„INPTBUF-PBA(A5),A1‚STORE�NAME�AT�BEGINNING�OF�BUFFER‰MOVE.L‚#4,D1†4�CHARS ‰BRA.S‚PSEGM3!PSEGM2ƒMOVE.B�(A0)+,D0„GET�1�CHAR(PSEGM3ƒCMP.B‚#CR,D0†IS�THIS�END�OF�LINE?‰BNE.S‚PSEGM4†BRANCH�IF�NO#‰MOVE.B�D0,(A0)…MOVE�CR�TO�NEXT�POS%‰MOVE.B�#'�',D0…REPLACE�CR�WITH�BLANK*PSEGM4ƒMOVE.B�D0,(A1)+„SAVE�1�CHAR�OF�NAME‰SUB.L‚#1,D1‡COUNT�CHARACTERS ‰BNE„PSEGM2*.‰LEA„SEGTABL-PBA(A5),A4‚START�OF�SEGMENT�TABLE'‰MOVE.L‚INPTBUF-PBA(A5),D0„SEGMENT�NAME,PSEGM6ƒCMP.L‚SEGNAME(A4),D0„DOES�NAME�MATCH?#‰BEQ.S‚PSEGM9‡YES�-�GO�DUMP�SEGMENT%‰LEA„SEGENTSZ(A4),A4„NEXT�TABLE�ENTRY$‰TST.W‚SEGTYPE(A4)„DOES�ENTRY�EXIST?‰BNE„PSEGM6‰KEEP�LOOKING*(PSEGM8ƒMESGƒSGNMSG,SGNMSGE†ERROR�MESSAGE ‰BRA„CMDPRO*(PSEGM9ƒBSR„DMPSEGˆDUMP�SEGMENT�ASKED�FOR ‰BRA„CMDPRO‰PAGE*%*…SUBROUTINE�TO�PRINT�TCB�INFORMATION* DSPTCBƒEQU„*4‰TST.W‚PRINTER-PBA(A5)ƒWAS�1ST�LINE�ALREADY�PRINTED?‰BNE.S‚DSPTCB2‡BRANCH�IF�YES‰PRINT‚MGTCB1ˆ1ST�LINE*'DSPTCB2‚MVHEX‚3,TCBENTRY-PBA(A5),PENTRY&‰MVASC‚4,TCBMON-PBA(A5),PMONTK-PBA(A5)(‰MVASC‚4,TCBMON-PBA+4(A5),PMONSN-PBA(A5)&‰TST.L‚TCBCHAN-PBA(A5)ƒDOES�CCB�EXIST?‰BNE.S‚DSPTCB2A†BRANCH�IF�YES%‰TST.L‚TCBASQ-PBA(A5)‚DOES�ASQ�EXIST?‰BNE.S‚DSPTCB2A†BRANCH�IF�YES-‰PRINTF‚MGTCB2‡PRINT�LINE�(ENTRY�AND�MONITOR)‰BRA.S‚DSPTCB3*&DSPTCB2A�MVHEX‚3,TCBASQ-PBA(A5),PASQAD&‰TST.L‚TCBCHAN-PBA(A5)‚DOES�CCB�EXIST?‰BNE.S‚DSPTCB2B3‰PRINTF‚MGTCB2A…PRINT�LINE�(ENTRY,�MONITOR�AND�ASQ)‰BRA.SƒDSPTCB3*'DSPTCB2B�MVHEX‚3,TCBCHAN-PBA(A5),PCCBAD8‰PRINTF‚MGTCB2B…PRINT�LINE�(ENTRY,�MONITOR,�ASQ�AND�CCB)*"DSPTCB3‚MOVE.L‚TCBTVECT-PBA(A5),D0-‰ADD.LƒTCBEVECT-PBA(A5),D0…CHECK�BOTH�VECTORS‰BEQ.SƒDSPTCB4‰BRANCH�IF�NONE ‰MVHEXƒ3,TCBTVECT-PBA(A5),PTRAPV ‰MVHEXƒ3,TCBEVECT-PBA(A5),PEXCPV ‰PRINTƒMGTCB3*,DSPT. CB4‚BSR.SƒDSPSEGS‡PRINT�LIST�OF�SEGMENTS ‰BSR…DSPABRT‡PRINT�ABORT�MESSAGE‰BSR…DSPREGS‡PRINT�REGISTERS‰RTS‰PAGE*5*…SUBROUTINE�TO�PRINT�NAMES�AND�ADDRESSES�OF�SEGMENTS*DSPSEGS‚PRINT‚MSGCRLF‹SPACE.‰LEA„SEGTABL-PBA(A5),A4ˆSTART�OF�SEGMENT�TABLE'DSPSEG2‚TST.W‚SEGTYPE(A4)‡END�OF�TABLE?‰BEQ„DSPSEGR‹BRANCH�IF�YES‰BSR.S‚DSP1SEG‹PRINT�1�LINE‰LEA„SEGENTSZ(A4),A4ƒNEXT�ENTRY ‰BRA„DSPSEG2*+DSP1SEG‚MVASC‚4,SEGNAME(A4),MGSGNAM-PBA(A5)‰MVHEX‚3,SEGLADD(A4),MGSGFRL‰MVHEX‚3,SEGPADD(A4),MGSGFRP‰MVHEX‚3,SEGSIZE(A4),MGSGSIZ 5‰MOVE.L‚SEGLADD(A4),D1ˆCOMPUTE�AND�FORMAT�LOGICAL�END‰ADD.LƒSEGSIZE(A4),D1ˆADDRESS.‰SUB.Lƒ#1,D1‘*‰MVHEX‚3,D1,MGSGTOL‹* 6‰MOVE.L‚SEGPADD(A4),D1ˆCOMPUTE�AND�FORMAT�PHYSICAL�END‰ADD.LƒSEGSIZE(A4),D1ˆADDRESS.‰SUB.Lƒ#1,D1‘*‰MVHEXƒ3,D1,MGSGTOPŠ* ?‰LEA�MGSGATTR-PBA(A5),A0‡LOAD�ADDRESS�OF�ATTRIBUTE�DESCRIPTIONS ?‰BTST.B�#14-8,SEGATTR(A4)†MOVE�TO�THAT�ADDRESS�EITHER�'READ'�OR‰IF‚‚THEN.SŽ'R/W�'.‹MOVE.L�#'READ',D0‹* ‰ELSE.S˜*‹MOVE.L�#'R/W�',D0‹*‰ENDIš*‰BSR.S�MOVED0’* ‰MOVE.B�#'�',(A0)+�ADD�A�SPACE. =‰BTST.B�#12-8,SEGATTR(A4)†MOVE�TO�THAT�ADDRESS�ONE�OF�'GSHR',‰IF‚‚THEN.SŽ'LSHR',�OR�'„'.‹MOVE.L�#'GSHR',D0‹* ‰ELSE.S˜*‹BTST.B�#13-8,SEGATTR(A4)„*‹IF‚‚THEN.SŒ*�MOVE.L�#'LSHR',D0‰* ‹ELSE.S–*�MOVE.L�#'„',D0‰*‹ENDI˜*‰ENDIš*‰BSR.S�MOVED0’* *‰PRINTF‚MSGSEGM�PRINT�THE�LINE�AND�RETURN. DSPSEGR‚RTS */*„SUBROUTINE�TO�MOVE�CHARACTERS�IN�D0�TO�BUFFER*„WHOSE�ADDRESS�IS�IN�A0.*MOVED0:2‰MOVE.L�#3,D1’INITIALIZE�LOOP�COUNTER�FOR�4�TIMES. 7MOVED0_1�ROL.L�#8,D0“ROTATE�THE�HIGH�BYTE�INTO�POSITION*‰MOVE.B�D0,(A0)+�AND�MOVE�INTO�THE�BUFFER. "‰DBRA�D1,MOVED0_1ŽDO�THIS�4�TIMES. ‰RTS‰PAGE**†SUBROUTINE�TO�DUMP�1�SEGMENT*‡A4�POINTS�TO�TABLE�ENTRY*DMPSEGƒBSRƒNEWPAGE‰PRINT�MSGCRLF‰BSRƒDSP1SEG…PRINT�ID�LINE‰PRINT�MSGCRLF6‰MOVE.L‚SEGLADD(A4),ADROFST2-PBA(A5)‚BEGINNING�ADDRESS ‰CLR.LƒADRBGND-PBA(A5)ŠNO�OFFSET3‰MOVE.L‚SEGSIZE(A4),CNTBYTE-PBA(A5)‚#�BYTES�TO�DUMP ‰BSR…PMDUMP‰RTS‰PAGE*#*…SUBROUTINE�TO�PRINT�ABORT�MESSAGE*"DSPABRT‚PRINT‚MSGCRLF…SPACE�OUTPUT&‰MVASC‚4,TCBNAME-PBA(A5),MGTSK-PBA(A5)'‰MVASC‚4,TCBATSK-PBA(A5),MGTSK2-PBA(A5) ‰MVHEX‚2,TCBABORT-PBA(A5),MGACOD‰CMP.L‚#'EXEC',TCBATSK-PBA(A5)‰BEQ.S‚DSPABR4DSPABR2‚PRINTF‚MSGAC1‰RTS*DSPABR4‚LEA„MSGBUS-PBA(A5),A4‰CMP.W‚#$8010,TCBABORT-PBA(A5)‰BEQ.S‚DSPABR6‰LEA„MSGADR-PBA(A5),A4‰CMP.W‚#$8011,TCBABORT-PBA(A5) ‰BNE„DSPABR2#DSPABR6‚MVASC‚4,(A4),MGATYP-PBA(A5) ‰MVHEX‚2,TCBBERR-PBA(A5),MGASTK1"‰MVHEX‚4,TCBBERR+2-PBA(A5),MGASTK2"‰MVHEX‚2,TCBBERR+6-PBA(A5),MGASTK3‰PRINTF‚MSGAC2‰RTS**„SUBROUTINE�TO�PRINT�REGISTERS*"DSPREGS‚MVHEX‚4,TCBPC-PBA(A5),MGPC‰MVHEX‚2,TCBSR-PBA(A5),MGSR*‰LEA„TCBD0-PBA(A5),A0‰LEA„MGD0-PBA(A5),A1‰MOVE.W‚#15,D5DSPREG2‚MOVE.L‚(A0)+,D0 ‰BSR„CONVHEX4 ‰LEA…6(A1),A1‰DBRAƒD5,DSPREG2 ‰PRINT‚MSGR1‰RTS‰PAGE**…DUMP�BLOCK�OF�MEMORY.*ˆA0�=�0�OR�POINTS�TO�PARAMETERS�ON�INPUT�LINE* PADMP„EQU„*<‰MOVE.L�ADROFST1-PBA(A5),ADROFST2-PBA(A5)‚GET�DEFAULT�OFFSET7‰LEA„ADRBGND-PBA(A5),A1‰PLACE�TO�PUT�DUMP�START�ADDRESS‰BSR„HEXBIN�CONVERT�ADDRESS-‰BMI„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�ADDRESS ‰BEQ.S‚PADMP2�BRANCH�IF�NO�COMMA,‰LEA„ADROFST2-PBA(A5),A1‚PLACE�TO�PUT�OFFSET‰BSR„OFFSETCŒCONVERT�OFFSET,‰BNE„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�OFFSET;PADMP2ƒLEA„CNTBYTE-PBA(A5),A1‰PLACE�TO�STORE�ENDING�ADDRESS"‰BSR„HEXBIN�CONVERT�ENDING�ADDRESS1‰BNE„CMDPWHAT‹BRANCH�IF�BAD�VALUE�FOR�END�ADDRESS*‰MOVE.L‚CNTBYTE-PBA(A5),D0ˆGET�END�ADDRESS2‰BNE.S‚PADMP3�IF�END�ADDRESS�=�0,�BYTE�COUNT�=�$F.‰MOVE.L�#$F,CNTBYTE-PBA(A5) ‰BRA.S�PMDMP3JPADMP3ƒSUB.LƒADRBGND-PBA(A5),D0�OTHERWISE�BYTE�COUNT�=�END�ADDR�-�BEG�ADDR‰BMI„CMDPWHAT‹CAN'T�BE�MINUS'‰MOVE.L�D0,CNTBYTE-PBA(A5)�SAVE�#�BYTES‰BRA.S‚PMDMP3�CONTINUE�DUMP* PMDMP„EQU„*<‰MOVE.L�ADROFST1-PBA(A5),ADROFST2-PBA(A5)„GET�DEFAULT�OFFSET7‰LEA„ADRBGND-PBA(A5),A1ŠPLACE�TO�PUT�DUMP�START�ADDRESS‰BSR„HEXBINŽCONVERT�ADDRESS-‰BMI/ „CMDPWHATŒBRANCH�IF�BAD�VALUE�FOR�ADDRESS ‰BEQ.S‚PMDMP2ŽBRANCH�IF�NO�COMMA,‰LEA„ADROFST2-PBA(A5),A1‰PLACE�TO�PUT�OFFSET‰BSR„OFFSETC�CONVERT�OFFSET,‰BNE„CMDPWHATŒBRANCH�IF�BAD�VALUE�FOR�OFFSET7PMDMP2ƒLEA„CNTBYTE-PBA(A5),A1ŠPLACE�TO�STORE�BYTE�COUNT‰BSR„HEXBINŽCONVERT�#�BYTES+‰BNE„CMDPWHATŒBRANCH�IF�BAD�VALUE�FOR�COUNT$PMDMP3ƒBSR„NEWPAGE�START�ON�NEW�PAGE‰BSR.S‚PMDUMPŽGO�PRINT�DUMP#‰BRA„CMDPROŽRETURM�FOR�NEXT�COMMAND‰PAGE*3*„PMDUMP‚-‚FORMAT�AND�PRINT�SPECIFIED�BLOCK�OF�DUMP*!*ˆADRBGND�=�ADDRESS�TO�START�DUMP*ˆADROFST2�=�OFFSET*ˆCNTBYTE‚=�NUMBER�OF�BYTES* PMDUMPƒEQU„*‰MOVEM.L‚A3-A4,-(A7))‰MOVE.L�CNTBYTE-PBA(A5),D0ŠGET�BYTE�COUNT ‰BNE.S‚PMDMP4ŽBRANCH�IF�NOT�ZERO ‰MOVE.L�#1,D0�MUST�BE�AT�LEAST�1PMDMP4ƒADD.L‚#$F,D0ŽADD�15/‰AND.B‚#$F0,D0�ALWAYS�DUMP�MULTIPLE�OF�16�BYTES‰MOVE.L‚D0,CNTBYTE-PBA(A5)**…READ�FROM�DISKETTE*‰CLR.LƒD7‘FLAG�1ST�LINE1PMDMP6ƒMOVE.L‚ADRBGND-PBA(A5),D1‰STARTING�ADDRESS%‰ADD.LƒADROFST2-PBA(A5),D1‰ADD�OFFSET!‰MOVE.L‚CNTBYTE-PBA(A5),D2‰LENGTH&‰BLE…PMDMP30ŒBRANCH�IF�NO�MORE�TO�DUMP.‰SUB.Lƒ#MAXBUF,CNTBYTE-PBA(A5)‚MAXIMUM�#�BYTES-‰BMI.SƒPMDMP8�BRANCH�IF�READ�IS�LESS�THAN�MAX#‰MOVE.L‚#MAXBUF,D2‰SET�COUNT�TO�MAX'PMDMP8ƒRD†D2,D1,RDBUF,PDSKERSƒREAD�DISK)‰LEA…RDBUF-PBA(A5),A3‹ADDRESS�TO�GET�DATA0‰MOVE.L‚ADRBGND-PBA(A5),A4‰ADDRESS�TO�START�DUMP‰MOVE.L‚D2,D6Ž#�BYTES�TO�DUMP**†FORMAT�AND�PRINT�DUMP�LINES*‰TST.W‚D7�CHECK�FOR�1ST�LINE!‰BEQ.S‚PMDMP14ˆBRANCH�IF�1ST�LINE(PMDMP10‚MOVE.L‚A3,A0‰POINTER�TO�16�BYTES6‰LEAƒHOLDLIN-PBA(A5),A1†BUFFER�WITH�PRECEDING�16�BYTES%‰MOVE.L‚#4,D0‰16�BYTES�=�4�LONG�WORDS)PMDMP12‚CMP.L‚(A0)+,(A1)+„COMPARE�4�BYTES!‰BNE.S‚PMDMP14ˆBRANCH�IF�NOT�SAME ‰SUB.L‚#1,D0 ‰BNE„PMDMP12"‰TST.W‚D7ŒHAS�'SAME'�BEEN�PRINTED?‰BMI.S‚PMDMP20‡BRANCH�IF�YES‰NOT.W‚D7ŒFLAG�'SAME'�PRINTED+‰LEA„SAMEABOV-PBA(A5),A1ƒADDRESS�OF�MESSAGE‰BSR„PRTL80ˆGO�PRINT�MESSAGE‰BRA.S‚PMDMP20* PMDMP14‚EQU„*!‰MOVE.L‚#1,D7ˆFLAG�-�NOT�1ST�LINE!‰MOVE.L‚A3,A0ˆADDRESS�OF�16�BYTES(‰LEA„HOLDLIN-PBA(A5),A1„SAVE�FOR�COMPARE‰MOVE.L‚(A0)+,(A1)+‰MOVE.L‚(A0)+,(A1)+‰MOVE.L‚(A0)+,(A1)+‰MOVE.L‚(A0)+,(A1)+**‰MOVE.L‚A3,A0‡ADDRESS�OF�16�BYTES�TO�PRINT.‰LEA…PRTLIN-PBA(A5),A1ƒADDRESS�OF�PRINT�BUFFER'‰MOVE.L‚A4,D0‡PHYSICAL�ADDRESS�TO�PRINT&‰MOVE.L‚A4,D1‡LOGICAL�ADDRESS�TO�PRINT6‰ADD.LƒADROFST2-PBA(A5),D0„ADD�OFFSET�TO�PHYSICAL�ADDR ‰BSR…FMTLIN†GO�FORMAT�PRINT�LINE‰LEA…PRTLIN-PBA(A5),A1‰BSR…PRTL80†PRINT�IT**„INCREMENT�TO�NEXT�LINE* PMDMP20‚EQU„* ‰ADD.L‚#16,A4 ‰ADD.L‚#16,A3‰SUB.L‚#16,D2†DECREMENT�#�BYTES‰BGT„PMDMP10…BRANCH�IF�MORE/‰MOVE.L�A4,ADRBGND-PBA(A5)…NEW�STARTING�ADDRESS‰BRA„PMDMP6†GO�READ�MORE*!*‡DUMP�FINISHED�-�CHECK�LAST�LINE* PMDMP30‚EQUƒ* ‰TST.W‚D7‰WAS�LAST�LINE�PRINTED?‰BPL.S‚PMDMP40„BRANCH�IF�YES(‰LEA„HOLDLIN-PBA(A5),A0‚CONTENTS�OF�LINE+‰LEA„PRTLIN-PBA(A5),A1ƒADDR�OF�PRINT�BUFFER&‰LEA„-16(A4),A4ƒBACK�UP�TO�GET�ADDRESS‰MOVE.L‚A4,D0‡PHYSICAL�ADDRESS‰MOVE.L‚A4,D1‡LOGICAL�ADDRESS9‰ADD.LƒADROFST2-PBA(A5),D0‚ADD�OFFSET�TO�PHYSICAL�ADDRESS ‰BSR…FMTLIN†GO�FORMAT�PRINT�LINE‰LEA…PRTLIN-PBA(A5),A1‰BSR…PRTL80†PRINT�ITPMDMP40‚MOVEM.L�(A7)+,A3-A4‰RTS‰PAGE*1*…MOVE�A�BLOCK�OF�MEMORY�FROM�DISK�TO�BUFFER�AREA*‡D1�=�STARTING�ADDRESS*‡D2�=�NUMBER�OF�BYTES*‡A1�=�ADDRESS�OF�BUFFER* MOVEMEM‚EQUƒ**9*„CHANGE�ADDRESS�IN�D1�TO�PSEUDO�ADDRESS�(RRN*256+OFFSET)*‰MOVEM.L‚D1-D2/A1/A4,-(A7)‰LEA†RBLKIOS-PBA(A5),A0MOVEM2ƒMOVEM.L‚D1-D2/A1,-(A7) ‰BSR†CNVADREC ‰BNE†MOVEMRT1‰MOVEM.L‚D3-D5/A2-A3,-(A7)‰MOVE.LƒD1,D3‡STARTING�ADDRESS ‰LSR.L„#8,D3‡CONVERT�TO�SECTOR�#‰MOVE.LƒD3,IOSRRN(A0)‰MOVE.LƒA1,A3‡ADDRESS�OF�BUFFER‰MOVE.LƒD2,D4‡LENGTH ‰MOVE.LƒD1,D5‡ADR�TO�D5�FOR�TEST/‰AND.L„#$FF,D5…DOES�MOVE�START�ON�PAGE�BOUNDRY?‰BEQ.S„MOVEM10…BRANCH�IF�YES/MOVEM4ƒLEA†RBUF-PBA(A5),A2…ADDRESS�TO�MOVE�FROM‰ADD.L„D5,A2‡START�HERE ‰NEG.L„D5/‰ADD.L„#$100,D5„#�BYTES�TO�MOVE�FROM�1ST�SECTOR‰LEA†RBUF-PBA(A5),A4'‰MOVE.LƒA4,IOSSAD(A0)�IOS�START�ADDRESS‰LEA†$FF(A4),A4%‰MOVE.LƒA4,IOSEAD(A0)�IOS�END�ADDRESS ‰CLR.L„D/ 09‰CMP.L„SAVERRN-PBA(A5),D3ŠIS�THIS�SAME�BLOCK�READ�BEFORE?‰BEQ.S„MOVEM6ˆBRANCH�IF�YES‰MOVE.Lƒ#-1,SAVERRN-PBA(A5)‰TRAP…#2$‰BNE.S„MOVEMEND‰BRANCH�IF�READ�ERROR1‰MOVE.LƒD3,SAVERRN-PBA(A5)ƒSAVE�RRN�FOR�NEXT�READMOVEM6ƒADD.L„#1,IOSRRN(A0) ‰ADD.L„#1,D3)‰CMP.L„D5,D4‡HAS�TOTAL�#�BYTES�BEEN�READ?‰BGT.S„MOVEM8†BRANCH�IF�NO ‰MOVE.LƒD4,D5‡SET�#�READ�=�TOTAL-MOVEM8ƒSUB.L„D5,D4‡SUBTRACT�#�READ�FROM�TOTAL(MOVEM9ƒMOVE.Bƒ(A2)+,(A3)+„MOVE�TO�BUFFER‰SUB.L„#1,D5‡DECREMENT�COUNT#‰BNE†MOVEM9†LOOP�BACK�FOR�NEXT�BYTE‰TST.L„D4ŠARE�WE�FINISHED?‰BEQ.S„MOVEMEND„BRANCH�IF�YESMOVEM10‚MOVE.LƒD4,D5‡BYTE�COUNT!‰CLR.B„D5ŠMUST�READ�WHOLE�SECTORS ‰TST.L„D5 ‰BEQ†MOVEM4!‰LSR.L„#8,D5‡CONVERT�TO�#�RECORDS+‰MOVE.LƒA3,IOSSAD(A0)†READ�DIRECT�TO�BUFFER&‰ADD.L„#255,A3‡ADD�255�FOR�END�OF�BUFF&‰MOVE.LƒA3,IOSEAD(A0)†END�BUFF�ADDRESS‰SUB.L„#1,A3ŠPOINT�TO�NEXT�PAGEMOVEM12‚TRAP…#2‰BNE.S„MOVEMEND…BRANCH�IF�ERROR ‰ADD.L„#1,D3‰MOVE.LƒD3,IOSRRN(A0)(‰ADD.L„#256,IOSSAD(A0)‚INCREMENT�ADDRESS&‰ADD.L„#256,IOSEAD(A0)‚END�ADDRESS�TOO ‰SUB.L„#1,D5‰BNE†MOVEM12„GO�READ�NEXT�REC ‰AND.W„#$FF,D4…ANY�MORE�TO�READ?‰BNE†MOVEM4†BRANCH�IF�YES*MOVEMEND‚EQU„*‰MOVEM.L‚(A7)+,D3-D5/A2-A3 ‰TST.LƒD0MOVEMRT1 MOVEM.L (A7)+,D1-D2/A1‰BNE.SƒMOVEMRTS‰TST.LƒD3‹IS�MOVE�COMPLETE?‰BEQ.SƒMOVEMRTS…BRANCH�IF�YES-‰SUB.LƒD3,D2ˆSUBTRACT�#�BYTES�LEFT�FROM�TOTAL‰ADD.LƒD2,D1ˆADD�TO�ADDRESS‰ADD.LƒD2,A1ˆADD�TO�BUFFER#‰MOVE.L‚D3,D2ˆ#�BYTES�STILL�TO�MOVE ‰BRA…MOVEM2"MOVEMRTS MOVEM.L (A7)+,D1-D2/A1/A4‰RTS‰PAGE*=*„CONVERT�ADDRESS�TO�PSEUDO�ADDRESS�(REC�#�*256�+�BYTE�OFSET)*CNVADREC�EQU„*‰MOVEM.L‚D4-D5/A2,-(A7) ‰CLR.L‚D3‰TST.L‚D1ˆADDRESS(‰BMI.S‚CNVADR10ƒIF�MINUS�-�WANT�RECORD�0!‰MOVE.L�#7,D5…TABLE�HAS�8�ENTRIES&‰LEA„SEGTABL-PBA(A5),A2ƒSTART�OF�TABLE)CNVADR2‚TST.W‚SEGTYPE(A2)‚IS�ENTRY�EMPTY?‰BEQ.S‚CNVADR5†BRANCH�IF�YES'‰MOVE.L�SEGLADD(A2),D3‚STARTING�ADDRESS ‰CMP.L‚D3,D1‡IS�ADDRESS�<�START?‰BMI.S‚CNVADR4…BRANCH�IF�YES ‰MOVE.L�D3,D4&‰ADD.L‚SEGSIZE(A2),D4‚ENDING�ADDRESS+1‰CMP.L‚D4,D1‡IS�ADDRESS�>�END?‰BMI.S‚CNVADR6…BRANCH�IF�NO2CNVADR4‚ADD.L‚#SEGENTSZ,A2ƒINCREMENT�TO�NEXT�ENTRY‰DBRAƒD5,CNVADR2CNVADR5‚CLR.L‚D3‰MVHEX‚3,D1,MGBADAD‰MESGƒMGBADAR,MGBADARE‰MOVE.W�#0,CCR.‰BRA.S‚CNVADRR…ERROR�RETURN�-�NO�SEGMENT�FOUND*CNVADR6‚NEG.L‚D3)‰ADD.L‚D1,D3‡D3=�#BYTES�FROM�START�OF�SEG ‰CLR.L‚D1(‰MOVE.W�SEGRECD(A2),D1ƒSTARTING�RECORD�# ‰LSL.L‚#8,D1‰ADD.L‚D3,D1‡D1=�PSEUDO�ADDRESS0‰ADD.L‚D2,D3‡TOT�#�BYTES�+�OFFSET�FROM�SEG�START+‰SUB.L‚SEGSIZE(A2),D3ƒDOES�WHOLE�BLOCK�FIT?‰BGT.S‚CNVADR8…BRANCH�IF�NO‰CLR.L‚D3‰#�BYTES�LEFT�OVER&CNVADR8‚SUB.L‚D3,D2†#�BYTES�IN�SEGMENT$‰MOVEƒ#4,CCR†SET�CCR�FOR�GOOD�RETURNCNVADRR‚MOVEM.L�(A7)+,D4-D5/A2‰RTS*CNVADR10�CLR.L‚D1 ‰BRAƒCNVADRR‰PAGE*.*„MOVE�ONE�LINE�TO�PRINT�BUFFER�IN�DUMP�FORMAT**‡A0�=�ADDRESS�OF�16�BYTES�OF�DATA�TO�MOVE'*‡A1�=�ADDRESS�OF�PRINT�LINE�(80�CHARS)*‡D0�=�PHYSICAL�ADDRESS*‡D1�=�LOGICAL�ADDRESS* FMTLIN‚EQU„*ˆMOVEM.L‚D0-D2,-(A7)"ˆMOVE.L‚A0,-(A7)„SAVE�DATA�ADDRESS&ˆBSR„CONVHEX3…CONVERT�PHYSICAL�ADDRESS+ˆMOVE.B‚#'�',D2…PUT�BLANK�IN�D2�FOR�SPACING%ˆMOVE.B‚D2,(A1)+„BLANK�BETWEEN�FIELDS ˆMOVE.L‚D1,D0%ˆBSRƒCONVHEX3†CONVERT�LOGICAL�ADDRESSˆMOVE.B‚D2,(A1)+&ˆMOVE.B‚D2,(A1)+„BLANKS�BETWEEN�FIELDS!ˆMOVE.L‚#$10004,D1ƒ2�COUNTS�IN�D1$FMTLIN1�MOVE.W‚#4,D1‡CONVERT�4�WORDSFMTLIN2�MOVE.W‚(A0)+,D0&ˆBSR„CONVHEX2„PUT�1�WORD�IN�PRINT�LINE ˆMOVE.B‚D2,(A1)+ƒBLANK�SEPARATORˆSUB.W‚#1,D1‡DECREMENT�COUNT ˆBNE„FMTLIN2'ˆMOVE.B‚D2,(A1)+ƒDOUBLE�BLANK�SEPARATORˆSWAPƒD1%ˆSUB.W‚#1,D1‡HAS�2ND�HALF�BEEN�MOVED?ˆBEQ„FMTLIN1…BRANCH�IF�NOˆMOVE.B�D2,(A1)++ˆMOVE.L�(A7)+,A0„GET�STARTING�ADDRESS�AGAINˆMOVE.L‚#16,D1†8�CHARACTERS%ˆBSR„MOVEASC…MOVE�SAME�BYTES�IN�ASCII ˆMOVE.B‚D2,(A1)+ƒBLANK�SEPARATOR&ˆMOVEM.L‚(A7)+,D0-D2ƒRESTORE�REGISTERSˆRTSˆPAGE*#*…CONVERT�HEX�INPUT�TO�BINARY�VALUE* *ˆINPUT:ƒA0�POINTS�TO�HEX�NUMBER.*‘A1�POINTS�TO�LONG�WORD�WHERE�RESULT�IS�SAVED***ˆOUTPUT:‚CC=Z„INPUT�ENDS�WITH�BLANK�OR�CR*‘CC=N„ILLEGAL�CHARACTER�F0 OUND*‘CC=GTƒINPUT�ENDS�WITH�COMMA.*‘A0�=�0�IF�CR�FOUND,�ELSE�POINTS�TO�NEXT�CHAR* HEXBINƒEQU„* ‰CLR.L‚D1 ‰MOVE.L‚A0,D0…TEST�INPUT�ADDRESS‰BEQ.S‚HEXBINR1 ‰CLR.L‚D0(HEXBIN2‚MOVE.B‚(A0)+,D1ƒGET�1�INPUT�CHAR‰CMP.B‚#'�',D1…IS�IT�BLANK?*‰BEQ„HEXBIN2…BRANCH�TO�SKIP�LEADING�BLANKS‰BRA.S‚HEXBIN5*(HEXBIN4‚MOVE.B‚(A0)+,D1ƒGET�1�INPUT�CHAR(HEXBIN5‚CMP.B‚#'0',D1…IS�IT�LESS�THAN�1?*‰BMI.S�HEXBIN8†YES�-�GO�LOOK�FOR�SEPARATOR‰CMP.B�#'F',D1†IS�IT�HEX�CHAR?&‰BHI.S�HEXBINRI…BRANCH�IF�ILLEGAL�CHAR‰CMP.B�#'9',D1†IS�IT�0-9‰BLS.S‚HEXBIN6…BRANCH�IF�YES ‰CMP.B‚#'@',D1…IS�IT�LEGAL�CHAR?‰BLS.S‚HEXBINRI„BRANCH�IF�NO‰SUB.B‚#7,D1‡CONVERT�A-F!HEXBIN6‚AND.L‚#$F,D1†BINARY�DIGIT!‰LSL.L‚#4,D0‡MULTIPLY�BY�SHIFTING ‰ADD.L‚D1,D0 ‰BRA„HEXBIN4* HEXBIN8‚EQU„*‰CMP.B‚#'�',D1…IS�IT�A�BLANK?‰BEQ.S‚HEXBINR2%‰CMP.B‚#',',D1…IS�FINAL�CHAR�A�COMMA?‰BEQ.S‚HEXBINR1„BRANCH�IF�YES!‰CMP.B‚#$D,D1†IS�FINAL�CHAR�A�CR?‰BEQ.S‚HEXBINR3„BRANCH�IF�YES*‰ILLEGAL�CHARACTERHEXBINRI�NOT.W‚D1‰RTS*HEXBINR3�LEAƒ0,A0„CR�FOUND(HEXBINR2�CLR.L�D1†ENDED�WITH�BLANK�OR�CR#HEXBINR1�MOVE.L‚D0,(A1)ƒSAVE�RESULT‰TST.W‚D1†SET�CONDITION�CODES‰RTS‰PAGE**…CONVERT�BINARY�TO�HEX*‡D0�=�BINARY�VALUE(*‡A1�=�ADDRESS�OF�BUFFER�TO�STORE�RESULT*CONVHEX4‚EQUƒ*�CONVERT�4�BYTESŠMOVE.L�D0,-(A7)ŠSWAPƒD0ŠBSR.S‚CONVHEX2ŠMOVE.L‚(A7)+,D0ŠBRA.S‚CONVHEX2*CONVHEX3‚EQUƒ*ŠMOVE.L�D0,-(A7)ŠSWAPƒD0ŠBSR.S‚CONVHEX1ŠMOVE.L�(A7)+,D0*CONVHEX2‚EQUƒ* ŠROR.L�#8,D0ŠBSR.S�CONVHEX1 ŠROL.L�#8,D0*CONVHEX1‚EQUƒ* ŠROR.W�#4,D0ŠAND.B�#$0F,D0 ŠCMP.B�#9,D0ŠBLS.S‚CONVHEXA ŠADD.B‚#7,D0CONVHEXA‚ADD.B‚#$30,D0ŠMOVE.B�D0,(A1)+ ŠROL.W‚#4,D0ŠAND.B‚#$0F,D0 ŠCMP.B‚#9,D0ŠBLS.S‚CONVHEXB ŠADD.B‚#7,D0CONVHEXB‚ADD.B‚#$30,D0ŠMOVE.B‚D0,(A1)+ŠRTS***†CONVERT�BINARY�TO�DECIMAL�-�4�CHARACTERS*CONVDEC4‚EQU…*ŠAND.Lƒ#$FFFF,D0†LIMIT�SIZEŠDIVU„#1000,D0‡GET�1ST�CHAR ŠAND.Bƒ#$F,D0ŠADD.Bƒ#$30,D0ˆCONVERT�TO�ASCIIŠMOVE.B‚D0,(A1)+‡SAVE�1�CHAR ŠCLR.WƒD0ŠSWAP„D0ŠDIVU„#100,D0ˆGET�NEXT�CHARŠADD.Bƒ#$30,D0ˆCONVERT�TO�ASCIIŠMOVE.B‚D0,(A1)+‡SAVE�1�CHAR ŠCLR.WƒD0ŠSWAP„D0***†CONVERT�BINARY�TO�DECIMAL�-�2�CHARACTERS*CONVDEC2‚EQU…*#ŠAND.Lƒ#$FF,D0ˆNUMBER�MUST�BE�SMALLŠDIVU„#10,D0ˆSEPARATE�DIGITS ŠAND.Bƒ#$F,D0ŠADD.Bƒ#$30,D0‡CONVERT�TO�ASCIIŠMOVE.B‚D0,(A1)+‰SAVE�1ST�CHARŠSWAP„D0‹GET�2ND�CHARŠADD.Bƒ#$30,D0‡CONVERT�TO�ASCII#ŠMOVE.B‚D0,(A1)+†SAVE�2ND�CHARACTERŠ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�NO7MOVEASC2�MOVE.B‚#'.',D0„REPLACE�UNPRINTABLE�CHAR�WITH�.1MOVEASC4�MOVE.B‚D0,(A1)+ƒSTORE�CHAR�IN�PRINT�BUFF‰SUB.Wƒ#1,D1†DECREMENT�COUNT$‰BNE…MOVEASC„LOOP�BACK�FOR�NEXT�CHAR‰RTS‰PAGE**‡INPUT/OUTPUT�SUBROUTINES*L******************************************************************************ˆSET�UP�NEW�OUTPUT�DEVICE+*‹OUTPSRT‚HAS�POINTER�TO�OUTPUT�DESCRIPTION*NEWOUT: ‰LEA�LISTFHS-PBA(A5),A05‰MOVE.W‚#FHCLOS,FHSCMD(A0)ƒCLOSE�WHATEVER�IS�NOW�OPEN‰TRAP�#3NEWOUT1‚LEA‚LISTFHS-PBA(A5),A6 ‰BSR‚DEFAULTS-‰MOVE.L�OUTPSRT-PBA(A5),A0ˆOUTPUT�DESCRIPTION ‰BSR‚EDITFILE&‰TST.L�D0ŒSYNTAX�ERROR�IN�DESCRIPTION?‰BPL.S�NEWOUT4‡BRANCH�IF�NO2NEWOUT2‚INPUT�REENTERS,REENTERE„ASK�FOR�NEW�DEVICE ‰BSR�SBARG‰BEQ.S�NEWOUT3 ‰BSR�C_EM_PGM ‰BRA�NEWOUT2 MNEWOUT3‚LEA�INPTBUF-PBA(A5),A0�POINT�TO�INPUT�BUFFER�INSTEAD�OF�COMMAND�LINE.‰MOVE.L�A0,OUTPSRT-PBA(A5) ‰BRAƒNEWOUT1* NEWOUT4‚EQUƒ*‰LEA�LSTIOS-PBA(A5),A06‰MOVE.B‚#LDFLUN,IOSLUN(A0)‡DEFAULT�IS�SEND�LIST�TO�CRT‰LEA�LSTIIOS-PBA(A5),A0‰MOVE.B‚#LDFLUN,IOSLUN(A0)A‰MOVE.W‚#$2020,PAGSLEWS-PBA(A5)‚CHANGE�SLEW�TO�BLANK�LINE�FOR�CRT)‰CLR.WƒPRINTER-PBA(A5)ŠFLAG�-�NOT�PRINTER!‰BTST�#1,D0”WAS�DEVICE�SPECIFIED?‰BEQ.S�NEWOUT5‘BRANC0 H�IF�NO-‰BTST�#14,D0“WAS�ONLY�#�SPECIFIED?�(VOL�NULL)‰BNE.S�NEWOUT9A�BRANCH�IF�YES 5NEWOUT5‚LEA�LSTIOS-PBA(A5),A0‘MUST�ASSIGN�LIST�DEVICE‰MOVE.B�#3,IOSLUN(A0)‰LEA�LSTIIOS-PBA(A5),A0‰MOVE.B�#3,IOSLUN(A0)‰LEA„LISTFHS-PBA(A5),A0‰MOVE.W�#FHASGN,FHSCMD(A0)‰TRAPƒ#3!‰BEQ.S�NEWOUT8‡BRANCH�IF�NO�ERRORNEWOUT7‚BSR�C_EM_PGM ‰BRA„NEWOUT2* NEWOUT8‚EQU„*‰LEA„LISTFHS-PBA(A5),A0‰MOVE.W�#FHRATT,FHSCMD(A0)‰TRAPƒ#3 ‰BNE�NEWOUT7%‰MOVE.W‚FHSWCD(A0),D0„ATTRIBUTES�WORD ‰BTSTƒ#9,D0ˆIS�DEVICE�A�PRINTER?‰BEQ.SƒNEWOUT9†BRANCH�IF�NO‰MOVE.W‚D0,PRINTER-PBA(A5)4‰MOVE.W‚#$200C,PAGSLEWS-PBA(A5)ƒSET�SLEW�FOR�PRINTERNEWOUT9‚MOVE.L‚FHSSIZ(A0),D0‰BNE.SƒNEWOUT10NEWOUT9A�MOVE.W‚#66,D0NEWOUT10�SUB.Wƒ#10,D0 ‰CMP.Wƒ#40,D0 ‰BMI…NEWOUT9A‰MOVE.W‚D0,PAGESIZ-PBA(A5)‰MOVE.W‚D0,CNTLIN-PBA(A5)‰CLR.WƒPAGEONE-PBA(A5)‰RTS*)*…FILL�IN�DEFAULTS�IN�FHS�PARAMETER�BLOCK*DEFAULTS�EQUƒ*"‰MOVE.L‚VOLNAME-PBA(A5),FHSVOL(A6)$‰MOVE.W‚USERNUM+2-PBA(A5),FHSUSN(A6)"‰MOVE.L‚CATALOG-PBA(A5),FHSCLG(A6)&‰MOVE.L‚CATALOG+4-PBA(A5),FHSCLG+4(A6)‰RTS‰PAGE**…SET�UP�INPUT�FILE* NEWIN„EQU‚*+‰LEA‚CLINE-PBA(A5),A0‰START�OF�COMMAND�LINE‰LEA‚INPFHS-PBA(A5),A6E‰MOVE.W�USERNUM+2-PBA(A5),FHSUSN(A6)ƒPUT�DEFAULT�USER#�IN�PARAM�BLOCK 7‰BSR‚EDITFILE‡CALL�EDITFILE�ON�THE�FILENAME�ENTERED.‚IT"‰BMI�ERINVAL‰MUST�NOT�BE�A�DEVICE. ‰BTST�#1,D0Š*‰BNE�ERINVAL‰* ‰FHSCALL�INPFHS-PBA(A5)*œASSIGN�THE�INPUT�DEVICE.‰BNE�FATALERRˆ* ‰RTS‰PAGE*,*…IF�OUTPUT�TO�PRINTER�-�SLEW�TO�TOP�OF�PAGE* NEWPAGE‚EQU‚*,‰TST.WƒPRINTER-PBA(A5)ŒIS�OUTPUT�TO�PRINTER?‰BEQ.SƒNEWPAGER“BRANCH�IF�NO2‰MOVE.W‚PAGSLEWS-PBA(A5),-(A7)�SAVE�SLEW�CHARACTER(‰TST.WƒPAGEONE-PBA(A5)ŒIS�THIS�1ST�PAGE?‰BNE.SƒNEWPAGE2“BRANCH�IF�NO4‰MOVE.W‚#$2020,PAGSLEWS-PBA(A5)„DO�NOT�SLEW�1ST�TIME5NEWPAGE2�ADD.Wƒ#1,PAGEONE-PBA(A5)‰FLAG�-�NOT�1ST�PAGE:‰LEA�LSTIIOS-PBA(A5),A0ˆPUT�START/END�ADDRESSES�OF�PAGSLEW6‰PEA�PAGSLEWS-PBA(A5)ŠBUFFER�INTO�LSTIIOS�PARAM�BLOCK.‰MOVE.L�(A7)+,IOSSAD(A0)‰PEA�PAGSLEWE-PBA(A5)‰MOVE.L�(A7)+,IOSEAD(A0)‰TRAP„#2&‰MOVE.W‚PAGESIZ-PBA(A5),CNTLIN-PBA(A5)‰MOVE.W‚(A7)+,PAGSLEWS-PBA(A5) NEWPAGER RTS‰SPC‚2*†DO�IMAGE�WRITE�TO�OUTPUT* PRTLXIƒEQUƒ*‰LEA�LSTIIOS-PBA(A5),A0‰MOVE.L‚A1,IOSSAD(A0)‰MOVE.L‚A2,IOSEAD(A0)PRTLXI1‚LEA„LSTIIOS-PBA(A5),A0‰TRAPƒ#2‰BNE.S‚PRTLXI2‰RTS*PRTLXI2‚BSR.S�PRTLASK ‰BRAƒPRTLXI1ˆSPC‚2*†DO�FORMATTED�WRITE�TO�OUTPUT**†PRTLXX�-�PRINT�ONE�LINE&*†PRTL80�-�PRINT�ONE�75�CHARACTER�LINE* PRTL80ƒEQU‚*‰LEA…74(A1),A2ŽSET�END�ADDRESS PRTLXXƒEQU‚*,‰TST.WƒPRINTER-PBA(A5)ˆIS�OUTPUT�TO�PRINTER?‰BEQ.SƒPRTLXX2�BRANCH�IF�NO-‰SUB.Wƒ#1,CNTLIN-PBA(A5)†DECREMENT�LINE�COUNT,‰BPL.SƒPRTLXX2�BRANCH�IF�NEW�PAGE�NOT�NEEDED ‰BSR…NEWPAGEPRTLXX2‚LEA�LSTIOS-PBA(A5),A0‰MOVE.L�A1,IOSSAD(A0)‰MOVE.L�A2,IOSEAD(A0)PRTLXX4‚LEA‚LSTIOS-PBA(A5),A0‰TRAP‚#2‰BNE.S‚PRTLXX6ŠBRANCH�IF�ERRORS‰RTS*PRTLXX6‚BSR.S‚PRTLASK ‰BRA„PRTLXX4*%*„PRINTER�ERROR�-�ASK�USER�WHAT�TO�DO*PRTLASK: ‰BSR�C_EM_PGMˆPRINT�THE�ERROR. =PRTLXXB‚INPUT‚RETRYS,RETRYEŠASK�THE�USER�IF�HE�WANTS�TO�RETRY ‰BSR�SBARG•AND�GET�HIS�RESPONSE.‰BEQ.S�PRTLXXB1�*‰BSR.S�C_EM_PGM�*‰BRA�PRTLXXB“* PRTLXXB1�LEA„INPTBUF-PBA(A5),A11PRTLXXC‚MOVE.B‚(A1)+,D0ˆCHECK�ONE�INPUT�CHARACTER‰CMP.B‚#'Y',D0‰BEQ.SƒPRTLXXR‰GO�BACK�TO�RETRY‰CMP.B‚#$D,D0‰LOOK�FOR�CAR�RET&‰BEQ„PRTLXXBˆIF�CAR�RET�-�GO�TRY�AGAIN‰CMP.B‚#'N',D0ˆDID�USER�SAY�NO#‰BNE„PRTLXXCˆBRANCH�TO�KEEP�LOOKING$‰BRA„CMDPRO‰DON'T�RETURN�IF�NO�RETRY PRTLXXR‚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�ENTR1 Y'�ERROR.***J***************************************************************************2*ˆROUTINE�TO�CALL�ERROR�MESSAGE�HANDLER,�THEN�DIE.*J*************************************************************************** FATALERR:‰BSR.S…C_EM_PGM2ERREXIT‚ERQ.TERM‚#0,#$C000‹EXIT�WITH�ERROR�STATUS.***M******************************************************************************,*’CALL�TO�ERROR�MESSAGE�HANDLER.‚OUTPUT�GOES.*’TO�LU�6.‚SETS�TERMINATION�STATUS�TO�'ERROR'.**ˆ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:C‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A5)ƒSAVE�D0,A0�IN�ERROR�MSG�PARAM�BLOCK.8‰LEA‡EM_PBLK-PBA(A5),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 =‰BTST†#0,LOGUNTS+3-PBA(A5)ƒCHECK�WHETHER�WE'RE�BEING�RUN�FROM.‰IF‚‚THEN.S‘A�CHAIN�FILE.‚IF�SO,�TERMINATE2‹ERQ.TERM‚#0,#$C000ŒWITH�ERROR�STATUS�IMMEDIATELY.‰ENDI ‰RTS †END�BEGINééééé=/* =/*†RENAME.AF=/*)=/* Chain file to assemble RENAME utility=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to RENAME.LS=/*=/IFC \1ƒ=ARG�RENAME.LS=/ENDIF=/*"=ASM RENAME.SA,RENAME.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéééé1 éé"=/* =/*†RENAME.LF=/*'=/* Link chain file to create RENAME.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to RENAME.LL=/*=/IFC \1ƒ=ARG�RENAME.LL=/ENDIF=/*=LINK ,RENAME.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000INPUT RENAME.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé+‰LIST'RENAMEƒIDNT�4,0�VERSADOS�RENAME�UTILITY ‰LLEN�120<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************%*‹PROGRAM�NAME�IS‚R�E�N�A�M�.�D�A�T�A****ˆ***ˆRENAME�COMMANDƒ******%*ˆTHIS�COMMAND�WILL�ASSIGN�A�NEW�NAME.*ˆ(USER�NUM,CATALOGUE,FILE�OR�EXTENSION)�TO�AN*ˆEXISTING�FILE.*ˆTHERE�WILL�BE�NO�DATA�CONVERSION�OF�THE�FILE*ˆDURING�THE�RENAME�PROCESSING.* *ˆREV�1.00!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*’D…*�*�*�*�*�*�**’A…*�*�*�*�*�*�***=**************************************************************‰PAGE**ˆMODIFICATION�HISTORY*ˆ2/2/84@*ˆCHANGES�HAVE�BEEN�MADE�TO�THE�LIBRARY�MODULE�'EDITFILE'�IN�THE@*ˆLIBRARY�'UTILIB.RO'.�THOSE�CHANGES�IMPACTED�THE�LOGIC�THAT�WAS<*ˆIN�THE�RENAME�UTILITY�BECAUSE�THE�BIT�SETTING�RESULTS�FROM=*ˆEDITFILE�WERE�NO�LONGER�COMPATABILE�WITH�THE�EXISTING�LOGIC>*ˆCONSEQUENTLY�NEW�LOGIC�WAS�REQUIRED�TO�MEET�THE�NEW�EDITFILE*ˆBIT�SETTING�RESULT2 S*‰PAGE***ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**‰NOLIST‰INCLUDE�9995.&.FME.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**‰PAGE**ˆ***ƒR�E�N�A�M�E‚COMMAND‚DATA�SECTION‚****ˆ****‚EQUATE�AREA‚*******#STKLENƒEQU�25‹STACK�LENGTH�IN�WORDS)BUFSIZE‚EQU�160‰INPUT�COMMAND�BUFFER�SIZE DSKLUIƒEQU�1!LISTLUƒEQU�3‹LISTING�LOGICAL�UNIT DIRLU„EQU�4TSKNAMƒEQU�'NAME'†MY�TASK�NAMESECLENƒEQU�256‰SECTOR�LENGTH7RWBITSƒEQU�$30000†READ�WRITE�BITS�FROM�EDITFILE�ROUTINEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*º2/2/84>NULLBITS�EQU�$FC00‡NULL�FIELD�FOUND�BITS�FROM�EDITFILE�ROUTINE*º2/2/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<BN00…EQU�0‹BIT�NBR�0* ‰SECTIONƒ0!‰XREFƒPARSE,OPTION,EDITFILE,SBARG***ˆNEXT�WORD�BOUNDRY�MACRO**2*************************************************** 4T=TESMQUf]JeVmJuJ}A…S�N•X�I¥p­Nµ=****„DATA�SEGMENT�(DSEG)ƒ****1***************************************************PBA†EQU�*…PGM�BASE�ADDR**-‰DC.B�'122084�4'…MMDDYY-REV�CODE-VERSADOS�REV*œREV�CODE�DEF.* SPACE-CLEAN�ASSM. *¤P-PATCHED*¤C-CUSTOMIZED�PATCH‰PAGE;**************************************************************ˆ***ƒDATA�AREA‚******:************************************************************ ‰DS.L�STKLEN PROGSTK‚EQU�**‰DC.L�0‰DS.W�08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFIN�IS�THE�AREA�THE�COMMAND�LINE�IS.*ˆ***ƒREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFINƒCOMLINE�BUFSIZE…***‚INPUT�BUFFER‚***-**********************************************‰DS.W�0*3*****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*3****************************************************6‰IOS.OUT6�IOWRIT,IOPASC+IOPFOR+IOPWAT,LDFLUN,0,0,0,0,07‰IOS.OUT6I�IOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0'‰IOS.OUTIN�IOREAD,IOPFOR,CDFLUN,,,0,0,2‰PAGE‰DS.W�0**ˆSET�UP�IOS�FOR�LISTING�LU3*6‰IOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0,0‰DS.W�07‰IOS.OUT3I�IOWRIT,IOPASC+IOPIMG+IOPWAT,LISTLU,0,0,0,0,0‰PAGE"***********************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT5*ˆCHANGE�IS�FROM�6�TO�3�-�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK4*ˆLU3�IS�USED�F0R�LISTING�AND�LU6�FOR�ERR0R�/LOGGING**3*ˆPARAMETER�TABLE�FOR�CHANG�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDART�PARAMETER�TABLE*%************************************** LU3AFHSƒEQU�*'‰DC.W�FHCHLU„COMMAND�(CHANGE�LU�ASSIGN)‰DC.W�FOPKEP…OPTION�KEEP�ASSIGN‰DC.B�0ŠSTATUS‰DC.B�LDFLUNŠSEND�LU�NUMBER‰DC.B�LISTLUŠRECEIVE�LU�NUM‰DC.B�0ŠRESERVED&‰DC.L�0ŠTASK-ID�(0�MEANS�USE�YOURSELF)(‰DC.L�0ŠSESSION�#�(0�MEANS�USE�YOURSELF)*‰DS.W�0)******************************************?*ˆLU3FHS�IS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTING*********************************************"‰FHS.LU3�FHCLOS,0,LISTLU,0,0,0,0,0 ‰DC.L�0,0,0*$*************************************:*ˆ***‚LU6FHS�IS�THE�PARAMETER�TABLE�FOR�FHS�FOR�THE�OUTPUT?*ˆ***‚WHICH�NORMALLY�GOES�TO�THE�TERMINAL�FOR�ERR0RS�OR�LOGGING**"***********************************‰FHS.LU6�0,0,LDFLUN,0,0,0,0,0 ‰DC.L�0,0,0‰DS.W�0*;************************************************************:*ˆ***�DSKFHS�IS�THE�PARAMETER�TABLE�FOR�THE�FHS�INPUT�FILE*;***********************************************************INFHS„DC.W�FHASGNŒCOMMAND*‰DC.W�FOPEREWŠOPTIONS�EXCLUSIVE�READ/WRITE‰DC.B�2 0ŠSTATUS ‰DC.B�DSKLUI†LOGICAL�UNIT�NUMBER INVOL„DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUMBER‰DC.L�$20202020ˆCATALOG�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020‰DC.W�$2020ŠEXTENSION‰DC.W�0ŠRESERVED‰DC.B�0ŠWRITE�PROTECT�CODE‰DC.B�0ŠREAD�PROTECT�CODE‰DC.W�0ŠLOGICAL�RCORD�LENGTH0‰DC.L�0ŠCONTIGUOUS�FILE�SIZE�/�DIR�ENTRY�POINTER6*ˆFOLLOWING�FHS�PARAMENTERS�FOR�SHARED�SEGMENT�REQUEST(‰DC.L�0ŠSEGMENT�STARTING�LOGICAL�ADDRESS$‰DC.L�0ŠSEGMENT�ENDING�LOGICAL�ADDR.3‰DC.L�0ŠLENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUEST‰DS.W�0**%*ˆFHS�PARAMETER�BLOCK�FOR�DISK�OUTPUT* OUTFHSƒEQU�*‰DC.W�FHASGN…COMMAND ‰DC.W�FOPPWŠOPTIONS-PUBLIC�WRITE‰DC.B�0ŠSTATUS‰DC.B�DSKLUI…LOGICAL�UNIT�NUM!OUTVOLƒDC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUM‰DC.L�$20202020ˆCAT�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020 ‰DC.W�$2020‰DC.W�0‰DC.B�0ŠWRITE�PROT�CODE‰DC.B�0‰DC.W�0‰DC.L�0ŠCONT�FILE�SIZE ‰DC.L�0,0,0‰DS.W�0*"*�VOLUME�ASSIGNMENT�FOR�FAMILY�AND**ˆPARAMETER�BLOCK�FOR�FETCH�DIRECTORY�CALL DIRFHSƒEQU�*‰DC.W�FHFDEN…CMD‰DC.W�FOPPR†OPTIONS‰DC.B�0ŠSTATUS‰DC.B�DIRLU†LOG�UNIT‰DC.L�$20202020‚VOL‰DC.W�-2‰USER�NUMDIRCATƒDC.L�'„'…CATALOGUE ‰DC.L�'„'‰DC.L�'„'…FILE ‰DC.L�'„' ‰DC.W�'‚'‡EXT‰DC.W�0‰DC.B�0‰DC.B�0‰DC.W�0‰DC.L�0…DIR�ADDR�PARM*‰DS.W�0&*ˆDIRECTORY�ENTRY�(DIR)�DATA�STRUCTURE'*ˆTHE�DIR�ENTRY�IS�READ�INTO�THIS�BLOCK*DIRBLKƒDS.B�FDLEN*ˆDS.W�0;***********************************************************DIRVOLƒDC.W�FHASGN‡COMMAND‰DC.W�FOPPRŠOPTIONS�PUBLIC�READ‰DC.B�0ŠSTATUS‰DC.B�DIRLU†LOGICAL�UNIT�NUMBER‰DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUMBER‰DC.L�$20202020ˆCAT�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020 ‰DC.W�$2020‰DS.L�3(‰DC.L�0ŠSEGMENT�STARTING�LOGICAL�ADDRESS$‰DC.L�0ŠSEGMENT�ENDING�LOGICAL�ADDR.3‰DC.L�0ŠLENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUEST‰DS.W�0**'HOLDFUSN�DC.W�0„FAMILY�USER�NUMBER�MASK*’HOLD�MASK�OUTPUT�FOR�FAMILYHOLDFAM‚DC.L�'„'ƒCAT ‰DC.L�'„'‰DC.L�'„'ƒFILE ‰DC.L�'„' ‰DC.L�'‚'…EX‰DS.W�08*********************************************************8**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAM‚DC.L�0‰SAVE�TASK�NAMESESNUMƒDC.L�0ˆSAVE�SESSION�NUM#VOLNAMƒDC.L�0‰SAVE�VOL�DEFAULT�NAME‰DC.W�0/USERNUM‚DC.W�0ŠDEFAULT�USER�NUM�(16�BIT�BINARY)*CATNAMƒDC.L�0,0‡SAVE�DEFAULT�CATAGORY�NAME R_D67A01:‰DS.L�4ŠREGS�D6,D7�A0�A1‰DC.W�0ŠTOP�HALF�A2‰DC.W�0ŠLOG�ON�USER�NUM‰DS.L�6‰SAVE�OTHER�REGISTERSSAVNAMƒDS.L�6ŠSAVE�FULL�NAME&INCODEP‚DC.W�0„SAVE�INPUT�PROTECT�CODE(OUTCODEP�DC.W�0…SAVE�OUTPUT�PROTECT�CODE0SAVOADD„DC.L�0Š1ST�TIME�FLAG�FOR�PRT�DETAIL�LINE"OFLAG„DC.L�0„MOVE�OUTPUT�ADDR/FLAG"PROTINƒDC.W�0ŽSAVE�INPUT�PROT�CODE$PROTOUT‚DC.W�0ŽSAVE�OUTPUT�PROT�CODEMSGANSƒDC.W�'…'MSGANSE‚EQU�*-1%ISDEV„DC.B�0ŠINPUT�OR�OUTPUT�WS�A�DEV&FLAGOCƒDC.B�0…CHANGE�PROTECT�CODE�FLAG1FLAGP„DC.B�0ŠPROTECT�ONLY�IN�OUTPUT�CMD�LINE�FLAG!FAMIFLAG�DC.B�0„FAMILY�FLAG�INPUTERFLAGƒDC.B�0„FAMILY�ERRORSEL†DC.B�0„SELECT�INDICATOR*‰DS.W�0.************************************************ˆSTART�OF�MESSAGES�&�BUFFERS*.**********************************************DIRMSGƒEQU�*ŒSTART�OF�DIR�MSG%VOLPRTƒDC.L�'„'…VOLUME�NAME�GOES�HERE ‰DC.W�':�'L1USN„DC.L�0ŠUSER�NUM ‰DC.W�'.�'L1CAT„DC.L�'„'…CATALOGUE ‰DC.L�'„' ‰DC.W�'.�'L1FIL„DC.L�'„'…FILE�NAME ‰DC.L�'„' ‰DC.W�'.�'L1EXT„DC.W�'‚'‡EXTENSION DIRMSGE‚EQU�*‰DS.W�0 COPAM„EQU�*,‰DC.B�'�RENAME�ALL�OR�SELECT�FILES�(A/S)�?�'COPAMEƒEQU�*-1‰DS.W�0* COPOK„EQU�*‰DC.B�'OK�TO�RENAME�(Y/N/Q)�?‚'COPOKEƒEQU�*-1COPOKBƒDS.B�40‰FILE�NAMECOPOKBE‚EQU�*-1**‰DS.W�0** PMSG…EQU�*+‰DC.B�'BOTH�PROTECTION�CODES�ARE�REQUIRED�' PMSGE„EQU�*-1‰DS.W�0* GOODM„EQU�*‰DC.B�'�RENAME�WAS�SUCCESSFUL'GOODMEƒEQU�*-1‰DS.W†0X00100:‰DC.B†'RENAME�VERSION�NUMBER�'X00110: ‰DC.B†'ˆ'3 X00199ƒEQU‡*-1‰DS.W†0‰PAGE***’ERROR�MESSAGE�PARAMETER�BLOCK**EM_PBLK: EM_DO:ƒ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�DESIREDEM_TLUN:�DC.B†0*œUSER�TERMINAL�LUN�-�(LDFLUN)EM_QRC:‚DC.B†0*œQUERY�RETURN�CHARACTEREM_KLUN:�DC.B†0*œUSER�KEYBOARD�LUN�-(CDFLUN)EM_SPA:‚DC.L†0'*œSTART�ADDRESS�FOR�USER�TEXT�PLUG�POOLEM_EPA:‚DC.L†0%*œENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL‰PAGE‰DS.W�0*&ENDDATA‚EQU�*‹***�END�OF�DATA�AREA‚***‰PAGE BEGPROC‚EQU�**<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<***************************************************************ŽRENAME�COMMAND/*ˆ***‚PROCEDURE�SECTION�FOR�RENAME�COMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************STARPROG EQU *‰LEA‡PBA(PC),A7*&***************************************.*ˆ**ƒSAVE�DEFAULT�VALUE�PASSED�FROM�SYSTEM�****'*****************************************;‰MOVEM.L�D0-D7/A0-A7,STSKNAM-PBA(A7)�SAVE�REGISTER�CONTENTS(‰LEA�PROGSTK(PC),A7‚SET�UP�STACK�POINTER!‰LEA�PBA(PC),A5†SET�PGM�BASE�ADDR+*ˆD0�TO�STSKNAM�=�TASK�NAME�THAT�STARTED�ME*ˆD1�TO�SESNUM‚=�SESSION�NUM$*ˆD2�TO�VOLNAM‚=�DEFAULT�VOLUME�NAME*ˆD3�TO�USERNUM�=�USER�NUMBER*ˆD4�TO�CATNAM‚=�CATALOGUE�NAME*ˆD5�TO�CATNAM�+4**ˆD6‹=‚LENGTH�OF�COMMAND�LINE)*ˆD7�=�BIT�MASK�OF�LOGICAL�UNITS�ASSIGNED*ˆA0�=�YOUR�TASK�NAME*ˆA1�=�TERMINAL�ID*ˆA2�=�ACTUAL�USER�NUMBER(*ˆA3�=�SYSTEM�VOLUME�DEFAULE(ALL�SPACES)*ˆA4�=�SYSTEM�USER�NUMBER*ˆA5�=�SYSTEM�CATALOGUE*ˆA6�=�SYSTEM�CAT�PART�2**5*ˆASSIGNMENT�OF�SEND�&�RECEIVE�LU'S�IS�DONE�BY�SYSTEM‰PAGE‰LEA�MSGANS(PC),A0"‰MOVE.L�A0,OUTINIOS-PBA+IOSSAD(A5)‰LEA�MSGANSE(PC),A0"‰MOVE.L�A0,OUTINIOS-PBA+IOSEAD(A5)‰LEA�DIRBLK(PC),A0 ‰MOVE.L�A0,DIRFHS-PBA+FHSSIZ(A5)*�***„DRIVER‚BLOCK„***** ‰BTST�#3,D7ŠLU3�ALREADY�ASSIGNED‰BNE.S�DOBUFFˆYES-**********************************************.*ˆROUTINE�TO�ASSIGN�LOGICAL�UNIT�3�TO�TERMINAL+*ˆBY�SETTING�IT�UP�THE�SAME�AS�LU6�WHICH�IS"*ˆALREADY�ASSIGNED�TO�THE�TERMINAL*.***********************************************‰FHSCALL�LU3AFHS(PC)‰BNE‚IOERPRT…BAD*3***************************************************&*‰*****�CALL�COMMAND�PARSE�ROUTINE‚***3****************************************************/DOBUFFƒLEA�BUFFIN(PC),A0‚SAVE�BUFFER�START�ADDR ‰BSR�PARSE ‰MOVE.L„A2,D6*œD6=START�ADDRESS�FOR�OPTIONS!‰MOVEA.L�A5,A2‚SAVE�PGM�BASE�ADDR‰TST.L�D0‡CK�F0R�ANY�ERR0RS‰BMI�ERR1‡BR�IF�ERR0R ‰TST.L…D6 ‰BNE‡X01000*œJMP�IF�OPTIONS�SPECIFIED**********************************************�ZERO�IN�A1�MEANS�NO�OUTPUT*********************************************'‰CMP.L�#0,A1‚A1�CONTAINS�ADDR�OF�OUTPUT#‰BEQ�ERR1…NO�OUTPUT�IN�COMMAND�LINE.‰MOVE.L�A1,SAVOADD-PBA(A5)‚SAVE�OUTPUT�ADDRESS&‰BSR.S�INITIN…GO�TO�INPUT�INIT�ROUTINE‰BSR�INITOUT…GO�TO�OUTPUT�INIT ‰TST.L�OFLAG-PBA(A2)�MORE�OUTPUT‰BEQ.S�CKFAM‰NO ‰BSR�NEWOUT.***********************************************ŽCHECK�FOR�FAMILY�CONDITION.**********************************************,CKFAM„TST.B�FAMIFLAG-PBA(A2)‚FAMILY�COND�SET‰BNE�FAMILYESˆYES*1*************************************************!*ˆGO�TO�RENAME�ROUTINE‚FOR�SINGLE1**************************************************"‰BSR�RENAMEIT‹GO�TO�RENAME�ROUTINE*‰BSR�GOODR‹PRT�GOOD�RENAME�MSG*)***************************************** *ˆSTOP�THE�PROGRAM�AT�THIS�POINT)*****************************************‰LEA�INFHS(PC),A6ƒINIT�REG0‰MOVE.W�#FHCLOS,FHSCMD(A6)‚CLOSE�COMMAND�TO�PARM‰FHSCALL�INFHS(PC)‰BEQ.S�STOPNOW ‰BSR�IOERPRTR*‰PAGE**2*ˆALL�UTILITIES�WILL�TERMINATE�BY�CALLINGƒERQ.TERM:*ˆHOWEVER�-�AN�INDICATION�AS�TO�WHETHER�THERE�WAS�AN�ERROR5*ˆWHICH�MIGHT�CAUSE�CHAIN�PROCESSING�TO�ABORT�MUST�BE9*ˆSPECIFIED�AT�THE�TIME�OF�THE�TERMI3 NATION.�THE�FOLLOWING8*ˆWILL�DEFINE�THE�TYPE�OF�TERMINATION�THAT�ARE�CURRENTLY *ˆPOSSIBLE:*8*’NORMAL�TERMINATION‚-�IMPLIES�THAT�UTILITY�SUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM�#0,#0**:*’ERROR�TERMINATIONƒ-�IMPLIES�THAT�UTILITY�TERMINATED�WITH *¨AN�ERROR**¦ERQ.TERM�#0,#$C000*<*’WARNING�TERMINATION�-�IMPLIES�THAT�UTILITY�TERMINATED�WITH*¨A�WARNING�(ie.�ASSEMBLY)**¦ERQ.TERM�#0,#$1000** TERM_FLG:‰DC.W†0‰TERMINATION�FLAG *œBIT‡MEANING*ž0‡0�-->�NORMAL‚TERMINATION*¦1�-->�ERRORƒTERMINATION**ž1‡1�-->�WARNING�TERMINATION**STOPNOW:‰LEA‡TERM_FLG(PC),A0*œA0=ADDR�OF�TERMINATION�FLAG ‰BTST†#1,(A0)‰BNE.S…TERM0100*œJMP�IF�WARNING�TERMINATION ‰BTST†#0,(A0)‰BNE.S…TERM0200*œJMP�IF�ERROR�TERMINATION ‰ERQ.TERM*œEXIT�NORMAL�TERMINATION TERM0100:‰ERQ.TERM�#0,#$1000*œEXIT�WARNING�TERMINATION TERM0200:‰ERQ.TERM�#0,#$C000 ‰PAGE/************************************************)*ˆ***‚SET�UP�FHS�PARM�BLOCK�FOR�INPUT�****7*ˆTHIS�ROUTINE�WILL�INITIALIZE�THE�INPUT�FILE�PARAMETER*/************************************************ INITIN„EQU�*%‰LEA�BUFFIN(PC),A0‚ADDR�OF�START�SCAN(‰LEA�INFHS(PC),A6‚ADDR�OF�FHS�PARM�BLOCK!‰BSRƒINITDSK…GO�TO�INIT�DISK�SUBR*&****************************************ˆ**ƒCALL�EDITFILE�ROUTINE�***ˆA0�=�INPUT�COMMAND�START*ˆA6�=�ADDR�OF�PARM�BLOCK*&***************************************!‰BSR�EDITFILE„MAKE�EDIT�FILE�CALL‰BMI�ERR1ˆERR0R ‰MOVE.W„D0,D6‰AND.W…#$0C00,D6**œD6=ISOLATED�FILE�AND�EXTENSION�NULL�BITS*ŸFOR�THE�INPUT�FILE ‰BNE‡ERR1-*œJMP�IF�FILE�AND/OR�EXTENSION�BITS�WERE�NULL/*œTHE�INPUT�FILE�NAME�AND/OR�THE�FILE�EXTENSION *œARE�MISSING#‰BTST�#7,D0ŠCK�FOR�FAMILY�CONDITION‰BEQ.S�INITIND‡NO‰BTST�#6,D0…FAMILY�VOLUME‰BNE�ERR1‡ERROR‰MOVE.B�D0,FAMIFLAG-PBA(A2)/‰MOVE.W�FHSWCD(A6),PROTIN-PBA(A2)‚SAVE�PASSWORD‰BRA.S�INITEXŠEXIT INITIND‚BTST�#1,D0†CK�FOR�DEVICE‰BEQ.S�INITIN1…NO‰MOVE.B�#1,ISDEV-PBA(A2)* INITIN1‚EQU�* ‰LEA�INVOL(PC),A1ˆSAVE�FULL�NAME‰LEA�SAVNAM(PC),A2 ‰MOVE.L�#6,D1INITINL‚MOVE.L�(A1)+,(A2)+ ‰SUB�#1,D1 ‰BNE�INITINL$‰LEA�PBA(PC),A2ŠRESTORE�PGM�BASE�REG*2***************************************************ŠASSIGN�DISK�INPUT�VOL‚***5*ˆCOMMAND,�VOL�NAME�AND�LU�#�ARE�SET�UP�IN�PARM�BLOCK/************************************************)‰MOVE.W�#FHASGN,FHSCMD(A6)†ASSIGN�COMMAND‰FHSCALL�INFHS(PC)'*Š**‚RETURN�FROM�FILE�HANDLER�SYSTEM�**‰BEQ.S�INITIN2†NO�ERROR‰TST.B�FAMIFLAG-PBA(A2)‚FAMILY‰BEQ.S�INITER1‡NO(‰MOVE.B�D0,ERFLAG-PBA(A2)ƒSAVE�ERROR�IND ‰RTS‡.‰RETURN*)INITER1‚CMP.B�#7,D0…PROTECTION�CODE�ERROR‰BEQ�PROTPRT…YES‰CMP.B�#6,D0…INVALID�INPUT‰BEQ�INVALERR„YES‰BRA�IOERPRTR„OTHER�TYPE�ERRORAINITIN2‚MOVE.W�FHSWCD(A6),INCODEP-PBA(A2)ƒSAVE�INPUT�PROTECT�CODE INITEXƒRTS�.�RETURN�FROM�ROUTINE‰PAGE-*ˆSUBROUTINE�TO�INIT�PARM�WITH�DEFAULT�VALUES* INITDSK‚EQU�*'‰MOVE.L�#'„',FHSFIL(A6)‚BLANK�FILE�NAME‰MOVE.L�#'„',FHSFIL+4(A6),‰MOVE.W�#'‚',FHSEXT(A6)‚BLANK�EXTENSION�NAME INITDSK1:-‰MOVE.L�VOLNAM-PBA(A2),FHSVOL(A6)�VOLUME�NAME4‰MOVE.W�USERNUM-PBA(A2),FHSUSN(A6)�USE�LOG�ON�USER�#)‰MOVE.L�CATNAM-PBA(A2),FHSCLG(A6)�CATALOG%‰MOVE.L�CATNAM+4-PBA(A2),FHSCLG+4(A6) ‰RTS�.�RETURN*‰PAGE1****************************************************ˆROUTINE�TO�PERFORM�OUTPUT�INITIALIZATION*1************************************************** INITOUT‚EQU�*‰TST.B�FAMIFLAG-PBA(A2)‚FAMILY‰BEQ.S�INITOUT1†NO'‰LEA�OUTFHS(PC),A6‡POINT�AT�FAMILY�PARM‰BRA.S�INITOUT2/INITOUT1�LEA�INFHS(PC),A6„INPUT�PARM�BLOCK�ADDR'‰TST.B�ISDEV-PBA(A2)‚WAS�INPUT�A�DEVICE‰BNE.S�INITOUT2„YES&‰BSR�INITDSK1„INIIT�DEFAULT�DEST�VALUE ‰BRA.S�OUTA-INITOUT2�BSR�INITDSK…INIT�OUTPUT�WITH�DEFAULT**,OUTA…MOVE.L�SAVOADD-PBA(A2),A0‚START�OF�SCAN*4*****************************************************ˆCALL�EDIT�FILE�ROUTINE*ˆA0�HAS�ADDR�OF�START�OF�SCAN*ˆA6�HAS�ADDR�OF�FHS�PARM�BLOCK*4**************************4 ***************************/************************************************'*ˆCALL�TO�EDITFILE�TO�SET�UP�PARM�BLOCK*1************************************************** ‰BSR�EDITFILE‰TST.L�D0ŠCK�FOR�ERR ‰BMI�ERR1ˆYES0‰BCLR�#0,D0ŠMORE�OUTPUT-CL�BECAUSE�OF�LATER�TEST ‰BNE‚ERR1ŠNO!‰CMP.B�#',',D1‰TERMINATOR�A�COMMA‰BNE.S�OUTBŒNO,‰MOVE.L�A0,OFLAG-PBA(A2)‚SAVE�POINTER�&�FLAG"OUTB…BTST�#1,D0‡CK�FOR�DEVICE�FLAG‰BEQ.S�OUTCˆNO‰ADD.B�#1,ISDEV-PBA(A2)7‰CMP.B�#2,ISDEV-PBA(A2)‚ARE�BOTH�INPUT�&�OUTPUT�DEVICES‰BNE�ERR1ˆNO�IS�ERROR#‰BRA.S�OUTEXIT…BOTH�ARE�DEV�GET�OUT OUTC…EQU�**ˆNOT�AN�OUTPUT�DEVICE(‰TST.B�ISDEV-PBA(A2)‚ANY�DEVICE�SETTINGS ‰BNE�ERR1ˆYES*5*ˆCK�FOR�PROTECT�CODE�ONLY�ON�OUTPUT�PART�OF�CMD�LINE*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*º2/2/84‰CMP.L…#RWBITS+NULLBITS,D0+‰BEQ.S…OUTD†JMP�IF�PROTECT�CODE�CHANGE�ONLY ‰MOVE.L„D0,D6*œD6=EDIT�FILE�STATUS‰AND.L…#RWBITS,D6#*œD6=ISOLATED�R/W�PROTECT�CODE�BITS ‰BEQ.S…OUTD1*œJMP�IF�NO�PROTECT�CODE�CHANGE*º2/2/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰CMP.L…#RWBITS,D6 ‰BNE‡PERR1*œJMP�IF�CHANGE�TO�BOTH�PROTECT�CODES�NOT�PRESENT ‰BSR‡X03000 *œSET�FLAG�-�PROTECT�CODE�CHANGE*œSAVE�PROTECT�CODE�CHANGE ‰BRA.S…OUTD1OUTD:/‰MOVE.B�#1,FLAGP-PBA(A2)‚SET�CHG�PROT�ONLY�FLAG ‰BSR‡X03000 *œSET�FLAG�-�PROTECT�CODE�CHANGE*œSAVE�PROTECT�CODE�CHANGEOUTD1:‰TST.B�FAMIFLAG-PBA(A2) ‰BNE.S…OUTFAM*œJMP�IF�FAMILY�MODEOUTG: ‰TST.L…D6‰BEQ.S�OUTEXIT#*œJMP�IF�POTENTIAL�NAME�CHANGE�ONLY9‰MOVE.W�INCODEP-PBA(A2),FHSWCD(A6)‚RESET�WITH�INPUT�CODES* OUTEXIT‚RTS‰PAGE'****************************************ˆTEST�FOR�FAMILY�CONDITIONS'***************************************3*�ANY�FIELD�WITH�AN�*�IN�THE�OUTPUT�FIELD�MUST�HAVE*�AN�*�IN�THE�INPUT�FIELD,*’AN�*�IN�THE�FILE�OR�EXTENSION�FIELD�OF�THE)*’OUTPUT�REQUIRES�AN�*�IN�THE�INPUT�FIELD OUTFAMƒEQU�*F‰MOVE.W�OUTFHS-PBA+FHSWCD(A2),PROTOUT-PBA(A2)�SAVE�OPT�PROTECTION�CODE.‰MOVE.B�FAMIFLAG-PBA(A2),D1‚SAVE�INPUT�SETTING‰BTST�#6,D1Š*�IN�VOL�FIELD‰BNE.S�FAMER‹ERRORE‰MOVE.L�INVOL-PBA(A2),DIRVOL-PBA+FHSVOL(A2)�VOLNAM�FOR�VOL�ASSIGNMENT‰FHSCALL�DIRVOL(PC)‚ASSGN�VOL‰BEQ.S�OUTF0‰GOOD‰CLR.B�FAMIFLAG-PBA(A2)‰BRA�IOERPRTRˆERROR@OUTF0„MOVE.L�INFHS-PBA+FHSVOL(A2),DIRFHS-PBA+FHSVOL(A2)‚SAVE�VOL‰BTST�#5,D1Š*�IN�USER�# ‰BNE.S�OUTF1‰YES�FAM�WAS�DEFAULTB‰MOVE.W�INFHS-PBA+FHSUSN(A2),DIRFHS-PBA+FHSUSN(A2)�INPUT�TO�USER�# ‰BRA.S�OUTF1AAOUTF1„CMP.B�#-2,OUTFHS+FHSUSN-PBA(A2)ƒCHECK�OUTPUT�USER�NUM�FOR�*‰BEQ.S�OUTF1A�BRIF�*�IN�FIELD+‰BRA.S�FAMER�CONFLICTING�USER�NUMBER�FIELDSCOUTF1AƒMOVE.W�DIRFHS-PBA+FHSUSN(A2),HOLDFUSN-PBA(A2)‚DEFAULT�USER�#,‰LEA�INFHS+FHSCLG(PC),A5ƒPOINT�AT�IN�CATALOG‰LEA�OUTFHS+FHSCLG(PC),A6‰LEA�HOLDFAM(PC),A0‰LEA�DIRCAT(PC),A1‰MOVE.B�#18,D0‡COUNT&‰TST.B�FLAGP-PBA(A2)…PROTECT�CODE�ONLY‰BNE.S�OUTPONLYˆYES OUTFLOP‚CMP.B�#'*',(A5)…SOURCE�*‰BNE.S�OUTF3‹NO *’SOURCE�IS�*‰CMP.B�#'*',(A6)…DESTINATION�*‰BNE.S�FAMER‰NO�IS�ERROR1OUTF2„MOVE.B�(A6)+,(A0)+‚SAVE�DESTINATION�AS�MASK,‰MOVE.B�(A5)+,(A1)+‚SAVE�SOURCE�IN�DIR�TABLE‰SUB.B�#1,D0‰DONE‰BNE�OUTFLOP‰NO‰BRA.S�OUTFEXŠEXIT*’SOURCE�WAS�NOT�*#OUTF3„CMP.B�#'*',(A6)…DESTINATION�*‰BEQ.S�FAMER‹YES�IS�ERROR‰BRA�OUTF2‹GOOD�SAVEFAMER„CLR.B�FAMIFLAG-PBA(A2)!‰BRA�INVALERRˆGO�TO�ERROR�ROUTINE/OUTPONLY�MOVE.B�(A5)+,(A1)+‚SOURCE�TO�DIR�TABLE ‰SUB.B�#1,D0 ‰BNE�OUTPONLY OUTFEXƒEQU�*‰RTS‰PAGE2***************************************************-*ˆROUTINE�TO�PERFORM�RENAME�OF�REQUESTED�FILE*2***************************************************RENAMEITƒEQU�**‰LEA�INFHS(PC),A6ƒINIT*‰TST.B�FLAGP-PBA(A2)…PROTECT�ONLY�FLAG�SET‰BNE.S�RENAMP„YES.‰MOVE.W�#FHRENM,FHSCMD(A6)‚RENAME�COMMAND�CODE‰FHSCALL�INFHS(PC)&‰BEQ.S�RENAMPˆJMP�IF�RENAME�SUCCESSFUL‰TST.B�FAMIFLAG-PBA(A2)�FAMILY$‰BEQ�IOERPRTRˆJMP�IF�NOT�FAMILY�MODE=‰MOVE.B�D0,ERFLAG-PBA(A2)�SET�BAD�RETURN�FOR�FAMILY�PROCESSOR‰RTS**ˆCHECK�FOR�NEW�PR4 OTECTION�CODE* RENAMPƒEQU�*&‰TST.B�FLAGOC-PBA(A2)‚PROTECT�CODE�SET‰BEQ.S�RENEXIT*$************************************ *ˆNEW�PROTECT�CODES�ARE�REQUIRED$**************************************‰MOVE.W�#FHPROT,FHSCMD(A6)‚PROTECT�COMMAND9‰MOVE.W�OUTCODEP-PBA(A2),FHSWCD(A6)‚MOVE�NEW�CODE�TO�PARM*‰FHSCALL�INFHS(PC)‰BEQ.S�RENEXIT†GOOD‰TST.B�FAMIFLAG-PBA(A2)‚FAMILY‰BEQ.S�RENER‰NO"‰MOVE.B�D0,ERFLAG-PBA(A2)�SAVE�IND ‰RTS‡.‰RETURNRENER:"‰CMP.B�#7,D0…PROTECTION�CODE�ERROR‰BEQ�PROTPRT…YES ‰BRA�IOERPRTR** RENEXIT‚EQU�*‰RTS**‰PAGE0*************************************************ˆFAMILY�PROCESSING�FOR�RENAME0*************************************************FAMILYES EQU *$************************************ *ˆSELECT�MSG$************************************‰LEA�COPAM(PC),A3‰LEA�COPAME(PC),A4 ‰BSR�PRTLU6I‰IOSCALL�OUTINIOS(PC)‰BNE�IOERPRT�BRIF�I/O�ERROR$‰BSR�SBARGƒFORCE�UPPER�CASE�RESPONSE ‰BNE‡FAM_TERM‰CMP.B�#'S',MSGANS-PBA(A2)‰BNE.S�FAMILY’GET�NEXT5‰MOVE.B�MSGANS-PBA(A2),SEL-PBA(A2)‰SAVE�SELECT�OPTION FAMILYƒEQU�*)******************************************ˆGET�FILE�FROM�DIRECTORY)*****************************************"‰FHSCALL�DIRFHS(PC)‚DIRECTORY�CALL‰BEQ.S�PROCDIR‰CMP.B�#FSTAEOD,D0ƒEND�OF�FILE‰BEQ‚FAMILYEX‡YES*’PRINT�ERROR�MSG,‰MOVE.L�DIRFHS-PBA+FHSVOL(A2),VOLPRT-PBA(A2)‰LEA�DIRBLK+FDUSN(PC),A4 ‰BSR�MOVMSG1 ‰BSR�FAMPRT ‰BSR�IOERPRTR ‰BRA�FAMILYPROCDIR‚LEA�INFHS+FHSUSN(PC),A1‰LEA�DIRBLK+FDUSN(PC),A0 ‰BSR�MOVFILE14‰MOVE.W�PROTIN-PBA(A2),INFHS-PBA+FHSWCD(A2)„PASSWORD‰MOVE.W�#FHASGN,INFHS-PBA(A2)"‰TST.B�FLAGP-PBA(A2)�PASSWORD�ONLY‰BNE.S�NOOUT‹YES *’DO�OUTPUT)‰CMP.W�#-2,HOLDFUSN-PBA(A2)‚FAMILY�USER�#‰BNE.S�FAM2ŠNO2‰MOVE.W�INFHS-PBA+FHSUSN(A2),OUTFHS-PBA+FHSUSN(A2)FAM2…LEA�HOLDFAM(PC),A0‰LEA�INFHS+FHSCLG(PC),A1‰LEA�OUTFHS+FHSCLG(PC),A2‰MOVE.B�#18,D0‡INIT�COUNTER(FAMLOPƒCMP.B�#'*',(A0)…CK�FOR�FAMILY�IND‰BNE.S�FAM3A‰NO"‰MOVE.B�(A1)+,(A2)+‚GET�FROM�INPUT‰ADD.L�#1,A0‰REPOSITION�MASKFAM3…SUB.B�#1,D0‰CK�FOR�END‰BNE�FAMLOPŠNO‰BRA.S�FAMNXTŠDONE&FAM3A„MOVE.B�(A0)+,(A2)+‚GET�FROM�MASK‰ADD.L�#1,A1‰REPOSITION�INPUT ‰BRA�FAM3NOOUT„LEA�INVOL(PC),A0‰LEA�OUTVOL(PC),A1 ‰BSR�MOVFILEFAMNXTƒLEA�OUTVOL(PC),A4%‰LEA�PBA(PC),A2ŠRESTORE�PGM�BASE�ADDR!‰TST.B�SEL-PBA(A2)‡MAKE�SELECTION‰BEQ.S�FAM3B‰NO ‰BSR�MOVMSGŠSET�UP�FILE�NAME�MSG‰LEA�COPOK(PC),A3 ‰BSR�PRTLU6I‰IOSCALL�OUTINIOS(PC)‰BNE�IOERPRT�BRIF�ERROR$‰BSR�SBARG‚FORCE�UPPER�CASE�RESPONSE ‰BNE‡FAM_TERM‰CMP.B�#'Q',MSGANS-PBA(A2)‰BEQƒSTOPNOW‡STOP�PROG‰CMP.B�#'Y',MSGANS-PBA(A2)‰BEQ.S�FAM3B‰CONTINUE‰BRA�FAMILYŠGET�NEXTFAM3B„LEA�OUTVOL(PC),A4 ‰BSR�MOVMSGŠSET�UP�FILE�NAME�MSG ‰LEA�COPOKB(PC),A3‡PRT�FILE�NAME ‰BSR�PRTLU3I7********************************************************’ASSIGN�INPUT7*******************************************************‰LEA‡INFHS(PC),A6!*œA6=INPUT�PARAMTER�BLOCK�ADDRESS‰CLR.B�ERFLAG-PBA(A2) ‰BSR�INITIN1‰TST.B�ERFLAG-PBA(A2) ‰BEQ.S�FAM3D*’***‚ERRROR�***FAMERCK‚CMP.B�#7,D0‰PROT�ERROR‰BNE.S�FAMER1ˆNO‰BSR�PROTPRT‰PRT�MSG ‰BRA.S�FAMRET"FAMER1ƒCMP.B�#6,D0‰FILE�DESC�ERROR ‰BNE.S�FAMER2 ‰BSR�INVALERR ‰BRA.S�FAMRETFAMER2ƒBSR�IOERPRTRˆIO�ERRORFAMRETƒBSR.S�CLOSNEC‰CLOSE�FILE ‰BRA�FAMILY*Ž**‚PROCESS‚**FAM3D„LEA�INFHS(PC),A5*7‰MOVE.W�PROTOUT-PBA(A2),FHSWCD(A5)…PASSWORD�FROM�OUTPUT‰CLR.B�ERFLAG-PBA(A2) ‰TST.B�FLAGP-PBA(A2)…NO�NEW�NAME‰BNE.S�FAM3E‰YES‰LEA�INVOL(PC),A1‰LEA�OUTVOL(PC),A0 ‰MOVE.B�#6,D0,FAMMOVƒMOVE.L�(A0)+,(A1)+‚MOVE�NAME�TO�INFHS‰SUB.B�#1,D0‰DONE‰BNE�FAMMOVŠNOFAM3E„BSR�RENAMEIT‰TST.B�ERFLAG-PBA(A2)‰BNE�FAMERCK‰CK�FOR�ERROR‰BSR�GOODR‹PRINT�GOOD�MSG‰BRA�FAMRETŠGET�NEXT�RECORD!FAMILYEX�BRA�STOPNOW‰EXIT�ROUTINE* FAM_TERM:‰CLR.B…FAMIFLAG-PBA(A2)(*œFORCE�TERMINATION�BY�CLEARING�FAMIFLAG ‰BRA‡IOERPRTR* MOVFILE‚EQU�*MOVFILE1 MOVE.L (A0)+,(A1)+‰MOVE.W�(A0)+,(A1)+‰MOVE.L�(A0)+,(A1)+…CAT‰MOVE.L�(A0)+,(A1)+‰MOVE.L�(A0)+,(A1)+…FILE‰MOVE.L�(A0)+,(A1)+‰MOVE.W�(A0),(5 A1)‡EXT‰RTS*$CLOSNEC‚MOVE.W�#FHCLOS,INFHS-PBA(A2)‰FHSCALL�INFHS(PC)‰CLR.B�ERFLAG-PBA(A2)„RESET‰RTS*‰PAGE*4******************************************************ˆROUTINE�TO�SPACE�COMPRESS&*ŠA0�CONTAINS�THE�SENDING�LINE�ADDRESS(*ŠA4�CONTAINS�THE�RECEIVING�LINE�ADDRESS,*ŠD1�CONTAINS�THE�LENGTH�OF�THE�SENDING�LINE*5******************************************************"SPCOMP…CMP.B�#'�',(A0)‚IS�IT�BLANK‚BEQ.S�BLD3ˆYES&‚MOVE.B�(A0)+,(A4)+‚MOVE�TO�PRINT�LINE"BLDECK„SUB.W�#1,D1…IS�THIS�THE�END‚BHI�SPCOMPˆNO"‚MOVE.B�#'�',(A4)‚PUT�BLANK�AT�END ƒRTS�RETURN*!BLD3…ADD.W�#1,A0‡INC�ADDR�OF�SEND ‚BRA�BLDECK**‰PAGE*ˆMOVE�FILE�NAME�TO�WORK�AREA"MOVMSGƒMOVE.L�(A4)+,VOLPRT-PBA(A2)MOVMSG1‚LEA�L1USN(PC),A0 ‰CLR.L�D0‰MOVE.W�(A4)+,D0‰MOVE.L�#4,D1ˆSIZE"‰BSR�BINDECFJˆCONV�TO�ASCII�USER�##‰MOVE.L�(A4)+,L1CAT-PBA(A2)‚CATALOG‰MOVE.L�(A4)+,L1CAT+4-PBA(A2) ‰MOVE.L�(A4)+,L1FIL-PBA(A2)‚FILE‰MOVE.L�(A4)+,L1FIL+4-PBA(A2)‰MOVE.W�(A4),L1EXT-PBA(A2)ƒEXT*’FOR�SPACE�COMPRESSION‰LEA�DIRMSG(PC),A0‰LEA�COPOKB(PC),A4‰MOVE�#34,D1‰SIZE ‰BSR�SPCOMP‰RTS*‰PAGE%**************************************;*ˆROUTINE�TO�DIRECT�OUTPUT�TO�SOMETHING�OTHER�THAN�TERMINAL*&**************************************9********************************************************** NEWOUTƒEQU�**%‰FHSCALL�LU3FHS(PC)‚CLOSE�PREV�ASSIGN ‰BNE�IOERPRT,‰LEA�LU3FHS(PC),A6ƒLU3�PARM�TABLE�ADDR�TO�A6@‰MOVE.B�#0,FHSWCD(A6)�LOAD�WRITE�PASSWORD�(USER�CAN�ALWAYS�WRITE?‰MOVE.B�#$FF,FHSRCD(A6)‚LOAD�READ�PASSWORD�(ONLY�USER�CAN�READ)3‰MOVE.W�USERNUM-PBA(A2),FHSUSN(A6)‚DEFAULT�USER�NUM-‰MOVE.L�VOLNAM-PBA(A2),FHSVOL(A6)‚VOLUME�NAME*‰MOVE.L�CATNAM-PBA(A2),FHSCLG(A6)‚CAT�NAME)‰MOVE.L�CATNAM+4-PBA(A2),FHSCLG+4(A6)‚CAT*‰MOVE.W�#'LS',FHSEXT(A6)‡DEFAULT�EXT�IS�SA5‰MOVE.L�OFLAG-PBA(A2),A0‡OFLAG�HAD�ADDR�OF�SCAN�START*)******************************************&*ˆSET�UP�A0�WITH�ADDR�OF�START�OF�SCAN'*ˆSET�UP�A6�WITH�ADDR�OF�FHS�PARM�BLOCK*‰CALL�EDITFILE�ROUTINE�****)****************************************** ‰BSR�EDITFILE‰TST.L�D0ŠCK�FOR�ERR0R ‰BMI.S�INVAL6‰BTST�#1,D0†CK�FOR�DEVICE�FLAG‰BNE.S�LU3ASS†YES‰TST.B�D0ˆCK�FOR�FAMILY%‰BNE.S�INVAL6ˆFOUND�FAMILY�INDICATION ‰BRA.S�NOTDEV)******************************************'*ˆ****ƒASSSIGN�LOGICAL�UNIT�3�(LISTING)*'****************************************LU3ASS: ‰BTSTW…#14,D0 ‰BNE‡X02000*œJMP�IF*¦DEVICE�SPECIFIED*¦VOLUME�FIELD�IS�NULL%*œTHE�USER�HAS�SPECIFIED�THE�TERMINAL$*œWHICH�IS�THE�DEFAULT�DEVICE�ANYWAY*œAS�THE�OUTPUT�DEVICE-‰MOVE.W�#FHASGN,FHSCMD(A6)‚SET�ASSIGN�COMMAND4‰MOVE.W�#FOPPW,FHSOPT(A6)‚SET�EXCLUSIVE�WRITE�OPTION ‰FHSCALL�(A6)!*ˆ*****ƒRETURN�FROM�FHS�CALL‚****‰BNE.S�IOERPRTˆERR0R!NEWOUTE‚RTSŒ.�RETURN�FROM�ROUTINE***)******************************************"*ˆ**‚OUTPUT�IS�A�FILE�NOT�A�DEVICE.*ˆ**‚A6�CONTAINS�ADDR�OF�OUTPUT�FHS�PARM�BLOCK*)****************************************** NOTDEVƒEQU�**3‰MOVE.W�#FHALLO+FHASGN,FHSCMD(A6)‚SET�ALLOC&�ASSIGN*4*ˆ***�PUBLIC�WRITE�OVERWRITE�&�VARABLE�LENGTH�RECORD*Š***‚OPTIONS�SET*'‰MOVE.W�#FOPPW+FOPEND+FOPSEQ,FHSOPT(A6)+‰CLR.W�FHSLRL(A6)‚SET�LOGIC�REC�LENGTH�TO�0"‰CLR.L�FHSSIZ(A6)‚SIZE�CODE�=�ZERO*‰FHSCALL�(A6)‡MAKE�FHS�CALL‰BEQ�NEWOUTEˆGOOD‰CMP.B�#5,D0‰DUP�FILE‰BNE.S�IOERPRT‰ERROR#‰MOVE.W�#FHASGN,(A6)�SET�TP�O�ASSGN‰FHSCALL�(A6)ˆTRY�AGAIN‰BNE.S�IOERPRT‰BRA�NEWOUTE‰CONTINUE*‰PAGE*FAMPRTƒLEA�COPOKB(PC),A3‰BSR.S�PRTLU3I‰RTS**’INVALID�MSG�TO�TERMINALINVAL6ƒMOVE.L�#EM_NVE,D0 ‰BSR�PRTERM ‰BRA�STOPNOW*-********************************************* IOERPRT‚EQU�*.‰MOVE.L�#LDFLUN,D1ƒSET�UP�FOR�MSG�HANDLER�CALL ‰BSR�PRTERM‰TST.B�FAMIFLAG-PBA(A2)†FAMILY‰BEQ�STOPNOW‰NO‰RTS*)IOERPRTR�MOVE.L�#3,D1ˆMOVE�ERROR�TO�LUN�3 ‰BSR�PRTERM‰TST.B�FAMIFLAG-PBA(A2) ‰BEQ�STOPNOW ‰RTS‡.‰RETURN*)PRTLU6I‚MOVE.L�A3,OUT6IIOS-PBA+IOSSAD(A2)"‰MOVE.L�A4,OUT6IIOS-PBA+5 IOSEAD(A2)‰IOSCALL�OUT6IIOS(PC) ‰BNE‡STOPNOW‰RTS* PROTPRT‚EQU�*‰MOVE.L�#3,D1’SET�D1�TO�LUN�3PRTCOM ‰BSR.S�PRTERM‰TST.B�FAMIFLAG-PBA(A2) ‰BEQ�STOPNOW‰RTS*'PRTLU3ƒMOVE.L�A3,OUT3IOS-PBA+IOSSAD(A2)!‰MOVE.L�A4,OUT3IOS-PBA+IOSEAD(A2)‰IOSCALLƒOUT3IOS(PC) ‰BNE‡IOERPRT‰RTS*)PRTLU3I‚MOVE.L�A3,OUT3IIOS-PBA+IOSSAD(A2)"‰MOVE.L�A4,OUT3IIOS-PBA+IOSEAD(A2)‰IOSCALLƒOUT3IIOS(PC) ‰BNE‡IOERPRT‰RTS* GOODR„EQU�*‰LEA‚GOODM(PC),A3‰LEA‚GOODME(PC),A4 ‰BSR�PRTLU3‰RTS**ˆPROTECT�ERROR�MESSAGE* PERRƒEQU�*‰LEA�PMSG(PC),A3‰LEA�PMSGE(PC),A4 ‰BRA.S�ERCALL*ERR1…CLR.B�FAMIFLAG-PBA(A2)INVALERR EQU *‰MOVE.L�#EM_NVE,D0ERR2:‰MOVE.L�#LDFLUN,D1‰BRA�PRTCOM‘GO�TO�PRINT�COMMON**&*ˆ**‚ROUTINE�TO�PRINT�ERR0R�MESSAGE‚***,*********************************************ERCALLƒBSR�PRTLU3‰TST.B�FAMIFLAG-PBA(A2)†FAMILY‰BEQƒSTOPNOW‡NO ‰RTS‡.‰RETURN‰PAGE‰PAGE***’ERROR�MESSAGE�CALLING�ROUTINE**ˆCALL†BSR‡PRTERM**ˆINPUT!*’D0�=�AS�RETURNED�FROM�TRAP�CALL,*’D1�=�USER�LOGICAL�UNIT�NUMBER�TO�OUTPUT�TO!*’A0�=�AS�RETURNED�FROM�TRAP�CALL**ˆOUTPUT*’NO�REGISTER�PRESERVATION* EM_XCEPT:‰DC.W†$0000…TABLE�TERMINATOR*PRTERM:‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A2)+*œSAVE�D0�AND�A0�IN�ERROR�MSG�PARAMETER�BLK‰AND.L…#$00FF,D0*œISOLATE�ERROR�STATUS�RETURN‰LEA‡EM_XCEPT(PC),A00*œA0=ADDR�OF�TBL�CONTAINING�ERROR�MSG�CODES�THAT-*ŸWILL�NOT�BE�CONSIDERED�AS�ERROR�TERMINATION *ŸCONDITIONS CEMP0100: ‰TST.W…(A0)‰BEQ.S…CEMP0200 *œJMP�IF�TABLE�HAS�BEEN�EXAMINED‰CMP.W…(A0)+,D0‰BEQ.S…CEMP0300'*œJMP�IF�ERROR�CODE�RETURN�IS�ONE�WHICH/*œWILL�RESULT�IN�BEING�AN�EXCEPTION�-�THIS�CASE**œWILL�NOT�BE�CONSIDERED�FOR�AN�ERROR�TYPE *œTERMINATION‰BRA.S…CEMP0100 *œREPEAT�LOOP CEMP0200:‰LEA‡TERM_FLG(PC),A0‰BSET†#BN00,(A0),*œSET�FLAG�TO�TERMINATE�WITH�ERROR�CONDITION CEMP0300:‰LEA‡EM_PBLK(PC),A0&*œA0=ADDR�USER�ERROR�MSG�PARAMETER�BLK‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)*œSET�THE�USER�LUN�TO�OUTPUT�TO ‰MOVE.L„#2,D0*œERROR�MSG�PRGM�INPUT�RQMNT‰TRAP†#4$*œISSUE�REQUEST�TO�ERROR�MSG�HANDLER‰MOVE.L„R_D67A01+4-PBA(A2),D0**œD0=CONTENTS�OF�REG�D7�UPON�PROGRAM�ENTRY ‰BTST.L„#0,D0 ‰BEQ‡STOPNOW*œJMP�IF�CHAIN�FILE�PROCESSING‰RTS **‰PAGE -*********************************************+*‚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�,D11*…MOVE.L�,A0*…BSR�BINDECFJ* *‚RETURNS:*…D0�=�0�=>GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *ŠDƒ*�*�**ŠAƒ*�**7TENS…DC.L�10000000,1000000,100000,10000,1000,100,10,1,0*$BINDECFJ MOVE.L #8,D2 MAX NO. DIGITS SUB.L D1,D2 NO. DIGITS TO SKIP! BMI.S BINDECF5 BRANCH ERROR EXIT LSL.L #2,D2 DOUBLE WORD LENGTH LEA TENS(PC),A1 START OF TABLE" ADD.L D2,A1 ADJUST FOR DIFFERENCE&�MOVE.W�#'‚',D2�INITIALIZE�ACCUMULATOR%BINDECF1 SUB.L (A1),D0 SUBTRACT 10**N BCS.S BINDECF2 BRANCH TOO BIG* ADD.W #1,D2 INCREMENT CURRENT DIGIT COUNT BRA BINDECF1 CONTINUE)BINDECF2 ADD.L (A1)+,D0 RESTORE, ADV PNTR TST.L (A1) TEST DONE BEQ.S BINDECF4 BRANCH DONE �CMP.W�#'‚',D2�LEADING�ZERO�TEST! BEQ.S BINDECF3 BRANCH STILL ZERO# ADD.B #$10,D2 BRING TO ASCII DIGIT%BINDECF3 MOVE.B D2,(A0)+ DEPOSIT CHAR LSL #8,D2 SAVE CHAR DEPOSITED# MOVE.B #$20,D2 RESTORE LS TO SPACE BRA BINDECF1 CONTINUE4BINDECF4 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 BINDECF5 RTS*‰PAGE*#*ˆOPTIONS�SPECIFIED�ON�COMMAND�LINE*X01000:"‰MOVE.L„PBA-PBA(A2),X00110-PBA(A2)&‰MOVE.L„PBA+4-PBA(A2),X00110+4-PBA(A2)*œSET�REVISION�CODE�IN�MSG‰LEA‡X00100(PC),A3‰LEA‡X00199(PC),A46 *œA3=START�MSG�ADDR*œA4=ENDƒMSG�ADDR ‰BSR‡PRTLU3*œPRINT�REVISION�CODE�MESSAGE‰MOVE.L„#EM_NVO,D0)*œD0=KEY�VALUE�FOR�INVALID�OPTION�MESSAGEX01100:‰CLR.B…FAMIFLAG-PBA(A2)*œSET�FLAG�-�TERMINATE ‰BRA‡ERR2*-*ˆRE-ASSIGN�THE�TERMINAL�AS�THE�OUTPUT�DEVICE*X02000:‰FHSCALLƒLU3AFHS(PC) ‰BNE‡IOERPRT‰RTS*** *ˆRTNE�TO"*’SAVE�THE�OUTPUT�PROTECTION�CODES*’SET�FLAG�INDICATING�ABOVE**X03000:‰MOVE.B„#1,FLAGOC-PBA(A2) *œSET�FLAG#‰MOVE.W„FHSWCD(A6),OUTCODEP-PBA(A2)*œSAVE�OUTPUT�PROTECTION�CODESTˆRTS‰PAGEPROGSIZE�EQU‡*-PBA ‰END�STARPROGéé=/* =/*†REPAIR.AF=/*)=/* Chain file to assemble REPAIR utility=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to REPAIR.LS=/*=/IFC \1ƒ=ARG�REPAIR.LS=/ENDIF=/**=ASM REPAIR1.SA,REPAIR1.RO,TEMP1.LS;RZ=220=/*{ Included files are:=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.FMI.EQ=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Y=/*%=ASM REPAIR2.SA,REPAIR2.RO,TEMP1.LS;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Aƒ=COPY�TEMP2.LS,\1;Yƒ=DEL�TEMP1.LSƒ=DEL�TEMP2.LS=/*=ENDééééé½#=/* =/*†REPAIR.LF=/*'=/* Link chain file to create REPAIR.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to REPAIR.LL=/*=/IFC \1ƒ=ARG�REPAIR.LL=/ENDIF=/*=LINK ,REPAIR.LO,\1;HAMIX ATTRIBUTES PSEG SEG0:0,14 $0000INPUT REPAIR1.ROINPUT REPAIR2.ROLIB 0.&.UTILIB.ROEND=/*=END6 ééééééÆŠPAGEOREPAIR IDNT 04,02 REPAIR Utility 01/31/85 Rel. 4.00 Copyright 1983 Motorola Inc‰PAGE**%*ˆBKM�LOGIC�CHANGES�TO�REPAIR�UTILITY***‰1.�'C'�OPTION�IS�TRULY�A�CHECK�ONLY�MODE!*�NO�UPDATING�WHAT-SO-EVER�OCCURS*;*‰2.�FOR�VARIABLE�LENGTH�RECORDS�(VRL)�AN�EDIT�IS�PERFORMED8*ŒTO�ENSURE�THAT�THE�BALANCE�OF�THE�DATA�BLOCK�IS�ZERO'S)*ŒAFTER�THE�LAST�RECORD�IN�THE�DATA�BLOCK*>*‰3.�FIXED�A�LOGIC�BUG�IN�THE�'UPDATE'�ROUTINE�TO�EDIT�FOR�THE*Œ'CR'�RESPONSE�ONLY*C*‰4.�STEVE�BALL�HAD�ALREADY�MADE�CHANGES�FOR�PROBLEM�OF�A�CRC�ERROR?*ŒWHILE�PROCESSING�SAT�TO�DISPLAY�ONLY�THOSE�SECTORS�IN�THE�SAT?*ŒTHAT�HAD�A�CRC�ERROR�---�THE�CODE�HAD�NOT�BEEN�CHECKED�OUT�--<*ŒI�CHECKED�IT�OUT�AND�MADE�MINOR�CHANGES�FOR�THOSE�PROBLEMS *ŒENCOUNTERED*C*‰5.�STEVE�BALL�HAD�ALREADY�MADE�CHANGES�FOR�PROBLEM�OF�PRINTER�NOTD*ŒREADY�--�A�1.5�SECOND�DELAY�AND�REPEAT�OF�ATTEMPT�TO�PRINT�MESSAGE>*ŒWAS�PUT�IN�--�ANY�ERROR�OTHER�THAN�NOT�READY�WOULD�TERMINATEA*ŒPROCESSING�--�THE�CODE�HAD�NOT�BEEN�CHECKED�OUT�--�I�CHECKED�IT;*ŒOUT�AND�MADE�MINOR�CHANGES�FOR�THOSE�PROBLEMS�ENCOUNTERED*F*‰6.�MESSAGE�-�PRINTER�ERROR�D0�=�XXXXXXXXU�-�WAS�BEING�OUTPUT�BECAUSED*ŒTHE�WRONG�ENDING�ADDRESS�WAS�BEING�SPECIFIED�-�THE�EXTRA�CHARACTER3*Œ'U'�WAS�BEING�DISPLAYED�---�PROBLEM�WAS�CORRECTED*$*ƒChanges�made�by�Marc�Briel‚1/17/83*E*‰1.�Modified�the�SAT�check�routine�to�execute�properly�if�the�number?*‹of�sectors�on�the�disk�being�repaired�exactly�filled�the�SAT.A*‹Previously,�REPAIR�would�attempt�to�allocate�sectors�far�beyond@*‹the�end�of�the�SAT�buffer�causing�a�bus�error�or�system�crash.*F*‰2.�Added�a�check�for�the�disk�configuration�area.�If�a�configurationD*‹area�exists,�its�length�must�be�non-zero�or�an�error�is�issued�andD*‹the�utility�terminates.�If�the�length�is�non-zero,�the�disk�SAT�isB*‹checked�to�assure�that�the�sectors�are�allocated�and�the�sectorsB*‹are�allocated�in�the�reconstructed�SAT.�Any�allocation�conflicts"*‹that�arise�are�handled�as�usual.*ÈÏ/ØJàPèIð*øGH2op n(m0u8w@KHHPAXE`PhOpDx;€HˆA�a˜@ @¨F°T¸E7 (*ƒChanges�made�by�Ron�Jones,�Jr.�7/26/83*G*‰1.�Added�a�line�of�code�to�the�"CHECK�ATTRIBUTES"�routine�that�maskesC*Œoff�all�but�the�bits�that�represent�the�file�type.�This�fixed�theB*Œproblem�of�an�error�"ER:�FILE�ATTRIBUTES"�bieng�generated�if�anyA*Œof�the�bits�in�the�user�specified�attribute�field�are�set.�This=*Œis�even�though�all�other�file�attributes�are�correctly�set.‰PAGE*!* EQUATES (INCLUDED UNDER NOLIST)ŠNOLISTŠINCLUDE�9995.&.EXE.EQŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.NIO.EQŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.FMI.EQŠLIST*‰INCLUDE�9995.&.EXE.EQ*‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�9995.&.NIO.EQ*‰INCLUDE�9995.&.FME.EQ*‰INCLUDE�9995.&.FMI.EQ*O*******************************************************************************O**********************************************************************************$*ˆR�E�P�A�I�R„U�T�I�L�I�T�Y‚-�PART�1***O*******************************************************************************O*********************************************************************************ˆ*************ˆDATA�SECTION*ˆ*************B*ˆNOTE:�ALL�SECTOR�NUMBERS�MUST�BE�LESS�THAN�OR�EQUAL�TO�$7FFFFFFF*ˆ(HIGH�ORDER�BIT�OFF).2*ˆALSO,�2�COMPLETE�SAT�BUFFERS�ARE�MEMORY�RESIDENT***ˆLINKAGE�TO�PART�2*ŠXDEFƒBŠXDEFƒSATABUF,SATDBUF,SATFLG(ŠXREFƒBDCONV,EDITFILE,OPTION,PARSE,SBARG/ŠXREFƒALDESC,TSTNYA,TSTFRE,TSTALC,DEALLC,ALLOCT9ŠXREFƒDECBINW,CHKKEY,IM,HEXBIN,CLRBUF,BLNKFL,ALPHA,ALFNUM ŠXREFƒBIN4HEX ŠXREFƒBIN2HEX ŠXREFƒBIN1HEX ŠXREFƒBIN2DECŠOPT„A *ˆEQUATES*3PDBSZE„EQU„DBSZEŽCHANGE�NAMES�FOR�UNIFORMITY'S�SAKEPDBFPT„EQU„DIRFPTPDBENT„EQU„DIRENTPDBSTR„EQU„DIRSTRPDBLEN„EQU„DIRLEN*7*ˆTHE�FOLLOWING�LUN'S�MUST�BE�AVAILABLE�FOR�ASSIGNMENT:D*ˆ(CDF/LDF�LUN�MUST�BE�ASSIGNED�AND�TRANSFERRED�TO�REPAIR�BY�LOADER)**VOLLUN„EQU„1’LUN�FOR�VOLUME�TO�BE�REPAIREDPRTLUN„EQU„2’LUN�FOR�PRINTER**ˆTASK�AND�SEGMENT�EQUATES*&TASKID„EQU„'REPA'�TASK�NAME�FOR�REPAIR.SATSEG„EQU„'SATS'�SEGMENT�NAME�FOR�SAT�SEGMENTB*ˆ(SEGMENT�ALLOCATED�AFTER�VID�CHECK�STEP�-�REMAINS�ALLOCATED�TILL*ˆREPAIR�TERMINATES.)-FDBSEG„EQU„'FDBS'�FAB/DATA�BLOCK�SEGMENT�NAMED*ˆ(SEGMENT�ALLOCATED�FOR�EACH�NONCONTIGUOUS�FILE�CHECK�-�DEALLOCATED*ˆAT�END�OF�THE�FILE�CHECK.)**CRˆEQU„$D‘CARRIAGE�RETURNLFˆEQU„$A‘LINE�FEED2NOPTIONƒEQU„0’D6�EQUATE�FOR�SCANNING�OPTIONS�FIELD1MAXBAD„EQU„12‘NUMBER�OF�TRACKS�FOR�ALT�SECTORS‚()ŠPAGE*1*ˆD7�BIT�EQUATES�-�SEE�VID�CHECK�FOR�MORE�DETAILS*"DEFOPT„EQU„1’DEFAULT�OPTION�STATUSKOPTIONƒEQU„131RCRSAT„EQU„14‘1�=>�RECREATE�SAT,�0�=>�USE�OLD�SAT9COPTIONƒEQU„15‘IM�OFF�FOR�CHECK-ONLY�MODE�(TERM�ON�ERROR)&IMC‡EQU„16‘IM�OFF�MODE�TILL�ERROR/DONE3NXTSTP„EQU„17‘IM�OFF�TILL�NEXT�MAJOR�STEP�OF�REPAIR.STP1†EQU„18‘IM�TURNED�OFF�TILL�NEXT�MINOR�STEP/FOUNDF„EQU„29‘SET�=>�FILE�FOUND�FOR�FILE�REPAIR*’OFF�=>�FILE�NOT�FOUND�YETROPTIONƒEQU„301FREPAIRƒEQU„31‘FILENAME�GIVEN‚FOR�REPAIR/RECOVERY5NIMASK„EQU„$0FFF0000ŠMASK�TO�TURN�IM�BACK�ON�IF�ERROR**O******************************************************************************** ŠSECTION�0B‰EQU„*’FOR�BASE�REFERENCINGŠDC.Bƒ'013185�4'*O********************************************************************************PATCH:„DS.Bƒ100�PATCH�AREA*ŠDS.Bƒ500�STACK�AREA*3STACK…EQU„*’STACK�OVERFLOW�WILL�CAUSE‚ADDRESS�ERROR*$************************************ *ˆM�A�C�R�O�S$************************************ L0LFƒMACROŠDC.Bƒ\1ŠDC.BƒCRŠDS…0ŠENDM L1LFƒMACROŠDC.Bƒ\1ŠDC.BƒCRŠDC.BƒLFŠDS…0ŠENDM L2LFƒMACROŠDC.Bƒ\1ŠDC.BƒCRŠDC.BƒLFŠDC.BƒLFŠDS…0ŠENDM *ˆ****************************ˆSTART�OF�UNINITIALIZED�DATA*ˆ**************************** DATAUI„EQU„**-DRVHEADS‚DS.Bƒ1’NUMBER�OF�HEADS�ON�THIS�DRIVE4SECPTRAK‚DS.Bƒ1’NUMBER�OF�SECTORS/TRACK�ON�THIS�DISK7ALTLASTƒDS.Lƒ1’PSN�OF�FIRST�SECTOR�OF�ALTERNATE�SECTORS2LSTSRD„DS.Lƒ1’PSN�OF�LAST�SECTOR�BEFORE�READ�ERROR7 8TOTVSECT‚DS.Lƒ1’TOTAL�NUMBER�OF�VERSAdos�SECTORS�ON�DISKLINESTRT‚DS.Lƒ1AMTLEFTƒDS.Lƒ1 SDBDEL„DS.Lƒ1 PDBDEL„DS.Lƒ1**ˆSECTOR�BUFFER�FOR�VID*VIDBUF„DS.Bƒ256*6*ˆSECTOR�BUFFER�FOR�READING�IN�SECTORS�FOR�UPDATE/DUMP*SECBUF„DS.Bƒ2560PSNSEC„DS.Lƒ1’PSN�OF�SECTOR�IN�BUFFER�(0�=�NONE)***‰POINTERS�TO�THE�BUFFER�IN�USE*/USESBUFƒDS.Lƒ1’ADDRESS�OF�SDB�BUFFER�BEING�USED/USEPBUFƒDS.Lƒ1’ADDRESS�OF�PDB�BUFFER�BEING�USED** *‰SDB�BUFFER*-PSNSDB„DS.Lƒ1’PSN�OF�SDB�IN�BUFFER�(0�=�NONE)'PRVSDB„DS.Lƒ1’PRIOR�SDB'S�PSN,�0�=�NONE'NXTSDB„DS.Lƒ1’PSN�OF�NEXT�SDB,�0�=�NONE SPTR1…DS.Lƒ1SDBBUF„DS.BƒSDBSZE*256*6*‰ALTERNATE�SDB�BUFFER†(USED�IN�EMPTY�STRUCTURE�CHECK)* SPTR2…DS.Lƒ1SDB2BUFƒDS.BƒSDBSZE*256** *ˆPDB�BUFFER*.PSNPDB„DS.Lƒ1’PSN�OF�PDB�IN�BUFFER‚(0�IF�NONE)-PRVPDB„DS.Lƒ1’PSN�OF�PREVIOUS�PDBƒ(0�IF�NONE))NXTPDB„DS.Lƒ1’PSN�OF�NEXT…PDBƒ(0�IF�NONE) PPTR1…DS.Lƒ1PDBBUF„DS.BƒPDBSZE*256*6*‰ALTERNATE�PDB�BUFFER†(USED�IN�EMPTY�STRUCTURE�CHECK)* PPTR2…DS.Lƒ1PDB2BUFƒDS.BƒPDBSZE*256**:*ˆSAT�BUFFER�ADDRESSES‚-�BUFFERS�ALLOCATED�AFTER�VID�CHECK*@SATABUFƒDS.Lƒ1‹ADD.�OF�ALLOCATION�SAT�BUFFER�(CREATED�BY�REPAIR)DSATDBUFƒDS.Lƒ1‡ADD.�OF�OLD�SAT�BUFFER�(FROM�DISK,�CHANGED�BY�REPAIR)**ˆPRIOR�FAB'S�LAST�KEY*$PRIFKY„DS.Bƒ100�100�=�MAX�KEY�LENGTHŠPAGE*D*ˆFAB�AND�DATA�BLOCK�BUFFERS�-�BUFFER�ALLOCATED�FOR�EACH�FILE�DURING+*ˆFILE�CHECK,�RELEASED�AT�END�OF�THE�CHECK.*5PSNFAB„DS.Lƒ1’PSN�OF�CURRENT�FAB�IN�MEMORY�(0�=�NONE),PRVFAB„DS.Lƒ1’PSN�OF�PREVIOUS�FAB�(0�=�NONE)JFABLNK„DS.Lƒ1�PSN�OF�LAST�FAB�USING�FORWARD�LINKS,�TO�BE�LINKED�(0�=�NONE):FDBSTR„DS.Lƒ1�STARTING�LOGICAL�ADDRESS�OF�FAB-DATA-SEGMENT9*’ADDRESS�KNOWN�AFTER�IT�IS�ALLOCATED.�(PHYSICAL=LOCIGAL)5*’SEGMENT�ALLOCATED�FOR�EACH�FILE�CHECK�TO�GET�PROPER9*’SIZE�BUFFERS;�FAB�BUFFER�IS�AT�BEGINNING�OF�THE�SEGMENT'*’AND�IS�FOLLOWED�BY�DATA�BLOCK�BUFFER.'FABBUF„EQU„FDBSTR�ADDRESS�OF�FAB�BUFFER3PSNDB…DS.Lƒ1’PSN�OF�DATA�BLOCK�IN‚MEMORY�(0�=�NONE)!DBBUF…DS.Lƒ1’ADDRESS�OF�DB�BUFFER.DBEND…DS.Lƒ1’ADDRESS�OF�LAST�BYTE�OF�DBBUF�+�1-DBLEA…DS.Lƒ1’LOGICAL�END�ADDRESS�OF�DB�BUFFER&FABLEN„DS.Lƒ1’NUMBER�OF�SECTORS�IN�FAB2FABCHK„DS.Bƒ1’FAB�LINK�FLAG�FOR�CHECKING�FAB�CHAINFFBFLNK„EQU„0ƒDO�FORWARD�THEN�BACKWARD�SEARCH,�NOW�DOING�FORWARD�SEARCH#FLOLNK„EQU„1’DO�ONLY�FORWARD�SEARCH6FBBLNK„EQU„2’DOING�BACKWARD�SEARCH�AFTER�FORWARD�LINKS$BLOLNK„EQU„3’DO�BACKWARD�SEARCH�ONLY)LSTLNK„EQU„$FF�DONE,�DOING�LAST�FAB�CHECKDBFLG…DS.Bƒ1‰0�=�DB‚NOT�UPDATED,�1�=�DB‚UPDATED,�WRITE�TO�DISK?SATFLG„DS.Bƒ1‰0�=�SAT�NOT�TO�BE�UPDATED,�1�=�UPDATE�SAT�ON�DISKBCFGAFLGƒDS.Bƒ1‰0�=�CFGA�NOT�TO�BE�UPDATED,�1�=�UPDATE�CFGA�ON�DISK**5PRTFLG„DS.Bƒ1’0�=>�DUMP�TO�LDFLUN,�1�=�DUMP�TO�PRTLUNGCPYFLG„DS.Bƒ1ƒ1�=>�TERMINAL�OUTPUT�ONLY,�0�=>�HARD�COPY�TO�LINE�PRINTER%LINECNTƒDS.Bƒ1’LINES�PER�PAGE�PRINTED:MAXLINES‚DC.Bƒ1’MAX�#�OF�LINES�PER�PAGE�FOR�PRINTER�OUTPUT!FILOK…DS.Bƒ1’1=FILE�OK,�0=�NOT�OK8 6RCVFLG„DS.Bƒ1’1=RECOVERING�DELETED�FILE,�0=NO�RECOVERY,DELCRI„DS.Bƒ1’1=DELETE�CURRENT�ITEM,�0=DON'T-DELPRI„DS.Bƒ1’1=DELETED�PRIOR�FAB,0=IF�DIDN'T,DELNXF„DS.Bƒ1’1=DELETED�NEXT�FAB,0=IF�DIDN'T*KILL†DS.Bƒ1’KILL�REPAIR*&TEMP†DS.Lƒ1’TEMPORARY�REGISTER�STORAGE**'*‰FLAGS�USED�BY�'EMPTY�STRUCTURE�CHECK'*/CRSDBFLG‚DS.Bƒ1’SDB�CURRENT�BUFFER�UPDATED�FLAG3FIRSFLGƒDS.Bƒ1’1st�CHAR�IN�LINE�TO�BE�PRINTED�FOUND-LSSDBFLG‚DS.Bƒ1’PREVIOUS�STRUCTURE�=�SDB�FLAG-LSPDBFLG‚DS.Bƒ1’PREVIOUS�STRUCTURE�=�PDB�FLAG/PUPFLG„DS.Bƒ1’PDB�ALTERNATE�BUFFER�UPDATED�FLAG/SUPFLG„DS.Bƒ1’SDB�ALTERNATE�BUFFER�UPDATED�FLAG2SATSGFLG‚DS.Bƒ1’1=�SAT�SEGMENT�ALLOCATED�IN�MEMORY***‰FLAGS�USED�BY�HELP�FACILITY*)ASKCTFLG‚DS.Bƒ1’1=�ASK�TO�CONTINUE‚0=�NOT***ˆUPDATE�SECTOR�LIMITS*>UPDSTR„DS.Lƒ1ŒUPDATE�PSN�BOUNDS:�FIRST�PSN�THAT�MAY�BE�UPDATED*œ(LOWER�BOUND)/UPDEND„DS.Lƒ1’FIRST�PSN�THAT�MAY�NOT�BE�UPDATED*œ(UPPER�BOUND�+�1)ŠPAGE**ˆDISK�ATTRIBUTES*FMPSN†DS.Lƒ1‚LAST�PSN�AVAILABLE�ON�THE�DISK�(MPSN+1=TOTAL�#�OF�SECTORS)ANOSEC…DS.Wƒ1ˆ#�OF�SECTORS�NOT�ON�DISK�BUT�MARKED�ALLOCATED�IN�SAT**ˆLINE�BUFFER�FOR�DUMP*LINEBUFƒDS.Bƒ2’2�SPACESOFSFLD„DS.Bƒ2’OFFSET�FIELDŠDS.Bƒ2’2�SPACES.ŠDS.Bƒ16*3+1�16�BYTES�IN�HEX�FOLLOWED�BY�SPACEŠDS.Bƒ3’3�SPACES#ASCFLD„DS.Bƒ16‘ASCII�REPRESENTATIONLINEL…EQU„*-LINEBUF**ˆ**************************ˆEND�OF�UNINITIALIZED�DATA*ˆ**************************ŠDS.Lƒ0:DATAUILƒEQU„*-DATAUI‹BYTE�COUNT�TO�CLEAR�IN�INITIALIZATIONŠPAGE*(*ˆCOMMAND�LINE�AND�INPUT/RESPONSE�BUFFER*(INPBUF„COMLINE�81�80�CHARACTER�LINE�+�CRINPBUFEƒEQU„*-1�END�OF�BUFFERŠDS.Lƒ0*)INITREGƒEQU„*’REGS�SAVED�ON�INITIAL�ENTRY-STSKNAMƒDS.Lƒ1’D0�=�TASK�NAME�THAT�STARTED�ME1SESNUM„DS.Lƒ1’D1�=�SESSION�NUMBER�THAT�STARTED�ME&VOLNAM„DS.Lƒ1’D2�=�DEFAULT�VOLUME�NAME'USERNUMƒDS.Lƒ1’D3�=�DEFAULT�USER�NUMBER(CATNAMEƒDS.Lƒ1’D4�=�DEFAULT�CATALOG�NAME-ŠDS.Lƒ1’D5�=�2ND�HALF�OF�DEFAULT�CATALOG�NAME,ŠDS.Lƒ1’D6�=�#�OF�CHARACTERS�IN�COMMAND�LINEéééééééé8 éééééééééééééééé9 éééééééééééééééé9 éééééééééééééééé: éééééééééééééééé: éééééééééééééééé; éééééééééééééééé; éééééééééééééééé< éééééééééééééééé< éééééééééééééééé= éééééééééééééééé= éééééééééééééééé> éééééééééééééééé> éééééééééééééééé? éééééééééééééééé? éééééééééééééééé@ éééééééééééééééé@ ééééééééééééééééA ééééééééééééééééA ééééééééééééééééB ééééééééééééééééB ééééééééééééééééC ééééééééééééééééC ééééééééééééééééD ééééééééééééééééD ééééééééééééééééE ééééééééééééééééE ééééééééééééééééF ééééééééééééééééF ééééééééééééééééG ééééééééééééééééG ééééééééééééééééH ééééééééééééééééH ééééééééééééééééI ééééééééééééééééI ééééééééééééééééJ ééééééééééééééééJ ééééééééééééééééK ééééééééééééééééK ééééééééééééééééL ééééééééééééééééL ééééééééééééééééM ééééééééééééééééM ééééééééééééééééN ééééééééééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé