Add packer/unpacker

This commit is contained in:
Michaelangel007 2017-10-09 02:15:31 -07:00
commit 4cb6e13761
3 changed files with 274 additions and 0 deletions

36
cmd_pack_unpack.c Normal file
View File

@ -0,0 +1,36 @@
#include <stdio.h>
void cmd_pack_unpack()
{
int src;
int dst;
printf( "=== Pack ===\n" );
src = 0x2000;
dst = 0x4000;
while( src < 0x4000 )
{
// printf( "$%04X .. $%04X -> $%04X\n", src, src+0x77, dst );
printf( "%04X<%04X.%04XM\n", dst, src, src+0x77 );
src += 0x80;
dst += 0x78;
}
printf( "=== Pack ===\n" );
src = 0x4000;
dst = 0x2000;
while( src < 0x5E00 )
{
// printf( "$04X\n", src );
printf( "%04X<%04X.%04XM\n", dst, src, src+0x77 );
src += 0x80;
dst += 0x78;
}
}
int main()
{
cmd_pack_unpack();
return 0;
}

BIN
pack_unpack Normal file

Binary file not shown.

238
pack_unpack.s Normal file
View File

@ -0,0 +1,238 @@
; Michael Pohoreski
; github
; HGR Packer/Unpacker by removing/adding HGR screen holes
; Pack 8,192 bytes down to 8,192-512 = 7,680 = 30 sectors instead of 34 sectors
; Remove the "screen holes" by "sliding" remaining memory down over them
; Basically a glorified memcpy()
;
; Binary
; ======
; CALL-151
; 0300:A9 20 A2 40 85 FB A0 FE
; 0308:D0 08 A9 40 A2 20 86 FB
; 0310:A0 FC 8C 3D 03 8C 41 03
; 0318:C8 8C 45 03 A0 00 84 FE
; 0320:85 FF 84 FC 86 FD A2 78
; 0328:B1 FE 91 FC E6 FE D0 02
; 0330:E6 FF E6 FC D0 02 E6 FD
; 0338:CA D0 ED 18 A5 FE 69 08
; 0340:85 FE D0 E2 E6 FF C6 FB
; 0348:D0 DC 60
; BSAVE HGR_PACK_UPACK,A$300,L$4B
;
; Usage
; =====
; BLOAD PIC,A$2000
; CALL 768:REM $300
; BSAVE PIC.PACK,A$4000,L$1E00
; CALL 778:REM $30A
; BSAVE PIC.HGR,A$2000,L$2000
;
; Pack - Monitor Commands
; =======================
; 4000<2000.2077M
; 4078<2080.20F7M
; 40F0<2100.2177M
; 4168<2180.21F7M
; 41E0<2200.2277M
; 4258<2280.22F7M
; 42D0<2300.2377M
; 4348<2380.23F7M
; 43C0<2400.2477M
; 4438<2480.24F7M
; 44B0<2500.2577M
; 4528<2580.25F7M
; 45A0<2600.2677M
; 4618<2680.26F7M
; 4690<2700.2777M
; 4708<2780.27F7M
; 4780<2800.2877M
; 47F8<2880.28F7M
; 4870<2900.2977M
; 48E8<2980.29F7M
; 4960<2A00.2A77M
; 49D8<2A80.2AF7M
; 4A50<2B00.2B77M
; 4AC8<2B80.2BF7M
; 4B40<2C00.2C77M
; 4BB8<2C80.2CF7M
; 4C30<2D00.2D77M
; 4CA8<2D80.2DF7M
; 4D20<2E00.2E77M
; 4D98<2E80.2EF7M
; 4E10<2F00.2F77M
; 4E88<2F80.2FF7M
; 4F00<3000.3077M
; 4F78<3080.30F7M
; 4FF0<3100.3177M
; 5068<3180.31F7M
; 50E0<3200.3277M
; 5158<3280.32F7M
; 51D0<3300.3377M
; 5248<3380.33F7M
; 52C0<3400.3477M
; 5338<3480.34F7M
; 53B0<3500.3577M
; 5428<3580.35F7M
; 54A0<3600.3677M
; 5518<3680.36F7M
; 5590<3700.3777M
; 5608<3780.37F7M
; 5680<3800.3877M
; 56F8<3880.38F7M
; 5770<3900.3977M
; 57E8<3980.39F7M
; 5860<3A00.3A77M
; 58D8<3A80.3AF7M
; 5950<3B00.3B77M
; 59C8<3B80.3BF7M
; 5A40<3C00.3C77M
; 5AB8<3C80.3CF7M
; 5B30<3D00.3D77M
; 5BA8<3D80.3DF7M
; 5C20<3E00.3E77M
; 5C98<3E80.3EF7M
; 5D10<3F00.3F77M
; 5D88<3F80.3FF7M
;
; Unpack - Monitor Commands
; =========================
; 2000<4000.4077M
; 2078<4080.40F7M
; 20F0<4100.4177M
; 2168<4180.41F7M
; 21E0<4200.4277M
; 2258<4280.42F7M
; 22D0<4300.4377M
; 2348<4380.43F7M
; 23C0<4400.4477M
; 2438<4480.44F7M
; 24B0<4500.4577M
; 2528<4580.45F7M
; 25A0<4600.4677M
; 2618<4680.46F7M
; 2690<4700.4777M
; 2708<4780.47F7M
; 2780<4800.4877M
; 27F8<4880.48F7M
; 2870<4900.4977M
; 28E8<4980.49F7M
; 2960<4A00.4A77M
; 29D8<4A80.4AF7M
; 2A50<4B00.4B77M
; 2AC8<4B80.4BF7M
; 2B40<4C00.4C77M
; 2BB8<4C80.4CF7M
; 2C30<4D00.4D77M
; 2CA8<4D80.4DF7M
; 2D20<4E00.4E77M
; 2D98<4E80.4EF7M
; 2E10<4F00.4F77M
; 2E88<4F80.4FF7M
; 2F00<5000.5077M
; 2F78<5080.50F7M
; 2FF0<5100.5177M
; 3068<5180.51F7M
; 30E0<5200.5277M
; 3158<5280.52F7M
; 31D0<5300.5377M
; 3248<5380.53F7M
; 32C0<5400.5477M
; 3338<5480.54F7M
; 33B0<5500.5577M
; 3428<5580.55F7M
; 34A0<5600.5677M
; 3518<5680.56F7M
; 3590<5700.5777M
; 3608<5780.57F7M
; 3680<5800.5877M
; 36F8<5880.58F7M
; 3770<5900.5977M
; 37E8<5980.59F7M
; 3860<5A00.5A77M
; 38D8<5A80.5AF7M
; 3950<5B00.5B77M
; 39C8<5B80.5BF7M
; 3A40<5C00.5C77M
; 3AB8<5C80.5CF7M
; 3B30<5D00.5D77M
; 3BA8<5D80.5DF7M
;
; First Packed Byte: $4000
; Last Packed Byte: $5DFF
; Each page of HGR memory has 6 scanlines
; First Half of Page ($78 bytes) = 3 scanlines
; Last Half of Page ($78 bytes) = 3 scanlines
Row = $FB ; 6 scanlines/page processed per loop
Dst = $FC
Src = $FE
org $300
; ========================================================================
Pack
lda #$20 ; Src: HGR Page 1
ldx #$40 ; Dst: HGR Page 2
sta Row ; 32 pages * 6 scanlines/page = 192 scanlines
ldy #Src
bne Common
; ========================================================================
Unpack
lda #$40 ; Src: HGR Page 2
ldx #$20 ; Dst: HGR Page 1
stx Row ; 32 pages * 6 scanlines/page = 192 scanlines
ldy #Dst
; A = Src Page
; X = Dst Page
; Pack:
; Y = Src zero-page address
; Unpack:
; Y = Dst zero-page address
; ========================================================================
Common
sty _Delta1+1 ; *** SELF-MODIFYING
sty _Delta2+1 ; *** SELF-MODIFYING
iny
sty _Delta3+1 ; *** SELF-MODIFYING
ldy #$00 ; low of src, low of dst
sty Src+0
sta Src+1
sty Dst+0
stx Dst+1
; -------- process 3 scan lines
HalfPage
ldx #$78 ; Pack 3 (non-linear) scan lines [$2000..$2027, $2028..$2057, $2058..$2077]
CopyHalf
lda (Src),y
sta (Dst),y
inc Src+0 ; src++
bne SrcPage
inc Src+1 ; 16-bit pointer
SrcPage
inc Dst+0 ; dst++
bne DstPage
inc Dst+1 ; 16-bit pointer
DstPage
dex
bne CopyHalf
; -------- processed 6 scanlines?
clc ; src += 8
_Delta1 lda Src+0 ; *** SELF-MODIFIED
adc #8 ; src = $xx78 + 8 -> $xx80
_Delta2 sta Src+0 ; *** SELF-MODIFIED
bne HalfPage ; src = $xxF8 + 8 -> $yy00
_Delta3 inc Src+1 ; *** SELF-MODIFIED
dec Row
bne HalfPage
rts