Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Basic writing library ;; Busy soft ;; 14.04.2022 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; This library can be used for (relative)
;; easy writing basic programs in SjASMPlus.
;;
;; Macros:
;;
;;   LINE ... begin of basic line
;;   LEND ... end of basic line
;;   NUM .... include number value into basic
;;
;; Control variables:
;;
;;   line_useval ... Enable use VAL "..." for macro NUM
;;   line_number ... Actual line number for actual basic line
;;   line_step ..... Increment for automatic numbering of lines
;;
;; Typical usage ...
;;
;;   LINE : db bright : NUM 1        : LEND
;;   LINE : db print,'"Hello world"' : LEND
;;
;; ... generates this program:
;;
;;   10 BRIGHT 1
;;   20 PRINT "Hello world"
;;
;; Please see examples for more info.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Basic token definitions
;;
;;  Note:  absx notx orx andx  are used
;;  due to conflict with SjASMPlus operators
;;
;;  If you have conflict with another labels
;;  you can encapsulate your basic by this way:
;;
;;    MODULE basic
;;      INCLUDE BasicLib.asm
;;      LINE : ...... : LEND
;;      LINE : ...... : LEND
;;    ENDMODULE

spectrum        equ     #A3
play            equ     #A4
rnd             equ     #A5
inkey           equ     #A6
pi              equ     #A7
fn              equ     #A8
point           equ     #A9
screen          equ     #Aa
attr            equ     #Ab
at              equ     #Ac
tab             equ     #Ad
valS            equ     #Ae
code            equ     #Af
val             equ     #B0
len             equ     #B1
sin             equ     #B2
cos             equ     #B3
tan             equ     #B4
asn             equ     #B5
acs             equ     #B6
atn             equ     #B7
ln              equ     #B8
exp             equ     #B9
int             equ     #Ba
sqr             equ     #Bb
sgn             equ     #Bc
absx            equ     #Bd
peek            equ     #Be
in              equ     #Bf
usr             equ     #C0
str             equ     #C1
chr             equ     #C2
notx            equ     #C3
bin             equ     #C4
orx             equ     #C5
andx            equ     #C6
line            equ     #Ca
then            equ     #Cb
to              equ     #Cc
step            equ     #Cd
deffn           equ     #Ce
cat             equ     #Cf
format          equ     #D0
move            equ     #D1
erase           equ     #D2
open            equ     #D3
close           equ     #D4
merge           equ     #D5
verify          equ     #D6
beep            equ     #D7
circle          equ     #D8
ink             equ     #D9
paper           equ     #Da
flash           equ     #Db
bright          equ     #Dc
inverse         equ     #Dd
over            equ     #De
out             equ     #Df
lprint          equ     #E0
llist           equ     #E1
stop            equ     #E2
read            equ     #E3
data            equ     #E4
restore         equ     #E5
new             equ     #E6
border          equ     #E7
cont            equ     #E8
continue        equ     #E8
dim             equ     #E9
rem             equ     #Ea
for             equ     #Eb
goto            equ     #Ec
gosub           equ     #Ed
input           equ     #Ee
load            equ     #Ef
list            equ     #F0
let             equ     #F1
pause           equ     #F2
next            equ     #F3
poke            equ     #F4
print           equ     #F5
plot            equ     #F6
run             equ     #F7
save            equ     #F8
rand            equ     #F9
randomize       equ     #F9
if              equ     #Fa
cls             equ     #Fb
draw            equ     #Fc
clear           equ     #Fd
return          equ     #Fe
copy            equ     #Ff

;; Basic UDG definitions

udg_a     equ   #90     ;; 144
udg_b     equ   #91     ;; 145
udg_c     equ   #92     ;; 146
udg_d     equ   #93     ;; 147
udg_e     equ   #94     ;; 148
udg_f     equ   #95     ;; 149
udg_g     equ   #96     ;; 150
udg_h     equ   #97     ;; 151
udg_i     equ   #98     ;; 152
udg_j     equ   #99     ;; 153
udg_k     equ   #9A     ;; 154
udg_l     equ   #9B     ;; 155
udg_m     equ   #9C     ;; 156
udg_n     equ   #9D     ;; 157
udg_o     equ   #9E     ;; 158
udg_p     equ   #9F     ;; 159
udg_q     equ   #A0     ;; 160
udg_r     equ   #A1     ;; 161
udg_s     equ   #A2     ;; 162
udg_t     equ   #A3     ;; 163
udg_u     equ   #A4     ;; 164

;; Basic control codes

comma     equ   #06     ;; db print,'"X',comma,'Y"'
left      equ   #08     ;; db print,'"',border,left,left,'L V',border,left,'I"'
right     equ   #09     ;; (does not work due to bug in zx rom)
enter     equ   #0D     ;; end of basic line, cannot be used inside of line normally
number    equ   #0E     ;; db '65535',number,0,0,#FF,#FF,0   ;;   But you can use: NUM 65535
s_ink     equ   #10     ;; db print,'"',s_ink    ,2,'Hello world!"'
s_paper   equ   #11     ;; db print,'"',s_paper  ,5,'Hello world!"'
s_flash   equ   #12     ;; db print,'"',s_flash  ,1,'Hello world!"'
s_bright  equ   #13     ;; db print,'"',s_bright ,1,'Hello world!"'
s_inverse equ   #14     ;; db print,'"',s_inverse,1,'Hello world!"'
s_over    equ   #15     ;; db print,'"',s_over   ,1,'Hello world!"'
s_at      equ   #16     ;; db print,'"',s_at,10,10 ,'Hello world!"'
s_tab     equ   #17     ;; db print,'"',s_tab,10,0 ,'Hello world!"'

;; Default setting of control variables

line_useval     =       0
line_number     =       10
line_step       =       10

;; Begin of basic line

LINE  MACRO
        ASSERT line_number < #4000 , Line number overflows
        db      high line_number
        db      low line_number
        LUA ALLPASS
        sj.parse_code('dw line_' .. tostring(sj.calc("line_number")) .. '_length')
        sj.parse_line(   'line_' .. tostring(sj.calc("line_number")) .. '_begin')
        ENDLUA
      ENDM

;; End of basic line

LEND  MACRO
        db      #0D
        LUA ALLPASS
        sj.parse_line('line_'
                .. tostring(sj.calc("line_number"))
                .. '_length = $ - line_'
                .. tostring(sj.calc("line_number"))
                .. '_begin')
        ENDLUA
line_number  =  line_number + line_step
      ENDM

;; Include number value into basic line

NUM   MACRO     value
        IF line_useval
          db    val,'"'
        ENDIF
          LUA ALLPASS
          sj.parse_code('db     "' .. tostring(sj.calc("value")) .. '"')
          ENDLUA
        IF line_useval
          db    '"'
        ELSE
          db    #0E,0,0
          dw    value
          db    #00
        ENDIF
      ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;