!**************************************!
! AMORT - CREATE AMORTIZATION SCHEDULE !
! 12/15/87 - Gregory Scott Berthume    !
! COMPIL and RUN from the dot          !
!**************************************!

MAP1 WORK'VARIABLES
       MAP2 SYSDAT,S,6
       MAP2 TODAY,S,8
       MAP2 DAY,S,2
       MAP2 YEAR,F
       MAP2 YEARS,F
       MAP2 FLTDAT,F
       MAP2 PAGENO,F,6,0
       MAP2 TAMOUNT,F
       MAP2 X,F,6,0
       MAP2 LP,F
       MAP2 P,F,6,0
       MAP2 M,F
       MAP2 INXCTL,F
       MAP2 CNGCTL,F
       MAP2 ENTRY,S,30
       MAP2 NAME,S,30
       MAP2 DATE'DUE,S,6
       MAP2 PLINE,S,80
       MAP2 RATE,F
       MAP2 AMOUNT,F
       MAP2 PAYMNT,F
       MAP2 M'RATE,F
       MAP2 TOTAL'PTI,F
       MAP2 TOTAL'PTP,F
       MAP2 TI,F,6,0
       MAP2 TP,F,6,0
       MAP2 PAID'TO'PRINCIPAL,F,6,0
       MAP2 BALANCE,F,6,0
       MAP2 INTEREST,F
       MAP2 MONTH,S,9

       XCALL RDATE,FLTDAT
       SYSDAT = FLTDAT USING "#ZZZZZ"
       on error goto TRAP
 XCALL NOECHO
 PRINT TAB(-1,0);TAB(-1,32);" PRINT AMORTIZATION SCHEDULE FOR: ";TAB(-1,33)

GET'NAME:
 PRINT TAB(08,12);"PLEASE ENTER NAME ";
 XCALL INPUT,08,30,30,0,"AE",ENTRY,INXCTL,1
 IF INXCTL = 2 THEN END
 NAME = ENTRY : PRINT TAB(2,2);NAME

GET'RATE:
 PRINT TAB(10,12);"ENTER INTEREST RATE ";
 XCALL INPUT,10,33,4,0," E",ENTRY,INXCTL,1
 IF ENTRY = "" THEN ENTRY = 1200
 PRINT TAB(10,33);ENTRY/100 USING "##.##";"%"
 IF INXCTL = 2 THEN END
 RATE = ENTRY

GET'AMOUNT:
 PRINT TAB(12,12);"ENTER PRINCIPAL ";
 XCALL INPUT,12,29,10,0,"$ ",ENTRY,INXCTL,1
 IF INXCTL = 2 THEN END
 AMOUNT = ENTRY[1,10] : TAMOUNT = AMOUNT

GET'PAYMNT:
 PRINT TAB(14,12);"ENTER MONTHLY PAYMENT AMOUNT ";
 XCALL INPUT,14,43,6,0,"$ ",ENTRY,INXCTL,1
 IF INXCTL = 2 THEN END
 PAYMNT = ENTRY[1,6]

GET'DATE'DUE:
 PRINT TAB(16,12);"ENTER DATE 1ST PAYMENT DUE ";
 XCALL INPUT,16,43,6,0,"DE",ENTRY,INXCTL,1
 IF INXCTL = 2 THEN END
 CALL ANYCNG : ON CNGCTL GOTO DO'OVER
 DATE'DUE = ENTRY

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! COMPUTE PAID TO INTEREST & PAID TO PRINCIPAL WITH REMAINING PRINCIPAL !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 XCALL WAIT,2
 OPEN #1,"AMORT.PRT", OUTPUT
 CALL HEADING

 M'RATE = ((RATE / 100) / 12) *.01
 DAY = DATE'DUE[3,4] : YEAR = DATE'DUE[5,6] : YEAR = VAL(YEAR)
 M = VAL(DATE'DUE[1,2])

PRINT'REPORT:
 INTEREST = (M'RATE * AMOUNT) : TOTAL'PTI = TOTAL'PTI + INTEREST
 TI = TI + INTEREST
 PAID'TO'PRINCIPAL = (PAYMNT - INTEREST) : TOTAL'PTP = TOTAL'PTP + PAID'TO'PRINCIPAL
 TP = TP + PAID'TO'PRINCIPAL
 AMOUNT = AMOUNT - PAID'TO'PRINCIPAL
 GOSUB MONTH
 M = M + 1 : X = X + 1

 PLINE[4;3] = X USING "###"
 YEARS =(1900 + YEAR) USING "####"
 PLINE[14;LEN(MONTH)+10] = MONTH + " " + DAY +", " + YEARS
 PLINE[38;9] = INTEREST/100 USING "##,###.##"
 PLINE[53;9] = PAID'TO'PRINCIPAL/100 USING "##,###.##"
 PLINE[67;10] = AMOUNT/100 USING "###,###.##"
 CALL PRINT
 IF MONTH = "DECEMBER" THEN YEAR = YEAR + 1
 IF MONTH = "DECEMBER" THEN GOSUB YEAR'END'TOTALS
 IF (AMOUNT < PAYMNT) THEN GOTO SPOOL
 GOTO PRINT'REPORT

SPOOL:
 GOSUB MONTH :  X = X + 1 : CALL PRINT
 INTEREST = (M'RATE * AMOUNT)
 PLINE[4;3] = X USING "###"
 PLINE[14;LEN(MONTH)+10] = MONTH + " " + DAY +", " + YEARS
 PLINE[38;9] = INTEREST/100 USING "##,###.##"
 LP = (AMOUNT + INTEREST)
 PLINE[52;10] = AMOUNT/100 USING "###,###.##"
 PLINE[68;9] = 0 USING "##,###.##"
 CALL PRINT
 PLINE[14;14] = "LAST PAYMENT ="
 PLINE[30;9] = LP/100 USING "##,###.##"
 CALL PRINT
 GOSUB THATS'ALL
 GOSUB LOAN'TOTALS

END'PROGRAM:
 CLOSE #1
 PRINT TAB(15,22);"# OF PAYMENTS = ";X
 XCALL MESAG,"FILE NAME = AMORT.PRT",2
 END

YEAR'END'TOTALS:
 PLINE[14;18] = "------------------"
 PLINE[35;12] = "------------"
 PLINE[50;12] = "------------" : CALL PRINT
 PLINE[14;15] = "YEAR END TOTALS"
 PLINE[37;10] = TOTAL'PTI/100 USING "###,###.##"
 PLINE[52;10] = TOTAL'PTP/100 USING "###,###.##"
 TOTAL'PTI = 0 : TOTAL'PTP = 0
 CALL PRINT : CALL PRINT
 RETURN

THATS'ALL:
 CALL PRINT
 PLINE[14;18] = "------------------"
 PLINE[35;12] = "------------"
 PLINE[50;12] = "------------" : CALL PRINT
 PLINE[14;15] = "YEAR END TOTALS"
 TOTAL'PTI = TOTAL'PTI + INTEREST
 TOTAL'PTP = TOTAL'PTP + AMOUNT
 PLINE[37;10] = TOTAL'PTI/100 USING "###,###.##"
 PLINE[52;10] = TOTAL'PTP/100 USING "###,###.##"
 CALL PRINT
 RETURN

LOAN'TOTALS:
 CALL PRINT : CALL PRINT : CALL PRINT
 TI = TI + INTEREST : TP = TP + AMOUNT
 PLINE[14;12] = "LOAN TOTALS:"
 PLINE[37;10] = TI/100 USING "###,###.##"
 PLINE[52;10] = TP/100 USING "###,###.##"
 CALL PRINT
 RETURN

HEADING:
 PAGENO = PAGENO + 1
 PLINE[1;48] = "                           AMORTIZATION SCHEDULE"
 CALL PRINT
 PLINE[1;43] = "                               PREPARED BY:"
 CALL PRINT
 PLINE[1;47] = "                            BASIC SYSTEMS, INC."
 CALL PRINT
 CALL PRINT : CALL PRINT
 TODAY = SYSDAT[1,2] + "/" + SYSDAT[3,4] + "/" + SYSDAT[5,6]
 PLINE[1;8] =TODAY
 PLINE[70;5] = "PAGE "
 PLINE[76;1] = PAGENO
 CALL PRINT : CALL PRINT
 PLINE[1;5] = "FOR: " : PLINE[6;30] = NAME : PLINE[38;16] = "ON THE AMOUNT OF"
 PLINE[66;11] = TAMOUNT/100 USING "$$##,###.##"
 CALL PRINT
 PLINE[1;11] = "PAYMENTS = " : PLINE[13;8] = PAYMNT/100 USING "#,###.##"
 PLINE[38;2] = "AT" : PLINE[41;5] = RATE/100 USING "##.##" : PLINE[46;1] = "%"
 CALL PRINT : CALL PRINT
 PRINT #1,"  PAYMENT    PAYMENT                   PAID TO        PAID TO      REMAINING"
 PRINT #1,"  NUMBER       DATE                   INTEREST      PRINCIPAL      PRINCIPAL"
 CALL PRINT
 RETURN

MONTH:
 IF M = 1 THEN MONTH = "JANUARY"
 IF M = 2 THEN MONTH = "FEBRUARY"
 IF M = 3 THEN MONTH = "MARCH"
 IF M = 4 THEN MONTH = "APRIL"
 IF M = 5 THEN MONTH = "MAY"
 IF M = 6 THEN MONTH = "JUNE"
 IF M = 7 THEN MONTH = "JULY"
 IF M = 8 THEN MONTH = "AUGUST"
 IF M = 9 THEN MONTH = "SEPTEMBER"
 IF M =10 THEN MONTH = "OCTOBER"
 IF M =11 THEN MONTH = "NOVEMBER"
 IF M =12 THEN MONTH = "DECEMBER"
 IF M = 12 THEN M = 0
 RETURN

PRINT:
 PRINT #1, PLINE : PLINE = ""
 P = P + 1 : IF P = 55 THEN CALL DIVIDE
 RETURN

DIVIDE:
 PRINT #1,CHR$(12)
 P = 1
 CALL HEADING
 RETURN

ANYCNG:
 CNGCTL = 2
 XCALL ANYCN,CNGCTL,WHATNO
 RETURN

DO'OVER:
 CHAIN "AMORT"

TRAP:
 CHAIN "AMORT"