1 ! & ! A M O R T . B A S & ! $ 5 ON ERROR GOTO 19000 ! STANDARD ON ERROR & ! 10 EXTERNAL LONG FUNCTION & SMG$CREATE_PASTEBOARD, & SMG$CREATE_VIRTUAL_DISPLAY, & SMG$CREATE_VIRTUAL_KEYBOARD, & SMG$ERASE_DISPLAY, & SMG$ERASE_LINE, & SMG$ERASE_PASTEBOARD, & SMG$HOME_CURSOR, & SMG$PASTE_VIRTUAL_DISPLAY, & SMG$PUT_CHARS, & SMG$READ_FROM_DISPLAY, & SMG$READ_STRING, & SMG$RETURN_CURSOR_POS, & SMG$SET_CURSOR_ABS, & SMG$SET_PHYSICAL_CURSOR, & UTL_FILE_SCAN, & LIB$SPAWN 15 EXTERNAL LONG CONSTANT & SS$_NORMAL, & SS$_CANCEL, & SMG$_INVPAS_ID, & SMG$_INVDIS_ID, & SMG$_INVCOL, & SMG$_INVROW, & SMG$_EOF, & SMG$_INVKBD_ID, & SMG$_INVKTB_ID, & SMG$_ILLBATFNC, & SMG$_INVMAXLEN, & SMG$_WRONUMARG, & LIB$_INVSTRDES, & LIB$_INSVIRMEM 20 DECLARE LONG DISPLAY1, ROWS, COLS, BORDER, ISTAT, NEW_PID 21 DECLARE LONG ROW, COL, HEIGHT, WIDTH, JD, JA, HOME, KEYBOARD 22 DECLARE STRING RET_STR 40 BORDER = 0 & \ ROWS = 24 & \ COLS = 80 & \ HOME = 1 & \ CR$ = CHR$(13%) & \ BELL$ = CHR$(7%) & \ ERRLINE$ = "Error calling routine " & \ ISTAT = SMG$CREATE_PASTEBOARD(NEW_PID,,ROWS,COLS,) & \ ISLIN = 40 ! The line number & \ GOTO 200 IF ISTAT <> 1% & \ ISTAT = SMG$CREATE_VIRTUAL_DISPLAY(ROWS,COLS,DISPLAY1,,,) & \ GOTO 205 IF ISTAT <> 1% & \ ISTAT = SMG$CREATE_VIRTUAL_KEYBOARD(KEYBOARD,,,) & \ GOTO 255 IF ISTAT <> 1% 45 CALL SMG$GET_DISPLAY_ATTR(DISPLAY1,HEIGHT,WIDTH,,,) 50 DIM INFO$(75%,3%), & AMT(75%,5%) ! ARRAYS FOR STORING INFO & \ FOR I%=1% TO 75% ! LOOP TO EXTEND STRING & \ INFO$(I%,1%)=SPACE$(20%) ! ...ARRAY ELEMENTS & \ INFO$(I%,2%)=SPACE$(4%) & \ INFO$(I%,3%)=SPACE$(9%) & \ NEXT I% & ! 100 OPEN 'TT:' AS FILE 1% ! OPEN KEYBOARD ON ONE & \ OPEN 'AMORT.LIS' ! OPEN LISTING FILE & FOR OUTPUT AS FILE 8% ! ...ON CHANNEL EIGHT & \ M0$='##>' ! MASK FOR SCREEN & \ M1$= SPACE$(7%) + '###' + ! MASK FOR REPORT & SPACE$(7%) + '###.##' + & SPACE$(7%) + '##,###.##' + & SPACE$(7%) + '##,###.##' + & SPACE$(7%) + '##,###.##' & \ M2$='$##,###.##' & \ HEADER$='* Amortization Schedule *' & \ ERRMS$=CHR$(7%)+'?ERR?' ! ERROR MESSAGE & \ MESS$='End current page' ! MESSAGE FOR DATA ENTRY & \ NOT.DONE%=-1% ! SET SWITCH & \ PAGE%,LN.ITM%=1% ! INITALIZE COUNTERS & \ GOSUB 10000 ! DRAW MASQUE & \ GOSUB 1000 ! ENTER LOAN DATA & \ GOSUB 2000 ! GENERATE PRINT OUT & \ GOTO 9000 ! GOTO END OF JOB 199 ! & ! S M G $ E R R O R S & ! $ 200 PRINT ERRLINE$;"SMG$CREATE_PASTEBOARD";ISTAT;" ON LINE ";ISLIN & \ GOTO 32767 205 PRINT ERRLINE$;"SMG$CREATE_VIRTUAL_DISPLAY";ISTAT; "ON LINE ";ISLIN & \ GOTO 32767 210 PRINT ERRLINE$;"SMG$ERASE_DISPLAY";ISTAT;"ON LINE ";ISLIN & \ GOTO 9000 215 PRINT ERRLINE$;"SMG$PASTE_VIRTUAL_DISPLAY";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 220 PRINT ERRLINE$;"SMG$SET_CURSOR_ABS";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 225 PRINT ERRLINE$;"SMG$RETURN_CURSOR_POS";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 230 PRINT ERRLINE$;"SMG$ERASE_LINE";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 235 PRINT ERRLINE$;"SMG$ERASE_PASTEBOARD";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 240 PRINT ERRLINE$;"SMG$PUT_CHARS";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 245 PRINT ERRLINE$;"SMG$HOME_CURSOR";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 250 PRINT ERRLINE$;"SMG$SET_PHYSICAL_CURSOR";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 255 PRINT ERRLINE$;"SMG$CREATE_VIRTUAL_KEYBOARD";ISTAT;"ON LINE";ISLIN & \ GOTO 32767 260 PRINT ERRLINE$;"SMG$READ_STRING";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 265 PRINT ERRLINE$;"SMG$READ_FROM_DISPLAY";ISTAT;"ON LINE";ISLIN & \ GOTO 9000 1000 ! & ! LOOP TO GET PAGES & ! & WHILE NOT.DONE% AND PAGE% <=5% ! MAXIMUM OF FIVE PAGES & \ ROW = 5 & \ COL = 1 & \ ISTAT = SMG$ERASE_DISPLAY(DISPLAY1,ROW,COL,ROWS,COLS) & \ ISLIN = 1000 ! Set program line number & \ GOTO 210 IF ISTAT <> 1% & \ COL = 70 & \ PAGE$ = "Page " + NUM1$(PAGE%) ! Set Page Number String & \ X = FNPUTCHARS(HOME,COL,PAGE$) ! Print New Page Number & \ ISTAT = SMG$PASTE_VIRTUAL_DISPLAY(DISPLAY1,NEW_PID,HOME,HOME) & \ GOTO 215 IF ISTAT <> 1% & \ L.STRT%=(PAGE%-1%)*15%+1% ! LINE ITEM TO START WITH & \ L.STP%=PAGE%*15% ! LINE ITEM TO END WITH & \ GOSUB 1100 ! GOSUB TO GET INFORMATION & \ GOSUB 1200 ! GOSUB TO MAKE ANY CHANGES & UNLESS LN.ITM%=L.STRT% ! ...UNLESS THEY ENDED ON & ! ...THE FIRST LINE OF SCREEN & \ PAGE%=PAGE%+1% ! INCREMENT PAGE COUNT & \ NEXT ! AND REPEAT & \ RETURN & ! 1100 ! & ! LOOP TO GET (MAX) 15 LINE ITEMS PER PAGE & ! & WHILE NOT.DONE% AND LN.ITM% <= L.STP% ! MAX FIFTEEN ENTRIES PER PAGE & \ CD%=LN.ITM%-(PAGE%-1%)*15%+4% ! ROW POSITION ON SCREEN & \ GOSUB 1300 ! GET LINE ITEM INFO & \ LN.ITM%=LN.ITM%+1% IF NOT.DONE% ! ...IF NOT DONE THEN INCR CNTR & \ NEXT ! AND REPEAT & \ RETURN & ! 1200 ! & ! MAKE CHANGES TO CURRENT SCREEN & ! & MESS$='End loan entry' & IF NOT.DONE%=0% OR LN.ITM%=75% ! LAST SCREEN? & \ SAVE.ITM%=LN.ITM% ! RETAIN LINE ITEM COUNTER & \ X = FNPUTCHARS(24%,1%,CHR$(7%)+MESS$) ! Print Message & \ YN%=-1% & \ WHILE YN% ! WHILE THERE IS A VALUE & \ YN%=FNANYCHG%(L.STRT%,SAVE.ITM%-1%) ! ANY LINES TO CHANGE? & \ IF YN% THEN LN.ITM%=YN% ! IF SO, SET LINE ITEM NUMBER & \ CD%=LN.ITM%-(PAGE%-1%)*15%+4% ! FIGURE CURSOR DOWN POSITION & \ X$ = FNC$(CD%,1%) ! & \ X$ = FNC2$ ! Clear line from screen & \ LSET INFO$(LN.ITM%,1%) = "" & \ LSET INFO$(LN.ITM%,2%) = "" & \ LSET INFO$(LN.ITM%,3%) = "" & \ AMT(LN.ITM%,G%) = 0.0 FOR G% = 0% TO 5% & \ GOSUB 1300 ! Make Changes & \ GOTO 1209 1208 GOTO 1210 1209 NEXT ! AND REPEAT 1210 LN.ITM%=SAVE.ITM% ! RESET LINE ITEM COUNTER & \ SAVE.ITM%=0% ! RESET SAVE ITEM TO ZERO & \ IF NOT.DONE% & THEN & X = FNPUTCHARS(21%,35%,CHR$(7%)+"New Page?") & \ YN$=FNKB.GET$(21%,45%,1%,1%,4%) & \ X$ = FNC$(21%,35%) & \ X$ = FNC2$ & \ NOT.DONE%=0% IF YN$='N' 1220 RETURN ! AND OUT & ! 1300 ! & ! GET INFORMATION ABOUT ONE LOAN FROM SCREEN & ! & \ A$ = FORMAT$(LN.ITM%,M0$) & \ X = FNPUTCHARS(CD%,1%,A$) 1310 A$ = FNKB.GET$(CD%,5%,21%,1%,5%) & \ IF A$=STRING$(LEN(A$),48%) AND SAVE.ITM% & THEN & X$ = FNC$(CD%,5%) & \ X$ = FNC2$ & \ X = FNPUTCHARS(CD%,5%,BELL$+"Entry required while changing!") & \ SLEEP 4% & \ X$ = FNC$(CD%,5%) & \ X$ = FNC2$ & \ GOTO 1310 1312 IF A$ = STRING$(LEN(A$),48%) AND SAVE.ITM% = 0% & THEN & X$ = FNC$(CD%,1%) & \ X$ = FNC2$ & \ NOT.DONE% = 0% & \ RETURN 1314 LSET INFO$(LN.ITM%,1%)=A$ & ! 1315 A$ = FNKB.GET$(CD%,29%,9%,2%,5%) & \ GOTO 1300 IF LEFT(EDIT$(A$,32%),2%) = "/B" & \ ON ERROR GOTO 1316 & \ X = VAL(A$) & \ LSET INFO$(LN.ITM%,3%) = A$ & \ GOTO 1320 1316 RESUME 1317 1317 ON ERROR GOTO 19000 & \ X = FNPUTCHARS(CD%,29%,ERRMS$) & \ SLEEP 3% & \ GOTO 1315 1320 !>>>>>>>> LOAN TYPE & ! & A$ = FNKB.GET$(CD%,41%,4%,1%,5%) & \ GOTO 1315 IF LEFT(EDIT$(A$,32%),2%) = "/B" & \ LSET INFO$(LN.ITM%,2%)=A$ & ! 1330 !>>>>>>>> INTEREST RATE & ! & A$ = FNKB.GET$(CD%,48%,4%,3%,202%) & \ GOTO 1320 IF LEFT(EDIT$(A$,32%),2%) = "/B" & \ IF VAL(A$) <= 0.0 & THEN & X = FNPUTCHARS(CD%,48%,ERRMS$) & \ SLEEP 3% & \ GOTO 1330 1332 AMT(LN.ITM%,1%)=VAL(A$) & ! 1340 !>>>>>>>> PRINCIPAL & ! & A$=FNKB.GET$(CD%,57%,7%,3%,202%) & \ GOTO 1330 IF LEFT(EDIT$(A$,32%),2%) = "/B" & \ IF VAL(A$) <= 0.0 & THEN & X = FNPUTCHARS(CD%,57%,ERRMS$) & \ SLEEP 3% & \ GOTO 1340 1342 AMT(LN.ITM%,2%)=VAL(A$) & ! 1350 ! >>>>>>> NUMBER OF YEARS & ! & A$=FNKB.GET$(CD%,70%,2%,0%,1%) & \ GOTO 1340 IF LEFT(EDIT$(A$,32%),2%) = "/B" & \ GOTO 1370 IF VAL(A$)=0.0 & \ IF VAL(A$) < 0.0 & THEN & X = FNPUTCHARS(CD%,70%,ERRMS$) & \ SLEEP 3% & \ GOTO 1350 & ! 1352 AMT(LN.ITM%,3%)=VAL(A$) & \ AMT(LN.ITM%,0%)=1 & ! 1360 ! >>>>>>> NUMBER OF PAYMENTS PER YEAR & ! & A$=FNKB.GET$(CD%,76%,2%,1%,1%) & \ GOTO 1350 IF LEFT(EDIT$(A$,32%),2%) = "/B" & \ IF VAL(A$) < 1 OR VAL(A$) > 12 & THEN & X = FNPUTCHARS(CD%,76%,ERRMS$) & \ SLEEP 3% & \ GOTO 1360 1362 AMT(LN.ITM%,4%)=VAL(A$) & \ GOTO 1399 & ! 1370 ! & ! HERE TO SPECIFY MONTHLY PAYMENT INSTEAD & ! OF LOAN PERIOD. & ! & SAVED% = 0% 1371 AMT(LN.ITM%,0%)=2 & \ ISLIN = 1371 & \ ISTAT = SMG$READ_FROM_DISPLAY(DISPLAY1,SAVLIN$,,CD%) IF NOT SAVED% & \ GOTO 265 IF ISTAT <> 1% & \ X$ = FNC$(CD%,55%) & \ X$ = FNC2$ & \ ISLIN = 1371.8 & \ ISTAT = SMG$READ_STRING(KEYBOARD,A$,"Desired Monthly Pymt?", & "6"L,,,,,,DISPLAY1,) & \ GOTO 9000 IF ISTAT = SMG$_EOF & \ GOTO 260 IF ISTAT <> 1% & \ GOTO 1360 IF LEFT(EDIT$(A$,32%),2%) = "/B" & \ IF INSTR(1%,A$,".") & THEN & SAVED% = -1% & \ GOTO 1371 1373 IF VAL(A$) < 1.00 & THEN & X = FNPUTCHARS(CD%,73%,ERRMS$) & \ SAVED% = -1% & \ GOTO 1371 1374 AMT(LN.ITM%,5%) = VAL(A$) & ! 1375 ! & IT=AMT(LN.ITM%,1%)*1E-4 & \ PA=AMT(LN.ITM%,5%)*1E-2 & \ PR=AMT(LN.ITM%,2%)*1E-2 1376 X = FNPUTCHARS(CD%,1%,LEFT(SAVLIN$,54%)) & \ A$ = FORMAT$(PA,"###.##") & \ X = FNPUTCHARS(CD%,74%,A$) 1380 IT1=FIX(LOG(1.-((PR*IT)/(12.*PA)))/LOG(12./(12.+IT))) & \ AMT(LN.ITM%,3%)=IT1/12 & \ AMT(LN.ITM%,4%)=12% & \ ITMP%=AMT(LN.ITM%,3%)*AMT(LN.ITM%,4%)+1% & \ IF ITMP% > 120% & THEN & X = FNPUTCHARS(21%,10%,BELL$+ & "Calculated payback exceeds ten years (" + & "total of"+NUM$(ITMP%)+"payments)") & \ X$ = FNC$(22%,52%) & \ ISTAT = SMG$READ_STRING(KEYBOARD,XT$,"Accept this schedule?", & "6"L,,,,,,DISPLAY1,) & \ ISLIN = 1380 & \ GOTO 9000 IF ISTAT = SMG$_EOF & \ GOTO 260 IF ISTAT <> 1% & \ X$ = FNC$(21%,1%) & \ X$ = FNC2$ & \ XT$ = EDIT$(LEFT(XT$,1%),32%) & \ IF XT$ = "N" & THEN & X$ = FNC$(CD%,1%) & \ X$ = FNC2$ & \ GOTO 1300 1382 GOTO 1399 1390 X=FNPUTCHARS(21%,19%,BELL$+"Unable to calculate at designated payback")& \ SLEEP 4% & \ X$ = FNC$(CD%,1%) & \ X$ = FNC2$ & \ GOTO 1300 1399 RETURN & ! 2000 ! & ! PRINT REPORTS & ! & CALL LIB$ERASE_PAGE(1%,1%) & \ X = FNPUTCHARS(1%,1%,"Loan Entry Complete") & \ X = FNPUTCHARS(2%,1%,"Number of copies?") 2010 A$=FNKB.GET$(2%,19%,1%,1%,1%) & \ NCOPY%=VAL(A$) & \ IF NCOPY% < 1% OR NCOPY% > 5% & THEN & X = FNPUTCHARS(2%,19%,ERRMS$) & \ SLEEP 3% & \ X$ = FNC$(2%,19%) & \ X$ = FNC2$ & \ GOTO 2010 2020 X = FNPUTCHARS(3%,1%,"Paper Type?") & \ A$ = FNKB.GET$(3%,13%,1%,1%,1%) & \ IF INSTR(1%,'1\3\8',A$)=0% & THEN & X = FNPUTCHARS(3%,13%,ERRMS$) & \ SLEEP 3% & \ X$ = FNC$(3%,13%) & \ X$ = FNC2$ & \ GOTO 2020 2030 PAPER.TYPE% = VAL(A$) & \ PRINT #1% & \ PRINT #1%, 'Begin schedule generation'; & TAB(50%); TIME$(0%) & \ PRT.HDR$=HEADER$ & \ HEADER$='' & \ HEADER$=HEADER$+MID(PRT.HDR$,I%,1%)+' ' & FOR I%=1% TO LEN(PRT.HDR$) & \ LN.ITM%=LN.ITM%-1% ! GET OUT OF ROUTINE 1 HIGH & ! 2050 ! & ! LOOP TO PRINT SCHEDULE & ! & FOR I%=1% TO LN.ITM% ! REPEAT FOR EACH LOAN & \ NPAY%,PAGE%=0% & \ LN.CNT%=66% & \ T%=AMT(I%,0%) ! TYPE OF CALCULATION & \ GOSUB 2100 & \ NEXT I% ! AND REPEAT 2060 RETURN & ! 2100 ! & AMT(I%,1%)=AMT(I%,1%)*1E-4 & \ A, PRINC=AMT(I%,2%)*1E-2 & \ J=AMT(I%,1%) & \ ANNINT=J*1E2 & \ N,TOTNUM=AMT(I%,3%)*AMT(I%,4%) & \ I=J/AMT(I%,4%) & \ B=1+I & \ R=A*I/(1-1/B**N) & \ TOTINT=R*N-A & \ TOTPAY=PRINC+TOTINT & \ B=A & \ PAYMNT=FNRND(R) & \ IF AMT(I%,0%)=2% THEN & PAYMNT,R=AMT(I%,5%)*1E-2 & \ JB=B & \ JLT=0 & \ FOR JI%=1% TO N & \ JL=JB*I & \ JP=R-JL & \ JB=JB-JP & \ JLT=JLT+JL & \ NEXT JI% & \ TOTINT=JLT+FNRND(JB*I) & \ TOTPAY=PRINC+TOTINT & \ TOTNUM=TOTNUM+1 2105 GOSUB 2400 2110 L=B*I & \ P=R-L & \ B=B-P & \ NPAY%=NPAY%+1% & \ PRT1=NPAY% & \ PRT2=L & \ PRT3=P & \ PRT4=PAYMNT & \ PRT5=B & \ GOSUB 2300 & \ GOTO 2110 IF B>=R & \ PRT1=NPAY%+1% & \ PRT2=FNRND(B*I) & \ PRT3=FNRND(R-B*I) & \ PRT4=FNRND(B*I+B) & \ PRT3=FNRND(B) IF AMT(I%,0%)=2 & \ PRT4=PRT2+PRT3 IF AMT(I%,0%)=2 & \ PRINT #8% USING MID(M1$,1%,55%)+' *FINAL*', & PRT1, PRT2, PRT3, PRT4 & \ RETURN & ! 2300 ! & ! PRINT DETAIL LINE & ! & GOSUB 2500 IF LN.CNT% > 50% & \ PRINT #8% USING M1$, PRT1,PRT2,PRT3,PRT4,PRT5 & \ LN.CNT%=LN.CNT%+1% & \ RETURN & ! 2400 ! & ! PRINT HEADER SHEET & ! & PRINT #8%, CHR$(12%); & \ PRINT #8%, FOR CNT%=1% TO 14% & \ PRINT #8%, TAB(17%); HEADER$ & \ PRINT #8%, TAB(17%); & STRING$(LEN(HEADER$)-1%,45%) & \ PRINT #8%, CHR$(13%);CHR$(10%) & \ PRINT #8%, TAB(25%); & 'REQUESTED FOR - '; INFO$(I%,1%) & \ PRINT #8% & \ PRINT #8%, TAB(23%);"SOCIAL SECURITY - "; & LEFT(INFO$(I%,3%),3%);"-";MID(INFO$(I%,3%),4%,2%);"-"; & MID(INFO$(I%,3%),6%,4%) & \ PRINT #8% & \ PRINT #8%, TAB(29%); & 'LOAN TYPE - '; INFO$(I%,2%) & \ PRINT #8% & \ PRINT #8%, TAB(29%); & 'PRINCIPAL - '; & \ PRINT #8% USING M2$, PRINC & \ PRINT #8% & \ PRINT #8%, TAB(18%); & 'ANNUAL INTEREST RATE - '; & \ PRINT #8% USING '##.##%', ANNINT & \ PRINT #8% & \ PRINT #8%, TAB(14%); & 'TOTAL NUMBER OF PAYMENTS - '; & \ PRINT #8% USING '###', TOTNUM & \ PRINT #8% & \ PRINT #8%, TAB(21%); & 'TOTAL OF PAYMENTS - '; & \ PRINT #8% USING M2$, TOTPAY & \ PRINT #8% & \ PRINT #8%, TAB(24%); & 'TOTAL INTEREST - '; & \ PRINT #8% USING M2$, TOTINT & \ PRINT #8% & \ PRINT #8%, TAB(30%); & 'RUN DATE - '; DATE$(0%) 2498 RETURN 2500 ! & ! PAGE HEADER FOR SCHEDULE & ! & PAGE%=PAGE%+1% & \ PRINT #8%, CHR$(12%); & \ PRINT #8%, TIME$(0%); TAB(40%-LEN(PRT.HDR$)/2%); & PRT.HDR$; TAB(70%); 'PAGE '; PAGE% & \ PRINT #8% & \ PRINT #8%, TAB(7%); 'PAY'; TAB(17%); & 'APP TO'; TAB(33%); & 'APP TO'; TAB(47%); & 'PAYMENT';TAB(63%); & 'BALANCE' & \ PRINT #8%, TAB(8%); '#'; & TAB(18%); 'INT'; & TAB(34%); 'PRIN' & \ PRINT #8% & \ LN.CNT%=0% & \ RETURN & ! 9000 ! & ! END OF JOB & ! & PRINT #8%, CHR$(12%);CHR$(26%) ! PUT OUT FRM FD AND TOF & \ CLOSE 1%,8% ! CLOSE IT UP 9005 IF ISTAT <> 1% & THEN & GOSUB 9500 & \ PRINT ERMSG$ 9006 ISTAT = UTL_FILE_SCAN("AMORT",".LIS",FILNAM$,FILLEN%,,) 9007 FILNAM$ = "AMORT.LIS" IF FILLEN% <= 0% 9010 PRINT & \ PRINT 'Schedules created' & \ PRINT FILNAM$;" Submitted to be printed" 9015 SPOOLIT$ = "PRINT " + FILNAM$ & + "/FORM=" + NUM1$(PAPER.TYPE%) & + "/COPIES=" + NUM1$(NCOPY%) 9020 ISTAT = LIB$SPAWN(SPOOLIT$) 9098 GOTO 32760 ! AND END & ! 9500 ERMSG$ = "Invalid Display-Id" IF ISTAT = SMG$INVDIS_ID & \ ERMSG$ = "Invalid Column" IF ISTAT = SMG$INVCOL & \ ERMSG$ = "Invalid Row" IF ISTAT = SMG$INVROW & \ ERMSG$ = "Invalid Pasteboard-Id" IF ISTAT = SMG$INVPAS_ID & \ ERMSG$ = "Wrong Number of Arguments" IF ISTAT = SMG$WRONUMARG & \ ERMSG$ = "Invalid String Descriptor" IF ISTAT = LIB$INVSTRDES & \ ERMSG$ = "Insufficient virtual memory" IF ISTAT = LIB$INSVIRMEM & \ RETURN 10000 ! & ! PAINT MASK & ! & \ ISLIN = 10000 ! Set program line number & \ ISTAT = SMG$ERASE_DISPLAY(DISPLAY1,,,,) & \ GOTO 210 IF ISTAT <> 1% & \ ROW = 1 & \ COL = 1 & \ ISTAT = SMG$PUT_CHARS(DISPLAY1,TIME$(0%),ROW,COL) & \ GOTO 240 IF ISTAT <> 1% & \ COL = 27 & \ ISTAT = SMG$PUT_CHARS(DISPLAY1,HEADER$,ROW,COL) & \ GOTO 240 IF ISTAT <> 1% & \ ROW = 2 & \ ISTAT = SMG$PUT_CHARS(DISPLAY1,STRING$(LEN(HEADER$),45%),ROW,COL) & \ ISLIN = 10000.13 & \ GOTO 240 IF ISTAT <> 1% & \ ISTAT = SMG$PASTE_VIRTUAL_DISPLAY(DISPLAY1,NEW_PID,HOME,HOME) & \ X = FNPUTCHARS(4%,15%,"Name") & \ X = FNPUTCHARS(3%,30%,"Social") & \ X = FNPUTCHARS(4%,30%,"Security") & \ X = FNPUTCHARS(4%,42%,"Type") & \ X = FNPUTCHARS(4%,50%,"Int") & \ X = FNPUTCHARS(4%,60%,"Amount") & \ X = FNPUTCHARS(3%,72%,"#") & \ X = FNPUTCHARS(4%,71%,"Yrs") & \ X = FNPUTCHARS(3%,77%,"Pay") & \ X = FNPUTCHARS(4%,77%,"/Yr") & \ ISTAT = SMG$PASTE_VIRTUAL_DISPLAY(DISPLAY1,NEW_PID,HOME,HOME) & \ ISLIN = 10000.26 & \ GOTO 215 IF ISTAT <> 1% & \ RETURN & ! 13000 ! & ! ANY CHANGE ROUTINE & ! & DEF* FNANYCHG%(J%,J1%) & ! 13002 J0%=0% & \ PRINT #1%, CHR$(7%); FNC$(21%,35%); & 'Any change?'; & \ J$=FNKB.GET$(21%,47%,1%,1%,4%) & \ GOTO 13010 IF J$='N' 13004 PRINT #1%, FNC$(21%,35%);FNC2$; & 'Line item'; & \ J$=FNKB.GET$(21%,45%,LEN(NUM1$(J1%)),1%,1%) & \ J0% = VAL(J$) & \ IF J0% < J% OR J0% > J1% THEN & PRINT #1%, FNC$(21%,18%);FNC2$; & CHR$(7%); 'Entry out of range..'; & 'select'; J%; 'through'; J1% & \ SLEEP 3% & \ PRINT #1%, FNC$(21%,18%); FNC2$; & \ GOTO 13002 13010 PRINT #1%, FNC$(21%,35%);FNC2$; & \ FNANYCHG%=J0% & \ FNEND & ! 14000 ! & DEF* FNRND(JJ)=FIX(JJ*1E2+.5)*1E-2 & ! 19000 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< & ! >>>>>>>>>>>>>>>>>>>>>>>>>>>> ERROR HANDLER <<<<<<<<<<<<<<<<<<<<<<<<< & ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< & ! & RESUME 19001 ! RESUME BELOW TO RESET & ! 19001 ON ERROR GOTO 19000 & ! 19010 IF ERR=53 AND ERL=1380 THEN RESUME 1390 19020 IF ERR=52 AND ERL=1373 THEN RESUME 1371 19030 IF ERR=52 AND ERL=1315 THEN RESUME 1315 19040 RESUME 1340 IF ERR=52 AND ERL=1340 & \ RESUME 1350 IF ERR=52 AND ERL=1350 & \ RESUME 1360 IF ERR=52 AND ERL=1360 & \ RESUME 2010 IF ERR=52 AND ERL=2010 & \ RESUME 2020 IF ERR=52 AND ERL=2030 & \ RESUME 13004 IF ERR=52 AND ERL=13004 19099 PRINT CHR$(7%); 'Unexpected error number'; ERR; '('; & RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR)),3%);')'; & ' at line'; ERL & \ GOTO 9000 IF ISTAT <> 1 & \ GOTO 32767 21701 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< & ! >>>>>>>>>>>>>>>>>>> STANDARD KEYBOARD ENTRY ROUTINE <<<<<<<<<<<<<<<< & ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< & ! & DEF* FNKB.GET$(LONG KBY,LONG KBX,LONG KBM,KBN,KBT) & ! & ! ARGUMENTS: KBY = ROW & ! KBX = COLUMN & ! KBM = MAXIMUM NUMBER OF INPUT CHARACTERS & ! KBN = MINIMUM NUMBER OF INPUT CHARACTERS & ! KBT = TYPE OF DATUM TO BE ENTERED & ! + 100*NUMBER OF IMPLIED DECIMAL PLACES & ! & ! LEGAL DATUM TYPES: 1 = INTEGER & ! 2 = FLOATING POINT & ! 3 = DATE IN MMDDYY FORMAT & ! 4 = Y OR N ONLY & ! 5 = ASCII STRING DATA & ! & ! ADDING 5 TO DATUM SPECIFICATION TYPE ALLOWS & ! ENTRY OF 'END' IN FIELD & ! & ! EXAMPLE: X$=FNKB.GET$(10%,10%,7%,1%,202%) & ! & ! EXAMPLE ALLOWS ENTRY OF FLOATING POINT NUMBER & ! IN RANGE OF PLUS OR MINUS 9,999.99 & ! & \ CCJMP%,KBP%,KBZ%=0% & \ KBZ%=1% IF KBT=4% OR KBT=9% & \ KBD%=KBT/100% & \ KBT=KBT-(KBD%*100%) & \ KBP%=1% IF KBT=1% & OR KBT=2% & OR KBT=6% & OR KBT=7% & \ KBS%=KBM + KBP% & \ KBS%=KBS%+1% IF KBD% & \ KBS%=8% IF KBT=3% OR KBT=8% & \ KJL%=(KBM-KBD%)/3% IF KBP% & \ KJL%=KJL%-1% IF KJL%*3%=KBM-KBD% IF KBP% & \ KJL%=KBM-KBD%+KJL% IF KBP% & \ KBE$=MID('###,###,###,###',16%-KJL%,15%) IF KBP% & \ KBE$=KBE$+'.'+STRING$(KBD%,35%) IF KBD% IF KBP% & \ KBE$=KBE$+'-' IF KBP% & \ KBS%=LEN(KBE$) IF KBP% & \ X$ = FNC$(KBY,KBX) & \ RESUME 21702 & ! 21702 ON ERROR GOTO 21703 & \ GOTO 21704 IF CCJMP% & \ X = FNPUTCHARS(KBY,KBX,"["+SPACE$(KBS%)+"]") & \ X$ = FNC$(KBY,KBX+1) & \ ISTAT = SMG$READ_STRING(KEYBOARD,RET_STR,,KBM,,,,REC_LEN,,DISPLAY1,) & \ ISLIN = 21702 & \ GOTO 9000 IF ISTAT = SMG$_EOF & \ GOTO 260 IF ISTAT <> 1% & \ CCN$ = RET_STR + "" & \ GOTO 21705 IF LEFT(EDIT$(CCN$,32%),2%) = "/B" & \ GOTO 21703 IF KBZ% & \ GOTO 21703 IF INSTR(1%,CCN$,'.') & IF KBP% & \ GOTO 21703 IF LEN(CCN$) < KBN & OR LEN(CCN$) > KBM & \ GOTO 21703 IF LEN(CCN$)=3% & AND CCN$='END' & \ CCN%=VAL(CCN$) IF KBT=1% & OR KBT=6% & \ CCN=VAL(CCN$) IF KBT=2% & OR KBT=3% & OR KBT=7% & OR KBT=8% & \ CCN=CCN/(10%**KBD%) IF KBD% IF KBT=2% & OR KBT=7% & \ X = FNPUTCHARS(KBY,KBX,"[") IF KBP% & \ OS$ = FORMAT$(CCN, KBE$) IF KBT = 2 OR KBT = 7 & \ OS$ = FORMAT$(CCN%,KBE$) IF KBT = 1 OR KBT = 6 & \ X = FNPUTCHARS(KBY,KBX+1,OS$) IF KBT = 1 OR KBT = 6 & OR KBT = 2 OR KBT = 7 & \ GOTO 21704 IF ((CCN=0.) & AND (KBT=3% & OR KBT=8%)) & \ GOTO 21703 IF ((KBT=3% & OR KBT=8%) & AND (CCN < 10100 & OR CCN > 123199)) & \ CCN$='0' + CCN$ IF KBT<>0% & AND KBT<>5% & AND LEN(CCN$)=5% & \ CCNDATE$ = LEFT(CCN$,2%) + "/" & + MID(CCN$,3%,2%) + "/" & + RIGHT(CCN$,5%) & \ X = FNPUTCHARS(KBY,KBX+1,CCNDATE$) IF KBT = 3 OR KBT = 8 & \ GOTO 21704 & ! 21703 CCJMP%=3% IF KBT> 4% AND EDIT$(CCN$,32%)='END' AND LEN(CCN$) =3% & \ CCJMP%=1% IF KBZ% IF CCN$='Y' & \ CCJMP%=2% IF KBZ% IF CCN$='N' & \ CCN$=STRING$(KBM,48%) IF CCJMP%=3% & \ RESUME 21702 IF CCJMP% & \ X = FNPUTCHARS(KBY,KBX+1,"?ERR?"+CHR$(7%)) & \ SLEEP 1% & \ X = FNPUTCHARS(KBY,KBX+1,SPACE$(5%)) & \ RESUME 21702 & ! 21704 RESUME 21705 21705 ON ERROR GOTO 19000 & \ FNKB.GET$=CCN$ & \ FNEND & ! & ! 21800 ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< & ! >>>>>>>>>>>>>>>>>>>>>> STANDARD CURSOR ROUTINES <<<<<<<<<<<<<<<<<<<< & ! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 21820 ! & DEF* FNC$(LONG JD,LONG JA) ! DIRECT CURSOR ADDRESS & ! & \ ISTAT = SMG$SET_CURSOR_ABS(DISPLAY1,JD,JA) & \ ISLIN = 21820 ! SET PROGRAM LINE NUMBER & \ GOTO 220 IF ISTAT <> 1% & \ ISTAT = SMG$PASTE_VIRTUAL_DISPLAY(DISPLAY1,NEW_PID,HOME,HOME) & \ FNEND & ! 21825 DEF* FNPUTCHARS(LONG JD, LONG JA, STRING JSTR) & \ ISTAT = SMG$PUT_CHARS(DISPLAY1,JSTR,JD,JA) & \ ISLIN = 21825 & \ GOTO 240 IF ISTAT <> 1% & \ FNEND 21830 ! & DEF* FNC2$ ! ERASE TO END OF LINE & ! & \ ISTAT = SMG$RETURN_CURSOR_POS(DISPLAY1,ROW,COL) & \ ISLIN = 21830 ! SET PROGRAM LINE NUMBER & \ GOTO 225 IF ISTAT <> 1% & \ ISTAT = SMG$ERASE_LINE(DISPLAY1,ROW,COL) & \ GOTO 230 IF ISTAT <> 1% & \ FNEND & ! 32760 PRINT "Finished";TAB(50%); TIME$(0%) & \ X$=SYS(CHR$(9%)) & ! 32767 END