Polish VRAM access to TTY TX emulation
It assumes Apple BASIC's manner of controlling screen. Apple BASIC may be able to work exactly like running through a virtual terminal device.
This commit is contained in:
parent
35bb8b7083
commit
2d6878d2a7
3
Makefile
3
Makefile
|
@ -5,7 +5,8 @@ LD = arm-none-eabi-ld
|
||||||
OBJCOPY = arm-none-eabi-objcopy
|
OBJCOPY = arm-none-eabi-objcopy
|
||||||
LDSCRIPT= lpc1114.ld
|
LDSCRIPT= lpc1114.ld
|
||||||
LPC21ISP= lpc21isp
|
LPC21ISP= lpc21isp
|
||||||
SERIAL = /dev/ttyUSB0
|
#SERIAL = /dev/ttyUSB0
|
||||||
|
SERIAL = /dev/ttyUSB1
|
||||||
#SERIAL = /dev/ttyACM0
|
#SERIAL = /dev/ttyACM0
|
||||||
SPEED = 115200
|
SPEED = 115200
|
||||||
#SPEED = 9600
|
#SPEED = 9600
|
||||||
|
|
53
apple2.S
53
apple2.S
|
@ -164,7 +164,8 @@ cpu6502_load:
|
||||||
orrs r0, r0, r1
|
orrs r0, r0, r1
|
||||||
ldr r1, =#kbddata
|
ldr r1, =#kbddata
|
||||||
strb r0, [r1]
|
strb r0, [r1]
|
||||||
b 3b
|
// Drop old input data?
|
||||||
|
// b 3b
|
||||||
2:
|
2:
|
||||||
ldr r2, =#kbddata
|
ldr r2, =#kbddata
|
||||||
ldrb r0, [r2]
|
ldrb r0, [r2]
|
||||||
|
@ -360,20 +361,18 @@ a2_tty:
|
||||||
strb r0, [r3]
|
strb r0, [r3]
|
||||||
1:
|
1:
|
||||||
cmp r0, #4
|
cmp r0, #4
|
||||||
bne 2f
|
bne 3f
|
||||||
// scrmode 4 (normal)
|
// scrmode 4 (normal)
|
||||||
//cmp r1, #0xff
|
|
||||||
//bne 1f
|
|
||||||
//pop {pc}
|
|
||||||
1:
|
|
||||||
//cmp r1, #0x7f
|
|
||||||
//bne 1f
|
|
||||||
//pop {pc}
|
|
||||||
1:
|
1:
|
||||||
movs r3, #0x04
|
movs r3, #0x04
|
||||||
lsls r3, r3, #8
|
lsls r3, r3, #8
|
||||||
subs r3, r2, r3
|
subs r3, r2, r3
|
||||||
movs r2, r3
|
movs r2, r3
|
||||||
|
cmp r2, #0x27
|
||||||
|
bne 1f
|
||||||
|
cmp r1, #0xff
|
||||||
|
beq 2f
|
||||||
|
1:
|
||||||
movs r0, #0x7f
|
movs r0, #0x7f
|
||||||
ands r2, r2, r0
|
ands r2, r2, r0
|
||||||
lsrs r3, r3, #7
|
lsrs r3, r3, #7
|
||||||
|
@ -403,8 +402,42 @@ a2_tty:
|
||||||
1:
|
1:
|
||||||
mov r0, r1
|
mov r0, r1
|
||||||
bl a2_putc
|
bl a2_putc
|
||||||
|
pop {pc}
|
||||||
|
2:
|
||||||
|
ldr r0, =#scrmode
|
||||||
|
movs r1, #5
|
||||||
|
strb r1, [r0]
|
||||||
|
3:
|
||||||
|
cmp r0, #5
|
||||||
|
bne 2f
|
||||||
|
// scrmode 5 (Waitinf for scroll finished)
|
||||||
|
movs r3, #0x07
|
||||||
|
lsls r3, r3, #8
|
||||||
|
movs r0, #0xf7
|
||||||
|
adds r3, r3, r0
|
||||||
|
cmp r2, r3
|
||||||
|
beq 1f
|
||||||
|
pop {pc}
|
||||||
|
1:
|
||||||
|
ldr r0, =#scrline
|
||||||
|
ldrb r0, [r0]
|
||||||
|
movs r1, #24
|
||||||
|
subs r1, r0
|
||||||
|
1:
|
||||||
|
movs r0, #0x0a
|
||||||
|
push {r1}
|
||||||
|
bl uart_putc
|
||||||
|
pop {r1}
|
||||||
|
subs r1, r1, #1
|
||||||
|
bne 1b
|
||||||
|
|
||||||
|
ldr r1, =#scrmode
|
||||||
|
movs r0, #4
|
||||||
|
strb r0, [r1]
|
||||||
|
ldr r1, =#scrline
|
||||||
|
movs r0, #23
|
||||||
|
strb r0, [r1]
|
||||||
2:
|
2:
|
||||||
// TODO: scroll
|
|
||||||
pop {pc}
|
pop {pc}
|
||||||
|
|
||||||
.bss
|
.bss
|
||||||
|
|
6
test.c
6
test.c
|
@ -45,7 +45,7 @@ uint8_t cpu6502_load(uint16_t addr) {
|
||||||
if (0x0400 <= addr && addr <= 0x7ff) {
|
if (0x0400 <= addr && addr <= 0x7ff) {
|
||||||
// Fake text VRAM.
|
// Fake text VRAM.
|
||||||
result = mem[addr];
|
result = mem[addr];
|
||||||
result = '@';
|
result = 0xff;
|
||||||
} else if ((0x0300 <= addr && addr <= 0x03ff) ||
|
} else if ((0x0300 <= addr && addr <= 0x03ff) ||
|
||||||
(0x0900 <= addr && addr <= 0x0fff)) {
|
(0x0900 <= addr && addr <= 0x0fff)) {
|
||||||
// Fake memory impl to make it run on low memory chip.
|
// Fake memory impl to make it run on low memory chip.
|
||||||
|
@ -108,7 +108,7 @@ void cpu6502_store(uint16_t addr, uint8_t data) {
|
||||||
// clear x, y
|
// clear x, y
|
||||||
// 2) Show "APPLE ][" from back to forth.
|
// 2) Show "APPLE ][" from back to forth.
|
||||||
// 3) Count down from G to A at x = 40, y = 23
|
// 3) Count down from G to A at x = 40, y = 23
|
||||||
// 4) Scroll happens on CR at line 22 or 23, left to right, up to down
|
// 4) Scroll happens on CR at line 22 or 23, right to left, up to down
|
||||||
// for (var y = 0; y < 23; ++y)
|
// for (var y = 0; y < 23; ++y)
|
||||||
// for (var x = 39; x >= 0; --x)
|
// for (var x = 39; x >= 0; --x)
|
||||||
// reset x, y
|
// reset x, y
|
||||||
|
@ -116,7 +116,7 @@ void cpu6502_store(uint16_t addr, uint8_t data) {
|
||||||
// clear x, 23
|
// clear x, 23
|
||||||
// prompt 0, 23
|
// prompt 0, 23
|
||||||
//fprintf(stdout, "\e[%d;%dH%c", y + 7, x + 1, ascii[data & 0x3f]);
|
//fprintf(stdout, "\e[%d;%dH%c", y + 7, x + 1, ascii[data & 0x3f]);
|
||||||
fprintf(stdout, "(%2d,%2d)%c($%02x)\n", x, y, ascii[data & 0x3f], data);
|
fprintf(stdout, "(%2d,%2d)@%04x%c($%02x)\n", x, y, addr, ascii[data & 0x3f], data);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
} else if ((0x0300 <= addr && addr <= 0x03ff) ||
|
} else if ((0x0300 <= addr && addr <= 0x03ff) ||
|
||||||
(0x0900 <= addr && addr <= 0x0fff)) {
|
(0x0900 <= addr && addr <= 0x0fff)) {
|
||||||
|
|
Loading…
Reference in New Issue