home *** CD-ROM | disk | FTP | other *** search
- hELLO ALL!
-
- i WANT TO CONTRIBUTE TO THE MAILING LIST ON THE SOFTWARE SIDE. sO i SEND
- YOU A DESCRIPTION OF THE PROGRAMMING OF THE 17XX ram EXPANSION UNITS.
- i SENT THIS ALREADY A WEEK AGO BUT IT GOT LOST DURING THE PROBLEMS WITH
- THE OLD MAILING LIST ADDRESS. iN THE MEANTIME THERE HAS ALREADY BEEN POSTED
- SOME INFORMATION ABOUT reuS, BUT MY DESCRIPTION IS A BIT DIFFERENT AND
- CONTAINS MORE DETAILED INFORMATION, SO i THOUGHT i NEVERTHELESS
- SEND IT TO YOU.
-
- tHE FOLLOWING IS BASED ON THE cOMMODORE 1764 USER'S MANUAL (GERMAN
- VERSION) AND MY OWN EXPERIENCES PROGRAMMING THE 1764 rAM eXPANSION uNIT
- (reu).
-
-
- cONTENTS:
-
- 1) eXTERNAL ram aCCESS wITH reuS
- 2) ram eXPANSION cONTROLLER (rec) rEGISTERS
- 3) hOW tO rECOGNIZE tHE reu
- 4) sIMPLE ram tRANSFER
- 5) aDDITIONAL fEATURES
- 6) tRANSFER sPEED
- 7) iNTERRUPTS
- 8) eXECUTING cODE iN eXPANDED mEMORY
- 9) oTHER uSEFUL aPPLICATIONS oF tHE reu
- 10) cOMPARISION oF bANK sWITCHING AND dma
-
-
-
- 1) _eXTERNAL ram aCCESS wITH reuS_
-
- tHE reuS PROVIDE ADDITIONAL ram FOR THE c64/128. tHREE TYPES OF reuS
- HAVE BEEN PRODUCED BY cOMMODORE. tHESE ARE THE 1700, 1764 AND 1750 WITH
- 128, 256 AND 512 kbYTES BUILT IN ram. hOWEVER THEY CAN BE EXTENDED UP TO
- SEVERAL mbYTES.
- tHE EXTERNAL MEMORY CAN NOT BE ADDRESSED DIRECTLY BY THE c64 WITH IT'S
- 16-BIT ADDRESS SPACE. iT HAS TO BE TRANSFERRED FROM AN TO THE MAIN
- MEMORY OF THE c64. fOR THAT PURPOSE THERE IS A BUILT IN ram eXPANSION
- cONTROLLER (rec) WHICH TRANSFERS MEMORY BETWEEN THE c64 AND THE reu
- USING dIRECT mEMORY aCCESS (dma). iT CAN ALSO BE USED FOR OTHER
- PURPOSES.
-
-
- 2) _ram eXPANSION cONTROLLER (rec) rEGISTERS_
-
- tHE rec IS PROGRAMMED BY ACCESSING IT'S REGISTERS, THAT APPEAR MEMORY
- MAPPED IN THE i/o-AREA BETWEEN $df00 AND $df0a WHEN A reu IS CONNECTED
- THROUGH THE EXPANSION PORT OF THE c64. tHEY CAN BE READ AND WRITTEN TO
- LIKE vic- AND sid-REGISTERS.
-
- $df00: status register
- VARIOUS INFORMATION CAN BE OBTAINED (READ ONLY)
-
- bIT 7: interrupt pending (1 = INTERRUPT WAITING TO BE SERVED)
- UNNECESSARY
- bIT 6: end of block (1 = TRANSFER COMPLETE)
- UNNECESSARY
- bIT 5: fault (1 = BLOCK VERIFY ERROR)
- sET IF A DIFFERENCE BETWEEN c64- AND reu-MEMORY AREAS WAS FOUND
- DURING A COMPARE-COMMAND.
- bIT 4: size (1 = 256 kb)
- sEEMS TO INDICATE THE SIZE OF THE ram-CHIPS. iT IS SET ON 1764
- AND 1750 AND CLEAR ON 1700.
- bITS 3..0: version
- cONTAINS 0 ON MY reu.
-
- $df01: command register
- bY WRITING TO THIS REGISTER ram TRANSFER OR COMPARISION CAN BE
- EXECUTED.
-
- bIT 7: execute (1 = TRANSFER PER CURRENT CONFIGURATION)
- tHIS BIT MUST BE SET TO EXECUTE A COMMAND.
- bIT 6: RESERVED (NORMALLY 0)
- bIT 5: load (1 = ENABLE AUTOLOAD OPTION)
- wITH AUTOLOAD ENABLED THE ADDRESS AND LENGTH REGISTERS (SEE
- BELOW) WILL BE UNCHANGED AFTER A COMMAND EXECUTION.
- oTHERWISE THE ADDRESS REGISTERS WILL BE COUNTED UP TO THE
- ADDRESS OFF THE LAST ACCESSED BYTE OF A dma + 1,
- AND THE LENGTH REGISTER WILL BE CHANGED (NORMALLY TO 1).
- bIT 4: ff00
- iF THIS BIT IS SET COMMAND EXECUTION STARTS IMMEDIATELY
- AFTER SETTING THE COMMAND REGISTER.
- oTHERWISE COMMAND EXECUTION IS DELAYED UNTIL WRITE ACCESS TO
- MEMORY POSITION $ff00
- bITS 3..2: RESERVED (NORMALLY 0)
- bITS 1..0: transfer type
- 00 = TRANSFER c64 -> reu
- 01 = TRANSFER reu -> c64
- 10 = SWAP c64 <-> reu
- 11 = COMPARE c64 - reu
-
- $df02..$df03: c64 base address
- a 16-BIT c64 - BASE ADDRESS IN LOW/HIGH ORDER.
-
- $df04..$df06: reu base address
- tHIS IS A THREE BYTE ADDRESS CONSISTING OF A LOW AND
- HIGH BYTE AND AN EXPANSION BANK NUMBER.
- nORMALLY ONLY BITS 2..0 OF THE EXPANSION BANK ARE VALID
- (FOR A MAXIMUM OF 512 kbYTE), THE OTHER BITS ARE ALWAYS
- SET. tHIS MUST BE DIFFERENT IF MORE THAN 512 kbYTE ARE
- INSTALLED.
-
- $df07..$df08: transfer length
- tHIS IS A 16-BIT VALUE CONTAINING THE NUMBER OF BYTES TO
- TRANSFER OR COMPARE.
- tHE VALUE 0 STANDS FOR 64 kBYTES.
- iF THE TRANSFER LENGTH PLUS THE c64 BASE ADDRESS EXCEEDS
- 64k THE c64 ADDRESS WILL OVERFLOW AND CAUSE c64 MEMORY
- FROM 0 ON TO BE ACCESSED.
- iF THE TRANSFER LENGTH PLUS THE reu BASE ADDRESS EXCEEDS
- 512k THE reu ADDRESS WILL OVERFLOW AND CAUSE reu MEMORY
- FROM 0 ON TO BE ACCESSED.
-
- $df09: interrupt mask register
- UNNECESSARY
-
- bIT 7: interrupt enable (1 = INTERRUPT ENABLED)
- bIT 6: end of block mask (1 = INTERRUPT ON END)
- bIT 5: verify error (1 = INTERRUPT ON VERIFY ERROR)
- bITS 4..0: UNUSED (NORMALLY ALL SET)
-
- $df0a: address control register
- cONTROLLS THE ADDRESS COUNTING DURING dma.
- iF AN ADDRESS IS FIXED, NOT A MEMORY BLOCK BUT ALWAYS THE SAME
- BYTE ADDRESSED BY THE BASE ADDRESS REGISTER IS USED FOR dma.
-
- bIT 7: c64 address control (1 = FIX c64 ADDRESS)
- bIT 6: reu address control (1 = FIX reu ADDRESS)
- bITS 5..0: UNUSED (NORMALLY ALL SET)
-
-
- tO ACCESS THE reu-REGISTERS IN ASSEMBLY LANGUAGE IT IS CONVENIENT TO
- DEFINE LABELS SOMETHING LIKE THIS:
-
- STATUS = $df00
- COMMAND = $df01
- C64BASE = $df02
- REUBASE = $df04
- TRANSLEN = $df07
- IRQMASK = $df09
- CONTROL = $df0a
-
-
- 3) _hOW tO rECOGNIZE tHE reu_
-
- nORMALLY THE ADDRESSES BETWEEN $df00 AND $df0a ARE UNUSED. sO NORMALLY
- IF VALUES ARE STORED THERE THEY GET LOST. sO IF YOU WRITE E.G. THE
- VALUES 1,2,3,... TO $df02..$df08 AND THEY DON'T STAY THERE YOU CAN BE
- SURE THAT NO reu IS CONNECTED. hOWEVER IF THE VALUES ARE THERE IT COULD
- BE BECAUSE ANOTHER KIND OF MODULE IS CONNECTED THAT ALSO USES THESE
- ADDRESSES.
- aNOTHER PROBLEM IS THE RECOGNITION OF THE NUMBER OF ram BANKS (64
- kbYTE UNITS) INSTALLED. tHE size BIT ONLY TELLS THAT THERE ARE AT LEAST
- 2 (1700) OR 4 (1764, 1750) BANKS INSTALLED. bY TRYING TO ACCESS & VERIFY
- BYTES IN AS MANY ram BANKS AS POSSIBLE THE REAL SIZE CAN BE DETERMINED.
- tHIS CAN BE SEEN IN THE SOURCE TO "dYNAMIC MEMORY ALLOCATION FOR THE
- 128" IN cOMMODORE hACKING iSSUE 2.
- i PERSONALLY PREFER TO LET THE USER CHOOSE IF AND WHICH reu BANKS
- SHALL BE USED.
-
-
- 4) _sIMPLE ram tRANSFER_
-
- vERY LITTLE OPTIONS OF THE reu ARE NECESSARY FOR THE MAIN PURPOSES OF
- ram EXPANDING.
- jUST SET THE BASE ADDRESSES, TRANSFER LENGTH AND THEN THE COMMAND
- REGISTER.
-
- tHE FOLLOWING CODE TRANSFERS ONE kbYTE CONTAINING THE SCREEN
- MEMORY ($0400..$07ff) TO ADDRESS 0 IN THE reu:
-
- LDA #0
- STA CONTROL ; TO MAKE SURE BOTH ADDRESSES ARE COUNTED UP
- LDA #<$0400
- STA C64BASE
- LDA #>$0400
- STA C64BASE + 1
- LDA #0
- STA REUBASE
- STA REUBASE + 1
- STA REUBASE + 2
- LDA #<$0400
- STA TRANSLEN
- LDA #>$0400
- STA TRANSLEN + 1
- LDA #%10010000; C64 -> reu WITH IMMEDIATE EXECUTION
- STA COMMAND
-
- tO TRANSFER THE MEMORY BACK TO THE c64 REPLACE "LDA #%10010000"
- BY "LDA #%10010001".
-
- i THINK THAT THIS SUBSET OF 17XX FUNCTIONS WOULD BE ENOUGH FOR A
- REASONABLE ram EXPANSION. hOWEVER IF FULL COMPATIBILITY WITH 17XX reuS
- IS DESIRED ALSO THE MORE COMPLICATED FUNCTIONS HAVE TO BE IMPLEMENTED.
-
-
- 5) _aDDITIONAL fEATURES_
-
-
- sWAPPING mEMORY
-
- wITH THE SWAP-COMMAND MEMORY BETWEEN 17XX AND c64 IS EXCHANGED. tHE
- PROGRAMMING IS THE SAME AS IN SIMPLE ram TRANSFER.
-
-
- cOMPARING mEMORY
-
- nO ram IS TRANSFERRED BUT THE NUMBER OF BYTES SPECIFIED IN THE
- TRANSFER LENGTH REGISTER IS COMPARED. iF THERE ARE DIFFERENCES THE
- fault-BIT OF THE STATUS REGISTER IS SET. tHIS BIT IS CLEARED BY READING
- THE STATUS REGISTER WHICH HAS TO BE DONE BEFORE COMPARING TO GET VALID
- INFORMATION.
-
-
- uSING aLL c64 mEMORY
-
- c64 MEMORY IS ACCESSED BY THE reu NORMALLY IN THE MEMORY CONFIGURATION
- EXISTING DURING WRITING TO THE COMMAND REGISTER. hOWEVER IN ORDER TO BE
- ABLE TO WRITE TO THE COMMAND REGISTER THE i/o-AREA HAS TO BE ACTIVE.
- iF ram BETWEEN $d000 AND $dfff OR CHARACTER rom SHALL BE USED IT IS
- POSSIBLE TO DELAY THE EXECUTION OF THE COMMAND BY STORING A COMMAND BYTE
- WITH BIT 4 ("ff00") CLEARED. tHE COMMAND WILL THEN BE EXECUTED
- BY WRITING ANY VALUE TO ADDRESS $ff00.
-
- eXAMPLE:
-
- < sET BASE ADDRESSES AND TRANSFER LENGTH >
- LDA #%10000000 ; TRANSFER c64 ram -> reu DELAYED
- STA COMMAND
- SEI
- LDA $01
- AND #$30
- STA $01 ; SWITCH ON 64 kbYTE ram
- LDA $ff00 ; TO NOT CHANGE THE CONTENTS OF $ff00
- STA $ff00 ; EXECUTE dma
- LDA $01
- ORA #$37
- STA $01 ; SWITCH ON NORMAL CONFIGURATION
- CLI
-
-
- 6) _tRANSFER sPEED_
-
- dURING dma THE cpu IS HALTED AND THE MEMORY ACCESS CYCLES NORMALLY
- AVAILABLE FOR THE cpu ARE NOW USED TO ACCESS ONE BYTE EACH. sO WITH
- SCREEN AND SPRITES SWITCHED OFF IN EVERY CLOCK CYCLE (985248 PER SECOND
- ON pal MACHINES) A BYTE IS TRANSFERRED. iF SCREEN IS ON OR SPRITES ARE
- ENABLED TRANSFER IS A BIT SLOWER, AS THE vic EXCLUSIVELY ACCESSES ram
- SOMETIMES. aN EXACT DESCRIPTION OF THOSE "MISSING CYCLES" CAN BE FOUND
- IN cOMMODORE hACKING iSSUE 3.
- cOMPARING MEMORY AREAS IS AS FAST AS TRANSFERS. (cOMPARISON IS STOPPED
- ONCE THE FIRST DIFFERENCE IS FOUND.)
- sWAPPING MEMORY IS ONLY HALF AS FAST, AS FOR EVERY BYTES TWO c64 MEMORY
- ACCESSES (READ & WRITE) ARE NECESSARY.
-
-
- 7) _iNTERRUPTS_
-
- bY SETTING CERTAIN BITS IN THE INTERRUPT MASK REGISTER irqS AT THE END
- OF A dma CAN BE SELECTED. hOWEVER AS THE cpu IS HALTED DURING dma IT
- WILL ALWAYS BE FINISHED AFTER THE STORE INSTRUCTION INTO THE COMMAND
- REGISTER OR $ff00. sO THERE IS NO NEED TO CHECK FOR AN "end of block"
- (BIT 6 OF STATUS REGISTER) OR TO ENABLE AN INTERRUPT.
-
-
- 8) _eXECUTING cODE iN eXPANDED mEMORY_
-
- cODE IN EXTERNAL MEMORY HAS ALWAYS TO BE COPIED INTO c64 MEMORY TO BE
- EXECUTED. tHIS IS A DISADVANTAGE AGAINST BANK SWITCHING SYSTEMS. hOWEVER
- BANK SWITCHING CAN BE SIMULATED BY THE swap COMMAND. tHIS IS DONE E.G.
- IN ramdos WHERE ONLY 256 BYTES OF c64 MEMORY ARE OCCUPIED, THE 6 kbYTE
- ram DISK DRIVER IS SWAPPED IN WHENEVER NEEDED. pROBABLY TOO MUCH
- SWAPPING IS THE REASON FOR ramdos TO BE NOT REALLY FAST AT SEQUENTIAL
- FILE ACCESS.
-
-
- 9) _oTHER uSEFUL aPPLICATIONS oF tHE reu_
-
- tHE rec IS NOT ONLY USEFUL FOR ram TRANSFER AND COMPARISON.
-
- oNE OTHER APPLICATION (USED IN geos) IS TO COPY c64 ram AREAS
- BY FIRST TRANSFERRING IT TO THE reu AND THEN TRANSFERRING IT BACK INTO
- THE DESIRED POSITION IN c64 MEMORY. dUE TO THE FAST dma THIS IS ABOUT 5
- TIMES FASTER THAN COPYING MEMORY WITH MACHINE LANGUAGE INSTRUCTIONS.
-
- iNTERESTING THINGS CAN BE DONE BY FIXING BASE ADDRESSES. lARGE c64
- AREAS CAN BE FILLED VERY FAST WITH A SINGLE BYTE VALUE BY FIXING THE reu
- BASE ADDRESS. tHUS IT IS ALSO POSSIBLE TO FIND THE END OF AN AREA
- CONTAINING EQUAL BYTES VERY FAST E.G. FOR DATA COMPRESSION.
-
- fIXING THE c64 BASE ADDRESS IS INTERESTING IF AN i/o-PORT IS USED, AS
- DATA CAN BE WRITTEN OUT FASTER THAN NORMALLY POSSIBLE.
- iT WOULD BE POSSIBLE TO USE REAL BITMAP GRAPHICS IN THE UPPER AND LOWER
- SCREEN BORDER BY CHANGING THE "MAGIC BYTE" (HIGHEST BY THE vic ADDRESSED
- BYTE) IN EVERY CLOCK CYCLE DURING THE BORDER SWITCHED OFF.
-
- gENERALLY THE rec COULD BE USED AS GRAPHICS ACCELERATOR E.G. TO
- COPY BITMAP AREAS OR TO COPY DATA FAST INTO THE vic-ADDRESSABLE
- 16 kbYTE AREA.
-
-
- 10) _cOMPARISION oF bANK sWITCHING AND dma_
-
- wHEN COMPARING BANK SWITCHING AND dma FOR MEMORY EXPANSION i THINK dma
- IS THE MORE COMFORTABLE METHODE TO PROGRAM AND ALSO IS FASTER IN MOST
- CASES. tHE DISADVANTAGE WITH CODE EXECUTION NOT POSSIBLE IN EXTERNAL
- MEMORY COULD BE MINIMIZED BY COPYING ONLY THE NECESSARY PARTS INTO c64
- MEMORY. eXECUTING THE CODE WILL TAKE MUCH MORE TIME THAN COPYING IT
- INTO c64 MEMORY.
-
-
- rICHARD hABLE
- K3027E7@EDVZ.UNI-LINZ.AC.AT
-