mirror of
https://github.com/zellyn/goapple2.git
synced 2024-12-29 04:29:17 +00:00
3595 lines
76 KiB
NASM
3595 lines
76 KiB
NASM
10 ORG $E000
|
|
20 LST OFF
|
|
30 XC OFF ;6502 only
|
|
40 EXP ON ;print only macro call
|
|
50 LSTDO OFF ;don't list conditional code
|
|
60 TR OFF ;don't truncate listing to 3 bytes
|
|
70 CYC OFF ;don't print cycle times
|
|
80 USE MACROS
|
|
90 LST ON
|
|
100 *************************************************
|
|
110 * *
|
|
120 * INTEGER BASIC *
|
|
130 * *
|
|
140 * WOZ *
|
|
150 * *
|
|
160 *************************************************
|
|
170 * *
|
|
180 * "That BASIC, which we shipped with the first *
|
|
190 * Apple II's, was never assembled -- ever. *
|
|
200 * There was one handwritten copy, all *
|
|
210 * handwritten, all hand assembled." *
|
|
220 * *
|
|
230 * Steve Wozniak *
|
|
240 * Call-A.P.P.L.E., October 1986 *
|
|
250 * *
|
|
260 *************************************************
|
|
270
|
|
280 * Computer Apple II family
|
|
290 * O/S none needed, but usually DOS 3.3
|
|
300 * Language 6502 assembly -- Merlin assembler
|
|
310 * Disassembled by:
|
|
320 * Paul R. Santa-Maria
|
|
330 * P.O. Box 924
|
|
340 * Monroe MI 48161
|
|
350 * Revised 1 May 2000
|
|
360 * Reference "What's Where in the Apple"; William F. Luebbert
|
|
370 * Peeking at Call-A.P.P.L.E. Vol 2 1979; pp44-61
|
|
380
|
|
390 *************************************************
|
|
400
|
|
410 * zero-page
|
|
420
|
|
430 LOMEM = $004A ;ptr: start of vars
|
|
440 HIMEM = $004C ;ptr: end of BASIC program
|
|
450 NOUNSTKL = $0050 ;noun stack low bytes (80-87)
|
|
460 SYNSTKH = $0058 ;syntax stack high byte
|
|
470 NOUNSTKH = $0078 ;noun stack high bytes (78-97)
|
|
480 SYNSTKL = $0080 ;syntax stack low bytes (80-9F)
|
|
490 NOUNSTKC = $00A0 ;noun stack counter (A0-BF)
|
|
500 TXTNDXSTK = $00A8 ;text index stack (A8-C7)
|
|
510 TXTNDX = $00C8 ;text index val (OUTVAL)
|
|
520 LEADBL = $00C9 ;leading blanks index (YTEMP)
|
|
530 PP = $00CA ;ptr: start of program
|
|
540 PV = $00CC ;ptr: end of vars
|
|
550 ACC = $00CE ;word: main accumulator
|
|
560 SRCH = $00D0 ;ptr to search var tbl
|
|
570 TOKNDXSTK = $00D1 ;token index stack (D1-F0)
|
|
580 SRCH2 = $00D2 ;second var search ptr
|
|
590 IFFLAG = $00D4 ;IF/THEN fail flag
|
|
600 CRFLAG = $00D5 ;carriage return flag
|
|
610 VERBNOW = $00D6 ;verb currently in use
|
|
620 PRFLAG = $00D7 ;print it now flag
|
|
630 XSAVE = $00D8 ;temp Xreg save
|
|
640 RUNFLAG = $00D9 ;run mode flag
|
|
650 AUX = $00DA ;word: aux ctr
|
|
660 PR = $00DC ;word: current line value
|
|
670 *PN = $00DE ;ptr to current noun
|
|
680 PX = $00E0 ;ptr to current verb
|
|
690 P1 = $00E2 ;aux ptr 1 (delete line ptr)
|
|
700 P2 = $00E4 ;aux ptr 2 ...
|
|
710 * (line num adr) (next line num) (general flag)
|
|
720 P3 = $00E6 ;aux ptr 3 (next ptr)
|
|
730 TOKNDX = $00F1 ;token index val
|
|
740 PCON = $00F2 ;continue ptr (PRDEC low/high)
|
|
750 AUTOINC = $00F4 ;auto line increment
|
|
760 AUTOLN = $00F6 ;current auto line
|
|
770 AUTOFLAG = $00F8 ;auto line mode flag ($FF = on)
|
|
780 CHAR = $00F9 ;current char
|
|
790 LEADZR = $00FA ;leading zeros index ($00,$A0,$B0)
|
|
800 FORNDX = $00FB ;FOR-NEXT loop index
|
|
810 GOSUBNDX = $00FC ;GOSUB index
|
|
820 SYNSTKDX = $00FD ;syntax stack index val
|
|
830 SYNPAG = $00FE ;ptr: syntax page
|
|
840 *if SYNPAG+1 <> 0 then error condition exists
|
|
850
|
|
860 STACK = $0100 ;6502 STACK
|
|
870
|
|
880 * GOSUB/RETURN usage
|
|
890
|
|
900 STK_00 = STACK+$00
|
|
910 STK_10 = STACK+$10
|
|
920 STK_20 = STACK+$20
|
|
930 STK_30 = STACK+$30
|
|
940
|
|
950 * FOR/NEXT/STEP usage
|
|
960
|
|
970 STK_40 = STACK+$40
|
|
980 STK_50 = STACK+$50
|
|
990 STK_60 = STACK+$60
|
|
1000 STK_70 = STACK+$70
|
|
1010 STK_80 = STACK+$80
|
|
1020 STK_90 = STACK+$90
|
|
1030 STK_A0 = STACK+$A0
|
|
1040 STK_B0 = STACK+$B0
|
|
1050 STK_C0 = STACK+$C0
|
|
1060 STK_D0 = STACK+$D0
|
|
1070
|
|
1080 * I/O addresses
|
|
1090
|
|
1100 KBD = $C000
|
|
1110 KBDSTRB = $C010
|
|
1120
|
|
1130 * Monitor zero page and low memory
|
|
1140
|
|
1150 WNDWDTH = $0021
|
|
1160 CH = $0024
|
|
1170 CV = $0025
|
|
1180 GBAS = $0026
|
|
1190 H2 = $002C
|
|
1200 V2 = $002D
|
|
1210 A1 = $003C
|
|
1220 A2 = $003E
|
|
1230 PROMPT = $0033
|
|
1240 RNDL = $004E
|
|
1250 RNDH = $004F
|
|
1260
|
|
1270 IN = $0200
|
|
1280
|
|
1290 * Monitor routines
|
|
1300
|
|
1310 PLOT = $F800
|
|
1320 HLINE = $F819
|
|
1330 VLINE = $F828
|
|
1340 GBASCALC = $F847
|
|
1350 SETCOL = $F864
|
|
1360 PREAD = $FB1E
|
|
1370 SETTXT = $FB39
|
|
1380 SETGR = $FB40
|
|
1390 VTAB = $FC22
|
|
1400 WRITE = $FECD
|
|
1410 WRITE0 = $FECF
|
|
1420 READ = $FEFD
|
|
1430 NXTCHAR = $FD75
|
|
1440 CROUT = $FD8E
|
|
1450 COUT = $FDED
|
|
1460 INPORT = $FE8B
|
|
1470 OUTPORT = $FE95
|
|
1480 BELL = $FF3A
|
|
1490
|
|
1500 * ASCII (excess $8000 for xref listing)
|
|
1510
|
|
1520 ETX = $8003 ;CTRL-C
|
|
1530 LF = $800A
|
|
1540 CR = $800D
|
|
1550 BLANK = $8020
|
|
1560 DQT = $8022
|
|
1570 SQT = $8027
|
|
1580
|
|
1590 **************************************************
|
|
1600 * ;Z = unreferenced area
|
|
1610 * ;V = referenced in verb table
|
|
1620 * ;VO = referenced in verb table only
|
|
1630 * ;solo = one reference only (could be in-line)
|
|
1640
|
|
1650 PUT PART1
|
|
1660 BASIC JSR COLD
|
|
1670 BASIC2 JMP WARM
|
|
1680
|
|
1690 SetPrompt ;solo
|
|
1700 STA PROMPT
|
|
1710 JMP COUT
|
|
1720 *>
|
|
1730
|
|
1740 RTS ;Z
|
|
1750 **
|
|
1760
|
|
1770 HE00C
|
|
1780 TXA ;?print a trailing blank?
|
|
1790 AND #$20
|
|
1800 BEQ HE034 ;=>RTS
|
|
1810 HE011 ;solo
|
|
1820 LDA #BLANK+$80
|
|
1830 STA P2
|
|
1840 JMP COUT
|
|
1850 *>
|
|
1860
|
|
1870 HE018 ;solo
|
|
1880 LDA #32 ;check line length
|
|
1890 HE01A
|
|
1900 CMP CH
|
|
1910 BCS NextByte ;=HS> line too short
|
|
1920 LDA #CR+$80 ;print CR, then 7 blanks
|
|
1930 LDY #7
|
|
1940 *!LOOP
|
|
1950 JSR COUT
|
|
1960 LDA #BLANK+$80
|
|
1970 DEY
|
|
1980 *!UNTIL <EQ>
|
|
1990
|
|
2000 NextByte ;get next byte 16-bit ptr
|
|
2010 LDY #0
|
|
2020 LDA (P1),Y
|
|
2030 INCW P1
|
|
2040 HE034
|
|
2050 RTS
|
|
2060 **
|
|
2070
|
|
2080 * tkn $75 , (with tkn $74 LIST)
|
|
2090 * LIST 5,30
|
|
2100
|
|
2110 COMMA_LIST ;VO
|
|
2120 JSR GET16BIT
|
|
2130 JSR HE576
|
|
2140 HE03B
|
|
2150 CMPW P1;P3
|
|
2160 BCS HE034 ;=>P1 <HS> P3, RTS
|
|
2170 JSR UNPACK
|
|
2180 JMP HE03B
|
|
2190 *>
|
|
2200
|
|
2210
|
|
2220 * tkn $76 LIST
|
|
2230 * list entire program
|
|
2240
|
|
2250 LIST ;VO
|
|
2260 MOVW PP;P1
|
|
2270 MOVW HIMEM;P3
|
|
2280 BNE HE03B ;=>always
|
|
2290
|
|
2300 * tkn $74 LIST
|
|
2310 * specific line number or range of numbers
|
|
2320 * LIST 10: LIST 5,30
|
|
2330
|
|
2340 LISTNUM ;VO
|
|
2350 JSR GET16BIT
|
|
2360 JSR HE56D
|
|
2370 MOVW P2;P1
|
|
2380 BCS HE034 ;=>RTS
|
|
2390 UNPACK ;unpack tokens to mnemonics
|
|
2400 STX XSAVE
|
|
2410 LDA #BLANK+$80
|
|
2420 STA LEADZR
|
|
2430 JSR NextByte
|
|
2440 TYA
|
|
2450 HE077
|
|
2460 STA P2
|
|
2470 JSR NextByte
|
|
2480 TAX
|
|
2490 JSR NextByte
|
|
2500 JSR PRDEC
|
|
2510 *!LOOP
|
|
2520 JSR HE018
|
|
2530 STY LEADZR
|
|
2540 TAX
|
|
2550 BPL HE0A3 ;=>
|
|
2560 ASL
|
|
2570 BPL HE077 ;=>
|
|
2580 LDA P2
|
|
2590 *! IF <EQ>
|
|
2600 JSR HE011
|
|
2610 *! ENDIF
|
|
2620 TXA
|
|
2630 *! LOOP
|
|
2640 JSR COUT
|
|
2650 HE099
|
|
2660 LDA #$25
|
|
2670 JSR HE01A
|
|
2680 TAX
|
|
2690 *! UNTIL <PL>
|
|
2700 STA P2
|
|
2710 HE0A3
|
|
2720 CMP #$01
|
|
2730 *! IF <EQ>
|
|
2740 LDX XSAVE
|
|
2750 JMP CROUT
|
|
2760 *! ENDIF
|
|
2770 PHA
|
|
2780 STY ACC
|
|
2790 LDX #>SYNTABL2
|
|
2800 STX ACC+1
|
|
2810 CMP #$51 ;END tkn
|
|
2820 *! IF <HS>
|
|
2830 DEC ACC+1 ; in SYNTABL
|
|
2840 SBC #$50 ;TAB tkn
|
|
2850 *! ENDIF
|
|
2860 *! LOOP
|
|
2870 PHA
|
|
2880 LDA (ACC),Y
|
|
2890 *! LOOP
|
|
2900 *! LOOP
|
|
2910 TAX
|
|
2920 DEY
|
|
2930 LDA (ACC),Y
|
|
2940 *! UNTIL <MI>
|
|
2950 CPX #$C0
|
|
2960 *! WHILE <LO>
|
|
2970 CPX #0
|
|
2980 *! UNTIL <PL>
|
|
2990 TAX
|
|
3000 PLA
|
|
3010 SBC #1 ;carry is set
|
|
3020 *! UNTIL <EQ>
|
|
3030 BIT P2
|
|
3040 *! IF <PL>
|
|
3050 JSR HEFF8
|
|
3060 *! ENDIF
|
|
3070 *! LOOP
|
|
3080 LDA (ACC),Y
|
|
3090 *! WHILE <MI>
|
|
3100 TAX
|
|
3110 AND #$3F
|
|
3120 STA P2
|
|
3130 CLC
|
|
3140 ADC #BLANK+$80
|
|
3150 JSR COUT
|
|
3160 DEY
|
|
3170 CPX #$C0
|
|
3180 *! UNTIL <HS>
|
|
3190 JSR HE00C
|
|
3200 PLA
|
|
3210 CMP #$5D ;93 ]
|
|
3220 BEQ HE099 ;=>
|
|
3230 CMP #$28 ;40 (
|
|
3240 *!UNTIL <EQ>
|
|
3250 BEQ HE099 ;=>always
|
|
3260
|
|
3270 * tkn $2A (
|
|
3280 * substring
|
|
3290 * PRINT A$(12,14)
|
|
3300
|
|
3310 PAREN_SUBSTR ;VO
|
|
3320 JSR HE118
|
|
3330 STA NOUNSTKL,X
|
|
3340 CMP NOUNSTKH,X
|
|
3350 HE102
|
|
3360 BCC HE115 ;=LO>
|
|
3370 HE104
|
|
3380 LDY #ErrMsg05 ;"STRING"
|
|
3390 HE106
|
|
3400 JMP ERRMESS
|
|
3410 *>
|
|
3420
|
|
3430 * tkn $23 ,
|
|
3440 * substring
|
|
3450 * PRINT A$(3,3)
|
|
3460
|
|
3470 COMMA_SUBSTR ;VO
|
|
3480 JSR GETBYTE
|
|
3490 CMP NOUNSTKL,X
|
|
3500 BCC HE104 ;=LO>"STRING"
|
|
3510 JSR HEFE4
|
|
3520 STA NOUNSTKH,X
|
|
3530 HE115
|
|
3540 JMP HE823
|
|
3550 *>
|
|
3560
|
|
3570 HE118
|
|
3580 JSR GETBYTE
|
|
3590 BEQ HE104 ;=>"STRING"
|
|
3600 SEC
|
|
3610 SBC #1
|
|
3620 RTS
|
|
3630 **
|
|
3640
|
|
3650 * tkn $42 (
|
|
3660 * string array is destination of the data
|
|
3670 * A$(1)="HELLO"
|
|
3680
|
|
3690 HE121 ;VO
|
|
3700 JSR HE118
|
|
3710 STA NOUNSTKL,X
|
|
3720 CLC
|
|
3730 SBC NOUNSTKH,X
|
|
3740 JMP HE102
|
|
3750 *>
|
|
3760
|
|
3770 HE12C
|
|
3780 LDY #ErrMsg03 ;"MEM FULL"
|
|
3790 BNE HE106 ;=>always
|
|
3800
|
|
3810 * tkn $43 ,
|
|
3820 * next var in DIM statement is string
|
|
3830 * DIM X(5),A$(5)
|
|
3840
|
|
3850 * tkn $4E DIM
|
|
3860 * string var. uses tkn $22 (
|
|
3870 * DIM A$(5)
|
|
3880
|
|
3890 DIMSTR ;VO
|
|
3900 JSR HE118
|
|
3910 INX
|
|
3920 HE134
|
|
3930 LDA NOUNSTKL,X
|
|
3940 STA AUX
|
|
3950 ADC ACC
|
|
3960 PHA
|
|
3970 TAY
|
|
3980 LDA NOUNSTKH,X
|
|
3990 STA AUX+1
|
|
4000 ADC ACC+1
|
|
4010 PHA
|
|
4020 CPY PP
|
|
4030 SBC PP+1
|
|
4040 BCS HE12C ;=HS>"MEM FULL" error
|
|
4050 LDA AUX ;AUX := AUX-2
|
|
4060 ADC #<0-2
|
|
4070 STA AUX
|
|
4080 LDA #>0-2
|
|
4090 TAY
|
|
4100 ADC AUX+1
|
|
4110 STA AUX+1
|
|
4120 *!LOOP
|
|
4130 INY
|
|
4140 LDA (AUX),Y
|
|
4150 CMP PV,Y
|
|
4160 BNE DimErr ;=>
|
|
4170 TYA
|
|
4180 *!UNTIL <NE>
|
|
4190 *!LOOP
|
|
4200 PLA
|
|
4210 STA (AUX),Y
|
|
4220 STA PV,Y
|
|
4230 DEY
|
|
4240 *!UNTIL <MI>
|
|
4250 INX
|
|
4260 RTS
|
|
4270 **
|
|
4280
|
|
4290 NOP ;Z
|
|
4300 DimErr
|
|
4310 LDY #ErrMsg17 ;"DIM"
|
|
4320 HE16F
|
|
4330 BNE HE106 ;=>always
|
|
4340
|
|
4350 INPUTSTR ;input a string
|
|
4360 LDA #0
|
|
4370 JSR HE70A
|
|
4380 LDY #$02
|
|
4390 STY NOUNSTKH,X
|
|
4400 JSR HE70A
|
|
4410 STX XSAVE
|
|
4420 TAX
|
|
4430 INC PROMPT ;change '>' to '?'
|
|
4440 JSR RDKEY
|
|
4450 DEC PROMPT ;change '?' to '>'
|
|
4460 TXA
|
|
4470 LDX XSAVE
|
|
4480 STA NOUNSTKH,X
|
|
4490
|
|
4500 * tkn $70 =
|
|
4510 * string - non-conditional
|
|
4520 * A$ = "HELLO"
|
|
4530
|
|
4540 HE18C ;VO
|
|
4550 LDA NOUNSTKL+1,X
|
|
4560 STA ACC
|
|
4570 LDA NOUNSTKH+1,X
|
|
4580 STA ACC+1
|
|
4590 INX
|
|
4600 INX
|
|
4610 JSR HE1BC
|
|
4620 *!LOOP
|
|
4630 LDA NOUNSTKL-2,X
|
|
4640 CMP NOUNSTKH-2,X
|
|
4650 *!WHILE <LO>
|
|
4660 INC NOUNSTKL-2,X
|
|
4670 TAY
|
|
4680 LDA (ACC),Y
|
|
4690 LDY NOUNSTKL,X
|
|
4700 CPY P2
|
|
4710 *! IF <HS>
|
|
4720 LDY #ErrMsg18 ;"STR OVFL"
|
|
4730 BNE HE16F ;=>always
|
|
4740 *! ENDIF
|
|
4750 STA (AUX),Y
|
|
4760 INC NOUNSTKL,X
|
|
4770 *!UNTIL <CS>
|
|
4780 LDY NOUNSTKL,X
|
|
4790 TXA
|
|
4800 STA (AUX),Y
|
|
4810 JMP HF223
|
|
4820 *>
|
|
4830
|
|
4840 HE1BC ;solo
|
|
4850 LDA NOUNSTKL+1,X
|
|
4860 STA AUX
|
|
4870 SEC
|
|
4880 SBC #2
|
|
4890 STA P2
|
|
4900 LDA NOUNSTKH+1,X
|
|
4910 STA AUX+1
|
|
4920 SBC #0
|
|
4930 STA P2+1
|
|
4940 LDY #0
|
|
4950 LDA (P2),Y
|
|
4960 CLC
|
|
4970 SBC AUX
|
|
4980 STA P2
|
|
4990 RTS
|
|
5000 **
|
|
5010
|
|
5020 * tkn $39 =
|
|
5030 * string logic op
|
|
5040 * IF A$ = "CAT" THEN END
|
|
5050
|
|
5060 HE1D7 ;V
|
|
5070 LDA NOUNSTKL+3,X
|
|
5080 STA ACC
|
|
5090 LDA NOUNSTKH+3,X
|
|
5100 STA ACC+1
|
|
5110 LDA NOUNSTKL+1,X
|
|
5120 STA AUX
|
|
5130 LDA NOUNSTKH+1,X
|
|
5140 STA AUX+1
|
|
5150 INX
|
|
5160 INX
|
|
5170 INX
|
|
5180 LDY #0
|
|
5190 STY NOUNSTKH,X
|
|
5200 STY NOUNSTKC,X
|
|
5210 INY
|
|
5220 STY NOUNSTKL,X
|
|
5230 *!LOOP
|
|
5240 LDA HIMEM+1,X
|
|
5250 CMP NOUNSTKH-3,X
|
|
5260 PHP
|
|
5270 PHA
|
|
5280 LDA NOUNSTKL-1,X
|
|
5290 CMP NOUNSTKH-1,X
|
|
5300 *! IF <HS>
|
|
5310 PLA
|
|
5320 PLP
|
|
5330 *! IF <CC>
|
|
5340 HE203
|
|
5350 LSR NOUNSTKL,X
|
|
5360 *! ENDIF
|
|
5370 RTS
|
|
5380
|
|
5390 *! ENDIF
|
|
5400 TAY
|
|
5410 LDA (ACC),Y
|
|
5420 STA P2
|
|
5430 PLA
|
|
5440 TAY
|
|
5450 PLP
|
|
5460 BCS HE203 ;=>EXIT LOOP
|
|
5470 LDA (AUX),Y
|
|
5480 CMP P2
|
|
5490 BNE HE203 ;=>EXIT LOOP
|
|
5500 INC NOUNSTKL-1,X
|
|
5510 INC HIMEM+1,X
|
|
5520 *!UNTIL <LO>
|
|
5530 * always
|
|
5540
|
|
5550 * tkn $3A #
|
|
5560 * string logic op
|
|
5570 * IF A$ # "CAT" THEN END
|
|
5580
|
|
5590 HE21C ;VO
|
|
5600 JSR HE1D7
|
|
5610 JMP NOT
|
|
5620 *>
|
|
5630
|
|
5640 * tkn $14 *
|
|
5650 * num math op
|
|
5660 * A = 27 * 2
|
|
5670
|
|
5680 MULT ;V
|
|
5690 JSR HE254
|
|
5700 *!LOOP
|
|
5710 ASL ACC
|
|
5720 ROL ACC+1 ;add partial product if C flag set
|
|
5730 *! IF <CS>
|
|
5740 ADDW P3;AUX;P3
|
|
5750 *! ENDIF
|
|
5760 DEY
|
|
5770 BEQ HE244 ;=>EXIT LOOP
|
|
5780 ASL P3
|
|
5790 ROL P3+1
|
|
5800 *!UNTIL <MI>
|
|
5810 JMP HE77E
|
|
5820 *>
|
|
5830
|
|
5840 HE244
|
|
5850 LDA P3
|
|
5860 JSR HE708
|
|
5870 LDA P3+1
|
|
5880 STA NOUNSTKC,X
|
|
5890 ASL P2+1
|
|
5900 BCC HE279 ;=>RTS
|
|
5910 JMP NEGATE
|
|
5920 *>
|
|
5930
|
|
5940 HE254
|
|
5950 LDA #$55
|
|
5960 STA P2+1
|
|
5970 JSR HE25B
|
|
5980 HE25B
|
|
5990 MOVW ACC;AUX
|
|
6000 JSR GET16BIT
|
|
6010 STY P3 ;P3 := 0
|
|
6020 STY P3+1
|
|
6030 LDA ACC+1
|
|
6040 *!IF <MI>
|
|
6050 DEX
|
|
6060 ASL P2+1
|
|
6070 JSR NEGATE
|
|
6080 JSR GET16BIT
|
|
6090 *!ENDIF
|
|
6100 LDY #$10
|
|
6110 HE279
|
|
6120 RTS
|
|
6130 **
|
|
6140
|
|
6150 * tkn $1F MOD
|
|
6160 * num op
|
|
6170 * IF X MOD 13 THEN END
|
|
6180
|
|
6190 MOD ;V
|
|
6200 JSR HEE6C
|
|
6210 BEQ HE244 ;=>always
|
|
6220
|
|
6230 DB $FF ;Z
|
|
6240
|
|
6250 HE280 ;solo
|
|
6260 INC PROMPT ;change '>' to '?'
|
|
6270 LDY #0
|
|
6280 JSR GETCMD
|
|
6290 DEC PROMPT ;change '?' to '>'
|
|
6300 RTS
|
|
6310 **
|
|
6320
|
|
6330 * tkn $3D SCRN(
|
|
6340 * PRINT SCRN(X,Y)
|
|
6350
|
|
6360 SCRN ;VO
|
|
6370 JSR GETBYTE
|
|
6380 LSR ;Areg := Areg/2
|
|
6390 PHP ;stash carry (lsb)
|
|
6400 JSR GBASCALC
|
|
6410 JSR GETBYTE
|
|
6420 TAY
|
|
6430 LDA (GBAS),Y ;get screen byte
|
|
6440 PLP ;retrieve carry
|
|
6450 *!IF <CS>
|
|
6460 LSR ;odd, upper half
|
|
6470 LSR
|
|
6480 LSR
|
|
6490 LSR
|
|
6500 *!ENDIF
|
|
6510 AND #$0F ;Areg := color number
|
|
6520 LDY #0
|
|
6530 JSR HE708
|
|
6540 STY NOUNSTKC,X
|
|
6550 DEY
|
|
6560 STY PRFLAG ;PRFLAG := $FF
|
|
6570
|
|
6580 * tkn $3E ,
|
|
6590 * PRINT SCRN(X,Y)
|
|
6600
|
|
6610 COMMA_SCRN ;VO
|
|
6620 RTS
|
|
6630 **
|
|
6640
|
|
6650 DB $FF,$FF,$FF,$FF ;Z
|
|
6660
|
|
6670 JSR HEFD3 ;old 4K cold start ;Z
|
|
6672
|
|
6674 * Warm start
|
|
6676
|
|
6680 WARM ;main compile/execute code
|
|
6690 JSR CROUT ;emit blank line
|
|
6700 HE2B6
|
|
6710 LSR RUNFLAG ;not running
|
|
6720 LDA #">"
|
|
6730 JSR SetPrompt ;set and print prompt char
|
|
6740 LDY #0
|
|
6750 STY LEADZR ;no leading zeros for AUTOLN
|
|
6760 BIT AUTOFLAG ;AUTO?
|
|
6762 * if AUTOLN active
|
|
6770 *!IF <MI>
|
|
6780 LDX AUTOLN ;yes, print line number
|
|
6790 LDA AUTOLN+1
|
|
6800 JSR PRDEC
|
|
6810 LDA #BLANK+$80 ;and a blank
|
|
6820 JSR COUT
|
|
6830 *!ENDIF
|
|
6840 LDX #$FF ;init Sreg
|
|
6850 TXS
|
|
6860 JSR GETCMD
|
|
6870 STY TOKNDX
|
|
6880 TXA
|
|
6890 STA TXTNDX
|
|
6900 LDX #$20
|
|
6910 JSR HE491
|
|
6920 LDA TXTNDX ;PX := TXTNDX+$0200+C flag
|
|
6930 ADC #<$0200
|
|
6940 STA PX
|
|
6950 LDA #0
|
|
6960 TAX
|
|
6970 ADC #>$0200
|
|
6980 STA PX+1
|
|
6990 LDA (PX,X)
|
|
7000 AND #$F0
|
|
7010 CMP #"0"
|
|
7020 *!IF <NE>
|
|
7030 JMP HE883
|
|
7040 *!ENDIF
|
|
7050 LDY #2 ;move two bytes
|
|
7060 *!LOOP
|
|
7070 LDA (PX),Y
|
|
7080 STA ACC-1,Y
|
|
7090 DEY
|
|
7100 *!UNTIL <EQ>
|
|
7110 JSR HE38A
|
|
7120 LDA TOKNDX
|
|
7130 SBC TXTNDX
|
|
7140 CMP #$04
|
|
7150 BEQ HE2B6 ;=>
|
|
7160 STA (PX),Y
|
|
7170 LDA PP ;P2 := PP-(PX),Y
|
|
7180 SBC (PX),Y
|
|
7190 STA P2
|
|
7200 LDA PP+1
|
|
7210 SBC #0
|
|
7220 STA P2+1
|
|
7230 CMPW P2;PV
|
|
7240 BCC MEMFULL ;=>P2 <LT> PV
|
|
7250 *!LOOP
|
|
7260 LDA PP ;P3 := PP-(PX),Y
|
|
7270 SBC (PX),Y
|
|
7280 STA P3
|
|
7290 LDA PP+1
|
|
7300 SBC #0
|
|
7310 STA P3+1
|
|
7320 LDA (PP),Y
|
|
7330 STA (P3),Y
|
|
7340 INCW PP
|
|
7350 CMPW P1;PP
|
|
7360 *!UNTIL <LO>
|
|
7370 *!LOOP
|
|
7380 LDA P2,X
|
|
7390 STA PP,X
|
|
7400 DEX
|
|
7410 *!UNTIL <MI>
|
|
7420 LDA (PX),Y
|
|
7430 TAY
|
|
7440 *!LOOP
|
|
7450 DEY
|
|
7460 LDA (PX),Y
|
|
7470 STA (P3),Y
|
|
7480 TYA
|
|
7490 *!UNTIL <EQ>
|
|
7500 BIT AUTOFLAG ;auto line?
|
|
7510 *!IF <MI>
|
|
7520 * yes
|
|
7530 *! LOOP
|
|
7540 LDA AUTOLN+1,X ;AUTOLN := AUTOLN+AUTOINC
|
|
7550 ADC AUTOINC+1,X
|
|
7560 STA AUTOLN+1,X
|
|
7570 INX
|
|
7580 *! UNTIL <NE>
|
|
7590 *!ENDIF
|
|
7600 BPL HE3E5 ;=>always
|
|
7610
|
|
7620 DB $00,$00,$00,$00 ;Z
|
|
7630
|
|
7640 MEMFULL
|
|
7650 LDY #ErrMsg03 ;"MEM FULL"
|
|
7660 BNE ERRMESS ;=>always
|
|
7670
|
|
7680 * tkn $0A ,
|
|
7690 * DEL 0,10
|
|
7700
|
|
7710 COMMA_DEL ;VO
|
|
7720 JSR GET16BIT
|
|
7730 MOVW P1;P3
|
|
7740 JSR HE575
|
|
7750 MOVW P1;P2
|
|
7760 BNE HE395 ;=>always?
|
|
7770
|
|
7780 * tkn $09 DEL
|
|
7790
|
|
7800 DEL ;VO
|
|
7810 JSR GET16BIT
|
|
7820 HE38A
|
|
7830 JSR HE56D
|
|
7840 MOVW P3;P1
|
|
7850 HE395
|
|
7860 LDY #0
|
|
7870 * memory move: P3<PP.P2 backwards
|
|
7880 *!LOOP
|
|
7890 CMPW PP;P2
|
|
7900 BCS HE3B7 ;=>PP <HS> P2
|
|
7910 DECW P2
|
|
7920 DECW P3
|
|
7930 LDA (P2),Y
|
|
7940 STA (P3),Y
|
|
7950 *!UNTIL <HS>
|
|
7960 * always
|
|
7970
|
|
7980 HE3B7 ;solo
|
|
7990 MOVW P3;PP
|
|
8000 RTS
|
|
8010 **
|
|
8020
|
|
8030 *!LOOP
|
|
8040 JSR COUT ;print error message
|
|
8050 INY
|
|
8060 ERRORMESS ;print error message
|
|
8070 LDA ErrorMsgs,Y ;routine entry point
|
|
8080 *!UNTIL <PL>
|
|
8090 ORA #$80
|
|
8100 JMP COUT
|
|
8110 *>
|
|
8120
|
|
8130 GETCMD
|
|
8140 TYA
|
|
8150 TAX
|
|
8160 JSR NXTCHAR ;
|
|
8170 TXA
|
|
8180 TAY
|
|
8190 LDA #"_" ;underline problem?
|
|
8200 STA IN,Y
|
|
8210 LDX #$FF
|
|
8220 RTS
|
|
8230 **
|
|
8240
|
|
8250 RTS ;Z
|
|
8260 **
|
|
8270
|
|
8280 HE3DE
|
|
8290 LDY #ErrMsg01 ;"TOO LONG"
|
|
8300 ERRMESS ;print error message and goto mainline
|
|
8310 JSR PRINTERR
|
|
8320 *$E3E3 DOS 3.3 chains here when processing errors
|
|
8330 BIT RUNFLAG
|
|
8340 HE3E5
|
|
8350 *!IF <PL>
|
|
8360 JMP HE2B6
|
|
8370 *!ENDIF
|
|
8380 JMP HEB9A
|
|
8390 *>
|
|
8400
|
|
8410 HE3ED ;solo
|
|
8420 ROL
|
|
8430 ADC #$A0
|
|
8440 CMP IN,X
|
|
8450 BNE HE448 ;=>
|
|
8460 LDA (SYNPAG),Y
|
|
8470 ASL
|
|
8480 *!IF <PL>
|
|
8490 DEY
|
|
8500 LDA (SYNPAG),Y
|
|
8510 BMI HE428 ;=>
|
|
8520 INY
|
|
8530 *!ENDIF
|
|
8540 STX TXTNDX
|
|
8550 TYA
|
|
8560 PHA
|
|
8570 LDX #0
|
|
8580 LDA (SYNPAG,X)
|
|
8590 TAX
|
|
8600 *!LOOP
|
|
8610 LSR
|
|
8620 EOR #$40
|
|
8630 ORA (SYNPAG),Y
|
|
8640 CMP #$C0
|
|
8650 *! IF <HS>
|
|
8660 INX
|
|
8670 *! ENDIF
|
|
8680 INY
|
|
8690 *!UNTIL <EQ>
|
|
8700 PLA
|
|
8710 TAY
|
|
8720 TXA
|
|
8730 JMP HF2F8
|
|
8740 *>
|
|
8750
|
|
8760 HE41C
|
|
8770 INC TOKNDX
|
|
8780 LDX TOKNDX
|
|
8790 BEQ HE3DE ;=>"TOO LONG"
|
|
8800 STA IN,X
|
|
8810 HE425
|
|
8820 RTS
|
|
8830 **
|
|
8840
|
|
8850 HE426 ;solo
|
|
8860 LDX TXTNDX
|
|
8870 HE428
|
|
8880 LDA #BLANK+$80
|
|
8890 *!LOOP
|
|
8900 INX
|
|
8910 CMP IN,X
|
|
8920 *!UNTIL <LO>
|
|
8930 LDA (SYNPAG),Y
|
|
8940 AND #$3F
|
|
8950 LSR
|
|
8960 BNE HE3ED ;=>
|
|
8970 LDA IN,X
|
|
8980 *!IF <CC>
|
|
8990 ADC #$3F
|
|
9000 CMP #$1A
|
|
9010 BCC HE4B1 ;=LO>
|
|
9020 *!ENDIF
|
|
9030 ADC #$4F
|
|
9040 CMP #$0A
|
|
9050 BCC HE4B1 ;=LO>
|
|
9060 HE448
|
|
9070 LDX SYNSTKDX
|
|
9080 *!LOOP
|
|
9090 INY
|
|
9100 LDA (SYNPAG),Y
|
|
9110 AND #$E0
|
|
9120 CMP #$20
|
|
9130 BEQ HE4CD ;=>
|
|
9140 LDA TXTNDXSTK,X
|
|
9150 STA TXTNDX
|
|
9160 LDA TOKNDXSTK,X
|
|
9170 STA TOKNDX
|
|
9180 *! LOOP
|
|
9190 DEY
|
|
9200 LDA (SYNPAG),Y
|
|
9210 ASL ;dbl
|
|
9220 *! UNTIL <MI>
|
|
9230 DEY
|
|
9240 BCS HE49C ;=>
|
|
9250 ASL ;dbl
|
|
9260 BMI HE49C ;=>
|
|
9270 LDY SYNSTKH,X
|
|
9280 STY SYNPAG+1
|
|
9290 LDY SYNSTKL,X
|
|
9300 INX
|
|
9310 *!UNTIL <MI>
|
|
9320 HE470
|
|
9330 BEQ HE425 ;=>RTS
|
|
9340 CMP #$7E
|
|
9350 BCS HE498 ;=HS>
|
|
9360 DEX
|
|
9370 *!IF <MI>
|
|
9380 LDY #ErrMsg01 ;"TOO LONG"
|
|
9390 * BUG FIX: ABOVE LINE SHOULD BE
|
|
9400 * LDY #ErrMsg04 ;"TOO MANY PARENS"
|
|
9410 * REF: CALL-APPLE MAR 1983 P.114
|
|
9420 BPL HE4A6 ;=>always
|
|
9430 *!ENDIF
|
|
9440 STY SYNSTKL,X
|
|
9450 LDY SYNPAG+1
|
|
9460 STY SYNSTKH,X
|
|
9470 LDY TXTNDX
|
|
9480 STY TXTNDXSTK,X
|
|
9490 LDY TOKNDX
|
|
9500 STY TOKNDXSTK,X
|
|
9510 AND #$1F
|
|
9520 TAY
|
|
9530 LDA SYNTABLNDX,Y
|
|
9540 HE491
|
|
9550 ASL ;dbl
|
|
9560 TAY
|
|
9570 LDA #>SYNTABL/2
|
|
9580 ROL
|
|
9590 STA SYNPAG+1
|
|
9600 HE498
|
|
9610 *!IF <EQ>
|
|
9620 INY
|
|
9630 *!ENDIF
|
|
9640 INY
|
|
9650 HE49C
|
|
9660 STX SYNSTKDX
|
|
9670 LDA (SYNPAG),Y
|
|
9680 BMI HE426 ;=>
|
|
9690 *!IF <EQ>
|
|
9700 LDY #ErrMsg02 ;"SYNTAX"
|
|
9710 HE4A6
|
|
9720 JMP ERRMESS
|
|
9730 *!ENDIF
|
|
9740 CMP #$03
|
|
9750 BCS HE470 ;=HS>
|
|
9760 LSR ;half
|
|
9770 LDX TXTNDX
|
|
9780 INX
|
|
9790 HE4B1
|
|
9800 LDA IN,X
|
|
9810 BCC HE4BA ;=>
|
|
9820 CMP #DQT+$80
|
|
9830 BEQ HE4C4 ;=>
|
|
9840 HE4BA
|
|
9850 CMP #"_" ;underline problem?
|
|
9860 BEQ HE4C4 ;=>
|
|
9870 STX TXTNDX
|
|
9880 HE4C0
|
|
9890 *!LOOP
|
|
9900 JSR HE41C
|
|
9910 INY
|
|
9920 HE4C4
|
|
9930 DEY
|
|
9940 LDX SYNSTKDX
|
|
9950 *! LOOP
|
|
9960 LDA (SYNPAG),Y
|
|
9970 DEY
|
|
9980 ASL
|
|
9990 BPL HE49C ;=>
|
|
10000 HE4CD
|
|
10010 LDY SYNSTKH,X
|
|
10020 STY SYNPAG+1
|
|
10030 LDY SYNSTKL,X
|
|
10040 INX
|
|
10050 LDA (SYNPAG),Y
|
|
10060 AND #%10011111
|
|
10070 *! UNTIL <EQ>
|
|
10080 STA PCON
|
|
10090 STA PCON+1
|
|
10100 TYA
|
|
10110 PHA
|
|
10120 STX SYNSTKDX
|
|
10130 LDY TOKNDXSTK-1,X
|
|
10140 STY LEADBL
|
|
10150 CLC
|
|
10160 *! LOOP
|
|
10170 LDA #$0A
|
|
10180 STA CHAR
|
|
10190 LDX #0
|
|
10200 INY
|
|
10210 LDA IN,Y
|
|
10220 AND #$0F
|
|
10230 *! LOOP
|
|
10240 ADC PCON
|
|
10250 PHA
|
|
10260 TXA
|
|
10270 ADC PCON+1
|
|
10280 BMI HE517 ;=>
|
|
10290 TAX
|
|
10300 PLA
|
|
10310 DEC CHAR
|
|
10320 *! UNTIL <EQ>
|
|
10330 STA PCON
|
|
10340 STX PCON+1
|
|
10350 CPY TOKNDX
|
|
10360 *! UNTIL <EQ>
|
|
10370 LDY LEADBL
|
|
10380 INY
|
|
10390 STY TOKNDX
|
|
10400 JSR HE41C
|
|
10410 PLA
|
|
10420 TAY
|
|
10430 LDA PCON+1
|
|
10440 *!UNTIL <CC>
|
|
10450 HE517
|
|
10460 LDY #ErrMsg00 ;">32767"
|
|
10470 BPL HE4A6 ;=>always
|
|
10480
|
|
10490 *-----------------------------
|
|
10500 * Name PRDEC
|
|
10510 * Purpose Print a 16-bit number in decimal.
|
|
10520 * Input Areg = high byte
|
|
10530 * Xreg = low byte
|
|
10540 * Output
|
|
10550 * Uses
|
|
10560 * Calls
|
|
10570 * Note
|
|
10580
|
|
10590 PRDEC
|
|
10600 STA PCON+1
|
|
10610 STX PCON
|
|
10620 LDX #4
|
|
10630 STX LEADBL
|
|
10640 *!LOOP
|
|
10650 LDA #"0"
|
|
10660 STA CHAR
|
|
10670 *! LOOP
|
|
10680 LDA PCON
|
|
10690 CMP NUMLOW,X
|
|
10700 LDA PCON+1
|
|
10710 SBC NUMHI,X
|
|
10720 *! WHILE <HS>
|
|
10730 STA PCON+1
|
|
10740 LDA PCON
|
|
10750 SBC NUMLOW,X
|
|
10760 STA PCON
|
|
10770 INC CHAR
|
|
10780 *! UNTIL <EQ>
|
|
10790 *GETDIG
|
|
10800 LDA CHAR
|
|
10810 INX
|
|
10820 DEX
|
|
10830 BEQ PRDEC5 ;=>
|
|
10840 CMP #"0"
|
|
10850 *! IF <NE>
|
|
10860 STA LEADBL
|
|
10870 *! ENDIF
|
|
10880 * if LEADBL is <MI> or LEADZR <NE> #0
|
|
10890 BIT LEADBL
|
|
10900 BMI PRDEC5 ;=>
|
|
10910 LDA LEADZR
|
|
10920 BEQ PRDEC6 ;=>
|
|
10930 * then
|
|
10940 PRDEC5 ;PRINT
|
|
10950 JSR COUT
|
|
10960 BIT AUTOFLAG ;auto line?
|
|
10970 *! IF <MI>
|
|
10980 STA IN,Y
|
|
10990 INY
|
|
11000 *! ENDIF
|
|
11010 PRDEC6 ;NXTX
|
|
11020 DEX
|
|
11030 *!UNTIL <MI>
|
|
11040 RTS
|
|
11050 **
|
|
11060
|
|
11070 NUMLOW
|
|
11080 DB 1
|
|
11090 DB 10
|
|
11100 DB 100
|
|
11110 DB 1000
|
|
11120 DB 10000
|
|
11130
|
|
11140 NUMHI
|
|
11150 DB 1/$0100
|
|
11160 DB 10/$0100
|
|
11170 DB 100/$0100
|
|
11180 DB 1000/$0100
|
|
11190 DB 10000/$0100
|
|
11200
|
|
11210 HE56D
|
|
11220 MOVW PP;P3
|
|
11230 HE575
|
|
11240 INX
|
|
11250 HE576
|
|
11260 *!LOOP
|
|
11270 * MOVW P3;P2
|
|
11280 LDA P3+1 ;P2 := P3
|
|
11290 STA P2+1
|
|
11300 LDA P3
|
|
11310 STA P2
|
|
11320 * CMPW P2;HIMEM
|
|
11330 CMP HIMEM ;is P2 <HS> HIMEM?
|
|
11340 LDA P2+1
|
|
11350 SBC HIMEM+1
|
|
11360 *!WHILE <LO>
|
|
11370 LDY #1
|
|
11380 LDA (P2),Y
|
|
11390 SBC ACC
|
|
11400 INY
|
|
11410 LDA (P2),Y
|
|
11420 SBC ACC+1
|
|
11430 *!WHILE <LO>
|
|
11440 LDY #0
|
|
11450 LDA P3 ;P3 := P3.W + (P2).B
|
|
11460 ADC (P2),Y
|
|
11470 STA P3
|
|
11480 *! IF <CS>
|
|
11490 INC P3+1
|
|
11500 CLC
|
|
11510 *! ENDIF
|
|
11520 INY
|
|
11530 LDA ACC :is ACC+1 <HS> (P2),Y ?
|
|
11540 SBC (P2),Y
|
|
11550 INY
|
|
11560 LDA ACC+1
|
|
11570 SBC (P2),Y
|
|
11580 *!UNTIL <LO>
|
|
11590 RTS
|
|
11600 **
|
|
11610
|
|
11620 * tkn $0B NEW
|
|
11621 * turn off AUTO
|
|
11630 * remove program
|
|
11632 * fall into CLR
|
|
11640
|
|
11650 NEW ;V
|
|
11660 LSR AUTOFLAG ;manual
|
|
11670 MOVW HIMEM;PP
|
|
11680
|
|
11690 * tkn $0C CLR
|
|
11700 * remove variables
|
|
11702 * remove FOR loops and GOSUBs
|
|
11710
|
|
11720 CLR ;V
|
|
11730 MOVW LOMEM;PV
|
|
11740 LDA #0
|
|
11750 STA FORNDX ;no FORs
|
|
11760 STA GOSUBNDX ;no GOSUBs
|
|
11770 STA SYNPAG
|
|
11780 LDA #0 ;Z
|
|
11790 STA $1D ;Z
|
|
11800 RTS
|
|
11810 **
|
|
11820
|
|
11830 LDA SRCH ;Z
|
|
11840 HE5CE
|
|
11850 JMP MEMFULL
|
|
11860 *>
|
|
11870
|
|
11880 *!LOOP
|
|
11890 *! LOOP
|
|
11900 LDY #$FF
|
|
11910 HE5D3
|
|
11920 STY XSAVE
|
|
11930 *! LOOP
|
|
11940 INY
|
|
11950 LDA (PX),Y
|
|
11960 *! IF <PL>
|
|
11970 CMP #$40
|
|
11980 BNE HE646 ;=>EXIT LOOP
|
|
11990 STA XSAVE
|
|
12000 *! ENDIF
|
|
12010 CMP (SRCH),Y
|
|
12020 *! UNTIL <NE>
|
|
12030 *! LOOP
|
|
12040 LDA (SRCH),Y
|
|
12050 HE5E6
|
|
12060 INY
|
|
12070 LSR
|
|
12080 *! UNTIL <EQ>
|
|
12090 LDA (SRCH),Y
|
|
12100 PHA
|
|
12110 INY
|
|
12120 LDA (SRCH),Y
|
|
12130 TAY
|
|
12140 PLA
|
|
12150 HE5F2
|
|
12160 STA SRCH
|
|
12170 STY SRCH+1
|
|
12180 CMP PV
|
|
12190 *! UNTIL <EQ>
|
|
12200 CPY PV+1
|
|
12210 *!UNTIL <EQ>
|
|
12220 LDY #0
|
|
12230 *!LOOP
|
|
12240 *! LOOP
|
|
12250 INY
|
|
12260 LDA (PX),Y
|
|
12270 *! UNTIL <PL>
|
|
12280 EOR #$40
|
|
12290 *!UNTIL <NE>
|
|
12300 TYA
|
|
12310 ADC #$04
|
|
12320 PHA
|
|
12330 ADC SRCH
|
|
12340 TAY
|
|
12350 LDA SRCH+1
|
|
12360 ADC #0
|
|
12370 PHA
|
|
12380 CPY PP
|
|
12390 SBC PP+1
|
|
12400 BCS HE5CE ;=HS>"MEM FULL" error
|
|
12410 STY PV
|
|
12420 PLA
|
|
12430 STA PV+1
|
|
12440 PLA
|
|
12450 TAY
|
|
12460 LDA #0
|
|
12470 DEY
|
|
12480 STA (SRCH),Y
|
|
12490 DEY
|
|
12500 STA (SRCH),Y
|
|
12510 DEY
|
|
12520 LDA PV+1
|
|
12530 STA (SRCH),Y
|
|
12540 DEY
|
|
12550 LDA PV
|
|
12560 STA (SRCH),Y
|
|
12570 DEY
|
|
12580 LDA #0
|
|
12590 *!LOOP
|
|
12600 STA (SRCH),Y
|
|
12610 DEY
|
|
12620 BMI HE5D3 ;=>
|
|
12630 LDA (PX),Y
|
|
12640 *!UNTIL <EQ>
|
|
12650 HE640
|
|
12660 LDA LOMEM
|
|
12670 LDY LOMEM+1
|
|
12680 BNE HE5F2 ;=>always
|
|
12690
|
|
12700 HE646
|
|
12710 LDA (SRCH),Y
|
|
12720 CMP #$40
|
|
12730 BCS HE5E6 ;=HS>
|
|
12740 STA NOUNSTKC-1,X
|
|
12750 TYA
|
|
12760 ADC #$03
|
|
12770 PHA
|
|
12780 ADC SRCH
|
|
12790 JSR HE70A
|
|
12800 *!LOOP
|
|
12810 JSR GETVERB
|
|
12820 DEY
|
|
12830 *!UNTIL <EQ>
|
|
12840 TYA
|
|
12850 ADC SRCH+1
|
|
12860 STA NOUNSTKH,X
|
|
12870 PLA
|
|
12880 BIT XSAVE
|
|
12890 BMI HE684 ;=>
|
|
12900 TAY
|
|
12910 LDA #0
|
|
12920 JSR HE70A
|
|
12930 STA NOUNSTKH,X
|
|
12940 *!LOOP
|
|
12950 LDA (SRCH),Y
|
|
12960 BPL HE682 ;=>EXIT LOOP
|
|
12970 INC NOUNSTKH,X
|
|
12980 INY
|
|
12990 *!UNTIL <EQ>
|
|
13000 * always
|
|
13010
|
|
13020 DB 9 ;Z
|
|
13030
|
|
13040 HE679 ;solo
|
|
13050 LDA #0
|
|
13060 STA IFFLAG ;pos
|
|
13070 STA CRFLAG ;pos
|
|
13080 LDX #$20
|
|
13090 HE681
|
|
13100 PHA
|
|
13110 HE682
|
|
13120 LDY #0
|
|
13130 HE684
|
|
13140 LDA (PX),Y
|
|
13150 *!LOOP
|
|
13160 BPL HE6A0 ;=>EXIT LOOP
|
|
13170 ASL
|
|
13180 BMI HE640 ;=>
|
|
13190 JSR GETVERB
|
|
13200 JSR HE708
|
|
13210 JSR GETVERB
|
|
13220 STA NOUNSTKC,X
|
|
13230 HE696
|
|
13240 BIT IFFLAG
|
|
13250 *! IF <MI>
|
|
13260 DEX
|
|
13270 *! ENDIF
|
|
13280 HE69B
|
|
13290 JSR GETVERB
|
|
13300 *!UNTIL <CC>
|
|
13310 HE6A0
|
|
13320 CMP #$28
|
|
13330 *!IF <EQ>
|
|
13340 LDA PX
|
|
13350 JSR HE70A
|
|
13360 LDA PX+1
|
|
13370 STA NOUNSTKH,X
|
|
13380 BIT IFFLAG
|
|
13390 BMI HE6BC ;=>
|
|
13400 LDA #$01
|
|
13410 JSR HE70A
|
|
13420 LDA #0
|
|
13430 STA NOUNSTKH,X
|
|
13440 *! LOOP
|
|
13450 INC NOUNSTKH,X
|
|
13460 HE6BC
|
|
13470 JSR GETVERB
|
|
13480 *! UNTIL <PL>
|
|
13490 BCS HE696 ;=>
|
|
13500 *!ENDIF
|
|
13510 BIT IFFLAG
|
|
13520 *!IF <MI>
|
|
13530 CMP #$04
|
|
13540 BCS HE69B ;=HS>
|
|
13550 LSR IFFLAG ;pos
|
|
13560 *!ENDIF
|
|
13570 TAY
|
|
13580 STA VERBNOW
|
|
13590 LDA HE980,Y
|
|
13600 AND #%01010101 ;even bits only
|
|
13610 ASL
|
|
13620 STA PRFLAG ;temp
|
|
13630 HE6D8
|
|
13640 PLA
|
|
13650 TAY
|
|
13660 LDA HE980,Y
|
|
13670 AND #%10101010 ;odd bits only
|
|
13680 CMP PRFLAG
|
|
13690 *!IF <LO>
|
|
13700 TYA
|
|
13710 PHA
|
|
13720 JSR HF3EB
|
|
13730 LDA VERBNOW
|
|
13740 BCC HE681 ;=LT> always
|
|
13750 *!ENDIF
|
|
13760
|
|
13770 * BRANCH: get high/low then JSR
|
|
13780
|
|
13790 LDA VERBADRL,Y
|
|
13800 STA ACC
|
|
13810 LDA VERBADRH,Y
|
|
13820 STA ACC+1
|
|
13830 JSR HE6FC
|
|
13840 JMP HE6D8
|
|
13850 *>
|
|
13860
|
|
13870 HE6FC
|
|
13880 JMP (ACC)
|
|
13890 *>
|
|
13900
|
|
13910 GETVERB ;get next verb to use
|
|
13920 INCW PX
|
|
13930 LDA (PX),Y
|
|
13940 RTS
|
|
13950 **
|
|
13960
|
|
13970 HE708
|
|
13980 STY NOUNSTKH-1,X
|
|
13990 HE70A
|
|
14000 DEX
|
|
14010 *!IF <PL>
|
|
14020 STA NOUNSTKL,X
|
|
14030 RTS
|
|
14040 *!ENDIF
|
|
14050
|
|
14060 LDY #$66 ;"PPED AT" ;Z?
|
|
14070 HE712
|
|
14080 JMP ERRMESS
|
|
14090 *>
|
|
14100
|
|
14110 *---------
|
|
14120 * Output Yreg := 0
|
|
14130
|
|
14140 GET16BIT ;get a 16 bit value
|
|
14150 LDY #0
|
|
14160 LDA NOUNSTKL,X
|
|
14170 STA ACC
|
|
14180 LDA NOUNSTKC,X
|
|
14190 STA ACC+1
|
|
14200 LDA NOUNSTKH,X
|
|
14210 *!IF <NE>
|
|
14220 STA ACC+1
|
|
14230 LDA (ACC),Y ;ACC := (ACC),Y
|
|
14240 PHA ;save low byte
|
|
14250 INY ;Yreg := 1
|
|
14260 LDA (ACC),Y
|
|
14270 STA ACC+1
|
|
14280 PLA ;restore low byte
|
|
14290 STA ACC
|
|
14300 DEY ;Yreg := 0
|
|
14310 *!ENDIF
|
|
14320 INX
|
|
14330 RTS
|
|
14340 **
|
|
14350
|
|
14360 * tkn $16 =
|
|
14370 * num var logic op
|
|
14380 * IF X = 13 THEN END
|
|
14390
|
|
14400 HE733 ;VO
|
|
14410 JSR HE74A
|
|
14420
|
|
14430 * tkn $37 NOT
|
|
14440 * numeric
|
|
14450 * IF NOT X THEN END
|
|
14460
|
|
14470 NOT ;V
|
|
14480 JSR GET16BIT
|
|
14490 TYA ;Areg := 0
|
|
14500 JSR HE708
|
|
14510 STA NOUNSTKC,X
|
|
14520 CMP ACC
|
|
14530 *!IF <EQ>
|
|
14540 CMP ACC+1
|
|
14550 *! IF <EQ>
|
|
14560 INC NOUNSTKL,X
|
|
14570 *! ENDIF
|
|
14580 *!ENDIF
|
|
14590 RTS
|
|
14600 **
|
|
14610
|
|
14620 * tkn $17 #
|
|
14630 * num var logic op
|
|
14640 * IF X # 13 THEN END
|
|
14650
|
|
14660 * tkn $1B <>
|
|
14670 * num var logic op
|
|
14680 * IF X <> 13 THEN END
|
|
14690
|
|
14700 HE74A ;V
|
|
14710 JSR SUBTRACT
|
|
14720 JSR SGN
|
|
14730
|
|
14740 * tkn $31 ABS
|
|
14750
|
|
14760 ABS ;VO
|
|
14770 JSR GET16BIT
|
|
14780 BIT ACC+1
|
|
14790 BMI HE772 ;=>
|
|
14800 HE757 ;solo
|
|
14810 DEX
|
|
14820 HE758
|
|
14830 RTS
|
|
14840 **
|
|
14850
|
|
14860 * tkn $30 SGN
|
|
14870
|
|
14880 SGN ;V
|
|
14890 JSR GET16BIT
|
|
14900 LDA ACC+1 ;is ACC zero?
|
|
14910 *!IF <EQ>
|
|
14920 LDA ACC
|
|
14930 BEQ HE757 ;=>yes
|
|
14940 *!ENDIF
|
|
14950 LDA #$FF
|
|
14960 JSR HE708
|
|
14970 STA NOUNSTKC,X
|
|
14980 BIT ACC+1
|
|
14990 BMI HE758 ;=>RTS
|
|
15000
|
|
15010 * tkn $36 -
|
|
15020 * unary sign of number
|
|
15030 * X = -5
|
|
15040
|
|
15050 NEGATE ;V
|
|
15060 JSR GET16BIT
|
|
15070 HE772
|
|
15080 TYA ;Areg := 0
|
|
15090 SEC
|
|
15100 SBC ACC
|
|
15110 JSR HE708
|
|
15120 TYA
|
|
15130 SBC ACC+1
|
|
15140 BVC HE7A1 ;=>
|
|
15150 HE77E
|
|
15160 LDY #ErrMsg00 ;">32767"
|
|
15170 BPL HE712 ;=>always
|
|
15180
|
|
15190 * tkn $13 -
|
|
15200 * num op
|
|
15210 * X=27-2
|
|
15220
|
|
15230 SUBTRACT ;V
|
|
15240 JSR NEGATE ;negate, then add
|
|
15250
|
|
15260 * tkn $12 +
|
|
15270 * num op
|
|
15280 * X=27+2
|
|
15290
|
|
15300 ADDITION ;VO
|
|
15310 JSR GET16BIT
|
|
15320 MOVW ACC;AUX
|
|
15330 JSR GET16BIT
|
|
15340 HE793
|
|
15350 CLC
|
|
15360 LDA ACC
|
|
15370 ADC AUX
|
|
15380 JSR HE708
|
|
15390 LDA ACC+1
|
|
15400 ADC AUX+1
|
|
15410 BVS HE77E ;=>
|
|
15420 HE7A1
|
|
15430 STA NOUNSTKC,X
|
|
15440
|
|
15450 * tkn $35 +
|
|
15460 * unary sign of number
|
|
15470 * X = +5
|
|
15480
|
|
15490 POSITIVE ;VO
|
|
15500 RTS
|
|
15510 **
|
|
15520
|
|
15530 * tkn $50 TAB
|
|
15540
|
|
15550 TAB ;VO
|
|
15560 JSR GETBYTE
|
|
15570 TAY
|
|
15580 *!IF <EQ>
|
|
15590 JMP HEECB ;range error?
|
|
15600 *!ENDIF
|
|
15610 DEY
|
|
15620 HE7AE ;solo
|
|
15630 JMP HF3F4
|
|
15640 *>
|
|
15650
|
|
15660 * comma tab to next tab posn (every 8 spaces)
|
|
15670
|
|
15680 HE7B1
|
|
15690 LDA CH ;get horiz posn
|
|
15700 ORA #$07 ;set bits 0-2
|
|
15710 TAY
|
|
15720 INY ;incr, is it zero?
|
|
15730 HE7B7 ;Z
|
|
15740 BNE HE7AE ;=>no, adjust CH
|
|
15750 INY ;yes, go to next tab posn
|
|
15760 BNE HE7B1 ;=>always
|
|
15770 BCS HE7B7 ;=>;Z
|
|
15780 RTS ;Z
|
|
15790 **
|
|
15800
|
|
15810 DB 0,0 ;Z
|
|
15820
|
|
15830 * tkn $49 ,
|
|
15840 * num print follows
|
|
15850 * PRINT A$,X
|
|
15860
|
|
15870 HE7C1 ;VO
|
|
15880 JSR HE7B1
|
|
15890
|
|
15900 * tkn $46 ;
|
|
15910 * num print follows
|
|
15920 * PRINT A$ ; X
|
|
15930
|
|
15940 * tkn $62 PRINT
|
|
15950 * num value
|
|
15960 * PRINT 123: PRINT X: PRINT ASC(A$)
|
|
15970
|
|
15980 PRNTNUM ;VO branch
|
|
15990 JSR GET16BIT
|
|
16000 HE7C7 ;solo
|
|
16010 LDA ACC+1 ;is it positive?
|
|
16020 *!IF <MI>
|
|
16030 LDA #"-" ;no, print minus sign
|
|
16040 JSR COUT
|
|
16050 JSR HE772
|
|
16060 BVC PRNTNUM ;=>always
|
|
16070 *!ENDIF
|
|
16080 DEY ;Yreg := $FF
|
|
16090 STY CRFLAG ;CRFLAG := $FF
|
|
16100 STX ACC+1 ;save Xreg
|
|
16110 LDX ACC
|
|
16120 JSR PRDEC
|
|
16130 LDX ACC+1 ;restore Xreg
|
|
16140 RTS
|
|
16150 **
|
|
16160
|
|
16170 * tkn $0D AUTO
|
|
16180
|
|
16190 AUTO ;VO
|
|
16200 JSR GET16BIT
|
|
16210 MOVW ACC;AUTOLN
|
|
16220 DEY
|
|
16230 STY AUTOFLAG ;AUTOFLAG := $FF
|
|
16240 INY
|
|
16250 LDA #10 ;default increment
|
|
16260 HE7F3
|
|
16270 STA AUTOINC
|
|
16280 STY AUTOINC+1
|
|
16290 RTS
|
|
16300 **
|
|
16310
|
|
16320 * tkn $0E ,
|
|
16330 * AUTO 10,20
|
|
16340
|
|
16350 COMMA_AUTO ;VO
|
|
16360 JSR GET16BIT
|
|
16370 LDA ACC
|
|
16380 LDY ACC+1
|
|
16390 BPL HE7F3 ;=>always
|
|
16400
|
|
16410 * tkn $56 =
|
|
16420 * FOR X = 5 TO 10
|
|
16430
|
|
16440 * tkn $71 =
|
|
16450 * num - non-conditional
|
|
16460 * X = 5
|
|
16470
|
|
16480 HE801 ;V
|
|
16490 JSR GET16BIT
|
|
16500 LDA NOUNSTKL,X
|
|
16510 STA AUX
|
|
16520 LDA NOUNSTKH,X
|
|
16530 STA AUX+1
|
|
16540 LDA ACC
|
|
16550 STA (AUX),Y
|
|
16560 INY
|
|
16570 LDA ACC+1
|
|
16580 JMP HF207
|
|
16590 *>
|
|
16600
|
|
16610 * tkn $25 THEN
|
|
16620 * IF X = 3 THEN Y = 5
|
|
16630
|
|
16640 * tkn $5E LET
|
|
16650
|
|
16660 LET ;VO
|
|
16670 RTS
|
|
16680 **
|
|
16690
|
|
16700 * tkn $00
|
|
16710 * internal begin-of-line
|
|
16720
|
|
16730 BEGIN_LINE ;VO
|
|
16740 PLA
|
|
16750 PLA
|
|
16760
|
|
16770 * tkn $03 :
|
|
16780 * statement separation
|
|
16790 * X = 5: A$ = "HELLO"
|
|
16800
|
|
16810 COLON ;VO
|
|
16820 BIT CRFLAG
|
|
16830 BPL HE822 ;=>RTS
|
|
16840
|
|
16850 * tkn $63 PRINT
|
|
16860 * dummy print
|
|
16870 * PRINT: PRINT
|
|
16880
|
|
16890 PRINT_CR ;VO
|
|
16900 JSR CROUT
|
|
16910
|
|
16920 * tkn $47 ;
|
|
16930 * end of print statement
|
|
16940 * PRINT A$;
|
|
16950
|
|
16960 HE820 ;VO
|
|
16970 LSR CRFLAG ;pos
|
|
16980 HE822
|
|
16990 RTS
|
|
17000 **
|
|
17010
|
|
17020 * tkn $22 (
|
|
17030 * string DIM
|
|
17040 * DIM A$(X)
|
|
17050
|
|
17060 * tkn $34 (
|
|
17070 * num DIM
|
|
17080 * DIM X(5)
|
|
17090
|
|
17100 * tkn $38 (
|
|
17110 * logic statements and num operations
|
|
17120 * IF C AND (A=14 OR B=12) THEN X=(27+3)/13
|
|
17130
|
|
17140 * tkn $3F (
|
|
17150 * used after PEEK, RND, SGN, ABS, and PDL
|
|
17160
|
|
17170 HE823 ;V
|
|
17180 LDY #$FF
|
|
17190 STY PRFLAG ;PRFLAG := $FF
|
|
17200
|
|
17210 * tkn $72 )
|
|
17220 * the only right parenthesis token
|
|
17230
|
|
17240 RIGHT_PAREN ;VO
|
|
17250 RTS
|
|
17260 **
|
|
17270
|
|
17280 * tkn $60 IF
|
|
17290
|
|
17300 IF ;VO
|
|
17310 JSR HEFCD
|
|
17320 *!IF <NE>
|
|
17330 LDA #$25 ;THEN token?
|
|
17340 STA VERBNOW
|
|
17350 DEY
|
|
17360 STY IFFLAG
|
|
17370 *!ENDIF
|
|
17380 INX
|
|
17390 RTS
|
|
17400 **
|
|
17410
|
|
17420 * RUN without CLR
|
|
17430 * DOS 3.3 chains here to run a program
|
|
17440
|
|
17450 RUNWARM ;solo
|
|
17460 LDA PP
|
|
17470 LDY PP+1
|
|
17480 BNE HE896 ;=>always
|
|
17490
|
|
17500 * tkn $5C GOSUB
|
|
17510
|
|
17520 GOSUB ;VO
|
|
17530 LDY #ErrMsg08 ;"16 GOSUBS"
|
|
17540 LDA GOSUBNDX
|
|
17550 CMP #16 ;sixteen GOSUBs?
|
|
17560 BCS HE8A2 ;=HS> yes, error
|
|
17570 TAY
|
|
17580 INC GOSUBNDX
|
|
17590
|
|
17600 LDA PX
|
|
17610 STA STK_00,Y
|
|
17620 LDA PX+1
|
|
17630 STA STK_10,Y
|
|
17640
|
|
17650 LDA PR
|
|
17660 STA STK_20,Y
|
|
17670 LDA PR+1
|
|
17680 STA STK_30,Y
|
|
17690
|
|
17700 * tkn $24 THEN
|
|
17710 * followed by a line number
|
|
17720 * IF X=3 THEN 10
|
|
17730
|
|
17740 * tkn $5F GOTO
|
|
17750
|
|
17760 GOTO ;V
|
|
17770 JSR GET16BIT
|
|
17780 JSR HE56D
|
|
17790 *!IF <CS>
|
|
17800 LDY #ErrMsg07 ;"BAD BRANCH"
|
|
17810 BNE HE8A2 ;=>always
|
|
17820 *!ENDIF
|
|
17830 LDA P2
|
|
17840 LDY P2+1
|
|
17850
|
|
17860 * main loop for running Integer BASIC programs
|
|
17870
|
|
17880 *!LOOP
|
|
17890 *! LOOP
|
|
17900 STA PR
|
|
17910 STY PR+1
|
|
17920 CLC
|
|
17930 ADC #$03
|
|
17940 *! IF <CS>
|
|
17950 INY
|
|
17960 *! ENDIF
|
|
17970 GETNEXT ;fetch next statement from text source
|
|
17980 LDX #$FF
|
|
17990 STX RUNFLAG ;neg
|
|
18000 TXS
|
|
18010 STA PX
|
|
18020 STY PX+1
|
|
18030 JSR HF02E ;test for ctrl-C & TRACE mode
|
|
18040 LDY #0
|
|
18050 HE883
|
|
18060 JSR HE679 ;execute statement
|
|
18070 BIT RUNFLAG
|
|
18080 BPL END ;=>
|
|
18090 CLC
|
|
18100 LDY #0
|
|
18110 LDA PR
|
|
18120 ADC (PR),Y
|
|
18130 LDY PR+1
|
|
18140 *! IF <CS>
|
|
18150 INY
|
|
18160 *! ENDIF
|
|
18170 HE896
|
|
18180 CMP HIMEM
|
|
18190 *! UNTIL <EQ>
|
|
18200 CPY HIMEM+1
|
|
18210 *!UNTIL <EQ>
|
|
18220 LDY #ErrMsg06 ;"NO END"
|
|
18230 LSR RUNFLAG ;pos
|
|
18240 HE8A2
|
|
18250 JMP ERRMESS
|
|
18260 *>
|
|
18270
|
|
18280 * tkn $5B RETURN
|
|
18290
|
|
18300 RETURN ;V
|
|
18310 LDY #ErrMsg09 ;"BAD RETURN"
|
|
18320 LDA GOSUBNDX
|
|
18330 BEQ HE8A2 ;=>
|
|
18340 DEC GOSUBNDX
|
|
18350 TAY
|
|
18360 LDA STK_20-1,Y
|
|
18370 STA PR
|
|
18380 LDA STK_30-1,Y
|
|
18390 STA PR+1
|
|
18400 LDX: STK_00-1,Y
|
|
18410 LDA STK_10-1,Y
|
|
18420 HE8BE
|
|
18430 TAY
|
|
18440 TXA
|
|
18450 JMP GETNEXT
|
|
18460 *>
|
|
18470
|
|
18480 STOPPED_AT
|
|
18490 LDY #ErrMsg12 ;"STOPPED AT "
|
|
18500 JSR ERRORMESS
|
|
18510 LDY #1
|
|
18520 LDA (PR),Y
|
|
18530 TAX
|
|
18540 INY
|
|
18550 LDA (PR),Y
|
|
18560 JSR PRDEC
|
|
18570
|
|
18580 * tkn $51 END
|
|
18590
|
|
18600 END ;V
|
|
18610 JMP WARM
|
|
18620 *>
|
|
18630
|
|
18640 *!LOOP
|
|
18650 *! LOOP
|
|
18660 DEC FORNDX
|
|
18670
|
|
18680 * tkn $59 NEXT
|
|
18690
|
|
18700 * tkn $5A ,
|
|
18710 * NEXT X,Y
|
|
18720
|
|
18730 NEXT ;VO
|
|
18740 LDY #ErrMsg11 ;"BAD NEXT"
|
|
18750 LDA FORNDX
|
|
18760 HE8DC
|
|
18770 BEQ HE8A2 ;=>no more FORs
|
|
18780 TAY
|
|
18790 LDA NOUNSTKL,X
|
|
18800 CMP STK_40-1,Y
|
|
18810 *! UNTIL <EQ>
|
|
18820 LDA NOUNSTKH,X
|
|
18830 CMP STK_50-1,Y
|
|
18840 *!UNTIL <EQ>
|
|
18850
|
|
18860 LDA STK_60-1,Y
|
|
18870 STA AUX
|
|
18880 LDA STK_70-1,Y
|
|
18890 STA AUX+1
|
|
18900
|
|
18910 JSR GET16BIT
|
|
18920 DEX
|
|
18930 JSR HE793
|
|
18940 JSR HE801
|
|
18950 DEX
|
|
18960 LDY FORNDX
|
|
18970 LDA STK_D0-1,Y
|
|
18980 STA NOUNSTKC-1,X
|
|
18990 LDA STK_C0-1,Y
|
|
19000 LDY #0
|
|
19010 JSR HE708
|
|
19020 JSR SUBTRACT
|
|
19030 JSR SGN
|
|
19040 JSR GET16BIT
|
|
19050 LDY FORNDX
|
|
19060 LDA ACC
|
|
19070 *!IF <NE>
|
|
19080 EOR STK_70-1,Y
|
|
19090 BPL HE937 ;=>
|
|
19100 *!ENDIF
|
|
19110
|
|
19120 LDA STK_80-1,Y
|
|
19130 STA PR
|
|
19140 LDA STK_90-1,Y
|
|
19150 STA PR+1
|
|
19160
|
|
19170 LDX STK_A0-1,Y
|
|
19180 LDA STK_B0-1,Y
|
|
19190 BNE HE8BE ;=>
|
|
19200 HE937
|
|
19210 DEC FORNDX
|
|
19220 RTS
|
|
19230 **
|
|
19240
|
|
19250 * tkn $55 FOR
|
|
19260
|
|
19270 FOR ;VO
|
|
19280 LDY #ErrMsg10 ;"16 FORS"
|
|
19290 LDA FORNDX
|
|
19300 CMP #16 ;sixteen FORs?
|
|
19310 BEQ HE8DC ;=>yes, error
|
|
19320 INC FORNDX
|
|
19330 TAY
|
|
19340 LDA NOUNSTKL,X
|
|
19350 STA STK_40,Y
|
|
19360 LDA NOUNSTKH,X
|
|
19370 JMP HF288
|
|
19380 *>
|
|
19390
|
|
19400 RTS ;Z
|
|
19410 **
|
|
19420
|
|
19430 * tkn $57 TO
|
|
19440
|
|
19450 TO ;VO
|
|
19460 JSR GET16BIT
|
|
19470 LDY FORNDX
|
|
19480
|
|
19490 LDA ACC
|
|
19500 STA STK_C0-1,Y
|
|
19510 LDA ACC+1
|
|
19520 STA STK_D0-1,Y
|
|
19530
|
|
19540 LDA #<$0001
|
|
19550 STA STK_60-1,Y
|
|
19560 LDA #>$0001
|
|
19570 HE966 ;solo
|
|
19580 STA STK_70-1,Y
|
|
19590
|
|
19600 LDA PR
|
|
19610 STA STK_80-1,Y
|
|
19620 LDA PR+1
|
|
19630 STA STK_90-1,Y
|
|
19640
|
|
19650 LDA PX
|
|
19660 STA STK_A0-1,Y
|
|
19670 LDA PX+1
|
|
19680 STA STK_B0-1,Y
|
|
19690 RTS
|
|
19700 **
|
|
19710
|
|
19720 DB $20,$15 ;Z
|
|
19730
|
|
19740
|
|
19750 PUT TABLE1
|
|
19760 HE980
|
|
19770 DB $00,$00,$00,$AB,$03,$03,$03,$03
|
|
19780 DB $03,$03,$03,$03,$03,$03,$03,$03
|
|
19790 DB $03,$03,$3F,$3F,$C0,$C0,$3C,$3C
|
|
19800 DB $3C,$3C,$3C,$3C,$3C,$30,$0F,$C0
|
|
19810 DB $C3,$FF,$55,$00,$AB,$AB,$03,$03
|
|
19820 DB $FF,$FF,$55,$FF,$FF,$55,$CF,$CF
|
|
19830 DB $CF,$CF,$CF,$FF,$55,$C6,$C6,$C6
|
|
19840 DB $55,$F0,$F0,$CF,$CF,$55,$01,$55
|
|
19850 DB $FF,$FF,$55,$03,$03,$03,$03,$03
|
|
19860 DB $03,$03,$03,$03,$03,$03,$03,$03
|
|
19870 DB $03,$03,$03,$03,$03,$03,$03,$03
|
|
19880 DB $03,$03,$03,$03,$03,$00,$AB,$03
|
|
19890 DB $57,$03,$03,$03,$03,$07,$03,$03
|
|
19900 DB $03,$03,$03,$03,$03,$03,$03,$03
|
|
19910 DB $03,$03,$AA,$FF,$03,$03,$03,$03
|
|
19920 DB $03,$03,$03,$03,$03,$03,$03,$03
|
|
19930
|
|
19940 * token address tables (verb dispatch tables)
|
|
19950
|
|
19960 VERBADRL
|
|
19970 DB <BEGIN_LINE,<$FFFF,<$FFFF,<COLON
|
|
19980 DB <LOAD,<SAVE,<CON,<RUNNUM
|
|
19990 DB <RUN,<DEL,<COMMA_DEL,<NEW
|
|
20000 DB <CLR,<AUTO,<COMMA_AUTO,<MAN
|
|
20010 DB <VHIMEM,<VLOMEM,<ADDITION,<SUBTRACT
|
|
20020 DB <MULT,<DIVIDE,<HE733,<HE74A
|
|
20030 DB <HF25B,<HF24E,<HF253,<HE74A
|
|
20040 DB <HF249,<VAND,<VOR,<MOD
|
|
20050 DB <EXP,<$FFFF,<HE823,<COMMA_SUBSTR
|
|
20060 DB <GOTO,<LET,<HEFB6,<HEBCB
|
|
20070 DB <$FFFF,<$FFFF,<PAREN_SUBSTR,<$FFFF
|
|
20080 DB <$FFFF,<HEF24,<PEEK,<RND
|
|
20090 DB <SGN,<ABS,<PDL,<$FFFF
|
|
20100 DB <HE823,<POSITIVE,<NEGATE,<NOT
|
|
20110 DB <HE823,<HE1D7,<HE21C,<LEN
|
|
20120 DB <ASC,<SCRN,<COMMA_SCRN,<HE823
|
|
20130 DB <$FFFF,<$FFFF,<HE121,<DIMSTR
|
|
20140 DB <DIMNUM,<PRNTSTR,<PRNTNUM,<HE820
|
|
20150 DB <HEE00,<HE7C1,<HF3BA,<SETTXT
|
|
20160 DB <SETGR,<CALL,<DIMSTR,<DIMNUM
|
|
20170 DB <TAB,<END,<HEFB6,<INPUT_PROMPT
|
|
20180 DB <HEBAA,<FOR,<HE801,<TO
|
|
20190 DB <STEP,<NEXT,<NEXT,<RETURN
|
|
20200 DB <GOSUB,<$FFFF,<LET,<GOTO
|
|
20210 DB <IF,<PRNTSTR,<PRNTNUM,<PRINT_CR
|
|
20220 DB <POKE,<GETVAL255,<COLOR,<GETVAL255
|
|
20230 DB <COMMA_PLOT,<GETVAL255,<COMMA_HLIN,<AT_HLIN
|
|
20240 DB <GETVAL255,<COMMA_VLIN,<AT_VLIN,<IVTAB
|
|
20250 DB <HE18C,<HE801,<RIGHT_PAREN,<$FFFF
|
|
20260 DB <LISTNUM,<COMMA_LIST,<LIST,<POP
|
|
20270 DB <NODSP_STR,<NODSP_NUM,<NOTRACE,<DSP_NUM
|
|
20280 DB <DSP_STR,<TRACE,<PRSLOT,<INSLOT
|
|
20290
|
|
20300 VERBADRH
|
|
20310 DB >BEGIN_LINE,>$FFFF,>$FFFF,>COLON
|
|
20320 DB >LOAD,>SAVE,>CON,>RUNNUM
|
|
20330 DB >RUN,>DEL,>COMMA_DEL,>NEW
|
|
20340 DB >CLR,>AUTO,>COMMA_AUTO,>MAN
|
|
20350 DB >VHIMEM,>VLOMEM,>ADDITION,>SUBTRACT
|
|
20360 DB >MULT,>DIVIDE,>HE733,>HE74A
|
|
20370 DB >HF25B,>HF24E,>HF253,>HE74A
|
|
20380 DB >HF249,>VAND,>VOR,>MOD
|
|
20390 DB >EXP,>$FFFF,>HE823,>COMMA_SUBSTR
|
|
20400 DB >GOTO,>LET,>HEFB6,>HEBCB
|
|
20410 DB >$FFFF,>$FFFF,>PAREN_SUBSTR,>$FFFF
|
|
20420 DB >$FFFF,>HEF24,>PEEK,>RND
|
|
20430 DB >SGN,>ABS,>PDL,>$FFFF
|
|
20440 DB >HE823,>POSITIVE,>NEGATE,>NOT
|
|
20450 DB >HE823,>HE1D7,>HE21C,>LEN
|
|
20460 DB >ASC,>SCRN,>COMMA_SCRN,>HE823
|
|
20470 DB >$FFFF,>$FFFF,>HE121,>DIMSTR
|
|
20480 DB >DIMNUM,>PRNTSTR,>PRNTNUM,>HE820
|
|
20490 DB >HEE00,>HE7C1,>HF3BA,>SETTXT
|
|
20500 DB >SETGR,>CALL,>DIMSTR,>DIMNUM
|
|
20510 DB >TAB,>END,>HEFB6,>INPUT_PROMPT
|
|
20520 DB >HEBAA,>FOR,>HE801,>TO
|
|
20530 DB >STEP,>NEXT,>NEXT,>RETURN
|
|
20540 DB >GOSUB,>$FFFF,>LET,>GOTO
|
|
20550 DB >IF,>PRNTSTR,>PRNTNUM,>PRINT_CR
|
|
20560 DB >POKE,>GETVAL255,>COLOR,>GETVAL255
|
|
20570 DB >COMMA_PLOT,>GETVAL255,>COMMA_HLIN,>AT_HLIN
|
|
20580 DB >GETVAL255,>COMMA_VLIN,>AT_VLIN,>IVTAB
|
|
20590 DB >HE18C,>HE801,>RIGHT_PAREN,>$FFFF
|
|
20600 DB >LISTNUM,>COMMA_LIST,>LIST,>POP
|
|
20610 DB >NODSP_STR,>NODSP_NUM,>NOTRACE,>DSP_NUM
|
|
20620 DB >DSP_STR,>TRACE,>PRSLOT,>INSLOT
|
|
20630
|
|
20640 ErrorMsgs
|
|
20650
|
|
20660 ErrMsg00 = *-ErrorMsgs+$8100 ;00
|
|
20670 DCI ">32767"
|
|
20680
|
|
20690 ErrMsg01 = *-ErrorMsgs+$8100 ;06
|
|
20700 DCI "TOO LONG"
|
|
20710
|
|
20720 ErrMsg02 = *-ErrorMsgs+$8100 ;0E
|
|
20730 DCI "SYNTAX"
|
|
20740
|
|
20750 ErrMsg03 = *-ErrorMsgs+$8100 ;14
|
|
20760 DCI "MEM FULL"
|
|
20770
|
|
20780 ErrMsg04 = *-ErrorMsgs+$8100 ;1C
|
|
20790 DCI "TOO MANY PARENS"
|
|
20800
|
|
20810 ErrMsg05 = *-ErrorMsgs+$8100 ;2B
|
|
20820 DCI "STRING"
|
|
20830
|
|
20840 ErrMsg06 = *-ErrorMsgs+$8100 ;31
|
|
20850 DCI "NO END"
|
|
20860
|
|
20870 ErrMsg07 = *-ErrorMsgs+$8100 ;37
|
|
20880 DCI "BAD BRANCH"
|
|
20890
|
|
20900 ErrMsg08 = *-ErrorMsgs+$8100 ;41
|
|
20910 DCI "16 GOSUBS"
|
|
20920
|
|
20930 ErrMsg09 = *-ErrorMsgs+$8100 ;4A
|
|
20940 DCI "BAD RETURN"
|
|
20950
|
|
20960 ErrMsg10 = *-ErrorMsgs+$8100 ;54
|
|
20970 DCI "16 FORS"
|
|
20980
|
|
20990 ErrMsg11 = *-ErrorMsgs+$8100 ;5B
|
|
21000 DCI "BAD NEXT"
|
|
21010
|
|
21020 ErrMsg12 = *-ErrorMsgs+$8100 ;63
|
|
21030 DCI "STOPPED AT "
|
|
21040
|
|
|
|
21050 ErrMsg13 = *-ErrorMsgs+$8100 ;6E
|
|
21060 DCI "*** "
|
|
21070
|
|
21080 ErrMsg14 = *-ErrorMsgs+$8100 ;72
|
|
21090 ASC " ERR"
|
|
21100 DB CR
|
|
21110
|
|
21120 ErrMsg15 = *-ErrorMsgs+$8100 ;77
|
|
21130 DCI ">255"
|
|
21140
|
|
21150 ErrMsg16 = *-ErrorMsgs+$8100 ;7B
|
|
21160 DCI "RANGE"
|
|
21170
|
|
21180 ErrMsg17 = *-ErrorMsgs+$8100 ;80
|
|
21190 DCI "DIM"
|
|
21200
|
|
21210 ErrMsg18 = *-ErrorMsgs+$8100 ;83
|
|
21220 DCI "STR OVFL"
|
|
21230
|
|
21240 ASC "\" ;8B
|
|
21250 DB CR
|
|
21260
|
|
21270 ErrMsg20 = *-ErrorMsgs+$8100 ;8D
|
|
21280 ASC "RETYPE LINE"
|
|
21290 DB CR+$80
|
|
21300
|
|
21310 ErrMsg21 = *-ErrorMsgs+$8100 ;99
|
|
21320 ASC '?'
|
|
21330
|
|
21340 PUT PART2
|
|
21350
|
|
21360 *continue run w/o deleting vars?
|
|
21370
|
|
21380 HEB9A ;solo
|
|
21390 LSR RUNFLAG ;pos
|
|
21400 *!IF <CS>
|
|
21410 JMP STOPPED_AT
|
|
21420 *!ENDIF
|
|
21430 LDX ACC+1
|
|
21440 TXS
|
|
21450 LDX ACC
|
|
21460 LDY #ErrMsg20 ;"RETYPE LINE",CR,"?"
|
|
21470 BNE HEBAC ;=>always
|
|
21480
|
|
21490 * tkn $54 INPUT
|
|
21500 * num with no prompt
|
|
21510 * INPUT X
|
|
21520
|
|
21530 HEBAA ;VO branch
|
|
21540 LDY #ErrMsg21 ;'?' for INPUT
|
|
21550 HEBAC
|
|
21560 JSR ERRORMESS
|
|
21570 STX ACC
|
|
21580 TSX
|
|
21590 STX ACC+1
|
|
21600 JSR HF366
|
|
21610 STY TOKNDX
|
|
21620 LDA #$FF
|
|
21630 STA TXTNDX
|
|
21640 ASL
|
|
21650 STA RUNFLAG ;neg
|
|
21660 LDX #$20
|
|
21670 LDA #$15
|
|
21680 JSR HE491
|
|
21690 INC RUNFLAG
|
|
21700 LDX ACC
|
|
21710
|
|
21720 * tkn $27 ,
|
|
21730 * num inputs
|
|
21740 * INPUT "QUANTITY",Q
|
|
21750
|
|
21760 HEBCB ;VO
|
|
21770 LDY TXTNDX
|
|
21780 ASL
|
|
21790 *!LOOP
|
|
21800 STA ACC
|
|
21810 INY
|
|
21820 LDA IN,Y
|
|
21830 CMP #$80
|
|
21840 BEQ HEBAA ;=>end of input?
|
|
21850 EOR #"0"
|
|
21860 CMP #10
|
|
21870 *!UNTIL <LO>
|
|
21880 INY
|
|
21890 INY
|
|
21900 STY TXTNDX
|
|
21910 LDA IN,Y
|
|
21920 PHA
|
|
21930 LDA IN-1,Y
|
|
21940 LDY #0
|
|
21950 JSR HE708
|
|
21960 PLA
|
|
21970 STA NOUNSTKC,X
|
|
21980 LDA ACC
|
|
21990 CMP #$33
|
|
22000 *!IF <EQ>
|
|
22010 JSR NEGATE
|
|
22020 *!ENDIF
|
|
22030 JMP HE801
|
|
22040 *>
|
|
22050
|
|
22060
|
|
22070
|
|
22080 DB $FF,$FF,$FF ;Z
|
|
22090
|
|
22100 PUT TABLE2
|
|
22110 * token/syntax table
|
|
22120
|
|
22130 SYNTABL
|
|
22140 DB $50
|
|
22150
|
|
22160 DB $20,$4F,$C0 ;Z
|
|
22170 DB "T"+32,"A"-32 ;Z
|
|
22180 DB "D"+32,"O"-32,"M"-32 ;Z
|
|
22190 DB "R"+32,"O"-32 ;Z
|
|
22200 DB "D"+32,"N"-32,"A"-32 ;Z
|
|
22210 DB "P"+32,"E"-32,"T"-32,"S"-32 ;Z
|
|
22220 DB "O"+32,"T"-32 ;Z
|
|
22230 DB "N"+32,"E"-32,"H"-32,"T"-32 ;Z
|
|
22240
|
|
22250 DB $5C,$80,$00,$40
|
|
22260 DB $60,$8D,$60,$8B,$7F,$1D,$20,$7E
|
|
22270 DB $8C,$33,$00,$00,$60,$03,$BF,$12
|
|
22280
|
|
22290 DB $47,"#"-32,"N"-32,"I"-32 ;IN#
|
|
22300 DB $67,"#"-32,"R"-32,"P"-32 ;PR#
|
|
22310 DB "E"+32,"C"-32,"A"-32,"R"-32,"T"-32 ;TRACE
|
|
22320 DB $79,"P"-32,"S"-32,"D"-32 ;DSP
|
|
22330 DB $69,"P"-32,"S"-32,"D"-32 ;DSP
|
|
22340 DB "E"+32,"C"-32,"A"-32,"R"-32,"T"-32,"O"-32,"N"-32 ;NOTRACE
|
|
22350 DB $79,"P"-32,"S"-32,"D"-32,"O"-32,"N"-32 ;NODSP
|
|
22360 DB $69,"P"-32,"S"-32,"D"-32,"O"-32,"N"-32 ;NODSP
|
|
22370 DB "P"+32,"O"-32,"P"-32 ;POP
|
|
22380 DB "T"+32,"S"-32,"I"-32,"L"-32 ;LIST
|
|
22390 DB $60,","-32 ;
|
|
22400 DB $20,"T"-32,"S"-32,"I"-32,"L"-32 ;LIST
|
|
22410 DB 0
|
|
22420 DB $40,$89
|
|
22430 DB ")"+32 ;
|
|
22440 DB $47,"="-32 ;
|
|
22450 DB $17,$68,"="-32 ;
|
|
22460 DB $0A,$58,$7B,$67,"B"-32,"A"-32,"T"-32,"V"-32 ;VTAB
|
|
22470 DB $67,"T"-32,"A"-32 ;AT
|
|
22480 DB $07,","-32 ;
|
|
22490 DB $07,"N"-32,"I"-32,"L"-32,"V"-32 ;VLIN
|
|
22500 DB $67,"T"-32,"A"-32 ;AT
|
|
22510 DB $07,","-32 ;
|
|
22520 DB $07,"N"-32,"I"-32,"L"-32,"H"-32 ;HLIN
|
|
22530 DB $67,","-32 ;
|
|
22540 DB $07,"T"-32,"O"-32,"L"-32,"P"-32 ;PLOT
|
|
22550 DB $67,"="-32,"R"-32,"O"-32,"L"-32,"O"-32,"C"-32 ;COLOR=
|
|
22560 DB $67,","-32 ;
|
|
22570 DB $07,"E"-32,"K"-32,"O"-32,"P"-32 ;POKE
|
|
22580 DB "T"+32,"N"-32,"I"-32,"R"-32,"P"-32 ;PRINT
|
|
22590 DB $7F,$0E,$27,"T"-32,"N"-32,"I"-32,"R"-32,"P"-32 ;PRINT
|
|
22600 DB $7F,$0E,$28,"T"-32,"N"-32,"I"-32,"R"-32,"P"-32 ;PRINT
|
|
22610 DB $64,$07,"F"-32,"I"-32 ;IF
|
|
22620 DB $67,"O"-32,"T"-32,"O"-32,"G"-32 ;GOTO
|
|
22630 DB $78,"T"-32,"E"-32,"L"-32 ;LET
|
|
22640 DB $6B,$7F,$02,"M"-32,"E"-32,"R"-32 ;REM
|
|
22650 DB $67,"B"-32,"U"-32,"S"-32,"O"-32,"G"-32 ;GOSUB
|
|
22660 DB "N"+32,"R"-32,"U"-32,"T"-32,"E"-32,"R"-32 ;RETURN
|
|
22670 DB $7E,","-32 ;
|
|
22680 DB $39,"T"-32,"X"-32,"E"-32,"N"-32 ;NEXT
|
|
22690 DB $67,"P"-32,"E"-32,"T"-32,"S"-32 ;STEP
|
|
22700 DB $27,"O"-32,"T"-32 ;TO
|
|
22710 DB $07,"="-32 ;
|
|
22720 DB $19,"R"-32,"O"-32,"F"-32 ;FOR
|
|
22730 DB $7F,$05,$37,"T"-32,"U"-32,"P"-32,"N"-32,"I"-32 ;INPUT
|
|
22740 DB $7F,$05,$28,"T"-32,"U"-32,"P"-32,"N"-32,"I"-32 ;INPUT
|
|
22750 DB $7F,$05,$2A,"T"-32,"U"-32,"P"-32,"N"-32,"I"-32 ;INPUT
|
|
22760 DB "D"+32,"N"-32,"E"-32 ;END (tkn $51)
|
|
22770
|
|
22780 SYNTABL2
|
|
22790 DB 0
|
|
22800 DB $47,"B"-32,"A"-32,"T"-32 ;TAB (tkn $50)
|
|
22810 DB $7F,$0D,$30,"M"-32,"I"-32,"D"-32 ;DIM
|
|
22820 DB $7F,$0D,$23,"M"-32,"I"-32,"D"-32 ;DIM
|
|
22830 DB $67,"L"-32,"L"-32,"A"-32,"C"-32 ;CALL
|
|
22840 DB "R"+32,"G"-32 ;GR
|
|
22850 DB "T"+32,"X"-32,"E"-32,"T"-32 ;TEXT
|
|
22860 DB 0 ;above are statements
|
|
22870 DB $4D,","+32 ;
|
|
22880 DB $67,","-32 ;
|
|
22890 DB $68,","-32 ;
|
|
22900 DB ";"+32 ;
|
|
22910 DB $67,";"-32 ;
|
|
22920 DB $68,";"-32 ;
|
|
22930 DB $50,","-32 ;
|
|
22940 DB $63,","-32 ;
|
|
22950 DB $7F,$01,$51,$07,"("-32 ;
|
|
22960 DB $29,$84
|
|
22970 DB $80,"$"+32 ;
|
|
22980 DB $19,$57,$71,$07,"("-32 ;
|
|
22990 DB $14,$71,$07,","-32 ;
|
|
23000 DB $07,"("-32,"N"-32,"R"-32,"C"-32,"S"-32 ;SCRN(
|
|
23010 DB $71,$08,"("-32,"C"-32,"S"-32,"A"-32 ;ASC(
|
|
23020 DB $71,$08,"("-32,"N"-32,"E"-32,"L"-32 ;LEN(
|
|
23030 DB $68,"#"-32 ;
|
|
23040 DB $08,$68,"="-32 ;
|
|
23050 DB $08,$71,$07,"("-32 ;
|
|
23060 DB $60,$75,"T"-32,"O"-32,"N"-32 ;NOT
|
|
23070 DB $75,"-"-32 ;
|
|
23080 DB $75,"+"-32 ;
|
|
23090 DB $51,$07,"("-32,$19 ;
|
|
23100 DB "X"-32,"D"-32,"N"-32,"R"-32
|
|
23110 DB "L"+32,"D"-32,"P"-32 ;PDL
|
|
23120 DB "S"+32,"B"-32,"A"-32 ;ABS
|
|
23130 DB "N"+32,"G"-32,"S"-32 ;SGN
|
|
23140 DB "D"+32,"N"-32,"R"-32 ;RND
|
|
23150 DB "K"+32,"E"-32,"E"-32,"P"-32 ;PEEK
|
|
23160 DB $51,$07,"("-32 ;
|
|
23170 DB $39,$81,$C1,$4F,$7F,$0F,$2F
|
|
23180 DB 0 ;above are functions
|
|
23190 DB $51,$06,"("-32 ;
|
|
23200 DB $29,"""+32 ;open quote
|
|
23210 DB $0C,"""-32 ;close quote
|
|
23220 DB $57,","-32 ;
|
|
23230 DB $6A,","-32 ;
|
|
23240 DB $42,"N"-32,"E"-32,"H"-32,"T"-32 ;THEN
|
|
23250 DB $60,"N"-32,"E"-32,"H"-32,"T"-32 ;THEN
|
|
23260 DB $4F,$7E,$1E,$35,","-32 ;
|
|
23270 DB $27,$51,$07,"("-32 ;
|
|
23280 DB $09,"+"-32
|
|
23290 DB "^"+32 ;exponent
|
|
23300 DB "D"+32,"O"-32,"M"-32 ;MOD
|
|
23310 DB "R"+32,"O"-32 ;OR
|
|
23320 DB "D"+32,"N"-32,"A"-32 ;AND
|
|
23330 DB "<"+32 ;less than
|
|
23340 DB ">"+32,"<"-32 ;not equal
|
|
23350 DB "="+32,"<"-32 ;less or equal
|
|
23360 DB ">"+32 ;greater than
|
|
23370 DB "="+32,">"-32 ;greater or equal
|
|
23380 DB "#"+32 ;not equal
|
|
23390 DB "="+32 ;equal
|
|
23400 DB "/"+32 ;divide
|
|
23410 DB "*"+32 ;multiply
|
|
23420 DB "-"+32 ;subtract
|
|
23430 DB "+"+32 ;add
|
|
23440 DB 0 ;above 4 are num ops
|
|
23450 DB $47,":"-32,"M"-32,"E"-32,"M"-32,"O"-32,"L"-32 ;LOMEM:
|
|
23460 DB $67,":"-32,"M"-32,"E"-32,"M"-32,"I"-32,"H"-32 ;HIMEM:
|
|
23470 DB "N"+32,"A"-32,"M"-32 ;MAN
|
|
23480 DB $60,","-32 ;comma for AUTO
|
|
23490 DB $20,"O"-32,"T"-32,"U"-32,"A"-32 ;AUTO
|
|
23500 DB "R"+32,"L"-32,"C"-32 ;CLR
|
|
23510 DB "W"+32,"E"-32,"N"-32 ;NEW
|
|
23520 DB $60,","-32 ;comma for DEL
|
|
23530 DB $20,"L"-32,"E"-32,"D"-32 ;DEL
|
|
23540 DB "N"+32,"U"-32,"R"-32 ;RUN
|
|
23550 DB $60,"N"-32,"U"-32,"R"-32 ;RUN
|
|
23560 DB "N"+32,"O"-32,"C"-32 ;CON
|
|
23570 DB "E"+32,"V"-32,"A"-32,"S"-32 ;SAVE
|
|
23580 DB "D"+32,"A"-32,"O"-32,"L"-32 ;LOAD
|
|
23590 *above are commands
|
|
23600 DB $7A,$7E,$9A,$22,$20
|
|
23610 DB $00,$60,$03,$BF,$60,$03,$BF,$1F
|
|
23620
|
|
23630
|
|
23640 PUT PART3
|
|
23650 * tkn $48 ,
|
|
23660 * string prints
|
|
23670 * PRINT T,A$
|
|
23680
|
|
23690 HEE00 ;VO
|
|
23700 JSR HE7B1
|
|
23710
|
|
23720 * tkn $45 ;
|
|
23730 * string prints
|
|
23740 * PRINT anytype ; string
|
|
23750
|
|
23760 * tkn $61 PRINT
|
|
23770 * string var or literal
|
|
23780 * PRINT A$: PRINT "HELLO"
|
|
23790
|
|
23800 PRNTSTR ;V
|
|
23810 INX
|
|
23820 INX
|
|
23830 LDA NOUNSTKL-1,X
|
|
23840 STA AUX
|
|
23850 LDA NOUNSTKH-1,X
|
|
23860 STA AUX+1
|
|
23870 LDY NOUNSTKL-2,X
|
|
23880 HEE0F ;*!LOOP
|
|
23890 TYA
|
|
23900 CMP NOUNSTKH-2,X
|
|
23910 BCS HEE1D ;=HS>exit loop
|
|
23920 LDA (AUX),Y
|
|
23930 JSR COUT
|
|
23940 INY
|
|
23950 JMP HEE0F ;*!loop always
|
|
23960 HEE1D
|
|
23970 LDA #$FF
|
|
23980 STA CRFLAG ;CRFLAG := $FF
|
|
23990 RTS
|
|
24000 **
|
|
24010
|
|
24020 * tkn $3B LEN(
|
|
24030
|
|
24040 LEN ;VO
|
|
24050 INX
|
|
24060 LDA #0
|
|
24070 STA NOUNSTKH,X
|
|
24080 STA NOUNSTKC,X
|
|
24090 LDA NOUNSTKH-1,X
|
|
24100 SEC
|
|
24110 SBC NOUNSTKL-1,X
|
|
24120 STA NOUNSTKL,X
|
|
24130 JMP HE823
|
|
24140 *>
|
|
24150
|
|
24160 DB $FF ;Z
|
|
24170
|
|
24180 GETBYTE
|
|
24190 JSR GET16BIT
|
|
24200 LDA ACC+1
|
|
24210 BNE HI255ERR ;=>">255" error
|
|
24220 LDA ACC
|
|
24230 RTS
|
|
24240 **
|
|
24250
|
|
24260 * tkn $68 ,
|
|
24270 * PLOT 20,15
|
|
24280
|
|
24290 COMMA_PLOT ;VO
|
|
24300 JSR GETBYTE
|
|
24310 LDY TXTNDX
|
|
24320 CMP #48
|
|
24330 BCS RANGERR ;=HS>
|
|
24340 CPY #40
|
|
24350 BCS RANGERR ;=HS>
|
|
24360 JMP PLOT
|
|
24370 *>
|
|
24380
|
|
24390 * tkn $66 COLOR=
|
|
24400
|
|
24410 COLOR ;VO
|
|
24420 JSR GETBYTE
|
|
24430 JMP SETCOL
|
|
24440 *>
|
|
24450
|
|
24460 * tkn $0F MAN
|
|
24470
|
|
24480 MAN
|
|
24490 LSR AUTOFLAG ;manual
|
|
24500 RTS
|
|
24510 **
|
|
24520
|
|
24530 * tkn $6F VTAB
|
|
24540
|
|
24550 IVTAB ;VO
|
|
24560 JSR HF3B3
|
|
24570 CMP #24
|
|
24580 BCS RANGERR ;=HS>
|
|
24590 STA CV
|
|
24600 JMP VTAB
|
|
24610 *>
|
|
24620
|
|
24630 HI255ERR
|
|
24640 LDY #ErrMsg15 ;">255"
|
|
24650 HEE65
|
|
24660 JMP ERRMESS
|
|
24670 *>
|
|
24680
|
|
24690 RANGERR
|
|
24700 LDY #ErrMsg16 ;"RANGE"
|
|
24710 BNE HEE65 ;=>always
|
|
24720
|
|
24730 * divide routine
|
|
24740
|
|
24750 HEE6C
|
|
24760 JSR HE254
|
|
24770 LDA AUX ;is AUX zero?
|
|
24780 *!IF <EQ>
|
|
24790 LDA AUX+1
|
|
24800 *! IF <EQ>
|
|
24810 JMP HE77E ;yes, ">32767" error
|
|
24820 *! ENDIF
|
|
24830 *!ENDIF
|
|
24840 *!LOOP
|
|
24850 ASL ACC
|
|
24860 ROL ACC+1
|
|
24870 ROL P3
|
|
24880 ROL P3+1
|
|
24890 CMPW P3;AUX
|
|
24900 *! IF <HS>
|
|
24910 STA P3+1 ;P3 := P3-AUX
|
|
24920 LDA P3
|
|
24930 SBC AUX
|
|
24940 STA P3
|
|
24950 INC ACC
|
|
24960 *! ENDIF
|
|
24970 DEY
|
|
24980 *!UNTIL <EQ>
|
|
24990 RTS
|
|
25000 **
|
|
25010
|
|
25020 DB $FF,$FF,$FF,$FF,$FF,$FF ;Z
|
|
25030
|
|
25040 * tkn $4D CALL
|
|
25050
|
|
25060 CALL ;VO
|
|
25070 JSR GET16BIT
|
|
25080 JMP (ACC)
|
|
25090 *>
|
|
25100
|
|
25110 * tkn $6A ,
|
|
25120 * HLIN 10,20 AT 30
|
|
25130
|
|
25140 COMMA_HLIN ;VO
|
|
25150 JSR GETBYTE
|
|
25160 CMP TXTNDX
|
|
25170 BCC RANGERR ;=LO>
|
|
25180 STA H2
|
|
25190 RTS
|
|
25200 **
|
|
25210
|
|
25220 * tkn $6B AT
|
|
25230 * HLIN 10,20 AT 30
|
|
25240
|
|
25250 AT_HLIN ;VO
|
|
25260 JSR GETBYTE
|
|
25270 CMP #48
|
|
25280 BCS RANGERR ;=HS>
|
|
25290 LDY TXTNDX
|
|
25300 JMP HLINE
|
|
25310 *>
|
|
25320
|
|
25330 * tkn $6D ,
|
|
25340 * VLIN 10,20 AT 30
|
|
25350
|
|
25360 COMMA_VLIN ;VO
|
|
25370 JSR GETBYTE
|
|
25380 CMP TXTNDX
|
|
25390 BCC RANGERR ;=LO>
|
|
25400 STA V2
|
|
25410 RTS
|
|
25420 **
|
|
25430
|
|
25440 * tkn $6E AT
|
|
25450 * VLIN 10,20 AT 30
|
|
25460
|
|
25470 AT_VLIN ;VO
|
|
25480 JSR GETBYTE
|
|
25490 CMP #40
|
|
25500 HEECB
|
|
25510 BCS RANGERR ;=HS>
|
|
25520 TAY
|
|
25530 LDA TXTNDX
|
|
25540 JMP VLINE
|
|
25550 *>
|
|
25560
|
|
25570 PRINTERR
|
|
25580 TYA
|
|
25590 TAX
|
|
25600 LDY #ErrMsg13 ;"*** "
|
|
25610 JSR ERRORMESS
|
|
25620 TXA
|
|
25630 TAY
|
|
25640 JSR ERRORMESS
|
|
25650 LDY #ErrMsg14 ;" ERR"
|
|
25660 JMP PRTERR
|
|
25670 *>
|
|
25680
|
|
25690 HEEE4
|
|
25700 JSR HF23F
|
|
25710 *!LOOP
|
|
25720 ASL ACC
|
|
25730 ROL ACC+1
|
|
25740 *!UNTIL <PL>
|
|
25750 BCS HEECB ;=>"RANGE" error
|
|
25760 *!IF <EQ>
|
|
25770 CMP ACC
|
|
25780 BCS HEECB ;=HS>"RANGE" error
|
|
25790 *!ENDIF
|
|
25800 RTS
|
|
25810 **
|
|
25820
|
|
25830 * tkn $2E PEEK
|
|
25840 * uses tkn $3F (
|
|
25850
|
|
25860 PEEK ;VO
|
|
25870 JSR GET16BIT
|
|
25880 LDA (ACC),Y
|
|
25890 STY NOUNSTKC-1,X
|
|
25900 JMP HE708
|
|
25910 *>
|
|
25920
|
|
25930 * tkn $65 ,
|
|
25940 * POKE 20000,5
|
|
25950
|
|
25960 * tkn $67 PLOT
|
|
25970
|
|
25980 * tkn $69 HLIN
|
|
25990
|
|
26000 * tkn $6C VLIN
|
|
26010
|
|
26020 GETVAL255 ;VO
|
|
26030 JSR GETBYTE
|
|
26040 LDA ACC
|
|
26050 STA TXTNDX
|
|
26060 RTS
|
|
26070 **
|
|
26080
|
|
26090 * tkn $64 POKE
|
|
26100
|
|
26110 POKE ;VO
|
|
26120 JSR GET16BIT
|
|
26130 LDA TXTNDX
|
|
26140 STA (ACC),Y
|
|
26150 RTS
|
|
26160 **
|
|
26170
|
|
26180 * tkn $15 /
|
|
26190 * num op. uses $38 (
|
|
26200 * A = 27 / 2
|
|
26210
|
|
26220 DIVIDE ;VO
|
|
26230 JSR HEE6C
|
|
26240 MOVW ACC;P3
|
|
26250 JMP HE244
|
|
26260 *>
|
|
26270
|
|
26280 * tkn $44 ,
|
|
26290 * next var in DIM is num
|
|
26300 * DIM X(5),A(5)
|
|
26310
|
|
26320 * tkn $4F DIM
|
|
26330 * num var. uses tkn $22 (
|
|
26340 * DIM A(5)
|
|
26350
|
|
26360 DIMNUM ;VO
|
|
26370 JSR HEEE4
|
|
26380 JMP HE134
|
|
26390 *>
|
|
26400
|
|
26410 * tkn $2D (
|
|
26420 * var array
|
|
26430 * X(12)
|
|
26440
|
|
26450 HEF24 ;VO
|
|
26460 JSR HEEE4
|
|
26470 LDY NOUNSTKH,X
|
|
26480 LDA NOUNSTKL,X
|
|
26490 ADC #$FE
|
|
26500 *!IF <CC>
|
|
26510 DEY
|
|
26520 *!ENDIF
|
|
26530 STA AUX
|
|
26540 STY AUX+1
|
|
26550 CLC
|
|
26560 ADC ACC
|
|
26570 STA NOUNSTKL,X
|
|
26580 TYA
|
|
26590 ADC ACC+1
|
|
26600 STA NOUNSTKH,X
|
|
26610 LDY #0
|
|
26620 LDA NOUNSTKL,X
|
|
26630 CMP (AUX),Y
|
|
26640 INY
|
|
26650 LDA NOUNSTKH,X
|
|
26660 SBC (AUX),Y
|
|
26670 BCS HEECB ;=HS>"RANGE" error
|
|
26680 JMP HE823
|
|
26690 *>
|
|
26700
|
|
26710 * tkn $2F RND
|
|
26720 * uses tkn $3F (
|
|
26730
|
|
26740 RND ;VO
|
|
26750 JSR GET16BIT
|
|
26760 LDA RNDL
|
|
26770 JSR HE708
|
|
26780 LDA RNDH
|
|
26790 *!IF <EQ>
|
|
26800 CMP RNDL
|
|
26810 ADC #0
|
|
26820 *!ENDIF
|
|
26830 AND #$7F
|
|
26840 STA RNDH
|
|
26850 STA NOUNSTKC,X
|
|
26860 LDY #$11
|
|
26870 *!LOOP
|
|
26880 LDA RNDH
|
|
26890 ASL
|
|
26900 CLC
|
|
26910 ADC #$40
|
|
26920 ASL
|
|
26930 ROL RNDL
|
|
26940 ROL RNDH
|
|
26950 DEY
|
|
26960 *!UNTIL <EQ>
|
|
26970 LDA ACC
|
|
26980 JSR HE708
|
|
26990 LDA ACC+1
|
|
27000 STA NOUNSTKC,X
|
|
27010 JMP MOD
|
|
27020 *>
|
|
27030
|
|
27040 JSR GET16BIT ;Z
|
|
27050 LDY ACC ;is ACC <LO> LOMEM?
|
|
27060 CPY LOMEM
|
|
27070 LDA ACC+1
|
|
27080 SBC LOMEM+1
|
|
27090 BCC HEFAB ;=LO>yes
|
|
27100 STY HIMEM ;HIMEM := ACC
|
|
27110 LDA ACC+1
|
|
27120 STA HIMEM+1
|
|
27130 HEF93 ;Z
|
|
27140 JMP NEW
|
|
27150 *>
|
|
27160
|
|
27170 JSR GET16BIT ;Z
|
|
27180 LDY ACC ;is ACC <HS> LOMEM?
|
|
27190 CPY HIMEM
|
|
27200 LDA ACC+1
|
|
27210 SBC HIMEM+1
|
|
27220 BCS HEFAB ;=HS>yes
|
|
27230 STY LOMEM ;LOMEM := ACC
|
|
27240 LDA ACC+1
|
|
27250 STA LOMEM+1
|
|
27260 BCC HEF93 ;=LO>always
|
|
27270
|
|
27280 HEFAB ;Z
|
|
27290 JMP HEECB ;range error?
|
|
27300 *>
|
|
27310
|
|
27320 DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;Z
|
|
27330
|
|
27340 * tkn $26 ,
|
|
27350 * string inputs
|
|
27360 * INPUT "WHO",W$
|
|
27370
|
|
27380 * tkn $52 INPUT
|
|
27390 * string with no prompt
|
|
27400 * INPUT S$
|
|
27410
|
|
27420 HEFB6 ;VO
|
|
27430 JSR INPUTSTR
|
|
27440 JMP HEFBF
|
|
27450 *>
|
|
27460
|
|
27470 * tkn $53 INPUT
|
|
27480 * string or num with prompt
|
|
27490 * INPUT "WHO",W$: INPUT "QUANTITY",Q
|
|
27500
|
|
27510 INPUT_PROMPT ;VO
|
|
27520 JSR PRNTSTR
|
|
27530 HEFBF
|
|
27540 LDA #$FF
|
|
27550 STA TXTNDX
|
|
27560 LDA #$80
|
|
27570 STA IN
|
|
27580 RTS
|
|
27590 **
|
|
27600
|
|
27610 HEFC9
|
|
27620 JSR NOT
|
|
27630 INX
|
|
27640 HEFCD ;solo
|
|
27650 JSR NOT
|
|
27660 LDA NOUNSTKL,X
|
|
27670 RTS
|
|
27680 **
|
|
27690
|
|
27700 * old 4K cold start
|
|
27710
|
|
27720 HEFD3 ;Z
|
|
27730 LDA #0
|
|
27740 STA LOMEM ;LOMEM := $0800
|
|
27750 STA HIMEM ;HIMEM := $1000
|
|
27760 LDA #>$0800
|
|
27770 STA LOMEM+1
|
|
27780 LDA #>$1000
|
|
27790 STA HIMEM+1
|
|
27800 JMP NEW
|
|
27810 *>
|
|
27820
|
|
27830 HEFE4 ;solo
|
|
27840 CMP NOUNSTKH,X
|
|
27850 *!IF <EQ>
|
|
27860 CLC
|
|
27870 *!ENDIF
|
|
27880 JMP HE102
|
|
27890 *>
|
|
27900
|
|
27910 * tkn $08 RUN
|
|
27920 * run from first line of program
|
|
27930
|
|
27940 RUN ;VO
|
|
27950 JSR CLR
|
|
27960 JMP RUNWARM
|
|
27970 *>
|
|
27980
|
|
27990 * tkn $07 RUN
|
|
28000 * RUN 100
|
|
28010
|
|
28020 RUNNUM ;VO
|
|
28030 JSR CLR
|
|
28040 JMP GOTO
|
|
28050 *>
|
|
28060
|
|
28070 HEFF8 ;solo
|
|
28080 CPX #$80
|
|
28090 *!IF <EQ>
|
|
28100 DEY
|
|
28110 *!ENDIF
|
|
28120 JMP HE00C
|
|
28130 *>
|
|
28140
|
|
28142 * Cold start
|
|
28150 * set LOMEM, find HIMEM
|
|
28152 * fall into NEW
|
|
28160
|
|
28170 COLD
|
|
28180 LDY #<$0800
|
|
28190 STY NOUNSTKC
|
|
28200 STY LOMEM ;LOMEM := $0800
|
|
28210 STY HIMEM ;HIMEM := $0800
|
|
28220 LDA #>$0800
|
|
28230 STA LOMEM+1
|
|
28240 STA HIMEM+1
|
|
28250 *!LOOP
|
|
28260 INC HIMEM+1 ;find top of RAM
|
|
28270 LDA (HIMEM),Y
|
|
28280 EOR #$FF
|
|
28290 STA (HIMEM),Y
|
|
28300 CMP (HIMEM),Y
|
|
28310 *!WHILE <EQ>
|
|
28320 EOR #$FF
|
|
28330 STA (HIMEM),Y
|
|
28340 CMP (HIMEM),Y
|
|
28350 *!UNTIL <NE>
|
|
28360 JMP NEW
|
|
28370 *>
|
|
28380
|
|
28390 HF025 ;solo
|
|
28400 JMP HF179
|
|
28410 *>
|
|
28420
|
|
28430 JSR HF032 ;Z
|
|
28440 JMP HE8BE ;Z
|
|
28450 *>
|
|
28460
|
|
28470 HF02E ;solo
|
|
28480 LDX PX
|
|
28490 LDA PX+1
|
|
28500 HF032 ;Z
|
|
28510 LDY KBD ;get keypress
|
|
28520 CPY #ETX+$80 ;is it ctrl-C?
|
|
28530 BNE HF025 ;=>no
|
|
28540 BIT KBDSTRB ;yes, clear keypress
|
|
28550 STX NOUNSTKL
|
|
28560 STA NOUNSTKL+1
|
|
28570 MOVW PR;NOUNSTKH
|
|
28580 JMP STOPPED_AT
|
|
28590 *>
|
|
28600
|
|
28610 DB $FF,$FF ;Z
|
|
28620
|
|
28630 * tkn $10 HIMEM:
|
|
28640
|
|
28650 VHIMEM ;VO
|
|
28660 JSR GET16BIT
|
|
28670 STX XSAVE
|
|
28680 LDX #0-2
|
|
28690 SEC
|
|
28700
|
|
28710 * MOVW ACC;P2
|
|
28720 * SUBW HIMEM;ACC;AUX
|
|
28730
|
|
28740 *!LOOP
|
|
28750 LDA ACC+2,X
|
|
28760 STA P2+2,X
|
|
28770 LDA HIMEM+2,X
|
|
28780 SBC ACC+2,X
|
|
28790 STA AUX+2,X
|
|
28800 INX
|
|
28810 *!UNTIL <EQ>
|
|
28820 BCC HF0AF ;=>
|
|
28830 DEX ;Xreg := $FF
|
|
28840
|
|
28850 * MOVW PP;P3
|
|
28860 * SUBW PP;AUX;P2
|
|
28870
|
|
28880 *!LOOP
|
|
28890 LDA PP+1,X
|
|
28900 STA P3+1,X
|
|
28910 SBC AUX+1,X
|
|
28920 STA P2+1,X
|
|
28930 INX
|
|
28940 *!UNTIL <NE>
|
|
28950 *!IF <HS>
|
|
28960 CMPW PV;P2
|
|
28970 BCC HF08F ;=>PV <LO> P2
|
|
28980 *!ENDIF
|
|
28990 HF07C
|
|
29000 JMP MEMFULL
|
|
29010 *>
|
|
29020
|
|
29030 *!LOOP
|
|
29040 LDA (P3),Y
|
|
29050 STA (P2),Y
|
|
29060 INCW P2
|
|
29070 INCW P3
|
|
29080 HF08F ;solo
|
|
29090 CMPW P3;HIMEM
|
|
29100 *!UNTIL <HS>
|
|
29110 HF099 ;solo
|
|
29120 LDX #0-2
|
|
29130
|
|
29140 * MOVW P2;HIMEM
|
|
29150 * SUBW PP;AUX;PP
|
|
29160
|
|
29170 *!LOOP
|
|
29180 LDA P2+2,X
|
|
29190 STA HIMEM+2,X
|
|
29200 LDA PP+2,X
|
|
29210 SBC AUX+2,X
|
|
29220 STA PP+2,X
|
|
29230 INX
|
|
29240 *!UNTIL <EQ>
|
|
29250 LDX XSAVE
|
|
29260 RTS
|
|
29270 **
|
|
29280
|
|
29290 *!LOOP
|
|
29300 LDA (HIMEM),Y
|
|
29310 STA (ACC),Y
|
|
29320 HF0AF ;solo
|
|
29330 DECW ACC
|
|
29340 DECW HIMEM
|
|
29350 CMP PP ;is PP <LO> HIMEM?
|
|
29360 LDA HIMEM+1
|
|
29370 SBC PP+1
|
|
29380 *!UNTIL <HS>
|
|
29390 BCS HF099 ;=HS> always
|
|
29400
|
|
29410 * tkn $11 LOMEM:
|
|
29420
|
|
29430 VLOMEM ;VO
|
|
29440 JSR GET16BIT
|
|
29450 LDY ACC ;is ACC <HS> PP?
|
|
29460 CPY #PP
|
|
29470 * BUG FIX: ABOVE LINE SHOULD BE
|
|
29480 * CPY PP
|
|
29490 * REF: NONE. FOUND BY INSPECTION.
|
|
29500 LDA ACC+1
|
|
29510 SBC PP+1
|
|
29520 HF0D4
|
|
29530 BCS HF07C ;=HS> yes, MEM FULL error
|
|
29540 STY LOMEM ;LOMEM := ACC
|
|
29550 LDA ACC+1
|
|
29560 STA LOMEM+1
|
|
29570 JMP CLR
|
|
29580 *>
|
|
29590
|
|
29600 * tkn $04 LOAD
|
|
29610
|
|
29620 LOAD ;VO
|
|
29630 STX XSAVE
|
|
29640 JSR SETHDR
|
|
29650 JSR READ
|
|
29660 LDX #$FF
|
|
29670 SEC
|
|
29680 *!LOOP
|
|
29690 LDA HIMEM+1,X ;AUX := HIMEM-ACC
|
|
29700 SBC ACC+1,X
|
|
29710 STA AUX+1,X
|
|
29720 INX
|
|
29730 *!UNTIL <NE>
|
|
29740 BCC HF07C ;=LO>MEM FULL error
|
|
29750 CMPW PV;AUX
|
|
29760 BCS HF0D4 ;=>PV <HS> AUX, MEM FULL error
|
|
29770 LDA ACC ;is ACC zero?
|
|
29780 *!IF <EQ>
|
|
29790 LDA ACC+1
|
|
29800 BEQ HF118 ;=>yes
|
|
29810 *!ENDIF
|
|
29820 MOVW AUX;PP
|
|
29830 JSR SETPRG
|
|
29840 JSR READ
|
|
29850 HF115 ;solo
|
|
29860 LDX XSAVE
|
|
29870 RTS
|
|
29880 **
|
|
29890
|
|
29900 HF118 ;solo
|
|
29910 JSR BELL
|
|
29920 JMP HF115
|
|
29930 *>
|
|
29940
|
|
29950 SETHDR
|
|
29960 LDY #$CE
|
|
29970 STY A1 ;A1 := $00CE
|
|
29980 INY
|
|
29990 STY A2 ;A2 := $00CD
|
|
30000 LDY #0
|
|
30010 STY A1+1
|
|
30020 STY A2+1
|
|
30030 RTS
|
|
30040 **
|
|
30050
|
|
30060 SETPRG
|
|
30070 *!LOOP
|
|
30080 LDA PP,X
|
|
30090 STA A1,X
|
|
30100 LDY HIMEM,X
|
|
30110 STY A2,X
|
|
30120 DEX
|
|
30130 *!UNTIL <MI>
|
|
30140 DECW A2
|
|
30150 RTS
|
|
30160 **
|
|
30170
|
|
30180 STX XSAVE ;Z
|
|
30190
|
|
30200 * tkn $05 SAVE
|
|
30210
|
|
30220 SAVE ;VO
|
|
30230 SEC ;ACC := HIMEM-PP
|
|
30240 LDX #0-1
|
|
30250 *!LOOP
|
|
30260 LDA HIMEM+1,X
|
|
30270 SBC PP+1,X
|
|
30280 STA ACC+1,X
|
|
30290 INX
|
|
30300 *!UNTIL <NE>
|
|
30310 JSR SETHDR
|
|
30320 JSR WRITE
|
|
30330 LDX #$01
|
|
30340 JSR SETPRG
|
|
30350 LDA #$1A
|
|
30360 JSR WRITE0
|
|
30370 LDX XSAVE
|
|
30380 RTS
|
|
30390 **
|
|
30400
|
|
30410 PRTERR
|
|
30420 JSR ERRORMESS
|
|
30430 JMP BELL
|
|
30440 *>
|
|
30450
|
|
30460 * tkn $77 POP
|
|
30470
|
|
30480 POP ;VO
|
|
30490 LDA GOSUBNDX
|
|
30500 *!IF <EQ>
|
|
30510 JMP RETURN ;force error
|
|
30520 *!ENDIF
|
|
30530 DEC GOSUBNDX
|
|
30540 RTS
|
|
30550 **
|
|
30560
|
|
30570 * tkn $7D TRACE
|
|
30580
|
|
30590 TRACE ;VO
|
|
30600 LDA #$FF
|
|
30610 STA NOUNSTKC
|
|
30620 RTS
|
|
30630 **
|
|
30640
|
|
30650 * tkn $7A NOTRACE
|
|
30660
|
|
30670 NOTRACE ;VO
|
|
30680 LSR NOUNSTKC ;clear bit 7
|
|
30690 RTS
|
|
30700 **
|
|
30710
|
|
30720 HF179 ;solo
|
|
30730 BIT NOUNSTKC ;trace mode?
|
|
30740 *!IF <MI>
|
|
30750 HF17D
|
|
30760 *yes, print line number
|
|
30770 LDA #"#"
|
|
30780 JSR COUT
|
|
30790 LDY #1
|
|
30800 LDA (PR),Y
|
|
30810 TAX
|
|
30820 INY
|
|
30830 LDA (PR),Y
|
|
30840 JSR PRDEC
|
|
30850 LDA #BLANK+$80
|
|
30860 JMP COUT
|
|
30870 *>
|
|
30880 LDA PR ;Z
|
|
30890 LDY PR+1 ;Z
|
|
30900 *!ENDIF
|
|
30910 RTS
|
|
30920 **
|
|
30930
|
|
30940
|
|
30950
|
|
30960 SYNTABLNDX ;indices into SYNTABL
|
|
30970 DB $C1,$00,$7F,$D1,$CC,$C7,$CF,$CE
|
|
30980 DB $C5,$9A,$98,$8D,$96,$95,$93,$BF
|
|
30990 DB $B2,$32,$12,$0F,$BC,$B0,$AC,$BE
|
|
31000 DB $35,$0C,$61,$30,$10,$0B,$DD,$FB
|
|
31010
|
|
31020
|
|
31030
|
|
31040 HF1B7 ;solo
|
|
31050 LDY #0
|
|
31060 JSR HE7C7
|
|
31070 LDA #BLANK+$80
|
|
31080 JMP COUT
|
|
31090 *>
|
|
31100
|
|
31110 DB $00,$00,$00,$00,$00,$00,$00,$00 ;Z
|
|
31120
|
|
31130 HF1C9
|
|
31140 LDY LOMEM
|
|
31150 LDA LOMEM+1
|
|
31160 *!LOOP
|
|
31170 PHA
|
|
31180 CPY AUX ;is LOMEM <HS> AUX?
|
|
31190 SBC AUX+1
|
|
31200 BCS HF1F0 ;=HS> yes, exit repeat
|
|
31210 PLA
|
|
31220 STY SRCH ;SRCH := LOMEM
|
|
31230 STA SRCH+1
|
|
31240 LDY #$FF
|
|
31250 *! LOOP
|
|
31260 *! LOOP
|
|
31270 INY
|
|
31280 LDA (SRCH),Y
|
|
31290 *! UNTIL <PL>
|
|
31300 CMP #$40
|
|
31310 *! UNTIL <NE>
|
|
31320 INY
|
|
31330 INY
|
|
31340 LDA (SRCH),Y
|
|
31350 PHA
|
|
31360 DEY
|
|
31370 LDA (SRCH),Y
|
|
31380 TAY
|
|
31390 PLA
|
|
31400 *!UNTIL <EQ>
|
|
31410 HF1F0
|
|
31420 PLA
|
|
31430 LDY #0
|
|
31440 *!LOOP
|
|
31450 LDA (SRCH),Y
|
|
31460 BMI HF1FC ;=>
|
|
31470 LSR
|
|
31480 BEQ HF202 ;=>
|
|
31490 LDA #"$"
|
|
31500 HF1FC
|
|
31510 JSR COUT
|
|
31520 INY
|
|
31530 *!UNTIL <EQ>
|
|
31540 HF202
|
|
31550 LDA #"="
|
|
31560 JMP COUT
|
|
31570 *>
|
|
31580
|
|
31590 HF207 ;solo
|
|
31600 STA (AUX),Y
|
|
31610 INX
|
|
31620 LDA NOUNSTKC-1,X
|
|
31630 BEQ HF23E ;=>RTS
|
|
31640 JMP HF3D5
|
|
31650 *>
|
|
31660
|
|
31670 DB $A0 ;Z
|
|
31680
|
|
31690 HF212 ;solo
|
|
31700 *!IF <PL>
|
|
31710 LDA PR
|
|
31720 LDY PR+1
|
|
31730 JSR HF17D
|
|
31740 *!ENDIF
|
|
31750 JSR HF1C9
|
|
31760 LDX XSAVE
|
|
31770 JMP HF1B7
|
|
31780 *>
|
|
31790
|
|
31800 HF223 ;solo
|
|
31810 INX
|
|
31820 INX
|
|
31830 LDA NOUNSTKC-1,X
|
|
31840 BEQ HF248 ;=>RTS
|
|
31850 JMP HF3E0
|
|
31860 *>
|
|
31870
|
|
31880 HF22C ;solo
|
|
31890 *!IF <PL>
|
|
31900 LDA PR
|
|
31910 LDY PR+1
|
|
31920 JSR HF17D
|
|
31930 *!ENDIF
|
|
31940 JSR HF1C9
|
|
31950 LDX XSAVE
|
|
31960 JMP HF409
|
|
31970 *>
|
|
31980
|
|
31990 INX ;Z
|
|
32000 HF23E
|
|
32010 RTS
|
|
32020 **
|
|
32030
|
|
32040 HF23F ;solo
|
|
32050 JSR GET16BIT
|
|
32060 INCW ACC
|
|
32070 HF248
|
|
32080 RTS
|
|
32090 **
|
|
32100
|
|
32110 * tkn $1C <
|
|
32120 * IF X < 13 THEN END
|
|
32130
|
|
32140 HF249 ;V
|
|
32150 JSR HF25B
|
|
32160 BNE HF263 ;=>NOT
|
|
32170
|
|
32180 * tkn $19 >
|
|
32190 * IF X > 13 THEN END
|
|
32200
|
|
32210 HF24E ;VO
|
|
32220 JSR HF253
|
|
32230 BNE HF263 ;=>NOT
|
|
32240
|
|
32250 * tkn $1A <=
|
|
32260 * IF X <= 13 THEN END
|
|
32270
|
|
32280 HF253 ;V
|
|
32290 JSR SUBTRACT
|
|
32300 JSR NEGATE
|
|
32310 BVC HF25E ;=>
|
|
32320
|
|
32330 * tkn $18 >=
|
|
32340 * IF X >= 13 THEN END
|
|
32350
|
|
32360 HF25B ;V
|
|
32370 JSR SUBTRACT
|
|
32380 HF25E
|
|
32390 JSR SGN
|
|
32400 LSR NOUNSTKL,X
|
|
32410 HF263
|
|
32420 JMP NOT
|
|
32430 *>
|
|
32440
|
|
32450 * tkn $1D AND
|
|
32460
|
|
32470 VAND ;VO
|
|
32480 JSR HEFC9
|
|
32490 ORA NOUNSTKL-1,X
|
|
32500 BPL HF272 ;=>always?
|
|
32510
|
|
32520 * tkn $1E OR
|
|
32530
|
|
32540 VOR ;VO
|
|
32550 JSR HEFC9
|
|
32560 AND NOUNSTKL-1,X
|
|
32570 HF272 ;solo
|
|
32580 STA NOUNSTKL,X
|
|
32590 BPL HF263 ;=>NOT
|
|
32600 JMP HEFC9
|
|
32610 *>
|
|
32620
|
|
32630 * tkn $58 STEP
|
|
32640
|
|
32650 STEP ;VO
|
|
32660 JSR GET16BIT
|
|
32670 LDY FORNDX
|
|
32680 LDA ACC
|
|
32690 STA STK_60-1,Y
|
|
32700 LDA ACC+1
|
|
32710 JMP HE966
|
|
32720 *>
|
|
32730
|
|
32740 HF288 ;solo
|
|
32750 STA STK_50,Y
|
|
32760 *!LOOP
|
|
32770 *! LOOP
|
|
32780 DEY
|
|
32790 BMI HF2DF ;=>RTS
|
|
32800 LDA STK_40,Y
|
|
32810 CMP NOUNSTKL,X
|
|
32820 *! UNTIL <EQ>
|
|
32830 LDA STK_50,Y
|
|
32840 CMP NOUNSTKH,X
|
|
32850 *!UNTIL <EQ>
|
|
32860 DEC FORNDX
|
|
32870 *!LOOP
|
|
32880 LDA STK_40+1,Y
|
|
32890 STA STK_40,Y
|
|
32900 LDA STK_50+1,Y
|
|
32910 STA STK_50,Y
|
|
32920 LDA STK_C0+1,Y
|
|
32930 STA STK_C0,Y
|
|
32940 LDA STK_D0+1,Y
|
|
32950 STA STK_D0,Y
|
|
32960 LDA STK_60+1,Y
|
|
32970 STA STK_60,Y
|
|
32980 LDA STK_70+1,Y
|
|
32990 STA STK_70,Y
|
|
33000 LDA STK_80+1,Y
|
|
33010 STA STK_80,Y
|
|
33020 LDA STK_90+1,Y
|
|
33030 STA STK_90,Y
|
|
33040 LDA STK_A0+1,Y
|
|
33050 STA STK_A0,Y
|
|
33060 LDA STK_A0+1,Y
|
|
33070 STA STK_A0,Y
|
|
33080 * BUG FIX: ABOVE TWO LINES SHOULD BE
|
|
33090 * LDA STK_B0+1,Y
|
|
33100 * STA STK_B0,Y
|
|
33110 * REF: CHANGED IN DISK VERSION
|
|
33120 INY
|
|
33130 CPY FORNDX
|
|
33140 *!UNTIL <HS>
|
|
33150 HF2DF
|
|
33160 RTS
|
|
33170 **
|
|
33180
|
|
33190 * tkn $78 NODSP
|
|
33200 * string var
|
|
33210
|
|
33220 NODSP_STR ;VO
|
|
33230 INX
|
|
33240
|
|
33250 * tkn $79 NODSP
|
|
33260 * num var
|
|
33270
|
|
33280 NODSP_NUM ;VO
|
|
33290 LDA #0
|
|
33300 HF2E3
|
|
33310 PHA
|
|
33320 LDA NOUNSTKL,X
|
|
33330 SEC
|
|
33340 SBC #$03
|
|
33350 STA ACC
|
|
33360 LDA NOUNSTKH,X
|
|
33370 SBC #0
|
|
33380 STA ACC+1
|
|
33390 PLA
|
|
33400 LDY #0
|
|
33410 STA (ACC),Y
|
|
33420 INX
|
|
33430 RTS
|
|
33440 **
|
|
33450
|
|
33460 HF2F8 ;solo
|
|
33470 CMP #$85
|
|
33480 *!IF <LO>
|
|
33490 JMP HE4C0
|
|
33500 *!ENDIF
|
|
33510 LDY #$02
|
|
33520 JMP HE448
|
|
33530 *>
|
|
33540
|
|
33550 * tkn $7B DSP
|
|
33560 * string var
|
|
33570
|
|
33580 DSP_NUM ;VO
|
|
33590 INX
|
|
33600
|
|
33610 * tkn $7C DSP
|
|
33620 * num var
|
|
33630
|
|
33640 DSP_STR ;VO
|
|
33650 LDA #$01
|
|
33660 BNE HF2E3 ;=>always
|
|
33670
|
|
33680 INX ;Z
|
|
33690
|
|
33700 * tkn $06 CON
|
|
33710
|
|
33720 CON ;VO
|
|
33730 MOVW NOUNSTKH;PR
|
|
33740 LDA NOUNSTKL
|
|
33750 LDY NOUNSTKL+1
|
|
33760 JMP GETNEXT
|
|
33770 *>
|
|
33780
|
|
33790 LDA #$01 ;Z
|
|
33800 BNE HF2E3 ;=>always
|
|
33810
|
|
33820 * tkn $3C ASC(
|
|
33830
|
|
33840 ASC ;VO
|
|
33850 LDA NOUNSTKL,X
|
|
33860 CMP NOUNSTKH,X
|
|
33870 *!IF <HS>
|
|
33880 JMP RANGERR
|
|
33890 *!ENDIF
|
|
33900 TAY
|
|
33910 LDA NOUNSTKL+1,X
|
|
33920 STA ACC
|
|
33930 LDA NOUNSTKH+1,X
|
|
33940 STA ACC+1
|
|
33950 LDA (ACC),Y
|
|
33960 LDY #0
|
|
33970 INX
|
|
33980 INX
|
|
33990 JSR HE708
|
|
34000 JMP HF404
|
|
34010 *>
|
|
34020
|
|
34030 * tkn $32 PDL
|
|
34040
|
|
34050 PDL ;VO
|
|
34060 JSR GETBYTE
|
|
34070 STX XSAVE
|
|
34080 AND #$03
|
|
34090 TAX
|
|
34100 JSR PREAD
|
|
34110 LDX XSAVE
|
|
34120 TYA
|
|
34130 LDY #0
|
|
34140 JSR HE708
|
|
34150 STY NOUNSTKC,X
|
|
34160 RTS
|
|
34170 **
|
|
34180
|
|
34190 RDKEY ;solo
|
|
34200 JSR NXTCHAR
|
|
34210 HF354 ;solo
|
|
34220 TXA
|
|
34230 PHA
|
|
34240 *!LOOP
|
|
34250 LDA IN,X
|
|
34260 CMP #ETX+$80 ;is it ctrl-C?
|
|
34270 *! IF <EQ>
|
|
34280 JMP BASIC2
|
|
34290 *! ENDIF
|
|
34300 DEX
|
|
34310 *!UNTIL <MI>
|
|
34320 PLA
|
|
34330 TAX
|
|
34340 RTS
|
|
34350 **
|
|
34360
|
|
34370 HF366 ;solo
|
|
34380 JSR HE280
|
|
34390 TYA
|
|
34400 TAX
|
|
34410 JSR HF354
|
|
34420 TXA
|
|
34430 TAY
|
|
34440 RTS
|
|
34450 **
|
|
34460
|
|
34470 * tkn $20 ^
|
|
34480
|
|
34490 EXP ;VO
|
|
34500 JSR GET16BIT
|
|
34510 LDA ACC+1
|
|
34520 *!IF <MI>
|
|
34530 TYA ;Areg := 0
|
|
34540 DEX
|
|
34550 JSR HE708
|
|
34560 STY NOUNSTKC,X
|
|
34570 HF37F
|
|
34580 RTS
|
|
34590 *!ENDIF
|
|
34600 STA SRCH+1 ;SRCH := ACC
|
|
34610 LDA ACC
|
|
34620 STA SRCH
|
|
34630 JSR GET16BIT
|
|
34640 MOVW ACC;SRCH2
|
|
34650 LDA #$01
|
|
34660 JSR HE708
|
|
34670 STY NOUNSTKC,X
|
|
34680 HF398 ;*!LOOP
|
|
34690 LDA SRCH ;SRCH := SRCH-1
|
|
34700 *!IF <EQ>
|
|
34710 DEC SRCH+1 ;is SRCH negative?
|
|
34720 BMI HF37F ;=>yes, RTS
|
|
34730 *!ENDIF
|
|
34740 DEC SRCH
|
|
34750 LDA SRCH2
|
|
34760 LDY #0
|
|
34770 JSR HE708
|
|
34780 LDA SRCH2+1
|
|
34790 STA NOUNSTKC,X
|
|
34800 JSR MULT
|
|
34810 JMP HF398 ;*!loop forever
|
|
34820 *>
|
|
34830
|
|
34840 HF3B3 ;solo
|
|
34850 JSR GETBYTE
|
|
34860 CLC ;Areg := Areg-1
|
|
34870 ADC #$FF
|
|
34880 HF3B9
|
|
34890 RTS
|
|
34900 **
|
|
34910
|
|
34920 * tkn $4A ,
|
|
34930 * end of PRINT statement
|
|
34940 * PRINT A$,
|
|
34950
|
|
34960 HF3BA ;VO
|
|
34970 JSR HE7B1
|
|
34980 LSR CRFLAG ;pos
|
|
34990 RTS
|
|
35000 **
|
|
35010
|
|
35020 STX RUNFLAG ;Z
|
|
35030 TXS
|
|
35040 JSR HF02E
|
|
35050 JMP HE883
|
|
35060 *>
|
|
35070
|
|
35080 * tkn $7E PR#
|
|
35090
|
|
35100 PRSLOT ;VO
|
|
35110 JSR GETBYTE
|
|
35120 STX XSAVE
|
|
35130 JSR OUTPORT
|
|
35140 LDX XSAVE
|
|
35150 RTS
|
|
35160 **
|
|
35170
|
|
35180 DB $FE ;Z
|
|
35190
|
|
35200 HF3D5 ;solo
|
|
35210 BIT RUNFLAG
|
|
35220 BPL HF3B9 ;=>RTS
|
|
35230 STX XSAVE
|
|
35240 BIT NOUNSTKC
|
|
35250 JMP HF212
|
|
35260 *>
|
|
35270
|
|
35280 HF3E0 ;solo
|
|
35290 BIT RUNFLAG
|
|
35300 BPL HF3B9 ;=>RTS
|
|
35310 STX XSAVE
|
|
35320 BIT NOUNSTKC
|
|
35330 JMP HF22C
|
|
35340 *>
|
|
35350
|
|
35360 HF3EB ;solo
|
|
35370 LDY #0
|
|
35380 JMP GETVERB
|
|
35390 *>
|
|
35400
|
|
35410 *!LOOP
|
|
35420 TAY
|
|
35430 JSR CROUT
|
|
35440 HF3F4 ;solo
|
|
35450 TYA
|
|
35460 SEC
|
|
35470 SBC WNDWDTH
|
|
35480 *!UNTIL <LO>
|
|
35490 STY CH
|
|
35500 RTS
|
|
35510 **
|
|
35520
|
|
35530 DB $00,$00,$00 ;Z
|
|
35540 DB $FF,$FF,$FF,$FF ;Z
|
|
35550
|
|
35560 HF404 ;solo
|
|
35570 STY NOUNSTKC,X
|
|
35580 JMP HE823
|
|
35590 *>
|
|
35600
|
|
35610 HF409 ;solo
|
|
35620 LDY #0
|
|
35630 BEQ HF411 ;=>always
|
|
35640 *!LOOP
|
|
35650 JSR COUT
|
|
35660 INY
|
|
35670 HF411
|
|
35680 LDA (AUX),Y
|
|
35690 *!UNTIL <PL>
|
|
35700 LDA #$FF
|
|
35710 STA CRFLAG ;CRFLAG := $FF
|
|
35720 RTS
|
|
35730 **
|
|
35740
|
|
35750 * tkn $7F IN#
|
|
35760
|
|
35770 INSLOT ;VO
|
|
35780 JSR GETBYTE
|
|
35790 STX XSAVE
|
|
35800 JSR INPORT
|
|
35810 LDX XSAVE
|
|
35820 RTS
|
|
35830 **
|
|
35840 LST OFF
|