home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib39b.dsk / HEXADDITION.bas < prev    next >
BASIC Source File  |  2023-02-26  |  5KB  |  80 lines

  1. 10  REM   ******************************
  2. 20  REM   * HEXADDITION                *
  3. 30  REM   * BY DAVID HICKEY-SCHIAPPA   *
  4. 40  REM   * COPYRIGHT(C) 1990          *
  5. 50  REM   * MINDCRAFT PUBL. CORP.      *
  6. 60  REM   * CONCORD, MA 01742          *
  7. 70  REM   ******************************
  8. 80  PRINT  CHR$(17): HOME : HTAB 15: PRINT "HEXADDITION": HTAB 9: PRINT "BY DAVID HICKEY-SCHIAPPA": HTAB 1: PRINT "COPYRIGHT(C) 1990 MINDCRAFT PUBL. CORP.": VTAB 22: PRINT "press any key to start": VTAB 8
  9. 90  POKE  -16368,0
  10. 100  FOR TT = 1 TO 5: IF  PEEK( -16384) <128  THEN  FOR HT = 15 TO 25: HTAB HT: PRINT "+";: POKE  -16336,0: FOR ET = 1 TO 100: NEXT : HTAB HT: PRINT " ";: NEXT : NEXT 
  11. 110  FOR HT = 15 TO 25: HTAB HT: PRINT "+";: NEXT : PRINT : PRINT 
  12. 120  POKE  -16368,0
  13. 130  REM 
  14. 140  PRINT "This program will add or subtract two": PRINT "HEX numbers of 5 digits or less each.": PRINT : PRINT "Only valid HEX numbers are accepted.": PRINT "If you make a mistake, <ESC> to reenter"
  15. 150  POKE 34,14: REM  GET INPUT
  16. 160  CLEAR :HX$ = "0123456789ABCDEF": VTAB 15: HTAB 1: CALL  -958:NM$ = "": FOR X = 1 TO 40: PRINT "-";: NEXT : PRINT : PRINT "Enter the HEX numbers (<RET> to accept)"
  17. 170  PRINT "First number: $";
  18. 180  REM  GET FIRST NUMBER
  19. 190  POKE  -16368,0: GET TN$: IF TN$ =  CHR$(27)  THEN AH$ = "": CALL  -1008: HTAB 16: CALL  -958: GOTO 190: REM  IF <ESC> START OVER
  20. 200  IF TN$ =  CHR$(13)  AND  LEN(AH$) >0  THEN NM$ = AH$: GOSUB 530:AD = CH:TN$ = "": GOTO 250
  21. 210  IF TN$ =  CHR$(13) GOTO 190
  22. 220  GOSUB 700: GOSUB 730: PRINT TN$;: IF TN$ = ""  THEN  PRINT  CHR$(7);: GOTO 190: REM  CHECK FOR CASE & VALIDITY, & PRINT DIGIT
  23. 230 AH$ = AH$ +TN$: IF  LEN(AH$) >5  THEN  VTAB 18: HTAB 1: CALL  -958: PRINT  CHR$(7); CHR$(7);: INVERSE : PRINT "NUMBER TOO LONG!": NORMAL : FOR ET = 1 TO 2000: NEXT :AH$ = "": VTAB 18: HTAB 1: CALL  -958: GOTO 170
  24. 240  GOTO 190
  25. 250  REM  GET OPERANT
  26. 260  PRINT : PRINT : CALL  -958: PRINT "Choose A)dd or S)ubtract: ";
  27. 270  PRINT "A"; CHR$(8);: GET AS$: IF AS$ =  CHR$(13)  THEN AS$ = "A"
  28. 280  GOSUB 780: IF AS$ < >"A"  AND AS$ < >"S"  THEN AS$ = "": PRINT  CHR$(7);: VTAB 18: GOTO 260
  29. 290  PRINT AS$: HTAB 2: PRINT "( <RET> to accept; <ESC> to reject)";
  30. 300  GET RET$: IF RET$ =  CHR$(27)  THEN AS$ = "": VTAB 20: HTAB 27: CALL  -958: GOTO 270
  31. 310  IF RET$ < > CHR$(27)  AND RET$ < > CHR$(13)  THEN RET$ = "": PRINT  CHR$(7);: GOTO 300
  32. 320 VAS$ = "SUM":PM$ = "+": IF AS$ = "S"  THEN VAS$ = "REMAINDER":PM$ = "-"
  33. 330  REM  GET SECOND NUMBER
  34. 340  PRINT : PRINT : PRINT "Second number: $";: CALL  -958
  35. 350  POKE  -16368,0: GET TN$: IF TN$ =  CHR$(27)  THEN BH$ = "": CALL  -1008: HTAB 17: CALL  -958: GOTO 350: REM  IF <ESC> START OVER
  36. 360  IF TN$ =  CHR$(13)  AND  LEN(BH$) >0  THEN NM$ = BH$: GOSUB 530:BD = CH: GOTO 420
  37. 370  IF TN$ =  CHR$(13)  THEN 350
  38. 380  GOSUB 700: GOSUB 730: PRINT TN$;: IF TN$ = ""  THEN  PRINT  CHR$(7);: GOTO 350
  39. 390 BH$ = BH$ +TN$: IF  LEN(BH$) >5  THEN : VTAB 24: HTAB 1: CALL  -958: PRINT  CHR$(7); CHR$(7);: INVERSE : PRINT "NUMBER TOO LONG!";: NORMAL : FOR ET = 1 TO 2000: NEXT :BH$ = "": VTAB 21: GOTO 340
  40. 400  GOTO 350
  41. 410  REM  ADD THE NUMBERS
  42. 420  IF AS$ = "A"  THEN AB = AD +BD: GOSUB 630
  43. 430  REM  SUBTRACT THE NUMBERS
  44. 440  IF AS$ = "S"  THEN AB = AD -BD: GOSUB 630
  45. 450  REM  DISPLAY THE INFORMATION
  46. 460  VTAB 16: HTAB 1: CALL  -958: INVERSE : PRINT VAS$;: PRINT ":": NORMAL : PRINT : PRINT "$"AH$;" "PM$;" $"BH$" = "AD" "PM$" "BD",": PRINT "= "AB" Decimal, or $";: IF MI  THEN  PRINT " -"CH$" Hexadecimal.": GOTO 480
  47. 470  PRINT CH$" Hexadecimal."
  48. 480  PRINT : PRINT : HTAB 1: PRINT "DO ANOTHER? (Y/N) ";: PRINT "Y"; CHR$(8);: GET AN$: IF AN$ =  CHR$(13)  THEN AN$ = "Y"
  49. 490  PRINT AN$;: IF AN$ < >"Y"  AND AN$ < >"N"  AND AN$ < >"y"  AND AN$ < >"n"  THEN  VTAB  PEEK(37) -1: HTAB  PEEK(36) -1: PRINT  CHR$(7);: GOTO 480
  50. 500  IF AN$ = "Y"  OR AN$ = "y"  THEN  GOTO 160
  51. 510  TEXT : HOME : VTAB 15: HTAB 17: PRINT "BYE!": END 
  52. 520  REM  CONVERT NM$ TO DECIMAL
  53. 530 CH = 0:WK = 0
  54. 540  FOR M =  LEN(NM$) TO 1  STEP  -1
  55. 550  FOR J = 1 TO 16
  56. 560  IF  MID$ (NM$,M,1) =  MID$ (HX$,J,1)  THEN CH = CH +(J -1) *16 ^WK: GOTO 590
  57. 570  NEXT J
  58. 580  REM 
  59. 590 WK = WK +1
  60. 600  NEXT M
  61. 610  RETURN 
  62. 620  REM  CONVERT RESULT TO HEX
  63. 630 WK = AB:CH$ = "": IF  LEFT$( STR$(AB),1) = "-"  THEN WK = AB * -1:MI = 1
  64. 640 DG = WK - INT(WK/16) *16:WK =  INT(WK/16)
  65. 650 CH$ =  MID$ (HX$,DG +1,1) +CH$
  66. 660  IF WK >0  THEN 640
  67. 670  IF  LEN(CH$) <2  THEN CH$ = "0" +CH$
  68. 680  RETURN 
  69. 690  REM  CONVERT LOWERCASE TO UPPER
  70. 700  IF  ASC(TN$) >96  AND  ASC(TN$) <123  THEN TN$ =  CHR$( ASC(TN$) -32): RETURN 
  71. 710  RETURN 
  72. 720  REM  CHECK FOR VALID INPUT OF TN$ (INDIVIDUAL DIGITS)
  73. 730  FOR J = 1 TO 16
  74. 740  IF TN$ =  MID$ (HX$,J,1)  THEN  RETURN 
  75. 750  NEXT J
  76. 760 TN$ = ""
  77. 770  RETURN 
  78. 780  IF AS$ = "a"  THEN AS$ = "A"
  79. 790  IF AS$ = "s"  THEN AS$ = "S"
  80. 800  RETURN