LEX 'HPDLEX' * THIS FILE IS FOR DISSASEMBLER ENTHUSIASTS ID #EC * J.ELHAY. 29/6/87. MSG 0 * HDIFF(A$,B$)=HTD(A$)-HTD(B$) POLL 0 * HPD$(A$,n)=DTH$(HTD(A$)+n) ENTRY HEXDIF * THE STRING ARGUMENTS MUST ALL BE VALID CHAR #F * ADDRESSES FOR BOTH FUNCTIONS ENTRY HX+DC * STRINGS WHICH CANNOT BE INTERPRETED AS CHAR #F * ADDRESSES WILL ERROR OUT KEY 'HDIFF' * SYNTAX: HDIFF(A$,B$) TOKEN 22 KEY 'HPD$' * SYNTAX: HPD$(A$,n), n IS AN INTEGER (OFFSET) TOKEN 23 * n MAY BE POSITIVE OR NEGATIVE ENDTXT FNRTN1 EQU #0F216 * NUMERIC FUNCTION EXIT RNDAHX EQU #136CB * POP A REAL, ROUND, CONVERT TO HEX INTEGER HEXASC EQU #17148 * HEX TO ASCII CONVERSION STRHDR EQU #0F09A * CHECKS FOR ROOM, THEN WRITES STRING HEADER REV$ EQU #1B38E * REVERSE A STRING ON THE STACK REVPOP EQU #0BD31 * POP A STRING, THEN REVERSE IT ARGERR EQU #0BF19 * INVALID ARGUMENT ERROR EXIT DRANGE EQU #1B076 * TEST A BYTE IS IN RANGE 0-9 CONVUC EQU #152AA * CONVERT TO UPPER CASE RANGE EQU #1B07C * TEST A BYTE IS IN NOMINATED RANGE EXPR EQU #0F23C * GENERAL FUNCTION EXIT HDFLT EQU #1B31B * HEX INTEGER TO FLOATING POINT NUMBER NIBHEX 8422 * A STRING AND A NUMERIC PARAMETER HX+DC GOSBVL RNDAHX * POP AS A HEX INTEGER(NEGATIVES: 2'S COMPLEMENT) C=0 A * CLEAR C(A) R0=A * SAVE OFFSET IN R0 D1=D1+ 16 * MOVE D1 PAST NUMBER ON STACK GOSUB Addrck * POPS STRING AND RETURNS HEX ADDRESS A=R0 * RECALL OFFSET A=A+B A * ADD OFFSET (IF n IS NEG, A IS COMPLEMENT) C=0 W P= 4 * THIS CODE COMES FROM IDS III AND CONVERTS CPEX 15 * A HEX ADDRESS INTO CORRESPONDING STRING D=C W * (TAKEN LARGELY FROM THE CODE FOR DTH$) GOSBVL HEXASC D=D+1 S D=D+D S DSLC C=D A GOSBVL STRHDR P=C 0 P=P-1 A=B W DAT1=A WP D1=D1- 16 P= 0 GOSBVL REV$ GOVLNG EXPR * EXIT WITH OUTPUT- ADDRESS IS OFFSET BY n Addrck GOSBVL REVPOP * THIS SECTION IS A COPY OF CODE FROM THE C=0 A * UNSUPPORTED ENTRY POINT ADDRCK LCHEX A * SEE IDS III FOR DOCUMENTATION ?A>C A * THE ADDRESS OF ADDRCK IS 1C5A5 GOYES Err C=A A P=C 0 P=P-1 GOC Err AD1EX C=C+A A D1=A A=0 W A=DAT1 WP D1=C B=0 A P= 0 Addr GOSUB Aschex ?A=0 B RTNYES GONC Addr Err GOVLNG ARGERR Aschex GOSBVL DRANGE * ASCHEX IS ANOTHER UNSUPPORTED ENTRY POINT GOC ATH * IT CAN BE FOUND AT 1C5E3 ATH1 BSL W * 1C5A5 AND 1C5E3 ARE ADRESSES IN VERSION :1BBBB B=A P ASR W ASR W RTN ATH GOSBVL CONVUC LCASC 'FA' GOSBVL RANGE GOC Err LCHEX 37 A=A-C B GONC ATH1 NIBHEX 4422 * TWO STRING PARAMETERS (MUST BE OK AS ADDRESSES) HEXDIF GOSUB Addrck * POP THE 2nd STRING AND CONVERT TO HEX ABEX A * EXCHANGE TO A(A) R0=A * SAVE IN R0 GOSUB Addrck * POP THE 1st STRING AND CONVRT TO HEX CBEX A * EXCHANGE INTO C(A) A=R0 * RECALL 2nd ADDRESS C=C-A A * SUBTRACT 2nd FROM 1st P=C 4 * COPY C(4) INTO P ?P# 15 * IS IT NOT AN F? (WOULD BE FOR A COMPLEMENT) GOYES PLUS * NOT A COMPLEMENT C=-C A * IS ONE, SO COMPLEMENT THE COMPLEMENT ST=1 0 * SET ST0 TO ANTICIPATE SIGN CHANGE PLUS P= 0 A=C A * COPY A(A) TO C(A) FOR FLOATING GOSBVL HDFLT * HEX TO FLOAT ?ST=0 0 * WILL IT BE POSITIVE? GOYES OUT * SKIP THE CHANGE OF SIGN A=-A-1 S * THIS FOR NEGATIVES OUT C=A W * COPY RESULT TO C(W) FOR OUTPUT GOVLNG FNRTN1 * AND FINISH! END