home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / documents / chipdata / programming.reu < prev    next >
Encoding:
Text File  |  1993-11-01  |  11.5 KB  |  315 lines

  1. hELLO ALL!
  2.  
  3.   i WANT TO CONTRIBUTE TO THE MAILING LIST ON THE SOFTWARE SIDE. sO i SEND
  4. YOU A DESCRIPTION OF THE PROGRAMMING OF THE 17XX ram EXPANSION UNITS.
  5. i SENT THIS ALREADY A WEEK AGO BUT IT GOT LOST DURING THE PROBLEMS WITH
  6. THE OLD MAILING LIST ADDRESS. iN THE MEANTIME THERE HAS ALREADY BEEN POSTED
  7. SOME INFORMATION ABOUT reuS, BUT MY DESCRIPTION IS A BIT DIFFERENT AND
  8. CONTAINS MORE DETAILED INFORMATION, SO i THOUGHT i NEVERTHELESS
  9. SEND IT TO YOU.
  10.  
  11.   tHE FOLLOWING IS BASED ON THE cOMMODORE 1764 USER'S MANUAL (GERMAN
  12. VERSION) AND MY OWN EXPERIENCES PROGRAMMING THE 1764 rAM eXPANSION uNIT
  13. (reu).
  14.  
  15.  
  16. cONTENTS:
  17.  
  18.  1) eXTERNAL ram aCCESS wITH reuS
  19.  2) ram eXPANSION cONTROLLER (rec) rEGISTERS
  20.  3) hOW tO rECOGNIZE tHE reu
  21.  4) sIMPLE ram tRANSFER
  22.  5) aDDITIONAL fEATURES
  23.  6) tRANSFER sPEED
  24.  7) iNTERRUPTS
  25.  8) eXECUTING cODE iN eXPANDED mEMORY
  26.  9) oTHER uSEFUL aPPLICATIONS oF tHE reu
  27. 10) cOMPARISION oF bANK sWITCHING AND dma
  28.  
  29.  
  30.  
  31. 1) _eXTERNAL ram aCCESS wITH reuS_
  32.  
  33.   tHE reuS PROVIDE ADDITIONAL ram FOR THE c64/128. tHREE TYPES OF reuS
  34. HAVE BEEN PRODUCED BY cOMMODORE. tHESE ARE THE 1700, 1764 AND 1750 WITH
  35. 128, 256 AND 512 kbYTES BUILT IN ram. hOWEVER THEY CAN BE EXTENDED UP TO
  36. SEVERAL mbYTES.
  37.   tHE EXTERNAL MEMORY CAN NOT BE ADDRESSED DIRECTLY BY THE c64 WITH IT'S
  38. 16-BIT ADDRESS SPACE. iT HAS TO BE TRANSFERRED FROM AN TO THE MAIN
  39. MEMORY OF THE c64. fOR THAT PURPOSE THERE IS A BUILT IN ram eXPANSION
  40. cONTROLLER (rec) WHICH TRANSFERS MEMORY BETWEEN THE c64 AND THE reu
  41. USING dIRECT mEMORY aCCESS (dma). iT CAN ALSO BE USED FOR OTHER
  42. PURPOSES.
  43.  
  44.  
  45. 2) _ram eXPANSION cONTROLLER (rec) rEGISTERS_
  46.  
  47.   tHE rec IS PROGRAMMED BY ACCESSING IT'S REGISTERS, THAT APPEAR MEMORY
  48. MAPPED IN THE i/o-AREA BETWEEN $df00 AND $df0a WHEN A reu IS CONNECTED
  49. THROUGH THE EXPANSION PORT OF THE c64. tHEY CAN BE READ AND WRITTEN TO
  50. LIKE vic- AND sid-REGISTERS.
  51.  
  52. $df00: status register
  53.        VARIOUS INFORMATION CAN BE OBTAINED (READ ONLY)
  54.  
  55. bIT 7:     interrupt pending  (1 = INTERRUPT WAITING TO BE SERVED)
  56.            UNNECESSARY
  57. bIT 6:     end of block  (1 = TRANSFER COMPLETE)
  58.            UNNECESSARY
  59. bIT 5:     fault  (1 = BLOCK VERIFY ERROR)
  60.            sET IF A DIFFERENCE BETWEEN c64- AND reu-MEMORY AREAS WAS FOUND
  61.            DURING A COMPARE-COMMAND.
  62. bIT 4:     size  (1 = 256 kb)
  63.            sEEMS TO INDICATE THE SIZE OF THE ram-CHIPS. iT IS SET ON 1764
  64.            AND 1750 AND CLEAR ON 1700.
  65. bITS 3..0: version
  66.            cONTAINS 0 ON MY reu.
  67.  
  68. $df01: command register
  69.        bY WRITING TO THIS REGISTER ram TRANSFER OR COMPARISION CAN BE
  70.        EXECUTED.
  71.  
  72. bIT 7:     execute  (1 = TRANSFER PER CURRENT CONFIGURATION)
  73.            tHIS BIT MUST BE SET TO EXECUTE A COMMAND.
  74. bIT 6:     RESERVED  (NORMALLY 0)
  75. bIT 5:     load  (1 = ENABLE AUTOLOAD OPTION)
  76.            wITH AUTOLOAD ENABLED THE ADDRESS AND LENGTH REGISTERS (SEE
  77.            BELOW) WILL BE UNCHANGED AFTER A COMMAND EXECUTION.
  78.            oTHERWISE THE ADDRESS REGISTERS WILL BE COUNTED UP TO THE
  79.            ADDRESS OFF THE LAST ACCESSED BYTE OF A dma + 1,
  80.            AND THE LENGTH REGISTER WILL BE CHANGED (NORMALLY TO 1).
  81. bIT 4:     ff00
  82.            iF THIS BIT IS SET COMMAND EXECUTION STARTS IMMEDIATELY
  83.            AFTER SETTING THE COMMAND REGISTER.
  84.            oTHERWISE COMMAND EXECUTION IS DELAYED UNTIL WRITE ACCESS TO
  85.            MEMORY POSITION $ff00
  86. bITS 3..2: RESERVED  (NORMALLY 0)
  87. bITS 1..0: transfer type
  88.            00 = TRANSFER c64 -> reu
  89.            01 = TRANSFER reu -> c64
  90.            10 = SWAP c64 <-> reu
  91.            11 = COMPARE c64 - reu
  92.  
  93. $df02..$df03: c64 base address
  94.               a 16-BIT c64 - BASE ADDRESS IN LOW/HIGH ORDER.
  95.  
  96. $df04..$df06: reu base address
  97.               tHIS IS A THREE BYTE ADDRESS CONSISTING OF A LOW AND
  98.               HIGH BYTE AND AN EXPANSION BANK NUMBER.
  99.               nORMALLY ONLY BITS 2..0 OF THE EXPANSION BANK ARE VALID
  100.               (FOR A MAXIMUM OF 512 kbYTE), THE OTHER BITS ARE ALWAYS
  101.               SET. tHIS MUST BE DIFFERENT IF MORE THAN 512 kbYTE ARE
  102.               INSTALLED.
  103.  
  104. $df07..$df08: transfer length
  105.               tHIS IS A 16-BIT VALUE CONTAINING THE NUMBER OF BYTES TO
  106.               TRANSFER OR COMPARE.
  107.               tHE VALUE 0 STANDS FOR 64 kBYTES.
  108.               iF THE TRANSFER LENGTH PLUS THE c64 BASE ADDRESS EXCEEDS
  109.               64k THE c64 ADDRESS WILL OVERFLOW AND CAUSE c64 MEMORY
  110.               FROM 0 ON TO BE ACCESSED.
  111.               iF THE TRANSFER LENGTH PLUS THE reu BASE ADDRESS EXCEEDS
  112.               512k THE reu ADDRESS WILL OVERFLOW AND CAUSE reu MEMORY
  113.               FROM 0 ON TO BE ACCESSED.
  114.  
  115. $df09: interrupt mask register
  116.        UNNECESSARY
  117.  
  118. bIT 7:     interrupt enable  (1 = INTERRUPT ENABLED)
  119. bIT 6:     end of block mask  (1 = INTERRUPT ON END)
  120. bIT 5:     verify error  (1 = INTERRUPT ON VERIFY ERROR)
  121. bITS 4..0: UNUSED (NORMALLY ALL SET)
  122.  
  123. $df0a: address control register
  124.        cONTROLLS THE ADDRESS COUNTING DURING dma.
  125.        iF AN ADDRESS IS FIXED, NOT A MEMORY BLOCK BUT ALWAYS THE SAME
  126.        BYTE ADDRESSED BY THE BASE ADDRESS REGISTER IS USED FOR dma.
  127.  
  128. bIT 7:     c64 address control  (1 = FIX c64 ADDRESS)
  129. bIT 6:     reu address control  (1 = FIX reu ADDRESS)
  130. bITS 5..0: UNUSED (NORMALLY ALL SET)
  131.  
  132.  
  133.   tO ACCESS THE reu-REGISTERS IN ASSEMBLY LANGUAGE IT IS CONVENIENT TO
  134. DEFINE LABELS SOMETHING LIKE THIS:
  135.  
  136.     STATUS   = $df00
  137.     COMMAND  = $df01
  138.     C64BASE  = $df02
  139.     REUBASE  = $df04
  140.     TRANSLEN = $df07
  141.     IRQMASK  = $df09
  142.     CONTROL  = $df0a
  143.  
  144.  
  145. 3) _hOW tO rECOGNIZE tHE reu_
  146.  
  147.   nORMALLY THE ADDRESSES BETWEEN $df00 AND $df0a ARE UNUSED. sO NORMALLY
  148. IF VALUES ARE STORED THERE THEY GET LOST. sO IF YOU WRITE E.G. THE
  149. VALUES 1,2,3,... TO $df02..$df08 AND THEY DON'T STAY THERE YOU CAN BE
  150. SURE THAT NO reu IS CONNECTED. hOWEVER IF THE VALUES ARE THERE IT COULD
  151. BE BECAUSE ANOTHER KIND OF MODULE IS CONNECTED THAT ALSO USES THESE
  152. ADDRESSES.
  153.   aNOTHER PROBLEM IS THE RECOGNITION OF THE NUMBER OF ram BANKS (64
  154. kbYTE UNITS) INSTALLED. tHE size BIT ONLY TELLS THAT THERE ARE AT LEAST
  155. 2 (1700) OR 4 (1764, 1750) BANKS INSTALLED. bY TRYING TO ACCESS & VERIFY
  156. BYTES IN AS MANY ram BANKS AS POSSIBLE THE REAL SIZE CAN BE DETERMINED.
  157. tHIS CAN BE SEEN IN THE SOURCE TO "dYNAMIC MEMORY ALLOCATION FOR THE
  158. 128" IN cOMMODORE hACKING iSSUE 2.
  159.   i PERSONALLY PREFER TO LET THE USER CHOOSE IF AND WHICH reu BANKS
  160. SHALL BE USED.
  161.  
  162.  
  163. 4) _sIMPLE ram tRANSFER_
  164.  
  165.   vERY LITTLE OPTIONS OF THE reu ARE NECESSARY FOR THE MAIN PURPOSES OF
  166. ram EXPANDING.
  167.   jUST SET THE BASE ADDRESSES, TRANSFER LENGTH AND THEN THE COMMAND
  168. REGISTER.
  169.  
  170.   tHE FOLLOWING CODE TRANSFERS ONE kbYTE CONTAINING THE SCREEN
  171. MEMORY ($0400..$07ff) TO ADDRESS 0 IN THE reu:
  172.  
  173.     LDA #0
  174.     STA CONTROL ; TO MAKE SURE BOTH ADDRESSES ARE COUNTED UP
  175.     LDA #<$0400
  176.     STA C64BASE
  177.     LDA #>$0400
  178.     STA C64BASE + 1
  179.     LDA #0
  180.     STA REUBASE
  181.     STA REUBASE + 1
  182.     STA REUBASE + 2
  183.     LDA #<$0400
  184.     STA TRANSLEN
  185.     LDA #>$0400
  186.     STA TRANSLEN + 1
  187.     LDA #%10010000;  C64 -> reu WITH IMMEDIATE EXECUTION
  188.     STA COMMAND
  189.  
  190.   tO TRANSFER THE MEMORY BACK TO THE c64 REPLACE "LDA #%10010000"
  191. BY "LDA #%10010001".
  192.  
  193.   i THINK THAT THIS SUBSET OF 17XX FUNCTIONS WOULD BE ENOUGH FOR A
  194. REASONABLE ram EXPANSION. hOWEVER IF FULL COMPATIBILITY WITH 17XX reuS
  195. IS DESIRED ALSO THE MORE COMPLICATED FUNCTIONS HAVE TO BE IMPLEMENTED.
  196.  
  197.  
  198. 5) _aDDITIONAL fEATURES_
  199.  
  200.  
  201. sWAPPING mEMORY
  202.  
  203.   wITH THE SWAP-COMMAND MEMORY BETWEEN 17XX AND c64 IS EXCHANGED. tHE
  204. PROGRAMMING IS THE SAME AS IN SIMPLE ram TRANSFER.
  205.  
  206.  
  207. cOMPARING mEMORY
  208.  
  209.   nO ram IS TRANSFERRED BUT THE NUMBER OF BYTES SPECIFIED IN THE
  210. TRANSFER LENGTH REGISTER IS COMPARED. iF THERE ARE DIFFERENCES THE
  211. fault-BIT OF THE STATUS REGISTER IS SET. tHIS BIT IS CLEARED BY READING
  212. THE STATUS REGISTER WHICH HAS TO BE DONE BEFORE COMPARING TO GET VALID
  213. INFORMATION.
  214.  
  215.  
  216. uSING aLL c64 mEMORY
  217.  
  218.   c64 MEMORY IS ACCESSED BY THE reu NORMALLY IN THE MEMORY CONFIGURATION
  219. EXISTING DURING WRITING TO THE COMMAND REGISTER. hOWEVER IN ORDER TO BE
  220. ABLE TO WRITE TO THE COMMAND REGISTER THE i/o-AREA HAS TO BE ACTIVE.
  221.   iF ram BETWEEN $d000 AND $dfff OR CHARACTER rom SHALL BE USED IT IS
  222. POSSIBLE TO DELAY THE EXECUTION OF THE COMMAND BY STORING A COMMAND BYTE
  223. WITH BIT 4 ("ff00") CLEARED. tHE COMMAND WILL THEN BE EXECUTED
  224. BY WRITING ANY VALUE TO ADDRESS $ff00.
  225.  
  226. eXAMPLE:
  227.  
  228.     < sET BASE ADDRESSES AND TRANSFER LENGTH >
  229.     LDA #%10000000 ; TRANSFER c64 ram -> reu DELAYED
  230.     STA COMMAND
  231.     SEI
  232.     LDA $01
  233.     AND #$30
  234.     STA $01 ; SWITCH ON 64 kbYTE ram
  235.     LDA $ff00 ; TO NOT CHANGE THE CONTENTS OF $ff00
  236.     STA $ff00 ; EXECUTE dma
  237.     LDA $01
  238.     ORA #$37
  239.     STA $01 ; SWITCH ON NORMAL CONFIGURATION
  240.     CLI
  241.  
  242.  
  243. 6) _tRANSFER sPEED_
  244.  
  245.   dURING dma THE cpu IS HALTED AND THE MEMORY ACCESS CYCLES NORMALLY
  246. AVAILABLE FOR THE cpu ARE NOW USED TO ACCESS ONE BYTE EACH. sO WITH
  247. SCREEN AND SPRITES SWITCHED OFF IN EVERY CLOCK CYCLE (985248 PER SECOND
  248. ON pal MACHINES) A BYTE IS TRANSFERRED. iF SCREEN IS ON OR SPRITES ARE
  249. ENABLED TRANSFER IS A BIT SLOWER, AS THE vic EXCLUSIVELY ACCESSES ram
  250. SOMETIMES. aN EXACT DESCRIPTION OF THOSE "MISSING CYCLES" CAN BE FOUND
  251. IN cOMMODORE hACKING iSSUE 3.
  252.   cOMPARING MEMORY AREAS IS AS FAST AS TRANSFERS. (cOMPARISON IS STOPPED
  253. ONCE THE FIRST DIFFERENCE IS FOUND.)
  254.   sWAPPING MEMORY IS ONLY HALF AS FAST, AS FOR EVERY BYTES TWO c64 MEMORY
  255. ACCESSES (READ & WRITE) ARE NECESSARY.
  256.  
  257.  
  258. 7) _iNTERRUPTS_
  259.  
  260.   bY SETTING CERTAIN BITS IN THE INTERRUPT MASK REGISTER irqS AT THE END
  261. OF A dma CAN BE SELECTED. hOWEVER AS THE cpu IS HALTED DURING dma IT
  262. WILL ALWAYS BE FINISHED AFTER THE STORE INSTRUCTION INTO THE COMMAND
  263. REGISTER OR $ff00. sO THERE IS NO NEED TO CHECK FOR AN "end of block"
  264. (BIT 6 OF STATUS REGISTER) OR TO ENABLE AN INTERRUPT.
  265.  
  266.  
  267. 8) _eXECUTING cODE iN eXPANDED mEMORY_
  268.  
  269.   cODE IN EXTERNAL MEMORY HAS ALWAYS TO BE COPIED INTO c64 MEMORY TO BE
  270. EXECUTED. tHIS IS A DISADVANTAGE AGAINST BANK SWITCHING SYSTEMS. hOWEVER
  271. BANK SWITCHING CAN BE SIMULATED BY THE swap COMMAND. tHIS IS DONE E.G.
  272. IN ramdos WHERE ONLY 256 BYTES OF c64 MEMORY ARE OCCUPIED, THE 6 kbYTE
  273. ram DISK DRIVER IS SWAPPED IN WHENEVER NEEDED. pROBABLY TOO MUCH
  274. SWAPPING IS THE REASON FOR ramdos TO BE NOT REALLY FAST AT SEQUENTIAL
  275. FILE ACCESS.
  276.  
  277.  
  278. 9) _oTHER uSEFUL aPPLICATIONS oF tHE reu_
  279.  
  280.   tHE rec IS NOT ONLY USEFUL FOR ram TRANSFER AND COMPARISON.
  281.  
  282.   oNE OTHER APPLICATION (USED IN geos) IS TO COPY c64 ram AREAS
  283. BY FIRST TRANSFERRING IT TO THE reu AND THEN TRANSFERRING IT BACK INTO
  284. THE DESIRED POSITION IN c64 MEMORY. dUE TO THE FAST dma THIS IS ABOUT 5
  285. TIMES FASTER THAN COPYING MEMORY WITH MACHINE LANGUAGE INSTRUCTIONS.
  286.  
  287.   iNTERESTING THINGS CAN BE DONE BY FIXING BASE ADDRESSES. lARGE c64
  288. AREAS CAN BE FILLED VERY FAST WITH A SINGLE BYTE VALUE BY FIXING THE reu
  289. BASE ADDRESS. tHUS IT IS ALSO POSSIBLE TO FIND THE END OF AN AREA
  290. CONTAINING EQUAL BYTES VERY FAST E.G. FOR DATA COMPRESSION.
  291.  
  292.   fIXING THE c64 BASE ADDRESS IS INTERESTING IF AN i/o-PORT IS USED, AS
  293. DATA CAN BE WRITTEN OUT FASTER THAN NORMALLY POSSIBLE.
  294.   iT WOULD BE POSSIBLE TO USE REAL BITMAP GRAPHICS IN THE UPPER AND LOWER
  295. SCREEN BORDER BY CHANGING THE "MAGIC BYTE" (HIGHEST BY THE vic ADDRESSED
  296. BYTE) IN EVERY CLOCK CYCLE DURING THE BORDER SWITCHED OFF.
  297.  
  298.   gENERALLY THE rec COULD BE USED AS GRAPHICS ACCELERATOR E.G. TO
  299. COPY BITMAP AREAS OR TO COPY DATA FAST INTO THE vic-ADDRESSABLE
  300. 16 kbYTE AREA.
  301.  
  302.  
  303. 10) _cOMPARISION oF bANK sWITCHING AND dma_
  304.  
  305.   wHEN COMPARING BANK SWITCHING AND dma FOR MEMORY EXPANSION i THINK dma
  306. IS THE MORE COMFORTABLE METHODE TO PROGRAM AND ALSO IS FASTER IN MOST
  307. CASES. tHE DISADVANTAGE WITH CODE EXECUTION NOT POSSIBLE IN EXTERNAL
  308. MEMORY COULD BE MINIMIZED BY COPYING ONLY THE NECESSARY PARTS INTO c64
  309. MEMORY. eXECUTING THE CODE WILL TAKE MUCH MORE TIME THAN COPYING IT
  310. INTO c64 MEMORY.
  311.  
  312.  
  313. rICHARD hABLE
  314. K3027E7@EDVZ.UNI-LINZ.AC.AT
  315.