# New copy-paste mecanism.
# Routines
## Module clip
On introduit un nouveau module `clip.o`. Motivation:
- Le module `org.o` gère déjà org_copy et d'autres aspect "block". Mais son role principal reste le codage/decodage de sources z80 orgams.
- L'editeur permettra bientot de travailler avec d'autres types de fichiers (pur texte, autres languages de programmation, ...). On voit bien que la gestion du clipboard doit etre isolee.
- Cela permet d'avoir des modules simples, petits et a responsabilite limitee.
### (gurneyh?) free_clipboard
```
free_clipboard
; Empty clipboard (release associated memory)
; In: A: Clip # (0 from now)
; Out: Nothing (should BRK if assumptions violated)
```
#### Variables
Global:
`clipboard`: Pointeur vers clipboard. Initialisé a l'invocation d'Orgams.
Local:
As you wish!
See [How to introduce a new variable](https://hackmd.io/m2EuaMKVRyysyjfMaIr38w).
#### Dependencies
Routines that needs to be called. See if you see why!
See [How to call orgams routine](https://hackmd.io/GHAIutTCT52iDAPM8mz7RA)
##### chunk:free_list
### (gurneyh?) copy_to_clipboard
```
copy_to_clipboard
; Copy section of source to clipboard.
; In: A: Clip # (0 from now)
; HL: Address line start
; C: Bank line end
; DE: Address post line end (that is, everything must be copied up to DE-1 included)
```
#### Implementation.
La structure du clipboard n'a pas besoin d'etre connuee. Les routines fournies permettent de l'initialiser et de le remplir.
Similairement, les details de la structure du source pre-encodes sont hors-sujet. Cela dit, voila ce qu'il faut savoir :
- Le source est decoupé en une liste chainee de chunks de &100 octets alignés.
- Chaque chunk consiste en un header et les donnees proprement dites.
- Un chunk n'est pas forcement rempli, la position du dernier octet est en +2. Le chunk est rempli ssi cette position est &ff.
#### Variables
Global:
`clipboard`: Pointeur vers clipboard. Initialisé a l'invocation d'Orgams.
Local:
As you wish!
See [How to introduce a new variable](https://hackmd.io/m2EuaMKVRyysyjfMaIr38w).
#### Dependencies
Routines that needs to be called. See if you see why!
See [How to call orgams routine](https://hackmd.io/GHAIutTCT52iDAPM8mz7RA)
##### free_clipboard
##### org:connect_line_start_end
##### chunk:newlist
##### chunk:appendraw
### (gurneyh?) copy_from_clipboard
```
; Copy clipboard to current source.
; In: A: Clip # (0 from now)
; B: Bank line start
; DE: Line destination #
; C: Bank line end
; DE: Address post line end (that is, everything must be copied up to DE-1 included)
```
This routines needs to call:
* reset_clipboard (in: A= clipboard #. 0 For now. Out: HL = chunk ID for start of clipboard)
* insert_new_chunk
#### Variables
Global:
`clipboard`: Same as above.
#### Prerequisite:
(madram) `connect_line_start_end` must return current bank.
(madram) Find room for variable clipboard.
(madram) Initialize clipboard at 0 at orgams init time.
# Tests
Not needed right now, since there are a **lot** of tests already against `org_copy`.
### Detach
Not needed right now:
will be used by COPY-X, COPY-DEL and COPY-M.
## Modifications
### org:org_copy
NB: This routine won't be called anymore from the editor.
Yet we want to keep it since a lot of unit-tests rely on it.
That's a way to indirectly validate the new routines.
After `call set_modified`, must replaced all code by a use of `copy_to_clipboard` + `copy_from_clipboard` + `free_clipboard` (that's not striclty necessary, but it's would be closer from the current behavior).
Note: `call set_modified` must actually moved into copy_from_clipboard.
#### Move org:org_copy
Move the routine with the tests that use it. We don't need it anymore in rom.