mirror of
https://github.com/forth-ev/VolksForth.git
synced 2024-06-22 06:29:32 +00:00
Atari 8bit: cleanup
This commit is contained in:
parent
c30e4f24e8
commit
c632249474
146
6502/Atari8bit/3.81.4/readme.org
Normal file
146
6502/Atari8bit/3.81.4/readme.org
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
#+Title: VolksForth Atari 8-bit Readme Version 1.1
|
||||||
|
#+Date: 13. August 2006
|
||||||
|
#+Author: Carsten Strotmann
|
||||||
|
|
||||||
|
VolksForth is a 16bit Forth System produced by the german Forth
|
||||||
|
Gesellschaft e.V. Main development of this system was done between
|
||||||
|
1985 until 1989. The VolksForth Project was revived in 2005 with the
|
||||||
|
goal to produce a managable Forthsystem for computer systems with
|
||||||
|
restricted system resources.
|
||||||
|
|
||||||
|
Some modern Forth Systems were influenced by or were derived from
|
||||||
|
VolksForth (GNU-Forth, bigForth).
|
||||||
|
|
||||||
|
The current Version of VolskForth is 3.81. Work on Version 3.90 has
|
||||||
|
been started.
|
||||||
|
|
||||||
|
At this time VolksForth is available for this Systems:
|
||||||
|
|
||||||
|
* VolksForth MS-DOS (Intel x86 Architecture i8086-ia64)
|
||||||
|
* VolksForth 6502 (Commodore 64, Commodore Plus 4, Atari 8bit, Apple I, Apple II)
|
||||||
|
* VolksForth Z80 (CP/M, Schneider CPC CP/M)
|
||||||
|
* VolksForth 68000 (Atari ST)
|
||||||
|
|
||||||
|
VolksForth is in work for this Systems:
|
||||||
|
|
||||||
|
* VolksForth MS-DOS (Atari Portfolio)
|
||||||
|
* VolksForth Z80 (Schneider CPC AMSDOS)
|
||||||
|
* VolksForth 68000 (Mac Classic, Amiga)
|
||||||
|
|
||||||
|
Copyright
|
||||||
|
|
||||||
|
The VolksForth Sources are made avail- able under the terms of the BSD
|
||||||
|
License http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
|
||||||
|
The Handbook is Copyright (c) 1985 - 2020 Forth Gesellschaft e.V. (
|
||||||
|
Klaus Schleisiek, Ulrich Hoffmann, Bernd Pennemann, Georg Rehfeld and
|
||||||
|
Dietrich Weineck).
|
||||||
|
|
||||||
|
The Handbook, binary Files and Source- code for VolksForth as well as
|
||||||
|
Informa- tion about Forth Gesellschaft are available on the Forth
|
||||||
|
Gesellschaft Webserver at http://www.forth-ev.de/
|
||||||
|
|
||||||
|
(most of the Information is still in german. We are planning to
|
||||||
|
provide future versions with full englisch documentation)
|
||||||
|
|
||||||
|
Information and Help about the Program- ming Language Forth can be
|
||||||
|
found in the Internet, starting with the Website of the
|
||||||
|
Forthgesellschaft, or in the Usenet Forum de.comp.lang.forth (via
|
||||||
|
Google Groups: http://groups.google.de/group/de.comp.lang.forth )
|
||||||
|
|
||||||
|
** Details on VolksForth 6502 (Atari 8bit)
|
||||||
|
|
||||||
|
*** Requirements
|
||||||
|
Atari 8bit with 48 KB RAM, Floppy Atari 800, 800XL, Atari 130 XE
|
||||||
|
600XL (+ Atari 1064),
|
||||||
|
|
||||||
|
*** Files
|
||||||
|
|
||||||
|
This is list of VolksForth Files in this Distribution.
|
||||||
|
|
||||||
|
#+begin_example
|
||||||
|
|
||||||
|
DISK 1:
|
||||||
|
|
||||||
|
DOS.SYS
|
||||||
|
DUP.SYS - Atari DOS 2.5
|
||||||
|
VFORTH.COM - the plain volksForth
|
||||||
|
kernel
|
||||||
|
4TH.COM - volksForth binary
|
||||||
|
STAR4TH.COM - volksForth with
|
||||||
|
SPARTA/REAL/BEWE
|
||||||
|
DOS Extensions
|
||||||
|
DEBUG.COM - volksForth with
|
||||||
|
Debug Tools
|
||||||
|
(Tracer etc)
|
||||||
|
CALL.F - Sourcecode for CALL,
|
||||||
|
to call Machine-
|
||||||
|
language Suproutines
|
||||||
|
CREATE.F - Sourcecode for CREATE
|
||||||
|
DIR.F - Sourcecode for DIR and
|
||||||
|
DIR" Commands, to list
|
||||||
|
Diskdirectories
|
||||||
|
AS65.F - Sourcecode for the
|
||||||
|
resident 6502 Assembler
|
||||||
|
TAS65.F - Sourcecode for the
|
||||||
|
transient 6502 Assembler
|
||||||
|
(living in HEAP)
|
||||||
|
SAVESYS.F - Sourcecode for
|
||||||
|
SAVE-SYSTEM command
|
||||||
|
SIEVE.F - Primes Sieve Benchmark
|
||||||
|
4TH.F - Build volksForth binary
|
||||||
|
from plain kernel
|
||||||
|
README.TXT - This Text
|
||||||
|
COPYING - License Information
|
||||||
|
|
||||||
|
Disk 2
|
||||||
|
DOS.SYS
|
||||||
|
DUP.SYS - Atari DOS 2.5
|
||||||
|
4TH.COM - volksForth binary
|
||||||
|
COPYING - License Information
|
||||||
|
DEBUG.F - Script to build an
|
||||||
|
volksForth with
|
||||||
|
DEBUGGER
|
||||||
|
TAS65.F - Sourcecode for the
|
||||||
|
transient 6502 Assembler
|
||||||
|
(living in HEAP)
|
||||||
|
CREATE.F - Sourcecode for CREATE
|
||||||
|
TOOLS.F - Debugging Tools
|
||||||
|
TRACER.F - Interactive Tracer
|
||||||
|
DEBUGT.F - more Debugging Tools
|
||||||
|
SEE.F - build Decompiler without
|
||||||
|
Disassembler
|
||||||
|
SEE2.F - built Decompiler with
|
||||||
|
Disassembler
|
||||||
|
DISAS.F - 6502 Disassembler
|
||||||
|
DECOMP.F - volksForth Decompiler
|
||||||
|
DIS.F - build 6502 Disassembler
|
||||||
|
MTASK.F - volksForth Multitasker
|
||||||
|
MTDEMO.F - Multitask Demo
|
||||||
|
"RatRace"
|
||||||
|
CALL.F - Sourcecode for CALL,
|
||||||
|
to call Machine-
|
||||||
|
language Suproutines
|
||||||
|
SPARTA.F - Sparta/Real/BEWE-DOS
|
||||||
|
Support
|
||||||
|
LAUNCH.F - Sparta DOS CLI
|
||||||
|
Support
|
||||||
|
SPAR4TH.F - Build volksForth with
|
||||||
|
Sparta-DOS Support
|
||||||
|
TEST.F
|
||||||
|
TEST2.F
|
||||||
|
TEST3.F - Test Files for
|
||||||
|
nested INCLUDE"
|
||||||
|
#+end_example
|
||||||
|
*** Editor
|
||||||
|
This verion of volksForth for Atari 8bit does not contain an Editor
|
||||||
|
for Sourcecode. An Forth Editor will be supplied for Version 3.90. We
|
||||||
|
recommend Ken Siders KEDIT ( http://atari.ksiders.tzo.com/ ) or the
|
||||||
|
CompyShop Editor.
|
||||||
|
|
||||||
|
*** Emulator
|
||||||
|
VolksForth 6502 Atari 8bit 3.81 has been tested in the Atari 8bit
|
||||||
|
Emulator "Atari800" (atari800.sourceforge.net)
|
||||||
|
|
||||||
|
Have fun with VolksForth
|
||||||
|
the VolksForth Team
|
Binary file not shown.
Binary file not shown.
|
@ -1,161 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
void help(char *name)
|
|
||||||
{
|
|
||||||
printf("%s - BINARY to Intel HEX file convertor version 1.00\n"\
|
|
||||||
"(c)BCL Vysoke Myto 2001 (benedikt@lphard.cz)\n\n",name);
|
|
||||||
printf("Usage: %s [-option] binfile hexfile\n"\
|
|
||||||
" -l Bytes to read from binary file\n"\
|
|
||||||
" -i Binary file starting offset\n"\
|
|
||||||
" -o Output file offset (where HEX data starts)\n"\
|
|
||||||
" -t Exclude EOF record\n"\
|
|
||||||
" -a Append to end of existing HEX file\n"\
|
|
||||||
" -q Quiet mode (no statistics are printed)\n", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])/*Main routine*/
|
|
||||||
{
|
|
||||||
char *ifile = NULL;
|
|
||||||
char *ofile = NULL;
|
|
||||||
char c;
|
|
||||||
FILE *inp, *outp;
|
|
||||||
int ch,csum;
|
|
||||||
int ofsa = 0;
|
|
||||||
int cnt = 0;
|
|
||||||
struct stat statbuf;
|
|
||||||
long int foffset = 0;
|
|
||||||
long int fsize = 0;
|
|
||||||
long int fsub;
|
|
||||||
long int fpoint = 0;
|
|
||||||
long int adrs = 0;
|
|
||||||
unsigned char quiet = 0;
|
|
||||||
unsigned char eofrec = 0;
|
|
||||||
unsigned char append = 0;
|
|
||||||
|
|
||||||
opterr = 0; //print error message if unknown option
|
|
||||||
|
|
||||||
while ((c = getopt (argc, argv, "l:i:o:taqv")) != -1)
|
|
||||||
switch (c) {
|
|
||||||
case 'l':
|
|
||||||
fsize = atol(optarg);
|
|
||||||
break;
|
|
||||||
case 'i':
|
|
||||||
foffset = atol(optarg);
|
|
||||||
break;
|
|
||||||
case 'o':
|
|
||||||
adrs = atol(optarg);
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
eofrec = 1;
|
|
||||||
break;
|
|
||||||
case 'a':
|
|
||||||
append = 1;
|
|
||||||
break;
|
|
||||||
case 'q':
|
|
||||||
quiet = 1;
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
printf("%s - BINARY to Intel HEX file convertor version 1.00\n"\
|
|
||||||
"(c)BCL Vysoke Myto 2001 (benedikt@lphard.cz)\n",argv[0]);
|
|
||||||
return 0;
|
|
||||||
case '?':
|
|
||||||
help (argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((argc - optind) != 2) {
|
|
||||||
printf("ERROR: Missing input/output file.\n");
|
|
||||||
help(argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
ifile = argv[optind];
|
|
||||||
ofile = argv[optind+1];
|
|
||||||
|
|
||||||
/*Open file check*/
|
|
||||||
if((inp = fopen(ifile, "rb")) == NULL){
|
|
||||||
printf("ERROR: Cannot open input file.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fseek (inp, foffset, SEEK_SET);
|
|
||||||
|
|
||||||
if (append == 0) {
|
|
||||||
if((outp = fopen(ofile, "wt")) == NULL){
|
|
||||||
printf("ERROR: Cannot open output file.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if((outp = fopen(ofile, "at")) == NULL){
|
|
||||||
printf("ERROR: Cannot re-open output file.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fseek (outp, 0, SEEK_END);
|
|
||||||
}
|
|
||||||
|
|
||||||
fstat(fileno(inp), &statbuf);
|
|
||||||
if (quiet == 0) printf("Input file size=%ld\n",statbuf.st_size);
|
|
||||||
if (foffset > statbuf.st_size) {
|
|
||||||
printf("ERROR: Input offset > input file length\n");
|
|
||||||
}
|
|
||||||
if ((fsize == 0) || (fsize > (statbuf.st_size - foffset)))
|
|
||||||
fsize = statbuf.st_size - foffset;
|
|
||||||
|
|
||||||
// fprintf(outp,":020000020000FC\n");/*Start Header*/
|
|
||||||
fsub = fsize - fpoint;
|
|
||||||
if (fsub > 0x20) {
|
|
||||||
fprintf(outp,":20%04X00",adrs);/*Hex line Header*/
|
|
||||||
csum = 0x20 + (adrs>>8) + (adrs & 0xFF);
|
|
||||||
adrs += 0x20;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(outp, ":%02X%04X00", fsub,adrs);/*Hex line Header*/
|
|
||||||
csum = fsub + (adrs>>8) + (adrs & 0xFF);
|
|
||||||
adrs += fsub;
|
|
||||||
}
|
|
||||||
while (fsub > 0){
|
|
||||||
ch = fgetc(inp);
|
|
||||||
fprintf(outp,"%02X",ch);/*Put data*/
|
|
||||||
cnt++; fpoint++;
|
|
||||||
fsub = fsize - fpoint;
|
|
||||||
csum = ch + csum;
|
|
||||||
if((fsub == 0)||(cnt == 0x20)){
|
|
||||||
cnt = 0; csum = 0xFF & (~csum + 1);
|
|
||||||
fprintf(outp,"%02X\n",csum);/*Put checksum*/
|
|
||||||
if(fsub == 0) break;
|
|
||||||
if(adrs > 0xFFFF){
|
|
||||||
ofsa = 0x1000 + ofsa;
|
|
||||||
adrs = 0;
|
|
||||||
fprintf(outp,":02000002%04X",ofsa);/*Change offset address*/
|
|
||||||
csum = 0x02 + 0x02 + (ofsa>>8) + (ofsa & 0xFF);
|
|
||||||
csum = 0xFF & (~csum + 1);
|
|
||||||
fprintf(outp,"%02X\n", csum);
|
|
||||||
}
|
|
||||||
adrs = 0xFFFF & adrs;
|
|
||||||
if (fsub > 0x20) {
|
|
||||||
fprintf(outp,":20%04X00",adrs);/*Next Hex line Header*/
|
|
||||||
csum = 0x20 + (adrs>>8) + (adrs & 0xFF);
|
|
||||||
adrs += 0x20;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(fsub > 0){
|
|
||||||
fprintf(outp, ":%02X%04X00", fsub,adrs);/*Next Hex line Header*/
|
|
||||||
csum = fsub + (adrs>>8) + (adrs & 0xFF);
|
|
||||||
adrs += fsub;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (eofrec == 0) fprintf(outp,":00000001FF\n");/*End footer*/
|
|
||||||
fflush (outp);
|
|
||||||
|
|
||||||
fstat(fileno(outp), &statbuf);
|
|
||||||
if (quiet == 0) printf("Output file size=%ld\n",statbuf.st_size);
|
|
||||||
|
|
||||||
fclose(inp);
|
|
||||||
fclose(outp);
|
|
||||||
return 0;
|
|
||||||
}
|
|
15
sources/6502/Atari8bit/4th.fth
Normal file
15
sources/6502/Atari8bit/4th.fth
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
CR
|
||||||
|
.( Build 4TH.COM from plain kernel )
|
||||||
|
|
||||||
|
\needs SAVESYSTEM INCLUDE" D:SAVESYS.F"
|
||||||
|
\needs CALL INCLUDE" D:CALL.F"
|
||||||
|
\needs S" INCLUDE" D:STRING.F"
|
||||||
|
\needs 2@ INCLUDE" D:2WORDS.F"
|
||||||
|
\needs DIR INCLUDE" D:DIR.F"
|
||||||
|
SAVE
|
||||||
|
SAVE-SYSTEM D:4TH.COM
|
||||||
|
|
||||||
|
CR
|
||||||
|
.( 4TH.COM saved )
|
||||||
|
CR
|
||||||
|
|
150
sources/6502/Atari8bit/as65.fs
Normal file
150
sources/6502/Atari8bit/as65.fs
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
\ 6502 Assembler clv10oct87
|
||||||
|
\ Basis: Forth Dimensions VOL III No. 5)
|
||||||
|
\ internal loading 04may85BP/re)
|
||||||
|
\ Forth-6502 Assembler clv10oct87
|
||||||
|
\ Basis: Forth Dimensions VOL III No. 5)
|
||||||
|
|
||||||
|
CR .( Loading 6502 Assembler...) CR
|
||||||
|
|
||||||
|
Onlyforth Assembler also definitions
|
||||||
|
|
||||||
|
\ Forth-83 6502-Assembler 20oct87re
|
||||||
|
|
||||||
|
: end-code context 2- @ context ! ;
|
||||||
|
|
||||||
|
Create index
|
||||||
|
$0909 , $1505 , $0115 , $8011 ,
|
||||||
|
$8009 , $1D0D , $8019 , $8080 ,
|
||||||
|
$0080 , $1404 , $8014 , $8080 ,
|
||||||
|
$8080 , $1C0C , $801C , $2C80 ,
|
||||||
|
|
||||||
|
| Variable mode
|
||||||
|
|
||||||
|
: Mode: ( n -) Create c,
|
||||||
|
Does> ( -) c@ mode ! ;
|
||||||
|
|
||||||
|
0 Mode: .A 1 Mode: #
|
||||||
|
2 | Mode: mem 3 Mode: ,X
|
||||||
|
4 Mode: ,Y 5 Mode: X)
|
||||||
|
6 Mode: )Y $F Mode: )
|
||||||
|
|
||||||
|
\ upmode cpu 20oct87re
|
||||||
|
|
||||||
|
| : upmode ( addr0 f0 - addr1 f1)
|
||||||
|
IF mode @ 8 or mode ! THEN
|
||||||
|
1 mode @ $F and ?dup IF
|
||||||
|
0 DO dup + LOOP THEN
|
||||||
|
over 1+ @ and 0= ;
|
||||||
|
|
||||||
|
: cpu ( 8b -) Create c,
|
||||||
|
Does> ( -) c@ c, mem ;
|
||||||
|
|
||||||
|
00 cpu brk $18 cpu clc $D8 cpu cld
|
||||||
|
$58 cpu cli $B8 cpu clv $CA cpu dex
|
||||||
|
$88 cpu dey $E8 cpu inx $C8 cpu iny
|
||||||
|
$EA cpu nop $48 cpu pha $08 cpu php
|
||||||
|
$68 cpu pla $28 cpu plp $40 cpu rti
|
||||||
|
$60 cpu rts $38 cpu sec $F8 cpu sed
|
||||||
|
$78 cpu sei $AA cpu tax $A8 cpu tay
|
||||||
|
$BA cpu tsx $8A cpu txa $9A cpu txs
|
||||||
|
$98 cpu tya
|
||||||
|
|
||||||
|
\ m/cpu 20oct87re
|
||||||
|
|
||||||
|
: m/cpu ( mode opcode -) Create c, ,
|
||||||
|
Does>
|
||||||
|
dup 1+ @ $80 and IF $10 mode +! THEN
|
||||||
|
over $FF00 and upmode upmode
|
||||||
|
IF mem true Abort" invalid" THEN
|
||||||
|
c@ mode @ index + c@ + c, mode @ 7 and
|
||||||
|
IF mode @ $F and 7 <
|
||||||
|
IF c, ELSE , THEN THEN mem ;
|
||||||
|
|
||||||
|
$1C6E $60 m/cpu adc $1C6E $20 m/cpu and
|
||||||
|
$1C6E $C0 m/cpu cmp $1C6E $40 m/cpu eor
|
||||||
|
$1C6E $A0 m/cpu lda $1C6E $00 m/cpu ora
|
||||||
|
$1C6E $E0 m/cpu sbc $1C6C $80 m/cpu sta
|
||||||
|
$0D0D $01 m/cpu asl $0C0C $C1 m/cpu dec
|
||||||
|
$0C0C $E1 m/cpu inc $0D0D $41 m/cpu lsr
|
||||||
|
$0D0D $21 m/cpu rol $0D0D $61 m/cpu ror
|
||||||
|
$0414 $81 m/cpu stx $0486 $E0 m/cpu cpx
|
||||||
|
$0486 $C0 m/cpu cpy $1496 $A2 m/cpu ldx
|
||||||
|
$0C8E $A0 m/cpu ldy $048C $80 m/cpu sty
|
||||||
|
$0480 $14 m/cpu jsr $8480 $40 m/cpu jmp
|
||||||
|
$0484 $20 m/cpu bit
|
||||||
|
|
||||||
|
\ Assembler conditionals 20oct87re
|
||||||
|
|
||||||
|
| : range? ( branch -- branch )
|
||||||
|
dup abs $7F u> Abort" out of range " ;
|
||||||
|
|
||||||
|
: [[ ( BEGIN) here ;
|
||||||
|
: ?] ( UNTIL) c, here 1+ - range? c, ;
|
||||||
|
: ?[ ( IF) c, here 0 c, ;
|
||||||
|
: ?[[ ( WHILE) ?[ swap ;
|
||||||
|
: ]? ( THEN) here over c@ IF swap !
|
||||||
|
ELSE over 1+ - range? swap c! THEN ;
|
||||||
|
: ][ ( ELSE) here 1+ 1 jmp
|
||||||
|
swap here over 1+ - range? swap c! ;
|
||||||
|
: ]] ( AGAIN) jmp ;
|
||||||
|
: ]]? ( REPEAT) jmp ]? ;
|
||||||
|
|
||||||
|
\ Assembler conditionals 20oct87re
|
||||||
|
$90 Constant CS $B0 Constant CC
|
||||||
|
$D0 Constant 0= $F0 Constant 0<>
|
||||||
|
$10 Constant 0< $30 Constant 0>=
|
||||||
|
$50 Constant VS $70 Constant VC
|
||||||
|
|
||||||
|
: not $20 [ Forth ] xor ;
|
||||||
|
|
||||||
|
: beq 0<> ?] ; : bmi 0>= ?] ;
|
||||||
|
: bne 0= ?] ; : bpl 0< ?] ;
|
||||||
|
: bcc CS ?] ; : bvc VS ?] ;
|
||||||
|
: bcs CC ?] ; : bvs VC ?] ;
|
||||||
|
|
||||||
|
\ 2inc/2dec winc/wdec 20oct87re
|
||||||
|
|
||||||
|
: 2inc ( adr -- )
|
||||||
|
dup lda clc 2 # adc
|
||||||
|
dup sta CS ?[ swap 1+ inc ]? ;
|
||||||
|
|
||||||
|
: 2dec ( adr -- )
|
||||||
|
dup lda sec 2 # sbc
|
||||||
|
dup sta CC ?[ swap 1+ dec ]? ;
|
||||||
|
|
||||||
|
: winc ( adr -- )
|
||||||
|
dup inc 0= ?[ swap 1+ inc ]? ;
|
||||||
|
|
||||||
|
: wdec ( adr -- )
|
||||||
|
dup lda 0= ?[ over 1+ dec ]? dec ;
|
||||||
|
|
||||||
|
: ;c:
|
||||||
|
recover jsr end-code ] 0 last ! 0 ;
|
||||||
|
|
||||||
|
\ ;code Code code> bp/re03feb85
|
||||||
|
|
||||||
|
Onlyforth
|
||||||
|
|
||||||
|
: Assembler
|
||||||
|
Assembler [ Assembler ] mem ;
|
||||||
|
|
||||||
|
: ;Code
|
||||||
|
[compile] Does> -3 allot
|
||||||
|
[compile] ; -2 allot Assembler ;
|
||||||
|
immediate
|
||||||
|
|
||||||
|
: Code Create here dup 2- ! Assembler ;
|
||||||
|
|
||||||
|
: >label ( adr -)
|
||||||
|
here | Create immediate swap ,
|
||||||
|
4 hallot heap 1 and hallot ( 6502-alig)
|
||||||
|
here 4 - heap 4 cmove
|
||||||
|
heap last @ count $1F and + ! dp !
|
||||||
|
Does> ( - adr) @
|
||||||
|
state @ IF [compile] Literal THEN ;
|
||||||
|
|
||||||
|
: Label
|
||||||
|
[ Assembler ] here >label Assembler ;
|
||||||
|
|
||||||
|
Onlyforth
|
||||||
|
|
150
sources/6502/Atari8bit/as65.fth
Normal file
150
sources/6502/Atari8bit/as65.fth
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
\ 6502 Assembler clv10oct87
|
||||||
|
\ Basis: Forth Dimensions VOL III No. 5)
|
||||||
|
\ internal loading 04may85BP/re)
|
||||||
|
\ Forth-6502 Assembler clv10oct87
|
||||||
|
\ Basis: Forth Dimensions VOL III No. 5)
|
||||||
|
|
||||||
|
CR .( Loading 6502 Assembler...) CR
|
||||||
|
|
||||||
|
Onlyforth Assembler also definitions
|
||||||
|
|
||||||
|
\ Forth-83 6502-Assembler 20oct87re
|
||||||
|
|
||||||
|
: end-code context 2- @ context ! ;
|
||||||
|
|
||||||
|
Create index
|
||||||
|
$0909 , $1505 , $0115 , $8011 ,
|
||||||
|
$8009 , $1D0D , $8019 , $8080 ,
|
||||||
|
$0080 , $1404 , $8014 , $8080 ,
|
||||||
|
$8080 , $1C0C , $801C , $2C80 ,
|
||||||
|
|
||||||
|
| Variable mode
|
||||||
|
|
||||||
|
: Mode: ( n -) Create c,
|
||||||
|
Does> ( -) c@ mode ! ;
|
||||||
|
|
||||||
|
0 Mode: .A 1 Mode: #
|
||||||
|
2 | Mode: mem 3 Mode: ,X
|
||||||
|
4 Mode: ,Y 5 Mode: X)
|
||||||
|
6 Mode: )Y $F Mode: )
|
||||||
|
|
||||||
|
\ upmode cpu 20oct87re
|
||||||
|
|
||||||
|
| : upmode ( addr0 f0 - addr1 f1)
|
||||||
|
IF mode @ 8 or mode ! THEN
|
||||||
|
1 mode @ $F and ?dup IF
|
||||||
|
0 DO dup + LOOP THEN
|
||||||
|
over 1+ @ and 0= ;
|
||||||
|
|
||||||
|
: cpu ( 8b -) Create c,
|
||||||
|
Does> ( -) c@ c, mem ;
|
||||||
|
|
||||||
|
00 cpu brk $18 cpu clc $D8 cpu cld
|
||||||
|
$58 cpu cli $B8 cpu clv $CA cpu dex
|
||||||
|
$88 cpu dey $E8 cpu inx $C8 cpu iny
|
||||||
|
$EA cpu nop $48 cpu pha $08 cpu php
|
||||||
|
$68 cpu pla $28 cpu plp $40 cpu rti
|
||||||
|
$60 cpu rts $38 cpu sec $F8 cpu sed
|
||||||
|
$78 cpu sei $AA cpu tax $A8 cpu tay
|
||||||
|
$BA cpu tsx $8A cpu txa $9A cpu txs
|
||||||
|
$98 cpu tya
|
||||||
|
|
||||||
|
\ m/cpu 20oct87re
|
||||||
|
|
||||||
|
: m/cpu ( mode opcode -) Create c, ,
|
||||||
|
Does>
|
||||||
|
dup 1+ @ $80 and IF $10 mode +! THEN
|
||||||
|
over $FF00 and upmode upmode
|
||||||
|
IF mem true Abort" invalid" THEN
|
||||||
|
c@ mode @ index + c@ + c, mode @ 7 and
|
||||||
|
IF mode @ $F and 7 <
|
||||||
|
IF c, ELSE , THEN THEN mem ;
|
||||||
|
|
||||||
|
$1C6E $60 m/cpu adc $1C6E $20 m/cpu and
|
||||||
|
$1C6E $C0 m/cpu cmp $1C6E $40 m/cpu eor
|
||||||
|
$1C6E $A0 m/cpu lda $1C6E $00 m/cpu ora
|
||||||
|
$1C6E $E0 m/cpu sbc $1C6C $80 m/cpu sta
|
||||||
|
$0D0D $01 m/cpu asl $0C0C $C1 m/cpu dec
|
||||||
|
$0C0C $E1 m/cpu inc $0D0D $41 m/cpu lsr
|
||||||
|
$0D0D $21 m/cpu rol $0D0D $61 m/cpu ror
|
||||||
|
$0414 $81 m/cpu stx $0486 $E0 m/cpu cpx
|
||||||
|
$0486 $C0 m/cpu cpy $1496 $A2 m/cpu ldx
|
||||||
|
$0C8E $A0 m/cpu ldy $048C $80 m/cpu sty
|
||||||
|
$0480 $14 m/cpu jsr $8480 $40 m/cpu jmp
|
||||||
|
$0484 $20 m/cpu bit
|
||||||
|
|
||||||
|
\ Assembler conditionals 20oct87re
|
||||||
|
|
||||||
|
| : range? ( branch -- branch )
|
||||||
|
dup abs $7F u> Abort" out of range " ;
|
||||||
|
|
||||||
|
: [[ ( BEGIN) here ;
|
||||||
|
: ?] ( UNTIL) c, here 1+ - range? c, ;
|
||||||
|
: ?[ ( IF) c, here 0 c, ;
|
||||||
|
: ?[[ ( WHILE) ?[ swap ;
|
||||||
|
: ]? ( THEN) here over c@ IF swap !
|
||||||
|
ELSE over 1+ - range? swap c! THEN ;
|
||||||
|
: ][ ( ELSE) here 1+ 1 jmp
|
||||||
|
swap here over 1+ - range? swap c! ;
|
||||||
|
: ]] ( AGAIN) jmp ;
|
||||||
|
: ]]? ( REPEAT) jmp ]? ;
|
||||||
|
|
||||||
|
\ Assembler conditionals 20oct87re
|
||||||
|
$90 Constant CS $B0 Constant CC
|
||||||
|
$D0 Constant 0= $F0 Constant 0<>
|
||||||
|
$10 Constant 0< $30 Constant 0>=
|
||||||
|
$50 Constant VS $70 Constant VC
|
||||||
|
|
||||||
|
: not $20 [ Forth ] xor ;
|
||||||
|
|
||||||
|
: beq 0<> ?] ; : bmi 0>= ?] ;
|
||||||
|
: bne 0= ?] ; : bpl 0< ?] ;
|
||||||
|
: bcc CS ?] ; : bvc VS ?] ;
|
||||||
|
: bcs CC ?] ; : bvs VC ?] ;
|
||||||
|
|
||||||
|
\ 2inc/2dec winc/wdec 20oct87re
|
||||||
|
|
||||||
|
: 2inc ( adr -- )
|
||||||
|
dup lda clc 2 # adc
|
||||||
|
dup sta CS ?[ swap 1+ inc ]? ;
|
||||||
|
|
||||||
|
: 2dec ( adr -- )
|
||||||
|
dup lda sec 2 # sbc
|
||||||
|
dup sta CC ?[ swap 1+ dec ]? ;
|
||||||
|
|
||||||
|
: winc ( adr -- )
|
||||||
|
dup inc 0= ?[ swap 1+ inc ]? ;
|
||||||
|
|
||||||
|
: wdec ( adr -- )
|
||||||
|
dup lda 0= ?[ over 1+ dec ]? dec ;
|
||||||
|
|
||||||
|
: ;c:
|
||||||
|
recover jsr end-code ] 0 last ! 0 ;
|
||||||
|
|
||||||
|
\ ;code Code code> bp/re03feb85
|
||||||
|
|
||||||
|
Onlyforth
|
||||||
|
|
||||||
|
: Assembler
|
||||||
|
Assembler [ Assembler ] mem ;
|
||||||
|
|
||||||
|
: ;Code
|
||||||
|
[compile] Does> -3 allot
|
||||||
|
[compile] ; -2 allot Assembler ;
|
||||||
|
immediate
|
||||||
|
|
||||||
|
: Code Create here dup 2- ! Assembler ;
|
||||||
|
|
||||||
|
: >label ( adr -)
|
||||||
|
here | Create immediate swap ,
|
||||||
|
4 hallot heap 1 and hallot ( 6502-alig)
|
||||||
|
here 4 - heap 4 cmove
|
||||||
|
heap last @ count $1F and + ! dp !
|
||||||
|
Does> ( - adr) @
|
||||||
|
state @ IF [compile] Literal THEN ;
|
||||||
|
|
||||||
|
: Label
|
||||||
|
[ Assembler ] here >label Assembler ;
|
||||||
|
|
||||||
|
Onlyforth
|
||||||
|
|
17
sources/6502/Atari8bit/call.fth
Normal file
17
sources/6502/Atari8bit/call.fth
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
\NEEDS CODE INCLUDE" D:TAS65.F"
|
||||||
|
|
||||||
|
( Call Machine Routine at "addr" )
|
||||||
|
( return value is A-Reg and Y-Reg)
|
||||||
|
HEX
|
||||||
|
CODE CALL ( addr -- res )
|
||||||
|
4C # lda n sta
|
||||||
|
SP x) lda n 1+ sta
|
||||||
|
SP )y lda n 2+ sta
|
||||||
|
n jsr
|
||||||
|
n sta
|
||||||
|
n 1+ sty
|
||||||
|
00 # ldx
|
||||||
|
01 # ldy
|
||||||
|
n lda SP x) sta
|
||||||
|
n 1+ lda SP )y sta
|
||||||
|
next jmp end-code
|
23
sources/6502/Atari8bit/dir.fth
Normal file
23
sources/6502/Atari8bit/dir.fth
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
CR
|
||||||
|
.( List Directory Command for volksForth )
|
||||||
|
-1 ?HEAD ! ( move head of DIRX in Heap )
|
||||||
|
: DIRX
|
||||||
|
&6 OPEN-FILE DUP
|
||||||
|
$80 > IF ." File Error:" . ABORT THEN
|
||||||
|
DROP SOURCE-ID ! CR
|
||||||
|
BEGIN $580 &18 SOURCE-ID @ READ-LINE
|
||||||
|
$80 < WHILE
|
||||||
|
DROP $580 SWAP TYPE
|
||||||
|
REPEAT 2DROP
|
||||||
|
SOURCE-ID @ CLOSE-FILE DROP CR ;
|
||||||
|
|
||||||
|
( Generic Directory listing for )
|
||||||
|
( current directory )
|
||||||
|
: DIR " D:*.*" COUNT DIRX ;
|
||||||
|
|
||||||
|
( Directory Listing with Parameter )
|
||||||
|
( Example: DIR" D2:*.COM"
|
||||||
|
: DIR" FILE" DIRX ;
|
||||||
|
|
||||||
|
CR .( DIR and DIR" Command loaded )
|
||||||
|
CR
|
9
sources/6502/Atari8bit/random.fth
Normal file
9
sources/6502/Atari8bit/random.fth
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
\ Random Numbers
|
||||||
|
|
||||||
|
: RND ( -- n ) \ Random Number 0-255
|
||||||
|
$D20A C@ ;
|
||||||
|
|
||||||
|
: RANDOM ( n -- 0..n-1 )
|
||||||
|
RND $100 * RND + UM* NIP ;
|
||||||
|
|
||||||
|
|
19
sources/6502/Atari8bit/savesys.fth
Normal file
19
sources/6502/Atari8bit/savesys.fth
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
: SAVESYSTEM
|
||||||
|
$FFFF $600 !
|
||||||
|
ORIGIN 8 - $602 !
|
||||||
|
HERE $604 !
|
||||||
|
FILE" W/O OPEN-FILE DROP
|
||||||
|
DUP $600 6 ROT
|
||||||
|
WRITE-FILE ( save header ) DROP
|
||||||
|
DUP ORIGIN 8 - HERE
|
||||||
|
ORIGIN 8 - - 1+ ROT
|
||||||
|
WRITE-FILE DROP
|
||||||
|
$02E0 $602 !
|
||||||
|
$02E1 $604 !
|
||||||
|
ORIGIN 8 - $606 !
|
||||||
|
DUP $602 6 ROT
|
||||||
|
WRITE-FILE DROP
|
||||||
|
CLOSE-FILE DROP ;
|
||||||
|
|
||||||
|
' SAVESYSTEM ALIAS SAVE-SYSTEM
|
||||||
|
|
9
sources/6502/Atari8bit/sound.fth
Normal file
9
sources/6502/Atari8bit/sound.fth
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
\ Atari Sound Commands
|
||||||
|
|
||||||
|
( $D200 = Pokey AUDBASE )
|
||||||
|
|
||||||
|
: SOUND ( CH# FREQ DIST VOL -- )
|
||||||
|
SWAP $10 * + ROT DUP + $D200 +
|
||||||
|
ROT OVER C! 1+ C! ;
|
||||||
|
|
||||||
|
|
20
sources/6502/Atari8bit/tas65.fth
Normal file
20
sources/6502/Atari8bit/tas65.fth
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
\ transient Assembler clv10oct87
|
||||||
|
\ Basis: Forth Dimensions VOL III No. 5)
|
||||||
|
\ internal loading 04may85BP/re)
|
||||||
|
\ Forth-6502 Assembler clv10oct87
|
||||||
|
\ Basis: Forth Dimensions VOL III No. 5)
|
||||||
|
|
||||||
|
CR .( Loading 6502 transient Assembler...) CR
|
||||||
|
|
||||||
|
Onlyforth Assembler also definitions
|
||||||
|
here $800 hallot heap dp !
|
||||||
|
|
||||||
|
INCLUDE" D:AS65.FS"
|
||||||
|
|
||||||
|
dp !
|
||||||
|
|
||||||
|
Onlyforth
|
||||||
|
|
||||||
|
CR .( Transient Assembler loaded...) CR
|
||||||
|
|
||||||
|
|
122
sources/6502/math.fth
Normal file
122
sources/6502/math.fth
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
\ A SINUS-TABLE 20OCT87RE
|
||||||
|
\ SINUS-TABLE FROM FD Vol IV/1
|
||||||
|
|
||||||
|
\needs code INCLUDE" D:TAS65.FS"
|
||||||
|
|
||||||
|
| : TABLE ( VALUES N -)
|
||||||
|
CREATE 0 DO , LOOP
|
||||||
|
;CODE ( N - VALUE)
|
||||||
|
SP X) LDA CLC 1 # ADC .A ASL TAY
|
||||||
|
W )Y LDA SP X) STA
|
||||||
|
INY W )Y LDA 1 # LDY SP )Y STA
|
||||||
|
NEXT JMP END-CODE
|
||||||
|
|
||||||
|
10000 9998 9994 9986 9976 9962 9945 9925
|
||||||
|
9903 9877 9848 9816 9781 9744 9703 9659
|
||||||
|
9613 9563 9511 9455 9397 9336 9272 9205
|
||||||
|
9135 9063 8988 8910 8829 8746 8660 8572
|
||||||
|
8480 8387 8290 8192 8090 7986 7880 7771
|
||||||
|
7660 7547 7431 7314 7193 7071 6947 6820
|
||||||
|
6691 6561 6428 6293 6157 6018 5878 5736
|
||||||
|
5592 5446 5299 5150 5000 4848 4695 4540
|
||||||
|
4384 4226 4067 3907 3746 3584 3420 3256
|
||||||
|
3090 2924 2756 2588 2419 2250 2079 1908
|
||||||
|
1736 1564 1392 1219 1045 0872 0698 0523
|
||||||
|
0349 0175 0000
|
||||||
|
|
||||||
|
&91 | TABLE SINTABLE
|
||||||
|
|
||||||
|
| : S180 ( DEG -- SIN*10000:SIN 0-180)
|
||||||
|
DUP &90 >
|
||||||
|
IF &180 SWAP - THEN
|
||||||
|
SINTABLE ;
|
||||||
|
|
||||||
|
: SIN ( DEG -- SIN*10000)
|
||||||
|
&360 MOD DUP 0< IF &360 + THEN
|
||||||
|
DUP &180 >
|
||||||
|
IF &180 - S180 NEGATE
|
||||||
|
ELSE S180 THEN ;
|
||||||
|
|
||||||
|
: COS ( DEG -- COS*10000)
|
||||||
|
&360 MOD &90 + SIN ;
|
||||||
|
|
||||||
|
: TAN ( DEG -- TAN*10000)
|
||||||
|
DUP SIN SWAP COS ?DUP
|
||||||
|
IF &100 SWAP */ ELSE 3 * THEN ;
|
||||||
|
|
||||||
|
CODE D2* ( D1 - D2)
|
||||||
|
2 # LDA SETUP JSR
|
||||||
|
N 2+ ASL N 3 + ROL N ROL N 1+ ROL
|
||||||
|
SP 2DEC N 3 + LDA SP )Y STA
|
||||||
|
N 2+ LDA SP X) STA
|
||||||
|
SP 2DEC N 1+ LDA SP )Y STA
|
||||||
|
N LDA SP X) STA
|
||||||
|
NEXT JMP END-CODE
|
||||||
|
|
||||||
|
: DU< &32768 + ROT &32768 + ROT ROT D< ;
|
||||||
|
|
||||||
|
| : EASY-BITS ( N1 -- N2)
|
||||||
|
0 DO
|
||||||
|
>R D2* D2* R@ - DUP 0<
|
||||||
|
IF R@ + R> 2* 1-
|
||||||
|
ELSE R> 2* 3 +
|
||||||
|
THEN
|
||||||
|
LOOP ;
|
||||||
|
|
||||||
|
| : 2'S-BIT
|
||||||
|
>R D2* DUP 0<
|
||||||
|
IF D2* R@ - R> 1+
|
||||||
|
ELSE D2* R@ 2DUP U<
|
||||||
|
IF DROP R> 1- ELSE - R> 1+ THEN
|
||||||
|
THEN ;
|
||||||
|
|
||||||
|
| : 1'S-BIT
|
||||||
|
>R DUP 0<
|
||||||
|
IF 2DROP R> 1+
|
||||||
|
ELSE D2* &32768 R@ DU< 0=
|
||||||
|
NEGATE R> +
|
||||||
|
THEN ;
|
||||||
|
|
||||||
|
: SQRT ( UD1 - U2)
|
||||||
|
0 1 8 EASY-BITS
|
||||||
|
ROT DROP 6 EASY-BITS
|
||||||
|
2'S-BIT 1'S-BIT ;
|
||||||
|
|
||||||
|
\ Test
|
||||||
|
\
|
||||||
|
\ : XX
|
||||||
|
\ &16 * &62500 UM*
|
||||||
|
\ SQRT 0 <# # # # ASCII . HOLD #S #>
|
||||||
|
\ TYPE SPACE ;
|
||||||
|
|
||||||
|
CODE 100* ( N1 - N2)
|
||||||
|
SP X) LDA N STA SP )Y LDA N 1+ STA
|
||||||
|
N ASL N 1+ ROL N ASL N 1+ ROL
|
||||||
|
N LDA N 2+ STA N 1+ LDA N 3 + STA
|
||||||
|
N 2+ ASL N 3 + ROL N 2+ ASL N 3 + ROL
|
||||||
|
N 2+ ASL N 3 + ROL
|
||||||
|
CLC N LDA N 2+ ADC N STA
|
||||||
|
N 1+ LDA N 3 + ADC N 1+ STA
|
||||||
|
N 2+ ASL N 3 + ROL
|
||||||
|
CLC N LDA N 2+ ADC SP X) STA
|
||||||
|
N 1+ LDA N 3 + ADC SP )Y STA
|
||||||
|
NEXT JMP END-CODE
|
||||||
|
|
||||||
|
LABEL 4/+
|
||||||
|
N 7 + LSR N 6 + ROR N 5 + ROR N 4 + ROR
|
||||||
|
N 7 + LSR N 6 + ROR N 5 + ROR N 4 + ROR
|
||||||
|
CLC N LDA N 4 + ADC N STA
|
||||||
|
N 1+ LDA N 5 + ADC N 1+ STA
|
||||||
|
SP X) LDA N 6 + ADC SP X) STA
|
||||||
|
SP )Y LDA N 7 + ADC SP )Y STA RTS
|
||||||
|
|
||||||
|
CODE 100U/ ( U - N)
|
||||||
|
N STX N 4 + STX
|
||||||
|
SP X) LDA .A ASL N 1+ STA N 5 + STA
|
||||||
|
SP )Y LDA .A ROL SP X) STA N 6 + STA
|
||||||
|
TXA .A ROL SP )Y STA N 7 + STA
|
||||||
|
4/+ JSR
|
||||||
|
N 7 + LSR N 6 + ROR N 5 + ROR N 4 + ROR
|
||||||
|
4/+ JSR
|
||||||
|
NEXT JMP END-CODE
|
||||||
|
|
19
sources/generic/array.fth
Normal file
19
sources/generic/array.fth
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
\ Arrays with bounds checking
|
||||||
|
|
||||||
|
| : (ARRAYERROR
|
||||||
|
ABORT" Array out of bounds!" ;
|
||||||
|
|
||||||
|
: ARRAY ( size -- )
|
||||||
|
CREATE DUP , 2* ALLOT
|
||||||
|
DOES> ( i -- addr )
|
||||||
|
OVER 0< (ARRAYERROR
|
||||||
|
2DUP @ 1- - 0> (ARRAYERROR
|
||||||
|
SWAP 1+ 2* + ;
|
||||||
|
|
||||||
|
: CARRAY ( size -- )
|
||||||
|
CREATE DUP , ALLOT
|
||||||
|
DOES> ( i -- addr )
|
||||||
|
OVER 0< (ARRAYERROR
|
||||||
|
2DUP @ 1- - 0> (ARRAYERROR
|
||||||
|
+ 1+ ;
|
||||||
|
|
4
sources/generic/create.fth
Normal file
4
sources/generic/create.fth
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
: CREATE: create hide
|
||||||
|
current @ context ! 0 ] ;
|
||||||
|
|
||||||
|
|
9
sources/generic/double.fth
Normal file
9
sources/generic/double.fth
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
\ Double Cell 32bit arithmetics words
|
||||||
|
|
||||||
|
.( load additional double 32bit words )
|
||||||
|
|
||||||
|
: D/ ( d u -- d ) \ floored result
|
||||||
|
SWAP OVER /MOD >R
|
||||||
|
SWAP UM/MOD SWAP DROP R> ;
|
||||||
|
|
||||||
|
|
33
sources/generic/sieve.fth
Normal file
33
sources/generic/sieve.fth
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
\ Sieve benchmark
|
||||||
|
|
||||||
|
CR .( Loading Sieve Benchmark... ) CR
|
||||||
|
Onlyforth
|
||||||
|
|
||||||
|
: allot ( u --)
|
||||||
|
dup sp@ here - $180 - u>
|
||||||
|
abort" no room" allot ;
|
||||||
|
|
||||||
|
&8192 Constant size
|
||||||
|
Create flags size allot
|
||||||
|
: do-prime ( -- #primes )
|
||||||
|
flags size 1 fill 0
|
||||||
|
size 0 DO flags I + c@
|
||||||
|
IF I 2* 3+ dup I +
|
||||||
|
BEGIN dup size <
|
||||||
|
WHILE 0 over flags + c!
|
||||||
|
over +
|
||||||
|
REPEAT 2drop 1+
|
||||||
|
THEN
|
||||||
|
LOOP ;
|
||||||
|
: benchmark
|
||||||
|
do-prime . ." Primzahlen" ;
|
||||||
|
: .primes size 0 DO flags I + c@
|
||||||
|
IF I 2* 3+ . THEN ?cr
|
||||||
|
stop? IF LEAVE THEN LOOP ;
|
||||||
|
|
||||||
|
CR .( Start Benchmark ) CR
|
||||||
|
benchmark CR
|
||||||
|
|
||||||
|
.primes CR
|
||||||
|
|
||||||
|
.( Benchmark finished ) CR
|
Loading…
Reference in New Issue
Block a user