tfv: have RLE image loading working

forgot how much I hate 6502 assembler
This commit is contained in:
Vince Weaver 2017-05-06 19:29:19 -04:00
parent 2bedb2b369
commit a8970f761b
5 changed files with 286 additions and 28 deletions

View File

@ -44,6 +44,8 @@ unsigned char a,y,x;
#define COLOR 0x30
#define FIRST 0xF0
#define TEMP 0xFA
static SDL_Surface *sdl_screen=NULL;
int grsim_input(void) {
@ -487,45 +489,68 @@ int home(void) {
int grsim_unrle(unsigned char *rle_data, int address) {
int i,total=0;
// int xoffset=0;
// int yoffset=0;
int xsize,ysize,end,run,value;
unsigned char *out_pointer;
int offset,x=0,y=0;
unsigned char s;
// int out_pointer;
xsize=rle_data[0];
ysize=rle_data[1];
ram[GBASL]=0; // input address
ram[GBASH]=0;
end=xsize*(ysize/2);
out_pointer=ram+address;
offset=2;
x=0;
y=0;
ram[BASL]=address&0xff;
ram[BASH]=address>>8;
ram[CV]=0;
ram[CH]=rle_data[y_indirect(GBASL,y)];
y++;
// ysize=rle_data[1];
y++;
while(1) {
run=rle_data[offset];
offset++;
value=rle_data[offset];
offset++;
a=rle_data[y_indirect(GBASL,y)];
if (a==0xff) break;
ram[TEMP]=a;
for(i=0;i<run;i++) {
*out_pointer=value;
out_pointer++;
total++;
y++;
if (y==0) ram[GBASH]++;
a=rle_data[y_indirect(GBASL,y)];
y++;
if (y==0) ram[GBASH]++;
s=y;
y=0;
while(1) {
ram[y_indirect(BASL,y)]=a;
ram[BASL]++;
if (ram[BASL]==0) ram[BASH]++;
x++;
if (x>=40) {
out_pointer+=0x58;
y+=2;
if (y>14) {
y=0;
out_pointer-=(0x400-0x28);
// printf("%d %x\n",y,address+(y/2)*0x80);
if (x>=ram[CH]) {
if (ram[BASL]>0xa7) ram[BASH]++;
ram[BASL]+=0x58;
ram[CV]+=2;
if (ram[CV]>14) {
ram[CV]=0;
if (ram[BASL]<0xd8) {
ram[BASL]=ram[BASL]-0xd8;
ram[BASH]=ram[BASH]-0x4;
}
else {
ram[BASL]=ram[BASL]-0xd8;
ram[BASH]=ram[BASH]-0x3;
}
}
x=0;
}
ram[TEMP]--;
if (ram[TEMP]==0) break;
}
if (total>=end) break;
y=s;
}
return 0;

View File

@ -26,7 +26,8 @@ static unsigned char title_rle[]=
0x0C,0x00,0x02,0xCC,0x01,0x44,0x01,0x55,0x09,0x00,0x01,0x0D,0x01,0x00,0x01,0xBB,0x03,0xB1,0x01,0xBB,0x01,0x00,0x01,0x0D,0x04,0x00,0x02,0xBB,
0x0C,0x00,0x01,0x0C,0x01,0x4C,0x01,0x44,0x01,0x55,0x0C,0x00,0x02,0xBB,0x06,0x00,0x01,0x20,0x01,0x22,0x01,0x2B,0x01,0x0B,
0x0E,0x00, 0x02,0x05, 0x09,0x00, 0x01,0x20, 0x06,0x22, 0x03,0x20,
0x02,0x22, 0x01,0x02, 0x0a,0x0,
0x02,0x22, 0x01,0x02, 0x09,0x00,
0xff,0xff
// " 55 2222222222222"
};

View File

@ -5,10 +5,17 @@ PNG2GR = ../gr-utils/png2gr
all: tfv.dsk
tfv.dsk: TITLE.GR ED
tfv.dsk: TITLE.GR TFV ED
$(DOS33) -y tfv.dsk BSAVE -a 0xc00 TFV
$(DOS33) -y tfv.dsk BSAVE -a 0x400 TITLE.GR
$(DOS33) -y tfv.dsk BSAVE -a 0x900 ED
TFV: tfv.o
ld65 -o TFV tfv.o -C ./apple2_c00.inc
tfv.o: tfv.s title.inc
ca65 -o tfv.o tfv.s -l tfv.lst
ED: duet.o
ld65 -o ED duet.o -C ./apple2_900.inc

187
tfv/tfv.s Normal file
View File

@ -0,0 +1,187 @@
.define EQU =
;; SOFT SWITCHES
GR EQU $C050
TEXT EQU $C051
FULLGR EQU $C052
TEXTGR EQU $C053
PAGE0 EQU $C054
PAGE1 EQU $C055
LORES EQU $C056
HIRES EQU $C057
;; MONITOR ROUTINES
HLINE EQU $F819 ;; HLINE Y,$2C at A
VLINE EQU $F828 ;; VLINE A,$2D at Y
CLRSCR EQU $F832 ;; Clear low-res screen
CLRTOP EQU $F836 ;; clear only top of low-res screen
SETCOL EQU $F864 ;; COLOR=A
BASCALC EQU $FBC1 ;;
HOME EQU $FC58 ;; Clear the text screen
WAIT EQU $FCA8 ;; delay 1/2(26+27A+5A^2) us
SETINV EQU $FE80 ;; INVERSE
SETNORM EQU $FE84 ;; NORMAL
COUT1 EQU $FDF0 ;; output A to screen
;; Zero page addresses
WNDLFT EQU $20
WNDWDTH EQU $21
WNDTOP EQU $22
WNDBTM EQU $23
CH EQU $24
CV EQU $25
GBASL EQU $26
GBASH EQU $27
BASL EQU $28
BASH EQU $29
H2 EQU $2C
V2 EQU $2D
MASK EQU $2E
COLOR EQU $30
FIRST EQU $F0
TEMP EQU $FA
RUN EQU $FA
TEMP2 EQU $FB
;=============================
; set low-res graphics, page 0
;=============================
jsr HOME
jsr set_gr_page0
;=================
; clear the screen
;=================
jsr CLRTOP
lda #>(title_image)
sta GBASH
lda #<(title_image)
sta GBASL
jsr load_rle_gr
lda #$4
sta BASH
lda #$0
sta BASL ; 0x400 is GR page 0
; Return to BASIC?
rts
;=================
; load RLE image
;=================
; Output is BASH/BASL
; Input is in GBASH/GBASL
load_rle_gr:
lda #$0
tax
tay ; init X and Y to 0
sta CV ; ycoord=0
lda (GBASL),y ; load xsize
sta CH
iny ; (we should check if we had
; bad luck and overflows page)
rle_loop:
lda (GBASL),y ; load run value
cmp #$ff ; if 0xff
beq rle_done ; we are done
sta RUN
iny ; point to next value
bne rle_yskip1 ; if overflow, increment address
inc GBASH
rle_yskip1:
lda (GBASL),y ; load value to write
iny
bne rle_yskip2
inc GBASH
rle_yskip2:
sty TEMP2 ; save y for later
pha
lda #$0
tay
pla ; convoluted way to set y to 0
rle_run_loop:
sta (BASL),y
inc BASL
bne rle_skip3
inc BASH ; write out value
rle_skip3:
inx
cpx CH
bcc rle_not_eol ; branch if less than
pha
lda BASL
cmp #$a7
bcc rle_add_skip
inc BASH
rle_add_skip:
clc
adc #$58
sta BASL
inc CV
inc CV
lda CV
cmp #15
bcc rle_no_wrap
lda #$0
sta CV
sec ; set carry for borrow purpose
lda BASL
sbc #$d8 ; perform subtraction on the LSBs
sta BASL
lda BASH ; do the same for the MSBs, with carry
sbc #$3 ; set according to the previous result
sta BASH
rle_no_wrap:
lda #$0
tax
pla
rle_not_eol:
dec RUN
bne rle_run_loop
ldy TEMP2
sec
bcs rle_loop
rle_done:
lda #$15
sta CV
rts
;==========================================================
; set_text_page0
;==========================================================
;
set_text_page0:
bit PAGE0 ; set page0
bit TEXT ; set text mode
rts
;==========================================================
; set_gr_page0
;==========================================================
;
set_gr_page0:
;lda #4
;sta GR_PAGE
bit PAGE0 ; set page 0
bit LORES ; Lo-res graphics
bit TEXTGR ; mixed gr/text mode
bit GR ; set graphics
rts
.include "title.inc"

38
tfv/title.inc Normal file
View File

@ -0,0 +1,38 @@
title_image:
.byte $28
.byte $01,$00,$19,$20
.byte $0F,$00,$01,$22,$03,$66,$01,$22,$01,$62
.byte $01,$66,$01,$62,$01,$22,$01,$66,$03,$22
.byte $01,$66,$01,$26,$01,$62,$01,$22,$01,$62
.byte $01,$26,$01,$62,$01,$22,$03,$66,$01,$22
.byte $01,$55,$01,$00,$03,$11,$01,$44,$03,$22
.byte $01,$44,$03,$22
.byte $02,$00,$02,$22,$01,$66,$02,$22,$01,$66
.byte $01,$62,$01,$66,$01,$22,$01,$66,$03,$22
.byte $01,$66,$01,$26,$01,$62,$01,$22,$01,$66
.byte $01,$22,$01,$66,$02,$22,$01,$66,$02,$22
.byte $01,$55,$01,$00,$01,$01,$01,$11,$01,$41
.byte $01,$44,$01,$42,$01,$22,$01,$42,$01,$44
.byte $01,$42,$01,$22,$01,$02
.byte $02,$00,$02,$22,$01,$66,$02,$22,$01,$66,$01,$22,$01,$66,$01,$22,$03,$66,$01,$22,$01,$66,$01,$62,$01,$26,$01,$22,$01,$26,$01,$62,$01,$26,$02,$22,$01,$66,$02,$22,$01,$55,$02,$00,$01,$11,$03,$44,$01,$22,$03,$44,$01,$22
.byte $03,$00,$01,$02,$18,$52,$01,$55
.byte $0E,$00,$1E,$60
.byte $0A,$00,$01,$66,$03,$22,$01,$66,$01,$26,$01,$22,$01,$26,$01,$66,$01,$22,$01,$26,$01,$66,$01,$22,$01,$66,$03,$22,$01,$66,$01,$26,$01,$22,$01,$26,$01,$66,$01,$26,$02,$62,$01,$66,$01,$22,$01,$66,$01,$22,$01,$66,$01,$55
.byte $09,$00,$01,$66,$01,$22,$01,$26,$02,$66,$01,$22,$01,$26,$01,$22,$01,$66,$01,$22,$01,$62,$01,$26,$01,$22,$02,$66,$01,$22,$02,$66,$01,$22,$01,$26,$01,$22,$01,$66,$01,$22,$02,$26,$01,$66,$01,$62,$01,$26,$01,$62,$01,$66,$01,$55
.byte $09,$00,$01,$66,$01,$22,$03,$66,$01,$22,$01,$66,$01,$22,$01,$66,$01,$22,$01,$66,$01,$62,$01,$22,$02,$66,$01,$22,$02,$66,$01,$22,$01,$66,$01,$22,$01,$66,$02,$26,$01,$22,$02,$66,$01,$22,$02,$66,$01,$55
.byte $09,$00,$01,$06,$1D,$56,$01,$55,$03,$00,$01,$10
.byte $24,$00,$01,$10,$01,$00,$01,$10,$01,$11,$01,$01
.byte $05,$00,$08,$CC,$01,$40,$09,$00,$01,$D0,$01,$0D,$01,$00,$01,$D0,$01,$0D,$01,$00,$01,$D0,$05,$00,$01,$11
.byte $0A,$00,$01,$04,$04,$54,$02,$CC,$01,$44,$01,$55,$06,$00,$01,$D0,$01,$DD,$02,$D0,$01,$DD,$02,$D0,$01,$DD,$01,$D0,$03,$00,$02,$01,$01,$11,$02,$01
.byte $0C,$00,$02,$CC,$01,$44,$01,$54,$01,$55,$06,$00,$01,$DD,$07,$BB,$01,$DD,$04,$00,$01,$10,$01,$11,$01,$10
.byte $0C,$00,$02,$CC,$01,$44,$01,$54,$01,$55,$07,$00,$01,$DD,$01,$BB,$01,$BF,$01,$B0,$01,$BB,$01,$BF,$01,$B0,$01,$BB,$01,$DD,$03,$00,$01,$10,$03,$11,$01,$10
.byte $0A,$00,$02,$CC,$01,$44,$01,$54,$01,$55,$08,$00,$01,$DD,$01,$DB,$01,$BB,$01,$3B,$01,$33,$02,$BB,$01,$DB,$01,$DD,$03,$00,$02,$01,$01,$11,$02,$01
.byte $0A,$00,$02,$CC,$01,$44,$01,$55,$09,$00,$02,$DD,$05,$BB,$02,$DD,$05,$00,$01,$11
.byte $0C,$00,$02,$CC,$01,$44,$01,$55,$09,$00,$01,$0D,$01,$00,$01,$BB,$03,$B1,$01,$BB,$01,$00,$01,$0D,$04,$00,$02,$BB
.byte $0C,$00,$01,$0C,$01,$4C,$01,$44,$01,$55,$0C,$00,$02,$BB,$06,$00,$01,$20,$01,$22,$01,$2B,$01,$0B
.byte $0E,$00,$02,$05,$09,$00,$01,$20,$06,$22,$03,$20
.byte $02,$22,$01,$02,$09,$00
.byte $ff,$ff