home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 233.lha / Eprommer / Eprommer.bas next >
BASIC Source File  |  1989-04-29  |  13KB  |  627 lines

  1. REM eprogD the beginning of an eprom
  2. REM programmer program Now includes Twos Comp 1/2/89 2:47pm
  3.  
  4. DEFLNG a-z
  5.  
  6. LIBRARY "exec.library"
  7. DECLARE FUNCTION AllocMem&() LIBRARY
  8.  
  9. EmemBase&=AllocMem&(65536&,65541&) ' 64k of stable fast cleared ram
  10. IF EmemBase&=0 THEN END ' TROUBLE! not enough memory 
  11. ParPort&=12574977&
  12. ParDDR&=12575489&
  13. CtrlPort&=12570624&
  14. CtrlDDR&=12571136&
  15. EType$=""
  16. EmemTop&=EmemBase&+65535& ' the last byte to tread on
  17. RamBot&=EmemBase&
  18. Quantity&=0
  19. EpromBot&=0
  20. Clock0=0
  21. Clock1=4
  22. volts12=128
  23. volts21=64
  24. volts25=192
  25.  
  26. MENU 1,0,1,"Project    "
  27. MENU 1,1,1,"Open      "
  28. MENU 1,2,1,"Save      "
  29. MENU 1,3,1,"File Size "
  30. MENU 1,4,1,"Read Eprom"
  31. MENU 1,5,1,"Burn Eprom"
  32. MENU 1,6,1,"Fill Ram  "
  33. MENU 1,7,1,"Quit      "
  34. MENU 2,0,1,"Eproms     "
  35. GOSUB EpromMenu
  36. MENU 3,0,1,"Goodies    "
  37. MENU 3,1,1,"Twos Comp "
  38. MENU 3,2,1,"Expand    "
  39. MENU 3,3,1,"Compress  "
  40. MENU 4,0,1,""
  41. PRINT "Eprommer by Bob Blick"
  42. PRINT "Box 916"
  43. PRINT "Mendocino, CA 95460"
  44. PRINT "March 23, 1989"
  45.  
  46. SquareOne:
  47.   ON MENU GOSUB MenuHandler
  48.   MENU ON
  49.  
  50. x=1:WHILE x=1:SLEEP:WEND
  51.  
  52. ThatsIt:
  53.   CALL FreeMem&(EmemBase&,65536&) ' release ram
  54.   LIBRARY CLOSE
  55.   Address&=0
  56.   GOSUB SetAddr
  57.   POKE CtrlDDR,0 ' make ctrl pins hi-Z
  58.   POKE ParDDR,0 ' make port hi-Z
  59.   MENU RESET
  60.   END
  61.  
  62. InitPorts:
  63.   POKE CtrlDDR&,7
  64.   POKE CtrlPort&,3
  65.   POKE ParDDR&,255
  66.   POKE ParPort&,255
  67.   POKE CtrlPort&,7
  68.   POKE CtrlPort&,3
  69.   Address&=0
  70.   GOSUB SetAddr
  71.   RETURN
  72.   
  73. EpromMenu:
  74.   MENU 2,1,1,"  2716    "
  75.   MENU 2,2,1,"  2732    "
  76.   MENU 2,3,1,"  2732A   "
  77.   MENU 2,4,1,"  2764    "
  78.   MENU 2,5,1,"  2764A   "
  79.   MENU 2,6,1,"  27128   "
  80.   MENU 2,7,1,"  27256   "
  81.   MENU 2,8,1,"  27512   "
  82.   RETURN
  83.     
  84. MenuHandler:
  85.   MENU OFF 
  86.   ON MENU(0) GOSUB Menu1, Menu2, Menu3, Menu4
  87.   MENU ON
  88.   RETURN
  89.  
  90. Menu1:
  91.   ON MENU(1) GOSUB M1Item1, M1Item2, M1Item3, M1Item4, M1Item5, M1Item6, M1Item7,
  92.  
  93.   RETURN
  94.  
  95. Menu2:
  96.   p=1
  97.   IF EpromType$="" THEN GOSUB InitPorts
  98.   IF p=0 THEN RETURN
  99.   Title$="Just a reminder"
  100.   Msg$="Check for correct personality module"
  101.   GOSUB Requester
  102.   ON MENU(1) GOSUB M2Item1, M2Item2, M2Item3, M2Item4, M2Item5, M2Item6, M2Item7, M2Item8,
  103.   GOSUB SetCycleParams
  104.   RETURN
  105.  
  106. Menu3:
  107.   ON MENU(1) GOSUB M3Item1, M3Item2, M3Item3,
  108.     RETURN
  109.  
  110. Menu4:
  111.   RETURN
  112.   
  113. M1Item1:
  114.   GOSUB LoadDiskFile
  115.   RETURN
  116.  
  117. M1Item2:
  118.   GOSUB SaveDiskFile
  119.   RETURN
  120.  
  121. M1Item3:
  122.   Title$="Just Curious?"
  123.   Msg$="Enter Filename"
  124.   GOSUB StringGadget
  125.   IF p=0 THEN RETURN
  126.   ON ERROR GOTO ErrorTrap
  127.   OPEN file$ FOR INPUT AS 1
  128.   Title$="Your Answer"
  129.   Msg$="The file is "+STR$(LOF(1))+" bytes long"
  130.   CLOSE 1
  131.   ON ERROR GOTO 0
  132.   GOSUB Requester
  133.   RETURN
  134.  
  135. M1Item4:
  136.   GOSUB ReadEprom
  137.   RETURN
  138.  
  139. M1Item5:
  140.   GOSUB WriteEprom
  141.   RETURN
  142.  
  143. M1Item6:
  144.   GOSUB FillRam
  145.   RETURN
  146.   
  147. M1Item7:
  148.   x=0 ' time to go bye-bye
  149.   RETURN
  150.  
  151. ZOut:
  152.   MOUSE OFF
  153.   z=0
  154.   RETURN
  155.   
  156. M2Item1:
  157.   EpromType$="2716"
  158.   VoltVal=volts25
  159.   Size&=2048&
  160.   ReadParam=0:WriteParam=3:LeaveParam=3:InhibitParam=1
  161.   POKE CtrlPort&,LeaveParam
  162.   GOSUB EpromMenu:MENU 2,1,1,"* 2716   "
  163.   RETURN
  164.   
  165. M2Item2:
  166.   EpromType$="2732"
  167.   VoltVal=volts25
  168.   Size&=4096&
  169.   ReadParam=0:WriteParam=1:LeaveParam=3:InhibitParam=3
  170.   POKE CtrlPort&,LeaveParam
  171.   GOSUB EpromMenu
  172.   MENU 2,2,1,"* 2732   "
  173.   RETURN
  174.   
  175. M2Item3:
  176.   EpromType$="2732A"
  177.   VoltVal=volts21
  178.   Size&=4096&
  179.   ReadParam=0:WriteParam=1:LeaveParam=3:InhibitParam=3
  180.   POKE CtrlPort&,LeaveParam
  181.   GOSUB EpromMenu
  182.   MENU 2,3,1,"* 2732A  "
  183.   RETURN
  184.   
  185. M2Item4:
  186.   EpromType$="2764"
  187.   VoltVal=volts21
  188.   Size&=8192&
  189.   ReadParam=2:WriteParam=1:LeaveParam=3:InhibitParam=3
  190.   POKE CtrlPort&,LeaveParam
  191.   GOSUB EpromMenu
  192.   MENU 2,4,1,"* 2764   "
  193.   RETURN
  194.   
  195. M2Item5:
  196.   EpromType$="2764A"
  197.   VoltVal=volts12
  198.   Size&=8192&
  199.   ReadParam=2:WriteParam=1:LeaveParam=3:InhibitParam=3
  200.   POKE CtrlPort&,LeaveParam
  201.   GOSUB EpromMenu
  202.   MENU 2,5,1,"* 2764A  "
  203.   RETURN
  204.   
  205. M2Item6:
  206.   EpromType$="27128"
  207.   VoltVal=volts12
  208.   Size&=16384&
  209.   ReadParam=2:WriteParam=1:LeaveParam=3:InhibitParam=3
  210.   POKE CtrlPort&,LeaveParam
  211.   GOSUB EpromMenu
  212.   MENU 2,6,1,"* 27128  "
  213.   RETURN
  214.   
  215. M2Item7:
  216.   EpromType$="27256"
  217.   VoltVal=volts12
  218.   Size&=32768&
  219.   ReadParam=0:WriteParam=1:LeaveParam=3:InhibitParam=3
  220.   POKE CtrlPort&,LeaveParam
  221.   GOSUB EpromMenu
  222.   MENU 2,7,1,"* 27256  "
  223.   RETURN
  224.   
  225. M2Item8:
  226.   EpromType$="27512"
  227.   VoltVal=volts12
  228.   Size&=65536&
  229.   ReadParam=0:WriteParam=1:LeaveParam=3:InhibitParam=3
  230.   POKE CtrlPort&,LeaveParam
  231.   GOSUB EpromMenu
  232.   MENU 2,8,1,"* 27512  "
  233.   RETURN
  234.   
  235. M3Item1:
  236.   GOSUB TwosComp
  237.   RETURN
  238.   
  239. M3Item2:
  240.   RETURN
  241.   
  242. M3Item3:
  243.   GOSUB GenerateCompressArray
  244.   RETURN
  245.   
  246. LoadDiskFile:
  247.   Title$= "Load File"
  248.   Msg$= "Enter name of disk file"
  249.   GOSUB StringGadget
  250.   IF p=0 THEN RETURN
  251.   diskfile$=file$
  252.   ON ERROR GOTO ErrorTrap
  253.   OPEN diskfile$ FOR INPUT AS 1
  254.   GOSUB AskRamBot
  255.   i=0:WhereRam&=RamBot&
  256.   WHILE (NOT EOF(1)) AND (WhereRam&<=EmemTop&)
  257.     b$=INPUT$(1,1)
  258.     onebyte=ASC(b$)
  259.     POKE WhereRam&,onebyte
  260.     i=i+1:WhereRam&=WhereRam+1
  261.     WEND
  262.   DoneLoad:
  263.   CLOSE #1
  264.   ON ERROR GOTO 0
  265.   Title$="Now Hear This!"
  266.   Msg$="We loaded "+STR$(i)+" bytes"
  267.   GOSUB Requester
  268.   RETURN
  269.   
  270. SaveDiskFile:
  271.   Title$= "Save File"
  272.   Msg$= "Enter name of disk file"
  273.   GOSUB StringGadget
  274.   IF p=0 THEN RETURN
  275.   diskfile$=file$
  276.   ON ERROR GOTO ErrorTrap
  277.   OPEN diskfile$ FOR OUTPUT AS 1
  278.   GOSUB AskRamBot:IF q=0 THEN GOTO DoneSave
  279.   GOSUB AskQuantity:IF q=0 THEN GOTO DoneSave
  280.   i=0
  281.   WhereRam&=RamBot&
  282.   WHILE i<Quantity&
  283.   c$=CHR$(PEEK(WhereRam&))
  284.   PRINT#1,c$;
  285.   i=i+1:WhereRam&=WhereRam&+1
  286.   WEND
  287.   DoneSave:
  288.     CLOSE 1
  289.     ON ERROR GOTO 0
  290.     Title$="Now Hear This"
  291.     Msg$="We saved "+STR$(i)+" bytes"
  292.     GOSUB Requester
  293.   RETURN
  294.   
  295. ReadEprom:
  296.   GOSUB EpromSpec
  297.   IF q=0 THEN RETURN
  298.   GOSUB AskRamBot:IF q=0 THEN RETURN
  299.   GOSUB AskQuantity:IF q=0 THEN RETURN
  300.   IF (EpromBot&+Quantity&)>Size& THEN
  301.     Msg$="Excess will be ignored"
  302.     GOSUB Requester:IF p=0 THEN RETURN
  303.   END IF
  304.   i=0
  305.   Address&=EpromBot&
  306.   WhereRam&=RamBot&
  307.   WHILE Address&<Size& AND i<Quantity&
  308.     GOSUB SetAddr
  309.     GOSUB ReadByte
  310.     POKE WhereRam&,DataIn
  311.     i=i+1:Address&=Address&+1:WhereRam&=WhereRam+1
  312.   WEND
  313.   Title$="For your information"
  314.   Msg$="We read"+STR$(i)+" bytes"
  315.   GOSUB Requester
  316.   RETURN
  317.   
  318. WriteEprom:
  319.   GOSUB EpromSpec
  320.   IF q=0 THEN RETURN
  321.   GOSUB AskRamBot:IF q=0 THEN RETURN
  322.   GOSUB AskQuantity:IF q=0 THEN RETURN
  323.   i=0
  324.   Address&=EpromBot&
  325.   WhereRam&=RamBot&
  326.   WriteError=0
  327.  
  328.   WHILE Address&<Size& AND i<Quantity& AND WriteError=0
  329.     GOSUB SetAddr
  330.     DataOut=PEEK(WhereRam&)
  331.     GOSUB WriteCycle
  332.     i=i+1:Address&=Address&+1:WhereRam&=WhereRam+1
  333.   WEND
  334.   BEEP
  335.   Title$="For your information"
  336.   IF WriteError=0 THEN Msg$="We wrote"+STR$(i)+" bytes perfectly"
  337.   IF WriteError=1 THEN Msg$="Eprom already has data at address"+STR$(Address&-1)
  338.   IF WriteError=2 THEN Msg$="Verify error at Eprom address"+STR$(Address&-1)
  339.   GOSUB Requester
  340.   RETURN
  341.   
  342.  
  343. ReadByte:
  344.   POKE ParDDR&,0 ' inputting
  345.   POKE CtrlPort&,Read0 ' Give it to me
  346.   DataIn = PEEK(ParPort)
  347.   POKE CtrlPort&,Read1 ' leaving it
  348.   RETURN
  349.  
  350. SetAddr:
  351.   POKE ParDDR&,255 ' outputting
  352.   POKE ParPort&,253 ' VPP control hi,set hi byte
  353.   POKE CtrlPort&,Addr0 ' clock command
  354.   HiByte = ((Address& AND 65280&)/256) ' mask off lower bits
  355.   POKE ParPort&, HiByte
  356.   POKE CtrlPort&,Addr1 ' clock data to hibyte addr latch
  357.   POKE ParPort&,254 ' VPP control hi, set lo byte
  358.   POKE CtrlPort&,Addr2 ' clock command
  359.   LoByte = Address& AND 255 ' mask off upper bits
  360.   POKE ParPort&, LoByte
  361.   POKE CtrlPort&,Addr3 ' clock addr to lower addr latch
  362.   RETURN
  363.  
  364. WriteCycle:
  365.   GOSUB ReadByte
  366.   IF DataIn<>255 THEN
  367.     WriteError=1
  368.     RETURN
  369.   END IF
  370.   IF DataOut=255 THEN
  371.     WriteError=0
  372.     RETURN
  373.   END IF
  374.   n=0:m=0
  375.   Cycle:
  376.     PulseTimer=15 'one millisec
  377.     GOSUB WriteByte
  378.     GOSUB ReadByte
  379.     n=n+1
  380.     IF DataIn=DataOut THEN 
  381.       PulseTimer=n*75
  382.       IF PulseTimer>300 THEN PulseTimer=300
  383.       GOSUB WriteByte
  384.       GOSUB ReadByte
  385.       WriteError=0
  386.       IF DataIn<>DataOut THEN WriteError=2
  387.       RETURN
  388.     END IF
  389.     IF n<20 THEN GOTO Cycle
  390.   WriteError=2 
  391.   RETURN
  392.   
  393.   
  394. WriteByte:
  395.   ' we get a .003 sec pulse uncompiled
  396.   POKE ParDDR&,255 ' we will be outputting
  397.   POKE ParPort&,Write0 ' set voltage
  398.   POKE CtrlPort&,Write1 ' turn on juice!
  399.   POKE ParPort&,DataOut ' Here is a byte
  400.   POKE CtrlPort&,Write2 ' we are burning eprom now
  401.   FOR yawn=1 TO PulseTimer
  402.   NEXT yawn
  403.   POKE CtrlPort&,Write3 ' inhibited but still hot
  404.   POKE ParPort&,255 ' set voltage
  405.   POKE CtrlPort&,Write4 ' shut off hi voltage
  406.   POKE CtrlPort&,Write5 ' ready for next command
  407.   RETURN
  408.  
  409. SetCycleParams:
  410.   Write0=223-VoltVal
  411.   Write1=InhibitParam+Clock1
  412.   Write2=WriteParam+Clock1
  413.   Write3=InhibitParam+Clock0
  414.   Write4=InhibitParam+Clock1
  415.   Write5=LeaveParam+Clock0
  416.   Read0=ReadParam+Clock0
  417.   Read1=LeaveParam+Clock0
  418.   Addr0=LeaveParam+Clock1
  419.   Addr1=LeaveParam+Clock0
  420.   Addr2=LeaveParam+Clock1
  421.   Addr3=LeaveParam+Clock0
  422.   RETURN
  423.  
  424. FillRam:
  425.   GOSUB AskRamBot:IF q=0 THEN RETURN
  426.   GOSUB AskQuantity:IF q=0 THEN RETURN
  427.   Msg$="Number from 0 to 255 to fill with?"
  428.   GOSUB StringGadget:IF p=0 THEN RETURN
  429.   FillDirt=ABS(VAL(file$))
  430.   IF FillDirt>255 THEN
  431.     BEEP
  432.     RETURN
  433.   END IF
  434.   i=0
  435.   WhereRam&=RamBot&
  436.   WHILE i<Quantity&
  437.     POKE WhereRam&,FillDirt
  438.     i=i+1:WhereRam&=WhereRam+1
  439.   WEND
  440.   Title$="For your information"
  441.   Msg$="We filled"+STR$(i)+" bytes"
  442.   GOSUB Requester
  443.   RETURN
  444.   
  445. TwosComp:
  446.   GOSUB AskRamBot:IF q=0 THEN RETURN
  447.   GOSUB AskQuantity:IF q=0 THEN RETURN
  448.   i=0
  449.   WhereRam&=RamBot&
  450.   WHILE i<Quantity&
  451.     AByte=PEEK (WhereRam&)
  452.     IF AByte>127 THEN
  453.       AByte=AByte-128
  454.       ELSE
  455.       AByte=AByte+128
  456.     END IF
  457.     POKE WhereRam&,AByte
  458.     i=i+1:WhereRam&=WhereRam+1
  459.   WEND
  460.   Title$="For your information"
  461.   Msg$="We changed"+STR$(i)+" bytes"
  462.   GOSUB Requester
  463.   RETURN
  464.   
  465. AskRamBot:
  466.   q=1
  467.   Msg$="Enter starting RAM address ("+STR$(RamBot&-EmemBase&)+")"
  468.   GOSUB StringGadget:IF p=0 THEN 
  469.   q=0:RETURN
  470.   END IF
  471.   IF file$<>"" THEN RamBot&=ABS(VAL(file$))+EmemBase&
  472.   IF RamBot&>EmemTop& THEN
  473.     Msg$="RAM addresses are from 0 to 65535"
  474.     GOSUB Requester
  475.     q=0:RETURN
  476.   END IF
  477.   RETURN
  478.  
  479. AskQuantity:
  480.   q=1
  481.   Msg$="Enter number of bytes ("+STR$(Quantity&)+")"
  482.   GOSUB StringGadget:IF p=0 THEN
  483.   q=0:RETURN
  484.   END IF
  485.   IF file$<>"" THEN Quantity&=ABS(VAL(file$))
  486.   IF (RamBot&+Quantity&)>(EmemTop&+1) THEN
  487.     Msg$="Excess will be ignored"
  488.     GOSUB Requester:IF p=0 THEN
  489.     q=0:RETURN
  490.   END IF
  491.   END IF
  492.   r=EmemTop&-RamBot&+1
  493.   IF r<Quantity& THEN Quantity&=r
  494.   RETURN
  495.   
  496. EpromSpec:
  497.   q=1
  498.   IF EpromType$="" THEN
  499.     Title$="Program Request"
  500.     Msg$="You need to select an EPROM type"
  501.     GOSUB Requester
  502.     q=0
  503.     RETURN
  504.   END IF
  505.   Title$="Program Request"
  506.   Msg$="Enter starting EPROM Address ("+STR$(EpromBot&)+")"
  507.   GOSUB StringGadget:IF p=0 THEN
  508.   q=0:RETURN
  509.   END IF
  510.   IF file$<>"" THEN EpromBot&=ABS(VAL(file$))
  511.   IF EpromBot&>=Size& THEN
  512.     Msg$="The "+EpromType$+" has only"+STR$(Size&)+" bytes!"
  513.     GOSUB Requester
  514.     q=0
  515.     RETURN
  516.   END IF
  517.   RETURN
  518.   
  519. GenerateCompressArray:
  520.   RETURN
  521.   
  522. Requester:
  523.   WINDOW 2, Title$,(200,90)-(500,150),0
  524.   LOCATE 2,1
  525.   PRINT Msg$
  526.   GOSUB GadgetMake
  527.   ON MOUSE GOSUB OKHandler
  528.   MOUSE ON
  529.   z=1:WHILE z=1:SLEEP:WEND
  530.   WINDOW 1
  531.   WINDOW CLOSE 2
  532.   RETURN
  533.     
  534. StringGadget:
  535.   WINDOW 2, Title$,(100,50)-(400,100),0
  536.   LOCATE 2,1
  537.   PRINT Msg$
  538.   LINE (20,15)-(280,25),,b
  539.   LOCATE 3,4:c=0:file$="":x$="":WINDOW 2
  540.     WHILE x$<>CHR$(13)
  541.      x$=INPUT$(1)
  542.      IF x$> CHR$(31) THEN
  543.        PRINT x$;
  544.        file$=file$+x$
  545.        c=c+1
  546.      END IF
  547.    WEND
  548.    GOSUB GadgetMake
  549.    ON MOUSE GOSUB OKHandler
  550.    MOUSE ON
  551.    z=1:WHILE z=1:SLEEP:WEND
  552.    WINDOW 1
  553.    WINDOW CLOSE 2
  554.    RETURN
  555.    
  556. GadgetMake:
  557.   LINE (50,30)-(120,45),3,b
  558.   LINE (175,30)-(245,45),3,b
  559.   LOCATE 5,11:PRINT "OK"
  560.   LOCATE 5,24:PRINT "Cancel"
  561.   RETURN
  562.  
  563. OKHandler:
  564.   MOUSE OFF
  565.   IF WINDOW(0) <> 2 THEN WINDOW OUTPUT 2:MOUSE ON:RETURN
  566.   m=MOUSE(0)
  567.   a=MOUSE(3):b=MOUSE(4)
  568.   IF (a > 50 AND a < 120) AND (b > 30 AND b < 45) THEN GOSUB OK:RETURN
  569.   IF (a > 175 AND a < 245) AND (b > 30 AND b < 45) THEN GOSUB Cancel:RETURN
  570.   MOUSE ON
  571.   RETURN
  572.     
  573.      OK:
  574.         LINE (50,30)-(120,45),3,bf
  575.         p=1
  576.         z=0
  577.         RETURN
  578.         
  579.      Cancel:
  580.         LINE (175,30)-(245,45),3,bf
  581.         p=0
  582.         z=0
  583.         RETURN
  584.         
  585. ErrorTrap:
  586.   BEEP 'Get user's attention.
  587.   IF ERR=53 THEN
  588.     Msg$="FILE NOT FOUND."
  589.     GOTO ExitError
  590.   END IF
  591.   IF ERR=61 THEN
  592.     Msg$="DISK FULL."
  593.     GOTO ExitError
  594.   END IF
  595.   IF ERR=64 THEN
  596.     Msg$="BAD FILENAME."
  597.     GOTO ExitError
  598.   END IF
  599.   IF ERR=67 THEN
  600.     Msg$="DIRECTORY FULL."
  601.     GOTO ExitError
  602.   END IF
  603.   IF ERR=68 THEN
  604.     Msg$="DEVICE UNAVAILABLE."
  605.     GOTO ExitError
  606.   END IF
  607.   IF ERR=70 THEN
  608.     Msg$="DISK WRITE-PROTECTED."
  609.     GOTO ExitError
  610.   END IF
  611.   IF ERR=74 THEN
  612.     Msg$="UNKNOWN DISK VOLUME."
  613.     GOTO ExitError
  614.   END IF
  615.   Msg$="ERROR NUMBER"+STR$(ERR)
  616.   
  617.   ExitError:
  618.   ' Abort operation or try again.
  619.   Title$="Somebody Goofed!"
  620.   RESUME StillError
  621.   StillError:
  622.   GOSUB Requester
  623.   CLOSE 1
  624.   GOTO SquareOne
  625.   
  626.                                       
  627.