|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 7808 (0x1e80) Types: TextFile Names: »CALL.ASM«
└─⟦1b6e6286b⟧ Bits:30003265 CIS COBOL version 4.4 til CP/M-80 (BG/0000/BL) └─ ⟦this⟧ »CALL.ASM« └─⟦5487c9624⟧ Bits:30003266 CIS COBOL version 4.4 til CP/M-80 (BG/0026/BF) └─ ⟦this⟧ »CALL.ASM« └─⟦e265ead8b⟧ Bits:30005730 Add serial numbers to several RC700 & RC850 software packages └─ ⟦this⟧ »CALL.ASM« └─⟦f4cd6c984⟧ Bits:30005601 CIS COBOL v. 4.5 Rev 5 (RC702) └─ ⟦this⟧ »CALL.ASM«
;***************************************************************************** ;* ;* ;* THIS IS AN EXAMPLE OF USER CALL CODE SUPPLIED PURELY FOR GUIDANCE OF THE ;* USER TO ENABLE THE MECHANICS OF CALL CODE INSERTION TO BE BETTER UNDERSTOOD. ;* ;* THE CODE IS DESIGNED TO BE A USEFUL EXAMPLE OF CALL, AND IF IMPLEMENTED ;* WILL ALLOW THE COBOL PROGRAMMER TO CREATE 16 BIT BINARY QUANTITIES FROM ;* UP TO 5 ASCII DIGITS, AND VICE VERSA. THE USE IS EXPLAINED IN MORE DETAIL ;* AT THE HEAD OF EACH ROUTINE. ;* ;* INTEL CORPORATION HAS TAKEN EVERY PRECAUTION TO ENSURE THE ACCURACY OF THESE ;* ROUTINES, BUT CANNOT BE HELD LIABLE IN ANY WAY FOR ANY ERRORS OR ;* OMISSIONS IN THEM. ;* ;***************************************************************************** ;* ;* THE MODULE MUST BE LOCATED AT THE ADDRESS SPECIFIED BY CONFIGURATOR ;* WHEN THE RTS IN WHICH THE CODE IS TO RESIDE WAS CONFIGURED. (SEE OPERATING ;* GUIDE, CHAPTER 4). ;* BASE EQU 04404H ;REPLACE 04404H BY THE ADDRESS GIVEN ;BY CONFIGURATOR. ;* ;* ORG BASE ;SET THE BASE ADDRESS ;* ;***************************************************************************** ;* ;* NOW FOLLOWS THE CALL CODE IDENTIFICATION TABLE. THIS IS A TABLE OF ;* ADDRESSES OF THE ENTRY-POINTS TO THE ROUTINES, PRECEDED BY A BINARY ;* 8 BIT ITEM SPECIFYING THE HIGHEST AVAILABLE ROUTINE NUMBER ;* ;***************************************************************************** ;* CALTOP: DB MAXNO ;HIGHEST AVAILABLE CALL ROUTINE. DW 0 ;CALL "00" (DOES NOT EXIST) DW DECBIN ;CALL "01" - DECIMAL ASCII TO BINARY DW BINDEC ;CALL "02" - BINARY TO DECIMAL ASCII MAXNO EQU ($-CALTOP-3)/2 ;LET THE ASSEMBLER DO THE WORK. ;* ;***************************************************************************** ;* ;* NB. ALTHOUGH THE USE OF CALL "00" IN THE ABOVE EXAMPLE WOULD CAUSE ;* THE RTS TO ISSUE THE FOLLOWING ERROR:- ;* 164 - CALL CODE DOES NOT EXIST ;* THE USER IS AT LIBERTY TO PROVIDE HIS OWN CODE, BY PLUGGING IN ;* THE APPROPRIATE ROUTINE ADDRESS. ;* ;* SIMILARLY, OTHER ROUTINES MAY BE ADDED BY INCREASING THE NUMBER ;* OF ADDRESSES SPECIFIED. IF THESE ARE ADDED BEFORE THE MAXNO EQUATE, ;* THEN THE BYTE AT CALTOP WILL ALWAYS BE CORRECT ;* ;* ;* ;* ; ; ; ; ; ; ; ;***************************************************************************** ;* ;*ROUTINE: DECBIN ;* ;*CALLING SEQUENCE: ;* CALL "01" USING PARA1 PARA2 PARA3. ;* ;*FUNCTION: THIS ROUTINE CONVERTS A STRING OF DECIMAL (ASCII) ;* DIGITS INTO A 16 BIT BINARY QUANTITY. IT IS VERY LOW LEVEL ;* IN THAT IT EXPECTS A POSITIVE DECIMAL VALUE ;* ;*PARAMETERS: PARA1 - ADDRESS OF LENGTH OF DECIMAL STRING ;* HELD AS 1 BYTE ASCII DIGIT (NOT CHECKED) ;* THIS ADDRESS WILL BE NO. 2 ON STACK ;* ;* PARA2 - ADDRESS OF DECIMAL STRING ;* THIS ADDRESS WILL BE IN B,C ON ENTRY ;* ;* PARA3 - ADDRESS OF RESULT AREA. ;* SPECIFIES A 2 BYTE AREA ;* THIS ADDRESS WILL BE IN D,E ON ENTRY ;* ;*VALUES RETURNED: 16 BIT RESULT IN PARA3 ;* ;* ;***************************************************************************** ;* DECBIN: POP H ;GET RETURN ADDRESS OFF STACK XTHL ;GET ADDRESS OF PARA1 ;PUTTING RETURN ADDRESS BACK. ;* MOV A,M ;PUT IT IN ACCUMULATOR ANI 0FH ;CONVERT TO BINARY PUSH D ;SAVE ADDRESS OF RESULT PUSH B ;MOVE STRING REF POP D ; INTO D,E LXI H,0 ;HL = BINARY ACCUMULATOR DEC10: PUSH PSW ;SAVE THE COUNT DAD H ;BINARY ACCUMULATOR *2 MOV B,H ; AND MOVE IT INTO B,C MOV C,L ; DAD H ;BINARY ACCUMULATOR *4 DAD H ; *8 DAD B ; *8 + *2 = *10 ; (IE. 8X + 2X = 10X) ;------------------------ LDAX D ;GET THE DECIMAL CHAR INX D ANI 0FH ;CONVERT TO BINARY CHAR MVI B,0H MOV C,A DAD B ;ACC + CHAR POP PSW DCR A ;KEEP COUNT JNZ DEC10 ;* ;* NOW STORE RESULT IN USER'S AREA. ;* XCHG ;PUT RESULT IN D,E POP H ;GET ADDRESS OF RESULT AREA MOV M,D ;STORE MS BYTE INX H MOV M,E ;STORE LS BYTE RET ; ;***************************************************************************** ;* ;*ROUTINE: BINDEC ;* ;*CALLING SEQUENCE: ;* CALL "02" USING PARA1 PARA2. ;* ;*FUNCTION: TAKES THE BINARY QUANTITY ADDRESSED BY PARA1 AND CONVERTS ;* IT INTO A 5 DIGIT DECIMAL (ASCII) NO. THE RESULT IS PLACED ;* IN THE AREA SPECIFIED BY PARA2. ;* ;*PARAMETERS: PARA1 = ADDRESS OF 16 BIT (2 BYTE) QUANTITY. ;* WILL BE IN REG B,C ON ENTRY ;* ;* PARA2 = ADDRESS OF 5 BYTE RESULT AREA. ;* WILL BE IN REG D,E ON ENTRY ;* ;*VALUES RETURNED: ;* 5 DIGIT ASCII VALUE IN PARA2. ;* ;***************************************************************************** BINDEC: PUSH B ;GET VALUE ADDR POP H ; IN H,L MOV B,M ;VALUE INX H ; IN MOV C,M ; B,C LXI H,0 ;PUSH CONSTANTS PUSH H ; ON TO LXI H,-10 ; STACK PUSH H ; FOR USE LXI H,-100 ; DURING ;* PUSH H ; BINARY TO DECIMAL CONVERSION. LXI H,-1000 PUSH H LXI H,-10000 PUSH H ;* ;D,E = ADDRESS OF RESULT FIELD CN25: MVI A,30H ;SET TALLY TO ASCII ZERO CN30: POP H ;GET THE CONSTANT PUSH H ;RESTORE IT DAD B ;SUBTRACT FROM SOURCE OP JNC CN40 ;ITS GONE NEGATIVE INR A ;INC TALLY PUSH H ;REPLACE B,C WITH POP B ; NEW RESULT JMP CN30 CN40: POP H ;CLEAR CONSTANT OFF STACK STAX D ;STORE TALLY IN RESULT FIELD INX D ;INC RESULT ADDR POINTER POP H ;ANY MORE CONSTANTS ? MOV A,L ORA H JZ CN50 ;NO - FINISH OFF PUSH H ;YES - RESTORE IT JMP CN25 CN50: MOV A,C ;INSERT UNITS ADI 30H ;CONVERT TO ASCII STAX D RET ;RETURN ;* ;* ;* END «eof»