Language…
19 users online: Domokun007,  Eevee, eltiolavara9, GiraffeKiller, GRIMMKIN, h.carrell, Housemeister, Irondill, koffe190, Maw, MeteorSmasher4, Mike777, nonamelol1, OEO6, Pizzagamer9791, Raccoon Sam, Rykon-V73, The_Uber_Camper, Ztarhaven - Guests: 254 - Bots: 289
Users: 64,795 (2,375 active)
Latest user: mathew

Posts by Min

Min's Profile → Posts

  • Pages:
  • 1
MVN test.

Code
header
lorom

!ofs = $8FF000

macro ReadByte()
STX $8A
LDA [$8A]
INX
BNE $03
JSR BANK_INC
endmacro

org $80B8E3
	JSL !ofs
	RTS
	
org !ofs
	PHB
	PEI ($03)
	PEI ($05)
	PEI ($07)
	PEI ($09)
	PEI ($0B)
	PEI ($8A)
	SEP #$20
	REP #$10
	LDA $02
	PHA
	PLB
	STA $05		; dest_bank
	INC
	STA $03		; dest_bank [plus or minus]
	LDA #$54
	STA $04		; mvn
	LDA #$4C
	STA $07		; jump
	LDA $8C
	STA $06		; src_bank
	LDX.w #.back
	STX $08
	
	LDY $00		; dest_low
	LDX $8A		; src_low
	STZ $8A
	STZ $8B
	BRA .main

.case_80_or_e0
	BPL .lz
	LDA $8D
	CMP #$1F
	BNE .case_e0
	PLX : STX $8A
	PLX : STX $0B
	PLX : STX $09
	PLX : STX $07
	PLX : STX $05
	PLX : STX $03
	SEP #$10
	PLB
	RTL
	
.case_e0
	AND #$03
	STA $8E
	EOR $8D
	ASL
	ASL
	ASL
	XBA
	%ReadByte()
	STA $8D
	XBA
	BRA .type
	
.lz
	%ReadByte()
	XBA
	%ReadByte()
	
	STX $0B
	REP #$21
	ADC $00
	TAX
	LDA $8D
	SEP #$20
	BIT $03
	BPL +
	MVN $7F7F
	BRA ++
+	MVN $7E7E
++	LDX $0B
	
.main
	%ReadByte()
	STA $8D
	STZ $8E
	AND #$E0
	TRB $8D

.type
	ASL
	BCS .case_80_or_e0
	BMI .case_40_or_60
	ASL
	BMI .case_20

.case_00
	REP #$20
	LDA $8D
	STX $8D
	
-	SEP #$20
	JMP $0004
	
.back
	CPX $8D
	BCS .main
	
	JSR BANK_INC_2
	CPX #$0000
	BEQ ++
	
	DEX
	STX $0B
	REP #$21
	LDX #$8000
	STX $8D
	TYA
	SBC $0B
	TAY
	LDA $0B
	BRA -
	
++	LDX #$8000
	BRA .main

.case_20
	%ReadByte()
	STX $0B
	PHA
	PHA
	REP #$20
	
.case_20_main
	LDA $8D
	INC
	LSR
	TAX
	PLA
	
-	STA $0000,Y
	INY
	INY
	DEX
	BNE -
	
	SEP #$20
	BCC +
	STA $0000,Y
	INY
+	LDX $0B
	BRA .main
	
.case_40_or_60
	ASL
	BMI .case_60
	%ReadByte()
	XBA
	%ReadByte()

	XBA
	STX $0B
	REP #$20
	PHA
	BRA .case_20_main
	
.case_60
	%ReadByte()
	STX $0B
	LDX $8D
-	STA $0000,Y
	INC
	INY
	DEX
	BPL -
	LDX $0B
	JMP .main
	
BANK_INC:
	LDX #$8000
BANK_INC_2:
	INC $06
	INC $8C
	RTS
@smkdan: Thanks.

I rewrote the code.

Code
lorom
header

!Freespace = $1D8000|$800000

macro ReadByte()
	STX $8A
	LDA [$8A]
	INX
	BNE +
	JSR BANK_INC
+
endmacro

macro ReadWord()
	STX $8A
	LDA [$8A]
	INX
	INX
	BMI +
	JSR BANK_INC_2
+
endmacro

org $80B8E3
	JSL CodeStart
	RTS
	
org !Freespace
	reset bytes
	db "STAR"
	dw CodeEnd-CodeStart-$0001
	dw CodeEnd-CodeStart-$0001^$FFFF
	
CodeStart:
	PHB
	PEI ($03)
	PEI ($05)
	PEI ($07)
	PEI ($09)
	PEI ($0B)
	PEI ($8A)
	SEP #$20
	REP #$10
	LDA $02
	PHA
	PLB
	STA $05		; dest_bank
	INC
	STA $03		; dest_bank [plus or minus]
	LDA #$54
	STA $04		; mvn
	LDA #$4C
	STA $07		; jump
	LDA $8C
	STA $06		; src_bank
	LDX.w #.back
	STX $08
	
	LDY $00		; dest_low
	LDX $8A		; src_low
	STZ $8A
	STZ $8B
	JMP .main

.case_ff
	PLX : STX $8A
	PLX : STX $0B
	PLX : STX $09
	PLX : STX $07
	PLX : STX $05
	PLX : STX $03
	REP #$20
	TYA
	SBC $00		; carry = 1
	STA $8D		; size
	SEP #$30
	PLB
	RTL

.case_e0
	LDA $8D
	CMP #$1F
	BEQ .case_ff
	AND #$03
	STA $8E
	EOR $8D
	ASL
	ASL
	ASL
	XBA
	%ReadByte()
	STA $8D
	XBA
	BRA .type
	
.case_00
	LDA $8E
	XBA
	LDA $8D
-	JMP $0004
	
.back
	CPX #$0000
	BMI .main
	
	INC $06
	INC $8C
	DEX
	BMI ++
	STX $0B
	REP #$21
	LDX #$8000
	TYA
	SBC $0B
	TAY
	LDA $0B
	SEP #$20
	BRA -
	
++	LDX #$8000
	BRA .main
	
.case_80_or_e0
	BMI .case_e0
	REP #$21
	%ReadWord()
	XBA
	STX $8A
	ADC $00
	TAX
	LDA $8D
	SEP #$20
	BIT $03
	BPL +
	MVN $7F7F
	BRA ++
+	MVN $7E7E
++	LDX $8A
	BRA .bra

.main
	STX $8A
.bra
	LDA [$8A]
	INX
	BNE +
	JSR BANK_INC
+	STA $8D
	STZ $8E
	AND #$E0
	TRB $8D

.type
	ASL
	BCS .case_80_or_e0
	BEQ .case_00
	BMI .case_40_or_60

.case_20
	%ReadByte()
	STX $0B
	PHA
	PHA
	REP #$20
	
.case_20_main
	LDA $8D
	INC
	LSR
	TAX
	PLA
	
-	STA $0000,Y
	INY
	INY
	DEX
	BNE -
	
	SEP #$20
	LDX $0B
	BCC .main
	
	STA $0000,Y
	INY
	BRA .main
	
.case_40_or_60
	ASL
	BMI .case_60
	REP #$20
	%ReadWord()
	STX $0B
	PHA
	BRA .case_20_main
	
.case_60
	%ReadByte()
	STX $0B
	LDX $8D
-	STA $0000,Y
	INC
	INY
	DEX
	BPL -
	LDX $0B
	JMP .main
	
BANK_INC:
	LDX #$8000
	INC $06
	INC $8C
	RTS

BANK_INC_2:
	CPX #$0001
	LDX #$8000
	INC $06		; $07($8D) is not affected.
	INC $8C
	BCC +
	
	SEP #$20
	XBA
	STX $8A
	LDA [$8A]
	XBA
	INX
	REP #$21
+	RTS
CodeEnd:
print "Insert Size: ",bytes," bytes"


DMA ver. (not use SRAM)
// updated

Code
lorom
header

!Freespace = $1D8000|$800000

; Note: 
; - This routine uses $00:211B-$00:211C,
;   $00:2134-$00:2136, $00:435x-$00:436x.
;
; - This routine doesn't use WRAM->SRAM->WRAM DMA,
;   because it will fail in some cases.
;
;   Error case: 
;   CompData: <02:01 02 03> <85:00 00> <FF>
;   dest: $7F0000
;
;   <02:01 02 03>
;   01 02 03 .. .. .. .. .. ..
;   01 02 03 .. .. .. .. .. ..
;
;   <85:00 00>
;   01 02 03 01 02 03 01 02 03 ; Default / MVN
;   01 02 03 01 02 03 .. .. .. ; (for example)
;    WRAM->SRAM ($7F:0000-$7F:0005 -> $70:0000-$70:0005)
;    SRAM->WRAM ($70:0000-$70:0005 -> $7F:0003-$7F:0008)
;
; - It is needed to change the value of D register 
;   from $4300 to $0000 at the beginning of NMI/IRQ.
;

macro ReadByte()
	LDA [$67],Y
	INY
	BNE +
	JSR BANK_INC
+
endmacro
	
macro ReadWord()
	LDA [$67],Y
	INY
	INY
	BMI +
	JSR BANK_INC_2
+
endmacro

org $80B8E3
	JSL CodeStart
	RTS
	
org !Freespace
	reset bytes
	db "STAR"
	dw CodeEnd-CodeStart-$0001
	dw CodeEnd-CodeStart-$0001^$FFFF
	
CodeStart:
	PHB
	PHK
	PLB
	PHD
	PEA $4300
	PLD
	
	LDX #$3480
	STX $50		; dma_param
	LDX $0000
	STX $58		; dest_low[start] / (HDMA Table Address)
	LDA $0002
	STA $54		; dest_bank
	STA $2183
	INC
	STA $57		; [Plus or Minus] / (HDMA Indirect Bank)
	
	LDY #$8000
	STY $60		; dma_param
	LDY $008A
	STZ $67		; src_low
	STZ $68		; src_high
	LDA $008C
	STA $64		; src_bank
	STA $69		; src_bank
	JMP .main
	
.end
	PLD
	REP #$20
	TXA
	SBC $00		; carry = 1
	STA $8D		; size
	SEP #$30
	PLB
	RTL
	
.case_e0
	LDA $65
	CMP #$1F
	BEQ .end
	AND #$03
	STA $66
	EOR $65
	ASL #3
	XBA
	%ReadByte()
	STA $65
	XBA
	BRA .type
	
.case_00
	REP #$21
	INC $65		; bytecount
	STX $2181
	TXA
	ADC $65
	TAX
	STY $62
	
-	SEP #$20
	LDA #$40
	STA $420B
	LDY $62
	
	BMI .main
	INC $64
	INC $69
	CPY #$0000
	BEQ ++
	
	REP #$20
	STY $65
	LDY #$8000
	STY $62
	TXA
	SBC $65		; carry = 1
	STA $2181
	BRA -
	
++	LDY #$8000
	BRA .main

.case_80_or_e0
	BMI .case_e0
	REP #$21
	%ReadWord()
	STY $52		; tmp
	TXY
	XBA
	ADC $58
	TAX
	LDA $65
	SEP #$20
	PHB
	BIT $57
	BPL +
	MVN $7F7F
	BRA ++
+	MVN $7E7E
++	TYX
	LDY $52
	PLB
	
.main
	%ReadByte()
	STA $65
	STZ $66
	AND #$E0
	TRB $65
	
.type
	ASL
	BCS .case_80_or_e0
	BEQ .case_00
	BMI .case_40_or_60

.case_20
	%ReadByte()
	STA $211B
	STZ $211B
	LDA #$80
	STA $50		; param
	STX $52
	LDX $65
	INX
	STX $55
	LDA #$01
	STA $211C
	LDA #$20
	STA $420B
	LDX $52
	BRA .main

.case_40_or_60
	ASL
	BMI .case_60

.case_40	
	REP #$20
	%ReadWord()
	SEP #$20
	STA $211B
	XBA
	STA $211B
	LDA #$81
	STA $50		; param
	STX $52
	LDX $65
	INX
	STX $55
	LDA #$01
	STA $211C
	LDA #$20
	STA $420B
	LDX $52
	BRA .main
	
.case_60
	%ReadByte()
	STX $2181
	STY $52		; tmp
	
	LDY $65
-	STA $2180
	INC
	INX
	DEY
	BPL -
	LDY $52
	JMP .main
	
BANK_INC:
	LDY #$8000
	INC $64
	INC $69
	RTS
	
BANK_INC_2:
	CPY #$0001
	LDY #$8000
	INC $64
	INC $69
	BCC +
	
	SEP #$20
	XBA
	LDA [$67],Y
	INY
	XBA
	REP #$21
+	RTS
CodeEnd:
print "Insert Size: ",bytes," bytes"
I documented LC_LZ4 format here(.7z).

This archive includes about 60 compression programs I made.
Some programs might be useful.
  • Pages:
  • 1