aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2025-11-21 01:48:34 -0500
committerB. Watson <urchlay@slackware.uk>2025-11-21 01:48:34 -0500
commit50fc1457b286377c8848b03e0b9e05535e6589e0 (patch)
tree1d004f664209eaf67d7debb234ee500134fc63dd /src
parentc6208a3da3467bf9b098b8031ce9cfa1c958cc90 (diff)
downloadunalf-50fc1457b286377c8848b03e0b9e05535e6589e0.tar.gz
Isolate ported 6502 code to its own file (asmcode.c).
Diffstat (limited to 'src')
-rw-r--r--src/Makefile2
-rw-r--r--src/asmcode.c651
-rw-r--r--src/extract.c679
3 files changed, 658 insertions, 674 deletions
diff --git a/src/Makefile b/src/Makefile
index 58dba18..6cab27a 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -39,7 +39,7 @@ VERSION=0.1.0
CFLAGS=-DVERSION='"$(VERSION)"' -Wall -I../f65 $(COPT)
-UNALF_OBJS=unalf.o io.o listalf.o extract.o f65.o glob.o opts.o usage.o self.o
+UNALF_OBJS=unalf.o io.o listalf.o extract.o f65.o glob.o opts.o usage.o self.o asmcode.o
ALFSUM_OBJS=alfsum.o self.o
.PHONY: all clean install
diff --git a/src/asmcode.c b/src/asmcode.c
new file mode 100644
index 0000000..af7f1d6
--- /dev/null
+++ b/src/asmcode.c
@@ -0,0 +1,651 @@
+#include "unalf.h"
+#include "addrs.h"
+
+extern void chksum_err(void);
+extern void unknown_err(void);
+extern void stack_underrun(void);
+extern void stack_overrun(void);
+
+void uncrunch_file(void) {
+ lda_i(0x00);
+ sta(L71AF);
+ sta(L71B0);
+ sta(outbuf_len_l);
+ sta(outbuf_len_h);
+ sta(L71B6);
+ sta(L71B7);
+ sta(L718C);
+ sta(cksum_l);
+ sta(cksum_h);
+ lda_i(0x09);
+ sta(shift_counter);
+ lda_i(0x00);
+ sta(L71AD);
+ lda_i(0x02);
+ sta(L71AE);
+ lda_i(0x00);
+ sta(stackptr_l);
+ lda_i(0x60);
+ sta(stackptr_h);
+ jsr(setup_io_bufs);
+ ldx_i(0x10);
+ lda(inbuf_adr_l);
+ sta(buf_adr_l);
+ lda(inbuf_adr_h);
+ sta(buf_adr_h);
+ lda(inbuf_len_l);
+ sta(buf_len_l);
+ lda(inbuf_len_h);
+ sta(buf_len_h);
+ jsr(L7A19);
+ sty(L718C);
+ jsr(L79E7);
+ lda(buf_len_l);
+ ora(buf_len_h);
+ bne(L75B1);
+ rts();
+
+L75B1:
+ jsr(L76D0);
+ lda(acc16_h);
+ cmp_i(0x01);
+ bne(uncrunch_blk);
+ lda(acc16_l);
+ cmp_i(0x01);
+ bne(uncrunch_blk);
+ jsr(write_output);
+ lda(alf_hdr_cksum_l);
+ cmp(cksum_l);
+ bne(print_emsg_checksum);
+ lda(alf_hdr_cksum_h);
+ cmp(cksum_h);
+ beq(cksum_ok);
+print_emsg_checksum:
+ chksum_err(); /* does not exit */
+cksum_ok:
+ rts();
+
+uncrunch_blk:
+ lda(acc16_l);
+ cmp_i(0x00);
+ bne(L760B);
+ lda(acc16_h);
+ cmp_i(0x01);
+ bne(L760B);
+ jsr(init_counters);
+ jsr(L76D0);
+ lda(acc16_l);
+ sta(L717D);
+ sta(L7179);
+ lda(acc16_h);
+ sta(L717E);
+ sta(L717A);
+ lda(acc16_l);
+ sta(L7177);
+ sta(L7178);
+ jsr(store_outbyte);
+ jmp(L75B1);
+
+L760B:
+ lda(acc16_l);
+ sta(L717D);
+ sta(L7175);
+ lda(acc16_h);
+ sta(L717E);
+ sta(L7176);
+ lda(acc16_h);
+ cmp(L717C);
+ bcc(L7641);
+ lda(acc16_l);
+ cmp(L717B);
+ bcc(L7641);
+ lda(L7179);
+ sta(acc16_l);
+ sta(L717D);
+ lda(L717A);
+ sta(acc16_h);
+ sta(L717E);
+ lda(L7178);
+ sta(acc16_l);
+ jsr(push_acc16);
+
+L7641:
+ lda(L717E);
+ beq(L7670);
+ lda(L717D);
+ sta(zp_b4);
+ lda(L717E);
+ sta(zp_b5);
+ jsr(L7899);
+ ldy_i(0x02);
+ lda_ind_y(zp_b0);
+ sta(acc16_l);
+ jsr(push_acc16);
+ ldy_i(0x00);
+ lda_ind_y(zp_b0);
+ sta(acc16_l);
+ sta(L717D);
+ iny();
+ lda_ind_y(zp_b0);
+ sta(acc16_h);
+ sta(L717E);
+ jmp(L7641);
+
+L7670:
+ lda(L717D);
+ sta(acc16_l);
+ sta(L7178);
+ sta(L7177);
+ lda(L717E);
+ sta(acc16_h);
+ jsr(push_acc16);
+L7683:
+ lda(L71AF);
+ ora(L71B0);
+ beq(L7694);
+ jsr(pop_acc16);
+ jsr(store_outbyte);
+ jmp(L7683);
+
+L7694:
+ jsr(L78C2);
+ lda(L7175);
+ sta(acc16_l);
+ sta(L7179);
+ lda(L7176);
+ sta(acc16_h);
+ sta(L717A);
+ lda(L717B);
+ sta(zp_b4);
+ lda(L717C);
+ sta(zp_b5);
+ cmp(L71AE);
+ bcc(L76CD);
+ lda(zp_b4);
+ cmp(L71AD);
+ bcc(L76CD);
+ lda(shift_counter);
+ cmp_i(0x0C);
+ beq(L76CD);
+ inc(shift_counter);
+ asl(L71AD);
+ rol(L71AE);
+L76CD:
+ jmp(L75B1);
+}
+
+void L76D0(void) {
+L76D0:
+ lda(L71B6);
+ sta(zp_b8);
+ lda(L71B7);
+ sta(zp_b9);
+ ldx_i(0x02);
+L76DC:
+ lsr(zp_b9);
+ ror(zp_b8);
+ dex();
+ bpl(L76DC);
+ lda(zp_b8);
+ sta(L71AA);
+ lda(zp_b9);
+ sta(L71AB);
+ lda(inbuf_len_l);
+ sec();
+ sbc(zp_b8);
+ sta(zp_bc);
+ lda(inbuf_len_h);
+ sbc(zp_b9);
+ sta(zp_bd);
+ lda(zp_bd);
+ bne(L770F);
+ lda(zp_bc);
+ cmp_i(0x03);
+ bcs(L770F);
+ ldx(L718C);
+ bpl(L771C);
+ cmp_i(0x02);
+ bcc(L7712);
+L770F:
+ jmp(L779B);
+/* ---------------------------------------------------------------------------- */
+L7712:
+ unknown_err(); /* exits! */
+/* ---------------------------------------------------------------------------- */
+L771C:
+ tay();
+ dey();
+ ldx(inbuf_adr_l);
+ stx(zp_be);
+ ldx(inbuf_adr_h);
+ stx(zp_bf);
+ lda(inbuf_adr_l);
+ clc();
+ adc(zp_b8);
+ sta(zp_b8);
+ lda(inbuf_adr_h);
+ adc(zp_b9);
+ sta(zp_b9);
+L7737:
+ lda_ind_y(zp_b8);
+ sta_ind_y(zp_be);
+ dey();
+ bpl(L7737);
+ lda(inbuf_len_l);
+ sec();
+ sbc(zp_bc);
+ sta(buf_len_l);
+ lda(inbuf_len_h);
+ sbc_i(0x00);
+ sta(buf_len_h);
+ lda(inbuf_adr_l);
+ clc();
+ adc(zp_bc);
+ sta(buf_adr_l);
+ lda(inbuf_adr_h);
+ adc_i(0x00);
+ sta(buf_adr_h);
+ ldx_i(0x10);
+ jsr(L7A19);
+ sty(L718C);
+ bpl(L7771);
+ cpy_i(0x88);
+ beq(L7771);
+ // jmp(cleanup_and_exit);
+ exit(0);
+/* ---------------------------------------------------------------------------- */
+L7771:
+ jsr(L79E7);
+ lda(L71AA);
+ sta(zp_b8);
+ lda(L71AB);
+ sta(zp_b9);
+ ldx_i(0x02);
+L7780:
+ asl(zp_b8);
+ rol(zp_b9);
+ dex();
+ bpl(L7780);
+ lda(L71B6);
+ sec();
+ sbc(zp_b8);
+ sta(L71B6);
+ lda(L71B7);
+ sbc(zp_b9);
+ sta(L71B7);
+ jmp(L76D0);
+/* ---------------------------------------------------------------------------- */
+L779B:
+ lda(zp_b8);
+ sta(zp_bc);
+ clc();
+ adc(inbuf_adr_l);
+ sta(zp_b8);
+ lda(zp_b9);
+ sta(zp_bd);
+ adc(inbuf_adr_h);
+ sta(zp_b9);
+ ldy_i(0x00);
+ lda(L71B6);
+ and_i(0x07);
+ bne(L77E1);
+ lda_ind_y(zp_b8);
+ sta(acc16_h);
+ iny();
+ lda_ind_y(zp_b8);
+ sta(acc16_l);
+L77C0:
+ lda_i(0x0F);
+ sec();
+ sbc(shift_counter);
+ tax();
+L77C7:
+ lsr(acc16_h);
+ ror(acc16_l);
+ dex();
+ bpl(L77C7);
+ lda(shift_counter);
+ clc();
+ adc(L71B6);
+ sta(L71B6);
+ lda_i(0x00);
+ adc(L71B7);
+ sta(L71B7);
+ rts();
+
+/* ---------------------------------------------------------------------------- */
+L77E1:
+ ldx_i(0x02);
+L77E3:
+ lda_ind_y(zp_b8);
+ sta_abs_x(L7189);
+ iny();
+ dex();
+ bpl(L77E3);
+ lda(L71B6);
+ and_i(0x07);
+ tax();
+ dex();
+L77F3:
+ asl(L7189);
+ rol(L718A);
+ rol(L718B);
+ dex();
+ bpl(L77F3);
+ lda(L718A);
+ sta(acc16_l);
+ lda(L718B);
+ sta(acc16_h);
+ jmp(L77C0);
+}
+
+void L7A19(void) {
+ lda(alf_hdr_compsize2);
+ ora(alf_hdr_compsize3);
+ beq(L7A28);
+L7A21:
+ jsr(readblock);
+ Y = 1; /* CIO would set this */
+ jsr(L7A5D);
+ rts();
+L7A28:
+ lda(alf_hdr_compsize1);
+ cmp(buf_len_h);
+ bcc(L7A40);
+ beq(L7A34);
+ bcs(L7A21);
+L7A34:
+ lda(alf_hdr_compsize0);
+ cmp(buf_len_l);
+ bcc(L7A40);
+ beq(L7A40);
+ bcs(L7A21);
+L7A40:
+ lda(alf_hdr_compsize0);
+ sta(buf_len_l);
+ lda(alf_hdr_compsize1);
+ sta(buf_len_h);
+ lda(buf_len_l);
+ ora(buf_len_h);
+ beq(L7A57);
+ jsr(readblock);
+ Y = 1; /* CIO would set this */
+L7A57:
+ ldy_i(0x88);
+ jsr(L7A5D);
+ rts();
+}
+
+void L7A5D(void) {
+ lda(alf_hdr_compsize0);
+ sec();
+ sbc(buf_len_l);
+ sta(alf_hdr_compsize0);
+ lda(alf_hdr_compsize1);
+ sbc(buf_len_h);
+ sta(alf_hdr_compsize1);
+ lda(alf_hdr_compsize2);
+ sbc_i(0x00);
+ sta(alf_hdr_compsize2);
+ rts();
+}
+
+void setup_io_bufs(void) {
+ lda(MEMTOP_lo);
+ sec();
+ sbc_i(0xDC);
+ sta(inbuf_len_l);
+ lda(MEMTOP_hi);
+ sbc_i(0x7F);
+ sta(inbuf_len_h);
+ lsr(inbuf_len_h);
+ ror(inbuf_len_l);
+ lda(inbuf_len_h);
+ cmp_i(0x1F);
+ bcc(L79A0);
+ lda_i(0x00);
+ sta(inbuf_len_l);
+ lda_i(0x1F);
+ sta(inbuf_len_h);
+L79A0:
+ lda_i(0xDC);
+ sta(inbuf_adr_l);
+ lda_i(0x7F);
+ sta(inbuf_adr_h);
+ lda_i(0xDC);
+ clc();
+ adc(inbuf_len_l);
+ sta(outbuf_adr_l);
+ sta(outbuf_ptr_l);
+ lda_i(0x7F);
+ adc(inbuf_len_h);
+ sta(outbuf_adr_h);
+ sta(outbuf_ptr_h);
+ rts();
+}
+
+void init_counters(void) {
+ lda_i(0x09);
+ sta(shift_counter);
+ lda_i(0x00);
+ sta(L71AD);
+ lda_i(0x02);
+ sta(L71AE);
+ lda_i(0x02);
+ sta(L717B);
+ lda_i(0x01);
+ sta(L717C);
+ rts();
+}
+
+/* save decrunched byte in outbuf, update checksum, write outbuf if full */
+void store_outbyte(void) {
+ ldy_i(0x00);
+ lda(acc16_l);
+ sta_ind_y(outbuf_ptr_l);
+ clc();
+ adc(cksum_l);
+ sta(cksum_l);
+ lda_i(0x00);
+ adc(cksum_h);
+ sta(cksum_h);
+ inc(outbuf_ptr_l);
+ bne(out_ptr_hi_ok);
+ inc(outbuf_ptr_h);
+out_ptr_hi_ok:
+ inc(outbuf_len_l);
+ bne(out_len_hi_ok);
+ inc(outbuf_len_h);
+out_len_hi_ok:
+ lda(outbuf_len_h);
+ cmp(inbuf_len_h);
+ bcc(outbuf_not_full);
+ lda(outbuf_len_l);
+ cmp(inbuf_len_l);
+ bcc(outbuf_not_full);
+ lda(outbuf_adr_l);
+ sta(buf_adr_l);
+ lda(outbuf_adr_h);
+ sta(buf_adr_h);
+ lda(outbuf_len_l);
+ sta(buf_len_l);
+ lda(outbuf_len_h);
+ sta(buf_len_h);
+ /* TODO: call C writeblock() */
+ ldx_i(0x30);
+ jsr(writeblock);
+ bpl(init_outbuf);
+ chksum_err(); /* does not exit */
+/* ---------------------------------------------------------------------------- */
+init_outbuf:
+ lda(outbuf_adr_l);
+ sta(outbuf_ptr_l);
+ lda(outbuf_adr_h);
+ sta(outbuf_ptr_h);
+ lda_i(0x00);
+ sta(outbuf_len_l);
+ sta(outbuf_len_h);
+outbuf_not_full:
+ rts();
+}
+
+
+/* ---------------------------------------------------------------------------- */
+/* push 2 byte 'register' to software stack */
+void push_acc16(void) {
+ ldy_i(0x00);
+ lda(acc16_l);
+ sta_ind_y(stackptr_l);
+ iny();
+ lda(acc16_h);
+ sta_ind_y(stackptr_l);
+ lda(stackptr_l);
+ clc();
+ adc_i(0x02);
+ sta(stackptr_l);
+ bcc(L790C);
+ inc(stackptr_h);
+L790C:
+ lda(stackptr_h);
+ cmp_i(0x70);
+ bcc(L791C);
+ stack_overrun(); /* exits! */
+/* ---------------------------------------------------------------------------- */
+L791C:
+ inc(L71AF);
+ bne(L7924);
+ inc(L71B0);
+L7924:
+ rts();
+}
+
+void pop_acc16(void) {
+/* pop 2 byte 'register' from software stack */
+ lda(stackptr_l);
+ sec();
+ sbc_i(0x02);
+ sta(stackptr_l);
+ lda(stackptr_h);
+ sbc_i(0x00);
+ sta(stackptr_h);
+ ldy_i(0x00);
+ lda_ind_y(stackptr_l);
+ sta(acc16_l);
+ iny();
+ lda_ind_y(stackptr_l);
+ sta(acc16_h);
+ lda(stackptr_h);
+ cmp_i(0x60);
+ bcs(L796C);
+ stack_underrun(); /* exits! */
+/* ---------------------------------------------------------------------------- */
+L796C:
+ lda(L71AF);
+ bne(L7974);
+ dec(L71B0);
+L7974:
+ dec(L71AF);
+ rts();
+}
+
+void L79E7(void) {
+ lda(buf_adr_l);
+ clc();
+ adc(buf_len_l);
+ sta(zp_be);
+ lda(buf_adr_h);
+ adc(buf_len_h);
+ sta(zp_bf);
+ ldx_i(0x02);
+ bne(L7A0A);
+L79FC:
+ ldy_i(0x00);
+ tya();
+ sta_ind_y(zp_be);
+ inc(zp_be);
+ bne(L7A07);
+ inc(zp_bf);
+L7A07:
+ dex();
+ bmi(L7A18);
+L7A0A:
+ lda(zp_bf);
+ cmp(outbuf_adr_h);
+ bcc(L79FC);
+ lda(zp_be);
+ cmp(outbuf_adr_l);
+ bcc(L79FC);
+L7A18:
+ rts();
+}
+
+void L7899(void) {
+ lda(zp_b4);
+ sta(zp_b0);
+ lda(zp_b5);
+ sta(zp_b1);
+ asl(zp_b0);
+ rol(zp_b1);
+ lda(zp_b0);
+ clc();
+ adc(zp_b4);
+ sta(zp_b0);
+ lda(zp_b1);
+ adc(zp_b5);
+ sta(zp_b1);
+ lda(zp_b0);
+ clc();
+ adc(L7181);
+ sta(zp_b0);
+ lda(zp_b1);
+ adc(L7182);
+ sta(zp_b1);
+ rts();
+}
+
+void L78C2(void) {
+ lda(L717B);
+ sta(zp_b4);
+ lda(L717C);
+ sta(zp_b5);
+ jsr(L7899);
+ lda(L7177);
+ sta(acc16_l);
+ ldy_i(0x02);
+ sta_ind_y(zp_b0);
+ lda(L7179);
+ sta(acc16_l);
+ lda(L717A);
+ sta(acc16_h);
+ ldy_i(0x00);
+ lda(acc16_l);
+ sta_ind_y(zp_b0);
+ iny();
+ lda(acc16_h);
+ sta_ind_y(zp_b0);
+ inc(L717B);
+ bne(L78F5);
+ inc(L717C);
+L78F5:
+ rts();
+}
+
+void write_output(void) {
+ lda(outbuf_len_l);
+ ora(outbuf_len_h);
+ bne(have_output);
+ rts();
+/* ---------------------------------------------------------------------------- */
+have_output:
+ lda(outbuf_adr_l);
+ sta(buf_adr_l);
+ lda(outbuf_adr_h);
+ sta(buf_adr_h);
+ lda(outbuf_len_l);
+ sta(buf_len_l);
+ lda(outbuf_len_h);
+ sta(buf_len_h);
+ ldx_i(0x30);
+ jsr(writeblock);
+ rts();
+}
diff --git a/src/extract.c b/src/extract.c
index 3c85142..aa7f75b 100644
--- a/src/extract.c
+++ b/src/extract.c
@@ -172,689 +172,22 @@ void extract_alf(void) {
}
}
-static void chksum_err(void) {
+void chksum_err(void) {
bad_checksum = 1;
fprintf(stderr, "%s: checksum error on %s\n", self, out_filename);
}
-void uncrunch_file(void) {
- lda_i(0x00);
- sta(L71AF);
- sta(L71B0);
- sta(outbuf_len_l);
- sta(outbuf_len_h);
- sta(L71B6);
- sta(L71B7);
- sta(L718C);
- sta(cksum_l);
- sta(cksum_h);
- lda_i(0x09);
- sta(shift_counter);
- lda_i(0x00);
- sta(L71AD);
- lda_i(0x02);
- sta(L71AE);
- lda_i(0x00);
- sta(stackptr_l);
- lda_i(0x60);
- sta(stackptr_h);
- jsr(setup_io_bufs);
- ldx_i(0x10);
- lda(inbuf_adr_l);
- sta(buf_adr_l);
- lda(inbuf_adr_h);
- sta(buf_adr_h);
- lda(inbuf_len_l);
- sta(buf_len_l);
- lda(inbuf_len_h);
- sta(buf_len_h);
- jsr(L7A19);
- sty(L718C);
- jsr(L79E7);
- lda(buf_len_l);
- ora(buf_len_h);
- bne(L75B1);
- rts();
-
-L75B1:
- jsr(L76D0);
- lda(acc16_h);
- cmp_i(0x01);
- bne(uncrunch_blk);
- lda(acc16_l);
- cmp_i(0x01);
- bne(uncrunch_blk);
- jsr(write_output);
- lda(alf_hdr_cksum_l);
- cmp(cksum_l);
- bne(print_emsg_checksum);
- lda(alf_hdr_cksum_h);
- cmp(cksum_h);
- beq(cksum_ok);
-print_emsg_checksum:
- chksum_err();
-cksum_ok:
- rts();
-
-uncrunch_blk:
- lda(acc16_l);
- cmp_i(0x00);
- bne(L760B);
- lda(acc16_h);
- cmp_i(0x01);
- bne(L760B);
- jsr(init_counters);
- jsr(L76D0);
- lda(acc16_l);
- sta(L717D);
- sta(L7179);
- lda(acc16_h);
- sta(L717E);
- sta(L717A);
- lda(acc16_l);
- sta(L7177);
- sta(L7178);
- jsr(store_outbyte);
- jmp(L75B1);
-
-L760B:
- lda(acc16_l);
- sta(L717D);
- sta(L7175);
- lda(acc16_h);
- sta(L717E);
- sta(L7176);
- lda(acc16_h);
- cmp(L717C);
- bcc(L7641);
- lda(acc16_l);
- cmp(L717B);
- bcc(L7641);
- lda(L7179);
- sta(acc16_l);
- sta(L717D);
- lda(L717A);
- sta(acc16_h);
- sta(L717E);
- lda(L7178);
- sta(acc16_l);
- jsr(push_acc16);
-
-L7641:
- lda(L717E);
- beq(L7670);
- lda(L717D);
- sta(zp_b4);
- lda(L717E);
- sta(zp_b5);
- jsr(L7899);
- ldy_i(0x02);
- lda_ind_y(zp_b0);
- sta(acc16_l);
- jsr(push_acc16);
- ldy_i(0x00);
- lda_ind_y(zp_b0);
- sta(acc16_l);
- sta(L717D);
- iny();
- lda_ind_y(zp_b0);
- sta(acc16_h);
- sta(L717E);
- jmp(L7641);
-
-L7670:
- lda(L717D);
- sta(acc16_l);
- sta(L7178);
- sta(L7177);
- lda(L717E);
- sta(acc16_h);
- jsr(push_acc16);
-L7683:
- lda(L71AF);
- ora(L71B0);
- beq(L7694);
- jsr(pop_acc16);
- jsr(store_outbyte);
- jmp(L7683);
-
-L7694:
- jsr(L78C2);
- lda(L7175);
- sta(acc16_l);
- sta(L7179);
- lda(L7176);
- sta(acc16_h);
- sta(L717A);
- lda(L717B);
- sta(zp_b4);
- lda(L717C);
- sta(zp_b5);
- cmp(L71AE);
- bcc(L76CD);
- lda(zp_b4);
- cmp(L71AD);
- bcc(L76CD);
- lda(shift_counter);
- cmp_i(0x0C);
- beq(L76CD);
- inc(shift_counter);
- asl(L71AD);
- rol(L71AE);
-L76CD:
- jmp(L75B1);
-}
-
-void L76D0(void) {
-L76D0:
- lda(L71B6);
- sta(zp_b8);
- lda(L71B7);
- sta(zp_b9);
- ldx_i(0x02);
-L76DC:
- lsr(zp_b9);
- ror(zp_b8);
- dex();
- bpl(L76DC);
- lda(zp_b8);
- sta(L71AA);
- lda(zp_b9);
- sta(L71AB);
- lda(inbuf_len_l);
- sec();
- sbc(zp_b8);
- sta(zp_bc);
- lda(inbuf_len_h);
- sbc(zp_b9);
- sta(zp_bd);
- lda(zp_bd);
- bne(L770F);
- lda(zp_bc);
- cmp_i(0x03);
- bcs(L770F);
- ldx(L718C);
- bpl(L771C);
- cmp_i(0x02);
- bcc(L7712);
-L770F:
- jmp(L779B);
-/* ---------------------------------------------------------------------------- */
-L7712:
- #if 0
- ldx_i(0x0A);
- ldy_i(0x0A);
- jsr(printstr);
- jmp(cleanup_and_exit);
- #endif
+void unknown_err(void){
fprintf(stderr, "%s: unknown error (L7712)\n", self);
exit(1);
-/* ---------------------------------------------------------------------------- */
-L771C:
- tay();
- dey();
- ldx(inbuf_adr_l);
- stx(zp_be);
- ldx(inbuf_adr_h);
- stx(zp_bf);
- lda(inbuf_adr_l);
- clc();
- adc(zp_b8);
- sta(zp_b8);
- lda(inbuf_adr_h);
- adc(zp_b9);
- sta(zp_b9);
-L7737:
- lda_ind_y(zp_b8);
- sta_ind_y(zp_be);
- dey();
- bpl(L7737);
- lda(inbuf_len_l);
- sec();
- sbc(zp_bc);
- sta(buf_len_l);
- lda(inbuf_len_h);
- sbc_i(0x00);
- sta(buf_len_h);
- lda(inbuf_adr_l);
- clc();
- adc(zp_bc);
- sta(buf_adr_l);
- lda(inbuf_adr_h);
- adc_i(0x00);
- sta(buf_adr_h);
- ldx_i(0x10);
- jsr(L7A19);
- sty(L718C);
- bpl(L7771);
- cpy_i(0x88);
- beq(L7771);
- // jmp(cleanup_and_exit);
- exit(0);
-/* ---------------------------------------------------------------------------- */
-L7771:
- jsr(L79E7);
- lda(L71AA);
- sta(zp_b8);
- lda(L71AB);
- sta(zp_b9);
- ldx_i(0x02);
-L7780:
- asl(zp_b8);
- rol(zp_b9);
- dex();
- bpl(L7780);
- lda(L71B6);
- sec();
- sbc(zp_b8);
- sta(L71B6);
- lda(L71B7);
- sbc(zp_b9);
- sta(L71B7);
- jmp(L76D0);
-/* ---------------------------------------------------------------------------- */
-L779B:
- lda(zp_b8);
- sta(zp_bc);
- clc();
- adc(inbuf_adr_l);
- sta(zp_b8);
- lda(zp_b9);
- sta(zp_bd);
- adc(inbuf_adr_h);
- sta(zp_b9);
- ldy_i(0x00);
- lda(L71B6);
- and_i(0x07);
- bne(L77E1);
- lda_ind_y(zp_b8);
- sta(acc16_h);
- iny();
- lda_ind_y(zp_b8);
- sta(acc16_l);
-L77C0:
- lda_i(0x0F);
- sec();
- sbc(shift_counter);
- tax();
-L77C7:
- lsr(acc16_h);
- ror(acc16_l);
- dex();
- bpl(L77C7);
- lda(shift_counter);
- clc();
- adc(L71B6);
- sta(L71B6);
- lda_i(0x00);
- adc(L71B7);
- sta(L71B7);
- rts();
-
-/* ---------------------------------------------------------------------------- */
-L77E1:
- ldx_i(0x02);
-L77E3:
- lda_ind_y(zp_b8);
- sta_abs_x(L7189);
- iny();
- dex();
- bpl(L77E3);
- lda(L71B6);
- and_i(0x07);
- tax();
- dex();
-L77F3:
- asl(L7189);
- rol(L718A);
- rol(L718B);
- dex();
- bpl(L77F3);
- lda(L718A);
- sta(acc16_l);
- lda(L718B);
- sta(acc16_h);
- jmp(L77C0);
-}
-
-void L7A19(void) {
- lda(alf_hdr_compsize2);
- ora(alf_hdr_compsize3);
- beq(L7A28);
-L7A21:
- jsr(readblock);
- Y = 1; /* CIO would set this */
- jsr(L7A5D);
- rts();
-L7A28:
- lda(alf_hdr_compsize1);
- cmp(buf_len_h);
- bcc(L7A40);
- beq(L7A34);
- bcs(L7A21);
-L7A34:
- lda(alf_hdr_compsize0);
- cmp(buf_len_l);
- bcc(L7A40);
- beq(L7A40);
- bcs(L7A21);
-L7A40:
- lda(alf_hdr_compsize0);
- sta(buf_len_l);
- lda(alf_hdr_compsize1);
- sta(buf_len_h);
- lda(buf_len_l);
- ora(buf_len_h);
- beq(L7A57);
- jsr(readblock);
- Y = 1; /* CIO would set this */
-L7A57:
- ldy_i(0x88);
- jsr(L7A5D);
- rts();
}
-void L7A5D(void) {
- lda(alf_hdr_compsize0);
- sec();
- sbc(buf_len_l);
- sta(alf_hdr_compsize0);
- lda(alf_hdr_compsize1);
- sbc(buf_len_h);
- sta(alf_hdr_compsize1);
- lda(alf_hdr_compsize2);
- sbc_i(0x00);
- sta(alf_hdr_compsize2);
- rts();
-}
-
-void setup_io_bufs(void) {
- lda(MEMTOP_lo);
- sec();
- sbc_i(0xDC);
- sta(inbuf_len_l);
- lda(MEMTOP_hi);
- sbc_i(0x7F);
- sta(inbuf_len_h);
- lsr(inbuf_len_h);
- ror(inbuf_len_l);
- lda(inbuf_len_h);
- cmp_i(0x1F);
- bcc(L79A0);
- lda_i(0x00);
- sta(inbuf_len_l);
- lda_i(0x1F);
- sta(inbuf_len_h);
-L79A0:
- lda_i(0xDC);
- sta(inbuf_adr_l);
- lda_i(0x7F);
- sta(inbuf_adr_h);
- lda_i(0xDC);
- clc();
- adc(inbuf_len_l);
- sta(outbuf_adr_l);
- sta(outbuf_ptr_l);
- lda_i(0x7F);
- adc(inbuf_len_h);
- sta(outbuf_adr_h);
- sta(outbuf_ptr_h);
- rts();
-}
-
-void init_counters(void) {
- lda_i(0x09);
- sta(shift_counter);
- lda_i(0x00);
- sta(L71AD);
- lda_i(0x02);
- sta(L71AE);
- lda_i(0x02);
- sta(L717B);
- lda_i(0x01);
- sta(L717C);
- rts();
-}
-
-/* save decrunched byte in outbuf, update checksum, write outbuf if full */
-void store_outbyte(void) {
- ldy_i(0x00);
- lda(acc16_l);
- sta_ind_y(outbuf_ptr_l);
- clc();
- adc(cksum_l);
- sta(cksum_l);
- lda_i(0x00);
- adc(cksum_h);
- sta(cksum_h);
- inc(outbuf_ptr_l);
- bne(out_ptr_hi_ok);
- inc(outbuf_ptr_h);
-out_ptr_hi_ok:
- inc(outbuf_len_l);
- bne(out_len_hi_ok);
- inc(outbuf_len_h);
-out_len_hi_ok:
- lda(outbuf_len_h);
- cmp(inbuf_len_h);
- bcc(outbuf_not_full);
- lda(outbuf_len_l);
- cmp(inbuf_len_l);
- bcc(outbuf_not_full);
- lda(outbuf_adr_l);
- sta(buf_adr_l);
- lda(outbuf_adr_h);
- sta(buf_adr_h);
- lda(outbuf_len_l);
- sta(buf_len_l);
- lda(outbuf_len_h);
- sta(buf_len_h);
- /* TODO: call C writeblock() */
- ldx_i(0x30);
- jsr(writeblock);
- bpl(init_outbuf);
- #if 0
-/* ldx #<emsg_checksum : ldy #>emsg_checksum */
-print_emsg_write_output_2:
- ldx_i(0xD5);
- ldy_i(0x72);
- jsr(printstr);
-cleanup_and_exit:
- pla();
- pla();
- pla();
- pla();
- jmp(exit);
- #endif
- chksum_err();
-/* ---------------------------------------------------------------------------- */
-init_outbuf:
- lda(outbuf_adr_l);
- sta(outbuf_ptr_l);
- lda(outbuf_adr_h);
- sta(outbuf_ptr_h);
- lda_i(0x00);
- sta(outbuf_len_l);
- sta(outbuf_len_h);
-outbuf_not_full:
- rts();
-}
-
-
-/* ---------------------------------------------------------------------------- */
-/* push 2 byte 'register' to software stack */
-void push_acc16(void) {
- ldy_i(0x00);
- lda(acc16_l);
- sta_ind_y(stackptr_l);
- iny();
- lda(acc16_h);
- sta_ind_y(stackptr_l);
- lda(stackptr_l);
- clc();
- adc_i(0x02);
- sta(stackptr_l);
- bcc(L790C);
- inc(stackptr_h);
-L790C:
- lda(stackptr_h);
- cmp_i(0x70);
- bcc(L791C);
- #if 0
-/* ldx #<emsg_stk_overrun : ldy #>emsg_stk_overrun */
-print_emsg_stk_overrun:
- ldx_i(0x25);
- ldy_i(0x79);
- jsr(printstr);
- jmp(cleanup_and_exit);
- #endif
- fprintf(stderr, "%s: stack overrun\n", self);
- exit(1);
-/* ---------------------------------------------------------------------------- */
-L791C:
- inc(L71AF);
- bne(L7924);
- inc(L71B0);
-L7924:
- rts();
-}
-
-void pop_acc16(void) {
-/* pop 2 byte 'register' from software stack */
- lda(stackptr_l);
- sec();
- sbc_i(0x02);
- sta(stackptr_l);
- lda(stackptr_h);
- sbc_i(0x00);
- sta(stackptr_h);
- ldy_i(0x00);
- lda_ind_y(stackptr_l);
- sta(acc16_l);
- iny();
- lda_ind_y(stackptr_l);
- sta(acc16_h);
- lda(stackptr_h);
- cmp_i(0x60);
- bcs(L796C);
- #if 0
-/* ldx #<emsg_stk_underrun : ldy #>emsg_stk_underrun */
-print_emsg_stk_underrun:
- ldx_i(0x34);
- ldy_i(0x79);
- jsr(printstr);
- jmp(cleanup_and_exit);
- #endif
+void stack_underrun(void){
fprintf(stderr, "%s: stack underrun\n", self);
exit(1);
-/* ---------------------------------------------------------------------------- */
-L796C:
- lda(L71AF);
- bne(L7974);
- dec(L71B0);
-L7974:
- dec(L71AF);
- rts();
-}
-
-void L79E7(void) {
- lda(buf_adr_l);
- clc();
- adc(buf_len_l);
- sta(zp_be);
- lda(buf_adr_h);
- adc(buf_len_h);
- sta(zp_bf);
- ldx_i(0x02);
- bne(L7A0A);
-L79FC:
- ldy_i(0x00);
- tya();
- sta_ind_y(zp_be);
- inc(zp_be);
- bne(L7A07);
- inc(zp_bf);
-L7A07:
- dex();
- bmi(L7A18);
-L7A0A:
- lda(zp_bf);
- cmp(outbuf_adr_h);
- bcc(L79FC);
- lda(zp_be);
- cmp(outbuf_adr_l);
- bcc(L79FC);
-L7A18:
- rts();
}
-void L7899(void) {
- lda(zp_b4);
- sta(zp_b0);
- lda(zp_b5);
- sta(zp_b1);
- asl(zp_b0);
- rol(zp_b1);
- lda(zp_b0);
- clc();
- adc(zp_b4);
- sta(zp_b0);
- lda(zp_b1);
- adc(zp_b5);
- sta(zp_b1);
- lda(zp_b0);
- clc();
- adc(L7181);
- sta(zp_b0);
- lda(zp_b1);
- adc(L7182);
- sta(zp_b1);
- rts();
-}
-
-void L78C2(void) {
- lda(L717B);
- sta(zp_b4);
- lda(L717C);
- sta(zp_b5);
- jsr(L7899);
- lda(L7177);
- sta(acc16_l);
- ldy_i(0x02);
- sta_ind_y(zp_b0);
- lda(L7179);
- sta(acc16_l);
- lda(L717A);
- sta(acc16_h);
- ldy_i(0x00);
- lda(acc16_l);
- sta_ind_y(zp_b0);
- iny();
- lda(acc16_h);
- sta_ind_y(zp_b0);
- inc(L717B);
- bne(L78F5);
- inc(L717C);
-L78F5:
- rts();
-}
-
-void write_output(void) {
- lda(outbuf_len_l);
- ora(outbuf_len_h);
- bne(have_output);
- rts();
-/* ---------------------------------------------------------------------------- */
-have_output:
- lda(outbuf_adr_l);
- sta(buf_adr_l);
- lda(outbuf_adr_h);
- sta(buf_adr_h);
- lda(outbuf_len_l);
- sta(buf_len_l);
- lda(outbuf_len_h);
- sta(buf_len_h);
- ldx_i(0x30);
- jsr(writeblock);
- rts();
+void stack_overrun(void){
+ fprintf(stderr, "%s: stack overrun\n", self);
+ exit(1);
}