1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
; The WOZ Monitor for the Apple 1
; Written by Steve Wozniak in 1976
; Page 0 Variables
.label XAML 0x24 ; Last "opened" location Low
.label XAMH 0x25 ; Last "opened" location High
.label STL 0x26 ; Store address Low
.label STH 0x27 ; Store address High
.label L 0x28 ; Hex value parsing Low
.label H 0x29 ; Hex value parsing High
.label YSAV 0x2A ; Used to see if hex value is given
.label MODE 0x2B ; $00=XAM, $7F=STOR, $AE=BLOCK XAM
; Other Variables
.label IN 0x0200 ; Input buffer to $027F
.label KBD 0xD010 ; PIA.A keyboard input
.label KBDCR 0xD011 ; PIA.A keyboard control register
.label DSP 0xD012 ; PIA.B display output register
.label DSPCR 0xD013 ; PIA.B display control register
.org $FF00
.export RESET
RESET: ;CLD ; Clear decimal arithmetic mode.
;CLI
MOV Y 0x7F ; Mask for DSP data direction register.
STY DSP ; Set it up.
MOV A 0xA7 ; KBD and DSP control register mask.
STA KBDCR ; Enable interrupts, set CA1, CB1, for
STA DSPCR ; positive edge sense/output mode.
NOTCR: CMP #'_'+$80 ; "_"?
BEQ BACKSPACE ; Yes.
CMP 0x9B ; ESC?
BEQ ESCAPE ; Yes.
INY ; Advance text index.
BPL NEXTCHAR ; Auto ESC if > 127.
ESCAPE: LD A #'\'+$80 ; "\".
JSR ECHO ; Output it.
GETLINE: LD A 0x8D ; CR.
JSR ECHO ; Output it.
LD Y 0x01 ; Initialize text index.
BACKSPACE: DEY ; Back up text index.
BMI GETLINE ; Beyond start of line, reinitialize.
NEXTCHAR: LD A KBDCR ; Key ready?
BPL NEXTCHAR ; Loop until ready.
LD A KBD ; Load character. B7 should be ‘1’.
STA IN,Y ; Add to text buffer.
JSR ECHO ; Display character.
CMP 0x8D ; CR?
BNE NOTCR ; No.
LD Y 0xFF ; Reset text index.
LD A 0x00 ; For XAM mode.
TAX ; 0->X.
SETSTOR: ASL ; Leaves $7B if setting STOR mode.
SETMODE: STA MODE ; $00=XAM, $7B=STOR, $AE=BLOCK XAM.
BLSKIP: INY ; Advance text index.
NEXTITEM: LD A IN,Y ; Get character.
CMP 0x8D ; CR?
BEQ GETLINE ; Yes, done this line.
CMP #'.'+$80 ; "."?
BCC BLSKIP ; Skip delimiter.
BEQ SETMODE ; Set BLOCK XAM mode.
CMP #':'+$80 ; ":"?
BEQ SETSTOR ; Yes. Set STOR mode.
CMP #'R'+$80 ; "R"?
BEQ RUN ; Yes. Run user program.
STX L ; $00->L.
STX H ; and H.
STY YSAV ; Save Y for comparison.
NEXTHEX: LD A IN,Y ; Get character for hex test.
EOR 0xB0 ; Map digits to $0-9.
CMP 0x0A ; Digit?
BCC DIG ; Yes.
ADC 0x88 ; Map letter "A"-"F" to $FA-FF.
CMP 0xFA ; Hex letter?
BCC NOTHEX ; No, character not hex.
DIG: ASL
ASL ; Hex digit to MSD of A.
ASL
ASL
LD X 0x04 ; 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. Check next character for hex.
NOTHEX: CPY YSAV ; Check if L, H empty (no hex digits).
BEQ ESCAPE ; Yes, generate ESC sequence.
BIT MODE ; Test MODE byte.
BVC NOTSTOR ; B6=0 STOR, 1 for XAM and BLOCK XAM
LD A L ; LSD’s of hex data.
STA (STL,X) ; Store at current ‘store index’.
INC STL ; Increment store index.
BNE NEXTITEM ; Get next item. (no carry).
INC STH ; Add carry to ‘store index’ high order.
TONEXTITEM: JMP NEXTITEM ; Get next command item.
RUN: JMP (XAML) ; Run at current XAM index.
NOTSTOR: BMI XAMNEXT ; B7=0 for XAM, 1 for BLOCK XAM.
LD X 0x02 ; Byte count.
SETADR: LD A 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.
NXTPRNT: BNE PRDATA ; NE means no address to print.
LD A 0x8D ; CR.
JSR ECHO ; Output it.
LD A XAMH ; ‘Examine index’ high-order byte.
JSR PRBYTE ; Output it in hex format.
LD A XAML ; Low-order ‘examine index’ byte.
JSR PRBYTE ; Output it in hex format.
LD A #':'+$80 ; ":".
JSR ECHO ; Output it.
PRDATA: LD A 0xA0 ; Blank.
JSR ECHO ; Output it.
LD A (XAML,X) ; Get data byte at ‘examine index’.
JSR PRBYTE ; Output it in hex format.
XAMNEXT: STX MODE ; 0->MODE (XAM mode).
LD A XAML
CMP L ; Compare ‘examine index’ to hex data.
LD A XAMH
SBC H
BCS TONEXTITEM ; Not less, so no more data to output.
INC XAML
BNE MOD8CHK ; Increment ‘examine index’.
INC XAMH
MOD8CHK: LD A XAML ; Check low-order ‘examine index’ byte
AND 0x07 ; For MOD 8=0
BPL NXTPRNT ; Always taken.
PRBYTE: PHA ; Save A for LSD.
LSR
LSR
LSR ; MSD to LSD position.
LSR
JSR PRHEX ; Output hex digit.
PLA ; Restore A.
PRHEX: AND 0x0F ; Mask LSD for hex print.
ORA #'0'+$80 ; Add "0".
CMP 0xBA ; Digit?
BCC ECHO ; Yes, output it.
ADC 0x06 ; Add offset for letter.
ECHO: BIT DSP ; DA bit (B7) cleared yet?
BMI ECHO ; No, wait for display.
STA DSP ; Output character. Sets DA.
RTS ; Return.
BRK ; unused
BRK ; unused
; Interrupt Vectors
.WORD $0F00 ; NMI
.WORD RESET ; RESET
.WORD $0000 ; BRK/IRQ
|