Difference between revisions of "Memunpk.asm"
m (Protected "Memunpk.asm" ([edit=autoconfirmed] (indefinite) [move=autoconfirmed] (indefinite))) |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
<CENTER><TABLE BORDER><TR><TH>Entry point</TH><TH>Function provided</TH><TH>Notes</TH></TR> | <CENTER><TABLE BORDER><TR><TH>Entry point</TH><TH>Function provided</TH><TH>Notes</TH></TR> | ||
− | <TR><TD>MEMUNPK</TD><TD ROWSPAN=2> | + | <TR><TD>MEMUNPK</TD><TD ROWSPAN=2>Like [[memcpy.asm]], but unpacks 8-bit data stored in 16-bit words</TD><TD>Source, destination and length fixed in ROM.</TD></TR> |
<TR><TD>MEMUNPK.1</TD><TD>Source, destination and length in registers.</TD></TR></TABLE></CENTER> | <TR><TD>MEMUNPK.1</TD><TD>Source, destination and length in registers.</TD></TR></TABLE></CENTER> | ||
<br /><br /> | <br /><br /> | ||
Line 14: | Line 14: | ||
= Notes = | = Notes = | ||
+ | |||
+ | The code expects to write the data in 8-bit memory, such as [[Scratchpad RAM]] or [[Graphics RAM]], and so does not explicitly mask the written value. Instead, it relies on the hardware ignoring the upper 8 bits of the write. This works as expected when writing to 8-bit RAM, which is its intended use. | ||
= Source Code = | = Source Code = |
Latest revision as of 08:57, 4 December 2010
Functions Provided
Entry point | Function provided | Notes |
---|---|---|
MEMUNPK | Like memcpy.asm, but unpacks 8-bit data stored in 16-bit words | Source, destination and length fixed in ROM. |
MEMUNPK.1 | Source, destination and length in registers. |
See source code below for calling convention.
Examples
(todo... please contribute!)
Notes
The code expects to write the data in 8-bit memory, such as Scratchpad RAM or Graphics RAM, and so does not explicitly mask the written value. Instead, it relies on the hardware ignoring the upper 8 bits of the write. This works as expected when writing to 8-bit RAM, which is its intended use.
Source Code
;* ======================================================================== *; ;* These routines are placed into the public domain by their author. All *; ;* copyright rights are hereby relinquished on the routines and data in *; ;* this file. -- Joseph Zbiciak, 2008 *; ;* ======================================================================== *; ;; ======================================================================== ;; ;; MEMUNPK Unpack a 16-bit array to an 8-bit array. ;; ;; MEMUNPK.1 Alternate entry point ;; ;; ;; ;; AUTHOR ;; ;; Joseph Zbiciak <intvnut AT gmail.com> ;; ;; ;; ;; REVISION HISTORY ;; ;; 08-Sep-2001 Initial Revision ;; ;; ;; ;; INPUTS for MEMUNPK ;; ;; R5 Pointer to invocation record, followed by return address. ;; ;; Pointer to destination 1 DECLE ;; ;; Pointer to source 1 DECLE ;; ;; Length of source array 1 DECLE ;; ;; ;; ;; INPUTS for MEMUNPK.1 ;; ;; R5 Return address ;; ;; R4 Pointer to destination ;; ;; R1 Pointer to source ;; ;; R0 Length of source array ;; ;; ;; ;; OUTPUTS ;; ;; R0 $FFFF ;; ;; R1 Last 16-bit word copied, byte-swapped. ;; ;; R4 Points one element beyond destination array ;; ;; R5 Points one element beyond source array ;; ;; ;; ;; TECHNIQUES ;; ;; Unrolled 4x for speed. ;; ;; Special dispatch handles length % 4 != 0. ;; ;; ;; ;; CODESIZE ;; ;; ?? words ;; ;; ;; ;; CYCLES ;; ;; Not yet characterized. ;; ;; ======================================================================== ;; MEMUNPK PROC MVI@ R5, R4 ; 8 Destination array MVI@ R5, R1 ; 8 Source array MVI@ R5, R0 ; 8 Length @@1: PSHR R5 ; 9 Alternate entry point MOVR R1, R5 ; 6 Use auto-incr pointer MOVR R0, R1 ; 6 Copy array length SLR R0, 2 ; 8 Find floor(length / 4) ANDI #3, R1 ; 8 \ SLL R1, 2 ; 8 |__ Find address to jump to for SUBI #@@end, R1 ; 8 | first iteration, to handle NEGR R1 ; 6 / length % 4. MOVR R1, PC ; 6 Jump into copy loop. @@loop: MVI@ R5, R1 ; 8 \ MVO@ R1, R4 ; 9 |__ Copy first pair of bytes SWAP R1, 1 ; 6 | MVO@ R1, R4 ; 9 / MVI@ R5, R1 ; 8 \ MVO@ R1, R4 ; 9 |__ Copy second pair of bytes SWAP R1, 1 ; 6 | MVO@ R1, R4 ; 9 / MVI@ R5, R1 ; 8 \ MVO@ R1, R4 ; 9 |__ Copy third pair of bytes SWAP R1, 1 ; 6 | MVO@ R1, R4 ; 9 / MVI@ R5, R1 ; 8 \ MVO@ R1, R4 ; 9 |__ Copy fourth pair of bytes SWAP R1, 1 ; 6 | MVO@ R1, R4 ; 9 / @@end: DECR R0 ; 6 BPL @@loop ; 9/7 Iterate floor(length/4) + 1 times ;---- ; 143*k - 2 @@done: PULR PC ; 11 Return ENDP ;; ======================================================================== ;; ;; End of File: memunpk.asm ;; ;; ======================================================================== ;;