IMD 1.17: 11/11/2014 12:10:11 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 28 OF 30  SR28q82VKXSVRDOS 0420§a-0!�characterˆOPTION*2 �dataˆPRAMBL/'PREAMBLE'/�dataˆDEST/'U'/�dataˆOPTION/'AA'/ �P�=�133�BUFF(�3:3�)�=�'A'�write�(6,�200)�PRAMBL�write�(6,�200)�DEST�write�(6,�200)�OPTION�write�(6,�200)�'132'�write�(6,�100)�'1' �RESP�=�'�'�return 100Šformat�(A)200Šformat�(A$)Šend #Šsubroutine�GETFRM(�BUFF,�Q,�RESP�) �characterˆBUFF*(*) �logical�Q�characterˆRESP �include�'common' �integer�I �integer�J�integer�CKSUM1�integer�CKSUM2�integer�X2TOI  �if�(�BUFF(�3:3�)�.eq.�'Z')�then “Q�=�.true.�end�if�if�(�.not.�Q�)�then'C“do�until�(�RESP�.eq.�'N'�)�.or.�(�Q�) 10“continue˜if�(�RESP�.ne.�'�'�)�then›write�(6,�100)�RESP˜end�if˜do�20�J�=�1,�BLKCNT›read�(5,�400)�BUFF400›format�(�A132�)!›if�(�BUFF(�1:1�)�.eq.�'T'�)�then  Q�=�.true. return›end�if 20˜continue ˜RESP�=�'N'˜CKSUM1�=�X2TOI(BUFF(�1:2�))˜if�(�CKSUM1�.lt.�0�)�then ›RESP�=�'R'˜end�if˜if�(�CKSUM1�.ne.�0�)�then ›CKSUM2�=�0›do�40�I�=�3,�132 ! CKSUM2�=�CKSUM2+ichar(BUFF(I:I)) 40›continue›CKSUM2�=�mod(CKSUM2,�255)�+�1›if�(�CKSUM1�.ne.�CKSUM2�)�then  RESP�=�'R'›end�if˜end�if.“if�((�RESP�.ne.�'N'�)�.and.�(�.not.�Q�))�then –go�to�10“end�if�end�if�return 100‹format�(A)‹end '‹subroutine�GETC(�C,�BUFF,�P,�Q,�RESP�) �characterˆC�characterˆBUFF*(*) �integer�P �logical�Q�characterˆRESP �include�'common' �if�(�P�.le.�132�)�then“C�=�BUFF(�P:P�) “P�=�P�+�1�else“call�GETFRM(�BUFF,�Q,�RESP�)“C�=�BUFF(�4:4�)“P�=�5�end�if�return 100‹format�(A)‹end 3‹subroutine�GETREC(�Q,�P,�BUFF,�REC,�RESP,�CHRCNT�) �logical�Q �integer�P�characterˆBUFF*(*)�characterˆREC*(*)�characterˆRESP�integer�CHRCNT �integer�I �integer�J �integer�K�integer�X2TOI �integer�ATOI �integer�BCNT�characterˆLEN*2�characterˆBCHR�characterˆLCHR *�call�GETC(�LEN(�1:1�),�BUFF,�P,�Q,�RESP�)*�call�GETC(�LEN(�2:2�),�BUFF,�P,�Q,�RESP�) �if�(�LEN(�1:1�)�.eq.�'�'�)�then “Q�=�.true.�end�if�if�(�.not.�Q�)�then“CHRCNT�=�X2TOI(LEN(�1:2�))“if�(�CHRCNT�.lt.�0�)�then1˜write�(0,�100)�'uload:�FATAL�Transmission�error'˜stop“end�if“J�=�1“I�=�1C“do�while�(�I�.le.�CHRCNT�)50“if�(�I�.le.�CHRCNT�)�then*˜call�GETC(�REC(�J:J�),�BUFF,�P,�Q,�RESP�) ˜if�(�REC(�J:J�)�.eq.�'|'�)�then$›call�GETC(�BCHR,�BUFF,�P,�Q,�RESP�)$›call�GETC(�LCHR,�BUFF,�P,�Q,�RESP�)œBCNT�=�ATOI(�LCHR�)›if�(�BCNT�.gt.�0�)�then do�60�K�=�J,�J�+�BCNT�-�1§REC(�K:K�)�=�BCHR 60 continue  J�=�J�+�BCNT›else  J�=�J�+�1 REC(�J:J�)�=�BCHR  J�=�J�+�1 REC(�J:J�)�=�LCHR  J�=�J�+�1œend�if ŸI�=�I�+�3œelse ŸI�=�I�+�1 ŸJ�=�J�+�1›end�if ›go�to�50“end�if“CHRCNT�=�J�-�1�end�if�return 100‹format�(A)‹end  ‹subroutine�PUTREC(�COUNT,�REC�) �integer�COUNT�characterˆREC*(*) �integer�I �do�70�I�=�1,�COUNT“write�(7,�200)�REC(�I:I�) 70�continue�write�(7,�100)�return 100‹format�(A)200‹format�(A$)‹end ˆPROGRAM�UPLOAD ˆcharacterˆBUFF*132ˆcharacterˆREC*132ˆcharacterˆRESP ˆlogical�Qˆinteger�BUFFPˆinteger�RECLENˆcharacter‡ID*50 ˆinclude�'common' ,ˆdata„ID/'@(#)uload.f:1.3ˆ8/4/83(13:31:48)'/ˆdataˆCMAX/132/ˆdataˆRMAX/132/ˆdataˆBLKCNT/1/ˆdataˆBMAX/132/ˆdataˆEOTRAN/'T'/ˆdataˆCHRMAX/127/ ˆrewind�7 ˆcall�INIT(�BUFF,�BUFFP,�RESP�) ˆQ�=�.false.1ˆcall�GETREC(�Q,�BUFFP,�BUFF,�REC,�RESP,�RECLEN�)Cˆdo�while�(�.not.�Q�)80ˆif�(�.not.�Q�)�thenŒcall�PUTREC(�RECLEN,�REC�)1Œcall�GETREC(�Q,�BUFFP,�BUFF,�REC,�RESP,�RECLEN�) Œgo�to�80ˆend�ifˆwrite�(6,�100)�EOTRAN 100ˆformat�(A)ˆendé=/* =/*†UTILIB.CF=/*A=/* The library/system equates diskette does not require the linkD=/* function, however, this chain file will permit the user to buildA=/* the system related library which can be accessed by the user.@=/* The files currently in the system library are those that are>=/* currently documented in the UTILIB chain file (UTILIB.AF).=/*=/* Chain file to:8=/*†Delete�the�existing�utility�library�file�"UTILIB.RO"=/*†Build�a�new�utility�library=/*F=/* The required order in which files are added to the utility libraryE=/*�is�defined�below.‚If�the�user�elects�to�'NOT'�rebuild�the�libraryB=/* in total he must use the 'REPLACE' library command and not the =/* 'ADD' and 'DELETE' commands.=/*=DEL UTILIB.RO=LIB UTILIB.ROADD UTILIB.EDT.ROADD UTILIB.PAR.ROADD UTILIB.OPT.ROADD UTILIB.ARG.ROADD UTILIB.DTC.ROADD UTILIB.BDC.ROADD UTILIB.CVT.ROADD UTILIB.COD.ROLISTQUIT=/*=END éééé4 ' BUILDS DEFAULT SAIIÝrrFILENAMESAbbÌrrFORCE SA{{[rrLOOKUP SAŒŒrrSETDIAG SA­­;rr ‰LLEN„1202‰TTL…V�A1.10�80-04-17�FILE�NAME�DEFAULTING�ROUTINE?PDEFAULT�IDNT„1,1ˆV�A1.10�80-04-17�FILE�NAME�DEFAULTING�ROUTINE ‰SECTION�9 **********7*ˆTHE�FOLLOWING�IS�A�ASSEMBLY�LANGUAGE�ROUTINE�DESIGNED%*„TO�BE�CALLED�FROM�A�PASCAL�PROGRAM.*8*ˆIT�SHOULD�BE�DECLARED�IN�THE�PASCAL�PROGRAM�AS�FOLLOWS*@*ˆPROCEDURE�P$DEFAULT(VAR�DEFUALT,RESULT:�TEXT;�EXT:�EXTENSION); *ˆFORWARD;*9*ˆWHERE�'EXTENSION'�WAS�DECLARED�AS�FOLLOWS�IN�THE�TYPE'S*,*ˆEXTENSION�=�PACKED�ARRAY�[�1..2�]�OF�CHAR;*4*ˆWHEN�THE�ROUTINE�GETS�CONTROL�THE�STACK�LOOKS�LIKE**�0�-+-------------------+ *�|†RETURN‡| *�|†ADDRESS†|*�4�-+-------------------+*�|�DEFAULT�EXTENSION�|*�6�-+-------------------+*�|�FILE�POINTER�FOR‚|*�|�RESULT�FILE‡|*Œ10�-+-------------------+*�|�FILE�POINTER�FOR‚|*�|�DEFAULT�FILE†|*�+-------------------+*�|“|*7*ˆDEFAULTER�MODIFIES�THE�RESULT�FILE�TO�THE�SAME�AS�THE7*…DEFAULT�FILE�FOR�ALL�FIELDS�NOT�SPECIFIED,�EXCEPT�THE>*…EXTENSION,�WHICH�IT�MODIFIES�TO�THE�PASSED�DEFAULT�EXTENSION*<*ˆIF�THE�DEFAULT�FILE�IS�A�DEVICE,�AND�NO�NAME�WAS�SPECIFIED/*…THEN�THE�RESULT�FILE�WILL�BE�THE�SAME�DEVICE.*9*ˆIF�THE�RESULT�FILE�WAS�PASSED�ASSIGNED,�THEN�NO�CHANGES*…ARE�MADE�AT�ALL�TO�IT.*>*ˆIF�THE�DEFAULT�FILE�IS�THE�SAME�FILE�AS�THE�RESULT�FILE,�AND=*…NO�NAME�WAS�GIVEN�THEN�THE�RESULT�FILE�BECOMES�THE�CONSOLE.*7*ˆTHE�REGISTERS�HAVE�THE�FOLLOWING�MEANINGS�THROUGH�THE*…CODE.*9*ˆA1�=�POINTER�TO�THE�FILE�DESCRIPTOR�FOR�THE�RESULT�FILE:*ˆA2�=�POINTER�TO�THE�FILE�DESCRIPTOR�FOR�THE�DEFAULT�FILE*<*ˆD0�=�THE�BIT�NUMBER�BEING�TESTED�IN�THE�HYBRID�SCAN�STATUS)*ˆD1�=�THE�SCAN�STATUS�OF�THE�RESULT�FILE**ˆD2�=�THE�SCAN�STATUS�OF�THE�DEFAULT�FILE*ˆD3�=�THE�HYBRID�SCAN�STATUS* **********  ***********ˆFIELD�OFFSETS* **********1FDP†EQU…4‹*�4�=�OFFSET�TO�FILE�DESCRIPTOR�POINTER>PFSHI„EQU…4‹*�4�=�OFFSET�TO�PASCAL�FILE�STATUS�IN�FD.(HI�BYTE)7IFDSS„EQU…$4E‰*�$4E�=�OFFSET�TO�SCAN�STATUS�BYTE�IN�FD.AEJHRQ3CONS…EQU…$36‰*�$36�=�OFFSET�TO�TERM�ID�IN�PROG�RMA.*0VOL†EQU…$2A‰*�$2A�=�OFFSET�TO�VOLUME�NAME�IN�FD.0USR†EQU…$2E‰*�$2E�=�OFFSET�TO�USER�NUMBER�IN�FD.1CAT†EQU…$30‰*�$30�=�OFFSET�TO�CATALOG�NAME�IN�FD..NAM†EQU…$38‰*�$38�=�OFFSET�TO�FILE�NAME�IN�FD..EXT†EQU…$40‰*�$40�=�OFFSET�TO�EXTENSION�IN�FD.* ********** *ˆBIT�NUMBERS* **********2ASSIGNED�EQU…1‹*�1�=�FILE�PASSED�ASSIGNED�FLAG�BIT*/DEVB…EQU…7‹*�7�=�DEVICE�BIT�IN�SCAN�STATUS�BYTE/VOLB…EQU…6‹*�6�=�VOLUME�BIT�IN�SCAN�STATUS�BYTE4USRB…EQU…5‹*�5�=�USER�NUMBER�BIT�IN�SCAN�STATUS�BYTE0CATB…EQU…4‹*�4�=�CATALOG�BIT�IN�SCAN�STATUS�BYTE-NAMB…EQU…3‹*�3�=�NAME�BIT�IN�SCAN�STATUS�BYTE2EXTB…EQU…2‹*�2�=�EXTENSION�BIT�IN�SCAN�STATUS�BYTE*‰PAGE ***********ˆCODE�STARTS�HERE*B*ˆP$DEFAULT,P$1DEFAULT,P$2DEFAULT,P$3DEFAULT,P$4DEFAULT,P$5DEFAULT*ˆP$RDEFAULT,P$TDEFAULT* **********‰XDEF„P$DEFAULT‰XDEF„P$1DEFAULT‰XDEF„P$2DEFAULT‰XDEF„P$3DEFAULT‰XDEF„P$4DEFAULT‰XDEF„P$5DEFAULT‰XDEF„P$RDEFAULT‰XDEF„P$TDEFAULT*P$DEFAULTˆEQU‚*†!�ENTRY�POINT�1 P$1DEFAULT‡EQU‚*†!�ENTRY�POINT�2 P$2DEFAULT‡EQU‚*†!�ENTRY�POINT�3 P$3DEFAULT‡EQU‚*†!�ENTRY�POINT�4 P$4DEFAULT‡EQU‚*†!�ENTRY�POINT�5 P$5DEFAULT‡EQU‚*†!�ENTRY�POINT�6 P$RDEFAULT‡EQU‚*†!�ENTRY�POINT�7 P$TDEFAULT‡EQU‚*†!�ENTRY�POINT�8*#DEFAULT:�EQU…*‹*�DEFUALT�FILE�NAMES**6*ˆLOAD�ADDRESS�OF�THE�RESULT�FILE�POINTER�INTO�A1,�AND2*ˆTHE�ADDRESS�OF�THE�DEFAULT�FILE�POINTER�INTO�A2.*>‰MOVEM.L�6(A7),A1/A2ƒ!�LOAD�THE�ADDRESSES�OF�THE�FILE�POINTERS*?*ˆLOAD�THE�ADDRESS�OF�THE�RESULT�FILE�DESCRIPTOR�BLOCK�INTO�A1,?*ˆAND�THE�ADDRESS�OF�THE�DEFAULT�FILE�DESCRIPTOR�BLOCK�INTO�A2.*;‰MOVE.L‚FDP(A1),A1„!�A1�=�POINTER�TO�RESULT�FILE�DESCRIPTOR<‰MOVE.L‚FDP(A2),A2„!�A2�=�POINTER�TO�DEFAULT�FILE�DESCRIPTOR***ˆWAS�THE�RESULT�FILE�PASSED�ASSIGNED�????*‰BTST„#ASSIGNED,PFSHI(A1)&‰IF��THEN.S�!�IF�NOT�ASSIGNED�THEN6‹MOVE.B‚IFDSS(A2),D2ˆ!�D2�=�IFD�SCAN�STATUS�OF�DEFAULT5‹MOVE.B‚IFDSS(A1),D1ˆ!�D1�=�IFD�SCAN�STATUS�OF�RESULT*0*ˆNOTE�CONDITION�CODES�HAVE�BEEN�SET�BY�THE�MOVE*-‹IF��THEN.SŽ!�IF�RESULT�FILE�NOT�A�DEVICE �TST.B�D2-�IF��THEN.SŒ!�IF�DEFAULT�FILE�IS�A�DEVICE �BTST‚#NAMB,D14�IF��THEN.SŠ!�AND�IF�NO�NAME�SPECIFIED�IN�RESULT*‘MOVE.L�VOL(A2),VOL(A1)�!�COPY�DEVICE�NAME5‘MOVE.B�#'�',NAM(A1)ƒ!�BLANK�FIRST�CHAR�OF�NAME�FIELD#‘BSET�#DEVB,D1‰!�AND�SET�DEVICE�BIT�ENDI �ELSE.S .�BSET‚#NAMB,D1Š!�NOTE�BSET�TESTS�AND�THEN�SETS0�IF��THEN.SŠ!�IF�NO�NAME�SPECIFIED�IN�RESULT* *ˆSET�UP�HYBRID�SCAN�STATUS�BYTE*0‘MOVE.B�D1,D3Š!�D3�=�RESULT�FILE�IFD�SCAN�STATUS ‘NOT.B‚D3+‘AND.B‚D2,D3Š!�D3�=�HYBRID�SCAN�STATUS�BYTE*@*ˆCHECK�IF�RESULT�FILE�HAD�NO�VOLUME�SUPPLIED�AND�USE�DEFAULT�IF*ˆTHERE�IS�ONE*‘MOVEQ�#VOLB,D0 ‘BTST‚D0,D3‘IF��THEN.S“MOVE.L�VOL(A2),VOL(A1) “BSETƒD0,D1‘ENDI*B*ˆCHECK�IF�RESULT�FILE�HAD�NO�USER�NUMBER�AND�USE�DEFAULT�IF�THERE *ˆIS�ONE.*‘MOVEQ�#USRB,D0 ‘BTST‚D0,D3‘IF��THEN.S“MOVE.W�USR(A2),USR(A1) “BSETƒD0,D1‘ENDI*B*ˆCHECK�IF�RESULT�FILE�HAD�NO�CATALOG�SUPPLIED�AND�USE�THE�DEFAULT*ˆIF�ONE�EXISTS.*‘MOVEQ�#CATB,D0 ‘BTST‚D0,D3‘IF��THEN.S“MOVE.L�CAT(A2),CAT(A1)“MOVE.L�CAT+4(A2),CAT+4(A1) “BSETƒD0,D1‘ENDI***ˆCOPY�THE�DEFAULT�NAME�TO�THE�RESULT�NAME*‘MOVE.L�NAM(A2),NAM(A1)‘MOVE.L�NAM+4(A2),NAM+4(A1) �ENDI �BSET‚#EXTB,D16�IF��THEN.SŒ!�IF�NO�EXTENSION�SUPPLIED�USE�DEFAULT‘MOVE.W�4(A7),EXT(A1)�ENDI �ENDI :�MOVE.B‚D1,IFDSS(A1)ˆ!�SAVE�NEW�SCAN�STATUS�OF �RESULT�FILE ‹ENDI‰ENDI*+*ˆCLEAN�UP�AND�RETURN�TO�THE�PASCAL�PROGRAM*&‰MOVE.L‚(A7)+,A0Ž!�A0�=�RETURN�ADDRESS0‰ADD.Wƒ#10,A7�!�POP�THE�ARGUMENTS�FROM�THE�STACK(‰JMP…(A0)’!�RETURN�TO�THE�PASCAL�PROGRAM*‰ENDé9ŠTTL„PASCAL�GET�FILE�NAME�RUNTIME�ROUTINE�V1.00�(11/6/80)@FILENAME‚IDNTƒ1,0‚PASCAL�GET�FILE�NAME�RUNTIME�ROUTINE�(11/6/80) ŠSECTION‚9**;*‰THIS�ASSEMBLY�LANGUAGE�ROUTINE�IS�A�PASCAL�FUNCTION�WHICH$*‰RETURNS�THE�NAME�OF�A�PASCAL�FILE.*<*‰IN�ORDER�TO�USE�THIS�FUNCTION,�THE�USER�MUST�FIRST�DECLARE*‰THE�FOLLOWING�TYPE:**�FILENAME�=�STRING�[30];*/*‰HE�MUST�ALSO�DECLARE�THE�FUNCTION�AS�FOLLOWS:*9*�FUNCTION‚P$FNAME�(VAR�FIL:�FILTYPE):�FILENAME;‚FORWARD;*;*‰WHERE�'FILTYPE'�IS�THE�TYPE�OF�THE�FILE�HE�WANTS�THE�NAME*‰OF�(IE:�TEXT).*-*‰THIS�ROUTINE�USES�THE�REGISTERS�AS�FOLLOWS:*,*�D0�-�ARGUMENT�PASSSING�BETWEEN�SUBROUTINES)*�D1�-�SIZE�OF�NAME�MOVING/INTEGER�MOVING"*�D2�-�DEVICE�NAME?‚0�=�NO„1�=�YES&*�D3�-�CURRENT�SIZE�OF�STRING�ON�STACK**�D4�-�NUMBER�OF�DECIMAL�DIGITS�IN�INTEGER**�A0�-�RETURN�ADDRESS-*�A1�-�ADDRESS�OF�PASCAL�FILE�PARAMETER�BLOCK&*�A2�-�ADDRESS�OF�NAME�MOVING�TO�STACK8*�A4�-�CURRENT�ADDRESS�IN�STACK�WHERE�PLACING�CHARACTERS*$*‰COPYRIGHTED�1980�BY�MOTOROLA,�INC.**"*‰FIRST�COME�THE�NECESSARY�EQUATES*5VOLNAMEƒEQU„42‘OFFSET�INTO�PARAM�BLOCK�OF�VOLUME�NAME4FILENAME‚EQU„56‘OFFSET�INTO�PARAM�BLOCK�OF�FILE�NAME***‰DECLARE�THE�ENTRY�POINT*:ŠXDEFƒP$FNAME,P$1FNAME,P$2FNAME,P$3FNAME,P$4FNAME,P$5FNAME*ŠPAGE***‰THE�CODE�STARTS�HERE* P$FNAMEƒEQU„*P$1FNAME‚EQU„*P$2FNAME‚EQU„*P$3FNAME‚EQU„*P$4FNAME‚EQU„*P$5FNAME‚EQU„**$ŠMOVE.L�(A7)+,A0‹A0�=�RETURN�ADDRESS*-ŠMOVE.L�(A7)+,A1‹A1�=�ADDRESS�OF�FILE�POINTER*1ŠMOVE.L�4(A1),A1‹A1�=�ADDRESS�OF�FILE�PARAM�BLOCK*7ŠLEA„2(A7),A4‹A4�=�ADDRESS�WHERE�TO�START�STORING�CHARS*ŠCLR.W‚D3‘INIT�SIZE�OF�STRING*ŠCLR.B‚D2‘SEE...ŠCMP.B‚#'�',FILENAME(A1)‚IF...ŠBNE.S‚NOTDEV�THIS...ŠADDQ.B�#1,D2ŽIS�A...ŠMOVE.B�#'#',D0ŒDEVICE...ŠBSR.S‚MOVECHAR‹NAME.*%NOTDEV„LEA„VOLNAME(A1),A2…MOVE�THE...ŠMOVEQ‚#4,D1ŽVOLUME/DEVICE...ŠBSR.S‚MOVENAME‹NAME.*ŠTST.B‚D2‘DEVICE�NAME?ŠBNE.S‚RETURN�YES�-�DONE*ŠMOVE.B�#':',D0ŒNO�-�...ZScckŠBSR.S‚MOVECHAR‹MOVE...ŠCLR.L‚D1‘THE...ŠMOVE.W�(A2),D1ŒUSER...ŠBSR.S‚MOVEINTŒNUMBER.*ŠMOVE.B�#'.',D0ŒNOW...ŠBSR.S‚MOVECHAR‹MOVE...ŠADDQ.L�#2,A2ŽTHE...ŠMOVEQ‚#8,D1ŽCATALOG...ŠBSR.S‚MOVENAME‹NAME.*ŠMOVE.B�#'.',D0ŒMOVE...ŠBSR.S‚MOVECHAR‹THE...ŠMOVEQ‚#8,D1ŽFILE...ŠBSR.S‚MOVENAME‹NAME.*ŠMOVE.B�#'.',D0ŒFINALLY,�...ŠBSR.S‚MOVECHAR‹MOVE...ŠMOVEQ‚#2,D1ŽTHE...ŠBSR.S‚MOVENAME‹EXTENSION.* RETURN„EQU„**$ŠMOVE.W�D3,(A7)ŒSET�UP�STRING�LENGTH*ŠJMP„(A0)�RETURN*ŠPAGE***‰M�O�V�E�I�N�T*1*‰THIS�ROUTINE�MOVES�THE�INTEGER�IN�D1�IN�DECIMAL!*‰FORMAT,�WITHOUT�LEADING�ZEROES.*3*‰D4�IS�USED�TO�COUNT�THE�NUMBER�OF�DECIMAL�DIGITS.* MOVEINTƒEQU„**ŠCLR.B‚D4‘SHOW�NO�DIGITS�-�YET*ŠTST.L‚D1‘IS�THE�VALUE�ZERO?%ŠBNE.S‚NEXTDIGŒNO�-�CONTINUE�NORMALLY*!ŠMOVE.B�#'0',-(A7)‰YES�-�FORCE...ŠADDQ.B�#1,D4ŽONE�DIGIT.*2*‰BUILD�THE�NUMBER�IN�REVERSE�ORDER�BY�DIVIDING�BY%*‰TEN�AND�REMEMBERING�THE�REMAINDERS.* NEXTDIGƒEQU„**ŠTST.L‚D1‘DONE�YET?!ŠBEQ.S‚OUTDIGSŒYES�-�GO�TO�OUTPUT*ŠDIVUƒ#10,D1�NO�-�PUT...ŠSWAPƒD1‘THE...ŠADD.B‚#'0',D1ŒNEXT...ŠMOVE.B�D1,-(A7)‹DIGIT...ŠADDQ.B�#1,D4ŽON...ŠCLR.W‚D1‘THE...ŠSWAPƒD1‘STACK.*ŠBRA.S‚NEXTDIGŒDO�NEXT�DIGIT*+*‰NOW�OU TPUT�THE�DIGITS�IN�THE�PROPER�ORDER* OUTDIGSƒEQU„**ŠMOVE.B�(A7)+,D0‹MOVE�A...ŠBSR.S‚MOVECHAR‹DIGIT.*ŠSUBQ.B�#1,D4ŽDONE�YET?$ŠBNE.S‚OUTDIGSŒNO�-�DO�ANOTHER�DIGIT*ŠRTS—YES�-�RETURN*ŠPAGE***‰M�O�V�E�N�A�M�E*.*‰THIS�ROUTINE�MOVES�THE�NAME�POINTED�TO�BY�A2**‰TO�THE�STACK.‚IT�WILL�MOVE�THE�NUMBER�OF.*‰CHARACTERS�INDICATED�BY�D1.‚HOWEVER,�IT�WILL,*‰NOT�MOVE�SPACES�-�THEY�WILL�BE�IGNORED.‚A2-*‰IS�RETURNED�POINTING�TO�THE�CHARACTER�AFTER4*‰THE�NAME�THAT�WAS�MOVED.‚D1�WILL�BE�RETURNED�ZERO.*MOVENAME‚EQU„**"ŠMOVE.B�(A2)+,D0‹GET�THE�CHARACTER*ŠCMP.B‚#'�',D0ŒIS�IT�A�SPACE?ŠBEQ.S‚SKIPCH�YES�-�SKIP�IT*ŠBSR.S‚MOVECHAR‹NO�-�OUTPUT�IT*$SKIPCH„SUBQ.B�#1,D1ŽARE�WE�DONE�YET?)ŠBNE.S‚MOVENAME‹NO�-�DO�ANOTHER�CHARACTER*ŠRTS—YES�-�RETURN*ŠPAGE***‰M�O�V�E�C�H�A�R*6*‰THIS�ROUTINE�MOVES�THE�CHARACTER�IN�D0�INTO�THE�NEXT4*‰AVAILABLE�BYTE�ON�THE�STACK�(POINTED�TO�BY�A4).‚IT2*‰ALSO�BUMPS�THE�LENGTH�OF�THE�STRING�(D3)�BY�ONE.*MOVECHAR‚EQU„**#ŠMOVE.B�D0,(A4)+‹MOVE�THE�CHARACTER*"ŠADDQ.W�#1,D3ŽBUMP�THE�STRING�SIZE*ŠRTS—THAT�IS�ALL!**ŠENDéééééé<ŠTTL„PASCAL�TEXT�FILE�FORCE�RUNTIME�ROUTINE�V1.10�(11/24/80)AFORCE…IDNTƒ1,10‚PASCAL�TEXT�FILE�FORCE�RUNTIME�ROUTINE�(11/24/80) ŠSECTION‚9**4*‰THIS�ROUTINE�FORCES�THE�CURRENT�TEXT�IN�THE�BUFFER4*‰OF�THE�A�TEXT�FILE�TO�BE�OUTPUT�IMMEDIATELY.‚THUS,6*‰THE�STANDARD�LINE�BUFFERED�OUTPUT�CAN�BE�OVERRIDDEN.*3*‰IN�ORDER�TO�USE�THIS�ROUTINE,�THE�USER�MUST�FIRST-*‰DECLARE�IN�HIS�PASCAL�PROGRAM�THE�FOLLOWING *‰PROCEDURE:*-*�PROCEDURE‚P$FORCE�(VAR�FIL:�TEXT);‚FORWARD;*-*‰THIS�ROUTINE�USES�THE�REGISTERS�AS�FOLLOWS:*#*�D0�-�ERROR�CODE�RETURNED�FROM�IOS-*�D1�-�CURRENT�COMPONENT�POINTER�OF�TEXT�FILE(*�D2�-�COPY�OF�ORIGINAL�FUNCTION/OPTIONS0*�D3�-�COPY�OF�ORIGINAL�ENDING�ADDRESS�OF�BUFFER*)*�A0�-�ADDRESS�OF�PARAMETER�BLOCK�FOR�IOS-*�A1�-�ADDRESS�OF�PASCAL�FILE�PARAMETER�BLOCK%*�A2�-�ADDRESS�OF�PASCAL�FILE�POINTER*�A4�-�RETURN�ADDRESS*$*‰COPYRIGHTED�1980�BY�MOTOROLA,�INC.**"*‰FIRST�COME�THE�NECESSARY�EQUATES**FUNCTION†EQU‡8ŽIOS�FUNCTION*BUFSTART†EQU‡20�ADDRESS�OF�START�OF�BUFFER&BUFENDˆEQU‡24�ADDRESS�OF�END�OF�BUFFER*!IOS‹EQU‡2ŽTHE�TRAP�NUMBER�FOR�IOS+ERRTRAP‡EQU‡14�THE�TRAP�NUMBER�FOR�AN�ERRORERRNUMˆEQU‡2ŽTHE�ERROR�NUMBER*;FORCEFUNC…EQU‡$00020008†WRITE,�NO�FORMAT,�WAIT,�NEXT�RECORD** *‰DECLARE�THE�ENTRY�POINT* ŠXDEFƒP$FORCE*ŽPAGE***‰THE�CODE�STARTS�HERE* P$FORCE‡EQU‡**(ŽMOVE.L„(A7)+,A4‹SAVE�THE�RETURN�ADDRESS*,ŽMOVE.L„(A7)+,A2‹GET�ADDRESS�OF�FILE�POINTER*%ŽMOVE.L„(A2),D1ŒGET�COMPONENT�POINTER*/ŽMOVE.L„4(A2),A1‹GET�ADDRESS�OF�PARAMETER�BLOCK*-ŽCMP.L…BUFSTART(A1),D1„CHECK�FOR�EMPTY�BUFFER&ŽBEQ.S…FORCERET‹BUFFER�IS�EMPTY�-�QUIT*1ŽMOVE.L„FUNCTION(A1),D2ŠSAVE�OLD�FUNCTION/OPTIONS*;ŽMOVE.L„#FORCEFUNC,FUNCTION(A1)‚SET�UP�NEW�FUNCTION/OPTIONS**ŽMOVE.L„BUFEND(A1),D3†SAVE�OLD�END�ADDRESS*ŽSUB.L…#1,D1ŽSET�UP..."ŽMOVE.L„D1,BUFEND(A1)†END�ADDRESS.* ŽLEA‡FUNCTION(A1),A0„CALL�THE...ŽTRAP†#IOS�IOS.*.ŽMOVE.L„D3,BUFEND(A1)†RESTORE�THE�END�ADDRESS.*sP| 3ŽMOVE.L„D2,FUNCTION(A1)„RESTORE�OLD�FUNCTION/OPTION*1ŽMOVE.L„BUFSTART(A1),(A2)‚RESET�COMPONENT�POINTER*ŽTST.B…D0‘CHECK...ŽBEQ.S…FORCERET‹FOR...ŽTRAP†#ERRTRAP‹AN...ŽDC.W†ERRNUM�ERROR.*FORCERET†JMP‡(A4)�RETURN*ŽENDééééééé0ŠTTL„Pascal�File�Lookup�Routine�V1.00�(11/11/80)5LOOKUP„IDNTƒ1,0‚Pascal�File�Lookup�Routine�(11/11/80) ŠSECTION‚9***‰P�$�L�O�O�K�U�P*5*‰This�function�performs�the�looking�up�of�a�file�for4*‰a�pascal�program.‚Given�a�string�containing�a�file7*‰name,�it�will�attempt�to�find�that�file.‚The�function5*‰then�returns�an�enumerated�type�which�will�indicate&*‰one�of�the�following�about�the�file:**�1)‚The�file�was�found.6*�2)‚The�file�was�found�but�there�was�a�protect�error.*�3)‚The�file�was�not�found.*�4)‚The�file�name�was�invalid.(*�5)‚The�routine�was�unable�to�determine*”the�status�of�the�file.*;*‰In�order�to�use�this�routine,�the�user�must�first�declare$*‰the�following�type�in�his�program:*)*�filestatus�=�(found,protected,notfound,*žinvalidname,undeterminable)*1*‰Also,�the�function�must�be�declared�as�follows:*6*�FUNCTION‚p$lookup�(VAR�fil:�stringtype):�filestatus; *“FORWARD;***‰where�'stringtype'�is�any�'STRING'�type.*/*‰This�procedure�uses�th e�registers�as�follows:*)*�D0�-�Temporary�use/Returned�by�EDITFILE*�D1�-�Temporary�use*�D2�-�LUN�usage�bit�map*6*�A0�-�Address�of�file�name�string�and�parameter�block*�A1�-�Return�address'*�A2�-�Address�of�function�return�value*�A4�-�Temporary�value*�A5�-�Pointer�to�Pascal�RMA*�A7�-�Stack�pointer*$*‰Copyrighted�1980�by�Motorola,�Inc.***‰Define�those�routines�needed*ŠXREFƒ.PEDTFIL,.PALSTS***‰Define�the�entry�point*ŠXDEFƒP$LOOKUP**ŠPAGE***‰The�necessary�equates�follow***‰First�are�the�trap�numbers*FHS‡EQU„3’Trap�number�for�FHS*ERRTRAPƒEQU„14‘Trap�number�for�fatal�error(IOSENUMƒEQU„2’Error�number�for�IOS�error***‰Next�are�the�offsets�into�the�Pascal�RMA*!RMALUN„EQU„40‘Offset�of�LUN�table,RMAVOLUƒEQU„58‘Offset�of�default�volume�name,RMAUSERƒEQU„62‘Offset�of�default�user�number,RMACAT„EQU„64‘Offset�of�default�catalog�name*.*‰Now�the�offsets�into�the�FHS�parameter�block*FHSCODEƒEQU„0’Offset�of�code„Q�I•M�5FHSCMD„EQU„1’Offset�of�commandFHSOPT„EQU„2’Offset�of�optionsFHSSTATƒEQU„4’Offset�of�statusFHSLUN„EQU„5’Offset�of�LUN#FHSVOLUƒEQU„6’Offset�of�volume�name$FHSUSERƒEQU„10‘Offset�of�user�number$FHSCAT„EQU„12‘Offset�of�catalog�name"FHSFILEƒEQU„20‘Offset�of�file�name!FHSEXT„EQU„28‘Offset�of�extension%FHSRES„EQU„30‘Offset�of�reserved�word$FHSWCODE‚EQU„32‘Offset�of�write�code#FHSRCODE‚EQU„33‘Offset�of�read�code*2PARMSIZE‚EQU„40‘Size�of�FHS�param�block�(in�bytes)**‰Next�are�the�FHS�codes*.ASSIGN„EQU„$0040ŽCode/command�to�assign�a�file,CLOSE…EQU„$0004ŽCode/command�to�close�a�file$PRˆEQU„$0000ŽOptions�for�public�read***‰Next�are�the�error�return�codes�from�FHS*$LUERR…EQU„$03�LU�error�-�invalid�LUN)VOLERR„EQU„$04�Volume�error�-�nonexistent%DESCERRƒEQU„$06�File�descriptor�error5PROTERRƒEQU„$07�Protection�violation�-�file�was�found,ACCERR„EQU„$0B�Access�error�-�file�was�found,ASSERR„EQU„$0D�Assignment�error�-�LUN�in�use#NAMEERRƒEQU„$17�File�name�not�found*%*‰These�are�the�function�return�codes*FOUND…EQU„0’File�was�found(PROTECTED�EQU„1’File�found�but�protected!NOTFOUND‚EQU„2’File�was�not�found#INVALIDƒEQU„3’File�name�was�invalid'UNDETERƒEQU„4’Status�was�undeterminable**‰Finally,�miscellaneous�stuff*'CRˆEQU„13‘ASCII�code�of�carriage�return*ŠPAGE***‰Here�is�the�code*P$LOOKUP‚EQU„**,ŠMOVE.L�(A7)+,A1‹Remember�the�return�address&ŠMOVE.L�(A7)+,A0‹Get�address�of�stringŠCLR.L‚D0‘Get�length...ŠMOVE.W�(A0),D0Œof�string.*3ŠMOVE.L�A7,A2ŽA2�=�address�of�return�function�value*"ŠMOVE.W�D0,D4ŽAllocate�space�on...0ŠADD.W‚#PARMSIZE+18,D4„the�stack�for�string,�..."ŠJSR„(A3)�FHS�parameter�block,�..."ŠDC.Lƒ.PALSTS-*Šand�a�little�more.*ŠMOVE.L�A2,A4ŽPut�a...ŠBTSTƒ#0,D0Žcarriage...ŠBNE.S‚MOVECR�return...ŠSUBQ.L�#1,A4Žin�the...MOVECR„MOVE.B�#CR,-(A4)Šstack.**ŠADD.L‚D0,A0ŽCalc�address�of�byte�after...)ŠADDQ.L�#2,A0Žlast�character�of�filename.*ŠTST.W‚D0‘Move�file...ŠBEQ.S‚MOVEDONE‹name�onto...$MOVEBYTE‚MOVE.B�-(A0),-(A4)ˆstack...ŠSUBQ.W�#1,D0Ž(last�byte...ŠBNE.S‚MOVEBYTE‹first).*2MOVEDONE‚MOVE.L�A4,D0ŽRemember�address�of�filename*<ŠLEA„-PARMSIZE(A4),A7ƒAllocate�space�for�FHS�parameter�block1ŠMOVE.L�A7,A0ŽRemember�address�of�parameter�block*.*‰Set�up�default�values�in�FHS�parameter�block*ŠMOVE.L�#'„',D1/ŠMOVE.W�#ASSIGN,FHSCODE(A0)‰Set�up�code/command%ŠMOVE.W�#PR,FHSOPT(A0)ŽSet�up�options2ŠMOVE.L�RMAVOLU(A5),FHSVOLU(A0)…Set�up�volume�name2ŠMOVE.W�RMAUSER(A5),FHSUSER(A0)…Set�up�user�number'ŠMOVE.L�RMACAT(A5),FHSCAT(A0)‡Set�up.../ŠMOVE.L�RMACAT+4(A5),FHSCAT+4(A0)ƒcatalog�name. ŠMOVE.L�D1,FHSFILE(A0)ŽSet�up...#ŠMOVE.L�D1,FHSFILE+4(A0)Œfile�name.)ŠMOVE.W�#'SA',FHSEXT(A0)ŒSet�up�extension.ŠCLR.L‚FHSRES(A0)’Set� up�res�word�&�prot�codes*#ŠMOVEM.L‚A3-A6,-(A7)†Save�registers**ŠMOVE.L�A0,A6ŽA6�points�to�FHS�param�block$ŠMOVE.L�D0,A0ŽA0�points�to�file�name*ŠJSR„(A3)�Edit�the...ŠDC.Lƒ.PEDTFIL-*‰file�name.*-ŠMOVE.L�A6,A0ŽRemember�address�of�param�block'ŠMOVE.L�D0,D1ŽRemember�edit�file�status*ŠMOVEM.L‚(A7)+,A3-A6†Restore�the�registers*ŠAND.L‚#$FF8003FC,D0†Check...ŠBNE.S‚EDITERRŒfor...ŠBTSTƒ#1,D1Ža...ŠBNE.S‚EDITOK�syntax...ŠBTSTƒ#11,D1�error...ŠBEQ.S‚EDITOK�in...$EDITERRƒMOVE.B�#INVALID,(A2)†file...ŠBRA.S‚RETURN�name.*+*‰Edit�file�went�OK�-�now�look�for�the�file* EDITOK„EQU„**+ŠMOVE.L�RMALUN(A5),D2†Get�LUN�use�bit�tableŠMOVE.B�#-1,D1�Init�LUN*+*‰Loop�here�to�try�next�logical�unit�number* NEXTLUNƒEQU„**ŠADDQ.B�#1,D1ŽCompute�next...ŠCMP.B‚#32,D1�LUN�to�try.ŠBEQ.S‚FHSERR2ŒRan�out�of�LUN's*"ŠBTSTƒD1,D2ŽIs�this�LUN�available? ŠBNE.S‚NEXTLUNŒNo�-�try�next�one*5ŠMOVE.B�D1,FHSLUN(A0)†Yes�-�set�up�lun�in�param�block*ŠTRAPƒ#FHS�Try�to�find�file*ŠBNE.S‚FHSERR�Error*'*‰FHS�found�the�file�-�tell�the�world!!*ŠMOVE.B�#FOUND,(A2)ˆShow�found*)ŠMOVE.W�#CLOSE,FHSCODE(A0)�Yes�-�close...ŠTRAPƒ#FHS�the�file.*ŠBEQ.S‚RETURN�No�error�-�return*,*‰If�there�is�an�IOS�error,�people�come�here$*‰to�produce�a�pascal�runtime�error.*IOSERR„TRAPƒ#ERRTRAP‹Trap...ŠDC.WƒIOSENUMŒout.*+*‰FHS�didn't�find�the�file�-�figure�out�why* FHSERR„EQU„**ŠBTSTƒ#7,D0ŽCheck�for...ŠBNE.S‚IOSERR�IOS�error.*ŠCMP.B‚#LUERR,D0ŠWas...ŠBEQ.S‚NEXTLUNŒit�a...ŠCMP.B‚#ASSERR,D0‰LUN�error?!ŠBEQ.S‚NEXTLUNŒYes�-�try�next�LUN*$ŠCMP.B‚#PROTERR,D0ˆNo�-�was�it�an...#ŠBEQ.S‚FHSERR3Œaccess�permission...#ŠCMP.B‚#ACCERR,D0‰or�protect�error?ŠBNE.S‚FHSERR4ŒNo*7FHSERR3ƒMOVE.B�#PROTECTED,(A2)„Yes�-�show�file�there... ŠBRA.S‚RETURN�but�access�denied.*'FHSERR4ƒCMP.B‚#VOLERR,D0‰No�-�was�it...ŠBEQ.S‚FHSERR0Œa�file...ŠCMP.B‚#NAMEERR,D0ˆnot�found...ŠBNE.S‚FHSERR1Œerror?*+FHSERR0ƒMOVE.B�#NOTFOUND,(A2)…Yes�-�show...ŠBRA.S‚RETURN�file�not�found.*/FHSERR1ƒCMP.B‚#DESCERR,D0ˆNo�-�was�it�a�file...!ŠBNE.S‚FHSERR2Œname�syntax�error?*+ŠMOVE.B�#INVALID,(A2)†Yes�-�show�invalid...ŠBRA.S‚RETURN�file�name.*=FHSERR2ƒMOVE.B�#UNDETER,(A2)†No�-�show�can't�determine�status***‰Everyone�comes�here�to�return* RETURN„EQU„** ŠMOVE.L�A2,A7ŽBump�stack�pointer*ŠJMP„(A1)�Return**ŠENDééé(ŠTTL„Set�Chain�Cmd�Diag�Reg‚1.00‚7/28/81/SETDIAGƒIDNTƒ1,0�Set�Chain�Cmd�Diag�Reg‚7/28/81**ƒPascal�Declaration:***‰PROCEDURE‚p$setdiag�(diagreg:�integer2);* *ƒFunction:*1*‰Sets�the�chain�command�diagnostic�register�word*‰in�the�Pascal�RMA.**ƒStack�on�Entry:*#*‰A7‚-->‚return�addressŒ(long�word)*’value�to�be�put�in�RMA„(word)*’previous�contents�of�stack**ƒStack�on�Exit:*#*‰A7‚-->‚previous�contents�of�stack**ƒRegisters�Modified:**‹0�1�2�3�4�5�6�7*‰A�*�**‰D**ƒVital�Statistics:**‰Created�-�28�July�1981*‰Programmer�-�John�Koehring*‰Last�Modified�-*$*‚Copyrighted�1981�by�Motorola,�Inc.** *‰Equates*.DIAGREGƒEQU„$34�Offset�of�diag�reg�word�in�RMA***‰Declare�en try�point*ŠXDEFƒP$SETDIAG** *‰The�code*)ŠSECTION�9‘For�linking�to�Pascal�programs*P$SETDIAG�EQU„*’Entry�point*(ŠMOVE.L�(A7)+,A0‹Save�the�return�address*3ŠMOVE.W�(A7)+,DIAGREG(A5)‚Put�diag�reg�value�in�RMA*ŠJMP„(A0)�Return*ŠENDééé¥<' CONFIG BIN2ASCISAººÊrrCFIGDATASAÓÓÏrrCLSDASGNSAôô�rrCNFGTBLSSAmrrFORCE SAvv>rrGETMEMCBSAMHrrGETSTRCBSAÐКrrHEX2ASCISAééÕrrINITLIZESA  SsrrMODMEMCBSAcc:±rrMODSTRCBSA¤¤—rrPRINT SA½½>ÍrrF***********************************************************************Ä* *œBIN2ASCI **Ä*"*�BIN2ASCI�(valbuf,�value,�size)—**Ä**˜NO�INCLUDE�FILESœ**Ä*<*ˆBIN2ASCI�converts�the�CB�value�in�CONFIG's�storage�to�an„**ˆASCII�binary�string.¨**Ä**ˆALGORITHM:²*/*’1.‚Get�the�address�of�valbuf�off�the�stack.†*/*–Valbuf�has�blanks�in�it.‚Put�"%"�into�first‚*,*–location�of�valbuf.‚Move�the�value�to�be…*(*–converted�off�the�stack�and�into�D0.Š*3*’2.‚Get�the�size�of�the�value�off�the�stack.‚Put�**–size�in�D1.£**’3.‚If�size�of�value�is:š*&*–a.‚byte�then�D1�<--�8,�A0�<--�A0+9‹**šA1�<--�A1+3Ÿ*(*–b.‚word�then�D1�<--�16,�A0�<--�A0+17‰**šA1�<--�A1+2Ÿ*,*–c.‚longword�then�D1�<--�32,�A0�<--�A0+33…*1*–D1�will�be�the�counter�for�the�number�of�bits�*0*–converted.‚A1�will�point�to�the�byte�of�addr�*/*–where�value�for�proper�size�begins.‚Rest�of‚*0*–register�will�have�zeroes�that�we�don't�want‚*/*–in�the�value�field�in�the�menu.‚However,�we‚*+*–do�want�any�remaining�leading�zeroes�to‡*+*–indicate�the�size�of�the�field.‚A0�will†*0*–point�to�location�in�valbuf�after�where�last‚*.*–character�will�be�inserted�since�they�will„*-*–be�inserted�from�low�order�to�high�order.…**’4.‚Convert�the�value.œ*/*–a.‚Move�pointer�to�next�location�in�valbuf.‚*,*–b.‚Right�shift�first�bit�into�carry�bit.…*(*–c.‚Put�appropriate�char�into�valbuf.‰**–d.‚D1�<--�D1-1.ž**–e.‚If�D1�<>�0,�go�to�a.–*$*’5.‚Restore�the�stack�and�return.‘**Ä* *‚REGISTERS¹*>*„IN…:ƒA3�points�to�Pascal�runtime �library;�MUST�be�preserved*0*‹:ƒA5�points�to�Pascal�RMA;�MUST�be�preserved‹*-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ*:*‹:ƒA7�points�to�stack�with�parameters�and�return�address**�MUST�be�preserved¤**Ä*&*„DURING�:ƒA0�gets�address�of�valbufœ**�A1�gets�address�of�value�**�D0�gets�size�of�value *1*�D1�gets�counter�for�number�of�bits�to�convertˆ**�D2�gets�bit�for�conversion›*!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*²9»FÃLA*‚PARAMETERS�:�The�addresses�of�the�parameters�are�on�the�stack…*5*�such�that�the�first�parameter�is�put�on�the�stack„*5*�first�and�the�last�parameter�is�at�the�top�of�the„*(*�stack�just�under�the�return�address.‘**Ä*F***********************************************************************‰OPT‡A*BIN2ASCI�IDNT†1,0‰PAGEF************************************************************************•X�D�E�F�Sƒ&ƒX�R�E�F�S*F***********************************************************************"‰XDEF†BIN2ASCIŒProgram�entry�point**F************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|'*ˆ|----------|ˆ------------------------*ˆ|�size…|ˆsize�of�value'*ˆ|----------|ˆ------------------------!*ˆ|�value„|ˆvalue�to�be�converted'*ˆ|----------|ˆ------------------------!*ƒHIƒ|�valbufƒ|ˆaddress�of�valbuf*ˆ------------*E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰return�addressSZVAL„DS.W†1‰size�of�value"VALUE„DS.L†1‰value�to�be�converted BUFADDR‚DS.L†1‰address�of�valbufSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a3*‚assembly�routine�is�called�from�a�Pascal�program.*F************************************************************************—E�Q�U�A�T�E�S*F***********************************************************************BYTE…EQU‡1‰size�of�valueWORD…EQU‡2‰size�of�valuePERCENT‚EQU‡$25‡percent�signZERO…EQU‡$30‡zeroONE†EQU‡$31‡one3LOWBYTE‚EQU‡$000000FF�zeroes�out�all�but�lower�byte‰PAGEF************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F***********************************************************************'‰SECTIONƒ9“ASM�routines�go�in�Section�9*BIN2ASCI�EQU‡**8*‚STEP�1.‚Get�address�of�valbuf�and�value�off�the�stack.8*‹Get�value�size.‚Put�"%"�into�first�location�of�valbuf.**ˆGet�address�of�valbuf.*1‰MOVE.L„BUFADDR(A7),A0†A0�<--�addr�of�CB�on�stack*(*ˆPut�"%"�into�first�location�of�valbuf.*0‰MOVE.B„#$25,(A0)‹First�location�in�valbuf�<--�%**ˆGet�value�and�put�into�D2.*,‰MOVE.L„VALUE(A7),D2ˆD2�<--�address�of�value‰PAGE**‚STEP�2.‚Put�size�into�D0.*)‰MOVE.B„SZVAL(A7),D0ˆDO�<--�value�of�size‰PAGE*G*‚STEP�3.‚Initialize�bit�counting�register�and�adjust�address�registers**5‰IF.B�#BYTE��D0�THEN.S…If�value�is�a�byte�in�size'‹ADD.L‚#3,A1�Move�to�last�byte�of�value0‹ADD.L‚#9,A0�Move�1�beyond�location�for�8th�char&‹MOVE.W�#8,D1�D1�will�count�for�8�bits ‰ELSE.S˜("%"�is�in�1st�location)5‹IF.B�#WORD��D0�THEN.SƒIf�value�is�a�word�in�size,�ADD.L‚#2,A1ŽMove�to�low�order�word�of�value2�ADD.L‚#17,A0�Move�1�beyond�location�for�16th�char(�MOVE.W�#16,D1�D1�will�count�for�16�bits ‹ELSE.S–else2�ADD.L‚#33,A0�Move�1�beyond�location�for�32nd�char(�MOVE.W�#32,D1�D1�will�count�for�32�bits‹ENDI‰ENDI‰PAGE*4*‚STEP�4.‚In stall�appropriate�character�into�valbuf.*?*ˆShift�out�rightmost�bit�into�carry�bit.�If�its�0�then�put�'0'@*ˆinto�right�of�valbuf,�else�put�in�a�'1'.‚Move�address�pointing$*ˆinto�valbuf�left�to�next�location.**CNVRT„LSR.L…#1,D2�Shift�bit�into�carry�bit)‰BCC.S…MOVZERO‹If�bit�=�0�then�go�to�ZERO#‰MOVE.B„#ONE,-(A0)ˆElse�move�in�one‰BRA.S…SUBTŽGo�to�SUBT'MOVZERO‚MOVE.B„#ZERO,-(A0)‡Move�in�zero*1*ˆSubtract�one�from�D1�since�1�bit�was�converted.*SUBT…SUB.W…#1,D1�Decrement�D1*>*ˆIf�all�bits�are�not�done�yet�go�back�to�beginning�of�STEP�4.* ‰IF.W‚�THEN.S‹Any�bits�left?‹BRA.SƒCNVRT�Go�back�to�them‰ENDI‰PAGE**‚STEP�5.‚Restore�the�stack.*GOHOMEƒMOVE.L„(A7),STKLEN(A7)‰ADD.L…#STKLEN,A7‰RTS*‰ENDF***********************************************************************Ä**™CFIGDATA.SA **Ä**ˆINCLUDEƒ9995.&.EXE.EQ¥**ˆINCLUDEƒ9995.&.IOE.EQ¥**Ä*;*ˆThis�is�the�area�for�the�assembly�data�structures�which…*9*ˆare�used�in�the�various�assembly�routines�included�in‡* *ˆCONFIG.µ**Ä*@*ˆIt�is�set�up�in�such�a�way�that�the�offsets�to�the�structures*>*ˆare�calculated�at�assembly�time.‚Thus,�a�new�data�structure*8*ˆcan�be�added�for�use�in�one�assembly�routine�withoutˆ*;*ˆjeopardizing�the�execution�of�any�of�the�other�routines…*;*ˆPROVIDED�IT�IS�ADDED�TO�THE�END�OF�THE�ALREADY�EXISTING…**ˆSTRUCTURES.±**Ä*<*ˆThe�reason�for�including�all�assembly�data�structures�in„*<*ˆone�area�is�that�a�number�of�them�are�used�in�several�of„*6*ˆassembly�routines�and�the�data�section�can�only�beŠ*;*ˆaccessed�in�an�non-MMU�environment�after�a�receive�task…*"*ˆdirective�obtains�its�address.ž**Ä*?*ˆThe�first�assembly�routine�executed�obtains�this�address�an�*?*ˆsaves�it�in�the�Pascal�data�area�for�future�use.‚Thus,�using*:*ˆthe�stored�address�and�the�offsets�defined�at�assembly†*9*ˆtime,�all�the�assembly�routines�can�easily�access�the‡**ˆassembly�data�area.©**Ä*F************************************************************************“I�N�C�L�U�D�EƒF�I�L�E�S*G*************************************************************************ˆINCLUDEƒ9995.&.EXE.EQ*ˆINCLUDEƒ9995.&.IOE.EQ*ˆNOLIST‰NOLIST‰INCLUDEƒ9995.&.EXE.EQ‰INCLUDEƒ9995.&.IOE.EQ‰LIST*CFIGDATA�IDNT†1,0*‰PAGEF*********************************************************************** *œX�D�E�F�S*F***********************************************************************‰XDEF†FHSPB…FHS�parameter�block‰XDEF†IOSPB…IOS�parameter�block8‰XDEF†TSKATRPB‚Task�attributes�directive�parameter�block2‰XDEF†EMPBLK„Error�message�handler�parameter�block#‰XDEF†APTBL…Access�permission�table‰XDEF†ASQPB…ASQ�parameter�block)‰XDEF†BRKSPB„Claim�breaks�parameter�block*Ë=Ô@Ü7äF************************************************************************•E�Q�U�A�T�E�S*F***********************************************************************/BLANK2ƒEQU‡'‚'†2�blanks�for�FHS�parameter�block/BLANK4ƒEQU‡'„'„4�blanks�for�FHS�parameter�blockUSERZERO�EQU‡0‰userzero‰PAGEF************************************************************************•D�A�T�AƒA�R�E�A*F*********************************************************************** ‰SECTIONƒ0‰OPT‡A*BˆEQU‡**G************************************************************************C*ˆFHS�parameter�block�for�assigning�a�device�is�used�prior�to�doing<*ˆany�configure�command.‚It�is�also�used�with�a�public�write=*ˆto�determine�if�a�device�exists�or�in�the�case�of�a�printer<*ˆif�it�exists�and�the�spooler�is�active.‚It�is�used�with�an?*ˆexclusive�write�to�determine�if�a�device�is�busy.‚Finally,�it:*ˆis�used�prior�to�an�IOS�command�to�put�out�a�copy�of�the*ˆreconfigured�DCB�or�CCB.*F*===== ================================================================*‰DSˆ04FHSPB„EQU‡*-B‡Offset�to�start�of�FHS�parameter�block#‰DCB.B…FHSBLN,0‚FHS�parameter�block*‰PAGEF*=====================================================================*:*ˆIOS�parameter�block�for�doing�configure�commands�and�for0*ˆputting�out�a�copy�of�the�reconfigured�device.*F*---------------------------------------------------------------------*‰DSˆ0+IOSPB„EQU‡*-B‘Offset�to�IOS�parameter�block#‰DCB.B…IOSBLN,0ŒIOS�parameter�block*‰PAGEF*=====================================================================*@*ˆTSKATRPB�is�used�to�get�the�user�logon�number.‚It�is�used�only*ˆonce�in�INITLIZE.*E*--------------------------------------------------------------------*‰DSˆ0TSKATRPB�EQU‡*-B‡OFFSET0‰DCB.L…2,0‡Will�get�taskname�and�session�number.*F*=====================================================================*@*ˆCRTCBPB�is�used�to�create�a�dummy�task�for�a�configure�request>*ˆso�that�the�configuration�will�last�until�the�user�logs�off.*E*--------------------------------------------------------------------*‰DSˆ0@CRTCBPB‚DCB.L…CRTLEN,0„Parameter�block�for�creating�a�dummy�task*F*=====================================================================*6*ˆEMPBLK�is�used�for�the�system�error�message�handler.*6*ˆEMA0�is�changed�in�at�least�one�procedure�which�uses7*ˆEMPBLK.‚Thus,�EMA0�needs�to�be�reinitialized�in�every:*ˆprocedure�in�which�EMPBLK�is�used.‚The�rest�of�the�block#*ˆcan�be�left�as�initialized�below.*F*---------------------------------------------------------------------*‰DSˆ0*EMPBLKƒEQU‡*-B‡Offset�to�ERRMSG�parm�block*.EMD0…DC.L†0‰User�reg�D0�-�has�ERRMSG�key�value3EMA0…DC.L†0‰User�reg�A0�-�points�at�I/O�control�blk$EMOPT„DC.B†0‰Reserved�for�future�use'EMTLUNƒDC.B†LDFLUN„LU�for�output�on�CRT$EMQRC„DC.B†0‰Reserved�for�future�use%EMKLUNƒDC.B†0‰Reserved�for�future�use2EMSPA„DC.L†0‰Start�address�for�user�text�plug�pool0EMEPA„DC.L†0‰End�address�for�user�text�plug�pool*‰PAGEF*=====================================================================*>*ˆAccess�Permission�Table�has�the�asscess�permissions�suitable*ˆfor�each�device�type.*=*ˆIn�the�case�of�a�reconfiguration�of�the�logon�terminal,�the<*ˆaccess�permission�code�will�need�to�be�public�read,�public>*ˆwrite�so�that�the�new�configuration�will�last�beyond�the�end?*ˆof�CONFIG's�execution.‚This�case�is�handled�as�a�special�case#*ˆand�does�not�use�the�table�below.*‰DSˆ0/APTBL„EQU‡*-B‡Offset�to�access�permission�table*1FDSK…DC.W†FOPEREWƒExcluxive�read,�exclusive�write1HDSK…DC.W†FOPEREWƒExcluxive�read,�exclusive�write2TRMNL„DC.W†FOPEREWƒExcluxive�read,�exclusive�write PRNTR„DC.W†FOPEW…Excluxive�write1MTAP…DC.W†FOPEREWƒExcluxive�read,�exclusive�write*F*====================================================================**8*ˆASQPB�is�the�parameter�block�for�allocating�memory�for5*ˆCONFIG's�ASQ�which�will�receive�break�notification.*F*--------------------------------------------------------------------**‰DSˆ0ASQPB„EQU‡*-B‡Offset‰DC.L†0‰Task�name‰DC.L†0‰Session‰DC.B†$05‡ASQ�status‰DC.B†20ˆMessage�length‰DC.L†80ˆQueue�length‰DC.L†0‰Address�of�ASR‰DC.L†0‰Receiving�area*F*====================================================================***ˆClaim�breaks�parameter�block.*F*--------------------------------------------------------------------**‰DSˆ0BRKSPBƒEQU‡*-B‡Offset‰DC.W†IOBRKS„Claim�breaks‰DC.W†0‰Options‰DC.B†0‰Status‰DC.B†CDFLUN„logon�device‰DC.W†0‰reserved%‰DC.L†0,0,0,0,0�remainder�of�parm�blk‰ENDé ééééF***********************************************************************Ä* *œCLSDASGN **Ä**�CLSDASGN�(asmem,�duration);š**Ä* *ˆInclude�files:†9995.&.IOE.EQ›**Ä*9*ˆCLSDASGN�closes�the�assignment�to�LUN�=�2,�the�target‡* *ˆdevice.µ**Ä* *‚REGISTERS¹*>*„IN…:ƒA3�points�to�Pascal�runtime�library;�MUST�be�preserved*0*‹:ƒA5�points�to�Pascal�RMA;�MUST�be�preserved‹*-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ*:*‹:ƒA7�points�to�stack�with�parameters�and�return�address**�MUST�be�preserved¤**Ä*+*„DURING�:ƒA0�points�to�various�parm�blks—*(*�A4�points�to�memory�area�for�Pascal.‘*!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*A*‚PARAMETERS�:�The�addresses�of�the�parameters�are�on�the�stack…*8*�such�that�the�first�parameter�is�placed�on�the�stack�*5*�first�and�the�last�parameter�is�at�the�top�of�the„*(*�stack�just�under�the�return�address.‘*(*�The�call�to�CLSDASGN�was�as�follows:‘**Ä*F**********************************************************************‰PAGE*‰OPT‡A*CLSDASGN�IDNT†1,0*‰PAGE*F*********************************************************************** *•X�D�E�F�S*F***********************************************************************"‰XDEF†CLSDASGNŒProgram�entry�point*F*********************************************************************** *•X�R�E�F�S*F***********************************************************************‰XREF†FHSPB�FHS�parameter�block‰PAGEF************************************************************************�I�N�C�L�U�D�EƒF�I�L�E�S*F************************************************************************ˆINCLUDEƒ9995.&.IOE.EQ*ˆINCLUDEƒ9995.&.NIO.EQ*ˆNOLIST‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.NIO.EQ‰LIST*F************************************************************************™E�Q�U�A�T�E�S*F***********************************************************************TRGTLUN‚EQU‡2‰Target�deviceìKõEPERM…EQU‡0‰configure�defaults*‰PAGEF************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|'*ˆ|----------|ˆ------------------------4*ˆ|�duration�|ˆpermanent=0/temporary=1�configuration'*ˆ|----------|ˆ------------------------,*„HI‚|�asmem„|ˆaddress�of�assembly�data�area'*ˆ|----------|ˆ------------------------*&*ˆSee�XREF�above�for�call�to�CLSDASGN.*E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰r eturn�addressDURATION�DS.W†1‰cnfg�def/cnfg-ASMMEMAD�DS.L†1‰assembly�data�section�addressSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a3*‚assembly�routine�is�called�from�a�Pascal�program.*‰PAGE F************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F*********************************************************************** ‰SECTIONƒ9*CLSDASGN�EQU‡**ŠGet�address�of�data�area.*,‰MOVE.L„ASMMEMAD(A7),A4…Address�if�data�area-‰MOVE.B„DURATION(A7),D1…Get�cnfg�def=0/cnfg=1**ˆPerform�close.*7‰LEA‡FHSPB(A4),A0‹Load�addr�of�FHS�parm�blk�from�offset(‰MOVE.W„#FHCLOS,FHSCMD(A0)…Perform�close‰IF.B†D1��#PERM�THEN.S0‹MOVE.W‚#0,FHSOPT(A0)ŠConfigure�with�close�is�ok‰ELSE.S8‹BSETW…#FOPOVRTB,FHSOPT(A0)�Don't�reconfigure�with�close‰ENDI1‰MOVE.B„#TRGTLUN,FHSLUN(A0)„LUN�for�target�device‰TRAP†#3•Do�close**ˆRestore�stack.*‰MOVE.L„(A7),STKLEN(A7)‰ADD.L…#STKLEN,A7‰RTS‰ENDF***********************************************************************Ä**˜C�N�F�G�T�B�L�S�**Ä*F***********************************************************************Ä**’I�N�C�L�U�D�EƒF�I�L�E�S™**Ä*F***********************************************************************Ä**ˆ9995.&.IOE.EQ¯**Ä*F***********************************************************************Ä*‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰LIST*CNFGTBLS�IDNT†1,0*F***********************************************************************Ä**—E�Q�U�A�T�E�S **Ä*F***********************************************************************BINARYƒEQU‡$42‡'B'DECIMAL‚EQU‡$44‡'D'HEX†EQU‡$48‡'H'NONE…EQU‡$4E‡'N' ZERO…EQU‡0*A*‚CNFGTBLS�defines�the�tables�and�menus�for�CONFIG.‚It�includes„**Ä**†The�Tables´*=*ˆPARMTBLƒ-�Parameter�names�and�other�info�about�parameters.**ˆATTRTBLƒ-�Attribute�names. *1*ˆVALTBL„-�Both�values�for�the�attributes�word.Œ**Ä**†The�Header´***ˆPARMHDRƒ-�Header�for�parameter�screen.”***ˆATTRHDRƒ-�Header�for�attribute�screen.”**Ä* *†A�String¶*$*‡NOMODSTRƒ-�NOT�MODIFIABLE�string›**Ä* *†The�Menusµ**‡DNMMENU„-�Device�name�menu *3*‡BFMMENU„-�Boot�file/memory�menu.�(for�Phase�II)‹**‡CBTMENU„-�CB�type�menu.£**‡CFGMENU„-�Configure�menu.¡*&*‡CPYMENU„-�Copy�configuration�menu.˜**Ä**ƒThe�Help�Screens±* *†CBTHELP…-�CB�type�help�menu.ž*)*†BFMHELP…-�Boot�file/memory�help�menu.•*"*†PRMHELP…-�Parameter�help�menu.œ*"*†ATRHELP…-�Attribute�help�menu.œ*"*†CFGHELP…-�Configure�help�menu.œ*+*†CPYHELP…-�Copy�configuration�help�menu.“**Ä*F*--------------------------------------------------------------------**Ä*1*‹M�A�I�N�T�E�N�A�N�C�EƒI�N�S�T�R�U�C�T�I�O�N�SŠ**Ä*'*�F�O�R„A�D�D�I�N�GƒN�E�WƒT�A�B�L�E�S�**Ä*:*†If�a�new�table�is�added,�a�pointer�must�be�declared�inˆ*=*†the�Pascal�portion�of�CONFIG�and�the�pointer�to�the�table…*:*†will�need�to�be�placed�in�the�procedure�declaration�ofˆ*ýF@8Yb&^.C6H>>FQNZVI^9fM@*†INITLIZE�and�in�its�procedure�call.‚In�INITLIZE,�the�pointer�*=*†will�need�to�be�placed�in�the�XREFs�and�in�its�respective…*?*†position�in�the�stack�offset.‚Code�will�need�to�be�added�to‚*;*†INITLIZE�to�initialize�the�pointer.‚Note�that�there�are†*>*†several�different�types�of�pointers�declared�in�the�Pascal„*8*†portion,�one�type�of�pointer�for�each�type�of�table.Š*=*†Additionally,�the�table�itself�will�need�to�be�XREFed�and…*>*†carefully�positioned�in�CNFGTBLS�according�to�its�position„**† in�its�respective�group.¦**Ä*=*†The�tables�below�are�grouped�according�to�their�function.…*:*†If�there�is�any�change�in�the�size�of�a�table�then�theˆ*A*†the�corresponding�constant�that�defines�the�table�size�in�the�*?*†Pascal�declaration�for�that�table�will�need�to�be�redefinedƒ**†in�the�CONST�declaration.¥**Ä*F*********************************************************************** *’X�D�E�F�s*F*********************************************************************** ‰XDEF†PARMTBL ‰XDEF†ATTRTBL ‰XDEF†VALTBL ‰XDEF†PARMHDR ‰XDEF†ATTRHDR‰XDEF†NOMODSTR ‰XDEF†DNMMENU ‰XDEF†BFMMENU ‰XDEF†CBTMENU ‰XDEF†CFGMENU ‰XDEF†CPYMENU ‰XDEF†CBTHELP ‰XDEF†BFMHELP ‰XDEF†PRMHELP ‰XDEF†ATRHELP ‰XDEF†CFGHELP ‰XDEF†CPYHELP ‰XDEF†BAUDTBL*Ä**‰PAGEF***********************************************************************Ä**’D�A�T�AƒS�E�C�T�I�O�N›**Ä*F***********************************************************************‰OPT‡A ‰SECTIONƒ10*F***********************************************************************Ä**–P�A�R�M�T�B�L¡**Ä*F***********************************************************************?*‚PARMTBL�:�There�is�one�table�for�each�device�type.‚Each�tableH*‚has�the�number�of�rows�for�the�specific�device�and�an�entry�length�forH*‚the�number�of�bytes�in�its�rows.‚The�set�of�tables�for�all�the�devices*‚is�called�PARMTBL.*K*‚THIS�SET�OF�TABLES�HAS�A�SPECIAL�ORDER�ACCORDING�TO�ITS�DEVICE�TYPE.‚EACHJ*‚TABLE�IS�POSITIONED�WITH�RESPECT�TO�THE�VALUE�OF�ITS�DEVICE�TYPE�CODE�INC*‚THE�DCB.‚IF�A�NEW�TABLE�IS�ADDED,�IT�MUST�BE�POSITIONED�CAREFULLYD*‚ACCORDING�TO�ITS�DEVICE�TYPE�CODE�VALUE.‚The�tables�are�ordered�as-*‚follows:‚disk,�terminal,�printer,�mag�tape.*6*ˆnumparmˆ=�number�of�parameter�rows�in�specific�table)*ˆpntrylen‡=�length�of�each�parameter�row(*ˆparameter�name�=�name�of�the�parameter/*ˆsize‹=�number�of�bytes�in�the�parameter�value;*ˆbase‹=�base�in�which�parameter�value�is�displayed�to�user(*ˆoffset‰=�parameter's�offset�in�the�DCB9PNTRYLEN�EQU…38…=�number�of�bytes�in�each�parameter�entry-*™MUST�BE�ADJUSTED�IF�ENTRY�LENGTH�IS�CHANGED1*™MUST�AGREE�WITH�ENTRY�LENGTH�IN�ITS�PASCAL�DATA5*™STRUCTURE.‚CHANGE�VALUE�OF�namelen�IN�PASCAL�CONST.,*™IF�LENGTH�OF�NAME�CHANGES,�numscrncols�FOR"*™parmscrn�MAY�ALSO�NEED�CHANGING.1*™LENGTH�OF�ATTRTBL�ENTRY�IS�ALSO�NAMELEN,�CHANGE#*™ANTRYLEN�BELOW�IF�namelen�CHANGES* ____________,*�|�numparm‚|�<--�installed�at�assembly�time* |----------|* | pntrylen | <-- equate2* |__________|____________________________________ *�|�|†|†|�|2* | parameter name | size | base | offset in DCB |2* |________________|______|______|_______________|*F*---------------------------------------------------------------------*ŠDS.W…0=PARMTBLƒEQU†*‰Beginning�of�set�of�parameters�tables�-�PARMTBL*‰PAGEG*----------------------------------------------------------------------*'*ˆD�I�S�KƒP�A�R�A�M�E�T�E�R�SƒT�A�B�L�E!*Œ(for�hard�disk�and�floppy�disk)*G*----------------------------------------------------------------------*PDSKTBLƒDC.B…DPTBLLENŠDC.B…PNTRYLEN/DPTBLSTR‚DC.B…'ƒ0.�Attributes�word‹'†field�name'ŠDC.B…IOSREC-IOSATW›field�size�in�bytesŠDC.B…BINARY¢ASCII�display�baseŠDC.L…IOSATW¢CB�offset!ŠDC.B…'ƒ1.�VERSAdos�sector�size†'ŠDC.B…IOSRSZ-IOSREC ŠDC.B…DECIMAL ŠDC.L…IOSREC$ŠDC.B…'ƒ2.�Total�number�of�sectorsƒ'ŠDC.B…IOSWTO-IOSRSZ ŠDC.B…DECIMAL ŠDC.L…IOSWTOŠDC.B…'ƒ3.�Write�timeout�'ŠDC.B…IOSRTO-IOSWTO ŠDC.B…DECIMAL ŠDC.L…IOSWTOŠDC.B…'ƒ4.�Read�timeoutŽ'ŠDC.B…IOSSPT-IOSRTO ŠDC.B…DECIMAL ŠDC.L…IOSRTO#ŠDC.B…'ƒ5.�Sectors/track�on�media„'ŠDC.B…IOSHDS-IOSSPT ŠDC.B…DECIMAL ŠDC.L…IOSSPT%ŠDC.B…'ƒ6.�Number�of�heads�on�drive‚'ŠDC.B…IOSTRK-IOSHDS ŠDC.B…DECIMAL ŠDC.L…IOSHDS$ŠDC.B…'ƒ7.�#�of�cylinders�on�mediaƒ'ŠDC.B…IOSILV-IOSTRK ŠDC.B…DECIMAL ŠDC.L…IOSTRKŠDC.B…'ƒ8.�Interleave�factor‰'ŠDC.B…IOSSOF-IOSILV ŠDC.B…DECIMAL ŠDC.L…IOSILV#ŠDC.B…'ƒ9.�Spiral�offs  et�on�media„'ŠDC.B…IOSPSM-IOSSOF ŠDC.B…DECIMAL ŠDC.L…IOSSOF'ŠDC.B…'‚10.�Bytes�per�sector�on�media�'ŠDC.B…IOSSHD-IOSPSM ŠDC.B…DECIMAL ŠDC.L…IOSPSM"ŠDC.B…'‚11.�Starting�head�number†'ŠDC.B…IOSTRKD-IOSSHD ŠDC.B…DECIMAL ŠDC.L…IOSSHD%ŠDC.B…'‚12.�#�of�cylinders�on�driveƒ'ŠDC.B…IOSPCOM-IOSTRKD ŠDC.B…DECIMAL ŠDC.L…IOSTRKD'ŠDC.B…'‚13.�Precompensation�cylinder�#'ŠDC.B…IOSSPTD-IOSPCOM ŠDC.B…DECIMAL ŠDC.L…IOSPCOM$ŠDC.B…'‚14.�Sectors/track�on�drive„'ŠDC.B…IOSSRTD-IOSSPTD ŠDC.B…DECIMAL ŠDC.L…IOSSPTD ŠDC.B…'‚15.�Stepping�rate�codeˆ'ŠDC.B…IOSEWCC-IOSSRTD ŠDC.B…DECIMAL ŠDC.L…IOSSRTD&ŠDC.B…'‚16.�Reduced�write�curr�cyl�#‚'ŠDC.B…IOSECC-IOSEWCC ŠDC.B…DECIMAL ŠDC.L…IOSEWCC#ŠDC.B…'‚17.�ECC�data�burst�length…'ŠDC.B…IOSDRSV-IOSECC ŠDC.B…DECIMAL ŠDC.L…IOSECCŠDC.B…'‚H.‚Help–' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZEROŠDC.B…'‚C.‚CONFIGURE�deviceŠ' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZERO&ŠDC.B…'‚Q.‚Quit�(go�to�previous�menu)' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZERODPTBLEND‚EQU†*)DPTBLLEN‚EQU†(DPTBLEND-DPTBLSTR)/PNTRYLEN*‰PAGEF*---------------------------------------------------------------------*/*ˆT�E�R�M�I�N�A�LƒP�A�R�A�M�E�T�E�R�SƒT�A�B�L�E*F*---------------------------------------------------------------------*ŠDS.W…0PTERMTBL‚DC.B…TPTBLLENŠDC.B…PNTRYLEN/TPTBLSTR‚DC.B…'‚0.‚Attributes�word‹'†field�name'ŠDC.B…IOSREC-IOSATW›field�size�in�bytesŠDC.B…BINARY¢ASCII�display�baseŠDC.L…IOSATW¢offset�in�CB ŠDC.B…'‚1.‚Physical�line�width‡'ŠDC.B…IOSRSZ-IOSREC ŠDC.B…DECIMAL ŠDC.L…IOSRECŠDC.B…'‚2.‚Lines�per�pageŒ'ŠDC.B…IOSWTO-IOSRSZ ŠDC.B…DECIMAL ŠDC.L…IOSRSZŠDC.B…'‚3.‚Write�time-outŒ'ŠDC.B…IOSRTO-IOSWTO ŠDC.B…DECIMAL ŠDC.L…IOSWTOŠDC.B…'‚4.‚Read�time-out�'ŠDC.B…IOSXOF-IOSRTO ŠDC.B…DECIMAL ŠDC.L…IOSRTOŠDC.B…'‚5.‚XOFF�characterŒ'ŠDC.B…IOSXON-IOSXOF ŠDC.B…HEX ŠDC.L…IOSXOFŠDC.B…'‚6.‚XON�character�'ŠDC.B…IOSBRC-IOSXON ŠDC.B…HEX ŠDC.L…IOSXONŠDC.B…'‚7.‚BREAK�equivalentŠ'ŠDC.B…IOSDOP-IOSBRC ŠDC.B…HEX ŠDC.L…IOSBRCŠDC.B…'‚8.‚Discard�outputŒ'ŠDC.B…IOSRLN-IOSDOP ŠDC.B…HEX ŠDC.L…IOSDOPŠDC.B…'‚9.‚Reprint�lineŽ'ŠDC.B…IOSCLC-IOSRLN ŠDC.B…HEX ŠDC.L…IOSRLNŠDC.B…'‚10.�Cancel�line�'ŠDC.B…IOSRTV-IOSCLC ŠDC.B…HEX ŠDC.L…IOSCLCŠDC.B…'‚11.�Read�terminator‹'ŠDC.B…IOSEOL-IOSRTV ŠDC.B…HEX ŠDC.L…IOSRTVŠDC.B…'‚12.�End-of-line�'ŠDC.B…IOSBRT-IOSEOL ŠDC.B…HEX ŠDC.L…IOSEOLŠDC.B…'‚13.�Baud�rate‘'ŠDC.B…IOSNLS-IOSBRT ŠDC.B…DECIMAL ŠDC.L…IOSBRTŠDC.B…'‚14.�NULL�paddingŽ'ŠDC.B…IOSTRC-IOSNLS ŠDC.B…DECIMAL ŠDC.L…IOSNLSŠDC.B…'‚15.�Terminator�classŠ'ŠDC.B…IOSTCD-IOSTRC ŠDC.B…HEX ŠDC.L…IOSTRCŠDC.B…'‚16.�Terminal�code�'ŠDC.B…IOSTTM-IOSTCD ŠDC.B…DECIMAL ŠDC.L…IOSTCDŠDC.B…'‚H.‚Help–' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZEROŠDC.B…'‚C.‚CONFIGURE�deviceŠ' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZERO&ŠDC.B…'‚Q.‚Quit�(go�to�previous�menu)' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZEROTPTBLEND‚EQU†*)TPTBLLEN‚EQU†(TPTBLEND-TPTBLSTR)/PNTRYLEN*‰PAGEF*---------------------------------------------------------------------*-*ˆP�R�I�N�T�E�RƒP�A�R�A�M�E�T�E�R�S„T�A�B�L�E*F*---------------------------------------------------------------------*ŠDS.W…0PPRTTBLƒDC.B…PPTBLLENŠDC.B…PNTRYLEN/PPTBLSTR‚DC.B…'‚0.‚Attributes�word‹'†field�nameŠDC.B…IOSREC-IOSATW›field�sizeŠDC.B…BINARY¢ASCII�display�baseŠDC.L…IOSATW¢offset�in�CB ŠDC.B…'‚1.‚Physical�line�width‡'ŠDC.B…IOSRSZ-IOSREC ŠDC.B…DECIMAL ŠDC.L…IOSRECŠDC.B…'‚2.‚Lines�per�pageŒ'ŠDC.B…IOSWTO-IOSRSZ ŠDC.B…DECIMAL ŠDC.L…IOSRSZŠDC.B…'‚3.‚Write�timeout�'ŠDC.B…IOSRTO-IOSWTO ŠDC.B…DECIMAL ŠDC.L…IOSWTOŠDC.B…'‚4.‚Reserved’'ŠDC.B…IOSLRL-IOSRTO ŠDC.B…DECIMAL ŠDC.L…IOSRTOŠDC.B…'‚5.‚Logical�line�widthˆ'ŠDC.B…IOSELC-IOSLRL ŠDC.B…DECIMAL ŠDC.L…IOSLRLŠDC.B…'‚6.‚EOL�character�'ŠDC.B…IOSPRSV-IOSELC ŠDC.B…HEX ŠDC.L…IOSELCŠDC.B…'‚H.‚Help–' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZEROŠDC.B…'‚C.‚CONFIGURE�deviceŠ' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZERO&ŠDC.B…'‚Q.‚Quit�(go�to�previous�menu)'   ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZEROPPTBLEND‚EQU†*)PPTBLLEN‚EQU†(PPTBLEND-PPTBLSTR)/PNTRYLEN*‰PAGEF*---------------------------------------------------------------------*-*ˆM�A�GƒT�A�P�EƒP�A�R�A�M�E�T�E�R�SƒT�A�B�L�E*F*---------------------------------------------------------------------*ŠDS.W…0PMAPTBLƒDC.B…MPTBLLENŠDC.B…PNTRYLEN/MPTBLSTR‚DC.B…'‚0.‚Attributes�word‹'†field�nameŠDC.B…IOSREC-IOSATW›field�sizeŠDC.B…BINARY¢ASCII�display�baseŠDC.L…IOSATW¢offset�in�CBŠDC.B…'‚1.‚Reserved’'ŠDC.B…IOSRSZ-IOSREC ŠDC.B…NONE ŠDC.L…IOSRECŠDC.B…'‚2.‚Reserved’'ŠDC.B…IOSWTO-IOSRSZ ŠDC.B…NONE ŠDC.L…IOSRSZ ŠDC.B…'‚3.‚Write/erase�timeout‡'ŠDC.B…IOSRTO-IOSWTO ŠDC.B…DECIMAL ŠDC.L…IOSWTO"ŠDC.B…'‚4.‚Read�timeout�(system)…'ŠDC.B…IOSDEN-IOSRTO ŠDC.B…DECIMAL ŠDC.L…IOSRTOŠDC.B…'‚5.‚Density�requested‰'ŠDC.B…IOSRDT-IOSDEN ŠDC.B…DECIMAL ŠDC.L…IOSDEN!ŠDC.B…'‚6.‚Number�of�read�tries†'ŠDC.B…IOSWRT-IOSRDT ŠDC.B…DECIMAL ŠDC.L…IOSRDT"ŠDC.B…'‚7.‚Number�of�write�tries…'ŠDC.B…IOSERT-IOSWRT ŠDC.B…DECIMAL ŠDC.L…IOSWRTŠDC.B…'‚8.‚Number�of�erasuresˆ'ŠDC.B…IOSRDTO-IOSERT ŠDC.B…DECIMAL ŠDC.L…IOSERT"ŠDC.B…'‚9.‚Timeout�for�tape�read…'ŠDC.B…IOSSPTO-IOSRDTO ŠDC.B…DECIMAL ŠDC.L…IOSRDTO#ŠDC.B…'�10.‚Timeout�space�fwd/rev…'ŠDC.B…IOSRWTO-IOSSPTO ŠDC.B…DECIMAL ŠDC.L…IOSSPTO ŠDC.B…'�11.‚Timeout�for�rewindˆ'ŠDC.B…IOSSRTO-IOSRWTO ŠDC.B…DECIMAL ŠDC.L…IOSRWTO'ŠDC.B…'�12.‚Timeout�-�filemark�search�'ŠDC.B…IOSMTSV-IOSSRTO ŠDC.B…DECIMAL ŠDC.L…IOSSRTOŠDC.B…'‚H.‚Help–' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZEROŠDC.B…'‚C.‚CONFIGURE�deviceŠ' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZERO&ŠDC.B…'‚Q.‚Quit�(go�to�previous�menu)' ŠDC.B…ZERO ŠDC.B…NONE ŠDC.L…ZEROMPTBLEND‚EQU†*)MPTBLLEN‚EQU†(MPTBLEND-MPTBLSTR)/PNTRYLEN*‰PAGEF************************************************************************–A�T�T�R�T�B�L*G************************************************************************?*‚ATTRTBL�:�There�is�one�table�for�each�device�type.‚Each�tableE*‚has�the�number�of�rows�for�the�specific�device�and�entry�length�forB*‚the�length�of�its�rows.‚The�set�of�tables�for�all�the�devices�is*‚called�ATTRTBL.*K*‚THIS�SET�OF�TABLES�HAS�A�SPECIAL�ORDER�ACCORDING�TO�ITS�DEVICE�TYPE.‚EACHJ*‚TABLE�IS�POSITIONED�WITH�RESPECT�TO�THE�VALUE�OF�ITS�DEVICE�TYPE�CODE�INC*‚THE�DCB.‚IF�A�NEW�TABLE�IS�ADDED,�IT�MUST�BE�POSITIONED�CAREFULLY**‚ACCORDING�TO�ITS�DEVICE�TYPE�CODE�VALUE.*7*‚numattrˆ=�number�of�attributes�rows�in�specific�table)*‚entrylen‡=�length�of�the�attributes�row-*‚attribute�name�=�name�in�the�attributes�row,ANTRYLEN�EQU‡32ˆlength�of�the�attributes�row'*œMUST�BE�ADJUSTED�IF�LENGTH�IS�CHANGED1*œMUST�AGREE�WITH�namelen�IN�PASCAL�CONST�SECTION+*œIF�ANTRYLEN�CHANGES�THEN�PARMTBL�ABOVE�IS4*œALSO�AFFECTED,�attrscrn�IN�PASCAL�PORTION�MAY�ALSO *œBE�AFFECTED** ____________,*�|�numattr‚|�<--�installed�at�assembly�time* |----------|3* | ANTRYLEN | <-- entrylen = attributes row length&* |__________|_______ _______ ________*�|£|*�|ˆattribute�name�|'* |__________ _______ _______ ________|*F*---------------------------------------------------------------------*‰DS.W†05ATTRTBL‚EQU‡*‰Beginning�of�attributes�table�-�ATTRTBL*‰PAGEF*---------------------------------------------------------------------*'*‹D�I�S�KƒA�T�T�R�I�B�U�T�E�SƒT�A�B�L�E!*�(for�hard�disk�and�floppy�disk)*F*---------------------------------------------------------------------*‰DS.W†0ADSKTBL‚DC.B†DATBLLEN‰DC.B†ANTRYLEN!DATBLSTR�DC.B†'‚0.‚Data�densityŽ'‰DC.B†'‚1.‚Track�density�'‰DC.B†'‚2.‚Sides�per�disketteˆ'‰DC.B†'‚3.‚Format”'‰DC.B†'‚4.‚Disk�type‘'‰DC.B†'‚5.‚Drive�data�densityˆ' ‰DC.B†'‚6.‚Drive�track�density‡'#‰DC.B†'‚7.‚Seek�after�head�switch„'!‰DC.B†'‚8.‚Precompensation�type†'‰DC.B†'‚9.‚Floppy�disk�sizeŠ''‰DC.B†'‚10.�Alternate�sector�handling�'‰DC.B†'‚C.‚Configure‘'‰DC.B†'‚H.‚Help–'&‰DC.B†'‚Q.‚Quit(go�to�parameter�menu)'DATBLEND�EQU‡*)DATBLLEN�EQU‡(DATBLEND-DATBLSTR)/A  NTRYLEN*‰PAGEF*---------------------------------------------------------------------*/*ˆT�E�R�M�I�N�A�LƒA�T�T�R�I�B�U�T�E�SƒT�A�B�L�E*F*---------------------------------------------------------------------*‰DS.W†0ATERMTBL�DC.B†TATBLLEN‰DC.B†ANTRYLEN.TATBLSTR�DC.B†'‚0.‚Hardcopy�(chr/line�delete)'‰DC.B†'‚1.‚Use�XOFF/XONŽ'‰DC.B†'‚2.‚Bits�per�characterˆ'‰DC.B†'‚3.‚Stop�bits‘'‰DC.B†'‚4.‚Parity�usageŽ'‰DC.B†'‚5.‚Type�parity�'‰DC.B†'‚6.‚Local�echo�'‰DC.B†'‚7.‚Type�ahead�'%‰DC.B†'‚8.‚Terminate�on�buffer�full‚'‰DC.B†'‚9.‚Pass�nulls�'"‰DC.B†'‚10.�Modem/Direct�connect†'!‰DC.B†'‚11.�Take�modem�off�hook‡'‰DC.B†'‚C.‚Configure‘'‰DC.B†'‚H.‚Help–'&‰DC.B†'‚Q.‚Quit(go�to�parameter�menu)'TATBLEND�EQU‡*)TATBLLEN�EQU‡(TATBLEND-TATBLSTR)/ANTRYLEN*‰PAGEF*---------------------------------------------------------------------*-*ˆP�R�I�N�T�E�RƒA�T�T�R�I�B�U�T�E�SƒT�A�B�L�E*F*---------------------------------------------------------------------*‰DS.W†0APRNTTBL�DC.B†PATBLLEN‰DC.B†ANTRYLEN"PATBLSTR�DC.B†'‚0.‚Auto�linefeed�'"‰DC.B†'‚1.‚Formfeed�after�assign…' ‰DC.B†'‚2.‚Truncate/Wraparound‡'‰DC.B†'‚C.‚Configure‘'‰DC.B†'‚H.‚Help–'&‰DC.B†'‚Q.‚Quit(go�to�parameter�menu)'PATBLEND�EQU‡*)PATBLLEN�EQU‡(PATBLEND-PATBLSTR)/ANTRYLEN*‰PAGEF*---------------------------------------------------------------------*-*ˆM�A�GƒT�A�P�EƒA�T�T�R�I�B�U�T�E�SƒT�A�B�L�E*F*---------------------------------------------------------------------*‰DS.W†0AMTAPTBL�DC.B†MATBLLEN‰DC.B†ANTRYLENMATBLSTR�EQU‡*‰DC.B†'‚0.‚Reserved’'‰DC.B†'‚1.‚Density�request‹'‰DC.B†'‚C.‚Configure‘'‰DC.B†'‚H.‚Help–'&‰DC.B†'‚Q.‚Quit(go�to�parameter�menu)'MATBLEND�EQU‡*)MATBLLEN�EQU‡(MATBLEND-MATBLSTR)/ANTRYLEN*‰PAGEF*********************************************************************** *�V�A�L�T�B�L*F***********************************************************************>*‚VALTBL�:�There�is�one�table�for�each�device�type.‚Each�tableE*‚has�the�number�of�rows�for�the�specific�device�and�entry�length�forB*‚the�length�of�its�rows.‚The�set�of�tables�for�all�the�devices�is*‚called�VALTBL.*K*‚THIS�SET�OF�TABLES�HAS�A�SPECIAL�ORDER�ACCORDING�TO�ITS�DEVICE�TYPE.‚EACHJ*‚TABLE�IS�POSITIONED�WITH�RESPECT�TO�THE�VALUE�OF�ITS�DEVICE�TYPE�CODE�INC*‚THE�DCB.‚IF�A�NEW�TABLE�IS�ADDED,�IT�MUST�BE�POSITIONED�CAREFULLY**‚ACCORDING�TO�ITS�DEVICE�TYPE�CODE�VALUE.*>*‚numattrˆ=�number�of�attributes'�value�rows�in�specific�table0*‚vntrylen‡=�length�of�the�attributes'�value�row0*‚val0‹=�value�in�the�attributes�row�for�bit�=�00*‚val1‹=�value�in�the�attributes�row�for�bit�=�13VNTRYLEN�EQU‡32ˆlength�of�the�attributes'�value�row'*œMUST�BE�ADJUSTED�IF�LENGTH�IS�CHANGED-*œMUST�AGREE�WITH�LENGTH�IN�PASCAL�DATA�STRUC'*œCHANGE�vallen�IN�PASCAL�CONST�SECTION** ____________,*�|�numattr‚|�<--�installed�at�assembly�time* |----------|3* | VNTRYLEN | <-- entrylen = attributes row length&* |__________|_______ _______ ________*�|’|�|*�|ˆval0†|†val1†|'* |__________ _______|_______ ________|*F*---------------------------------------------------------------------*‰DS.W†04VALTBLƒEQU‡*‰Beginning�of�attributes�table�-�ATTRTBL*‰PAGEF*---------------------------------------------------------------------*1*ˆD�I�S�KƒA�T�T�R�I�B�U�T�E�SƒV�A�L�U�EƒT�A�B�L�E#*’(for�hard�disks�and�floppy�disks)*F*---------------------------------------------------------------------*ADVTBLƒDC.B†DAVTBLEN‰DC.B†VNTRYLENDAVTBSTR�EQU‡*!�DC.B�'SINGLE�(FM)…DOUBLE�(MFM)„'&�DC.B�'SINGLE�DENSITY‚DOUBLE�DENSITY‚'"�DC.B�'SINGLE�SIDED„DOUBLE�SIDED„'#�DC.B�'MOTOROLA�FORMAT�IBM�FORMAT†'�DC.B�'FLOPPY�DISK…RIGID�DISK†'!�DC.B�'SINGLE�(FM)…DOUBLE�(MFM)„'&�DC.B�'SINGLE�DENSITY‚DOUBLE�DENSITY‚'�DC.B�'NOŽYES�'�DC.B�'PRE-WRITE‡POST-WRITE†'�DC.B�'5-1/4�INCH†8�INCHŠ'�DC.B�'DO�NOT�USE†USE�'DAVTBEND�EQU‡*)DAVTBLEN�EQU‡(DAVTBEND-DAVTBSTR)/VNTRYLEN*‰PAGEF*---------------------------------------------------------  ------------*9*ˆT�E�R�M�I�N�A�LƒA�T�T�R�I�B�U�T�E�SƒV�A�L�U�EƒT�A�B�L�E*F*---------------------------------------------------------------------*‰DS.W†0ATMVTBL‚DC.B†TAVTBLEN‰DC.B†VNTRYLENTAVTBSTR�EQU‡*�DC.B�'ERASE‹SHOWŒ'�DC.B�'NOŽYES�' �DC.B�'8�7�' �DC.B�'1�2�'�DC.B�'NOŽYES�'�DC.B�'ODD�EVENŒ'�DC.B�'YES�NOŽ'�DC.B�'YES�NOŽ'�DC.B�'NOŽYES�'�DC.B�'NOŽYES�'�DC.B�'TERMINALˆMODEM‹'�DC.B�'NOŽYES�'TAVTBEND�EQU‡*)TAVTBLEN�EQU‡(TAVTBEND-TAVTBSTR)/VNTRYLEN*‰PAGEF*---------------------------------------------------------------------*7*‚P�R�I�N�T�E�RƒA�T�T�R�I�B�U�T�E�SƒV�A�L�U�EƒT�A�B�L�E*F*---------------------------------------------------------------------*‰DS.W†0APVTBLƒDC.B†PAVTBLEN‰DC.B†VNTRYLENPAVTBSTR�EQU‡*�DC.B�'NOŽYES�'�DC.B�'YES�NOŽ'�DC.B�'WRAPAROUND†TRUNCATEˆ'PAVTBEND�EQU‡*)PAVTBLEN�EQU‡(PAVTBEND-PAVTBSTR)/VNTRYLEN*‰PAGEF*---------------------------------------------------------------------*7*‚M�A�GƒT�A�P�EƒA�T�T�R�I�B�U�T�E�SƒV�A�L�U�EƒT�A�B�L�E*F*---------------------------------------------------------------------*‰DS.W†0AMTVTBL‚DC.B†MAVTBLEN‰DC.B†VNTRYLENMAVTBSTR�EQU‡* �DC.B�' '�DC.B�'NOŽYES�'MAVTBEND�EQU‡*)MAVTBLEN�EQU‡(MAVTBEND-MAVTBSTR)/VNTRYLEN*‰PAGEF***********************************************************************/*ˆH�E�A�D�E�RƒT�OƒP�A�R�M/A�T�T�RƒS�C�R�E�E�N�S*F***********************************************************************+*ˆP�A�R�A�M�E�T�E�RƒS�C�R�E�E�NƒH�E�A�D�E�R*‰DS.W†0 PARMHDR‚EQU‡** ‰DC.B†'#†PARAMETER�FIELDS”VALUE'*F*---------------------------------------------------------------------*+*ˆA�T�T�R�I�B�U�T�EƒS�C�R�E�E�NƒH�E�A�D�E�R*‰DS.W†0 ATTRHDR‚EQU‡** ‰DC.B†'#…ATTRIBUTE�FIELDS•VALUE'*F************************************************************************ˆN�O�M�O�DƒS�T�R�I�N�G*F***********************************************************************‰DS.W†0NOMODSTR�EQU‡**‰DC.B†'Not�modifiable'*‰PAGEF***********************************************************************%*ˆM�I�S�C�E�L�L�A�N�E�O�U�SƒM�E�N�U�S*F*************************************************************************ˆBOOT�FILE/MEMORY�MENU*E*--------------------------------------------------------------------*‰DS.W†0 BFMMENU‚EQU‡* ‰DC.B†'¸'*‰PAGEF*---------------------------------------------------------------------**ˆDEVICE�NAME�MENU*F*---------------------------------------------------------------------*‰DS.W†0 DNMMENU‚EQU‡*<‰DC.B†'A�device�name�is�one�to�four�alphanumeric�characters'(‰DC.B†'preceded�by�the�pound�sign�(#).•' ‰DC.B†'´'9‰DC.B†'The�"#"�used�without�a�device�name‚refers‚to‚your'‰DC.B†'logon�device.§' ‰DC.B†'´' ‰DC.B†'´'*‰PAGEG*----------------------------------------------------------------------**ˆDCB/CCB�MENU*G*----------------------------------------------------------------------*‰DS.W†0 CBTMENU‚EQU‡**6‰DC.B†'1.‚Modify�default�values…(configure�defaults)‚'5‰DC.B†'2.‚Modify�working�values…(configure�request)ƒ'‰DC.B†'H.‚Help¬':‰DC.B†'Q.‚Quit‚(return�to�menu�for�entering�device�name)�' ‰DC.B†'´' ‰DC.B†'´' ‰DC.B†'´'*‰PAGEF*---------------------------------------------------------------------**ˆCONFIGURE�MENU*G*----------------------------------------------------------------------*‰DS.W†0 CFGMENU‚EQU‡**‰DC.B†'C.‚Configure§'‰DC.B†'H.‚Help¬'5‰DC.B†'Q.‚Quit‚(return�to�parameter�selection�menu)†' ‰DC.B†'´' ‰DC.B†'´' ‰DC.B†'´' ‰DC.B†'´'*‰PAGEG*----------------------------------------------------------------------* *ˆCOPY�MENU*G*----------------------------------------------------------------------*‰DS.W†0 CPYMENU‚EQU‡**‰DC.B†'P.‚Print�configuration�'‰DC.B†'D.‚Next�device¥'‰DC.B†'H.‚Help¬'‰DC.B†'E.‚Exit�from�CONFIG ' ‰DC.B†'´' ‰DC.B†'´' ‰DC.B†'´'*‰PAGEG**********************************  ***************************************’H�E�L�PƒM�E�N�U�S*G*************************************************************************ˆBOOT�FILE/MEMORY�HELP�MENU*G*----------------------------------------------------------------------*‰DS.W†0 BFMHELP‚EQU‡**‰PAGEG*----------------------------------------------------------------------**ˆDCB/CCB�HELP�MENU*G*----------------------------------------------------------------------*‰DS.W†0 CBTHELP‚EQU‡***E�DC.B‚'1.‚Modify�default�values:�this�selection‚performs�a‚configure'G�DC.B‚'defaults�on�the�target�device.‚It�remains�in�effect�until�it�is'F�DC.B‚'changed�by‚another�configure�defaults.‚Only�user�0�can�perform'$�DC.B‚'this�type�of�configuration.¥' �DC.B‚'À'E�DC.B‚'2.‚Modify�working�values:�this‚selection‚performs�a�configure'C�DC.B‚'request.‚In�the�case�of‚terminals�and‚printers,‚the‚working'H�DC.B‚'values�will�stay�changed�until�overwritten�by�the�default�values'D�DC.B‚'when�the�last�user�logs�off�or�the‚assignment�in‚closed.ƒFor'?�DC.B‚'the�magnetic�tape,�a�dismount�must�also�have�occurred.Š' �DC.B‚'À'G�DC.B‚'Q.‚This�selection�will�recall�the�menu�requesting�a�device�name'�DC.B‚'for�reconfiguration.¬'*‰PAGEG*----------------------------------------------------------------------**ˆPARAMETER�HELP�MENU*G*----------------------------------------------------------------------*‰DS.W†0 PRMHELP‚EQU‡**D�DC.B‚'The‚selection�of�a‚number�will�result�in�a�request�for‚a‚new'G�DC.B‚'value�for�the�chosen�parameter.‚Values�may�be�entered�as�binary'F�DC.B‚'(precede�value�with�%�sign),‚decimal�(value�only),‚hexadecimal'G�DC.B‚'(precede�value�with�$�sign)�or�control�character‚(precede�value'E�DC.B‚'with�the�characters�"CTRL"�or�"^";�eg.‚CTRL�A�or�^A).ƒThe�new'E�DC.B‚'value�will�be�displayed�in�its�field�in�the�parameters�menu.„' �DC.B‚'À'F�DC.B‚'C.‚This�selection‚will�cause�a�new�menu�to�be�displayed�asking'0�DC.B‚'for�permission�to�configure�the�device.™' �DC.B‚'À'F�DC.B‚'Q.‚This�selection�will�recall�the�configure‚defaults/configure'G�DC.B‚'request�menu.‚Any�changes�made�to�the�parameter�values�will�not';�DC.B‚'be�saved,�and�the�device�will�not�be�reconfigured.Ž'*‰PAGEG*----------------------------------------------------------------------**ˆATTRIBUTES�HELP�MENU*G*----------------------------------------------------------------------*‰DS.W†0 ATRHELP‚EQU‡**G�DC.B‚'The�selection�of�a�number�will�cause�the�value�of‚the�attribute'C�DC.B‚'selected�to�be‚changed�to�its�other‚possible�value.„The�new'C�DC.B‚'attributes‚menu�will�be‚displayed‚with�the‚new�value‚in�the'�DC.B‚'selected�field.±' �DC.B‚'À'F�DC.B‚'C.‚This�selection‚will�cause�a�new�menu�to�be�displayed�asking'0�DC.B‚'for�permission�to�configure�the�device.™' �DC.B‚'À'E�DC.B‚'Q.‚This�will�cause�the�parameters�menu�to�be‚redisplayed‚with'%�DC.B‚'the�revised�attributes�word.¤' �DC.B‚'À' �DC.B‚'À' �DC.B‚'À'*‰PAGEG*----------------------------------------------------------------------**ˆCONFIGURE�MENU*G*----------------------------------------------------------------------*‰DS.W†0 CFGHELP‚EQU‡**E�DC.B‚'C.‚This�selection�takes�the‚values�in�the�parameters‚menu�and'F�DC.B‚'in�the�attributes�menu�and�uses�them�to�configure�the�device.ƒ' �DC.B‚'À' �DC.B‚'À' �DC.B‚'À' �DC.B‚'À' �DC.B‚'À':�DC.B‚'Q.‚This�selection�returns�to�the�parameters�menu.Ž' �DC.B‚'À' �DC.B‚'À' �DC.B‚'À' �DC.B‚'À' �DC.B‚'À'*‰PAGEG*----------------------------------------------------------------------* *ˆCOPY�MENU*G*----------------------------------------------------------------------*‰DS.W†0 CPYHELP‚EQU‡**E�DC.B‚'P.‚This�selection�will‚print�a�copy�of�the�new‚configuration.'F�DC.B‚'You�will�be�asked‚for�the�name�of�the�device�on�which�to‚print'C�DC.B‚'it.‚Precede�the�device�name�with�"#".ƒTyping‚"#"�alone‚will'>�DC.B‚'cause�the�configuration�t  o�be�printed�on�this�device.‹' �DC.B‚'À' �DC.B‚'À'@�DC.B‚'D.‚This�selection�asks�for�another�device�to�configure.ˆ' �DC.B‚'À' �DC.B‚'À' �DC.B‚'À'1�DC.B‚'E.‚This�selection�will�terminate�CONFIG.—' �DC.B‚'À' �DC.B‚'À'**‰PAGEG*************************************************************************ˆCONFIGURE�MENU*G************************************************************************‰DS.W†0 BAUDTBL‚EQU‡*‰DC.L†50 ‰DC.B†'50ˆ'‰DC.L†75 ‰DC.B†'75ˆ' ‰DC.L†110 ‰DC.B†'110‡' ‰DC.L†1345‰DC.B†'134.5…' ‰DC.L†150 ‰DC.B†'150‡' ‰DC.L†300 ‰DC.B†'300‡' ‰DC.L†600 ‰DC.B†'600‡' ‰DC.L†1200 ‰DC.B†'1200†' ‰DC.L†1800 ‰DC.B†'1800†' ‰DC.L†2000 ‰DC.B†'2000†' ‰DC.L†2400 ‰DC.B†'2400†' ‰DC.L†3600 ‰DC.B†'3600†' ‰DC.L†4800 ‰DC.B†'4800†' ‰DC.L†7200 ‰DC.B†'7200†' ‰DC.L†9600 ‰DC.B†'9600†' ‰DC.L†19200‰DC.B†'19200…' ‰DC.L†38400‰DC.B†'38400…' END   éé1FORCE„IDNT†1,1‘force�output�proccedure�for�Pascal* *’F�O�R�C�E**ˆPROCEDURE�FORCE�(FIL:‚TEXT)*?*ˆThis�assembly�language�routine�interfaces�to�a�Pascal�programA*ˆand�forces�whatever�is�in�the�buffer�for�the�file�pointed�to�by0*ˆFIL�out�to�the�file�without�a�carriage�return.*:*ˆThose�registers�used�are�A0,�A1,�A2,�A4,�D1,�D2,�and�D4.** *ˆXDEF�the�name�of�this�routine.* ‰XDEF†FORCE**:*ˆThe�following�are�offsets�into�a�Pascal�parameter�block.* FUNCTION�EQU‡8“IOS�function�code*BUFSTART�EQU‡20’Address�of�start�of�buffer&BUFENDƒEQU‡24’Address�of�end�of�buffer*2*ˆThe�following�are�the�necessary�equates�for�IOS.*"IOS†EQU‡2“The�trap�number�for�IOS.*�0�and�the�error�code�is�known,�then�giveƒ*-*–msg�a�corresponding�value�for�that�error.…*/*–Else,�error�is�unknown�so�call�system�errorƒ**–handler,�then�return.™*4*’3.‚Get�the�address�of�CCB�in�CONFIG.‚Do�configure*+*–status�request�to�get�the�CCB�info�into‡**–CONFIG's�CCB.¡*4*’4.‚Put�device�type�into�logondev�and�preserve�in�**–D1.«*3*’5.‚Initialize�pmask,�amask,�aword�in�CONFIG�and‚* *–the�values�for�CONFIG's�DCB.’*1*’6.‚Check�to�see�if�the�user�is�user�0.‚If�so,ƒ***–get�the�address�of�DCB�in�CONFIG.‚Do�a‡*1*–configure�defaults�to�get�the�target�DCB�into�**–CONFIG'S�DCB.¡*/*’7.‚Initialize�pmask,�amask,�aword�in�DCB�in†*-*–CONFIG�with�the�saved�values�from�STEP�3.…*/*’8.‚Use�the�device�type�code�in�D1�to�get�to†*.*–the�proper�device�table�address�in�the�set„*/*–of�parameters�tables,�the�set�of�attributesƒ*0*–tables�and�the�set�of�values�tables.‚See�the�*2*–note�below�for�the�order�of�the�sets�of�tables.*,*–For�each�table�pointer�do�the�following:†*,*ša.‚Get�the�pointer�address�off�the�stack�**šb.‚Get�1st�table�address‘*+*šc.‚Call�CALCADDR�to�get�to�device�table‚*&*žcorresponding�to�the�target's�type„**šd.‚Store�calculated�addressŽ*$*’9.‚Restore�the�stack�and�return.‘*w4€;ˆ8�A˜9 9¨?°A¸AÀ.*Ä**ˆSubroutine�EMH®*6*ŽThis�error�handling�routine�calls�the�system�error„**Žmessage�handler.¦**Ä**ˆSubroutine�CLOSE¬*!*ŒCloses�the�device�assignment.›**Ä**ˆSubroutine�CALCADDR©*8*Ša.‚D2�contains�the�device�type�code.‚Move�D2�into�D1„*5*Žto�preserve�D2.‚Load�the�pointer�with�the�address„*4*Žof�the�head�of�the�set�of�tables.‚If�D1�=�0�then…*$*Žtable�has�been�found�so�go�to�d.–*3*Šb.‚Else�take�the�number�of�entries�in�the�tableŠ*9*Žhead�and�multiply�it�by�the�entry�length�found�in�the�*7*Žtable�head.‚Add�4�bytes�for�the�length�of�the�table‚*6*Žhead.‚Add�this�calculation�to�the�pointer�address.ƒ*3*Šc.‚Subtract�1�from�D1.‚If�D1�<>�0�then�go�to�b.‰**Šd.‚Return.¯**Ä*<*‚NOTE�:�All�tables�dealing�with�devices�are�set�up�in�theŠ*=*‰following�order:‚disk�(floppy�or�hard),�terminal,�printer�*=*‰and�magnetic�tape.‚This�follows�the�order�of�their�device�* *‰codes.µ**Ä* *‚REGISTERS¹*>*„IN…:ƒA3�points�to�Pascal�runtime�library;�MUST�be�preserved*0*‹:ƒA5�points�to�Pascal�RMA;�MUST�be�preserved‹*-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ*:*‹:ƒA7�points�to�stack�with�parameters�and�return�address**�MUST�be�preserved¤**Ä*#*„DURING�:ƒA0�used�for�trap�callsŸ*7*�A4�points�to�memory�area�for�GETMEMCB;�preserve�for‚**�duration�of�GETMEMCB. **�D1�has�device�type�codež* *�D2�has�the�user�logon�number™**�D3�has�parameters�maskŸ**�D4�has�attributes�maskŸ**�D5�has�attributes�wordŸ*!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*A*‚PARAMETERS�:�The�addresses�of�the�parameters�are�on�the�stack…*5*�such�that�the�first�parameter�is�put�on�the�stack„*5*�first�and�the�last�parameter�is�at�the�top�of�the„*(*�stack�just�under�the�return�address.‘*0*’aword,�parmptr,attrptr,avalptr,�asmmem,�msg)†**Ä*F***********************************************************************‰OPT‡A*GETMEMCB�IDNT†1,0‰PAGEF*********************************************************************** *•X�D�E�F�S*  F***********************************************************************"‰XDEF†GETMEMCBŒProgram�entry�point*F*********************************************************************** *•X�R�E�F�S*F***********************************************************************2‰XREF†FHSPB…Offset�to�FHSPB�in�assembly�data�area.2‰XREF†IOSPB…Offset�to�IOSPB�in�assembly�data�area.4‰XREF†EMPBLK„Offset�to�EMPBLK�in�assembly�data�area.*F************************************************************************�I�N�C�L�U�D�EƒF�I�L�E�S*F************************************************************************ˆINCLUDEƒ9995.&.IOE.EQ*ˆINCLUDEƒ9995.&.TR1.EQ*ˆNOLIST‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.TR1.EQ‰LIST*F************************************************************************™E�Q�U�A�T�E�S*F***********************************************************************9*ˆWARNING�-�Watch�for�value�changes�to�DEVBUSY,�NOSUCHDV,<*ˆNONE,�SPOOLUP�and�STOPSCRN�in�CONFIG.‚These�are�ENUMERATED?*ˆvariables�and�if�their�order�is�shuffled�in�their�Pascal�type>*ˆdeclaration�or�a�new�entry�is�placed�in�front�of�one�of�them>*ˆin�the�declaration�in�CONFIG,�their�VALUE�WILL�CHANGE�and�an%*ˆimproper�message�will�be�displayed.*@LOWBYTE‚EQU‡$000000FF�Value�to�AND�out�garbage�and�keep�low�byte@LOWWORD‚EQU‡$0000FFFF�Value�to�AND�out�garbage�and�keep�low�word=HIGHWORD�EQU‡$FFFF0000�Value�to�OR�one's�into�high�order�word'NONE…EQU‡0‰Value�for�no�message�pending&DEVBUSY‚EQU‡1‰Value�for�devbusy�in�msg)NOSUCHDV�EQU‡2‰Value�for�nosuchdev�in�msg=NOTCNFG‚EQU‡3‰Value�for�device�type�which�is�not�configurable8NOTRDYƒEQU‡4‰Value�for�device�not�ready�to�be�configured>SPOOLUP‚EQU‡5‰Value�for�msg�when�spooler�is�active�for�printer3STOPSCRN�EQU‡6‰Value�for�msg�which�will�stop�screen1BADDTYPE�EQU‡8‰Value�for�msg�when�CB�has�bad�info PRNTERƒEQU‡2‰Device�is�a�printer/TRGTLUN‚EQU‡2‰Target�device�LUN�for�trap�calls.BLANK2ƒEQU‡'‚'†2�blanksBLANK4ƒEQU‡'„'„4�blanksUSERZERO�EQU‡0‰0*‰PAGEF************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|'*ˆ|----------|ˆ-------------------------*ˆ|�msg†|ˆaddress�of�enumerated�variable,�msg'*ˆ|----------|ˆ------------------------'*ˆ|�asmmemƒ|ˆaddr�of�assmebly�data�area'*ˆ|----------|ˆ------------------------ *ˆ|�avalptr‚|*ˆ|----------|:*ˆ|�attrptr‚|ˆaddress�of�pointers�to�1st�table�in�each�set*ˆ|----------| *ˆ|�parmptr‚|(*ˆ|----------|ˆ------------------------- *ˆ|�Dawordƒ|*ˆ|----------| *ˆ|�Cawordƒ|*ˆ|----------|ˆaddress�of�masks *ˆ|�pmask„|*ˆ|----------| *ˆ|�amask„|(*ˆ|----------|ˆ-------------------------9*ˆ|�DCB†|ˆaddress�of�DCB�which�gets�configure/status�info(*ˆ|----------|ˆ-------------------------9*ˆ|�CCB†|ˆaddress�of�CCB�which�gets�configure/status�info(*ˆ|----------|ˆ-------------------------*ˆ|�unum…|ˆuser�logon�number(*ˆ|----------|ˆ-------------------------2*‚HI„|�targetƒ|ˆaddress�of�record�with�target�info(*ˆ|----------|ˆ-------------------------**E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰return�address'MSGADDR‚DS.L†1‰enumerated�variable,�msg*ASMMEMAD�DS.L†1‰assembly�data�area�address"VTPTRAD‚DS.L†1‰value�table�address'ATPTRAD‚DS.L†1‰attributes�table�address'PTPTRAD‚DS.L†1‰parameters�table�address9DAWRDAD‚DS.L†1‰attributes�word�address�for�default�values9CAWRDAD‚DS.L†1‰attributes�word�address�for�current�values&PMASKAD‚DS.L†1‰parameters�mask�address&AMASKAD‚DS.L†1‰attributes�mask�addressDCBADDR‚DS.L†1‰DCB�addressCCBADDR‚DS.L†1‰CCB�addressUNUM…DS.W†1‰unum#TRGTADƒDS.L†1‰target�record�addressSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a  3*‚assembly�routine�is�called�from�a�Pascal�program.*‰PAGEF************************************************************************—D�A�T�AƒA�R�E�A*F***********************************************************************9*ˆThe�data�area�with�the�parameter�blocks�that�was�set�up?*ˆin�CFIGDATA�is�used.‚The�data�names�used�here�are�as�follows:*?*ˆFHSPB…parameter�block�used�for�device�assignments�-�used�hereB*ˆIOSPB…parameter�block�used�for�configure/status�call�-�used�hereB*ˆEMPBLK„parameter�block�used�by�Error�Message�Handler�-�used�here*A*ˆNone�of�the�values�installed�in�INITLIZE�are�assumed�valid.‚TheA*ˆfields�modified�in�INITLIZE�are�redefined�here�along�with�other>*ˆappropriate�fields.‚The�exception�to�this�is�EMPBLK�which�is@*ˆset�up�for�all�error�message�handling�in�all�assembly�routines*ˆexcept�for�register�A0.*F*=====================================================================**ˆPARAMETER�BLOCKS*F*---------------------------------------------------------------------*J*‚FHSPB�is�a�parameter�block�for�assigning�TRGTLUN�with�public�write�whichH*‚works�for�all�devices.‚This�assignment�is�necessary�prior�to�doing�the*‚configure/status�request.*F*---------------------------------------------------------------------*H*‚IOSPB�is�a�parameter�block�for�doing�configure/status�request.‚The�IOSD*‚call�using�this�parm�block�will�return�the�DCB�information�for�the*‚target�device�to�CB.*F*---------------------------------------------------------------------*6*‚EMPBLK�is�used�for�the�system�error�message�handler.*F************************************************************************’TARGET�RECORD�TEMPLATE*F*********************************************************************** ‰OFFSET„0*NAME…DS.L†1‰Device�nameTYPE…DS.B†1‰Device�type�code‰PAGEF************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F*********************************************************************** ‰SECTIONƒ9*GETMEMCB�EQU‡**M*�STEP�1.‚Get�address�of�data�segment,�the�target�device�name�and�the�address*ˆof�msg�for�errors.*7‰MOVE.L„ASMMEMAD(A7),A4…A4<--addr�of�data�area�on�stack*=‰MOVE.L„TRGTAD(A7),A2‡A2�<--�addr�of�target�dev�record�on�stk*&‰MOVE.L„MSGADDR(A7),A1†Get�msg�address‰PAGE*(*‚STEP�2.‚Perform�the�device�assignment.*,‰LEA‡FHSPB(A4),A0ŠMove�addr�of�FHSPB�into�A04‰MOVE.W„#FHASGN,FHSCMD(A0)„Perform�device�assignment;‰MOVE.W„#FOPPW,FHSOPT(A0)…Public�write,�good�for�any�device1‰MOVE.B„#TRGTLUN,FHSLUN(A0)ƒLUN�for�target�device‰MOVE.B„#0,FHSSTA(A0)‰Status5‰MOVE.L„(A2),FHSVOL(A0)‡Target�name�for�configuration1‰MOVE.W„#USERZERO,FHSUSN(A0)‚Zero�-->�user�number1‰MOVE.L„#BLANK4,FHSCLG(A0)„Blank�out�catalog�name;‰MOVE.L„#BLANK4,FHSCLG+4(A0)‚Blank�out�rest�of�catalog�name.‰MOVE.L„#BLANK4,FHSFIL(A0)„Blank�out�file�name8‰MOVE.L„#BLANK4,FHSFIL+4(A0)‚Blank�out�rest�of�file�name.‰MOVE.W„#BLANK2,FHSEXT(A0)„Blank�out�extension‰TRAP†#3”Do�assignment*6‰BEQ.S…CNFGCALLŽValid�device,�go�do�configure�stat�req*=‰IF�#FSTAVOL��D0�THEN.S†FHS�code�for�device�doesn't�exist9‹MOVE.B‚#NOSUCHDV,(A1)ˆmsg<--nosuchdev�for�CONFIG�message‰ELSE.S.‹MOVE.B�#STOPSCRN,(A1)‰Stop�screen�for�message'‹BSR…EMH“Put�out�system�message�and�RTS‰ENDI‰BRA.L…GOHOME�Go�back�to�Pascal‰PAGE*I*‚STEP�3.‚Retrieve�the�CCB�values�with�a�configure/status�req.‚Put�in�CB.**ˆGet�CCB�values.*4CNFGCALL�LEA‡IOSPB(A4),A0ŠLoad�addr�of�IOSPB�into�A03‰MOVE.W„#IOSTAT,IOSFCT(A0)„Configure�status�request,‰MOVE.W„#0,IOSOPT(A0)‰Fill�options�with�zero<‰MOVE.B„#TRGTLUN,IOSLUN(A0)ƒTarget�device�assigned�in�STEP�3B‰MOVE.L„CCBADDR(A7),IOSDBP(A0)�CONFIG'S�CCB�addr�->�CSB�in�STATIOS,‰TRAP†#2”During�the�trap�call�the�CCB�values$*¨will�be�written�to�the�CSB�address*‰BEQ.S…DEVTYPE�Configure�request�performed*3‰IF�#ISTADB��D0�THEN.S‡IOS�code�for�device�busy  6‹MOVE.B‚#DEVBUSY,(A1)‰msg<--devbusy�for�CONFIG�message‰ELSE.S9�MOVE.B‚#STOPSCRN,(A1)†msg<--stopscrn,�stops�screen�later �BSR.L�EMH“Error�message�handler‰ENDI* ‰BSR.L…CLOSE�No�values,�deassign‰BRA.L…GOHOMEŽGo�back‰PAGE*G*�STEP�4.‚Get�target�device�record�address�and�put�target�type�into�it.*8*ˆPut�device�type�code�from�CB�into�target�and�register.*3DEVTYPE‚MOVE.L„CCBADDR(A7),A0‰A0�<--�address�of�CCB3‰IF.B‚IOSDTP(A0)��#0�THEN.S‚Invalid�device�type)‹MOVE.B‚#BADDTYPE,(A1)‰Set�bad�device�msg‹BRA.LƒGOHOME‘Go�back‰ENDID‰MOVE.B„IOSDTP(A0),TYPE(A2)�Target.devtype<--device�type�code�in�CCB:‰MOVE.B„IOSDTP(A0),D1‡Get�type�code�for�use�in�STEP�7�&�8.‰PAGE*?*�STEP�5.‚Initialize�masks�and�attributes�word�with�CCB�values.*G*ˆNOTE:‚Cpmask,�Camask�and�Caword�are�set�variables�declared�in�Pascal.F*ˆSet�variables�are�64�bits�long�with�bit�0�corresponding�to�the�firstB*ˆvariable�in�the�enumerated�list�for�the�set.‚Thus,�we�initializeA*ˆthe�low�order�long�word�in�the�set�variables�with�the�masks�and;*ˆattributes�word,�the�rest�of�the�set�variable�has�zeroes.**ˆD3‡|<--MASK-->|*ˆ_____________________*ˆ|�0�..�0�|Š|*ˆ---------------------* *ˆ63“31‘0+*ˆ_________________________________________ *ˆ|‰|‰|‰|‰|+*ˆ----------------------------------------- *¦|<-�D3‚->|*ˆ^“^*ˆ|“|-*ˆaddr�on�stack‡adjusted�addr�where�mask�goes*!*ˆGet�address�of�initialized�CCB.*3‰MOVE.L„CCBADDR(A7),A2‡Get�address�of�CCB�off�stack*?*ˆGet�address�of�pmask,�initialize�it�with�the�parameters�mask.*(‰MOVE.L„PMASKAD(A7),A1†Get�addr�of�pmask2‰ADD.L…#6,A1�Point�address�at�lower�16�bits�in�set*<‰MOVE.W„IOSPRM(A2),D3‡Get�parm�mask�in�low�order�word�of�reg0‰MOVE.W„D3,(A1)�Put�mask�into�pmask;�preserve�D3*?*ˆGet�address�of�amask,�initialize�it�with�the�attributes�mask.*(‰MOVE.L„AMASKAD(A7),A1†Get�addr�of�amask2‰ADD.L…#6,A1�Point�address�at�lower�16�bits�of�set*>‰MOVE.W„IOSATM(A2),D4‡Write�over�low�order�word�with�attr�mask0‰MOVE.W„D4,(A1)�Put�mask�into�amask;�preserve�D4*7*ˆGet�address�of�aword�and�initialize�lower�order�bits.*(‰MOVE.L„CAWRDAD(A7),A1†Get�addr�of�aword2‰ADD.L…#6,A1�Point�address�at�lower�16�bits�of�set*:‰MOVE.W„IOSATW(A2),D5‡Write�over�low�order�word�with�aword$‰MOVE.W„D5,(A1)�Put�mask�into�Caword*.‰MOVE.L„MSGADDR(A7),A1†Restore�message�address‰PAGE*C*�STEP�6.ƒIf�the�user�is�user�0�then�retrieve�the�DCB�values�with�a!*‹configure�default;�masks�are�0.*;*ˆSee�if�its�user�zero�by�looking�at�user�number�in�regsav.*)‰MOVE.W„UNUM(A7),D2‹Get�address�of�regsav(‰IF.W�D2��#0�THEN.SŠTest�for�user�#0+‹BRA.SƒTBLPTRS�Not�#0,�so�don't�do�cnfg�def‰ENDI**ˆGet�DCB�values.*&‰LEA‡IOSPB(A4),A0ŠGet�address�of�IOSPB:‰MOVE.W„#IOCHDC,IOSFCT(A0)„Configure�defaults�with�0�masks-‰MOVE.W„#0,IOSOPT(A0)‰Fill�options�with�zero.<‰MOVE.B„#TRGTLUN,IOSLUN(A0)ƒTarget�device�assigned�in�STEP�3B‰MOVE.L„DCBADDR(A7),IOSDBP(A0)�CONFIG'S�DCB�addr�->�CSB�in�STATIOS,‰TRAP†#2”During�the�trap�call�the�DCB�values$*¨will�be�written�to�the�CSB�address+‰BEQ.S…DODMASKSŽConfigure�request�performed*3‰IF�#ISTADB��D0�THEN.S‡IOS�code�for�device�busy6‹MOVE.B‚#DEVBUSY,(A1)‰msg<--devbusy�for�CONFIG�message‰ELSE.S6‹IF�#ISTAIF��D0�THEN.S…IOS�code:�spooler�is�active*�MOVE.B�#SPOOLUP,(A1)ˆSee�if�its�a�printer‹ELSE.S8�IF�#ISTANR��D0�THEN.SƒIOS�code�for�device�not�ready+�MOVE.B�#NOTRDY,(A1)‡msg<--device�not�ready�ELSE.S9�MOVE.B‚#STOPSCRN,(A1)„msg<--stopscrn,�stops�screen�later �BSR.SƒEMH�Error�message�handler�ENDI‹ENDI‰ENDI*‰BSR‡CLOSE�No�values‰BRA.S…GOHOMEŽGo�back‰PAGE*7*�STEP�7.‚Get�address�of�initialized�DCB.‚Put�in�masks.**;DODMASKS�MOVE.L„DCBADDR(A7),A2‡Get�address�of�DCB�off�stack*B*ˆInitialize�parm�mask,�attr�mask,�attr�word�and�device�type�code.*6‰MOVE.W„D3,IOSPRM(A2)ˆPut�preserved�parm�mask�into�DCB*6‰MOVE.W„D4,IOSATM(A2)ˆPut�preserved�attr�mask�into�DCB*7‰MOVE.L„DAWRDAD(A7),A1‡Get�address�of�attr�word�for�DCB 2‰ADD.L…#6,A1�Point�to�part�of�variable�to�put�word*#‰MOVE.W„IOSATW(A2),D5ˆGet�attr�word4‰MOVE.W„D5,(A1)ŽMove�attr�word�for�DCB�into�variable*.‰MOVE.L„MSGADDR(A7),A1‡Restore�message�address*3‰MOVE.B„D1,IOSDTP(A2)ˆPut�device�type�code�into�DCB*‰PAGE*D*‚STEP�8.‚Get�the�addresses�of�the�specific�device�table�in�PARMTBL,*‹ATTRTBL�AND�VALTBL.*.TBLPTRS‚IF.B�D1��#0�THEN.SˆBad�driver�info)‹MOVE.B�#BADDTYPE,(A1)‡Set�up�for�message‹BRA.S‚GOHOME�Return‰ENDI*=‰IF.B�D1��#1�THEN.SˆDevice�type�code�>�1�must�be�adjusted1‹SUB.Bƒ#1,D1�down�by�1�since�hard�and�floppy�disk+‰ENDIšuse�the�same�table.�Go�to�find�table.*3‰SUB.B…#1,D1�Adjust�type�code�for�selecting�1st�tbl*"*ˆGet�address�of�specific�PARMTBL.*;‰MOVE.L„PTPTRAD(A7),A1†A1�<--�addr�of�parmtbl�pntr�on�stack3‰MOVE.L„(A1),A2�Addr�of�1st�table�in�parm�table�set7‰BSR.S…CALCADDRŒGet�addr�of�table�for�target�type�in�D15‰MOVE.L„A2,(A1)�Put�address�of�table�into�parmptr�loc*"*ˆGet�address�of�specific�ATTRTBL.*;‰MOVE.L„ATPTRAD(A7),A1†A1�<--�addr�of�attrtbl�pntr�on�stack3‰MOVE.L„(A1),A2�Addr�of�1st�table�in�attr�table�set7‰BSR.S…CALCADDRŒGet�addr�of�table�for�target�type�in�D15‰MOVE.L„A2,(A1)�Put�address�of�table�into�attrptr�loc*!*ˆGet�address�of�specific�VALTBL.*:‰MOVE.L„VTPTRAD(A7),A1†A1�<--�addr�of�valtbl�pntr�on�stack4‰MOVE.L„(A1),A2�Addr�of�1st�table�in�value�table�set7‰BSR.S…CALCADDRŒGet�addr�of�table�for�target�type�in�D15‰MOVE.L„A2,(A1)�Put�address�of�table�into�avalptr�loc‰PAGE**‚STEP�9.‚Restore�the�stack.*GOHOMEƒMOVE.L„(A7),STKLEN(A7)‰ADD.L…#STKLEN,A7‰RTS‰PAGEF************************************************************************ˆError�Message�Handling*F************************************************************************ˆCall�Error�Message�Handler*EMH:%‰MOVE.L„A0,-(A7)ŒSave�my�A0�on�stack.,‰LEA‡EMPBLK(A4),A0‡Get�addr�of�EMPBLK�-->�A0(‰MOVE.L„D0,(A0)�Put�error�#�into�EMPBLK./‰MOVE.L„(A7),4(A0)ŠPut�mu�saved�A0�into�EMPBLK..‰MOVE.L„#2,D0�Error�message�handler�directive.&‰TRAP†#4’Invoke�Error�Message�Handler.‰MOVE.L„(A7)+,A0ŒRestore�A0‰RTS‰PAGEF***********************************************************************Ä**’SUBROUTINE�CALCADDRŸ**Ä*F***********************************************************************%*ˆCalculate�address�of�desired�table.**ˆGet�preserved�device�type.* CALCADDR:=‰MOVE.B„D1,D2…Get�adjusted�device�code�number�for�table�order0‰BEQ.S…DONE†If�want�1st�table�we�have�it�already*@CALC…MOVE.B„(A2)+,D3„Get�number�of�table�entries,�inc�table�addr1‰AND.L…#LOWBYTE,D3�Get�rid�of�garbage�in�register:‰MOVE.B„(A2)+,D4„Get�entry�length,�increment�table�address1‰AND.L…#LOWBYTE,D4�Get�rid�of�garbage�in�register1‰MULU.W„D3,D4‡Get�number�of�bytes�to�end�of�table8‰ADD.L…D4,A2‡Add�it�to�current�table�to�reach�next�table(‰SUB.B…#1,D2‡Decrement�#�of�tables�to�go9‰BNE.S…CALCˆIf�we�have�not�reached�desired�table,�do�more*DONE…RTS*F************************************************************************”SUBROUTINE�CLOSE*F***********************************************************************3*‹Close�the�device�assignment�to�the�target�device.*CLOSE:$‰LEA‡FHSPB(A4),A0ŠLoad�addr�of�FHSPB1‰MOVE.W„#FHCLOS,FHSCMD(A0)„Perform�close�command.‰MOVE.B„#0,FHSSTA(A0)‰Status‰TRAP†#3”Do�close.‰RTS‰ENDéé F***********************************************************************Ä* *œGETSTRCB **Ä**˜NO�INCLUDE�FILESœ**Ä*&*�GETSTRCB�(CB,�offset,�size,�value)“**Ä*:*ˆGETSTRCB�retrieves�a�parameter�from�the�CB�in�CONFIG's†**‘and�returns�it�to�CONFIG.š**Ä**ˆALGORITHM:²*0*’1.‚Get�the�address�of�CB,�the�offset�into�CB…*-*–where�the�desired�value�is�stored�and�its…* *–size.©*3*’2.‚Get�the�address�of�value�in�CONFIG's�storage‚*(*–and�put�the�parameter�value�into�it.Š*$*’3.‚Restore�the�stack�and�return.‘**Ä* *‚REGISTERS¹*>*„IN…:ƒA3�points�to�Pascal�runtime�library;�MUST�be�preserved*0*‹:ƒA5�points�to�Pascal�RMA;�MUST�be�preserved‹*-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ*:*‹:ƒA7�points�to�stack�with�parameters�and�return�address**�MUST�be�preserved¤**Ä*%*„DURING�:ƒA0�has�the�address�of�CB�*7*�A1�offset�into�CB�to�parameter,�then�the�address�of‚**’of�the�variable,�valueœ*7*�A4�points�to�memory�area�for�GETSTRCB;�preserve�for‚**�duration�of�GETSTRCB. *)*�D0�has�the�size�of�the�value�in�bytes�*!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*A*‚PARAMETERS�:�The�addresses�of�the�parameters�are�on�the�stack…*5*�such�that�the�first�parameter�is�put�on�the�stack„*5*�first�and�the�last�parameter�is�at�the�top�of�the„*(*�stack�just�under�the�return�address.‘**Ä*F***********************************************************************‰OPT‡A*GETSTRCB�IDNT†1,0‰PAGEF************************************************************************•X�D�E�F�Sƒ&ƒX�R�E�F�S*F***********************************************************************"‰XDEF†GETSTRCBŒProgram�entry�point**F***********************************************************************‰PAGEF************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|ÈBÑJÙ'*ˆ|----------|ˆ------------------------*ˆ|�value„|ˆaddress�of�value'*ˆ|----------|ˆ------------------------*ˆ|�size…|ˆsize�of�value'*ˆ|----------|ˆ------------------------*ˆ|�offsetƒ|ˆoffset�value'*ˆ|----------|ˆ------------------------!*ƒHIƒ|�CB‡|ˆaddress�of�CB�address*ˆ------------*E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰return�addressVALADDR‚DS.L†1‰address�of�valueSZVAL„DS.W†1‰size�of�value)OFFSTVAL�DS.L†1‰offset�to�parameter�in�CBCBADDRƒDS.L†1‰address�of�CBSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a3*‚assembly�routine�is�called�from�a�Pascal�program.*F************************************************************************—E�Q�U�A�T�E�S*F***********************************************************************BYTE…EQU‡1‰size�of�valueWORD…EQU‡2‰size�of�value‰PAGEF************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F*********************************************************************** ‰SECTIONƒ9*GETSTRCB�EQU‡**A*‚STEP�1.‚Get�address�of�CB�and�get�offset�into�CB�off�the�stack.**ˆGet�address�of�CB.*0‰MOVE.L„CBADDR(A7),A0‡A0�<--�addr�of�CB�on�stack**ˆPut�offset�into�A1.*-‰MOVE.L„OFFSTVAL(A7),A1…A1�<--�offset�into�CB*‰ADD.L…A1,A0�Get�to�target�parameter�in�CB**ˆPut�size�into�D0.*)‰MOVE.B„SZVAL(A7),D0ˆDO�<--�value�of�size‰PAGE*'*‚STEP�2.‚Get�address�of�value�address.*6‰MOVE.L„VALADDR(A7),A1†Get�addr�of�value�off�the�stack*0*ˆMove�CB�parameter�value�into�value's�locat ion.*5‰IF.B�#BYTE��D0�THEN.S…If�value�is�a�byte�in�size'‹ADD.L‚#3,A1�move�to�last�byte�of�value"‹MOVE.B�(A0),(A1)Œthen�move�a�byte ‰ELSE.S˜else5‹IF.B�#WORD��D0�THEN.Sƒif�value�is�a�word�in�size,�ADD.L‚#2,A1Žmove�to�low�order�word�of�value"�MOVE.W�(A0),(A1)Šthen�move�a�word ‹ELSE.S–else"�MOVE.L�(A0),(A1)Šmove�a�long�word‹ENDI‰ENDI‰PAGE**‚STEP�3.‚Restore�the�stack.*GOHOMEƒMOVE.L„(A7),STKLEN(A7)‰ADD.L…#STKLEN,A7‰RTS*‰ENDééééééF***********************************************************************Ä* *œHEX2ASCI **Ä**Ä*"*�HEX2ASCI�(valbuf,�value,�size)—**Ä**˜No�INCLUDE�FILESœ**Ä*?*ˆHEX2ASCI�converts�a�parameter�value�from�the�CB�in�CONFIG's�*=*ˆstorage�to�an�ASCII�hexadecimal�string�for�insertion�intoƒ**ˆparmscrn�for�display.§**Ä**ˆALGORITHM:²*2*’1.‚Get�the�address�of�valbuf�and�value�off�theƒ*/*–stack.‚Valbuf�has�blanks�in�it.‚Put�address�*/*–of�valbuf�in�A0�and�address�of�value�in�A1.ƒ*0*–Move�the�value�to�be�converted�off�the�stack‚*0*–and�into�D0.‚Put�"$"�into�the�first�location�**–of�valbuf.¤*3*’2.‚Get�the�size�of�the�value�off�the�stack.‚Put�**–the�size�in�D1.Ÿ*#*’3.‚If�the�size�of�the�value�is:’*!*–a.‚byte�then�D1�gets�2�in�it,�*&*šadd�4�to�A0�to�point�to�last�ASCIIˆ*+*šlocation�for�the�number�and�add�3�to�A1ƒ*,*što�point�to�location�to�start�converting‚* *šthe�value¡*'*–b.‚word�then�D1�gets�4,�A0�<--�A0+6Š**šA1�<--�A1+2Ÿ*-*–c.‚longword�then�D1�gets�32,�A0�<--�A0+10„*/*–D1�is�the�counter�for�the�number�of�nibblesƒ*,*–converted.‚A1�points�to�the�byte�of�addr…*/*–where�value�for�proper�size�begins.‚Rest�of‚*0*–register�will�have�zeroes�that�we�don't�want‚*/*–in�the�value�field�in�the�menu.‚However,�we‚*/*–do�want�leading�zeroes�corresponding�to�theƒ*0*–magnitude�of�the�number�to�be�in�the�display‚*.*–to�indicate�the�size�of�the�field.‚A0�willƒ*0*–point�to�location�in�valbuf�after�where�last‚*.*–character�will�be�inserted�since�they�will„*-*–be�inserted�from�low�order�to�high�order.…*4*’4.‚Get�hex�table�address�and�convert�the�nibbles.*/*–a.‚Move�pointer�to�next�location�in�valbuf.‚*0*–b.‚Right�shift�nibble�into�D3�as�offset�into�*-*šinto�hextable�and�move�char�from�hex�table**šinto�valbuf.ž*1*– d.‚Decrement�nibble�count;�prepare�next�nibble**–e.‚If�D0�<>�0,�go�to�a.–*$*’5.‚Restore�the�stack�and�return.‘**Ä* *‚REGISTERS¹*>*„IN…:ƒA3�points�to�Pascal�runtime�library;�MUST�be�preserved*0*‹:ƒA5�points�to�Pascal�RMA;�MUST�be�preserved‹*á6êCòGú-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ*:*‹:ƒA7�points�to�stack�with�parameters�and�return�address**�MUST�be�preserved¤**Ä*&*„DURING�:ƒA0�gets�address�of�valbufœ**�A1�gets�address�of�value�*,*�A2�gets�address�of�hex�translation�table�**�D0�gets�size�of�value *&*�D1�gets�count�of�number�of�nibbles“*!*�D2�gets�value�to�be�converted˜*!*�D3�gets�nibble�for�conversion˜*!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*A*‚PARAMETERS�:�The�addresses�of�the�parameters�are�on�the�stack…*5*�such�that�the�first�parameter�is�put�on�the�stack„*5*�first�and�the�last�parameter�is�at�the�top�of�the„*(*�stack�just�under�the�return�address.‘**Ä*F***********************************************************************‰OPT‡A*HEX2ASCI�IDNT†1,0‰PAGEF************************************************************************•X�D�E�F�Sƒ&ƒX�R�E�F�S*F***********************************************************************"‰XDEF†HEX2ASCIŒProgram�entry�point**F************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|'*ˆ|----------|ˆ-------------------------*ˆ|�size…|ˆsize�of�value;�enumerated�variable'*ˆ|----------|ˆ------------------------*ˆ|�value„|ˆaddress�of�value'*ˆ|----------|ˆ------------------------!*ƒHIƒ|�valbufƒ|ˆaddress�of�valbuf*ˆ------------*E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰return�addressSZVAL„DS.W†1‰size�of�value!VALUE„DS.L†1‰value�for�conversion BUFADDR‚DS.L†1‰address�of�valbufSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a3*‚assembly�routine�is�called�from�a�Pascal�program.*F************************************************************************—E�Q�U�A�T�E�S*F***********************************************************************BYTE…EQU‡1‰size�of�valueWORD…EQU‡2‰size�of�value*LOWNIBƒEQU‡$0000000F�value�size‰PAGEF************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F*********************************************************************** ‰SECTIONƒ9*4HEXTBLƒDC.B†'0123456789ABCDEF'‚Hex�translation�table*HEX2ASCI�EQU‡**8*‚STEP�1.‚Get�address�of�valbuf�and�value�off�the�stack.8*‹Get�value�size.‚Put�"$"�into�first�location�of�valbuf.**ˆGet�address�of�valbuf.*5‰MOVE.L„BUFADDR(A7),A0†A0�<--�addr�of�valbuf�on�stack*(*ˆPut�"$"�into�first�location�of�valbuf.*2‰MOVE.B„#$24,(A0)‹First�location�in�valbuf�<--�"$"*-*ˆGet�address�of�value�and�put�value�into�D2.*!‰MOVE.L„VALUE(A7),D2ˆD2�<--�value**‚STEP�2.‚Put�size�into�D0.*)‰MOVE.B„SZVAL(A7),D0ˆDO�<--�size�of�value‰PAGE*G*‚STEP�3.‚Initialize�bit�counting�register�and�adjust�address�registers**5‰IF.B�#BYTE��D0�THEN.S…If�value�is�a�byte�in�size'‹ADD.L‚#3,A1�move�to�last�byte�of�value3‹ADD.L‚#3,A0�move�to�1�beyond�location�for�2nd�char)‹MOVE.W�#2,D1�D1�will�count�for�2�nibbles ‰ELSE.S˜("$"�is�in�1st�location)5‹IF.B�#WORD��D0�THEN.SƒIf�value�is�a�word�in�size,�ADD.L‚#2,A1Žmove�to�low�order�word�of�value0�ADD.L‚#5,A0Žmove�1�beyond�location�for�4th�char)�MOVE.W�#4,D1ŽD1�will� count�for�4�nibbles ‹ELSE.S–else0�ADD.L‚#9,A0Žmove�1�beyond�location�for�8th�char)�MOVE.W�#8,D1ŽD1�will�count�for�8�nibbles‹ENDI‰ENDI‰PAGE*4*‚STEP�4.‚Install�appropriate�character�into�valbuf.*=*ˆShift�out�rightmost�nibble�into�D3.‚Use�it�as�an�index�into?*ˆthe�HEX�translation�table�above�and�transfer�the�proper�ASCII2*ˆcharacter�into�valubuf.‚Prepare�the�next�nibble.*3‰LEA‡HEXTBL(PC),A2ƒGet�address�of�translation�table*,CNVRT„MOVE.B„D2,D3‹Shift�byte�into�register.-‰AND.L…#LOWNIB,D3†Zero�out�all�but�low�nibble3‰MOVE.B„0(A2,D3),-(A0)‚Move�in�value�from�hex�table+‰LSR.L…#4,D2‹Get�next�nibble�ready�for�move*4*ˆSubtract�one�from�D1�since�1�nibble�was�converted.*‰SUB.W…#1,D1…Decrement�D1*A*ˆIf�all�nibbles�are�not�done�yet�go�back�to�beginning�of�STEP�4.*‰IF.W‚�THEN.S‰last�nibble? ‹BRA.S�CNVRT‰ENDI‰PAGE**‚STEP�5.‚Restore�the�stack.*GOHOMEƒMOVE.L„(A7),STKLEN(A7)‰ADD.L…#STKLEN,A7‰RTS*‰ENDééééééF***********************************************************************Ä* *œINITLIZE **Ä* *ˆInclude�files:†9995.&.IOE.EQ›**œ9995.&.RMA.EQ›**œ9995.&.TR1.EQ›**œ9995.&.TR1RTCD.EQ—**Ä*6*�INITLIZE�(regsav,�CB,�ptptr,�atptr,�vtptr,�hdrptr,ƒ*)*™bfmmnptr,�CBmnptr,�cfgmnptr,cpymnptr,†***™timehelp,�bfmhelp,�parmhelp,�attrhelp,…* *™cnfghelp,�copyhelp,�baudptr)�* :*ˆINITLIZE�is�an�assembly�language�routine�which�sets�up†*;*ˆpointers�to�tables,�stores�information�it�gathers�about…*;*ˆthe�logon�device�and�the�user�and�is�the�break�handler.…**Ä*;*ˆINITLIZE�claims�breaks�and�has�the�asynchronous�service…* *ˆroutine�for�handling�breaks. **Ä*8*ˆINITLIZE�saves�the�pertinent�registers�filled�by�SCTˆ*<*ˆwhen�CONFIG�is�called.‚This�information�gets�used�duringƒ**ˆprogram�execution.ª**Ä*3*ˆINITLIZE�retrieves�information�from�the�CCB�for�*9*ˆthe�logon�device.‚The�CCB�reveals�if�the�device�is�an†*>*ˆEXORmacs�terminal.‚It�also�has�the�device's�lines�per�page.**Ä*8*ˆINITLIZE�loads�the�addresses�of�the�pointers�used�inˆ*;*ˆbuilding�screens�and�displaying�menus�with�the�location…*(*ˆof�their�respective�tables�or�menus.˜**Ä*?*ˆINITLIZE�builds�the�access�permission�table�with�the�access�*;*ˆpermission�codes�for�the�various�devices.‚That�table�is„*2*ˆis�XREFed�for�use�in�another�assembly�routine.Ž**Ä*,*ˆINITLIZE�restores�the�stack�and�returns.”**Ä**ˆALGORITHM:²*3*’0.‚Get�the�address�of�the�assembly�data�segment‚*'*–by�using�RECEIVE�SEGMENT�ATTRIBUTES‹*0*–dire ctive.‚This�is�necessary�in�order�to�run�*.*–this�code�on�non-MMU�machines.‚Put�addressƒ***–into�ASMDATA�for�use�in�later�assemblyˆ* *–routines.¥*&*’1.‚Set�up�an�ASQ�and�claim�breaks.�*0*’2.‚Get�address�of�REGSAV�parameter�sent�from…*-*–CONFIG�and�put�register�info�from�the�RMA…*0*–into�REGSAV.‚A5�is�set�up�by�Pascal�to�point�* *–to�the�base�of�the�RMA�area.’*/*’3.‚Get�the�logon�user�number�via�a�TASKATTR†*,*–call.‚The�number�is�returned�in�the�high…*'*–order�word�of�A0.‚Put�it�in�REGSAV.Š*6 :DG#9+C30;<C9K:S4*’4.‚Get�the�address�of�FHSPB�in�data�area�and�the�*0*–name�of�the�logon�device�to�do�an�assignment‚*-*–of�the�device�prior�to�doing�a�configure/…**–status�request.Ÿ*/*’5.‚Get�the�address�of�CB�sent�over�and�do�a†*1*–configure�status�request�to�get�the�CCB�values**–for�the�logon�device.™*(*’6.‚Close�the�assignment�from�STEP�4.�*#*’7.‚Initialize�the�pointers�to�:’*%*œa.‚parmtable,�attrtable,�valtable†** (used�for�building�screens)‰*!*œb.‚header�pointers�and�stringŠ** (used�for�building�screens)‰**œc.‚miscellaneous�menus‘*!* (points�to�some�of�the�menus)‡**œd.‚help�screens˜*$* (points�to�various�help�screens)„**œe.‚baud�rate�table•** (used�for�building�screens)‰*!*’8.‚Restore�the�stack�pointer.”**Ä*<*‚NOTE�:�All�tables�dealing�with�devices�are�set�up�in�theŠ*=*‰following�order:‚disk�(hard�or�floppy),�terminal,�printer�*=*‰and�magnetic�tape.‚This�follows�the�order�of�their�device�**‰type�codes.°**Ä* *‚REGISTERS¹*>*„IN…:ƒA3�points�to�Pascal�runtime�library;�MUST�be�preserved*0*‹:ƒA5�points�to�Pascal�RMA;�MUST�be�preserved‹*-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ*:*‹:ƒA7�points�to�stack�with�parameters�and�return�address**�MUST�be�preserved¤**Ä*+*„DURING�:ƒA0�points�to�various�parm�blks—*!*�A1�points�to�tables�in�memory˜*.*�A2�points�to�address�of�pointers�in�memory‹*3*�A4�points�to�assembly�memory�area;�preserve�for†*6*�duration�of�INITLIZE;�address�of�data�area�will�beƒ*3*�put�in�Pascal�variable�for�storage�and�use�with†*!*�other�assembly�routines�later˜*,*�D0�has�directive�numbers�and�error�codes�*!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*A*‚PARAMETERS�:�The�addresses�of�the�parameters�are�on�the�stack…*8*�such�that�the�first�parameter�is�placed�on�the�stack�*5*�first�and�the�last�parameter�is�at�the�top�of�the„*(*�stack�just�under�the�return�address.‘**Ä*F**********************************************************************‰PAGE*‰OPT‡A*INITLIZE�IDNT†1,0*‰PAGE*F*********************************************************************** *•X�D�E�F�S*F***********************************************************************"‰XDEF†INITLIZEŒProgram�entry�point*F*********************************************************************** *•X�R�E�F�S*F***********************************************************************)‰XREF†PARMTBL�Parameter�field�names�table)‰XREF†ATTRTBL�Attribute�field�names�table)‰XREF†VALTBLŽAttribute�field�values�table'‰XREF†PARMHDR�Header�for�parameter�menu(‰XREF†ATTRHDR�Header�for�attributes�menu$‰XREF†NOMODSTRŒNOT�MODIFIABLE�string‰XREF†DNMMENU�Device�name�menu2‰XREF†BFMMENU�Boot�file/memory�menu�(for�Phase�II)‰XREF†CBTMENU�DCB/CCB�menu‰XREF†CFGMENU�Configure�menu‰XREF†CPYMENU�Print�menu‰XREF†CBTHELP�DCB/CCB�help�menu6‰XREF†BFMHELP�Boot�file/memory�help�menu(for�Phase�II)"‰XREF†PRMHELP�Parameters�help�menu"‰XREF†ATRHELP�Attributes�help�menu!‰XREF†CFGHELP�Configure�help�menu‰XREF†CPYHELP�Print�help�menu‰XREF†BAUDTBL�Baud�rate�table*>*ˆOffsets�to�parameter�blocks�in�assembly�data�area.‚Set�up�in *ˆCFIGDATA.*‰XREF†FHSPB…FHS�parameter�block‰XREF†IOSPB…IOS�parameter�block8‰XREF†TSKATRPB‚Task�attributes�directive�parameter�block2‰X REF†EMPBLK„Error�message�handler�parameter�block*‰XREF†ASQPB…ASQ�allocation�parameter�block)‰XREF†BRKSPB„Claim�breaks�parameter�block*7*ˆAccess�permission�table�set�up�in�data�area,�CFIGDATA*#‰XREF†APTBL…Access�permission�table*‰PAGEF************************************************************************�I�N�C�L�U�D�EƒF�I�L�E�S*F************************************************************************ˆINCLUDEƒ9995.&.IOE.EQ*ˆINCLUDEƒ9995.&.RMA.EQ*ˆINCLUDEƒ9995.&.TR1.EQ*ˆINCLUDEƒ9995.&.TR1RTCD.EQ*ˆNOLIST‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.RMA.EQ‰INCLUDEƒ9995.&.TR1.EQ‰INCLUDEƒ9995.&.TR1RTCD.EQ‰LIST*F************************************************************************™E�Q�U�A�T�E�S*F************************************************************************DPADNOBUF�EQU‡$2000…option:�segment->A0;no�parmblk�for�returning�info>DATSEGNM�EQU‡'SEG0'„Name�of�data�segment�for�assembly�routines*LOGONLUN�EQU‡1‰Logon�deviceTRGTLUN‚EQU‡2‰Target�deviceUSERZERO�EQU‡0‰0*BLANK2ƒEQU‡'‚'†2�blanksBLANK4ƒEQU‡'„'„4�blanksCR‡EQU‡$0D‡carriage�returnLF‡EQU‡$0A‡line�feed**‰PAGEF************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|'*ˆ|----------|ˆ------------------------0*ˆ|�baudptr‚|ˆaddress�of�baud�rate�table�pointer'*ˆ|----------|ˆ------------------------7*ˆ|�logondev�|ˆaddress�of�record�on�user's�logon�device'*ˆ|----------|ˆ------------------------*ˆ|�copyhelp�|*ˆ|----------|*ˆ|�cnfghelp�|*ˆ|----------|*ˆ|�attrhelp�|/*ˆ|----------|ˆaddress�of�pointers�to�help�menu*ˆ|�parmhelp�|*ˆ|----------| *ˆ|�bfmhelp‚|*ˆ|----------| *ˆ|�CBthelp‚|(*ˆ|----------|ˆ-------------------------*ˆ|�cpymnptr�|*ˆ|----------|*ˆ|�cfgmnptr�|*ˆ|----------|:*ˆ|�CBmnptr‚|ˆaddress�of�pointers�to�miscellaneous�screens*ˆ|----------| *ˆ|�bmmnptr‚|*ˆ|----------| *ˆ|�dnmnptr‚|**ˆ|----------|ˆ---------------------------7*ˆ|�nomodptr�|ˆaddress�of�NOT�MODIFIABLE�string�pointer**ˆ|----------|ˆ--------------------------- *ˆ|�attrhdr‚|>*ˆ|----------|ˆaddress�of�pointers�to�parm/attr�screen�headers *ˆ|�parmhdr‚|**ˆ|----------|ˆ---------------------------8*ˆ|�asmmemƒ|ˆaddress�of�address�of�assembly�data�section**ˆ|----------|ˆ--------------------------- *ˆ|�vtptr„|*ˆ|----------|<*ˆ|�atptr„|ˆaddress�of�pointers�to�tables�for�building�menus*ˆ|----------| *ˆ|�ptptr„|**ˆ|----------|ˆ---------------------------*ˆ|�CB‡|ˆaddress�of�CB**ˆ|----------|ˆ---------------------------$*ƒHIƒ|�regsavƒ|ˆaddress�of�registers**ˆ------------ˆ___________________________*&*ˆSee�XREF�above�for�call�to�INITLIZE.*E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰return�address-BAUDADƒDS.L†1‰baud�rate�table�pointer�address&LGDEVAD‚DS.L†1‰logondev�record�address.CPHPTRAD�DS.L†1‰copy�help�menu�pointer�address3CFHPTRAD�DS.L†1‰configure�help�menu�pointer�address4ATHPTRAD�DS.L†1‰attributes�help�menu�pointer�address4PRHPTRAD�DS.L†1‰parameters�help�menu�pointer�address:BFHPTRAD�DS.L†1‰boot�file/memory�help�menu�pointer�address1CBHPTRAD�DS.L†1‰CB�type�help�menu�pointer�address)CPYPTRAD�DS.L†1‰copy�menu�pointer�address.CFGPTRAD�DS.L†1‰configure�menu�pointer�address+CBPTRAD‚DS.L†1‰CB�type�menu�pointer�address5BFMPTRAD�DS.L†1‰boot�file/memory�menu�pointer�address0DNMPTRAD�DS.L†1‰device�name�menu�pointer�address5MODPTRAD�DS.L†1‰MOT�MODIFIABLE�string�pointer�address5AHPTRAD‚DS.L†1‰attributes�menu�header�pointer�address5PHPTRAD‚DS.L†1‰parameters�menu�header�pointer�address8ASMMEMAD�DS.L†1‰address�of�assembly�data�section�address6VALPTRAD�DS.L†1‰attributes�value�table�pointer�address5ATRPTRAD�DS.L†1‰at tributes�name�table�pointer�address5PRMPTRAD�DS.L†1‰parameters�name�table�pointer�addressCBADDRƒDS.L†1‰CB�addressREGSAVAD�DS.L†1‰regsav�addressSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a3*‚assembly�routine�is�called�from�a�Pascal�program.*‰PAGE F************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F*********************************************************************** ‰SECTIONƒ9*,*ˆReceive�segments�attribute�parameter�block**GTADRPB‚DC.L†0,0‘Requesting�task,�session.-‰DC.W†PADNOBUF,0ŠDirective�option,�attributes!‰DC.L†DATSEGNMŒData�segment�name.2‰DC.L†0,0,0�No�logical�address�or�buffer�supplied.*B*ˆClose�target�device�assignment�parameter�block�in�case�of�break.*CLSPB„DC.W†FHCLOSŽClose2‰DC.W†FOPOVRT�Sets�bit�3�to�keep�CCB�as�configured‰DC.B†0“Status‰DC.B†TRGTLUN�Target�device‰DC.L†0,0,0,0,0,0,0‰DC.W†0*,*ˆOutput�for�the�screen�when�a�BREAK�occurs.*+BRKST„DC.B†CR,LF�Carriage�return,�line�feed'‰DC.B†'---------->‚BREAK'�Break�message3‰DC.B†CR,LF,CR,LFŠMore�carriage�returns,�line�feedsBRKENDƒEQU‡*-1‰DS.W†0*INITLIZE�EQU‡*‰Entry�point*&*�STEP�0.‚Get�address�of�data�segment.*;‰LEA‡GTADRPB(PC),A0†Parm�blk�for�directive�in�GTADRPB�below6‰MOVE.L„#RCVSA,D0‹Receive�segments�attribute�directive1‰TRAP†#1’Get�address�of�'SEG0'-really�for�non-MMU(‰BNE.L…STOPCNFGŒStop�CONFIG,�can't�go�on*(*ˆAddress�of�assembly�data�area�received*(‰MOVE.L„A0,A4�Asm�mem�area�address�->�A4:‰MOVE.L„ASMMEMAD(A7),A2…A2�<--�asmmem's�location�in�CONFIG8‰MOVE.L„A0,(A2)�Put�addr�of�data�area�into�Pascal�memory‰PAGE**�STEP�1.‚Claim�breaks.**ˆAllocate�ASQ*#‰MOVE.L„#GTASQ,D0‹Get�ASQ�directive*‰LEA‡ASQPB(A4),A0ˆLoad�address�of�parm�blk!‰LEA‡AASR(PC),A1‰Get�addr�of�AASR2‰MOVE.L„A1,14(A0)‹Put�addr�of�AASR�into�addr�field‰TRAP†#1’Get�ASQ‰BNE.L…STOPCNFGŒError**ˆClaim�breaks.*1‰LEA‡BRKSPB(A4),A0‡IOS�parm�blk�for�break�service‰TRAP†#2’Claim�breaks‰BNE.L…STOPCNFGŒError‰PAGE*E*�STEP�2.ƒGet�address�of�REGSAV�and�fill�REGSAV�with�register�values.*>‰MOVE.L„REGSAVAD(A7),A2…Address�of�the�REGSAV�in�CONFIG�-->�A2.‰MOVE.L„LTN(A5),(A2)+‡This�data�structure�will8‰MOVE.L„SN(A5),(A2)+ˆstore�the�register�values�from�SCT.9‰MOVE.L„DVOL(A5),(A2)+†A5�points�to�the�base�of�RMA�which<‰MOVE.W„DUN(A5),(A2)+‡which�gets�the�initial�register�values=‰MOVE.L„DCAT(A5),(A2)+†put�in�it�by�a�Pascal�runtime�routine.<‰MOVE.L„DCAT+4(A5),(A2)+„Xfer�these�values�into�REGSAV�area.‰MOVE.W„CLL(A5),(A2)+‰MOVE.L„LUIU(A5),(A2)+6‰MOVE.L„DTID(A5),(A2)+†The�offsets�are�from�RMAEQU.EQ.‰PAGE*&*‚STEP�3.‚Get�the�logon�user's�number.*:‰MOVE.L„#TSKATTR,D0‰The�logon�user�number�is�obtained�from<‰LEA‡TSKATRPB(A4),A0…TASKATTR�directive.�A4�has�addr�of�data+‰TRAP†#1’segment�with�pb,�use�offset�to�it.5‰BNE.L…STOPCNFGŒGo�to�Error�Message�Handler�on�error.*=*ˆPut�user�logon�number�into�usable�form�and�store�in�regsav.*9MOVENUM‚MOVE.L„A0,D0�#�is�returned�in�the�high�order�word%‰LSR.L…#8,D0�of�A0.�Put�it�in�REGSAV. ‰LSR.L…#8,D0‰MOVE.W„D0,(A2)‰PAGE*I*‚STEP�4.‚Assign�the�user's�device�prior�to�doing�a�configure/status�req.*A*ˆInitialize�FHS�parameter�block�at�offset�FHSPB�in�data�segment.*ˆA4�points�to�data�area.*7‰LEA‡FHSPB(A4),A0ŠLoad�addr�of�FHS�parm�blk�from�offset5‰MOVE.W„#FHASGN,FHSCMD(A0)„Perform�device�assignment.=‰MOVE.W„#FOPPRPW,FHSOPT(A0)ƒPublic�r/w,�good�for�busy�device.9‰MOVE.B„#LOGONLUN,FHSLUN(A0)‚LUN�for�user's�logon�device.B‰MOVE.L„DTID(A5),FHSVOL(A0)ƒName�of�the�user's�logon�dev�from�RMA.2‰MOVE.W„#USERZERO,FHSUSN(A0)‚Zero�-->�user�number.2‰MOVE.L„#BLANK4,FHSCLG(A0)„Blank�out�catalog�name.<‰MOVE.L„#BLANK4,FHSCLG+4(A0)‚Blank�out�rest�of�catalog�name./‰MOVE.L„#BLANK4,FHSFIL(A0)„Blank�out�file�name.9‰MOVE.L„#BLANK4,FHSFIL+4(A0)‚Blank�out�rest�of�file�name./‰MOVE.W„#BLANK2,FHSEXT(A0)„Blank�out�extension.‰TRAP†#3”Do�assignment.6 ‰BNE.L…STOPCNFGŽGo�to�Error�Message�Handler�for�error.‰PAGE*D*‚STEP�5.‚Retrieve�the�CCB�values�for�the�logon�device.‚Put�in�CB�in *‹CONFIG.*C*ˆInitialize�parameter�block�IOSPB�at�offset�IOSPB�in�data�segment.*8‰LEA‡IOSPB(A4),A0ˆLoad�addr�of�IOS�parmblk�for�trap�call4‰MOVE.W„#IOSTAT,IOSFCT(A0)‚Configure�status�request.*‰MOVE.W„#0,IOSOPT(A0)‡Fill�options�with�0.6‰MOVE.B„#LOGONLUN,IOSLUN(A0)�Get�info�for�logon�device<‰MOVE.L„CBADDR(A7),IOSDBP(A0)�CONFIG'S�CB�addr�->�CSB�in�IOS,‰TRAP†#2’During�the�trap�call�the�CCB�values2‰BNE.L…STOPCNFGŒwill�be�written�to�the�CSB�address *¦which�is�start�of�CB�in�CONFIG0‰MOVE.L„CBADDR(A7),A0‡Get�addr�of�CB�just�filled>‰MOVE.L„LGDEVAD(A7),A1†Get�addr�of�logondev�variable�in�Pascal;‰MOVE.B„IOSTCD(A0),(A1)+„Move�the�terminal�code,�the�device:‰MOVE.B„IOSDTP(A0),(A1)+„type�code�and�the�number�of�lines0‰MOVE.L„IOSRSZ(A0),(A1)+„per�page�into�logondev.‰PAGE***‚STEP�6.‚Close�assignment�to�logon�device*7‰LEA‡FHSPB(A4),A0ŠLoad�addr�of�FHS�parm�blk�from�offset1‰MOVE.W„#FHCLOS,FHSCMD(A0)„Perform�close�command.‰TRAP†#3”Do�close.6‰BNE.L…STOPCNFGŽGo�to�Error�Message�Handler�for�error.‰PAGE*K*‚STEP�7a.‚Initialize�pointers�to�tables�which�build�parmscreen/attrscreen.**ˆDo�parmtbl�for�parmscreen.*<‰MOVE.L„PRMPTRAD(A7),A2…A2�<--�addr�of�parmtbl�pntr�on�stack5‰LEA‡PARMTBL(PC),A1†A1�<--�address�of�parameter�table4‰MOVE.L„A1,(A2)�Pntr�to�parmtbl�<--�addr�of�parmtabl**ˆDo�attrtbl�for�attrscreen.*<‰MOVE.L„ATRPTRAD(A7),A2…A2�<--�addr�of�attrtbl�pntr�on�stack5‰LEA‡ATTRTBL(PC),A1†A1�<--�address�of�attribute�table4‰MOVE.L„A1,(A2)�Pntr�to�attrtbl�<--�addr�of�attrtabl**ˆDo�valtbl�for�attrscreen.*<‰MOVE.L„VALPTRAD(A7),A2…A2�<--�addr�of�valtabl�pntr�on�stack6‰LEA‡VALTBL(PC),A1‡A1�<--�address�of�attr�values�table2‰MOVE.L„A1,(A2)�Pntr�to�valtbl�<--�addr�of�valtabl‰PAGE*C*‚STEP�7b.‚Initialize�pointer�to�headers�and�NOT�MODIFIABLE�string.*"*ˆDo�pointer�to�parmscreen�header.*?‰MOVE.L„PHPTRAD(A7),A2†A2�<--�addr�of�parm�header�pntr�on�stack,‰LEA‡PARMHDR(PC),A1†A1�<--�address�of�header1‰MOVE.L„A1,(A2)�Pntr�to�header�<--�addr�of�header*"*ˆDo�pointer�to�attrscreen�header.*?‰MOVE.L„AHPTRAD(A7),A2†A2�<--�addr�of�attr�header�pntr�on�stack,‰LEA‡ATTRHDR(PC),A1†A1�<--�address�of�header1‰MOVE.L„A1,(A2)�Pntr�to�header�<--�addr�of�header*&*ˆDo�pointer�to�NOT�MODIFIABLE�string.*:‰MOVE.L„MODPTRAD(A7),A2…A2�<--�addr�of�string�ptr�on�stack-‰LEA‡NOMODSTR(PC),A1…A1�<--�address�of�string1‰MOVE.L„A1,(A2)�Pntr�to�string�<--�addr�of�string‰PAGE*:*‚STEP�7c.‚Initialize�pointers�to�the�miscellaneous�menus.*!*ˆDo�pointer�to�device�name�menu.*?‰MOVE.L„DNMPTRAD(A7),A2…A2�<--�addr�of�device�name�menu�on�stck6‰LEA‡DNMMENU(PC),A1†A1�<--�address�of�device�name�menu8‰MOVE.L„A1,(A2)�Pntr�to�device�name�menu<--�addr�of�menu*5*ˆDo�pointer�to�boot�file/memory�menu�(Fof�Phase�II).*=‰MOVE.L„BFMPTRAD(A7),A2…A2�<--�addr�of�bt�fl/mem�menu�on�stck;‰LEA‡BFMMENU(PC),A1†A1�<--�address�of�boot�file/memory�menu4‰MOVE.L„A1,(A2)�Pntr�to�btf/mem�menu<--�addr�of�menu**ˆDo�pointer�to�CB�menu.*5‰MOVE.L„CBPTRAD(A7),A2†A2�<--�addr�of�CB�menu�on�stck2‰LEA‡CBTMENU(PC),A1†A1�<--�address�of�CB�type�menu4‰MOVE.L„A1,(A2)�Pntr�to�CB�type�menu<--�addr�of�menu**ˆDo�pointer�to�configure�menu.*=‰MOVE.L„CFGPTRAD(A7),A2…A2�<--�addr�of�configure�menu�on�stck4‰LEA‡CFGMENU(PC),A1†A1�<--�address�of�configure�menu6‰MOVE.L„A1,(A2)�Pntr�to�configure�menu<--�addr�of�menu**ˆDo�pointer�to�print�menu.*9‰MOVE.L„CPYPTRAD(A7),A2…A2�<--�addr�of�print�menu�on�stck0‰LEA‡CPYMENU(PC),A1†A1�<--�address�of�print�menu2‰MOVE.L„A1,(A2)�Pntr�to�print�menu<--�addr�of�menu‰PAGE*3*‚STEP�7d.‚Initialize�pointers�to�the�help�screens.**ˆDo�pointer�to�CB�help�menu.*@‰MOVE.L„CBHPTRAD(A7),A2…A2�<--�addr�of�DCB/CCB�help�ptr�on�stack4‰LEA‡CBTHELP(PC),A1†A1�<--�addr�of�DCB/CCB�help�menu4‰MOVE.L„A1,(A2)�Pntr�to�DCB/CCB�help<--�addr�of�menu*:*ˆDo�pointer�to�boot�fil e/memory�help�menu�(for�Phase�II).*?‰MOVE.L„BFHPTRAD(A7),A2…A2�<--�addr�of�bt�fl/mem�help�ptr�on�st9‰LEA‡BFMHELP(PC),A1†A1�<--�addr�of�bt�fl/memory�help�menu4‰MOVE.L„A1,(A2)�Pntr�to�btf/mem�menu<--�addr�of�menu*$*ˆDo�pointer�to�parameter�help�menu.*=‰MOVE.L„PRHPTRAD(A7),A2…A2�<--�addr�of�parm�help�ptr�on�stack1‰LEA‡PRMHELP(PC),A1†A1�<--�addr�of�parm�help�menu6‰MOVE.L„A1,(A2)�Pntr�to�parm�help�menu<--�addr�of�menu*%*ˆDo�pointer�to�attributes�help�menu.*=‰MOVE.L„ATHPTRAD(A7),A2…A2�<--�addr�of�attr�help�ptr�on�stack1‰LEA‡ATRHELP(PC),A1†A1�<--�addr�of�attr�help�menu6‰MOVE.L„A1,(A2)�Pntr�to�attr�help�menu<--�addr�of�menu*$*ˆDo�pointer�to�configure�help�menu.*=‰MOVE.L„CFHPTRAD(A7),A2…A2�<--�addr�of�cnfg�help�ptr�on�stack1‰LEA‡CFGHELP(PC),A1†A1�<--�addr�of�cnfg�help�menu6‰MOVE.L„A1,(A2)�Pntr�to�cnfg�help�menu<--�addr�of�menu**ˆDo�pointer�to�copy�help�menu.*=‰MOVE.L„CPHPTRAD(A7),A2…A2�<--�addr�of�copy�help�ptr�on�stack1‰LEA‡CPYHELP(PC),A1†A1�<--�addr�of�copy�help�menu6‰MOVE.L„A1,(A2)�Pntr�to�copy�help�menu<--�addr�of�menu* *ˆDo�pointer�to�baud�rate�table.*8‰MOVE.L„BAUDAD(A7),A2‡A2�<--�addr�of�baud�rate�table�ptr2‰LEA‡BAUDTBL(PC),A1†A1�<--�addr�of�baud�rate�table6‰MOVE.L„A1,(A2)�Pntr�to�baud�rate�tbl<--�addr�of�table**ˆGo�back�to�caller.*>‰MOVE.L„(A7),STKLEN(A7)…Write�return�address�where�stk�ptr�was9‰ADD.L…#STKLEN,A7ŠRestore�stack�pointer�to�previous�place ‰RTS›Return‰PAGEF***********************************************************************B*ˆSUBROUTINE�STOP�cleans�up�before�aborting�CONFIG.‚It�calls�Error?*ˆMessage�Handler,�restores�the�stack,�and�terminates�the�task.7*ˆIn�case�a�temporary�configuration�was�done,�the�closeE*ˆuses�the�bit�which�will�keep�the�current�configuration.‚If�none�wasC*ˆdone�or�it�was�a�default�configuration,�the�current�configuration@*ˆwhich�is�the�same�as�the�default�configuration�anyway,�will�be+*ˆkept�and�the�close�will�appear�as�normal.*F***********************************************************************(STOPCNFG�BSR.S…EMH‘Error�message�handler**ˆBRA.S…FINISHŽSkip�BREAK�msg,�not�a�break**ŠGet�address�of�data�segment.*A4*E*ˆClose�the�assignment�to�the�target�with�the�bit�to�keep�the�current*ˆconfiguration�set.*9‰LEA‡CLSPB(PC),A0ˆClose�assignment,�LUN=2�should�be�there‰TRAP†#3’Close�it**ˆPut�out�BREAK�message.*#‰LEA‡IOSPB(A4),A0ˆAddress�of�IOS�pb ‰MOVE.W„#IOWRIT,IOSFCT(A0)‚Write‰MOVE.W„#IOPIMG,IOSOPT(A0)‚Wait‰MOVE.B„#0,IOSSTA(A0)‡Status(‰MOVE.B„#LDFLUN,IOSLUN(A0)‚Output�device(‰LEA‡BRKST(PC),A1ˆStart�of�break�message4‰MOVE.L„A1,IOSSAD(A0)‡Start�of�break�message�into�PB'‰LEA‡BRKEND(PC),A1‡End�of�break�message2‰MOVE.L„A1,IOSEAD(A0)‡End�of�break�message�INTO�PB‰TRAP†#2’Print�break�message 'FINISHƒMOVE.L„#TERM,D0ŒTerminate�CONFIG‰TRAP†#1’Do�it‰PAGEF***********************************************************************Ä**’S�U�B�R�O�U�T�I�N�EŸ**’EMH�-�Error�Message�Handler—**Ä*F***********************************************************************<*ˆEMPBLK�was�appropriately�initialized�in�CFIGDATA�to�output%*ˆerror�messages�to�the�logon�device.EMH:%‰MOVE.L„A0,-(A7)ŒSave�my�A0�on�stack.&‰LEA‡EMPBLK(A4),A0‡Where�EMPBLK�lives.(‰MOVE.L„D0,(A0)�Put�error�#�into�EMPBLK./‰MOVE.L„(A7),4(A0)ŠPut�my�saved�A0�into�EMPBLK..‰MOVE.L„#2,D0�Error�message�handler�directive.&‰TRAP†#4’Invoke�Error�Message�Handler.‰MOVE.L„(A7)+,A0ŒRestore�A0‰RTS‰END é éééF***********************************************************************Ä* *œMODMEMCB **Ä* *ˆInclude�files:†9995.&.IOE.EQ›**œ9995.&.RMA.EQ›**œ9995.&.NIO.EQ›**Ä*9*ˆMODMEMCB‚(asmmem,�dname,�CB,�msg,�trgteqlg,�duration)†*?*ˆis�an�assembly�routine�which�uses�the�CB�in�CONFIG's�storage*8*ˆas�the�parameter�values�for�reconfiguring�the�targetˆ*>*ˆdevice's�CCB�or�the�DCB.‚MODMEMCB�sets�up�the�IOCB�and�does**ˆthe�call�for�configuration.¡**Ä*=*ˆFirst,�MODMEMCB�checks�if�the�target�device�and�the�logonƒ*6*ˆdevice�are�the�same.‚If�they�are�then�public�read/‰*?*ˆpublic�write�is�stored�in�the�change�access�permission�parm�*>*ˆblock.‚Otherwise,�the�device�type�sent�over�as�a�parameter�*<*ˆis�retrieved�from�the�stack�and�is�used�as�an�index�into„*?*ˆthe�access�permission�tables�which�were�previously�set�up�in*;*ˆthe�assembly�data�area�to�obtain�the�appropriate�access…*>*ˆpermission�for�the�target�device.‚This�permission�is�stored*3*ˆin�the�change�access�permission�parmeter�block.�**Ä*?*ˆThe�reason�for�doing�the�above�is�that�in�a�previous�routine*<*ˆthe�target�device�was�given�a�public�write�assignment�to„*<*ˆdetermine�if�it�really�existed�and�to�enable�a�configure„*>*ˆstatus�request�to�be�performed�so�that�the�device's�values‚*>*ˆcould�be�used�to�build�screens�for�the�user�interface.‚The�*?*ˆpermission�was�retained�so�that�no�one�else�could�reconfig-�*>*ˆthe�terminal�meanwhile.‚Now�the�appropriate�access�will�be�*>*ˆassigned�with�a�change�access�permission�call�by�MODMEMCB.‚**Ä*?*ˆIf�the�change�access�permission�is�successful,�MODMEMCB�will*>*ˆperform�the�selected�configuration.‚MODMEMCB�determines�if�*:*ˆthe�configuration�command�is�a�configure�defaults�or�a†*=*ˆconfigure�command�from�a�parameter�sent�over�from�CONFIG.ƒ*<*ˆsent�over�from�CONFIG.‚It�sets�up�the�appropriate�valuesƒ*=*ˆin�the�parameter�block�for�performing�one�of�these�calls.ƒ**Ä*?*ˆIf�the�logon�device�is�not�the�target�device,�the�assignment**ˆis�closed.²**Ä*[+d,lKt=|?„:ŒB”"*ˆThe�stack�pointer�is�restored.ž**Ä*>*ˆ1.‚Get�the�address�of�assembly�memory�and�CB�off�the�stack.*>*ˆ2.‚Get�the�name�of�the�target�device�and�whether�it�is�the�*:*ˆas�the�logon�device.‚If�it�is�the�same�then�put�public…*>*ˆread/write�into�D0.‚Otherwise�get�the�address�of�the�access*>*ˆpermission�code�table�and�the�get�the�device�type�code�out‚*>*ˆof�CB.‚Use�the�device�type�code�to�step�through�the�access�*;*ˆpermission�table�until�the�correct�access�permission�is…**ˆfound�and�placed�in�D0.¥*8*ˆ3.‚Change�access�permission.‚If�D0�<>�0�then�get�the†*=*ˆaddress�of�msg�and�put�out�Error�Message�Handler�message.ƒ*%*ˆPut�msg�<--�stopscrn�and�go�back.›*;*ˆ4.‚Get�prmanent�off�the�stack.‚If�prmanent�is�true�thenƒ*=*ˆset�up�for�a�configure�defaults�command.‚Otherwise�set�up‚*<*ˆfor�a�configure�command.‚Perform�the�call.‚If�D0<>0�then‚*?*ˆcall�Error�Message�Handler.�Change�access�permission�back�to***ˆpublic,�restore�the�stack�and�go�back.–**Ä* *„REGISTERS·*5*„IN…:ƒA3�points�to�Pascal �runtime�library;�MUST�be‰*8*�or�when�you�get�back�to�Pascal�you�will�crash�at�the�*#*�first�call�to�a�library�routine–*0*‹:ƒA5�points�to�Pascal�RMA;�MUST�be�preserved‹*-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ*3*‹:ƒA7�points�to�stack�with�parameters�and�returnˆ**�address;�MUST�be�preserved›*3*�It�is�not�necessary�to�save�any�other�registers†**Ä*+*„DURING�:ƒA0�points�to�various�parm�blks—**�A1�has�CB�address¤*6*�A2�has�address�of�access�permission�table,�addressƒ*)*�of�target�device�name,�address�of�msg�*7*�A4�points�to�memory�area�for�MODMEMCB;�preserve�for‚*6*�duration�of�MODMEMCB;�address�of�data�area�will�beƒ*3*�put�in�Pascal�variable�for�storage�and�use�with†*!*�other�assembly�routines�later˜*!*�D0�has�access�permission�code˜**�D1�has�device�type�codež**�D2�has�value�of�same¡*6*�D3�has�value�of�prmanent;�i.e.,�tells�if�change�isƒ*+*�configure�defaults�or�configure�commandŽ* *�D5�preserves�parameters�mask™*!*�D6�has�the�target�device�name˜*#*�D7�has�copy�of�device�type�code–*!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*A*‚PARAMETERS�:�The�addresses�of�the�parameters�are�on�the�stack…*8*�such�that�the�first�parameter�is�placed�on�the�stack�*5*�first�and�the�last�parameter�is�at�the�top�of�the„*(*�stack�just�under�the�return�address.‘**Ä*F**********************************************************************‰PAGE*‰OPT‡A*MODMEMCB�IDNT†1,0*‰PAGE*F*********************************************************************** *•X�D�E�F�S*F***********************************************************************"‰XDEF†MODMEMCBŒProgram�entry�point*F*********************************************************************** *•X�R�E�F�S*F************************************************************************>*ˆOffsets�to�parameter�blocks�in�assembly�data�area.‚Set�up�in *ˆCFIGDATA.*‰XREF†FHSPB…FHS�parameter�block‰XREF†IOSPB…IOS�parameter�block2‰XREF†EMPBLK„Error�message�handler�parameter�block*7*ˆAccess�permission�table�set�up�in�data�area,�CFIGDATA*#‰XREF†APTBL…Access�permission�table*‰PAGEF************************************************************************�I�N�C�L�U�D�EƒF�I�L�E�S*F************************************************************************ˆINCLUDEƒ9995.&.IOE.EQ*ˆINCLUDEƒ9995.&.NIO.EQ*ˆINCLUDEƒ9995.&.RMA.EQ*ˆNOLIST‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.NIO.EQ‰INCLUDEƒ9995.&.RMA.EQ‰LIST*F************************************************************************™E�Q�U�A�T�E�S*F************************************************************************/TRGTLUN‚EQU‡2‰Target�device�for�reconfiguration&PRINTER‚EQU‡4‰Printer�device�type�code/MAGTAPE‚EQU‡5‰DCB�device�type�code�for�mag�tapeUSERZERO�EQU‡0‰User�0.DEVBUSY‚EQU‡1‰Enumerated�value�for�device�busy,STOPSCRN�EQU‡6‰Enumerated�value�for�stopscrn6PRMANENT�EQU‡0‰Enumerated�value�for�configure�defaultsAOFFRWTO‚EQU‡$FFF3…Used�to�AND�out�read/write�timeout�in�parm�mask@OFFHBYTE�EQU‡$0FFF…Used�to�AND�out�bits�12-15�in�attributes�mask9SAME…EQU‡1‰Boolean�value�if�target�=�logon�device;�1=TRUEBLANK2ƒEQU‡$2020…2�blanksBLANK4ƒEQU‡$20202020�4�blanks*‰PAGEF************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|'*ˆ|----------|ˆ------------------------;*ˆ|�duration�|ˆenumerated�value;�permanent/temporary�change'*ˆ|----------|ˆ------------------------0*ˆ|�trgteqlg�|ˆboolean�value;�is�logon�=�target?'*ˆ|----------|ˆ------------------------5*ˆ|�msg†|ˆaddress�of�enumerated�variable�for�messages'*ˆ|----------|ˆ------------------------8*ˆ|�CB‡|ˆaddress�of�block�with�parameter�values�for�cnfg(*ˆ|----------|ˆ-------------------------&*ˆ|�dname„|ˆtarget�device�name�address(*ˆ|----------|ˆ-------------------------0*ƒHIƒ| �asmmemƒ|ˆaddress�of�assembly�data�section**ˆ------------ˆ___________________________*E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰return�address6DURATION�DS.W†1‰value�for�change,�cnfg�deflt/cnfg�cmmd0TRGTEQLG�DS.W†1‰value�of�boolean,�target�?�logonMSGAD„DS.L†1‰address�of�messageCBADDRƒDS.L†1‰CB�address)DNMADDR‚DS.L†1‰target�device�name�address-ASMMEMAD�DS.L†1‰assembly�data�section�addressSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a3*‚assembly�routine�is�called�from�a�Pascal�program.*‰PAGE F************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F***********************************************************************,‰SECTIONƒ9“ASM�routines�must�be�in�Section�9*MODMEMCB�EQU‡**B*�STEP�1.‚Get�the�address�of�the�assembly�data�area�and�the�CB�for*ˆreconfiguration.*1‰MOVE.L„ASMMEMAD(A7),A4…A4<--�address�of�data�seg=‰MOVE.L„CBADDR(A7),A1‡A1�<--�addr�of�CB�with�parameter�values*F*�STEP�2.‚Get�the�proper�access�permission�code�for�the�target�device.**ˆGet�the�device�name.*.‰MOVE.L„DNMADDR(A7),A2ˆAddress�of�device�name. ‰MOVE.L„(A2),D6�Get�device�name.*)*ˆPut�the�access�permission�code�into�D0.*?*ˆIf�trgteqlg�=�same�(true)�then�public�read,�public�write�goes8*ˆinto�the�parameter�block.‚Otherwise�get�the�address�ofB*ˆCB�and�pull�out�the�device�type�code�from�it.‚Use�the�code�as�an=*ˆindex�into�the�access�permission�table�and�store�the�access&*ˆpermission�into�the�parameter�block.*@*ˆGet�the�boolean,�same,�off�stack�to�determine�is�the�logon�andC*ˆthe�target�devices�are�the�same.‚1�is�true,�or�they�are�the�same.*5‰MOVE.B„TRGTEQLG(A7),D2…D2<--value�of�boolean;�1=TRUE*9*ˆIf�same,�then�put�FOPPRPW�into�parm�blk,�else�get�other*ˆcode�and�put�in�parm�blk.*‰CMP.B…#SAME,D2ŒLogon�=�target‰BNE.S…NOTSAME�Logon�<>�target%‰MOVE.W„#FOPPRPW,D0‰Public�read/write*‰BRA.S…CHNGPRM�Go�change�access�permission*B*ŠGet�address�of�access�permission�code�table�residing�in�assembly *Šdata�area.**ŠUse�the�address�of�CB�in�A1�and�obtain�the�device�type�code.*2‹MOVE.B„IOSDTP(A1),D1‡Put�dev�code�from�CB�into�D10‹MOVE.B„D1,D7�Preserves�copy�of�device�type�code*2*ŠFind�proper�access�permission�code�in�the�table.*!CODEFINDƒSUB.B…#1,D1�Do�an�entry.+‹BNE.S…NEXTCODEŒHave�not�reached�entry�yet.(‹MOVE.W„(A2),D0�Move�code�into�parm�blk.*‹BRA.S…CHNGPRM�Finish�rest�of�FHS�parm�blk)NEXTCODEƒADD.L…#2,A2�Point�to�next�entry.‹BRA.S…CODEFINDŒTry�next�code‰PAGE*#*�STEP�3.‚Change�access�permission.***ˆGet�the�address�of�msg.**CHNGPRM‚MOVE.L„MSGAD(A7),A2ˆAddress�of�msg*(‰BSR.L…CHNGACCPŒchange�access�permission*>*ˆIf�assignment�is�successful,�continue.‚If�the�device�is�busy?*ˆset�msg�for�busy�message�upon�return�to�CONFIG;�otherwise�the?*ˆerror�is�unexpected�so�set�msg�to�stop�the�screen�upon�return-*ˆto�the�CONFIG�and�put�out�a�system�message.*.‰BEQ.S…CNFG’Do�configure�if�assignment�is�good2‰IF�#FSTAAP��D0�THEN.S‡access�permission�error#‹MOVE.B�#DEVBUSY,(A2)Šmsg<--devbusy"‰ELSE.Sšdon't�know�this�error�code(‹BSR.L‚EMH”put�out�error�msg�form�system‰ENDI$‰BRA.S…GOHOME�can't�do�any�more�here‰PAGE*H*‚STEP�4.‚Get�duration�off�the�stack.‚If�duration�is�permanent(=0),�do�a7*‹configure�defaults;�otherwise�do�a�configure�request.**ˆGet�prmanent.*1CNFG…MOVE.B„DURATION(A7),D3…Get�value�of�duration*2*ˆFix�up�IOS�parameter�block�for�a�configure�call.*#‰LEA‡IOSPB(A4),A0ˆGet�addr�of�IOSPB***ˆType�of�call�will�be�inserted�presently.-*ˆType�of�options�will�be�inserted�presently.*ˆPut�in�rest�of�stuff�now.*‰MOVE.B„#0,IOSSTA(A0)‡status3‰MOVE.B„#TRGTLUN,IOSLUN(A0)�Assi gn�to�target�device$‰MOVE.W„#0,IOSSRV(A0)‡Reserved�field<‰MOVE.L„A1,IOSDBP(A0)‡CONFIG'S�CB�addr�->�CSB�in�IOS�parmblk ‰MOVE.W„#0,IOSOPT(A0)‡No�options*;*ˆIf�prmanent�is�true�than�do�a�configure�defaults�command;$*ˆotherwise;�do�a�configure�request.**.‰CMP.B…#PRMANENT,D3ŠIs�duration�permanent(=0)?‰BNE.S…NOTPERM�Not�permanent;‰MOVE.W„#IOCHDC,IOSFCT(A0)„Configure�defaults�for�permanent‰BRA.S…DOTRAP�Go�do�it*3NOTPERM‚MOVE.W„#IOCNFG,IOSFCT(A0)„Configure�request>‰AND.W…#OFFRWTO,IOSPRM(A1)ƒNeed�to�turn�off�read/write�timeoutA‰AND.W…#OFFHBYTE,IOSATM(A1)‚Also�turn�off�bits�12-15�in�attr�mask&‰CMP.B…#MAGTAPE,D7‹Is�device�mag�tape?‰BNE.S…DOTRAP�Not�mag�tape?‰MOVE.W„#IOPCONLY,IOSOPT(A0)‚Configure�but�don't�mount�mag�tape*DOTRAPƒTRAP†#2”Configure*D*ˆIf�successful�go�to�FIXMASK;�otherwise�go�to�error�message�handler(*ˆfor�a�system�message�on�unknown�error.*$‰BEQ.S…FIXMASK�No�error,�so�continue&‰BSR.L…EMH‘Go�to�error�message�handler7‰MOVE.W„#FOPPW,D0‹Restore�public�read/write�access�perm-‰BSR.S…CHNGACCPŒChange�access�permission�back‰BRA.S…GOHOMEŽCan't�do�any�more‰PAGE*4FIXMASK‚MOVE.W„D5,IOSPRM(A1)‡Restore�parameters�mask*E*ˆIf�the�configure�command�was�performed�then�the�defualt�values�willD*ˆwrite�over�the�working�values�when�the�device�assignment�is�closedA*ˆunless�bit�3�in�the�options�parameter�is�set,�in�which�case�IOS%*ˆwill�not�revise�the�working�values.*0‰LEA‡FHSPB(A4),A0ˆGet�FHSPB�for�close�assignment ‰MOVE.W„#0,FHSOPT(A0)‡No�options'‰CMP.B…#PRMANENT,D3ˆConfigure�defaults?‰BEQ.S…CLOSITŽClose�assignmentC‰BSETW…#FOPOVRTB,FHSOPT(A0)�Set�bit3�in�options�to�keep�cnfguration%CLOSITƒBSR.S…CLSASGN�Close�assignment**‹Restore�the�stack.*GOHOMEƒMOVE.L„(A7),STKLEN(A7)‰ADD.L…#STKLEN,A7‰RTS‰PAGEF************************************************************************“SUBROUTINE�-�CLSASGN**�Close�the�device�assignment*F***********************************************************************CLSASGN:***ˆFHSPB�loaded�above3‰MOVE.W„#FHCLOS,FHSCMD(A0)ƒClose�assignment�command*ˆoptions�filled�above‰MOVE.B„#0,FHSSTA(A0)ˆstatus)‰MOVE.B„#TRGTLUN,FHSLUN(A0)‚Target�device‰TRAP†#3“Perform�change‰RTS‰PAGEF************************************************************************“SUBROUTINE�-�CHNGACCP**�Change�the�access�permission*F*********************************************************************** CHNGACCP:**"‰LEA‡FHSPB(A4),A0‰Address�of�FHSPB3‰MOVE.W„#FHCHNG,FHSCMD(A0)ƒChange�access�permission3‰MOVE.W„D0,FHSOPT(A0)ˆAccess�permission�found�above‰MOVE.B„#0,FHSSTA(A0)ˆstatus)‰MOVE.B„#TRGTLUN,FHSLUN(A0)‚Target�device)‰MOVE.W„#0,FHSUSN(A0)ˆUser�default�number!‰MOVE.L„D6,FHSVOL(A0)ˆDevice�name,‰MOVE.L„#BLANK4,FHSCLG(A0)ƒBlank�out�catalog.‰MOVE.L„#BLANK4,FHSCLG+4(A0)�Blank�out�catalog.‰MOVE.L„#BLANK4,FHSFIL(A0)ƒBlank�out�file�name0‰MOVE.L„#BLANK4,FHSFIL+4(A0)�Blank�out�file�name.‰MOVE.W„#BLANK2,FHSEXT(A0)ƒBlank�out�extension‰TRAP†#3“Perform�change‰RTS‰PAGEF***********************************************************************Ä**’S�U�B�R�O�U�T�I�N�EŸ**’EMH�-�Error�Message�Handler—**Ä*F***********************************************************************<*ˆEMPBLK�was�appropriately�initialized�in�CFIGDATA�to�output%*ˆerror�messages�to�the�logon�device.EMH:%‰MOVE.L„A0,-(A7)ŒSave�my�A0�on�stack.&‰LEA‡EMPBLK(A4),A0‡Where�EMPBLK�lives.(‰MOVE.L„D0,(A0)�Put�error�#�into�EMPBLK./‰MOVE.L„(A7),4(A0)ŠPut�my�saved�A0�into�EMPBLK..‰MOVE.L„#2,D0�Error�message�handler�directive.&‰TRAP†#4’Invoke�Error�Message�Handler.‰MOVE.L„(A7)+,A0ŒRestore�A00‰MOVE.B„#STOPSCRN,(A2)†Stop�screen�after�message‰RTS‰ENDé ééééF***********************************************************************Ä* *œMODSTRCB **Ä**Ä*?*ˆMODSTRCB�retrieves�a�value�from�CB�and�returns�it�to�CONFIG.**Ä**ˆALGORITHM:²*0*’1.‚Get�the�address�of�CB,�the�offset�into�CB…*-*–where�the�desired�value�is�stored�and�the…*)*–size�of�the�value�from�off�the�stack.‰*4*’2.‚Get�the�address�of�value�off�the�stack�and�put*+*–value�into�the�CB�at�the�proper�offset.‡*$*’3.‚Restore�the�stack�and�return.‘**Ä* *‚REGISTERS¹*=*„IN…:ƒA3�points�to�Pascal�runtime�library;MUST�be�preserved*0*‹:ƒA5�points�to�Pascal�RMA;�MUST�be�preserved‹*-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ*:*‹:ƒA7�points�to�stack�with�parameters�and�return�address**�MUST�be�preserved¤**Ä**„DURING�:ƒA0�points�to�CB¦**�A1�contains�value�of�offsetš**�D0�contains�size�of�offset›*7*�A4�points�to�memory�area�for�MODSTRCB;�preserve�for‚**�duration�of�MODSTRCB. *!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*A*‚PARAMETERS�:�The�addresses�of�the�parameters�are�on�the�stack…*5*�such�that�the�first�parameter�is�put�on�the�stack„*5*�first�and�the�last�parameter�is�at�the�top�of�the„*(*�stack�just�under�the�return�address.‘*(*�The�call�to�MODSTRCB�was�as�follows:‘*&*�MODSTRCB�(CB,�offset,�size,�value)“**Ä*F***********************************************************************‰OPT‡A*MODSTRCB�IDNT†1,0‰PAGEF************************************************************************•X�D�E�F�Sƒ&ƒX�R�E�F�S*F***********************************************************************"‰XDEF†MODSTRCBŒProgram�entry�point**F**********************************************************************‰PAGEF************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|'*ˆ|----------|ˆ------------------------*ˆ|�value„|ˆaddress�of�valueœ@¥I­'*ˆ|----------|ˆ------------------------*ˆ|�size…|ˆsize�of�value'*ˆ|----------|ˆ------------------------(*ˆ|�offsetƒ|ˆoffset�to�put�value�into�CB'*ˆ|----------|ˆ------------------------*ƒHIƒ|�CB‡|ˆaddress�of�CB*ˆ------------*E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰return�address'VALADDR‚DS.L†1‰address�of�value�addressSZVAL„DS.W†1‰size�of�value0OFFSTVAL�DS.L†1‰offset�for�putting�value�into�CBCBADDRƒDS.L†1‰address�of�CBSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a3*‚assembly�routine�is�called�from�a�Pascal�program. *F************************************************************************—E�Q�U�A�T�E�S*F***********************************************************************"BYTE…EQU‡1‰size�of�value�if�a�byte"WORD…EQU‡2‰size�of�value�if�a�word‰PAGEF************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F***********************************************************************'‰SECTIONƒ9“ASM�routines�go�in�Section�9*MODSTRCB�EQU‡**5*‚STEP�1.‚Get�address�of�CB�and�offset�off�the�stack.**ˆGet�address�of�CB.*0‰MOVE.L„CBADDR(A7),A0‡A0�<--�addr�of�CB�on�stack**ˆPut�offset�into�A1.*2‰MOVE.L„OFFSTVAL(A7),A1…A1�<--�actual�offset�value*‰ADD.L…A1,A0�Get�to�target�parameter�in�CB**ˆPut�size�into�D0.*)‰MOVE.B„SZVAL(A7),D0ˆDO�<--�value�of�size‰PAGE*E*‚STEP�2.‚Get�address�of�value�and�move�the�value�into�its�respective*‹place�in�the�CB.*3‰MOVE.L„VALADDR(A7),A1†Get�addr�value�off�the�stack**ˆMove�CB�value�into�value.*5‰IF.B�#BYTE��D0�THEN.S…If�value�is�a�byte�in�size'‹ADD.L‚#3,A1�move�to�last�byte�of�value:‹MOVE.B�(A1),(A0)Œthen�move�only�a�byte�to�avoid�overwrite ‰ELSE.S˜else5‹IF.B�#WORD��D0�THEN.Sƒif�value�is�a�word�in�size,�ADD.L‚#2,A1Žmove�to�low�order�word�of�value:�MOVE.W�(A1),(A0)Šthen�move�only�a�word�to�avoid�overwrite ‹ELSE.S–else"�MOVE.L�(A1),(A0)Šmove�a�long�word‹ENDI‰ENDI‰PAGE**‚STEP�3.‚Restore�the�stack.*GOHOMEƒMOVE.L„(A7),STKLEN(A7)‰ADD.L…#STKLEN,A7‰RTS*‰ENDééééééF************************************************************************’C�O�N�F�I�G�.�P�R�I�N�T�.�S�A*F************************************************************************—INCLUDE�FILES*F************************************************************************ˆINCLUDEƒ9995.&.IOE.EQ*ˆNOLIST‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰LIST*F***********************************************************************Ä* *œPRINT£**Ä*<*‰PRINT�(asmmem,�parmscrn,�pname,�CB,�numlns,�chpln,�same,ƒ**�msg)°*)*�asmem†:�address�of�assemble�data�areaŠ*4*�parmscrnƒ:�address�of�the�parameters�for�display‚**�or�printingœ*2*�pname†:�address�of�name�of�device�for�printing�**�or�displaying�parameters�**�CB‰:�address�of�CB�block”*0 *�numlns…:�number�of�lines�to�display�or�print„*.*�numscrncol�:�number�of�characters�per�lineŠ*-*�same‡:�logon�device�is�same�as�device�for…**�displaying�parameters’*,*�msgˆ:�address�of�enumerated�variable�for…*"*�specific�message�to�be�printed‰**Ä*>*‰PRINT�assigns�the�printer/terminal�on�which�the�parameters�*=*‰will�be�printed.�If�the�device�does�not�exist,�or�is�busy‚*>*‰or�an�IOS�errors�occurs�then�msg�gets�the�appropriate�value*9*‰for�putting�out�an�error�message.‚If�the�error�is�not…*9*‰one�recognized�by�PRINT�then�Error�Message�Handler�is†*:*‰called�and�msg�gets�"stopmsg"�to�halt�the�screen�after…*$*‰the�system�message�is�displayed.›**Ä*;*‰If�the�printing�is�successful�then�the�device�menu�will„**‰be�displayed.®**Ä*&*‰1.‚Move�some�values�off�the�stack.˜*;*‰2.‚If�print/terminal�device�is�not�same�as�logon�deviceƒ*7*�do�an�assignment.ƒSet�up�an�exclusive�assignment�to‚*9*�the�print/terminal�device.‚If�an�error�occurs,�compare*6*�D0�with�several�error�codes�to�put�the�appropriate…*8*�enumerated�value�into�msg.‚If�there�is�no�match�then‚*3*�go�to�Error�Message�Handler.‚Return�to�the�main‡*4*�program.‚If�all�goes�well,�do�a�configure�status†*8*�request.‚Use�the�device�type�code,�and�if�the�output‚*µ7¾2Æ@Î6Ö?Þ9æAî68*�device�is�a�terminal,�find�out�if�it�is�an�EXORterm.ƒ*7*�D6�will�receive�the�number�of�blank�lines�to�print.„*6*�In�the�case�of�an�EXORterm,�no�blank�lines�will�be…*7*�printed.‚Use�this�value�to�decide�if�a�clear�screenƒ*8*�is�to�be�printed.‚If�it�is�zero�(an�EXORterm),�clear‚**�the�screen.¬*=*‰3.‚Write�the�parameters.�If�the�device�is�the�logon�device*6*�or�an�EXORterm,�then�set�up�the�first�output�for�a…*:*�clear�screen,�else�ser�it�up�to�print�some�blank�lines.*5*�Print�the�parameters�menu�using�the�start�and�end†*6*�addresses�of�the�menu�in�main�storage.‚If�all�goes„**�well�go�to�5.ª*3*‰4.‚Call�Error�Message�Handler,�msg�<--�stopmsg.‹*<*‰5.‚Close�assignment�to�the�printer�if�printing�device�is‚**�not�logon�device.¦**‰6.‚Restore�the�stack.¥**Ä*F**********************************************************************‰PAGEF***********************************************************************Ä**Ä**Ä* *‚REGISTERS¹*-*„IN…:ƒA3�points�to�Pascal�runtime�library;‘**’MUST�BE�PRESERVED¡**‹:ƒA5�points�to�Pascal�RMAž**’MUST�BE�PRESERVED¡*-*‹:ƒA6�points�to�Pascal�local�variable�areaŽ**’MUST�BE�PRESERVED¡*:*‹:ƒA7�points�to�stack�with�parameters�and�return�address**�MUST�BE�PRESERVED¤**Ä***„DURING�:ƒA0�points�to�parameter�blocks˜*4*�A1�has�addresses�of�various�buffers�for�printing…*8*�A2�has�address�of�name�of�output�device,�then�address*3*’of�enumerated�variable,�msg;�and�the�address�ofƒ**’CB°***�A4�holds�address�of�assembly�data�area�*)*�D0�is�reserved�for�error�code�returns�*1*�D1�has�address�of�the�start�of�parameter�menuˆ*6*�D2�has�number�of�characters�on�1�line�for�printingƒ*6*�D3�has�number�of�lines�of�parameters�menu�to�printƒ*)*�D4�has�value�of�same;�1=true,�0=false�*)*�D5�has�number�of�blank�lines�to�print�*4*�D6�has�the�code�for�the�device�type�and�then�the…*!*’number�of�lines�to�be�printed•*!*„OUT„:ƒA3,�A5,�A6�-�same�as�INž**�A7�points�to�way�back **Ä*F***********************************************************************‰OPT‡A*PRINT�IDNT†1,0‰PAGEF*********************************************************************** *•X�D�E�F�S*F***********************************************************************‰XDEF†PRINTŒProgram�entry�point*F*********************************************************************** *•X�R�E�F�S*F***********************************************************************2‰XREF†FHSPB…Offset�t o�FHSPB�in�assembly�data�area.2‰XREF†IOSPB…Offset�to�IOSPB�in�assembly�data�area.4‰XREF†EMPBLK„Offset�to�EMPBLK�in�assembly�data�area.*F************************************************************************™E�Q�U�A�T�E�S*F***********************************************************************6*ˆWARNING�-�Watch�for�value�changes�to�NONE,�NOSUCHDV,7*ˆPRNTBUSY�and�STOPSCRN�in�CONFIG.‚These�are�ENUMERATED?*ˆvariables�and�if�their�order�is�shuffled�in�their�Pascal�type>*ˆdeclaration�or�a�new�entry�is�placed�in�front�of�one�of�them8*ˆin�the�declaration�in�CONFIG,�their�VALUE�WILL�CHANGE.*USERZERO�EQU‡0‰Value�for�user�0PRNTLUN‚EQU‡3‰LUN�for�printer2BLNKLNS‚EQU‡10ˆNumber�of�blank�lines�to�be�printed2SAME…EQU‡1‰If�SAME�is�true;�printer�=�logon�deviceESCCODE‚EQU‡$1B‡Escape�code&CLRCODE‚EQU‡$58‡Clear�screen�characterCR‡EQU‡$0D‡Carriage�returnLF‡EQU‡$0A‡Line�feed EXORTERM�EQU‡0‰Code�for�EXORTERM"TERMINAL�EQU‡3‰Code�for�a�terminalBLANK2ƒEQU‡$2020…2�blanksBLANK4ƒEQU‡$20202020�4�blanks'NONE…EQU‡0‰Value�for�no�message�pending)NOSUCHDV�EQU‡2‰Value�for�nosuchdev�in�msg3STOPSCRN�EQU‡6‰Value�for�msg�which�will�stop�screen1PRNTBUSY�EQU‡9‰Value�for�msg�when�CB�has�bad�info*/TRGTLUN‚EQU‡2‰Target�device�LUN�for�trap�calls.*‰PAGEF************************************************************************‘T�H�EƒS�T�A�C�K*F***********************************************************************ˆ____________*„LO‚|�returnƒ|‚TOS�<--�A7 *ˆ|�address‚|'*ˆ|----------|ˆ-------------------------*ˆ|�msg†|ˆaddress�of�enumerated�variable,�msg'*ˆ|----------|ˆ------------------------3*ˆ|�same…|ˆprinting�device�is�same�as�logon�boolean'*ˆ|----------|ˆ------------------------)*ˆ|�chpln„|ˆnumber�of�characters�per�line'*ˆ|----------|ˆ------------------------(*ˆ|�numlnsƒ|ˆlength�of�line�for�printing'*ˆ|----------|ˆ------------------------'*ˆ|�CB‡|ˆaddress�of�CB�parameters�block'*ˆ|----------|ˆ------------------------#*ˆ|�pname„|ˆaddress�of�printer�name(*ˆ|----------|ˆ-------------------------+*ˆ|�parmscrn�|ˆaddress�of�parameters�screen'*ˆ|----------|ˆ------------------------8*ƒHIƒ|�asmmemƒ|ˆaddress�of�assembly�data�area�from�PRINT(*ˆ|----------|ˆ-------------------------*E*--------------------------------------------------------------------**•S�T�A�C�KƒO�F�F�S�E�T�S*F*---------------------------------------------------------------------* ‰OFFSET„0*RETADDR‚DS.L†1‰return�address&MSGADDR‚DS.L†1‰enumerated�variable�msg3SAMEVAL‚DS.W†1‰boolean�same;�printer�=�logon�device*CHPLN„DS.L†1‰number�of�characters�per�line'NUMLNSƒDS.W†1‰number�of�lines�on�screenCBADDRƒDS.L†1‰address�of�CB&PNAMEAD‚DS.L†1‰address�of�printer�name&SCRNADƒDS.L†1‰parameters�table�address*ASMMEMAD�DS.L†1‰assembly�data�area�addressSTKLENƒEQU‡*-4*D*‚The�return�address�is�always�placed�on�the�top�of�the�stack�when�a3*‚assembly�routine�is�called�from�a�Pascal�program.*‰PAGEF************************************************************************—D�A�T�AƒA�R�E�A*F***********************************************************************9*ˆThe�data�area�with�the�parameter�blocks�that�was�set�up?*ˆin�CFIGDATA�is�used.‚The�data�names�used�here�are�as�follows:*?*ˆFHSPB…parameter�block�used�for�device�assignments�-�used�hereB*ˆIOSPB…parameter�block�used�for�configure/status�call�-�used�hereB*ˆEMPBLK„parameter�block�used�by�Error�Message�Handler�-�used�here*F*=====================================================================**ˆPARAMETER�BLOCKS*F*---------------------------------------------------------------------*D*‚FHSPB�is�a�parameter�block�for�assigning�the�output�device�for�theB*‚parameters�menu.‚This�assignment�is�necessary�prior�to�doing�the*‚IOS�call�for�printing.*F*---------------------------------------------------------------------*F*‚IOSPB�is�a�parameter�block�for�printing�the�parameters�menu.‚It�willK*‚output�the�param eters�menu�on�the�terminal/printer�selected�by�thew�user.*F*---------------------------------------------------------------------*6*‚EMPBLK�is�used�for�the�system�error�message�handler.*‰PAGEF************************************************************************‘S�T�A�R�TƒO�FƒP�R�O�G�R�A�M*F***********************************************************************'‰SECTIONƒ9“ASM�routines�go�in�Section�9*;*ˆCLRSCRN�has�the�code�which�will�clear�an�EXORTERM�screen.*5CLRSCRN‚DC.B†ESCCODE,CLRCODE…Clear�screen�code,�no-op*?*ˆCRLF�is�a�buffer�containing�a�carriage�return�and�a�line�feed=*ˆfor�printing�blank�lines�at�the�top�of�the�parameters�menu.**CRLF…DC.B†CR,LF�Carriage�return,�line�feed* PRINT�EQU‡**)*�STEP�1.‚Move�some�values�off�the�stack.*B*ˆGet�the�address�of�the�assembly�data�area�that�has�the�parameter*ˆblocks�for�FHS,�IOS,�etc.*5‰MOVE.L„ASMMEMAD(A7),A4…Address�of�assembly�data�area**ˆGet�same�off�stack.*(‰MOVE.B„SAMEVAL(A7),D4†Get�boolean�same.‰PAGE*G*�STEP�2.‚Do�an�exclusive�assignment�to�the�print/display�device�if�its"*ˆdifferent�from�the�logon�device.**‰LEA‡FHSPB(A4),A0ˆGet�address�of�parm�blk.=‰IF.B�D4��#SAME�THEN.S…If�printing�device�<>�logon�device*2*ŠSet�up�parameter�block�for�exclusive�assignment.*5‹MOVE.W„#FHASGN,FHSCMD(A0)„Perform�device�assignment.)‹MOVE.W„#FOPEW,FHSOPT(A0)…Exclusive�write‹MOVE.B„#PRNTLUN,FHSLUN(A0)ƒLUN/‹MOVE.L„PNAMEAD(A7),A2ˆGet�addr�of�printer�name6‹MOVE.L„(A2),FHSVOL(A0)‡Target�name�for�configuration.2‹MOVE.W„#USERZERO,FHSUSN(A0)‚Zero�-->�user�number.2‹MOVE.L„#BLANK4,FHSCLG(A0)„Blank�out�catalog�name.<‹MOVE.L„#BLANK4,FHSCLG+4(A0)‚Blank�out�rest�of�catalog�name./‹MOVE.L„#BLANK4,FHSFIL(A0)„Blank�out�file�name.9‹MOVE.L„#BLANK4,FHSFIL+4(A0)‚Blank�out�rest�of�file�name./‹MOVE.W„#BLANK2,FHSEXT(A0)„Blank�out�extension.‹TRAP†#3”Do�assignment.*$‹BEQ.S…DEVATTR�Get�device�attributes*&‹MOVE.L„MSGADDR(A7),A2ˆGet�msg�address*=‹IF�#FSTAVOL��D0�THEN.S†FHS�code�for�device�doesn't�exist9�MOVE.B‚#NOSUCHDV,(A2)ˆmsg<--nosuchdev�for�CONFIG�message‹ELSE.S9�IF�#FSTAAP��D0�THEN.S…access�permission�error�-�busy#�MOVE.B�#PRNTBUSY,(A2)‡printer�busy�ELSE.S*�MOVE.B�#STOPSCRN,(A2)‡stop�screen�for�msg)�BSR.LƒEMH‘Put�out�system�message�and�RTS�ENDIšEnd�#FSTAAP‹ENDIšEnd�#FSTAVOL‹BRA.L…GOHOMEŽGo�back‰ENDIšEnd�assignment*8*ˆRetrieve�the�device�attributes�of�the�printing�device.*8DEVATTR‚LEA‡IOSPB(A4),A0ˆGet�IOSPB�for�config�status�req3‰MOVE.W„#IOSTAT,IOSFCT(A0)‚Configure�status�request)‰MOVE.W„#0,IOSOPT(A0)‡Fill�options�with�07‰IF.B�D4��#SAME�THEN.S…logon�device�=�output�device'‹MOVE.B�#LDFLUN,IOSLUN(A0)ƒlogon�device ‰ELSE.S˜else)‹MOVE.B�#PRNTLUN,IOSLUN(A0)‚output�device‰ENDIšend�LUN�decision=‰MOVE.L„CBADDR(A7),IOSDBP(A0)�Addr�of�old�configuration�block‰TRAP†#2’get�device's�info*,‰BEQ.S…GETDEVTPŒgood�info�returned�on�device*:‰MOVE.B„#BLNKLNS,D6‰bad�info�retruned,�set�D6�for�blnk�lns‰BRA.S…GETMSGADŒprepare�for�IOS**ˆGet�device�type�code*/GETDEVTP�MOVE.L„CBADDR(A7),A2‡Get�address�of�CB5‰MOVE.B„IOSDTP(A2),D6‡Get�device�type�code�out�of�CCB:‰IF.B‚D6��#TERMINAL�THEN.S�output�device�is�a�terminal&‹MOVE.B‚IOSTCD(A2),D6‡kind�of�terminal+‹IF.B�D6��#EXORTERM�THEN.S�EXORterm�=�02�MOVE.B�#BLNKLNS,D6ˆnumber�of�blank�lines�to�print!‹ENDI˜if�EXORterm,�then�#�in�D6=0‰ELSE.S˜not�a�terminal2‹MOVE.B�#BLNKLNS,D6Šnumber�of�blank�lines�to�print‰ENDI*.GETMSGAD�MOVE.L„MSGADDR(A7),A2ˆGet�msg�address* ‰PAGE*F*�STEP�3.‚Set�up�IOS�parameter�block�to�print�out�some�blank�lines�and*Šthe�parameters�menu.**ˆGet�address�of�IOSPB.*'‰LEA‡IOSPB(A4),A0ˆAddress�of�parm�block**ˆFill�parameter�block.*(‰MOVE.W„#IOWRIT,IOSFCT(A0)‚Write�request'‰MOVE.W„#IOPWAT,IOSOPT(A0)‚Wait�for�I/O‰MOVE.W„#0,IOSSTA(A0)‡Status@‰IF.B�D4��#SAME�THEN.S…If�logon�device�same�as�output�device3‹MOVE.B‚#LDFLUN,IOSLUN(A0)‚then�logon�device�is�LUN ‰E LSE.S˜else2‹MOVE.B‚#PRNTLUN,IOSLUN(A0)�printing�device�is�LUN ‰ENDIšEnd�LUN‰MOVE.W„#0,IOSSRV(A0)‡Reserved‰MOVE.L„#0,IOSRRN(A0)‡N/A‰MOVE.L„#0,IOSLEN(A0)‡N/A‰MOVE.L„#0,IOSBLN(A0)‡N/A*$*ˆFind�out�if�device�is�an�EXORterm.*?‰IF.B�D6��#EXORTERM�THEN.SƒEXORTERM�code�=�0,�#�blnk�lns<>0$‹BRA.S�CLEAR‘Prepare�to�clear�screen‰ENDI*A*ˆUse�address�of�CRLF�buffer�to�print�blank�lines�on�non-EXORTERM*ˆoutput�device.*'‰LEA‡CRLF(PC),A1‰Address�of�blank�lines<‰MOVE.L„A1,IOSSAD(A0)‡Start�address�for�buffer�to�be�written5‰ADD.L…#1,A1�Make�end�address�of�2�byte�buffer(CR,LF)0‰MOVE.L„A1,IOSEAD(A0)‡Load�end�of�buffer�address‰BRA.S…PRNT�Print�blank�lines*2*ˆUse�address�of�clear�screen�to�clear�the�screen.*5CLEAR„LEA‡CLRSCRN(PC),A1†Address�of�clear�screen�code<‰MOVE.L„A1,IOSSAD(A0)‡Start�address�for�buffer�to�be�written4‰ADD.L…#1,A1�Make�end�address�of�clear�screen�buffer0‰MOVE.L„A1,IOSEAD(A0)‡Load�end�of�buffer�address*PRNT…TRAP†#2’Print�1�blank�line*'‰BNE.S…ERROR�Take�care�of�error�message*2‰SUB.B…#1,D6�One�line�done,�subtract�it�from�total0‰BPL.S…PRNT�Print�another�blank�line�if�any�left*?*ˆGet�info�for�starting�address�and�building�ending�address�for+*ˆprinting�parameters�menu.‚Print�the�menu.*>RDYWRITE�MOVE.L„SCRNAD(A7),D1‡Get�address�of�start�of�parmscrn0‰MOVE.L„CHPLN(A7),D2ˆGet�number�of�char�per�line%‰SUB.L…#1,D2�Adjust�for�line�distance3‰MOVE.B„NUMLNS(A7),D3‡Get�number�of�lines�on�screen*(WRITE„MOVE.L„D1,IOSSAD(A0)‡Start�address4‰MOVE.L„D1,IOSEAD(A0)‡Start�address�into�end�address8‰ADD.L…D2,IOSEAD(A0)‡Start�addr�+�line�length�=�end�addr!‰TRAP†#2’Print�one�line�of�screen*!‰BNE.S…ERROR�Take�care�of�message*+‰SUB.B…#1,D3�Decrement�number�of�lines�by�13‰BEQ.S…CLSASGN�If�zero�lines�left,�close�assignment*¦else8‰MOVE.L„IOSEAD(A0),D1‡Get�addr�of�last�char�just�printed5‰ADD.L…#1,D1�Add�1�to�point�to�next�char�for�printing,‰BRA.S…WRITE�Insert�start�addr�into�parm�blk‰PAGE*?*‚STEP�4.‚If�an�error�occurs�that�is�not�recognized�above,�then>*‹msg�<--�stopscrn�to�stop�the�screen�for�reading�the�message.*+ERROR„MOVE.L‚MSGADDR(A7),A2ˆGet�msg�address:‰MOVE.B‚#STOPSCRN,(A2)ˆmsg<--stopscreen�for�CONFIG�message‰BSR.SƒEMH“Error�msg�handler‰PAGE*@*‚STEP�5.‚Close�the�assignment�if�logon�device�<>�output�device.*DCLSASGN‚IF.B�D4��#SAME�THEN.S‡If�logon�device�<>�printing�device‹LEA‡FHSPB(A4),A0ˆget�FHSPB1‹MOVE.W„#FHCLOS,FHSCMD(A0)‚Perform�close�command.‹TRAP†#3’Do�close.*‰ENDIœNo�close�done�if�logon=output�device‰PAGE**�STEP�6.‚Restore�the�stack.*GOHOMEƒMOVE.L„(A7),STKLEN(A7)‰ADD.L…#STKLEN,A7‰RTS‰PAGEF***********************************************************************Ä**’Error�Message�Handler�**Ä*F***********************************************************************EMH†MOVE.L„A0,-(A7)ŒSave�A0‰LEA‡EMPBLK(A4),A0‡Get�parm�blk"‰MOVE.L„D0,(A0)�Put�D0�in�parm�blk6‰MOVE.L„(A7),4(A0)ŠPut�saved�address�of�A0�in�parm�blk‰MOVE.L„#2,D0�Directive‰TRAP†#4%‰MOVE.L„(A7)+,A0ŒRestore�A0�and�stack ‰RTS›Return‰END  é' CREF ILIB SA Trr ‰NOLIST‰INCLUDEƒ9995.&.FIO.EQ‰LIST1ILIB†IDNTƒ0,0�LIBRARY�OF�INDEX�SEQUENTIAL�SUPPORT*1*‚This�library�consists�of�the�following�routines*„I$SET,�I$POS,‚I$BEFORE*?*‚Its�purpose�it�to�support�index�sequential�files�for�a�Pascal *ƒenvornment*+IOPOST„EQU„$101�The�position�command�to�IOS+FHSIOS„EQU„2’The�abort�number�for�Pascal�RR*+* Hellow does the initial work of a routine** A4 gets the return address=* A1 gets the file parameter(last parameter of the procedure)* A2 gets the file data block* HELLO…MACROŠXDEFƒ\1‘Define�the�entry�point ŠSECTION�9)\1ˆMOVE.L�(A7)+,A4‹Get�the�return�address,ŠMOVE.L�(A7)+,A1‹Get�the�address�of�the�file9ŠMOVE.L�FDP(A1),A2‰Get�the�address�of�the�file�data�blockŠENDM** Bye will end a procedure* BYE‡MACRO,ŠJMP„(A4)�Jump�to�the�address�for�the�returnŠENDMŠPAGE** PROCEDURE I$SET(VAR F:FILE)*D*‰Set�up�a�file�for�indexed�type.‚This�call�precedes�a�rewrite�call.* ŠHELLO‚I$SET8ŠMOVE.W�#FOPISD,D0‰Set�allocate�option�to�index/dup�keys5ŠOR.WƒD0,FHS+FHSOPT(A2)‚Set�it�in�the�file�data�blockAŠMOVE.L�#$00000108,FHS+FHSSIZ(A2)�Set�FAB�size�=�1,�D.B.�size�=�8,ŠBYE—Done(Rewrite�does�the�rest�of�the�work)ŠPAGE*** PROCEDURE I$POS(RECORD:LONG;VAR F:FILE);*<*‰Move�the�file�to�the�position�indcated�by�record.‚The�nextB*‰Write�to�this�file�will�write�a�record�after�the�one�positioned.*ŠHELLO‚I$POSŽEnter�procedure.ŠMOVE.L�(A7)+,IOS+IOSRRN(A2)�Set�record�number2ŠMOVE.W�#IOPRAN,IOS+IOSOPT(A2)�Set�position�option(ŠLEA„IOS(A2),A0‰Get�address�of�IOS�block%ŠMOVE.W�#IOPOST,(A0)‡Command=PositionŠTRAPƒ#2‘Do�command ŠIF��THEN.SŒIf�no�error�then9ŠMOVE.W�#0,IOSOPT(A0)†set�the�option�to�write�next�recordŠBYE—and�exit�the�procedureŠELSE.S!ŠTRAPƒ#ABORT�Abort�with�IOS�error ŠDC.WƒFHSIOSŠENDIŠPAGE*-* PROCEDURE I$BEFORE(RECORD:LONG;VAR F:FILE);*<*‰Move�the�file�to�the�position�indcated�by�record.‚The�nextC*‰Write�to�this�file�will�write�a�record�before�the�one�positioned.*úGŠHELLO‚I$BEFORE‹Enter�procedure.ŠMOVE.L�(A7)+,IOS+IOSRRN(A2)�Set�record�number2ŠMOVE.W�#IOPRAN,IOS+IOSOPT(A2)�Set�position�option(ŠLEA„IOS(A2),A0‰Get�address�of�IOS�block%ŠMOVE.W�#IOPOST,(A0)‡Command=PositionŠTRAPƒ#2‘Do�command ŠIF��THEN.SŒIf�no�error�then>ŠMOVE.W�#IOPPRV,IOSOPT(A0)�Set�the�option�to�write�prev�recordŠBYE—and�exit�the�procedureŠELSE.S!ŠTRAPƒ#ABORT�Abort�with�IOS�error ŠDC.WƒFHSIOSŠENDIŠENDééé ééé' HDS200 CFHDS200AFrrCFHDS200LF  rrCFHDS200SA)) krrGETSREC AF::rrGETSREC LFCCrrGETSREC SALL@rrSENDSRECAF]]rrSENDSRECLFffrrSENDSRECSAoo _rrSETFCB SA€€0rrSCAN SA‰‰rrVERIFY SA’’&rr=/*=/*†HDS200.CFHDS200.AF=/*F=/* Chain file to assemble HDS200.CFHDS200.LO utility which is used toB=/* configure the VME/10 serial port #CN01 for use by the HDS-200.=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to HDS200.CFHDS200.LS=/*=/IFC \1ƒ=ARG�HDS200.CFHDS200.LS=/ENDIF=/*3=ASM HDS200.CFHDS200.SA,HDS200.CFHDS200.RO,\1;RZ=90=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.CRASH.MC=/*}=/*=ENDéééééé =/*=/*†HDS200.CFHDS200.LF=/*K=/* Link chain file to create HDS200.CFHDS200.LO which is used to configure8=/* the VME/10 serial port #CN01 for use by the HDS-200.=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to HDS200.CFHDS200.LL=/*=/IFC \1ƒ=ARG�HDS200.CFHDS200.LL=/ENDIF=/*#=LINK ,HDS200.CFHDS200.LO,\1;HAMIXS ATTRIBUTES PSINPUT HDS200.CFHDS200.ROEND=/*=ENDéééééé0CFHDS200�IDNT†0,0‡Configure�for�HDS-200“07/27/83O********************************************************************************=*‰CFHDS200�--�PROGRAM�TO�CONFIGURE�A�7201�SERIAL�PORT�FOR�USE*‰WITH�THE�HDS-200*O*******************************************************************************   *‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�9995.&.CRASH.MCŠNOLISTŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.CRASH.MCŠLIST ‰TTL‡CFHDS200‰PAGE .HDS_LUNƒEQU„1’LUN�to�use�for�the�HDS-200�port.?HDS_DEVICE�EQUƒ'CN01'�Device�name�of�port�connected�to�HDS-200. *>*‚ATTRIBUTES�MASK�and�ATTRIBUTES�WORD�to�use�in�configuration:!*„Disable�Type�Ahead�=�0„(Enable)*„Disable�Local�Echo�=�1*„Use�XOFF�&�XON�to*†control�the�flow*†of�incoming�data�=�1*-ATT_MASK‚EQU„1<‚DU�command�(without�carriage�return),�the�user�returns�to�theB‚chain�file,�which�invokes�GETSREC�to�complete�the�command�line�byC‚sending�a�carriage�return�to�the�HDS200,�then�reads�s-records�fromA‚the�HDS200,�copying�them�to�the�disk�file�specified�in�the�chainB‚file�command�line,�until�an�s-record�with�'S9'�in�positions�1�and>‚2�is�copied.‚The�chain�file�command�specifies�the�serial�portG‚number�and�the�name�of�the�disk�file�which�will�receive�the�s-records. “GETSREC�#CNxx,file_name} TYPE‰str“=‚string[514]; VAR‰s_record,s_rec_out„:‚str;‰ser_port,s_rec_fileƒ:‚text;‰counter,i,j,nchars„:‚integer;‰null_linesŒ:‚integer; {$F=HDS200.SCAN.SA} /procedure setfcb (VAR file_name:text); forward; begin {GETSREC} 9{‚open�the�s-record�file�and�the�serial�port�for�outputŒ}  4‚setfcb‚(ser_port);’{�fix�PASCAL�file�control�block})‚rewrite�(ser_port);’{�open�serial�portŒ}6‚rewrite�(s_rec_file);�{�open�disk�file�of�s-records�},‚counter�:=�0;˜{�initialize�record�counterƒ}1‚null_lines�:=�0;•{�count�#�null�lines�received�} D{‚send�a�carriage�return�to�the�serial�port�to�terminate�the�command2‡typed�by�the�user�and�begin�receiving�s-records�} ‚writeƒ(ser_port,chr(13));1‚resetƒ(ser_port);’{�open�serial�port�for�input‚} >{‚copy�s-records�from�the�serial�port�to�the�disk�file�until�aŽtermination�record�is�read�} repeat„j�:=�0;1„readln‚(ser_port,s_record);Œ{�read�an�s-recordŒ}6„scan„(s_record,nchars);Ž{�remove�non-printing�charsƒ}„if�nchars�>�0�then;†if�(copy(s_record,1,1)�<>�'S')�thenƒ{�if�not�an�S-recordŠ},Œwriteln�(s_record)Ž{�display�as�error�msgˆ}†elseŒbegin'Œs_rec_out�:=�copy�(s_record,1,nchars); Œwriteln�(s_rec_file,s_rec_out);Œcounter�:=�counter�+�1Œend…elseŠnull_lines�:=�null_lines�+�1;D>M"until copy (s_rec_out,1,2) = 'S9';+writeln (counter:5,' records transferred');end.ééééééé=/*=/*†HDS200.SENDSREC.AF=/*J=/* Chain file to assemble HDS200.SETFCB.SA and compile HDS200.SENDSREC.SAH=/* HDS200.SENDSREC.LO is used to send S-records to the HDS-200 by means$=/* of the VME/10 serial port #CN01.=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to HDS200.SENDSREC.LS=/*=/IFC \1ƒ=ARG�HDS200.SENDSREC.LS=/ENDIF=/*+=ASM HDS200.SETFCB.SA,HDS200.SETFCB.RO,\1;R=/*{ Included files are:=/*ƒ--�none�--=/*}=/*=PASCAL HDS200.SENDSREC.SA=/*{ Included files are:=/*ƒ--�none�--=/*}=PASCAL2 HDS200.SENDSREC.PC=/*=END éééééU=/*=/*†HDS200.SENDSREC.LF=/*L=/* Link chain file to create HDS200.SENDSREC.LO which sends S-records to an:=/* HDS-200 by means of the serial port #CN01 on a VME/10.=/*:=/* If no output argument is specified for the listing the1=/* chain file will default to HDS200.SENDSREC.LL=/*=/IFC \1ƒ=ARG�HDS200.SENDSREC.LL=/ENDIF=/*"=LINK ,HDS200.SENDSREC.LO,\1;HAMIX ATTRIBUTES SINPUT HDS200.SENDSREC.ROINPUT HDS200.SETFCB.ROEND=/*=ENDéééééé^4program SENDSREC (input,output,s_rec_file,ser_port);{=‚SENDSREC�provides�a�method�of�downloading�s-records�from�the=‚VME/10�to�the�HDS200.‚After�entering�'transparent�mode',�the>‚user�enters�the�LO�command�and�returns�to�the�chain�file.‚The?‚cha in�file�invokes�SENDSREC�with�the�name�of�the�s-record�file>‚which�is�to�be�transferred�to�the�HDS200,�and�the�serial�port?‚to�which�the�records�will�be�sent.‚As�each�record�is�sent,�the?‚HDS200�echos�the�record,�or�sends�an�error�message.‚If�an�echo8‚is�received�which�does�not�match�the�record�sent,�it�is:‚displayed�on�the�standard�output�device.‚Otherwise,�it�is<‚ignored.‚The�HDS200�must�use�the�echo�mode�of�transmission. “SENDSREC�s_rec_file,ser_port} TYPE‰str“=‚string[514];&‰hex_charŽ=‚array[1..16]�of�string[1];VAR‰s_record,echo‰:‚str;‰ser_port,s_rec_fileƒ:‚text;‰counter,ncharsˆ:‚integer;‰hex_digitsŒ:‚hex_char;‰loopc‘:‚integer;‰garbage�:‚text; ‰cr”:‚char; {$F=HDS200.VERIFY.SA}{$F=HDS200.SCAN.SA} procedure write_with_echo;begin4‚rewrite�(ser_port);’{�open�serial�port�for�output�}>‚writeln�(ser_port,s_record,cr);†{�copy�s-rec�to�serial�portƒ}1‚resetƒ(ser_port);’{�open�serial�port�for�input‚}2‚readln‚(ser_port,echo);�{�read�from�serial�port‡}2‚scan„(echo,nchars);�{�remove�non-printing�charsƒ}end; {write_with_echo} /procedure setfcb (VAR file_name:text); forward; begin {SENDSREC} 3hex_digits[1]�:=�'0';’{�initialize�array�of�validƒ}(hex_digits[2]�:=�'1';’{ƒhex�charactersŒ}hex_digits[3] := '2';hex_digits[4] := '3';hex_digits[5] := '4';hex_digits[6] := '5';hex_digits[7] := '6';hex_digits[8] := '7';hex_digits[9] := '8';hex_digits[10]:= '9';hex_digits[11]:= 'A';hex_digits[12]:= 'B';hex_digits[13]:= 'C';hex_digits[14]:= 'D';hex_digits[15]:= 'E';hex_digits[16]:= 'F';cr := chr(13); 4setfcb(ser_port);�{�fix�PASCAL�file�parameter�block}3reset�(s_rec_file);‹{�open�s-record�file�for�input})counter�:=�0;‘{�initialize�record�count…}gAps_record�:=�'‚'; <{‚copy�s-records�from�the�disk�file�to�the�serial�port�until0ƒan�eof�is�encountered�or�an�S9�record�is�sent•} 7while�(not�eof�(s_rec_file)�andˆ{�not�end�of�file�and‰}7‡(copy�(s_record,1,2)�<>�'S9'))�do�{�not�a�terminatorŠ}‚begin3„readln�(s_rec_file,s_record);†{�read�an�s-recordŒ}3„writeln(s_record);‘{�display�it�on�user�terminal�}/„write_with_echo;“{�send�to�ser_port�and�readƒ}{D‚if�characters�1�and�2�of�the�echo�don't�match�the�s_record�that�wasA‚sent�in�characters�1�and�2,�and�the�echo�doesn't�appear�to�be�anA‚s-record,�then�display�what�was�received�as�an�error�message�and!‚try�to�receive�the�echo�again.¤} 1„while�((copy(echo,1,2)�<>�copy(s_record,1,2))�or�not�verify�(echo))ƒdo†beginˆif�(nchars�>�0)�then&Šwriteln�(echo);Ž{�display�it�on�CRT‹}1ˆreadln‚(ser_port,echo);‡{�get�another�s-recordˆ}1ˆscan„(echo,nchars)Š{�remove�non-printing�charsƒ}"†end;�{�while�echo�doesn't�match„}4„counter�:=�counter�+�1�{�increment�record�counter„}‚end;¡{�while�not�eof�(sfile)‡} *writeln (counter:5,' records transferred')end. ééé SETFCBƒIDNT†0,0¥07/29/83*!‰TTL‡SET�IMAGE�MODE�IN�PASCAL�FCB*=*‚Assembly�language�routine�to�modify�the�IOS�parameter�block;*‚associated�with�a�PASCAL�File�Parameter�Block�so�that�the<*‚output�will�not�echo�a�carriage�return/line�feed�character9*‚with�each�line.‚(Set�the�image�mode�bit�in�the�function/*‚word.)‚Pass�the�file�name�as�a�VAR�parameter.**ˆCalling�sequence:*!*ˆVAR„serial_port‰:‰file�of�text;*1*ˆPROCEDURE�SETFCB�(VAR�file_name:text);�FORWARD;**ˆsetfcb(serial_port);* ‰XDEF†SETFCB*.*‚Offsets�into�the�PASCAL�File�Parameter�Block*&*ˆ+0ˆComponent�Pointer�(file�position)(*ˆ+4ˆPASCAL�file�status�/�component�size*ˆ+8ˆIOS�Parameter�Block*œ.*œ.*œ.*ˆ+36‡FHS�Parameter�Block*œ.*œ.*œ.0*ˆ+76‡Reserved/IFD�Scan�Status/File�List�Pointer*ˆ+80‡Record�Buffer*‰PAGE(FUNCTION�EQU‡11’IOS�Function�Byte�offset*‰SECTIONƒ9“PASCAL�requirement* SETFCBƒEQU‡**)‰MOVE.L„(A7)+,A4ŒReturn�address�in�reg�A4)‰MOVE.L„(A7)+,A2ŒParameter�=�File�Pointer-‰MOVE.L„4(A2),A1ŒFile�Parameter�Block�address0‰ORI.B…#08,FUNCTION(A1)„Update�IOS�Function�Code‰JMP‡(A4)�Return�to�caller*‰ENDéééx19{‚PROCEDURE�SCAN�removes�non-printing�characters�from�the5ƒinput�string�and�returns�the�length�of�the�resulting5ƒstring�as�parameter�two.‚Characters�lower�than�space5ƒin�the�ASCII�sequence�are�considered�non-printing.†} -procedure SCAN (VAR rec:str; VAR jx:integer); VAR†ixˆ:‰integer; begin„{SCAN}$‚jx�:=�0;�{�init�destination�index†}‚for�ix�:=�1�to�length�(rec)�do6„if�(copy(rec,ix,1)�>=�'�')�then…{�if�valid�character}†begin)ˆjx�:=�jx�+�1;’{�bump�destination�index†}1ˆif�jx�<>�ix�then�{�if�source�not�eq�destination}Šbegin˜{�move�character�left‰}&Šrec�:=�insert(copy(rec,ix,1),rec,jx);8Šrec�:=�delete(rec,jx+1,1)„{�delete�replaced�characterƒ}Šend†end;;‚if�jx�<>�length�(rec)�then‹{�has�string�length�changed�?�}8„rec:=�delete(rec,jx+1,length(rec)-jx)ˆ{delete�garbage…} end;…{SCAN}ééé é�(function verify (VAR list:str): boolean;{C‚verify�that�all�characters�in�the�input�string�before�the�carriage>‚return�consist�of�ascii�encoded�hex�digits�whenever�the�first%‚character�in�the�string�is�an�'S'.¡} VAR‰i,j“:‚integer;‰result�:‚boolean;begin%‚result�:=�TRUE;–{�init�return�code�}(‚i�:=�2;ž{�start�with�second�character‚}=‚if�copy(list,1,1)�=�'S'�then‰{�if�input�string�an�s-record‚}„beginD„while�((copy�(list,i,1)�<>�chr(13))�{�while�char�not�a�carr-return}3�and‚(i�<=�length(list))�{‚and�index�in�limit�and„}0�and�result)�do‰{�all�prior�chars�are�hex�digs�}†beginˆj�:=�1;ˆrepeat*Šif�(copy�(list,i,1)�=�hex_digits[j])�then/Œresult�:=�TRUE�{�character�is�valid�ASCII�hex}Šelse+Œresult�:=�FALSE;Ž{�not�a�valid�character„} Šj�:=�j�+�1ˆuntil�((result)�or�(j�>�16));ˆif�(not�result)�thenŠbegin4Œlist�:=�insert�('\',list,i);ƒ{�replace�with�a�'\'…}Œlist�:=�delete�(list,i+1,1)Šend;(ˆi�:=�i�+�1”{‚next�character�in�stringƒ}†end;„end‚else„result�:=�FALSE;verify := resultend;…{�function�verify�} éééŠ'' PATCH CODE68M SAŸŸ°ƒrrDCODE68MSAXX�ŒrrMBSR SAéé#hrr)‰TTL‡ONE�LINE�ASSEMBLER‚68000/68008/68010<********�INCLUDEƒCRIGHT.SA‹Bring�in�the�Copyright�notice†JAH>CODE68M‚IDNT†3,2‡ONE�LINE�ASSEMBLER�68000/68008/68010„12/18/84 ‰OPT‡A±3,2 ‰XDEF†CODE68K‰XDEF†CODE68M�.�3,0‰XDEF†ERˆUSED�BY�MBSR ‰XREF† PNT2HX,FRELADDR‰XREF†GETDECNUŒ.�1,2 * WITHOUT LABEL FIELD5* 012345678901234567890123456789012345678901234567890,*�AAAAAA�DDDDDDDDDDDDDDDDDDDD�OPCODE‚OPERAND*ˆFDATA�FOC…FOP 5* 0123456789012345678901234567890123456789012345678905*�AAAAAA�DDDDDDDDDDDDDDDDDDDD�LLLLLLLL�OPCODE‚OPERAND*ˆFDATA�FOL†FOC…FOP * D3 = PROCESSOR TYPE*„=�0000„68000*„=�0004„68008*„=�0008„68010*„=�000C„68020‚FUTURE** A3 = STORE POINTER* A4 = PROGRAM COUNTER* A5 = SOURCE PTR BEGINNING* A6 = SOURCE PTR END+1* *„BSRƒCODE68M SPC 3OUTBSIZE�EQU‡80ˆBUFFER�SIZEFDATA„EQU‡10ˆOFFSET�TO�DATAFOL†EQU‡31ˆOFFSET�TO�LABEL-FOC†EQU‡31ˆOFFSET�TO�OP-CODE�(NO�LABEL�FIELD)-FOP†EQU‡39ˆOFFSET�TO�OPERAND�(NO�LABEL�FIELD) ‰OFFSET„0 ESKB…DSˆ0 TDATA„DS.B†10 TNB†DS.B†1 TLSPECƒDS.B†1TLENGTH‚DS.W†1PCOUNTER�DS.L†1PTROP„DS.L†1“POINTER�TO�OPERAND$PENDOPƒDS.L†1“POINTER�END�OF�OPERAND0PTRBUFE‚DS.L†1“POINTER�TO�END�OF�FORMATED�SOURCE PRTYPEƒDS.W†1“PROCESSOR�TYPE�3,0LINK…DS.L†1“SAVE�FOR�UNLINK ESKE…DS.B†0 ‰SECTIONƒ11 XBASE„DSˆ0 PAGE* EVALUATE EXPRESSION!*‚NUMBER�PLUS�OR�MINUS�NUMBER....*EV‡DSˆ0‰MOVE.L„D7,-(A7)ŒSAVE�D7 ‰CLR.L…D7"GETEXP21�BSR.S…GETFIELDŒGET�NUMBER$‰ADD.L…D0,D7�D7�=�NUMBER�BEING�BUILT.GETEXP15�MOVE.B„(A5)+,D1ŒD1�=�TERMINATING�CHAR(‰CLR.L…D0’D0�=�NEXT�NUMBER�(=0�1ST�TIME)‰CMP.B…#'+',D1‰BEQ‡GETEXP21ŒPLUS‰CMP.B…#'-',D1‰BNE.S…GETEXP39ŒNOT�MINUS‰BSR.S…GETFIELDŒGET�NEXT�NUMBER ‰SUB.L…D0,D7 ‰BRA‡GETEXP15 SPC 1&GETEXP39�MOVE.L„D7,D0�D0�=�VALUE�BUILT'‰SUB.L…#1,A5�A5�=�CHAR�AFTER�EXPRESSION‰MOVE.L„(A7)+,D7ŒRESTORE�D7‰RTS PAGE GETFIELD�DSˆ0‰CMP.B…#'*',(A5)‰BNE.S…GETF305 "‰MOVE.L„D4,D0�D0�=�PROGRAM�COUNTER ‰ADD.L…#1,A5‰BRA.S…GETF333 GETF305‚CMP.B…#$27,(A5) —X R¨W°|¸sÀ_ÈSÐEØGàPèSðaø‚wtos g(m0`8Z@oH‰BNE.S…GETF325�NOT�LITERAL ‰ADD.L…#1,A5 ‰CLR.L…D0 ‰MOVE.W„TLENGTH(A1),D1†D1�=�SIZE‰BEQ.S…GETF308�.B�=�0‰LSR.W…#5,D1�.W�=�1‰SUB.L…#1,D1�.L�=�3GETF308 GETF311‚LSL.L…#8,D0‰MOVE.B„(A5)+,D0‰CMP.B…#$27,(A5)‰BEQ.S…GETF312�CLOSING�QUOTE‰DBF‡D1,GETF311ER1†BRA‡ER’OVERFLOW–1,2 +GETF312‚ADD.L…#1,A5�MOVE�PAST�CLOSING�QUOTE‰BRA.S…GETF314 GETF313‚LSL.L…#8,D0%GETF314‚DBF‡D1,GETF313ŠLEFT�NORNALIZE‰BRA.S…GETF333 +GETF325‚BSR‡GETDECNUŒGET�DECIMAL�NUMBERŒ1,2‰BNE‡ER1‘MESSED�UP�NUMBERŽ1,2 GETF333‚RTS * FIND AND SET SIZE* BIT 5432109876543210*…........00......‚=�BYTE*…........01......‚=�WORD*…........10......‚=�LONG*'FSIZE„OR.W†TLENGTH(A1),D2ŠSET�SIZE�BITS‰RTS PAGE*‚D0�=�VALUE�0�-�7*‚D1�=�0�IF�D@ *…=�8�IF�A@*GETREGD‚CLR.L…D1&‰CMP.B…#'D',(A5)‹IS�FIRST�CHAR�=�'D'�?)‰BNE.S…NOTREGŽNO,�NOT�A�'D'-TYPE�REGISTERGET41„CLR.L…D0’YES$‰MOVE.B„1(A5),D0ŒGET�REGISTER�NUMBER‰SUB.B…#'0',D0�LESS�THAN�0�?!‰BMI.S…NOTREGŽYES,�NOT�A�REGISTER"‰CMP.B…#$7,D0ŽNO,�GREATER�THAN�7�?!‰BGT.S…NOTREGŽYES,�NOT�A�REGISTER)‰ADD.L…#2,A5�NO,�SET�A5�TO�DELIMETER�CHAR)‰LEA‡GETNDATA(PC),A0…GET�VALID�DELIMETERS.GETDELIM�TST.B…(A0)�AT�END�OF�DELIMETERS�?ˆ3,0(‰BEQ.S…NOTREGS�YES,�NOT�A�VALID�REGISTER‰CMP.B…(A5)+,(A0)+‰BEQ.S…HAVEITŽHAVE�DELIMETER"‰SUB.L…#1,A5�RESET�A5�TO�DELIMETER‰BNE‡GETDELIMŒKEEP�LOOKING (HAVEITƒSUB.L…#1,A5�RESET�A5�TO�DELIMETER)‰MOVE†#4,CCRŽSET�REGISTER�FOUND�CONDITION‰RTS 1NOTREGS‚SUB.L…#2,A5�RESET�A5�TO�START�OF�REGISTER‰BRA.S…NOTREGŽSIGNAL�NOT�FOUNDGETNDATA�DC.B†'�,).-/',0Š.�3,0 #GETREGA‚MOVE.L„#8,D1�SET�FOR�A@”3,0&‰CMP.B…#'A',(A5)‹IS�FIRST�CHAR�=�'A'�?*‰BNE.S…NOTREGŽNO,�NOT�AN�'A'-TYPE�REGISTER‰BRA‡GET41�YES GETREGAD�CLR.L…D1’SET�FOR�D@&‰CMP.B…#'D',(A5)‹IS�FIRST�CHAR�=�'D'�?(‰BEQ‡GET41�YES,�MAY�BE�'D'-TYPE�REGISTER ‰MOVE.L„#8,D1�NO,�SET�FOR�A@�3,0&‰CMP.B…#'A',(A5)‹IS�FIRST�CHAR�=�'A'�?(‰BEQ‡GET41�YES,�MAY�BE�'A'-TYPE�REGISTER5NOTREGƒMOVE†#0,CCRŽNO,�RESET�REGISTER�FOUND�CONDITION‰RTS  SPC 2/GETREGSR�MOVEQ…#2,D0�SET�D0�FOR�2�CHAR�REGISTER‰CMP.B…#'S',(A5)‹'SR'�?‰BNE.S…NOTREGŽNO‰CMP.B…#'R',1(A5)‰BNE.S…NOTREGŽNO.TERM…CMP.B…#',',(A5,D0)ˆYES,�DELIMETER�=�','�?‰BEQ.S…ISREG�YES)‰CMP.B…#'�',(A5,D0)ˆNO,�DELIMETER�=�'�'�?‰BNE.S…NOTREGŽNO,ISREG„ADD.L…D0,A5�YES,�MOVE�A5�PAST�REGISTER!‰CLR.L…D5’SET�REGISTER�FOUND�FLAG‰RTS GETREGUS�CMP.B…#'U',(A5)‹'USP'�?‰BNE.S…NOTREGŽNOTESTSPƒCMP.B…#'S',1(A5)‰BNE.S…NOTREGŽNO‰CMP.B…#'P',2(A5)‰BNE.S…NOTREGŽNO1MOVE3„MOVEQ…#3,D0�YES,�SET�D0�FOR�3�CHAR�REGISTER‰BRA.S…TERM�FIND�DELIM�CHAR GETREGSS�CMP.B…#'S',(A5)‹'SSP'�?‰BNE.S…NOTREGŽNO‰BRA.S…TESTSPŽMAYBE GETREGCR�CMP.B…#'C',(A5)‹'CCR'�?‰BNE.S…NOTREGŽNO‰CMP.B…#'C',1(A5)‰BNE.S…NOTREGŽNO‰CMP.B…#'R',2(A5)‰BNE.S…NOTREGŽNO,‰BRA.S…MOVE3�YES,�SET�D0�AND�FIND�DELIM�CHAR PAGE(EADA…MOVE.W„#$1FD,D7ŒDATA�ALTERABLE�ONLY ‰BRA.S…EA SPC 1 EAC†MOVE.W„#$7E4,D7ŒCONTROL�ONLY ‰BRA.S…EA SPC 1)EAM†MOVE.W„#$1FC,D7ŒMEMORY�ALTERABLE�ONLY ‰BRA.S…EA SPC 1"EAZ†MOVE.W„#$800,D7ŒIMMEDIATE�ONLY ‰BRA.S…EA 'EADADDR‚MOVE.W„#$FFD,D7‚DATA�ADDRESSING ‰BRA.S…EA (EAA†MOVE.W„#$1FF,D7ŒALTERABLE�ADDRESSING ‰BRA.S…EA EAALL„MOVE.W„#$FFF,D7‚ALL�MODES SPC 4#*‚...............1‚D@�DATA�REGISTER*‚..............1.‚A@*‚.............1..‚(A@)*‚............1...‚-(A@)*‚...........1....‚(A@)+*‚..........1.....‚DATA(A@)*‚.........1......‚DATA(A@,R@)*‚........1.......‚DATA‚(SHORT)*‚.......1........‚DATA‚(LONG)*‚......1.........‚DATA(PC)*‚.....1..........‚DATA(PC,R@)*‚....1...........‚#DATA%*‚1...............‚SPECIAL�CASE�JMP.L PAGE* D0 = VALUE CALCULATED** D2 = MASK WORD (1ST WORD OF INSTRUCTION)'* D3 = OFFSET FOR DATA STORE (TDATA+..)* D4 = EXTENSION WORD * D5 = $*�D6�=�MODE�AS�BUILTƒ.........XXXXXX* D7 = MODES ALLOWED*4* A4 = BASE ADDRESS FOR DATA STORE (TDATA+..)[A4,D3]EA‡DSˆ0‰CLR.L…D5’ZERO�VALUE‰CLR.L…D6’MODE�=�000000‰MOVE.B„(A5),D0‰CMP.B…#'#',D0 ‰BNE.S…EA10 * IMMEDIATE MODE ‰BTST†#11,D7‰BEQ.S…ER5‘.�3,0 ‰MOVE.B„#$3C,D6�D6�=�MODE‚111100 ‰ADD.L…#1,A5 ‰BSR‡EV’EVALUATE�EXPRESSION‰MOVE.L„D0,D5�D5�=�VALUE ‰TST.B…TLSPEC(A1)Š.�1,3.‰BEQ.S…EA0633Ž.SIZE�NOT�SPECIFIED�(.W�ASSUMED) ‰MOVE.W„TLENGTH(A1),D0‰BEQ.S…EA0635Ž.BYTE ‰TST.B…D0‰BMI.S…EA0637Ž.LONG %EA0633ƒBSR‡EA16BIT�.WORD…-32K�TO�+64KEA0634ƒMOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1)ŠBYTE�COUNT‰ADD.L…#2,D3�OFFSET‰RTS EA0635ƒBSR‡EA8BITŽ-127�TO�+255 ‰BEQ‡EA0634ER5†BRA‡ER’.�3,0 EA0637ƒMOVE.L„D5,(A4,D3)‰ADD.B…#4,TNB(A1) ‰ADD.L…#4,D3‰RTS PAGE EA10…DSˆ0‰CMP.B…#'-',(A5) ‰BNE.S…EA11 ‰CMP.B…#'(',1(A5)‰BNE‡EA41�MAY�BE�"- ‰ADD.L…#2,A5)‰MOVE.L„#$0020,D6‹MODE�=�-(A@)„100AAAˆ3,0 ‰BTST†#4,D7"‰BEQ‡ER5‘THIS�MODE�NOT�ALLOWED‰1,2 ‰BSR‡GETREGA‰BNE‡ER5‘.�3,0 ‰OR.W†D0,D6 ‰CMP.B…#')',(A5)+‰BNE.S…ER5‘NO�CLOSING�PARINŽ1,2‰RTS EA11…BSR‡GETREGA�.�3,0 ‰BNE.S…EA21 !‰MOVE.L„#$08,D6�MODE�=�001...‘3,0 ‰BTST†#1,D7‰BEQ.S…ER5‘MODE�NOT�ALLOWEDŽ1,2 ‰OR.W†D0,D6‰RTS EA21…BSR‡GETREGD�.�3,0 ‰BNE.S…EA31 ‰BTST†#0,D7‰BEQ.S…ER5‘MODE�NOT�ALLOWEDŽ1,2 ‰OR.W†D0,D6�MODE�=�D@ƒ000AAA‰RTS PAGEEA31…CMP.B…#'(',D0 ‰BNE.S…EA41 * POSSIBLE*‚(A@)*‚(A@)+#*‚(A@,R@)‚IMPLIED�ZERO�DISPLACEMENT* ‰ADD.L…#1,A5 ‰BSR‡GETREGA‰BNE.S…ER3‘.�3,0 ‰OR.W†D0,D6 ‰MOVE.B„(A5)+,D0‰CMP.B…#',',D0/‰BEQ‡EA5116ŽMODE�=�(A@,R@)‚;IMPLIED�D5�=�0�DATA !‰CMP.B…#')',D0�LOOK�FOR�CLOSING�)‰BNE.S…ER3‘.�1,2 ‰CMP.B…#'�',(A5)‹LOOK�FOR�BLANK‰BEQ.S…EA35�MODE�=�(A@) ‰CMP.B…#'+',(A5) ‰BNE.S…EA35 ‰ADD.L…#1,A5 !‰OR.W†#$18,D6ƒMODE�=�011...„(A@)+ ‰BTST†#3,D7‰BEQ.S…ER3‘MODE�NOT�ALLOWEDŽ1,2 ‰RTS›.�3,0 $EA35…OR.W†#$10,D6�MODE�=�010...ƒ(A@) ‰BTST†#2,D7‰BEQ.S…ER3‘MODE�NOT�ALLOWEDŽ3,0 ‰RTS›.�3,0 PAGE * POSSIBLE*ƒƒSHORT *ƒƒLONG *ƒ(A@)*ƒ(A@,R@)*ƒ(A@,R@.W)*ƒ(A@,R@.L) *ƒ(PC)*ƒ(PC,R@)*ƒ(PC,R@.W)*ƒ(PC,R@.L)* EA41…BSR‡EV’EVALUATE�EXPRESSION‰MOVE.L„D0,D5�D5�=� ‰MOVE.B„(A5),D0‰CMP.B…#',',D0 ‰BEQ.S…EA4102‰CMP.B…#'�',D0 ‰BNE.S…EA4120 *‚‰ONLY* CHECK IF NEGATIVE NUMBEREA4102ƒMOVE.L„D5,D0‰BPL.S…EA4105ŽPOSITIVE�NUMBER‰NOT.L…D0’.�1,3EA4105ƒAND.W…#$8000,D0‹.�1,3 ‰TST.L…D0‰BNE.S…EA4135Ž.LONG *‚.W ‰BTST†#7,D7‰BNE.S…EA4127ŽSHORT�ALLOWED‘1,1‰BTST†#15,D7Ž.�1,1&‰BNE.S…EA4135ŽSPECIAL�CASE�(JMP.L)Š3,0ER3†BRA‡ER’.�3,0 +EA4127ƒOR.W†#$38,D6�EA�=�ABSOULTE�SHORT‹1,1‰MOVE.W„D5,(A4,D3)ŠD5�=�DATA‰ADD.B…#2,TNB(A1)ŠBYTE�COUNT ‰ADD.L…#2,D3‰RTS *EA4134ƒCMP.B…#'L',D0*ˆBNE‡ER3‘.�1,2 *‚.L&EA4135ƒOR.W†#$39,D6�EA�=�ABSOLUTE�LONG‰MOVE.L„D5,(A4,D3)‰ADD.B…#4,TNB(A1)ŠBYTE�COUNT ‰ADD.L…#4,D3 ‰BTST†#8,D7‰BEQ‡ER3‘MODE�NOT�ALLOWEDŽ1,2‰RTS EA4120ƒADD.L…#1,A5�.�1,3‰CMP.B…#'(',D0�.�1,3‰BNE‡ER3‘.�1,2 ‰CMP.B…#'P',(A5) ‰BEQ‡EA61 * (A@.......‰BSR‡EA16BITSŒ-32K�TO�+32K ‰BSR‡GETREGA‰BNE‡ER3‘.�3,0 ‰OR.W†D0,D6 ‰MOVE.B„(A5),D0‰CMP.B…#')',D0 ‰BNE.S…EA5115 * (A@) ‰ADD.L…#1,A5 ‰BTST†#5,D7‰BEQ‡ER3‘MODE�NOT�ALLOWEDŽ1,2 ‰OR.W†#$0028,D6‹MODE�=�101AAA ‰CMP.L…#$10000,D5‰BPL‡ER3‘ERœ1,2 ‰MOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1) ‰ADD.L…#2,D3‰RTS PAGEEA5115ƒBSR‡COMMA -*‚(A@,-----„ADDRESS�REGISTER�WITH�INDEXEA5116ƒEXT.L…D5‰BSR‡EA8BITS�-128�TO�+127‰BNE.S…ER4‘.�1,2‰AND.W…#$00FF,D5‰OR.W†#$0030,D6‹MODE‚110--- ‰BTST†#6,D7‰BEQ.S…ER4‘MODE�NOT�ALLOWEDŽ1,2 ‰BSR‡GETREGAD‰BNE.S…ER4‘.�3,0 ‰OR.W†D1,D0 ‰ROR.W…#4,D0‰OR.W†D0,D5�EXTENSION�WORD * BIT 11 EXTENSION WORD8*ƒ0�=�SIGN�EXTENDED,�LOW�ORDER�INTEGER�IN�INDEX�REGISTER,*ƒ1�=�LONG�VALUE�IN�INDEX�REGISTER‚(DEFAULT)*‰MOVE.B„(A5)+,D0‰CMP.B…#')',D0‰BEQ.S…EA5119ŽDEFAULTƒ.W ‰CMP.B…#'.',D0‰BNE.S…ER4‘.�1,2 ‰MOVE.B„(A5)+,D0‰CMP.B…#'W',D0 ‰BEQ.S…EA5118 ‰CMP.B…#'L',D0 ‰BNE.S…ER4‘NEITHER�.W�NOR�.L�1,2 ,‰OR.W†#$0800,D5‹EXTENSION�WORD,�W/L�BIT�=�.L EA5118ƒCMP.B…#')',(A5)+‰BNE.S…ER4‘NO�CLOSING�")"�1,2 EA5119ƒMOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1) ‰ADD.L…#2,D3EA5119E‚RTS›.�1,2 PAGE*‚(P-----EA61…ADD.L…#1,A5‰CMP.B…#'C',(A5)+ ‰BNE.S…ER4 #‰SUB.L…PCOUNTER(A1),D5…D5�=�D5�-�PC‰SUB.L…#2,D5�D5�=�D5�-�(PC�+�2)*‰SUB.L…D3,D5�ADJUSTMENT�IF�2�WORD�INST…3,0 ‰MOVE.B„(A5)+,D0‰CMP.B…#')',D0 ‰BNE.S…EA71 *‚(PC)‰OR.W†#$3A,D6�MODE�=�111010 ‰BSR.S…EA16BITSŒ-32K�TO�+32K‰MOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1) ‰ADD.L…#2,D3 ‰BTST†#9,D7‰BNE‡EA5119E�.�1,2ER4†BRA‡ER’.�1,2 **‚(PC----ŠPROGRAM�COUNTER�WITH�INDEX#EA71…MOVE.W„#$003B,D6‹MODE�=�111011 ‰CMP.B…#',',D0‰BNE‡ER4‘.�1,2 ‰BTST†#10,D7‰BEQ‡ER4‘MODE�NOT�ALLOWEDŽ1,2 ‰BSR.S…EA8BITS�-128�TO�+127‰BNE‡ER4‘.�1,2 ‰AND.W…#$00FF,D5‹D5�=�VALUE ‰BSR‡GETREGAD‰BNE‡ER4‘.�3,0 ‰OR.W†D1,D0  ‰ROR.W…#4,D0‰OR.W†D0,D5�D5�=�EXTENSION�WORD ‰MOVE.B„(A5)+,D0‰CMP.B…#')',D0‰BEQ.S…EA7115ŽDEFAULT‚.W ‰CMP.B…#'.',D0‰BNE‡ER4‘.�1,2 ‰MOVE.B„(A5)+,D0‰CMP.B…#'W',D0 ‰BEQ.S…EA7113 ‰CMP.B…#'L',D0‰BNE‡ER4‘.�1,2'‰OR.W†#$0800,D5‹EXTENSION�WORD�W/L�=�.L EA7113ƒCMP.B…#')',(A5)+‰BNE‡ER4‘NO�CLOSING�")"�1,2 EA7115ƒMOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1) ‰ADD.L…#2,D3‰RTS PAGEL*****************************************************************************0*ˆROUTINES�TO�TEST�FOR�VALID�EFFECTIVE�ADDRESSES*@*ˆEA16BITƒtests�that�-32768�<=�D5�<=�65535.‚(signed�or�unsigned):*ˆEA16BITS‚tests�that�-32768�<=�D5�<=�32767.‚(signed�only);*ˆEA8BIT„tests�thatƒ-128�<=�D5�<=ƒ255.‚(signed�or�unsigned)5*ˆEA8BITSƒtests�thatƒ-128�<=�D5�<=ƒ127.‚(signed�only)*8*ˆThe�16-bit�tests�branch�to�ER�if�invalid,�else�return.B*ˆThe‚8-bit�tests�return�condition�codes��if�valid,�else�.0*ˆD5�is�preserved�unless�a�branch�to�ER�results.*ˆD1�is�destroyed.*L**************************************************************************** EA16BIT:/‰BSR.S…EA16BITCŒCHECK�RANGE�-32768�TO�32767.‚IF 0‰MOVE.L„D5,D1�INVALID,�CHECK�WHETHER�THE�HIGH�16'‰SWAP†D1’BITS�ARE�0�(WHICH�IMPLIES�THAT,‰TST.W…D1’D5�<=�65535).‚IF�NOT,�FALL�THRU�TO,‰BEQ.S…EASEX�THE�16-BIT�SIGNED�TEST--WE�WILL*§FAIL�AND�GO�TO�ER. EA16BITS:.‰PEA‡ER(PC)ŽSET�UP�TO�RETURN�TO�ER�IF�INVALID. (EA16BITC�MOVE.L„#$7FFF,D1‹D1‚<--‚2^16-1.)‰BRA.S…EAS‘GO�TO�THE�COMMON�TEST�ROUTINE.  EA8BIT:3‰BSR.S…EA8BITC�CHECK�RANGE�-128�TO�127.‚IF�INVALID,0‰MOVE.L„D5,D1�CHECK�WHETHER�THE�HIGH�24�BITS�ARE.‰LSR.L…#8,D1�0�(WHICH�IMPLIES�THAT�D5�<=�255).‰RTS›* EA8BITS:0‰BSR.S…EA8BITC�JUST�CHECK�FOR�-127�<=�D5�<=�128.(‰RTS›(BSR�PUTS�NEEDED�ADDRESS�ON�STACK!) &EA8BITC‚MOVE.L„#$7F,D1�D1‚<--‚2^8�-�1. 1*’***�NOTE:�THIS�ROUTINE�PLAYS�WITH�THE�STACK�***8EAS†CMP.L…D1,D5�IF�D5�>�2^N-1,�RETURN�WITH��(INVAL).‰BGT.S…EASEX�*1‰NOT.L…D1’IF�D5�<�-2^N,‚RETURN�WITH��(INVAL).‰CMP.L…D1,D5�*‰BLT.S…EASEX�* 2‰ADD.L…#4,A7�POP�THE�RETURN�ADDRESS�OFF�THE�STACK,'‰CLR.L…D1’SET��(VALID),�AND�RETURN. EASEX„RTS›* PAGE ADR†MACRO‰DC.W†M\1-XBASE‰ENDM TBLKEYS‚DSˆ0‰INDEX‰ADR‡ABCD†0‚ABCD�SBCD‰ADR‡ADD‡1‚ADD‚SUB‰ADR‡ADDA†2‚ADDA�CMPA�SUBA‰ADR‡ADDI†3‚ADDI�CMPI�SUBI‰ADR‡ADDQ†4‚ADDQ�SUBQ‰ADR‡ADDX†5‚ADDX�SUBX‰ADR‡AND‡6‚AND‚OR‰ADR‡ASL‡7‚ASL‚LSL�ROL�ROXL‰ADR‡DBCC†8‚DBCC‰ADR‡BCHG†9‚BCHG‰ADR‡BRA‡10‚BRA‚BSR‚BCC‰ADR‡BSET†11‚BSET#‰ADR‡CHK‡12‚CHK‚DIVS�DIVU�MILS�MULU ‰ADR‡CLR‡13‚CLR�NEG�NEGX�NOT�TST‰ADR‡CMPM†14‚CMPM‰ADR‡MOVEQ…15‚MOVEQ‰ADR‡EXG‡16‚EXG‰ADR‡EXT‡17‚EXT‰ADR‡JMP‡18‚JMP‚JSR‰ADR‡LEA‡19‚LEA‰ADR‡LINK†20‚LINK‰ADR‡MOVE†21‚MOVE)‰ADR‡CMMD2…22‚NOP�RESET�RTE�RTR�RTS�TRAPV‰ADR‡STOP†23‚STOP‰ADR‡SWAP†24‚SWAP‰ADR‡TRAP†25‚TRAP‰ADR‡UNLK†26‚UNLK‰ADR‡MOVEM…27‚MOVEM‰ADR‡ANDI†28‚ANDI�EORI�ORI‰ADR‡SCC‡29‚NBCD�SCC�TAS‰ADR‡BCLR†30‚BCLR‰ADR‡BTST†31‚BTST‰ADR‡MOVEA…32‚MOVEA‰ADR‡MOVEP…33‚MOVEP‰ADR‡CMP‡34‚CMP‰ADR‡EOR‡35‚EOR‰ADR‡PEA‡36‚PEA‰ADR‡DCˆ37‚DC.W‰ADR‡MOVEC…38‚MOVEC�68010™3,0‰ADR‡MOVES…39‚MOVES�68010™3,0‰ADR‡RTD‡40‚RTDƒ68010™3,0‰PAGE7* \1,\2 = MNEUMONIC (\2 SIGN BIT SET AS LAST CHARACTER)*�\3„=�INDEX�TO�TABLKEYS* \4,\5 = FIRST WORD MASK%*�\6„=�NO�OPERAND�ALLOWED�IF�SIGN�SET&*�\7„=�.S�ALLOWED�(.W�NOT�ALLOWED) 1,2 OPC†MACRO‰DC.B†'\1','\2'+128‰DC.B†\3+\6+\7,$\4,$\5‰ENDM "NOC†EQU‡128‘(BIT�7�SET)�NO�OPERAND)NW‡EQU‡$40‘(BIT�6�SET)�.W�NOT�ALLOWED„1,2!TBLOPCƒOPC‡ABC,D,0,C1,00,0,0…ABCD‰OPC‡ADD,A,2,D0,C0,0,0…ADDA‰OPC‡ADD,I,3,06,00,0,0…ADDI‰OPC‡ADD,Q,4,50,00,0,0…ADDQ‰OPC‡ADD,X,5,D1,00,0,0…ADDX‰OPC‡AD,D,1,D0,00,0,0†ADD‰OPC‡AND,I,28,02,00,0,0„ANDI‰OPC‡AN,D,6,C0,00,0,0†AND‰OPC‡AS,L,7,E1,00,0,0†ASL‰OPC‡AS,R,07,E0,00,0,0…ASR‰OPC‡BR,A,10,60,00,0,NW„BRA‰OPC‡BH,I,10,62,00,0,NW†BHI‰OPC‡BL,S,10,63,00,0,NW†BLS‰OPC‡BC,C,10,64,00,0,NW†BCC‰OPC‡BC,S,10,65,00,0,NW†BCS‰OPC‡BN,E,10,66,00,0,NW†BNE‰OPC‡BE,Q,10,67,00,0,NW†BEQ‰OPC‡BV,C,10,68,00,0,NW†BVC‰OPC‡BV,S,10,69,00,0,NW†BVS‰OPC‡BP,L,10,6A,00,0,NW†BPL‰OPC‡BM,I,10,6B,00,0,NW†BMI‰OPC‡BG,E,10,6C,00,0,NW†BGE‰OPC‡BL,T,10,6D,00,0,NW†BLT‰OPC‡BG,T,10,6E,00,0,NW†BGT‰OPC‡BL,E,10,6F,00,0,NW†BLE‰OPC‡BCH,G,9,01,40,0,0…BCHG$‰OPC‡BCL,R,30,01,80,0,0„BCLR†DYNAMIC‰OPC‡BSE,T,11,01,C0,0,0„BSET‰OPC‡BS,R,10,61,00,0,NW„BSR‰OPC‡BTS,T,31,01,00,0,0„BTST‰OPC‡B,T,10,60,00,0,NW†BT‰OPC‡CH,K,12,41,80,0,0…CHK‰OPC‡CL,R,13,42,00,0,0…CLR‰OPC‡CMP,A,2,B0,C0,0,0…CMPA‰OPC‡CMP,I,3,0C,00,0,0…CMPIš1,1‰OPC‡CMP,M,14,B1,08,0,0„CMPM‰OPC‡CM,P,34,B0,00,0,0†CMP‰OPC‡DB,T,8,50,C8,0,NW…DBT‰OPC‡DB,F,8,51,C8,0,NW…DBF‰OPC‡DBR,A,8,51,C8,0,NW„DBRA‰OPC‡DBH,I,8,52,C8,0,NW„DBHI‰OPC‡DBL,S,8,53,C8,0,NW„DBLS‰OPC‡DBC,C,8,54,C8,0,NW„DBCC‰OPC‡DBC,S,8,55,C8,0,NW„DBCS‰OPC‡DBN,E,8,56,C8,0,NW„DBNE‰OPC‡DBE,Q,8,57,C8,0,NW„DBEQ‰OPC‡DBV,C,8,58,C8,0,NW„DBVC‰OPC‡DBV,S,8,59,C8,0,NW„DBVS‰OPC‡DBP,L,8,5A,C8,0,NW„DBPL‰OPC‡DBM,I,8,5B,C8,0,NW„DBMI‰OPC‡DBG,E,8,5C,C8,0,NW„DBGE‰OPC‡DBL,T,8,5D,C8,0,NW„DBLT‰OPC‡DBG,T,8,5E,C8,0,NW„DBGT‰OPC‡DBL,E,8,5F,C8,0,NW„DBLE(‰OPC‡DC.,W,37,00,00,0,0„DC.W‚(WORD�ONLY)‰OPC‡DIV,S,12,81,C0,0,0„DIVS ‰OPC‡DIV,U,12,80,C0,0,0„DIVU‰OPC‡EOR,I,28,0A,00,0,0„EORI‰OPC‡EO,R,35,B1,00,0,0†EOR‰OPC‡EX,G,16,C1,00,0,0…EXG‰OPC‡EX,T,17,48,00,0,0…EXT‰OPC‡JM,P,18,4E,C0,0,NW„JMP‰OPC‡JS,R,18,4E,80,0,NW„JSR‰OPC‡LE,A,19,41,C0,0,0…LEA‰OPC‡LIN,K,20,4E,50,0,0„LINK‰OPC‡LS,L,7,E3,08,0,0†LSL‰OPC‡LS,R,07,E2,08,0,0…LSR‰OPC‡MOVE,A,32,00,04,0,0ƒMOVEA‰OPC‡MOVE,M,27,48,80,0,0ƒMOVEM‰OPC‡MOVE,P,33,01,08,0,0ƒMOVEP‰OPC‡MOVE,Q,15,70,00,0,0ƒMOVEQ‰OPC‡MOV,E,21,00,00,0,0„MOVE‰OPC‡MUL,S,12,C1,C0,0,0„MULS‰OPC‡MUL,U,12,C0,C0,0,0„MULU‰OPC‡NBC,D,29,48,0,0,0…NBCD‰OPC‡NEG,X,13,40,00,0,0„NEGX‰OPC‡NE,G,13,44,00,0,0…NEG‰OPC‡NO,P,22,4E,71,NOC,0ƒNOP‰OPC‡NO,T,13,46,00,0,0…NOT‰OPC‡OR,I,28,00,00,0,0…ORI‰OPC‡O,R,6,80,00,0,0‡OR‰OPC‡PE,A,36,48,40,0,0…PEA ‰OPC‡RESE,T,22,4E,70,NOC,0�RESET‰OPC‡RO,L,7,E7,18,0,0†ROL‰OPC‡RO,R,07,E6,18,0,0…ROR‰OPC‡ROX,L,7,E5,10,0,0…ROXL‰OPC‡ROX,R,07,E4,10,0,0„ROXR‰OPC‡RT,E,22,4E,73,NOC,0ƒRTE‰OPC‡RT,R,22,4E,77,NOC,0ƒRTR‰OPC‡RT,S,22,4E,75,NOC,0ƒRTS‰OPC‡SBC,D,0,81,00,0,0…SBCD‰OPC‡S,F,29,51,C0,0,0†SF‰OPC‡SH,I,29,52,C0,0,0…SHI‰OPC‡SL,S,29,53,C0,0,0…SLS‰OPC‡SC,C,29,54,C0,0,0…SCC‰OPC‡SC,S,29,55,C0,0,0…SCS‰OPC‡SN,E,29,56,C0,0,0…SNE‰OPC‡SE,Q,29,57,C0,0,0…SEQ‰OPC‡SV,C,29,58,C0,0,0…SVC‰OPC‡SV,S,29,59,C0,0,0…SVS‰OPC‡SP,L,29,5A,C0,0,0…SPL‰OPC‡SM,I,29,5B,C0,0,0…SMI‰OPC‡SG,E,29,5C,C0,0,0…SGE‰OPC‡SL,T,29,5D,C0,0,0…SLT‰OPC‡SG,T,29,5E,C0,0,0…SGT‰OPC‡SL,E,29,5F,C0,0,0…SLE‰OPC‡STO,P,23,4E,72,0,0„STOP‰OPC‡S,T,29,50,C0,0,0†ST‰OPC‡SUB,A,2,90,C0,0,0…SUBA‰OPC‡SUB,I,3,04,00,0,0…SUBI‰OPC‡SUB,Q,4,51,00,0,0…SUBQ‰OPC‡SUB,X,5,91,00,0,0…SUBX‰OPC‡SU,B,1,90,00,0,0†SUB‰OPC‡SWA,P,24,48,40,0,0„SWAP‰OPC‡TA,S,29,4A,C0,0,0…TAS™1,2 ‰OPC‡TRAP,V,22,4E,76,NOC,0�TRAPV‰OPC‡TRA,P,25,4E,40,0,0„TRAP‰OPC‡TS,T,13,4A,00,0,0…TST‰OPC‡UNL,K,26,4E,58,0,0„UNLKTBLOP00‚DS.B†0“.�3,0TBLOP08‚DS.B†0“.�3,0"‰OPC‡MOVE,C,38,4E,7A,0,0�MOVEC™3,0"‰OPC‡MOVE,S,39,0E,00,0,0�MOVES™3,0‰OPC‡RT,D,40,4E,74,0,0ƒRTD›3,0TBLOP10‚DS.B†0“.�3,0TBLOP20‚DS.B†0“.�3,0 4TBLOPAD‚DC.L†TBLOP00�TABLE�OF�'END-OFTABLE'�ADDRƒ3,0‰DC.L†TBLOP08�.�3,0‰DC.L†TBLOP10�.�3,0‰DC.L†TBLOP20�.�3,0 TBLOPEƒDS.B†0 PAGE%CODE68K‚CLR.L…D3’Entry�68000�onlyŽ3,0 SPC 1*CODE68M‚DS.W†0“Entry�68000/68008/68010‡3,0 SPC 1‰LINK†A1,#0-(ESKE-ESKB)ƒ.�3,0 ‰MOVE.L„A1,LINK(A7)‰SAVE�LINKAGE(‰MOVE.L„A7,A1�A1�=�BASE�REGISTER�TO�DATA-‰MOVE.W„D3,PRTYPE(A1)‡PROCESSOR�TYPE�CODE‹3,0 %‰MOVE.L„#1,D7�POSSIBLE�ERROR�CODE‹3,0 ‰CMP.W…#TBLOPE-TBLOPAD,D3‚.�3,0‰BGE‡ER’TYPE�OUT�OF�RANGE�3,0 ‰MOVE.L„A6,-(A7)ŒSAVE�A6—3,1)‰LEA‡TBLOPAD(PC),A6†GET�TABLE�ADDRESS�3,13‰LEA‡TBLOP00(PC),A0†GET�FIRST�ENTRY�PC�RELATIVEƒ3,1‰MOVE.L„A0,(A6)+ŒSTORE�IT.•3,14‰LEA‡TBLOP08(PC),A0†GET�SECOND�ENTRY�PC�RELATIVE‚3,1‰MOVE.L„A0,(A6)+ŒSTORE�IT.•3,13‰LEA‡TBLOP10(PC),A0†GET�THIRD�ENTRY�PC�RELATIVEƒ3,1‰MOVE.L„A0,(A6)+ŒSTORE�IT.•3,12‰LEA‡TBLOP20(PC),A0†GET�LAST�ENTRY�PC�RELATIVE„3,1‰MOVE.L„A0,(A6)+ŒSTORE�IT.•3,1‰MOVE.L„(A7)+,A6ŒRESTORE�A6”3,1 +‰MOVE.B„#'�',(A6)‹INSURE�LAST�CHAR�IS�SPACE ‰MOVE.L„A3,A0‰MOVE.L„#OUTBSIZE-1,D0(M300…MOVE.B„#'�',(A0)+ŠSPACE�FILL�BUFFER ‰DBRA†D0,M300 ‰SUB.L…#2,A0+‰MOVE.L„A0,PTRBUFE(A1)†PTR�TO�END�OF�BUFFER !‰MOVE.L„A4,PCOUNTER(A1)…FORMAT�PC‰MOVE.L„A4,D4�D4�=�P-COUNTER ‰MOVE.L„A4,D0 ‰MOVE.L„A6,-(A7)ŒSAVE�A6—1,1 ‰MOVE.L„A3,A6#‰BSR‡FRELADDRŒFORM�RELATIVE�ADDRESS‰MOVE.L„(A7)+,A6ŒRESTORE�A6”1,1 ‰MOVE.L„A4,D0 ‰ROR.L…#1,D0‰BMI‡ERDONEŽPC�ODD�ADDRESS #‰MOVE.L„#FOL,D7�POSSIBLE�ERROR�CODE‰CMP.B…#'�',(A5)+‰BNE‡ERDONEŽ1ST�CHAR�NOT�SPACE !‰MOVE.B„#2,TNB(A1)ŠINZ�#�OF�BYTES,‰MOVE.W„#$40,TLENGTH(A1)„SIZE�=�.W�(DEFAULT).‰CLR.B…TLSPEC(A1)ŠDEFAULT�(SIZE�NOT�SPECIFIED) (‰LEA.L…FOC(A3),A0ŠA0�=�STORE�ADDRESSŒ3,0 %M340…BSR‡GETCHARFŒGET�PAST�SPACES�1,1‰CMP.B…#'�',D0 ‰BEQ‡M340 ‰SUB.L…#1,A5�FORMAT�OP-CODEM350…BSR‡GETCHARFŒ.�1,1‰MOVE.B„D0,(A0)+‰CMP.B…#'.',D0 ‰BNE.S…M352 '‰MOVE.B„(A5),TLSPEC(A1)…NOT�DEFAULT“1,2‰CMP.B…#'W',(A5) ‰BEQ.S…M352‰CMP.B…#'S',(A5)‰BEQ.S…M352�.SHORT�=�.WORD‰CLR.W…TLENGTH(A1) ‰CMP.B…#'B',(A5)‰BEQ.S…M352�SIZE�=�.W‰MOVE.W„#$80,TLENGTH(A1)‰CMP.B…#'L',(A5)‰BNE‡ERF‘.�1,1 M352…CMP.B…#'�',D0‰BNE‡M350�NOT�SPACE�CONTINUE * SEARCH OP-CODE TABLE2‰LEA.L…TBLOPC(PC),A0‡A0�=�PTR�TO�TABLE�OF�OP-CODES‰LEA.L…TBLOPAD(PC),A4†.�3,0‰MOVE.W„PRTYPE(A1),D0‡.�3,0.‰MOVE.L„(A4,D0.W),A4ˆA4�=�PTR�END�OF�CODES‰3,0 *®A3�=�START�OF�STORE�BUFFER8M410…LEA.L…FOC(A3),A2ŠA2�=�PTR�TO�OP-CODE�JUST�FORMATTED M415…MOVE.B„(A0)+,D0ŒXXXXXXDD ‰EXT.W…D0’XXXXSSDD‚SIGN�EXTENDED‰AND.B…#$7F,D0‰CMP.B…(A2)+,D0‰BNE.S…M420�NON-MATCH ‰TST.W…D0‰BPL‡M415�SIGN�RESET;�CONTINUE‰BRA.S…M430�MATCH�COMPLETE #M420…TST.W…D0’SEQUENCE�TO�NEXT�CODE ‰BMI.S…M426M424…MOVE.B„(A0)+,D0‰BPL‡M424�FINISH�THIS�OP-CODE$M426…ADD.L…#3,A0�ADJUST�PTR�TO�TABLE‰CMP.L…A4,A0�.�3,0!‰BCS‡M410�MORE�TABLE�TO�CHECK‹3,0 M428…MOVE.L„#FOC,D7�ERROR�CODE ‰BRA‡ERDONE * GET GOTO INDEX* GET FIRST WORD MASK*M430…MOVE.B„(A2),D0�MUST�TERMINATE�OP-CODE#‰CMP.B…#'�',D0�WITH�SPACE�OR�PERIOD ‰BEQ.S…M432‰CMP.B…#'.',D0‰BNE‡M426�KEEP�LOOKING’3,0M432 ‰CLR.L…D0 ‰MOVE.B„(A0)+,D0ŒD0�=‚KEYS‚INDEX‰MOVE.B„D0,D1�D1�=‚KEYS�(INDEX)‰AND.B…#$3F,D0�D0�=ˆINDEX�1,2‰ASL.L…#1,D0�INDEX�*�TWO“1,2‰MOVE.B„(A0)+,D2 ‰LSL.W…#8,D2%‰MOVE.B„(A0)+,D2ŒD2�=�FIRST�WORD�MASK‰MOVE.W„D2,TDATA(A1) *�INSURE�.S�.W�MATCH�OP-CODE©1,2+‰MOVE.B„TLSPEC(A1),D3‡D3�=�.n�SPECIFIED�1,2‰BEQ.S…M4326�NOT�SPECIFIED‘1,2‰BTST†#6,D1�.�1,2,‰BEQ.S…M4324�.W�ALLOWED�(.S�NOT�ALLOWED)ƒ1,2‰CMP.B…#'W',D3�.�1,2‰BEQ‡M428�.W�NOT�ALLOWED�1,2‰CMP.B…#'B',D3�.�1,2‰BEQ‡M428�.B�NOT�ALLOWED�1,2‰BRA.S…M4326�.�1,2 M4324„CMP.B…#'S',D3«1,2‰BEQ‡M428�.S�NOT�ALLOWED�1,2M4326 * CALCULATE GOTO ADDRESS$‰LEA‡TBLKEYS(PC),A0†A0�=�PTR�TO�KEYS%‰MOVE.W„(A0,D0),D0ŠD0�=�16�BIT�OFFSET#‰LEA‡XBASE(PC),A2ˆA2�=�BASE�ADDRESS(‰ADD.L…D0,A2�A2�=�COMPUTED�GO�TO‚ADDRESS * FORMAT OPERAND IF REGUIRED‰TST.B…D1’LOOK�AT�KEY ‰BMI.S…M440�OPERAND�NOT�REQUIRED #‰LEA.L…FOP(A3),A0ŠSTORE�POINTER‘3,02‰MOVE.L„A0,PTROP(A1)ˆPOINTER�TO�OPERAND�(FORMATED)!M435…BSR.S…GETCHARFŒD0�=�CHAR•1,1‰CMP.B…#'�',D0‰BEQ‡M435�SKIP�SPACES -M437…MOVE.B„D0,(A0)+ŒMOVE�REST�OF�SOURCE�LINE‰BSR.S…GETCHARFŒD0�=�CHAR•1,1‰CMP.L…A5,A6�.�1,1‰BPL‡M437�.�1,15‰MOVE.L„A0,PTRBUFE(A1)†POINTER�TO�END�FORMATED�SOURCE+‰MOVE.L„A0,A6�A6�=�POINTER�TO�END�OF�SOURCEM440 (‰MOVE.L„PTROP(A1),A5ˆA5�=�PTR�TO�OPERAND1‰LEA‡TDATA+2(A1),A4ŒA4�=�BASE�ADDR�FOR�DATA�STORE$‰CLR.L…D3’D3�=�OFFSET�FOR�DATA�STORE‰JMP‡(A2)�GOTO�ROUTINE *¦D2�=�MASK*¦D4�=�P-COUNTER PAGESPACETƒCMP.B…#'�',(A5)‹.�3,0"‰BNE.S…ER’NOT�SPACE�TERMINATORŠ3,0 ‰RTS›.�3,0 COMMA„CMP.B…#',',(A5)+‰BNE.S…ER’NOT�COMMA‰RTS GETCHAR‚CMP.L…A5,A6 ‰BMI.S…ER‰MOVE.B„(A5)+,D0‰RTS GETCHARF�CMP.L…A5,A6�.�1,1 ‰BMI.S…ERF‰MOVE.B„(A5)+,D0‰RTS ERF†MOVE.L„A0,A5�.�1,1 ER‡MOVE.L„A5,D7�D7�=�ERROR�FLAG"‰SUB.L…A3,D7�..&�POSITION�OF�ERROR&ERDONEƒCLR.L…D6’D6�=�(ZERO)�BYTE�COUNT ‰BRA.S…CMMD35 SPC 2.CMMD2„BSR‡SPACETŽLOOK�FOR�SPACE�TERMINATOR…3,0 MCMMD2ƒDSˆ0“NO�OPERAND�SEQUENCE‰MOVE.W„D2,TDATA(A1) *„FORMAT�DATA�FIELD'‰MOVE.B„TNB(A1),D3ŠD3�=�NUMBER�OF�BYTES"‰MOVE.L„D3,D6�D6�=�NUMBER�OF�BYTES&‰LEA‡TDATA(A1),A2ˆA2�=�PTR�TO�HEX�DATA&‰LEA.L…FDATA(A3),A6ˆA6�=�STORE�PTR�3,0FPR315ƒMOVE.B„(A2)+,D0 ‰BSR‡PNT2HX ‰SUB.L…#1,D3‰BNE‡FPR315ŽMORE�BYTES ‰CLR.L…D7’RESET�ERROR�FLAG +CMMD35ƒMOVEM.LƒTDATA(A1),D0-D2…D0-D2�=�DATA 4‰MOVE.L„PTRBUFE(A1),A6†A6�=�POINTER�TO�END�OF�BUFFER '‰MOVE.L„PCOUNTER(A1),A4…A4�=�ORGINAL�PC ‰MOVE.L„LINK(A1),A1‰UNLK†A1‰RTS›RETURN�TO�REQUESTOR!*¦A3�=�POINTER�TO�START�OF�BUFFER *¦D6�=�NUMBER�OF�BYTES�ASSEMBLED*¦D7�=�ERROR�FLAG�(POSITION)  PAGE *‚SIZE�=�BYTE*„DY,DX *„-(AY),-(AX)*„....RX@.SS...RY@MABCD„DSˆ0“(INDEX�0)�ABCD�SBCD‰TST.B…TLSPEC(A1)!‰BEQ.S…MABCD9ŽDEFAULT�SIXE�=�BYTE‰TST.W…TLENGTH(A1)‰.�3,0‰BNE‡ER’NOT�.BMABCD9 ‰MOVE.L„#$11,D7�.�3,0‰BSR‡EA ‰BSR‡COMMA ‰MOVE.L„D6,D0 ‰AND.W…#7,D0 ‰OR.W†D0,D2 ‰BTST†#5,D6  ‰BEQ.S…MABCD55�D@,D@�MODE ‰OR.W†#$0008,D2‹-(A@),-(A@)�MODE ‰MOVE.L„#$10,D7�.�3,0‰BSR‡EA ‰AND.W…#7,D6 ‰ROR.W…#7,D6 ‰OR.W†D6,D2 ‰BRA‡CMMD2 MABCD55‚BSR‡GETREGD�D@,D@‰BNE‡ER ‰ROR.W…#7,D0 ‰OR.W†D0,D2CMMD2S10�BRA‡CMMD2  PAGEMCMP…DSˆ0“(INDEX�34) ‰BSR‡EAALL‰MOVE.L„D6,D4�D4�=�SOURCE�MODE ‰BSR.S…COMMAS20 ‰CMP.B…#'A',(A5)‰BEQ‡MADDA21�DESTINATION�=�A@ ‰CMP.B…#$3C,D4&‰BEQ.S…MCMP56ŽSOURCE‚....I‚#,... ‰BSR‡FSIZE ‰MOVE.L„#$009,D7Œ.�3,0‰BSR‡EA’D@�+�(A@)+‰MOVE.L„D6,D0�MMMRRR‰AND.W…#$38,D0�MMM... ‰BEQ.S…MCMP39ŽDESTINATION‚D@ ‰CMP.B…#$18,D0‰BNE‡ER ‰AND.W…#$F,D6Ž(AY)+,(AX)+“1,2‰ROR.W…#7,D6­1,2 ‰OR.W†D6,D2�....AX@.........Ž1,2$‰OR.W†#$0100,D2‹...1AX@.........Ž1,2 ‰MOVE.L„D4,D0‰AND.W…#$38,D0‰CMP.W…#$18,D0‰BNE‡ER’NOT�(A@)+"‰AND.W…#$F,D4Ž............1AY@Ž1,2 ‰OR.W†D4,D2‰BRA‡CMMD2S10ŒCMMD2 *‚,D@MCMP39ƒROR.W…#7,D6 ‰OR.W†D6,D2 ‰OR.W†D4,D2‰BRA.S…CMMD2S11 0MCMP56ƒMOVE.W„#$0C00,D2‹#,†MASK�=�CMPI ‰BSR‡FSIZE ‰BSR‡EADA ‰OR.W†D6,D2CMMD2S11�BRA‡CMMD2S10 COMMAS20�BRA‡COMMA PAGEMADD…DSˆ0“(INDEX�1) ‰BSR‡EAALL‰MOVE.L„D6,D4�D4�=�SOURCE�MODE ‰BSR‡COMMAS20 ‰CMP.B…#'A',(A5)‰BEQ‡MADDA21�DESTINATION�=�A@ ‰CMP.B…#$3C,D4&‰BEQ.S…MADD56ŽSOURCE‚....I‚#,... ‰BSR‡FSIZE ‰MOVE.W„#$1FF,D7‰BSR‡EA’ALTERABLE�+�D@‰MOVE.L„D6,D0�MMMRRR‰AND.W…#$38,D0�MMM... ‰BNE.S…MADD46ŽDESTINATION�NOT‚D@ *‚,D@ ‰ROR.W…#7,D6 ‰OR.W†D6,D2 ‰OR.W†D4,D2 ‰BRA‡CMMD2S11 MADD46ƒDSˆ0“D@,‰OR.W†#$100,D2 ‰ROR.W…#7,D4‰OR.W†D4,D2��AS�DESTINATION ‰OR.W†D6,D2�D@‚AS�SOURCE ‰BRA‡CMMD2S11 MADD56ƒMOVE.L„D2,D0�#,‰MOVE.W„#$0600,D2‹MASK�=�ADDI ‰CMP.W…#$D000,D0 ‰BEQ.S…MADD58‰MOVE.W„#$400,D2ŒMASK�=�SUBIMADD58 ‰BSR‡FSIZE ‰BSR‡EADA�DATA�ALTERABLE�ONLY ‰OR.W†D6,D2 ‰BRA‡CMMD2S11 PAGE(MADDI„MOVE.L„PTROP(A1),A5ˆ(INDEX�3)�CMPI ‰BSR‡FSIZE ‰BSR‡EAZ ‰BSR‡COMMAS20 ‰BSR‡EADA�DATA�ALTERABLE�ONLY ‰OR.W†D6,D2CMMD2S12�BRA‡CMMD2S11 PAGE*‚SIZE�=‚BYTE,�WORD,�LONG *‚#,SR"*‚#,„DATA�ALTERABLE�ONLY#MANDI„DSˆ0“(INDEX�28)�ANDI�EORI�ORI ‰BSR‡FSIZE ‰BSR‡EAZ ‰BSR‡COMMAS20 ‰BSR‡GETREGSRŒLOOK�FOR�"SR’3,0‰BEQ.S…MANDI23 ‰BSR‡GETREGCRŒLOOK�FOR�"CCR"�3,0‰BEQ.S…MANDI43�FOUND�CCR•3,0 ‰BSR‡EADA ‰OR.W†D6,D2‰BRA‡CMMD2S12ŒCMMD2 SPC 3'MANDI23‚BSR‡SIZEWORDŒWORD�SIZE�ONLY�3,0 !‰OR.W†#$003C,D2‹SR�/�CCR‚MASK�3,0*‰ADD.L…#2,A5�POINTER�TO�END�OF�OPERAND…1,2‰BRA‡CMMD2S12ŒCMMD2 'MANDI43‚BSR‡SIZEBYTEŒBYTE�SIZE�ONLY�3,0‰BRA‡CMMD2S12ŒCMMD2™3,0 PAGEMADDA„DSˆ0“(INDEX�2) ‰BSR‡EAALL ‰OR.W†D6,D2 ‰BSR‡COMMA MADDA21‚OR.W†D6,D2‰MOVE.W„TLENGTH(A1),D0‰BEQ.S…ER9‘.BYTE�NOT�ALLOWED‰LSL.W…#1,D0�.W�=�011......‰OR.W†#$00C0,D0‹.L�=�111...... ‰OR.W†D0,D2 ‰BSR‡GETREGA‰BNE.S…ER9‘.�3,0 ‰ROR.W…#7,D0 ‰OR.W†D0,D2CMMD2S13�BRA‡CMMD2S12ŒCMMD2™3,0 PAGEMADDQ„DSˆ0“(INDEX�4) ‰BSR‡FSIZE ‰BSR‡GETIMM ‰TST.L…D0‰BEQ.S…ER9‘DATA�=�ZERO ‰CMP.B…#9,D0‰BPL.S…ER9‘VALUE�TOO�BIG‰AND.W…#$7,D0ŽMAKE�8�=�0$‰ROR.W…#7,D0�SHIFT�DATA�TO�BITS�9-11 ‰OR.W†D0,D2 ‰BSR‡COMMA ‰BSR‡EAA‘ALTERABLE�ADDRESSING ‰OR.W†D6,D2 ‰MOVE.L„D2,D0‰AND.W…#$C0,D0‰BNE‡CMMD2S13ŒCMMD2™3,0 0* BYTE SIZE; ADDRESS REGISTER DIRECT NOT ALLOWED ‰MOVE.L„D2,D0‰AND.W…#$38,D0‰CMP.B…#$08,D0‰BNE‡CMMD2S13ŒCMMD2™3,0ER9†BRA‡ER’.�3,0 PAGE* SIZE = BYTE, WORD, LONG*„DY,DX *„-(AY),-(AX)*„....RX@.SS...RY@MADDX„DSˆ0“(INDEX�5) ‰BSR‡FSIZE ‰MOVE.L„#$11,D7�.�3,0‰BSR‡EA ‰BSR‡COMMA ‰MOVE.L„D6,D0 ‰AND.W…#7,D0 ‰OR.W†D0,D2 ‰BTST†#5,D6‰BEQ.S…MADDX5ŽD@,D@�MODE ‰OR.W†#$0008,D2‹-(A@),-(A@)�MODE ‰MOVE.L„#$10,D7�.�3,0‰BSR‡EA ‰AND.W…#7,D6 ‰ROR.W…#7,D6 ‰OR.W†D6,D2CMMDS14‚BRA‡CMMD2S13ŒCMMD2 MADDX5ƒBSR‡GETREGD�D@,D@‰BNE‡ER9‘.�3,0 ‰ROR.W…#7,D0 ‰OR.W†D0,D2CMMD2S14�BRA‡CMMD2 SPC 2(A5TODEST�CLR.L…D1’MOVE�A5�TO�DESTINATIONA5300„BSR‡GETCHAR‰CMP.B…#'(',D0   ‰BNE.S…A5305 ‰MOVE.L„D0,D1A5305„CMP.B…#')',D0 ‰BEQ‡A5TODEST‰CMP.B…#',',D0 ‰BNE‡A5300‰TST‡D1 ‰BNE‡A5300‰RTS PAGE*‚SIZE�=�BYTE,�WORD,�LONG*‰,D@…[‚D@,D@�ALLOWED‚]œ3,0#*‰D@,…[‚D@,D@�NOT�ALLOWED‚]˜3,0MAND…BSR‡FSIZE�(INDEX�6) ‰CMP.B…#'#',(A5) ‰BEQ.S…MAND90 %‰BSR‡A5TODESTŒLOOK�AT�DESTINATION‹3,0‰BSR‡GETREGD�.�3,0‰BEQ.S…MAND77Ž.�3,0 %‰OR.W†#$0100,D2ŒD@,‚DIRECTION�BIT 0‰MOVE.L„PTROP(A1),A5ˆA5�=�POINTER�TO�OPERAND‡3,0‰BSR‡GETREGD�.�3,0 ‰BNE‡ER’.�3,0 ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BSR‡COMMA ‰BSR‡EAM‘ALTERABLE�MEMORY ‰OR.W†D6,D2CMMDS215�BRA‡CMMD2S14ŒCMMD2 MAND77ƒROR.W…#7,D0�,D@—3,0‰OR.W†D0,D2�DESTINATION“3,0 0‰MOVE.L„PTROP(A1),A5ˆA5�=�POINTER�TO�OPERAND‡3,0)‰BSR‡EADADDR�DATA�ADDRESSING�(SOURCE)†3,0 ‰OR.W†D6,D2 ‰BSR‡COMMA�.�3,0‰BRA‡MCMMD2Ž.�3,0 MAND90ƒAND.W…#$F000,D2‰CMP.W…#$C000,D2‰BEQ.S…MAND97�AND%‰MOVE.L„#$0000,D2‹CHANGE�TO�"ORI"�3,0MAND91ƒBRA‡MANDI(MAND97ƒMOVE.W„#$0200,D2‹CHANGE�TO�"ADDI" ‰BRA‡MAND91 PAGEMEOR…BSR‡FSIZE�(INDEX�35) ‰CMP.B…#'#',(A5) ‰BEQ.S…MEOR90 ‰BSR‡GETREGD ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BSR‡COMMA #‰BSR‡EADA�DATA�ALTERABLE�ADDRESSING ‰OR.W†D6,D2CMMD2S15�BRA‡CMMD2S14ŒCMMD2 2MEOR90ƒMOVE.L„PTROP(A1),A5ˆA5�=�POINTER�TO�OPERAND"‰MOVE.W„#$0A00,D2‹CHANGE�TO�"EORI" ‰BRA‡MANDI PAGEMASL…DSˆ0“(INDEX�7)*‰ASL…LSL…ROL…ROXL*‚MASKS‚E000„E008„E018„E010"*‰E0C0„E2C0„E6C0„E4C0ƒSHIFT�MEMORY ‰BSR‡FSIZE ‰MOVE.B„(A5)+,D0‰CMP.B…#'#',D0 ‰BNE.S…MSL200 *‚#,D@‰BSR‡EV ‰CMP.L…#8,D0‰BGT‡ER’GREATER�THAN�8 ‰AND.B…#$7,D0ŽMAKE�8�INTO�0MSL150ƒROR.W…#7,D0‰AND.W…#$F1FF,D2‰OR.W†D0,D2�COUNT/REG ‰BSR‡COMMA ‰BSR‡GETREGD‰BNE‡ER2‘.�3,0 ‰OR.W†D0,D2CMMD2S16�BRA‡CMMD2S15ŒCMMD2 MSL200ƒDSˆ0“D@,D@‰CMP.B…#'D',D0 ‰BNE.S…MSL300 *ˆD@,D@ ‰OR.W†#$20,D2 ‰SUB.L…#1,A5 ‰BSR‡GETREGD‰BNE.S…ER2‘.�3,0 ‰BRA‡MSL150 MSL300ƒDSˆ0“†SHIFT�MEMORY ‰SUB.L…#1,A5‰OR.W†#$00C0,D2‹SIZE�=�MEMORY +‰AND.W…#$FFC0,D2‹REMOVE�"SHIFT�MEMORY"�BITS ‰CMP.W…#$0040,TLENGTH(A1)‰BNE.S…ER2‘NOT�.WORD•1,2 ‰BSR‡EAM ‰OR.W†D6,D2‰BRA.S…CMMD2S16ŒCMMD2 PAGE)MSCC…BSR‡SIZEBYTEŒ(INDEX�29)�NBCD�SCC�TAS ‰BSR‡EADA�DATA�ALTERABLE�ONLY ‰OR.W†D6,D2CMMD2S17�BRA.S…CMMD2S16ŒCMMD2 PAGEMBCHG„CMP.B…#'#',(A5)‹(9) ‰BNE.S…MB200 "‰MOVE.W„#$0840,D2‹NEW�OP-CODE�MASK MB100„ADD.L…#1,A5‰BSR‡EV’EVALUATE�EXPRESSION ‰CMP.L…#33,D0‰BGT.S…ER2‘(MODULO�32)“1,2‰MOVE.W„D0,TDATA+2(A1)‰ADD.L…#2,D3�STORE�POINTER ‰ADD.B…#2,TNB(A1)Š.�1,2 MB105„BSR‡COMMA�.�1,2 ‰MOVE.L„D2,D0�.�3,0‰AND.W…#$00C0,D0‹.�3,0‰BEQ.S…MB107�BTSTš3,0*‰BSR‡EADA�DESTINATION�(BCHG�BCLR�BSET)‚3,0‰BRA.S…MB109�.�3,0,MB107„MOVE.W„#$7FD,D7ŒDESTINATION�(BTST)Œ3,0 ‰BSR‡EA’.�3,0MB109„OR.W†D6,D2�.�3,0 ‰TST.B…TLSPEC(A1)Š..œ1,2‰BEQ.S…CMMD2S17ŒDEFAULT—1,2 ‰AND.W…#$0038,D6‹.�1,2,‰BNE.S…MB145�DESTINATION��WAS�NOT�D@ƒ1,2 3‰CMP.W…#$80,TLENGTH(A1)„DESTINATION��WAS�D@‡1,2 ‰BEQ.S…CMMD2S17ŒLENGTH�IS�.L’1,2ER2†BRA‡ER’.�1,2 MB145„TST.W…TLENGTH(A1)‰.�1,2‰BNE‡ER2‘NOT�BYTE�LENGTH�1,2 CMMD2S18�BRA‡CMMD2S17ŒCMMD2™1,2 MB200„BSR‡GETREGD�DYNAMIC‰BNE‡ER2‘.�3,0 ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BRA‡MB105�.�1,2 *MBSET„CMP.B…#'#',(A5)‹(INDEX�11)�BCLR�BSET ‰BNE‡MB200 ‰MOVE.W„#$08C0,D2 ‰BRA‡MB100 MBCLR„CMP.B…#'#',(A5)‹(INDEX�30) ‰BNE‡MB200 ‰MOVE.W„#$0880,D2 ‰BRA‡MB100 MBTST„CMP.B…#'#',(A5)‹(INDEX�31) ‰BNE‡MB200 ‰MOVE.W„#$0800,D2 ‰BRA‡MB100 PAGEMDBCC„DSˆ0“(INDEX�8) ‰BSR‡GETREGD‰BNE.S…ER6‘.�3,0 ‰OR.W†D0,D2 ‰BSR‡COMMA ‰BSR.S…EVSR ‰BRA.S…MBRA23 SPC 6*‚SIZEƒ.S‚=‚.Wƒ(DEFAULT) *‰.L‚=‚.LMBRA…DSˆ0“(INDEX�10) ‰BSR.S…EVSR ‰CMP.W…#$0080,TLENGTH(A1)‰BEQ.S…MBRA23ŽFORCED�LONG ‰BSR‡EA8BITS�-128�TO�+127‰BNE.S…MBRA23ŽNOT�8�BIT�VALUE ‰OR.B†D5,D2‰BRA‡CMMD2S18Œ.SHORT "ER6†BRA‡ER2‘(ER)�ERROR�HANDLERŒ1,1 MBRA23ƒTST.B…TLSPEC(A1) ‰BEQ.S…MBRA27‰CMP.W…#$0040,TLENGTH(A1)‰BEQ‡ER6‘.S�SPECIFIED’1,1MBRA27 ! ‰MOVE.L„D4,D5�RESTORE�D5‰BSR‡EA16BITSŒ-32K�TO�+32K‰MOVE.W„D5,TDATA+2(A1)‰ADD.B…#2,TNB(A1)CMMD2S19�BRA‡CMMD2S18ŒCMMD2 EVSR…BSR‡EV‰CMP.B…#'�',(A5)‹.�1,1)‰BNE‡ER6‘DID�NOT�TERMINATE�WITH�SPACE‚1,1 ‰MOVE.L„D0,D5 ‰ASR.L…#1,D0‰BCS‡ER6‘ODD�VALUE•1,1‰MOVE.L„PCOUNTER(A1),D4‰ADD.L…#2,D4�D4�=�PC�+�2 ‰SUB.L…D4,D5%‰BEQ‡ER6‘ZERO;�SPECIAL�CASE�ERROR†1,1 ‰MOVE.L„D5,D4‰RTS PAGE MCHK…DSˆ0“(INDEX�12)�CHK�DIV�MUL ‰BSR‡SIZEWORD !‰BSR‡EADADDR�DATA�ADDRESSING�ONLY ‰OR.W†D6,D2 ‰BSR‡COMMA ‰BSR‡GETREGD‰BNE‡ER6‘.�3,0 ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BRA‡CMMD2S19ŒCMMD2 SPC 4MCLR…DSˆ0“(INDEX�13) ‰BSR‡FSIZE ‰BSR‡EADA�DATA�ALTERABLE�ONLY ‰OR.W†D6,D2‰BRA.S…CMMD2S19ŒCMMD2 SPC 4* SIZE = BYTE, WORD, LONGMCMPM„DSˆ0“(INDEX�14) ‰BSR‡FSIZE ‰MOVE.L„#$0008,D7‹.�3,0‰BSR‡EA’-(A@)ƒONLY ‰AND.W…#7,D6 ‰OR.W†D6,D2 ‰BSR‡COMMA ‰MOVE.L„#$0008,D7‹.�3,0‰BSR‡EA ‰AND.W…#7,D6 ‰ROR.W…#7,D6 ‰OR.W†D6,D2CMMD2S20�BRA‡CMMD2S19ŒCMMD2 PAGEMEXG…DSˆ0“(INDEX�16) ‰BSR‡SIZELONG ‰BSR‡GETREGAD ‰BNE‡ER’.�3,0‰MOVE.L„D0,D4�D4�=�REG�NUMBER‰MOVE.L„D1,D5�D5�=�REG�TYPE ‰BSR‡COMMA�TEST�FOR�COMMA ‰BSR‡GETREGAD ‰BNE‡ER’.�3,0 ‰CMP.L…D1,D5 ‰BEQ.S…MEXG35ŽBOTH�REGS�THE�SAME *‚DX,AY‚OR‚AY,DX‰OR.W†#$88,D2�MODE ‰TST.B…D1 ‰BNE.S…MEXG25 &‰EXG.L…D0,D4�SWAP�SOURCE�&�DESTINATION !MEXG25ƒOR.W†D0,D2�.......MMMMMYYY ‰ROR.W…#7,D4‰OR.W†D4,D2�....XXXMMMMMYYY‰BRA‡CMMD2S20ŒCMMD2 MEXG35ƒOR.W†#$0040,D2‹OP-MODE ‰TST.B…D1‰BEQ‡MEXG25ŽDX,DY ‰OR.W†#$0048,D2‹AX,AY ‰BRA‡MEXG25 ‚PAGEMEXT…DSˆ0“(INDEX�17)‰TST.W…TLENGTH(A1)‰BEQ‡ER’BYTE�SIZE�NOT�ALLOWED ‰BSR‡FSIZE�.W�=�........10......&‰ADD.W…#$0040,D2‹.L�=�........11...... ‰BSR‡GETREGD ‰BNE‡ER’.�3,0 ‰OR.W†D0,D2CMMD2S21�BRA‡CMMD2S20ŒCMMD2 PAGEMMOVEMƒDSˆ0“(INDEX�27)(‰MOVE.W„TLENGTH(A1),D0†SIZE�BITS‚76�TO�6‰BEQ‡ER’BYTE‡00‚ERROR‰LSR.W…#1,D0�WORD‡01„0‰AND.W…#$0040,D0‹LONG‡10„1 ‰OR.W†D0,D2 !‰ADD.B…#2,TNB(A1)ŠNUMBER�OF�BYTES&‰ADD.L…#2,D3�FORCE�STORE�PTR�PAST�MASK ‰CMP.B…#'A',(A5) ‰BEQ.S…MMM44‰CMP.B…#'D',(A5) ‰BEQ.S…MMM44 )*„,ŽMEMORY�TO�REGISTER‰OR.W†#$0400,D2‹DIRECTION�BIT "‰MOVE.W„#$7EC,D7ŒMODES�ALLOWED‘1,1‰BSR‡EA ‰OR.W†D6,D2 ‰BSR‡COMMA ‰BSR.S…MMM48�.�1,2‰BRA‡CMMD2S21ŒCMMD2™1,2  )*ƒ,�REGISTER�TO�MEMORY MMM44„DSˆ0 * EVALUATE DESTINATION FIRSTMMM46„BSR‡GETCHAR‰CMP.B…#',',D0�FIND�COMMA ‰BNE‡MMM46 "‰MOVE.W„#$1F4,D7ŒMODES�ALLOWED‘1,1‰BSR‡EA ‰OR.W†D6,D2(‰MOVE.L„A5,PENDOP(A1)‡END�OF�OPERAND�1,2‰MOVE.L„PTROP(A1),A5#‰BSR.S…MMM48�EVALUATE�REGISTERSŒ1,23‰MOVE.L„PENDOP(A1),A5‡POINTER�TO�END�OF�OPERAND…1,2‰BRA‡CMMD2S21ŒCMMD2™1,2„PAGE*ˆD6�=�CORRESPONDENCE�MASK*ˆD4�=�CONTROL‚$FF�'-'�'/'MMM48„CLR.L…D6’MASKš1,2‰MOVE.L„#-1,D4ŽCONTROL�=�$FF RL111„BSR‡GETCHAR‰CMP.B…#',',D0"‰BEQ.S…RL114�DONE;�FOUND�COMMA�1,2‰CMP.B…#'�',D0�.�1,2‰BNE.S…RL115�NOT�SPACE•1,2RL114„RTS›DONEš1,2 RL115„CMP.B…#'/',D0�.�1,2 ‰BNE.S…RL444 ‰TST.B…D4’CONTROL‰BMI.S…ER11�ER‰MOVE.L„D0,D4�CONTROL�=�'/'RL333„BSR‡GETREGAD‰BNE.S…ER11�ERœ3,0‰OR.B†D0,D1�D1�=�BIT�POSITION(‰MOVE.B„D1,D5�D5�=�LAST�REGISTER�ENTERED ‰BSR.S…SETBIT ‰BRA‡RL111 RL444„CMP.B…#'-',D0 ‰BNE.S…RL666 ‰CMP.B…#'/',D4�CONTROL‰BNE.S…ER11�ER‰MOVE.L„D0,D4�CONTROL�=�'-' ‰BSR‡GETREGAD‰BNE.S…ER11�ERœ3,0 ‰OR.B†D0,D1‰MOVE.L„D1,D7�D7�=�NOW�REGISTER‰MOVE.B„D5,D0�D5�=�LAST�REG ‰EOR.B…D1,D0‰AND.B…#$38,D0‰BNE.S…ER11�(ER)�NOT�MATCED�SET ‰CMP.B…D1,D5‰BPL.S…ER11�ER RL555„ADD.L…#1,D5 ‰MOVE.L„D5,D1 ‰BSR.S…SETBIT ‰CMP.B…D7,D5 ‰BMI‡RL555 ‰BRA‡RL111 RL666„TST.B…D4‰BPL.S…ER11�ER‰MOVE.B„#'/',D4�CONTROL�=�'/' ‰SUB.L…#1,A5 ‰BRA‡RL333 ER11…BRA‡ER’.�3,0 PAGE5SETBITƒLEA‡MTBL(PC),A0‰SET�BIT�IN�CORRESPONDENCE�MASK ‰MOVE.L„D2,D0‰AND.W…#$38,D0‰CMP.W…#$20,D0‰BNE.S…RL30�NOT�PREDECREMENT&‰MOVE.B„(A0,D1),D1ŠD1�=�BIT‚(FOR�SURE)RL30…BSET†D1,D6 ! /‰MOVE.W„D6,TDATA+2(A1)†SAVE�CORRESPONDENCE�MASK‰RTS /MTBL…DC.B†15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 PAGE*ƒD@,(A@)*ƒ(A@),D@*‰(A@),D@ŒFORCED�TO�0(A@),D0*‰D@,(A@)ŒFORCED�TO�D0,0(A@)**‚SIZE�=�WORD,�LONGMMOVEPƒDSˆ0“(INDEX�33)‰MOVE.W„TLENGTH(A1),D0‰BEQ‡ER11�.BYTE�NOT�ALLOWED ‰LSR.W…#1,D0‰AND.W…#$0040,D0‰OR.W†D0,D2�SIZE ‰MOVE.W„#$25,D7‰BSR‡EA’D6�=�MODE ‰BSR‡COMMA ‰MOVE.L„D6,D0‰AND.W…#$38,D0 ‰CMP.B…#$0,D0‰BEQ.S…MMP344ŽD@,(A@) *„(A@),D@ ‰BSR‡GETREGD‰BNE.S…ER10�ERœ3,0 ‰ROR.W…#7,D0‰OR.W†D0,D2�D@ ‰BRA.S…MMP348 (MMP344ƒOR.W†#$0080,D2‹REGISTER�TO�MEMORY ‰ROR.W…#7,D6‰OR.W†D6,D2�D@ ‰MOVE.W„#$24,D7‰BSR‡EAMMP348ƒMOVE.L„D6,D0 ‰AND.W…#7,D6‰OR.W†D6,D2�A@ ‰AND.W…#$38,D0‰CMP.B…#$10,D0‰BNE.S…MMP368Ž(A@) 0‰CLR.W…TDATA+2(A1)†�FORCED�TO�ZERO;‚"(A@)"!‰ADD.B…#2,TNB(A1)ŠNUMBER�OF�BYTES‰ADD.L…#2,D3�STORE�POINTERMMP368ƒBRA.S…CMMD2S22ŒCMMD2 PAGEMMOVEQƒDSˆ0“(INDEX�34) ‰BSR‡GETIMM ‰MOVE.L„D0,D5 ‰BSR‡EA8BITS�-128�TO�+127 ‰BNE.S…ER10‰OR.B†D5,D2�D5�=�VALUE ‰BSR‡COMMA ‰BSR‡GETREGD�D@‰BNE.S…ER10�.�3,0 ‰ROR.W…#7,D0 MMQ20„OR.W†D0,D2‰BSR.S…SIZELONGCMMD2S22�BRA‡CMMD2 'SIZELONG�TST.B…TLSPEC(A1)ŠMUST�BE�.LONG‰BEQ.S…SI201�DEFAULT�SIZE�OK‰CMP.W…#$0080,TLENGTH(A1)‰BNE.S…ER10�NOT�.LONG SI201„RTS /SIZEWORD�CMP.W…#$0040,TLENGTH(A1)‚MUST�BE�.WORD‰BEQ‡SI201…[RTS]‰BRA.S…ER10�ER SIZEBYTE�TST.B…TLSPEC(A1)‰BEQ‡SI201�DEFAULT�SIZE�OK‰TST.W…TLENGTH(A1) ‰BEQ‡SI201 ER10…BRA‡ER PAGE(MMOVE„CMP.W…#8,PRTYPE(A1)‡(INDEX�21)”3,0‰BLT.S…MM30�68000�OR�68008�3,0‰BSR‡GETREGCRŒ.�3,0‰BNE.S…MM30�NOT�"CCR"•3,0+‰MOVE.W„#$42C0,D2‹D2�=�INSTRUCTION�MASK‰3,0"‰BRA.S…MM313�"MOVE.W‚CCR,"Œ3,0MM30 ‰BSR‡GETREGSRŒ.�3,0 ‰BNE.S…MM40‰MOVE.W„#$40C0,D2‹.WƒSR, MM313„BSR‡COMMA�.�3,0 +‰BSR‡EADA�DATA�ALTERABLE�ONLY�(DESTINATION) )‰BSR‡SPACETŽLOOK�FOR�SPACE�TERMINATOR…3,0 MM315„OR.W†D6,D2‰BSR‡SIZEWORDŒ.�3,0‰BRA‡MCMMD2Ž.�3,0 MM40…BSR‡GETREGUSŒ.�3,0 ‰BNE.S…MM50 ‰BSR‡COMMA ‰MOVE.W„#$4E68,D2‹.LƒUSP,A@ ‰BSR‡GETREGA‰BNE‡ER10�.�3,0 ‰BRA‡MMQ20 !* GET EXCEPTIONS FROM DESTINATION(MM50…BSR‡A5TODESTŒMOVE�A5�TO�DESTINATION ‰BSR‡GETREGCRŒ.�3,0 ‰BNE.S…MM60‰MOVE.W„#$44C0,D2‹.Wƒ,CCR .MM508„BSR‡SPACETŽLOOK�FOR�SPACE�TERMINATOR…3,0 ,‰MOVE.L„PTROP(A1),A5ˆA5�=�POINTER�TO�OPERAND *‰BSR‡EADADDR„DATA�ADDRESSING�ONLY�(SOURCE) ‰BSR‡COMMA ‰BRA‡MM315 MM60…BSR‡GETREGSRŒ.�3,0 ‰BNE.S…MM70‰MOVE.W„#$46C0,D2‹.Wƒ,SR ‰BRA‡MM508 MM70…BSR‡GETREGUSŒ.�3,0 ‰BNE.S…MM80‰MOVE.W„#$4E60,D2‹.LƒA@,USP)‰BSR‡SPACETŽLOOK�FOR�SPACE�TERMINATOR…3,0 ‰MOVE.L„PTROP(A1),A5 ‰BSR‡GETREGA‰BNE‡ER10�.�3,0‰BSR‡COMMA�.�3,0‰OR.W†D0,D2�.�3,0‰BSR‡SIZELONGŒ.�3,0‰BRA‡MCMMD2Ž.�3,0 5MM80…MOVE.L„PTROP(A1),A5ˆA5�=�POINTER�TO�SOURCE�FIELD ‰BSR‡FSIZE�GET�SIZE�(BITS‚7�-�6)"‰LSL.W…#6,D2�ADJUST�TO(BITS�13-12) ‰BTST†#13,D2‰BNE.S…MM804�.L�10�TO�10‰ADD.W…#$1000,D2‹.W�01�TO�11‰OR.W†#$1000,D2‹.B�00�TO�01)MM804„BSR‡EAALL�SOURCE;�ALL�MODES�ALLOWED ‰OR.W†D6,D2 5* IF BITE SIZE; "ADDRESS REGISTER DIRECT" NOT ALLOWED ‰MOVE.L„D2,D0‰AND.W…#$3000,D0‰CMP.W…#$1000,D0‹.�1,2‰BNE.S…MM806�NOT�.B�SIZE‰AND.B…#$38,D6�.�1,2‰CMP.B…#$08,D6 ‰BEQ.S…ER8MM806 ‰BSR‡COMMA $‰MOVE.W„#$1FF,D7ŒDATA�ALTERABLE�+�A@‰BSR‡EA  ‰MOVE.L„D6,D0�DESTINATION‰AND.W…#$0038,D0‰CMP.W…#$0008,D0‰BEQ‡MMOVEA1�A@�MAKE�MOVEA +* POSITION REGISTER AND MODE OF DESTINATION3MM825„ROR.L…#3,D6�RRR.............�.............MMM‰ROR.W…#3,D6 MMM.............*‰SWAP†D6’MMM.............�RRR.............‰ROL.W…#3,D6 .............RRR.‰ROL.L…#1,D6�MM..............�............RRRM.‰ROL.L…#8,D6�................�....RRRMMM...... ‰OR.W†D6,D2‰BRA.S…CMMD2S23ŒCMMD2 PAGE MMOVECƒDSˆ0“(INDEX�38)�68010Ž3,0‰BSR‡SIZELONGŒ.�3,0 %‰ADD.B…#2,TNB(A1)ŠNUMBER�OF�BYTES�3,0 '‰BSR.S…MLFS�LOOK�FOR�SPECIAL�SYMBOL‡3,0‰BNE.S…MMOVEC10ŒNOT�FOUND•3,0 * Rc,Rn" ‰BSR‡COMMA�.�3,0 %‰BSR‡GETREGADŒGET�REGISTER�A�OR�D‹3,0‰BNE.S…ER8‘.�3,0‰OR.W†D1,D0�.�3,0 )MMOVEC05�ROR.W…#4,D0�RRRR............Ž3,0 ‰OR.W†D6,D0�RRRRX0000000000XŽ3,0&‰MOVE.W„D0,TDATA+2(A1)†SECOND�WORD“3,0CMMD2S23�BRA‡CMMD2�.�3,0 -MMOVEC10�OR.W†#1,D2�DIRECTION�BIT�(Rn,Rc)‰3,0‰BSR‡GETREGADŒ.�3,0‰BNE.S…ER8‘.�3,0‰OR.W†D1,D0�.�3,0 ‰BSR‡COMMA�.�3,0 ‰BSR.S…MLFS�.�3,0‰BEQ‡MMOVEC05Œ.�3,0ER8†BRA‡ER’.�3,0 ** LOOK FOR SPECIAL SYMBOL: SFC DFC USP VBRMLFS…CLR.L…D1’.�3,0‰MOVE.B„(A5),D1�000Xš3,0‰ASL.L…#8,D1�00X0š3,0‰MOVE.B„1(A5),D1Œ00XYš3,0‰ASL.L…#8,D1�0XY0š3,0‰MOVE.B„2(A5),D1Œ0XYZš3,0#‰CLR.L…D6’D6�=�VALUE�FOR�RETURN‰3,0‰CMP.L…#'SFC'>>8,D1ˆ.�3,0‰BEQ.S…MLFS94ŽMATCH™3,0'‰MOVE.L„#1,D6�D6�=�VALUE�FOR�RETURN‰3,0‰CMP.L…#'DFC'>>8,D1ˆ.�3,0‰BEQ.S…MLFS94ŽMATCH™3,0*‰MOVE.W„#$800,D6ŒD6�=�VALUE�FOR�RETURN‰3,0‰CMP.L…#'USP'>>8,D1ˆ.�3,0‰BEQ.S…MLFS94ŽMATCH™3,0*‰MOVE.W„#$801,D6ŒD6�=�VALUE�FOR�RETURN‰3,0‰CMP.L…#'VBR'>>8,D1ˆ.�3,0‰BNE.S…MLFS95ŽMISS-MATCH”3,0.MLFS94ƒADD.L…#3,A5�ADJUST�GET�CHAR�POINTER‡3,0MLFS95ƒRTS›.�3,0 PAGE MMOVESƒDSˆ0“(INDEX�39)�68010Ž3,0 ‰BSR‡FSIZE�OR�SIZE�INTO�D2�3,0 %‰ADD.B…#2,TNB(A1)ŠNUMBER�OF�BYTES�3,0*‰ADD.L…#2,D3�FORCE�STORE�PTR�PAST�MASK…3,0 ‰BSR‡GETREGADŒ.�3,0‰BEQ.S…MMOVES44ŒRn,—3,0 *ƒ,Rn"‰BSR‡EAM‘MEMORY�ALTERABLE�ONLY‰3,0‰OR.W†D6,D2�.�3,0 ‰BSR‡COMMA�.�3,0 ‰BSR‡GETREGADŒ.�3,0‰BNE‡ER8‘.�3,0 ‰OR.W†D1,D0�.�3,0‰ROR.W…#4,D0�.�3,0&‰MOVE.W„D0,TDATA+2(A1)†SECOND�WORD“3,0CMMD2S24�BRA‡CMMD2S23ŒCMMD2™3,0 MMOVES44�OR.W†D1,D0�.�3,0‰ROR.W…#4,D0�.�3,0 ‰OR.W†#$800,D0ŒDIRECTION�BIT‘3,0&‰MOVE.W„D0,TDATA+2(A1)†SECOND�WORD“3,0 ‰BSR‡COMMA�.�3,0 "‰BSR‡EAM‘MEMORY�ALTERABLE�ONLY‰3,0‰OR.W†D6,D2�.�3,0‰BRA‡CMMD2S24ŒCMMD2™3,0 PAGEMMOVEA1‚CLR.L…D3‰MOVE.B„#2,TNB(A1) MMOVEAƒDSˆ0“(INDEX�32),‰MOVE.L„PTROP(A1),A5ˆA5�=�POINTER�TO�OPERAND $‰MOVE.W„TLENGTH(A1),D2†D0�=�SIZE•1,2‰BEQ‡ER’.BYTE�NOT�ALLOWED ‰LSL.W…#6,D2�.SIZE™1,2‰BTST†#12,D2Ž.�1,2‰BEQ.S…MMA225Ž.L�=�..10•1,2‰OR.W†#$3000,D2‹.W�=�..11•1,2MMA225 ‰BSR‡EAALL�ALL�MODES�ALLOWED ‰OR.W†D6,D2 ‰BSR‡COMMA ‰MOVE.W„#$0002,D7‹A@�ONLY‰BSR‡EA ‰BRA‡MM825  PAGEMJMP…DSˆ0“(INDEX�18)‰TST.B…TLSPEC(A1)Š.�1,11‰BEQ.S…MJMP32ŽDEFAULT�(ALLOW�EITHER�.S�OR�.L)�1,1‰MOVE.W„TLENGTH(A1),D0†.�1,1‰BEQ‡ER’.B�NOT�ALLOWED�1,1'‰MOVE.W„#$6E4,D7ŒD7�=�MODES�ALLOWEDŒ1,1‰CMP.W…#$40,D0�.�1,1,‰BEQ.S…MJMP22Ž.S�SPECIFIED�(.W�ACCEPTED)„1,1!‰MOVE.W„#$8764,D7‹MODE�FOR�.L“1,1MJMP22ƒBSR‡EA’.�1,1‰BRA.S…MJMP42Ž.�1,1 *MJMP32ƒBSR‡EAC‘CONTROL�ADDRESSING�ONLY‡1,1MJMP42ƒOR.W†D6,D2�.�1,1‰BRA‡CMMD2S24ŒCMMD2 SPC 4 * SIZE = LONGMLEA…DSˆ0“(INDEX�19) ‰BSR‡SIZELONG ‰BSR‡EAC‡CONTROL�ADDRESSING�ONLY ‰OR.W†D6,D2 ‰BSR‡COMMA ‰BSR‡GETREGA‰BNE.S…ER7‘.�3,0 ‰ROR.W…#7,D0 MLEA22ƒOR.W†D0,D2�.�3,0CMMD2S25�BRA‡CMMD2S24ŒCMMD2™3,0  PAGE * SIZE = LONGMPEA…DSˆ0“(INDEX�36) ‰BSR‡SIZELONG ‰BSR‡EAC‡CONTROL�ADDRESSING�ONLY ‰OR.W†D6,D2‰BRA‡CMMD2S25ŒCMMD2™3,0 SPC 4MSWAP„DSˆ0“(INDEX�24) * SIZE WORD‰CMP.W…#$0040,TLENGTH(A1)‰BNE.S…ER7‘NOT�.W ‰BSR‡GETREGD�D@�ONLY‰BEQ‡MLEA22Ž.�3,0ER7†BRA‡ER’.�3,0 PAGEGETIMMƒCMP.B…#'#',(A5)+‰BNE‡ER7‘.�3,0 ‰BSR‡EV’EVALUATE�EXPRESSION‰RTS›D0�=�VALUE MLINK„BSR‡GETREGA�(INDEX�20)‰BNE‡ER7‘.�3,0 ‰OR.W†D0,D2 ‰BSR‡COMMA MRTD…BSR‡GETIMMŽ(INDEX�40)”3,0 ‰MOVE.L„D0,D5‰BSR‡EA16BITSŒ-32K�TO�+32K‰MOVE.W„D0,TDATA+2(A1) ‰ADD.B…#2,TNB(A1)‰BRA‡CMMD2S25ŒCMMD2™3,0 MSTOP„DSˆ0“(INDEX�23) * UNSIZED ‰BSR‡GETIMM‰CMP.L…#$00010000,D0‰BCC‡ER7‘.�3,0‰MOVE.W„D0,TDATA+2(A1)‰ADD.B…#2,TNB(A1)‰BRA‡CMMD2S25ŒCMMD2™3,0 MTRAP„DSˆ0“(INDEX�25) ‰BSR‡GETIMM ‰CMP.L…#16,D0‰BCC‡ER7‘.�3,0 ‰OR.W†D0,D2CMMD2S26�BRA‡CMMD2S25ŒCMMD2™3,0 PAGEMUNLK„DSˆ0“(INDEX�26) * UNSIZED ‰BSR‡GETREGA‰BNE‡ER7‘.�3,0 ‰OR.W†D0,D2‰BRA‡CMMD2S26ŒCMMD2™3,0 SPC 4#MDC†DSˆ0“(INDEX�37)�.W�ONLY�ALLOWED‰BSR‡EV ‰MOVE.L„D0,D5)‰BSR‡EA16BIT�ONLY�.W�ALLOWED…-32K�TO�+64K"  ‰MOVE.W„D5,D2‰BRA‡CMMD2S26ŒCMMD2™3,0  ‰END éééééééADCODE68M�IDNT†4,3‡ONE�LINE�DISASSEMBLER�6800/68008/68010‚01/16/85<********�INCLUDEƒCRIGHT.SA‹Bring�in�the�Copyright�notice†JAHI* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *;*‚MC68010�version�Designed�and�Written�by�R.�Duyck�02/23/83C*‚Fix‚AppliedƒAuthor„Description...................................D*‚4.3‚01/16/85‚S.Ludwig‚Changed�output�of�MOVEP�inst.�to�dec.�offsetB*‚4.0‚10/12/83‚R.DuyckƒMOVEM.L�D7/A0,64�generated�MOVEM.L�D7-A0,64I* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *‰XDEF†DCODE68K‰XDEF†DCODE68M ‰XREF†PNT4HX,PNT6HX,PNT8HX‰XREF†FRELADDR ‰XREF†HEX2DEC SPC 1$BUFSIZE‚SET‡80’SIZE�OF�OUTPUT�BUFFER EOT†SET‡4 SPC 1*ˆCALLING�SEQUENCE:$*ƒD0,D1,D2�=�CODE�TO�BE�DISASSEMBLED*‰D3�=�PROCESSOR�TYPE*Œ=�0000ƒ68000*Œ=�0004ƒ68008*Œ=�0008ƒ68010*Œ=�000Cƒ68020ƒFUTURE,*‰A4�=�VALUE�OF�PROGRAM�COUNTER�FOR�THE�CODE3*‰A5�=�POINTER�TO�STORE�DATA�(BUFSIZE�=�80�ASSUMED)**…JSR‡DCODE68M SPC 1 *ˆRETURN:4*ƒA4�=�VALUE�OF�PROGRAM�COUNTER�FOR�NEXT�INSTRUCTION&*ƒA5�=�POINTER�TO�LINE�AS�DISASSEMBLED*ƒA6�=�POINTER�TO�END�OF�LINE*4* 01234567890123456789012345678901234567890123456789.* AAAAAA FDATA.DDDDDDDDDDDDDD FOC.... FOP..... SPC 1FDATA„EQU‡10‚DATA�FIELDFOC†EQU‡31‚OP-CODE�FIELDFOP†EQU‡39‚OPERAND�FIELD SPC 1* CAUSES ORGIN MODULO 4*‚IF�PC�=�MAKE�IT�=*‰00‰00*‰02‰04*‰04‰04*‰06‰08 LONG…MACRO‰DSˆ0 ‰DS.B†(*-X)&2‰ENDM SPC 3LOCVARSZ�EQU�18¶3,0‰OFFSET�-LOCVARSZ DATA…DS.L†3 HISPC„DS.L†1 PRTYPEƒDS.W†1“PROCESSOR�TYPE�3,0 EAM003ƒEQU‡$003†D@�A@£3,04EAM1F4ƒEQU‡$1F4†CONTROL�ALTERABLE�+�PREDECREMENTˆ3,0/EAM1FCƒEQU‡$1FC†MEMORY�ALTERABLE�ADDRESSING�3,0-EAM1FDƒEQU‡$1FD†DATA�ALTERABLE�ADDRESSING�3,0/EAM1FEƒEQU‡$1FE†ALTERABLE�MEMORY�ADDRESSING�3,0'EAM1FFƒEQU‡$1FF†DATA�ALTERABLE�+�A@•3,0&EAM7E4ƒEQU‡$7E4†CONTROL�ADDRESSING–3,0+EAM7ECƒEQU‡$7EC†CONTROL�+�POSTINCREMENT‘3,0/EAM7FDƒEQU‡$7FD†DATA�ADDRESSING�-�IMMEDIATE�3,0#EAMFFDƒEQU‡$FFD†DATA�ADDRESSING™3,0#  PEYcagieq[yj�b‰[‘`™i¡[©n±`¹VÁ\É]Ñ?ÙWEAMFFFƒEQU‡$FFF†ALL�MODESŸ3,0 SPC 3 ‰SECTIONƒ11XˆDSˆ0‰BASE�ADDRESS�THIS�MODULE ‰LONGš.�3,0IRTD…BRA‡ILINK44�.�3,0 ‰LONGš.�3,0IMOVECƒBRA‡IMOVEC11ŒMOVEC™3,0 ‰LONGš.�3,0IMOVESƒBRA‡IMOVES11ŒMOVES™3,0 ‰LONGš.�3,0IEOR…BRA‡IEOR11ŽEOR›3,0‰LONGIQUICKƒBRA‡IQUICKA�ADDQ‚SUBQ PAGE‰LONG*‚MOVEM�REGISTERS�TO�EA**‚01001D001S......$*‚..........XXXXXX‚EFFECTIVE�ADDRESS*‚.........0......‚WORD*‚.........1......‚LONG%*‚.....0..........‚REGISTER�TO�MEMORY%*‚.....1..........‚MEMORY�TO�REGISTER* IMOVEMFR�DSˆ0‰BSR‡MOVEMSŽSIZE ‰MOVE.L„#$0038,D6‹.�1,4‰AND.W…(A4),D6�.�1,4‰CMP.W…#$0020,D6‰BEQ.S…IM7788ŽPREDECREMENT�MODE -‰MOVE.L„#1,D6�D6�=�INCREMENTER�(BIT�POSITION)‰MOVE.L„#0,D1�D1�=�BIT�POSITION ‰BRA.S…IM7799 4IM7788ƒMOVE.L„#-1,D6ŽD6�=�DECREMENTER�(BIT�POSITION) ‰MOVE.L„#15,D1ŽD1�=�BIT�POSITION!IM7799ƒBSR‡MOVEMRŽBUILD�MASK�WORD SPC 1‰MOVE.B„#',',(A6)+ŒSTORE�COMMA SPC 1 ‰ADD.L…#2,D3‰MOVE.W„(A4),D4)‰MOVE.W„#EAM1F4,D7ŠCONTROL�+�PREDECREMENT‰BSR‡EA‰BRA.S…CS16�COMMON SPC 1‰LONG*�MOVEM‚EA‚TO�REGISTERS*IMOVEMTR�BSR‡MOVEMSŽSIZE ‰ADD.L…#2,D3*‰MOVE.W„#EAM7EC,D7ŠCONTROL�+�POSTINCREMENT‰BSR‡EA SPC 1‰MOVE.B„#',',(A6)+ŒSTORE�COMMA SPC 1+‰MOVE.L„#1,D6�D6�=�BIT�POSITION�INCREMENTER‰MOVE.L„#0,D1�D1�=�BIT�POSITION ‰BSR‡MOVEMR SPC 1CS16…BRA.S…CS15�COMMON SPC 1 PAGE‰LONG ISTOP„DSˆ0‰MOVE.W„2(A4),D0‰MOVE.B„#'#',(A6)+ŠIMMEDIATE‰MOVE.B„#'$',(A6)+ŠHEX‰BSR‡PNT4HXŽVALUE ‰BRA‡COMMON4 PAGE‰LONG#IMMED„DSˆ0“ADD‚AND‚CMP�#‚EOR‚OR‚SUB ‰BSR‡FORMSIZE‰ADD.L…#2,D3�SIZE�=�4‰MOVE.B„#'#',(A6)+ŠIMMEDIATE SPC 1 ‰CLR.L…D0$‰MOVE.W„2(A4),D0ŒD0�=�EXTENSION�WORD‰MOVE.W„(A4),D1 ‰LSR.W…#6,D1 ‰AND.W…#3,D1‰BEQ.S…IMMED65ƒ.BYTE SPC 1 ‰CMP.B…#1,D1‰BEQ.S…IMMED75ƒ.WORD SPC 1‰ADD.L…#2,D3�.LONG„SIZE�=�6)‰MOVE.L„2(A4),D0ŒD0�=�LONG�EXTENSION�WORD SPC 1IMMED45‚BSR‡HEX2DEC�DECIMAL SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR ‰MOVE†(A4),D0‰AND.W…#$003F,D05‰CMP.W…#$003C,D0‹DESTINATION�ADDRESS�MODE�111100‚"SR"‰BNE.S…IMMED55�NOT�FOUND ‰MOVE.W„(A4),D0�"SR"‚ILLEGAL�FOR‰AND.W…#$4000,D0�ADDIƒSUBI‚CMPI‰BNE‡FERROR’0600ƒ0400‚0C00 ‰MOVE.W„(A4),D1‰AND.W…#$00C0,D1‰CMP.W…#$0080,D1‰BEQ‡FERRORŽ.LONG�NOT�ALLOWED +‰MOVE.B„#'S',(A6)+�#,SR�FOR�ANDI,�EORI,�ORI‰MOVE.B„#'R',(A6)+CS15…BRA.S…CS14”COMMON SPC 1IMMED55‚BSR‡EA‰BRA.S…CS14•COMMON *IMMED65‚MOVE.L„D0,D1�D1�=�XXXXXXXX........"‰LSR.W…#8,D1�D1�=�00000000XXXXXXXX‰BEQ.S…IMMED75 ‰MOVE.L„D0,D1 ‰ASR.W…#7,D1‰ADD.W…#1,D1�CHECK�FOR�NEGATIVE ‰BNE‡FERROR IMMED75‚EXT.L…D0 ‰BRA‡IMMED45 PAGE*ƒBIT‚5432109876543210,*ˆ....RRRMMM......„DESTINATION�REGISTER�MODE'*ˆ..........MMMRRR„SOURCE�MODE�REGISTER*ˆ0001............„.BYTE*ˆ0011............„.WORD*ˆ0010............„.LONG*6* IF BYTE SIZE; DESTINATION ADDRESS DIRECT NOT ALLOWED‰LONG IMOVE„DSˆ0 ‰BRA‡IMOVEA1 SPC 2‰LONG ILINK„DSˆ0‰BSR.S…FORMREGA SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SERARATOR SPC 1)ILINK44‚MOVE.B„#'#',(A6)+Š(RTD�68010)“3,0‰MOVE.W„2(A4),D0 ‰EXT.L…D0!‰BSR‡HEX2DEC�DECIMAL�DISPLACEMENT ‰BRA‡COMMON4 PAGE‰LONGFORM1„DSˆ0“CLR‚NEG‚NEGX‚NOT�TST‰BSR.L…FORMSIZE SPC 1 *œNBCD�TAS!FORM1AƒBSR‡EA’DATA�ALTERABLE�ONLYCS14…BRA.S…CS13�COMMON SPC 1‰LONGFORM3„DSˆ0“EXT‚SWAP‰BSR.S…FORMREGD‰BRA.S…CS13�COMMON SPC 1‰LONGFORM4„DSˆ0“TRAP‰MOVE.B„#'#',(A6)+‰MOVE.W„(A4),D0‰AND.L…#$0F,D0‰BSR‡HEX2DEC�DECIMAL‰BRA.S…CS13�COMMON SPC 1‰LONGFORM5„DSˆ0“UNLNK‰BSR.S…FORMREGA‰BRA.S…CS13‘COMMON‚PAGE*…5432109876543210#*…....RRR.........‡ADDRESS�REGISTER$*…..........XXXXXX‡EFFECTIVE�ADDRESS*‰LONGFORM6AƒDSˆ0“LEA%‰MOVE.W„#EAM7E4,D7ŠCONTROL�ADDRESSING ‰BSR.S…EA10 SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPAR# ATOR SPC 1‰MOVE.W„(A4),D4 ‰ROL.W…#7,D4‰BSR.S…FORMREGA‰BRA.S…CS13‘COMMON SPC 1*ƒBIT‚5432109876543210 *ˆ....DDD.........„DATA�REGISTER$*ˆ..........XXXXXX„EFFECTIVE�ADDRESS*‰LONG#FORM6DƒDSˆ0“CHK‚DIVS‚DIVU‚MULS‚MULU"‰MOVE.W„#EAMFFD,D7ŠDATA�ADDRESSING ‰BSR.S…EA10 SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1‰MOVE.W„(A4),D4 ‰ROL.W…#7,D4‰BSR.S…FORMREGD‰BRA.S…CS13�COMMON SPC 1$FORMREGA�MOVE.B„#'A',(A6)+ŠFORMAT�A@FORMREG5�AND.B…#$07,D4 ‰OR.B†#'0',D4‰MOVE.B„D4,(A6)+‰RTS SPC 1$FORMREGD�MOVE.B„#'D',(A6)+ŠFORMAT�D@ ‰BRA‡FORMREG5 SPC 1*‚BIT‚5432109876543210!*‡....DDD......DDD…DATA�REGISTERS*‰LONGFORM7„DSˆ0“EXG ‰ROL.W…#7,D4 ‰BSR‡FORMREGD SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1‰MOVE.W„(A4),D4 ‰BSR‡FORMREGD‰BRA.S…CS13�COMMON SPC 1*‚BIT‚5432109876543210$*‡....AAA......AAA…ADDRESS�REGISTERS*‰LONGFORM8„DSˆ0“EXG ‰ROL.W…#7,D4 ‰BSR‡FORMREGA SPC 1)FORM815‚MOVE.B„#',',(A6)+ŠCOMMA�SEPARATOR SPC 1‰MOVE.W„(A4),D4 ‰BSR‡FORMREGACS13…BRA.S…CS12A�COMMON SPC 1*‚BIT‚5432109876543210 *‡....DDD.........…DATA�REGISTER#*‡.............AAA…ADDRESS�REGISTER*‰LONGFORM9„DSˆ0“EXG ‰ROL.W…#7,D4‰BSR‡FORMREGD‚DATA�REGISTER ‰BRA‡FORM815 SPC 3 EA10…BRA‡EA PAGE*ƒ5432109876543210$*ƒ..........AAAAAA‰EFFECTIVE�ADDRESS*ƒ.......MMM......‰OP-MODE*ƒ....RRR.........‰D-REGISTER*ƒ.......011......‰WORD‚EA,A@*ƒ.......111......‰LONG‚EA,A@C*ƒ.......000......‰EA,D@�BYTE�(ADDRESS�REGISTER�DIRECT�NOT�ALLOWED)*ƒ.......0........‰EA,D@*ƒ.......1........‰D@,EA*ƒ........00......‰BYTE*ƒ........01......‰WORD*ƒ........10......‰LONG*‰LONG%*œADD�,A@ƒCMP�,A@ƒSUB�,A@FORM10EX�DSˆ0“ADD‚CMP‚SUB$‰MOVE.W„#EAMFFF,D7ŠALL�MODES�ALLOWED ‰MOVE.L„D4,D0‰AND.W…#$01C0,D0‰BEQ.S…FORM103�.......000......‰CMP.W…#$01C0,D0 ‰BEQ.S…FORM10E3Œ.......111......‰CMP.W…#$00C0,D0‰BNE.S…FORM10E6 0‰MOVE.B„#'.',(A5)+Š.......011......‡STORE�PERIOD‰MOVE.B„#'W',(A5)+‰BRA.S…FORM10E4 SPC 1FORM10E3�MOVE.B„#'.',(A5)+‰MOVE.B„#'L',(A5)+ FORM10E4�BSR‡EA10 SPC 1&‰MOVE.B„D5,(A6)+ŒSTORE�COMMA�SEPARATOR SPC 1‰MOVE.W„(A4),D4 ‰ROL.W…#7,D4‰BSR‡FORMREGAŒ,A@CS12A„BRA.S…CS12�COMMON FORM10E6�BTST.B„#0,(A4)'‰BNE.S…FORM105�.......1........„D@,'‰BRA.S…FORM104�.......0........„,D@ PAGE*ƒ5432109876543210$*ƒ..........AAAAAA‰EFFECTIVE�ADDRESS*ƒ.......MMM......‰OP-MODE*ƒ....RRR.........‰D-REGISTER*ƒ.......0........‰EA,D@*ƒ.......1........‰D@,EA*ƒ........00......‰BYTE*ƒ........01......‰WORD*ƒ........10......‰LONG‰LONGFORM10ƒDSˆ0“AND‚OR—3,0‰BTST.B„#0,(A4)‰BNE.S…FORM105 SPC 1)FORM103‚MOVE.W„#EAMFFD,D7ŠDATA�ADDRESSINGFORM104‚BSR‡FORMSIZE‰BSR‡EA10�,D@ SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 ‰BSR‡FORMREGD‰BRA.S…CS12�COMMON SPC 1FORM105‚BSR‡FORMSIZEŒD@,‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 ‰BSR‡FORMREGD SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR ‰MOVE.W„(A4),D42‰MOVE.W„#EAM1FE,D7ŠALTERABLE�MEMORY�ADDRESSINGƒ3,0 ‰BSR‡EA10CS12…BRA.S…CS11A PAGE‰LONG*œPEA…(JMP‚JSR)+FORM11ƒMOVE.W„#EAM7E4,D7ŠCONTROL�ADDERSSING ‰BSR‡EA10‰BRA.S…CS11A…COMMON ‰LONG *œJMP‚JSR+FORM11SL�MOVE.L„D4,D0�LOOK�FOR�.S‚OR‚.L‹1,4‰AND.W…#$3F,D0�.�1,4‰CMP.W…#$38,D0�.�1,4‰BNE.S…FORM112�NOT�.S˜1,4‰MOVE.B„#'.',(A5)+ŠPERIOD˜1,4‰MOVE.B„#'S',(A5)+ŠS�1,4FORM112‚CMP.W…#$39,D0�.�1,4‰BNE.S…FORM114�.�1,4‰MOVE.B„#'.',(A5)+ŠPERIOD˜1,4‰MOVE.B„#'L',(A5)+ŠL�1,4FORM114‚BRA‡FORM11Ž.�1,4‚SPC�5‰LONGIMOVEPƒBRA‡IMOVEP1�.�3,0 PAGE* BIT 5432109876543210,*…....XXX.....0...‡DATA�DESTINATION�REGISTER#*…....XXX.....1...‡ADDRESS�REGISTER*…....XXX.00......‡BYTE*…........01......‡WORD*…........10......‡LONG1*…............0...‡DATA�REGISTER�TO�DATA�REGISTER#*…............1...‡MEMORY�TO�MEMORY'*…............0XXX‡DATA�SOURCE�REGISTER**…............1XXX‡ADDRESS�SOURCE�REGISTER*‰LONGFORM12ƒDSˆ0“ABCD‚ADDX‚SBCD‚SUBX ‰BSR‡FORMSIZE SPC 1 ‰BTST†#3$ ,D4‰BNE.S…FORM125 SPC 1"‰BSR‡FORMREGDŒD@,D@;ƒFORMAT�SOURCE SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 ‰BSR‡FORMREGDŒFORMAT�DESTINATIONCS11A„BRA.S…CS11�COMMON SPC 1FORM125‚MOVE.B„#'-',(A6)+Š-‰MOVE.B„#'(',(A6)+Š(‰BSR‡FORMREGAŒA@„SOURCE SPC 1‰MOVE.L„#'(-,)',D0‹),-(‰BSR.S…SCHR�STORE�CHARS SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4‰BSR‡FORMREGAŒA@ƒDESTINATION‰MOVE.B„#')',(A6)+‰BRA.S…CS11�COMMON PAGE* BIT 5432109876543210/*…....XXX.....1...‡ADDRESS�REGISTER„DESTINATION*…....XXX.00......‡BYTE*…........01......‡WORD*…........10......‡LONG#*…............1...‡MEMORY�TO�MEMORY**…............1XXX‡ADDRESS�SOURCE�REGISTER*‰LONGFORM12A‚DSˆ0“CMPM ‰BSR‡FORMSIZE SPC 1‰MOVE.B„#'(',(A6)+Š(‰BSR‡FORMREGAŒA@ SPC 1‰MOVE.L„#'(,+)',D0‹)+,(‰BSR.S…SCHR�STORE�CHARS SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4‰BSR‡FORMREGAŒA@‰MOVE.B„#')',(A6)+‰MOVE.B„#'+',(A6)+CS11…BRA‡COMMON PAGE* BIT 5432109876543210*…0111...0........‡FIXED *…....RRR.........‡DATA�REGISTER%*…........DDDDDDDD‡SIGN�EXTENDED�DATA*‰LONG IMOVEQƒDSˆ0‰MOVE.B„#'#',(A6)+ŠIMMEDIATE SPC 1‰MOVE.W„(A4),D0 ‰EXT.W…D0 ‰EXT.L…D0‰BSR‡HEX2DEC�DECIMAL SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1 ‰ROL.W…#7,D4 ‰BSR‡FORMREGD‰BRA‡CS11�COMMON PAGE"SCHR…MOVE.B„D0,(A6)+ŒOUTPUT�STRING ‰LSR.L…#8,D0‰BNE‡SCHR�MORE�TO�OUTPUT‰RTS SPC 2 *�MOVE�FROM�SR‚(STATUS�REGISTER)*‰LONGIMVFSRƒMOVE.L„#',RS'>>8,D0‹SR, SPC 1 ‰BSR‡SCHR‰BSR.S…EA11�(EA)‚DATA�ALTERABLE‰BRA‡CS11�COMMON SPC 1$* MOVE FROM USP (USER STACK POINTER)*‰LONGIMVFUSP‚MOVE.L„#',PSU',D0ŠUSP, ‰BSR‡SCHR ‰BSR‡FORMREGA‰BRA‡CS11’COMMON SPC 1* MOVE TO SR (STATUS REGISTER)*‰LONG(IMVTSRƒMOVE.W„#EAMFFD,D7ŠDATA�ADDRESSING‰BSR.S…EA11�EA‰MOVE.L„#'RS,'>>8,D0ˆ,SRIMVT44ƒBSR‡SCHRCS11B„BRA‡CS11�COMMON˜3,0 SPC 1"* MOVE TO USP (USER STACK POINTER)*‰LONGIMVTUSP‚BSR‡FORMREGA‰MOVE.L„#'PSU,',D0Š,USP ‰BRA‡IMVT44 SPC 1'*‚MOVE�TO�CCR�(CONDITION�CODE�REGISTER)*‰LONG)IMVTCCR‚MOVE.W„#EAMFFD,D7ŠDATA�ADDRESSING‰BSR.S…EA11�EA‰MOVE.L„#'RCC,',D0Š,CCR ‰BRA‡IMVT44 3*‚MOVE�FROM�CCR�(CONDITION�CODE�REGISTER)‡68010�3,0*Ä3,0 ‰LONGš.�3,0"IMVTFCR‚MOVE.L„#',RCC',D0ŠCCR,š3,0‰BSR‡SCHR�.�3,0&‰MOVE.W„#EAMFFD,D7ŠDATA�ADDRESSING�3,0‰BSR.S…EA11�EAœ3,0‰BRA‡CS11B�COMMON˜3,0 PAGE‰LONG2CS21…BRA‡COMMON‹COMMOM„NOP�RESET�RTE�RTR�RTS�TRAPV SPC 1‰LONG!SCC†BSR‡ICCCC�GET�REST�OF�OP-CODE‰BSR.S…EA11�(EA)�DATA�ALTERABLE ‰BRA‡CS21 EA11…BRA‡EA  ‰LONGIDBCC„DSˆ0“DB--‰MOVE.W„(A4),D4 ‰BSR‡FORMREGD ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR&‰MOVE.B„#'$',(A6)+ŠHEX�FIELD�TO�FOLLOW ‰BSR‡ICCCC ‰BRA.S…ICC55 SPC 1*‚BIT‚5432109876543210*‡0110............…FIXED*‡....CCCC........…CONDITION*‡........DDDDDDD0…DISPLACEMENT3*‡...............1…ERROR�(ODD�BOUNDRY�DISPLACEMENT)*‰LONG ICC†DSˆ0“B-- ‰BSR‡ICCCC SPC 1IBSR…MOVE.B„#'$',(A6)+ŠBSRƒBRA SPC 1 ‰TST.B…D4 ‰BEQ.S…ICC55�16�BIT�DISPLACEMENT SPC 1‰MOVE.B„#'.',(A5)+‰MOVE.B„#'S',(A5)+‰EXT.W…D4’8�BIT�DISPLACEMENT SPC 1)ICC35„EXT.L…D4’SIGN-EXTENDED�DISPLACEMENT%‰ADD.L…HISPC(A1),D4‡+�PROGRAM�COUNTER‰ADD.L…#2,D4�+�TWO ‰MOVE.L„D4,D0 ‰ASR.L…#1,D4$‰BCS‡FERRORŽODD�BOUNDRY�DISPLACEMENT ‰BSR‡PNT6HX ‰BRA‡CS21 SPC 1ICC55„ADD.L…#2,D3�SIZE‰MOVE.W„2(A4),D4‰MOVE.B„#'.',(A5)+-‰MOVE.B„#'L',(A5)+Š.L�FOR�16�BIT�DISPLACEMENT ‰BRA‡ICC35 PAGE‰LONG*šBCHG‚BCLR‚BSET‚BTSTISETD„DSˆ0“DYNAMIC�BIT ‰ROL.W…#7,D4‰BSR‡FORMREGDŒDATA�REGISTER SPC 1'ISETD12‚MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1‰AND.W…#$00C0,D4‹.�3,0‰BEQ.S…ISET25ŽBTSTš3,0ISET21ƒMOVE.W„(A4),D4�.�3,0)‰BSR‡EA’DATA�ALTERABLE�BCHG�BCLR�BSET�3,0CS18…BRA‡CS21�SCOMMON—3,0ISET25ƒMOVE.W„#EAM7FD,D7Š.�3,0‰BRA‡ISET21ŽBTSTš3,0 SPC 3‰LONG*œBCHG‚BCLR‚BSET‚BTST5*‚1ST�WORD…....�....�..XX�XXXX„EAƒDATA�ALTERABLE�ONLY*�....�....�00..�....„BTST*�....�....�01..�....„BCHG*�....�....�10..�....„BCLR*�....�....�$ 11..�....„BSET)*‚2ND�WORD…0000�0000�000Y�YYYY„BIT�NUMBER*ISETS„DSˆ0“STATIC�BIT‰ADD.L…#2,D3…SIZE‰MOVE.B„#'#',(A6)+ŠIMMEDIATE ‰CLR.L…D0/‰MOVE.W„2(A4),D0ŒGET�BIT�POSITION�FROM�2ND�WORD ‰MOVE.L„D0,D1 ‰LSR.L…#5,D1 ‰BNE‡FERROR‰BSR‡HEX2DEC�DECIMAL SPC 1 ‰BRA‡ISETD12 PAGE*ƒBIT‚5432109876543210+*ˆ....XXX.........„IMMEDIATE�COUNT/REGISTER*ˆ.......0........„RIGHT�SHIFT*ˆ.......1........„LEFT�SHIFT*ˆ........00......„BYTE*ˆ........01......„WORD*ˆ........10......„LONG *ˆ....0...11......„WORD�(MEMORY)$*ˆ....0...11AAAAAA„EFFECTIVE�ADDRESS(*ˆ..........0.....„SHIFT�IMMEDIATE�COUNT;*ˆ..........1.....„SHIFT�COUNT�(MODULO�64)�IN�DATA�REGISTER*‰LONGISHIFTƒDSˆ0“AS-‚LS-‚RO-‚ROX-‰MOVE.W„#'LR',D0‰BTST†#8,D4�DIRECTION�BIT‰BEQ.S…ISHIFT13ŒRIGHT‰LSR.W…#8,D0�LEFT.ISHIFT13�MOVE.B„D0,(A5)+ŒDIRECTION;�"L"�OR�"R" SPC 1‰MOVE.W„(A4),D0‰AND.W…#$00C0,D0‰CMP.W…#$00C0,D0‰BEQ.S…ISHIFTM1ŒMEMORY�SHIFT SPC 1 ‰BSR‡FORMSIZE SPC 1 ‰ROL.W…#7,D4‰BTST†#12,D4ŽI/R�BIT!‰BNE.S…ISHIFT33ŒCOUNT�IN�REGISTER SPC 1‰AND.B…#$07,D4�IMMEDIATE�COUNT‰BNE.S…ISHIFT23"‰OR.B†#$08,D4�CHANGE�ZERO�TO�EIGHTISHIFT23�OR.B†#'0',D4‰MOVE.B„#'#',(A6)+‰MOVE.B„D4,(A6)+‰BRA.S…ISHIFT44 SPC 1ISHIFT33�BSR‡FORMREGD SPC 1(ISHIFT44�MOVE.B„D5,(A6)+‹COMMA�SEPARATOR SPC 1‰MOVE.W„(A4),D4 ‰BSR‡FORMREGDCS17…BRA‡CS18�COMMON SPC 1!ISHIFTM1�MOVE.B„#'.',(A5)+ŠPERIOD‰MOVE.B„#'W',(A5)+Š.WORD ‰BTST†#11,D4‰BNE‡FERRORŽBIT�11�MUST�BE�ZERO SPC 1.‰MOVE.W„#EAM1FC,D7ŠMEMORY�ALTERABLE�ADDRESSING‰BSR‡EA‰BRA‡CS17�COMMON PAGE.ICCCC„MOVE.L„#$0F,D0�APPEND�CONDITION�CODE‰1,4‰AND.B…(A4),D0�D0�=�CCC–1,4‰LSL.L…#1,D0�D0�=�CCC*2 SPC 1-‰MOVE.W„BRTBL(PC,D0.W),D1ƒGET�BRANCH�MNEMONIC*‰MOVE.B„D1,(A5)+Œ(REVERSED)�FROM�THE�TABLE)‰LSR.W…#8,D1�AND�ADD�THE�NONBLANK�PORTION‰CMP.B…#'�',D1�TO�THE�BUFFER. ‰BEQ.S…ICCCC9‰MOVE.B„D1,(A5)+ ICCCC9ƒRTS SPC 2!BRTBL„DC.B†'�T'†'T�'‚BRA�ACCEPTED‰DC.B†'�F'†'F�'‰DC.B†'IH'†'HI'‰DC.B†'SL'†'LS'‰DC.B†'CC'†'CC'‰DC.B†'SC'†'CS'‰DC.B†'EN'†'NE'‰DC.B†'QE'†'EQ'‰DC.B†'CV'†'VC'‰DC.B†'SV'†'VS'‰DC.B†'LP'†'PL'‰DC.B†'IM'†'MI'‰DC.B†'EG'†'GE'‰DC.B†'TL'†'LT'‰DC.B†'TG'†'GT'‰DC.B†'EL'†'LE' PAGE*ƒBIT‚5432109876543210,*ˆ....RRRMMM......„DESTINATION�REGISTER�MODE'*ˆ..........MMMRRR„SOURCE�MODE�REGISTER*4* IF BYTE SIZE; ADDRESS DIRECT NOT ALLOWED AS SOURCE* IMOVEA1‚DSˆ0 ‰MOVE.W„#EAMFFF,D7ŠALL�MODES•3,0‰MOVE.B„(A4),D0�.�3,0‰AND.B…#$30,D0�.�3,0‰CMP.B…#$10,D0�.�3,0 ‰BNE.S…IMOVE16�NOT�BYTE�SIZE‘3,0*‰MOVE.W„#EAMFFD,D7ŠALL�MODES�EXCEPT�A@‹3,0IMOVE16‚BSR‡EA SPC 1 ‰MOVE.B„D5,(A6)+ŒCOMMA�SEPARATOR SPC 1 ‰MOVE.W„(A4),D4�....RRRMMM......‰LSR.W…#1,D4�.....RRRMMM.....‰LSR.B…#5,D4�.....RRR.....MMM‰ROR.W…#8,D4�.....MMM.....RRR‰LSL.B…#5,D4�.....MMMRRR.....‰LSR.W…#5,D4�..........MMMRRR SPC 1%* IF .BYTE DESTINATION A@ NOT ALLOWED&‰MOVE.W„#EAM1FF,D7ŠDATA�ALTERABLE�+�A@‰MOVE.B„(A4),D0‰AND.B…#$30,D0�.�3,0‰CMP.B…#$10,D0�.�3,0‰BNE.S…IMOVE19�NOT�BYTE�SIZE !‰MOVE.W„#EAM1FD,D7ŠDATA�ALTERABLEIMOVE19 ‰BSR‡EA‰BRA.S…CS19†COMMON PAGE.*‚IF�BYTE;�ADDRESS�REGISTER�DIRECT�NOT�ALLOWEDIQUICKA‚DSˆ0“ADDQ‚SUBQ‰BSR.S…FORMSIZE SPC 1‰MOVE.B„#'#',(A6)+ ‰ROL.W…#7,D4 ‰AND.B…#7,D4‰BNE.S…IQUICK21 ‰OR.B†#8,D4�MAKE�ZERO�INTO�EIGHT IQUICK21�OR.B†#'0',D4�MAKE�ASCII‰MOVE.B„D4,(A6)+ SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1‰MOVE.W„(A4),D4 ‰MOVE.W„(A4),D0‰AND.W…#$00C0,D0‰BEQ.S…IQUICK31ŒDATA�ALTERABLE&‰MOVE.W„#EAM1FF,D7ŠDATA�ALTERABLE�+�A@IQUICK31�BSR‡EACS19…BRA‡COMMON PAGE*‚BITƒ5432109876543210*ˆ........00......„BYTE*ˆ........01......„WORD*ˆ........10......„LONG*ˆ........11......„ERROR* FORMSIZE�DSˆ0‰MOVE.W„(A4),D2‰MOVE.B„#'.',(A5)+ŠSTORE�PERIOD ‰LSR.W…#6,D2‰AND.W…#$03,D2 ‰BNE.S…FORM91‰MOVE.B„#'B',(A5)+ŠSTORE�"B" ‰BRA.S…FORM95 SPC 1FORM91ƒMOVE.B„#'W',D0 ‰CMP.B…#1,D2 ‰BEQ.S…FORM93‰MOVE.B„#'L',D0 ‰CMP.B…#2,D2‰BNE.S…FE10�FERROR'FORM93ƒMOVE.B„D0,(A5)+‚STORE�"W"�O% R�"L" FORM95ƒRTS PAGEEA000„BSR‡FORMREGD ‰BTST†#0,D7‰BEQ.S…FE10�FERROR‰RTS SPC 2EA001„BSR‡FORMREGA ‰BTST†#1,D7(‰BEQ.S…FE10ŽFERROR‡THIS�MODE�NOT�ALLOWED‰RTS SPC 2EA010„MOVE.B„#'(',(A6)+ ‰BSR‡FORMREGA‰MOVE.B„#')',(A6)+ ‰BTST†#2,D7(‰BEQ.S…FE10ŽFERROR‡THIS�MODE�NOT�ALLOWED‰RTS SPC 2EA011„MOVE.B„#'(',(A6)+ ‰BSR‡FORMREGA‰MOVE.B„#')',(A6)+‰MOVE.B„#'+',(A6)+ ‰BTST†#3,D7(‰BEQ.S…FE10†FERROR…THIS�MODE�NOT�ALLOWED EA011RTS RTS SPC 2EA100„MOVE.B„#'-',(A6)+‰MOVE.B„#'(',(A6)+ ‰BSR‡FORMREGA‰MOVE.B„#')',(A6)+ ‰BTST†#4,D7 ‰BNE‡EA011RTS%FE10…BRA‡FERRORŽTHIS�MODE�NOT�ALLOWED PAGE"*‚ENTER‡A4�=�POINTER�TO�FIRST�WORD*ŽD3�=�OFFSET�TO�EXTENSION*ŽD4�=�VALUE�TO�PROCESS*ŽD7�=�MODES�ALLOWED�MASK*EA‡DSˆ0 ‰MOVE.L„D4,D0 ‰LSR.W…#3,D0 ‰AND.W…#$7,D0 ‰BEQ‡EA000 SPC 1 ‰CMP.B…#1,D0 ‰BEQ‡EA001 SPC 1 ‰CMP.B…#2,D0 ‰BEQ‡EA010 SPC 1 ‰CMP.B…#3,D0 ‰BEQ‡EA011 SPC 1 ‰CMP.B…#4,D0 ‰BEQ‡EA100 SPC 1 ‰CMP.B…#5,D0 ‰BEQ.S…EA101 SPC 1 ‰CMP.B…#7,D0 ‰BEQ.S…EA111 PAGE*„EXTENSION�WORD*ƒBIT‚5432109876543210 *ˆ0...............„DATA�REGISTER#*ˆ1...............„ADDRESS�REGISTER*ˆ.RRR............„REGISTER@*ˆ....0...........„SIGN�EXTENDED,�LOW�ORDER�INTEGER�IN�INDEX�REG/*ˆ....1...........„LONG�VALUE�IN�INDEX�REGISTER*ˆ.....000........'*ˆ........DDDDDDDD„DISPLACEMENT�INTEGER*,*�EA110ŒADDRESS�REGISTER�INDIRECT�WITH�INDEX SPC 1 ‰BTST†#6,D7&‰BEQ‡FE10ŽFERROR…THIS�MODE�NOT�ALLOWED ‰MOVE.W„(A4,D3),D1‰AND.W…#$0700,D1'‰BNE‡FE10�FERROR„BITS�10-8�MUST�BE�ZERO $‰MOVE.W„(A4,D3),D0ŠD0�=�DISPLACEMENT ‰EXT.W…D0 ‰EXT.L…D0‰BSR‡HEX2DEC�DECIMAL‰MOVE.B„#'(',(A6)+Š( SPC 1‰BSR‡FORMREGAŒXX(A@ SPC 1‰MOVE.B„#',',(A6)+ŠXX(A@, SPC 1‰MOVE.B„(A4,D3),D4 ‰ASR.B…#4,D4 ‰BPL.S…EA1105 ‰BSR‡FORMREGA ‰BRA.S…EA1107 SPC 1EA1105ƒBSR‡FORMREGD"EA1107ƒMOVE.B„#'.',(A6)+ŠXX(A@,X@. SPC 1‰MOVE.W„(A4,D3),D4ŠD4�=�R@‰MOVE.B„#'W',D0�..........W ‰BTST†#11,D4 ‰BEQ.S…EA1109‰MOVE.B„#'L',D0�..........LEA1109ƒMOVE.B„D0,(A6)+‰MOVE.B„#')',(A6)+Š...........) ‰ADD.L…#2,D3‰RTS PAGE-* ADDRESS REGISTER INDIRECT WITH DISPLACEMENT* EA101„BTST†#5,D7�101000;ƒDIS(A@))‰BEQ.S…FE11�FERROR;‚THIS�MODE�NOT�ALLOWED ‰MOVE.W„(A4,D3),D0 ‰EXT.L…D0‰BSR‡HEX2DEC�DECIMAL‰ADD.L…#2,D3�SIZE ‰BRA‡EA010 PAGE*‚111000ŠABSOLUTE�SHORT*‚111001ŠABSOLUTE�LONG**‚111010ŠPROGRAM�COUNTER�WITH�DISPLACEMENT#*‚111011ŠPROGRAM�COUNTER�WITH�INDEX *‚111100ŠIMMEDIATE�OR�STATUS�REG*EA111 ‰AND.W…#7,D4 ‰BNE.S…EA1112 SPC 1 ‰BTST†#7,D7)‰BEQ.S…FE11�FERROR;‚THIS�MODE�NOT�ALLOWED )‰MOVE.W„(A4,D3),D0Š111000;ƒABSOLUTE�SHORT ‰EXT.L…D0‰MOVE.B„#'$',(A6)+#‰BSR‡PNT8HXŽSIGN�EXTENDED�VALUE‹1,3‰ADD.L…#2,D3�SIZE�+�2‰RTS SPC 1EA1112ƒCMP.B…#1,D4 ‰BNE.S…EA1113 SPC 1 ‰BTST†#8,D7)‰BEQ.S…FE11�FERROR;‚THIS�MODE�NOT�ALLOWED ‰MOVE.B„#'$',(A6)+ŠHEX(‰MOVE.L„(A4,D3),D0Š111001;…ABSOLUTE�LONG ‰BSR‡PNT8HX**-�MOVE.B„#'.',(A6)+ŠFORCE�LONG�FORMAT“1,3*-�MOVE.B„#'L',(A6)+ŠIEƒ.L�1,3 ‰ADD.L…#4,D3‰RTS SPC 1EA1113ƒCMP.B…#2,D4 ‰BNE.S…EA1114 SPC 1 ‰BTST†#9,D7‰BNE.S…EA1113A%FE11…BRA‡FERRORŽTHIS�MODE�NOT�ALLOWEDEA1113A <‰MOVE.W„(A4,D3),D0‚111010;ƒPC�+�DISPLACEMENT‚DESTINATION(PC) ‰EXT.L…D0‰ADD.L…HISPC(A1),D0*‰ADD.L…D3,D0�ADJUST�FOR�EXTENSION�WORD…3,0‰MOVE.B„#'$',(A6)+ŠHEX�"$"—1,3‰BSR‡PNT8HXŽDESTINATION‰MOVE.L„#')CP(',D0Š(PC)‰BSR‡SCHR�STORE�WORD‰ADD.L…#2,D3�SIZE‰RTS SPC 1EA1114ƒCMP.B…#3,D4 ‰BNE.S…EA1115 PAGE1*�PROGRAM�COUNTER�WITH�INDEX„DESTINATION(PC,R@.X)**‚5432109876543210…SECOND�WORD *‚0...............ŠDATA�REGISTER#*‚1...............ŠADDRESS�REGISTER*‚.XXX............ŠREGISTER8*‚....0...........ŠSIGN-EXTENDED,�LOW�ORDER�WORD�INTEGER*œ..IN�INDEX�REGISTER/*‚....1...........ŠLONG�VALUE�IN�INDEX�REGISTER*‚.....000........'*‚........XXXXXXXXŠDISPLACEMENT�INTEGER* ‰BTST†#10,D7'‰BEQ‡FE11�FERROR„THIS�MODE�NOT�ASLLOWED ‰MOVE.W„(A4,D3),D1‰AND.W…#$0700,D1(‰BNE‡FE11�FERROR;‚BITS�10-8�MUST�BE�ZERO 0‰MOVE.B„1(A4,D3),D0‰111100;ƒDESTINATION(PC,R@.% X) ‰EXT.W…D0 ‰EXT.L…D0‰ADD.L…HISPC(A1),D0*‰ADD.L…D3,D0�ADJUST�FOR�EXTENSION�WORD…3,0‰MOVE.B„#'$',(A6)+ŠHEX�"$"—1,3‰BSR‡PNT8HXŽDESTINATION“1,3 SPC 1‰MOVE.L„#',CP(',D0‰BSR‡SCHR�DES(PC, SPC 1‰MOVE.W„(A4,D3),D4 ‰ROL.W…#4,D4 ‰BTST†#3,D4 ‰BEQ.S…EAF25 ‰BSR‡FORMREGA ‰BRA.S…EAF27EAF25„BSR‡FORMREGDŒDES(PC,R@EAF27 SPC 1‰MOVE.B„#'.',(A6)+ŠDES(PC,R@. SPC 1‰MOVE.W„(A4,D3),D4‰MOVE.W„#'LW',D0 ‰BTST†#11,D4 ‰BEQ.S…EAF35 ‰LSR.W…#8,D0!EAF35„MOVE.B„D0,(A6)+ŒDES(PC,R@.X SPC 1‰MOVE.B„#')',(A6)+ŠDES(PC,R@.X) ‰ADD.L…#2,D3‰RTS PAGE*ƒBIT‚5432109876543210+*ˆ..........111100„FIRST�WORD;‚#*EA1115ƒCMP.B…#4,D4‰BNE‡FE11�FERROR SPC 1 ‰BTST†#11,D7'‰BEQ‡FE11�FERROR;‚THIS�MODE�NOT�ALLOWED ‰MOVE.B„#'#',(A6)+ŠIMMEDIATE SPC 1‰MOVE.B„-1(A5),D1‰CMP.B…#'L',D1‰BEQ.S…EA11155�LONG SPC 1‰MOVE.W„(A4,D3),D0 ‰CMP.B…#'B',D1‰BNE.S…EA11153Ž.WORD * BYTE SIZE; DATA ALLOWED*‚0000�0000�XXXX�XXXX*‚1111�1111�1XXX�XXXX ‰MOVE.L„D0,D1 ‰LSR.W…#8,D1‰BEQ.S…EA11153 ‰MOVE.L„D0,D1 ‰ASR.W…#7,D1 ‰ADD.W…#1,D1‰BNE‡FE11�FERROR EA11153‚EXT.L…D0 ‰BSR‡HEX2DEC ‰ADD.L…#2,D3‰RTS SPC 1EA11155‚MOVE.L„(A4,D3),D0 ‰BSR‡HEX2DEC‰ADD.L…#4,D3�SIZE‰RTS PAGEMOVEMSƒMOVE.B„#'.',(A5)+ŠPERIOD‰MOVE.W„#'LW',D0 ‰BTST†#6,D4‰BEQ.S…MOVEMS2 ‰LSR.W…#8,D0MOVEMS2‚MOVE.B„D0,(A5)+ŒSIZE‰RTS SPC 1* MOVEM - REGISTER EXPANSION* MOVEMRƒDSˆ0!‰MOVE.W„2(A4),D2ŒD2�=�SECOND�WORD‰MOVE.L„#'�'>>8,D0�D0�=�SPACE‰MOVE.L„#'/'>>8,D7�D7�=�/!‰SUB.L…#1,A6�ADJUST�STORE�POINTER"‰MOVE.L„#'0'>>8,D5ŠD5�=�REGISTER�#‰MOVE.W„#'AD',D4ŒD4�=�REG�CLASS SPC 1MOVEMR11�BTST†D1,D2‰BEQ.S…MOVEMR77ŒBIT�RESET SPC 1‰CMP.B…(A6),D0‹BIT�SET‰BNE.S…MOVEMR44ŒNOT�SPACE SPC 1!MOVEMR33�MOVE.B„D4,1(A6)ŒREG�TYPE‰MOVE.B„D5,2(A6)ŒREG�#‰MOVE.B„#'-',3(A6)Š- ‰ADD.L…#3,A6‰BRA.S…MOVEMR88 SPC 1MOVEMR44�CMP.B…#',',(A6)‰BEQ‡MOVEMR33ŒCOMMA�SEPARATOR SPC 1‰CMP.B…(A6),D7‹/�SEPARATOR ‰BEQ‡MOVEMR33 SPC 1‰MOVE.B„D4,1(A6)ŒREG�TYPE‰MOVE.B„D5,2(A6)ŒREG�#‰MOVE.B„#'-',3(A6)‰-�SEPARATOR‰BRA.S…MOVEMR88 SPC 1MOVEMR77�CMP.B…#',',(A6)‰BEQ.S…MOVEMR88ŒCOMMA SPC 1‰CMP.B…(A6),D0‰BEQ.S…MOVEMR88ŒSPACE‰CMP.B…1(A6),D0‰BEQ.S…MOVEMR79ŒSPACE ‰ADD.L…#3,A6#MOVEMR79�MOVE.B„D7,(A6)Œ/�SEPARATOR SPC 1MOVEMR88�ADD.L…#1,D5‰ADD.L…D6,D1�D1�=�BIT�POSITION‰CMP.B…#'8',D5 ‰BNE‡MOVEMR11 SPC 1‰CMP.B…(A6),D0�SPACE‰BEQ.S…MOVEMR94 SPC 1‰CMP.B…1(A6),D0ŒSPACE™4,0‰BNE.S…MOVEMR90Œ.�4,0‰CMP.B…#'-',(A6)‹.�4,0*‰BEQ.S…MOVEMR92ŒRollover�from�Dx�to�Axˆ4,0‰BRA.S…MOVEMR94Œ.�4,0MOVEMR90�ADD.L…#3,A6�.�4,0'MOVEMR92�MOVE.B„D7,(A6)�/�Separator“4,0)MOVEMR94�MOVE.B„#'0',D5�RESET�REG�TO�ZERO‰LSR.W…#8,D4�CHANGE�REG�TYPE‰BNE‡MOVEMR11ŒMORE SPC 1‰MOVE.B„D0,(A6)�SPACE‰RTS PAGEIEOR11ƒDSˆ0“EOR‚D@,’3,0‰BSR‡FORMSIZEŒ.�3,0 ‰ROL.W…#7,D4�.�3,0‰BSR‡FORMREGDŒ.�3,0 ‰MOVE.B„D5,(A6)+ŒCOMMA™3,0 ‰MOVE.W„(A4),D4�.�3,0‰BSR‡EA’š3,0‰BRA.S…COMMON1�COMMON˜3,0 PAGEIMOVES11�DSˆ0“.�3,0'‰ADD.L…#2,D3�ADJUST�NUMBER�OF�BYTESˆ3,0 ‰BSR‡FORMSIZEŒ.�3,0 %‰BTST†#3,DATA+2(A1)‡DIRECTION�BIT‘3,0‰BEQ.S…IMOVES44Œ0�=�,R@“3,0 !‰MOVE.W„DATA+2(A1),D4‡R@,—3,0‰ROL.W…#4,D4�.�3,0‰MOVE.L„#EAM003,D7ŠA@‚D@˜3,0 ‰BSR‡EA’.�3,0 ‰MOVE.B„D5,(A6)+ŒCOMMA™3,0 ‰MOVE.W„DATA(A1),D4‰.�3,02‰MOVE.W„#EAM1FC,D7ŠMEMORY�ALTERABLE�ADDRESSINGƒ3,0 ‰BSR‡EA’.�3,0‰BRA.S…COMMON1�.�3,0 :IMOVES44�MOVE.W„#EAM1FC,D7ŠMEMORY�ALTERABLE�ADDRESSINGƒ3,0 ‰BSR‡EA’.�3,0 ‰MOVE.B„D5,(A6)+ŒCOMMA™3,0 ‰MOVE.W„DATA+2(A1),D4‡.�3,0‰ROL.W…#4,D4�.�3,0‰MOVE.L„#EAM003,D7ŠA@‚D@˜3,0 ‰BSR‡EA’.�3,0COMMON1‚BRA‡COMMONŽ.�3,0 PAGEIMOVEC11�DSˆ0“.�3,0!‰MOVE.L„D4,D1�D1�=�FIRST�WORD�3,0 ‰BTST†#0,D1�DIRECTION�BIT‘3,0‰BEQ.S…IMOVEC44Œ.�3,0 ‰BSR.S…MCRDA�FORM�D@�OR�A@‘3,0 ‰MOVE.B„D5,(A6)+ŒCOMMA™3,0 ‰BSR.S…MC’3�CHAR�SYMBOL‘3,0COMMON41�BRA‡COMMON4�.�3,0 #IMOVEC44�BSR.S…MC’3�CHAR�SYMBOL‘3,0 ‰MOVE.B„D5,(A6)+ŒCOMMA™3,0 ‰BSR.S…MCRDA�FORM�D@�OR�A@‘3,0‰BRA& ‡COMMON41Œ.�3,0 /MCRDA„MOVE.B„DATA+2(A1),D4‡D4�=�SECOND�WORDŽ3,0‰LSR.B…#4,D4�.�3,0‰MOVE.L„#EAM003,D7ŠA@‚D@˜3,0 ‰BSR‡EA’.�3,0 ‰RTS›.�3,0 ,MC‡MOVE.W„DATA+2(A1),D4‡D4�=�SECOND�WORDŽ3,0‰MOVE.L„#'CFS'>>8,D0ˆSFC›3,0‰AND.W…#$FFF,D4Œ.�3,0‰BEQ.S…MC96�MATCH™3,0 ‰MOVE.L„#'CFD'>>8,D0ˆDFC›3,0‰CMP.W…#$001,D4Œ.�3,0‰BEQ.S…MC96�MATCH™3,0 ‰MOVE.L„#'PSU'>>8,D0ˆUSP›3,0‰CMP.W…#$800,D4Œ.�3,0‰BEQ.S…MC96�MATCH™3,0 ‰MOVE.L„#'RBV'>>8,D0ˆVRB›3,0‰CMP.W…#$801,D4Œ.�3,0‰BNE‡FE12�MISS-MATCH”3,0 MC96…BSR‡SCHR�STORE�3�CHAR’3,0 ‰RTS›.�3,0 PAGE*�BIT‚5432109876543210*†0000...1..001...†FIXED *†....XXX.........†DATA�REGISTER%*†........0.......†MEMORY�TO�REGISTER%*†........1.......†REGISTER�TO�MEMORY*†.........0......†WORD*†.........1......†LONG#*†.............XXX†ADDRESS�REGISTER* IMOVEP1‚DSˆ0‰MOVE.B„#'.',(A5)+ŠD@,#(A@)‰MOVE.W„#'LW',D0 ‰BTST†#6,D4‰BEQ.S…IMOVEP11ŒUSE�"W"‰LSR.W…#8,D0�USE�"L"IMOVEP11�MOVE.B„D0,(A5)+ŒLENGTH SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 SPC 1‰BTST.B„#7,1(A4)‰BEQ.S…IMOVEP35 SPC 1‰BSR‡FORMREGDŒD@,$HHHH(A@) SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1‰MOVE.W„(A4),D4‰BSR.S…IMOVEP66CS20…BRA‡COMMON4 SPC 1$IMOVEP35�BSR.S…IMOVEP66Œ$HHHH(A@),D@ SPC 1 ‰MOVE.B„D5,(A6)+ŠCOMMA�SEPARATOR SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 ‰BSR‡FORMREGD‰BRA‡CS20�COMMON4 SPC 10IMOVEP66�MOVE.W„2(A4),D0ŒFORMAT�DISPLACEMENT‹4,3‰EXT.L…D0’EXTEND�THE�SIGN�4,3#‰BSR‡HEX2DEC�CONVERT�TO�DECIMALŒ4,3 SPC 1‰MOVE.B„#'(',(A6)+‰MOVE.W„(A4),D4 ‰BSR‡FORMREGA‰MOVE.B„#')',(A6)+‰RTS PAGE DCODE68K�CLR.L…D3’68000�only”3,0 SPC 1#DCODE68M�DSˆ0“68000/68008/68010�3,0*‰LINK†A1,#-LOCVARSZ‡CREATE�A�FRAME�FOR�THE.‰MOVEM.LƒD0-D2/A4,DATA(A1)ƒCODE�AND�ITS�PC.‚A4(‰MOVE.W„D3,PRTYPE(A1)‡PROCESSOR�TYPE�3,0‰CMP.W…#TBLAE-TBLA,D3†.�3,0‰BGE.S…FE12�BAD�TYPE–3,0 *‰LEA‡TBLA(PC),A4‰GET�THE�TABLE�ADDRESS‰4,11‰LEA‡TBL00(PC),A3ˆGET�FIRST�ENTRY�PC�RELATIVEƒ4,1‰MOVE.L„A3,(A4)+ŒSTORE�IT.•4,12‰LEA‡TBL08(PC),A3ˆGET�SECOND�ENTRY�PC�RELATIVE‚4,1‰MOVE.L„A3,(A4)+ŒSTORE�IT.•4,11‰LEA‡TBL10(PC),A3ˆGET�THIRD�ENTRY�PC�RELATIVEƒ4,1‰MOVE.L„A3,(A4)+ŒSTORE�IT.•4,10‰LEA‡TBL20(PC),A3ˆGET�LAST�ENTRY�PC�RELATIVE„4,1‰MOVE.L„A3,(A4)+ŒSTORE�IT.•4,1 $‰LEA‡DATA(A1),A4‰POINTS�TO�THE�CODE. )‰MOVE.L„A5,A3�A3�=�START�OF�OUTPUT�BUFFER‰MOVE.L„#BUFSIZE,D0 ‰MOVE.L„A3,A6*DEC311ƒMOVE.B„#'�',(A6)+ŠSPACE�FILL�BUFFER ‰SUB.L…#1,D0 ‰BNE‡DEC311 SPC 1‰MOVE.L„A3,A6�FORMAT�ADDRESS‰MOVE.L„HISPC(A1),D0 ‰BSR‡FRELADDR SPC 1* CHECK FOR KNOWN ILLEGAL CODES‰MOVE.W„(A4),D0 ‰LEA‡KI(PC),A5 ‰MOVE.L„A5,A6‰ADD.L…#KIEND-KI,A6DEC404ƒCMP.W…(A5)+,D0$‰BEQ.S…FE12�FERROR;‚ILLEGAL�CODE‰1,4 ‰CMP.L…A6,A5 ‰BNE‡DEC404 SPC 1* LOOK FOR MATCH OF OP-CODE*‰LEA.L…TBLA(PC),A5‰.�3,0‰MOVE.W„PRTYPE(A1),D0‡.�3,05‰MOVE.L„(A5,D0.W),A5ˆA5�=�POINTER�TO�DECODE�TABLE‚3,0 -‰LEA‡TBLE(PC),A6‰A6�=�POINTER�TO�END�OF�TABLE DEC411ƒMOVE.W„(A4),D0�FIRST�WORD‰AND.W…(A5)+,D0ŒMASK‰CMP.W…(A5)+,D0‰BEQ.S…DEC425ŽFOUND�MATCH‰ADD.L…#2,A5�UPDATE�POINTER ‰CMP.L…A6,A5‰BNE‡DEC411ŽMORE�TABLE)FE12…BRA.S…FERRORŽILLEGAL�INSTRUCTION‹1,4 SPC 1DEC425ƒCLR.L…D6%‰MOVE.B„(A5)+,D6ŒD6�=�(GOTO�OFFSET)/4 ‰LSL.L…#2,D6 SPC 1 ‰CLR.L…D7&‰MOVE.B„(A5)+,D7ŒD7�=�INDEX�TO�OP-CODE SPC 1* MOVE OP-CODE TO BUFFER*‰LEA‡OPCTBL(PC),A0 DEC510ƒTST‡D7‰BEQ.S…DEC530ŽAT�INDEXDEC515ƒTST.B…(A0)+‰BPL‡DEC515ŽMOVE�THROUGH�FIELD ‰SUB.L…#1,D7 ‰BRA‡DEC510 SPC 1DEC530ƒMOVE.L„#FOC,D0�.�1,40‰LEA.L…(A3,D0),A5ŠA5�=�STORE�POINTER‚OP-CODEƒ1,4DEC535ƒMOVE.B„(A0)+,D0 ‰BCLR†#7,D0‰BNE.S…DEC537ŽEND�OF�MOVE‰MOVE.B„D0,(A5)+ ‰BRA‡DEC535DEC537ƒMOVE.B„D0,(A5)+ SPC 1* CALCULATE GOTO AND GO*‰MOVE.L„#2,D3…D3=�SIZE ‰LEA‡X(PC),A0 ‰ADD.L…D6,A0 SPC 1‰MOVE.L„#FOP,D0�.�1,4.‰LEA.L…(A3,D0),A6ŠA6�=�POINTER�FOR�OPERAND†1,4 SPC 1‰MOVE.W„(A4),D4ƒD4�=�FIRST�WORD )‰MOVE.B„#',',D5ƒD5�=�CONTAINS�ASCII�COMMA SPC 14‰MOVE.W„#EAM1FD,D7ŠD7�=�DATA�ALTERABLE�MODES�ALLOWED ‰JMP‡(A0)*8*‚A4�=�POINTER�TO�& DATA�IN�FRAME�CREATED�BY�'LINK�A1,...'*‚A5�=�POINTER�STORE�OP-CODE*‚A6�=�POINTER�STORE�OPERAND*‚D3�=�SIZE�=�2�BYTES*‚D4�=�FIRST�WORD2*‚D7�=�ADDRESS�MODES�ALLOWED�($1FD)�DATA�ALTERABLE PAGECOMMON4‚ADD.L…#2,D3…SIZE�=�4 SPC 1COMMONƒMOVE.L„D3,D6�D6�=�SIZE%‰MOVE.B„#'�',(A6)+ŠSPACE�AS�LAST�CHAR SPC 1(‰MOVE.L„A6,A5�SAVE�END�OF�BUFFER�POINTER‰MOVE.L„#FDATA,D0‹.�1,4‰LEA.L…(A3,D0),A6Š.�1,4 /COMMON35�MOVE.W„(A4)+,D0ŒGET�NEXT�WORD�OF�DATA.(‰ADD.L…#2,HISPC(A1)‡ADJUST�PROG�COUNTER.‰BSR‡PNT4HXŽFORMAT�DATA.�(A6)+ ‰SUB.B…#2,D3 ‰BNE‡COMMON35 &‰MOVE.L„A5,A6�A6�=�RESTORE�END�POINTER SPC 1&‰MOVE.L„A3,A5�A5�=‚BEGINNING�OF�BUFFER SPC 1(‰MOVE.L„HISPC(A1),A4‡MOVE�THE�UPDATED�PC‰UNLK†A1’TO�A4�AND�UNDO�FRAME. ‰RTS SPC 3 FERRORƒDSˆ0* ILLEGAL INSTRUCTION*‰MOVE.L„#FOC,D0�.�1,4‰LEA.L…(A3,D0),A6Š.�1,4 ‰MOVE.L„A6,A5�.�3,0‰MOVE.W„#BUFSIZE-FOC-1,D0ƒ.�3,00FERROR33�MOVE.B„#'�',(A5)+ŠSPACE�FILL�BUFFER�3,0‰DBRA†D0,FERROR33‰.�3,0 ‰LEA‡MSG111(PC),A5FERROR35�MOVE.B„(A5)+,D0‰CMP.B…#EOT,D0‰BEQ.S…FERROR39‰MOVE.B„D0,(A6)+ ‰BRA‡FERROR35 FERROR39�DSˆ0 SPC 1‰MOVE.W„(A4),D0 ‰BSR‡PNT4HX SPC 1‰MOVE.L„#2,D3…SIZE SPC 1 ‰BRA�COMMON SPC 1MSG111ƒDC.B†'DC.W„$',EOT PAGE SPC 1!KI‡DC.W†$4AFB�KNOWN�ILLEGAL�CODES KIEND„DSˆ0 PAGE *‚\1ƒMASK*‚\2ƒOP-CODE�PATTERN*‚\3ƒGOTO�OFFSET*‚\4ƒINDEX�TO�OP-CODE C68†MACRO ‰DC.W†$\1 ‰DC.W†$\2‰DC.B†(\3-X)>>2‰DC.B†\4‰ENDM SPC 1TBLA…DC.L†TBL00�68000™3,0‰DC.L†TBL08�68008™3,0‰DC.L†TBL10�68010™3,0‰DC.L†TBL20�68010™3,0 TBLAE„DSˆ0 SPC 2TBL20„DS.B†0“68020™3,0TBL10„DS.B†0“68010™3,0‰C68‡FFFF,4E74,IRTD,66�RTD‘3,0"‰C68‡FFFE,4E7A,IMOVEC,67‹MOVEC�3,0-‰C68‡FFC0,42C0,IMVTFCR,59ŠMOVE.W‚FROM�CCR„3,0"‰C68‡FF00,0E00,IMOVES,68‹MOVES�3,0TBL08„DS.B†0“68008™3,0TBL00„DS.B†0“68000™3,0‰C68‡FEC0,E6C0,ISHIFT,56‹RO‰C68‡FEC0,E4C0,ISHIFT,57‹ROX‰C68‡FEC0,E2C0,ISHIFT,55‹LS‰C68‡FEC0,E0C0,ISHIFT,54‹AS‰C68‡F018,E018,ISHIFT,56‹RO‰C68‡F018,E010,ISHIFT,57‹ROX‰C68‡F018,E008,ISHIFT,55‹LS‰C68‡F018,E000,ISHIFT,54‹AS%‰C68‡F0C0,D0C0,FORM10EX,4ŠADD‡,A@‰C68‡F130,D100,FORM12,53‹ADDX‰C68‡F000,D000,FORM10EX,4ŒADD‰C68‡F1F8,C188,FORM9,50ŒEXG‰C68‡F1F8,C148,FORM8,50ŒEXG‰C68‡F1F8,C140,FORM7,50ŒEXG‰C68‡F1F0,C100,FORM12,49‹ABCD‰C68‡F1C0,C1C0,FORM6D,48‹MULS‰C68‡F1C0,C0C0,FORM6D,47‹MULU‰C68‡F000,C000,FORM10,2ŒAND%‰C68‡F0C0,B0C0,FORM10EX,6ŠCMP…,A@‰C68‡F138,B108,FORM12A,46‹CMPM‰C68‡F100,B100,IEOR,5ŽEOR‰C68‡F000,B000,FORM10EX,6ŒCMP&‰C68‡F0C0,90C0,FORM10EX,44‰SUB‡,A@‰C68‡F130,9100,FORM12,45‹SUBX‰C68‡F000,9000,FORM10EX,44‹SUB‰C68‡F1F0,8100,FORM12,43‹SBCD‰C68‡F1C0,81C0,FORM6D,42‹DIVS‰C68‡F1C0,80C0,FORM6D,41‹DIVU‰C68‡F000,8000,FORM10,40‹OR‰C68‡F100,7000,IMOVEQ,39‹MOVEQ‰C68‡FF00,6100,IBSR,51�BSR‰C68‡FF00,6000,IBSR,65�BRA‘1,3‰C68‡F000,6000,ICC,38ŽB‰C68‡F0F8,50C8,IDBCC,37ŽDB‰C68‡F0C0,50C0,SCC,36ŽS‰C68‡F100,5100,IQUICK,35‹SUBQ‰C68‡F100,5000,IQUICK,34‹ADDQ‰C68‡F1C0,41C0,FORM6A,33‹LEA‰C68‡F1C0,4180,FORM6D,32‹CHK"‰C68‡FFC0,4EC0,FORM11SL,31‰JMP‘1,4"‰C68‡FFC0,4E80,FORM11SL,30‰JSR‘1,4‰C68‡FFFF,4E77,CS21,29‹RTR‰C68‡FFFF,4E76,CS21,28‹TRAPV‰C68‡FFFF,4E75,CS21,27‹RTS‰C68‡FFFF,4E73,CS21,26‹RTE‰C68‡FFFF,4E72,ISTOP,25�STOP‰C68‡FFFF,4E71,CS21,24‹NOP‰C68‡FFFF,4E70,CS21,23‹RESET'‰C68‡FFF8,4E68,IMVFUSP,60ŠMOVE�FROM�USP%‰C68‡FFF8,4E60,IMVTUSP,60ŠMOVE�TO�USP‰C68‡FFF8,4E58,FORM5,22ŒUNLINK‰C68‡FFF8,4E50,ILINK,21ŒLINK‰C68‡FFF0,4E40,FORM4,20ŒTRAP/‰C68‡FF80,4C80,IMOVEMTR,15‰MOVEM�FROM�REGISTERS‰C68‡FFC0,4AC0,FORM1A,19‹TAS‰C68‡FF00,4A00,FORM1,18ŒTST‰C68‡FFF8,48C0,FORM3,17ŒEXT.L‰C68‡FFF8,4880,FORM3,16ŒEXT.W-‰C68‡FF80,4880,IMOVEMFR,15‰MOVEA�TO�REGISTERS‰C68‡FFF8,4840,FORM3,14ŒSWAP‰C68‡FFC0,4840,FORM11,13‹PEA‰C68‡FFC0,4800,FORM1A,12‹NBCD#‰C68‡FFC0,46C0,IMVTSR,59‹MOVE�TO�SR‰C68‡FF00,4600,FORM1,11ŒNOT%‰C68‡FFC0,44C0,IMVTCCR,59ŠMOVE�TO�CCR‰C68‡FF00,4400,FORM1,10ŒNEG‰C68‡FF00,4200,FORM1,9�CLR'‰C68‡FFC0,40C0,IMVFSR,59‹MOVE.W‚FROM‚SR‰C68‡FF00,4000,FORM1,8�NEGX‰C68‡F' 000,3000,IMOVE,59ŒMOVE.W‰C68‡F000,2000,IMOVE,60ŒMOVE.L‰C68‡F000,1000,IMOVE,58ŒMOVE.B‰C68‡FF00,0C00,IMMED,6�CMP‡#‰C68‡FF00,0A00,IMMED,5�EOR‡#‰C68‡FF00,0600,IMMED,4�ADD‡#‰C68‡FF00,0400,IMMED,3�SUB‡#‰C68‡FF00,0200,IMMED,2�AND‡#‰C68‡FF00,0000,IMMED,1�ORˆ#‰C68‡F138,0108,IMOVEP,0ŒMOVEP‰C68‡FFC0,08C0,ISETS,64ŒBSET‰C68‡FFC0,0880,ISETS,63ŒBCLR‰C68‡FFC0,0840,ISETS,62ŒBCHG‰C68‡FFC0,0800,ISETS,61ŒBTST‰C68‡F1C0,01C0,ISETD,64ŒBSET‰C68‡F1C0,0180,ISETD,63ŒBCLR‰C68‡F1C0,0140,ISETD,62ŒBCHG‰C68‡F1C0,0100,ISETD,61ŒBTST TBLE…DSˆ0 PAGE N68†MACRO‰DC.B†'\1',128+'\2'ˆ\1\2‰ENDM OPCTBLƒDSˆ0 ‰N68‡MOVE,P„0 ‰N68‡O,R‡1 ‰N68‡AN,D†2 ‰N68‡SU,B†3 ‰N68‡AD,D†4 ‰N68‡EO,R†5 ‰N68‡CM,P†6 ‰N68‡MOV,E…7 ‰N68‡NEG,X…8 ‰N68‡CL,R†9 ‰N68‡NE,G†10 ‰N68‡NO,T†11 ‰N68‡NBC,Dƒ12‰N68‡PEA.,L„13‰N68‡SWAP.,Wƒ14‰N68‡MOVE,M„15‰N68‡EXT.,W„16‰N68‡EXT.,L„17 ‰N68‡TS,T†18‰N68‡TAS.,B„19 ‰N68‡TRA,P…20 ‰N68‡LIN,K…21 ‰N68‡UNL,K…22‰N68‡RESE,T„23 ‰N68‡NO,P†24 ‰N68‡STO,P…25 ‰N68‡RT,E†26 ‰N68‡RT,S†27‰N68‡TRAP,V„28 ‰N68‡RT,R†29 ‰N68‡JS,R†30 ‰N68‡JM,P†31‰N68‡CHK.,W„32‰N68‡LEA.,L„33 ‰N68‡ADD,Q…34 ‰N68‡SUB,Q…35‰DC.B†128+'S'ƒ36 ‰N68‡D,B‡37‰DC.B†128+'B'ƒ38‰N68‡MOVEQ.,L‚.....39 ‰N68‡O,R‡40‰N68‡DIVU.,Wƒ41‰N68‡DIVS.,Wƒ42 ‰N68‡SBC,Dƒ43 ‰N68‡SU,B†44 ‰N68‡SUB,X…45 ‰N68‡CMP,M…46‰N68‡MULU.,Wƒ47‰N68‡MULS.,Wƒ48 ‰N68‡ABC,Dƒ49 ‰N68‡EX,G†50‰N68‡BS,R†.....51‰N68‡NUL,L….....52 ‰N68‡ADD,X…53 ‰N68‡A,S‡54 ‰N68‡L,S‡55 ‰N68‡R,O‡56 ‰N68‡RO,X†57‰N68‡MOVE.,Bƒ58‰N68‡MOVE.,Wƒ59‰N68‡MOVE.,Lƒ60 ‰N68‡BTS,T…61 ‰N68‡BCH,G…62 ‰N68‡BCL,R…63 ‰N68‡BSE,T…64‰N68‡BR,A†65œ1,3‰N68‡RT,D†66œ3,0‰N68‡MOVEC.,L‚67œ3,0‰N68‡MOVE,S„68œ3,0‰DS.B†0‰ENDéé ‰TTL‡MBSR/MBSR…IDNT†1,2‡MACSBUG�TYPE�SUBROUTINES�12/18/84 ‰OPT‡A±1,2$‰XDEF†MACSBUG,MTSETUP,OUTPUT,BUFSIZE ‰XDEF†PNT8HX ‰XDEF†PNT6HX ‰XDEF†PNT4HX ‰XDEF†PNT2HX ‰XDEF†PUTHEX ‰XDEF†HEX2DEC ‰XDEF†GETNUMD‰XDEF†GETDECNUŒ.�1,0‰XDEF†FRELADDR SPC 1‰XREF†ER ‰SECTIONƒ15  ‰PAGE**‚PRINT�HEX�ROUTINES*** PRINT 8 HEX CHARACTERS**‚D0,D1,D2�DESTROYED*PNT8HXƒSWAP�D0‚FLIP�REG�HALVES‰BSR.S‚PNT4HX‚DO�TOP�WORD‰SWAP�D0‚NOW�DO�LOWER�WORD ‰BRA.S�PNT4HX* PRINT 6 HEX CHARACTERSFRELADDR EQU *#PNT6HXƒSWAP�D0‚FLIP�REGISTER�HALVES ‰BSR.S�PNT2HX‰SWAP�D0‚FLIP�BACK�REG�HALVES * PRINT 4 HEX CHARACTERS IN D0.W PNT4HXƒMOVE.W�D0,D1‚SAVE�IN�TEMP*‰ROR.W‚#8,D0‚GET�BITS�15-8�INTO�LOWER�BYTE‰BSR.S‚PNT2HX‚PRINT�IT‰MOVE.W�D1,D0‚PULL�IT�BACK * PRINT 2 HEX CHARACTERS IN D0.B$PNT2HXƒMOVE.W�D0,D2‚SAVE�IN�TEMP�REG‰ROXR.W�#4,D0‚FORM�UPPER�NIBBLE)‰BSR.S�PUTHEX‚PUT�ASCII�INTO�PRINT�BUFFER ‰MOVE.W�D2,D0‚GET�BACK�FROM�TEMP3* CONVERT D0.NIBBLE TO HEX & PUT IT IN PRINT BUFFER*&PUTHEXƒAND.B�#$0F,D0‚SAVE�LOWER�NIBBLE‰OR.B�#$30,D0‚CONVERT�TO�ASCII‰CMP.B�#$39,D0ƒSEE�IF�IT�IS>9 ‰BLE.S�SAVHEX‰ADD�#7,D0‚ADD�TO�MAKE�10=>A-SAVHEXƒMOVE.B�D0,(A6)+�PUT�IT�IN�PRINT�BUFFER‰RTS‹PAGE***ƒPRINT�HEX�(ZERO�SURPRESS)*(PNTZHXƒCLR.L�D4‚IS�ZERO�WHEN�SURPRESSING‰MOVE.L�D0,D1‚SAVE�IN�TEMP‰BEQ.S�PNTZ81‚IF�ZERO ‰BPL.S�PNTZ0"‰NEG.L�D1‚CHANGE�TO�POSITIVE�VALUE.‰BMI.S‚PNTZ81�WATCH�OUT�SPECIAL�CASE�$80000000'‰MOVE.B�#'-',(A6)+‚PUT�SIGN�INTO�BUFFER(PNTZ0„MOVE.L�#8,D2ƒ8�POSSIBLE�CHARACTERSPNTZ1„MOVE.L�D1,D0‚UNSAVE�IT"‰MOVE.L�D2,D3�COUNT�DOWN�FROM�HERE‰SUB.L�#1,D3‚BACK�OFF�ONE#‰BEQ.S�PNTZ4‚IF�NO�ROTATE�SKIP�THISPNTZ2„ASR.L�#4,D0‚ROTATE�LRIGHT$‰AND.L�#$FFFFFFF,D0‚CLEAR�TOP�NIBBLE ‰SUB.L�#1,D3 ‰BNE�PNTZ2' #PNTZ4„AND.B�#$F,D0‚SAVE�ONLY�NIBBLE ‰BNE.S�PNTZ3"‰TST.B�D4‚SEE�IF�STILL�SURPRESSING ‰BEQ.S�PNTZ8)PNTZ3„BSR�PUTHEX‚PUT�A�HEX�CHAR�IN�BUFFER*‰MOVE.B�D0,D4‚MARK�AS�NON-SURPRESSING�MODE!PNTZ8„SUB.L�#1,D2„DO�ANOTHER�CHAR ‰BNE�PNTZ1áUêVòLúN$!‰TST.B�D4‚SEE�IF�ANYTHING�PRINTED ‰BNE.S�PNTZ9/PNTZ81ƒMOVE.B�#'0',(A6)+‚MOVE�AT�LEAST�ONE�ZERO PNTZ9„RTS PAGE,*ƒROUTINES�TO�CONVERT�STRING�TO�BINARY�VALUE**ˆACCEPTS�PREFIXES: *‰%�binary *‰@�octal *‰&�decimal*‰$�hex*)GETNUMD‚BSR.S…GETDECNUŒGET�DECIMAL�NUMBERGETNUMD9�BNE‡ERROR‰RTS %GETNUMA‚BSR.S…GETHEXNUŒGET�HEX�NUMBER ‰BRA‡GETNUMD9 :GETDECNU�MOVEM.LƒD1-D5/A0,-(A7)†DECODE�AS�A�DECIMAL�NUMBER"‰MOVE.L„#10,D3ŽD3�=�BASE�(DECIMAL) ‰BRA.S…GETN20 SPC 26GETHEXNU�MOVEM.LƒD1-D5/A0,-(A7)†DECODE�AS�A�HEX�NUMBER‰MOVE.L„#16,D3„D3�=�BASE SPC 1+GETN20ƒCLR.W…D4ˆD4�=�FLAG�FOR�CHARACTER�HIT‰CLR.L…D1ˆD1�=�TEMP�RESULTS‰CMP.B…#'�',(A5)%‰BEQ.S…GETN80ŽFIRST�CHAR�SPACE;�ERROR *GETN30ƒCMP.L�A6,A5ƒSEE�IF�AT�END�OF�BUFFER ‰BEQ.S…GETN90 ‰CLR.L…D0‰MOVE.B„(A5)+,D0ŒD0�=�CHARACTER SPC 1/‰LEA‡GETNDATA(PC),A0…POINTER�TO�TERMINATE�CHARS,GETN40ƒMOVE.B„(A0)+,D5ŒD5�=�TERMINATION�CHAR‰BEQ.S…GETN50ŽNOT�TERM.CHAR ‰CMP.B…D5,D0*‰BEQ.S…GETN85ŽFOUND�TERMINATION�CHAR;�EXIT ‰BRA‡GETN40 SPC 1-GETN50ƒCMP.B…#'%',D0�SEE�IF�FLAGGED�AS�BINARY ‰BNE.S…GETN60‰MOVE.L„#2,D3�BASE�IS�BINARY GETN55ƒTST.W…D4’ANYTHING�ENTERED‰BNE.S…GETN80ŽCONFLICT *GETN57ƒMOVE.L„#-1,D4ŽSET�DATA�ENTERED�FLAG ‰BRA‡GETN30 ,GETN60ƒCMP.B…#'@',D0�SEE�IF�FLAGGED�AS�OCTAL ‰BNE.S…GETN65‰MOVE.L„#8,D3�BASE�IS�OCTAL ‰BRA‡GETN55 .GETN65ƒCMP.B…#'&',D0�SEE�IF�FLAGGED�AS�DECIMAL ‰BNE.S…GETN70‰MOVE.L„#10,D3ŽBASE�IS�DECIMAL ‰BRA‡GETN55 SPC 1*GETN70ƒCMP.B…#'$',D0�SEE�IF�FLAGGED�AS�HEX ‰BNE.S…GETN75‰MOVE.L„#16,D3ŽBASE�IS�16 ‰BRA‡GETN55 SPC 1GETN75ƒSUB.B…#$30,D0‰BLT.S…GETN80ŽLESS�THAN�ZERO ‰CMP.B…#9,D0‰BLE.S…GETN77ŽVALUE�0�-�9‰CMP.B…#$11,D0‰BLT.S…GETN80ŽLESS�THAN�A‰CMP.B…#$16,D0‰BGT.S…GETN80ŽGREATER�THAN�F‰SUB.B…#7,D0�MAKE�BINARY ,GETN77ƒCMP.W…D3,D0�IS�INPUT�LARGER�THAN�BASE‰BCC.S…GETN80ŽLARGER�THAN�BASE+‰MOVE.L„D1,D2�GET�READY�TO�MULTIPLY�D1*BASE‰SWAP†D1‰MULU†D3,D1ƒTOP�PART‰SWAP†D1‰TST.W…D1ƒCHECK�FOR�OVERFLOW ‰BNE.S…GETN80ŽVALUE�IS�TOO�LARGE ‰MULU†D3,D2‚NOW�WORK�ON�LOW�WORD!‰ADD.L…D2,D1‚PUT�IT�BACK�TOGETHER‰BVS.S…GETN80‚OVERFLOW?‰ADD.L…D0,D1‚ADD�IN�NEW�STUFF ‰BVC‡GETN57'GETN80ƒMOVE.L„#-1,D0ŽERROR�RETURN�(BNE) ‰BRA.S…GETN95 :GETN85ƒSUB.L…#1,A5…BACK�UP�TO�POINT�AT�SPACE/PREVIOUS�CHAR,GETN90ƒMOVE.L„D1,D0…SET�UP�RESULT�FOR�RETURN‰CLR.L…D1’NORMAL�RETURN�(BEQ)4GETN95ƒMOVEM.Lƒ(A7)+,D1-D5/A0†RESTORE�SOME�REGISTERS‰RTS -GETNDATA�DC.B†'�(+,-.:;=^]',0†TERMINATE�CHARS‰PAGE*0*‚***GETHEX***‚GET�HEX�(BINARY�VALUE�FROM�ASCII)**ƒD0.B�HAS�ASCII�CHAR‚RETURNS�$0-$F�BINARY*)GETHEX�CMP.B�#$30,D0‚IS�IT�LESS�THAN�ZERO‡BLT.S�PNMSG011#‡CMP.B�#$39,D0‚IS�IT�GREATER�THAN�9‰BLE.S…GTHX2…GOOD�HEX SPC 1"‡CMP.B�#$41,D0‚IS�IT�LESS�THAN�'A'‡BLT.S‡PNMSG011‡CMP.B�#$46,D0‚IS�IT�GT�'F'‡BGT.S‡PNMSG011!‡SUB.B�#7,D0‚MAKE�IT�SMALLER�A=10GTHX2„AND.L…#$F,D0‰RTS SPC 3 PNMSG011�DS„0 ERROR„BRA‡ER PAGE*>*„CONVERT�BINARY�TO�DECIMAL‚REG�D0�PUT�IN�(A6)�BUFFER�AS�ASCII*0HEX2DEC‚MOVEM.LƒD1-D4/D6-D7,-(A7)ƒSAVE�REGISTERS‰MOVE.L�D0,D7‚SAVE�IT�HERE ‰BPL.S�HX2DC‰NEG.L�D7‚CHANGE�TO�POSITIVE%*ˆBMI.S…HX2DC57ƒSPECIAL�CASE�(-0)—1,1"‰MOVE.B�#'-',(A6)+‚PUT�IN�NEG�SIGN HX2DC„CLR.W…D4ˆFOR�ZERO�SURPRESS‰MOVE.L�#10,D6‚COUNTER HX2DC0ƒMOVE.L�#1,D2‚VALUE�TO�SUB‰MOVE.L�D6,D1‚COUNTER'‰SUB.L�#1,D1‚ADJUST�-�FORM�POWER�OF�TEN‰BEQ.S�HX2DC2‚IF�POWER�IS�ZERO!HX2DC1ƒMOVE.W�D2,D3‚D3=LOWER�WORD ‰MULU�#10,D3‰SWAP�D2ƒD2=UPPER�WORD ‰MULU�#10,D2‰SWAP�D3ƒADD�UPPER�TO�UPPER ‰ADD.W�D3,D2‰SWAP�D2‚PUT�UPPER�IN�UPPER‰SWAP�( D3‚PUT�LOWER�IN�LOWER‰MOVE.W�D3,D2‚D2=UPPER�&�LOWER ‰SUB.L�#1,D1 ‰BNE�HX2DC1HX2DC2ƒCLR.L�D0‚HOLDS�SUB�AMTHX2DC22‚CMP.L�D2,D7)‰BCS.S�HX2DC3‚IF�NO�MORE�SUB�POSSIBLE—1,1‰ADD.L�#1,D0‚BUMP�SUBS(‰SUB.L�D2,D7‚COUNT�DOWN�BY�POWERS�OF�TEN‰BRA.S�HX2DC22‚DO�MOREHX2DC3ƒTST.B�D0‚ANY�VALUE? ‰BNE.S�HX2DC4‰TST.W…D4ˆZERO�SURPRESS ‰BEQ.S�HX2DC5$HX2DC4ƒADD.B�#$30,D0‚BINARY�TO�ASCII‰MOVE.B�D0,(A6)+‚PUT�IN�BUFFER'‰MOVE.B„D0,D4…MARK�AS�NON�ZERO�SURPRESSHX2DC5ƒSUB.L�#1,D6…NEXT�POWER ‰BNE�HX2DC0!‰TST.W…D4ˆSEE�IF�ANYTHING�PRINTED ‰BNE.S�HX2DC6.HX2DC57‚MOVE.B�#'0',(A6)+‚PRINT�AT�LEST�A�ZERO2HX2DC6ƒMOVEM.Lƒ(A7)+,D1-D4/D6-D7ƒRESTORE�REGISTERS‰RTS‚END�OF�ROUTINE MACSBUG‚BRA‡* MTSETUP‚BRA‡* OUTPUTƒBRA‡*BUFSIZE‚EQU‡128 ‰END PAGE* DECODE AS A NUMBER8GETNUMD‚MOVEM.LƒD1-D5/A0,-(A7)†ENTRY�FOR�DECIMAL�DEFAULT‰MOVE.W„#10,D3ŽD3�=�BASE ‰BRA.S…GETN SPC 2* ENTRY FOR HEX-GETNUMA‚MOVEM.LƒD1-D5/A0,-(A7)†SAVE�REGISTERS‰MOVE.W„#16,D3„D3�=�BASE SPC 1)GETN…CLR.W…D4ˆD4�=�FLAG�FOR�CHARACTER�HIT ‰CLR.L�D0‰CLR.L�D1‚WHERE�TO�PUT�RESULTS*NXTNUMƒCMP.L�A6,A5ƒSEE�IF�AT�END�OF�BUFFER ‰BEQ.S…EXITGN‰MOVE.B�(A5)+,D0‚GRAB�CHARACTER‰CMP.B�#$20,D0„CHECK�FOR�SPACE‰BNE.S�GETNUM3!‰TST.W…D4ˆSEE�IF�ANYTHING�ENTERED#‰BEQ.S�NXTNUMƒIF�NOT�SCAN�NEXT�CHAR;GETNUM2‚SUB.L…#1,A5…BACK�UP�TO�POINT�AT�SPACE/PREVIOUS�CHAR,EXITGNƒMOVE.L„D1,D0…SET�UP�RESULT�FOR�RETURN.‰MOVEM.Lƒ(A7)+,D1-D5/A0†RESTORE�SOME�REGISTERS‰RTS SPC 3)GETNUM3‚CMP.B�#$27,D0ƒSEE�IF�SINGLE�QUOTE‰BEQ.S…GETNUMST‚GET�NUM�STRING SPC 1/‰LEA‡GETNDATA(PC),A0…POINTER�TO�TERMINATE�CHARSGETNUM31�MOVE.B„(A0)+,D5‰BEQ.S…GETNUM37ŒNOT�TERM.CHAR ‰CMP.B…D5,D0‰BEQ‡GETNUM2�FOUND�CHAR ‰BRA‡GETNUM31 SPC 1,GETNDATA�DC.B†'(+,-.:;=^]',0†TERMINATE�CHARS SPC 10GETNUM37�CMP.B�#'&',D0ƒSEE�IF�FLAGGED�AS�DECIMAL‰BNE.S�GETNUM41!‰TST.W…D4’SEE�IF�ANYTHING�DECODED ‰BNE.S…ERROR1‰MOVE.W�#10,D3„BASE�IS�DECIMAL SPC 1-GETNUM39�MOVE.L„#-1,D4„FLAG�AS�SOMETHING�READ ‰BRA�NXTNUM SPC 1,GETNUM41�CMP.B�#'$',D0„SEE�IF�FLAGGED�AS�HEX‰BNE.S�GETNUM5!‰TST.W�D4„SEE�IF�ANYTHING�DECODED ‰BNE.S�ERROR1‰MOVE.W�#16,D3„BASE�IS�16 ‰BRA‡GETNUM39 SPC 1+GETNUM5‚BSR.S…GETHEX‚RETURNS�WITH�D0=BINARY&‰CMP.W…D3,D0ƒIS�INPUT�LARGER�THAN�BASE ‰BHI.S�ERROR1+‰MOVE.L�D1,D2ƒGET�READY�TO�MULTIPLY�D1*BASE‰SWAP�D1‰MULU†D3,D1ƒTOP�PART‰SWAP�D1‰TST.W�D1ƒCHECK�FOR�OVERFLOW ‰BNE.S�ERROR1‚VALUE�IS�TOO�LARGE ‰MULU†D3,D2‚NOW�WORK�ON�LOW�WORD!‰ADD.L�D2,D1‚PUT�IT�BACK�TOGETHER‰BVS.S�ERROR1‚OVERFLOW?‰ADD.L�D0,D1‚ADD�IN�NEW�STUFF ‰BVC‡GETNUM39 ERROR1ƒBRA‡ER SPC 17GETNUMST�TST.L�D1‚IF�SOMETHING�IS�BEFORE�THIS�ERROR�OUT‰BNE.S�EXITSYN‰MOVE.L�#5,D2‚COUNTER'GETNUMS1�MOVE.B�(A5)+,D0‚LOAD�CHARACTER"‰CMP.B�#$27,D0„SEE�IF�SINGLE�QUOTE‰BEQ�GETNUM2�WHERE�TO�GO�IF�END(‰LSL.L�#8,D1‚MAKE�ROOM�FOR�NEW�CHARACTER‰MOVE.B�D0,D1‚NEW�BYTE$‰CMP.L�A6,A5†SEE�IF�AT�END�OF�BUFFER(‰BEQƒEXITGN…WHERE�TO�GO�IF�END�OF�BUFFER ‰SUB.L�#1,D2 ‰BNEƒGETNUMS1+EXITSYN‚BRA…ERƒNO�CLOSING�QUOTE�OR�TOO�LONG‰PAGE*0*‚***GETHEX***‚GET�HEX�(BINARY�VALUE�FROM�ASCII):*ƒD0.B�HAS�ASCII�CHAR‚RETURNS�$0-$F�BINARY�OR�$FF�ON�ERROR*)GETHEX�CMP.B�#$30,D0‚IS�IT�LESS�THAN�ZERO‡BLT.S�PNMSG011#‡CMP.B�#$39,D0‚IS�IT�GREATER�THAN�9‰BLE.S…GTHX2…GOOD�HEX SPC 1"‡CMP.B�#$41,D0‚IS�IT�LESS�THAN�'A'‡BLT.S‡PNMSG011‡CMP.B�#$46,D0‚IS�IT�GT�'F'‡BGT.S‡PNMSG011!‡SUB.B�#7,D0‚MAKE�IT�SMALLER�A=10GTHX2„AND.L…#$F,D0‰RTS SPC 1 éé( éé' SYMBUG CODE68K SA®‰rrDCODE68KSAÇÇ�mrrERRMSGS SAXXŒrrIODB SAqq&ürrMBSR SAšš &rrMM SAÃÃ3rrSIMBO SAüüRrrSYMSUBIISAQCüƒrrUTILITY SAXX yrr‰TTL‡68K�ONE�LINE�ASSEMBLER0CODE68K‚IDNT†3,2‡68K�ONE�LINE�ASSEMBLER’08/31/83 0*‚VERSION�3,0‚INCLUDES�THE�CHANGES�FOR‚THE�68010*‚VERSION�3,2‚INCLUDES:*…1.‚ADDED�OP-CODESƒBHS‚&�BLO*…2.‚BUG�FIX�ADD�SUB *H*„CHANGED�12/28/81�TO�ALLOW�SYMBOLIC�ENTRIES�FOR�'[#]'�-->�BY�P.Z.* ‰XDEF†CODE68K‰XDEF†CODE68Mƒ.§3,0‰XDEF†ERˆUSED�BY�MBSR ‰XREF†PNT2HX ‰XREF†GETNUMD SPC 1I* 01234567890123456789012345678901234567890123456789012345678901234567890@*�AAAAAA:MODULEXX:3�DDDDDDDDDDDDDDDDDDDD�LLLLLLLL�OPCODE‚OPERAND*“FDATA�FOL†FOC…FOP * D3 = PROCESSOR TYPE*„=�0000ƒ68000*„=�0004ƒ68008*„=�0008ƒ68010*„=�000Cƒ68020 * A3 = STORE POINTER* A4 = PROGRAM COUNTER* A5 = SOURCE PTR BEGINNING=*�A6�=�SOURCE�PTR�END+1‚******ƒBASE�ADDR�FOR�SYMBUG�SECTION�0* *ƒBSR‚CODE68M ,*‚BSR�CODE68K‚"IS�RETAINED�FOR�COMPATIBILTY"  OUTBSIZE�EQU‡80ˆBUFFER�SIZEFDATA„EQU‡18ˆOFFSET�TO�DATAFOL†EQU‡39ˆOFFSET�TO�LABEL-FOC†EQU‡48ˆOFFSET�TO�OP-CODE�(NO�LABEL�FIELD)-FOP†EQU‡56ˆOFFSET�TO�OPERAND�(NO�LABEL�FIELD) ‰OFFSET„0 ESKB…DSˆ0 TDATA„DS.B†10 TNB†DS.B†1 TLSPECƒDS.B†1TLENGTH‚DS.W†1PCOUNTER�DS.L†1PTROP„DS.L†1“POINTER�TO�OPERAND'PENDOPƒDS.L†1“POINTER�TO�END�OF�OPERAND$PTRBUFƒDS.L†1“POINTER�TO�SOURCE�CODE0PTRBUFE‚DS.L†1“POINTER�TO�END�OF�FORMATED�SOURCE PRTYPEƒDS.W†1“PROCESSOR�TYPE�3,0LINK…DS.L†1“SAVE�FOR�UNLINK ESKE…DS.B†0 ‰SECTIONƒ9 XBASE„DSˆ0 * EVALUATE EXPRESSION!*‚NUMBER�PLUS�OR�MINUS�NUMBER....*EV‡DSˆ0‰MOVE.L„D7,-(A7)ŒSAVE�D7 ‰CLR.L…D7"GETEXP21�BSR.S…GETFIELDŒGET�NUMBER$‰ADD.L…D0,D7�D7�=�NUMBER�BEING�BUILT.GETEXP15�MOVE.B„(A5)+,D1ŒD1�=�TERMINATING�CHAR(‰CLR.L…D0’D0�=�NEXT�NUMBER�(=0�1ST�TIME)‰CMP.B…#'+',D1‰BEQ‡GETEXP21ŒPLUS‰CMP.B…#'-',D1‰BNE.S…GETEXP39ŒNOT�MINUS‰BSR.S…GETFIELDŒGET�NEXT�NUMBER ‰SUB.L…D0,D7 ‰BRA‡GETEXP15 SPC 1&GETEXP39�MOVE.L„D7,D0�D0�=�VALUE�BUILT'‰SUB.L…#1,A5�A5�=�CHAR�AFTER�EXPRESSION‰MOVE.L„(A7)+,D7ŒRESTORE�D7‰RTS PAGE GETFIELD�DSˆ0‰CMP.B…#'*',(A5) WUQ'y/n7m?FGMOEWP_XgRoyw‚t‡}�z—jŸr§b¯_·d‰BNE.S…GETF305 "‰MOVE.L„D4,D0�D0�=�PROGRAM�COUNTER ‰ADD.L…#1,A5‰BRA.S…GETF333 GETF305‚CMP.B…#$27,(A5)‰BNE.S…GETF325�NOT�LITERAL ‰ADD.L…#1,A5 ‰CLR.L…D0 ‰MOVE.W„TLENGTH(A1),D1†D1�=�SIZE‰BEQ.S…GETF308�.B�=�0‰LSR.W…#5,D1�.W�=�) 1‰SUB.L…#1,D1�.L�=�3GETF308 GETF311‚LSL.L…#8,D0‰MOVE.B„(A5)+,D0‰CMP.B…#$27,(A5)‰BEQ.S…GETF312�CLOSING�QUOTE‰DBF‡D1,GETF311ER1†BRA‡ER’OVERFLOW–2,3 +GETF312‚ADD.L…#1,A5�MOVE�PAST�CLOSING�QUOTE‰BRA.S…GETF314 GETF313‚LSL.L…#8,D0%GETF314‚DBF‡D1,GETF313ŠLEFT�NORNALIZE‰BRA.S…GETF333 $GETF325‚MOVE.L„A3,-(A7)ŒSAVE�A3—3/82;‰MOVE.L„PTRBUFE(A1),A3†A3�MUST�BE�END�OF�BUFFER�FOR�GETNUMD‰BSR‡GETNUMD�GET�DECIMAL�NUMBER‰MOVE.L„(A7)+,A3ŒRESTORE�A3‰BNE‡ER’UNSUCCESSFUL�CONVERSION GETF333‚RTS SPC 2* FIND AND SET SIZE* BIT 5432109876543210*…........00......‚=�BYTE*…........01......‚=�WORD*…........10......‚=�LONG*'FSIZE„OR.W†TLENGTH(A1),D2ŠSET�SIZE�BITS‰RTS PAGE*‚D0�=�VALUE�0�-�7*‚D1�=�0�IF�D@ *…=�8�IF�A@*GETREGD‚CLR.L…D1&‰CMP.B…#'D',(A5)‹IS�FIRST�CHAR�=�'D'�?)‰BNE.S…NOTREGŽNO,�NOT�A�'D'-TYPE�REGISTERGET41„CLR.L…D0’YES$‰MOVE.B„1(A5),D0ŒGET�REGISTER�NUMBER‰SUB.B…#'0',D0�LESS�THAN�0�?!‰BMI.S…NOTREGŽYES,�NOT�A�REGISTER"‰CMP.B…#$7,D0ŽNO,�GREATER�THAN�7�?!‰BGT.S…NOTREGŽYES,�NOT�A�REGISTER)‰ADD.L…#2,A5�NO,�SET�A5�TO�DELIMETER�CHAR)‰LEA‡GETNDATA(PC),A0…GET�VALID�DELIMETERS.GETDELIM�TST.B…(A0)�AT�END�OF�DELIMETERS�?ˆ3,1(‰BEQ.S…NOTREGS�YES,�NOT�A�VALID�REGISTER)‰CMPM.B„(A5)+,(A0)+‰NO,�DELIMETER�FOUND�?‰BEQ.S…HAVEITŽYES&‰SUB.L…#1,A5�NO,�RESET�A5�TO�DELIMETER‰BRA.S…GETDELIMŒKEEP�LOOKING (HAVEITƒSUB.L…#1,A5�RESET�A5�TO�DELIMETER)‰MOVE†#4,CCRŽSET�REGISTER�FOUND�CONDITION‰RTS 1NOTREGS‚SUB.L…#2,A5�RESET�A5�TO�START�OF�REGISTER‰BRA.S…NOTREGŽSIGNAL�NOT�FOUNDGETNDATA�DC.B†'�,).-/',0Š.�3,0 #GETREGA‚MOVE.L„#8,D1�SET�FOR�A@”3,0&‰CMP.B…#'A',(A5)‹IS�FIRST�CHAR�=�'A'�?*‰BNE.S…NOTREGŽNO,�NOT�AN�'A'-TYPE�REGISTER‰BRA‡GET41�YES GETREGAD�CLR.L…D1’SET�FOR�D@&‰CMP.B…#'D',(A5)‹IS�FIRST�CHAR�=�'D'�?(‰BEQ‡GET41�YES,�MAY�BE�'D'-TYPE�REGISTER ‰MOVE.L„#8,D1�NO,�SET�FOR�A@�3,0&‰CMP.B…#'A',(A5)‹IS�FIRST�CHAR�=�'A'�?(‰BEQ‡GET41�YES,�MAY�BE�'A'-TYPE�REGISTER5NOTREGƒMOVE†#0,CCRŽNO,�RESET�REGISTER�FOUND�CONDITION‰RTS SPC 2/GETREGSR�MOVEQ…#2,D0�SET�D0�FOR�2�CHAR�REGISTER‰CMP.B…#'S',(A5)‹'SR'�?‰BNE.S…NOTREGŽNO‰CMP.B…#'R',1(A5)‰BNE.S…NOTREGŽNO.TERM…CMP.B…#',',(A5,D0)ˆYES,�DELIMETER�=�','�?‰BEQ.S…ISREG�YES)‰CMP.B…#'�',(A5,D0)ˆNO,�DELIMETER�=�'�'�?‰BNE.S…NOTREGŽNO,ISREG„ADD.L…D0,A5�YES,�MOVE�A5�PAST�REGISTER!‰CLR.L…D5’SET�REGISTER�FOUND�FLAG‰RTS GETREGUS�CMP.B…#'U',(A5)‹'USP'�?‰BNE.S…NOTREGŽNOTESTSPƒCMP.B…#'S',1(A5)‰BNE.S…NOTREGŽNO‰CMP.B…#'P',2(A5)‰BNE.S…NOTREGŽNO1MOVE3„MOVEQ…#3,D0�YES,�SET�D0�FOR�3�CHAR�REGISTER‰BRA.S…TERM�FIND�DELIM�CHAR GETREGSS�CMP.B…#'S',(A5)‹'SSP'�?‰BNE.S…NOTREGŽNO‰BRA.S…TESTSPŽMAYBE GETREGCR�CMP.B…#'C',(A5)‹'CCR'�?‰BNE.S…NOTREGŽNO‰CMP.B…#'C',1(A5)‰BNE.S…NOTREGŽNO‰CMP.B…#'R',2(A5)‰BNE.S…NOTREGŽNO,‰BRA.S…MOVE3�YES,�SET�D0�AND�FIND�DELIM�CHAR PAGE(EADA…MOVE.W„#$1FD,D7ŒDATA�ALTERABLE�ONLY ‰BRA.S…EA SPC 1 EAC†MOVE.W„#$7E4,D7ŒCONTROL�ONLY ‰BRA.S…EA SPC 1)EAM†MOVE.W„#$1FC,D7ŒMEMORY�ALTERABLE�ONLY ‰BRA.S…EA SPC 1"EAZ†MOVE.W„#$800,D7ŒIMMEDIATE�ONLY ‰BRA.S…EA 'EADADDR‚MOVE.W„#$FFD,D7‚DATA�ADDRESSING ‰BRA.S…EA (EAA†MOVE.W„#$1FF,D7ŒALTERABLE�ADDRESSING ‰BRA.S…EA EAALL„MOVE.W„#$FFF,D7‚ALL�MODES SPC 4*†MODES�ALLOWED�(D7)#*‚...............1‚D@�DATA�REGISTER*‚..............1.‚A@*‚.............1..‚(A@)*‚............1...‚-(A@)*‚...........1....‚(A@)+*‚..........1.....‚DATA(A@)*‚.........1......‚DATA(A@,R@)*‚........1.......‚DATA‚(SHORT)*‚.......1........‚DATA‚(LONG)*‚......1.........‚DATA(PC)*‚.....1..........‚DATA(PC,R@)*‚....1...........‚#DATA SPC 2* D0 = VALUE CALCULATED** D2 = MASK WORD (1ST WORD OF INSTRUCTION)'* D3 = OFFSET FOR DATA STORE (TDATA+..)* D4 = EXTENSION WORD * D5 = $*�D6�=�MODE�AS�BUILTƒ.........XXXXXX* D7 = MODES ALLOWED*4* A4 = BASE ADDRESS FOR DATA STORE (TDATA+..)[A4,D3]EA‡DSˆ0‰CLR.L…D5’ZERO�VALUE‰CLR.L…D6’MODE�=�000000‰CMP.B…#'#',(A5) ‰BNE.S…EA10 PAGE* IMMEDIATE MODE ‰BTST†#11,D7‰BEQ.S) …ER5‘.�3,0 ‰MOVE.B„#$3C,D6�D6�=�MODE‚111100 ‰ADD.L…#1,A5 ‰BSR‡EV’EVALUATE�EXPRESSION‰MOVE.L„D0,D5�D5�=�VALUE ‰TST.B…TLSPEC(A1)Š.�1,3.‰BEQ.S…EA0633Ž.SIZE�NOT�SPECIFIED�(.W�ASSUMED) ‰MOVE.W„TLENGTH(A1),D0‰BEQ.S…EA0635Ž.BYTE ‰TST.B…D0‰BMI.S…EA0637Ž.LONG EA0633ƒBSR‡EA16BIT�.WORDEA0634ƒMOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1)ŠBYTE�COUNT‰ADD.L…#2,D3�OFFSET‰RTS EA0635ƒBSR‡EA8BIT‰BEQ‡EA0634Ž.�3,0ER5†BRA‡ER’.�3,0 EA0637ƒMOVE.L„D5,(A4,D3)‰ADD.B…#4,TNB(A1) ‰ADD.L…#4,D3‰RTS PAGE EA10…DSˆ0‰CMP.B…#'-',(A5) ‰BNE.S…EA11 ‰CMP.B…#'(',1(A5)‰BNE‡EA41�MAY�BE�"- ‰ADD.L…#2,A5%‰MOVE.W„#$0020,D6‹MODE�=�-(A@)„100AAA ‰BTST†#4,D7"‰BEQ‡ER5‘THIS�MODE�NOT�ALLOWED‰3,0 ‰BSR‡GETREGA‰BNE‡ER5‘.�3,0 ‰OR.W†D0,D6 ‰CMP.B…#')',(A5)+‰BNE.S…ER5‘NO�CLOSING�PARINŽ1,2‰RTS EA11…BSR‡GETREGA ‰BNE.S…EA21 ‰MOVE.B„#$08,D6�MODE�=�001... ‰BTST†#1,D7‰BEQ.S…ER5‘MODE�NOT�ALLOWEDŽ1,2 ‰OR.W†D0,D6‰RTS EA21…BSR‡GETREGD ‰BNE.S…EA31 ‰BTST†#0,D7‰BEQ.S…ER5‘MODE�NOT�ALLOWEDŽ1,2‰OR.W†D0,D6�MODE�=�D@ƒ000AAA‰RTS PAGEEA31…CMP.B…#'(',(A5) ‰BNE.S…EA41 * POSSIBLE*‚(A@)*‚(A@)+#*‚(A@,R@)‚IMPLIED�ZERO�DISPLACEMENT* ‰ADD.L…#1,A5 ‰BSR‡GETREGA‰BNE.S…ER3‘.�2,3 ‰OR.W†D0,D6 ‰MOVE.B„(A5)+,D0‰CMP.B…#',',D0/‰BEQ‡EA5116ŽMODE�=�(A@,R@)‚;IMPLIED�D5�=�0�DATA !‰CMP.B…#')',D0�LOOK�FOR�CLOSING�)‰BNE.S…ER3‘.�1,2 ‰CMP.B…#'�',(A5)‹LOOK�FOR�BLANK‰BEQ.S…EA35�MODE�=�(A@) ‰CMP.B…#'+',(A5) ‰BNE.S…EA35 ‰ADD.L…#1,A5 !‰OR.W†#$18,D6ƒMODE�=�011...„(A@)+ ‰BTST†#3,D7‰BEQ.S…ER3‘MODE�NOT�ALLOWEDŽ1,2 ‰RTS›.�1,2 $EA35…OR.W†#$10,D6�MODE�=�010...ƒ(A@) ‰BTST†#2,D7‰BEQ.S…ER3‘MODE�NOT�ALLOWEDŽ3,0‰RTS›MODE�ALLOWED’3,0 PAGE * POSSIBLE*ƒ *ƒ.W *ƒ.L *ƒ(A@)*ƒ(A@,R@)*ƒ(A@,R@.W)*ƒ(A@,R@.L) *ƒ(PC)*ƒ(PC,R@)*ƒ(PC,R@.W)*ƒ(PC,R@.L)*EA41…BSR‡EV’EVALUATE�EXPRESSION‰MOVE.L„D0,D5�D5�=� ‰MOVE.B„(A5),D0‰CMP.B…#',',D0 ‰BEQ.S…EA4102‰CMP.B…#'�',D0 ‰BNE.S…EA4120 *‚‰ONLY* CHECK IF NEGATIVE NUMBEREA4102ƒMOVE.L„D5,D0‰BPL.S…EA4105ŽPOSITIVE�NUMBER‰NOT.L…D0’.�1,3EA4105ƒAND.W…#$8000,D0‹.�1,3 ‰TST.L…D0‰BNE.S…EA4135Ž.LONG™1,3 *‚.W‰BTST†#7,D7�.�1,1‰BNE.S…EA4127ŽSHORT�ALLOWED‘1,1‰BTST†#15,D7Ž.�1,1‰BNE.S…EA4135ŽFORCE�LONG”3,0ER3†BRA‡ER’MODE�NOT�ALLOWEDŽ3,0 +EA4127ƒOR.W†#$38,D6�EA�=�ABSOULTE�SHORT‹1,1‰MOVE.W„D5,(A4,D3)ŠD5�=�DATA‰ADD.B…#2,TNB(A1)ŠBYTE�COUNT ‰ADD.L…#2,D3‰RTS *‚.L&EA4135ƒOR.W†#$39,D6�EA�=�ABSOLUTE�LONG‰MOVE.L„D5,(A4,D3)‰ADD.B…#4,TNB(A1)ŠBYTE�COUNT ‰ADD.L…#4,D3 ‰BTST†#8,D7‰BEQ‡ER3‘MODE�NOT�ALLOWEDŽ1,2‰RTS EA4120ƒADD.L…#1,A5�.�1,3‰CMP.B…#'(',D0�.�1,3‰BNE‡ER3‘.�1,2 ‰CMP.B…#'P',(A5) ‰BEQ‡EA61 * (A@....... ‰BSR‡EA16BITS ‰BSR‡GETREGA‰BNE‡ER3‘.�2,3 ‰OR.W†D0,D6 ‰MOVE.B„(A5),D0‰CMP.B…#')',D0 ‰BNE.S…EA5115 * (A@) ‰ADD.L…#1,A5 ‰BTST†#5,D7‰BEQ‡ER3‘MODE�NOT�ALLOWEDŽ1,2 ‰OR.W†#$0028,D6‹MODE�=�101AAA ‰CMP.L…#$10000,D5‰BPL‡ER3‘.�2,3 ‰MOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1) ‰ADD.L…#2,D3‰RTS PAGEEA5115ƒBSR‡COMMA -*‚(A@,-----„ADDRESS�REGISTER�WITH�INDEXEA5116ƒEXT.L…D5 ‰BSR‡EA8BITS ‰BNE‡ER’.�1,2‰AND.W…#$00FF,D5‰OR.W†#$0030,D6‹MODE‚110--- ‰BTST†#6,D7‰BEQ‡ER’MODE�NOT�ALLOWEDŽ1,2 ‰CLR.L…D0°2,3‰CLR.L…D1’SET�FOR�D@”2,3#‰MOVE.B„(A5)+,D0ŒGET�FIRST�CHAR�2,3(‰CMP.B…#'D',D0�IS�FIRST�CHAR�=�'D'�?‰2,3.‰BEQ.S…ISDREGŽYES,�CHECK�FOR�'D'-TYPE�REGISTER ‰MOVE.B„#8,D1�NO,�SET�FOR�A@�2,3(‰CMP.B…#'A',D0�IS�FIRST�CHAR�=�'A'�?‰2,3‰BNE.S…ER4‘NO,�ERROR•2,33ISDREGƒMOVE.B„(A5)+,D0ŒYES,�GET�REGISTER�NUMBER†2,3 ‰SUB.B…#'0',D0�LESS�THAN�0�?‘2,3‰BMI.S…ER4‘YES,�ERROR”2,3%‰CMP.B…#7,D0�NO,�GREATER�THAN�7�?Š2,3‰BGT.S…ER4‘YES,�ERROR”2,3 ‰OR.W†D1,D0 ‰ROR.W…#4,D0‰OR.W†D0,D5�EXTENSION�WORD * BIT 11 EXTENSION WORD8*ƒ0�=�SIGN�EXTENDED,�LOW�ORDER�INTEGER�IN�INDEX�REGISTER,*ƒ1�=�LONG* �VALUE�IN�INDEX�REGISTER‚(DEFAULT)*‰MOVE.B„(A5)+,D0‰CMP.B…#')',D0‰BEQ.S…EA5119ŽDEFAULTƒ.W ‰CMP.B…#'.',D0‰BNE.S…ER4‘.�2,3 ‰MOVE.B„(A5)+,D0‰CMP.B…#'W',D0 ‰BEQ.S…EA5118 ‰CMP.B…#'L',D0 ‰BNE.S…ER4‘NEITHER�.W�NOR�.L�2,3 ,‰OR.W†#$0800,D5‹EXTENSION�WORD,�W/L�BIT�=�.L EA5118ƒCMP.B…#')',(A5)+‰BNE.S…ER4‘NO�CLOSING�")"�1,2 EA5119ƒMOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1) ‰ADD.L…#2,D3EA5119E‚RTS›.�1,2 PAGE*‚(P-----EA61…ADD.L…#1,A5‰CMP.B…#'C',(A5)+‰BNE.S…ER4‘.�2,3 #‰SUB.L…PCOUNTER(A1),D5…D5�=�D5�-�PC‰SUB.L…#2,D5�D5�=�D5�-�(PC�+�2)-‰SUB.L…D3,D5�ADJUST�IF�2�WORD�INSTRUCTION‚3,0 ‰MOVE.B„(A5)+,D0‰CMP.B…#')',D0 ‰BNE.S…EA71 *‚(PC)‰OR.W†#$3A,D6�MODE�=�111010 ‰BSR.S…EA16BITS‰MOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1) ‰ADD.L…#2,D3 ‰BTST†#9,D7‰BNE‡EA5119E�.�1,2ER4†BRA‡ER’.�1,2 **‚(PC----ŠPROGRAM�COUNTER�WITH�INDEX#EA71…MOVE.W„#$003B,D6‹MODE�=�111011 ‰CMP.B…#',',D0‰BNE.S…ER4‘.�1,2 ‰BTST†#10,D7Ž.‰BEQ‡ER4‘MODE�NOT�ALLOWEDŽ1,2 ‰BSR.S…EA8BITS‰BNE‡ER4‘.�1,2 ‰AND.W…#$00FF,D5‹D5�=�VALUE ‰BSR‡GETREGAD‰BNE‡ER4‘.�2,3 ‰OR.W†D1,D0  ‰ROR.W…#4,D0‰OR.W†D0,D5�D5�=�EXTENSION�WORD ‰MOVE.B„(A5)+,D0‰CMP.B…#')',D0‰BEQ.S…EA7115ŽDEFAULT‚.W ‰CMP.B…#'.',D0‰BNE‡ER4‘.�1,2 ‰MOVE.B„(A5)+,D0‰CMP.B…#'W',D0 ‰BEQ.S…EA7113 ‰CMP.B…#'L',D0‰BNE‡ER4‘.�1,2'‰OR.W†#$0800,D5‹EXTENSION�WORD�W/L�=�.L EA7113ƒCMP.B…#')',(A5)+‰BNE‡ER4‘NO�CLOSING�")"�1,2 EA7115ƒMOVE.W„D5,(A4,D3)‰ADD.B…#2,TNB(A1) ‰ADD.L…#2,D3‰RTS PAGEL*****************************************************************************0*ˆROUTINES�TO�TEST�FOR�VALID�EFFECTIVE�ADDRESSES*@*ˆEA16BITƒtests�that�-32768�<=�D5�<=�65535.‚(signed�or�unsigned):*ˆEA16BITS‚tests�that�-32768�<=�D5�<=�32767.‚(signed�only);*ˆEA8BIT„tests�thatƒ-128�<=�D5�<=ƒ255.‚(signed�or�unsigned)5*ˆEA8BITSƒtests�thatƒ-128�<=�D5�<=ƒ127.‚(signed�only)*8*ˆThe�16-bit�tests�branch�to�ER�if�invalid,�else�return.B*ˆThe‚8-bit�tests�return�condition�codes��if�valid,�else�.0*ˆD5�is�preserved�unless�a�branch�to�ER�results.*ˆD1�is�destroyed.*L**************************************************************************** EA16BIT:/‰BSR.S…EA16BITCŒCHECK�RANGE�-32768�TO�32767.‚IF0‰MOVE.L„D5,D1�INVALID,�CHECK�WHETHER�THE�HIGH�16'‰SWAP†D1’BITS�ARE�0�(WHICH�IMPLIES�THAT,‰TST.W…D1’D5�<=�65535).‚IF�NOT,�FALL�THRU�TO,‰BEQ.S…EASEX�THE�16-BIT�SIGNED�TEST--WE�WILL*§FAIL�AND�GO�TO�ER. EA16BITS:.‰PEA‡ER(PC)ŽSET�UP�TO�RETURN�TO�ER�IF�INVALID. (EA16BITC�MOVE.L„#$7FFF,D1‹D1‚<--‚2^16-1.)‰BRA.S…EAS‘GO�TO�THE�COMMON�TEST�ROUTINE.  EA8BIT:3‰BSR.S…EA8BITC�CHECK�RANGE�-128�TO�127.‚IF�INVALID,0‰MOVE.L„D5,D1�CHECK�WHETHER�THE�HIGH�24�BITS�ARE.‰LSR.L…#8,D1�0�(WHICH�IMPLIES�THAT�D5�<=�255).‰RTS›* EA8BITS:0‰BSR.S…EA8BITC�JUST�CHECK�FOR�-127�<=�D5�<=�128.(‰RTS›(BSR�PUTS�NEEDED�ADDRESS�ON�STACK!) &EA8BITC‚MOVE.L„#$7F,D1�D1‚<--‚2^8�-�1. 1*’***�NOTE:�THIS�ROUTINE�PLAYS�WITH�THE�STACK�***8EAS†CMP.L…D1,D5�IF�D5�>�2^N-1,�RETURN�WITH��(INVAL).‰BGT.S…EASEX�*1‰NOT.L…D1’IF�D5�<�-2^N,‚RETURN�WITH��(INVAL).‰CMP.L…D1,D5�*‰BLT.S…EASEX�* 2‰ADD.L…#4,A7�POP�THE�RETURN�ADDRESS�OFF�THE�STACK,'‰CLR.L…D1’SET��(VALID),�AND�RETURN. EASEX„RTS›* PAGE ADR†MACRO‰DC.W†M\1-XBASE‰ENDM TBLKEYS‚DSˆ0‰INDEX‰ADR‡ABCD†0‚ABCD�SBCD‰ADR‡ADD‡1‚ADD‚SUB‰ADR‡ADDA†2‚ADDA�CMPA�SUBA‰ADR‡ADDI†3‚ADDI�CMPI�SUBI‰ADR‡ADDQ†4‚ADDQ�SUBQ‰ADR‡ADDX†5‚ADDX�SUBX‰ADR‡AND‡6‚AND‚OR‰ADR‡ASL‡7‚ASL‚LSL�ROL�ROXL‰ADR‡DBCC†8‚DBCC‰ADR‡BCHG†9‚BCHG‰ADR‡BRA‡10‚BRA‚BSR‚BCC‰ADR‡BSET†11‚BSET#‰ADR‡CHK‡12‚CHK‚DIVS�DIVU�MULS�MULU ‰ADR‡CLR‡13‚CLR‚NEG‚NEGX�NOT‚TST‰ADR‡CMPM†14‚CMPM‰ADR‡MOVEQ…15‚MOVEQ‰ADR‡EXG‡16‚EXG‰ADR‡EXT‡17‚EXT‰ADR‡JMP‡18‚JMP‚JSR‰ADR‡LEA‡19‚LEA‰ADR‡LINK†20‚LINK‰ADR‡MOVE†21‚MOVE)‰ADR‡CMMD2…22‚NOP�RESET�RTE�RTR�RTS�TRAPV‰ADR‡STOP†23‚STOP‰ADR‡SWAP†24‚SWAP‰ADR‡TRAP†25* ‚TRAP‰ADR‡UNLK†26‚UNLK‰ADR‡MOVEM…27‚MOVEM‰ADR‡ANDI†28‚ANDI�EORI�ORI‰ADR‡SCC‡29‚NBCD�SCC‚TAS‰ADR‡BCLR†30‚BCLR‰ADR‡BTST†31‚BTST‰ADR‡MOVEA…32‚MOVEA‰ADR‡MOVEP…33‚MOVEP‰ADR‡CMP‡34‚CMP‰ADR‡EOR‡35‚EOR‰ADR‡PEA‡36‚PEA‰ADR‡DCˆ37‚DC.W‰ADR‡MOVEC…38‚MOVEC„68010–3,0‰ADR‡MOVES…39‚MOVES„68010–3,0‰ADR‡RTD‡40‚RTD†68010–3,0 ‰PAGE7* \1,\2 = MNEUMONIC (\2 SIGN BIT SET AS LAST CHARACTER)*�\3„=�INDEX�TO�TABLKEYS* \4,\5 = FIRST WORD MASK%*�\6„=�NO�OPERAND�ALLOWED�IF�SIGN�SET&*�\7„=�.S�ALLOWED�(.W�NOT�ALLOWED) 1,2 OPC†MACRO‰DC.B†'\1','\2'+128‰DC.B†\3+\6+\7,$\4,$\5‰ENDM "NOC†EQU‡128‘(BIT�7�SET)�NO�OPERAND)NW‡EQU‡$40‘(BIT�6�SET)�.W�NOT�ALLOWED„1,2!TBLOPCƒOPC‡ABC,D,0,C1,00,0,0…ABCD‰OPC‡ADD,A,2,D0,C0,0,0…ADDA‰OPC‡ADD,I,3,06,00,0,0…ADDI‰OPC‡ADD,Q,4,50,00,0,0…ADDQ‰OPC‡ADD,X,5,D1,00,0,0…ADDX‰OPC‡AD,D,1,D0,00,0,0†ADD‰OPC‡AND,I,28,02,00,0,0„ANDI‰OPC‡AN,D,6,C0,00,0,0†AND‰OPC‡AS,L,7,E1,00,0,0†ASL‰OPC‡AS,R,07,E0,00,0,0…ASR‰OPC‡BR,A,10,60,00,0,NW„BRA‰OPC‡BH,I,10,62,00,0,NW†BHI‰OPC‡BL,S,10,63,00,0,NW†BLS‰OPC‡BC,C,10,64,00,0,NW†BCC‰OPC‡BH,S,10,64,00,0,NW†BHS—3,2‰OPC‡BC,S,10,65,00,0,NW†BCS‰OPC‡BL,O,10,65,00,0,NW†BLO—3,2‰OPC‡BN,E,10,66,00,0,NW†BNE‰OPC‡BE,Q,10,67,00,0,NW†BEQ‰OPC‡BV,C,10,68,00,0,NW†BVC‰OPC‡BV,S,10,69,00,0,NW†BVS‰OPC‡BP,L,10,6A,00,0,NW†BPL‰OPC‡BM,I,10,6B,00,0,NW†BMI‰OPC‡BG,E,10,6C,00,0,NW†BGE‰OPC‡BL,T,10,6D,00,0,NW†BLT‰OPC‡BG,T,10,6E,00,0,NW†BGT‰OPC‡BL,E,10,6F,00,0,NW†BLE‰OPC‡BCH,G,9,01,40,0,0…BCHG$‰OPC‡BCL,R,30,01,80,0,0„BCLR†DYNAMIC‰OPC‡BSE,T,11,01,C0,0,0„BSET‰OPC‡BS,R,10,61,00,0,NW„BSR‰OPC‡BTS,T,31,01,00,0,0„BTST‰OPC‡B,T,10,60,00,0,NW†BT‰OPC‡CH,K,12,41,80,0,0…CHK‰OPC‡CL,R,13,42,00,0,0…CLR‰OPC‡CMP,A,2,B0,C0,0,0…CMPA‰OPC‡CMP,I,3,0C,00,0,0…CMPIš1,1‰OPC‡CMP,M,14,B1,08,0,0„CMPM‰OPC‡CM,P,34,B0,00,0,0†CMP‰OPC‡DB,T,8,50,C8,0,NW…DBT‰OPC‡DB,F,8,51,C8,0,NW…DBF‰OPC‡DBR,A,8,51,C8,0,NW„DBRA‰OPC‡DBH,I,8,52,C8,0,NW„DBHI‰OPC‡DBL,S,8,53,C8,0,NW„DBLS‰OPC‡DBC,C,8,54,C8,0,NW„DBCC‰OPC‡DBC,S,8,55,C8,0,NW„DBCS‰OPC‡DBN,E,8,56,C8,0,NW„DBNE‰OPC‡DBE,Q,8,57,C8,0,NW„DBEQ‰OPC‡DBV,C,8,58,C8,0,NW„DBVC‰OPC‡DBV,S,8,59,C8,0,NW„DBVS‰OPC‡DBP,L,8,5A,C8,0,NW„DBPL‰OPC‡DBM,I,8,5B,C8,0,NW„DBMI‰OPC‡DBG,E,8,5C,C8,0,NW„DBGE‰OPC‡DBL,T,8,5D,C8,0,NW„DBLT‰OPC‡DBG,T,8,5E,C8,0,NW„DBGT‰OPC‡DBL,E,8,5F,C8,0,NW„DBLE(‰OPC‡DC.,W,37,00,00,0,0„DC.W‚(WORD�ONLY)‰OPC‡DIV,S,12,81,C0,0,0„DIVS‰OPC‡DIV,U,12,80,C0,0,0„DIVU‰OPC‡EOR,I,28,0A,00,0,0„EORI‰OPC‡EO,R,35,B1,00,0,0†EOR‰OPC‡EX,G,16,C1,00,0,0…EXG‰OPC‡EX,T,17,48,00,0,0…EXT‰OPC‡JM,P,18,4E,C0,0,NW„JMP‰OPC‡JS,R,18,4E,80,0,NW„JSR‰OPC‡LE,A,19,41,C0,0,0…LEA‰OPC‡LIN,K,20,4E,50,0,0„LINK‰OPC‡LS,L,7,E3,08,0,0†LSL‰OPC‡LS,R,07,E2,08,0,0…LSR‰OPC‡MOVE,A,32,00,04,0,0ƒMOVEA‰OPC‡MOVE,M,27,48,80,0,0ƒMOVEM‰OPC‡MOVE,P,33,01,08,0,0ƒMOVEP‰OPC‡MOVE,Q,15,70,00,0,0ƒMOVEQ‰OPC‡MOV,E,21,00,00,0,0„MOVE‰OPC‡MUL,S,12,C1,C0,0,0„MULS‰OPC‡MUL,U,12,C0,C0,0,0„MULU‰OPC‡NBC,D,29,48,0,0,0…NBCD‰OPC‡NEG,X,13,40,00,0,0„NEGX‰OPC‡NE,G,13,44,00,0,0…NEG‰OPC‡NO,P,22,4E,71,NOC,0ƒNOP‰OPC‡NO,T,13,46,00,0,0…NOT‰OPC‡OR,I,28,00,00,0,0…ORI‰OPC‡O,R,6,80,00,0,0‡OR‰OPC‡PE,A,36,48,40,0,0…PEA ‰OPC‡RESE,T,22,4E,70,NOC,0�RESET‰OPC‡RO,L,7,E7,18,0,0†ROL‰OPC‡RO,R,07,E6,18,0,0…ROR‰OPC‡ROX,L,7,E5,10,0,0…ROXL‰OPC‡ROX,R,07,E4,10,0,0„ROXR‰OPC‡RT,E,22,4E,73,NOC,0ƒRTE‰OPC‡RT,R,22,4E,77,NOC,0ƒRTR‰OPC‡RT,S,22,4E,75,NOC,0ƒRTS‰OPC‡SBC,D,0,81,00,0,0…SBCD‰OPC‡S,F,29,51,C0,0,0†SF‰OPC‡SH,I,29,52,C0,0,0…SHI‰OPC‡SL,S,29,53,C0,0,0…SLS‰OPC‡SC,C,29,54,C0,0,0…SCC‰OPC‡SC,S,29,55,C0,0,0…SCS‰OPC‡SN,E,29,56,C0,0,0…SNE‰OPC‡SE,Q,29,57,C0,0,0…SEQ‰OPC‡SV,C,29,58,C0,0,0…SVC‰OPC‡SV,S,29,59,C0,0,0…SVS‰OPC‡SP,L,29,5A,C0,0,0…SPL‰OPC‡SM,I,29,5B,C0,0,0…SMI‰OPC‡SG,E,29,5C,C0,0,0…SGE‰OPC‡SL,T,29,5D,C0,0,0…SLT‰OPC‡SG,T,29,5E,C0,0,0…SGT‰OPC‡SL,E,29,5F,C0,0,0…SLE‰OPC‡STO,P,23,4E,72,0,0„STOP‰OPC‡S,T,29,50,C0,0,0†ST‰OPC‡SUB,A,2,90,C0,0,0…SUBA‰OPC‡SUB,I,3,04,00,0,0…SUBI‰OPC‡SUB,Q,4,51,00,0,0…SUBQ‰OPC‡SUB,X,5,91,00,0,0…S+ UBX‰OPC‡SU,B,1,90,00,0,0†SUB‰OPC‡SWA,P,24,48,40,0,0„SWAP‰OPC‡TA,S,29,4A,C0,0,0…TAS™1,2 ‰OPC‡TRAP,V,22,4E,76,NOC,0�TRAPV‰OPC‡TRA,P,25,4E,40,0,0„TRAP‰OPC‡TS,T,13,4A,00,0,0…TST‰OPC‡UNL,K,26,4E,58,0,0„UNLKTBLOP00‚DS.B†0“.�3,0TBLOP08‚DS.B†0“.�3,0"‰OPC‡MOVE,C,38,4E,7A,0,0ƒMOVEC—3,0"‰OPC‡MOVE,S,39,0E,00,0,0ƒMOVES—3,0‰OPC‡RT,D,40,4E,74,0,0…RTD™3,0TBLOP10‚DS.B†0“.�3,0TBLOP20‚DS.B†0“.�3,0 ,... ‰BSR‡FSIZE ‰MOVE.L„#$009,D7Œ.�3,0‰BSR‡EA’D@�+�(A@)+‰MOVE.L„D6,D0�MMMRRR‰AND.W…#$38,D0�MMM... ‰BEQ.S…MCMP39ŽDESTINATION‚D@ ‰CMP.B…#$18,D0‰BNE‡ER ‰AND.W…#$F,D6Ž(AY)+,(AX)+“3/82‰ROR.W…#7,D6�.�3/82!‰OR.W†D6,D2�....AX@.........Ž3/82%‰OR.W†#$0100,D2‹...1AX@.........Ž3/82 ‰MOVE.L„D4,D0‰AND.W…#$38,D0‰CMP.W…#$18,D0‰BNE‡ER’NOT�(A@)+‰AND.W…#$F,D4¬3/82 ‰OR.W†D4,D2 ‰BRA‡CMMD2 *‚,D@MCMP39ƒROR.W…#7,D6 ‰OR.W†D6,D2 ‰OR.W†D4,D2‰BRA.S…CMMD2S11 0MCMP56ƒMOVE.W„#$0C00,D2‹#,†MASK�=�CMPI ‰BSR‡FSIZE ‰BSR‡EADA ‰OR.W†D6,D2CMMD2S11�BRA‡CMMD2S10 COMMAS20�BRA‡COMMA PAGEMADD…DSˆ0“(INDEX�1) ‰BSR‡EAALL‰MOVE.L„D6,D4�D4�=�SOURCE�MODE ‰BSR‡COMMAS20 ‰BSR‡GETREGA�.�2,3‰BNE.S…NOTRA1Ž.�2,30‰SUB.L…#2,A5�ADJUST�A5�BACK�TO�START�OF�REGISTER!‰BRA‡MADDA21�DESTINATION�=�A@Ž2,3 NOTRA1ƒCMP.B…#$3C,D4&‰BEQ.S…MADD56ŽSOURCE‚....I‚#,... ‰BSR‡FSIZE ‰MOVE.W„#$1FF,D7‰BSR‡EA’ALTERABLE�+�D@‰MOVE.L„D6,D0�MMMRRR‰AND.W…#$38,D0�MMM... ‰BNE.S…MADD46ŽDESTINATION�NOT‚D@ *‚,D@ ‰ROR.W…#7,D6 ‰OR.W†D6,D2 ‰OR.W†D4,D2 ‰BRA‡CMMD2S11 MADD46ƒMOVE.W„D4,D0�D@,—3,2‰AND.W…#$38,D0�.�3,2‰BNE‡ER’SOURCE�NOT�D@‘3,2 ‰OR.W†#$100,D2 ‰ROR.W…#7,D4‰OR.W†D4,D2�, �AS�DESTINATION ‰OR.W†D6,D2�D@‚AS�SOURCE ‰BRA‡CMMD2S11 MADD56ƒMOVE.L„D2,D0�#,‰MOVE.W„#$0600,D2‹MASK�=�ADDI ‰CMP.W…#$D000,D0 ‰BEQ.S…MADD58‰MOVE.W„#$400,D2ŒMASK�=�SUBIMADD58 ‰BSR‡FSIZE ‰BSR‡EADA�DATA�ALTERABLE�ONLY ‰OR.W†D6,D2 ‰BRA‡CMMD2S11 PAGE(MADDI„MOVE.L„PTROP(A1),A5ˆ(INDEX�3)�CMPI ‰BSR‡FSIZE ‰BSR‡EAZ ‰BSR‡COMMAS20 ‰BSR‡EADA�DATA�ALTERABLE�ONLY ‰OR.W†D6,D2 ‰BRA‡CMMD2S11 SPC 3*‚SIZE�=‚BYTE,�WORD,�LONG *‚#,SR"*‚#,„DATA�ALTERABLE�ONLYMANDI„DSˆ0“(INDEX�28)�EORI�ORI ‰BSR‡FSIZE ‰BSR‡EAZ ‰BSR‡COMMAS20 ‰CMP.B…#'S',(A5)‰BEQ.S…MANDI23 ‰BSR‡EADA ‰OR.W†D6,D2 ‰BRA‡CMMD2S11 #MANDI23‚CMP.B…#'R',1(A5)Š#,SR‰BNE‡ER‰CMP.W…#$0080,TLENGTH(A1)‰BEQ‡ER’.L�NOT�ALLOWED�WITH�SR‰OR.W†#$003C,D2 ‰BRA‡CMMD2 PAGEMADDA„DSˆ0“(INDEX�2) ‰BSR‡EAALL ‰OR.W†D6,D2 ‰BSR‡COMMA MADDA21‚OR.W†D6,D2‰MOVE.W„TLENGTH(A1),D0‰BEQ‡ER’.BYTE�NOT�ALLOWED‰LSL.W…#1,D0�.W�=�011......‰OR.W†#$00C0,D0‹.L�=�111...... ‰OR.W†D0,D2 ‰BSR‡GETREGA ‰BNE‡ER’.�2,3 ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BRA‡CMMD2 PAGEMADDQ„DSˆ0“(INDEX�4) ‰BSR‡FSIZE ‰BSR‡GETIMM ‰TST.L…D0‰BEQ‡ER’DATA�=�ZERO ‰CMP.L…#8,D0‰BHI‡ER’VALUE�TOO�BIG‰AND.W…#$7,D0ŽMAKE�8�=�0$‰ROR.W…#7,D0�SHIFT�DATA�TO�BITS�9-11 ‰OR.W†D0,D2 ‰BSR‡COMMA ‰BSR‡EAA‘ALTERABLE�ADDRESSING ‰OR.W†D6,D2 ‰MOVE.L„D2,D0‰AND.W…#$C0,D0‰BNE.S…MADDQ25 0* BYTE SIZE; ADDRESS REGISTER DIRECT NOT ALLOWED ‰MOVE.L„D2,D0‰AND.W…#$38,D0‰CMP.B…#$08,D0‰BEQ‡ERMADDQ25‚BRA‡CMMD2 PAGE* SIZE = BYTE, WORD, LONG*„DY,DX *„-(AY),-(AX)*„....RX@.SS...RY@MADDX„DSˆ0“(INDEX�5) ‰BSR‡FSIZE ‰MOVE.L„#$11,D7�.�3,0‰BSR‡EA ‰BSR‡COMMA  ‰MOVE.L„D6,D0 ‰AND.W…#7,D0 ‰OR.W†D0,D2 ‰BTST†#5,D6‰BEQ.S…MADDX5ŽD@,D@�MODE ‰OR.W†#$0008,D2‹-(A@),-(A@)�MODE ‰MOVE.L„#$10,D7�.�3,0‰BSR‡EA ‰AND.W…#7,D6 ‰ROR.W…#7,D6 ‰OR.W†D6,D2 ‰BRA‡CMMD2 MADDX5ƒBSR‡GETREGD�D@,D@ ‰BNE‡ER’.�2,3 ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BRA‡CMMD2 SPC 2(A5TODEST�CLR.L…D1’MOVE�A5�TO�DESTINATION)A5300„BSR‡GETCHAR�.‚SOURCE,DESTINATION�OR$‰CMP.B…#'(',D0�.‚(A@,R@),DESTINATION ‰BNE.S…A5305 ‰MOVE.L„D0,D1A5305„CMP.B…#')',D0 ‰BEQ‡A5TODEST‰CMP.B…#',',D0 ‰BNE‡A5300‰TST‡D1!‰BNE‡A5300�(A@,---�FORM;�CONTINUE‰RTS PAGE*‚SIZE�=�BYTE,�WORD,�LONG*‰,D@ƒ[�D@,D@�ALLOWED�]*‰D@,ƒ[�D@,D@�NOT�ALLOWED�]MAND…BSR‡FSIZE�(INDEX�6) ‰CMP.B…#'#',(A5) ‰BEQ.S…MAND90 %‰BSR‡A5TODESTŒLOOK�AT�DESTINATION‹3,0‰BSR‡GETREGD�.�3,0‰BEQ.S…MAND77Ž.�3,0 %‰OR.W†#$0100,D2ŒD@,ƒDIRECTION�BIT ,‰MOVE.L„PTROP(A1),A5ˆA5�=�PTR�TO�OPERAND‹3,0‰BSR‡GETREGD�.�3,0 ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BSR‡COMMA ‰BSR‡EAM‘ALTERABLE�MEMORY ‰OR.W†D6,D2 ‰BRA‡CMMD2  MAND77ƒROR.W…#7,D0�,D@—3,0‰OR.W†D0,D2�DESTINATION“3,0 ,‰MOVE.L„PTROP(A1),A5ˆA5�=�PRT�TO�OPERAND‹3,0)‰BSR‡EADADDR�DATA�ADDRESSING�(SOURCE)†3,0‰OR.W†D6,D2­3,0 ‰BSR‡COMMA�.�3,0‰BRA‡CMMD2�.�3,0 MAND90ƒAND.W…#$F000,D2‰CMP.W…#$C000,D2‰BEQ.S…MAND97�AND!‰MOVE.W„#$0000,D2‹CHANGE�TO�"ORI"MAND91ƒBRA‡MANDI(MAND97ƒMOVE.W„#$0200,D2‹CHANGE�TO�"ADDI" ‰BRA‡MAND91 PAGEMEOR…BSR‡FSIZE�(INDEX�35) ‰CMP.B…#'#',(A5) ‰BEQ.S…MEOR90 ‰BSR‡GETREGD ‰BNE‡ER’.�2,3 ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BSR‡COMMA #‰BSR‡EADA�DATA�ALTERABLE�ADDRESSING ‰OR.W†D6,D2 ‰BRA‡CMMD2 2MEOR90ƒMOVE.L„PTROP(A1),A5ˆA5�=�POINTER�TO�OPERAND"‰MOVE.W„#$0A00,D2‹CHANGE�TO�"EORI" ‰BRA‡MANDI PAGEMASL…DSˆ0“(INDEX�7)*‰ASL…LSL…ROL…ROXL*‚MASKS‚E000„E008„E018„E010"*‰E0C0„E2C0„E6C0„E4C0ƒSHIFT�MEMORY ‰BSR‡FSIZE ‰MOVE.B„(A5)+,D0‰CMP.B…#'#',D0 ‰BNE.S…MSL200 *‚#,D@‰BSR‡EV ‰CMP.L…#8,D0‰BGT‡ER’GREATER�THAN�8 ‰AND.B…#$7,D0ŽMAKE�8�INTO�0MSL150ƒROR.W…#7,D0‰AND.W…#$F1FF,D2‰OR.W†D0,D2�COUNT/REG ‰BSR‡COMMA ‰BSR‡GETREGD ‰BNE‡ER’.�2,3 ‰OR.W†D0,D2 ‰BRA‡CMMD2 MSL200ƒDSˆ0“D@,D@‰SUB.L…#1,A5�ADJUST�A5�BACK ‰BSR‡GETREGD‰BNE.S…MSL300Ž.�2,, 3 *ˆD@,D@ ‰OR.W†#$20,D2 ‰BRA‡MSL150 MSL300ƒDSˆ0“†SHIFT�MEMORY‰OR.W†#$00C0,D2‹SIZE�=�MEMORY +‰AND.W…#$FFC0,D2‹REMOVE�"SHIFT�MEMORY"�BITS ‰CMP.W…#$0040,TLENGTH(A1)‰BNE.S…ER2‘NOT�.WORD•1,2 ‰BSR‡EAM ‰OR.W†D6,D2 ‰BRA‡CMMD2 PAGEMSCC…DSˆ0“(INDEX�29)�NBCD�SCC ‰BSR‡SIZEBYTE ‰BSR‡EADA�DATA�ALTERABLE�ONLY ‰OR.W†D6,D2 ‰BRA‡CMMD2 PAGEMBCHG„DSˆ0“(9)‰CMP.B…#'#',(A5) ‰BNE.S…MB200 "‰MOVE.W„#$0840,D2‹NEW�OP-CODE�MASK MB100„ADD.L…#1,A5‰BSR‡EV’EVALUATE�EXPRESSION ‰CMP.L…#33,D0‰BGT.S…ER2‘(MODULO�32)“1,2‰MOVE.W„D0,TDATA+2(A1)‰ADD.L…#2,D3�STORE�POINTER ‰ADD.B…#2,TNB(A1)Š.�1,2 MB105„BSR‡COMMA�.�1,2 ‰BSR‡EADA�DESTINATION ‰OR.W†D6,D2 ‰TST.B…TLSPEC(A1)Š..œ1,2‰BEQ.S…MB185�DEFAULT—1,2 ‰AND.W…#$0038,D6‹.�1,2,‰BNE.S…MB145�DESTINATION��WAS�NOT�D@ƒ1,2 3‰CMP.W…#$80,TLENGTH(A1)„DESTINATION��WAS�D@‡1,2‰BEQ.S…MB185�LENGTH�IS�.L’1,2ER2†BRA‡ER’.�1,2 MB145„TST.W…TLENGTH(A1)‰.�1,2‰BNE‡ER2‘NOT�BYTE�LENGTH�1,2 MB185„BRA‡CMMD2�.�1,2 MB200„BSR‡GETREGD�DYNAMIC ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BRA‡MB105�.�1,2 MBSET„DSˆ0‰(INDEX�11)�BCLR�BSET‰CMP.B…#'#',(A5) ‰BNE‡MB200 ‰MOVE.W„#$08C0,D2 ‰BRA‡MB100 MBCLR„DSˆ0‰(INDEX�30)‰CMP.B…#'#',(A5) ‰BNE‡MB200 ‰MOVE.W„#$0880,D2 ‰BRA‡MB100 MBTST„DSˆ0‰(INDEX�31)‰CMP.B…#'#',(A5) ‰BNE‡MB200 ‰MOVE.W„#$0800,D2 ‰BRA‡MB100 PAGEMDBCC„DSˆ0“(INDEX�8) ‰BSR‡GETREGD‰BNE.S…ER6‘.�2,3 ‰OR.W†D0,D2 ‰BSR‡COMMA ‰BSR.S…EVSR ‰BRA.S…MBRA23 SPC 6*‚SIZEƒ.S‚=‚.Wƒ(DEFAULT) *‰.L‚=‚.LMBRA…DSˆ0“(INDEX�10) ‰BSR.S…EVSR ‰CMP.W…#$0080,TLENGTH(A1)‰BEQ.S…MBRA23ŽFORCED�LONG ‰BSR‡EA8BITS‰BNE.S…MBRA23ŽNOT�8�BIT�VALUE ‰OR.B†D5,D2‰BRA‡CMMD2�.SHORT ER6†BRA‡ER’ERROR�HANDLER‘1,1 MBRA23ƒTST.B…TLSPEC(A1) ‰BEQ.S…MBRA27‰CMP.W…#$0040,TLENGTH(A1)‰BEQ‡ER6‘.S�SPECIFIED’1,1MBRA27 ‰MOVE.L„D4,D5�RESTORE�D5 ‰BSR‡EA16BITS‰MOVE.W„D5,TDATA+2(A1)‰ADD.B…#2,TNB(A1) ‰BRA‡CMMD2 EVSR…BSR‡EV‰CMP.B…#'�',(A5)‹.�2,3'‰BEQ.S…EVSR11ŽTERMINATED�WITH�SPACE‰2,3‰CMP.B…#$0D,(A5)‹.�2,3‰BNE‡ER6‘WAS�NOT�CR”2,3EVSR11 ‰MOVE.L„D0,D5 ‰ASR.L…#1,D0‰BCS‡ER6‘ODD�VALUE•1,1‰MOVE.L„PCOUNTER(A1),D4‰ADD.L…#2,D4�D4�=�PC�+�2 ‰SUB.L…D4,D5%‰BEQ‡ER6‘ZERO;�SPECIAL�CASE�ERROR†1,1 ‰MOVE.L„D5,D4‰RTS PAGE MCHK…DSˆ0“(INDEX�12)�CHK�DIV�MUL ‰BSR‡SIZEWORD !‰BSR‡EADADDR�DATA�ADDRESSING�ONLY ‰OR.W†D6,D2 ‰BSR‡COMMA ‰BSR‡GETREGD‰BNE‡ER6‘.�2,3 ‰ROR.W…#7,D0 ‰OR.W†D0,D2 ‰BRA‡CMMD2 PAGEMCLR…DSˆ0“(INDEX�13) ‰BSR‡FSIZE ‰BSR‡EADA�DATA�ALTERABLE�ONLY ‰OR.W†D6,D2 ‰BRA‡CMMD2 ‚PAGE* SIZE = BYTE, WORD, LONGMCMPM„DSˆ0“(INDEX�14) ‰BSR‡FSIZE ‰MOVE.L„#$0008,D7‹.�3,0‰BSR‡EA’-(A@)ƒONLY ‰AND.W…#7,D6 ‰OR.W†D6,D2 ‰BSR‡COMMA ‰MOVE.L„#$0008,D7‹.�3,0‰BSR‡EA ‰AND.W…#7,D6 ‰ROR.W…#7,D6 ‰OR.W†D6,D2 ‰BRA‡CMMD2 PAGEMEXG…DSˆ0“(INDEX�16) ‰BSR‡SIZELONG ‰BSR‡GETREGAD ‰BNE‡ER’.�2,3‰MOVE.L„D0,D4�D4�=�REG�NUMBER‰MOVE.L„D1,D5�D5�=�REG�TYPE ‰BSR‡COMMA�TEST�FOR�COMMA ‰BSR‡GETREGAD ‰BNE‡ER’.�2,3 ‰CMP.L…D1,D5 ‰BEQ.S…MEXG35ŽBOTH�REGS�THE�SAME *‚DX,AY‚OR‚AY,DX‰OR.W†#$88,D2�MODE ‰TST.B…D1 ‰BNE.S…MEXG25 &‰EXG.L…D0,D4�SWAP�SOURCE�&�DESTINATION !MEXG25ƒOR.W†D0,D2�.......MMMMMYYY ‰ROR.W…#7,D4‰OR.W†D4,D2�....XXXMMMMMYYY ‰BRA‡CMMD2 MEXG35ƒOR.W†#$0040,D2‹OP-MODE ‰TST.B…D1‰BEQ‡MEXG25ŽDX,DY ‰OR.W†#$0048,D2‹AX,AY ‰BRA‡MEXG25 ‚PAGEMEXT…DSˆ0“(INDEX�17)‰TST.W…TLENGTH(A1)‰BEQ‡ER’BYTE�SIZE�NOT�ALLOWED ‰BSR‡FSIZE�.W�=�........10......&‰ADD.W…#$0040,D2‹.L�=�........11...... ‰BSR‡GETREGD ‰BNE‡ER’.�2,3 ‰OR.W†D0,D2 ‰BRA‡CMMD2 PAGEMMOVEMƒDSˆ0“(INDEX�27)(‰MOVE.W„TLENGTH(A1),D0†SIZE�BITS‚76�TO�6‰BEQ‡ER’BYTE‡00‚ERROR‰LSR.W…#1,D0�WORD‡01„0‰AND.W…#$0040,D0‹LONG‡10„1 ‰OR.W†D0,D2 !‰ADD.B…#2,TNB(A1)ŠNUMBER�OF�BYTES&‰ADD.L…#2,D3�FORCE�STORE�PTR�PAST�MASK ‰BSR‡GETREGADŒ.�2,3 ‰BEQ.S…MMM44 *„,‰OR.W†#$0400,D2‹DIRECTION�BIT "‰MOV- E.W„#$7EC,D7ŒMODES�ALLOWED‘1,1‰BSR‡EA ‰OR.W†D6,D2 ‰BSR‡COMMA ‰BSR.S…MMM48�.�1,2‰BRA‡CMMD2�.�1,2  )*ƒ,�REGISTER�TO�MEMORY MMM44„DSˆ0‰SUB.L…#2,A5�RESTORE�A5”2,3 * EVALUATE DESTINATION FIRSTMMM46„BSR‡GETCHAR‰CMP.B…#',',D0�FIND�COMMA ‰BNE‡MMM46 "‰MOVE.W„#$1F4,D7ŒMODES�ALLOWED‘1,1‰BSR‡EA ‰OR.W†D6,D2(‰MOVE.L„A5,PENDOP(A1)‡END�OF�OPERAND�1,2‰MOVE.L„PTROP(A1),A5#‰BSR.S…MMM48�EVALUATE�REGISTERSŒ1,23‰MOVE.L„PENDOP(A1),A5‡POINTER�TO�END�OF�OPERAND…1,2‰BRA‡CMMD2�.�1,2„PAGE*ˆD6�=�CORRESPONDENCE�MASK*ˆD4�=�CONTROL‚$FF�'-'�'/'MMM48„CLR.L…D6’MASKš1,2‰MOVE.L„#-1,D4ŽCONTROL�=�$FF RL111„BSR‡GETCHAR‰CMP.B…#',',D0"‰BEQ.S…RL114�DONE;�FOUND�COMMA�1,2‰CMP.B…#'�',D0�.�1,2‰BNE.S…RL115�NOT�SPACE•1,2RL114„RTS›DONEš1,2 RL115„CMP.B…#'/',D0�.�1,2 ‰BNE.S…RL444 ‰TST.B…D4’CONTROL‰BMI‡ER‰MOVE.L„D0,D4�CONTROL�=�'/'RL333„BSR‡GETREGAD ‰BNE‡ER’.�2,3‰OR.B†D0,D1�D1�=�BIT�POSITION(‰MOVE.B„D1,D5�D5�=�LAST�REGISTER�ENTERED ‰BSR.S…SETBIT ‰BRA‡RL111 RL444„CMP.B…#'-',D0 ‰BNE.S…RL666 ‰CMP.B…#'/',D4�CONTROL‰BNE‡ER‰MOVE.L„D0,D4�CONTROL�=�'-' ‰BSR‡GETREGAD ‰BNE‡ER’.�2,3 ‰OR.B†D0,D1‰MOVE.L„D1,D7�D7�=�NOW�REGISTER‰MOVE.B„D5,D0�D5�=�LAST�REG ‰EOR.B…D1,D0‰AND.B…#$38,D0‰BNE‡ER’NOT�MATCHED�SET ‰CMP.B…D1,D5‰BPL‡ER RL555„ADD.L…#1,D5 ‰MOVE.L„D5,D1 ‰BSR.S…SETBIT ‰CMP.B…D7,D5 ‰BMI‡RL555 ‰BRA‡RL111 RL666„TST.B…D4‰BPL‡ER‰MOVE.B„#'/',D4�CONTROL�=�'/' ‰SUB.L…#1,A5 ‰BRA‡RL333 PAGE5SETBITƒLEA‡MTBL(PC),A0‰SET�BIT�IN�CORRESPONDENCE�MASK ‰MOVE.L„D2,D0‰AND.W…#$38,D0‰CMP.W…#$20,D0‰BNE.S…RL30�NOT�PREDECREMENT&‰MOVE.B„(A0,D1),D1ŠD1�=�BIT‚(FOR�SURE)RL30…BSET†D1,D6 /‰MOVE.W„D6,TDATA+2(A1)†SAVE�CORRESPONDENCE�MASK‰RTS /MTBL…DC.B†15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 PAGE*ƒD@,(A@)*ƒ(A@),D@*‰(A@),D@ŒFORCED�TO�0(A@),D0*‰D@,(A@)ŒFORCED�TO�D0,0(A@)**‚SIZE�=�WORD,�LONGMMOVEPƒDSˆ0“(INDEX�33)‰MOVE.W„TLENGTH(A1),D0‰BEQ‡ER’.BYTE�NOT�ALLOWED ‰LSR.W…#1,D0‰AND.W…#$0040,D0‰OR.W†D0,D2�SIZE ‰MOVE.L„#$25,D7�.�3,0‰BSR‡EA’D6�=�MODE ‰BSR‡COMMA ‰MOVE.L„D6,D0‰AND.W…#$38,D0 ‰CMP.B…#$0,D0‰BEQ.S…MMP344ŽD@,(A@) *„(A@),D@ ‰BSR‡GETREGD ‰BNE‡ER’.�2,3 ‰ROR.W…#7,D0‰OR.W†D0,D2�D@ ‰BRA.S…MMP348 (MMP344ƒOR.W†#$0080,D2‹REGISTER�TO�MEMORY ‰ROR.W…#7,D6‰OR.W†D6,D2�D@ ‰MOVE.L„#$24,D7�.�3,0‰BSR‡EAMMP348ƒMOVE.L„D6,D0 ‰AND.W…#7,D6‰OR.W†D6,D2�A@ ‰AND.W…#$38,D0‰CMP.B…#$10,D0‰BNE.S…MMP368Ž(A@) 0‰CLR.W…TDATA+2(A1)†�FORCED�TO�ZERO;‚"(A@)"!‰ADD.B…#2,TNB(A1)ŠNUMBER�OF�BYTES‰ADD.L…#2,D3�STORE�POINTERMMP368ƒBRA�CMMD2 PAGEMMOVEQƒDSˆ0“(INDEX�34) ‰BSR‡GETIMM‰MOVE.L„D0,D5�.�2,3 ‰BSR‡EA8BITS�-128�T0�+127’2,3‰BNE.S…ER10�.�2,3‰OR.B†D5,D2�D5�=�VALUE”2,3 ‰BSR‡COMMA ‰BSR‡GETREGD�D@‰BNE.S…ER10�.�2,3 ‰ROR.W…#7,D0 MMQ20„OR.W†D0,D2‰BSR.S…SIZELONG ‰BRA‡CMMD2 'SIZELONG�TST.B…TLSPEC(A1)ŠMUST�BE�.LONG‰BEQ.S…SI201�DEFAULT�SIZE�OK‰CMP.W…#$0080,TLENGTH(A1)‰BNE.S…ER10�NOT�.LONG SI201„RTS /SIZEWORD�CMP.W…#$0040,TLENGTH(A1)‚MUST�BE�.WORD‰BEQ‡SI201…[RTS] ER10…BRA‡ER SIZEBYTE�TST.B…TLSPEC(A1)‰BEQ.S…SI222�DEFAULT�SIZE�OK‰TST.W…TLENGTH(A1) ‰BNE‡ER10 SI222„RTS PAGEMMOVE„DSˆ0“(INDEX�21)‰CMP.W…#8,PRTYPE(A1)‡.�3,0‰BLT.S…MM30�68000�OR�68008�3,0‰BSR‡GETREGCRŒ.�3,0‰BNE.S…MM30�NOT�"CCR"•3,0+‰MOVE.W„#$42C0,D2‹D2�=�INSTRUCTION�MASK‰3,0 ‰BRA.S…MM313�"MOVE‚CCR,"Ž3,0MM30 ‰BSR‡GETREGSRŒSR,�?•2,3‰BNE.S…MM40�NOœ2,3‰MOVE.W„#$40C0,D2‹YES MM313„BSR‡COMMA­3,0 ‰BSR‡EADA�DATA�ALTERABLE�ONLY MM315„OR.W†D6,D2 ‰BSR‡SIZEWORD ‰BRA‡CMMD2 MM40…BSR‡GETREGUSŒ.�2,3 ‰BNE.S…MM50 ‰BSR‡COMMA ‰MOVE.W„#$4E68,D2‹USP,A@ ‰BSR‡GETREGA‰BNE‡ER10�.�2,3 ‰BRA‡MMQ20 !* GET EXCEPTIONS FROM DESTINATION MM50…DSˆ0 $‰BSR‡A5TODESTŒMOVE�A5�TO�DESTINATION ‰BSR‡GETREGCRŒ.�2,3 ‰BNE.S…MM60‰MOVE.W„#$44C0,D2‹,CCR MM508„CMP.B…#'�',(A5) ‰BNE‡ER10 ,‰MOV- E.L„PTROP(A1),A5ˆA5�=�POINTER�TO�OPERAND !‰BSR‡EADADDR„DATA�ADDRESSING�ONLY ‰BRA‡MM315 MM60…BSR‡GETREGSRŒ,SR‰BNE.S…MM70�NOœ2,3"‰MOVE.W„#$46C0,D2‹YES;�,SR’3,0 ‰BRA.S…MM508 MM70…BSR‡GETREGUSŒA@,USP�?–2,3‰BNE.S…MM80�NO‰MOVE.W„#$4E60,D2‹YES‰CMP.B…#'�',(A5)+‰BNE‡ER8‘.�3,0 ‰MOVE.L„PTROP(A1),A5 ‰BSR‡GETREGA‰BNE‡ER8‘.�2,3 ‰BRA‡MMQ20 MM80…MOVE.L„PTROP(A1),A5 ‰BSR‡FSIZE�GET�SIZE�(BITS‚7�-�6)"‰LSL.W…#6,D2�ADJUST�TO(BITS�13-12) ‰BTST†#13,D2‰BNE.S…MM804�.L�10�TO�10‰ADD.W…#$1000,D2‹.W�01�TO�11‰OR.W†#$1000,D2‹.B�00�TO�01)MM804„BSR‡EAALL�SOURCE;�ALL�MODES�ALLOWED ‰OR.W†D6,D2 5* IF BITE SIZE; "ADDRESS REGISTER DIRECT" NOT ALLOWED ‰MOVE.L„D2,D0‰AND.W…#$3000,D0‰CMP.W…#$1000,D0‹.�1,2 ‰BNE.S…MM806‰AND.B…#$38,D6�.�1,2‰CMP.B…#$08,D6 ‰BEQ.S…ER8 MM806„DSˆ0 ‰BSR‡COMMA $‰MOVE.W„#$1FF,D7ŒDATA�ALTERABLE�+�A@‰BSR‡EA  ‰MOVE.L„D6,D0�DESTINATION‰AND.W…#$0038,D0‰CMP.W…#$0008,D0‰BEQ‡MMOVEA1�A@�MAKE�MOVEA +* POSITION REGISTER AND MODE OF DESTINATION3MM825„ROR.L…#3,D6�RRR.............�.............MMM‰ROR.W…#3,D6 MMM.............*‰SWAP†D6’MMM.............�RRR.............‰ROL.W…#3,D6 .............RRR.‰ROL.L…#1,D6�MM..............�............RRRM.‰ROL.L…#8,D6�................�....RRRMMM...... ‰OR.W†D6,D2 ‰BRA‡CMMD2 PAGE MMOVECƒDSˆ0“(INDEX�38)�68010Ž3,0‰BSR‡SIZELONGŒ.�3,0 %‰ADD.B…#2,TNB(A1)ŠNUMBER�OF�BYTES�3,0 '‰BSR.S…MLFS�LOOK�FOR�SPECIAL�SYMBOL‡3,0‰BNE.S…MMOVEC10ŒNOT�FOUND•3,0 * Rc,Rn‰BSR‡COMMA�.�3,0 %‰BSR‡GETREGADŒGET�REGISTER�A�OR�D‹3,0‰BNE.S…ER8‘.�3,0‰OR.W†D1,D0�.�3,0 )MMOVEC05�ROR.W…#4,D0�RRRR............Ž3,0 ‰OR.W†D6,D0�RRRRX0000000000XŽ3,0&‰MOVE.W„D0,TDATA+2(A1)†SECOND�WORD“3,0‰BRA‡CMMD2�.�3,0 -MMOVEC10�OR.W†#1,D2�DIRECTION�BIT�(Rn,Rc)‰3,0‰BSR‡GETREGADŒ.�3,0‰BNE.S…ER8‘.�3,0‰OR.W†D1,D0�.�3,0 ‰BSR‡COMMA�.�3,0 ‰BSR.S…MLFS�.�3,0‰BEQ‡MMOVEC05Œ.�3,0ER8†BRA‡ER’.�3,0 ** LOOK FOR SPECIAL SYMBOL: SFC DFC USP VBRMLFS…CLR.L…D1’.�3,0‰MOVE.B„(A5),D1�000Xš3,0‰ASL.L…#8,D1�00X0š3,0‰MOVE.B„1(A5),D1Œ00XYš3,0‰ASL.L…#8,D1�0XY0š3,0‰MOVE.B„2(A5),D1Œ0XYZš3,0#‰CLR.L…D6’D6�=�VALUE�FOR�RETURN‰3,0‰CMP.L…#'SFC'>>8,D1ˆ.�3,0‰BEQ.S…MLFS94ŽMATCH™3,0'‰MOVE.L„#1,D6�D6�=�VALUE�FOR�RETURN‰3,0‰CMP.L…#'DFC'>>8,D1ˆ.�3,0‰BEQ.S…MLFS94ŽMATCH™3,0*‰MOVE.W„#$800,D6ŒD6�=�VALUE�FOR�RETURN‰3,0‰CMP.L…#'USP'>>8,D1ˆ.�3,0‰BEQ.S…MLFS94ŽMATCH™3,0*‰MOVE.W„#$801,D6ŒD6�=�VALUE�FOR�RETURN‰3,0‰CMP.L…#'VBR'>>8,D1ˆ.�3,0‰BNE.S…MLFS95ŽMISS-MATCH”3,0.MLFS94ƒADD.L…#3,A5�ADJUST�GET�CHAR�POINTER‡3,0MLFS95ƒRTS›.�3,0 PAGE MMOVESƒDSˆ0“(INDEX�39)�68010Ž3,0 ‰BSR‡FSIZE�OR�SIZE�INTO�D2�3,0 %‰ADD.B…#2,TNB(A1)ŠNUMBER�OF�BYTES�3,0*‰ADD.L…#2,D3�FORCE�STORE�PTR�PAST�MASK…3,0 ‰BSR‡GETREGADŒ.�3,0‰BEQ.S…MMOVES44ŒRn,—3,0 *ƒ,Rn"‰BSR‡EAM‘MEMORY�ALTERABLE�ONLY‰3,0‰OR.W†D6,D2�.�3,0 ‰BSR‡COMMA�.�3,0 ‰BSR‡GETREGADŒ.�3,0‰BNE‡ER8‘.�3,0 ‰OR.W†D1,D0�.�3,0‰ROR.W…#4,D0�.�3,0&‰MOVE.W„D0,TDATA+2(A1)†SECOND�WORD“3,0‰BRA.S…CMMD22Ž.�3,0 MMOVES44�OR.W†D1,D0�.�3,0‰ROR.W…#4,D0�.�3,0 ‰OR.W†#$800,D0ŒDIRECTION�BIT‘3,0&‰MOVE.W„D0,TDATA+2(A1)†SECOND�WORD“3,0 ‰BSR‡COMMA�.�3,0 "‰BSR‡EAM‘MEMORY�ALTERABLE�ONLY‰3,0‰OR.W†D6,D2�.�3,0CMMD22ƒBRA‡CMMD2�.�3,0  PAGEMMOVEA1‚CLR.L…D3‰MOVE.B„#2,TNB(A1) MMOVEAƒDSˆ0“(INDEX�32),‰MOVE.L„PTROP(A1),A5ˆA5�=�POINTER�TO�OPERAND $‰MOVE.W„TLENGTH(A1),D2†D2�=�SIZE•1,2‰BEQ‡ER’.BYTE�NOT�ALLOWED ‰LSL.W…#6,D2�.SIZE™1,2‰BTST†#12,D2Ž.�1,2‰BEQ.S…MMA225Ž.L�=�..10•1,2‰OR.W†#$3000,D2‹.W�=�..11•1,2MMA225 ‰BSR‡EAALL�ALL�MODES�ALLOWED ‰OR.W†D6,D2 ‰BSR‡COMMA ‰MOVE.L„#$0002,D7‹A@�ONLY—3,0‰BSR‡EA ‰BRA‡MM825 PAGEMJMP…DSˆ0“(INDEX�18)‰TST.B…TLSPEC(A1)Š.�1,11‰BEQ.S…MJMP32ŽDEFAULT�(ALLOW�EITHER�.S�OR�.L)�1,1‰MOVE.W„TLENGTH(A1),D0†.�1,1‰BEQ.S…ER7‘.B�NOT�ALLOWED�3,0'‰MOVE.W„#$6E4,D7ŒD7�=�MODES�ALLOWEDŒ1,1‰CMP.W…#$40,D0�.�1,1,‰BEQ.S…MJMP22Ž.S�SPECIFIED�(.W�ACCEPTED)„1,1!‰MOVE.W„#$8764,D7‹MODE�FOR�.L“. 1,1MJMP22ƒBSR‡EA’.�1,1‰BRA.S…MJMP42Ž.�1,1 *MJMP32ƒBSR‡EAC‘CONTROL�ADDRESSING�ONLY‡1,1MJMP42ƒOR.W†D6,D2�.�1,1‰BRA.S…CMMD21Ž.�3,0 SPC 4 * SIZE = LONGMLEA…DSˆ0“(INDEX�19) ‰BSR‡SIZELONG ‰BSR‡EAC‡CONTROL�ADDRESSING�ONLY ‰OR.W†D6,D2 ‰BSR‡COMMA ‰BSR‡GETREGA‰BNE.S…ER7‘.�3,0 ‰ROR.W…#7,D0 MLEA22ƒOR.W†D0,D2�.�3,0‰BRA.S…CMMD21Ž.�3,0 PAGE * SIZE = LONGMPEA…DSˆ0“(INDEX�36) ‰BSR‡SIZELONG ‰BSR‡EAC‡CONTROL�ADDRESSING�ONLY ‰OR.W†D6,D2CMMD21ƒBRA‡CMMD2�.�3,0 SPC 3MSWAP„DSˆ0“(INDEX�24) * SIZE WORD‰CMP.W…#$0040,TLENGTH(A1)‰BNE.S…ER7‘NOT�.W˜3,0 ‰BSR‡GETREGD�D@�ONLY‰BEQ‡MLEA22Ž.�3,0ER7†BRA‡ER’.�3,0 PAGEGETIMMƒCMP.B…#'#',(A5)+‰BNE‡ER7‘.�3,0 ‰BSR‡EV’EVALUATE�EXPRESSION‰RTS›D0�=�VALUE MLINK„BSR‡GETREGA�(INDEX�20)‰BNE‡ER7‘.�3,0 ‰OR.W†D0,D2 ‰BSR‡COMMA MRTD…BSR‡GETIMMŽ(INDEX�40)”3,0 ‰MOVE.L„D0,D5 ‰BSR‡EA16BITS‰MOVE.W„D0,TDATA+2(A1) ‰ADD.B…#2,TNB(A1)‰BRA‡CMMD21Ž.�3,0 MSTOP„DSˆ0“(INDEX�23) * UNSIZED ‰BSR‡GETIMM‰CMP.L…#$00010000,D0‰BCC‡ER7‘.�3,0‰MOVE.W„D0,TDATA+2(A1)‰ADD.B…#2,TNB(A1)‰BRA‡CMMD21Ž.�3,0 MTRAP„DSˆ0“(INDEX�25) ‰BSR‡GETIMM ‰CMP.L…#16,D0‰BCC‡ER7‘.�3,0 ‰OR.W†D0,D2‰BRA‡CMMD21Ž.�3,0 PAGEMUNLK„DSˆ0“(INDEX�26) * UNSIZED ‰BSR‡GETREGA‰BNE‡ER7‘.�3,0 ‰OR.W†D0,D2‰BRA‡CMMD21Ž.�3,0 SPC 4#MDC†DSˆ0“(INDEX�37)�.W�ONLY�ALLOWED‰BSR‡EV ‰MOVE.L„D0,D5‰BSR‡EA16BIT�ONLY�.W�ALLOWED ‰MOVE.W„D5,D2‰BRA‡CMMD21Ž.�3,0  ‰END é‰TTL‡DCODE68K‚DISASSEMBLER+DCODE68K�IDNT†3,1‡68K�ONE�LINE�DISASSEMBLER *‡VERSION„AUTHOR„DATE†REASON=*ˆ3.1‡S.Ludwig‚01/16/85‚Make�MOVEP�output�displacement�in�dec6*ˆ3.0‡S.Ludwig‚12/16/84‚Make�program�work�with�a�68010 ‰XREF†BESTFIT‰XREF†PNT4HX¬3,0‰XREF†FORMADDR‰XREF†HEX2DEC,SYMORDEC SPC 1‰XDEF†DCODE68K‰XDEF†DCODE68MŒ.�3,0 SPC 1$BUFSIZE‚SET‡80’SIZE�OF�OUTPUT�BUFFER EOT†SET‡4 SPC 1*ˆCALLING�SEQUENCE:$*ƒD0,D1,D2�=�CODE�TO�BE�DISASSEMBLED=*ƒD3�=�PROCESSOR�TYPE:�0=68000,�4=68008,�8=68010,�C=68020Š3,0,*ƒA4�=�VALUE�OF�PROGRAM�COUNTER�FOR�THE�CODE3*ƒA5�=�POINTER�TO�STORE�DATA�(BUFSIZE�=�80�ASSUMED)"*ˆJSR‡DCODE68MŒ000/008/010/020�3,0 SPC 1*ˆCALLING�SEQUENCE:$*ƒD0,D1,D2�=�CODE�TO�BE�DISASSEMBLED,*ƒA4�=�VALUE�OF�PROGRAM�COUNTER�FOR�THE�CODE3*ƒA5�=�POINTER�TO�STORE�DATA�(BUFSIZE�=�80�ASSUMED)*ˆJSR‡DCODE68K†68000�ONLY SPC 1 *ˆRETURN:4*ƒA4�=�VALUE�OF�PROGRAM�COUNTER�FOR�NEXT�INSTRUCTION&*ƒA5�=�POINTER�TO�LINE�AS�DISASSEMBLED"*ƒA3�=�POINTER�TO�END�OF�LINE¦3/82*?* 0123456789012345678901234567890123456789012345678901234567890B* AAAAAA:MODULEXX:A DDDDDDDDDDDDDDDDDDDD LLLLLLLL OP-CODE OPERAND.*“FDATA™FOC…FOP SPC 1FDATA„EQU‡18‚DATA�FIELDFOC†EQU‡48‚OP-CODE�FIELDFOP†EQU‡56‚OPERAND�FIELD SPC 1* CAUSES ORGIN MODULO 4 LONG…MACRO‰DSˆ0 ‰DS.B†(*-X)&2‰ENDM SPC 3LOCVARSZ�EQU�26Ž.§3,0‰OFFSET�-LOCVARSZ#DATA…DS.L�3ŽCODE�TO�BE�DISASSEMBLED5ENDBUFƒDS.L�1ŽA(END�TEXT�BUFFER�FOR�DISASSEMBLY)†3/82*HISPC„DS.L�1ŽPC�OF�CODE�BEING�DISASSEMBLED*BEGBUFƒDS.L�1ŽA(START�OF�TEXT�BUFFER)‘3/82PRTYPEƒDS.W†1‰.‰.�3,0'‰DS.B†0‰(PC�MUST�BE�ZERO�'00000000'�3,0 PAGEEAM003ƒEQU‡$003†D@�A@£3,04EAM1F4ƒEQU‡$1F4†CONTROL�ALTERABLE�+�PREDECREMENTˆ3,0/EAM1FCƒEQU‡$1FC†MEMORY�ALTERABLE�ADDRESSING�3,0-EAM1FDƒEQU‡$1FD†DATA�ALTERABLE�ADDRESSING�3,0/EAM1FEƒEQU‡$1FE†ALTERABLE�MEMORY�ADDRESSING�3,0'EAM1FFƒEQU‡$1FF†DATA�ALTERABLE�+�A@•3,0&EAM7E4ƒEQU‡$7E4†CONTROL�ADDRESSING–3,0+EAM7ECƒEQU‡$7EC†CONTROL�+�POSTINCREMENT‘3,0#EAMFFDƒEQU‡$FFD†DATA�ADDRESSING™3,0 ¿DÈbÐfØbàXèjðfø^[[ci ^([0U8V@>HV. EAMFFFƒEQU‡$FFF†ALL�MODESŸ3,0 SPC 3 ‰SECTIONƒ9 SPC 2XˆDSˆ0‰BASE�ADDRESS�THIS�MODULE ‰LONGš.�3,0IRTD…BRA‡ILINK44�.�3,0 ‰LONGš.�3,0IMOVECƒBRA‡IMOVEC11Œ.�3,0 ‰LONGš.�3,0IMOVESƒBRA‡IMOVES11Œ.�3,0 ‰LONGš.�3,0IEOR…BRA‡IEOR11Ž.�3,0 PAGE‰LONG*‚MOVEM�REGISTERS�TO�EA**‚01001D001S......$*‚..........XXXXXX‚EFFECTIVE�ADDRESS*‚.........0......‚WORD*‚.........1......‚LONG%*‚.....0..........‚REGISTER�TO�MEMORY%*‚.....1..........‚MEMORY�TO�REGISTER* IMOVEMFR�DSˆ0‰BSR‡MOVEMSŽSIZE ‰MOVE.L„#$0038,D6‹.�1,4‰AND.W…(A4),D6�.�1,4‰CMP.W…#$0020,D6‰BEQ.S…IM7788ŽPREDECREMENT�MODE -‰MOVE.L„#1,D6�D6�=�INCREMENTER�(BIT�POSITION)‰MOVE.L„#0,D1�D1�=�BIT�POSITION ‰BRA.S…IM7799 4IM7788ƒMOVE.L„#-1,D6ŽD6�=�DECREMENTER�(BIT�POSITION) ‰MOVE.L„#15,D1ŽD1�=�BIT�POSITION!IM7799ƒBSR‡MOVEMRŽBUILD�MASK�WORD SPC 1#‰MOVE.B„#',',(A3)+ŠSTORE�COMMA“3/82 SPC 1 ‰ADD.L…#2,D3‰MOVE.W„(A4),D4.‰MOVE.W„#EAM1F4,D7ŒCONTROL�+�PREDECREMENTˆ3/82‰BSR‡EA‰BRA.S…CS16�COMMON SPC 1‰LONG*�MOVEM‚EA‚TO�REGISTERS*IMOVEMTR�BSR‡MOVEMSŽSIZE ‰ADD.L…#2,D3/‰MOVE.W„#EAM7EC,D7ŒCONTROL�+�POSTINCREMENT‡3/82‰BSR‡EA SPC 1#‰MOVE.B„#',',(A3)+ŒSTORE�COMMA‘3/82 SPC 1+‰MOVE.L„#1,D6�D6�=�BIT�POSITION�INCREMENTER‰MOVE.L„#0,D1�D1�=�BIT�POSITION ‰BSR‡MOVEMR SPC 1CS16…BRA.S…CS15�COMMON SPC 1 PAGE‰LONG ISTOP„DSˆ0‰MOVE.W„2(A4),D0!‰MOVE.B„#'#',(A3)+ŠIMMEDIATE•3/82‰MOVE.B„#'$',(A3)+ŠHEX›3/82‰BSR‡PNT4HXŽVALUE ‰BRA‡COMMON4 PAGE‰LONG#IMMED„DSˆ0“ADD‚AND‚CMP�#‚EOR‚OR‚SUB ‰BSR‡FORMSIZE‰ADD.L…#2,D3�SIZE�=�4!‰MOVE.B„#'#',(A3)+ŠIMMEDIATE•3/82 SPC 1 ‰CLR.L…D0$‰MOVE.W„2(A4),D0ŒD0�=�EXTENSION�WORD‰MOVE.W„(A4),D1 ‰LSR.W…#6,D1 ‰AND.W…#3,D1‰BEQ.S…IMMED65ƒ.BYTE SPC 1 ‰CMP.B…#1,D1‰BEQ.S…IMMED75ƒ.WORD SPC 1‰ADD.L…#2,D3�.LONG„SIZE�=�6)‰MOVE.L„2(A4),D0ŒD0�=�LONG�EXTENSION�WORD SPC 1IMMED45‚BSR‡BESTFIT�.�3/82 SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 ‰MOVE†(A4),D0‰AND.W…#$003F,D05‰CMP.W…#$003C,D0‹DESTINATION�ADDRESS�MODE�111100‚"SR"‰BNE.S…IMMED55�NOT�FOUND ‰MOVE.W„(A4),D0�"SR"‚ILLEGAL�FOR‰AND.W…#$4000,D0�ADDIƒSUBI‚CMPI‰BNE‡FERROR’0600ƒ0400‚0C00 ‰MOVE.W„(A4),D1‰AND.W…#$00C0,D1‰CMP.W…#$0080,D1‰BEQ‡FERRORŽ.LONG�NOT�ALLOWED 0‰MOVE.B„#'S',(A3)+Š#,SR�FOR�ANDI,�EORI,�ORI†3/82‰MOVE.B„#'R',(A3)+Š.�3/82CS15…BRA.S…CS14”COMMON SPC 1IMMED55‚BSR‡EA‰BRA.S…CS14•COMMON *IMMED65‚MOVE.L„D0,D1�D1�=�XXXXXXXX........"‰LSR.W…#8,D1�D1�=�00000000XXXXXXXX‰BEQ.S…IMMED75 ‰MOVE.L„D0,D1 ‰ASR.W…#7,D1‰ADD.W…#1,D1�CHECK�FOR�NEGATIVE ‰BNE‡FERROR IMMED75‚EXT.L…D0 ‰BRA‡IMMED45 PAGE*ƒBIT‚5432109876543210,*ˆ....RRRMMM......„DESTINATION�REGISTER�MODE'*ˆ..........MMMRRR„SOURCE�MODE�REGISTER*ˆ0001............„.BYTE*ˆ0011............„.WORD*ˆ0010............„.LONG*6* IF BYTE SIZE; DESTINATION ADDRESS DIRECT NOT ALLOWED‰LONG IMOVE„DSˆ0 ‰BRA‡IMOVEA1 SPC 2‰LONG ILINK„DSˆ0‰BSR.S…FORMREGA SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SERARATOR‘3/82 SPC 1)ILINK44‚MOVE.B„#'#',(A3)+Š(RTD�68010)“3,0‰MOVE.W„2(A4),D0 ‰EXT.L…D0!‰BSR‡HEX2DEC�DECIMAL�DISPLACEMENT ‰BRA‡COMMON4 PAGE‰LONGFORM1„DSˆ0“CLR‚NEG‚NEGX‚NOT�TST‰BSR.L…FORMSIZE SPC 1 *œNBCD�TAS!FORM1AƒBSR‡EA’DATA�ALTERABLE�ONLYCS14…BRA.S…CS13�COMMON SPC 1‰LONGFORM3„DSˆ0“EXT‚SWAP‰BSR.S…FORMREGD‰BRA.S…CS13�COMMON SPC 1‰LONGFORM4„DSˆ0“TRAP‰MOVE.B„#'#',(A3)+Š.�3/82‰MOVE.W„(A4),D0‰AND.L…#$0F,D0‰BSR‡HEX2DEC�DECIMAL‰BRA.S…CS13�COMMON SPC 1‰LONGFORM5„DSˆ0“UNLNK‰BSR.S…FORMREGA‰BRA.S…CS13‘COMMON‚PAGE*…5432109876543210#*…....RRR.........‡ADDRESS�REGISTER$*…..........XXXXXX‡EFFECTIVE�ADDRESS*‰LONGFORM6AƒDSˆ0“LEA%‰MOVE.W„#EAM7E4,D7�CONTROL�ADDRESSING ‰BSR.S…EA10 SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.W„(A4),D4 ‰ROL.W…#7,D4‰BSR.S…FORMREGA‰BRA.S…CS13‘COMMON SPC 1*ƒBIT‚5432109876543210 *ˆ....DDD.........„DATA�REGISTER$*ˆ..........XXXXXX„EFFECTIVE�ADDRESS*‰LONG/ #FORM6DƒDSˆ0“CHK‚DIVS‚DIVU‚MULS‚MULU"‰MOVE.W„#EAMFFD,D7ŒDATA�ADDRESSING ‰BSR.S…EA10 SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.W„(A4),D4 ‰ROL.W…#7,D4‰BSR.S…FORMREGD‰BRA.S…CS13�COMMON SPC 1)FORMREGA�MOVE.B„#'A',(A3)+ŠFORMAT�A@•3/82FORMREG5�AND.B…#$07,D4 ‰OR.B†#'0',D4‰MOVE.B„D4,(A3)+Œ.�3/82‰RTS SPC 1)FORMREGD�MOVE.B„#'D',(A3)+ŠFORMAT�D@•3/82 ‰BRA‡FORMREG5 SPC 1*‚BIT‚5432109876543210!*‡....DDD......DDD…DATA�REGISTERS*‰LONGFORM7„DSˆ0“EXG ‰ROL.W…#7,D4 ‰BSR‡FORMREGD SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.W„(A4),D4 ‰BSR‡FORMREGD‰BRA.S…CS13�COMMON SPC 1*‚BIT‚5432109876543210$*‡....AAA......AAA…ADDRESS�REGISTERS*‰LONGFORM8„DSˆ0“EXG ‰ROL.W…#7,D4 ‰BSR‡FORMREGA SPC 1.FORM815‚MOVE.B„#',',(A3)+ŠCOMMA�SEPARATOR�3/82 SPC 1‰MOVE.W„(A4),D4 ‰BSR‡FORMREGACS13…BRA.S…CS12A�COMMON SPC 1*‚BIT‚5432109876543210 *‡....DDD.........…DATA�REGISTER#*‡.............AAA…ADDRESS�REGISTER*‰LONGFORM9„DSˆ0“EXG ‰ROL.W…#7,D4‰BSR‡FORMREGD‚DATA�REGISTER ‰BRA‡FORM815 SPC 3 EA10…BRA‡EA PAGE*ƒ5432109876543210$*ƒ..........AAAAAA‰EFFECTIVE�ADDRESS*ƒ.......MMM......‰OP-MODE*ƒ....RRR.........‰D-REGISTER*ƒ.......011......‰WORD‚EA,A@*ƒ.......111......‰LONG‚EA,A@C*ƒ.......000......‰EA,D@�BYTE�(ADDRESS�REGISTER�DIRECT�NOT�ALLOWED)*ƒ.......0........‰EA,D@*ƒ.......1........‰D@,EA*ƒ........00......‰BYTE*ƒ........01......‰WORD*ƒ........10......‰LONG*‰LONG%FORM10EX�DSˆ0“ADD‚CMP�,A@‚CMP‚SUB$‰MOVE.W„#EAMFFF,D7ŒALL�MODES�ALLOWED ‰MOVE.L„D4,D0‰AND.W…#$01C0,D0‰BEQ.S…FORM103�.......000......‰CMP.W…#$01C0,D0 ‰BEQ.S…FORM10E3Œ.......111......‰CMP.W…#$00C0,D0!‰BNE.S…FORM10E6Œ.......011....... ‰MOVE.B„#'.',(A5)+ŠSTORE�PERIOD‰MOVE.B„#'W',(A5)+‰BRA.S…FORM10E4 SPC 1FORM10E3�MOVE.B„#'.',(A5)+‰MOVE.B„#'L',(A5)+ FORM10E4�BSR‡EA10 SPC 1+‰MOVE.B„D5,(A3)+ŒSTORE�COMMA�SEPARATOR‰3/82 SPC 1‰MOVE.W„(A4),D4 ‰ROL.W…#7,D4‰BSR‡FORMREGAŒ,A@CS12A„BRA.S…CS12�COMMON FORM10E6�BTST.B„#0,(A4)'‰BNE.S…FORM105�.......1........‚D@,'‰BRA.S…FORM104�.......0........‚,D@ PAGE*ƒ5432109876543210$*ƒ..........AAAAAA‰EFFECTIVE�ADDRESS*ƒ.......MMM......‰OP-MODE*ƒ....RRR.........‰D-REGISTER*ƒ.......0........‰EA,D@*ƒ.......1........‰D@,EA*ƒ........00......‰BYTE*ƒ........01......‰WORD*ƒ........10......‰LONG‰LONGFORM10ƒDSˆ0“ANDƒOR–3,0‰BTST.B„#0,(A4)‰BNE.S…FORM105 SPC 1)FORM103‚MOVE.W„#EAMFFD,D7ŒDATA�ADDRESSINGFORM104‚BSR‡FORMSIZEŒ.�2,4‰BSR‡EA10�,D@—2,4 SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 ‰BSR‡FORMREGD‰BRA.S…CS12�COMMON SPC 1FORM105‚BSR‡FORMSIZEŒ.�2,4‰MOVE.B„(A4),D4�D@, ‰LSR.B…#1,D4 ‰BSR‡FORMREGD SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 ‰MOVE.W„(A4),D42‰MOVE.W„#EAM1FC,D7ŠALTERABLE�MEMORY�ADDRESSINGƒ4,0 ‰BSR‡EA10CS12…BRA.S…CS11AŽCOMMON PAGE‰LONG *œJMP‚JSR‚PEA+FORM11ƒMOVE.W„#EAM7E4,D7ŒCONTROL�ADDERSSING‰BSR‡EA‰BRA.S…CS11A…COMMON SPC 1‰LONG *œJMP‚JSR+FORM11SL�MOVE.L„D4,D0�LOOK�FOR�.S‚OR‚.L‹1,4‰AND.W…#$3F,D0�.�1,4‰CMP.W…#$38,D0�.�1,4‰BNE.S…FORM112�NOT�.S˜1,4‰MOVE.B„#'.',(A5)+ŠPERIOD˜1,4‰MOVE.B„#'S',(A5)+ŠS�1,4FORM112‚CMP.W…#$39,D0�.�1,4‰BNE.S…FORM114�.�1,4‰MOVE.B„#'.',(A5)+ŠPERIOD˜1,4‰MOVE.B„#'L',(A5)+ŠL�1,4FORM114‚BRA‡FORM11Ž.�1,4 PAGE* BIT 5432109876543210,*…....XXX.....0...‡DATA�DESTINATION�REGISTER#*…....XXX.....1...‡ADDRESS�REGISTER*…....XXX.00......‡BYTE*…........01......‡WORD*…........10......‡LONG1*…............0...‡DATA�REGISTER�TO�DATA�REGISTER#*…............1...‡MEMORY�TO�MEMORY'*…............0XXX‡DATA�SOURCE�REGISTER**…............1XXX‡ADDRESS�SOURCE�REGISTER*‰LONGFORM12ƒDSˆ0“ABCD‚ADDX‚SBCD‚SUBX ‰BSR‡FORMSIZE SPC 1 ‰BTST†#3,D4‰BNE.S…FORM125 SPC 1"‰BSR‡FORMREGDŒD@,D@;ƒFORMAT�SOURCE SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 ‰BSR‡FORMREGDŒFORMAT�DESTINATION/ CS11A„BRA.S…CS11�COMMON SPC 1 FORM125‚MOVE.B„#'-',(A3)+Š-�3/82‰MOVE.B„#'(',(A3)+Š(�3/82‰BSR‡FORMREGAŒA@„SOURCE SPC 1‰MOVE.L„#'(-,)',D0‹),-(‰BSR.S…SCHR�STORE�CHARS SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4‰BSR‡FORMREGAŒA@ƒDESTINATION‰MOVE.B„#')',(A3)+Š.�3/82‰BRA.S…CS11�COMMON PAGE* BIT 5432109876543210/*…....XXX.....1...‡ADDRESS�REGISTER„DESTINATION*…....XXX.00......‡BYTE*…........01......‡WORD*…........10......‡LONG#*…............1...‡MEMORY�TO�MEMORY**…............1XXX‡ADDRESS�SOURCE�REGISTER*‰LONGFORM12A‚DSˆ0“CMPM ‰BSR‡FORMSIZE SPC 1‰MOVE.B„#'(',(A3)+Š(�3/82‰BSR‡FORMREGAŒA@ SPC 1‰MOVE.L„#'(,+)',D0‹)+,(‰BSR.S…SCHR�STORE�CHARS SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4‰BSR‡FORMREGAŒA@‰MOVE.B„#')',(A3)+Š.�3/82‰MOVE.B„#'+',(A3)+Š.�3/82CS11…BRA‡COMMON PAGE‰LONGIQUICKƒBRA‡IQUICKA�ADDQ‚SUBQ SPC 4* BIT 5432109876543210*…0111...0........‡FIXED *…....RRR.........‡DATA�REGISTER%*…........DDDDDDDD‡SIGN�EXTENDED�DATA*‰LONG IMOVEQƒDSˆ0!‰MOVE.B„#'#',(A3)+ŠIMMEDIATE•3/82 SPC 1‰MOVE.W„(A4),D0 ‰EXT.W…D0 ‰EXT.L…D0‰BSR‡HEX2DEC�DECIMAL SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1 ‰ROL.W…#7,D4 ‰BSR‡FORMREGD‰BRA‡CS11�COMMON PAGE'SCHR…MOVE.B„D0,(A3)+ŒOUTPUT�STRING‘3/82 ‰LSR.L…#8,D0‰BNE‡SCHR�MORE�TO�OUTPUT‰RTS SPC 2 *�MOVE�FROM�SR‚(STATUS�REGISTER)*‰LONGIMVFSRƒMOVE.L„#',RS'>>8,D0‹SR, SPC 1 ‰BSR‡SCHR‰BSR‡EA’DATA�ALTERABLE‰BRA‡CS11�COMMON SPC 1$* MOVE FROM USP (USER STACK POINTER)*‰LONGIMVFUSP‚MOVE.L„#',PSU',D0ŠUSP, ‰BSR‡SCHR ‰BSR‡FORMREGA‰BRA‡CS11’COMMON SPC 1* MOVE TO SR (STATUS REGISTER)*‰LONG(IMVTSRƒMOVE.W„#EAMFFD,D7ŒDATA�ADDRESSING‰BSR‡EA‰MOVE.L„#'RS,'>>8,D0‹,SRIMVT44ƒBSR‡SCHRCS11B„BRA‡CS11”COMMON SPC 1"* MOVE TO USP (USER STACK POINTER)*‰LONGIMVTUSP‚BSR‡FORMREGA‰MOVE.L„#'PSU,',D0Š,USP ‰BRA‡IMVT44 PAGE'*‚MOVE�TO�CCR�(CONDITION�CODE�REGISTER)*‰LONG)IMVTCCR‚MOVE.W„#EAMFFD,D7ŒDATA�ADDRESSING‰BSR‡EA‰MOVE.L„#'RCC,',D0Š,CCR ‰BRA‡IMVT44 3*‚MOVE�FROM�CCR�(CONDITION�CODE�REGISTER)‡68010�3,0*Ä3,0 ‰LONG¸3,0"IMVTFCR‚MOVE.L„#',RCC',D0ŠCCR,š3,0‰BSR‡SCHR�.�3,0&‰MOVE.W„#EAMFFD,D7ŠDATA�ADDRESSING�3,0 ‰BSR‡EA’.�3,0‰BRA‡CS11B�COMMON˜3,0 PAGE*�BIT‚5432109876543210*†0000...1..001...†FIXED *†....XXX.........†DATA�REGISTER%*†........0.......†MEMORY�TO�REGISTER%*†........1.......†REGISTER�TO�MEMORY*†.........0......†WORD*†.........1......†LONG#*†.............XXX†ADDRESS�REGISTER*‰LONG IMOVEPƒDSˆ0‰MOVE.B„#'.',(A5)+ŠD@,#(A@)‰MOVE.W„#'LW',D0 ‰BTST†#6,D4‰BEQ.S…IMOVEP11ŒUSE�"W"‰LSR.W…#8,D0�USE�"L"IMOVEP11�MOVE.B„D0,(A5)+ŒLENGTH SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 SPC 1‰BTST.B„#7,1(A4)‰BEQ.S…IMOVEP35 SPC 1‰BSR‡FORMREGDŒD@,$HHHH(A@) SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.W„(A4),D4‰BSR.S…IMOVEP66CS20…BRA‡COMMON4 SPC 1$IMOVEP35�BSR.S…IMOVEP66Œ$HHHH(A@),D@ SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.B„(A4),D4 ‰LSR.B…#1,D4 ‰BSR‡FORMREGD‰BRA‡CS20�COMMON4 SPC 10IMOVEP66�MOVE.W„2(A4),D0ŒFORMAT�DISPLACEMENT‹3,1‰EXT.L…D0’EXTEND�THE�SIGN�3,1$‰BSR‡SYMORDECŒCONVERT�TO�DECIMALŒ3,1 SPC 1‰MOVE.B„#'(',(A3)+¨3/82‰MOVE.W„(A4),D4 ‰BSR‡FORMREGA‰MOVE.B„#')',(A3)+¨3/82‰RTS PAGE‰LONG.SCOMMON‚BRA‡COMMONŽNOP�RESET�RTE�RTR�RTS�TRAPV SPC 1‰LONG!SCC†BSR‡ICCCC�GET�REST�OF�OP-CODE‰BSR‡EA’DATA�ALTERABLE ‰BRA‡SCOMMON  ‰LONGIDBCC„DSˆ0“DB--‰MOVE.W„(A4),D4 ‰BSR‡FORMREGD %‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 ‰BSR‡ICCCC ‰BRA.S…ICC55 SPC 1*‚BIT‚5432109876543210*‡0110............…FIXED*‡....CCCC........…CONDITION*‡........DDDDDDD0…DISPLACEMENT3*‡...............1…ERROR�(ODD�BOUNDRY�DISPLACEMENT)*‰LONG ICC†DSˆ0“B-- ‰BSR‡ICCCC SPC 1IBSR…DS.W†0“BSR‚BRA–2,4 SPC 1 ‰TST.B…D4 ‰BEQ.S…ICC55�16�BIT�DISPLACEMENT SPC 1‰MOVE.B„#'.',(A5)+‰MOVE.B„#'S',(A5)+‰EXT.W…D4’8�BIT�DISPLACEMENT SPC 1)ICC35„EXT.L…D4’SIGN-EXTENDED�DISPLACEMENT0 %‰ADD.L…HISPC(A1),D4‡+�PROGRAM�COUNTER‰ADD.L…#2,D4�+�TWO ‰MOVE.L„D4,D0 ‰ASR.L…#1,D4$‰BCS‡FERRORŽODD�BOUNDRY�DISPLACEMENT ‰BSR‡BESTFIT�.�3/82 ‰BRA‡SCOMMON SPC 1ICC55„ADD.L…#2,D3�SIZE‰MOVE.W„2(A4),D4‰MOVE.B„#'.',(A5)+-‰MOVE.B„#'L',(A5)+Š.L�FOR�16�BIT�DISPLACEMENT ‰BRA‡ICC35 PAGE‰LONG*šBCHG‚BCLR‚BSET‚BTSTISETD„DSˆ0“DYNAMIC�BIT ‰ROL.W…#7,D4‰BSR‡FORMREGDŒDATA�REGISTER SPC 1,ISETD12‚MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.W„(A4),D4‰BSR‡EA’DATA�ALTERABLECS18…BRA‡SCOMMON SPC 3‰LONG*œBCHG‚BCLR‚BSET‚BTST5*‚1ST�WORD…....�....�..XX�XXXX„EAƒDATA�ALTERABLE�ONLY)*‚2ND�WORD…0000�0000�000Y�YYYY„BIT�NUMBER*ISETS„DSˆ0“STATIC�BIT‰ADD.L…#2,D3…SIZE!‰MOVE.B„#'#',(A3)+ŠIMMEDIATE•3/82 ‰CLR.L…D0/‰MOVE.W„2(A4),D0ŒGET�BIT�POSITION�FROM�2ND�WORD ‰MOVE.L„D0,D1 ‰LSR.L…#5,D1 ‰BNE‡FERROR‰BSR‡HEX2DEC�DECIMAL SPC 1 ‰BRA‡ISETD12 PAGE*ƒBIT‚5432109876543210+*ˆ....XXX.........„IMMEDIATE�COUNT/REGISTER*ˆ.......0........„RIGHT�SHIFT*ˆ.......1........„LEFT�SHIFT*ˆ........00......„BYTE*ˆ........01......„WORD*ˆ........10......„LONG *ˆ....0...11......„WORD�(MEMORY)$*ˆ....0...11AAAAAA„EFFECTIVE�ADDRESS(*ˆ..........0.....„SHIFT�IMMEDIATE�COUNT;*ˆ..........1.....„SHIFT�COUNT�(MODULO�64)�IN�DATA�REGISTER*‰LONGISHIFTƒDSˆ0“AS-‚LS-‚RO-‚ROX-‰MOVE.W„#'LR',D0‰BTST†#8,D4�DIRECTION�BIT‰BEQ.S…ISHIFT13ŒRIGHT‰LSR.W…#8,D0�LEFT.ISHIFT13�MOVE.B„D0,(A5)+ŒDIRECTION;�"L"�OR�"R" SPC 1‰MOVE.W„(A4),D0‰AND.W…#$00C0,D0‰CMP.W…#$00C0,D0‰BEQ.S…ISHIFTM�MEMORY�SHIFT SPC 1 ‰BSR‡FORMSIZE SPC 1 ‰ROL.W…#7,D4‰BTST†#12,D4ŽI/R�BIT!‰BNE.S…ISHIFT33ŒCOUNT�IN�REGISTER SPC 1‰AND.B…#$07,D4�IMMEDIATE�COUNT‰BNE.S…ISHIFT23"‰OR.B†#$08,D4�CHANGE�ZERO�TO�EIGHTISHIFT23�OR.B†#'0',D4‰MOVE.B„#'#',(A3)+Š.�3/82‰MOVE.B„D4,(A3)+Œ.�3/82‰BRA.S…ISHIFT44 SPC 1ISHIFT33�BSR‡FORMREGD SPC 1-ISHIFT44�MOVE.B„D5,(A3)+‹COMMA�SEPARATOR�3/82 SPC 1‰MOVE.W„(A4),D4 ‰BSR‡FORMREGDCS17…BRA‡CS18�COMMON SPC 1‰LONG ISHIFTM‚MOVE.B„#'.',(A5)+ŠPERIOD‰MOVE.B„#'W',(A5)+Š.WORD ‰BTST†#11,D4‰BNE‡FERRORŽBIT�11�MUST�BE�ZERO SPC 1.‰MOVE.W„#EAM1FC,D7ŒMEMORY�ALTERABLE�ADDRESSING‰BSR‡EA‰BRA‡CS17�COMMON PAGE.ICCCC„MOVE.L„#$0F,D0�APPEND�CONDITION�CODE‰1,4‰AND.B…(A4),D0�D0�=�CCC–1,4‰LSL.L…#1,D0�D0�=�CCC*2 SPC 1-‰MOVE.W„BRTBL(PC,D0.W),D1ƒGET�BRANCH�MNEMONIC*‰MOVE.B„D1,(A5)+Œ(REVERSED)�FROM�THE�TABLE)‰LSR.W…#8,D1�AND�ADD�THE�NONBLANK�PORTION‰CMP.B…#'�',D1�TO�THE�BUFFER. ‰BEQ.S…ICCCC9‰MOVE.B„D1,(A5)+ ICCCC9ƒRTS SPC 2!BRTBL„DC.B†'�T'†'T�'‚BRA�ACCEPTED‰DC.B†'�F'†'F�'‰DC.B†'IH'†'HI'‰DC.B†'SL'†'LS'‰DC.B†'CC'†'CC'‰DC.B†'SC'†'CS'‰DC.B†'EN'†'NE'‰DC.B†'QE'†'EQ'‰DC.B†'CV'†'VC'‰DC.B†'SV'†'VS'‰DC.B†'LP'†'PL'‰DC.B†'IM'†'MI'‰DC.B†'EG'†'GE'‰DC.B†'TL'†'LT'‰DC.B†'TG'†'GT'‰DC.B†'EL'†'LE' PAGE*ƒBIT‚5432109876543210,*ˆ....RRRMMM......„DESTINATION�REGISTER�MODE'*ˆ..........MMMRRR„SOURCE�MODE�REGISTER*4* IF BYTE SIZE; ADDRESS DIRECT NOT ALLOWED AS SOURCE* IMOVEA1‚DSˆ0‰MOVE.W„#EAMFFF,D7ŒALL�MODES‰BSR‡EA SPC 1%‰MOVE.B„D5,(A3)+ŒCOMMA�SEPARATOR�3/82 SPC 1 ‰MOVE.W„(A4),D4�....RRRMMM......‰LSR.W…#1,D4�.....RRRMMM.....‰LSR.B…#5,D4�.....RRR.....MMM‰ROR.W…#8,D4�.....MMM.....RRR‰LSL.B…#5,D4�.....MMMRRR.....‰LSR.W…#5,D4�..........MMMRRR SPC 1%* IF .BYTE DESTINATION A@ NOT ALLOWED&‰MOVE.W„#EAM1FF,D7ŒDATA�ALTERABLE�+�A@‰MOVE.B„(A4),D0‰CMP.B…#$01,D0‰BNE.S…IMOVE19�NOT�BYTE�SIZE !‰MOVE.W„#EAM1FD,D7ŒDATA�ALTERABLEIMOVE19 ‰BSR‡EA‰BRA.S…CS19†COMMON PAGE.*‚IF�BYTE;�ADDRESS�REGISTER�DIRECT�NOT�ALLOWEDIQUICKA‚DSˆ0“ADDQ‚SUBQ‰BSR.S…FORMSIZE SPC 1‰MOVE.B„#'#',(A3)+Š.�3/82 ‰ROL.W…#7,D4 ‰AND.B…#7,D4‰BNE.S…IQUICK21 ‰OR.B†#8,D4�MAKE�ZERO�INTO�EIGHT IQUICK21�OR.B†#'0',D4�MAKE�ASCII‰MOVE.B„D4,(A3)+Œ.�3/82 SPC 1%‰MOVE.B„D5,(A3)+ŠCOMMA�SEPARATOR‘3/82 SPC 1‰MOVE.W„(A4),D4 ‰MOVE.W„(A4),D0‰AND.W…#$00C0,D0‰BEQ.S…IQUICK31ŒDATA�ALTERABLE&‰MOVE.W„#EAM1FF,D7ŠDATA�ALTERABLE�+�A@IQUICK31�BSR‡EA0 CS19…BRA‡COMMON PAGE*‚BITƒ5432109876543210*ˆ........00......„BYTE*ˆ........01......„WORD*ˆ........10......„LONG*ˆ........11......„ERROR* FORMSIZE�DSˆ0‰MOVE.W„(A4),D2‰MOVE.B„#'.',(A5)+ŠSTORE�PERIOD ‰LSR.W…#6,D2‰AND.W…#$03,D2 ‰BNE.S…FORM91‰MOVE.B„#'B',(A5)+ŠSTORE�"B" ‰BRA.S…FORM95 SPC 1FORM91ƒMOVE.B„#'W',D0 ‰CMP.B…#1,D2 ‰BEQ.S…FORM93‰MOVE.B„#'L',D0 ‰CMP.B…#2,D2‰BNE.S…FE10�FERROR'FORM93ƒMOVE.B„D0,(A5)+‚STORE�"W"�OR�"L" FORM95ƒRTS PAGEEA000„BSR‡FORMREGD ‰BTST†#0,D7‰BEQ.S…FE10�FERROR‰RTS SPC 2EA001„BSR‡FORMREGA ‰BTST†#1,D7(‰BEQ.S…FE10ŽFERROR‡THIS�MODE�NOT�ALLOWED‰RTS SPC 2EA010„MOVE.B„#'(',(A3)+Š.�3/82 ‰BSR‡FORMREGA‰MOVE.B„#')',(A3)+Š.�3/82 ‰BTST†#2,D7(‰BEQ.S…FE10ŽFERROR‡THIS�MODE�NOT�ALLOWED‰RTS SPC 2EA011„MOVE.B„#'(',(A3)+Š.�3/82 ‰BSR‡FORMREGA‰MOVE.B„#')',(A3)+Š.�3/82‰MOVE.B„#'+',(A3)+Š.�3/82 ‰BTST†#3,D7(‰BEQ.S…FE10†FERROR…THIS�MODE�NOT�ALLOWED EA011RTS RTS SPC 2EA100„MOVE.B„#'-',(A3)+Š.�3/82‰MOVE.B„#'(',(A3)+Š.�3/82 ‰BSR‡FORMREGA‰MOVE.B„#')',(A3)+¨3/82 ‰BTST†#4,D7 ‰BNE‡EA011RTS%FE10…BRA‡FERRORŽTHIS�MODE�NOT�ALLOWED PAGE"*‚ENTER�A4�=�POINTER�TO�FIRST�WORD*ˆD3�=�OFFSET�TO�EXTENSION*ˆD4�=�VALUE�TO�PROCESS*ˆD7�=�MODES�ALLOWED�MASK'*‹=�...............1ƒD@ŒDATA�REG�DIRECT**‹=�..............1.ƒA@ŒADDRESS�REG�DIRECT.*‹=�.............1..ƒ(A@)ŠADDRESS�REG�INDIRECT9*‹=�............1...ƒ(A@)+‰ADDRESS�REG�INDIRECT�W/POSTINC9*‹=�...........1....ƒ-(A@)‰ADDRESS�REG�INDIRECT�W/POSTDEC6*‹=�..........1.....ƒd(A@)‰ADDRESS�REG�INDIRECT�W/DISP:*‹=�.........1......ƒd(A@,R@)†ADDRESS�REG�INDIRECT�W/INDEX)*‹=�........1.......ƒXXXXX‰ABSOLUTE�SHORT**‹=�.......1........ƒXXXXXXX‡ABSOLUTE�LONG**‹=�......1.........ƒd(PC)‰PROG�CTR�W/DISP.*‹=�.....1..........ƒd(PC,R@)†PROG�CTR�W/INDEX!*‹=�....1...........ƒ#XŒIMMEDIATE*EA‡DSˆ0 ‰MOVE.L„D4,D0 ‰LSR.W…#3,D0 ‰AND.W…#$7,D0 ‰BEQ‡EA000 SPC 1 ‰CMP.B…#1,D0 ‰BEQ‡EA001 SPC 1 ‰CMP.B…#2,D0 ‰BEQ‡EA010 SPC 1 ‰CMP.B…#3,D0 ‰BEQ‡EA011 SPC 1 ‰CMP.B…#4,D0 ‰BEQ‡EA100 SPC 1 ‰CMP.B…#5,D0 ‰BEQ.S…EA101 SPC 1 ‰CMP.B…#7,D0 ‰BEQ.S…EA111 PAGE*„EXTENSION�WORD*ƒBIT‚5432109876543210 *ˆ0...............„DATA�REGISTER#*ˆ1...............„ADDRESS�REGISTER*ˆ.RRR............„REGISTER@*ˆ....0...........„SIGN�EXTENDED,�LOW�ORDER�INTEGER�IN�INDEX�REG/*ˆ....1...........„LONG�VALUE�IN�INDEX�REGISTER*ˆ.....000........'*ˆ........DDDDDDDD„DISPLACEMENT�INTEGER*,*�EA110ŒADDRESS�REGISTER�INDIRECT�WITH�INDEX SPC 1 ‰BTST†#6,D7&‰BEQ‡FE10ŽFERROR…THIS�MODE�NOT�ALLOWED ‰MOVE.W„(A4,D3),D1‰AND.W…#$0700,D1'‰BNE‡FE10�FERROR„BITS�10-8�MUST�BE�ZERO $‰MOVE.W„(A4,D3),D0ŠD0�=�DISPLACEMENT ‰EXT.W…D0 ‰EXT.L…D0‰BSR‡SYMORDECŒDECIMAL—3/82‰MOVE.B„#'(',(A3)+Š(�3/82 SPC 1‰BSR‡FORMREGAŒXX(A@ SPC 1‰MOVE.B„#',',(A3)+ŠXX(A@,˜3/82 SPC 1‰MOVE.B„(A4,D3),D4 ‰ASR.B…#4,D4 ‰BPL.S…EA1105 ‰BSR‡FORMREGA ‰BRA.S…EA1107 SPC 1EA1105ƒBSR‡FORMREGD'EA1107ƒMOVE.B„#'.',(A3)+ŠXX(A@,X@.•3/82 SPC 1‰MOVE.W„(A4,D3),D4ŠD4�=�R@‰MOVE.B„#'W',D0�..........W ‰BTST†#11,D4 ‰BEQ.S…EA1109‰MOVE.B„#'L',D0�..........LEA1109ƒMOVE.B„D0,(A3)+Œ.�3/82$‰MOVE.B„#')',(A3)+Š...........)’3/82 ‰ADD.L…#2,D3‰RTS PAGE-* ADDRESS REGISTER INDIRECT WITH DISPLACEMENT* EA101„BTST†#5,D7�101000;ƒDIS(A@))‰BEQ.S…FE11�FERROR;�THIS�MODE�NOT�ALLOWED ‰MOVE.W„(A4,D3),D0 ‰EXT.L…D0‰BSR‡SYMORDECŒDECIMAL—3/82‰ADD.L…#2,D3�SIZE ‰BRA‡EA010 PAGE*‚111000ŠABSOLUTE�SHORT*‚111001ŠABSOLUTE�LONG**‚111010ŠPROGRAM�COUNTER�WITH�DISPLACEMENT#*‚111011ŠPROGRAM�COUNTER�WITH�INDEX *‚111100ŠIMMEDIATE�OR�STATUS�REG*EA111 ‰AND.W…#7,D4 ‰BNE.S…EA1112 SPC 1 ‰BTST†#7,D7)‰BEQ.S…FE11�FERROR;‚THIS�MODE�NOT�ALLOWED )‰MOVE.W„(A4,D3),D0Š111000;ƒABSOLUTE�SHORT ‰EXT.L…D0‰BSR‡BESTFIT�.�3/82‰ADD.L…#2,D3�SIZE�+�2‰RTS SPC 1EA1112ƒCMP.B…#1,D4 ‰BNE.S…EA1113 SPC 1 ‰BTST†#8,D7)‰BEQ.S…FE11�FERROR;‚THIS�MODE�NOT�ALLOWED (‰MOVE.L„(A4,D3),D0Š111001;…ABSOLUTE�LONG‰BSR‡BESTFIT�.�3/82 ‰ADD.L…#4,D3‰RTS SPC 1EA1113ƒCMP.B…#2,D41  ‰BNE.S…EA1114 SPC 1 ‰BTST†#9,D7‰BNE.S…EA1113A%FE11…BRA‡FERRORŽTHIS�MODE�NOT�ALLOWEDEA1113A 4‰MOVE.W„(A4,D3),D0Š111010;ƒPC�+�DISPLACEMENT‚DIS(PC) ‰EXT.L…D0‰ADD.L…HISPC(A1),D0 ‰ADD.L…#2,D0‰BSR‡SYMORDECŒDISPLACEMENT’3/82‰MOVE.L„#')CP(',D0Š(PC)‰BSR‡SCHR�STORE�WORD‰ADD.L…#2,D3�SIZE‰RTS SPC 1EA1114ƒCMP.B…#3,D4 ‰BNE.S…EA1115 PAGE)*�PROGRAM�COUNTER�WITH�INDEX„DIS(PC,R@.X)**‚5432109876543210…SECOND�WORD *‚0...............ŠDATA�REGISTER#*‚1...............ŠADDRESS�REGISTER*‚.XXX............ŠREGISTER8*‚....0...........ŠSIGN-EXTENDED,�LOW�ORDER�WORD�INTEGER*œ..IN�INDEX�REGISTER/*‚....1...........ŠLONG�VALUE�IN�INDEX�REGISTER*‚.....000........'*‚........XXXXXXXXŠDISPLACEMENT�INTEGER* ‰BTST†#10,D7'‰BEQ‡FE11‹FERROR„THIS�MODE�NOT�ASLLOWED ‰MOVE.W„(A4,D3),D1‰AND.W…#$0700,D1(‰BNE‡FE11�FERROR;ƒBITS�10-8�MUST�BE�ZERO (‰MOVE.B„1(A4,D3),D0‰111100;ƒDIS(PC,R@.X) ‰EXT.W…D0 ‰EXT.L…D0‰ADD.L…HISPC(A1),D0 ‰ADD.L…#2,D0‰BSR‡SYMORDECŒDISPLACEMENT’3/82 SPC 1‰MOVE.L„#',CP(',D0‰BSR‡SCHR�DIS(PC, SPC 1‰MOVE.W„(A4,D3),D4 ‰ROL.W…#4,D4 ‰BTST†#3,D4 ‰BEQ.S…EAF25 ‰BSR‡FORMREGA ‰BRA.S…EAF27EAF25„BSR‡FORMREGDŒDIS(PC,R@EAF27 SPC 1"‰MOVE.B„#'.',(A3)+ŠDIS(PC,R@.”3/82 SPC 1‰MOVE.W„(A4,D3),D4‰MOVE.W„#'LW',D0 ‰BTST†#11,D4 ‰BEQ.S…EAF35 ‰LSR.W…#8,D0&EAF35„MOVE.B„D0,(A3)+ŒDIS(PC,R@.X“3/82 SPC 1$‰MOVE.B„#')',(A3)+ŠDIS(PC,R@.X)’3/82 ‰ADD.L…#2,D3‰RTS PAGE*ƒBIT‚5432109876543210+*ˆ..........111100„FIRST�WORD;‚#*EA1115ƒCMP.B…#4,D4 ‰BNE‡FERROR SPC 1 ‰BTST†#11,D7!‰BEQ‡FERRORŽTHIS�MODE�NOT�ALLOWED !‰MOVE.B„#'#',(A3)+ŠIMMEDIATE•3/82 SPC 1‰MOVE.B„-1(A5),D1‰CMP.B…#'L',D1‰BEQ.S…EA11155�LONG SPC 1‰MOVE.W„(A4,D3),D0 ‰CMP.B…#'B',D1‰BNE.S…EA11153Ž.WORD * BYTE SIZE; DATA ALLOWED*‚0000�0000�XXXX�XXXX*‚1111�1111�1XXX�XXXX ‰MOVE.L„D0,D1 ‰LSR.W…#8,D1‰BEQ.S…EA11153 ‰MOVE.L„D0,D1 ‰ASR.W…#7,D1 ‰ADD.W…#1,D1 ‰BNE‡FERROR EA11153‚EXT.L…D0‰BSR‡BESTFIT�.�3/82 ‰ADD.L…#2,D3‰RTS SPC 1EA11155‚MOVE.L„(A4,D3),D0Š.‰BSR‡BESTFIT�.�3/82‰ADD.L…#4,D3�SIZE‰RTS PAGEMOVEMSƒMOVE.B„#'.',(A5)+ŠPERIOD‰MOVE.W„#'LW',D0 ‰BTST†#6,D4‰BEQ.S…MOVEMS2 ‰LSR.W…#8,D0MOVEMS2‚MOVE.B„D0,(A5)+ŒSIZE‰RTS SPC 1* MOVEM - REGISTER EXPANSION* MOVEMRƒDSˆ0!‰MOVE.W„2(A4),D2ŒD2�=�SECOND�WORD‰MOVE.L„#'�'>>8,D0�D0�=�SPACE‰MOVE.L„#'/'>>8,D7�D7�=�/&‰SUB.L…#1,A3�ADJUST�STORE�POINTERŠ3/82"‰MOVE.L„#'0'>>8,D5ŠD5�=�REGISTER�#‰MOVE.W„#'AD',D4ŒD4�=�REG�CLASS SPC 1MOVEMR11�BTST†D1,D2‰BEQ.S…MOVEMR77ŒBIT�RESET SPC 1‰CMP.B…(A3),D0‹BIT�SET™3/82‰BNE.S…MOVEMR44ŒNOT�SPACE SPC 1&MOVEMR33�MOVE.B„D4,1(A3)ŒREG�TYPE–3/82‰MOVE.B„D5,2(A3)ŒREG�#™3/82‰MOVE.B„#'-',3(A3)Š-�3/82‰ADD.L…#3,A3­3/82‰BRA.S…MOVEMR88 SPC 1MOVEMR44�CMP.B…#',',(A3)‹.�3/82‰BEQ‡MOVEMR33ŒCOMMA�SEPARATOR SPC 1‰CMP.B…(A3),D7‹/�SEPARATOR•3/82 ‰BEQ‡MOVEMR33 SPC 1‰MOVE.B„D4,1(A3)ŒREG�TYPE–3/82‰MOVE.B„D5,2(A3)ŒREG�#™3/82#‰MOVE.B„#'-',3(A3)‰-�SEPARATOR”3/82‰BRA.S…MOVEMR88 SPC 1MOVEMR77�CMP.B…#',',(A3)‹.�3/82‰BEQ.S…MOVEMR88ŒCOMMA SPC 1‰CMP.B…(A3),D0�.�3/82‰BEQ.S…MOVEMR88ŒSPACE‰CMP.B…1(A3),D0ª3/82‰BEQ.S…MOVEMR79ŒSPACE‰ADD.L…#3,A3�.�3/82(MOVEMR79�MOVE.B„D7,(A3)Œ/�SEPARATOR”3/82 SPC 1MOVEMR88�ADD.L…#1,D5‰ADD.L…D6,D1�D1�=�BIT�POSITION‰CMP.B…#'8',D5 ‰BNE‡MOVEMR11 SPC 1‰CMP.B…(A3),D0�SPACE™3/82‰BEQ.S…MOVEMR94 SPC 1‰CMP.B…1(A3),D0ŒSPACE™3/82‰BEQ.S…MOVEMR94‰ADD.L…#3,A3�.�3/82 ‰MOVE.B„D7,(A3)�/ƒSEPARATOR‘3/82 SPC 1)MOVEMR94�MOVE.B„#'0',D5�RESET�REG�TO�ZERO‰LSR.W…#8,D4�CHANGE�REG�TYPE‰BNE‡MOVEMR11ŒMORE SPC 1‰MOVE.B„D0,(A3)�SPACE™3/82‰RTS PAGEIMOVES11�DSˆ0“.�3,0'‰ADD.L…#2,D3�ADJUST�NUMBER�OF�BYTESˆ3,0 ‰BSR‡FORMSIZEŒ.�3,0 %‰BTST†#3,DATA+2(A1)‡DIRECTION�BIT‘3,0‰BEQ.S…IMOVES44Œ0�=�,R@“3,0 !‰MOVE.W„DATA+2(A1),D4‡R@,—3,0‰ROL.W…#4,D4�.�3,0‰MOVE.W„#EAM003,D7ŠA@‚D@˜3,0 ‰BSR‡EA’.�3,0 ‰MOVE.B„D5,(A3)+ŒCOMMA™3,0 ‰MOVE.W„DATA(A1),D4‰.�3,01 2‰MOVE.W„#EAM1FC,D7ŠMEMORY�ALTERABLE�ADDRESSINGƒ3,0 ‰BSR‡EA’.�3,0‰BRA.S…COMMON1�.�3,0 :IMOVES44�MOVE.W„#EAM1FC,D7ŠMEMORY�ALTERABLE�ADDRESSINGƒ3,0 ‰BSR‡EA’.�3,0 ‰MOVE.B„D5,(A3)+ŒCOMMA™3,0 ‰MOVE.W„DATA+2(A1),D4‡.�3,0‰ROL.W…#4,D4�.�3,0‰MOVE.W„#EAM003,D7ŠA@‚D@˜3,0 ‰BSR‡EA’.�3,0COMMON1‚BRA‡COMMONŽ.�3,0 PAGEIMOVEC11�DSˆ0“.�3,0!‰MOVE.L„D4,D1�D1�=�FIRST�WORD�3,0 ‰BTST†#0,D1�DIRECTION�BIT‘3,0‰BEQ.S…IMOVEC44Œ.�3,0 ‰BSR.S…MCRDA�FORM�D@�OR�A@‘3,0 ‰MOVE.B„D5,(A3)+ŒCOMMA™3,0 ‰BSR.S…MC’3�CHAR�SYMBOL‘3,0COMMON41�BRA‡COMMON4�.�3,0 #IMOVEC44�BSR.S…MC’3�CHAR�SYMBOL‘3,0 ‰MOVE.B„D5,(A3)+ŒCOMMA™3,0 ‰BSR.S…MCRDA�FORM�D@�OR�A@‘3,0‰BRA‡COMMON41Œ.�3,0 /MCRDA„MOVE.B„DATA+2(A1),D4‡D4�=�SECOND�WORDŽ3,0‰LSR.B…#4,D4�.�3,0‰MOVE.W„#EAM003,D7ŠA@‚D@˜3,0 ‰BSR‡EA’.�3,0 ‰RTS›.�3,0 ,MC‡MOVE.W„DATA+2(A1),D4‡D4�=�SECOND�WORDŽ3,0‰MOVE.L„#'CFS'>>8,D0ˆSFC›3,0‰AND.W…#$FFF,D4Œ.�3,0‰BEQ.S…MC96�MATCH™3,0 ‰MOVE.L„#'CFD'>>8,D0ˆDFC›3,0‰CMP.W…#$001,D4Œ.�3,0‰BEQ.S…MC96�MATCH™3,0 ‰MOVE.L„#'PSU'>>8,D0ˆUSP›3,0‰CMP.W…#$800,D4Œ.�3,0‰BEQ.S…MC96�MATCH™3,0 ‰MOVE.L„#'RBV'>>8,D0ˆVRB›3,0‰CMP.W…#$801,D4Œ.�3,0‰BNE‡FE12�MISS-MATCH”3,0 MC96…BSR‡SCHR�STORE�3�CHAR’3,0 ‰RTS›.�3,0 PAGEIEOR11ƒDSˆ0“EOR‚D@,’3,0‰BSR‡FORMSIZEŒ.�3,0 ‰ROL.W…#7,D4�.�3,0‰BSR‡FORMREGDŒ.�3,0 ‰MOVE.B„D5,(A3)+ŒCOMMA™3,0 ‰MOVE.W„(A4),D4�.�3,0‰BSR‡EA’š3,0‰BRA‡COMMONŽ.�3,0 PAGE DCODE68K�CLR.L…D3’68000�ONLY”3,0DCODE68M�DSˆ0“.�3,0*‰LINK†A1,#-LOCVARSZ‡CREATE�A�FRAME�FOR�THE,‰MOVE.L„A5,A3�START�BUFFER�=�END�BUFFER…3/821‰MOVEM.LƒD0-D2/A3-A5,DATA(A1)ƒCODE�AND�ITS�PC.‚A4-‰MOVE.W„D3,PRTYPE(A1)‡SAVE�PROCESSOR�TYPE‹3,0‰CMP.W…#TBLAE-TBLA,D3†.�3,0‰BGE.S…FE12�BAD�TYPE–3,0 ‰MOVE.L„#BUFSIZE,D0/DEC311ƒMOVE.B„#'�',(A5)+ŠSPACE�FILL�BUFFER�3/82 ‰SUB.L…#1,D0 ‰BNE‡DEC311 SPC 1‰MOVE.L„HISPC(A1),D0'‰BSR‡FORMADDRŒPUTS�ADDR�IN�BUFFER�AT�A3,‰LEA‡DATA(A1),A4‰A4�POINTS�TO�THE�CODE.ˆ3/82 SPC 1* CHECK FOR KNOWN ILLEGAL CODES‰MOVE.W„(A4),D0 ‰LEA‡KI(PC),A5‰MOVE.L„A5,A3�.�3/82‰ADD.L…#KIEND-KI,A3ˆ.�3/82DEC404ƒCMP.W…(A5)+,D0 ‰BEQ.S…FE12�FERROR;�ILLEGAL�CODE‰CMP.L…A3,A5�.�3/82 ‰BNE‡DEC404 SPC 1* LOOK FOR MATCH OF OP-CODE*‰LEA.L…TBLA(PC),A3‰.�3,9‰MOVE.W„PRTYPE(A1),D0‡.�3,05‰MOVE.L„(A3,D0.W),A5ˆA5�=�POINTER�TO�DECODE�TABLE‚3,9‰ADD.L…A3,A5�.�3,9 2‰LEA‡TBLE(PC),A3‰A3�=�POINTER�TO�END�OF�TABLE‚3/82 DEC411ƒMOVE.W„(A4),D0�FIRST�WORD‰AND.W…(A5)+,D0ŒMASK‰CMP.W…(A5)+,D0‰BEQ.S…DEC425ŽFOUND�MATCH‰ADD.L…#2,A5�UPDATE�POINTER‰CMP.L…A3,A5�.�3/82‰BNE‡DEC411ŽMORE�TABLE%FE12…BRA.S…FERRORŽILLEGAL�INSTRUCTION SPC 1DEC425ƒCLR.L…D6%‰MOVE.B„(A5)+,D6ŒD6�=�(GOTO�OFFSET)/4 ‰LSL.L…#2,D6 SPC 1 ‰CLR.L…D7&‰MOVE.B„(A5)+,D7ŒD7�=�INDEX�TO�OP-CODE SPC 1* MOVE OP-CODE TO BUFFER*‰LEA‡OPCTBL(PC),A0 DEC510ƒTST‡D7‰BEQ.S…DEC530ŽAT�INDEXDEC515ƒTST.B…(A0)+‰BPL‡DEC515ŽMOVE�THROUGH�FIELD ‰SUB.L…#1,D7 ‰BRA‡DEC510 SPC 15DEC530ƒMOVE.L„BEGBUF(A1),A5‡START�OF�TEXT�BUFFERŠ3/82)‰ADD.L…#FOC,A5ŽA5�=�STORE�POINTER‚OP-CODEDEC535ƒMOVE.B„(A0)+,D0 ‰BCLR†#7,D0‰BNE.S…DEC537ŽEND�OF�MOVE‰MOVE.B„D0,(A5)+ ‰BRA‡DEC535DEC537ƒMOVE.B„D0,(A5)+ SPC 1* CALCULATE GOTO AND GO*‰MOVE.L„#2,D3…D3=�SIZE ‰LEA‡X(PC),A0 ‰ADD.L…D6,A0 SPC 16‰MOVE.L„BEGBUF(A1),A3„A3�=�START�OF�OUTPUT�BUFFER†3/82,‰ADD.L…#FOP,A3ŠA3�=�POINTER�FOR�OPERAND‰3/82 SPC 1‰MOVE.W„(A4),D4ƒD4�=�FIRST�WORD )‰MOVE.B„#',',D5ƒD5�=�CONTAINS�ASCII�COMMA SPC 14‰MOVE.W„#EAM1FD,D7ŠD7�=�DATA�ALTERABLE�MODES�ALLOWED ‰JMP‡(A0)*8*‚A4�=�POINTER�TO�DATA�IN�FRAME�CREATED�BY�'LINK�A1,...'*‚A5�=�POINTER�STORE�OP-CODE!*‚A3�=�POINTER�STORE�OPERAND¨3/82*‚D3�=�SIZE�=�2�BYTES*‚D4�=�FIRST�WORD2*‚D7�=�ADDRESS�MODES�ALLOWED�($1FD)�DATA�ALTERABLE PAGECOMMON4‚ADD.L…#2,D3…SIZE�=�4 SPC 1COMMONƒMOVE.L„D3,D6�D6�=�SIZE)‰MOVE.B„#'�',(A3)‹SPACE�AS�LAST�CHARŒ3/82 SPC 15‰MOVE.L„A3,ENDBUF(A1)‡SAVE�END�OF�BUFFER�POINTER„3/820‰MOVE.L„BEGBUF(A1),A3‡FETCH�START�OF�BUFFER‰3/822 ‰ADD.L…#FDATA,A3‹.�3/82 /COMMON35�MOVE.W„(A4)+,D0ŒGET�NEXT�WORD�OF�DATA.(‰ADD.L…#2,HISPC(A1)‡ADJUST�PROG�COUNTER.#‰BSR‡PNT4HXŽFORMAT�DATA.�(A3)+Œ3/82 ‰SUB.B…#2,D3 ‰BNE‡COMMON35 **ˆMOVE.L„(A7)+,A3ŒA3�=�RESTORE�END�POINTER**ˆMOVE.L„(A7)+,A5ŒA5�=‚BEGINNING�OF�BUFFER)*ˆMOVE.L„HISPC(A1),A4‡MOVE�THE�UPDATED�PC=‰MOVEM.LƒENDBUF(A1),A3-A5„RESTORE�REGS�A3,A4,A5�AS�ABOVE�3/82‰UNLK†A1’TO�A4�AND�UNDO�FRAME. ‰RTS SPC 3FERRORƒDSˆ0“ILLEGAL�INSTRUCTION*2‰MOVE.L„BEGBUF(A1),A3‡START�OF�BUFFER�POINTER‡3/82‰ADD.L…#FOC,A3�.�3/82 ‰MOVE.L„A3,A5�.�3,0‰MOVE.W„#BUFSIZE-FOC-1,D0ƒ.�3,00FERROR33�MOVE.B„#'�',(A5)+ŠSPACE�FILL�BUFFER�3,0‰DBRA†D0,FERROR33‰.�3,0 ‰LEA‡MSG111(PC),A5FERROR35�MOVE.B„(A5)+,D0‰CMP.B…#EOT,D0‰BEQ.S…FERROR39‰MOVE.B„D0,(A3)+Œ.�3/82 ‰BRA‡FERROR35 FERROR39�DSˆ0 SPC 1‰MOVE.W„(A4),D0 ‰BSR‡PNT4HX SPC 1‰MOVE.L„#2,D3…SIZE SPC 1 ‰BRA�COMMON SPC 1MSG111ƒDC.B†'DC.W„$',EOT SPC 2!KI‡DC.W†$4AFB�KNOWN�ILLEGAL�CODES KIEND„DSˆ0 PAGE *‚\1ƒMASK*‚\2ƒOP-CODE�PATTERN*‚\3ƒGOTO�OFFSET*‚\4ƒINDEX�TO�OP-CODE C68†MACRO ‰DC.W†$\1 ‰DC.W†$\2‰DC.B†(\3-X)>>2‰DC.B†\4‰ENDM SPC 1TBLA…DC.L†TBL00-TBLAŠ68000™3,9‰DC.L†TBL08-TBLAŠ68008™3,9‰DC.L†TBL10-TBLAŠ68010™3,9‰DC.L†TBL20-TBLAŠ68010™3,9 TBLAE„DSˆ0 SPC 2TBL20„DS.B†0“68020™3,0TBL10„DS.B†0“68010™3,0‰C68‡FFFF,4E74,IRTD,66�RTD‘3,0"‰C68‡FFFE,4E7A,IMOVEC,67‹MOVEC�3,0-‰C68‡FFC0,42C0,IMVTFCR,59ŠMOVE.W‚FROM�CCR„3,0"‰C68‡FF00,0E00,IMOVES,68‹MOVES�3,0TBL08„DS.B†0“68008™3,0TBL00„DS.B†0“68000™3,0‰C68‡FEC0,E6C0,ISHIFT,56‹RO‰C68‡FEC0,E4C0,ISHIFT,57‹ROX‰C68‡FEC0,E2C0,ISHIFT,55‹LS‰C68‡FEC0,E0C0,ISHIFT,54‹AS‰C68‡F018,E018,ISHIFT,56‹RO‰C68‡F018,E010,ISHIFT,57‹ROX‰C68‡F018,E008,ISHIFT,55‹LS‰C68‡F018,E000,ISHIFT,54‹AS%‰C68‡F0C0,D0C0,FORM10EX,4ŠADD‡,A@‰C68‡F130,D100,FORM12,53‹ADDX‰C68‡F000,D000,FORM10EX,4ŒADD‰C68‡F1F8,C188,FORM9,50ŒEXG‰C68‡F1F8,C148,FORM8,50ŒEXG‰C68‡F1F8,C140,FORM7,50ŒEXG‰C68‡F1F0,C100,FORM12,49‹ABCD‰C68‡F1C0,C1C0,FORM6D,48‹MULS‰C68‡F1C0,C0C0,FORM6D,47‹MULU‰C68‡F000,C000,FORM10,2ŒAND%‰C68‡F0C0,B0C0,FORM10EX,6ŠCMP…,A@‰C68‡F138,B108,FORM12A,46‹CMPM‰C68‡F100,B100,IEOR,5ŽEOR‘3,0‰C68‡F000,B000,FORM10EX,6ŒCMP&‰C68‡F0C0,90C0,FORM10EX,44‰SUB…,A@‰C68‡F130,9100,FORM12,45‹SUBX‰C68‡F000,9000,FORM10EX,44‹SUB‰C68‡F1F0,8100,FORM12,43‹SBCD‰C68‡F1C0,81C0,FORM6D,42‹DIVS‰C68‡F1C0,80C0,FORM6D,41‹DIVU‰C68‡F000,8000,FORM10,40‹OR‰C68‡F100,7000,IMOVEQ,39‹MOVEQ‰C68‡FF00,6100,IBSR,51�BSR‰C68‡FF00,6000,IBSR,65�BRA‘1,4‰C68‡F000,6000,ICC,38ŽB‰C68‡F0F8,50C8,IDBCC,37ŽDB‰C68‡F0C0,50C0,SCC,36ŽS‰C68‡F100,5100,IQUICK,35‹SUBQ‰C68‡F100,5000,IQUICK,34‹ADDQ‰C68‡F1C0,41C0,FORM6A,33‹LEA‰C68‡F1C0,4180,FORM6D,32‹CHK"‰C68‡FFC0,4EC0,FORM11SL,31‹JMP‘1,4"‰C68‡FFC0,4E80,FORM11SL,30‹JSR‘1,4‰C68‡FFFF,4E77,SCOMMON,29‹RTR‰C68‡FFFF,4E76,SCOMMON,28‹TRAPV‰C68‡FFFF,4E75,SCOMMON,27‹RTS‰C68‡FFFF,4E73,SCOMMON,26‹RTE‰C68‡FFFF,4E72,ISTOP,25�STOP‰C68‡FFFF,4E71,SCOMMON,24‹NOP‰C68‡FFFF,4E70,SCOMMON,23‹RESET'‰C68‡FFF8,4E68,IMVFUSP,60ŠMOVE�FROM�USP%‰C68‡FFF8,4E60,IMVTUSP,60ŠMOVE�TO�USP‰C68‡FFF8,4E58,FORM5,22ŒUNLINK‰C68‡FFF8,4E50,ILINK,21ŒLINK‰C68‡FFF0,4E40,FORM4,20ŒTRAP/‰C68‡FF80,4C80,IMOVEMTR,15‰MOVEM�FROM�REGISTERS‰C68‡FFC0,4AC0,FORM1A,19‹TAS‰C68‡FF00,4A00,FORM1,18ŒTST‰C68‡FFF8,48C0,FORM3,17ŒEXT.L‰C68‡FFF8,4880,FORM3,16ŒEXT.W-‰C68‡FF80,4880,IMOVEMFR,15‰MOVEA�TO�REGISTERS‰C68‡FFF8,4840,FORM3,14ŒSWAP‰C68‡FFC0,4840,FORM11,13‹PEA‰C68‡FFC0,4800,FORM1A,12‹NBCD#‰C68‡FFC0,46C0,IMVTSR,59‹MOVE�TO�SR‰C68‡FF00,4600,FORM1,11ŒNOT%‰C68‡FFC0,44C0,IMVTCCR,59ŠMOVE�TO�CCR‰C68‡FF00,4400,FORM1,10ŒNEG‰C68‡FF00,4200,FORM1,9�CLR'‰C68‡FFC0,40C0,IMVFSR,59‹MOVE.W‚FROM‚SR‰C68‡FF00,4000,FORM1,8�NEGX‰C68‡F000,3000,IMOVE,59ŒMOVE.W‰C68‡F000,2000,IMOVE,60ŒMOVE.L‰C68‡F000,1000,IMOVE,58ŒMOVE.B‰C68‡FF00,0C00,IMMED,6�CMP‡#‰C68‡FF00,0A00,IMMED,5�EOR‡#‰C68‡FF00,0600,IMMED,4�ADD‡#‰C68‡FF00,0400,IMMED,3�SUB‡#‰C68‡FF00,0200,IMMED,2�AND‡#2 ‰C68‡FF00,0000,IMMED,1�ORˆ#‰C68‡F138,0108,IMOVEP,0ŒMOVEP‰C68‡FFC0,08C0,ISETS,64ŒBSET‰C68‡FFC0,0880,ISETS,63ŒBCLR‰C68‡FFC0,0840,ISETS,62ŒBCHG‰C68‡FFC0,0800,ISETS,61ŒBTST‰C68‡F1C0,01C0,ISETD,64ŒBSET‰C68‡F1C0,0180,ISETD,63ŒBCLR‰C68‡F1C0,0140,ISETD,62ŒBCHG‰C68‡F1C0,0100,ISETD,61ŒBTST TBLE…DS.B†0 PAGE N68†MACRO‰DC.B†'\1',128+'\2'ˆ\1\2‰ENDM OPCTBLƒDSˆ0 ‰N68‡MOVE,P„0 ‰N68‡O,R‡1 ‰N68‡AN,D†2 ‰N68‡SU,B†3 ‰N68‡AD,D†4 ‰N68‡EO,R†5 ‰N68‡CM,P†6 ‰N68‡MOV,E…7 ‰N68‡NEG,X…8 ‰N68‡CL,R†9 ‰N68‡NE,G†10 ‰N68‡NO,T†11 ‰N68‡NBC,Dƒ12‰N68‡PEA.,L„13‰N68‡SWAP.,Wƒ14‰N68‡MOVE,M„15‰N68‡EXT.,W„16‰N68‡EXT.,L„17 ‰N68‡TS,T†18‰N68‡TAS.,B„19 ‰N68‡TRA,P…20 ‰N68‡LIN,K…21 ‰N68‡UNL,K…22‰N68‡RESE,T„23 ‰N68‡NO,P†24 ‰N68‡STO,P…25 ‰N68‡RT,E†26 ‰N68‡RT,S†27‰N68‡TRAP,V„28 ‰N68‡RT,R†29 ‰N68‡JS,R†30 ‰N68‡JM,P†31‰N68‡CHK.,W„32‰N68‡LEA.,L„33 ‰N68‡ADD,Q…34 ‰N68‡SUB,Q…35‰DC.B†128+'S'ƒ36 ‰N68‡D,B‡37‰DC.B†128+'B'ƒ38‰N68‡MOVEQ.,L‚.....39 ‰N68‡O,R‡40‰N68‡DIVU.,Wƒ41‰N68‡DIVS.,Wƒ42 ‰N68‡SBC,Dƒ43 ‰N68‡SU,B†44 ‰N68‡SUB,X…45 ‰N68‡CMP,M…46‰N68‡MULU.,Wƒ47‰N68‡MULS.,Wƒ48 ‰N68‡ABC,Dƒ49 ‰N68‡EX,G†50‰N68‡BS,R†.....51‰N68‡NUL,L….....52 ‰N68‡ADD,X…53 ‰N68‡A,S‡54 ‰N68‡L,S‡55 ‰N68‡R,O‡56 ‰N68‡RO,X†57‰N68‡MOVE.,Bƒ58‰N68‡MOVE.,Wƒ59‰N68‡MOVE.,Lƒ60 ‰N68‡BTS,T…61 ‰N68‡BCH,G…62 ‰N68‡BCL,R…63 ‰N68‡BSE,T…64 ‰N68‡BR,A†65‰N68‡RT,D†66œ3,0‰N68‡MOVEC.,L‚67œ3,0‰N68‡MOVE,S„68œ3,0‰ENDéé;PARSMSGS�IDNT†1,0„Convert�numbered�message�to�text‚12/02/82 I* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **Ç*A*„This�subroutine�is�called�by�the�SYMbug�"A"�Command�processor†*D*„after�just�previously�calling�the�command�line�parser.�A�messageƒ*@*„number,�(Hex),�contained�in�D0�which�indicates�the�status�of‡*A*„the�current�command.�This�subroutine�converts�the�number�into†*>*„an�English�language�statement�explaining�what�exception(s)‰**„may�have�been�detected.¬**Ç*F*„If�the�NUMBER�is�ZERO....�control�is�simply�returned�to�SYMbug�"B"�*;*„If�the�NUMBER�is�NEGATIVE‚a�syntax�message�is�returned.‹*C*„If�the�NUMBER�is�POSITIVE‚(Not�exceeding�"MAX")�it�is�looked�upƒ*;*„and�the�correct�message�is�placed�where�A3�is�pointing.Œ**Ç***„Upon�return�A3�is�pointing�just�beyond�**„the�end�of�the�message.¬**Ç**„EXTERNAL�SYMBOLS:²**Ç*0*„CONVŠNeeded�to�convert�Hex�Number�into�ASCIIŽ*3*’for�printing�incase�the�message�is�unsupported.†**Ç**Ç* *…REGISTERS¹**…UPON�ENTRY¸*-*„_________________________________________š**„A0�=“D0�=�Hex�Msg#Ÿ* *„A1�=“D1�=¨* *„A2�=“D2�=¨**„A3�=�A(Buffer)‰D3�=¨* *„A4�=“D4�=¨* *„A5�=“D5�=¨* *„A6�=“D6�=¨**„A7�=�Stack�D7�=¨**Ç**Ç* *…REGISTERS¹* *…UPON�EXIT¹*-*„_________________________________________š*#*„A0�=�A(Message)ˆD0�=�Msg�Number�**„A1�=�A(MSGEND+1)‡D1�=¨**„A2�=“D2�=�-1�DBRA�left�over–**„A3�=�A(BUFFER)‰D3�=¨* *„A4�=“D4�=¨* *„A5�=“D5�=¨* *„A6�=“D6�=¨**„A7�=�Stack�D7�=¨*I* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * PAGE‰XDEF†PARSMSGS ‰XREF†CONV ‰SECTIONƒ9 !MAX†EQU‡48‘Maximum�message�number TˆEQU‡*“BASE�ADDRESS"TABLE„DC.L†M00-TŽTable�of�messages7‰DC.L†M01-T,M02-T,M03-T,M04-T,M05-T,M06-T,M07-T,M08-T„88‰DC.L†M09-T,M10-T,M11-T,M12-T,M13-T,M14-T,M15-T,M16-Tƒ168‰DC.L†M17-T,M04-T,M19-T,M20-T,M21-T,M22-T,M23-T,M00-Tƒ248‰DC.L†M00-T,M00-T,M00-T,M00-T,M00-T,M00-T,M00-T,M00-Tƒ323 P?Y0a8‰DC.L†M00-T,M00-T,M00-T,M00-T,M00-T,M38-T,M39-T,M40-Tƒ408‰DC.L†M41-T,M42-T,M43-T,M44-T,M45-T,M46-T,M47-T,M48-Tƒ48 (M00†DC.B†26,'PARSER�error�number......ƒ'#M01†DC.B†21,'COMMAND�not�valid�yet'"M02†DC.B†20,'ADDRESS�must�be�even'+M03†DC.B†29,'SYNTAX�entered�is�not�correct'.M04†DC.B†32,'COMMAND�entered�is�not�supported'+M05†DC.B†29,'EXPRESSION�entered�is�invalid'(M06†DC.B†26,'ADDRESS�entered�is�invalid'-M07†DC.B†31,'NUMBER/VALUE�entered�is�invalid')M08†DC.B†27,'REGISTER�entered�is�invalid'#M09†DC.B†21,'MACRO�expansion�error',M10†DC.B†30,'Additional�PARAMETER(S)�needed''M11†DC.B†25,'OPTION�entered�is�invalid',M12†DC.B†30,'NUMBER�entered�is�out�of�range'.M13†DC.B†32,'MACRO/SYMBOL�NAME�is�not�defined'(M14†DC.B†26,'MACRO/SYMBOL�table�is�full',M15†DC.B†30,'SYMBOL�NAME�entered�is�invalid'.M16†DC.B†32,'ADDRESS�RANGE�entered�is�invalid'2M17†DC.B†36,'COMMAND�entered�is�NOT�YET�supported'5M19†DC.B†39,'CHARACTERS�entered�exceeded�buffer�size'#M20†DC.B†21,'MACRO�PARAMETER�error'%M21†DC.B†23,'Invalid�MACRO�PARAMETER'(M22†DC.B†26,'MACRO�PARAMETER�is�missing'&M23†DC.B†24,'EVEN�ADDRESS�is�required'=M38†DC.B†48,'TASK�NAME�MUST�be�first�4�chars�of�.LO�filename')M39†DC.B†27,'Cannot�Attach�a�SYSTEM�TASK',M40†DC.B†30,'Unknown�BREAKPOINT�(to�delete)'2M41†DC.B†36,'Invalid�Versados�FILE�NAME�specified'(M42†DC.B†26,'Invalid�EMULATOR�ID�NUMBER';M43†DC.B†45,'I/O�ERROR�while�saving�Emulator�configuration'5M44†DC.B†39,'I/O�ERROR�while�processing�PROFILE�file'"M45†DC.B†20,'I/O�ERROR�for�SCREEN'2M46†DC.B†36,'I/O�ERROR�while�processing�HELP�file'*M47†DC.B†28,'Failed�to�change�TASK�status'*M48†DC.B†28,'Failed�to�ASSIGN�LUN�to�TASK' PAGE1PARSMSGS�MOVEM.LƒD0-D7/A0-A6,-(A7)‚Save�registers ‰LEA‡M00(PC),A2ŠNULL�MESSAGE‰TST.W…D0‘Negative�number?2‰BGE.S…CHKMAX�No...�Go�check�for�valid�message�no.*‰MOVE.B„#3,D0ŽYes..�Force�M03�SYNTAX�error/CHKMAXƒCMP.B…#MAX,D0ŒError�number�within�range?+‰BGT.S…NOMSGŽNo...�Just�print�error�number.‰BEQ.S…EXIT�zero..EXIT "‰ASL.L…#2,D0ŽMultiply�number�by�4.4‰LEA‡TABLE(PC),A0‡Start�with�the�beginning�of�table.6‰MOVE.L„0(A0,D0),A1ˆA1�=�OFFSET�TO(Specified�Message).'‰ADD.L…A0,A1ŽA1�=�A(Specified�Message).‰CMP.L…A1,A2ŽIs�it�supported?1‰BEQ.S…NOMSGŽNo...�Use�general�"PARSER�error�msg"*‰BSR.S…MOVEMSGŒYes..�Move�msg�into�buffer. 1EXIT…MOVEM.Lƒ(A7)+,D0-D7/A0-A6‚Restore�registers. ‰RTSšReturn. 1NOMSG„BSR‡CONV�Convert�message�number�into�ASCII..‰LEA‡M00(PC),A1‰M00..."PARSER�error�number..."#‰BSR.S…MOVEMSGŒMove�Text�to�buffer.-‰MOVE.L„A3,D1ŽPut�A3�into�D1�for�examination.%‰BTST†#0,D1ŽAre�we�on�a�word�boundry?*‰BEQ.S…MOVENUMŒYes..�Go�move�ASCII�number.1‰ADD.L…#1,A3ŽNo...�Add�1�to�force�word�alignment.>MOVENUM‚MOVE.L„D0,-4(A3)ŠMove�4�byte�ASCII�number�into�buffer.‰BRA‡EXIT�Return. 0MOVEMSG‚DSˆ0‘*Move�message�from�table�to�buffer*#‰CLR.L…D2‘Assure�00�00�00�xx�for�D2-‰MOVE.B„(A1)+,D2‹D2�=�Number�of�bytes�to�move!‰SUB.L…#1,D2ŽAdjust�for�DBRA�loop9MOVELOOP�MOVE.B„(A1)+,(A3)+ˆMove�1�byte�to�message�buffer‰DBRA†D2,MOVELOOPˆDone?‰RTSšYes...�Restore�and�exit ‰ENDéé3 é*-*ŒIODB�SYMBOL�PROCESSOR�FOR�SIMBO�--�11/14/84*+IODB…IDNT†2,1‘SYMB�DATA�MANAGEMENT�ROUTINES ‰OPT‡FRS¯3/82 ‰XDEF†IODB *Â<<111484+‰XREF†SEGADDR,IOSDB,FORTASK,SYMNAME,FHSOPEN!‰XREF†GLOBAL,POOLPTR,POOL,POOLEND)*�NBUFPOOL�EQU‡(POOLEND-POOLPTR)/260�4/82**ˆTASK�DATA�EQUATES*0OMNAMEƒEQU‡0“OFFSET�OF�NAME�IN�OBJMOD�NAME�TABLE+OMNLROƒEQU‡8“OFFSET�OF�LR�FOR�OBJMOD�RECORD+OMNLRIƒEQU‡10’OFFSET�OF�LR�FOR�INDEX�RECORD+OMNLRLƒEQU‡12’OFFSET�OF�LR�FOR�LABEL�RECORD7OMNTBLTH�EQU‡14’LENGTH�OF�AN�ENTRY�IN�OBJMOD�NAME�TABLE)BUFHDRƒEQU‡4“BUFFER�HEADER�CONTROL�LENGTH3BUFLTHƒEQU‡260‘TOTAL�BUFFER�LENGTH�INCLUDING�HEADERBUFMAPƒEQU‡$64‘TASKBUF�MAP�ADDR.BUFMAPE‚EQU‡$68‘A(END�OF�MAP�TABLE)�IN�TASKBUFBUFFHSƒEQU‡$FC‘A(TASK'S�FHSDB)"MAPLTHƒEQU‡8“LOAD�MAP�ENTRY�LENGTH TVBUF„EQU‡8‰PAGE ‰SECTIONƒ9M******************************************************************************ˆENTRY�CONDITIONS3*•SYMNAME�CONTAINS�LITERAL�NAME�OF�REQUESTED�SYMBOL!*ˆREGS�:�D6�=‚LR�OF�OREC�OR�LINE#*�A5�=‚A(GLOBAL)(*�A2�=‚A(MODULE�NAME�TABLE)�BASE�ADDRESS)*�D1�=‚REQUEST�CODE�1=SREC,0=OREC,-1=LREC1*�D2�=‚OBJECT�MODULE�CODE�TO�WHICH�SYMBOL�BELONGS8*•THIS�IS�THE�OFFSET�OF�ENTRIES�IN�THE�MODULE�NAME�TABLE9*�D3�=‚SECTION�NUMBER�OF�OFFSET�TO�BE�MATCHED�WITH�SYMBOL3*�D5�=‚DATA�BASE�ID�(00ID�=�RIGHTMOST�BYTE�OF�WORD)9*�D7�=‚RELATIVE�OFFSET�CONSTANT�TO�BE�MATCHED�WITH�SYMBOL*5IODB…MOVEM.LƒD0-D7/A0-A6,-(A7)ƒSAVE�CALLERS�REGS�3/82/‰CLR.L…(A7)�D0�CONTAINS�RETURN�STATUS�CODEƒ1/82/‰TST.L…POOLPTR-GLOBAL(A5)ƒFIRST�TIME�CHECK�3/82)‰BNE.S…NOT1STŽPOOLPTR�ALREADY�INITEDˆ1/82‰LEA‡POOL-GLOBAL(A5),A0 3/82/‰MOVE.L„A0,POOLPTR-GLOBAL(A5)ƒINIT�POOLPTRŽ3/82'NOT1STƒTST.W…D1’CHECK�REQUEST�TYPEŒ1/82‰BMI.S…WANTL�LABEL�REQUEST‰BGT.S…WANTS�SYMBOL�REQUEST,WANTO„EQU‡*“PASS�ALONG�SPECIFIED�LR�FOR�ORECDOREADƒBSR‡GETR�GET�A�RECORD‰BNE‡IOSERRŽFAILED�ON�READ‰BRA‡GOTRECŽCOMMON�EXIT�POINT-WANTL„CMP.W…#-2,D1ŽSYMBOL�MATCH�FEATURE?‰1/82‰BEQ‡HUNTSYM�YES*'*‚RETURN�VALUE�OF�REQUESTED�LINE�NUMBER*i:r5z,‚7Š+5‰TST.W…OMNLRL(A2,D2)‡LINE�#'S�EXIST�FOR�THIS�MODULE�?‰BEQ‡IOSERRŽNO%‰SUB.L…#1,D6�LINE�#�-1�IS�OFFSET‹3/82‰MOVE.L„D6,D7�SAVE�LINE#-1$‰ASR.L…#6,D6�LR�OFFSET�IS�LINE#�/�640‰ADD.W…OMNLRL(A2,D2),D6„PLUS�BASE�LR�THIS�OBJMOD‰BSR‡GETR�READ�LINE�#�RECORD‰BNE‡IOSERRŽFAILED�ON�READ‰MOVE.L„D7,D0�LINE�#�-1•3/82‰AND.W…#$003F,D0‹LINE�#�MOD�64#‰ASL.W…#2,D0�OFFSET�OF�LINE�#�VALUE)‰ADD.W…D0,A4�RETURN�A(LINE�#�VALUE)�IN�A4‰BRA‡GOTRECŽCOMMON�ENTRY�POINT PAGE*L*‚RETURN�VALUE�OF�REQUESTED�SYMBOL�FROM�CURRENT�OBJECT�MODULE�(IF�IT�EXISTS)*�SYMBOL�RECORD�REQUIRED ‰BNE‡IOSERR‰CLR.L…D4’SEQUENTIAL�SEARCH7‰LEA‡SYMNAME-GLOBAL(A5),A1†A(LITERAL�SYMBOL�NAME)�11/835‰MOVEM.Lƒ(A1),D0-D1ŠLITERAL�SYMBOL�NAME�TO�REGS�D0&D19CHKSYMƒCMP.L…0(A4,D4),D0‰FIRST�44 �CHAR�MATCH�SYMBOL�ENTRY?‰BNE.S…FORWARD¡7/83!*�7/83ƒBLO‡NOSYM�SYMBOL�NOT�FOUND2‰CMP.L…4(A4,D4),D1‰LAST�4�CHAR�MATCH�SYMBOL�ENTRY?‰BEQ‡GOTSYMŽFINALLY3FORWARD‚ADD.B…#$10,D4�STEP�TO�NEXT�SYMBOL�IN�RECORD0‰BCC‡CHKSYMŽYES�-�CONTINUE�OFFSET�$100�OVERFLOWS-CHKSTOP‚ADD.L…#1,D6�NO�-�SYMBOL�NOT�IN�RECORD‰LEA‡STOPSECT(PC),A17‰CMP.W…(A1),D6�COME�FULL�CIRCLE�IN�SYMBOL�RECORDS?�7/83&‰BEQ‡NOSYM�YES�-�SYMBOL�NOT�FOUNDˆ7/83-‰CMP.W…OMNLRI(A2,D2),D6„AT�INDEX�SECTOR?Ž7/83+‰BLT‡RETRY�NO�-�TRY�NEXT�SYMBOL�RECORDƒ7/83@ALLSYMƒMOVE.W„OMNLRO(A2,D2),D6„CONTINUE�WITH�1ST�SYMBOL�REC‚7/83)‰BRA‡CHKSTOP�UNLESS�WE�STARTED�THERE‡7/83 IDXSCAN‚LEA‡STOPSECT(PC),A1#‰CLR.W…(A1)�INDEX�RECORD�COUNTŒ7/835NXTIDXƒBSR‡GETR�RETURNS�A4->�INDEX�RECORD�THIS�OBJMOD,‰BNE.S…IDXERRŽMUST�POP�SUBROUTINE�ADDR†11/830‰MOVE.L„#63,D0ŽCOUNT�-1�OF�MAXIMUM�INDEX�ENTRIES8ISCAN„MOVE.L„(A4)+,D4ŒINDEX�ENTRY�=�LAST�VALUE�OF�SECTOR,‰CMP.L…D7,D4�THIS�SECTOR�CONTAINS�ADDR?„7/83‰BHS.S…GOTSECT�YES.‰DBF‡D0,ISCANŒNO�-�KEEP�LOOKING2‰ADD.L…#1,D6�BIG�OBJMOD�HAS�MULTIPLE�INDEX�RECORDS*‰ADD.W…#64,(A1)ŒINDEX�RECORD�COUNT�UPDATED.‰BRA‡NXTIDXŽRETRY�INDEX�SCAN�NEXT�INDEX�RECORD6GOTSECT‚SUB.W…#64,D0ŽNEGATIVE�OFFSET�INTO�INDEX�RECORD‰NEG.W…D0’CONVERT�TO�POSITIVE7‰ADD.W…(A1),D0�IN�CASE�WE'VE�PROCESSED�MULTIPLE�RECORDS5‰ADD.W…OMNLRO(A2,D2),D0„PLUS�BASE�LR�OF�OBJMOD�RECORDNOSYM„ADD.L…#1,(A7)‚CODE�=�1�MEANS�SYMBOL�NOT�FOUND�IN�D0„3/82 ‰BRA.S…EXIT.GOTSYMƒADD.L…D4,A4�CODE�=�0�MEANS�SYMBOL�FOUND9GOTRECƒMOVE.L„A4,32(A7)‰A0=�A(SYMBOL�ENTRY�REQUIRED)„3/820‰MOVE.W„#4,CCRŽSET�ZERO�CONDITION�CODE�(SUCCESS);EXIT…MOVEM.Lƒ(A7)+,D0-D7/A0-A6‚RESTORE�REGS�FROM�STACKˆ3/82‰RTS›RETURN�TO�CALLER‰PAGE*5*ˆGETR�EXPECTS�T4 HE�LR�#�OF�THE�REQUESTED�RECORD�IN�D6,*ˆGETR�RETURNS�THE�A(REQUESTED�RECORD)‚IN�A4*™A(GLOBAL)ŒIN�A5*™A(END�OF�THE�BUFFER)�IN�A6*™A(IOSSYM)ŒIN�A0*™I/O�STATUS�CODE†IN�D0*™GARBAGEŽIN�D4*™DATA�BASE�ID‰IN�D5*CGETR…MOVE.L„POOLPTR-GLOBAL(A5),A4ƒRANDOM�CIRCULAR�BUFFER�ENTRY�3/82‰CLR.B…D4’INITIALIZE�OLDEST ‰MOVE.L„A4,A60‰LEA‡POOLEND-GLOBAL(A5),A0ƒA(END�OF�POOL-1)Š3/82*LOOPPOOL�CMP.B…1(A4),D5ŒSAME�DATA�BASE�ID?)‰BNE.S…AGEIT�NO�-�AGE�IT�&�KEEP�SEARCHING%‰CMP.W…2(A4),D6ŒCHECK�LR#�THIS�BUFFER.‰BEQ.S…INPOOLŽBUFFER�IN�POOL�-�NO�I/O�REQUIREDAGEIT„ADD.B…#1,(A4)�AGE�BUFFER!‰CMP.B…(A4),D4�OLDER�THAN�OLDEST?‰BHS.S…YOUNGER�NO‰MOVE.B„(A4),D4�YES�-�SAVE�IT&‰MOVE.L„A4,A6�SAVE�A(BUFFER)�OF�OLDEST4YOUNGER‚ADD.W…#BUFLTH,A4ŠA(NEXT�BUFFER�IN�POOL)ˆ1/82%‰CMP.L…A0,A4�TIME�TO�WRAPAROUND?‹1/82‰BLO.S…NOWRAPŽNO<‰LEA‡POOL-GLOBAL(A5),A4‚PHYSICALLY�FIRST�BUFFER�IN�POOL�3/82?NOWRAPƒCMP.L…POOLPTR-GLOBAL(A5),A4ƒREACHED�STARTING�POINT?ƒ3/82‰BNE‡LOOPPOOLŒNO+NEEDREAD�MOVE.L„A6,A4�USE�THE�OLDEST�BUFFER2‰ADD.L…#BUFHDR,A6ŠA(DATA�PORTION�OF�OLDEST�BUFFER)‰MOVE.W„D5,D0�DBIDš3/82/‰ASL.W…#5,D0�OFFSET�INTO�TVT�TABLE�OF�TASK�3/824‰MOVE.L„SEGADDR-GLOBAL(A5),A0ƒTVTABLE�BASE�ADDR‰3/82-‰MOVE.L„TVBUF(A0,D0),A0…TASK�BUFFER�ADDRŽ3/82*‰MOVE.L„BUFFHS(A0),D4‡A(TASK'S�FHSDB)�3/826‰CMP.L…FHSOPEN-GLOBAL(A5),D4ƒMATCH�A(OPEN�FHSDB)?†3/82/‰BEQ.S…USEIOSŽYES�-�GO�ISSUE�IOS�FOR�LUN#7‚3/821‰MOVE.L„FHSOPEN-GLOBAL(A5),A0ƒCLOSE�THIS�FHSŒ3/82"‰MOVE.W„#4,(A0)�CLOSE�COMMAND‘3/82 ‰TRAP†#3°3/82‰BNE.S…IOERR�CLOSE�FAILED’4/82*‰MOVE.L„D4,A0�A(TASK'S�FHSDB�TO�OPEN)‡3/82%‰MOVE.W„#$40,(A0)‹ASSIGN�COMMAND�3/82 ‰TRAP†#3°3/82‰BNE.S…IOERR�ASSIGN�FAILED‘4/828USEIOSƒLEA‡IOSDB-GLOBAL(A5),A0„GET�COMMON�IOS�BLOCK‡3/82*‰MOVE.L„D6,8(A0)ŒRANDOM�LR�FOR�READ�TO�IOS‰MOVE.L„A6,12(A0)‹IOSSAD‰ADD.W…#BUFLTH-BUFHDR-1,A6Ÿ1/82‰MOVE.L„A6,16(A0)‹IOSEAD�TO�IOS)‰TRAP†#2’READ�RECORD�#LR�FROM�FILENAME.DB‰BNE.S…IOERR�BAD�NEWS8INPOOLƒMOVEM.WƒD5-D6,(A4)ŠZERO�AGE,�DBID�&�LR#�TO�PREFIXA‰MOVE.L„A4,POOLPTR-GLOBAL(A5)�START�W/�THIS�BUFFER�NEXT�TIME�3/82,‰ADD.L…#BUFHDR,A4ŠSTEP�PAST�PREFIX�TO�BUFFER3‰MOVE.W„#4,CCRŽSET�ZERO�(SUCCESSFUL)�CONDITION�CODEIOERR„RTS›RETURN�TO�CALLER‰ENDé ‰TTL‡MBSR/MBSR…IDNT†0,1‡MACSBUG�TYPE�SUBROUTINES�11/14/84 ‰OPT‡FRS¯3/82*H*„CHANGED�12/28/81�TO�ALLOW�SYMBOLIC�ENTRIES�FOR�'[#]'�-->�BY�P.Z.*;‰XDEF†BESTFIT,FORMADDR,PNT8HX,PNT6HX,PNT4HX,PNT2HX,SYMORDEC-‰XDEF†OUTPUT,BUFSIZE,HEX2DEC,GETNUMD,FRELADDR**‰XREF†RESOLVE,.PLJSR,PARSE_ST,ADRELO”11/83 *Â<<111484!‰XREF†INQ,SYMNAME,EOL_FLG,PTR_INP"‰XREF†ADR_VAL,BASE,INP_STR,PRSE_MD‰XREF†ERR_NMBR,GLOBAL¡111484>> ‰SECTIONƒ9FRELADDR�BRA‡PNT6HX ‰PAGE$*�ENTER:ˆA3�=�POINTER�FOR�STOREŸ3/82"*�A6�=�SECTION�0�BASE�ADDRESSš3/82 *�D0�=�VALUE*!*�RETURN:ƒSYMBOL+*ŒCARRY�SET�IF�OUT-OF-RANGE*!BESTFIT‚MOVEM.LƒD1/D3/D7/A0,-(A7) ‰MOVE.L„D0,D7 ‰MOVE.L„#1,D0 ‰BSR‡RESOLVE�RESOLVE�TO�BEST�FIT!‰BCS.S…BF455�NO-FIT;�USE�ABSOLUTE‰MOVE.L„#7,D1�D1�=�CHAR�COUNT‰LEA‡SYMNAME(A6),A0¤3/82BF425„CMP.B…#'�',(A0)‰BEQ.S…BF435�DONE,�FOUND�SPACE$‰MOVE.B„(A0)+,(A3)+‰MOVE�SYMBOL“3/82‰DBRA†D1,BF425 BF435„TST.L…D0‰BEQ.S…BF445�ZERO�OFFSET‰MOVE.B„#'+',(A3)+¨3/82‰BSR‡HEX2DEC�+�OFFSET1BF445„MOVE.W„#0,CCRŽCARRY�CLEAR�MEANS�SYMBOL†3/82 ‰BRA.S…BF465 BF455„MOVE.L„D7,D0‰MOVE.B„#'$',(A3)+¨3/82#‰BSR.S…PNT8HXŽFORM�ABSOLUTE�ADDRESS*‰MOVE.L„D7,D0�RESTORE�RELATIVE�OFFSET‡3/82-‰MOVE.W„#1,CCRŽCARRY�SET�MEANS�NO�SYMBOL…3/82BF465„MOVEM.Lƒ(A7)+,D1/D3/D7/A0‰RTS PAGE$*�ENTER:ˆA3�=�POINTER�FOR�STOREŸ3/82"*�A6�=�SECTION�0�BASE�ADDRESSš3/82 *�D0�=�VALUE*'*�RETURN:ƒOFFSET:MODULE:S‡(S�=�section)*ŒCARRY�SET�IF�OUT-OF-RANGE*"FORMADDR�MOVEM.LƒD1/D3/D5 7/A0,-(A7) ‰MOVE.L„D0,D7 ‰MOVE.L„#0,D0"‰BSR‡RESOLVE�RESOLVE�TO�WHERE-AM-I!‰BCS.S…FA455�NO-FIT;�USE�ABSOLUTE ‰BSR.S…PNT6HX‰MOVE.B„#':',(A3)+¨3/82 ‰MOVE.L„#7,D1�D1�=�CHAR�COUNT‰LEA‡SYMNAME(A6),A0¤3/82FA425„CMP.B…#'�',(A0)‰BEQ.S…FA435�DONE,�FOUND�SPACE$‰MOVE.B„(A0)+,(A3)+‰MOVE�SYMBOL“3/82‰DBRA†D1,FA425FA435„MOVE.B„#':',(A3)+¨3/82 ‰ADD.B…#'0',D3�MAKE�ASCII‰CMP.B…#$3A,D3 ‰BCS.S…FA445 ‰ADD.L…#7,D3FA445„MOVE.B„D3,(A3)+ª3/82 ‰BRA.S…FA465 FA455„MOVE.L„D7,D0’T›G£<«G³ -‰BSR‡ADRELOŽRREG�RELATIVE�ADDRESS�MAYBEƒ11/83$‰BPL.S…FA465�WAS�RREG�RELATIVE�11/83‰MOVE.B„#'$',(A3)+¨3/82#‰BSR.S…PNT8HXŽFORM�ABSOLUTE�ADDRESS FA465„MOVEM.Lƒ(A7)+,D1/D3/D7/A0‰RTS‰PAGE** FORMAT HEX ROUTINES*** FORMAT 8 HEX CHARACTERS**‚D0,D1,D2�DESTROYED*PNT8HXƒSWAP�D0‚FLIP�REG�HALVES‰BSR.S‚PNT4HX‚DO�TOP�WORD‰SWAP�D0‚NOW�DO�LOWER�WORD ‰BRA.S�PNT4HX* PRINT 6 HEX CHARACTERS#PNT6HXƒSWAP�D0‚FLIP�REGISTER�HALVES ‰BSR.S�PNT2HX‰SWAP�D0‚FLIP�BACK�REG�HALVES * PRINT 4 HEX CHARACTERS IN D0.W(PNT4HXƒMOVE.W�D0,-(A7)‚SAVE�IN�TEMPŸ5/83*‰ROR.W‚#8,D0‚GET�BITS�15-8�INTO�LOWER�BYTE‰BSR.S‚PNT2HX‚PRINT�IT"‰MOVE.W�(A7)+,D0‚PULL�IT�BACKŸ5/83 * PRINT 2 HEX CHARACTERS IN D0.B,PNT2HXƒMOVE.W�D0,-(A7)�SAVE�IN�TEMP�REGœ5/83‰ROXR.W�#4,D0‚FORM�UPPER�NIBBLE)‰BSR.S�PUTHEX‚PUT�ASCII�INTO�PRINT�BUFFER(‰MOVE.W�(A7)+,D0‚GET�BACK�FROM�TEMP™5/833* CONVERT D0.NIBBLE TO HEX & PUT IT IN PRINT BUFFER*&PUTHEXƒAND.B�#$0F,D0‚SAVE�LOWER�NIBBLE‰OR.B�#$30,D0‚CONVERT�TO�ASCII‰CMP.B�#$39,D0ƒSEE�IF�IT�IS>9 ‰BLE.S�SAVHEX‰ADD.B…#7,D0…ADD�TO�MAKE�10=>A2SAVHEXƒMOVE.B„D0,(A3)+�PUT�IT�IN�PRINT�BUFFER“3/82‰RTS PAGE* DECODE AS A NUMBER8GETNUMD‚MOVEM.LƒD1-D5/A0,-(A7)†ENTRY�FOR�DECIMAL�DEFAULT‰MOVE.W„#2,D3�D3�=�BASEƒNEW�!!! ‰BRA.S…GETN SPC 2* ENTRY FOR HEX-GETNUMA‚MOVEM.LƒD1-D5/A0,-(A7)†SAVE�REGISTERS‰MOVE.W„#1,D3�D3�=�BASEƒNEW�!!! SPC 1)GETN…CLR.W…D4ˆD4�=�FLAG�FOR�CHARACTER�HIT ‰CLR.L�D0‰CLR.L�D1‚WHERE�TO�PUT�RESULTS*NXTNUMƒCMP.L�A3,A5ƒSEE�IF�AT�END�OF�BUFFER ‰BEQ.S…EXITGN‰MOVE.B�(A5)+,D0‚GRAB�CHARACTER‰CMP.B�#$20,D0„CHECK�FOR�SPACE‰BNE.S�GETNUM3**ˆTST.W…D4ˆSEE�IF�ANYTHING�ENTERED„NEW�!!!+‰BRA.S�NXTNUMƒIF�NOT�SCAN�NEXT�CHARƒNEW�!!!;GETNUM2‚SUB.L…#1,A5…BACK�UP�TO�POINT�AT�SPACE/PREVIOUS�CHAR,EXITGNƒMOVE.L„D1,D0…SET�UP�RESULT�FOR�RETURN‰MOVE.W„#04,CCRƒ[BEQ]£5/83.‰BRA.S…EXITGN11‚SUCCESSFUL�DECODED�NUMBER�5/833EXITBNƒMOVE.W„#00,CCRƒ[BNE]‚BAD�DECODED�NUMBER�5/83;EXITGN11�MOVEM.Lƒ(A7)+,D1-D5/A0†RESTORE�SOME�REGISTERSˆ5/83‰RTS SPC 3)GETNUM3‚CMP.B�#$27,D0ƒSEE�IF�SINGLE�QUOTE#‰BEQ.S…GETNUMST‚GET�NUM�STRINGš1/82 SPC 1‰CLR.L…D0’RESET�SUCCESS�FLAG,‰SUB.L…#1,A5�RESTORE�A5�TO�LAST�CHAR�CHECKED/‰MOVE.B„#$0D,(A3)‹INSERT�'CR'�AS�LAST�CHAR†3/824‰MOVE.L„A5,INP_STR(A6)†SET�INPUT�BUFFER�ADDRESS†3/820‰MOVE.B„BASE(A6),D2‰SAVE�DEFAULT�INPUT�BASE‡3/82/‰MOVE.B„D3,BASE(A6)‰SET�DEFAULT�INPUT�BASEˆ3/82.‰MOVE.B„#1,PRSE_MD(A6)‰SET�PARSE�MODE�=�1‰3/82$‰MOVEM.LƒD0-D7/A0-A6,-(A7)ƒSAVE�REGS3‰LEA‡GLOBAL(A6),A5‡ADD�OFFSET�OF�GLOBAL�FOR�A5ƒ3/82%‰MOVEA.LƒA5,A6�SET�LOCAL�AREA�POINTER7‰LEA‡.PLJSR(PC),A3‡GET�ADDRESS�OF�LONG�JSR�ROUTINE�1/82‰BSR‡PARSE_STª1/82,‰MOVEM.Lƒ(A7)+,D0-D7/A0-A6ƒRESTORE�REGS’3/82$‰MOVE.B„#$20,(A3)‹RESTORE�SPACE‘3/82 ‰TST.B…ERR_NMBR(A6)ˆERROR�?—3/82‰BNE.S…NO_GOOD�YES)‰MOVE.L„ADR_VAL(A6),D1†NO,�GET�VALUE‘3/82‰ADD.L…#1,D0�SET�SUCCESS�FLAG* NO_GOOD‚EQU‡*3‰MOVE.B„D2,BASE(A6)‰RESTORE�DEFAULT�INPUT�BASE„3/822‰MOVE.B„#3,PRSE_MD(A6)†RESTORE�PARSE�MODE�=�3ˆ3/82‰LEA‡INQ(A6),A0¨3/820‰MOVE.L„A0,INP_STR(A6)†INPUT�BUFFER�ADDRESSŠ3/82 ‰CLR.L…D2.‰MOVE.B„PTR_INP(A6),D2†GET�BUFFER�POINTERŒ3/82)‰TST.B…EOL_FLG(A6)‰EOL�ENCOUNTERED�?�3/82‰BNE.S…EOL‘YES‰SUB.L…#1,D2�NO,�ADJUST�POINTER* EOL†EQU‡*'*******‚MOVE.L„(A7)+,A5ŒRESTORE�A5”3/82*‰ADD.L…D2,A5�ADJUST�A5�FOR5 �VALUE�RETRIEVED‰TST.L…D0’SUCCESS�?‰BNE‡GETNUM2�YES‰BRA‡EXITBNŽNOœ5/83 SPC 37GETNUMST�TST.L�D1‚IF�SOMETHING�IS�BEFORE�THIS�ERROR�OUT‰BNE‡EXITBNŽBAD�NUMBER”5/83‰MOVE.L�#5,D2‚COUNTER'GETNUMS1�MOVE.B�(A5)+,D0‚LOAD�CHARACTER"‰CMP.B�#$27,D0„SEE�IF�SINGLE�QUOTE‰BEQ�GETNUM2�WHERE�TO�GO�IF�END(‰LSL.L�#8,D1‚MAKE�ROOM�FOR�NEW�CHARACTER‰MOVE.B�D0,D1‚NEW�BYTE)‰CMP.L�A3,A5†SEE�IF�AT�END�OF�BUFFER”3/82(‰BEQƒEXITGN…WHERE�TO�GO�IF�END�OF�BUFFER ‰SUB.L�#1,D2 ‰BNEƒGETNUMS14EXITSYN‚BRA‡EXITBN†NO�CLOSING�QUOTE�OR�TOO�LONGŠ5/83‰PAGE*0*‚***GETHEX***‚GET�HEX�(BINARY�VALUE�FROM�ASCII):*ƒD0.B�HAS�ASCII�CHAR‚RETURNS�$0-$F�BINARY�OR�$FF�ON�ERROR*)GETHEX�CMP.B�#$30,D0‚IS�IT�LESS�THAN�ZERO‡BLT.S�PNMSG011#‡CMP.B�#$39,D0‚IS�IT�GREATER�THAN�9‰BLE.S…GTHX2…GOOD�HEX SPC 1"‡CMP.B�#$41,D0‚IS�IT�LESS�THAN�'A'‡BLT.S‡PNMSG011‡CMP.B�#$46,D0‚IS�IT�GT�'F'‡BGT.S‡PNMSG011!‡SUB.B�#7,D0‚MAKE�IT�SMALLER�A=10GTHX2„AND.L…#$F,D0‰RTS SPC 1 PNMSG011�DS„0 ‰BRA‡EXITSYN 8SYMORDEC�MOVE.L„A3,-(A7)ŒSAVE�OUTPUT�BUFFER�POINTER„3/82‰BSR‡BESTFIT«3/82 ‰BCS.S…NOSFITŽNO�SYMBOL�FIT‘3/82"‰ADD.L…#4,A7�POP�A3�OFF�STACKŽ3/82 ‰RTS¹3/823NOSFITƒMOVE.L„(A7)+,A3ŒRETRIEVE�BUFFER�POINTER‡3/82!‰MOVE.L„D0,-(A7)ŒSAVE�OFFSET“3/82+‰MOVEQ.Lƒ#8,D0�LOOP�INDEX�-1�FOR�ERASE‡3/82*„CONVERT�BINARY�TO�DECIMAL‚REG�D0�PUT�IN�(A6)�BUFFER�AS�ASCII*0HEX2DEC‚MOVEM.LƒD1-D4/D6-D7,-(A7)ƒSAVE�REGISTERS‰MOVE.L�D0,D7‚SAVE�IT�HERE ‰BPL.S�HX2DC‰NEG.L�D7‚CHANGE�TO�POSITIVE ‰BMI.S…HX2DC57ƒSPECIAL�CASE�(-0)'‰MOVE.B�#'-',(A3)+‚PUT�IN�NEG�SIGNš3/82 HX2DC„CLR.W…D4ˆFOR�ZERO�SURPRESS‰MOVE.L�#10,D6‚COUNTER HX2DC0ƒMOVE.L�#1,D2‚VALUE�TO�SUB‰MOVE.L�D6,D1‚COUNTER'‰SUB.L�#1,D1‚ADJUST�-�FORM�POWER�OF�TEN‰BEQ.S�HX2DC2‚IF�POWER�IS�ZERO!HX2DC1ƒMOVE.W�D2,D3‚D3=LOWER�WORD ‰MULU�#10,D3‰SWAP�D2ƒD2=UPPER�WORD ‰MULU�#10,D2‰SWAP�D3ƒADD�UPPER�TO�UPPER ‰ADD.W�D3,D2‰SWAP�D2‚PUT�UPPER�IN�UPPER‰SWAP�D3‚PUT�LOWER�IN�LOWER‰MOVE.W�D3,D2‚D2=UPPER�&�LOWER ‰SUB.L�#1,D1 ‰BNE�HX2DC1HX2DC2ƒCLR.L�D0‚HOLDS�SUB�AMTHX2DC22‚CMP.L�D2,D7%‰BLT.S�HX2DC3‚IF�NO�MORE�SUB�POSSIBLE‰ADD.L�#1,D0‚BUMP�SUBS(‰SUB.L�D2,D7‚COUNT�DOWN�BY�POWERS�OF�TEN‰BRA.S�HX2DC22‚DO�MOREHX2DC3ƒTST.B�D0‚ANY�VALUE? ‰BNE.S�HX2DC4‰TST.W…D4ˆZERO�SURPRESS ‰BEQ.S�HX2DC5$HX2DC4ƒADD.B�#$30,D0‚BINARY�TO�ASCII#‰MOVE.B„D0,(A3)+‚PUT�IN�BUFFER›3/82'‰MOVE.B„D0,D4…MARK�AS�NON�ZERO�SURPRESSHX2DC5ƒSUB.L�#1,D6…NEXT�POWER ‰BNE�HX2DC0!‰TST.W…D4ˆSEE�IF�ANYTHING�PRINTED ‰BNE.S�HX2DC63HX2DC57‚MOVE.B„#'0',(A3)+‚PRINT�AT�LEST�A�ZERO’3/822HX2DC6ƒMOVEM.Lƒ(A7)+,D1-D4/D6-D7ƒRESTORE�REGISTERS‰RTS‚END�OF�ROUTINE OUTPUTƒBRA‡*BUFSIZE‚EQU‡128 ‰END éééé6 ééé/MM‡IDNT†0,1‡MM�(Memory�Change)�CommandŽ11/14/84 ‰OPT‡FRS¯3/82‰XDEF†MM,MDDI,GETNUMDE¢3/82 SPC 1<‰XREF†.PLJSR,CODE68M,DCODE68M,DO7OUTR,ERLL,KEYIN,WHATƒ111484(‰XREF†FORMADDR,PNT2HX,PNT4HX,PNT8HX•3/82<‰XREF†RESOLVEƒD0&D7=INPUT;‚D0=OFFSET�SYMNAME=text�D3=SECTION *Â<<1114840‰XREF†BRKPBG,BRKPBUF,BRKGET,BRKPBP,BRKSOR,BRKBUF!‰XREF†IOIN,OUTSTAR,OTEND,INQ,INQE+‰XREF†OUTBUF,DMOUTA,SYMNAME,UTLWORD,SYM_BUF*‰XREF†TOKEN,ERR_NMBR,GLOBAL,PCODE•111484>>* CR‡EQU‡$D MOVELLƒSET‡6  ?* 0123456789012345678901234567890123456789012345678901234567890@*�AAAAAA:MODULEXX:3�DDDDDDDDDDDDDDDDDDDD�LLLLLLLL�OPCODE‚OPERAND*“FDATA�FOL†FOC…FOP FDATA„EQU‡18ˆOFFSET�TO�DATAFOL†EQU‡39ˆOFFSET�TO�LABEL-FOC†EQU‡48ˆOFFSET�TO�OP-CODE�(NO�LABEL�FIELD)-FOP†EQU‡56ˆOFFSET�TO�OPERAND�(NO�LABEL�FIELD) PAGE ‰SECTIONƒ9* MODIFY MEMORY*‚COMMON�REGISTER�USAGE*‚XA6‚SECTION�0�BASE�ADDRESS*ƒA5‚IO�BUFFER�POINTER‚START*‚XA4‚ADDRESS�TO�MODIFY*ƒA3*ƒA2*ƒA1*ƒA0‚IO�BUFFER�POINTER�END*ƒD7‚DATA�READ�(DATA�STORED)/*ƒD6‚SIZE‚1/2/4�BYTES‚(ASM/DISASM�2�-�10�BYTES)5*ƒD5‚OVERRIDE�BYTE�(80XX=NON�VERIFY)‚(XX80=BYTE�SIZE)*ƒD4‚ADDRESS�TO�MODIFY* * ;OPTIONS *ƒ;B‚BYTE *ƒ;W‚WORD*ƒ;L‚LONG�WORD�(4�BYTES)*ƒ;DI�DISASSEMBLE*MMDI ‰BTST†#0,D4‰BNE‡MM7ERRŽODD�ADDRESS�ERROR ‰CLR.L…D6’SIZE�=�0!MMDI22ƒADD.L…D6,D4�PC�=�PC�+�SIZETMMDI„BSR‡MMDI221�DISASSEMBLE5*******‚MOVE.L„D1,A5�RETRIEVE�BUFFER�END�ADDRESSƒ1/82 ‰MOVE.B„#'?',(A5)‹ASK�A�QUESTION‰BSR‡FDISPLAYŒDISPLAY�LINE’1/82.‰LEA‡OUTBUF(A6),A3‡SAVE�ADDRESS�DISPLAYEDˆ3/82.‰LEA‡SYM_BUF(A6),A1‡FROM�SYMBUF�TO�OUTBUF‰3/82‰BSR.S…COPYADDRŒDO�IT™3/82* *„INPUT�LINE*5MMDI31ƒBSR‡KEYIN�INPUT�ASSEMBLY�SOURCE�(NO�LINE�FEED)%‰MOVE.B„(A5),D0�D0�=�FIRST�CHAR�INPUT ‰CMP.B…#CR,D0 ‰BNE.S…MMDI34,*ˆBSR‡OUT1CRŽNOTHING�INPUT;�OUTPUT�LINE�FEED ‰BRA‡TMMDI >COPYADDR�MOVE.L„(A1)+,(A3)+‰COPYS�18�BYTE�OUTPUT�ADDRESS�FIELD$‰MOVE.L„(A1)+,(A3)+‰FDATA�IS�18“3/82‰MOVE.L„(A1)+,(A3)+‰MOVE.L„(A1)+,(A3)+‰MOVE.W„(A1)+,(A3)+‰RTS »MÄDÌVÔjÜWäKì MMDI34ƒSUB.L…D6,D4�BACKUP�PC ‰CMP.B…#'.',D0‰BEQ‡MMCLOSE�CLOSE 0‰LEA‡INQ(A6),A5ŠA5�=�POINTER�TO�SOURCE�CODEƒ3/820‰LEA‡DMOUTA(A6),A3‡A3�=�POINTER�FOR�RESULTS†3/82‰MOVEM.LƒA4/A6,-(A7)6‰MOVE.L„IOIN+20(A6),A0†A0�=�NUMBER�OF�BYTES�INPUT„3/82/‰ADD.L…A5,A0�A0�=�POINTER�TO�END�OF�SOURCE�3/82,‰MOVE.B„#'�',(A0)‹OVERLAY�CR�WITH�SPACE‰3/82"‰MOVE.L„D4,A4�A4�=�ADDRESS�OF�DATA/‰MOVE.L„PCODE(A6),D3ˆD3�=�PROCESSOR�TYPE‹111484 *’A3�=�STORE�POINTER*’A4�=�PROGRAM�COUNTER"*’A5�=�POINTER�TO�DATA�TO�ASSEMBLE2*’A0�=�POINTER�TO�END�OF�SOURCE�DATA‚(UNUSED)†3/82*’D3�=�PROCESSOR�TYPEŸ111484+*™0=68000,�4=68008,�8=68010,�C=68020‰111484‰BSR‡CODE68M�ASSEMBLE–111484 *’A3�=�POINTER�TO�LINE�ASSEMBLED *’A4�=�PROGRAM�COUNTER�(ORGINAL)$*’A0�=�POINTER�END�OF�LINE�ASSEMBLED*’D0-D2�=�DATA�ASSEMBLED3*’D6�=�NUMBER�OF�BYTES�ASSEMBLED�(IF�=�ZERO;�ERROR)%*’D7�=�ERROR�FLAG�&�POSITION�OF�ERROR "‰MOVE.L„A4,D4…D4�=�ADDRESS�OF�DATA-‰MOVEM.Lƒ(A7)+,A4/A6‰RESTORE�A6�BASE�REG‹1/82;‰MOVEM.LƒD0/D1/D2,UTLWORD(A6)‚6 UTLWORD�=�DATA�ASSEMBLED„3/822‰MOVE.L„D7,UTLWORD+12(A6)�=�POSITION�IF�ERROR�3/826******ƒMOVE.L„D6,BRKBUF+4-B(A6)ƒMOVELL�BYTE�COUNT�1/82 =* MOVE LINE ASSEMBLED (FROM DMOUT) TO OUTPUT BUFFER; KEEP OLD*‚ADDRESS�FIELD‰LEA‡SYM_BUF(A6),A3¥3/82.‰LEA‡OUTBUF(A6),A1‡A(SAVED�ADDRESS�FIELD)ˆ3/821‰BSR‡COPYADDRŒFDATA�BYTES�FROM�OUTBUF-SYM_BUF3/82‰LEA‡DMOUTA+FDATA(A6),A1Ÿ3/82$*******‚LEA‡SYMBUF+FDATA(A6),A3Ÿ3/82 /MMDI29ƒMOVE.B„(A1)+,(A3)+‰MOVE�DATA�STRINGŽ3/82 ‰CMP.L…A1,A0 ‰BCC‡MMDI29 ‰SUB.L…#1,A3­3/82!‰BSR.S…FDISPLAYŒDISPLAY�LINE’1/82 ‰TST.B…D6%‰BEQ.S…MMDI30ŽERROR;�DON'T�STORE�DATA 7******ƒMOVE.L„#UTLWORD,BRKSOR-B(A6)‚SOURCE�ADDRESS�1/82‰BSR‡STORE­1/82 ‰BRA‡MMDI22 MMDI305‰MOVE.L„UTLWORD+12(A6),D7ƒD7�=�POSITION�OF�ERRORˆ3/82‰LEA‡SYM_BUF(A6),A3¥3/82$MMDI44ƒMOVE.B„#'�',(A3)+ŠSPACES˜3/82‰DBRA†D7,MMDI44 &‰MOVE.B„#'X',-1(A3)‰X�UNDER�ERROR‘3/82'‰MOVE.B„#'?',(A3)+Š?�ALLOW�REINPUT�3/82‰MOVE.B„#$7,(A3)ŒBELLš3/82‰BSR.S…FDISPLAYª1/82 ‰BRA‡MMDI31 ,FDISPLAY�MOVE.L„#$10,D7�FORMATED�OUTPUT�1/82 IDISPLAY�LEA‡SYM_BUF(A6),A0¥3/82)‰MOVE.L„A0,OUTSTAR(A6)†START�ADDRESS‘3/82%‰MOVE.L„A3,OTEND(A6)ˆEND�ADDRESS“3/82‰BSR‡DO7OUTR«1/82 ‰RTS¹1/82 PAGEMMDI221‚BSR‡GET10B„GET�10�BYTES ‰MOVEM.LƒA4/A6,-(A7) ‰MOVE.L„D4,A46‰LEA‡SYM_BUF(A6),A5‡A5�=�POINTER�FOR�DISASSEMBLER�3/82‰MOVE.L„PCODE(A6),D3¦111484*’ENTRY*“A4�=�PROGRAM�COUNTER)*“A5�=�POINTER�TO�STORE�DISASSEMBLED�LINE*�D0-D2�=�DATA�TO�DISASSEMBLE*“D3�=�PROCESSOR�TYPEž111484+*š0=68000,�4=68008,�8=68010,�C=68020ˆ111484‰BSR‡DCODE68Mª111484*’RETURN*“A4�=�NEW�PROGRAM�COUNTER*“A5�=�PTR�START�BUFFER*“A3�=�PRT�END�BUFFERž3/82#*“D6�=�NUMBER�OF�BYTES�DISASSEMBLED ‰MOVE.L„A4,D4'‰MOVE.L„A3,D1�SAVE�END�BUFFER�ADDRŠ3/82‰MOVEM.Lƒ(A7)+,A4/A6 * FORMAT LABEL FIELD IF PC MATCH ‰MOVE.L„D4,D7 ‰SUB.L…D6,D7!‰MOVE.L„#1,D0�RESOLVE�TO�BEST�FIT2‰LEA‡GLOBAL(A6),A5‡RESOLVE�ADDRESSES�GLOBALLY„3/82‰BSR‡RESOLVE�GET�SYMBOL‰LEA‡SYMNAME(A6),A1¤3/82‰CMP.B…#'�',(A1)‹FOUND�LABEL?‰BEQ.S…MMDI24ŽNO�MATCH ‰TST.L…D0‰BNE.S…MMDI24ŽNOT�EXACT�MATCH ‰LEA‡SYM_BUF+FOL(A6),A0¡3/82 ‰MOVE.L„#7,D0$MMDI23ƒMOVE.B„(A1)+,(A0)+‰MOVE�LABEL‰DBRA†D0,MMDI236MMDI24ƒMOVE.L„D1,A5�RESTORE�END�BUFFER�ADDR�TO�A5�1/82‰RTS SPC 2&MDDI…MOVE.L„D1,D4�D4�=�DISPLAY�ADDRESS‰BTST†#0,D4�ODD�ADDRESS�?‰BNE.S…MM7ERRŽYES,�ERROR+NEXTLOC‚MOVE.L„D2,-(A7)ŒNO,�SAVE�LINE�COUNT‰BSR‡MMDI221�DISASSEMBLE‰BSR‡FDISPLAYŒDISPLAY�LINE’1/82‰MOVE.L„(A7)+,D2ŒRESTORE�COUNT‰SUB.L…#1,D2�DONE�?‰BNE.S…NEXTLOC�NO‰RTS›YES PAGE* ENTER: *ˆD0�=�KEY *‹=�1‚ADDRESS*‹=�2‚ADDRESSˆTYPE*‹=�3‚ADDRESS�LENGTH*‹=�4‚ADDRESS�LENGTH�TYPE*ˆD1�=�ADDRESSˆBECOMES�D4*ˆD3�=�LENGTH�1/2/4‹D6*ˆD4�=�TYPE�$A=DI�D1*MM‰MOVE.L„D3,D6�D6�=�LENGTH%‰EXG.L…D1,D4�D4�=�ADDRESS�(D1�=�TYPE) ‰CMP.B…#1,D0 ‰BNE.S…MM2000 *†KEY�=�1‰CLR.L…D1’D1�=�TYPE�(NOT�;DI)‰MOVE.L„#1,D6�D6�=�LENGTH�BYTE ‰BRA.S…MM10 MM2000ƒCMP.B…#2,D0 ‰BNE.S…MM3000 *…KEY�=�2‰MOVE.L„#1,D6�FORCE�BYTE ‰CMP.B…#$A,D1‰BEQ‡MMDI�DISASSEMBLE ‰BRA.S…MM10 MM3000ƒCMP.B…#3,D0 ‰BNE.S…MM4000 *…KEY�=�3‰CMP.W…#1,D6­1/82‰BEQ.S…MM10�BYTE�SIZE‰BRA.S…MM7‘DO�ADDRESS�CHECK MM4000ƒCMP.B…#4,D0 ‰BNE.S…MM7ERR&‰BRA.S…MM7ERRŽTYPE‚"KEY�=�4"�GOES�HERE PAGE MM7†BTST†#0,D4�ODD�ADDRESS�CHECK ‰BEQ.S…MM10 * FALL THRU; ODD ADDRESS ERRORMM7ERRƒADD.L…#4,A7�TRIM�STACK‰BRA‡WHAT�ERROR;�PRINT�"WHAT" MM10‰MOVEM.LƒA6/D1,-(A7)‰LEA‡SYM_BUF(A6),A3¥3/82 ‰MOVE.L„D4,D0‰BSR‡FORMADDRŒFORMAT�ADDRESS*******‚MOVE.L„A6,A5­3/82‰MOVEM.Lƒ(A7)+,A6/D1‰MOVE.B„#'�',(A3)+ŠSPACE™3/82 SPC 1#* READ DATA FROM MEMORY & FORMAT IT ‰CMP.B…#2,D6‰BEQ.S…MM14†WORD ‰CMP.B…#4,D6‰BEQ.S…MM16†LONG�WORD SPC 1* BYTE‰BSR‡GETB†D0�=�BYTE�READ‰BSR‡PNT2HX„FORMAT�BYTE ‰BRA.S…MM18 SPC 1* WORDMM14…BSR‡GETW†D0�=�WORD�READ‰BSR‡PNT4HX„FORMAT�WORD ‰BRA.S…MM18 SPC 1 * LONG WORDMM16…BSR‡GETL†D0�=�LONG�WORD‰BSR‡PNT8HX„FORMAT�LONG�WORD SPC 1!MM18…MOVE.B„#'�',(A3)+ŠSPACE™3/82‰MOVE.B„#'?',(A3)+¨3/827  ‰SUB.L…#1,A3­3/82!‰CLR.L…D7’IMAGE�MODE�DISPLAYŒ1/82‰BSR‡IDISPLAYŒDISPLAY�LINE’1/82  PAGE* READ USER INPUT*‚[DATA]�(CR)ƒNEXT*‚[DATA]ƒ^„LAST*‚[DATA]ƒ=„SAME*‚[DATA]ƒ.„EXIT SPC 1‰BSR‡KEYIN�INPUT�LINE%‰MOVE.B„(A5),D0�D0�=�FIRST�CHAR�INPUT ‰CMP.B…#CR,D0‰BEQ.S…MM50�NO�DATA�(CR�ONLY) SPC 1*�IF�=�^�OR�.‚TAKE�ACTION‰MOVE.B„(A5),D0‰CMP.B…#'=',D0‰BEQ‡MM10�=�DO�SAME�ADDRESS‰CMP.B…#'.',D0‰BEQ.S…MMCLOSE�.‚CLOSE‰CMP.B…#'^',D0‰BEQ.S…MM60�^‚BACKUP SPC 1‰LEA‡INQ(A6),A5¨3/82‰BSR‡GETNUMA�GET�NUMBER ‰BCS‡MM7ERR SPC 1* WE HAVE DATA; STORE IT ‰CMP.B…#2,D6‰BEQ.S…MM24†WORD ‰CMP.B…#4,D6‰BEQ.S…MM26†LONG�WORD SPC 1* BYTE‰BSR‡STOREBŽBYTE�STORE ‰BRA.S…MM40 SPC 1* WORDMM24…BSR‡STOREWŽWORD�STORE ‰BRA.S…MM40 SPC 1 * LONG WORDMM26…BSR‡STORELŽLONG�WORD�STORE SPC 1*�LOOK�FOR‚.�=�^‚CR‚TERMINATIONMM40…MOVE.B„(A5),D0‰CMP.B…#'.',D0‰BEQ.S…MMCLOSEƒDONE‰CMP.B…#'^',D0%‰BEQ.S…MM60�"UP-ARROW"‚BACKUP�ADDRESS‰CMP.B…#'=',D0-‰BEQ‡MM10�"EQUAL-SIGN"�ADDRESS�STAYS�THE�SAME ‰CMP.B…#CR,D0‰BNE‡MM7ERRŽ"WHAT?" '*�ADDRESS�LOW�TO�HIGH’"CR"�NEXT�ADDRESSMM50…ADD.L…D6,D4 ‰BRA‡MM10 SPC 1* ADDRESS HIGH TO LOWMM60…SUB.L…D6,D4 ‰BRA‡MM10 MMCLOSE‚RTS‘RETURN�TO�CALLER SPC 3* GET DATA FROM "TASK"GET†LEA‡UTLWORD(A6),A0¤3/822GETM…MOVE.L„A0,BRKGET(A6)‡DESTINATION�ADDRESS‹3/82*‰MOVE.L„D4,BRKPBUF(A6)†SOURCE�ADDRESS�3/82/‰MOVE.L„D0,BRKGET+4(A6)…BYTE�COUNT�FETCHEDŒ3/822‰LEA‡BRKPBG(A6),A0‡POINTER�TO�PARAMETER�BLOCK„3/82"‰MOVE.L„(A4),(A0)‹SOURCE�TASK�NAMEDOMOVEƒMOVE.L„#MOVELL,D0¨3/82‰TRAP†#1‰BNE‡ERLL�ERROR‰RTS !GETB…MOVE.L„#1,D0�BYTE�COUNT”1/82 ‰BTST†#0,D4‰BEQ.S…GETBEVENŒEVEN�ADDRESS &‰LEA‡UTLWORD+1(A6),A0„ODD�ADDRESS“3/82 ‰BSR‡GETM/‰MOVE.B„UTLWORD+1(A6),D0„D0�=�BYTE�FETCHED�3/82‰RTS  GETBEVEN�BSR‡GET‘GET�BYTE�EVEN-‰MOVE.B„UTLWORD(A6),D0†D0�=�BYTE�FETCHED�3/82‰RTS !GETW…MOVE.L„#2,D0�BYTE�COUNT“1/82‰BSR‡GET-‰MOVE.W„UTLWORD(A6),D0†D0�=�WORD�FETCHED�3/82‰RTS !GETL…MOVE.L„#4,D0�BYTE�COUNT”1/82‰BSR‡GET2‰MOVE.L„UTLWORD(A6),D0†D0�=�LONG�WORD�FETCHEDˆ3/82‰RTS $GET10BƒMOVE.L„#10,D0ŽBYTE�COUNT”1/82‰BSR‡GET‰MOVEM.LƒUTLWORD(A6),D0-D2¡3/82‰RTS ,STORE„LEA‡UTLWORD(A6),A0†SOURCE�ADDRESS�3/824STOREMƒMOVE.L„D4,BRKBUF(A6)‡DESTINATION�ADDRESS‹3/82)‰MOVE.L„A0,BRKSOR(A6)‡SOURCE�ADDRESS�3/82.‰MOVE.L„D6,BRKBUF+4(A6)…BYTE�COUNT�STORED�3/82‰LEA‡BRKPBP(A6),A0¥3/82#‰MOVE.L„(A4),12(A0)‰SOURCE�TASKNAME-‰BRA‡DOMOVEŽPERFORM�MOVELL�BETWEEN�TASKS‚3/82 STOREBƒBTST†#0,D4­1/82‰BEQ.S…STBEVEN�STORE�EVEN�BYTE 0‰LEA‡UTLWORD+1(A6),A0„SOURCE�ADDRESS�IS�ODD‰3/82&‰MOVE.B„D0,(A0)ŽDATA‚TO�UTLWORD+1‹1/82‰BSR‡STOREMŽSTORE�BYTE‰RTS -STBEVEN‚MOVE.B„D0,UTLWORD(A6)†STORE�BYTE”3/82 ‰BSR‡STORE‰RTS ,STOREWƒMOVE.W„D0,UTLWORD(A6)†STORE�WORD”3/82 ‰BSR‡STORE‰RTS 1STORELƒMOVE.L„D0,UTLWORD(A6)†STORE�LONG�WORD�3/82 ‰BSR‡STORE‰RTS PAGE* DECODE AS A NUMBER9GETNUMDE�MOVEM.LƒD1-D5/A0,-(A7)†ENTRY�FOR�DECIMAL�DEFAULT‰MOVE.W„#10,D3ŽD3�=�BASE ‰BRA.S…GETN SPC 2* ENTRY FOR HEX-GETNUMA‚MOVEM.LƒD1-D5/A0,-(A7)†SAVE�REGISTERS‰MOVE.W„#16,D3„D3�=�BASE SPC 1)GETN…CLR.W…D4ˆD4�=�FLAG�FOR�CHARACTER�HIT ‰CLR.L�D0‰CLR.L�D1‚WHERE�TO�PUT�RESULTS*NXTNUMƒCMP.L�A6,A5ƒSEE�IF�AT�END�OF�BUFFER ‰BEQ.S…EXITGN‰MOVE.B�(A5)+,D0‚GRAB�CHARACTER‰CMP.B�#$20,D0„CHECK�FOR�SPACE‰BNE.S�GETNUM3!‰TST.W…D4ˆSEE�IF�ANYTHING�ENTERED#‰BEQ.S�NXTNUMƒIF�NOT�SCAN�NEXT�CHAR;GETNUM2‚SUB.L…#1,A5…BACK�UP�TO�POINT�AT�SPACE/PREVIOUS�CHAR,EXITGNƒMOVE.L„D1,D0…SET�UP�RESULT�FOR�RETURN.‰MOVEM.Lƒ(A7)+,D1-D5/A0†RESTORE�SOME�REGISTERS‰MOVE.W„#0,CCRŽRESET�CARRY�BIT‰RTS -EXITGNE‚MOVE.L„D1,D0…SET�UP�RESULT�FOR�RETURN.‰MOVEM.Lƒ(A7)+,D1-D5/A0†RESTORE�SOME�REGISTERS‰MOVE.W„#1,CCRŽSET�CARRY�BIT‰RTS SPC 3)GETNUM3‚CMP.B�#$27,D0ƒSEE�IF�SINGLE�QUOTE‰BEQ.S…GETNUMST‚GET�NUM�STRING SPC 1/‰LEA‡GETNDATA(PC),A0…POINTER�TO�TERMINATE�CHARSGETNUM31�MOVE.B„(A0)+,D5‰BEQ.S…GETNUM37ŒNOT�TERM.CHAR ‰CMP.B…D5,D0‰BEQ‡GETNUM2�FOUND�CHAR ‰BRA‡GETNUM31 SPC 1/GE7 TNDATA�DC.B†'(+,-.:;=^]',$D,0ƒTERMINATE�CHARS SPC 10GETNUM37�CMP.B�#'&',D0ƒSEE�IF�FLAGGED�AS�DECIMAL‰BNE.S�GETNUM41!‰TST.W…D4’SEE�IF�ANYTHING�DECODED ‰BNE.S…ERROR1‰MOVE.W�#10,D3„BASE�IS�DECIMAL SPC 1-GETNUM39�MOVE.L„#-1,D4„FLAG�AS�SOMETHING�READ ‰BRA�NXTNUM SPC 1,GETNUM41�CMP.B�#'$',D0„SEE�IF�FLAGGED�AS�HEX‰BNE.S�GETNUM5!‰TST.W�D4„SEE�IF�ANYTHING�DECODED ‰BNE.S�ERROR1‰MOVE.W�#16,D3„BASE�IS�16 ‰BRA‡GETNUM39 SPC 1+GETNUM5‚BSR.S…GETHEX‚RETURNS�WITH�D0=BINARY&‰CMP.W…D3,D0ƒIS�INPUT�LARGER�THAN�BASE ‰BHI.S�ERROR1+‰MOVE.L�D1,D2ƒGET�READY�TO�MULTIPLY�D1*BASE‰SWAP�D1‰MULU†D3,D1ƒTOP�PART‰SWAP�D1‰TST.W�D1ƒCHECK�FOR�OVERFLOW ‰BNE.S�ERROR1‚VALUE�IS�TOO�LARGE ‰MULU†D3,D2‚NOW�WORK�ON�LOW�WORD!‰ADD.L�D2,D1‚PUT�IT�BACK�TOGETHER‰BVS.S�ERROR1‚OVERFLOW?‰ADD.L�D0,D1‚ADD�IN�NEW�STUFF ‰BVC‡GETNUM39ERROR1ƒBRA‡EXITGNE SPC 17GETNUMST�TST.L�D1‚IF�SOMETHING�IS�BEFORE�THIS�ERROR�OUT‰BNE.S�EXITSYN‰MOVE.L�#5,D2‚COUNTER'GETNUMS1�MOVE.B�(A5)+,D0‚LOAD�CHARACTER"‰CMP.B�#$27,D0„SEE�IF�SINGLE�QUOTE‰BEQ�GETNUM2�WHERE�TO�GO�IF�END(‰LSL.L�#8,D1‚MAKE�ROOM�FOR�NEW�CHARACTER‰MOVE.B�D0,D1‚NEW�BYTE$‰CMP.L�A6,A5†SEE�IF�AT�END�OF�BUFFER(‰BEQƒEXITGN…WHERE�TO�GO�IF�END�OF�BUFFER ‰SUB.L�#1,D2 ‰BNEƒGETNUMS10EXITSYN‚BRA‡EXITGNEŠNO�CLOSING�QUOTE�OR�TOO�LONG‰PAGE*0*‚***GETHEX***‚GET�HEX�(BINARY�VALUE�FROM�ASCII):*ƒD0.B�HAS�ASCII�CHAR‚RETURNS�$0-$F�BINARY�OR�$FF�ON�ERROR*)GETHEX�CMP.B�#$30,D0‚IS�IT�LESS�THAN�ZERO‡BLT.S�PNMSG011#‡CMP.B�#$39,D0‚IS�IT�GREATER�THAN�9‰BLE.S…GTHX2…GOOD�HEX SPC 1"‡CMP.B�#$41,D0‚IS�IT�LESS�THAN�'A'‡BLT.S‡PNMSG011‡CMP.B�#$46,D0‚IS�IT�GT�'F'‡BGT.S‡PNMSG011!‡SUB.B�#7,D0‚MAKE�IT�SMALLER�A=10GTHX2„AND.L…#$F,D0‰RTS SPC 1 PNMSG011�DS„0‰ADD.L…#4,A7�TRIM�STACK ‰BRA‡EXITGNE ‰ENDéééé*!*’SIMBO�FOR�SYMBUG�II‚--‚11/14/84*2*ˆTHERE�ARE�THREE�MODULES�CONTAINED�WITHIN�SIMBO�:*4*‹SIMBO„-�READ�IN�.DB�FILE�AND�SET�UP�IN-CORE�TABLES4*‹CALC_ADD�-�EVALUATE�ABSOLUTE�VALUE�ASSOCIATED�WITH+*˜[SYMBOL][:OBJMOD[:SECTION]]�FROM�.DB�FILE6*‹RESOLVE‚-�MATCH�AN�ABSOLUTE�VALUE�TO�SYMBOL[+OFFSET]*7SIMBO„IDNT†2,1‘SIMBO�SYMBOL�PROCESSOR�FOR�68K�SYMBUG�II ‰OPT‡FRS¯3/82 ‰SECTIONƒ9‰XREF†IODB,MSG00¨3/82 *Â<<111484*ƒTABLES�NEEDED�WITHING�SYMBUG*"‰XREF†RCVBLK,RCVSEG,RCVBUF,RCVADDR ‰XREF†CURTCNT-‰XREF†REVISION,MODNAME,SYMNAME,OMNEXT,FHSOPEN ‰XREF†IOUT‰XREF†FHSDB0,FHSDB1#‰XREF†OMNTBL,SEGEND,FORTASK,PRSE_MD‰XREF†GLOBALª111484>> ‰XDEF†SIMBO,CALC_ADD,RESOLVE**ˆTASK�DATA�EQUATES*)HDRCNTƒEQU‡12’OBJECT�MODULE�HEADER�LENGTH/ONAME1ƒEQU‡2“OBJECT�MODULE�NAME�(FIRST�4�CHARS)5ONAME2ƒEQU‡ONAME1+4ŒOBJECT�MODULE�NAME�(LAST�4�CHARS)/OSYMCNT‚EQU‡ONAME1+8ŒOBJECT�MODULE�SYMBOL�COUNT5OLBLCNT‚EQU‡ONAME1+10‹OBJECT�MODULE�LINE�NUMBER�COUNT6ONEXTLR‚EQU‡ONAME1+12‹OBJECT�MODUL8 E�NEXT�SECTOR�NUMBER*"MAPLTHƒEQU‡8“LOAD�MAP�ENTRY�LENGTHMAPSEGƒEQU‡4“LOAD�MAP�SEGMENTMAPSECT‚EQU‡5“LOAD�MAP�SECTION"MAPCODE‚EQU‡6“LOAD�MAP�MODULE�CODE*"BUFOMNƒEQU‡$60‘TASKBUF�OMNTBL�ADDRBUFMAPƒEQU‡$64‘TASKBUF�MAP�ADDR$BUFMAPE‚EQU‡$68‘TASKBUF�MAP�END�ADDR'BUFOMHI‚EQU‡$6C‘TASKBUF�HIGHEST�OM�CODE-BUFCURO‚EQU‡$6E‘TASKBUF�PC�CURRENT�OBJ�MODULE*BUFCURS‚EQU‡$70‘TASKBUF�PC�CURRENT�SECTION%BUFSEGI‚EQU‡$71‘TASKBUF�SEGMENT�INDEX&BUFSEG0‚EQU‡$EC‘TASKBUF�SEG0�BASE�ADDR&BUFSEG1‚EQU‡$F0‘TASKBUF�SEG1�BASE�ADDR&BUFSEG2‚EQU‡$F4‘TASKBUF�SEG2�BASE�ADDR&BUFSEG3‚EQU‡$F8‘TASKBUF�SEG3�BASE�ADDR!BUFFHSƒEQU‡$FC‘TASKBUF�FHSDB�ADDR*"TVBUF„EQU‡8“TASK�VECTOR�A(TASKBUF)/TVDBIDƒEQU‡30’TASK�VECTOR�DBID�(RELATIVE�TASK#)‰PAGE*<*‚THIS�SECTION�READS�IN�.DB�FILE�AND�SETS�UP�IN-CORE�TABLES.&*„CALLED�IN�RESPONSE�TO�"ATTA"�COMMAND0*„MUST�DETERMINE�IF�INITIAL�OR�SUBSEQUENT�ATTACH *ŽA4�=�TASK�VECTOR�ADDRESS"*ŽA5�=�FHSTASK�WITHIN�LOADER�BLOCK$*ŽA6�=�BASE�ADDRESS�OF�B�(SECTION�0)*ôBý50 .49%8-056=,E$SIMBO„MOVEM.LƒD0-D7/A1-A6,-(A7)¡1/81(‰LEA‡RCVBUF(A6),A0‡BUFFER�FOR�RCVSAŽ3/82*‰MOVE.L„A0,-4(A0)‹INIT�BUFFER�ADDRESS‹3/820‰LEA‡FHSDB0(A6),A0‡FIRST�OF�MANY�.DB�FHSES'†3/820‰MOVE.W„TVDBID(A4),D5‡TASK�DBID�REQUIRED�BY�IODB‰MOVE.W„D5,D0�CALC�FHS�OFFSET‰MULS†#38,D0ŽFHSLTH�=�38‰ADD.L…D0,A0�A(THIS�TASKS�FHS)‰TST.L…20(A0)ŽPRIOR�OPENING?"*******‚BNE‡NOOPENŽYES�-�EXIT”3/82*‰LEA‡6(A0),A2ŒBEGIN�COPYING�AT�VOLUME�NAME"‰MOVE.L„(A5)+,(A2)+‰COPY�VOLUME�ID ‰MOVE.W„(A5)+,(A2)+‰COPY�USER�ID ‰MOVE.L„(A5)+,(A2)+‰COPY�CATALOG‰MOVE.L„(A5)+,(A2)+!‰MOVE.L„(A5)+,(A2)+‰COPY�FILENAME‰MOVE.L„(A5)+,(A2)+0‰LEA‡GLOBAL(A6),A5‡COMMON�BASE�REG�FOR�IODB†3/824‰MOVE.L„FHSOPEN-GLOBAL(A5),D0†ANY�OPEN�TO�DATE?†3/82-‰BEQ.S…OPENERŽNO�-�THEN�SKIP�CLOSE�OF�CURRENT!‰MOVE.L„A0,A1�SAVE�A(FHS)�TO�OPEN‰MOVE.L„D0,A0�A(FHS)�TO�CLOSE)‰MOVE.W„#4,(A0)�CLOSE�COMMAND�TO�FHSBLOCK‰TRAP†#3’PERFORM�CLOSE‰BNE‡IOERR�FAILED$‰MOVE.L„A1,A0�RESTORE�A(FHS)�TO�OPEN&OPENERƒMOVE.W„#$40,(A0)‹ASSIGN�COMMAND‰TRAP†#3’PERFORM�ASSIGN‰BNE‡NOOPENŽNO�.DB�FILE�TO�OPEN;‰MOVE.L„A0,FHSOPEN-GLOBAL(A5)ƒFLAG�FHS�AS�CURRENT�OPEN‚3/82#‰MOVE.L„TVBUF(A4),A1ˆA(TASK�BUFFER)/‰MOVE.L„A0,BUFFHS(A1)‡SAVE�FHSDB�THIS�TASKŠ3/82‰CLR.L…D2’OBJECT�MODULE�CODE?‰MOVE.L„OMNEXT-GLOBAL(A5),A2�HIGH�H2O�MARK�FOR�NEXT�OMNTBL�3/82:‰MOVE.L„A2,BUFOMN(A1)‡SAVE�A(OMNTBL�START)�IN�TASKS�BUFFER#‰CLR.L…D1’OREC�REQUEST�CODE�IS�ZERO%‰CLR.L…D6’REQUEST�LR=0�IS�HEADERˆ3/82!‰BSR‡IODB�READ�HEADER�RECORDŒ1/82‰BNE‡IOERR�READ�FAILED*‰MOVE.L„(A0),D0�REVISION�&�INTEGRITY�CODES@‰CMP.L…REVISION-GLOBAL(A5),D0�VERIFY�CORRECT�.DB�FILE�MATCH�3/82‰BNE‡VERERRŽOUT�OF�SYNC*6*ˆRECEIVE�SEGMENT�ATTRIBUTES�TO�RELOCATE�USER�SEGMENTS*0‰MOVE.L„#28,D3ŽOFFSET�OF�SEG3�NAME�IN�HEADER�REC#‰MOVE.L„A0,A3�A(HEADER�RECORD)Ž3/82/‰LEA‡RCVBLK-GLOBAL(A5),A0ƒRCVSA�PARM�BLOCK‹3/82‰MOVE.L„(A4),(A0)‹TASKNAME–3/82"‰MOVE.L„4(A4),4(A0)‹&�SESSION“3/82CSEGLOOP‚MOVE.L„0(A3,D3),12(A0)…SEGMENT�NAME�FROM�HEADER�RECORD�3/82#‰MOVEQ.Lƒ#9,D0�RCVSA�DIRECTIVE�3/82 ‰TRAP†#1°3/82‰MOVE.W„#BUFSEG0-16,D0¤3/82*‰ADD.W…D3,D0�INDEX�INTO�BUFSEG0,1,2,3†3/828‰MOVE.L„34(A0),0(A1,D0)…BEG�LOGICAL�ADDR�TO�BUFSEGXƒ3/82&‰SUBQ.L„#4,D3�DID�ALL�4�SEGMENTS?‹3/820‰CMP.W…#16,D3ŽOFFSET�OF�SEGMENT�0�NAME�IN�HEADER‰BGE‡SEGLOOP�NOT�DONE�YET’3/82 9‰MOVE.W„HDRCNT(A3),D3‡OBJECT�MODULE�COUNT�FROM�HEADER�REC/‰MOVE.W„D3,D7�SAVE�FOR�VERIFICATION�OF�CHAINING‰ASL.W…#4,D3�COUNT�*�16 ‰SUB.W…D7,D31‰SUB.W…D7,D3�COUNT�*�14�=�SPACE�NEEDED�FOR�OMNTBL#‰MOVE.L„A2,A3�CALC�A(LOADMAP)�TABLE‰ADD.W…D3,A3�A(LOADMAP)%‰MOVE.L„A3,BUFMAP(A1)‡SAVE�A(LOADMAP)7‰MOVE.L„A3,BUFMAPE(A1)†A(END�LOADMAP)�-�CURRENTLY�EMPTY+‰MOVE.L„#$FFFFFFFF,(A3)…END�FLAG�TO�LOADMAP#‰MOVE.L„#1,D6�LR�OF�FIRST�ORECŽ3/82*K*‚READ�OBJECT�MODULE�HEADER.‚COMPUTE�AND�STORE�LR�OF�CUR8 RENT�OBJECT�MODULE,>*„SYMBOL�INDEX�START�(IF�ANY),�AND�LINE�NUMBER�START�(IF�ANY).*4READO„BSR‡IODB�REQUEST�CODE�OF�ZERO�STILL�IN�D1�1/82‰BNE‡IOERR�READ�FAILED:‰MOVE.L„ONAME1(A0),0(A2,D2)�FIRST�4�CHAR�OF�NAME�TO�OMNTBL9‰MOVE.L„ONAME2(A0),4(A2,D2)�LAST�4�CHAR�OF�NAME�TO�OMNTBL-‰MOVE.W„D6,8(A2,D2)‰LR�OF�OREC�TO�OMNTBLŠ3/82*I*‚IF�THERE�ARE�NO�SYMBOLS�IN�THIS�MODULE,�INSERT�A�ZERO�FOR�THE�LR�OF�THED*„INDEX�RECORD.‚OTHERWISE,�COMPUTE�THE�LR�OF�THE�INDEX�RECORD�AS�THEF*„(NUMBER�OF�SYMBOLS+1)/16‚-->‚I.E.�1�LR�PAST�THOSE�OF�SYMBOL�RECORDS.*/‰MOVE.W„OSYMCNT(A0),D0†SYMBOL�COUNT�THIS�OBJMOD‰BNE.S…GRTR0�SYMBOLS�EXIST.‰CLR.L…10(A2,D2)‹NO�SYMBOLS�EXIST,�USE�LR�OF�00‰ADD.L…#1,D6�UPDATE�NEXT�LR�FOR�THIS�OBJMOD�3/82!‰BRA.S…DOLINES�GET�LINE�NUMBER�LRGRTR0„ADD.W…#31,D0ŽROUND�UP�+�1#‰ASR.W…#4,D0�SRECS�=�(SYMS�+�15)/16‰ADD.W…D0,D6�LR�OF�IREC”3/82.‰MOVE.W„D6,10(A2,D2)ˆLR�OF�IREC�TO�OMNTBLŠ3/82!‰ADD.W…#62,D0ŽROUND�UP�SREC�COUNT*‰ASR.W…#6,D0�IREC�OFFSET�=�(SRECS�+�63)/64#‰ADD.W…D0,D6�LR�OF�LREC�IF�ANY�3/82*J*‚IF�THERE�ARE�NO�LINE�NUMBERS�IN�THIS�MODULE,�INSERT�A�ZERO�FOR�THE�LR�OFG*„THE�LINE�#�RECORD.‚OTHERWISE,�THE�LR�OF�THE�LINE�#�RECORD�IS�ONE�PASTF*„THE�HEADER/SYMBOL/INDEX�RECORD(S).‚COMPUTE�THE�LR�OF�THE�NEXT�MODULEF*„HEADER�AS�(NUMBER�OF�LINE�#'S+1)/64‚-->‚I.E.�1�LR�PAST�THOSE�OF�LINE*„NUMBER�RECORDS.*?DOLINES‚MOVE.W„OLBLCNT(A0),12(A2,D2)�TEMP�LR�OF�LREC�(MAY�BE�0)$‰BEQ.S…NOLINES�OMNTBL�ENTRY�COMPLETE3‰MOVE.W„D6,12(A2,D2)ˆTRUE�LR�OF�LREC�TO�OMNTBL…3/82"‰MOVE.W„OLBLCNT(A0),D0†LABEL�COUNT‰ADD.W…#63,D0ŽROUND�UP'‰ASR.W…#6,D0�LSEC�COUNT�=�(LINES+63)/640‰ADD.W…D0,D6�COMPUTED�LR�NEXT�OBJMOD�IF�ANY�3/82CNOLINES‚CMP.W…ONEXTLR(A0),D6†VERIFY�NEXT�OREC�LR�WITH�CHAIN�LR�3/82‰BEQ.S…DOMAP�OK.7‰TST.W…ONEXTLR(A0)‰CHECK�IF�LAST�OBJMOD�(CHAIN�IS�ZERO)‰BNE‡VERERRŽWRONG�CHAIN�LR*F*‚BUILD�MAP�OF�MODULE/SECTION�START�ADDRESSES.‚INSERT�ENTRIES�FOR�EACHD*„MODULE�AS�IT�IS�PROCESSED,�BUILDING�THE�TABLE�IN�ASCENDING�ADDRESS*„ORDER.*;DOMAP„MOVE.L„#12,D0ŽINITIAL�OFFSET�-4�FOR�SECTION�ADDRESSES-NEXTSECT�ADD.L…#4,D0�OFFSET�NEXT�SECTION�SLOT%‰CMP.L…#256,D0�FINISHED�ALL�SECTIONS?0‰BGE.S…NEXTO�YES�-�PROCEED�TO�NEXT�OBJMOD�RECORD,‰MOVE.L„0(A0,D0),D3‰POSSIBLE�SECTION�ADDRESS‰BMI‡NEXTSECTŒDUMMY�ENTRY/‰AND.L…#$00FFFFFF,D3‡MASK�OFF�SECTION�CODE‰4/827‰MOVE.L„BUFMAPE(A1),A3†LOADMAP�ENTRY�SCAN�BEGINS�AT�END;MAPSLOT‚CMP.L…(A3),D3�ADDRESS�>�EXISTING�SLOT�ENTRY�IN�MAP?-‰BHI.S…INSERTŽYES�-�INSERT�IN�ASCENDING�ORDER1‰BEQ‡MAPERRŽTWO�SECTIONS�WITH�SAME�RELOCATED�ADDR/‰MOVE.L„(A3),MAPLTH(A3)…SHIFT�DOWN�TO�MAKE�ROOM<‰MOVE.L„4(A3),MAPLTH+4(A3)‚ENTIRE�SLOT�ENTRY�IN�LOADMAP‚3/82&‰SUB.L…#MAPLTH,A3ŠNEXT�SLOT�IN�LOADMAP+‰CMP.L…BUFMAP(A1),A3‡PAST�START�OF�LOADMAP?‰BHS‡MAPSLOT�NOT�YETAINSERTƒMOVE.L„D3,MAPLTH(A3)‡INSERT�IN�SLOT�ABOVE�CURRENT�POSITION5‰ADD.L…#MAPLTH,BUFMAPE(A1)�NEW�END�OF�LOADMAP�ADDRESS5‰MOVE.L„SEGEND-GLOBAL(A5),D3‚PREPARE�FOR�COMPARE‰3/82/‰CMP.L…BUFMAPE(A1),D3†PAST�END�OF�GTSEGED�AREA? ‰BLO.S…MAPFULL�YES�-�FATAL�ERROR2‰MOVE.L„D0,D3�CONVERT�OFFSET�TO�SECTION�#�OF�ENTRY ‰SUB.L…#16,D3&‰ASR.W…#2,D3�SECTION�#�=�(OFFSET-16)/47*ˆMOVE.B„MAPLTH(A3),MAPSEG+MAPLTH(A3)�SEGMENT�#�TO�SLOT,*ˆCLR.B…MAPLTH(A3)ŠPURIFY�24�BIT�MAP�ADDRESS0‰MOVE.B„0(A0,D0),MAPSEG+MAPLTH(A3)�SEG�#�TO�SLOT/‰MOVE.B„D3,MAPSECT+MAPLTH(A3)†SECTION�#�TO�SLOT>‰MOVE.W„D2,MAPCODE+MAPLTH(A3)†OBJMOD�CODE�=�OFFSET�INTO�OMNTBL ‰BRA‡NEXTSECT*H*‚CHECK�FOR�ALL�MODULES�PROCESSED.‚ALSO�VERIFY�THAT�LAST�MODULE�ACTUALLY*„DOES�POINT�BACK�TO�START.*4NEXTO„ADD.W…#14,D2ŽNEXT�OBJMOD�CODE�(OFFSET�FROM�A2)‰SUB.W…#1,D7�LAST�OBJMOD?‰BEQ.S…LASTO�YES8‰MOVE.W„D6,ONEXTLR(A0)†HAVE�LEGAL�LR�FOR�NEXT�OREC?‚3/82‰BNE‡READO�YES�-�GO�DO�IT(‰BRA.S…VERERRŽBAD�COUNT�OR�MISSING�OLINK.LASTO„TST.W…ONEXTLR(A0)‰SHOULD�HAVE�ZERO�OLINK*‰BNE.S…VERERRŽLAST�OREC�BY�COUNT�HAD�OLINK;‰MOVE.W„D2,BUFOMHI(A1)†SAVE�LAST�OMNTBL�CODE�FOR�WRAPAROUND5‰MOVE.L„BUFMAPE(A1),OMNEXT(A6)�NEW�HIGH�H2O�MARKŠ3/82 -‰MOVE.L„#3,D3�REMAP�ALL�4�BUFSEG�ENTRIES„3/824FIXSEGS‚MOVE.L„BUFMAP(A1),A3‡TASK�9 LOADMAP�TABLEŒ3/82=NEXTMAP‚CMP.B…MAPSEG(A3),D3‡LOWEST�SECTION�THIS�SEGMENT?‚3/82‰BEQ.S…GOTSEGŽYES›3/82)‰ADD.L…#MAPLTH,A3ŠNEXT�LOADMAP�ENTRYŒ3/820‰CMP.L…BUFMAPE(A1),A3†END�OF�LOADMAP�TABLE?‰3/82‰BLO‡NEXTMAP�NOT�YET—3/82*‰BRA.S…NEXTSEG�YES�-�SEGMENT�NOT�USEDˆ3/82,GOTSEGƒMOVE.L„D3,D1�CALC�BUFSEGX�OFFSET‹3/82/‰ASL.L…#2,D1�SEG#�TIMES�4�=�BUFSEG0�OFFSET�3/82/‰ADD.W…#BUFSEG0,D1‰OFFSET�INTO�TASK�BUFFER‡3/820‰MOVE.L„0(A1,D1),D0‰SEGMENT�LOGICAL�ADDRESS‡3/82(‰SUB.L…(A3),D0�MINUS�LOADMAP�OFFSETŠ3/821‰MOVE.L„D0,0(A1,D1)‰ADJUSTED�SEGMENT�ADDRESS†3/829NEXTSEG‚DBF‡D3,FIXSEGSŠLOOP�4�EACH�SEGMENT�(3,2,1,0)�3/82 NOOPENƒMOVEM.Lƒ(A7)+,D0-D7/A1-A6‰RTS*:*‚.DB�FILE�PROCESSING�ERROR.‚CAUSES�TERMINATION�OF�PROGRAM*>MAPFULL‚MOVE.L„#128,D7�OUT�OF�GTSEG�MEMORY�FOR�OMNTBL+MAP�3/82‰BRA.S…COMPLAIN=MAPERRƒMOVE.L„#132,D7�DUPLICATE�SECTION�ADDRESSES�IN�MAP�3/82‰BRA.S…COMPLAIN1IOERR„MOVE.L„#136,D7�OPEN�OR�CLOSE�FHS�ERROR‡3/82%‰BRA.S…COMPLAINŒINDEX�TO�MSGADR�IN�D7/VERERRƒMOVE.L„#140,D7�DB�FILE�FORMAT�ERRORŠ3/82-COMPLAIN�BSR‡MSG00�PRINT�FAILURE�MESSAGE‰3/82ABORT„MOVE.L„#14,D0‰TRAP†#1’ABORT‰PAGE*C*‚CALC_ADDRESS(�Var�VALUE�:�Integer;‚Var�STRNG�:�STR80�)�:�Boolean;*I*‚THIS�IS�ENTRY�POINT�TO�SIMBO�SYMBOL�PROCESSOR.‚UPON�ENTRY�TO�SIMBO,�THE*„STACK�MUST�LOOK�LIKE�THIS�:*$*„A7�--->�RETURN�ADDRESS‚(�4�BYTES�)*ŒSTRING�ADDRESS‚(�4�BYTES�)*ŒVALUE�ADDRESSƒ(�4�BYTES�)*ŒSUCCESS�FLAG„(�1�BYTE‚)*7*‚ON�EXIT�FROM�SIMBO,�THE�STACK�SHOULD�LOOK�LIKE�THIS�:*!*„A7�--->�SUCCESS�FLAG„(�1�BYTE‚)*I*‚NOTE:�INTEGRITY�OF�ADDRESS�REGISTERS�A3,�A5,�AND�A6�MUST�BE�PRESERVED�!*œA5�--->�GLOBAL�IN�DATA�AREA3CALC_ADD�MOVEM.LƒA3/A5/A6,-(A7)‹SAVE�REGISTERS‹1/82)‰MOVE.L„16(A7),A1‹GET�STRING�ADDRESSŒ1/82,‰CLR.B…24(A7)ŽPRESET�TO�NO�SYMBOL�MATCH…1/82*F*‚DETERMINE�LENGTH�OF�INPUT�STRING.‚FIRST�BLANK�CHAR�TERMINATES�STRING*‰CLR.L…D1’CLEAR�CHAR�COUNTER'NXTCH„CMP.B…#'�',(A1,D1)ˆCHAR�=�SPACE�? ‰BEQ.S…ENDSTRŽYES,�END�OF�STRING'‰ADD.B…#1,D1�NO,�INCREMENT�CHAR�COUNTER ‰BRA.S…NXTCH***‚SET�UP�FOR�SEARCH�OF�OBJECT�MODULE�TABLE*FENDSTRƒMOVE.L„FORTASK-GLOBAL(A5),A4�FOREGROUND�TASKS�VECTOR�TABLE�3/820‰TST.W…CURTCNT-GLOBAL(A5)‚ANY�TASKS�ACTIVE?�3/824‰BEQ‡NOTFOUNDŒNO�SYMBOLS�ALLOWED�IF�NO�FOREGRND�3/821‰MOVE.L„TVBUF(A4),A6ˆTASKS�BUFFER„(USUALLY�IN�A1)'‰MOVE.L„BUFOMN(A6),D0‡TASKS�OMNTBL�ADDR)‰BEQ‡NOTFOUNDŒNO�DB�SYMBOL�FILE�THIS�TASK-‰MOVE.L„D0,A2�THIS�IS�REALLY�WHERE�IT�BELONGS!‰CLR.L…D0’RESET�CHARACTER�POINTER-‰CLR.L…D3’RESET�FLAG�TO�UNQUALIFIED�REFERENCE‰CLR.L…D2’RESET�MOD�NAME�CODE3‰MOVE.W„BUFCURO(A6),D2†USE�CURRENT�OBJMOD�CODE‡9/836‰MOVE.B„BUFCURS(A6),D3†USE�CURRENT�OBJMOD�SECTION„9/830‰LEA‡MODNAME-GLOBAL(A5),A3†BLANK�FILL�NAMES‡3/82‰MOVE.L„#'„',(A3)Š(SYMBOL‰MOVE.L„(A3),4(A3)”AND‰MOVE.L„(A3),8(A3)˜MODULE)‰MOVE.L„(A3),12(A3)*.*‚CHECK�INPUT�STRING�FOR�MODULE�NAME�REFERENCE*0SCANINƒCMP.B…#':',(A1,D0)ˆMODULE�NAME�REFERENCE?‰BEQ.S…QUALIFIDŒYES%‰ADD.B…#1,D0�NOT�YET,�CHECK�NEXT�CHAR)‰CMP.B…D0,D1�ENTIRE�INPUT�STRING�SCANNED?‰BGT‡SCANINŽNO,�CONTINUE‰BRA.S…HAVEOBJ*H*‚INPUT�STRING�CONTAINS�EXPLICIT�OBJECT�MODULE�QUALIFICATION.‚SET�MODULEG*„NAME�QUALIFIER�FLAG�AND�COPY�IT�TO�MODULE�NAME�STRING.‚ALSO�CHECK�FOR'*„EXPLICIT�SECTION�NUMBER�QUALIFICATION*QUALIFID�MOVE.L„D0,D7�SAVE�A(:)$*�9/83ƒOR.B†#1,D3�SET�QUALIFIED�FLAG-MOVENAME�ADD.B…#1,D7�INCREMENT�STRING�POINTER!‰CMP.B…D7,D1�END�OF�INPUT�STRING?‰BLE.S…MOVEDNAMŒYES,�QUIT-‰CMP.B…#':',(A1,D7)ˆNO,�SECTION�#�SPECIFIED�?%‰BEQ.S…FULLQUALŒYES,�EVALUATE�SECTION<‰MOVE.B„(A1,D7),(A3)+‡NO,�COPY�MODNAME�CHAR�TO�MODULE�STRING‰BRA‡MOVENAMEŒCONTINUE*C*‚IF�SECTION�NUMBER�ENTERED,�SET�FLAG�AND�CONVERT�FROM�ASCII�TO�HEX*4FULLQUAL�BSET†#15,D3ŽSET�SECTION�QUALIFIER�FLAG„9/83/‰BSR‡ASC2HEX�CONVERT�SECTION�NUMBER�TO�HEX�1/82,‰MOVE.B„D6,D3�OVERRIDE�WHEREAMI�SECTION…9/83*D*‚CHECK�MODULE�NAME�TABLE�FOR�A�MATCH.‚IF�FOUND,�SAVE�ITS�CODE�IN�D2*%MOVEDNAM�CLR.L…D2’GET�INDEX�TO�OMNTBL5‰MOVE.L„D0,D1�NE9 W�SYMBOL�LENGTH�EXCLUDES�:OBJMOD:SECT=‰MOVEM.LƒMODNAME-GLOBAL(A5),D4/D5ƒGET�MODULE�NAME�STRING�3/82>LOOKUPƒCMP.L…(A2,D2),D4ŠFIRST�4�CHARS�MATCH�MOD�NAME�IN�TABLE?'‰BNE.S…NEXTMOD�NO,�TRY�NEXT�MODULE�NAME,‰CMP.L…4(A2,D2),D5‰YES,�LAST�4�CHARS�MATCH�?!‰BEQ.S…HAVEOBJ�YES,�EXACT�MATCH�!*3NEXTMOD‚ADD.L…#14,D2ŽINCREMENT�OFFSET�TO�NEXT�ENTRY5‰CMP.W…BUFOMHI(A6),D2†AT�END�OF�MODULE�NAME�ENTRIES�?+‰BLT.S…LOOKUPŽNO,�TRY�NEXT�MODULE�NAME†3/82,‰BRA‡NOTFOUNDŒYES,�PAST�THE�END�OF�THE�TABLE*/*‚ARE�WE�LOOKING�FOR�A�LINE�NUMBER�EVALUATION�?*HAVEOBJ‚CLR.L…D0#‰MOVE.W„TVDBID(A4),D5‡DBID�FOR�IODB!‰CMP.B…#'#',(A1)‹LINE#�REFERENCE?&‰BNE.S…NOLINEŽNO,�LOOKING�FOR�SYMBOL�?*K*‚THIS�SECTION�DETERMINES�ADDRESS�VALUE�OF�LINE�NUMBER.‚ONLY�CURRENT�MODULE5*„(THE�ONE�RESOLVED�BY�LINE�NUMBER�ENTRY)�IS�CHECKED.*!‰CLR.L…D7’YES,�SET�LINE�#�POINTER'‰BSR‡ASC2HEX�CONVERT�LINE�#�TO�HEX‰1/82‰TST.L…D6’POSITIVE�LINE�#�?%‰BLE‡NOTFOUNDŒREJECT�ILLEGAL�LINE�#'S/*******‚MOVE.L„D6,A5�RESULT�TO�A5�FOR�IODB‰3/82'‰MOVE.L„#-1,D1ŽYES,�LINE�#�REQUEST�CODE#‰BSR‡IODB�GET�LINE�#�REFERENCEŠ1/82‰BNE‡NOTFOUNDŒNOT�FOUND)‰MOVE.L„(A0),D6�SAVE�LINE�#�ADDRESS�IN�D6 ‰BRA.S…FOUND*5*‚NOT�LOOKING�FOR�LINE�NUMBER.‚LOOKING�FOR�A�SYMBOL�?*+NOLINEƒCMP.B…#':',(A1)‹WAS�THERE�A�SYMBOL�?2‰BEQ.S…NOSYM�NO,�LOOKING�FOR�MODULE�BASE�ADDRESS�!*G*‚THIS�SECTION�RESOLVES�SYMBOL�AS�TO�MODULE:SECT.‚FIRST,�COPY�SYMBOL�TO*„SYMBOL�NAME�STRING*;‰LEA‡SYMNAME-GLOBAL(A5),A3‚YES,�PREPARE�TO�MOVE�SYMBOLƒ3/82?COPYING‚MOVE.B„(A1,D0),(A3)+‡EFFECTIVELY�BLANK�PAD�SYMBOL�RIGHT(‰ADD.B…#1,D0�INCREMENT�CHARACTER�COUNTER‰CMP.B…#8,D0�MAX�OF�8�CHARS?‰BGE.S…HAVESYM�YES,�FINISHED3‰CMP.B…D0,D1�NO,�COPIED�UP�TO�COLON�OR�TOTAL�TYPED?‰BGT‡COPYING�NO,�CONTINUE*;*‚CHECK�MODULE�FOR�SYMBOL.‚WHEREAMI�MODULE�IF�NOT�SPECIFIED*3HAVESYM‚EQU‡*“YES,�D1�MUST�BE�>0�FOR�SYMBOL�REQUEST0‰BSR‡IODB�SEE�IF�SYMBOL�IS�IN�THIS�MODULE�(ONLY) ‰BNE.S…NOTFOUN�NOT�FOUND�(ERROR)/*�9/83ƒTST.B…D3’EXPLICIT�MODULE�NAME�PROVIDED�?.*�9/83ƒBNE.S…NOTFOUNDŒYES,�SYMBOL�WASN'T�THEREI*�9/83ƒCMP.B…#1,PRSE_MD-GLOBAL(A5)�NO,�PARSE�MODE�=�1�?�(ASSEMBLING)�3/82&*�9/83ƒBEQ.S…NOTFOUNDŒYES,�STOP�SEARCH-*�9/83ƒADD.L…#14,D2ŽNO,�TRY�NEXT�OMNTBL�ENTRY*6*TRYMODƒCMP.W…BUFCURO(A6),D2†HAVE�WE�COME�FULL�CYCLE�?7*�9/83ƒBEQ.S…NOTFOUNDŒYES,�SYMBOL�NOWHERE�TO�BE�FOUND�!-*�9/83ƒCMP.W…BUFOMHI(A6),D2†WRAPAROUND�TIME�?9*�9/83ƒBLT‡HAVESYM�NO,�SEARCH�THIS�MODULE�FOR�SYMBOL�3/82+*�9/83ƒCLR.L…D2’YES,�START�AT�TOP�OF�OMNTBL2*�9/83ƒBRA‡TRYMOD�BUT�FIRST�CHECK�IF�WE�BEGAN�HERE*I*‚IF�SYMBOL�FOUND,�GET�ITS�RELATIVE�OFFSET.‚IF�SYMBOL�IS�NOT�A�LABEL,�THE-*„RELATIVE�VALUE�FIELD�IS�ITS�ABSOLUTE�VALUE.*GETBASE‚CLR.L…D62‰MOVE.L„12(A0),D0‹GET�SYMBOL�ABSOLUTE�OFFSET�VALUE#‰CMP.B…#16,11(A0)ŠABSOLUTE�SECTION?0‰BGE.S…ADDOFFŽOFFSET�INCLUDES�ABSOLUTE�BASE�ADDR,*�7/83ƒCMP.B…#'L',10(A0)‰IS�SYMBOL�A�LABEL�?&*�7/83ƒBNE.S…ADDOFFŽNO,�ABSOLUTE�VALUE9‰MOVE.B„11(A0),D6‹YES,�GET�SECTION�ASSOCIATED�WITH�SYMBOL!‰BRA.S…NOSECTŽCOMPUTE�BASE�OFFSET*I*‚COME�HERE�TO�EVALUATE�':MODULE[:SECTION]'.‚BOTH�MODULE�CODE�AND�SECTIONF*„MUST�MATCH.‚IF�NO�SECTION�WAS�EXPLICITLY�SPECIFIED,�USE�THE�ONE�THATG*„THE�PC�IS�CURRENTLY�POINTING�TO.‚ON�ENTRY�TO�'NOSYM',�D0�MUST�EQUAL�0**NOSYM„BTST†#15,D3ŽSECTION�QUALIFIER�?‹9/83)‰BNE.S…NOSECTŽYES,�USE�CALCULATED�SECTION6‰MOVE.B„BUFCURS(A6),D6†NO,�GET�CURRENT�SECTION�FROM�PC*J*‚THIS�SECTION�WILL�SCAN�THE�MAP�TABLE�FOR�A�SPECIFIED�MODULE�AND�SECTION.G*„D1�SET�ACCORDING�TO�SUCCESS�OF�OPERATION.‚A3�WILL�POINT�TO�ADDRESS�OF*„BASE�VALUE�OF�:MODULE:SECT.*@NOSECTƒMOVEM.LƒBUFMAP(A6),A3-A4„GET�LOAD�MAP�START�&�END�ADDRESS*NXTENTƒCMP.W…6(A3),D2ŒMODULE�CODES�EQUAL�?"‰BEQ.S…CODEHIT�YES,�CHECK�SECTIONS2MOVEPTR‚ADD.L…#MAPLTH,A3ŠNO,�INCREMENT�MAP�POINTER"‰CMPA.L„A3,A4�AT�END�OF�LOAD�MAP�?‰BGT‡NXTENTŽNO,�CONTINUE1NOTFOUN‚BRA.S…NOTFOUNDŒYES,�MODULE:SECT�NOT�FOUND*9*‚IF�MODULE�CODES�MATCH,�CHECK�MODULE�SECTION�FOR�A�MATCH*2CODEHIT‚CMP.B…MAPSECT(A3),D6†SECTIONS�EQUAL�?Ž3/82+: ‰BNE‡MOVEPTR�NO,�TRY�NEXT�ENTRY�IN�LOAD�MAP ‰CLR.L…D6:‰MOVE.B„MAPSEG(A3),D6‡SEGMENT�CONTAINING�THIS�SECTION�3/821‰ASL.B…#2,D6�SEG�#�*�4�IS�INDEX�INTO�BUFSEG0�3/829‰MOVE.B„D6,BUFSEGI(A6)†SAVE�SEG�INDEX�IN�TASK�BUFFER�3/82,‰ADD.W…#BUFSEG0,D6‰OFFSET�OF�BASE�ADDRSŠ3/821‰MOVE.L„0(A6,D6),D6‰SEGMENT�LOW�BASE�ADDRESS†3/82&‰CMP.B…#':',(A1)‹SYMBOL�PROVIDED?Ž9/83/‰BNE.S…ADDOFFŽYES�-�MODULE�OFFSET�INCLUDED‚9/830‰ADD.L…(A3),D6�ADD�MODULE�OFFSET�IN�SEGMENT‚3/827ADDOFFƒADD.L…D0,D6�ADD�OFFSET�OF�SYMBOL�IN�SECTION�3/82*>*‚SET�SUCCESS�FLAG�AND�SAVE�VALUE�(IF�FOUND).‚RETURN�TO�CALLER**FOUND„OR.B†#1,24(A7)‹SET�SUCCESS�FLAGŽ1/827NOTFOUND�MOVEM.Lƒ(A7)+,A3/A5/A6†RESTORE�SAVED�REGSŒ1/827‰MOVEM.Lƒ(A7)+,A0-A2‰GET�RETURN,STRING&VALUE�PARMS�1/82 ‰MOVE.L„D6,(A2)�STORE�VALUE“1/82‰JMP‡(A0)�RETURN*L*‚THIS�PROCEDURE�CONVERTS�AN�ASCII�DECIMAL�STRING�TO�HEXADECIMAL�EQUIVALENT.*„VALUE�IS�RETURNED�IN�D6*1ASC2HEX‚ADD.B…#1,D7�UPDATE�STRING�POINTER�FOR�':'‰CLR.L…D6’CLEAR�SUM'ASCNXTƒMULS†#10,D6ŽMULTIPLY�SUM�BY�BASE%‰MOVE.B„(A1,D7),D5ŠGET�NEXT�CHARACTER‰AND.L…#$0F,D5�MASK�ASCII�BIAS‰ADD.L…D5,D6�ADD�DIGIT�TO�SUM‰ADD.B…#1,D7�POINT�TO�NEXT�CHAR‰CMP.B…D7,D1�DONE�?‰BGT.S…ASCNXTŽNO,�CONTINUE‰RTS›YES‰PAGE*@*‚THIS�IS�MM�ENTRY�POINT�FOR�RESOLVING�AN�ABSOLUTE�ADDRESS�VALUE'*ˆON�ENTRY:�D7�=�ADDRESS�TO�BE�RESOLVED*’D0�=�0�FOR�WHEREAMI�FUNCTION&*œWHICH�RETURNS�MODULE�NAME�IN�SYMNAME*¦AND�D3=SECTION#�&�D0=OFFSET-*’D0�=�1�FOR�NEAREST�SYMBOL+[OFFSET]�FUNCTION&*œWHICH�RETURNS�SYMBOL�NAME�IN�SYMNAME*¦AND�D3=SECTION#�&�D0=OFFSET*6RESOLVE‚MOVEM.LƒD1/D2/D4-D7/A0-A6,-(A7)ŠSAVE�REGSˆ1/823‰MOVE.L„FORTASK(A6),A4†FOREGROUND�TASKS�VECTOR‡3/82&‰MOVE.L„TVBUF(A4),A3ˆTASKS�BUFFER’3/82:‰LEA‡SYMNAME(A6),A1†GET�ADDRESS�OF�RESOLUTION�STORAGE�3/82)‰MOVE.L„#'„',(A1)ˆCLEAR�FIRST�4�LOCATIONS)‰MOVE.L„(A1),4(A1)ŠCLEAR�LAST�4�LOCATIONS4‰MOVE.L„A1,A0�WHEN�NODBSYM�WILL�COPY�SYMNAME�TO�SELF<‰MOVE.L„BUFOMN(A3),D2‡GET�ADDRESS�OF�OBJECT�MODULE�TABLE3/82'‰BEQ.S…UNRSLVD�NO�DB�FILE�FOR�THIS�TASK(‰MOVE.L„D2,A2�IODB�NEEDS�A(OMNTBL)�IN�A2 ‰CLR.L…D25‰MOVE.B„BUFSEGI(A3),D2†GET�CURRENT�SEGMENT�INDEX…3/826‰ADD.W…#BUFSEG0,D2‰OFFSET�INTO�TASK�BUFFER�SEGTBL�3/825‰SUB.L…0(A3,D2),D7‰RELOCATE�NONZERO�BASE�SEGMENT�3/82-‰TST.W…D0’D0=1�FOR�NEAREST�SYMBOL�TO�ABS�ADDR5‰BEQ.S…WHEREAMIŒD0=0�FOR�MODULE�NAME+SECT�OF�ABS�ADDR6‰MOVE.W„BUFCURO(A3),D2†GET�MODULE�CODE�FOR�'IODB'„3/827‰MOVE.B„BUFCURS(A3),D3†GET�SECTION�CODE�FOR�'IODB'ƒ3/82+‰MOVE.L„#-2,D1ŽCODE�FOR�SCAN�OF�ALL�SYMBOLS#‰MOVE.W„TVDBID(A4),D5‡DBID�FOR�IODB-‰LEA‡GLOBAL(A6),A5‡IODB�REFERS�TO�GLOBAL‰3/82$‰BSR‡IODB�SCAN�FOR�SYMBOL�MATCH‰1/82‰BEQ.S…RESOLVEDŒFOUND�IT�Carriage�ReturnŒ}5‚REGNUM‡=�18;Œ{�Number�of�Registersƒ(�0�..�REGNUM�)…}=‚DELIM_LEN„=‚4;Œ{�The�Number�Of�Different�Options�Avaliable�}) {�As�Specified�In�Function�CHECK_DELIM†} {‚Command�Codes‚...‚}‚AS_CODE�=‚1;‚{�Address�Stopƒ}‚MA_CODE�=‚2;‚{�MAcroŠ}‚SD_CODE�=‚3;‚{�Symbol�Define‚}1‚IT_CODE�=‚4;‚{�Inside�Traceƒ}„{�NOW�UNASSIGNED�}D‚ME_CODE�=‚5;‚{�Outside�Trace‚}„{�REASSIGNED�TO�ME_CODE�MACRO�EDIT�}‚BR_CODE�=‚6;‚{�BReakpoint…} ‚DF_CODE�=‚7;‚{�Display�Format�}I‚MM_CODE�=‚8;‚{�Memory�Modify‚}�{�Parameter�Overlap�Requires�Extra�Code�}K‚MD_CODE�=�10;‚{�Memory�Display�}�{�Parameter�Overlap�Requires�Extra�Code�}‚HE_CODE�=�12;‚{�HELP‹}‚GO_CODE�=�13;‚{�GO�}ÊMR'V Z^bfjnr"vz~!‚ † ŠŽ’–šž¢¦ª®²!¶º¾Â‚BF_CODE�=�14;‚{�Block�Fill…}‚DC_CODE�=�15;‚{�Data�Convertƒ}‚DU_CODE�=�16;‚{�DUmp‹}‚DE_CODE�=�17;‚{�DEfaults‡}‚BM_CODE�=�18;‚{�Block�Move…}‚FR_CODE�=�19;‚{�File�Read†}‚FS_CODE�=�20;‚{�File�Save†}‚BS_CODE�=�21;‚{�Block�Searchƒ}!‚CR_CODE�=�22;‚{�Command�Repeat�}‚QU_CODE�=�23;‚{�QUIT‹}G‚MS_CODE�=�24;‚{�Memory�Set…}�{�Parameter�Overlap�Requires�Extra�Code�}‚TR_CODE�=�26;‚{�TRaceŠ}‚AT_CODE�=�27;‚{�ATTAch‰}‚TM_CODE�=�28;‚{�TERMinate†}‚DT_CODE�=�29;‚{�DETAch‰}‚EV_CODE�=�30;‚{�EVENtŠ}‚MK_CODE�=�31;‚{�MASK‹}‚SR_CODE�=�32;‚{�STARtŠ}‚SP_CODE�=�33;‚{�STOP‹}C‚ST_CODE�=�34;‚{�STATus‰}�{�Parameter�Overlap�Requires�Extra�Code�}‚TS_CODE�=�36;‚{�TASK‹}‚WT_CODE�=�37;‚{�WAIT‹}‚LD_CODE�=�38;‚{�LOAD‚(Task)ƒ}‚OF_CODE�=�39;‚{�OFfset‰} {‚Type�Codes‚...‚}‚HEX_TYPE�=‚1;‚DEC_TYPE�=‚2;‚OCT_TYPE�=‚3;‚BIN_TYPE�=‚4;‚CHR_TYPE�=‚5;‚FLT_TYPE�=‚6;‚INT_TYPE�=‚7;‚BOL_TYPE�=‚8;‚PCK_TYPE�=‚9;‚DIS_TYPE�=�10; {‚Length�Codes‚...‚}‚BYTE_LEN�=�1;‚WORD_LEN�=�2;‚LNGW_LEN�=�4; {‚Device�Codes‚...‚}‚CONS_DEV�=�6;‚FILE_DEV�=�2;‚PRNT_DEV�=�1; Type +‚BYTE…=�-128�..�127;�{�8-Bit�Integer�TYPE„}0‚WORD…=�-32768�..�32767;™{�16-Bit�Integer�TYPEƒ}H‚STR†=�Packed�Array[�1..BUFLENLIMIT�]�Of�Char;‚{�Character�Buffer�TYPE�}6‚STR4…=�Packed�Array[�1..4�]�Of�Char;Œ{�Command�TYPEŠ}?‚STR8…=�Packed�Array[�1..SYMLEN�]�OF�Char;‡{�Symbol�Name�TYPE†}E‚REG_BUF‚=�Array[�0..REGNUM�]�Of�Integer;‰{�Block�Of�User�Registers�}#‚{‚REG_BUF�Is�Arranged�As�; Follows�:Eˆ+----+----+-----+----+----+----+----+-----+----+----+----+----+----+I‚Regƒ|�D0�|�D1�|�...�|�D6�|�D7�|�A0�|�A1�|�...�|�A6�|�A7�|�PC�|�SR�|�XM�|Eˆ+----+----+-----+----+----+----+----+-----+----+----+----+----+----++‚Index„0„1ƒ...„6„7„8„9ƒ...ƒ14ƒ15ƒ16ƒ17ƒ18„} ‚SYM_CMD†=�Record-“CMD_LINE�:�STRŽ{�Input�String�To�Be�Parsed�}‘End;‚REG_PTR†=�Record&“SAV_REGS�:�REG_BUFŠ{�Register�BlockŒ}‘End; Var /‚STATUS_BLOCK�:�Record˜{ƒPARAMETERS�FROM�MAIN…}5“INPUT_STRING�:�@SYM_CMD;„{�Pointer�to�Input�String„}4“REGISTERS„:�@REG_PTR;„{�Pointer�To�Register�Block‚}3“OFREGS‡:�Array[�0..7�]�Of�Integer;ƒ{�OFfset�Regs�}3“OFREGL‡:�Array[�0..7�]�Of�Integer;ƒ{�OFfset�Regs�}'“MAXTCNT†:�WORD;ˆ{�Maximum�Task�Count‰}'“CURTCNT†:�WORD;ˆ{�Current�Task�Count‰}#“TASKBUF†:�Integer;…{�Task�Buffer�}/“OMNTBL‡:�Integer;…{�Object�Module�Name�Tableƒ}'“SEGEND‡:�Integer;…{�Task�Segment�End‹}'“FORTASK†:�Integer;…{�Foreground�TaskŒ}"“PARSE_MODEƒ:�BYTE;ˆ{�Parse�Mode‘}&“TOKENˆ:�BYTE;ˆ{�Parsed�Command�Codeˆ},“PARM_COUNTƒ:�BYTE;ˆ{�Number�Of�Parameters‡})“ERR_NUMBERƒ:�BYTE;ˆ{�Parser�Error�CodeŠ}2“PARM_BLOCKƒ:�Array[�1..16�]�Of�Integerƒ{�Return†}‘End;©{�Parameters‚}‚DEF_BLOCK„:�Record$“BASE,�TYPES,�LENGTH,�DEVICE�:�BYTE;$“MA_LIST,�ECHO,�BR_ENABLE„:�Boolean;(“OUTFILE•:�Packed�Array[�1..30�]�Of�Char‘End;)‚MAC_BUF†:�STR;�{�MACRO�Parameter�Block�}.‚INDEXˆ:�Integer;‹{�MACRO�Invocation�Pointer�}0‚IN_MACRO…:�Integer;‹{�Line�Of�Executing�MACROŽ}0‚ENDMACRO…:�Integer;‹{�MACRO�Table�End�PointerŽ}6‚ENDSYMB†:�Integer;‹{�Local�Symbol�Table�End�Pointer‡}-‚TABLEˆ:�Packed�Array[�1..ENDTABLE�]�Of�Char;8‚TABLE_PTR„:�Integer;‹{�Pointer�Into�MACRO/Local�Table‡}<‚SAVECOUNT„:�Integer;‹{�Saved�Count�For�MACRO�'CR'�Commandƒ}0‚IN_CRˆ:�Integer;‹{�Flag�Of�MACRO�'CR'�Command‹} '‚MAC_NAME‰:�STR8;‹{�MACRO�Name�String”}.‚NUMBER_VALUE…:�Integer;ˆ{�Number�Evaluation”}-‚ADDR_VALUE‡:�Integer;ˆ{�Address�Evaluation“}/‚EXP_VALUEˆ:�Integer;ˆ{�Expression�Evaluation�}5‚EA_VALUE‰:�Integer;ˆ{�Effective�Address�Evaluation‰}5‚REG_VALUEˆ:�Integer;ˆ{�19-Bit�Registers�EvaluationŠ}+‚SYM_VALUEˆ:�Integer;ˆ{�Symbol�Evaluation”}-‚COUNTŒ:�Integer;ˆ{�TRace/Breakpoint�CountsŽ}?‚I,�J,�K,�L‡:�Integer;ˆ{�Miscellaneous�Loop�Control�Variables�}5‚INPUT_BUFFER…:�STR;Œ{�Program�Copy�of�Input�String‰}.‚NXT_STRING‡:�STR;Œ{�Symbol�String�TemporaryŽ}-‚SYM_BUFR‰:�STR;Œ{�Symbol�Evaluation�String�}9‚LINE_NUMBER†:�STR4;‹{�Number�to�print�with�Macro�lines…}.‚MACROŒ:�Boolean;ˆ{�Flag�Of�MACRO�Invocation�}<‚DEF_BASE‰:�Boolean;ˆ{�Default�Input�Base�Designation�Flag‚}=‚NXTSTRNGLEN†:�BYTE;‹{�Length�Of�Symbol�String�(NXT_STRING)�}?‚PTR_INPUT_BUFFER�:�BYTE;‹{�Pointer�To�Input�String�For�Parse„}9‚NUMBER_PTR‡:�BYTE;‹{�Pointer�To�Valid�Number�in�String„}=‚PTR_PARM_BLOCKƒ:�BYTE;‹{�Pointer�To�Return�Parameter�Block„}9‚PTR_MAC_BUF†:�BYTE;‹{�Pointer�To�MACRO�Parameter�Block…}+‚DELIM_CHAR‡:�Char;‹{�Delimeter�Character’}4‚EOL_FLAG‰:�Boolean;ˆ{�END-OF-LINE�Flag�For�ParserŠ}9‚SAV_EOLŠ:�Boolean;ˆ{�Saved�END-OF-LINE�Flag�For�Parser„}5‚CHECK_CHAR‡:�Char;‹{�Check�Character�For�Delimeterˆ})‚NEG_FLAG‰:�Boolean;ˆ{�Unary�Minus�Flag•}2‚CHECKŒ:�Boolean;ˆ{�Individual�Option�Check�Flag‰}1‚FOUNDŒ:�Boolean;ˆ{�Any�Valid�Option�Found�FlagŠ}5‚NEXT_CHARˆ:�Char;‹{�Next�Character�in�INPUT_BUFFER‡}8‚NO_FLAGŠ:�Boolean;ˆ{�Set�By�Parser�To�Indicate�a�"NO"…}=‚EVAL_OUTDEV†:�BYTE;‹{�Contains�The�Specified�Output�DEVICE�}6‚EVAL_LENGTH†:�BYTE;‹{�Contains�The�Specified�LENGTHˆ}2‚EVAL_TYPEˆ:�BYTE;‹{�Contains�The�Specified�TYPEŠ}.‚TEMP_PTR‰:�BYTE;‹{�Copy�Of�PTR_INPUT_BUFFER�}0‚TEMP_CHARˆ:�Char;‹{�Temporary�Character�ValueŒ}%‚ERRORŒ:�BYTE;‹{�Parsing�Error�Code“}%‚CODE�:�BYTE;‹{�Parsed�Command�Code’};‚NUM_PARMSˆ:�BYTE;‹{�Number�Parameters�Parsed�For�Command�}C‚DELIM_FLAG‡:�Array[�1..DELIM_LEN�]�Of�Boolean;„{�Delimeter�Flags�}9‚COMMANDŠ:�Array[�1..NUM_CMD�]�Of�STR4;‰{�Command�Namesƒ}:‚CMD_CODE‰:�Array[�1..NUM_CMD�]�Of�BYTE;‰{�Command�Codesƒ} IFunction�CALC_ADDRESS(Va; r�VALUE:Integer;�Var�STRNG:STR):Boolean;‚Forward;JProcedure�FORCE(Var�POINT�:�Char;‚LENGTH�:�BYTE;‚CRLF�:�Boolean);‚Forward;AProcedure�INT_CH(Var�VALUE�:�Integer;�Var�POINT�:�Char);‚Forward;AProcedure�CH_INT(Var�POINT�:�Char;�Var�VALUE�:�Integer);‚Forward;Procedure�GET_INP;‚Forward;AProcedure�HEXASCII(Var�POINT�:�Char;‚Var�POINT1�:�Char);‚Forward;;Procedure�STORE_BYTE(Var�VALUE�:�Integer;‚Var�POINT�:�Char; ­Var�LENGTH�:�Integer);‚Forward; Procedure PARSE_STRING; Label‚FIN;{$E}N{*****************************************************************************�**É**�**™Parser�Routines¡**�**É**O *****************************************************************************} ‚Function�GETNXTCHAR�:�Char;?„{‚Function�GETNXTCHAR�returns�the�next�character�pointed�to�byC‡PTR_INPUT_BUFFER�from�INPUT_BUFFER;�If�an�END-OF-LINE�character�isB‡reached�or�if�PTR_INPUT_BUFFER�indicates�the�end�of�INPUT_BUFFER,?‡EOL_FLAG�is�set�to�"True";�Otherwise,�it�is�set�to�"False".‚If7‡EOL_FLAG�is�"False",�PTR_INPUT_BUFFER�is�incremented’}‚Begin„EOL_FLAG:=False;*„If�(PTR_INPUT_BUFFER�>=�BUFLENLIMIT)�Then„Begin%†EOL_FLAG:=True;‚GETNXTCHAR:=CHR(EOL) „End�Else„Begin.†GETNXTCHAR:=INPUT_BUFFER[�PTR_INPUT_BUFFER�];E†If�(INPUT_BUFFER[�PTR_INPUT_BUFFER�]�=�CHR(EOL))�Then�EOL_FLAG:=True*ˆElse�PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER+1„End ‚End;�{�Of�Function�GETNXTCHAR�} O{*****************************************************************************} ‚Procedure�SCAN_BLANKS;>„{‚Procedure�SCAN_BLANKS�operates�on�INPUT_BUFFER;�It�advances0‡PTR_INPUT_BUFFER�past�any�blanks�encountered.�}‚Begin0„Repeat‚Until�(GETNXTCHAR�<>�'�')�Or�(EOL_FLAG);<„If�(Not�EOL_FLAG)�Then�PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1"‚End;�{�Of�Procedure�SCAN_BLANKS�} O{*****************************************************************************} ‚Procedure�INIT_STRING;B„{�Ensure�that�new�string�has�a��and�scan�off�leading�blanks�}‚Begin„For�I:=1�To�BUFLENLIMIT�Do=†INPUT_BUFFER[�I�]:=STATUS_BLOCK.INPUT_STRING@.CMD_LINE[�I�];J„For�I:=BUFLENLIMIT-1�Downto�1�Do‚If�(INPUT_BUFFER[�I�]�<>�'�')�Then‚Exit;@„INPUT_BUFFER[�I+1�]:=Chr(EOL);‚PTR_INPUT_BUFFER:=1;‚SCAN_BLANKS"‚End;…{�Of�Procedure�INIT_STRING�} O{*****************************************************************************} 6‚Function�CHECK_DELIM�(�CHECK_CHAR�:�Char�)�:�Boolean;D‚{‚The�"Delimeter�Check�Routine"�will�require�that�DELIM_FLAG�be�setD…for�any�of�the�following�checks�to�be�performed�prior�to�its�call�: ,…*****GROUP****************************VALUE …**1.�Colon 1…**2.�Semicolonœ2…**3.�Math�Operator˜3…**4.�Any�Delimeter˜4 B…Whenever�a�delimeter�is�encountered�from�the�requested�group,�theI…"Delimeter�Check�Routine"�sets�DELIM_CHAR�to�the�encountered�delimeter‚}‚Var6„DELIMTR�:�Boolean;“{�Valid�Delimeter�Character�Flag�} ‚Label„FIN; ‚Begin"„CHECK_DELIM:=True;‚DELIMTR:=True;,„If�(CHECK_CHAR�=�DELIM_CHAR)�Then‚GoTo�FIN;„If�DELIM_FLAG[�1�]�Then%†If�(CHECK_CHAR�=�':')�Then‚GoTo�FIN;„If�DELIM_FLAG[�2�]�Then%†If�(CHECK_CHAR�=�';')�Then‚GoTo�FIN;„If�DELIM_FLAG[�3�]�Then6†If�(CHECK_CHAR�In�[�'*','/','+','-'�])�Then‚GoTo�FIN;„If�DELIM_FLAG[�4�]�Then,†If�(CHECK_CHAR�In�[�'(','+',',','-'�])�Then ˆGoTo�FIN;$„CHECK_DELIM:=False;‚DELIMTR:=False;„FIN:)„If�(DELIMTR)�Then‚DELIM_CHAR:=CHECK_CHAR!‚End;�{�Of�Function�CHECK_DELIM�} O{*****************************************************************************} 3‚Function�CHAR_CHK�(�CHECK_CHAR�:�CHAR�)�:�Boolean;?„{‚Function�CHAR_CHK�checks�for�the�delimeted�end�of�a�string‚}‚BeginJ„CHAR_CHK:=((CHECK_CHAR�=�'�')�Or�(EOL_FLAG)�Or�(CHECK_DELIM(CHECK_CHAR)))‚End;‚{�Of�Function�CHAR_CHK�} O{*****************************************************************************} ‚Function�BLNKS_CHK�:�Boolean;F„{‚BLNKS_CHK�is�called�whenever�blanks�are�to�be�scanned�off�such�thatE‡only�a�delimeter,�as�specified,�or�an�EOL�indication�should�followƒ}‚BeginB< „SCAN_BLANKS;‚BLNKS_CHK:=((CHECK_DELIM(GETNXTCHAR))�Or�(EOL_FLAG))‚End;‚{�Of�Function�BLNKS_CHK�} O{*****************************************************************************} (‚Procedure�GET_STRING(Var�STRNG�:�STR4);‚Begin „STRNG:='„';„For�I:=1�To�4�Do„Begin.†If�(NEXT_CHAR�=�'�')�Or�(EOL_FLAG)�Then‚Exit;-†STRNG[�I�]:=NEXT_CHAR;‚NEXT_CHAR:=GETNXTCHAR„End‚End; O{*****************************************************************************} =‚Function�EVAL_CMD(STRNG�:�STR4;‚Var�TOKEN�:�BYTE)�:�Boolean; ‚LabelƒRETRY;‚Begin‚RETRY: „TOKEN:=0;„For�K:=1�To�NUM_CMD�Do †If�(STRNG�<=�COMMAND[�K�])�Then†Begin:ˆIf�(STRNG�=�COMMAND[�K�])�Then‚TOKEN:=CMD_CODE[�K�];‚Exit†End;„If�(TOKEN�=�0)�Then*†If�(STRNG�=�'Qƒ')�Or�(STRNG�=�'QU‚')�Then$¦Begin‚STRNG:='QUIT';�GOTO�RETRY‚EndA†Else‚If�(STRNG�=�'HE‚')�Then‚Begin‚STRNG:='HELP';�GOTO�RETRY‚End?†Else‚If�(STRNG�=�'Gƒ')�Then‚Begin‚STRNG:='GO‚';�GOTO�RETRY‚End?†Else‚If�(STRNG�=�'Tƒ')�Then‚Begin‚STRNG:='TR‚';�GOTO�RETRY‚End@†Else‚If�(STRNG�=�'Mƒ')�Then‚Begin‚STRNG:='MM‚';�GOTO�RETRY‚End;„EVAL_CMD:=(TOKEN�<>�0);‚End; O{*****************************************************************************} ‚Procedure�CMD_PARSER;K„{�This�procedure�checks�for�and�parses�out�a�valid�command�from�the�stringG†in�INPUT_BUFFER.‚If�a�valid�command�is�detected,�CODE�is�set�accordingH†to�the�command.‚Also�checks�that�at�least�one�space�follows�the�command†and�any�possible�paramaters.¬}‚Var„CMD�:�STR4;‘{�Command�Text�}‚Label„FIN; ‚Begin1„ERROR:=4;™{�Preset�To�Indicate�Invalid�Command�}4„NO_FLAG:=False;“{�Indicate�No�"NO"�option�Present„}2„If�EOL_FLAG�Then‚GoTo�FIN;‚NEXT_CHAR:=GETNXTCHAR;,„If�(NEXT_CHAR�=�'N')�Thenž{�"NO"�Option�?�}%†If�(GETNXTCHAR�<>�'O')�Then‚GoTo�FIN5ˆElse�Begin‚NO_FLAG:=True;‚NEXT_CHAR:=GETNXTCHAR‚End;„GET_STRING(CMD);„If�(EVAL_CMD(CMD,CODE))�Then(†If�(NEXT_CHAR�=�'�')�Or�(EOL_FLAG)�ThenˆIf�(NO_FLAG)�ThenˆBegin9ŠIf�(CODE�In�[�BR_CODE,�SD_CODE,�MA_CODE�])�Then�ERROR:=0ˆEnd�Else‚ERROR:=0; „SCAN_BLANKS;ƒFIN:!‚End;�{�Of�Procedure�CMD_PARSER�} O{*****************************************************************************} '‚Procedure�STORE_PARM(VALUE�:�Integer);B„{‚This�procedure�stores�a�parameter�in�PARM_BLOCK�and�updates�the1‡pointer,�PTR_PARM_BLOCK,�to�the�next�position.“}‚Begin2„STATUS_BLOCK.PARM_BLOCK[�PTR_PARM_BLOCK�]:=VALUE;!„PTR_PARM_BLOCK:=PTR_PARM_BLOCK+1!‚End;‚{�Of�Procedure�STORE_PARM�} O{*****************************************************************************} !‚Function�GET_MAC_LINE�:�Boolean;K„{�This�function�returns�the�next�stored�macro�line�from�a�macro�definitionD†buffer.‚A�macro�line�is�stored�with�an�EOL�terminator.‚A�single�EOL>†character�as�the�next�line�designates�the�end�of�the�macro.�}‚Begin„SYM_BUFR:='ƒ';‚K:=3;„Repeat†K:=K-1;†If�(LINE_NUMBER[K]�=�'9')‰Then�LINE_NUMBER[K]:=�'0'‰Else‹Begin/�LINE_NUMBER[K]:=CHR(�ORD(LINE_NUMBER[K])�+�1);�K:=1‹End;„Until�(K�=�1);„K:=0;„RepeatB†K:=K+1;‚SYM_BUFR[�K�]:=TABLE[�TABLE_PTR�];‚TABLE_PTR:=TABLE_PTR+1"„Until�(SYM_BUFR[�K�]�=�Chr(EOL));„GET_MAC_LINE:=(K�<>�1)"‚End;…{�Of�Function�GET_MAC_LINE�}{$E}N{*****************************************************************************�**É**$�**“Option�Specification�Routines™**�**É**O *****************************************************************************} ‚Procedure�CHK_OUTDEV;0ƒ{‚Decode�the�given�DEVICE‚--‚#FN�=�2,�#PR�=�1ƒ}‚Label„FIN; ‚Begin7„CHECK:=False;‚SCAN_BLANKS;‚TEMP_PTR:=PTR_INPUT_BUFFER;-„If�(Not�EOL_FLAG)�And�(EVAL_OUTDEV�=�0)�Then†If�(GETNXTCHAR�=�'#')�Then†BeginˆNEXT_CHAR:=GETNXTCHAR;1ˆIf�(NEXT_CHAR�=�'F')�Then–{�Filename�Specified�}?ŠIf�(GETNXTCHAR�=�'N')�Then‚EVAL_OUTDEV:=FILE_DEV‚Else‚GoTo�FINˆElse0ŠIf�(NEXT_CHAR�=�'P')�Then”{�Printer�Specified‚}?ŒIf�(GETNXTCHAR�=�'R')�Then‚EVAL_OUTDEV:=PRNT_DEV‚Else‚GoTo�FINŠElse‚GoTo�FIN;ˆC< HECK:=True;‚FOUND:=True†End;„FIN:/†If�(Not�CHECK)�Then�PTR_INPUT_BUFFER:=TEMP_PTR!‚End;ƒ{�Of�Procedure�CHK_OUTDEV�} O{*****************************************************************************} ‚Procedure�CHK_LENGTH;9„{‚Decode�the�given�LENGTH‚--‚Example�:�'B'�(Byte)�=>�1ƒ}‚Label„FIN; ‚Begin7„CHECK:=False;‚SCAN_BLANKS;‚TEMP_PTR:=PTR_INPUT_BUFFER;J„If�(EOL_FLAG)�Or�(EVAL_LENGTH�<>�0)�Then�GoTo�FIN;‚NEXT_CHAR:=GETNXTCHAR;1„Case�NEXT_CHAR�Of”{„Determine�LENGTH�specified…}&†'B'‚:…EVAL_LENGTH:=BYTE_LEN;‚{�Bytež}&†'W'‚:…EVAL_LENGTH:=WORD_LEN;‚{�Wordž}+†'L'‚:…EVAL_LENGTH:=LNGW_LEN;‚{�Long�Word™}4†'O'‚:…EVAL_LENGTH:=5;‰{�Odd�Addresses�only�for�MM‰}5†'V'‚:…EVAL_LENGTH:=6;‰{�Even�Addresses�only�for�MMˆ}&†Otherwise‚GoTo�FIN�{�Invalid�LENGTH”}„End;ƒ{�Of�Cases�}„CHECK:=True;‚FOUND:=True;„FIN:/…If�(Not�CHECK)�Then�PTR_INPUT_BUFFER:=TEMP_PTR!‚End;ƒ{�Of�Procedure�CHK_LENGTH�} O{*****************************************************************************} ‚Procedure�CHK_TYPE;6„{‚Decode�the�given�TYPE‚--‚Example�:�'$'�(Hex)�=>�1‚}‚Label„FIN; ‚Begin7„CHECK:=False;‚SCAN_BLANKS;‚TEMP_PTR:=PTR_INPUT_BUFFER;H„If�(EOL_FLAG)�Or�(EVAL_TYPE�<>�0)�Then�GoTo�FIN;‚NEXT_CHAR:=GETNXTCHAR;/„Case�NEXT_CHAR�Of•{„Determine�TYPE�Specified„}#†'$'‚:…EVAL_TYPE:=HEX_TYPE;…{�Hexœ}'†'&'‚:…EVAL_TYPE:=DEC_TYPE;…{�Decimal˜}%†'@'‚:…EVAL_TYPE:=OCT_TYPE;…{�Octalš}&†'%'‚:…EVAL_TYPE:=BIN_TYPE;…{�Binary™}%†''''�:…EVAL_TYPE:=CHR_TYPE;…{�Char›}.†'F'‚:…EVAL_TYPE:=FLT_TYPE;…{�Floating�Point‘}'†'I'‚:…EVAL_TYPE:=INT_TYPE;…{�Integer˜}+†'B'‚:ƒIf�GETNXTCHAR�=�'O'�Thenƒ{�Boolean˜}#‘EVAL_TYPE:=BOL_TYPE‚Else‚GoTo�FIN;2†'P'‚:ƒIf�GETNXTCHAR�=�'D'�Thenƒ{�Packed�Decimal‘}#‘EVAL_TYPE:=PCK_TYPE‚Else‚GoTo�FIN;0†'D'‚:ƒIf�GETNXTCHAR�=�'I'�Thenƒ{�Dis-Assembly“}#‘EVAL_TYPE:=DIS_TYPE‚Else‚GoTo�FIN;(†'N'‚:ƒEVAL_TYPE:=11;�{�No�Read�for�MM‘}$†Otherwise‚GoTo�FIN‘{�Invalid�TYPE“}„End;„{�Of�Cases�}„CHECK:=True;‚FOUND:=True;„FIN:/†If�(Not�CHECK)�Then�PTR_INPUT_BUFFER:=TEMP_PTR‚End;„{�Of�Procedure�CHK_TYPE�} O{*****************************************************************************} 8‚Procedure�GET_OPTIONS(OUTDEV,�LENGTH,�DTYPE�:�Boolean);>„{‚Get�all�valid�options�in�any�order�and�store�their�values‚}‚Begin„Repeat(†FOUND:=False;‚If�(DTYPE)�Then�CHK_TYPE;9†If�(OUTDEV)�Then‚CHK_OUTDEV;‚If�(LENGTH)�Then‚CHK_LENGTH„Until�(Not�FOUND);I„STORE_PARM(EVAL_LENGTH);‚STORE_PARM(EVAL_TYPE);‚STORE_PARM(EVAL_OUTDEV);3„If�(EVAL_LENGTH�<>�0)�Then‚NUM_PARMS:=NUM_PARMS+1;1„If�(EVAL_TYPE�<>�0)�Then‚NUM_PARMS:=NUM_PARMS+1;3„If�(EVAL_OUTDEV�<>�0)�Then‚NUM_PARMS:=NUM_PARMS+1;D„If�(EVAL_OUTDEV�=�0)�And�(EVAL_LENGTH�=�0)�And�(EVAL_TYPE�=�0)�Then †ERROR:=11;.„SCAN_BLANKS;‚If�(Not�EOL_FLAG)�Then‚ERROR:=11"‚End;ƒ{�Of�Procedure�GET_OPTIONS�}{$E}N{*****************************************************************************�**É**�**šSymbol�Routines **�**É**O *****************************************************************************} ‚Procedure�GET_SYMBOL;G„{‚Procedure�GET_SYMBOL�operates�on�INPUT_BUFFER;‚It�will�move�a�stringF‡bounded�by�PTR_INPUT_BUFFER�and�either�a�blank,�a�given�delimeter,�or@‡an�END-OF-LINE�character�into�NXT_STRING.‚Upon�returning�to�theD‡calling�program,�NXTSTRNGLEN�will�contain�the�length�of�the�string.1‡PTR_INPUT_BUFFER�will�be�advanced�accordingly.™}‚Begin8„NXTSTRNGLEN:=0;‚NEXT_CHAR:=GETNXTCHAR;ƒNXT_STRING:='ƒ';#„While�(Not�CHAR_CHK(NEXT_CHAR))�Do„BeginB†NXTSTRNGLEN:=NXTSTRNGLEN+1;‚NXT_STRING[�NXTSTRNGLEN�]:=NEXT_CHAR;†NEXT_CHAR:=GETNXTCHAR„End;…{�Of�While�Loop�}=„If�(Not�EOL_FLAG)�Then�PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1;3„If�(NXTSTRNGLEN�>�SYMLEN)�Then‚NXTSTRNGLEN:=SYMLEN!‚End;�{�Of�Procedure�GET_SYMBOL�} O{*****************************************************************************} 0‚Function�SYMBOL_CHK(FILES�:�Boolean)�:�BOOL= EAN;J„{�Function�SYMBOL_CHK�determines�whether�the�character�string�is�a�symbolF…or�not�and�returns�the�Boolean�result.‚Neither�pointers�nor�delimeter…status�is�affected. K…::=(�|�.)[(�|��|�$�|�_�|�.�)�...];…::=[(�|�)�...]‘}‚Var0„STRING_PTR�:�BYTE;˜{�Copy�Of�PTR_INPUT_BUFFER�})„TEMP_CHAR‚:�Char;˜{�Copy�Of�DELIM_CHAR‡} ‚Begin5„TEMP_CHAR:=DELIM_CHAR;‚STRING_PTR:=PTR_INPUT_BUFFER;*„SYMBOL_CHK:=False;‚NEXT_CHAR:=GETNXTCHAR;$„If�(Not�(CHAR_CHK(NEXT_CHAR)))�ThenI†If�((NEXT_CHAR�>=�'A')�And�(NEXT_CHAR�<=�'Z'))�Or�(NEXT_CHAR�=�'.')�Then5ˆWhile�((NEXT_CHAR�>=�'A')�And�(NEXT_CHAR�<=�'Z'))�Or.Š(NEXT_CHAR�In�[�'0'..'9',�'$',�'.',�'_'�])�DoŒBegin;ŽIf�(FILES)�And�(NEXT_CHAR�In�[�'$',�'.',�'_'�])�Then‚Exit;ŽNEXT_CHAR:=GETNXTCHAR;/ŽIf�(CHAR_CHK(NEXT_CHAR))�Then‚SYMBOL_CHK:=TrueŒEnd;�{�Of�While�Loop�}4„DELIM_CHAR:=TEMP_CHAR;‚PTR_INPUT_BUFFER:=STRING_PTR ‚End;�{�Of�Function�SYMBOL_CHK�} O{*****************************************************************************} ‚Procedure�FILE_CHK;Jƒ{‚This�procedure�stores�the�offset�into�INPUT_BUFFER�at�which�the�currentB†file�symbol�has�been�found.‚It�then�scans�past�the�symbol�and�anyH†subsequent�blanks.‚The�offset�in�PTR_INPUT_BUFFER�has�it's�base�at�0.‚}‚Begin8„STORE_PARM(PTR_INPUT_BUFFER-1);‚NUM_PARMS:=NUM_PARMS+1;1„Repeat‚Until�(CHAR_CHK(GETNXTCHAR));‚SCAN_BLANKS‚End;ƒ{�Of�Procedure�FILE_CHK�} O{*****************************************************************************} ‚Function�GET_NAME�:�Boolean;Fƒ{‚This�procedure�stores�first�four�chars�of�a�valid�symbol,�and�scans,†past�the�symbol�and�any�subsequent�blanksž}‚Begin„If�SYMBOL_CHK(True)�Then„Begin9†If�(CODE�=�MA_CODE)�Then‚STORE_PARM(PTR_INPUT_BUFFER-1);4†GET_SYMBOL;‚GET_NAME:=True;‚NUM_PARMS:=NUM_PARMS+1;3†SCAN_BLANKS;‚CH_INT(NXT_STRING[�1�],NUMBER_VALUE);3†If�(CODE�<>�MA_CODE)�Then‚STORE_PARM(NUMBER_VALUE)„End�Else‚GET_NAME:=False‚End;ƒ{�Of�Function�GET_NAME�}{$E}N{*****************************************************************************�**É**�**™Evaluation�Routines�**�**É**O *****************************************************************************} ‚Function�EVAL_LOCAL�:�Boolean;J„{‚This�function�determines�whether�or�not�a�symbol�is�in�the�local�symbolF‡table�and,�if�it�is,�returns�its�value�in�SYM_VALUE.‚TABLE_PTR�is�setA‡to�point�to�the�offset�of�the�symbol�in�the�macro/symbol�block‰}‚Var8„SMBL,�COMP�:�STR8;‰{�Temporary�Strings�For�Comparison�}‚Begin@„EVAL_LOCAL:=False;‚For�J:=1�To�8�Do‚SMBL[�J�]:=NXT_STRING[�J�];„TABLE_PTR:=ENDTABLE-11; „While�(TABLE_PTR�>=�ENDSYMB)�Do„Begin4†For�J:=1�To�8�Do‚COMP[�J�]:=TABLE[�TABLE_PTR+J-1�];†If�(COMP�=�SMBL)�Then†Begin?ˆCH_INT(TABLE[�TABLE_PTR+8�],SYM_VALUE);‚EVAL_LOCAL:=True;‚Exit†End;†TABLE_PTR:=TABLE_PTR-12„End ‚End;„{�Of�Function�EVAL_LOCAL�} O{*****************************************************************************} ‚Function�EVAL_LCLSYM�:�Boolean;G„{‚This�function�determines�if�a�symbol�is�valid�and,�if�so,�whether�orA‡not�it�is�a�predefined�local�symbol.‚If�it�is�a�valid�local,‚theE‡current�value�is�returned�in�SYM_VALUE.‚PTR_INPUT_BUFFER�is�advanced2‡past�any�blanks�and/or�any�delimeter�recognized˜}‚Var<„BACKUP�:�Boolean;‘{�Flag�Of�BLNKS_CHK�Success�For�Back-up�}‚Begin„EVAL_LCLSYM:=False;„If�SYMBOL_CHK(True)�Then„Begin%†GET_SYMBOL;‚BACKUP:=(Not�BLNKS_CHK);†If�(DELIM_CHAR�<>�':')�Then;ˆIf�(NXT_STRING[�1�]�=�'R')�And�(NXT_STRING[�3�]�=�'�')�And=Š((NXT_STRING[�2�]�>=�'0')�And�(NXT_STRING[�2�]�<=�'7'))�ThenˆBegin>ŠSYM_VALUE:=STATUS_BLOCK.OFREGS[�Ord(NXT_STRING[�2�])-16#30�];ŠEVAL_LCLSYM:=True$ˆEnd‚Else‚EVAL_LCLSYM:=(EVAL_LOCAL);6†If�(BACKUP)�Then�PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1„End!‚End;‚{�Of�Function�EVAL_LCLSYM�} O{*****************************************************************************}=  ‚Procedure�EVAL_PARM;‚Begin'„NEXT_CHAR:=GETNXTCHAR;‚PTR_MAC_BUF:=1;$„If�(NEXT_CHAR�In�[�'0'..'9'�])�Then„Begin&†For�L:=1�To�(Ord(NEXT_CHAR)-16#30)�Do†Begin*ˆWhile�(MAC_BUF[�PTR_MAC_BUF�]�<>�'�')�AndDŠ(MAC_BUF[�PTR_MAC_BUF�]�<>�Chr(EOL))�Do‚PTR_MAC_BUF:=PTR_MAC_BUF+1;CˆWhile�(MAC_BUF[�PTR_MAC_BUF�]�=�'�')�Do‚PTR_MAC_BUF:=PTR_MAC_BUF+1†End;-†If�(MAC_BUF[�PTR_MAC_BUF�]�<>�Chr(EOL))�Then†Begin*ˆWhile�(MAC_BUF[�PTR_MAC_BUF�]�<>�'�')�And>Š(MAC_BUF[�PTR_MAC_BUF�]�<>�Chr(EOL))�And�(I�<�BUFLENLIMIT)�DoˆBegin1ŠNXT_STRING[�I�]:=MAC_BUF[�PTR_MAC_BUF�];‚I:=I+1;ŠPTR_MAC_BUF:=PTR_MAC_BUF+1ˆEnd;'ˆIf�(MAC_BUF[�PTR_MAC_BUF�]�<>�'�')�And@Š(MAC_BUF[�PTR_MAC_BUF�]�<>�Chr(EOL))‚Then�ERROR:=22‚Else‚I:=I-1†End�Else‚ERROR:=20„End�Else‚ERROR:=21‚End; O{*****************************************************************************} 4‚Function�EVAL_MACRO(Var�MAC_NAME�:�STR8)�:�Boolean;I„{‚This�function�determines�if�a�macro�name�is�in�the�macro�table�and,�ifF‡it�is,�sets�TABLE_PTR�to�the�macro�offset�in�the�macro/symbol�block„}‚Var.„COMP�:�STR8;Œ{�Temporary�String�For�Compare�}‚Begin!„TABLE_PTR:=1;‚EVAL_MACRO:=False; „While�(TABLE_PTR�<�ENDMACRO)�Do„Begin4†For�K:=1�To�8�Do‚COMP[�K�]:=TABLE[�TABLE_PTR+K-1�];†If�(COMP�=�MAC_NAME)�Then†Begin)ˆEVAL_MACRO:=True;‚INDEX:=TABLE_PTR;‚Exit†End;8†TABLE_PTR:=TABLE_PTR+8;‚Repeat‚Until�(Not�GET_MAC_LINE)„End ‚End;…{�Of�Function�EVAL_MACRO�} O{*****************************************************************************} ‚Function�NUMBER_CHK�:�Boolean;E„{‚Function�NUMBER_CHECK�determines�whether�the�character�string�is�aC‡number�or�not�and�returns�the�Boolean�result.‚Neither�pointers�nor‡delimeter�status�is�affected. E…::=[-]([$]�|�&�|�@¤|�%)”}‚Var0„STRING_PTR�:�BYTE;•{�Copy�Of�PTR_INPUT_BUFFER�})„TEMP_CHAR‚:�Char;•{�Copy�Of�DELIM_CHAR‡} ‚Label„FIN; ‚Begin5„TEMP_CHAR:=DELIM_CHAR;‚STRING_PTR:=PTR_INPUT_BUFFER;;„NUMBER_CHK:=False;‚NEG_FLAG:=False;‚NEXT_CHAR:=GETNXTCHAR;+„If�((DEF_BASE)�And�(NEXT_CHAR�=�'-'))�Then„Begin&†NEXT_CHAR:=GETNXTCHAR;‚NEG_FLAG:=True„End;„If�EOL_FLAG�Then�GoTo�FIN;/„Case�NEXT_CHAR�Of—{‚Determine�Base�Of�Number‚}†'$'�:†CHECK_CHAR:='F';‹{‚Hex—}#†'&'�:†CHECK_CHAR:='9';‹{‚Decimal“}!†'@'�:†CHECK_CHAR:='7';‹{‚Octal•}"†'%'�:†CHECK_CHAR:='1';‹{‚Binary”}0†Otherwise‚CHECK_CHAR:='�'Œ{‚No�Base�Specified‰}„End;‚{�Of�Cases�}„If�(CHECK_CHAR�=�'�')�ThenB†If�(DEF_BASE)�And�(((NEXT_CHAR�>=�'A')�And�(NEXT_CHAR�<=�'F'))�Or"Š(NEXT_CHAR�In�[�'0'..'9'�]))�Then8ˆCase�DEF_BLOCK.BASE�OfŽ{�Determine�Default�Input�Base�}$ŠHEX_TYPE�:�CHECK_CHAR:='F';‡{�Hexš}(ŠDEC_TYPE�:�CHECK_CHAR:='9';‡{�Decimal–}&ŠOCT_TYPE�:�CHECK_CHAR:='7';‡{�Octal˜}&ŠBIN_TYPE�:�CHECK_CHAR:='1'ˆ{�Binary—}ˆEnd„{�Of�Cases�}†Else7ˆIf�(NEXT_CHAR�In�[�'0'..'9'�])�And�(Not�DEF_BASE)�ThenŠCHECK_CHAR:='9'ˆElse‚GoTo�FIN „Else�Begin†NEXT_CHAR:=GETNXTCHAR;:†If�CHAR_CHK�(�NEXT_CHAR�)�Or�(Not�DEF_BASE)�Then�GoTo�FIN„End;„While�(1�=�1)�Do„Begin†If�(NEXT_CHAR�<�'0')�Then�Exit ˆElse�If�(CHECK_CHAR�=�'F')�Then�Begin�If�(NEXT_CHAR�>�'9')�Then?‘If�(Not�((NEXT_CHAR�>=�'A')�And�(NEXT_CHAR�<=�'F')))�Then�Exit0�End�Else‚If�(NEXT_CHAR�>�CHECK_CHAR)�Then�Exit;†NEXT_CHAR:=GETNXTCHAR;†If�(CHAR_CHK(NEXT_CHAR))�Then†BeginˆNUMBER_CHK:=True;‚Exit†End„End;�{�Of�While�Loop�}„FIN:2„If�(EOL_FLAG)�Then�NUMBER_PTR:=PTR_INPUT_BUFFER-1%†Else‚NUMBER_PTR:=PTR_INPUT_BUFFER-2;4„DELIM_CHAR:=TEMP_CHAR;‚PTR_INPUT_BUFFER:=STRING_PTR ‚End;�{�Of�Function�NUMBER_CHK�} O{*****************************************************************************} 1‚Function�EVAL_NUMBER(BLNKS�:�Boolean)�:�BOOLEAN;I„{‚This�function�determines�whether�or�not�a�string�is�a�valid�number.‚If9‡it�is�valid,�the�value�will�be�returned�in�NUMBER_VALUE. Cˆ::=[-]($�|�& >�|�@3–|�%�|��|�')ˆ}‚Var0„STRING_PTR�:�BYTE;�{�Copy�Of�PTR_INPUT_BUFFERˆ}7„CHAR_VALUE�:�BYTE;�{�Value�of�Next�Digit�From�String�}(„BASE‡:�BYTE;�{�Number�Base�MultiplierŠ} ‚Label„CHK,�NGTV,�FIN; ‚Begin2„STRING_PTR:=PTR_INPUT_BUFFER;‚EVAL_NUMBER:=False;„If�(Not�NUMBER_CHK)�Then*†If�(DEF_BASE)�Thenš{�Check�For�…}†Begin*ˆIf�(NEG_FLAG)�Then‚NEXT_CHAR:=GETNXTCHAR;3ˆIf�(Not�EVAL_LCLSYM)�Then‘{�Check�For�ƒ}ˆBeginŠPTR_INPUT_BUFFER:=STRING_PTR;*ŠIf�(NEG_FLAG)�Then‚NEXT_CHAR:=GETNXTCHAR;7ŠIf�(GETNXTCHAR�=�'''')�Then�{�Check�For��}ŠBegin6ŒNUMBER_VALUE:=Ord(GETNXTCHAR);‚NEXT_CHAR:=GETNXTCHAR; ŒIf�(NUMBER_VALUE�>=�16#20)�Then'ŽIf�(CHAR_CHK(NEXT_CHAR))�Then‚GoTo�CHKŠEnd;'ŠPTR_INPUT_BUFFER:=STRING_PTR;‚GoTo�FINˆEnd;#ˆNUMBER_VALUE:=SYM_VALUE;‚GoTo�NGTV†End�Else‚GoTo�FIN „Else�Begin*†If�(NEG_FLAG)�Then�NEXT_CHAR:=GETNXTCHAR;0†Case�CHECK_CHAR�Of–{�Determine�Base�Of�Numberƒ}ˆ'F'�:„BASE:=16;”{�Hex˜}ˆ'9'�:„BASE:=10;”{�Decimal”}ˆ'7'�:„BASE:=�8;”{�Octal–}ˆ'1'�:„BASE:=�2•{�Binary•}†End;‚{�Of�Cases�}%†{‚Scan�Off�Base�Designator,�If�Any‚}(†NEXT_CHAR:=GETNXTCHAR;‚NUMBER_VALUE:=0;@†If�NEXT_CHAR�In�[�'$','&','@','%'�]�Then�NEXT_CHAR:=GETNXTCHAR;%†While�(Not�(CHAR_CHK(NEXT_CHAR)))�Do†Begin'ˆCHAR_VALUE:=(ORD(NEXT_CHAR)-ORD('0'));<ˆIf�NEXT_CHAR�In�[�'A'..'F'�]�Then�CHAR_VALUE:=CHAR_VALUE-7;0ˆNUMBER_VALUE:=((NUMBER_VALUE*BASE)+CHAR_VALUE);ˆNEXT_CHAR:=GETNXTCHAR†End‚{�Of�While�Loop�}„End;„CHK:†If�(NEXT_CHAR�=�'�')�ThenˆIf�(Not�BLNKS_CHK)�ThenDŠIf�(BLNKS)�Then�GoTo�FIN‚Else‚PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1;„NGTV:0†If�(NEG_FLAG)�Then‚NUMBER_VALUE:=-NUMBER_VALUE;„EVAL_NUMBER:=True;„FIN:!‚End;�{�Of�Function�EVAL_NUMBER�} O{*****************************************************************************} ‚Function�EVAL_REG�:�Boolean;K„{‚This�function�determines�if�a�string�is�a�valid�register�(range)�or�not.I‡If�it�is�valid,�the�register(s)�offset�value(s)�are�stored�in�REG_VALUE. E‡::=(�|��|�.PC�|�.SR�|�.XM�|��)3‡::=<.A(�0�|�1�|�2�|�3�|�4�|�5�|�6�|�7�)>3‡::=<.D(�0�|�1�|�2�|�3�|�4�|�5�|�6�|�7�)>2‡‚::=<.R(�0�|�1�|�2�|�3�|�4�|�5�|�6�|�7�)>@‡::=('-'�|�'-')Š}‚Var2„REG_PTR„:�BYTE;‰{�Offset�Value�To�Register�TextŠ}6„EVALD†:�Boolean;†{�Flag�Of�Valid�Register�Operation‡}>„NXT_LETTER�:�Char;‰{�Next�Character�in�Register�Designation�} „Procedure�CHK_FOR_REG;G…{‚Verify�and�process�the�given�register�so�that�REG_VALUE�will�contain$ˆthe�index�value�of�that�register.¥}„Begin…{Procedure�CHK_FOR_REG�}†NXT_LETTER:=GETNXTCHAR;†If�(EOL_FLAG)�Then�ERROR:=3†ElseˆCase�NEXT_CHAR�Of Ž{classify�the�encountered�reg.}?Š'D'�:‚If�(NXT_LETTER�In�[�'0'..'7'�])�Then†{�D-type�Register�}5“REG_VALUE:=(ORD(NXT_LETTER)-ORD('0'))‚Else�ERROR:=8;?Š'A'�:‚If�(NXT_LETTER�In�[�'0'..'7'�])�Then†{�A-type�Register�}9“REG_VALUE:=((ORD(NXT_LETTER)-ORD('0'))+8)‚Else‚ERROR:=8;1Š'P'�:‚If�(NXT_LETTER�=�'C')�Then�{�PC�Register„}“REG_VALUE:=16‚Else�ERROR:=8;1Š'S'�:‚If�(NXT_LETTER�=�'P')�Then�{�SP�Register„}“REG_VALUE:=150‘Else‚If�(NXT_LETTER�=�'R')�ThenŠ{�SR�Register„}™REG_VALUE:=177—Else‚If�(NXT_LETTER�=�'S')�And�(GETNXTCHAR�=�'P')�ThenŸREG_VALUE:=25‚Else‚ERROR:=8;1Š'X'�:‚If�(NXT_LETTER�=�'M')�Then�{�XM�Register„}“REG_VALUE:=18‚Else�ERROR:=8;1Š'O'�:‚If�(NXT_LETTER�=�'P')�Then�{�OP�Register„}“REG_VALUE:=19‚Else‚ERROR:=8;1Š'V'�:‚If�(NXT_LETTER�=�'L')�Then�{�VL�Register„}“REG_VALUE:=200‘Else‚If�(NXT_LETTER�=�'A')�ThenŠ{�VA�Register„}™REG_VALUE:=210—Else‚If�(NXT_LETTER�=�'M')�Then„{�VM�Register„}ŸREG_VALUE:=22�Else‚ERROR:=8;1Š'M'�:‚If�(NXT_LETTER�=�'C')�Then�{�MC�Register„}“REG_VALUE:=23‚Else‚ERROR:=8;?Š'R'�:‚If�(NXT_LETTER�In�[�'0'..'7'�])�Then†{�R-type�Register�}8“REG_VALUE:=(ORD(NXT_LETTER)-ORD('0')+24)‚Else�ERROR:=8;> ‡End„{�Of�Cases�}"„End;„{�Of�Procedure�CHK_FOR_REG�} ‚Beginƒ{�Function�EVAL_REG}7„EVALD:=False;‚REG_VALUE:=0;‚REG_PTR:=PTR_INPUT_BUFFER;„If�(GETNXTCHAR�=�'.')�Then„Begin†NEXT_CHAR:=GETNXTCHAR;†If�(Not�EOL_FLAG)�Then?ˆIf�(NEXT_CHAR�In�[�'D','A','P','S','X','O','V','M','R'�])�ThenˆBegin1ŠCHK_FOR_REG;‚EVALD:=True;‚NEXT_CHAR:=GETNXTCHAR;ŠIf�(CHAR_CHK(NEXT_CHAR))�ThenŠBegin=ŒIf�(Not�EOL_FLAG)�Then�PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1;CQÆËÏ Ó×Û"ßãçë"ï%ó"÷ûÿ!# ("&##')+ / 3'7";!=ŒIf�(Not�BLNKS_CHK)�Then�PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1ŠEnd�Else‚ERROR:=3ˆEnd�Else‚ERROR:=3„End;4„If�(ERROR�<>�0)�Or�(Not�EVALD)�Then‚EVAL_REG:=False „Else�Begin?†STORE_PARM(REG_VALUE);‚NUM_PARMS:=NUM_PARMS+1;‚EVAL_REG:=True;-†If�(CODE�=�MD_CODE)�Then‚STORE_PARM(REG_PTR)„End‚End;ƒ{�Of�Function�EVAL_REG�} O{*****************************************************************************} ‚Function�EVAL_EA�:�Boolean;I„{‚This�function�determines�whether�a�string�is�a�valid�effective�addressD‡or�not.‚If�valid,�the�function�stores�the�component(s)�of�the�EA�inE‡DISPL_VALUE,�INDIRECT_REG�and�INDEX_REG�as�well�as�storing�the�value!‡of�the�EA�expression�in�EVAL_EA. 6†::=[[-]]'('(PC�|�SP�|�)'§[,(SP�|��|�)]')'‚}‚Var9„DISPL_VALUE‚:�Integer;ˆ{�Value�Of�[-]�Offset…};„INDIRECT_REG�:�BYTE;‹{�Index�Value�For�Indirect�Register�}5„INDEX_REG„:�BYTE;‹{�Index�Value�For�Index�Register„}/„OFFSET‡:�BYTE;‹{�Index�Register�Offset�Value‡})„TEMP_CHAR„:�Char;‹{�Copy�Of�DELIM_CHAR�} ‚Label„FIN; ‚Begin/„DISPL_VALUE:=0;‚INDEX_REG:=0;‚INDIRECT_REG:=0;2„OFFSET:=0;‚TEMP_CHAR:=DELIM_CHAR;‚EVAL_EA:=False; 8„If�(GETNXTCHAR�<>�'(')�Then’{�[-]�Specified�}„Begin=†If�(Not�EOL_FLAG)�Then‚PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1;†DELIM_CHAR:='(';†If�(NUMBER_CHK)�Then†Begin0ˆIf�((Not�EVAL_NUMBER(True))�Or�(EOL_FLAG))�ThenˆBegin ŠDELIM_CHAR:=TEMP_CHAR;‚GoTo�FINˆEnd;2ˆDELIM_CHAR:=TEMP_CHAR;‚DISPL_VALUE:=NUMBER_VALUE;&ˆPTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-2;;ˆIf�(GETNXTCHAR�=�'�')�Then�GoTo�FIN;‚NEXT_CHAR:=GETNXTCHAR3†End�Else‚Begin‚DELIM_CHAR:=TEMP_CHAR;‚GoTo�FIN‚End„End; 4„NEXT_CHAR:=GETNXTCHAR;—{��Specified�}*„If�(NEXT_CHAR�=�'P')�Thenž{�PC�Register„}:†If�(GETNXTCHAR�=�'C')�Then‚INDIRECT_REG:=16‚Else‚GoTo�FIN2„Else�If�(NEXT_CHAR�=�'S')�Then™{�SP/A7�Register�}:‹If�(GETNXTCHAR�=�'P')�Then‚INDIRECT_REG:=15‚Else‚GoTo�FIN ‰Else�Begin<‹If�(NEXT_CHAR�<>�'A')�Then�GoTo�FIN;‚NEXT_CHAR:=GETNXTCHAR;4‹If�(Not�(NEXT_CHAR�In�[�'0'..'7'�]))�Then�GoTo�FIN;'‹INDIRECT_REG:=((ORD(NEXT_CHAR)-16#28))‰End;<„EA_VALUE:=STATUS_BLOCK.REGISTERS@.SAV_REGS[�INDIRECT_REG�];„NEXT_CHAR:=GETNXTCHAR; 5„If�(NEXT_CHAR�<>�')')�Then–{��Specified�}„Begin<†If�(NEXT_CHAR�<>�',')�Then�GoTo�FIN;‚NEXT_CHAR:=GETNXTCHAR;†If�(NEXT_CHAR�=�'S')�Then7ˆIf�(GETNXTCHAR�=�'P')�Then‚INDEX_REG:=15‚Else‚GoTo�FIN †Else�BeginˆIf�(NEXT_CHAR�<>�'D')�Then3ŠIf�(NEXT_CHAR�=�'A')�Then‚OFFSET:=8‚Else‚GoTo�FIN;ˆNEXT_CHAR:=GETNXTCHAR;4ˆIf�(Not�(NEXT_CHAR�In�[�'0'..'7'�]))�Then�GoTo�FIN;)ˆINDEX_REG:=(ORD(NEXT_CHAR)-16#30)+OFFSET†End;B†EA_VALUE:=EA_VALUE+STATUS_BLOCK.REGISTERS@.SAV_REGS[�INDEX_REG�];%†If�(GETNXTCHAR�<>�')')�Then�GoTo�FIN„End; >„If�(Not�BLNKS_CHK)�Then�PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1;/„EA_VALUE:=EA_VALUE+DISPL_VALUE;‚EVAL_EA:=True; „If�(CODE�=�0)�Then„Begin?†CODE:=CODE+2;‚STORE_PARM(DISPL_VALUE);‚NUM_PARMS:=NUM_PARMS+1;.†EA_VALUE:=((INDIRECT_REG*16#10000)+INDEX_REG)„End; .„STORE_PARM(EA_VALUE);‚NUM_PARMS:=NUM_PARMS+1;„FIN:‚End;ƒ{�Of�Function�EVAL_EA�} O{***********************************? ******************************************} 2‚Function�EVAL_ADDR�(�BLNKS�:�Boolean�)�:�BOOLEAN;9„{�::=(�|��|�)[:]ƒ}„{¸}'„{�::=<'#'Digit[�...]>‡})„{�::=[:
]…}„{Š::=–}*„{Ž
::=|10|11|...|254|255…}‚Var)„TEMP_CHAR‰:�Char;ˆ{�Copy�Of�DELIM_CHAR“},„EVAL_FLAG‰:�Boolean;…{�Valid�Address�Flag“}9„TEMP_PTR,�NEW_PTR�:�BYTE;ˆ{�Copies�Of�PTR_INPUT_BUFFER‹}2„I‘:�BYTE;ˆ{�Miscellaneous�Loop�Control�Variable‚}:„ADDR_LENŠ:�BYTE;ˆ{�Length�Of�[:]�String�} ‚Label„FIN; ‚BeginE„TEMP_CHAR:=DELIM_CHAR;‚TEMP_PTR:=PTR_INPUT_BUFFER;‚EVAL_FLAG:=False;/„DELIM_FLAG[�1�]:=True;›{�Set�Colon�Delimeter�}+„SYM_BUFR:='ƒ';‚ADDR_VALUE:=0;‚ADDR_LEN:=0; 9„If�EVAL_NUMBER�(�BLNKS�)�Then‘{�Absolute�Number/Offset�}†ADDR_VALUE:=NUMBER_VALUE „Else�Begin:†If�(NEG_FLAG)�Then�NEXT_CHAR:=GETNXTCHAR;Ž{�Unary�Minus�}K{ LINE # NOT SUPPORTED ----------------------------------------------------.†If�(GETNXTCHAR�=�'#')�Then™�Specified†BeginˆDEF_BASE:=False;ˆIf�(NUMBER_CHK)�ThenˆBegin!ŠSYM_BUFR[�1�]:='#';‚ADDR_LEN:=1;/ŠFor�I:=1�To�(NUMBER_PTR-PTR_INPUT_BUFFER+1)�DoŠBegin7ŒADDR_LEN:=ADDR_LEN+1;‚SYM_BUFR[�ADDR_LEN�]:=GETNXTCHARŠEndˆEnd�Else‚GoTo�FIN †End�Else†BeginFˆIf�(Not�EOL_FLAG)�Then‚PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1;�-------}†Begin1ˆIf�SYMBOL_CHK(False)�Then•{��Specifiedƒ}ˆBegin<ŠGET_SYMBOL;‚ADDR_LEN:=NXTSTRNGLEN;‰{�Save��Length�}/ŠFor�I:=1�To�ADDR_LEN�Do•{�Save��Nameƒ} ŒSYM_BUFR[�I�]:=NXT_STRING[�I�];ˆEnd�Else‚GoTo�FIN †End;†If�(Not�BLNKS_CHK)�ThenCˆIf�(BLNKS)�Then‚GoTo�FIN‚Else‚PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1„End; 0„If�DELIM_CHAR�=�':'�Then›{��Specified�}„Begin?†DELIM_CHAR:=TEMP_CHAR;‚If�Not�SYMBOL_CHK(False)�Then�GoTo�FIN;=†GET_SYMBOL;‚ADDR_LEN:=ADDR_LEN+1;‚SYM_BUFR[�ADDR_LEN�]:=':';2†For�I:=1�To�NXTSTRNGLEN�Do—{�Save��Name�}†Begin<ˆADDR_LEN:=ADDR_LEN+1;‚SYM_BUFR[�ADDR_LEN�]:=NXT_STRING[�I�]†End;†If�(Not�BLNKS_CHK)�ThenDˆIf�(BLNKS)�Then‚GoTo�FIN‚Else‚PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1; 3†If�(DELIM_CHAR�=�':')�Then–{�
�Specified�}†BeginCˆDELIM_CHAR:=TEMP_CHAR;‚DEF_BASE:=False;‚NEW_PTR:=PTR_INPUT_BUFFER;CˆIf�(Not�EVAL_NUMBER(BLNKS))�Or�(NUMBER_VALUE�>�255)�Then�GoTo�FIN;1ˆADDR_LEN:=ADDR_LEN+1;‚SYM_BUFR[�ADDR_LEN�]:=':';ˆPTR_INPUT_BUFFER:=NEW_PTR;&ˆFor�I:=1�To�(NUMBER_PTR-NEW_PTR+1)�DoˆBegin7ŠADDR_LEN:=ADDR_LEN+1;‚SYM_BUFR[�ADDR_LEN�]:=GETNXTCHARˆEnd;ˆIf�(Not�BLNKS_CHK)�ThenCŠIf�(BLNKS)�Then‚GoTo�FIN‚Else‚PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1†End„End; =„If�ADDR_LEN�<>�0�Then�{�Calculate��and/or��}„Begin;†If�(Not�(CALC_ADDRESS(SYM_VALUE,SYM_BUFR)))�Then�GoTo�FIN;"†ADDR_VALUE:=ADDR_VALUE+SYM_VALUE;,†If�(NEG_FLAG)�Then‚ADDR_VALUE:=-ADDR_VALUE;„End; „EVAL_FLAG:=True;„FIN:>„EVAL_ADDR:=EVAL_FLAG;‚DEF_BASE:=True;‚DELIM_FLAG[�1�]:=False;3„If�(Not�EVAL_FLAG)�Then‚PTR_INPUT_BUFFER:=TEMP_PTR‚End;ƒ{�Of�Function�EVAL_ADDR�} O{*****************************************************************************} /‚Function�EVAL_EXP(�BLNKS�:�Boolean)�:�BOOLEAN;0„{ƒ::=[�...�]ƒ}‚Var)„TEMP_CHAR‚:�Char;�{�Copy�Of�DELIM_CHAR†},„MATH_TOKEN�:�Char;�{�Parsed�Math�Operator„}%„EVALE†:�Boolean;Œ{�Expression�Flag‰}0„STRING_PTR�:�BYTE;�{�Copy�Of�Input�Buffer�Ptr�} ‚Label„FIN; ‚BeginC„TEMP_CHAR:=DELIM_CHAR;‚STRING_PTR:=PTR_INPUT_BUFFER;‚EVALE:=False;5„DELIM_FLAG[�3�]:=True;•{‚�Delimeter‚})„If�(Not�EVAL_ADDR(BLNKS))�Then�GoTo�FIN;„EXP_VALUE:=ADDR_VALUE;@„While�(Not�EOL_FLAG)�And�(DELIM_CHAR�In�[�'*','/','+','-'�])�Do„Begin*†SCAN_BLANKS;‚If�(EOL_FLAG)�Then�GoTo�FIN;/†MATH_TOKEN:=DELIM_CHAR;‚DELIM_CHAR:=TEMP_CHAR;)†If�(Not�EVAL_ADDR(BLNKS))�Then�GoTo�FIN;.†Case�MATH_TOKEN�Ofš{‚Perform�Math�Operation‚})ˆ'-'�:‡EXP_VALUE:=EXP_VALUE‚-‚ADDR_VALUE;)ˆ'+'�:‡EXP_VALUE:=EXP_VA? LUE‚+‚ADDR_VALUE;)ˆ'*'�:‡EXP_VALUE:=EXP_VALUE‚*‚ADDR_VALUE;Bˆ'/'�:�If�(ADDR_VALUE�>�16#FFFF)�Or�(ADDR_VALUE�=�0)�Then�GoTo�FIN)ŽElse‚EXP_VALUE:=EXP_VALUE�DIV�ADDR_VALUE†End;�{�Of�CaseS�}„End;<„EVALE:=True;‚NUM_PARMS:=NUM_PARMS+1;‚STORE_PARM(EXP_VALUE);„FIN:<„DELIM_FLAG[�3�]:=False;�{�Clear��Delimeter�}„If�(Not�EVALE)�Then„Begin/†PTR_INPUT_BUFFER:=STRING_PTR;‚EVALE:=(EVAL_EA)„End;„EVAL_EXP:=EVALE‚End;ƒ{�Of�Function�EVAL_EXP�} O{*****************************************************************************} ‚Function�ADR_EXP_REG�:�Boolean;D„{‚This�function�checks�for�valid�register(s),�effective�address,�or‡expression�in�that�order«}‚Begin/„TEMP_PTR:=PTR_INPUT_BUFFER;‚ADR_EXP_REG:=True; „If�(EVAL_REG)�Then‚CODE:=CODE+1 „Else�Begin&†PTR_INPUT_BUFFER:=TEMP_PTR;‚ERROR:=0;1†If�(Not�EVAL_EXP(False))�Then‚ADR_EXP_REG:=False„End!‚End;ƒ{�Of�Function�ADR_EXP_REG�} O{*****************************************************************************} ‚Procedure�GET_VALUE;‚Begin„If�(GETNXTCHAR�=�'''')�Then„Begin†NEXT_CHAR:=GETNXTCHAR;0†While�(NEXT_CHAR�<>�'''')�And�(Not�EOL_FLAG)�Do†Begin8ˆI:=I+1;‚SYM_BUFR[�I�]:=NEXT_CHAR;‚NEXT_CHAR:=GETNXTCHAR†End;G†If�(EOL_FLAG)�Or�(Not�CHAR_CHK(GETNXTCHAR))�Then‚ERROR:=6;‚SCAN_BLANKS „End�Else„Begin.†PTR_INPUT_BUFFER:=PTR_INPUT_BUFFER-1;‚I:=I+1;†If�(EVAL_NUMBER(False))�Then)ˆSTORE_BYTE(NUMBER_VALUE,SYM_BUFR[�I�],I)†Else‚ERROR:=6„End ‚End;ƒ{�Of�Procedure�GET_VALUE�}{$E}N{*****************************************************************************�**É**5�**‹Command�Processing�Routines�--�Execution�Group�**�**É**O *****************************************************************************} <‚Procedure�ADDR_STOP;…{ƒAS�[�[��[;]]]ƒ} ‚Begin„DELIM_FLAG[�2�]:=True;„If�(Not�EOL_FLAG)�Then†If�(EVAL_EXP(False))�Then†BeginˆIf�(Not�EOL_FLAG)�ThenˆBeginŠIf�EVAL_NUMBER(True)�ThenŠBegin(ŒNUM_PARMS:=2;‚STORE_PARM(NUMBER_VALUE);ŒIf�(DELIM_CHAR�=�';')�ThenŒBegin2ŽGET_OPTIONS(False,True,False);‚PTR_PARM_BLOCK:=3;ŽCase�EVAL_LENGTH�Of$�BYTE_LEN�:�STORE_PARM(16#FF000000);$�WORD_LEN�:�STORE_PARM(16#FFFF0000);$�LNGW_LEN�:�STORE_PARM(16#FFFFFFFF);�Otherwise‚ERROR:=11ŽEndŒEndŠEnd�Else‚ERROR:=7ˆEnd†End�Else‚ERROR:=6 ‚End;ƒ{�Of�Procedure�ADDR_STOP�} O{*****************************************************************************} 9‚Procedure�BREAKPOINT;„{ƒ[NO]BR�[�[;]]�...ƒ} ‚Begin<„While�(Not�EOL_FLAG)�And�(ERROR�=0)�And�(NUM_PARMS�<�16)�Do„Begin!†COUNT:=1;‚DELIM_FLAG[�2�]:=True;'†If�(Not�EVAL_EXP(False))�Then�ERROR:=65†Else�If�(Not�((EXP_VALUE�Mod�2)�=�0))�Then�ERROR:=198‹Else�If�(DELIM_CHAR�=�';')�Then‡{�A�Count�Is�Expected�}�Begin’SCAN_BLANKS;‚DEF_BASE:=False;’If�(EOL_FLAG)�Then�ERROR:=3 ’Else�Begin)”DELIM_FLAG[�2�]:=False;‚DELIM_CHAR:='�';”If�(EVAL_NUMBER(False))�Then”Begin–COUNT:=NUMBER_VALUE;4–If�(COUNT�<=�0)�Or�(COUNT�>�16#FFFF)�Then‚ERROR:=12”End�Else‚ERROR:=7’End�End;:†NUM_PARMS:=NUM_PARMS+1;‚STORE_PARM(COUNT);‚DEF_BASE:=True„End;‚{Of�While�Loop�}0„If�(Not�EOL_FLAG)�And�(ERROR�=�0)�Then�ERROR:=3!‚End;„{�Of�Procedure�BREAKPOINT�} O{*****************************************************************************} 2‚Procedure�TRACE;…{ƒTR�[]‚Or‚CR�[]ƒ}‚Begin)„COUNT:=1;‚NUM_PARMS:=1;‚DEF_BASE:=False;„If�(Not�EOL_FLAG)�Then)†If�(Not�EVAL_NUMBER(True))�Then�ERROR:=7†Else‚COUNT:=NUMBER_VALUE;5„If�(COUNT�>�0)�Then‚STORE_PARM(COUNT)‚Else‚ERROR:=12‚End;„{�Of�Procedure�TRACE�} O{*****************************************************************************} !‚Procedure�GO;†{ƒG[O]�[]ƒ} ‚Begin„If�(Not�EOL_FLAG)�Then†If�(EVAL_EXP(False))�Then ˆIf�((EXP_VALUE�Mod�2)�=�0)�ThenˆBegin ŠIf�(Not�EOL_FLAG)�Then�ERROR:=3ˆEnd�Else‚ERROR:=2†Else�ERROR:=6‚End;…{Of�Procedure�GO�} O{*********************************************************@ ********************}9{---------------------NO LONGER SUPPORT IT OR OT COMMANDS:‚Procedure�TRACE_RANGE;†IT��‚Or‚OT��+žNOIT�[�]‚Or‚NOOT�[�]‚Begin „ERROR:=6;„If�(Not�EOL_FLAG)�Then„Begin-†If�(EVAL_EXP(False))�And�(Not�EOL_FLAG)�Then1ˆIf�(EVAL_EXP(True))�And�(EOL_FLAG)�Then‚ERROR:=0$„End�Else‚If�(NO_FLAG)�Then‚ERROR:=0 ‚End;†Of�Procedure�TRACE_RANGE�}{$E}N{*****************************************************************************�**É**2�**‹Command�Processing�Routines�--�Modify�Group“**�**É**O *****************************************************************************} >‚Procedure�BLOCK_FILL;…{ƒBF����[;]ƒ}‚Begin „ERROR:=6;-„If�(EVAL_EXP(False))�And�(Not�EOL_FLAG)�Then-†If�(EVAL_EXP(False))�And�(Not�EOL_FLAG)�Then†BeginˆDELIM_CHAR:=';';ˆIf�(EVAL_NUMBER(True))�ThenˆBegin5ŠSTORE_PARM(NUMBER_VALUE);‚ERROR:=0;‚COUNT:=LNGW_LEN;EŠIf�((STATUS_BLOCK.PARM_BLOCK[�1�]�Mod�2)�<>�0)�Then‚COUNT:=BYTE_LEN;ŠIf�(Not�EOL_FLAG)�ThenŠBegin2ŒGET_OPTIONS(False,True,False);‚COUNT:=EVAL_LENGTHŠEnd�Else‚STORE_PARM(COUNT);3ŠIf�((STATUS_BLOCK.PARM_BLOCK[�1�]�Mod�2)�<>�0)�And5Œ(COUNT�<>�BYTE_LEN)�Then‚ERROR:=11‚Else‚NUM_PARMS:=4ˆEnd�Else‚ERROR:=7†End!‚End;ƒ{�Of�Procedure�BLOCK_FILL�} O{*****************************************************************************} 4‚Procedure�BLOCK_SEARCH;…{‚BS���‚}‚Begin-„If�(EVAL_EXP(False))�And�(Not�EOL_FLAG)�Then-†If�(EVAL_EXP(False))�And�(Not�EOL_FLAG)�Then†Begin2ˆI:=0;‚GET_VALUE;‚PTR_PARM_BLOCK:=4;‚NUM_PARMS:=3;(ˆSTORE_PARM(I);‚If�(I�=�0)�Then‚ERROR:=6†End�Else‚ERROR:=6„Else‚ERROR:=6#‚End;ƒ{�Of�Procedure�BLOCK_SEARCH�} O{*****************************************************************************} 2‚Procedure�BLOCK_MOVEMEM;‚{ƒBM���ƒ}‚Begin „ERROR:=6;-„If�(EVAL_EXP(False))�And�(Not�EOL_FLAG)�Then-†If�(EVAL_EXP(False))�And�(Not�EOL_FLAG)�Then1ˆIf�(EVAL_EXP(True))�And�(EOL_FLAG)�Then‚ERROR:=0$‚End;ƒ{�Of�Procedure�BLOCK_MOVEMEM�} O{*****************************************************************************} @‚Procedure�OPENMEM_OPENREG;�{ƒMM��[;[]�[]]ƒ} ‚Begin„DELIM_FLAG[�2�]:=True;„If�(ADR_EXP_REG)�Then„Begin†If�(Not�EOL_FLAG)�Then†BeginˆPTR_PARM_BLOCK:=3;ˆIf�(DELIM_CHAR�=�';')�ThenˆBeginŠGET_OPTIONS(False,True,True);2ŠIf�(EVAL_LENGTH�<>�0)�Then‚NUM_PARMS:=NUM_PARMS+1ˆEnd�Else‚ERROR:=3†End„End�Else‚ERROR:=6&‚End;ƒ{�Of�Procedure�OPENMEM_OPENREG�} O{*****************************************************************************} >‚Procedure�SET_MEM;‡{ƒMS��(�|�)ƒ})›{ƒMS���[‚for�.R�regs]„}‚Begin)„If�(ADR_EXP_REG)�And�(Not�EOL_FLAG)�Then†If�(CODE�<>�MS_CODE)�Then†Begin(ˆIf�(Not�EVAL_EXP(False))�Then�ERROR:=6;=ˆIf�(Not�EOL_FLAG)�Then�If�(Not�EVAL_EXP(True))�Then�ERROR:=6 †End�Else†Begin@ˆI:=0;‚If�((STATUS_BLOCK.PARM_BLOCK[�1�]�Mod�2)�<>�0)�Then‚I:=1;3ˆWhile�(ERROR�=�0)�And�(Not�EOL_FLAG)�DoƒGET_VALUE;<ˆIf�((STATUS_BLOCK.PARM_BLOCK[�1�]�Mod�2)�<>�0)�Then‚I:=I-1;6ˆSTORE_PARM(I);‚NUM_PARMS:=2;‚If�(I�=�0)�Then‚ERROR:=6†End„Else‚ERROR:=6‚End;ƒ{�Of�Procedure�SET_MEM�}{$E}N{*****************************************************************************�**É**3�**‹Command�Processing�Routines�--�Display�Group’**�**É**O *****************************************************************************} $‚Procedure�CONVRT_VAL;Š{ƒDC�‚} ‚Begin&„If�(Not�EVAL_EXP(True))�Then‚ERROR:=5!‚End;‚{�Of�Procedure�CONVRT_VAL�} O{*****************************************************************************} B‚Procedure�DUMP_MEM;‚{�MD��[]�[;[]]�} ‚Begin0„COUNT:=16;‚DELIM_FLAG[�2�]:=True;‚NUM_PARMS:=1;„If�(ADR_EXP_REG)�Then†If�(Not�EOL_FLAG)�Then†BeginˆIf�(DELIM_CHAR�<>�';'�)�ThenŠIf�(EVAL_NUMBER(True))�Then>ŒIf�@ (NUMBER_VALUE�>�0)�Then‚COUNT:=NUMBER_VALUE‚Else‚ERROR:=12ŠElse‚ERROR:=7;,ˆIf�(CODE�=�MD_CODE)�Then‚STORE_PARM(COUNT);8ˆIf�(DELIM_CHAR�=�';')�Then‚GET_OPTIONS(False,True,True)†End�Else‚STORE_PARM(COUNT)„Else‚ERROR:=6‚End;ƒ{�Of�Procedure�DUMP_MEM�}{$E}N{*****************************************************************************�**É**;�**‹Command�Processing�Routines�--�Session�Control�GroupŠ**�**É**O *****************************************************************************} &‚Procedure�DEFAULTS;ˆ{ƒDE�[