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 1.10.3 Documentation [2018-11-26]

SjASMPlus 1.10.3 Documentation [2018-11-26]


1. Introduction
License
What is it?
Main Features
Credits
Feedback
What's new?
2. Where to get and how to use
Packages
Command line
Source file format
3. Labels
Labels
Local labels
@ Labels
Temporary labels
4. Constants, expressions and other features
Numeric constants
Character and string constants
Expressions
Assembly language
Fake instructions
Real device emulation mode
Predefined defines
5. Pseudo-ops (aka Pseudo-instructions, Directives etc)
Simple example of usage
Almost complete list
Conditional assembly
Macro's
6. Structures
What is it?
Using
Instructions
Examples
7. Lua scripting
Why?
How to use?
SjASMPlus binded functions
Third-party embedded library(ies)
Example

Chapter 1. Introduction

License

SjASMPlus licensed under BSD license.

What is it?

SjASMPlus is Z80 Assembly Language Cross Compiler. It is available +SjASMPlus 1.10.4 Documentation [2019-01-09]

SjASMPlus 1.10.4 Documentation [2019-01-09]


Chapter 1. Introduction

License

SjASMPlus licensed under BSD license.

What is it?

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)

Main Features

  • 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!

Feedback

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

What's new?

26.11.2018 - 1.10.3
- Fixed macro issue with commas inside quotes
+      (newer versions maintained by z00m and others)

E-Mail: my@aprisobal.by, zoom@centrum.sk

What's new?

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
- 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
09.08.2018 - 1.10.2
- 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.

Predefined defines

SjASMPlus has predefined defines.

_SJASMPLUS = 1

Example 4.3. 

   IFDEF _SJASMPLUS
+              Has 64 RAM pages (0-63) with size 4000h.

If you want to see other devices you must write to us. See Feedback chapter.

Predefined defines

SjASMPlus has predefined defines.

_SJASMPLUS = 1

Example 4.3. 

   IFDEF _SJASMPLUS
      ;code for sjasmplus
    ELSE
      ;code for other compiler
-   ENDIF


_VERSION = "version"

Example 4.4. 

   IF _VERSION = "1.07"
+   ENDIF


_VERSION = "version"

Example 4.4. 

   IF _VERSION = "1.07"
      ;code for 1.07
    ELSE
      ;code for other version
-   ENDIF


_RELEASE = releasenumber

Example 4.5. 

   IF _RELEASE = 1 ; 0 - is stable version
+   ENDIF


_RELEASE = releasenumber

Example 4.5. 

   IF _RELEASE = 1 ; 0 - is stable version
      ;code for Release Candidate 1
    ELSE
      ;code for other version
    ENDIF


_ERRORS = <number>

Number of errors.

_WARNINGS = <number>

Number of warnings.

Chapter 5. Pseudo-ops (aka Pseudo-instructions, Directives etc)

Simple example of usage

     .SOMEPSEUDOOP ;or
      SOMEPSEUDOOP  ;or
      somepseudoop

Almost complete list

.<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.

Example 5.2. 

    ABYTE 2 4,9    ; Same as BYTE 6,11
     ABYTE 3 "ABC"  ; Same as BYTE "DEF"


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.

Example 5.4. 

    ABYTEZ 0 "KIP"        ; Same as BYTE "KIP",0


ALIGN + The offset is added to each of the following bytes.

Example 5.4. 

    ABYTEZ 0 "KIP"        ; Same as BYTE "KIP",0


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.

Example 5.6. 

STACKPOINTER=0D500H
     ASSERT END_OF_PROGRAM < STACKPOINTER
 END_OF_PROGRAM
     END


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.

Example 5.8. 

    BYTE 0x56
     BYTE 1,-78,'@'
     BYTE "Format C:? ",0h


DB

Synonym of BYTE.

DC

Same as BYTE, but every - last character of a string will have bit 7 set.

Example 5.9. 

    DC "kip" ; same as BYTE "ki",'p'|128


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.

Example 5.9. 

    DC "kip" ; same as BYTE "ki",'p'|128


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.

Example 5.11. 

    DEFINE str_honderd "Honderd"
     BYTE str_honderd,0             ; BYTE "Honderd",0


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 ENT

Example 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 Decimal

Example 5.13. 

    ORG 100h
+/A - out both in Hexadecimal and Decimal

Example 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.

Example 5.14. 

    DUP 3
     NOP
     EDUP
 /*this will expand to:
@@ -592,9 +595,9 @@
     NOP
     NOP
 */


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.

Example 5.15. 

    DWORD 4000h,0d000h
     DWORD 4


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.

Example 5.16. 

    DZ 1      ; same as BYTE 1,0
     DZ "kip"  ; same as BYTE "kip",0


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.

Example 5.18. 

    MODULE M1
 A                 ; M1.A
     MODULE M2
 A                 ; M2.A
@@ -619,15 +622,15 @@
 B                 ; M1.B
     ENDMODULE


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.

Example 5.19. 

Label EQU 3
 Kip=3


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.

Example 5.20. 

DRIE=3
     EXPORT DRIE


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.

Example 5.25. 

    INCLUDE <VDP.I>
     INCLUDE MORE.I
     INCLUDE "MORE.I"


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.

Example 5.26. 

    INCLUDELUA <mylibrary1.lua>
     INCLUDELUA mylibrary2.lua
     INCLUDELUA "library_for_zx.lua"


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

Example 5.28. 

    LABELSLIST "x:/somepath/user.l"


LUA [pass]

Using pseudo-ops LUA and ENDLUA you can insert Lua + ,where NN is number of page of RAM

Example 5.28. 

    LABELSLIST "x:/somepath/user.l"


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.

Example 5.30. 

    MAP 5


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.

Example 5.30. 

    MAP 5


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.

Example 5.32. 

    ORG 100h ; or 0x100, or $100, or #100
+Kip                ; label Kip


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  ; append

Example 5.33. bigfile.asm

    OUTPUT loader.com
+OUTPUT <filename>,a  ; append

Example 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.

Example 5.42. 

    SIZE 32768       ; make sure file will be 32K


SLOT <number>

Work only in real device emulation mode. See + many bytes are added as necessary. See OUTPUT for more.

Example 5.42. 

    SIZE 32768       ; make sure file will be 32K


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

Example 5.45. 

    DEFINE Release 1
+    TAPEND


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.

Example 5.46. 

    WORD 4000h,0d000h
+              65536.

Example 5.46. 

    WORD 4000h,0d000h
     WORD 4,"HA"


Conditional assembly

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.

Example 5.47. Example

    IFDEF MSX_LEAN_AND_MEAN
         CALL InitOwnMM
     ELSE
         CALL InitDos2MemMan
     ENDIF


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.

Example 5.48. Example

1   IN A,(0C4H)
     AND 2
     IFNDEF DEBUG
         JR NC,1B
     ENDIF


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-op

Example 5.49. Example

    OUTPUT "TEST.OUT"
 
     CALL LABEL3 ; LABEL3 - yes
     LD A,(LABEL1) ; LABEL1 - yes
@@ -897,14 +900,14 @@
               by an ENDIF.

Macro's

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.

Example 5.50. Macro without parameters

  MACRO ADD_HL_A
     ADD A,L
     JR NC,.hup
     INC H
 .hup
     LD L,A
   ENDM


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
+  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.

Examples

Example 6.1. 

	STRUCT SCOLOR
+              for the BYTE and WORD members.

Examples

Example 6.1. 

	STRUCT SCOLOR
 RED	BYTE 4
 GREEN	BYTE 5
 BLUE	BYTE 6
 	ENDS

This 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
+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
+


Example 6.3. 

	STRUCT SPOS,4
 X	WORD
 Y	BYTE
 	ALIGN 2
@@ -996,7 +999,7 @@
 	ENDS

This is identical to:

SPOS	EQU 10 ; length
 SPOS.X	EQU  4 ; offset
 SPOS.Y	EQU  6 ; offset
-SPOS.AD	EQU  8 ; offset


Example 6.4. 

When a structure is defined it is possible to declare labels +SPOS.AD EQU 8 ; offset


Example 6.4. 

When a structure is defined it is possible to declare labels with it

COLOR SCOLOR

This is identical to:

COLOR
 COLOR.RED   BYTE 4
@@ -1023,7 +1026,7 @@
               this:

LD A,(+SDOT.X)


Chapter 7. Lua scripting

Why?

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.

How to use?

You must use LUA and ENDLUA pseudo-ops.

Example 7.1. Hello World!

    LUA
+      powerful scripting engine.

How to use?

You must use LUA and ENDLUA pseudo-ops.

Example 7.1. Hello World!

    LUA
         print ("Hello World!")
     ENDLUA


SjASMPlus binded functions

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

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

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 + 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
+    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
+     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