diff --git a/Makefile b/Makefile index d6339a28..b1f391b5 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ docs: $(DOCBOOKGEN) \ --stringparam generate.toc "book toc" \ -o docs/documentation.html \ - /usr/share/xml/docbook/stylesheet/docbook-xsl-ns/xhtml5/docbook.xsl \ + /usr/share/xml/docbook/stylesheet/docbook-xsl-ns/html/docbook.xsl \ docs/documentation.xml clean: diff --git a/docs/documentation.html b/docs/documentation.html index b2c3f6f5..5e4c6b56 100644 --- a/docs/documentation.html +++ b/docs/documentation.html @@ -1,4 +1,4 @@ -
SjASMPlus is Z80 Assembly Language Cross Compiler. It is available +
SjASMPlus is Z80 Assembly Language Cross Compiler. It is available for Win32, DOS and FreeBSD(mainly 5.x) systems. It is based on SjASM source code by Sjoerd Mastijn (http://xl2s.tk)
Z80/R800 documented and undocumented opcodes support
Very fast compilation: 1 million lines by 2-3 seconds on modern computer
Code inlining through colon (LD A,C:INC A:PUSH AF:IFDEF @@ -20,7 +20,10 @@ bug fix patches, testing.
Big thanks to all people, who helped on development of the compiler!
WWW: https://sourceforge.net/projects/sjasmplus/ (original Aprisobal's source)
WWW: https://github.com/z00m128/sjasmplus - (newer versions maintained by z00m and others)
E-Mail: my@aprisobal.by, zoom@centrum.sk
- Fixed macro issue with commas inside quotes + (newer versions maintained by z00m and others)E-Mail: my@aprisobal.by, zoom@centrum.sk
- "Bytes lost" error reworked (and changed to warning) +- Error/warning messages are displayed in last pass only (where possible) +- Fixed 64k limit warnigs +- BinIncFile reworked
- Fixed macro issue with commas inside quotes - Fixed IFUSED and IFNUSED directives - Fixed STRUCT directive - Added support of register operands for operators HIGH and LOW
- Corrected bug in UNDEFINE directive @@ -462,7 +465,7 @@ at MSX's WB-ASS2, ZX-Spectrum's GENS, ZEUS, ALASM etc). After this all you can use new pseudo-ops as SAVEBIN, SAVEHOB, SAVETRD, SAVETAP, PAGE, SLOT, LABELSLIST and use special - functions in Lua scripts.Example 4.2.
DEVICE ZXSPECTRUM128 + functions in Lua scripts.Example 4.2.
DEVICE ZXSPECTRUM128 ;in this device, SLOT 3 enables to current by default. ORG 32768 @@ -485,48 +488,48 @@ default.- ZXSPECTRUM128
Has 8 RAM pages (0-7) with size 4000h.
- ZXSPECTRUM256
Same as russian clone Scorption 256. Has 16 RAM pages (0-15) with size 4000h.
- ZXSPECTRUM512
Same as russian clones ATM Turbo 512 and Pentagon 512. Has 32 RAM pages (0-31) with size 4000h.
- ZXSPECTRUM1024
Same as russian clones ATM Turbo 2 and Pentagon 1024 SL. - Has 64 RAM pages (0-63) with size 4000h.
If you want to see other devices you must write to us. See Feedback chapter.
SjASMPlus has predefined defines.
- .<expression> <code>
Repeat <code> <expression> once. Doesn't work - in the beginning of line.
Example 5.1.
.3 INC A ;will be compiled to INC A:INC A:INC A + in the beginning of line.Example 5.1.
.3 INC A ;will be compiled to INC A:INC A:INC A len EQU 10 .(12-len) BYTE 0 ;will be compiled to BYTE 0,0
- ABYTE <offset> <bytes>
Defines a byte or a string of bytes. The offset is added - to each of the following bytes.
Example 5.2.
ABYTE 2 4,9 ; Same as BYTE 6,11 + to each of the following bytes.
- ABYTEC <offset> <bytes>
Defines a byte or a string of bytes, where the last byte of the string will have bit 7 set. The offset is added to each - of the following bytes.
Example 5.3.
ABYTEC 0 "KIP" ; Same as BYTE "KI",'P'|128 + of the following bytes.Example 5.3.
ABYTEC 0 "KIP" ; Same as BYTE "KI",'P'|128 ABYTEC 1 "ABC",0,"DE" ; Same as BYTE "BC",'D'|128,1,'E','F'|128
- ABYTEZ <offset> <bytes>
Defines a byte or a string of bytes, followed by a zero. - The offset is added to each of the following bytes.
- ALIGN + The offset is added to each of the following bytes.
- ALIGN <2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384 or 32768>, <byte>
Align fills zero or more byte with <byte> until the - new address modulo <expression> equals zero.
Example 5.5.
ALIGN ; => ALIGN 4 - simply align by 4 + new address modulo <expression> equals zero.Example 5.5.
ALIGN ; => ALIGN 4 - simply align by 4 ALIGN 2 ; by 2 ALIGN 2,0 ; + fills memory by zero
- ASSERT <expression>
An 'assertion failed' error is issued if the expression - evaluates to zero.
Example 5.6.
STACKPOINTER=0D500H + evaluates to zero.
- BINARY <filename>[,<offset>[,<length>]]
Synonym of INCBIN.
- BLOCK <length>[,<fill byte>]
Defines space. Has to be followed by the number of byte to reserve, optionally followed by the value to fill these bytes - with.
Example 5.7.
BLOCK 500 ; define a block of 500 bytes of zero + with.Example 5.7.
BLOCK 500 ; define a block of 500 bytes of zero BLOCK 500,0 ; define a block of 500 bytes of zero BLOCK 400,-1 ; define a block of 400 bytes of 255
- BYTE <bytes>
Defines a byte or a string of bytes. Each value should be - between -129 and 256.
Example 5.8.
BYTE 0x56 + between -129 and 256.
- DB
Synonym of BYTE.
- DC
Same as BYTE, but every - last character of a string will have bit 7 set.
- DD
Synonym of DWORD.
- DEFARRAY <id> <replacements>
Array of DEFINEs
Example 5.10.
DEFARRAY myarray 10*20,"A",20,</D,40>,50,70 + last character of a string will have bit 7 set.
- DD
Synonym of DWORD.
- DEFARRAY <id> <replacements>
Array of DEFINEs
Example 5.10.
DEFARRAY myarray 10*20,"A",20,</D,40>,50,70 CNT DEFL 0 ;or CNT=0 DUP 6 DISPLAY myarray[CNT] @@ -538,7 +541,7 @@ <replacement>The identifier <id> will be replaced with the <replacement>. The replacement could be omitted, in such case it is still possible to check if the identifier was defined - with IFDEF or IFNDEF.
Example 5.11.
DEFINE str_honderd "Honderd" + with IFDEF or IFNDEF.
- DEFM
Synonym of BYTE.
- DEFS
Synonym of BLOCK.
- DEFW
Synonym of WORD.
- DEVICE <deviceid>
Enables real device emulation mode by it identifier.
Predefined devices' identifiers list:
NONE ; off real device emulation mode ZXSPECTRUM48 ; ZX-Spectrum 48 @@ -553,7 +556,7 @@ DEVICE ZXSPECTRUM128- DISP <address>
Set the address in which the part of code should work. PHASE and TEXTAREA are synonyms of DISP. ENT is restore current address. - UNPHASE, DEPHASE and ENDT are synonyms of ENT
Example 5.12.
SCREEN EQU $4000 + UNPHASE, DEPHASE and ENDT are synonyms of ENTExample 5.12.
SCREEN EQU $4000 ORG $8000 LD HL,BEGIN LD DE,SCREEN @@ -573,7 +576,7 @@ between -129 and 256. Keys /D, /H and /A set format of output of numbers:/D - out only in Decimal /H - out only in Hexadecimal -/A - out both in Hexadecimal and DecimalExample 5.13.
ORG 100h +/A - out both in Hexadecimal and DecimalExample 5.13.
ORG 100h TESTLABEL: ;...some code... RET @@ -584,7 +587,7 @@ > --the some program-- by me > TESTLABEL address is:0x100,257 */
- DM
Synonym of BYTE.
- DS
Synonym of BLOCK.
- DUP <count>
DUP specifies the number of times to generate the - statements inside the macro. DUP can be used in macro's.
Example 5.14.
DUP 3 + statements inside the macro. DUP can be used in macro's.
- DW
Synonym of WORD.
- DWORD
Defines a so called doubleword. Values should be between - -2147483649 and 4294967296.
Example 5.15.
DWORD 4000h,0d000h + -2147483649 and 4294967296.
- DZ
Same as BYTE, but an extra - zero will be added at the end.
Example 5.16.
DZ 1 ; same as BYTE 1,0 + zero will be added at the end.
- EMPTYTAP <filenameoftapefile>
Useful only for ZX-Spectrum users
Create the new or truncate existing standard tape file for emulators of ZX-Spectrum. See example of @@ -604,14 +607,14 @@ users
Set the current encoding, i.e. if you set "DOS", SjASMPlus will automatically convert strings from ANSI to DOS-866. Encoding may be "DOS"(DOS-866) or "WIN"(ANSI/Win-1251). Default - is "WIN".
Example 5.17.
ENCODING "WIN" + is "WIN".Example 5.17.
ENCODING "WIN" DB "тексттекст" ;will be тексттекст ENCODING "DOS" DB "тексттекст" ;will be ⥪бв⥪бв
- END
The assembler will stop at this point. The pseudo-op doesn't work in the beginning of line(with and without key --dirbol).
- ENDLUA
See LUA for more information.
- ENDMOD
Synonym of ENDMODULE.
- ENDMODULE
To indicate the end of a module (see MODULE), and use the previous - modulename.
Example 5.18.
MODULE M1 + modulename.
- ENDT
Synonym of ENT.
- ENT
Restore current address. See DISP for more information.
- EQU
To give a label a value other than the current program counter. '=' can be used instead of 'EQU'. The label should not - already exist.
Example 5.19.
Label EQU 3 + already exist.
- EXPORT label
The named label will be written to the export-file, in the form 'label: EQU value'. This way the export-file can be - included in other sources.
Example 5.20.
DRIE=3 + included in other sources.
- FIELD
To give a label the value of the current map counter. Afterwards the map counter is increment by the given amount. '#' May be used instead of 'FIELD'. With map and field it is possible to create structure-like data structures. With '##' it - is possible to align the map counter.
Example 5.21.
MAP 8 + is possible to align the map counter.Example 5.21.
MAP 8 Label # 2 ; Label=8 Kip # 3 ; Kip=10 Kop # ; Kop=13 @@ -635,16 +638,16 @@ ## ; align map address (align 4 is default) Kop3 # 6 ; Kop3=16
- FPOS <position>
The FPOS directive makes it possible to set the file position to anywhere in the output file.
In combination with OUTPUT <filename>,r it is - possible to update existing files.
Example 5.22.
; This example will result in a file with a length of one byte: + possible to update existing files.Example 5.22.
; This example will result in a file with a length of one byte: BYTE 0 FPOS 0 BYTE 1 END
- INCBIN <filename>[,<offset>[,<length>]]
To include a binary file into the outputfile. The offset - and length are optional.
Example 5.23.
INCBIN "gfx.scc",7 ; include gfx.scc, skip first 7 bytes + and length are optional.Example 5.23.
INCBIN "gfx.scc",7 ; include gfx.scc, skip first 7 bytes INCBIN "rantab.com",3,256 ; include 256 bytes from offset 3 INCBIN gfx.scc ,7 ; note the space between the filename and the ',7' here :)
- INCHOB <filename>[,<offset>[,<length>]]
To include a data from a hobeta file into the outputfile. - The offset and length are optional.
Example 5.24.
INCHOB "gfx.$c",7 ; include gfx.scc, skip first 7 bytes + The offset and length are optional.Example 5.24.
INCHOB "gfx.$c",7 ; include gfx.scc, skip first 7 bytes INCHOB "sprs.$c",3,256 ; include 256 bytes from offset 3 INCHOB gfx.$c ,7 ; note the space between the filename and the ',7' here :)
- INCLUDE <filename>
To include another sourcefile into the current. Sourcefiles can be nested 20 levels deep. If the file cannot be @@ -652,26 +655,26 @@ directory the current file comes from) the file will be searched for in the directories specified at the commandline. When angle brackets are used, the commandline directories are searched - before the current directory.
Example 5.25.
INCLUDE <VDP.I> + before the current directory.
- INCLUDELUA <filename>
To include another LUA script in first pass(!). If the file cannot be found in the current directory (the current directory is the directory the current file comes from) the file will be searched for in the directories specified at the commandline. When angle brackets are used, the commandline - directories are searched before the current directory.
Example 5.26.
INCLUDELUA <mylibrary1.lua> + directories are searched before the current directory.
- INCTRD <filenameoftrdimage>,<filenameintrdimage>[,<offset>[,<length>]]
To include a file from a TRD image into the outputfile. - The offset and length are optional.
Example 5.27.
INCTRD "test.trd","mygfx.C" ; include mygfx.C from test.trd + The offset and length are optional.Example 5.27.
INCTRD "test.trd","mygfx.C" ; include mygfx.C from test.trd INCTRD "test.trd","mygfx.C",12 ; include mygfx.C from test.trd, skip first 12 bytes
- INSERT <filename>[,<offset>[,<length>]]
INSERT is a synonym of INCBIN. See above.
- LABELSLIST <filename>
Useful only for ZX-Spectrum Emulator UNREALSPECCY.
Work only in real device emulation mode. See DEVICE.
Save labels list in format:
NN:ADDRESS LABELNAME- ,where NN is number of page of RAM
- LUA [pass]
Using pseudo-ops LUA and ENDLUA you can insert Lua + ,where NN is number of page of RAM
- LUA [pass]
Using pseudo-ops LUA and ENDLUA you can insert Lua scripts. See more in the chapter "Lua scripting".
Parameter is optional. It may be:
PASS1 - interpret Lua script in first pass only. PASS2 - interpret Lua script in second pass only. PASS3 - interpret Lua script in third pass only. By default. -ALLPASS - interpret Lua script in all passes. It is need, if you generate some Z80 code.Example 5.29.
LUA +ALLPASS - interpret Lua script in all passes. It is need, if you generate some Z80 code.Example 5.29.
LUA -- some comments print "Hi, man! This is Lua!" ENDLUA @@ -679,9 +682,9 @@ LUA ALLPASS _pl("LABEL LD A,10") _pc("RET") - ENDLUA
- MAP <address>
Set the map counter to the specified value. See FIELD for an example.
- MEMORYMAP
Not available yet.
- MODULE <name>
Labels are to be unique only in the current module. Also + ENDLUA
- MAP <address>
Set the map counter to the specified value. See FIELD for an example.
- MEMORYMAP
Not available yet.
- MODULE <name>
Labels are to be unique only in the current module. Also note the use of '@' to suppress all this label-processing. (The - '@' is NOT part of the label name though!)
Example 5.31.
MODULE xxx + '@' is NOT part of the label name though!)Example 5.31.
MODULE xxx Kip ; label xxx.Kip CALL Kip ; call xxx.Kip CALL yyy.Kip ; call yyy.Kip @@ -695,7 +698,7 @@ @xxx.Kop ; label xxx.Kop MODULE ; no modulename -Kip ; label Kip
- ORG <address>
Set the program counter to a specific address.
- ORG <address>
Set the program counter to a specific address.
Example 5.32.
ORG 100h ; or 0x100, or $100, or #100 ; useful macro that padding code MACRO PADORG addr @@ -724,7 +727,7 @@ FPOS 0) and append (open and leave the file pointer at the end of the file).OUTPUT <filename>,t ; truncate (default) OUTPUT <filename>,r ; rewind -OUTPUT <filename>,a ; appendExample 5.33. bigfile.asm
OUTPUT loader.com +OUTPUT <filename>,a ; appendExample 5.33. bigfile.asm
OUTPUT loader.com ORG 100H INCLUDE loader.asm INCLUDE bios.asm @@ -743,17 +746,17 @@ following files are created:Bigfile.out ; file length is zero Loader.com ; contains loader.asm and bios.asm Bigfile.dat ; contains main.asm and data.asm- PAGE <number>
Work only in real device emulation mode. See - DEVICE.
Set the current memory page to current slot.
Example 5.34.
PAGE 7 ;set 7 page + DEVICE.Set the current memory page to current slot.
Example 5.34.
PAGE 7 ;set 7 page SAVEBIN "ram7.bin",$C000,$4000 ;- save $4000 begin from $C000 of RAM to file
- PHASE
Synonym of DISP.
- REPT <count>
Synonym of DUP.
- SAVEBIN <filename>,<startadress>,<lengthofcode>
Work only in real device emulation mode. See - DEVICE.
Save the block of RAM.
Example 5.35.
PAGE 7 ;set 7 page to current slot + DEVICE.Save the block of RAM.
Example 5.35.
PAGE 7 ;set 7 page to current slot SAVEBIN "ram7.bin",$C000,$4000 ;- save 4000h begin from C000h of RAM to file SAVEBIN "ram2.bin",$8000,$3000 ;- save 3000h begin from 8000h of RAM to file
- SAVEHOB <filename>,<filename_in_trdos>,<startadress>,<lengthofcode>
Work only in real device emulation mode. See - DEVICE.
Save the block of RAM in Hobeta format.
Example 5.36.
PAGE 7 ;set 7 page to current slot + DEVICE.Save the block of RAM in Hobeta format.
Example 5.36.
PAGE 7 ;set 7 page to current slot SAVEHOB "ram7.$c","myfile1.C",$C000,$4000 ;- save 4000h begin from C000h of RAM to file SAVEHOB "ram2.$c","myfile2.C",$8000,$3000 ;- save 3000h begin from 8000h of RAM to file
- SAVESNA <filename>,<startadressofprogram>
Work only in real device emulation mode. See - DEVICE.
Save the snapshot for emulators of ZX-Spectrum.
Example 5.37.
DEVICE ZXSPECTRUM128 + DEVICE.Save the snapshot for emulators of ZX-Spectrum.
Example 5.37.
DEVICE ZXSPECTRUM128 ORG $8000 START .... ;something code RET @@ -763,7 +766,7 @@SAVETAP <filename>,CHARS,<fileintapeheader>,<start>,<length>[,<variableletter(A..Z)>]
SAVETAP <filename>,HEADLESS,<start>,<length>[,<customblockflag(0..255)>]
Work only in real device emulation mode. See DEVICE.
Append the tape header or block of data to the end of the - standard tape file for emulators of ZX-Spectrum.
Example 5.38.
DEVICE ZXSPECTRUM48 + standard tape file for emulators of ZX-Spectrum.Example 5.38.
DEVICE ZXSPECTRUM48 ... EMPTYTAP "output.tap" @@ -779,26 +782,26 @@ SAVETAP "output.tap",HEADLESS,start,length
- SAVETAP <filename>,<startadressofprogram>
Work only in real device emulation mode. See DEVICE.
Save the tape file for emulators of ZX-Spectrum as a "snapshot" of whole memory. Generated tape file supports the - ZX-Spectrum clones with extended RAM such as ATM Turbo 512, etc.
Example 5.39.
DEVICE ZXSPECTRUM48 + ZX-Spectrum clones with extended RAM such as ATM Turbo 512, etc.Example 5.39.
DEVICE ZXSPECTRUM48 ORG $8000 START .... ;something code RET SAVETAP "game.tap",START ; save tape-snapshot to file game.tap. Start address is START ($8000)
- SAVETRD <filenameoftrdimage>,<filename_in_trdos>,<startadress>,<lengthofcode>
Work only in real device emulation mode. See - DEVICE.
Save the snapshot for emulators of ZX-Spectrum
Example 5.40.
EMPTYTRD "test.trd" ;create empty TRD image + DEVICE.Save the snapshot for emulators of ZX-Spectrum
Example 5.40.
EMPTYTRD "test.trd" ;create empty TRD image PAGE 7 ;set 7 page to current slot SAVETRD "test.trd","myfile1.C",$C000,$4000 ;- save 4000h begin from C000h of RAM to file to TRD image SAVETRD "test.trd","myfile2.C",$8000,$3000 ;- save 3000h begin from 8000h of RAM to file to TRD image
- SHELLEXEC <filename>[,<parameters>]
Execute external program <filename> using optional - command line <parameters>.
Example 5.41.
OUTPUT "mybin.bin" + command line <parameters>.Example 5.41.
OUTPUT "mybin.bin" ;some code IF ((_ERRORS = 0) + (_WARNINGS = 0)) SHELLEXEC "x:/somepath/bin2tap.exe mybin.bin mytap.tap" ; or SHELLEXEC "x:/somepath/bin2tap.exe","mybin.bin mytap.tap" ENDIF
- SIZE <filesize in bytes>
If the resulting file is less than the given length, as - many bytes are added as necessary. See OUTPUT for more.
- SLOT <number>
Work only in real device emulation mode. See + many bytes are added as necessary. See OUTPUT for more.
- SLOT <number>
Work only in real device emulation mode. See DEVICE.
Set current slot. Slot's defined by MEMORYMAP pseudo-op. Use pseudo-op PAGE to change page - in the current slot.
Example 5.43.
DEVICE ZXSPECTRUM128 + in the current slot.Example 5.43.
DEVICE ZXSPECTRUM128 SLOT 3 ;from 0C000h to 0FFFFh PAGE 1 ;set page 1 to slot 3 ORG 0C000h @@ -806,7 +809,7 @@ PAGE 2 INCBIN "somegfx.bin" ;....
- TAPEND
Ends generating compiler output to tape file block specified in TAPOUT.
- TAPOUT <filename>[,<flagbyte>]
Appends one tape block at the end of specified file. - All following code will be assembled to this tape file block.
Default value of flagbyte is 255.
Example 5.44. bigfile.asm
EMPTYTAP screen.tap + All following code will be assembled to this tape file block.Default value of flagbyte is 255.
Example 5.44. bigfile.asm
EMPTYTAP screen.tap TAPOUT screen.tap,0 DB 3 @@ -818,7 +821,7 @@ TAPOUT screen.tap INCBIN screen.bin - TAPEND
This will create tap file with the screen.- TEXTAREA <address>
Synonym of DISP.
- UNDEFINE <id>
Removes the identifier defined by DEFINE
This will create tap file with the screen.- TEXTAREA <address>
Synonym of DISP.
- UNDEFINE <id>
Removes the identifier defined by DEFINE
Example 5.45.
DEFINE Release 1 IFDEF Release DISPLAY "Building release version" @@ -839,23 +842,23 @@ IFNDEF _SJASMPLUS DISPLAY "It's not the sjasmplus??" ENDIF
- UNPHASE
Synonym of ENT.
- WORD <words>
Defines a word. Values should be between -32787 and - 65536.
It may be useful to assemble a part or not based on a certain condition.
- IF <expression>
If <expression> is non-zero the following lines are assembled until an ELSE or ENDIF.
- IFN <expression>
If <expression> is zero the following lines are assembled until an ELSE or ENDIF.
- IFDEF <id>
The condition is true if there is an id defined. These are - NOT labels.
Example 5.47. Example
IFDEF MSX_LEAN_AND_MEAN + NOT labels.
- IFNDEF <id>
The condition is true if there isn't an id defined. These - are NOT labels.
Example 5.48. Example
1 IN A,(0C4H) + are NOT labels.
- IFUSED <label>
The condition is true if there is an label used somewhere in the code. You can create libraries of useful functions using - IFUSED pseudo-op
Example 5.49. Example
OUTPUT "TEST.OUT" + IFUSED pseudo-opExample 5.49. Example
OUTPUT "TEST.OUT" CALL LABEL3 ; LABEL3 - yes LD A,(LABEL1) ; LABEL1 - yes @@ -897,14 +900,14 @@ by an ENDIF.The MACRO pseudo-op defines a macro. It should be followed by the name of the macro, optionally followed by the parameters. The following lines will be stored as the macro-body until an ENDM pseudo-op is - encountered. Macro's have to be defined before their use.
Example 5.50. Macro without parameters
MACRO ADD_HL_A + encountered. Macro's have to be defined before their use.
Labels in a macro starting with a dot are local to each macro - expansion.
Example 5.51. A macro with parameters
MACRO WAVEOUT reg, data + expansion.Example 5.51. A macro with parameters
MACRO WAVEOUT reg, data LD A,reg OUT (7EH),A LD A,data @@ -916,7 +919,7 @@ LD A,2 OUT (7EH),A LD A,17 - OUT (7FH),A
Example 5.52. Another example
MACRO LOOP IF $-.lus<127 DJNZ .lus ELSE @@ -934,7 +937,7 @@ .lus ; Main.lus CALL DoALot DJNZ .lus ; Main.lus
Angle brackets can be used when the arguments contain - commas.
Example 5.53.
MACRO UseLess data + commas.Example 5.53.
MACRO UseLess data DB data ENDM @@ -969,14 +972,14 @@ declared. (DD and DEFD may be used instead of WORD).- BLOCK <length>[,<fillbyte>]]
To define an member of the specified number of bytes. ('#', DS and DEFS may be used instead of WORD).
- ALIGN [<expression>]
To align the offset. If the expression is omitted, 4 is assumed. ('##' May be used instead of ALIGN).
- <structure name> [<init values>]
It is possible to nest structures, and give new defaults - for the BYTE and WORD members.
Example 6.1.
STRUCT SCOLOR RED BYTE 4 GREEN BYTE 5 BLUE BYTE 6 ENDSThis is identical to:
SCOLOR EQU 3 ; lenght SCOLOR.RED EQU 0 ; offset SCOLOR.GREEN EQU 1 ; offset -SCOLOR.BLUE EQU 2 ; offset
Example 6.2.
STRUCT SDOT X BYTE Y BYTE C SCOLOR 0,0,0 ; use new default values @@ -988,7 +991,7 @@ SDOT.C.RED EQU 2 ; offset SDOT.C.GREEN EQU 3 ; offset SDOT.C.BLUE EQU 4 ; offset -
Example 6.3.
STRUCT SPOS,4 X WORD Y BYTE ALIGN 2 @@ -996,7 +999,7 @@ ENDSThis is identical to:
SPOS EQU 10 ; length SPOS.X EQU 4 ; offset SPOS.Y EQU 6 ; offset -SPOS.AD EQU 8 ; offset
Why is scripting engine as Lua embedded to the compiler? Answer is simple: It need to add extra features by users. And to whole other Lua is enough small, fast and - powerful scripting engine.
You must use LUA and ENDLUA pseudo-ops.
Example 7.1. Hello World!
LUA + powerful scripting engine.From Lua you can control some variables and use functions of the compiler. Complete list:
- [integer] _c("expression")
Calculate expression using calculator of the compiler. @@ -1063,7 +1066,7 @@ unpack. This allows you to unpack values in a loop or in several steps. If the position returned by unpack is beyond the end of s, then s has been exhausted; any calls to unpack starting beyond the end of s will - always return nil values.
List of types for F string:
- z
zero-terminated string
- p
string preceded by length byte
- P
string preceded by length word
- a
string preceded by length size_t
- A
string
- f
float
- d
double
- n
Lua number
- c
char
- b
byte = unsigned char
- h
short = word
- H
unsigned short
- i
int
- I
unsigned int
- l
long
- L
unsigned long
- <
little endian
- >
big endian
- =
native endian
Example 7.2. Variables doesn't clear in new passes of the compiler
LUA PASS1 + always return nil values.List of types for F string:
- z
zero-terminated string
- p
string preceded by length byte
- P
string preceded by length word
- a
string preceded by length size_t
- A
string
- f
float
- d
double
- n
Lua number
- c
char
- b
byte = unsigned char
- h
short = word
- H
unsigned short
- i
int
- I
unsigned int
- l
long
- L
unsigned long
- <
little endian
- >
big endian
- =
native endian
Example 7.2. Variables doesn't clear in new passes of the compiler
LUA PASS1 v = 1 ENDLUA @@ -1076,7 +1079,7 @@ LUA PASS3 print (v) -- out to console: 2 - ENDLUA
Example 7.3. To generate some code you need to generate it in all passes
LUA ALLPASS _pl("ClearScreen LD (.savesp+1),SP") _pc("LD SP,16384+6144") @@ -1086,7 +1089,7 @@ end _pl(".savesp: LD SP,0") _pc("RET") - ENDLUA
Example 7.4. Declare function and use it
LUA function savetape_mytype(filename, startaddress) local fp fp = assert(io.open(fname, "wb")) @@ -1105,7 +1108,7 @@ ;somewhere in your program LUA savetape_mytype("tapefiles/myprogram.tape", _c("StartGameLabel")) - ENDLUA
Example 7.5. Simple sample :)
LUA -- Function reads number from file <fname>, increases it, creates define "BUILD" with the number and saves the number to <fname>. -- With this function you can control count of compilations. function increase_build(fname) diff --git a/docs/documentation.xml b/docs/documentation.xml index d8648dd6..49f2c979 100644 --- a/docs/documentation.xml +++ b/docs/documentation.xml @@ -2,7 +2,7 @@- SjASMPlus 1.10.3 Documentation [2018-11-26] +SjASMPlus 1.10.4 Documentation [2019-01-09] Introduction @@ -179,6 +179,17 @@+ + +09.01.2019 - 1.10.4 + ++ ++ - "Bytes lost" error reworked (and changed to warning) +- Error/warning messages are displayed in last pass only (where possible) +- Fixed 64k limit warnigs +- BinIncFile reworked 26.11.2018 - 1.10.3 diff --git a/sjasm/sjdefs.h b/sjasm/sjdefs.h index 174d82a5..c886efbc 100644 --- a/sjasm/sjdefs.h +++ b/sjasm/sjdefs.h @@ -30,7 +30,7 @@ #define __SJDEFS // version string -#define VERSION "1.10.3" +#define VERSION "1.10.4" // not used #define MAXPASSES 3