Fine tune

This commit is contained in:
Stefano Furiosi 2016-06-17 23:20:40 -07:00
parent 314604d2d0
commit c893083d62
5 changed files with 51 additions and 361 deletions

View File

@ -3,7 +3,6 @@
; $FFFC and $FFFD - RESET PROGRAM COUNTER
processor 6502
org $FF00
loop

View File

@ -1,258 +0,0 @@
;-------------------------------------------------------------------------
;
; The WOZ Monitor for the Apple 1
; Written by Steve Wozniak 1976
;
;-------------------------------------------------------------------------
processor 6502
org $FF00
;-------------------------------------------------------------------------
; Memory declaration
;-------------------------------------------------------------------------
XAML equ $24 ;Last "opened" location Low
XAMH equ $25 ;Last "opened" location High
STL equ $26 ;Store address Low
STH equ $27 ;Store address High
L equ $28 ;Hex value parsing Low
H equ $29 ;Hex value parsing High
YSAV equ $2A ;Used to see if hex value is given
MODE equ $2B ;$00=XAM, $7F=STOR, $AE=BLOCK XAM
IN equ $0200,$027F ;Input buffer
KBD equ $D010 ;PIA.A keyboard input
KBDCR equ $D011 ;PIA.A keyboard control register
DSP equ $D012 ;PIA.B display output register
DSPCR equ $D013 ;PIA.B display control register
; KBD b7..b0 are inputs, b6..b0 is ASCII input, b7 is constant high
; Programmed to respond to low to high KBD strobe
; DSP b6..b0 are outputs, b7 is input
; CB2 goes low when data is written, returns high when CB1 goes high
; Interrupts are enabled, though not used. KBD can be jumpered to IRQ,
; whereas DSP can be jumpered to NMI.
;-------------------------------------------------------------------------
; Constants
;-------------------------------------------------------------------------
BS equ $DF ;Backspace key, arrow left key
CR equ $8D ;Carriage Return
ESC equ $9B ;ESC key
PROMPT equ "\\" ;Prompt character
;-------------------------------------------------------------------------
; Let's get started
;
; Remark the RESET routine is only to be entered by asserting the RESET
; line of the system. This ensures that the data direction registers
; are selected.
;-------------------------------------------------------------------------
RESET CLD ;Clear decimal arithmetic mode
CLI
LDY #%0111.1111 ;Mask for DSP data direction reg
STY DSP ; (DDR mode is assumed after reset)
LDA #%1010.0111 ;KBD and DSP control register mask
STA KBDCR ;Enable interrupts, set CA1, CB1 for
STA DSPCR ; positive edge sense/output mode.
; Program falls through to the GETLINE routine to save some program bytes
; Please note that Y still holds $7F, which will cause an automatic Escape
;-------------------------------------------------------------------------
; The GETLINE process
;-------------------------------------------------------------------------
NOTCR CMP #BS ;Backspace key?
BEQ BACKSPACE ;Yes
CMP #ESC ;ESC?
BEQ ESCAPE ;Yes
INY ;Advance text index
BPL NEXTCHAR ;Auto ESC if line longer than 127
ESCAPE LDA #PROMPT ;Print prompt character
JSR ECHO ;Output it.
GETLINE LDA #CR ;Send CR
JSR ECHO
LDY #0+1 ;Start a new input line
BACKSPACE DEY ;Backup text index
BMI GETLINE ;Oops, line's empty, reinitialize
NEXTCHAR LDA KBDCR ;Wait for key press
BPL NEXTCHAR ;No key yet!
LDA KBD ;Load character. B7 should be '1'
STA IN,Y ;Add to text buffer
JSR ECHO ;Display character
CMP #CR
BNE NOTCR ;It's not CR!
; Line received, now let's parse it
LDY #-1 ;Reset text index
LDA #0 ;Default mode is XAM
TAX ;X=0
SETSTOR ASL Leaves $7B if setting STOR mode
SETMODE STA MODE Set mode flags
BLSKIP INY Advance text index
NEXTITEM LDA IN,Y Get character
CMP #CR
BEQ GETLINE We're done if it's CR!
CMP #"."
BCC BLSKIP Ignore everything below "."!
BEQ SETMODE Set BLOCK XAM mode ("." = $AE)
CMP #":"
BEQ SETSTOR Set STOR mode! $BA will become $7B
CMP #"R"
BEQ RUN Run the program! Forget the rest
STX L Clear input value (X=0)
STX H
STY YSAV Save Y for comparison
; Here we're trying to parse a new hex value
NEXTHEX LDA IN,Y Get character for hex test
EOR #$B0 Map digits to 0-9
CMP #9+1 Is it a decimal digit?
BCC DIG Yes!
ADC #$88 Map letter "A"-"F" to $FA-FF
CMP #$FA Hex letter?
BCC NOTHEX No! Character not hex
DIG ASL
ASL Hex digit to MSD of A
ASL
ASL
LDX #4 Shift count
HEXSHIFT ASL Hex digit left, MSB to carry
ROL L Rotate into LSD
ROL H Rotate into MSD's
DEX Done 4 shifts?
BNE HEXSHIFT No, loop
INY Advance text index
BNE NEXTHEX Always taken
NOTHEX CPY YSAV Was at least 1 hex digit given?
BEQ ESCAPE No! Ignore all, start from scratch
BIT MODE Test MODE byte
BVC NOTSTOR B6=0 is STOR, 1 is XAM or BLOCK XAM
; STOR mode, save LSD of new hex byte
LDA L LSD's of hex data
STA (STL,X) Store current 'store index'(X=0)
INC STL Increment store index.
BNE NEXTITEM No carry!
INC STH Add carry to 'store index' high
TONEXTITEM JMP NEXTITEM Get next command item.
;-------------------------------------------------------------------------
; RUN user's program from last opened location
;-------------------------------------------------------------------------
RUN JMP (XAML) Run user's program
;-------------------------------------------------------------------------
; We're not in Store mode
;-------------------------------------------------------------------------
NOTSTOR BMI XAMNEXT B7 = 0 for XAM, 1 for BLOCK XAM
; We're in XAM mode now
LDX #2 Copy 2 bytes
SETADR LDA L-1,X Copy hex data to
STA STL-1,X 'store index'
STA XAML-1,X and to 'XAM index'
DEX Next of 2 bytes
BNE SETADR Loop unless X = 0
; Print address and data from this address, fall through next BNE.
NXTPRNT BNE PRDATA NE means no address to print
LDA #CR Print CR first
JSR ECHO
LDA XAMH Output high-order byte of address
JSR PRBYTE
LDA XAML Output low-order byte of address
JSR PRBYTE
LDA #":" Print colon
JSR ECHO
PRDATA LDA #" " Print space
JSR ECHO
LDA (XAML,X) Get data from address (X=0)
JSR PRBYTE Output it in hex format
XAMNEXT STX MODE 0 -> MODE (XAM mode).
LDA XAML See if there's more to print
CMP L
LDA XAMH
SBC H
BCS TONEXTITEM Not less! No more data to output
INC XAML Increment 'examine index'
BNE MOD8CHK No carry!
INC XAMH
MOD8CHK LDA XAML If address MOD 8 = 0 start new line
AND #%0000.0111
BPL NXTPRNT Always taken.
;-------------------------------------------------------------------------
; Subroutine to print a byte in A in hex form (destructive)
;-------------------------------------------------------------------------
PRBYTE PHA Save A for LSD
LSR
LSR
LSR MSD to LSD position
LSR
JSR PRHEX Output hex digit
PLA Restore A
; Fall through to print hex routine
;-------------------------------------------------------------------------
; Subroutine to print a hexadecimal digit
;-------------------------------------------------------------------------
PRHEX AND #%0000.1111 Mask LSD for hex print
ORA #"0" Add "0"
CMP #"9"+1 Is it a decimal digit?
BCC ECHO Yes! output it
ADC #6 Add offset for letter A-F
; Fall through to print routine
;-------------------------------------------------------------------------
; Subroutine to print a character to the terminal
;-------------------------------------------------------------------------
ECHO BIT DSP DA bit (B7) cleared yet?
BMI ECHO No! Wait for display ready
STA DSP Output character. Sets DA
RTS
;-------------------------------------------------------------------------
; Vector area
;-------------------------------------------------------------------------
.DA $0000 Unused, what a pity
NMI_VEC .DA $0F00 NMI vector
RESET_VEC .DA RESET RESET vector
IRQ_VEC .DA $0000 IRQ vector
;-------------------------------------------------------------------------
.LI OFF

View File

@ -1,75 +1,29 @@
@@@@@@@@@@@@@@@@&^-;,;^&#@@@@@@@@@@@@@@@
@@@@@@@@@@@@#**+ ..:;^*@@@@@@@@@@@@@
@@@@@@@@@@&-:.. ... .+@@@@@@@@@@@@
@@@@@@@@%! .. ....+%@@@@@@@@@@
@@@@@@@#; . :^#@@@@@@@@
@@@@@@@= .:;;: =@@@@@@@@
@@@@@@@; ,,. .. :!+=-: :=@@@@@@@
@@@@@@*. :=?^!!--;;;^??=^, .&@@@@@@
@@@@@@+ ,??=+++=+^^++^^+^: +@@@@@@
@@@@@@? !=^;,::,-^-,..:;^! ,%@@@@@@
@@@@@@* :++!,. :++: .:;^+: ?@@@@@@@
@@@@@@%: ;?=+^!!!!-&%+--^+?&!.*@@@@@@@
@@@@@@@+ ,:,=====+^^=&**?^^=??^:+@@@@@@@
@@@@@@@#:,,.!-!!!;;!!!-^-;,;!-!.+@@@@@@@
@@@@@@@@^ :;;,..,,. ..::..,;:,%@@@@@@@
@@@@@@@@%-. ..::.::,;;!!;,,....?@@@@@@@@
@@@@@@@@@%-! ...,;;!-^^^^,. :=@@@@@@@@@
@@@@@@@@%?*=,. ..,;;,,,;;..,?@@@@@@@@@@
@@@@##%*&%#&-,.....:....:..:+?%@@@@@@@@@
@#%***%%####?;::. .......,!^**%#@@@@@@@
%%%%##%%##%##=,,:::...::,!-;^##%%%##@@@@
##%%%%%%%##%##?;,,,,;,;!-^!;+%####%%####
%%%%%%%%%####*?+!;,,,,!--!,-?###%%%%%%%%
WOZ
@@@@@@@@@@@@@@@@@@@@@@@@@^^@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@^^^^^@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@^^^^^@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@^^^^^@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@^^^^^@@@@@@@@@@@@@@@@
@@@@@@@@@@@@^^^@@@@^^@@@@^^^^@@@@@@@@@@@
@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^@@@@@@@
@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@@@
@@@@@***************************@@@@@@@@
@@@@***************************@@@@@@@@@
@@@@**************************@@@@@@@@@@
@@@+++++++++++++++++++++++++++@@@@@@@@@@
@@@+++++++++++++++++++++++++++@@@@@@@@@@
@@@++++++++++++++++++++++++++++@@@@@@@@@
@@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;@@@@@@@@
@@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@@@@@@@
@@@@@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@@@@@
@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@
@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@
@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@
@@@@@@@@@;;;;;;;;;;;;;;;;;;;;;;;@@@@@@@@
@@@@@@@@@@;;;;;;;;@@@@;;;;;;;;@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#Apple 1 Replica
W65C02S <-> Arduino Due
3.3v GND 3.3v Arduino Due
3.3v GND 3.3v
| | +------\/------+ |
| +---- 1| Vss /RES |40 -- 3k3 -+--- 52
+--- 3k3 ----- 2| RDY ϕ2 |39
| 3| ϕ1 /SO |38
+--- 3k3 ----- 4| IRQ ϕ0 |37 -------- 53
| 5| NC NC |36
| +---- 1| VPB /RES |40 -- 3k3 -+--- RST BTN
+--- 3k3 ----- 2| RDY PHI2O |39
| 3| PHI1O SOB |38
+--- 3k3 ----- 4| IRQ PHI2 |37 -------- 52
| 5| MLB BE |36
+--- 3k3 ----- 6| /NMI NC |35
| 7| SYNC R/W |34 -------- 51
+------------- 8| Vcc D0 |33 -------- 49
22 --------- 9| A0 D1 |32 -------- 48
23 --------- 10| A1 D2 |31 -------- 47
24 --------- 11| A2 D3 |30 -------- 46
25 --------- 12| A3 D4 |29 -------- 45
26 --------- 13| A4 D5 |28 -------- 44
27 --------- 14| A5 D6 |27 -------- 43
28 --------- 15| A6 D7 |26 -------- 42
29 --------- 16| A7 A15 |25 -------- 30
37 --------- 17| A8 A14 |24 -------- 31
36 --------- 18| A9 A13 |23 -------- 32
35 --------- 19| A10 A12 |22 -------- 33
34 --------- 20| A11 Vss |21 ---+
| 7| SYNC R/W |34 -------- 53
+------------- 8| VDD D0 |33 -------- 30
44 --------- 9| A0 D1 |32 -------- 31
45 --------- 10| A1 D2 |31 -------- 32
2 --------- 11| A2 D3 |30 -------- 33
3 --------- 12| A3 D4 |29 -------- 34
4 --------- 13| A4 D5 |28 -------- 35
5 --------- 14| A5 D6 |27 -------- 36
6 --------- 15| A6 D7 |26 -------- 37
7 --------- 16| A7 A15 |25 -------- 47
8 --------- 17| A8 A14 |24 -------- 46
9 --------- 18| A9 A13 |23 -------- 13
10 --------- 19| A10 A12 |22 -------- 12
11 --------- 20| A11 VSS |21 ---+
+--------------+ |
GND

View File

@ -12,8 +12,6 @@ const int CLOCK_DELAY = 4; // HIGH / LOW CLOCK STATE DELAY
const char SERIAL_BS = 0x08;
const int NUM_ADDR_PINS = 16;
const int NUM_DATA_PINS = 8;
const int ADDRESS_PINS[] = {44,45,2,3,4,5,6,7,8,9,10,11,12,13,46,47}; // TO ADDRESS PIN 1-15 6502
const int DATA_PINS[] = {30,31,32,33,34,35,36,37}; // TO DATA BUS PIN 0-7 6502
@ -34,6 +32,7 @@ const unsigned int IN = 0x200; // Input buffer ($0200,$027F)
const int RAM_BANK_1_SIZE = 4096;
const int RAM_BANK_2_SIZE = 4096;
unsigned char RAM_BANK_1[RAM_BANK_1_SIZE];
unsigned char RAM_BANK_2[RAM_BANK_2_SIZE];
// PIA MAPPING 6821
const unsigned int PIA_ADDR = 0xD000; // PIA 6821 ADDR BASE SPACE
@ -58,34 +57,33 @@ unsigned int pre_address; // Current address (from 6502)
unsigned char pre_bus_data; // Data Bus value (from 6502)
int pre_rw_state; // Current R/W state (from 6502)
void setupAddressPins() {
for (int i = 0; i < NUM_ADDR_PINS; ++i) {
for (int i = 0; i < 16; ++i) {
pinMode(ADDRESS_PINS[i], INPUT);
}
}
void setBusMode(int mode) {
for (int i = 0; i < NUM_DATA_PINS; ++i) {
for (int i = 0; i < 8; ++i) {
pinMode(DATA_PINS[i], mode);
}
}
void readAddress() {
address = 0;
for (int i = 0; i < NUM_ADDR_PINS; ++i)
for (int i = 0; i < 16; ++i)
{
address = address << 1;
address += (digitalRead(ADDRESS_PINS[NUM_ADDR_PINS-i-1]) == HIGH)?1:0;
address += (digitalRead(ADDRESS_PINS[16-i-1]) == HIGH)?1:0;
}
}
void readData() {
bus_data = 0;
for (int i = 0; i < NUM_DATA_PINS; ++i)
for (int i = 0; i < 8; ++i)
{
bus_data = bus_data << 1;
bus_data += (digitalRead(DATA_PINS[NUM_DATA_PINS-i-1]) == HIGH)?1:0;
bus_data += (digitalRead(DATA_PINS[8-i-1]) == HIGH)?1:0;
}
}
@ -94,19 +92,13 @@ void handleRWState() {
if (rw_state != tmp_rw_state) {
rw_state=tmp_rw_state;
if (rw_state) {
// State HIGH - WRITE TO 6502 Data Bus
setBusMode(OUTPUT);
} else {
// State LOW - READ FROM 6502 Data Bus
setBusMode(INPUT);
}
rw_state ? setBusMode(OUTPUT) : setBusMode(INPUT);
}
}
// Send a byte to the 6502 DATA BUS
void byteToDataBus(unsigned char data) {
for (int i = 0; i < NUM_DATA_PINS; i++) {
for (int i = 0; i < 8; i++) {
digitalWrite(DATA_PINS[i], CHECK_BIT(data, i));
}
}
@ -156,7 +148,6 @@ void readFromDataBus() {
RAM_BANK_1[address-RAM_BANK1_ADDR]=bus_data;
break;
case 0xE:
//RAM_BANK_2[address-RAM_BANK2_ADDR]=bus_data;
RAM_BANK_2[address-RAM_BANK2_ADDR]=bus_data;
break;
case 0xD:
@ -189,12 +180,12 @@ unsigned char PIARead() {
break;
default:
val=0;
break;
}
return val;
}
// WRITE FROM DATA BUS A BYTE FROM RELATED ADDRESS
void writeToDataBus() {
unsigned char val=0;
@ -215,7 +206,6 @@ void writeToDataBus() {
val=0;
break;
}
byteToDataBus(val);
}
@ -229,10 +219,6 @@ void handleKeyboard() {
// Just ignore
return;
break;
case 0xD:
// CR
tempKBD = 0x0D;
break;
case 0x8:
case 0x7F:
// BS
@ -247,13 +233,22 @@ void handleKeyboard() {
}
}
void autload() {
unsigned int adddr = AUTLOAD[1] | AUTLOAD[0] << 8;
Serial.print("AUTOLOAD AT: ");
Serial.println(adddr, HEX);
void loadBASIC() {
// LOAD BASIC in E000
Serial.println("BASIC LOADED");
for (unsigned int i = 0; i < sizeof(BASIC) ; i++) {
RAM_BANK_2[i] = BASIC[i];
}
}
for (unsigned int i = 0; i <= sizeof(AUTLOAD)-2 ; i++) {
RAM_BANK_1[adddr+i] = AUTLOAD[i+2];
void loadPROG() {
// LOAD A PROG
unsigned int prg_addr = AUTLOAD[1] | AUTLOAD[0] << 8;
Serial.print("PROGRAM AT: ");
Serial.println(prg_addr, HEX);
for (unsigned int i = 0; i < sizeof(AUTLOAD)-2 ; i++) {
RAM_BANK_1[prg_addr+i] = AUTLOAD[i+2];
}
}
@ -279,10 +274,10 @@ void setup() {
Serial.print(sizeof(RAM_BANK_2));
Serial.println(" BYTE");
autload();
loadBASIC();
loadPROG();
Serial.println("----------------------------");
}
void handleClock() {

File diff suppressed because one or more lines are too long