.PREL .IDENT MATH .INSERT HVG.LIB .INSERT MACRO.LIB .INSERT BBEQU.ASM .RELOC ; BCD MATH ROUTINE INTERFACE ; IMPLEMENTS $+, $-, $*, */ BCDMAT:: RSTIGN INX D PUSH PSW ; SAVE CODE SCANNED CALL TSTVFF# ; GET FIRST VAR PUSH D LXI D,BCDA1# ; CONVERT TO BCD CALL ASCBCD POP D TSTCC COMMA,BCDDUD ; INSIST ON COMMAS CALL TSTVFF# ; GET 2ND VAR POP PSW PUSH D LXI D,BCDA2# ; SAME STORY PUSH PSW CALL ASCBCD LXI D,BCDA1# POP PSW MVI B,9 CALL DOBCDO POP D ; SCAN FOR PLACE TO STORE TSTCC COMMA,BCDDUD CALL TSTVFF# PUSH D LXI D,BCDA1# ; ARG1 CONTAINS THE RESULT - STICK IT LAST VAR LXI B,1200H BCDASC: XCHG INDEXN ADI '0' XCHG MOV M,A INX H INX H INR C DJNZ BCDASC POP D RSTFIN BCDDUD: JMP QWHAT# ; SUBROUTINE TO IT 1 DOBCDO: CPI 62H ; < MULT? JRNC BCD3 ; NO CPI '-' ; YES IS IT MINUS? JRZ BCD2 ; JUMP IF SO BCDADD ; NO - ITS ADD THEN RET BCD2: BCDSUB ; SUBTR 1 RET BCD3: JRNZ BCD4 ; JUMP IF NOT = TIMES BCDMUL ; ELSE MULT RET BCD4: BCDDIV RET ; SUBROUTINE TO CONVERT ASCII STRING TO BCD ; HL = ASCII IN, DE=BCD OUT ; OUT: DE=ASCII IN BUMPED, HL=BCD OUT NOT BUMPED ASCBCD: XCHG LXI B,1200H ASCBC1: LDAX D STOREN INR C INX D INX D DJNZ ASCBC1 RET ; RANDOM NUMBER FUNCTION RND:: RSTPAR MOV A,H ORA A JM QHOW# ORA L JZ QHOW# PUSH B PUSH D PUSH H ; SAVE RANGE CALL RND32 POP D ; GET RANGE BACK ; HL = RANDOM # CALL DIVIDE POP D POP B INX H RET ; 32 BIT RANDOM NUMBER GENERATOR FROM TERSE RND32:: LBCD BBRND# LXI H,1321H DAD B PUSH H LXI H,2776H DADC B LDED BBRND#+2 DAD D XTHL DAD B XTHL DADC D XTHL DAD B XTHL DADC D XTHL MOV D,E MOV E,B MOV B,C MVI C,0 DAD B SHLD BBRND# XTHL DADC D SHLD BBRND#+2 POP D RET ; ABSOLUTE VALUE FUNCTION ABS:: RSTPAR DCX D CALL CHKSGN INX D RET ; SIZE FUNCTION - RETURNS BYTES NOT YET USED SIZE:: LHLD TXTUNF# PUSH D XCHG LHLD HVDFTL# ANA A DSBC D POP D RET ; SIGN EXTEND SUBROUTINE SGNEXT:: MVI H,0 MOV A,L ANA A RP DCR H RET ; DIVIDE, SUBDE, CHKSGN, CHGSGN, CKHLDE DIVIDE:: PUSH H MOV L,H MVI H,0 CALL DV1 MOV B,C MOV A,L POP H MOV H,A DV1: MVI C,-1 DV2: INR C ANA A DSBC D JRNC DV2 DAD D RET CHKSGN:: MOV A,H ORA A RP CHGSGN:: MOV A,H ORA L RZ MOV A,H PUSH PSW CMA MOV H,A MOV A,L CMA MOV L,A INX H POP PSW XRA H JP QHOW# MOV A,B XRI 80H MOV B,A RET ;CKHLDE: MOV A,H ; XRA D ; JP CK1 ; XCHG ;CK1: CALL COMP ; RET ;COMP: MOV A,H ; CMP D ; RNZ ; MOV A,L ; CMP E ; RET .END