Rev 0.4 updates

Massive updates that changes the way most subroutines are handled. Major bugfixes, various utilities added, started higher-level libraries.
This commit is contained in:
nathanriggs 2019-04-26 18:49:10 -04:00
parent b3eda59f4f
commit c8cac53c5e
547 changed files with 140596 additions and 46490 deletions

Binary file not shown.

BIN
bin/d11_serial_prn.dsk Normal file

Binary file not shown.

BIN
bin/d12_sortsearch.dsk Normal file

Binary file not shown.

BIN
bin/d13_tmenus_twindows.dsk Normal file

Binary file not shown.

BIN
bin/d14_80col.dsk Normal file

Binary file not shown.

BIN
bin/d15_mockingboard.dsk Normal file

Binary file not shown.

BIN
bin/d16_dbl_lores.dsk Normal file

Binary file not shown.

Binary file not shown.

BIN
bin/d17_dbl_hires.dsk Normal file

Binary file not shown.

Binary file not shown.

BIN
bin/d19_demo_builds_1.dsk Normal file

Binary file not shown.

Binary file not shown.

BIN
bin/d20_demo_builds_2.dsk Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/d7_convert.dsk Normal file

Binary file not shown.

BIN
bin/d8_lores.dsk Normal file

Binary file not shown.

BIN
bin/d9_speaker.dsk Normal file

Binary file not shown.

View File

@ -1,8 +0,0 @@
10 HOME
20 PRINT "BUILDING EXEC FILE..."
30 PRINT CHR$ (4);"OPEN RUNDEMO.EXEC"
40 PRINT CHR$ (4);"WRITE RUNDEMO.EXEC"
50 PRINT "BLOAD FILEIO.DEMO"
60 PRINT "CALL -151"
70 PRINT "6000G"
80 PRINT CHR$ (4);"CLOSE RUNDEMO.EXEC"

View File

@ -1,30 +0,0 @@
5 HOME
8 ONERR GOTO 1000
10 PRINT "ASSEMBLY CODE MINIFIER"
20 PRINT "-=-=-=-=-=-=-=-=-=-=-="
30 PRINT
35 DIM FC$(1500):C = 0
40 INPUT "ENTER THE SOURCE FILE NAME: ";FF$
50 INPUT "ENTER THE DESTINATION FILE NAME: ";DD$
55 PRINT "WORKING.."
60 PRINT CHR$ (4);"OPEN ";FF$
70 PRINT CHR$ (4);"READ ";FF$
80 GET AA$
85 REM ? CHR$ (34);".";
90 IF AA$ = CHR$ (13) THEN GOTO 200
95 S$ = S$ + AA$
110 GOTO 80
200 IF LEFT$ (S$,1) = "*" OR LEFT$ (S$,1) = ";" THEN S$ = ""
500 FC$(C) = S$
510 S$ = ""
520 C = C + 1
990 GOTO 80
1000 PRINT : PRINT CHR$ (4);"CLOSE ";FF$
1010 PRINT CHR$ (4);"OPEN ";DD$
1020 PRINT CHR$ (4);"WRITE ";DD$
1030 FOR Z = 0 TO C
1040 IF FC$(Z) < > "" THEN PRINT FC$(Z)
1050 NEXT Z
1060 PRINT CHR$ (4);"CLOSE ";DD$
1070 PRINT "DONE!": PRINT : PRINT : PRINT
1080 PRINT CHR$ (7): PRINT CHR$ (7): PRINT CHR$ (7)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,153 +0,0 @@
AGET82
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :YIDX
PLA
STA :XIDX
PLA
STA ADDR1
PLA
STA ADDR1+1
DEC :XIDX
DEC :YIDX
LDY #2
LDA (ADDR1),Y ; ELEMENT LENGTH
STA :MCAND ; ELEMENT LENGTH
STA :ELEN
DEY
LDA (ADDR1),Y ; Y LENGTH
STA :YLEN
DEY
LDA (ADDR1),Y ; X LENGTH
STA :XLEN
LDA #0
STA :MCAND+1
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :XIDX ; IF X > MAX LEN
CMP :XLEN
BCS :XOVF
JMP :ERRCONT1
:XOVF
_ERR :E_SID;:E_XOVF;:E_DUMP;:XIDX;#15
:ERRCONT1
LDA :YIDX ; IF Y > MAX LEN
CMP :YLEN
BCS :YOVF
JMP :ERRCONT2
:YOVF
_ERR :E_SID;:E_YOVF;:E_DUMP;:XIDX;#15
:ERRCONT2
LDA :XIDX ; IF INDEX IS 0, ERR
CMP #255
BEQ :XOVF
:ERRCONT3
LDA :YIDX
CMP #255
BEQ :YOVF
:ERREND
LDA #0
TAY
STY SCRATCH
BEQ :ENTLP
:DOADD
CLC
ADC :YIDX
TAX
TYA
ADC SCRATCH
TAY
TXA
:LP
ASL :YIDX
ROL SCRATCH
:ENTLP
LSR :YLEN
BCS :DOADD
BNE :LP
STX :MLIER
STY :MLIER+1
CLC
LDA :MLIER
ADC :XIDX
STA :MLIER
BCC :CONTADD
LDA :MLIER+1
ADC #1
STA :MLIER+1
:CONTADD
LDA #0
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFTR LSR :MLIER+1
ROR :MLIER
BCC :ROTR
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROTR
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFTR
CLC
INC :PROD ; INCREASE BY 3
INC :PROD
INC :PROD
BCC :NOCAR
INC :PROD+1
:NOCAR
CLC
LDA :PROD
ADC ADDR1
STA :PROD
LDA :PROD+1
ADC ADDR1+1
STA :PROD+1
LDY :PROD
LDX :PROD+1
STY ADDR1
STX ADDR1+1
LDY #0
:RLP
LDA (ADDR1),Y
STA RETURN,Y
INY
CPY :ELEN
BNE :RLP
LDA :ELEN
STA RETLEN
LDA RETADR+1
PHA
LDA RETADR
PHA
LDA RETLEN
LDY ADDR1
LDX ADDR1+1
RTS
:XIDX DS 2
:YIDX DS 2
:XLEN DS 1
:YLEN DS 1
:PROD DS 4
:MLIER DS 2
:MCAND DS 2
:ELEN DS 1
:E_SID ASC "AGET82 (GET82 MACRO)",00
:E_DUMP ASC ":XIDX(2) :YIDX(2) :XLEN(1) :YLEN(1)"
ASC ":PROD(4) :MLIER(2) :MCAND(2) :ELEN(1)",00
:E_XOVF ASC "OUT OF BOUNDS! X > MAX OR IS 0.",00
:E_YOVF ASC "OUT OF BOUNDS! Y > MAX OR IS 0.",00

View File

@ -1,158 +0,0 @@
APUT82
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :YIDX ; Y INDEX
DEC :YIDX
PLA
STA :XIDX ; X INDEX
DEC :XIDX
PLA
STA ADDR4 ; ADDRESS OF ARRAY
PLA
STA ADDR4+1
PLA
STA ADDR3 ; ADDRESS OF DATA
PLA ; TO BE COPIED
STA ADDR3+1
LDY #2
LDA (ADDR4),Y
STA :ESIZE
STA :MCAND
LDA #0
STA :MCAND+1
LDY #0
LDA (ADDR4),Y
STA :XLEN
INY
LDA (ADDR4),Y
STA :YLEN
LDY #0
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :XIDX ; IF X > MAX LEN
CMP :XLEN
BCS :XOVF
JMP :ERRCONT1
:XOVF
_ERR :E_SID;:E_XOVF;:E_DUMP;:XIDX;#15
:ERRCONT1
LDA :YIDX ; IF Y > MAX LEN
CMP :YLEN
BCS :YOVF
JMP :ERRCONT2
:YOVF
_ERR :E_SID;:E_YOVF;:E_DUMP;:XIDX;#15
:ERRCONT2
LDA :XIDX ; IF INDEX IS 0, ERR
CMP #255
BEQ :XOVF
:ERRCONT3
LDA :YIDX
CMP #255
BEQ :YOVF
:ERREND
LDA #0
TAY
STY SCRATCH
BEQ :ENTLP
:DOADD
CLC
ADC :YIDX
TAX
TYA
ADC SCRATCH
TAY
TXA
:LP
ASL :YIDX
ROL SCRATCH
:ENTLP
LSR :YLEN
BCS :DOADD
BNE :LP
STX :MLIER
STY :MLIER+1
CLC
LDA :MLIER
ADC :XIDX
STA :MLIER
BCC :CONTADD
LDA :MLIER+1
ADC #1
STA :MLIER+1
:CONTADD
LDA #0
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFTR LSR :MLIER+1
ROR :MLIER
BCC :ROTR
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROTR
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFTR
CLC
INC :PROD ; INCREASE BY 3
INC :PROD
INC :PROD
BCC :NOCAR
INC :PROD+1
:NOCAR
CLC
LDA :PROD
ADC ADDR4
STA :PROD
LDA :PROD+1
ADC ADDR4+1
STA :PROD+1
LDA :PROD
LDY :PROD
LDX :PROD+1
STY ADDR2
STX ADDR2+1
LDY #0
LDX #0
:CLP
LDA (ADDR3),Y
STA (ADDR2),Y
INY
CPY :ESIZE
BNE :CLP
LDA RETADR+1
PHA
LDA RETADR
PHA
LDX ADDR2+1
LDY ADDR2
LDA :ESIZE
RTS
:ESIZE DS 1
:XIDX DS 1
:YIDX DS 1
:MCAND DS 2
:MLIER DS 2
:PROD DS 4
:XLEN DS 1
:YLEN DS 1
:E_SID ASC "APUT82 (PUT82 MACRO)",00
:E_DUMP ASC ":XIDX(1) :YIDX(1) :MCAND(2) :MLIER(2)"
ASC ":PROD(4) :XLEN(1) :YLEN(1)",00
:E_XOVF ASC "OUT OF BOUNDS! X > MAXIMUM OR IS 0.",00
:E_YOVF ASC "OUT OF BOUNDS! Y > MAX OR IS 0.",00

View File

@ -1,76 +0,0 @@
DIM81 MAC
LDA #>]1 ; ARRAY ADDR
PHA
LDA #<]1
PHA
LDA ]2 ; ARRAY LENGTH
PHA
LDA ]3 ; ELEMENT LENGTH
PHA
LDA ]4
PHA ; FILL VAL
JSR ADIM81
<<<
GET81 MAC
LDA #>]1 ; ARRAY ADDR
PHA
LDA #<]1
PHA
LDA ]2 ; ELEM INDEX
PHA
JSR AGET81
<<<
PUT81 MAC
LDA #>]1
PHA ; SRC ADDR
LDA #<]1
PHA
LDA #>]2 ; DEST ARRAY
PHA
LDA #<]2
PHA
LDA ]3 ; DEST INDEX
PHA
JSR APUT81
<<<
DIM82 MAC
LDA #>]1 ; ARRAY ADDR
PHA
LDA #<]1
PHA
LDA ]2 ; X DIM
PHA
LDA ]3 ; Y DIM
PHA
LDA ]4 ; ELEMENT LENGTH
PHA
LDA ]5 ; FILL VAL
PHA
JSR ADIM82
<<<
GET82 MAC
LDA #>]1 ; ARRAY ADDR
PHA
LDA #<]1
PHA
LDA ]2 ; X INDEX
PHA
LDA ]3 ; Y INDEX
PHA
JSR AGET82
<<<
PUT82 MAC
LDA #>]1 ; SRC ADDR
PHA
LDA #<]1
PHA
LDA #>]2 ; ARRAY ADDR
PHA
LDA #<]2
PHA
LDA ]3 ; X INDEX
PHA
LDA ]4 ; Y INDEX
PHA
JSR APUT82
<<<

View File

@ -1,37 +0,0 @@
COMP16
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :SUBT ; SUBTRAHEND
PLA
STA :SUBT+1
PLA
STA :MINU ; MINUEND
PLA
STA :MINU+1
LDA RETADR+1
PHA
LDA RETADR
PHA
LDA :MINU
CMP :SUBT ; COMPARE LOW BYTES
BEQ :EQUAL
LDA :MINU+1
SBC :SUBT+1 ; COMPARE HIGH BYTES
ORA #1 ; MAKE Z=0, SINCE LOW
; BYTES ARE NOT EQUAL
BVS :OVFLOW ; MUST HANDLE OVERFLOW
RTS ; EXIT
:EQUAL
LDA :MINU+1
SBC :SUBT+1 ; UPPER BYTES
BVS :OVFLOW
RTS ; RETURN W FLAGS SET
:OVFLOW
EOR #$80 ; COMPLEMENT N FLAG
ORA #1 ; IF OVERFLOW THEN THE
RTS
:MINU DS 2
:SUBT DS 2

View File

@ -1,29 +0,0 @@
DELAYMS
MSCNT EQU $0CA ; 202 TIMES THROUGH DELAY1
; SPECIFIC TO 1.23 MHZ
; SPEED OF APPLE II
:DELAY
CPY #0 ; 2 CYCLES
BEQ :EXIT ; 2C (EXIT IF DEL=0)
NOP ; 2 CYCLES (MAKE OVERHEAD=25C)
CPY #1 ; 2 CYCLES
BNE :DELAYA ; 3C IF TAKEN, ELSE 2C
JMP :LAST1 ; 3C
:DELAYA
DEY ; 2C (PREDEC Y)
:DELAY0
LDX #MSCNT ; 2C
:DELAY1
DEX ; 2C
BNE :DELAY1 ; 3C
NOP ; 2C
NOP ; 2C
DEY ; 2C
BNE :DELAY0 ; 3C
:LAST1
LDX #MSCNT-3 ; 2C
:DELAY2
DEX ; 2C
BNE :DELAY2 ; 3C
:EXIT
RTS ; 6C

View File

@ -1,33 +0,0 @@
DIVD8
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :DVEND
PLA
STA :DVSOR
LDA #$00
LDY #8
ASL :DVSOR
:L1 ROL
CMP :DVEND
BCC :L2
SBC :DVEND
:L2 ROL :DVSOR
DEY
BNE :L1
STA :REM
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY :REM ; REMAINDER TO Y
LDA #1
STA RETLEN
LDA :DVSOR
STA RETURN
RTS
:REM DS 1
:DVEND DS 1
:DVSOR DS 1

View File

@ -1,31 +0,0 @@
DOSCMD
PLA
STA RETADR
PLA
STA RETADR+1
LDA #$8D
JSR FCOUT
LDA #$84 ; CTRL-D
JSR FCOUT
LDA #1
STA $AAB6 ; DOS LANG FLAG
STA $75+1 ; NOT DIRECT MODE
STA $33 ; NOT DIRECT MODE
LDY #$01 ; POINT TO NEXT INSTR
:LP
LDA (RETADR),Y
BEQ :DONE
JSR FCOUT
INY
BNE :LP
:DONE
CLC ; RESTORE INSTR POINTER
TYA
ADC RETADR
STA RETADR
LDA RETADR+1
ADC #$00
PHA
LDA RETADR
PHA
RTS

View File

@ -1,420 +0,0 @@
********************************
* *
* MAZE GENERATOR *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP OFF
DSK MAKEMAZE
TR ON
OBJ $BFE0
ORG $6000
*
PUT REQUIRED.VARS
USE REQUIRED.MAC.MIN
USE ARRAYS.MAC.MIN
USE MATH.MAC.MIN
USE STDIO.MAC.MIN
PUT REQUIRED.HOOKS.MIN
PUT STDIO.HOOKS
PUT MATH.HOOKS
PUT ARRAYS.HOOKS
*
********************************
* *
* CONSTANT DECLARATIONS *
* *
********************************
*
BAS EQU $2000 ; BASE ADDRESS FOR ARRAYS
*
** NOTE THAT XLEN AND YLEN CANNOT EXCEED 13, AS THIS
** WOULD MAKE THE ARRAY SIZES >256, WHICH ISN'T
** WHAT 8-BIT ARRAYS ARE PREPARED TO HANDLE.
*
** THE NEXT UPDATE WILL UTILIZE 16-BIT ARRAYS
** TO ADDRESS THIS PROBLEM.
*
XLEN KBD "ENTER MAZE SIZE (<14)"
YLEN EQU XLEN ; CURRENT ALGO ONLY DOES SQUARE
XMAX EQU XLEN+2 ; ADD EXTRA COLUMN
YMAX EQU YLEN+2 ; ADD EXTRA ROW
XNUM EQU 2*XLEN+2
ASZ EQU XMAX*YMAX+4 ; ARRAY SIZE+INFO BYTES
XSTAKS EQU ASZ ; COLUMN STACK SIZE; X * Y + 1
YSTAKS EQU ASZ ; ROW STACK SIZE; X * Y + 1
*
SOUTHW EQU BAS ; SOUTH WALLS ARRAY
WESTW EQU ASZ+BAS ; WEST WALLS ARRAY
VISITED EQU 2*ASZ+BAS ; CELLS VISITED
XSTACK EQU 3*ASZ+BAS ; STACK FOR COLUMNS
YSTACK EQU 4*ASZ+BAS ; STACK FOR ROWS
*
********************************
* *
* MAIN PROGRAM LOOP *
* *
********************************
*
INIT
*
*LDA #0
*STA ERRCTRL ; TURN OFF ERRORS
JSR HOME
PRN "INITIALIZING...",8D
*
JSR :SETVARS
JSR :OUTWALLS
*
** GET RANDOM STARTING POINT
*
RNDB #2;#XLEN
STA XX
RNDB #2;#YLEN
STA YY
*
JMP BUILD
*
********************************
*
:SETVARS
*
** DIM ARRAYS AND FILL
*
DIM82 SOUTHW;#XMAX;#YMAX;#1;#1
DIM82 WESTW;#XMAX;#YMAX;#1;#1
DIM82 VISITED;#XMAX;#YMAX;#1;#0
DIM81 XSTACK;#XSTAKS;#1;#0
DIM81 YSTACK;#YSTAKS;#1;#0
*
** NOW ASSIGN VARIABLE VALUES
*
LDA #0
STA SPTR
STA V0
LDA #1
STA V1
RTS
*
********************************
*
:OUTWALLS
*
** MAKE COLUMN MIN AND MAX TO BE ALL
** WALL (CODE: 1).
*
LDA #0 ; SO X,Y WILL INC TO 1
STA XX
STA YY
*
:COLEDGE
INC XX
PUT82 V1;VISITED;XX;#1
PUT82 V1;VISITED;XX;#YMAX
LDA XX
CMP #XMAX
BNE :COLEDGE
*
** MAKE MIN AND MAX ROWS TO BE ALL WALL
*
:ROWEDGE
INC YY
PUT82 V1;VISITED;#1;YY
PUT82 V1;VISITED;#XMAX;YY
LDA YY
CMP #YMAX
BNE :ROWEDGE
RTS
*
********************************
* *
* BUILD THE MAZE *
* *
********************************
*
BUILD
*
PRN "BUILDING MAZE...",8D8D
*
********************************
*
STAKPUSH
*
INC SPTR
PUT81 XX;XSTACK;SPTR ; PUT COL ON STACK
PUT81 YY;YSTACK;SPTR ; PUT ROW ON STACK
PUT82 V1;VISITED;XX;YY ; MARK BLOCK AS VISITED
*
********************************
*
CHECKALL
*
** CHECKS ALL ADJACENT BLOCKS FOR A WALL. IF
** COMPLETELY SURROUNDED, POP THE STACK AND
** AND START OVER UNTIL.
*
LDA YY ; STORE VALUES FOR
STA YP1 ; CURRENT ROW MINUS ONE
STA YM1 ; AND CURRENT ROW PLUS
LDA XX ; ONE, THEN DO THE SAME
STA XP1 ; FOR COLUMNS
STA XM1
*
INC YP1
INC XP1
DEC XM1
DEC YM1
*
:_IF1 ; IF VISITED(XX,Y+1) == 1
GET82 VISITED;XX;YP1
LDA RETURN
CMP #1
BEQ :_IF2 ; IF CELL BELOW IS A WALL
; CONTINUE TESTING OTHER
; ADJACENT CELLS
JMP DOMOVE ; OTHERWISE, EXIT CONDITIONAL
:_IF2 ; AND VISITED(X+1,Y) == 1
*
GET82 VISITED;XP1;YY
LDA RETURN
CMP #1 ; TEST RIGHT CELL
BEQ :_IF3
JMP DOMOVE
*
:_IF3 ; AND IF VISITED(X,Y-1) == 1
LDA YM1
CMP #0 ; TEST FOR Y=0 TO OVOID
BNE :IF3C ; OUT OF BOUNDS ERROR
JMP :_IF4
:IF3C
GET82 VISITED;XX;YM1
LDA RETURN
CMP #1 ; TEST CELL ABOVE
BEQ :_IF4
JMP DOMOVE
*
:_IF4 ; AND IF VISITED(X-1,Y) == 1
GET82 VISITED;XM1;YY
LDA RETURN
CMP #1 ; THEN POP STACKS UNTIL DONE
BEQ :POP
*
JMP DOMOVE ; OTHERWISE, EXIT ROUTINE
*
********************************
*
:POP
*
GET81 XSTACK;SPTR
LDA RETURN
STA XX
GET81 YSTACK;SPTR
LDA RETURN
STA YY
DEC SPTR ; POP
LDA SPTR
CMP #1 ; IF STILL MORE ON STACK
BCS :DOREPEAT
JMP DISPMAZE ; OTHERWISE, FINISHED!
*
:DOREPEAT
JMP CHECKALL
*
********************************
*
DOMOVE
*
** MOVE IN A RANDOM DIRECTION
*
JSR RAND8
CMP #64 ; IF RND < 64
BCC :MVDOWN
CMP #128 ; ELSE IF RND < 128
BCC :MVRIGHT
CMP #192 ; ELSE IF RND < 192
BCC :MVUP
JMP :MVLEFT ; ELSE RND IS > 191
*
:MVDOWN
GET82 VISITED;XX;YP1
LDA RETURN
CMP #0 ; IF NOT A WALL
BEQ :DOWNGO
JMP DOMOVE
:DOWNGO ; THEN MOVE THERE
PUT82 V0;SOUTHW;XX;YY
INC YY
JMP STAKPUSH
:MVRIGHT
GET82 VISITED;XP1;YY
LDA RETURN
CMP #0
BEQ :RIGHTGO
JMP DOMOVE
:RIGHTGO
PUT82 V0;WESTW;XP1;YY
INC XX
JMP STAKPUSH
*
:MVUP
LDA YM1
CMP #0
BEQ :UPNO
GET82 VISITED;XX;YM1
LDA RETURN
CMP #0
BEQ :UPGO
:UPNO
JMP DOMOVE
:UPGO
PUT82 V0;SOUTHW;XX;YM1
DEC YY
JMP STAKPUSH
*
:MVLEFT
GET82 VISITED;XM1;YY
LDA RETURN
CMP #0
BEQ :LEFTGO
JMP DOMOVE
:LEFTGO
PUT82 V0;WESTW;XX;YY
DEC XX
JMP STAKPUSH
*
********************************
* *
* DISPLAY THE MAZE *
* *
********************************
*
DISPMAZE
*
** SEND MAZE TO DISPLAY OUTPUT, FORMATTED
*
PRN "PRINTING...",8D
PRN " ",8D
LDA #1
STA XX
:XLOOP
INC XX
PRN "X"
LDA XX
CMP #XNUM
BNE :XLOOP
PRN " ",8D
*
LDA #2
STA XX
STA YY
WLP
*
** IF WESTW(X,Y) == 0
*
GET82 WESTW;XX;YY
LDA RETURN
CMP #0
BEQ NOWALLW ; THEN PRINT ...
YESWALLW ; ELSE PRINT X..
PRN "X "
JMP CONTWLP
NOWALLW
PRN " "
*
CONTWLP
INC XX
LDA XX
CMP #XMAX
BEQ :ENDWLP
JMP WLP
*
:ENDWLP
PRN "X",8D ; NEXT LINE
*
LDA #2
STA XX ; RECYCLING
*
** IF SOUTHW(X,Y) == 0
*
SLP
GET82 SOUTHW;XX;YY
LDA RETURN
CMP #0
BEQ NOSOUTH ; THEN PRINT X..
YSOUTH ; ELSE PRINT XXX
PRN "XX"
JMP CONTSLP
NOSOUTH
PRN "X "
CONTSLP
INC XX
LDA XX
CMP #XMAX
BEQ :ENDSLP
JMP SLP
:ENDSLP
*
PRN "X",8D
*
LDA #2
STA XX
INC YY
LDA YY
CMP #YMAX
BEQ DISPEXIT
JMP WLP
*
DISPEXIT
*
_WAIT
JMP REENTRY
*
********************************
* *
* VARIABLES *
* *
********************************
*
V0 DS 1 ; USED BECAUSE OF CURRENT
V1 DS 1 ; ARRAY DIM LIMITATIONS
*
XX DS 1 ; CURRENT COLUMN
YY DS 1 ; CURRENT ROW
SPTR DS 1 ; ARRAY STACK POINTER
XP1 DS 1 ; X PLUS ONE
XM1 DS 1 ; X MINUS ONE
YP1 DS 1 ; Y PLUS ONE
YM1 DS 1 ; Y MINUS ONE
*
********************************
* *
* LOW-LEVEL ROUTINES *
* *
********************************
*
PUT REQUIRED.LIB.MIN
*
** INDIVIDUAL SUBROUTINES
*
** ARRAYS
*
PUT ADIM81.SUB.MIN
PUT ADIM82.SUB.MIN
PUT AGET81.SUB.MIN
PUT AGET82.SUB.MIN
PUT APUT81.SUB.MIN
PUT APUT82.SUB.MIN
*
** MATH
*
PUT RAND8.SUB.MIN
PUT RANDB.SUB.MIN
*
** STDIO
*
PUT DPRINT.SUB.MIN
PUT XPRINT.SUB.MIN
*

View File

@ -1,43 +0,0 @@
MEMFILL
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :VALUE
PLA
STA :ARYSZ
PLA
STA :ARYSZ+1
PLA
STA ADDR1 ; ZERO PAGE POINTER
PLA ; DEFINED IN
STA ADDR1+1 ; DECS
LDA :VALUE ; GET VAL FOR FILL
LDX :ARYSZ+1 ; X=# OF PAGES TO DO
BEQ :PARTPG ; BRANCH IF HIGHBYTE OF SZ = 0
LDY #0
:FULLPG
STA (ADDR1),Y
INY ; INC TO NEXT BYTE
BNE :FULLPG ; BRANCH IF NOT DONE W/ PAGE
INC ADDR1+1 ; ADVANCE TO NEXT PAGE
DEX
BNE :FULLPG ; BRANCH IF NOT DONE W/ PAGES
:PARTPG
LDX :ARYSZ ;GET # OF BYTES IN FINAL PAGE
BEQ :EXIT ; BRANCH IF LOW BYTE = 0
LDY #0
:PARTLP
STA (ADDR1),Y ; STORE VAL
INY ; INCREMENT INDEX
DEX ; DECREMENT COUNTER
BNE :PARTLP ; BRANCH IF NOT DONE
:EXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
RTS
:VALUE DS 1 ; FILL VALUE
:ARYSZ DS 2 ; ARRAY SIZE

View File

@ -1,101 +0,0 @@
MEMMOVE
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :MVELEN
PLA
STA :MVELEN+1
PLA
STA ADDR2 ; ZERO PAGE POINTER
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA ADDR2 ;CALC DEST-SRC
SEC
SBC ADDR1
TAX
LDA ADDR2+1
SBC ADDR1+1 ; MOD 64K AUTOMATIC
; -- DISCARD CARRY
TAY
TXA ; CMP WITH # OF BYTES TO MOVE
CMP :MVELEN
TYA
SBC :MVELEN+1
BCS :DOLEFT ; BRANCH IF NO OVERLAP
JSR :MVERHT
JMP :EXIT
:DOLEFT
JSR :MVELEFT
:EXIT
JMP :MREXIT
:MVELEFT
LDY #0 ; ZERO INDEX
LDX :MVELEN+1 ; X=# OF FULL PP TO MOVE
BEQ :MLPART ; IF X=0, DO PARTIAL PAGE
:MLPAGE
LDA (ADDR1),Y
STA (ADDR2),Y ;MOVE ONE BYTE
INY ; NEXT BYTE
BNE :MLPAGE ; CONT UNTIL 256B MOVED
INC ADDR1+1 ; ADV TO NEXT SRC PAGE
INC ADDR2+1 ; ADV NEXT DEST PAGE
DEX ; DEC PAGE COUNT
BNE :MLPAGE ; CONT UNTIL ALL FULL
; PAGES ARE MOVED
:MLPART
LDX :MVELEN ; GET LENGTH OF LAST PAGE
BEQ :MLEXIT ; BR IF LENGTH OF LAST
; PAGE = 0
; REG Y IS 0
:MLLAST
LDA (ADDR1),Y
STA (ADDR2),Y ; MOVE BYTE
INY ; NEXT BYTE
DEX ; DEC COUNTER
BNE :MLLAST ; CONT UNTIL LAST P DONE
:MLEXIT
JMP :MREXIT
:MVERHT
LDA :MVELEN+1
CLC
ADC ADDR1+1
STA ADDR1+1 ;POINT TO LAST P OF SRC
LDA :MVELEN+1
CLC
ADC ADDR2+1
STA ADDR2+1 ; POINT TO LAST P OF DEST
LDY :MVELEN ;GET LENGTH OF LAST PAGE
BEQ :MRPAGE ; IF Y=0 DO THE FULL PAGES
:MR0
DEY ; BACK UP Y TO NEXT BYTE
LDA (ADDR1),Y
STA (ADDR2),Y ; MOVE BYTE
CPY #0
BNE :MR0 ; BR IF NOT DONE W LAST P
:MRPAGE
LDX :MVELEN+1 ; GET BYTE OF COUNT AS P CT
BEQ :MREXIT ; BR IF HYBYTE = 0 (NO FULL P)
:MR1
DEC ADDR1+1 ; BACK UP TO PREV SRC PAGE
DEC ADDR2+1 ; AND DEST
:MR2
DEY ; BACK UP Y TO NEXT BYTE
LDA (ADDR1),Y
STA (ADDR2),Y ; MOVE BYTE
CPY #0
BNE :MR2 ; BR IF NOT DONE W THIS PAGE
DEX
BNE :MR1 ; BR IF NOT ALL PAGES MOVED
:MREXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
RTS
:MVELEN DS 2

View File

@ -1,86 +0,0 @@
MEMSWAP
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :LENGTH
PLA
STA ADDR1
STA :A1
PLA
STA ADDR1+1
STA :A1+1
PLA
STA ADDR2
STA :A2
PLA
STA ADDR2+1
STA :A2+1
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA ADDR2+1 ; IF #>A2 => #>A1
CMP ADDR1+1
BCS :CHKLO ; CHECK LOW BYTES
JMP :A1GTA2 ; ELSE, A1 > A2
:CHKLO
LDA ADDR2
CMP ADDR1
BCS :A2GTA1
JMP :A1GTA2
:A2GTA1
LDA ADDR2 ;CALC DEST-SRC
SEC
SBC ADDR1
TAX
LDA ADDR2+1
SBC ADDR1+1 ; MOD 64K AUTOMATIC
; -- DISCARD CARRY
TAY
TXA ; CMP WITH # OF BYTES TO MOVE
CMP :LENGTH
TYA
SBC :LENGTH+1
BCS :ERREND ; BRANCH IF NO OVERLAP
JMP :OVF
:A1GTA2
LDA ADDR1
SEC
SBC ADDR2
TAX
LDA ADDR1+1
SBC ADDR2+1
TAY
TXA
CMP :LENGTH
TYA
SBC :LENGTH+1
BCS :ERREND
:OVF
_ERR :E_SID;:E_OVF;:E_DUMP;:LENGTH;#6
:ERREND
LDY #255 ; COUNTER
:LP
INY
LDA (ADDR1),Y
TAX ; X CONTAINS ADDR1 VAL
LDA (ADDR2),Y ; A CONTAINS ADDR2 VAL
STA (ADDR1),Y
TXA
STA (ADDR2),Y
CPY :LENGTH
BNE :LP
LDA RETADR+1
PHA
LDA RETADR
PHA
RTS
:LENGTH DS 2
:A1 DS 2
:A2 DS 2
:E_SID ASC "MEMSWAP (MSWAP MACRO)",00
:E_DUMP ASC "DUMPING LENGTH (2) A1(2) A2(2)",00
:E_OVF ASC "OVERFLOW! ADDRESSES OVERLAP.",00

View File

@ -1,59 +0,0 @@
MULT16
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :MLIER
PLA
STA :MLIER+1
PLA
STA :MCAND
PLA
STA :MCAND+1
LDA #0
STA :HPROD ; ZERO HIGH WORD
STA :HPROD+1
LDX #17 ; # OF BITS IN MPLIER
; PLUS 1. EXTRA LOOP IS
; TO MOVE LAST CARRY INTO
; THE PRODUCT.
CLC ; CLEAR CARRY FOR 1ST TIME
; THROUGH LOOP.
:MULLP
ROR :HPROD+1
ROR :HPROD
ROR :MLIER+1
ROR :MLIER
BCC :DECCNT ; BR IF NEXT BIT OF
CLC ; NEXT BIT=1 SO ADD MCAND
LDA :MCAND
ADC :HPROD
STA :HPROD
LDA :MCAND+1
ADC :HPROD+1
STA :HPROD+1 ; CARRY = OVERFLOW
:DECCNT
DEX
BNE :MULLP ; CONTINUE UNTIL DONE
LDY :HPROD ; LOW BYTE OF HIGH WORD
LDX :HPROD+1 ; HIGH BYTE OF HIGH WORD
LDA :MLIER+1
TAX
STX RETURN+1
LDA :MLIER
TAY
STY RETURN
LDA :HPROD
STA RETURN+2
LDA #2
STA RETLEN
LDA RETADR+1
PHA
LDA RETADR
PHA
LDA :HPROD ;24BIT
RTS
:MCAND DS 3
:MLIER DS 3
:HPROD DS 2

View File

@ -1,97 +0,0 @@
NUM2STR
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :VALSTR
PLA
STA :VALSTR+1
STA :NGFLAG
BPL :GETBP ; BR IF VAL IS POS
LDA #0
SEC
SBC :VALSTR
STA :VALSTR
LDA #0
SBC :VALSTR+1
STA :VALSTR+1
:GETBP
LDA #<RETURN
STA ADDR1 ; ADDRESS TO STORE STRING
LDA #>RETURN+1
STA ADDR1+1
LDA #0 ; SET BUFFER TO EMPTY
LDY #0
STA (ADDR1),Y ; BUFFER(0) = 0
:CNVERT
LDA #0
STA :MOD10
STA :MOD10+1
LDX #16
CLC ; CLEAR CARRY
:DVLOOP
ROL :VALSTR ; SHIFT CARRY INTO DIVBIT 0
ROL :VALSTR+1 ; WHICH WILL BE THE QUOTIENT
ROL :MOD10 ; + SHIFT DIV AT SAME TIME
ROL :MOD10+1
SEC
LDA :MOD10
SBC #10
TAY ; SAVE LOWB IN REG Y
LDA :MOD10+1
SBC #0 ; SUBTRACT CARRY
BCC :DECCNT ; BR IF DEND < DIVISOR
STY :MOD10 ; ELSE
STA :MOD10+1 ; NXT BIT OF Q IS A ONE AND SET
; DIVIDEND = DEND - DIVISOR
:DECCNT
DEX
BNE :DVLOOP
ROL :VALSTR ; SHIFT IN LAST CARRY FOR Q
ROL :VALSTR+1
:CONCH
LDA :MOD10
CLC
ADC #$B0
JSR :CONCAT
LDA :VALSTR
ORA :VALSTR+1
BNE :CNVERT ; BR IF VALUE != 0
:EXIT
LDA :NGFLAG
BPL :POS ; BR IF ORIG VAL POS
LDA #173 ; ELSE
JSR :CONCAT ; PUT A MINUS SIGN IN FRONT
:POS
LDA RETADR+1
PHA
LDA RETADR
PHA
RTS ; RETURN
:CONCAT
PHA ; SAVE CHAR ON STACK
LDY #0
LDA (ADDR1),Y ; GET CURRENT LENGTH
TAY
BEQ :EXITMR ; BR IF LENGTH=0
:MVELP
LDA (ADDR1),Y ; GET NEXT CHAR
INY
STA (ADDR1),Y ; STORE IT
DEY
DEY
BNE :MVELP ; CONT UNTIL DONE
:EXITMR
PLA ; GET CHAR BACK FROM STACK
LDY #1
STA (ADDR1),Y ; STORE THE CHAR
LDY #0
LDA (ADDR1),Y ; GET LENGTH BYTE
CLC
ADC #1 ; INC LENGTH BY ONE
STA (ADDR1),Y ; UPDATE LENGTH
RTS
:NGFLAG DS 1
:VALSTR DS 2
:MOD10 DS 2

View File

@ -1,34 +0,0 @@
RAND16
LDA RNDL
STA :SEED
LDA RNDH
STA :SEED+1
LDA :SEED
BEQ :LOW0
ASL :SEED
LDA :SEED+1
ROL
BCC :NOEOR
:DOEOR ; HIGH BYTE IN A
EOR #>$0369
STA :SEED+1
LDA :SEED
EOR #<$0369
STA :SEED
JMP :EXIT
:LOW0
LDA :SEED+1
BEQ :DOEOR
ASL
BEQ :NOEOR
BCS :DOEOR
:NOEOR
STA :SEED+1
:EXIT LDX :SEED+1
LDY :SEED
STY RETURN
STX RETURN+1
LDA #2
STA RETLEN
RTS
:SEED DS 2

View File

@ -1,94 +0,0 @@
_ISLIT MAC
IF #=]1 ; IF ]1 IS A LITERAL
LDA ]1/$100 ; GET HI
PHA
LDA ]1 ; GET LO
PHA
ELSE ; ]1 IS ADDRESS
LDA ]1+1 ; SO GET HIGH VAL FROM ADDR
PHA
LDA ]1 ; THEN LO VAL
PHA
FIN
<<<
_ISSTR MAC
IF "=]1 ; IF ]1 IS A STRING
JMP STRCONT
]STRTMP STR ]1
STRCONT
LDY #0
LDA ]STRTMP
STA PARLEN
STA PARAM
]STRLP1
INY
LDA ]STRTMP,Y
STA PARAM,Y
CPY PARLEN
BNE ]STRLP1
LDA #>PARAM ; GET HI
PHA
LDA #<PARAM ; GET LO
PHA
ELSE ; ]1 IS ADDRESS
LDA #>]1 ; SO GET HIBYTE OF ADDR
PHA
LDA #<]1 ; THEN LOBYTE
PHA
FIN
<<<
_GRET MAC
LDA #>]1
PHA
LDA #<]1
PHA
JSR __GETRET
<<<
_SPAR MAC
LDA #>]1
PHA
LDA #<]1
PHA
JSR __SETPARM
<<<
_DUMP MAC
LDA #>]1
PHA
LDA #<]1
PHA
LDA ]2
PHA
JSR __DUMP
<<<
_PRNT MAC
JSR __P
ASC ]1
HEX 00
<<<
_WAIT MAC
JSR __W
<<<
_RDUMP MAC
JSR __RDMP
<<<
_ERR MAC
LDA #>]1
PHA
LDA #<]1
PHA
LDA #>]2
PHA
LDA #<]2
PHA
LDA #>]3
PHA
LDA #<]3
PHA
LDA #>]4
PHA
LDA #<]4
PHA
LDA ]5
PHA
JSR __ERR
<<<

View File

@ -1,27 +0,0 @@
SINPUT
PLA
STA RETADR
PLA
STA RETADR+1
LDX #$00
JSR GETLN
STX :STRLEN ; STORE STR LENGTH
CPX #0
BEQ :EXIT
:INP_CLR
LDY #0
LDA :STRLEN ; LENGTH OF STRING
STA RETLEN,Y ; PUT LENGTH
:LOOP
LDA KEYBUFF,Y ; PUT STR INTO NEW LOC
STA RETURN,Y
INY
CPY :STRLEN ; IF Y < STR LENGTH
BNE :LOOP ; LOOP; ELSE, CONTINUE
:EXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
RTS
:STRLEN DS 1

View File

@ -1,118 +0,0 @@
STR2NUM
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR1 ; ADRESS OF STRING
PLA ; TO CNVERT
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
TAX ; GET LENGITH; TO REGX
LDA #1
STA :NINDEX ; INDEX = 1
LDA #0
STA :NACCUM ; ACCUM = 0
STA :NACCUM+1
STA :SNGFLAG ; SIGN IS POSITIVE
TXA
BNE :INIT1 ; EXIT WITH ACCUM = 0
; IF BUFFER IS EMPTY
JMP :EREXIT ; ERROR EXIT IF NOTHING
; IN BUFFER
:INIT1
LDY :NINDEX
LDA (ADDR1),Y
CMP #173
BNE :PLUS ; BR IF NOT -
LDA #$0FF
STA :SNGFLAG ; ELSE SIGN IS NEGATIVE
INC :NINDEX
DEX ; DECREMENT COUNT
BEQ :EREXIT ; ERROR EXIT IF ONLY
; - IN BUFFER
JMP :CNVERT
:PLUS
CMP #'+'
BNE :CHKDIG ; START CONVERSION IF 1ST
INC :NINDEX
DEX ; DEC COUNT; IGNORE + SIGN
BEQ :EREXIT ; ERROR EXIT IF ONLY
; + IN THE BUFFER
:CNVERT
LDY :NINDEX
LDA (ADDR1),Y
; GET NEXT CHAR
:CHKDIG
CMP #$B0 ; "0"
BMI :EREXIT ; ERROR IF NOT A NUMERAL
CMP #$BA ; '9'+1; TECHNICALLY :
BPL :EREXIT ; ERR IF > 9 (NOT NUMERAL)
PHA ; PUSH DIGIT TO STACK
ASL :NACCUM
ROL :NACCUM+1 ; TIMES 2
LDA :NACCUM
LDY :NACCUM+1 ; SAVE ACCUM * 2
ASL :NACCUM
ROL :NACCUM+1
ASL :NACCUM
ROL :NACCUM+1 ; TIMES 8
CLC
ADC :NACCUM ; SUM WITH * 2
STA :NACCUM
TYA
ADC :NACCUM+1
STA :NACCUM+1 ; ACCUM=ACCUM * 10
PLA ; GET THE DIGIT NACK
SEC
SBC #$B0
CLC ; CONVERT STR TO BIN
ADC :NACCUM
STA :NACCUM
BCC :D2B1 ; BRANCH IF NO CARRY TO HBYTE
INC :NACCUM+1 ; ELSE INC HIGH BYTE
:D2B1
INC :NINDEX ;INC TO NEXT CHARACTER
DEX
BNE :CNVERT ; CONTINUE CONVERSION
LDA :SNGFLAG
BPL :OKEXIT ; BR IF VAL IS POSITIVE
LDA #0 ; ELSE REPLACE WITH -RESULT
SEC
SBC :NACCUM
STA :NACCUM
LDA #0
SBC :NACCUM+1
STA :NACCUM+1
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
_ERR :E_SID;:E_MSG;:E_DUMP;:NACCUM;#4
:ERREND
:EXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
LDX :NACCUM+1
LDY :NACCUM
STY RETURN
STX RETURN+1
LDA #2
STA RETLEN
LDA :NINDEX
RTS
:NACCUM DS 2
:SNGFLAG DS 1
:NINDEX DS 1
:E_SID ASC "STR2NUM (S2N MACRO)",00
:E_MSG ASC "ERR! NO DATA, OR NOT A NUMERAL VALUE",00
:E_DUMP ASC "DUMPING :NACCUM(2) :SNGFLAG(1) :NINDEX(1)",00

View File

@ -1,94 +0,0 @@
STRCAT
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :MLEN ; MAXIMUM CONCAT LENGTH
PLA
STA ADDR2 ; STRING 1 ADDRESS
PLA ; IN ZERO PAGE
STA ADDR2+1
PLA
STA ADDR1 ; STRING 2 ADDRESS
PLA ; IN ZERO PAGE
STA ADDR1+1
LDY #0
LDA (ADDR1),Y ; GET CUR LGTH OF S1, STORE
STA :S1LEN
STA :S1IND
INC :S1IND ; START CONCAT AT END OF S1
LDA (ADDR2),Y ; GET LENGTH OF S2, STORE
STA :S2LEN
LDA #1
STA :S2IND ; START CONCAT AT BEGIN OF S2
LDA :S2LEN ; GET S2 LENGTH
CLC
ADC :S1LEN ; ADD TO LENGTH OF S1
STA :S3LEN ; STORE CONCAT LENGTH
BCS :TOOLONG ; BR IF LENGTH > 255
CMP :MLEN ; CHECK AGAINST MAX LENGTH
BEQ :LENOK ; BR IF LENGTH < MAX
BCC :LENOK
:TOOLONG
LDA #$0FF
STA :SOVF ; INDICATE OVERFLOW
LDA :MLEN
SEC
SBC :S1LEN
BCC :EXIT
STA :SCNT ; ORIG STR WAS TOO LONG
LDA :MLEN
STA :S1LEN ; SET STR1 LENGTH TO MAX
JMP :DOCAT
:LENOK
STA :S1LEN
LDA #0 ; SAVE SUM OF 2 LENGTHS
STA :SOVF ; INDICATE NO OVERFLOW
LDA :S2LEN
STA :SCNT ; COUNT = LENGTH OF STRING 2
:DOCAT
LDA :SCNT
BEQ :EXIT ; EXIT IF NO BYTES LEFT
:CATLP
LDY :S2IND
LDA (ADDR2),Y ; GET NEXT BYTE FROM S2
LDY :S1IND
STA (ADDR1),Y ; MOVE IT TO END OF STR 1
INC :S1IND ;INC STRING 1 INDEX
INC :S2IND ; INC STRING 2 INDEX
DEC :SCNT ; DECREMENT COUNTER
BNE :CATLP ; CONT UNTIL __SCNT = 0
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY #0
LDA (ADDR1),Y ; LENGTH OF STRING
STA RETLEN
LDA #1
:RLP
LDA (ADDR1),Y
STA RETURN,Y
CPY RETLEN
INY
BNE :RLP
LDA RETLEN
LDY #0
STA (ADDR1),Y
LDX :S3LEN ; RETURN FINAL LENGTH
RTS
:S3LEN DS 1
:S1LEN DS 1
:S1IND DS 1
:S2LEN DS 1
:S2IND DS 1
:MLEN DS 1
:SCNT DS 1
:SOVF DS 1

View File

@ -1,47 +0,0 @@
STRCMP
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y ; GET LENGTH OF STRING 1
CMP (ADDR2),Y
BCC :BEGCMP ; IF STRING 2 IS SHORTER THEN
LDA (ADDR2),Y ; USE ITS LENGTH INSTEAD
:BEGCMP
TAX ; X IS LENGTH OF SHORTER STRING
BEQ :TSTLEN ; BR IF LENGTH IS 0
LDY #1 ; POINT AT FIRST CHAR OF STRINGS
:CMPLP
LDA (ADDR1),Y
CMP (ADDR2),Y
BNE :EXIT ; BR IF CHARS NOT EQUAL
; Z,C WILL BE PROPERLY SET
; OR CLEARED
; ELSE
INY ; NEXT CHAR
DEX ; DECREMENT COUNTER
BNE :CMPLP ; CONTINUE UNTIL ALL BYTES PAIRED
:TSTLEN
LDY #0 ; COMPARE LENGTHS
LDA (ADDR1),Y
CMP (ADDR2),Y ; SET OR CLEAR THE FLAGS
:EXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY #0
LDA (ADDR1),Y ; GET STR1 LENGTH
TAX ; RETURN IN X
LDA (ADDR2),Y ; STR2 LENGTH
TAY ; RETURN IN Y
RTS

View File

@ -1,65 +0,0 @@
SCMP MAC
_ISSTR ]1
_ISSTR ]2
JSR STRCMP
<<<
SCAT MAC
_ISSTR ]1
_ISSTR ]2
LDA ]3 ; MAX SIZE; BYTE
PHA
JSR STRCAT
<<<
SPRN MAC
LDA #>]1 ; ADDRESS OF STRING
PHA
LDA #<]1
PHA
JSR PRNSTR
<<<
TOSTR MAC
_ISLIT ]1
JSR NUM2STR
<<<
TONUM MAC
_ISSTR ]1
JSR STR2NUM
<<<
SPOS MAC
_ISSTR ]1
_ISSTR ]2
JSR SUBPOS
<<<
SCPY MAC
_ISSTR ]1
LDA ]2 ; STARTING INDEX
PHA
LDA ]3 ; SUBSTRING LENGTH
PHA
LDA ]4 ; MAX LENGTH OF SUBSTR
PHA
JSR SUBCOPY
<<<
SDEL MAC
LDA #>]1 ; STRING ADDRESS
PHA
LDA #<]1
PHA
LDA ]2 ; INDEX BYTE
PHA
LDA ]3 ; LENGTH
PHA
JSR SUBDEL
<<<
SINS MAC
LDA #>]1 ; PARENT STRING
PHA
LDA #<]1
PHA
LDA ]2 ; INDEX
PHA
LDA ]3 ; MAXIMUM LENGTH
PHA
_ISSTR ]4
JSR SUBINS
<<<

View File

@ -1,99 +0,0 @@
SUBCOPY
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :MLEN
PLA
STA :SCNT
STA RETLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA #<RETURN
STA ADDR2
LDA #>RETURN
STA ADDR2+1
LDA RETADR+1
PHA
LDA RETADR
PHA
LDA #0
STA :S2LEN ; DESTINATION LENGTH = 0
STA :SCERR ; ASSUME NO ERRORS
LDA :SCNT
BEQ :OKEXIT ; BR IF 0 BYTES TO COPY,
LDA :MLEN
BEQ :EREXIT ; ERROR EXIT IF SUBSTR HAS
LDA :SINDEX
BEQ :EREXIT ; ERROR EXIT IF START IDX = 0
LDY #0
LDA (ADDR1),Y ;
STA :S1LEN ; GET LENGTH OF SOURCE STRING
CMP :SINDEX ; COMPARE TO STARTING INDEX
BCC :EREXIT ; ERROR EXIT IF INDEX TOO BIG
LDA :SINDEX
CLC
ADC :SCNT
BCS :RECALC
TAX ; BR IF INDEX + COUNT > 255
DEX
CPX :S1LEN
BCC :CNT10K ; BR IF IND + CNT - 1 < S1LEN
BEQ :CNT10K ; OR EQUAL
:RECALC
LDA :S1LEN ; RECALCULATE COUNT
SEC
SBC :SINDEX
STA :SCNT
INC :SCNT ; CNT = S1LEN - IND + 1
LDA #$0FF
STA :SCERR ; INDICATE TRUNCATION
:CNT10K
LDA :SCNT
CMP :MLEN ; IF CNT > M SUBSTR LEN ?
BCC :CNT20K ; BR IF CNT < MAXLEN
BEQ :CNT20K ; BR IF CNT = MAXLEN
LDA :MLEN
STA :SCNT ; ELSE CNT = MAXLEN
LDA #$0FF
STA :SCERR ; INDICATE DEST STR OVERFLOW
:CNT20K
LDX :SCNT ; REG X WILL BE COUNTER
BEQ :EREXIT ; ERR IF 0
LDA #1 ; START WITH 1ST CHAR IN DEST
STA :S2LEN ; RUNNING DEST INDEX
; __SINDEX IS SRC INDEX
:MVLP
LDY :SINDEX
LDA (ADDR1),Y ; GET NEXT SRC CHAR
LDY :S2LEN
STA (ADDR2),Y ; MOVE NEXT CHAR TO DEST
INC :SINDEX ; INC SRC INDEX
INC :S2LEN ; INC DEST INDEX
DEX ; DECREMENT COUNTER
BNE :MVLP ; CONT UNTIL CNT = 0
DEC :S2LEN ; SUBSTR LEN=FINAL DEST IND-1
LDA :SCERR ; CHECK FOR ANY ERRORS
BNE :EREXIT ; BR IF STR TRUNCATED OR OVERFLOW
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
LDA :S2LEN
LDY #0
STA (ADDR2),Y
STA RETLEN
RTS
:S1LEN DS 1
:S2LEN DS 1
:MLEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SCERR DS 1

View File

@ -1,120 +0,0 @@
SUBINS
PLA
TAY
PLA
TAX
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :MLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
TXA
PHA
TYA
PHA
LDA #0
STA :SCERR ; ASSUME NO ERR WILL BE FOUND
LDY #0
LDA (ADDR1),Y
STA :S1LEN ; GET LENGTH OF STRING
LDA (ADDR2),Y
STA :S2LEN ; GET LENGTH OF SUB
BNE :IDX0
JMP :OKEXIT ; EXIT OF NO INSERT/ERR
:IDX0
LDA :SINDEX
BNE :CHKLEN ; BR OF INDEX NOT 0
JMP :EREXIT ; ELSE ERROR EXIT
:CHKLEN
LDA :S2LEN ; GET SUBSTR LENGTH
CLC
ADC :S1LEN
BCS :TRUNC ;TRUN IF S1+S2 LENGTH > 255
CMP :MLEN ;
BCC :IDXLEN ; BR IF S1+S2 LEN < MAX LENGTH
BEQ :IDXLEN ; BR IF EQUAL
:TRUNC
LDA :MLEN ; SUBSTR LEN = MLEN - STR LEN
SEC
SBC :S1LEN
BCC :EREXIT
BEQ :EREXIT ; ERR IF MLEN < STR LEN OR 0
STA :S2LEN
LDA #$0FF
STA :SCERR ; INDICATE SUBSTR WAS TRUNCATED
:IDXLEN
LDA :S1LEN
CMP :SINDEX ;
BCS :LENOK ; BR IF INDEX WITHIN STR
LDX :S1LEN ; ELSE CONCAT SUB AT END OF STR
INX
STX :SINDEX ; START RIGHT AFTER END OF STR
LDA #$0FF
STA :SCERR ; INDICATE ERR IN INSERT
LDA :S1LEN
CLC
ADC :S2LEN
STA :S1LEN ; ADD LENGTHS TOGETHER
JMP :MVESUB ; PERFORM MOVE, NOTHING ELSE TODO
:LENOK
LDA :S1LEN
SEC
SBC :SINDEX
TAX
INX ; X= NUM OF CHARS TO MOV
LDA :S1LEN
STA :SIDX ; SRC ENDS AT ORIG STR END
CLC
ADC :S2LEN
STA :SBIDX ; DEST ENDS FURTHER BY SUB LEN
STA :S1LEN ; SET NEW LENGTH TO THIS ALSO
:OPNLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SBIDX
STA (ADDR1),Y ; MOVE IT UP IN MEM
DEC :SIDX
DEC :SBIDX ; DE DEST IDX, COUNTER
DEX
BNE :OPNLP ; CONT UNTIL COUNTER = 0
:MVESUB
LDA #1
STA :SIDX
; START AT INDEX IN THE STRING
LDX :S2LEN ; X = NUM OF CHARS TO MOVE
:MVELP
LDY :SIDX
LDA (ADDR2),Y ; GET NEXT CHAR
LDY :SINDEX
STA (ADDR1),Y
INC :SIDX ; INC SUBSTR INDEX
INC :SINDEX ; INC STR INDEX
DEX ; DEC COUNTER
BNE :MVELP ; CONT UNTIL COUNTER = 0
LDA :SCERR ; GET ERROR FLAG
BNE :EREXIT ; BR IF SUBSTR WAS TRUNCED
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC ; ERROR EXIT
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
RTS
:S1LEN DS 1
:S2LEN DS 1
:SUBLEN DS 1
:MLEN DS 1
:SINDEX DS 1
:SIDX DS 1
:SBIDX DS 1
:SCERR DS 1

View File

@ -1,78 +0,0 @@
SUBPOS
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA RETADR+1
PHA
LDA RETADR
PHA
:POS
LDY #0
LDA (ADDR1),Y ; GET LENGTH OF STRING
BEQ :NOTFND ; EXIT IF LENGTH = 0
STA :SLEN
LDA (ADDR2),Y ; GET SUBSTR LENGTH
BEQ :NOTFND ; EXIT IF SUB LENGTH = 0
STA :SUBLEN
LDA :SUBLEN
CMP :SLEN
BEQ :LENOK
BCS :NOTFND ; CANNOT FIND SUBSTR IF
:LENOK
LDA #1
STA :SINDEX ; START LOOKING AT FIRST
; CHARACTER OF STRING
LDA :SLEN ; CONT UNTIL REMAINING STR
; TOO SHORT
SEC ; COUNT=STR LEN - SUB LEN+1
SBC :SUBLEN
STA :SCOUNT
INC :SCOUNT
:SLP1
LDA :SINDEX
STA :SIDX ; START STR AT INDEX
LDA #1
STA :SUBIDX ; START SUB IND AT 1
:CMPLP
LDY :SIDX
LDA (ADDR1),Y ; GET NEXT CHAR FROM STR
LDY :SUBIDX
CMP (ADDR2),Y ; COMPARE TO NEXT SUB CHAR
BNE :SLP2 ; BR IF SUB NOT HERE
LDY :SUBIDX
CPY :SUBLEN ; TEST IF WE ARE DONE
BEQ :FOUND ; BR IF ALL CHARS WERE EQUAL
INY ; ELSE INC TO NEXT CHAR
STY :SUBIDX
INC :SIDX
JMP :CMPLP ; CONTINUE
:SLP2
INC :SINDEX ; INCREMENT INDEX
DEC :SCOUNT ; DEC COUNT
BNE :SLP1 ; BR IF NOT DONE
BEQ :NOTFND ; ELSE EXIT TO NOT FOUND
:FOUND
LDA :SINDEX ; FOUND, A = STARTING IDX
JMP :EXIT
:NOTFND
LDA #0 ; SUB NOT FOUND, A=0
:EXIT
STA RETURN
LDY #1
STY RETLEN
RTS
:SLEN DS 1
:SUBLEN DS 1
:SINDEX DS 1
:SUBIDX DS 1
:SCOUNT DS 1
:SIDX DS 1

View File

@ -1,70 +0,0 @@
ZMLOAD
PLA
STA :RETADR
PLA
STA :RETADR+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #2 ; START 2 AHEAD
LDA (ADDR1),Y ; AND PUT ADDR1
STA $08 ; AREA LAST
INY
LDA (ADDR1),Y
STA $09
INY
LDA (ADDR1),Y
STA $19
INY
LDA (ADDR1),Y
STA $1E
INY
LDA (ADDR1),Y
STA $E3
INY
LDA (ADDR1),Y
STA $EB
INY
LDA (ADDR1),Y
STA $EC
INY
LDA (ADDR1),Y
STA $ED
INY
LDA (ADDR1),Y
STA $EE
INY
LDA (ADDR1),Y
STA $EF
INY
LDA (ADDR1),Y
STA $FA
INY
LDA (ADDR1),Y
STA $FB
INY
LDA (ADDR1),Y
STA $FC
INY
LDA (ADDR1),Y
STA $FD
INY
LDA (ADDR1),Y
STA $FE
INY
LDA (ADDR1),Y
STA $FF
LDY #0
LDA (ADDR1),Y
TAX
LDA (ADDR1+1),Y
TAY
STX ADDR1
STY ADDR1+1
LDA :RETADR+1
PHA
LDA :RETADR
PHA
RTS
:RETADR DS 2

View File

@ -0,0 +1,3 @@
BLOAD MAKEEXEC
CALL -151
6000G

View File

@ -0,0 +1,3 @@
BLOAD MAKEEXEC
CALL -151
6000G

View File

@ -0,0 +1,3 @@
BLOAD MINIFY
CALL -151
7000G

View File

@ -0,0 +1,3 @@
BLOAD RDF
CALL -151
7000G

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,151 @@
********************************
* *
* MAKEEXEC *
* *
* CREATES AN EXEC FILE THAT *
* RUNS A BINARY. NECESSARY FOR *
* ANY FILE OPERATIONS. *
* *
* NOTE THAT IRONICALLY, THIS *
* PROGRAM ITSELF HAS TO BE RUN *
* THROUGH AN EXEC FILE... *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP ONLY ; TURN OFF LATER
DSK MAKEEXEC
TR ON
OBJ $BFE0
ORG $6000
*
********************************
* *
* HEADER, HOOKS AND MACROS *
* *
********************************
*
PUT MIN.VARS.REQUIRED
USE MIN.MAC.STRINGS
USE MIN.MAC.REQUIRED
USE MIN.MAC.FILEIO
USE MIN.MAC.STDIO
PUT MIN.HOOKS.REQUIRED
PUT MIN.HOOKS.STDIO
PUT MIN.HOOKS.FILEIO
PUT MIN.HOOKS.STRINGS
*
********************************
* *
* CONSTANT DECLARATIONS *
* *
********************************
*
*
********************************
* *
* MAIN PROGRAM LOOP *
* *
********************************
*
JSR HOME
PRN "************************",8D
PRN "* *",8D
PRN "* EXEC FILE MAKER FOR *",8D
PRN "* BINARY PROGRAMS THAT *",8D
PRN "* USE APPLESOFT. *",8D
PRN "* * ",8D
PRN "************************",8D8D8D
*
PRN "BIN FILENAME: "
INP
LDA RETLEN
GRET BNAME ; TRANSFER RETURN TO BNAME
*
PRN "BIN STARTING ADDRESS: "
INP
LDA RETLEN
GRET BLOC
*
SCAT "GO.";BNAME;#20 ; PREFIX NAME WITH GO.
*
GRET TNAME ; STORE RESULTING STRING IN TNAME
*
PRN " ",8D
PRN "BUILDING FILE: "
SPRN TNAME
PRN " ",8D8D
*
** OPEN FILE FOR WRITING
*
SCAT "OPEN ";TNAME;#255
CMD RETURN
SCAT "WRITE ";TNAME;#255
CMD RETURN
*
** PRINT TO FILE
*
SCAT "BLOAD ";BNAME;#255
FPRN RETURN
LDA #$8D
JSR FCOUT
FPRN "CALL -151"
SCAT BLOC;"G";#255
FPRN RETURN
*
** CLOSE FILE
*
SCAT "CLOSE ";TNAME;#255
CMD RETURN
*
PRN "DONE!",8D8D
JMP REENTRY
*
********************************
* *
* VARIABLES *
* *
********************************
*
BNAME DS 20
TNAME DS 20
BLOC DS 10
LINE DS 40
HEAD ASC "REM ** THIS FILES BLOADS",8D
ASC "REM ** A BINARY PROGRAM INTO",8D
ASC "REM ** MEMORY THEN EXECUTES IT",8D
ASC "REM ** VIA THE MONITOR. THIS IS",8D
ASC "REM ** NECESSARY FOR CERTAIN ",8D
ASC "REM ** EXECUTABLES THAT USE APPLESOFT",8D
ASC "REM ** ROUTINES.",8D
ASC "REM **",8D00
*
********************************
* *
* LOW-LEVEL ROUTINES *
* *
********************************
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINES
*
*** FILEIO
*
PUT MIN.SUB.FPRINT
PUT MIN.SUB.DOSCMD
PUT MIN.SUB.FPSTR
*
*** STDIO
*
PUT MIN.SUB.DPRINT
PUT MIN.SUB.XPRINT
PUT MIN.SUB.SINPUT
*
*** STRINGS
*
PUT MIN.SUB.STRCAT
PUT MIN.SUB.PRNSTR
*

View File

@ -0,0 +1,599 @@
********************************
* *
* PERFECT MAZE GENERATOR *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP ONLY ; TURN OFF LATER
DSK MAKEMAZE
TR ON
OBJ $BFE0
ORG $6000
*
PUT VARS.REQUIRED
USE MIN.MAC.REQUIRED
USE MIN.MAC.ARRAYS
USE MIN.MAC.MATH
USE MIN.MAC.STDIO
PUT MIN.HOOKS.REQUIRED
PUT HOOKS.STDIO
PUT HOOKS.MATH
PUT HOOKS.ARRAYS
*
********************************
* *
* CONSTANT DECLARATIONS *
* *
********************************
*
XLEN KBD "ENTER MAZE SIZE"
XNUM EQU 2*XLEN
BAS EQU $2000 ; BASE ADDRESS FOR ARRAYS
YLEN EQU XLEN ; CURRENT ALGO ONLY DOES SQUARE
XMAX EQU XLEN+1 ; ADD EXTRA COLUMN
YMAX EQU YLEN+1 ; ADD EXTRA ROW
ASZ EQU XMAX*YMAX+10 ; ARRAY SIZE+INFO BYTES
XSTAKS EQU ASZ*2+1 ; COLUMN STACK SIZE; X * Y + 1
YSTAKS EQU ASZ*2+1 ; ROW STACK SIZE; X * Y + 1
*
SOUTHW EQU BAS ; SOUTH WALLS ARRAY
WESTW EQU ASZ+BAS ; WEST WALLS ARRAY
VISITED EQU 2*ASZ+BAS ; CELLS VISITED
XSTACK EQU 3*ASZ+BAS ; STACK FOR COLUMNS
YSTACK EQU 3*ASZ+BAS+XSTAKS ; STACK FOR ROWS
*
********************************
* *
* MAIN PROGRAM LOOP *
* *
********************************
*
INIT
*
JSR HOME
PRN "INITIALIZING...",8D
*
JSR :SETVARS
JSR :OUTWALLS
*
** GET RANDOM STARTING POINT
*
RNDB #2;#<XLEN ; RANDOM STARTING POINT
STA XX ; BETWEEN 2 AND XLEN LOBYTE
RNDB #2;#<YLEN ; RANDOM STARTING POINT
STA YY ; BETWEEN 2 AND YLEN LOBYTE
LDA #>XLEN ; IF XLEN HIBYTE IS 0,
CMP #0 ; THEN SKIP SETTING XX HIBYTE
BEQ :SKIPHI
LDA #>YLEN ; IF YLEN HIBYTE IS 0,
CMP #0 ; THEN SKIP SETTING YY HIBYTE
BEQ :SKIPHI
RNDB #1;#>XLEN ; RANDOMLY SET XX HIBYTE
STA XX+1
RNDB #1;#>YLEN ; RANDOMLY SET YY HIBYTE
STA YY+1
JMP BUILD
:SKIPHI ; JUST SET HIBYTES TO 0
LDA #0
STA XX+1
STA YY+1
*
JMP BUILD
*
********************************
*
:SETVARS
*
** DIM ARRAYS AND FILL
*
DIM162 SOUTHW;#XMAX;#YMAX;#1;#1
DIM162 WESTW;#XMAX;#YMAX;#1;#1
DIM162 VISITED;#XMAX;#YMAX;#1;#0
DIM161 XSTACK;#XSTAKS;#2;#0
DIM161 YSTACK;#YSTAKS;#2;#0
*
** NOW ASSIGN VARIABLE VALUES
*
LDA #0
STA SPTR ; INIT STACK POINTER
STA V0
LDA #1
STA V1
RTS
*
********************************
*
:OUTWALLS
*
** MAKE COLUMN MIN AND MAX TO BE ALL
** WALL (CODE: 1).
*
LDA #0 ; CLEAR ALL TO 0 FIRST
STA XX
STA YY
STA XX+1
STA YY+1
JMP :COLCONT ; SKIP FIRST INCREMENT
*
:COLEDGE
LDA XX
CLC
ADC #1
STA XX
BCC :COLCONT ; IF CARRY SET, THEN INC HIBYTE
INC XX+1
:COLCONT
PUT162 V1;VISITED;XX;#0
PUT162 V1;VISITED;XX;#YMAX-1
LDA XX
CMP #<XMAX-1 ; IF XX LO < MAX SIZE, REPEAT
BNE :COLEDGE
LDA XX+1 ; TEST HI BIT
CMP #>XMAX ; IF XX HI < MAX HI, REPEAT
BNE :COLEDGE
*
** MAKE MIN AND MAX ROWS TO BE ALL WALL
*
JMP :ROWCONT ; SKIP FIRST INCREMENT
*
:ROWEDGE
LDA YY
CLC
ADC #1
STA YY
BCC :ROWCONT ; IF CARRY SET, INC HIBYTE
INC YY+1
:ROWCONT
PUT162 V1;VISITED;#0;YY
PUT162 V1;VISITED;#XMAX-1;YY
LDA YY
CMP #<YMAX-1 ; IF YY LO < YMAX LO, REPEAT
BNE :ROWEDGE
LDA YY+1
CMP #>YMAX ; IF YY HI < YMAX HI, REPEAT
BNE :ROWEDGE
RTS
*
********************************
* *
* BUILD THE MAZE *
* *
********************************
*
BUILD
*
PRN "BUILDING MAZE...",8D8D
JMP CONTSPTR ; SKIP FIRST INC
*
********************************
*
STAKPUSH
*
LDA SPTR ; INCREMENT STACK POINTER
CLC
ADC #1
STA SPTR
BCC CONTSPTR ; IF CARRY SET, INC POINTER HI
INC SPTR+1
CONTSPTR
PUT161 XX;XSTACK;SPTR ; PUT COL ON STACK
PUT161 YY;YSTACK;SPTR ; PUT ROW ON STACK
PUT162 V1;VISITED;XX;YY ; MARK BLOCK AS VISITED
*
********************************
*
CHECKALL
*
** CHECKS ALL ADJACENT BLOCKS FOR A WALL. IF
** COMPLETELY SURROUNDED, POP THE STACK AND
** AND START OVER UNTIL.
*
LDA YY+1 ; COPY HI BYTES OF XX,YY FIRST
STA YP1+1
STA YM1+1
LDA XX+1
STA XP1+1
STA XM1+1
*
LDA YY ; CALC AND STORE YY+1
CLC
ADC #1
STA YP1
BCC :YP1CNT ; IF CARRY SET, INC YYP1 HI
INC YP1+1
:YP1CNT
LDA XX ; CALC AND STORE XX+1
CLC
ADC #1
STA XP1
BCC :XP1CNT ; IF CARRY SET, INC XP1 HI
INC XP1+1
:XP1CNT
LDA YY ; CALC AND STORE YY-1
SEC
SBC #1
STA YM1
BCS :YM1CNT ; IF CARRY CLEAR, DEC YM1 HI
DEC YM1+1
:YM1CNT
LDA XX ; CALC AND STORE XX-1
SEC
SBC #1
STA XM1
BCS :XM1CNT ; IF CARRY CLEAR, DEC XM1 HI
DEC XM1+1
:XM1CNT
*JSR CELLPOS
*
** NOW CHECK ADJACENT CELLS FOR WALLS
*
:IF1 ; IF VISITED(XX,YY+1) = 1
LDA YY+1 ; IF YY HI BYTE = YMAX HI BYTE,
CMP #>YMAX ; THEN TEST YY LOW BYTE
BNE :IF1TEST
LDA YY
CMP #<YMAX ; IF YY LOBYTE = YMAX LOBYTE, THEN
BEQ :IF2 ; AUTOMATICALLY ASSUME ITS A WALL
*
:IF1TEST
GET162 VISITED;XX;YP1
LDA RETURN
CMP #1
BEQ :IF2 ; IF CELL BELOW IS A WALL
; CONTINUE TESTING OTHER
; ADJACENT CELLS
JMP DOMOVE ; OTHERWISE, EXIT CONDITIONAL
*
:IF2 ; IF VISITED(X+1,Y) = 1
*
LDA XX+1 ; IF XX HI BYTE = XMAX HIBYTE
CMP #>XMAX ; THEN TEST LOBYTE
BNE :IF2TEST
LDA XX ; IF XX LOBYTE = XMAX LOBYTE
CMP #<XMAX-1 ; THEN ASSUME RIGHT CELL = WALL
BEQ :IF3
:IF2TEST
GET162 VISITED;XP1;YY ; IF CELL TO RIGHT
LDA RETURN ; IS A WALL, THEN
CMP #1 ; CONTINUE CELL TESTING;
BEQ :IF3 ; ELSE, REPEAT MOVE
JMP DOMOVE
*
:IF3 ; IF VISITED(XX,YY-1) = 1
LDA YY+1 ; IF YY HIBYTE = 0 THEN TEST
CMP #0 ; LOBYTE
BNE :IF3TEST
LDA YY ; IF YY LOBYTE = 0 THEN
CMP #0 ; ASSUME UPPER CELL = WALL
BEQ :IF4 ; AND CONTINUE TESTING
:IF3TEST
GET162 VISITED;XX;YM1
LDA RETURN ; IF CELL ABOVE IS WALL THEN
CMP #1 ; CONTINUE TESTING CELLS;
BEQ :IF4 ; ELSE, REPEAT MOVE
JMP DOMOVE
*
:IF4 ; IF VISITED(XX-1,YY) = 1
LDA XX+1 ; IF XX HIBYTE = 0
CMP #0 ; THEN TEST LOBYTES
BNE :IF4TEST
LDA XX ; IF XX LOBYTE = 0
CMP #0 ; THEN ASSUME LEFT CELL = WALL
BEQ :POP ; AND POP THE STACK
:IF4TEST
GET162 VISITED;XM1;YY
LDA RETURN ; IF LEFT CELL = 1
CMP #1 ; THEN ALL ADJACENT CELLS ARE WALLS
BEQ :POP ; SO POP THE STACK
*
JMP DOMOVE ; OTHERWISE, REPEAT MOVING
*
********************************
*
:POP
*
GET161 XSTACK;SPTR ; GET NEW XX POSITION
LDA RETURN
STA XX ; STORE LO BYTE
LDA RETURN+1
STA XX+1 ; STORE HI BYTE
GET161 YSTACK;SPTR
LDA RETURN ; GET NEW Y POSITION
STA YY
LDA RETURN+1
STA YY+1
LDA SPTR ; POP STACK
SEC
SBC #1
STA SPTR
BCS :SPCNT2 ; IF CARRY NOT SET, DEC HIBYTE
DEC SPTR+1
:SPCNT2
LDA SPTR+1 ; IF POINTER HIBYTE > 0
CMP #0 ; THEN REPEAT MOVEMENT
BNE :DOREPEAT
LDA SPTR ; OTHERWISE, TEST LOBYTE
CMP #1 ; IF STILL MORE ON STACK
BEQ :DOREPEAT
BCS :DOREPEAT ; THEN REPEAT MOVEMENT
JMP DISPMAZE ; OTHERWISE, FINISHED!
*
:DOREPEAT
JMP CHECKALL
*
********************************
*
DOMOVE
*
** MOVE IN A RANDOM DIRECTION
*
JSR RAND8
CMP #64 ; IF RND < 64
BCC :MVDJ
CMP #128 ; ELSE IF RND < 128
BCC :MVRJ
CMP #192 ; ELSE IF RND < 192
BCC :MVUPJ
JMP :MVLEFT ; ELSE RND IS > 191
:MVUPJ JMP :MVUP
:MVRJ JMP :MVRIGHT
:MVDJ JMP :MVDOWN
*
:MVDOWN
LDA YY+1 ; IF YY HIBYTE = YMAX HIBYTE
CMP #>YMAX ; THEN TEST LOBYTES
BNE :DTEST ; OTHERWISE, TEST CELL BELOW
LDA YY
CMP #<YMAX ; IF YY LOBYTE = YMAX LOBYTE
BEQ :DNO ; THEN ASSUME CELL BELOW = WALL
:DTEST
GET162 VISITED;XX;YP1
LDA RETURN
CMP #0 ; IF CELL BELOW NOT A WALL
BEQ :DOWNGO ; THEN MOVE DOWN
:DNO
JMP DOMOVE ; ELSE, TRY MOVING ELSEWHERE
:DOWNGO
PUT162 V0;SOUTHW;XX;YY ; PUT 0 AT CURRENT POSITION
LDA YP1 ; INCREASE YY POSITION (MOVE DOWN)
STA YY
LDA YP1+1
STA YY+1
:DOWNC
JMP STAKPUSH ; PUSH POSITION TO STACK, REPEAT
*
:MVRIGHT
LDA XX+1 ; IF XX HIBYTE = XMAX HIBYTE
CMP #>XMAX ; THEN TEST LOW BYTE
BNE :RTEST ; ELSE CONTINUE CELL CHECK
LDA XX
CMP #<XMAX-1 ; IF XX LOBYTE = XMAX LOBYTE
BEQ :RNO ; THEN ASSUME WALL TO RIGHT
; AND SKIP THE CHECK
:RTEST
GET162 VISITED;XP1;YY
LDA RETURN ; IF CELL TO RIGHT IS NOT WALL
CMP #0 ; THEN MOVE THERE
BEQ :RIGHTGO
:RNO
JMP DOMOVE ; OTHERWISE, TRY MOVING ELSEWHERE
:RIGHTGO
PUT162 V0;WESTW;XP1;YY ; MARK RIGHT CELL AS EMPTY
LDA XP1 ; MOVE TO RIGHT CELL
STA XX
LDA XP1+1
STA XX+1
:RIGHTC
JMP STAKPUSH
*
:MVUP
LDA YY+1 ; IF YY HIBYTE != 0 THEN
CMP #0 ; SKIP LOBYTE TEST
BNE :UTEST
LDA YY ; IF YY LOBYTE = 0 THEN
CMP #0 ; ASSUME UP CELL IS WALL
BEQ :UNO ; AND MOVE ELSEWHERE
:UTEST
GET162 VISITED;XX;YM1
LDA RETURN ; IF VISITED(XX,YY) = 0
CMP #0 ; (NO WALL) THEN
BEQ :UPGO ; MOVE ON UP THERE
:UNO
JMP DOMOVE
:UPGO
PUT162 V0;SOUTHW;XX;YM1
LDA YM1 ; MOVE UP ONE CELL
STA YY
LDA YM1+1
STA YY+1
:UPC
JMP STAKPUSH
*
:MVLEFT
LDA XX+1 ; IF XX HIBYTE != 0 THEN
CMP #0 ; SKIP LOBYTE TEST
BNE :LTEST
LDA XX ; IF XX LOBYTE = 0
CMP #0 ; THEN ASSME LEFT CELL IS WALL
BEQ :LNO ; AND TRY TO MOVE ELSEWHERE
:LTEST
GET162 VISITED;XM1;YY
LDA RETURN ; IF LEFT CELL IS NOT A WALL
CMP #0 ; THEN LET'S MOVE THERE
BEQ :LEFTGO
:LNO
JMP DOMOVE
:LEFTGO
PUT162 V0;WESTW;XX;YY
LDA XM1 ; MOVE ONE CELL LEFT
STA XX
LDA XM1+1
STA XX+1
:LEFTC
JMP STAKPUSH
*
********************************
* *
* DISPLAY THE MAZE *
* *
********************************
*
DISPMAZE
*
** SEND MAZE TO DISPLAY OUTPUT, FORMATTED
*
PRN "PRINTING...",8D8D
LDA #0
STA XX
:XLOOP ; PRINT FIRST LINE OF WALLS
INC XX
PRN "X"
LDA XX
CMP #XNUM-1
BNE :XLOOP
PRN " ",8D
*
LDA #0 ; RESET XX,YY
STA XX+1
STA YY+1
LDA #1
STA XX
STA YY
WLP
*
** IF WESTW(X,Y) == 0
*
GET162 WESTW;XX;YY
LDA RETURN
CMP #0
BEQ NOWALLW ; THEN PRINT ...
YESWALLW ; ELSE PRINT X..
PRN "X "
JMP CONTWLP
NOWALLW
PRN " "
*
CONTWLP
LDA XX ; INCREASE XX
CLC
ADC #1 ; LOBYTE FIRST
STA XX
BCC :SKIPHI ; IF HI = 0, SKIP INC
INC XX+1
:SKIPHI
LDA XX+1 ; IF HIBYTE != XMAX HI
CMP #>XMAX
BNE WLP ; THEN REPEAT
LDA XX ; OTHERWISE, TEST LOWS
CMP #<XMAX-1 ; IF LOBYTE != XMAX-1
BNE WLP ; REPEAT
*
PRN "X",8D ; OTHERWISE, GO TO NEXT LINE
*
LDA #1 ; RESET XX COUNTER
STA XX
LDA #0
STA XX+1
*
** IF SOUTHW(X,Y) == 0
*
SLP
GET162 SOUTHW;XX;YY
LDA RETURN
CMP #0
BEQ NOSOUTH ; THEN PRINT X..
YSOUTH ; ELSE PRINT XXX
PRN "XX"
JMP CONTSLP
NOSOUTH
PRN "X "
CONTSLP
LDA XX ; INCREASE XX BY 1
CLC
ADC #1
STA XX
BCC :SKIPHI2 ; SKIP HI INC IF NO CARRY
INC XX+1
:SKIPHI2
LDA XX+1 ; TEST HIBYTE OF XX
CMP #>XMAX ; IF HI != XMAX HI
BNE SLP ; REPEAT
LDA XX ; ELSE, TEST LOBYTE
CMP #<XMAX-1 ; IF XX LO != XMAX LO - 1
BNE SLP ; REPEAT
*
PRN "X",8D ; OTHERWISE, NEW LINE
*
LDA #0 ; RESET XX
STA XX+1
LDA #1
STA XX
LDA YY ; INCREASE YY BY 1
CLC
ADC #1
STA YY
BCC :SKIP ; IF NO CARRY, SKIP HI INC
INC YY+1
:SKIP
LDA YY+1 ; IF YY HI != YMAX HI
CMP #>YMAX ; THEN NOT DONE; REPEAT LOOPS
BNE REPT
LDA YY ; ELSE IF YY LO != YMAX LO
CMP #<YMAX-1 ; THEN NOT DONE; REPEAT LOOPS
BEQ DISPEXIT ; OTHERWISE, DONE!
REPT JMP WLP
*
DISPEXIT
*
_WAIT
JMP REENTRY
*
********************************
* *
* VARIABLES *
* *
********************************
*
V0 DS 1 ; USED BECAUSE OF CURRENT
V1 DS 1 ; ARRAY DIM LIMITATIONS
*
XX DS 2 ; CURRENT COLUMN
YY DS 2 ; CURRENT ROW
SPTR DS 2 ; ARRAY STACK POINTER
XP1 DS 2 ; X PLUS ONE
XM1 DS 2 ; X MINUS ONE
YP1 DS 2 ; Y PLUS ONE
YM1 DS 2 ; Y MINUS ONE
*
********************************
* *
* LOW-LEVEL ROUTINES *
* *
********************************
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINES
*
** ARRAYS
*
PUT MIN.SUB.ADIM161
PUT MIN.SUB.ADIM162
PUT MIN.SUB.AGET161
PUT MIN.SUB.AGET162
PUT MIN.SUB.APUT161
PUT MIN.SUB.APUT162
*
** MATH
*
PUT MIN.SUB.RAND8
PUT MIN.SUB.RANDB
*
** STDIO
*
PUT MIN.SUB.DPRINT
PUT MIN.SUB.XPRINT
*

View File

@ -0,0 +1,391 @@
********************************
* *
* ASSEMBLY LISTING MINIFIER *
* *
* A PROGRAM THAT REMOVES *
* COMMENTS FROM ASSEMBLY CODE. *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP OFF
DSK MINIFY
TR ON
OBJ $BFE0
ORG $7000
*
********************************
* *
* HEADER, HOOKS AND MACROS *
* *
********************************
*
PUT MIN.VARS.REQUIRED
USE MIN.MAC.REQUIRED
PUT MIN.HOOKS.REQUIRED
USE MIN.MAC.STDIO
PUT MIN.HOOKS.STDIO
USE MIN.MAC.FILEIO
PUT MIN.HOOKS.FILEIO
USE MIN.MAC.STRINGS
PUT MIN.HOOKS.STRINGS
*
********************************
* *
* MAIN PROGRAM LOOP *
* *
********************************
*
BEGIN
*
JSR INIT
JSR GETNAMES
JSR DELMIN
JMP FCOPY
*
JMP REENTRY
*
********************************
* *
* INIT *
* *
********************************
*
INIT
*
** RESET ERROR HANDLING
*
AMODE
LDA #$00
STA $D8
*
LDA #21 ; SEND ^U TO COUT TO
JSR COUT ; ENSURE 40COL MODE
LDA #00
STA ADDT
STA WRITEOFF
RTS
*
********************************
* *
* GETNAMES *
* *
********************************
*
GETNAMES
*
JSR HOME
PRN "ASSEMBLY CODE MINIFIER",8D
PRN "======================",8D8D
PRN "THIS PROGRAM STRIPS A",8D
PRN "PROGRAM OF ITS COMMENTS",8D
PRN "AND STORES THE RESULTING",8D
PRN "FILE WIN A MIN. PREFIX.",8D8D
*
:QUERY
PRN "FILE TO MINIFY ",8D
PRN "(RETURN FOR CATALOG): "
INP
LDA RETLEN
CMP #0 ; IF NOT JUST CR, THEN
BNE :NAMES ; GO TO NAMES
CMD "CATALOG" ; OTHERWISE, CAT
PRN " ",8D
JMP :QUERY
:NAMES
GRET SNAME
GRET DNAME
*
** NEED TO CHECK IF STARTING WITH T.; IF SO, INSERT
** MIN. AFTER T. OTHERWISE, JUST PREFIX.
*
SPOS SNAME;"T."
LDA RETURN
CMP #1 ; IF STRING BEGINS WITH "T."
BNE :CONTN ; DELETE T. FROM STRING
SDEL DNAME;#1;#2
LDA #$FF
STA ADDT
:CONTN
SCAT "MIN.";DNAME;#30
LDA RETLEN
GRET DNAME ; SCAT PUTS LENGTH BYTE
; IN RETURN AS WELL AS RETLEN
*
** NOW ADD BACK "T." PREFIX IF NEEDED
*
LDA ADDT
CMP #$FF
BNE SKIPT
SCAT "T.";DNAME;#30
GRET DNAME
SKIPT
RTS
*
********************************
* *
* DELMIN *
* *
********************************
*
DELMIN
*
** HIJACK ERROR HANDLING
*
LDA #$FF
STA $D8
*
** SET ERROR CONTROL TO CONTINUE
** FILE TO DELETE DOESN'T EXIST
*
LDA #<:DELCONT
STA $9D5A
LDA #>:DELCONT
STA $9D5B
*
SCAT "DELETE ";DNAME;#50 ; DELETE PREVIOUS IF EXISTS
CMD RETURN
*
:DELCONT
RTS
*
********************************
* *
* MAIN FILE COPY LOOP *
* *
********************************
*
FCOPY
*
PRN "MINIFYING...",8D8D
*
JSR SETFILEERR
JSR OPENFILES
*
** THE FOLLOWING LOOP ENDS WHEN
** THE END OF THE SOURCE FILE
** IS REACHED, PROMPTING AN ERROR
** THAT GETS HANDLED BY FCLOSE
*
:COPYLOOP
JSR READSRC
JSR CHKCOMMENT
JSR WRITEDEST
:LOOPEND JMP :COPYLOOP
*
********************************
* *
* SETFILEERR *
* *
********************************
*
SETFILEERR
*
** SET ERROR CONTROL TO FILE CLOSING ROUTINE
*
LDA #<FCLOSE
STA $9D5A
LDA #>FCLOSE
STA $9D5B
RTS
*
********************************
* *
* OPENFILES *
* *
********************************
*
OPENFILES
*
** OPEN SOURCE AND DESTINATION FILES
*
SCAT "OPEN ";SNAME;#80
CMD RETURN
SCAT "OPEN ";DNAME;#80
CMD RETURN
RTS
*
********************************
* *
* READSRC *
* *
********************************
*
READSRC
*
** CLEAR BUFFER POINTER, SET TO READ SOURCE
*
LDA #1
STA CCNT
SCAT "READ ";SNAME;#80
CMD RETURN
:LP
GKEY ; ASCII CHAR STORED IN .A
LDY CCNT
STA LINE,Y
CMP #$8D ; IS THIS A CARRIAGE RETURN?
BEQ :XLP ; YES, EXIT LOOP
INC CCNT ; INCREASE BUFFER POINTER
JMP :LP ; KEEP ON READING
:XLP
LDA CCNT
STA LINE
RTS
*
********************************
* *
* CHKCOMMENT *
* *
********************************
*
CHKCOMMENT
*
** NOW CHECK IF LINE BEGINS WITH *
*
LDA LINE+1
CMP #170 ; * CHARACTER
BNE :SEMITEST
LDA #$FF
STA WRITEOFF
*
:SEMITEST
*
** NOW TEST FOR SUBSTRING " ; "
*
LDA LINE ; START AT END OF STRING
STA CCNT
DEC CCNT
*
:SEMILP
LDY CCNT
LDA LINE,Y
CMP #$BB ; ";" CHARACTER
BEQ :SEMIF
CPY #0
BEQ :XSEMILP
DEC CCNT
JMP :SEMILP
*
:SEMIF
LDY CCNT
INY
LDA LINE,Y
CMP #$20 ; IS NEXT CHAR A SPACE?
BNE :XSEMILP
LDA #$8D
LDY CCNT
STA LINE,Y
:XSEMILP
RTS
*
********************************
* *
* WRITEDEST *
* *
********************************
*
WRITEDEST
*
LDA WRITEOFF
CMP #$FF
BEQ :XWLP
*
** CLEAR COUNTER, SET TO WRITE DEST
*
LDA #1
STA CCNT
SCAT "WRITE ";DNAME;#80
CMD RETURN
*
:WLP ; WRITE LOOP
LDY CCNT
LDA LINE,Y
CMP #$8D ; WAS IT A CR?
BEQ :XWLP ; YEP, EXIT LOOP
JSR FCOUT ; PRINT TO FILE
INC CCNT
JMP :WLP
:XWLP
LDA #00
STA WRITEOFF
RTS
*
********************************
* *
* FCLOSE *
* *
********************************
*
FCLOSE
*
** NOW CLOSE SOURCE AND DESTINATION FILES
** AFTER END OF FILE ERROR
*
SCAT "CLOSE ";SNAME;#80
CMD RETURN
*
SCAT "CLOSE ";DNAME;#80
CMD RETURN
*
PRN "DONE!",8D8D
PRN "WOULD YOU LIKE TO MINIFY ANOTHER? "
INP
LDA RETURN+1
CMP #217 ; 'Y' LETTER
BNE FIN
PLA
PLA
PLA
JMP BEGIN
FIN
*
PLA
PLA
JMP REENTRY
*
********************************
* *
* VARIABLES *
* *
********************************
*
SNAME DS 40 ; SOURCE FILE NAME
DNAME DS 40 ; DEST FILE NAME
CCNT DS 2 ; SECOND COUNTER
TEMP DS 2
WRITEOFF DS 2
ADDT HEX 00
LINE DS 200
*
********************************
* *
* LOW-LEVEL ROUTINES *
* *
********************************
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINES
*
*** STRINGS
*
PUT MIN.SUB.STRCAT
PUT MIN.SUB.SUBPOS
PUT MIN.SUB.PRNSTR
PUT MIN.SUB.SUBDEL
*
*** STDIO
*
PUT MIN.SUB.DPRINT
PUT MIN.SUB.XPRINT
PUT MIN.SUB.SINPUT
*
*** FILEIO
*
PUT MIN.SUB.DOSCMD
PUT MIN.SUB.FINPUT
PUT MIN.SUB.FPRINT
PUT MIN.SUB.FPSTR
*

View File

@ -0,0 +1,383 @@
********************************
* *
* TYPE :: OUTPUT FILE CONTENTS *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP ONLY ; TURN OFF LATER
DSK RDF
TR ON
OBJ $BFE0
ORG $7000
*
********************************
* *
* HEADER, HOOKS AND MACROS *
* *
********************************
*
PUT MIN.VARS.REQUIRED
USE MIN.MAC.STRINGS
USE MIN.MAC.REQUIRED
USE MIN.MAC.FILEIO
USE MIN.MAC.STDIO
PUT MIN.HOOKS.REQUIRED
PUT MIN.HOOKS.STDIO
PUT MIN.HOOKS.FILEIO
PUT MIN.HOOKS.STRINGS
*
********************************
* *
* MAIN PROGRAM LOOP *
* *
********************************
*
LISTING EQU $2000
BYTES EQU 08
*
JSR INIT
JSR OPENFILE
*
JMP REENTRY
*
********************************
* *
* INIT *
* *
********************************
*
INIT
*
AMODE
LDA #$00
STA $D8
*
LDA #00
STA TFOUND
RTS
*
*
********************************
* *
* OPENFILE *
* *
********************************
*
OPENFILE
*
JSR GETNAME
JSR CHKEXIST
JSR CHKTYPE
JSR OPENIT
RTS
*
*****
***** GETNAME
*****
*
GETNAME
*
PRN " ",8D8D
PRN "FILE TO PRINT: "
INP
GRET FNAME
RTS
*
*****
***** CHKEXIST
*****
*
CHKEXIST
ERRH :NOEXIST
SCAT "VERIFY ";FNAME;#100
CMD RETURN
RTS
*
:NOEXIST
PRN " ",8D8D
LDA #7
JSR COUT
PRN "ERROR: FILE DOESN'T EXIST",8D8D
PLA
PLA
JMP REENTRY
*
*****
***** CHKTYPE
*****
*
CHKTYPE
ERRH :TXTF
SCAT "BLOAD ";FNAME;#100
GRET BLOAD1
SCAT BLOAD1;",A$2000";#100
CMD RETURN
LDA #$FF
STA FTYPE
LDA TFOUND
CMP #$FF
BEQ :TTYPE
RTS
:TTYPE
LDA #0
STA FTYPE
RTS
:TXTF
LDA #$FF
STA TFOUND
LDA #$00
STA $D8
RTS
*
*****
***** OPENIT
*****
*
OPENIT
LDA FTYPE
CMP #0
BEQ :GOTXT
JMP :HEXDISP
:GOTXT
JMP :TXTDISP
:HEXDISP
*
** CODE WAS ALREADY BLOADED, SO NOW
** JUST FIND THE ADDRESS IT'S AT
*
LDA $AA72 ; LOADING ADDRESS OF FILE
STA LDADDR
LDA $AA73
STA LDADDR+1
PRN " ",8D8D
*
LDA $AA60 ; LOADING LENGTH
STA LDLEN
LDA $AA61
STA LDLEN+1
PRN "LENGTH: (LOW BYTE, HIGH BYTE)",8D
DUMP LDLEN;#2
PRN " ",8D
_WAIT
*
:BEGHEXOUT
LDA #0
STA CNT1
LDA #<LISTING
STA LINE
LDA #>LISTING
STA LINE+1
:HEXLP1
*
*DUMP LINE;#BYTES
*
*
LDA LINE
STA ADDR3
LDA LINE+1
STA ADDR3+1
*
LDA ADDR3+1
AND #$F0
LSR
LSR
LSR
LSR
TAX
LDA HEXTAB,X
JSR COUT
*
LDA ADDR3+1
AND #$0F
TAX
LDA HEXTAB,X
JSR COUT
*
LDA ADDR3
AND #$F0
LSR
LSR
LSR
LSR
TAX
LDA HEXTAB,X
JSR COUT
LDA ADDR3
AND #$0F
TAX
LDA HEXTAB,X
JSR COUT
*
LDA #186 ; ":"
JSR COUT
LDA #160 " "
JSR COUT
*
LDY #0
:DLP
LDA (ADDR3),Y
AND #$F0
LSR
LSR
LSR
LSR
STA LEFT
LDA (ADDR3),Y
AND #$0F
STA RIGHT
LDX LEFT
LDA HEXTAB,X
JSR COUT
LDX RIGHT
LDA HEXTAB,X
JSR COUT
LDA #160
JSR COUT
INY
CPY #BYTES
BNE :DLP
*
PRN " ",8D
*
INC CNT1
LDA CNT1
CMP #20
BNE :NOWAIT
_WAIT
LDA #0
STA CNT1
:NOWAIT
LDA LINE
CLC
ADC #BYTES
BCC :NOADDHI
INC LINE+1
:NOADDHI
*
** NOW CHECK IF <= BINARY LENGTH
*
STA LINE
*
LDA LISTING
ADC LDLEN
STA TEMP
LDA LISTING+1
ADC LDLEN+1
STA TEMP+1
*
LDA LINE+1
CMP TEMP+1
BNE :RELOOP
LDA LINE
CMP TEMP
BEQ :RELOOP
BCS :QUITLP
:RELOOP
JMP :HEXLP1
:QUITLP
RTS
:TXTDISP
ERRH :BASIC
SCAT "OPEN ";FNAME;#100
CMD RETURN
SCAT "READ ";FNAME;#100
CMD RETURN
ERRH :TXTDONE
LDY #0
STY CNT2
:TLP0
LDY #1
STY CNT1
:TLP1
GKEY
LDY CNT1
*AND #$0F
STA LINE,Y
CMP #$8D ; IS IT RETURN CHAR?
BEQ :TCONT
CPY #255
BEQ :TCONT
INC CNT1
JMP :TLP1
:TCONT
INC CNT2
LDY CNT1
STY LINE ; STORE LENGTH
SPRN LINE
LDY CNT2
CPY #20
BNE :TCON
:KW
LDA $C000 ; CHECK FOR KEYPRESS
BPL :KW ; KEEP WAITING
AND #$7F ; TURN OFF BIT 7
STA $C010 ; CLEAR KEYBOARD STROBE
LDY #0
STY CNT2
:TCON
JMP :TLP0
:TXTDONE
SCAT "CLOSE ";FNAME;#100
CMD RETURN
PLA
JMP REENTRY
*
*** BASIC LISTING
*
:BASIC
CMD "CLOSE"
PRN "TYPE [LIST] TO READ",8D
PRN "THE BASIC LISTING.",8D8D
SCAT "LOAD ";FNAME;#100
JMP REENTRY
*
********************************
* *
* VARIABLES *
* *
********************************
*
FTYPE DS 2
TFOUND DS 1
FNAME DS 50
CNT1 DS 2
CNT2 DS 1
TEMP DS 2
LDADDR DS 2
LDLEN DS 2
LEFT DS 1
RIGHT DS 2
LINE DS 256
BLOAD1 DS 256
BLOAD2 DS 256
*
********************************
* *
* LOW-LEVEL ROUTINES *
* *
********************************
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINES
*
*** FILEIO
*
PUT MIN.SUB.FPRINT
PUT MIN.SUB.DOSCMD
PUT MIN.SUB.FPSTR
*
*** STDIO
*
PUT MIN.SUB.DPRINT
PUT MIN.SUB.XPRINT
PUT MIN.SUB.SINPUT
*
*** STRINGS
*
PUT MIN.SUB.STRCAT
PUT MIN.SUB.PRNSTR
*

View File

@ -0,0 +1,3 @@
BLOAD MAKEEXEC
CALL -151
6000G

View File

@ -0,0 +1,3 @@
BLOAD MINIFY
CALL -151
7000G

View File

@ -0,0 +1,3 @@
BLOAD RDF
CALL -151
7000G

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,599 @@
********************************
* *
* PERFECT MAZE GENERATOR *
* *
********************************
*
** ASSEMBLER DIRECTIVES
*
CYC AVE
EXP ONLY ; TURN OFF LATER
DSK MAKEMAZE
TR ON
OBJ $BFE0
ORG $6000
*
PUT MIN.VARS.REQUIRED
USE MIN.MAC.REQUIRED
USE MIN.MAC.ARRAYS
USE MIN.MAC.MATH
USE MIN.MAC.STDIO
PUT MIN.HOOKS.REQUIRED
PUT MIN.HOOKS.STDIO
PUT MIN.HOOKS.MATH
PUT MIN.HOOKS.ARRAYS
*
********************************
* *
* CONSTANT DECLARATIONS *
* *
********************************
*
XLEN KBD "ENTER MAZE SIZE"
XNUM EQU 2*XLEN
BAS EQU $2000 ; BASE ADDRESS FOR ARRAYS
YLEN EQU XLEN ; CURRENT ALGO ONLY DOES SQUARE
XMAX EQU XLEN+1 ; ADD EXTRA COLUMN
YMAX EQU YLEN+1 ; ADD EXTRA ROW
ASZ EQU XMAX*YMAX+10 ; ARRAY SIZE+INFO BYTES
XSTAKS EQU ASZ*2+1 ; COLUMN STACK SIZE; X * Y + 1
YSTAKS EQU ASZ*2+1 ; ROW STACK SIZE; X * Y + 1
*
SOUTHW EQU BAS ; SOUTH WALLS ARRAY
WESTW EQU ASZ+BAS ; WEST WALLS ARRAY
VISITED EQU 2*ASZ+BAS ; CELLS VISITED
XSTACK EQU 3*ASZ+BAS ; STACK FOR COLUMNS
YSTACK EQU 3*ASZ+BAS+XSTAKS ; STACK FOR ROWS
*
********************************
* *
* MAIN PROGRAM LOOP *
* *
********************************
*
INIT
*
JSR HOME
PRN "INITIALIZING...",8D
*
JSR :SETVARS
JSR :OUTWALLS
*
** GET RANDOM STARTING POINT
*
RNDB #2;#<XLEN ; RANDOM STARTING POINT
STA XX ; BETWEEN 2 AND XLEN LOBYTE
RNDB #2;#<YLEN ; RANDOM STARTING POINT
STA YY ; BETWEEN 2 AND YLEN LOBYTE
LDA #>XLEN ; IF XLEN HIBYTE IS 0,
CMP #0 ; THEN SKIP SETTING XX HIBYTE
BEQ :SKIPHI
LDA #>YLEN ; IF YLEN HIBYTE IS 0,
CMP #0 ; THEN SKIP SETTING YY HIBYTE
BEQ :SKIPHI
RNDB #1;#>XLEN ; RANDOMLY SET XX HIBYTE
STA XX+1
RNDB #1;#>YLEN ; RANDOMLY SET YY HIBYTE
STA YY+1
JMP BUILD
:SKIPHI ; JUST SET HIBYTES TO 0
LDA #0
STA XX+1
STA YY+1
*
JMP BUILD
*
********************************
*
:SETVARS
*
** DIM ARRAYS AND FILL
*
DIM162 #SOUTHW;#XMAX;#YMAX;#1;#1
DIM162 #WESTW;#XMAX;#YMAX;#1;#1
DIM162 #VISITED;#XMAX;#YMAX;#1;#0
DIM161 #XSTACK;#XSTAKS;#2;#0
DIM161 #YSTACK;#YSTAKS;#2;#0
*
** NOW ASSIGN VARIABLE VALUES
*
LDA #0
STA SPTR ; INIT STACK POINTER
STA V0
LDA #1
STA V1
RTS
*
********************************
*
:OUTWALLS
*
** MAKE COLUMN MIN AND MAX TO BE ALL
** WALL (CODE: 1).
*
LDA #0 ; CLEAR ALL TO 0 FIRST
STA XX
STA YY
STA XX+1
STA YY+1
JMP :COLCONT ; SKIP FIRST INCREMENT
*
:COLEDGE
LDA XX
CLC
ADC #1
STA XX
BCC :COLCONT ; IF CARRY SET, THEN INC HIBYTE
INC XX+1
:COLCONT
PUT162 #V1;#VISITED;XX;#0
PUT162 #V1;#VISITED;XX;#YMAX-1
LDA XX
CMP #<XMAX-1 ; IF XX LO < MAX SIZE, REPEAT
BNE :COLEDGE
LDA XX+1 ; TEST HI BIT
CMP #>XMAX ; IF XX HI < MAX HI, REPEAT
BNE :COLEDGE
*
** MAKE MIN AND MAX ROWS TO BE ALL WALL
*
JMP :ROWCONT ; SKIP FIRST INCREMENT
*
:ROWEDGE
LDA YY
CLC
ADC #1
STA YY
BCC :ROWCONT ; IF CARRY SET, INC HIBYTE
INC YY+1
:ROWCONT
PUT162 #V1;#VISITED;#0;YY
PUT162 #V1;#VISITED;#XMAX-1;YY
LDA YY
CMP #<YMAX-1 ; IF YY LO < YMAX LO, REPEAT
BNE :ROWEDGE
LDA YY+1
CMP #>YMAX ; IF YY HI < YMAX HI, REPEAT
BNE :ROWEDGE
RTS
*
********************************
* *
* BUILD THE MAZE *
* *
********************************
*
BUILD
*
PRN "BUILDING MAZE...",8D8D
JMP CONTSPTR ; SKIP FIRST INC
*
********************************
*
STAKPUSH
*
LDA SPTR ; INCREMENT STACK POINTER
CLC
ADC #1
STA SPTR
BCC CONTSPTR ; IF CARRY SET, INC POINTER HI
INC SPTR+1
CONTSPTR
PUT161 #XX;#XSTACK;SPTR ; PUT COL ON STACK
PUT161 #YY;#YSTACK;SPTR ; PUT ROW ON STACK
PUT162 #V1;#VISITED;XX;YY ; MARK BLOCK AS VISITED
*
********************************
*
CHECKALL
*
** CHECKS ALL ADJACENT BLOCKS FOR A WALL. IF
** COMPLETELY SURROUNDED, POP THE STACK AND
** AND START OVER UNTIL.
*
LDA YY+1 ; COPY HI BYTES OF XX,YY FIRST
STA YP1+1
STA YM1+1
LDA XX+1
STA XP1+1
STA XM1+1
*
LDA YY ; CALC AND STORE YY+1
CLC
ADC #1
STA YP1
BCC :YP1CNT ; IF CARRY SET, INC YYP1 HI
INC YP1+1
:YP1CNT
LDA XX ; CALC AND STORE XX+1
CLC
ADC #1
STA XP1
BCC :XP1CNT ; IF CARRY SET, INC XP1 HI
INC XP1+1
:XP1CNT
LDA YY ; CALC AND STORE YY-1
SEC
SBC #1
STA YM1
BCS :YM1CNT ; IF CARRY CLEAR, DEC YM1 HI
DEC YM1+1
:YM1CNT
LDA XX ; CALC AND STORE XX-1
SEC
SBC #1
STA XM1
BCS :XM1CNT ; IF CARRY CLEAR, DEC XM1 HI
DEC XM1+1
:XM1CNT
*JSR CELLPOS
*
** NOW CHECK ADJACENT CELLS FOR WALLS
*
:IF1 ; IF VISITED(XX,YY+1) = 1
LDA YY+1 ; IF YY HI BYTE = YMAX HI BYTE,
CMP #>YMAX ; THEN TEST YY LOW BYTE
BNE :IF1TEST
LDA YY
CMP #<YMAX ; IF YY LOBYTE = YMAX LOBYTE, THEN
BEQ :IF2 ; AUTOMATICALLY ASSUME ITS A WALL
*
:IF1TEST
GET162 #VISITED;XX;YP1
LDA RETURN
CMP #1
BEQ :IF2 ; IF CELL BELOW IS A WALL
; CONTINUE TESTING OTHER
; ADJACENT CELLS
JMP DOMOVE ; OTHERWISE, EXIT CONDITIONAL
*
:IF2 ; IF VISITED(X+1,Y) = 1
*
LDA XX+1 ; IF XX HI BYTE = XMAX HIBYTE
CMP #>XMAX ; THEN TEST LOBYTE
BNE :IF2TEST
LDA XX ; IF XX LOBYTE = XMAX LOBYTE
CMP #<XMAX-1 ; THEN ASSUME RIGHT CELL = WALL
BEQ :IF3
:IF2TEST
GET162 #VISITED;XP1;YY ; IF CELL TO RIGHT
LDA RETURN ; IS A WALL, THEN
CMP #1 ; CONTINUE CELL TESTING;
BEQ :IF3 ; ELSE, REPEAT MOVE
JMP DOMOVE
*
:IF3 ; IF VISITED(XX,YY-1) = 1
LDA YY+1 ; IF YY HIBYTE = 0 THEN TEST
CMP #0 ; LOBYTE
BNE :IF3TEST
LDA YY ; IF YY LOBYTE = 0 THEN
CMP #0 ; ASSUME UPPER CELL = WALL
BEQ :IF4 ; AND CONTINUE TESTING
:IF3TEST
GET162 #VISITED;XX;YM1
LDA RETURN ; IF CELL ABOVE IS WALL THEN
CMP #1 ; CONTINUE TESTING CELLS;
BEQ :IF4 ; ELSE, REPEAT MOVE
JMP DOMOVE
*
:IF4 ; IF VISITED(XX-1,YY) = 1
LDA XX+1 ; IF XX HIBYTE = 0
CMP #0 ; THEN TEST LOBYTES
BNE :IF4TEST
LDA XX ; IF XX LOBYTE = 0
CMP #0 ; THEN ASSUME LEFT CELL = WALL
BEQ :POP ; AND POP THE STACK
:IF4TEST
GET162 #VISITED;XM1;YY
LDA RETURN ; IF LEFT CELL = 1
CMP #1 ; THEN ALL ADJACENT CELLS ARE WALLS
BEQ :POP ; SO POP THE STACK
*
JMP DOMOVE ; OTHERWISE, REPEAT MOVING
*
********************************
*
:POP
*
GET161 #XSTACK;SPTR ; GET NEW XX POSITION
LDA RETURN
STA XX ; STORE LO BYTE
LDA RETURN+1
STA XX+1 ; STORE HI BYTE
GET161 #YSTACK;SPTR
LDA RETURN ; GET NEW Y POSITION
STA YY
LDA RETURN+1
STA YY+1
LDA SPTR ; POP STACK
SEC
SBC #1
STA SPTR
BCS :SPCNT2 ; IF CARRY NOT SET, DEC HIBYTE
DEC SPTR+1
:SPCNT2
LDA SPTR+1 ; IF POINTER HIBYTE > 0
CMP #0 ; THEN REPEAT MOVEMENT
BNE :DOREPEAT
LDA SPTR ; OTHERWISE, TEST LOBYTE
CMP #1 ; IF STILL MORE ON STACK
BEQ :DOREPEAT
BCS :DOREPEAT ; THEN REPEAT MOVEMENT
JMP DISPMAZE ; OTHERWISE, FINISHED!
*
:DOREPEAT
JMP CHECKALL
*
********************************
*
DOMOVE
*
** MOVE IN A RANDOM DIRECTION
*
JSR RAND8
CMP #64 ; IF RND < 64
BCC :MVDJ
CMP #128 ; ELSE IF RND < 128
BCC :MVRJ
CMP #192 ; ELSE IF RND < 192
BCC :MVUPJ
JMP :MVLEFT ; ELSE RND IS > 191
:MVUPJ JMP :MVUP
:MVRJ JMP :MVRIGHT
:MVDJ JMP :MVDOWN
*
:MVDOWN
LDA YY+1 ; IF YY HIBYTE = YMAX HIBYTE
CMP #>YMAX ; THEN TEST LOBYTES
BNE :DTEST ; OTHERWISE, TEST CELL BELOW
LDA YY
CMP #<YMAX ; IF YY LOBYTE = YMAX LOBYTE
BEQ :DNO ; THEN ASSUME CELL BELOW = WALL
:DTEST
GET162 #VISITED;XX;YP1
LDA RETURN
CMP #0 ; IF CELL BELOW NOT A WALL
BEQ :DOWNGO ; THEN MOVE DOWN
:DNO
JMP DOMOVE ; ELSE, TRY MOVING ELSEWHERE
:DOWNGO
PUT162 #V0;#SOUTHW;XX;YY ; PUT 0 AT CURRENT POSITION
LDA YP1 ; INCREASE YY POSITION (MOVE DOWN)
STA YY
LDA YP1+1
STA YY+1
:DOWNC
JMP STAKPUSH ; PUSH POSITION TO STACK, REPEAT
*
:MVRIGHT
LDA XX+1 ; IF XX HIBYTE = XMAX HIBYTE
CMP #>XMAX ; THEN TEST LOW BYTE
BNE :RTEST ; ELSE CONTINUE CELL CHECK
LDA XX
CMP #<XMAX-1 ; IF XX LOBYTE = XMAX LOBYTE
BEQ :RNO ; THEN ASSUME WALL TO RIGHT
; AND SKIP THE CHECK
:RTEST
GET162 #VISITED;XP1;YY
LDA RETURN ; IF CELL TO RIGHT IS NOT WALL
CMP #0 ; THEN MOVE THERE
BEQ :RIGHTGO
:RNO
JMP DOMOVE ; OTHERWISE, TRY MOVING ELSEWHERE
:RIGHTGO
PUT162 #V0;#WESTW;XP1;YY ; MARK RIGHT CELL AS EMPTY
LDA XP1 ; MOVE TO RIGHT CELL
STA XX
LDA XP1+1
STA XX+1
:RIGHTC
JMP STAKPUSH
*
:MVUP
LDA YY+1 ; IF YY HIBYTE != 0 THEN
CMP #0 ; SKIP LOBYTE TEST
BNE :UTEST
LDA YY ; IF YY LOBYTE = 0 THEN
CMP #0 ; ASSUME UP CELL IS WALL
BEQ :UNO ; AND MOVE ELSEWHERE
:UTEST
GET162 #VISITED;XX;YM1
LDA RETURN ; IF VISITED(XX,YY) = 0
CMP #0 ; (NO WALL) THEN
BEQ :UPGO ; MOVE ON UP THERE
:UNO
JMP DOMOVE
:UPGO
PUT162 #V0;#SOUTHW;XX;YM1
LDA YM1 ; MOVE UP ONE CELL
STA YY
LDA YM1+1
STA YY+1
:UPC
JMP STAKPUSH
*
:MVLEFT
LDA XX+1 ; IF XX HIBYTE != 0 THEN
CMP #0 ; SKIP LOBYTE TEST
BNE :LTEST
LDA XX ; IF XX LOBYTE = 0
CMP #0 ; THEN ASSME LEFT CELL IS WALL
BEQ :LNO ; AND TRY TO MOVE ELSEWHERE
:LTEST
GET162 #VISITED;XM1;YY
LDA RETURN ; IF LEFT CELL IS NOT A WALL
CMP #0 ; THEN LET'S MOVE THERE
BEQ :LEFTGO
:LNO
JMP DOMOVE
:LEFTGO
PUT162 #V0;#WESTW;XX;YY
LDA XM1 ; MOVE ONE CELL LEFT
STA XX
LDA XM1+1
STA XX+1
:LEFTC
JMP STAKPUSH
*
********************************
* *
* DISPLAY THE MAZE *
* *
********************************
*
DISPMAZE
*
** SEND MAZE TO DISPLAY OUTPUT, FORMATTED
*
PRN "PRINTING...",8D8D
LDA #0
STA XX
:XLOOP ; PRINT FIRST LINE OF WALLS
INC XX
PRN "X"
LDA XX
CMP #XNUM-1
BNE :XLOOP
PRN " ",8D
*
LDA #0 ; RESET XX,YY
STA XX+1
STA YY+1
LDA #1
STA XX
STA YY
WLP
*
** IF WESTW(X,Y) == 0
*
GET162 #WESTW;XX;YY
LDA RETURN
CMP #0
BEQ NOWALLW ; THEN PRINT ...
YESWALLW ; ELSE PRINT X..
PRN "X "
JMP CONTWLP
NOWALLW
PRN " "
*
CONTWLP
LDA XX ; INCREASE XX
CLC
ADC #1 ; LOBYTE FIRST
STA XX
BCC :SKIPHI ; IF HI = 0, SKIP INC
INC XX+1
:SKIPHI
LDA XX+1 ; IF HIBYTE != XMAX HI
CMP #>XMAX
BNE WLP ; THEN REPEAT
LDA XX ; OTHERWISE, TEST LOWS
CMP #<XMAX-1 ; IF LOBYTE != XMAX-1
BNE WLP ; REPEAT
*
PRN "X",8D ; OTHERWISE, GO TO NEXT LINE
*
LDA #1 ; RESET XX COUNTER
STA XX
LDA #0
STA XX+1
*
** IF SOUTHW(X,Y) == 0
*
SLP
GET162 #SOUTHW;XX;YY
LDA RETURN
CMP #0
BEQ NOSOUTH ; THEN PRINT X..
YSOUTH ; ELSE PRINT XXX
PRN "XX"
JMP CONTSLP
NOSOUTH
PRN "X "
CONTSLP
LDA XX ; INCREASE XX BY 1
CLC
ADC #1
STA XX
BCC :SKIPHI2 ; SKIP HI INC IF NO CARRY
INC XX+1
:SKIPHI2
LDA XX+1 ; TEST HIBYTE OF XX
CMP #>XMAX ; IF HI != XMAX HI
BNE SLP ; REPEAT
LDA XX ; ELSE, TEST LOBYTE
CMP #<XMAX-1 ; IF XX LO != XMAX LO - 1
BNE SLP ; REPEAT
*
PRN "X",8D ; OTHERWISE, NEW LINE
*
LDA #0 ; RESET XX
STA XX+1
LDA #1
STA XX
LDA YY ; INCREASE YY BY 1
CLC
ADC #1
STA YY
BCC :SKIP ; IF NO CARRY, SKIP HI INC
INC YY+1
:SKIP
LDA YY+1 ; IF YY HI != YMAX HI
CMP #>YMAX ; THEN NOT DONE; REPEAT LOOPS
BNE REPT
LDA YY ; ELSE IF YY LO != YMAX LO
CMP #<YMAX-1 ; THEN NOT DONE; REPEAT LOOPS
BEQ DISPEXIT ; OTHERWISE, DONE!
REPT JMP WLP
*
DISPEXIT
*
_WAIT
JMP REENTRY
*
********************************
* *
* VARIABLES *
* *
********************************
*
V0 DS 1 ; USED BECAUSE OF CURRENT
V1 DS 1 ; ARRAY DIM LIMITATIONS
*
XX DS 2 ; CURRENT COLUMN
YY DS 2 ; CURRENT ROW
SPTR DS 2 ; ARRAY STACK POINTER
XP1 DS 2 ; X PLUS ONE
XM1 DS 2 ; X MINUS ONE
YP1 DS 2 ; Y PLUS ONE
YM1 DS 2 ; Y MINUS ONE
*
********************************
* *
* LOW-LEVEL ROUTINES *
* *
********************************
*
PUT MIN.LIB.REQUIRED
*
** INDIVIDUAL SUBROUTINES
*
** ARRAYS
*
PUT MIN.SUB.ADIM161
PUT MIN.SUB.ADIM162
PUT MIN.SUB.AGET161
PUT MIN.SUB.AGET162
PUT MIN.SUB.APUT161
PUT MIN.SUB.APUT162
*
** MATH
*
PUT MIN.SUB.RAND8
PUT MIN.SUB.RANDB
*
** STDIO
*
PUT MIN.SUB.DPRINT
PUT MIN.SUB.XPRINT
*

View File

@ -0,0 +1,2 @@
ARRMAX EQU 8192

View File

@ -0,0 +1,43 @@
STEP00 EQU $C080
STEP01 EQU $C081
STEP10 EQU $C082
STEP11 EQU $C083
STEP20 EQU $C084
STEP21 EQU $C085
STEP30 EQU $C086
STEP31 EQU $C087
MOTON EQU $C088
MOTOFF EQU $C089
DRV0EN EQU $C08A
DRV1EN EQU $C08B
Q6CLR EQU $C08C
Q6SET EQU $C08D
Q7CLR EQU $C08E
Q7SET EQU $C08F
CWRITE EQU $FECD
CREAD EQU $FEFD
IOB EQU $B7E8
IOB_SLOT EQU $B7E9
IOB_DRIV EQU $B7EA
IOB_EVOL EQU $B7EB
IOB_TRAK EQU $B7EC
IOB_SECT EQU $B7ED
IOB_DCTL EQU $B7EE
IOB_DCTH EQU $B7EF
IOB_BUFL EQU $B7F0
IOB_BUFH EQU $B7F1
IOB_COMM EQU $B7F4 ; COMMAND CODE
IOB_ERR EQU $B7F5
IOB_AVOL EQU $B7F6
IOB_PRES EQU $B7F7
IOB_PRED EQU $B7F8
RWTS EQU $3D9
FCOUT EQU $FDED
LANG EQU $AAB6
CURLIN EQU $75
PROMPT EQU $33
FGET EQU $FD0C
FGETLN EQU $FD6F
DOSERR EQU $DE

View File

@ -0,0 +1,22 @@
GETNUM EQU $FFA7
RNDL EQU $4E
RNDH EQU $4F
FAC EQU $9D
FSUB EQU $E7A7
FADD EQU $E7BE
FMULT EQU $E97F
FDIV EQU $EA66
FMULTT EQU $E982
FDIVT EQU $EA69
FADDT EQU $E7C1
FSUBT EQU $E7AA
MOVFM EQU $EAF9
MOVMF EQU $EB2B
NORM EQU $E82E
CONUPK EQU $E9E3
FLOG EQU $E941
FSQR EQU $EE8D
FCOS EQU $EFEA
FSIN EQU $EFF1
FTAN EQU $F03A
FATN EQU $F09E

View File

@ -0,0 +1,36 @@
COUT1 EQU $FDF0
COUT EQU $FDED
HOME EQU $FC58
VTAB EQU $FC22
CURSH EQU $24
CURSV EQU $25
WNDLEFT EQU $20
WNDWIDTH EQU $21
WNDTOP EQU $22
WNDBOT EQU $23
TEXTP1 EQU $0400
TEXTP2 EQU $0800
PAGE1 EQU $C054
PAGE2 EQU $C055
S80COL EQU $C01F ; READ ONLY
KEYBUFF EQU $0200
GSTROBE EQU $C040
TXTSET EQU $C051
SETWND EQU $FB4B
CURADV EQU $FBF4
CURBS EQU $FC10
CURUP EQU $FC1A
CR EQU $FC62
LF EQU $FC66
CLEOL EQU $FC9C
KYBD EQU $C000
STROBE EQU $C010
GETLN EQU $FD6F
GETKEY EQU $FD0C
OPAPP EQU $C061
CLAPP EQU $C062
PREAD EQU $FB1E
PB0 EQU $C061
PB1 EQU $C062
PB2 EQU $C063
PB3 EQU $C060

View File

@ -0,0 +1 @@
SCOUT1 EQU $FDF0

View File

@ -1,23 +1,32 @@
__GETRET
LDY #255
PLA
STA :RET
PLA
STA :RET+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #255
:LP
INY
LDA RETURN,Y
STA (ADDR1),Y
CPY RETLEN
BNE :LP
LDA ADDR1+1
LDA :RET+1
PHA
LDA ADDR1
LDA :RET
PHA
RTS
:RET DS 2
__SETPARM
LDY #255
PLA
STA :RET
PLA
STA :RET+1
PLA
STA ADDR1
PLA
STA ADDR1+1
@ -27,11 +36,12 @@ __SETPARM
STA PARAM,Y
CPY PARLEN
BNE :LP
LDA ADDR1+1
LDA :RET+1
PHA
LDA ADDR1
LDA :RET
PHA
RTS
:RET DS 2
__DUMP
PLA
STA :RET
@ -73,21 +83,21 @@ __DUMP
TAX
LDA HEXTAB,X
JSR $FDF0
LDA #186 ; :
LDA #186
JSR $FDF0
LDA #160 ; SPC
LDA #160
JSR $FDF0
LDY #0
:LP
LDA (ADDR3),Y
AND #$F0 ; MASK RIGHT
AND #$F0
LSR
LSR
LSR
LSR
STA :LEFT
LDA (ADDR3),Y
AND #$0F ; MASK LEFT
AND #$0F
STA :RIGHT
LDX :LEFT
LDA HEXTAB,X
@ -177,14 +187,14 @@ __RDMP
_PRNT "=============",8D
_PRNT "A: "
LDA ERRA
AND #$F0 ; MASK RIGHT
AND #$F0
LSR
LSR
LSR
LSR
STA :LEFT
LDA ERRA
AND #$0F ; MASK LEFT
AND #$0F
STA :RIGHT
LDX :LEFT
LDA HEXTAB,X
@ -195,14 +205,14 @@ __RDMP
_PRNT " ",8D
_PRNT "X: "
LDA ERRX
AND #$F0 ; MASK RIGHT
AND #$F0
LSR
LSR
LSR
LSR
STA :LEFT
LDA ERRX
AND #$0F ; MASK LEFT
AND #$0F
STA :RIGHT
LDX :LEFT
LDA HEXTAB,X
@ -213,14 +223,14 @@ __RDMP
_PRNT " ",8D
_PRNT "Y: "
LDA ERRY
AND #$F0 ; MASK RIGHT
AND #$F0
LSR
LSR
LSR
LSR
STA :LEFT
LDA ERRY
AND #$0F ; MASK LEFT
AND #$0F
STA :RIGHT
LDX :LEFT
LDA HEXTAB,X
@ -274,23 +284,23 @@ __ERR
PLA
STA RETADR+1
PLA
STA :DUMPLEN ; LENGTH OF DUMP
STA :DUMPLEN
PLA
STA :DUMP ; DUMP ADDRESS LO
STA :DUMP
PLA
STA :DUMP+1 ; DUMP HI
STA :DUMP+1
PLA
STA :DMPMSG
PLA
STA :DMPMSG+1
PLA
STA :MESG ; ERROR MESSAGE ADDR LO
STA :MESG
PLA
STA :MESG+1 ; HI
STA :MESG+1
PLA
STA :SRID ; SUBROUTINE ID ADDR LO
STA :SRID
PLA
STA :SRID+1 ; SUB ID HI
STA :SRID+1
_PRNT " ",87878787878D8D
_PRNT "ERROR!",8D8D
_PRNT "SUBROUTINE: "
@ -358,7 +368,7 @@ __ERR
:KILL
_PRNT " ",8D8D
_PRNT "BREAK AT: "
_DUMP :RET;#2
DUMP #:RET;#2
JMP $3D0
:DUMPLEN DS 1
:DUMP DS 2
@ -366,3 +376,26 @@ __ERR
:MESG DS 2
:SRID DS 2
:RET DS 2
__ERRH
PLA
STA :RET
PLA
STA :RET+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA #$FFC
STA $D8
LDY #0
LDA (ADDR1),Y
STA $9D5A
INY
LDA (ADDR1),Y
STA $9D5B
LDA :RET+1
PHA
LDA :RET
PHA
RTS
:RET DS 2

View File

@ -0,0 +1,95 @@
DIM81 MAC
_ISLIT ]1
LDA ]2
PHA
LDA ]3
PHA
LDA ]4
PHA
JSR ADIM81
<<<
GET81 MAC
_ISLIT ]1
LDA ]2
PHA
JSR AGET81
<<<
PUT81 MAC
_ISLIT ]1
_ISLIT ]2
LDA ]3
PHA
JSR APUT81
<<<
DIM82 MAC
_ISLIT ]1
LDA ]2
PHA
LDA ]3
PHA
LDA ]4
PHA
LDA ]5
PHA
JSR ADIM82
<<<
GET82 MAC
_ISLIT ]1
LDA ]2
PHA
LDA ]3
PHA
JSR AGET82
<<<
PUT82 MAC
_ISLIT ]1
_ISLIT ]2
LDA ]3
PHA
LDA ]4
PHA
JSR APUT82
<<<
DIM161 MAC
_ISLIT ]1
_ISLIT ]2
LDA ]3
PHA
LDA ]4
PHA
JSR ADIM161
<<<
PUT161 MAC
_ISLIT ]1
_ISLIT ]2
_ISLIT ]3
JSR APUT161
<<<
GET161 MAC
_ISLIT ]1
_ISLIT ]2
JSR AGET161
<<<
DIM162 MAC
_ISLIT ]1
_ISLIT ]2
_ISLIT ]3
LDA ]4
PHA
LDA ]5
PHA
JSR ADIM162
<<<
PUT162 MAC
_ISLIT ]1
_ISLIT ]2
_ISLIT ]3
_ISLIT ]4
JSR APUT162
<<<
GET162 MAC
_ISLIT ]1
_ISLIT ]2
_ISLIT ]3
JSR AGET162
<<<

View File

@ -8,33 +8,26 @@ BSAVE MAC
<<<
AMODE MAC
LDA #1
STA $AAB6 ; DOS LANG FLAG
STA $75+1 ; NOT IN DIRECT MODE
STA $33 ; NOT IN DIRECT MODE
STA $AAB6
STA $75+1
STA $33
<<<
CMD MAC
_ISSTR ]1
JSR DOSCMD
ASC ]1
HEX 8D00
<<<
FPRN MAC
IF ",]1
JSR FPRINT
ASC ]1
HEX 8D00
ELSE ; IF PARAM IS ADDR
LDA #>]1
PHA
LDA #<]1
PHA
JSR FPSTR ; PRINT STRING
ELSE
_ISLIT ]1
JSR FPSTR
FIN
<<<
FINP MAC
LDA #>]1
PHA
LDA #<]1
PHA
_ISLIT ]1
JSR FINPUT
<<<
SLOT MAC
@ -43,7 +36,7 @@ SLOT MAC
ASL SCRATCH
ASL SCRATCH
ASL SCRATCH
ASL SCRATCH ; MUL BY 16
ASL SCRATCH
LDA SCRATCH
STA IOB_SLOT
<<<

View File

@ -16,25 +16,25 @@ MUL16 MAC
DIV16 MAC
_ISLIT ]1
_ISLIT ]2
IF S,]3 ; SIGNED
IF S,]3
JSR SDIVD16
ELSE
JSR UDIVD16 ; UNSIGNED
JSR UDIVD16
FIN
<<<
REM16 MAC
_ISLIT ]1
_ISLIT ]2
IF S,]3 ; SIGNED
IF S,]3
JSR SREMD16
ELSE
JSR UREMD16 ; UNSIGNED
JSR UREMD16
FIN
<<<
RNDB MAC
LDA ]1 ; LOW
LDA ]1
PHA
LDA ]2 ; HIGH
LDA ]2
PHA
JSR RANDB
<<<

View File

@ -0,0 +1,89 @@
_ISLIT MAC
IF #=]1
LDA ]1/$100
PHA
LDA ]1
PHA
ELSE
LDA ]1+1
PHA
LDA ]1
PHA
FIN
<<<
_ISSTR MAC
IF "=]1
JMP STRCONT
]STRTMP STR ]1
STRCONT
LDY #0
LDA ]STRTMP
STA PARLEN
STA PARAM
]STRLP1
INY
LDA ]STRTMP,Y
STA PARAM,Y
CPY PARLEN
BNE ]STRLP1
LDA #>PARAM
PHA
LDA #<PARAM
PHA
ELSE
_ISLIT ]1
FIN
<<<
GRET MAC
_ISLIT ]1
JSR __GETRET
<<<
SPAR MAC
_ISLIT ]1
JSR __SETPARM
<<<
DUMP MAC
_ISLIT ]1
LDA ]2
PHA
JSR __DUMP
<<<
_PRNT MAC
JSR __P
ASC ]1
HEX 00
<<<
_WAIT MAC
JSR __W
<<<
_RDUMP MAC
JSR __RDMP
<<<
_ERR MAC
_ISLIT ]1
_ISLIT ]2
_ISLIT ]3
_ISLIT ]4
LDA ]5
PHA
JSR __ERR
<<<
ERRH MAC
LDA #1
STA $AAB6
STA $75+1
STA $33
LDA #$FF
STA $D8
IF #=]1
LDA ]1
STA $9D5A
LDA ]1/$100
STA $9D5B
ELSE
LDA ]1
STA $9D5A
LDA ]1+1
STA $9D5B
FIN
<<<

View File

@ -5,17 +5,10 @@ PRN MAC
HEX 00 ; STRING TERMINATE
ELSE ; ELSE, PARAM IS
; MEMORY LOCATION
LDA #>]1 ; PUSH HIGH BYTE
PHA ; TO STACK
LDA #<]1 ; PUSH LOW BYTE
PHA
_ISLIT ]1
JSR DPRINT
FIN
<<<
PCR MAC
LDA #$8D
JSR COUT1
<<<
INP MAC
JSR SINPUT
<<<
@ -64,14 +57,11 @@ RCPOS MAC
LDA ($26),Y ; LOW OF ADDR OF CHAR
<<<
PDL MAC ; GET PADDLE VALUE
LDX #]1 ; READ PADDLE # ]1 (USUALLY 0)
LDX ]1
JSR PREAD ; PADDLE READING STORED IN Y
<<<
PBX MAC
LDA #>]1
PHA
LDA #<]1
PHA
_ISLIT ]1
JSR GPBX
<<<
TVLIN MAC
@ -118,3 +108,29 @@ TPUT MAC
PHA
JSR TXTPUT
<<<
DIE80 MAC
LDA #21
JSR COUT
<<<
COL80 MAC
LDA #18
JSR COUT
<<<
COL40 MAC
LDA #17
JSR COUT
<<<
MTXT0 MAC
LDA #24
JSR COUT
<<<
MTXT1 MAC
LDA #27
JSR COUT
<<<
WAIT MAC
]WTLP LDA $C000
BPL ]WTLP
AND #$7F
STA $C010
<<<

View File

@ -0,0 +1,48 @@
SCMP MAC
_ISSTR ]1
_ISSTR ]2
JSR STRCMP
<<<
SCAT MAC
_ISSTR ]1
_ISSTR ]2
LDA ]3 ; MAX SIZE
PHA
JSR STRCAT
<<<
SPRN MAC
_ISLIT ]1
JSR PRNSTR
<<<
SPOS MAC
_ISSTR ]1
_ISSTR ]2
JSR SUBPOS
<<<
SCPY MAC
_ISSTR ]1
LDA ]2
PHA
LDA ]3
PHA
LDA ]4
PHA
JSR SUBCOPY
<<<
SDEL MAC
_ISLIT ]1
LDA ]2
PHA
LDA ]3
PHA
JSR SUBDEL
<<<
SINS MAC
_ISLIT ]1
LDA ]2
PHA
LDA ]3
PHA
_ISSTR ]4
JSR SUBINS
<<<

View File

@ -0,0 +1,100 @@
ADIM161
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :FILL
PLA
STA :ESIZE
STA :ESZBAK
PLA
STA :ASIZE
STA :ASZBAK
PLA
STA :ASIZE+1
STA :ASZBAK+1
STA SCRATCH
PLA
STA ADDR1
STA ADDR2
PLA
STA ADDR1+1
STA ADDR2+1
LDY #0
LDA #0
BEQ :ENTLP
:DOADD
CLC
ADC :ASIZE
TAX
TYA
ADC SCRATCH
TAY
TXA
:LP
ASL :ASIZE
ROL SCRATCH
:ENTLP
LSR :ESIZE
BCS :DOADD
BNE :LP
CLC
INX
INX
BCC :NOINY
INY
:NOINY
STX :MSIZE
STY :MSIZE+1
LDA :FILL
LDX :MSIZE+1
BEQ :PART
LDY #0
:FULL
STA (ADDR1),Y
INY
BNE :FULL
INC ADDR1+1
DEX
BNE :FULL
:PART
LDX :MSIZE
BEQ :MFEXIT
LDY #0
:PARTLP
STA (ADDR1),Y
INY
DEX
BNE :PARTLP
:MFEXIT
LDY #0
LDA :ASZBAK
STA (ADDR2),Y
INY
LDA :ASZBAK+1
STA (ADDR2),Y
INY
LDA :ESZBAK
STA (ADDR2),Y
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY ADDR1
LDX ADDR1+1
LDA :ASZBAK
LDA :MSIZE
STA RETURN
LDA :MSIZE+1
STA RETURN+1
LDA #2
STA RETLEN
RTS
:MSIZE DS 2
:ASIZE DS 2
:ESIZE DS 1
:ASZBAK DS 2
:ESZBAK DS 1
:FILL DS 1

View File

@ -0,0 +1,185 @@
ADIM162
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :FILL
PLA
STA :ELEN
PLA
STA :AYSIZE
STA :AYBAK
STA :MCAND
PLA
STA :AYSIZE+1
STA :AYBAK+1
STA :MCAND+1
PLA
STA :AXSIZE
STA :AXBAK
STA :MLIER
PLA
STA :AXSIZE+1
STA :AXBAK+1
STA :MLIER+1
PLA
STA ADDR1
STA ADDR4
PLA
STA ADDR1+1
STA ADDR4+1
LDA #0
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFT_R
LSR :MLIER+1
ROR :MLIER
BCC :ROT_R
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROT_R
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFT_R
LDA :ELEN
STA :MCAND
LDA #0
STA :MCAND+1
LDA :PROD
STA :MLIER
LDA :PROD+1
STA :MLIER+1
LDA #0
STA :PROD
STA :PROD+1
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFTR LSR :MLIER+1
ROR :MLIER
BCC :ROTR
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROTR
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFTR
CLC
LDA :PROD
ADC #5
STA :PROD
BCC :NOCAR
INC :PROD+1
:NOCAR
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :PROD+2
CMP #0
BNE :EMAX
LDA :PROD+1
CMP #>ARRMAX
BCS :CHKCONT
BEQ :CHKCONT
JMP :ERREND
:CHKCONT
LDA :PROD
CMP #<ARRMAX
BCS :EMAX
BEQ :EMAX
JMP :ERREND
:EMAX
_ERR #:E_SID;#:E_MSG;#:E_DMP;#:PROD;#18
:ERREND
LDA :FILL
LDX :PROD+1
; GO BEYOND A 16BIT VALUE;
BEQ :PART
LDY #0
:FULL
STA (ADDR1),Y
INY
BNE :FULL
INC ADDR1+1
DEX
BNE :FULL
:PART
LDX :PROD
BEQ :MFEXIT
LDY #0
:PARTLP
STA (ADDR1),Y
INY
DEX
BNE :PARTLP
:MFEXIT
LDY #0
LDA :AXBAK
STA (ADDR4),Y
INY
LDA :AXBAK+1
STA (ADDR4),Y
INY
LDA :AYBAK
STA (ADDR4),Y
INY
LDA :AYBAK+1
STA (ADDR4),Y
INY
LDA :ELEN
STA (ADDR4),Y
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY ADDR4
LDX ADDR4+1
LDA :PROD
STA RETURN
LDA :PROD+1
STA RETURN+1
LDA :PROD+2
STA RETURN+2
LDA :PROD+3
STA RETURN+3
LDA #4
STA RETLEN
RTS
:PROD DS 4
:AXSIZE DS 2
:AYSIZE DS 2
:AXBAK DS 2
:AYBAK DS 2
:MLIER DS 2
:MCAND DS 2
:FILL DS 1
:ELEN DS 1
:E_SID ASC "ADIM162 (DIM162 MACRO)",00
:E_DMP ASC ":PROD(4) :AXSIZE(2) :AYSIZE(2)"
ASC ":AXBAK(2) :AYBAK(2) :MLIER(2)"
ASC ":MCAND(2) :FILL(1) :ELEN(1)",00
:E_MSG ASC "ARRAY TOO LARGE!",00

View File

@ -0,0 +1,119 @@
AGET161
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :AIDX
STA :IDX
PLA
STA :AIDX+1
STA SCRATCH
PLA
STA ADDR4 ; ARRAY ADDRESS
PLA
STA ADDR4+1
LDY #0
LDA (ADDR4),Y
STA :ASIZE
LDY #1
LDA (ADDR4),Y
STA :ASIZE+1
INY
LDA (ADDR4),Y
STA :ESIZE
STA :ESIZEBAK
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :IDX+1
CMP :ASIZE+1
BCS :OVFHI
JMP :ERREND
:OVFHI
LDA :IDX
CMP :ASIZE
BCS :OVF
JMP :ERREND
:OVF
_ERR #:E_SID;#:E_OVF1;#:E_DUMP;#:ESIZE;#9
:ERREND
LDY #0
LDA #0
BEQ :ENTLPA
:DOADD
CLC
ADC :AIDX
TAX
TYA
ADC SCRATCH
TAY
TXA
:LPA
ASL :AIDX
ROL SCRATCH
:ENTLPA
LSR :ESIZE
BCS :DOADD
BNE :LPA
STX :IDX
STY :IDX+1
CLC
LDA #3
ADC :IDX
STA :RES
BCS :ADDHI
JMP :XADD
:ADDHI
LDA #1
ADC :IDX+1
STA :IDX+1
:XADD
LDA :IDX+1
STA :RES+1
CLC
LDA :RES
ADC ADDR4
STA :RES
BCS :ADD1HI
JMP :XADD2
:ADD1HI
INC :RES+1
:XADD2
LDA :RES+1
ADC ADDR4+1
STA :RES+1
STA ADDR2+1
LDA :RES
STA ADDR2
LDY #0
:LP
LDA (ADDR2),Y
STA RETURN,Y
INY
CPY :ESIZEBAK
BNE :LP
LDA :ESIZEBAK
STA RETLEN
LDA RETADR+1
PHA
LDA RETADR
PHA
LDX ADDR2+1
LDY ADDR2
LDA :ESIZE
RTS
:ESIZE DS 1
:ESIZEBAK DS 1
:ASIZE DS 2
:AIDX DS 2
:IDX DS 2
:RES DS 2
:E_SID ASC "AGET161 (GET161 MACRO),",00
:E_DUMP ASC "DUMPING :ESIZE(1) :ESIZEBAK(1) :ASIZE(2)"
ASC ":AIDX(2) :IDX(2) :RES(2)",00
:E_OVF1 ASC "OUT OF BOUNDS! INDEX > ARRAY LENGTH",00

View File

@ -0,0 +1,179 @@
AGET162
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :YIDX
PLA
STA :YIDX+1
PLA
STA :XIDX
PLA
STA :XIDX+1
PLA
STA ADDR4
PLA
STA ADDR4+1
LDY #4
LDA (ADDR4),Y
STA :ESIZE
LDY #0
LDA (ADDR4),Y
STA :XLEN
LDY #1
LDA (ADDR4),Y
STA :XLEN+1
LDY #2
LDA (ADDR4),Y
STA :YLEN
LDY #3
LDA (ADDR4),Y
STA :YLEN+1
LDY #0
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :XIDX
CMP :XLEN
BCC :ECONT1
LDA :XIDX+1
CMP :XLEN+1
BEQ :ECONT1
BCC :ECONT1
_ERR #:E_SID;#:E_XOVF;#:E_DUMP;#:ESIZE;#20
:ECONT1
LDA :YIDX
CMP :YLEN
BCC :ECONT2
LDA :YIDX+1
CMP :YLEN+1
BEQ :ECONT2
BCC :ECONT2
_ERR #:E_SID;#:E_YOVF;#:E_DUMP;#:ESIZE;#20
:ECONT2
:ERREND
LDA :YIDX
STA :MLIER
LDA :YIDX+1
STA :MLIER+1
LDA :YLEN
STA :MCAND
LDA :YLEN+1
STA :MCAND+1
LDA #00
STA :PROD
STA :PROD+1
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFT_R
LSR :MLIER+1
ROR :MLIER
BCC :ROT_R
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROT_R
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFT_R
LDA :PROD
STA :PBAK
LDA :PROD+1
STA :PBAK+1
LDA :XIDX
STA :MLIER
LDA :XIDX+1
STA :MLIER+1
LDA :ESIZE
STA :MCAND
LDA #0
STA :MCAND+1
STA :PROD
STA :PROD+1
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFTR LSR :MLIER+1
ROR :MLIER
BCC :ROTR
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROTR
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFTR
CLC
LDA :PROD
ADC :PBAK
STA :PROD
LDA :PROD+1
ADC :PBAK+1
STA :PROD+1
CLC
LDA :PROD
ADC #5
STA :PROD
BCC :ADD3D
INC :PROD+1
:ADD3D
CLC
LDA :PROD
ADC ADDR4
STA :PROD
STA ADDR2
LDA :PROD+1
ADC ADDR4+1
STA :PROD+1
STA ADDR2+1
LDY #0
LDX #0
:CLP
LDA (ADDR2),Y
STA RETURN,Y
INY
CPY :ESIZE
BNE :CLP
LDA :ESIZE
STA RETLEN
LDA RETADR+1
PHA
LDA RETADR
PHA
LDX ADDR2+1
LDY ADDR2
LDA :ESIZE
RTS
:ESIZE DS 2
:XIDX DS 2
:YIDX DS 2
:MCAND DS 2
:MLIER DS 2
:PROD DS 4
:PBAK DS 2
:XLEN DS 2
:YLEN DS 2
:E_SID ASC "AGET162 (GET162 MACRO)",00
:E_DUMP ASC ":ESIZE(2) XIDX(2) YIDX(2) MCAND(2) "
ASC "MCAND(2) MLIER(2) PROD(4) PBAK(2) "
ASC "XLEN(2) YLEN(2)",00
:E_XOVF ASC "OUT OF BOUNDS! X > MAXIMUM",00
:E_YOVF ASC "OUT OF BOUNDS! Y > MAX",00

View File

@ -0,0 +1,122 @@
APUT161
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :AIDX
STA :IDX
PLA
STA :AIDX+1
STA SCRATCH
PLA
STA ADDR4 ; ARRAY ADDRESS
PLA
STA ADDR4+1
PLA
STA ADDR3
PLA
STA ADDR3+1
LDY #0
LDA (ADDR4),Y
STA :ASIZE
LDY #1
LDA (ADDR4),Y
STA :ASIZE+1
INY
LDA (ADDR4),Y
STA :ESIZE
STA :ESIZEBAK
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :IDX+1
CMP :ASIZE+1
BCS :OVFHI
JMP :ERREND
:OVFHI
LDA :IDX
CMP :ASIZE
BCS :OVF
JMP :ERREND
:OVF
_ERR #:E_SID;#:E_OVF1;#:E_DUMP;#:ESIZE;#9
:ERREND
LDY #0
LDA #0
BEQ :ENTLPA
:DOADD
CLC
ADC :AIDX
TAX
TYA
ADC SCRATCH
TAY
TXA
:LPA
ASL :AIDX
ROL SCRATCH
:ENTLPA
LSR :ESIZE
BCS :DOADD
BNE :LPA
STX :IDX
STY :IDX+1
CLC
LDA #3
ADC :IDX
STA :RES
BCS :ADDHI
JMP :XADD
:ADDHI
LDA #1
ADC :IDX+1
STA :IDX+1
:XADD
LDA :IDX+1
STA :RES+1
CLC
LDA :RES
ADC ADDR4
STA :RES
BCS :ADD1HI
JMP :XADD2
:ADD1HI
INC :RES+1
:XADD2
LDA :RES+1
ADC ADDR4+1
STA :RES+1
STA ADDR2+1
LDA :RES
STA ADDR2
LDY #0
:LP
LDA (ADDR3),Y
STA (ADDR2),Y
INY
CPY :ESIZEBAK
BNE :LP
LDA RETADR+1
PHA
LDA RETADR
PHA
LDX ADDR2+1
LDY ADDR2
LDA :ESIZE
RTS
:ESIZE DS 1
:ESIZEBAK DS 1
:ASIZE DS 2
:AIDX DS 2
:IDX DS 2
:RES DS 2
:E_SID ASC "APUT161 (PUT161 MACRO),",00
:E_DUMP ASC "DUMPING :ESIZE(1) :ESIZEBAK(1) :ASIZE(2)"
ASC ":AIDX(2) :IDX(2) :RES(2)",00
:E_OVF1 ASC "OUT OF BOUNDS! INDEX > ARRAY LENGTH",00

View File

@ -0,0 +1,180 @@
APUT162
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :YIDX
PLA
STA :YIDX+1
PLA
STA :XIDX
PLA
STA :XIDX+1
PLA
STA ADDR4
PLA
STA ADDR4+1
PLA
STA ADDR3
PLA
STA ADDR3+1
LDY #4
LDA (ADDR4),Y
STA :ESIZE
LDY #0
LDA (ADDR4),Y
STA :XLEN
LDY #1
LDA (ADDR4),Y
STA :XLEN+1
LDY #2
LDA (ADDR4),Y
STA :YLEN
LDY #3
LDA (ADDR4),Y
STA :YLEN+1
LDY #0
LDA ERRCTRL
CMP #1
BEQ :CHKERR
JMP :ERREND
:CHKERR
LDA :XIDX
CMP :XLEN
BCC :ECONT1
LDA :XIDX+1
CMP :XLEN+1
BEQ :ECONT1
BCC :ECONT1
_ERR #:E_SID;#:E_XOVF;#:E_DUMP;#:ESIZE;#20
:ECONT1
LDA :YIDX
CMP :YLEN
BCC :ECONT2
LDA :YIDX+1
CMP :YLEN+1
BEQ :ECONT2
BCC :ECONT2
_ERR #:E_SID;#:E_YOVF;#:E_DUMP;#:ESIZE;#20
:ECONT2
:ERREND
LDA :YIDX
STA :MLIER
LDA :YIDX+1
STA :MLIER+1
LDA :YLEN
STA :MCAND
LDA :YLEN+1
STA :MCAND+1
LDA #00
STA :PROD
STA :PROD+1
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFT_R
LSR :MLIER+1
ROR :MLIER
BCC :ROT_R
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROT_R
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFT_R
LDA :PROD
STA :PBAK
LDA :PROD+1
STA :PBAK+1
LDA :XIDX
STA :MLIER
LDA :XIDX+1
STA :MLIER+1
LDA :ESIZE
STA :MCAND
LDA #0
STA :MCAND+1
STA :PROD
STA :PROD+1
STA :PROD+2
STA :PROD+3
LDX #$10
:SHIFTR LSR :MLIER+1
ROR :MLIER
BCC :ROTR
LDA :PROD+2
CLC
ADC :MCAND
STA :PROD+2
LDA :PROD+3
ADC :MCAND+1
:ROTR
ROR
STA :PROD+3
ROR :PROD+2
ROR :PROD+1
ROR :PROD
DEX
BNE :SHIFTR
CLC
LDA :PROD
ADC :PBAK
STA :PROD
LDA :PROD+1
ADC :PBAK+1
STA :PROD+1
CLC
LDA :PROD
ADC #5
STA :PROD
BCC :ADD3D
INC :PROD+1
:ADD3D
CLC
LDA :PROD
ADC ADDR4
STA :PROD
STA ADDR2
LDA :PROD+1
ADC ADDR4+1
STA :PROD+1
STA ADDR2+1
LDY #0
LDX #0
:CLP
LDA (ADDR3),Y
STA (ADDR2),Y
INY
CPY :ESIZE
BNE :CLP
LDA RETADR+1
PHA
LDA RETADR
PHA
LDX ADDR2+1
LDY ADDR2
LDA :ESIZE
RTS
:ESIZE DS 2
:XIDX DS 2
:YIDX DS 2
:MCAND DS 2
:MLIER DS 2
:PROD DS 4
:PBAK DS 2
:XLEN DS 2
:YLEN DS 2
:E_SID ASC "APUT162 (PUT162 MACRO)",00
:E_DUMP ASC ":ESIZE(2) :XIDX(2) :YIDX(2) :MCAND(2) :MLIER(2)"
ASC ":PROD(4) PBAK(2) :XLEN(1) :YLEN(1)",00
:E_XOVF ASC "OUT OF BOUNDS! X > MAXIMUM.",00
:E_YOVF ASC "OUT OF BOUNDS! Y > MAX.",00

View File

@ -3,29 +3,35 @@ DOSCMD
STA RETADR
PLA
STA RETADR+1
LDA #$8D
JSR FCOUT
LDA #$84 ; CTRL-D
JSR FCOUT
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA #1
STA $AAB6 ; DOS LANG FLAG
STA $75+1 ; NOT DIRECT MODE
STA $33 ; NOT DIRECT MODE
LDA #$8D
JSR FCOUT
LDA #$84 ; CTRL-D
JSR FCOUT
LDY #0
LDA (ADDR1),Y
STA :SLEN
LDY #$01 ; POINT TO NEXT INSTR
:LP
LDA (RETADR),Y
BEQ :DONE
LDA (ADDR1),Y
JSR FCOUT
INY
BNE :LP
CPY :SLEN
BCC :LP
BEQ :LP
:DONE
CLC ; RESTORE INSTR POINTER
TYA
ADC RETADR
STA RETADR
LDA #$8D
JSR FCOUT
LDA RETADR+1
ADC #$00
PHA
LDA RETADR
PHA
RTS
:SLEN DS 1

View File

@ -15,9 +15,9 @@ FINPUT
:INP_CLR
LDY #0
LDA :SLEN
STA (ADDR1),Y ; PUT LENGTH AT START
STA (ADDR1),Y
:LP
LDA $0200,Y ; KEYBOARD BUFFER
LDA $0200,Y
INY
STA (ADDR1),Y
CPY :SLEN

View File

@ -3,7 +3,7 @@ FPRINT
STA RETADR
PLA
STA RETADR+1
LDY #$01 ; POINT TO NEXT INSTR
LDY #$01
:LP
LDA (RETADR),Y
BEQ :DONE
@ -11,7 +11,7 @@ FPRINT
INY
BNE :LP
:DONE
CLC ; RESTORE INSTR POINTER
CLC
TYA
ADC RETADR
STA RETADR

Some files were not shown because too many files have changed in this diff Show More