Update Makefile to assembling files in asm directory, with ORCA assembler, update LZ4.s to work with ORCA assembler, update LZ4.s so it can be called from ORCA/C, add code to xrick.c to prove that it works

This commit is contained in:
dwsJason 2018-08-02 20:35:57 -04:00
parent 4daa62fde9
commit cf7eac86cc
3 changed files with 115 additions and 12 deletions

View File

@ -36,7 +36,9 @@
VPATH = src:obj VPATH = src:obj
SOURCEFILES = $(wildcard src/*.c) SOURCEFILES = $(wildcard src/*.c)
ASMFILES = $(wildcard asm/*.s)
OBJFILES = $(patsubst src/%.c,obj/%.a,$(SOURCEFILES)) OBJFILES = $(patsubst src/%.c,obj/%.a,$(SOURCEFILES))
OBJFILES += $(patsubst asm/%.s,obj/%.a,$(ASMFILES))
CC = iix compile CC = iix compile
CFLAGS = cc=-DIIGS=1 cc=-Iinclude cc=-Isrc CFLAGS = cc=-DIIGS=1 cc=-Iinclude cc=-Isrc
# List of directories to create # List of directories to create
@ -58,10 +60,11 @@ help:
xrick.lib: $(OBJFILES) xrick.lib: $(OBJFILES)
@echo Y | del xrick.lib @echo Y | del xrick.lib
iix makelib -P xrick.lib $(patsubst %,+%,$(OBJFILES)) iix makelib -P xrick.lib $(patsubst %,+%,$(OBJFILES))
# iix makelib -P xrick.lib test.obj
xrick.sys16: xrick.lib xrick.sys16: xrick.lib
# iix link +L obj\xrick xrick.lib keep=xrick.sys16 # iix link +L obj\xrick xrick.lib keep=xrick.sys16
iix link obj\xrick xrick.lib keep=xrick.sys16 iix link obj\xrick xrick.lib data.lib keep=xrick.sys16
gs: xrick.sys16 gs: xrick.sys16
@ -93,5 +96,9 @@ obj/%.a : src/%.c
@echo Compiling $(<F) @echo Compiling $(<F)
@$(CC) -P -I +O $< keep=$(basename $@) $(CFLAGS) @$(CC) -P -I +O $< keep=$(basename $@) $(CFLAGS)
obj/%.a : asm/%.s
@echo Assembling $(<F)
@$(CC) -P -I +O $< keep=$(basename $@) $(CFLAGS)
# Create all the directories # Create all the directories
$(shell if not exist $(DIRS) mkdir $(DIRS)) $(shell if not exist $(DIRS) mkdir $(DIRS))

View File

@ -1,8 +1,77 @@
*
* ORCA/M Format!!
* LZ4 Decompress by Brutal Deluxe!!!
*
case on
longa on
longi on
MX %00 Dummy1 start ASMCODE
end
*
* int LZ4_Unpack(u8* pDest, u8* pPackedSource);
*
LZ4_Unpack start ASMCODE
pDest equ 5
pPackedSource equ 9
phb
phk
plb
sep #$20
lda pPackedSource+2,s ; Pull out the src/dst banks
xba
lda pDest+2,s ; Pull out the src/dst banks
rep #$31
tax ; Temp save in X
lda pDest,s
sta LZ4_Dst+1
lda pPackedSource+1,s ; address of packed source + 4, is the unpacked len
sta upl+2
lda pPackedSource,s
adc #12
sta upl+1
upl lda >0 ; packed length
adc #16 ; 16 bytes for packed buffer header
adc pPackedSource,s ; start of packed buffer
tay ; y has the pack data stop address
anop ; 1st packed Byte offset
lda pPackedSource,s ; skip 16 byte header on the source
adc #16
pha
txa
plx
jsr ASM_LZ4_Unpack
tay
anop ; Copy the Return address
lda 1,s
sta pPackedSource,s
lda 3,s
sta pPackedSource+2,s
tsc
sec
sbc #-8
tcs
tya ; return length
plb
rtl
*------------------------------------------------------------------------------- *-------------------------------------------------------------------------------
LZ4_Unpack STA LZ4_Literal_3+1 ; Uncompress a LZ4 Packed Data buffer (64 KB max) ASM_LZ4_Unpack STA LZ4_Literal_3+1 ; Uncompress a LZ4 Packed Data buffer (64 KB max)
SEP #$20 ; A = Bank Src,Bank Dst SEP #$20 ; A = Bank Src,Bank Dst
STA LZ4_Match_5+1 ; X = Header Size = 1st Packed Byte offset STA LZ4_Match_5+1 ; X = Header Size = 1st Packed Byte offset
STA LZ4_Match_5+2 ; Y = Pack Data Size STA LZ4_Match_5+2 ; Y = Pack Data Size
@ -13,8 +82,8 @@ LZ4_Unpack STA LZ4_Literal_3+1 ; Uncompress a LZ4 Packed Data buffer (6
REP #$30 REP #$30
STY LZ4_Limit+1 STY LZ4_Limit+1
*-- *--
LDY #$0000 ; Init Target unpacked Data offset LZ4_Dst LDY #$0000 ; Init Target unpacked Data offset
LZ4_ReadToken LDAL $AA0000,X ; Read Token Byte LZ4_ReadToken LDA >$AA0000,X ; Read Token Byte
INX INX
STA LZ4_Match_2+1 STA LZ4_Match_2+1
*---------------- *----------------
@ -24,12 +93,12 @@ LZ4_Literal AND #$00F0 ; >>> Process Literal Bytes <<<
BNE LZ4_Literal_1 BNE LZ4_Literal_1
JSR LZ4_GetLengthLit ; Compute Literal Length with next bytes JSR LZ4_GetLengthLit ; Compute Literal Length with next bytes
BRA LZ4_Literal_2 BRA LZ4_Literal_2
LZ4_Literal_1 LSR ; Literal Length use the 4 bit LZ4_Literal_1 LSR A ; Literal Length use the 4 bit
LSR LSR A
LSR LSR A
LSR LSR A
*-- *--
LZ4_Literal_2 DEC ; Copy A+1 Bytes LZ4_Literal_2 DEC A ; Copy A+1 Bytes
LZ4_Literal_3 MVN $AA,$BB ; Copy Literal Bytes from packed data buffer LZ4_Literal_3 MVN $AA,$BB ; Copy Literal Bytes from packed data buffer
PHK ; X and Y are auto incremented PHK ; X and Y are auto incremented
PLB PLB
@ -39,7 +108,7 @@ LZ4_Limit CPX #$AAAA ; End Of Packed Data buffer ?
*---------------- *----------------
LZ4_Match TYA ; >>> Process Match Bytes <<< LZ4_Match TYA ; >>> Process Match Bytes <<<
SEC SEC
LZ4_Match_1 SBCL $AA0000,X ; Match Offset LZ4_Match_1 SBC >$AA0000,X ; Match Offset
INX INX
INX INX
STA LZ4_Match_4+1 STA LZ4_Match_4+1
@ -63,7 +132,7 @@ LZ4_Match_5 MVN $BB,$BB ; Copy Match Bytes from unpacked data bu
*---------------- *----------------
LZ4_GetLengthLit LDA #$000F ; Compute Variable Length (Literal or Match) LZ4_GetLengthLit LDA #$000F ; Compute Variable Length (Literal or Match)
LZ4_GetLengthMat STA LZ4_GetLength_2+1 LZ4_GetLengthMat STA LZ4_GetLength_2+1
LZ4_GetLength_1 LDAL $AA0000,X ; Read Length Byte LZ4_GetLength_1 LDA >$AA0000,X ; Read Length Byte
INX INX
AND #$00FF AND #$00FF
CMP #$00FF CMP #$00FF
@ -78,3 +147,5 @@ LZ4_GetLength_3 ADC LZ4_GetLength_2+1
LZ4_End TYA ; A = Length of Unpack Data LZ4_End TYA ; A = Length of Unpack Data
RTS RTS
*------------------------------------------------------------------------------- *-------------------------------------------------------------------------------
end

View File

@ -21,13 +21,38 @@
//extern void waitkey(); //extern void waitkey();
//extern void fbuffer(); //extern void fbuffer();
extern char title_lz4;
char *VIDEO = (char*)0xE1C029;
extern int LZ4_Unpack(char* pDest, char* pPackedSource);
/* /*
* main * main
*/ */
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
//char *pChar = &testtext;
printf("Hello from xrick IIgs\n"); printf("Hello from xrick IIgs\n");
printf("Unpacking Splash!");
LZ4_Unpack((char*)(0xE12000), &title_lz4);
//while (pChar[0])
//{
// pChar[0]|=0x80;
// pChar++;
//}
// printf("%s\n", &testtext);
// SHR ON
*VIDEO|=0xC0;
// waitkey(); // waitkey();
// fbuffer(); // fbuffer();