mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-04 05:05:13 +00:00
gr-sim: work on getting a div by 7 working
This commit is contained in:
parent
a06a08dbd9
commit
f9e82a43d6
@ -62,6 +62,27 @@ void adc(int value) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void adc_mem(int addr) {
|
||||||
|
|
||||||
|
int temp_a;
|
||||||
|
int temp_value;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
temp_a=a&0xff;
|
||||||
|
temp_value=ram[addr]&0xff;
|
||||||
|
|
||||||
|
result=(temp_a+temp_value+c);
|
||||||
|
|
||||||
|
c=(result&0x100)>>8;
|
||||||
|
n=(result&0x80)>>7;
|
||||||
|
|
||||||
|
v=!!((a^result)&(temp_value^result)&0x80);
|
||||||
|
|
||||||
|
a=result&0xff;
|
||||||
|
z=(a==0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void sbc(int value) {
|
void sbc(int value) {
|
||||||
int temp_a;
|
int temp_a;
|
||||||
int result;
|
int result;
|
||||||
@ -83,6 +104,29 @@ void sbc(int value) {
|
|||||||
z=(a==0);
|
z=(a==0);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void sbc_mem(int addr) {
|
||||||
|
int temp_a;
|
||||||
|
int result;
|
||||||
|
int temp_value;
|
||||||
|
|
||||||
|
temp_a=a&0xff;
|
||||||
|
temp_value=(~ram[addr])&0xff;
|
||||||
|
|
||||||
|
result=temp_a+temp_value+c;
|
||||||
|
|
||||||
|
// printf("SBC: %x - %x (%x) = %x\n",a,value,c,result);
|
||||||
|
|
||||||
|
c=(result&0x100)>>8;
|
||||||
|
n=(result&0x80)>>7;
|
||||||
|
|
||||||
|
v=!!((a^result)&((255-ram[addr])^result)&0x80);
|
||||||
|
|
||||||
|
a=result&0xff;
|
||||||
|
z=(a==0);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmp(int value) {
|
void cmp(int value) {
|
||||||
@ -366,6 +410,19 @@ void ldy_const(int value) {
|
|||||||
n=!!(y&0x80);
|
n=!!(y&0x80);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sta(int addr) {
|
||||||
|
|
||||||
|
ram[addr]=a;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tax(void) {
|
||||||
|
x=a;
|
||||||
|
}
|
||||||
|
|
||||||
|
void txa(void) {
|
||||||
|
a=x;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned char high(int value) {
|
unsigned char high(int value) {
|
||||||
return (value>>8)&0xff;
|
return (value>>8)&0xff;
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@ void lsr(void);
|
|||||||
void asl(void);
|
void asl(void);
|
||||||
void ror(void);
|
void ror(void);
|
||||||
void rol(void);
|
void rol(void);
|
||||||
|
void adc_mem(int addr);
|
||||||
|
void sbc_mem(int addr);
|
||||||
void asl_mem(int addr);
|
void asl_mem(int addr);
|
||||||
void ror_mem(int addr);
|
void ror_mem(int addr);
|
||||||
void rol_mem(int addr);
|
void rol_mem(int addr);
|
||||||
@ -36,6 +38,7 @@ void ldx(int addr);
|
|||||||
void ldx_const(int value);
|
void ldx_const(int value);
|
||||||
void ldy(int addr);
|
void ldy(int addr);
|
||||||
void ldy_const(int value);
|
void ldy_const(int value);
|
||||||
|
void sta(int addr);
|
||||||
|
|
||||||
unsigned char high(int value);
|
unsigned char high(int value);
|
||||||
unsigned char low(int value);
|
unsigned char low(int value);
|
||||||
|
@ -6,7 +6,7 @@ SDL_LIBS= `sdl-config --libs`
|
|||||||
SDL_INCLUDE= `sdl-config --cflags`
|
SDL_INCLUDE= `sdl-config --cflags`
|
||||||
GR_SIM = ../gr-sim.a
|
GR_SIM = ../gr-sim.a
|
||||||
|
|
||||||
all: fireworks fw_purple lines image_load hgr_view
|
all: fireworks fw_purple lines image_load hgr_view seven
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
@ -47,9 +47,16 @@ fw_purple: fw_purple.o $(GR_SIM)
|
|||||||
|
|
||||||
fw_purple.o: fw_purple.c
|
fw_purple.o: fw_purple.c
|
||||||
$(CC) $(CFLAGS) -c fw_purple.c
|
$(CC) $(CFLAGS) -c fw_purple.c
|
||||||
|
###
|
||||||
|
|
||||||
|
seven: seven.o $(GR_SIM)
|
||||||
|
$(CC) $(LFLAGS) $(SDL_LIBS) -o seven seven.o $(GR_SIM)
|
||||||
|
|
||||||
|
seven.o: seven.c
|
||||||
|
$(CC) $(CFLAGS) -c seven.c
|
||||||
|
|
||||||
####
|
####
|
||||||
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *~ *.o fireworks lines image_load hgr_view fw_purple
|
rm -f *~ *.o fireworks lines image_load hgr_view fw_purple seven
|
||||||
|
98
gr-sim/hgr/seven.c
Normal file
98
gr-sim/hgr/seven.c
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "6502_emulate.h"
|
||||||
|
#include "gr-sim.h"
|
||||||
|
|
||||||
|
#define TEMP_Q 0xff
|
||||||
|
#define TEMP_R 0xfe
|
||||||
|
|
||||||
|
static void fancy_div(int d, int *q, int *r) {
|
||||||
|
|
||||||
|
//;Divide by 7 (From December '84 Apple Assembly Line)
|
||||||
|
//;15 bytes, 27 cycles
|
||||||
|
|
||||||
|
// y=xhigh x=xlow a=??
|
||||||
|
// q in y, r in x
|
||||||
|
|
||||||
|
y=(d>>8)&0xff;
|
||||||
|
x=d&0xff;
|
||||||
|
|
||||||
|
a=x;
|
||||||
|
|
||||||
|
sta(TEMP_R);
|
||||||
|
|
||||||
|
c=0;
|
||||||
|
sta(TEMP_Q); // 0
|
||||||
|
lsr(); // 0
|
||||||
|
lsr(); // 0
|
||||||
|
lsr(); // 0
|
||||||
|
adc_mem(TEMP_Q); // 0
|
||||||
|
ror(); // 0
|
||||||
|
lsr(); // 0
|
||||||
|
lsr(); // 0
|
||||||
|
adc_mem(TEMP_Q); // 0
|
||||||
|
ror(); // 0
|
||||||
|
lsr(); // 0
|
||||||
|
lsr(); // 0
|
||||||
|
|
||||||
|
c=0;
|
||||||
|
sta(TEMP_Q);
|
||||||
|
asl();
|
||||||
|
adc_mem(TEMP_Q);
|
||||||
|
asl();
|
||||||
|
adc_mem(TEMP_Q);
|
||||||
|
|
||||||
|
c=1;
|
||||||
|
sta(TEMP_R);
|
||||||
|
txa();
|
||||||
|
sbc_mem(TEMP_R);
|
||||||
|
tax();
|
||||||
|
|
||||||
|
if (y) {
|
||||||
|
x+=4;
|
||||||
|
lda(TEMP_Q);
|
||||||
|
c=0;
|
||||||
|
adc(36);
|
||||||
|
sta(TEMP_Q);
|
||||||
|
}
|
||||||
|
|
||||||
|
y=ram[TEMP_Q];
|
||||||
|
|
||||||
|
if (x>6) {
|
||||||
|
c=1;
|
||||||
|
txa();
|
||||||
|
sbc(7);
|
||||||
|
tax();
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*q=y;
|
||||||
|
*r=x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
int i,actual_q,actual_r;
|
||||||
|
int fancy_q,fancy_r;
|
||||||
|
|
||||||
|
grsim_init();
|
||||||
|
|
||||||
|
for(i=0;i<280;i++) {
|
||||||
|
|
||||||
|
fancy_div(i,&fancy_q,&fancy_r);
|
||||||
|
|
||||||
|
actual_q=i/7;
|
||||||
|
actual_r=i%7;
|
||||||
|
|
||||||
|
if ((fancy_q!=actual_q) || (fancy_r!=actual_r)) {
|
||||||
|
printf("%03x\t%d,%d\t%d,%d\n",
|
||||||
|
i,actual_q,actual_r,fancy_q,fancy_r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user