681 lines
34 KiB
Plaintext
681 lines
34 KiB
Plaintext
|
|
{-----------------------------------------------------------------------+
|
|
| |
|
|
| Apple-1 mockup |
|
|
| For testing original WozMon code on v6502 |
|
|
| |
|
|
+-----------------------------------------------------------------------}
|
|
gcl0x
|
|
|
|
{
|
|
Issues:
|
|
XXX Shift screen memory 96 pixels right
|
|
XXX NMI/IRQ/RESET to wozmon (through vector) without going through main menu
|
|
XXX We can win memory by sharing all black pixel lines in one page
|
|
But drawing characters then touches the top line
|
|
- Option 1: VDRawBits7
|
|
- Option 2: Always hide top line
|
|
- Option 3: New draw transparent plot function, clear with SetBytes
|
|
- Option 4: Vary which page is the black line, will be the bottom line
|
|
-> doesn't work at memory wrap-around
|
|
- Option 5: New videoTable-aware (character) plot function
|
|
- Option 6: use Sprite functions for plotting chars
|
|
Possible memory map with compressed video memory:
|
|
+--------------------------+
|
|
|30-7F,81-FF FREE ZP+STACK!|
|
|
|0100-01F9 VIDEO+SYSTEM |
|
|
|0200-0FFF FREE RAM | 1000-5FFF -> 80 scanlines
|
|
|E000-EFFF FREE RAM | F000-FBFF -> 12 scanlines --> total 13*7+1
|
|
|FC00-FD00 FREE RAM |
|
|
|FE00 KBD/DSP MOCKUP| Add entry points at D010-D013 = 5010-5013
|
|
|FF00 APPLE1 ROM |
|
|
| |
|
|
|C100R LOADER MENU |
|
|
|E000R BASIC COLD START|
|
|
|E2B3R BASIC WARM START|
|
|
+--------------------------+
|
|
XXX Emulate ACI Apple Cassete Interface? C100R --> 4100 = RAM (still ok)
|
|
XXX D010 60 KBD RTS <-- Or store keyboard value here
|
|
D011 80 KBDCR BRA $D037 NOK: (JMP $6024 = $E024)
|
|
D012 24 DSP BIT $60
|
|
D013 60 DSPCR RTS
|
|
D014 _DSP:
|
|
D037 _KBDCR:
|
|
|
|
https://www.sbprojects.net/projects/apple1/a1basic.php
|
|
|
|
Zero page usage:
|
|
$30-$31 Pos
|
|
$32-$33 PrintChar
|
|
$34-$3b WozMon variables
|
|
}
|
|
|
|
_i=$3c {2 bytes}
|
|
_j=$3e {2 bytes}
|
|
_k=$3a {1 bytes, share with wozmon YSAV}
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| ROM type check |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
*=\userCode
|
|
|
|
\romType, \romTypeValue_ROMv4- {Version check >= ROMv4, see Docs/GT1-files.txt}
|
|
[if<0 do _frameCount _vPCH: {https://forum.gigatron.io/viewtopic.php?f=4&t=130}
|
|
loop]
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| Initialize |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
{ This code runs once and is then reused as the input buffer for wozmon }
|
|
|
|
{ Setup video indirection table such that WozMon can be at $7F00/$FF00 }
|
|
\videoTable Pos= {First GCL variable at $30, later becomes Pos}
|
|
120 {7^127}
|
|
[do 127^ {Loop over 7..126 range}
|
|
Pos: <Pos++ <Pos++ {Y[y]=7+j and dX[y]=0}
|
|
1+ 127^ if<>0loop] {Next in range}
|
|
|
|
&_PrintChar PrintChar= {Forward reference}
|
|
|
|
&_Apple1 _vLR= {Prepare transfer to main loop}
|
|
&_FirstStart {Start address for 6502 program}
|
|
[ret] {Jump to Main (the brackets avoid the automatic vLR patch)}
|
|
|
|
_FirstStart=* #_LDXIM_ #15 {Clear screen}
|
|
_L0=* #_LDAIM_ #$8d
|
|
#_BRK_
|
|
#_DEX_
|
|
#_BNE_ #@_L0
|
|
#_BEQ_ #@_MUNCH {Always taken}
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| Preloaded demo program |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
*=$280
|
|
|
|
_MUNCH=* #_CLC_
|
|
#_ADCIM_ #23
|
|
#_STAZ_ #$40
|
|
#_LDAIM_ #$00
|
|
#_STAZ_ #$41
|
|
#_LDAIM_ #$10
|
|
#_STAZ_ #$42
|
|
_L1=* #_LDAIM_ #$07
|
|
#_STAZ_ #$43
|
|
_L2=* #_EORZ_ #$41
|
|
#_TAY_
|
|
#_LDAZ_ #$40
|
|
#_STAIY_ #$42
|
|
#_INCZ_ #$43
|
|
#_LDAZ_ #$43
|
|
#_CMPIM_ #$7f
|
|
#_BNE_ #@_L2
|
|
#_LDAZ_ #_serialRaw
|
|
#_CMPIM_ #$03
|
|
#_BEQ_ #@_L3
|
|
#_INCZ_ #$41
|
|
#_BPL_ #@_L1
|
|
#_LDAZ_ #$40
|
|
#_JMP_ ##_MUNCH
|
|
_L3=* #_LDXIM_ #66
|
|
_L4=* #_LDAAX_ ##_MSG
|
|
#_BRK_
|
|
#_DEX_
|
|
#_BPL_ #@_L4
|
|
#_JMP_ ##_RESET
|
|
|
|
_MSG=*
|
|
|
|
{ '600 Free\r' }
|
|
#$8d #$e5 #$e5 #$f2 #$c6 #$a0 #$a0 #$b0
|
|
#$b0 #$b6
|
|
|
|
{ '400R Disassemble 44.45\r' }
|
|
#$8d #$b5 #$b4 #$ae #$b4 #$b4 #$a0 #$e5
|
|
#$ec #$e2 #$ed #$e5 #$f3 #$f3 #$e1 #$f3
|
|
#$e9 #$c4 #$a0 #$d2 #$b0 #$b0 #$b4
|
|
|
|
{ '280R Munching6502\r' }
|
|
#$8d #$b2 #$b0 #$b5 #$b6 #$e7 #$ee #$e9
|
|
#$e8 #$e3 #$ee #$f5 #$cd #$a0 #$d2 #$b0
|
|
#$b8 #$b2
|
|
|
|
{ 'Apple-1 on TTL\r' }
|
|
#$8d #$cc #$d4 #$d4 #$a0 #$ee #$ef #$a0
|
|
#$b1 #$ad #$e5 #$ec #$f0 #$f0 #$c1
|
|
|
|
{ '\r\r' }
|
|
#$8d #$8d
|
|
|
|
{
|
|
Create message with:
|
|
s = 'Message text'
|
|
' '.join('#$%02x'%(ord(c)+128) for c in reversed(s))
|
|
}
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| Main loop |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
*=$300
|
|
|
|
_Apple1=*
|
|
|
|
_vLR= {Reset v6502 PC}
|
|
[do
|
|
\SYS_Run6502_v4_80 _sysFn=
|
|
\k, {ASCII code in A}
|
|
80!! {Run 6502 code until BRK}
|
|
push {Save v6502 PC}
|
|
[if=0 {A=0 reads from keyboard}
|
|
[do
|
|
\serialRaw, 255^ {Wait for idle keyboard}
|
|
if<>0loop]
|
|
[do
|
|
\frameCount, 15& [if=0 {4 Hz cursor redraw rate}
|
|
\frameCount, 48& {Flash at 1 Hz with 75% duty cycle}
|
|
[if=0 $a0 else $c0] {Select space or '@'}
|
|
PrintChar! Pos=] {Display cursor and move back}
|
|
\serialRaw, \k. 128& {Key ready?}
|
|
if<>0loop] {Loop until ready}
|
|
$a0 PrintChar! Pos= {Overwrite '@' with a space}
|
|
\k, $60- [if>=0 $40+ \k.] {Map to upper case, and DEL to rubout}
|
|
\k, 10^ [if=0 13 \k.] {Map LF to CR}
|
|
else {A<>0 for echo}
|
|
\k.
|
|
PrintChar!
|
|
]
|
|
pop {Restore v6502 PC}
|
|
loop] {Back to wozmon}
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| Character output with automatic scrolling |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
_PrintChar=*
|
|
[
|
|
{Minimalistic terminal output, with bit 7 set by WozMon}
|
|
|
|
%-2= {Park character in stack area}
|
|
\SYS_VDrawBits_134 _sysFn= {Prepare SYS calls}
|
|
$800 \sysArgs0: {Green on black}
|
|
|
|
%-2 {Get character back}
|
|
$8d^ [if<>0 {Test for CR...}
|
|
<Pos, 155- if>0 0] {...or line wrap}
|
|
|
|
[if=0
|
|
|
|
{-------------------------------------------------------------------+
|
|
| Newline |
|
|
+-------------------------------------------------------------------}
|
|
|
|
{Clear new line first}
|
|
|
|
$100 <Pos. peek >Pos. Pos {Go to start of next line}
|
|
\sysArgs4: {Set screen position}
|
|
\sysArgs2. {Set all-zero output pattern}
|
|
[do
|
|
134!! {SYS call to draw 8 pixels vertically}
|
|
<\sysArgs4++ {Step 1 pixel right}
|
|
\sysArgs4, 160^ {Test for end of line}
|
|
if<>0loop]
|
|
|
|
{Then scroll up by modifying videoTable}
|
|
|
|
$01ee _i= {Last entry in video table}
|
|
[do
|
|
_i, 119- [if<0 127+
|
|
else 7+] _i. {Rotate by 8 in 7..126 range}
|
|
_i 2- _i= {Move to previous entry in video table}
|
|
$fe^ if<>0loop] {Until all done}
|
|
]
|
|
|
|
%-2 $a0- {WozMon sends ASCII with bit 7 set}
|
|
[if>=0 {If printable}
|
|
|
|
{-------------------------------------------------------------------+
|
|
| PrintChar |
|
|
+-------------------------------------------------------------------}
|
|
|
|
{ Draw ASCII character (32..127) on screen in 5x8 pixels }
|
|
{ and advance cursor position }
|
|
|
|
50- {Map ASCII code to offset in font table}
|
|
[if<0 50+ _i= \font32up {ASCII 32..81}
|
|
else _i= \font82up] {ASCII 82..127}
|
|
_j= _i 2<< _i+ {Multiply char code by 5}
|
|
_j+ _j= {Add to page address to reach bitmap data}
|
|
|
|
Pos \sysArgs4: {Screen position for character}
|
|
%-2= {Remember this position}
|
|
6+ Pos= {Advance by 6 pixels}
|
|
|
|
5 [do _i= {Draw character as 5 vertical bit slices}
|
|
_j 0? \sysArgs2. {Get bit slice as byte from ROM table}
|
|
134!! {SYS call to draw 8 pixels vertically}
|
|
<_j++ <\sysArgs4++ {Advance to next byte}
|
|
_i 1- if>0loop] {Looping}
|
|
|
|
%-2 {Return position for backspace}
|
|
]
|
|
|
|
ret
|
|
]
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| Disassembler |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
{
|
|
WRITTEN BY STEVE WOZNIAK & ALLEN BAUM
|
|
AND PUBLISHED IN DOCTOR DOBBS JOURNAL
|
|
SEPT 1976
|
|
}
|
|
*=$400
|
|
|
|
_FORMAT=$40
|
|
_LENGTH=$41
|
|
_LMNEM=$42
|
|
_RMNEM=$43
|
|
_PCL=$44
|
|
_PCH=$45
|
|
_COUNT=$46
|
|
|
|
#_JSR_ ##_DSMBL { [Gigatron] Call disassembler as subroutine }
|
|
#_JMP_ ##_GETLINE { [Gigatron] Back to wozmon }
|
|
|
|
_DSMBL=* #_LDAIM_ #$d {was $13} { COUNT FOR 13 INSTR. DSMBLY }
|
|
#_STAZ_ #_COUNT
|
|
_DSMBL2=* #_JSR_ ##_INSTDS { DISASSEMBLE AND DISPLAY INSTR. }
|
|
#_JSR_ ##_PCADJ
|
|
#_STAZ_ #_PCL { UPDATE PCL,H TO NEXT INSTR. }
|
|
#_STYZ_ #_PCH
|
|
#_DECZ_ #_COUNT { DONE FIRST 19 INSTR?. }
|
|
#_BNE_ #@_DSMBL2 { * YES, LOOP. ELSE DSMBL 20TH. }
|
|
_INSTDS=* #_JSR_ ##_PRPC { PRINT PCL,H }
|
|
#_LDAIX_ #_PCL { GET OPCODE }
|
|
#_TAY_
|
|
#_LSRA_ { EVEN/ODD TEST }
|
|
#_BCC_ #@_IEVEN
|
|
#_LSRA_ { * TEST BIT 1 }
|
|
#_BCS_ #@_ERR { * XXXXXX11 INSTR. INVALID. }
|
|
#_CMPIM_ #$22
|
|
#_BEQ_ #@_ERR { * 10001001 INSTR. INVALID. }
|
|
#_ANDIM_ #$7 { MASK 3 BITS FOR ADDRESS MODE & }
|
|
#_ORAIM_ #$80 { * ADD INDEXING OFFSET. }
|
|
_IEVEN=* #_LSRA_ { * LSB INTO CARRY FOR }
|
|
#_TAX_ { * LEFT/RIGHT TEST BELOW. }
|
|
#_LDAAX_ ##_MODE1 { INDEX INTO ADDRESS MODE TABLE.}
|
|
#_BCS_ #@_RTMODE { IF CARRY SET USE LSD FOR }
|
|
#_LSRA_ { * PRINT FORMAT INDEX }
|
|
#_LSRA_
|
|
#_LSRA_ { * IF CARRY CLEAR USE MSD. }
|
|
#_LSRA_
|
|
_RTMODE=* #_ANDIM_ #$F { MASK FOR 4-BIT INDEX. }
|
|
#_BNE_ #@_GETFMT { $0 FOR INVALID OP CODES. }
|
|
_ERR=* #_LDYIM_ #$80 { SUBSTITUTE $80 FOR INVALID OP, }
|
|
#_LDAIM_ #$0 { SET PRINT FORMAT INDEX TO 0 }
|
|
_GETFMT=* #_TAX_
|
|
#_LDAAX_ ##_MODE2 { INDEX INTO PRINT FORMAT TABLE. }
|
|
#_STAZ_ #_FORMAT { SAVE FOR ADDRESS FIELD FORMAT. }
|
|
#_ANDIM_ #$3 { MASK 2-BIT LENGTH. 0=1-BYTE }
|
|
#_STAZ_ #_LENGTH { * 1=2-BYTE, 2=3-BYTE. }
|
|
#_TYA_ { * OP CODE. }
|
|
#_ANDIM_ #$8F { MASK IT FOR 1XXX1010 TEST. }
|
|
#_TAX_ { SAVE IT. }
|
|
#_TYA_ { * OP CODE TO 'A' AGAIN. }
|
|
#_LDYIM_ #$3
|
|
#_CPXIM_ #$8A
|
|
#_BEQ_ #@_MNNDX3
|
|
_MNNDX1=* #_LSRA_
|
|
#_BCC_ #@_MNNDX3 { FORM INDEX INTO MNEMONIC TABLE. }
|
|
#_LSRA_
|
|
_MNNDX2=* #_LSRA_ { * 1XXX1010 -> 00101XXX }
|
|
#_ORAIM_ #$20 { * XXXYYY01 -> 00111XXX }
|
|
#_DEY_ { * XXXYYY10 -> 00110XXX }
|
|
#_BNE_ #@_MNNDX2 { * XXXYY100 -> 00100XXX }
|
|
#_INY_ { * XXXXX000 -> 000XXXXX }
|
|
_MNNDX3=* #_DEY_
|
|
#_BNE_ #@_MNNDX1
|
|
#_PHA_ { * SAVE MNEMONIC TABLE INDEX. }
|
|
_PROP=* #_LDAIY_ #_PCL
|
|
#_JSR_ ##_PRBYTE
|
|
#_LDXIM_ #$1
|
|
_PROPBL=* #_JSR_ ##_PRBL2
|
|
#_CPYZ_ #_LENGTH { PRINT INSTR (1 TO 3 BYTES) }
|
|
#_INY_ { IN A 12 CHARACTYER FIELD. }
|
|
#_BCC_ #@_PROP
|
|
#_LDXIM_ #$3 { CHAR COUNT FOR MNEMONIC PRINT. }
|
|
#_CPYIM_ #$3
|
|
#_BCC_ #@_PROPBL
|
|
#_PLA_ { RECOVER MNEMONIC INDEX. }
|
|
#_TAY_
|
|
#_LDAAY_ ##_MNEML
|
|
#_STAZ_ #_LMNEM { FETCH 3-CHAR MNEMONIC }
|
|
#_LDAAY_ ##_MNEMR { * (PACKED IN TWO BYTES) }
|
|
#_STAZ_ #_RMNEM
|
|
_PRMN1=* #_LDAIM_ #$0
|
|
#_LDYIM_ #$5
|
|
_PRMN2=* #_ASLZ_ #_RMNEM
|
|
#_ROLZ_ #_LMNEM { SHIFT 5 BITS OF CHAR INTO 'A'. }
|
|
#_ROLA_ { * (CLEAR CARRY) }
|
|
#_DEY_
|
|
#_BNE_ #@_PRMN2
|
|
#_ADCIM_ #$BF { ADD '?' OFFSET. }
|
|
#_JSR_ ##_CHAROUT { OUTPUT A CHAR OR MNEMONIC }
|
|
#_DEX_
|
|
#_BNE_ #@_PRMN1
|
|
#_JSR_ ##_PRBLNK { OUTPUT 3 BLANKS. }
|
|
#_LDXIM_ #$6 { COUNT FOR 6 PRINT FORMAT BITS. }
|
|
_PRADR1=* #_CPXIM_ #$3
|
|
#_BNE_ #@_PRADR3 { IF X=3 THEN PRINT ADDRESS VAL. }
|
|
#_LDYZ_ #_LENGTH
|
|
#_BEQ_ #@_PRADR3 { NO PRINT IF LENGTH=0. }
|
|
_PRADR2=* #_LDAZ_ #_FORMAT
|
|
#_CMPIM_ #$E8 { HANDLE REL ADDRESSING MODE }
|
|
#_LDAIY_ #_PCL { SPECIAL (PRINT TARGET ADDR) }
|
|
#_BCS_ #@_RELADR { * (NOT DISPLACEMENT) }
|
|
#_JSR_ ##_PRBYTE { OUTPUT 1- OR 2- BYTE ADDRESS. }
|
|
#_DEY_ { MORE SIGNIFICANT BYTE FIRST. }
|
|
#_BNE_ #@_PRADR2
|
|
_PRADR3=* #_ASLZ_ #_FORMAT { TEST NEXT PRINT FORMAT BIT. }
|
|
#_BCC_ #@_PRADR4 { IF 0, DONT PRINT }
|
|
#_LDAAX_ ##_CHAR1_MINUS1 { CORRESPONDING CHAR. }
|
|
#_JSR_ ##_CHAROUT { OUTPUT 1 OR 2 CHARS. }
|
|
#_LDAAX_ ##_CHAR2_MINUS1 { * (IF CHAR FROM CHAR2 IS 0, }
|
|
#_BEQ_ #@_PRADR4 { * DON'T FRINT IT) }
|
|
#_JSR_ ##_CHAROUT
|
|
_PRADR4=* #_DEX_
|
|
#_BNE_ #@_PRADR1
|
|
#_RTS_ { *RETURN IF DONE 6 FORMAT BITS. }
|
|
_RELADR=* #_JSR_ ##_PCADJ3 { PCL,H + DISPL + 1 TO 'A','Y'. }
|
|
#_TAX_
|
|
#_INX_
|
|
#_BNE_ #@_PRNTYX { * +1 TO 'X','Y'. }
|
|
#_INY_
|
|
_PRNTYX=* #_TYA_
|
|
_PRNTAX=* #_JSR_ ##_PRBYTE { PRINT TARGET ADDRESS OF BRANCH }
|
|
_PRNTX=* #_TXA_ { AND RETURN }
|
|
#_JMP_ ##_PRBYTE
|
|
_PRPC=* #_LDAIM_ #$8D
|
|
#_JSR_ ##_CHAROUT { OUTPUT CARRIAGE RETURN. }
|
|
#_LDAZ_ #_PCH
|
|
#_LDXZ_ #_PCL
|
|
#_JSR_ ##_PRNTAX { OUTPUT PCL,H }
|
|
#_LDAIM_ #$AD
|
|
#_JSR_ ##_CHAROUT { OUTPUT '-' }
|
|
_PRBLNK=* #_LDXIM_ #$1 { BLANK COUNT [Gigatron] Was: #$3 }
|
|
_PRBL2=* #_LDAIM_ #$A0
|
|
_PRBL3=* #_JSR_ ##_CHAROUT { OUTPUT A BLANK }
|
|
#_DEX_
|
|
#_BNE_ #@_PRBL2 { LOOP UNTIL COUNT =0 }
|
|
#_RTS_
|
|
_PCADJ=* #_LDAZ_ #_LENGTH { 0=1-BYTE, 1=2-BYTE, 2=3-BYTE. }
|
|
_PCADJ2=* #_SEC_
|
|
_PCADJ3=* #_LDYZ_ #_PCH
|
|
#_TAX_ { * TEST DISPL SIGN (FOR REL }
|
|
#_BPL_ #@_PCADJ4 { * BRANCH). EXTEND NEG }
|
|
#_DEY_ { * BY DECREMENTING PCH. }
|
|
_PCADJ4=* #_ADCZ_ #_PCL
|
|
*=$500 { [Gigatron] Open next GT1 file segment }
|
|
#_BCC_ #@_RTS1 { PCL+LENGTH (OR DISPL) +1 TO A. }
|
|
#_INY_ { * CARRY INTO Y (PCH) }
|
|
_RTS1=* #_RTS_
|
|
|
|
_MODE1=* #$40 #$2 #$45 #$3
|
|
#$D0 #$8 #$40 #$9
|
|
#$30 { XXXXXXZ0 INSTRS.. }
|
|
#$22
|
|
#$45 { * Z=0, LEFT HALF-BYTE }
|
|
#$33 { * Z=1, RIGHT HALF-BYTE }
|
|
#$D0 #$8 #$40 #$9
|
|
#$40 #$2 #$45 #$33
|
|
#$D0 #$8 #$40 #$9
|
|
#$40 #$2 #$45 #$B3
|
|
#$D0 #$8 #$40 #$9
|
|
#$0 #$22 #$44 #$33
|
|
#$D0 #$8C #$44 #$0
|
|
#$11 #$22 #$44 #$33
|
|
#$D0 #$8C #$44 #$9A
|
|
#$10 #$22 #$44 #$33
|
|
#$D0 #$8 #$40 #$9
|
|
#$10 #$22 #$44 #$33
|
|
#$D0 #$8 #$40 #$9
|
|
#$62
|
|
#$13 { YYXXXZ01 INSTRS. }
|
|
#$78
|
|
#$A9
|
|
|
|
_MODE2=* #$0 { ERR }
|
|
#$21 { IMM }
|
|
#$81 { Z-PAG }
|
|
#$82 { ABS }
|
|
#$0 { IMPL }
|
|
#$0 { ACC }
|
|
#$59 { (Z-PAG,X) }
|
|
#$4D { (Z-PAG),Y }
|
|
#$91 { Z-PAG,X }
|
|
#$92 { ABS,X }
|
|
#$86 { ABS,Y }
|
|
#$4A { (ABS) }
|
|
#$85 { Z-PAG,Y }
|
|
_CHAR1_MINUS1=* #$9D { REL }
|
|
|
|
_CHAR1=* #$AC { ',' }
|
|
#$A9 { ')' }
|
|
#$AC { ',' }
|
|
#$A3 { '#' }
|
|
#$A8 { '(' }
|
|
_CHAR2_MINUS1=* #$A4 { '$' }
|
|
|
|
_CHAR2=* #$D9 { 'Y' }
|
|
#$0
|
|
#$D8 { 'X' }
|
|
#$A4 { '$' }
|
|
#$A4 { '$' }
|
|
#$0
|
|
|
|
_MNEML=* #$1C #$8A #$1C #$23 { XXXXX000 INSTRS. }
|
|
#$5D #$8B #$1B #$A1
|
|
#$9D #$8A #$1D #$23
|
|
#$9D #$8B #$1D #$A1
|
|
#$0 #$29 #$19 #$AE
|
|
#$69 #$A8 #$19 #$23
|
|
#$24 #$53 #$1B #$23
|
|
#$24 #$53 #$19 #$A1
|
|
#$0 #$1A #$5B #$5B { XXXYY100 INSTRS. }
|
|
#$A5 #$69 #$24 #$24
|
|
#$AE #$AE #$A8 #$AD { 1XXX1010 INSTRS. }
|
|
#$29 #$0 #$7C #$0
|
|
#$15 #$9C #$6D #$9C { XXXYYY10 INSTRS. }
|
|
#$A5 #$69 #$29 #$53
|
|
#$84 #$13 #$34 #$11 { XXXYYY01 INSTRS. }
|
|
#$A5 #$69 #$23 #$A0
|
|
|
|
_MNEMR=* #$D8 #$62 #$5A #$48 { XXXXX000 INSTRS }
|
|
#$26 #$62 #$94 #$88
|
|
#$54 #$44 #$C8 #$54
|
|
#$68 #$44 #$E8 #$94
|
|
#$0 #$B4 #$8 #$84
|
|
#$74 #$B4 #$28 #$6E
|
|
#$74 #$F4 #$CC #$4A
|
|
#$72 #$F2 #$A4 #$8A
|
|
#$0 #$AA #$A2 #$A2 { XXXYY100 INSTRS }
|
|
#$74 #$74 #$74 #$72
|
|
#$44 #$68 #$B2 #$32 { 1XXX1010 INSTRS. }
|
|
#$B2 #$0 #$22 #$26
|
|
#$1A #$1A #$26 #$26 { XXXYYY10 INSTRS. }
|
|
#$72 #$72 #$88 #$C8
|
|
#$C4 #$CA #$26 #$48 { XXXYYY01 INSTRS. }
|
|
#$44 #$44 #$A2 #$C8
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| WozMon |
|
|
+-----------------------------------------------------------------------}
|
|
|
|
*=$ff00
|
|
|
|
{ Original ZP usage is 24.2B, but that's taken by Gigatron }
|
|
|
|
_XAML=$34 _XAML_MINUS1=$33
|
|
_XAMH=$35
|
|
_STL=$36 _STL_MINUS1=$35
|
|
_STH=$37
|
|
_L=$38 _L_MINUS1=$37
|
|
_H=$39
|
|
_YSAV=$3A
|
|
_MODE=$3B
|
|
|
|
{ Patches with respect to original are marked [Gigatron] }
|
|
|
|
_IN=$200
|
|
|
|
_KBD=$D010
|
|
_KBDCR=$D011
|
|
_DSP=$D012
|
|
_DSPCR=$D013
|
|
|
|
_RESET=* #_CLD_ { Clear decimal arithmetic mode. }
|
|
#_CLI_
|
|
#_LDYIM_ #$7F { Mask for DSP data direction register. }
|
|
#_STY_ ##_DSP
|
|
#_LDAIM_ #$A7 { KBD and DSP control register mask. }
|
|
#_STA_ ##_KBDCR
|
|
#_STA_ ##_DSPCR
|
|
_NOTCR=* #_CMPIM_ #$DF { "<-"? }
|
|
#_BEQ_ #@_BACKSPACE { Yes. }
|
|
#_CMPIM_ #$9B { ESC? }
|
|
#_BEQ_ #@_ESCAPE { Yes. }
|
|
#_INY_ { Advance text index. }
|
|
#_BPL_ #@_NEXTCHAR { Auto ESC if > 127. }
|
|
_ESCAPE=* #_LDAIM_ #$DC { "\". }
|
|
#_JSR_ ##_ECHO { Output it. }
|
|
_GETLINE=* #_LDAIM_ #$8D { CR. }
|
|
#_JSR_ ##_ECHO { Output it. }
|
|
#_LDYIM_ #$01 { Initiallize text index. }
|
|
_BACKSPACE=* #_DEY_ { Back up text index. }
|
|
#_BMI_ #@_GETLINE { Beyond start of line, reinitialize. }
|
|
_NEXTCHAR=* #_LDAIM_ #$00 { [Gigatron] A=0 to read keyboard. }
|
|
#_BRK_ { [Gigatron] Transfer to vCPU for input. }
|
|
#_ORAIM_ #$80 { [Gigatron] B7 should be '1'. }
|
|
#_BIT_ ##_KBD { [Gigatron] Was: LDA }
|
|
#_STAAY_ ##_IN { Add to text buffer. }
|
|
#_JSR_ ##_ECHO { Display character. }
|
|
#_CMPIM_ #$8D { CR? }
|
|
#_BNE_ #@_NOTCR { No. }
|
|
#_LDYIM_ #$FF { Reset text index. }
|
|
#_LDAIM_ #$00 { For XAM mode. }
|
|
#_TAX_ { 0->X. }
|
|
_SETSTOR=* #_ASLA_ { Leaves $7B if setting STOR mode. }
|
|
_SETMODE=* #_STAZ_ #_MODE { $00 = XAM, $7B= STOR,$AE= BLOK XAM }
|
|
_BLSKIP=* #_INY_ { Advance text index. }
|
|
_NEXTITEM=* #_LDAAY_ ##_IN { Get character. }
|
|
#_CMPIM_ #$8D { CR? }
|
|
#_BEQ_ #@_GETLINE { Yes, done this line. }
|
|
#_CMPIM_ #$AE { "."? }
|
|
#_BCC_ #@_BLSKIP { Skip delimiter. }
|
|
#_BEQ_ #@_SETMODE { Yes, BLOCK XAM mode. }
|
|
#_CMPIM_ #$BA { ":"? }
|
|
#_BEQ_ #@_SETSTOR { Yes, set STOR mode. }
|
|
#_CMPIM_ #$D2 { "R"? }
|
|
#_BEQ_ #@_RUN { Yes, run user program. }
|
|
#_STXZ_ #_L { $00->L. }
|
|
#_STXZ_ #_H { and H. }
|
|
#_STYZ_ #_YSAV { Save Y for comparison. }
|
|
_NEXTHEX=* #_LDAAY_ ##_IN { Get character for hex test. }
|
|
#_EORIM_ #$B0 { Map digits to $0-9. }
|
|
#_CMPIM_ #$0A { Digit? }
|
|
#_BCC_ #@_DIG { Yes. }
|
|
#_ADCIM_ #$88 { Map letter "A"-"F" to $FA-FF. }
|
|
#_CMPIM_ #$FA { Hex letter? }
|
|
#_BCC_ #@_NOTHEX { No, character not hex. }
|
|
_DIG=* #_ASLA_ { }
|
|
#_ASLA_ { Hex digit to MSD of A. }
|
|
#_ASLA_ { }
|
|
#_ASLA_ { }
|
|
#_LDXIM_ #$04 { Shift count. }
|
|
_HEXSHIFT=* #_ASLA_ { Hex digit left, MSB to carry. }
|
|
#_ROLZ_ #_L { Rotate into LSD. }
|
|
#_ROLZ_ #_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=* #_CPYZ_ #_YSAV { Check if L, H empty (no hex digits). }
|
|
#_BEQ_ #@_ESCAPE { Yes, generate ESC sequence. }
|
|
#_BITZ_ #_MODE { Test MODE byte. }
|
|
#_BVC_ #@_NOTSTOR { B6 = 0 for STOR, 1 for XAM and BLOCK XAM}
|
|
#_LDAZ_ #_L { LSD's of hex data. }
|
|
#_STAIX_ #_STL { Store at current 'store index'. }
|
|
#_INCZ_ #_STL { Increment store index. }
|
|
#_BNE_ #@_NEXTITEM { Get next item. (no carry). }
|
|
#_INCZ_ #_STH { Add carry to 'store index' high order. }
|
|
_TONEXTITEM=* #_JMP_ ##_NEXTITEM { Get next command item. }
|
|
_RUN=* #_JMI_ ##_XAML { Run at current XAM index. }
|
|
_NOTSTOR=* #_BMI_ #@_XAMNEXT { B7 = 0 for XAM, 1 for BLOCK XAM. }
|
|
#_LDXIM_ #$02 { Byte count. }
|
|
_SETADR=* #_LDAZX_ #_L_MINUS1 { Copy hex data to }
|
|
#_STAZX_ #_STL_MINUS1 { 'store index'. }
|
|
#_STAZX_ #_XAML_MINUS1 { And to 'XAM index'. }
|
|
#_DEX_ { Next of 2 bytes. }
|
|
#_BNE_ #@_SETADR { Loop unless X = 0. }
|
|
_NXTPRNT=* #_BNE_ #@_PRDATA { NE means no address to print. }
|
|
#_LDAIM_ #$8D { CR. }
|
|
#_JSR_ ##_ECHO { Output it. }
|
|
#_LDAZ_ #_XAMH { 'Examine index' high-order byte. }
|
|
#_JSR_ ##_PRBYTE { Output it in hex format. }
|
|
#_LDAZ_ #_XAML { Low-order 'examine index' byte. }
|
|
#_JSR_ ##_PRBYTE { Output it in hex format. }
|
|
#_LDAIM_ #$BA { ":". }
|
|
#_JSR_ ##_ECHO { Output it. }
|
|
_PRDATA=* #_LDAIM_ #$04 { [Gigatron] 4 pixels wide blank. }
|
|
#_JSR_ ##_BLANK { [Gigatron] Output it. }
|
|
#_LDAIX_ #_XAML { Get data byte at 'examine index'. }
|
|
#_JSR_ ##_PRBYTE { Output it in hex format. }
|
|
_XAMNEXT=* #_STXZ_ #_MODE { 0->MODE (XAM mode). }
|
|
#_LDAZ_ #_XAML { }
|
|
#_CMPZ_ #_L { Compare 'examine index' to hex data. }
|
|
#_LDAZ_ #_XAMH { }
|
|
#_SBCZ_ #_H { }
|
|
#_BCS_ #@_TONEXTITEM { Not less, so no more data to output. }
|
|
#_INCZ_ #_XAML { }
|
|
#_BNE_ #@_MOD8CHK { Increment 'examine index'. }
|
|
#_INCZ_ #_XAMH { }
|
|
_MOD8CHK=* #_LDAZ_ #_XAML { Check low-order 'examine index' byte }
|
|
#_ANDIM_ #$07 { For MOD 8= 0 }
|
|
#_BPL_ #@_NXTPRNT { Always taken. }
|
|
_PRBYTE=* #_PHA_ { Save A for LSD. }
|
|
#_LSRA_ { }
|
|
#_LSRA_ { }
|
|
#_LSRA_ { MSD to LSD position. }
|
|
#_LSRA_ { }
|
|
#_JSR_ ##_PRHEX { Output hex digit. }
|
|
#_PLA_ { Restore A. }
|
|
_PRHEX=* #_ANDIM_ #$0F { Mask LSD for hex print. }
|
|
#_ORAIM_ #$B0 { Add "0". }
|
|
#_CMPIM_ #$BA { Digit? }
|
|
#_BCC_ #@_ECHO { Yes, output it. }
|
|
#_ADCIM_ #$06 { Add offset for letter. }
|
|
_CHAROUT=*
|
|
_ECHO=* #_PHA_ { [Gigatron] }
|
|
#_BRK_ { [Gigatron] Transfer to vCPU for display.}
|
|
#_PLA_ { [Gigatron] }
|
|
#_RTS_ { [Gigatron] Return. }
|
|
_BLANK=* #_CLC_ { [Gigatron] Advance few pixels so BLOCK }
|
|
#_ADCZ_ #<Pos { [Gigatron] XAM doesn't wrap around }
|
|
#_STAZ_ #<Pos { [Gigatron] the 160 pixel wide screen. }
|
|
#_RTS_ { [Gigatron] }
|
|
#$00 { (unused) }
|
|
{FFFA} ##$0000 { (NMI) }
|
|
{FFFC} ##_RESET { (RESET) }
|
|
{FFFE} ##$0000 { (IRQ) }
|
|
|
|
{-----------------------------------------------------------------------+
|
|
| |
|
|
+-----------------------------------------------------------------------}
|
|
|