1
0
mirror of https://github.com/pfusik/xasm.git synced 2024-06-07 11:29:32 +00:00

X-Assembler 2.3.-5.

This commit is contained in:
Piotr Fusik 1999-08-29 13:43:20 +02:00
parent 0c019b97d1
commit 83d6d7d0ac

318
xasm.asm
View File

@ -121,6 +121,18 @@ MACRO file _func, _errtx
call xdisk call xdisk
ENDM ENDM
MACRO jfile _func, _errtx
IFNB <_errtx>
mov [errmsg], offset _errtx
ENDIF
IF _func and 0ff00h
mov ax, _func
ELSE
mov ah, _func
ENDIF
jmp xdisk
ENDM
MACRO print _text MACRO print _text
IFNB <_text> IFNB <_text>
mov dx, offset _text mov dx, offset _text
@ -273,7 +285,7 @@ gsw1: lodsb ; pobierz switche
mov di, offset swilet mov di, offset swilet
mov cx, 8 mov cx, 8
repne scasb repne scasb
jne usg ; nie ma takiego switcha neusg: jne usg ; nie ma takiego switcha
bts [word swits], cx ; sprawdz bit i ustaw bts [word swits], cx ; sprawdz bit i ustaw
jc usg ; juz byl taki jc usg ; juz byl taki
mov di, offset lstnam mov di, offset lstnam
@ -287,7 +299,7 @@ gsw1: lodsb ; pobierz switche
cmp al, 'O' cmp al, 'O'
jne gsw1 ; switch bez parametru jne gsw1 ; switch bez parametru
cmp [byte si], ':' cmp [byte si], ':'
jne usg ; /O wymaga ':' jne neusg ; /O wymaga ':'
mov di, offset objnam mov di, offset objnam
mov ecx, 'XBO' mov ecx, 'XBO'
@ -425,7 +437,7 @@ gline1: cmp di, offset line+256
jz eof jz eof
mov al, [di] mov al, [di]
cmp al, 0dh ; pc cr cmp al, 0dh ; pc cr
je syntax je short syntax
cmp al, 0ah ; unix lf cmp al, 0ah ; unix lf
je syntax je syntax
cmp al, 9bh ; atari eol cmp al, 9bh ; atari eol
@ -433,23 +445,7 @@ gline1: cmp di, offset line+256
inc di inc di
jmp gline1 jmp gline1
eof: mov bx, [iclen] ; koniec pliku skip1: call get ; falszywy warunek - omin etykiete ...
or [(icl bx).flags], m_eofl
syntax: call lspeol ; zapisz CR/LF i zapamietaj dlugosc linii
mov si, offset line
mov al, [si]
cmp al, '*'
je lstrem
cmp al, ';'
je lstrem
cmp al, '|'
je lstrem
cmp al, 0dh
je lsteol
testfl m_skip
jz nskip ; czy byl falszywy warunek ?
skip1: call get ; ... tak - omin etykiete ...
cmp al, ' ' cmp al, ' '
je skip2 je skip2
cmp al, 9 cmp al, 9
@ -472,27 +468,33 @@ skip2: call space1 ; omin spacje
resfl m_skip resfl m_skip
inc [sift] ;0 inc [sift] ;0
skret: ret skret: ret
skift: call shlelf skift: inc [sift]
inc [sift] shlelf: shl [elflag], 1
ret jnc skret
error e_tmift
skels: call btself skels: call btself
cmp [sift], 0 cmp [sift], 0
jnz skret jnz skret
jmp fliski jmp fliski
lstrem: call chklst eof: mov bx, [iclen] ; koniec pliku
jnz main or [(icl bx).flags], m_eofl
mov di, offset lstspa+1
call putlsp
jmp main
lsteol: call chklst
jnz main
mov di, offset lstspa
call lspeol
call putlnm
jmp main
nskip: mov [labvec], 0 syntax: call lspeol ; zapisz CR/LF i zapamietaj dlugosc linii
mov si, offset line ; asembluj linie
mov al, [si]
cmp al, '*'
je lstrem
cmp al, ';'
je lstrem
cmp al, '|'
je lstrem
cmp al, 0dh
je lsteol
testfl m_skip
jnz skip1 ; czy byl falszywy warunek ?
mov [labvec], 0 ; ... nie
cmp al, ' ' cmp al, ' '
je s_one je s_one
cmp al, 9 cmp al, 9
@ -503,8 +505,19 @@ nskip: mov [labvec], 0
call getuns call getuns
jc unknow jc unknow
test ax, ax test ax, ax
jz lstrem jnz s_cmd
jmp s_cmd
lstrem: call chklst
jnz jmain
mov di, offset lstspa+1
call putlsp
jmain: jmp main
lsteol: call chklst
jnz jmain
mov di, offset lstspa
call lspeol
call putlnm
jmp main
labdef: jpass2 deflp2 ; jest etykieta labdef: jpass2 deflp2 ; jest etykieta
call flabel ; definicja etykiety w pass 1 call flabel ; definicja etykiety w pass 1
@ -575,7 +588,7 @@ rdcmd3: lodsw ; wez trzy litery
cmp [byte high labvec], 0 cmp [byte high labvec], 0
je lbnox ; ... a jest etykieta ... je lbnox ; ... a jest etykieta ...
cmp eax, 'EQU' shl 8 cmp eax, 'EQU' shl 8
jne noorg ; ... to dozwolony jest tylko EQU call nenorg ; ... to dozwolony jest tylko EQU
lbnox: inc si lbnox: inc si
cmp [byte si], ':' ; czy para instrukcji? cmp [byte si], ':' ; czy para instrukcji?
jne nopair jne nopair
@ -651,6 +664,7 @@ ckcmd5: setfl m_repa
mov [reporg], ax mov [reporg], ax
jz rncmd2 jz rncmd2
setfl m_skit ; pseudo instrukcja omijania setfl m_skit ; pseudo instrukcja omijania
mov [obuf], 2
mov al, [(com di+bx).c_code] mov al, [(com di+bx).c_code]
call savbyt call savbyt
jmp encmd2 jmp encmd2
@ -849,7 +863,7 @@ nlata: call lclose
call pridec call pridec
print byttxt print byttxt
zrbyt: mov ax, [exitcod] zrbyt: mov ax, [exitcod]
; dos ;!!!!!! ; dos ;!!!
; I/O ; I/O
xdisk: dos xdisk: dos
@ -865,8 +879,7 @@ lclose: mov bx, nhand ; mov bx, [lhand]
mov [errmsg], offset e_wrlst mov [errmsg], offset e_wrlst
hclose: cmp bx, nhand hclose: cmp bx, nhand
je cloret je cloret
file 3eh jfile 3eh
cloret: ret
fopen: cmp di, offset t_icl+l_icl-2 fopen: cmp di, offset t_icl+l_icl-2
jnb icler jnb icler
@ -880,7 +893,7 @@ fopen: cmp di, offset t_icl+l_icl-2
mov bx, [iclen] mov bx, [iclen]
mov bx, [(icl bx).prev] mov bx, [(icl bx).prev]
mov [(icl bx).handle], ax mov [(icl bx).handle], ax
ret cloret: ret
fread1: mov dx, di fread1: mov dx, di
mov cx, 1 mov cx, 1
@ -930,8 +943,8 @@ orgwor: push ax
jmp putwor jmp putwor
chorg: testfl m_norg chorg: testfl m_norg
jz putx nenorg: jz putx
noorg: error e_norg error e_norg
tmorgs: error e_orgs tmorgs: error e_orgs
@ -1095,8 +1108,7 @@ spatax: call lsplen
putlst: mov dx, offset lstnum putlst: mov dx, offset lstnum
mov cx, [linlen] mov cx, [linlen]
putlad: mov bx, [lhand] putlad: mov bx, [lhand]
file 40h, e_wrlst jfile 40h, e_wrlst
ret
opnlst: mov dx, offset lstnam opnlst: mov dx, offset lstnam
opntab: xor cx, cx opntab: xor cx, cx
@ -1289,16 +1301,21 @@ getval: xor bx, bx
v_lop: v_lop:
v_par1: inc bh v_par1: inc bh
call get v_par0: call get
cmp al, '[' cmp al, '['
je v_par1 je v_par1
cmp al, '(' mov di, offset opert0
mov cx, noper0
repne scasb
jne v_n1a
sub di, offset opert0-noper1-noper2
call goprpa
push di bx
jmp v_par0
v_n1a: cmp al, '('
je wropar je wropar
cmp al, '-'
je valuem
dec si dec si
mov al, '+'
valuem: mov bl, al
xor eax, eax xor eax, eax
call get call get
cmp al, '*' cmp al, '*'
@ -1429,10 +1446,7 @@ value0: dec si
test di, di test di, di
js ilchar js ilchar
lda edx lda edx
value1: cmp bl, '-' value1: push eax
jne value2
neg eax
value2: push eax
v_par2: dec bh v_par2: dec bh
js mbrack js mbrack
lodsb lodsb
@ -1457,24 +1471,22 @@ foper2: inc si
sub di, offset opert2 sub di, offset opert2
shr di, 1 shr di, 1
add di, noper1 add di, noper1
goper: lea ax, [di+operpa] goper: call goprpa
add di, di
add di, ax
mov bl, [di]
mov di, [di+1]
pop eax pop eax
v_com: pop cx v_com: pop cx
cmp cx, bx cmp cx, bx
jb v_xcm jb v_xcm
pop ecx
xchg eax, ecx
pop dx pop dx
push offset v_com cmp dx, offset v_1arg
jae v_r1a
sta ecx
pop eax
v_r1a: push offset v_com
push dx push dx
ret ret
v_xcm: cmp bl, 1 v_xcm: cmp bl, 1
jbe v_xit jbe v_xit
push cx di eax bx push cx eax di bx
jmp v_lop jmp v_lop
v_xit: mov [dword val], eax v_xit: mov [dword val], eax
cmp [ukp1], 1 cmp [ukp1], 1
@ -1585,7 +1597,7 @@ v_xor: xor eax, ecx ; ^
ret ret
v_equ: cmp eax, ecx ; = v_equ: cmp eax, ecx ; =
je v_one v_eq1: je v_one
v_zer: xor eax, eax v_zer: xor eax, eax
ret ret
v_one: mov eax, 1 v_one: mov eax, 1
@ -1620,6 +1632,30 @@ v_orl: or eax, ecx ; ||
jz v_ret jz v_ret
jmp v_one jmp v_one
; Operatory 1-argumentowe
v_1arg:
v_neg: neg eax
v_plu: ret
v_low: movzx eax, al
ret
v_hig: movzx eax, ah
ret
v_nol: test eax, eax
jmp v_eq1
v_not: not eax
ret
goprpa: lea ax, [di+operpa]
add di, di
add di, ax
mov bl, [di]
mov di, [di+1]
ret
; Pobierz operand rozkazu i rozpoznaj tryb adresowania ; Pobierz operand rozkazu i rozpoznaj tryb adresowania
getadr: call spaces getadr: call spaces
lodsb lodsb
@ -1700,8 +1736,7 @@ getai2: mov dx, 1
getaid: lodsb getaid: lodsb
cmp al, ',' cmp al, ','
je getaix je getaix
cmp al, ')' call chkpar
jne mparen
lodsw lodsw
mov dx, 1009h mov dx, 1009h
mov bl, 14h mov bl, 14h
@ -2125,11 +2160,7 @@ valuco: call getval
ret ret
badsin: error e_sin badsin: error e_sin
p_dta: call spaces dtan0: cmp al, 'A'
dta1: call get
and al, 0dfh
mov [cod], al
cmp al, 'A'
je dtan1 je dtan1
cmp al, 'B' cmp al, 'B'
je dtan1 je dtan1
@ -2137,17 +2168,30 @@ dta1: call get
je dtan1 je dtan1
cmp al, 'H' cmp al, 'H'
je dtan1 je dtan1
cmp al, 'C'
je dtat1
cmp al, 'D'
je dtat1
cmp al, 'R' cmp al, 'R'
je dtar1 jne dtab1
jmp ilchar jmp dtar1
dtan1: lodsb dtat0: cmp al, 'C'
cmp al, '(' je dtat1j
jne mparen cmp al, 'D'
jne dtab1
dtat1j: dec si
jmp dtat1
p_dta: call spaces
dta1: lodsw
and al, 0dfh
cmp ah, '('
je dtan0
cmp ah, "'"
je dtat0
cmp ah, '"'
je dtat0
dtab1: dec si
dec si
mov al, ' '
dtan1: mov [cod], al
dtan2: lodsd dtan2: lodsd
and eax, 0ffdfdfdfh and eax, 0ffdfdfdfh
@ -2177,8 +2221,7 @@ dtan2: lodsd
jb badsin jb badsin
mov [sinmax], ax mov [sinmax], ax
lodsb lodsb
cmp al, ')' call chkpar
jne mparen
presin: finit presin: finit
fldpi fldpi
fld st fld st
@ -2222,13 +2265,15 @@ dtans: call savbyt
dtanx: mov ax, [sinmin] dtanx: mov ax, [sinmin]
cmp ax, [sinmax] cmp ax, [sinmax]
jbe gensin jbe gensin
cmp [cod], ' '
je dtanxt
lodsb lodsb
cmp al, ',' cmp al, ','
je dtan2 je dtan2
cmp al, ')' dtanp: push offset dtanxt
je dtanxt chkpar: cmp al, ')'
je paret
mparen: error e_paren error e_paren
unknow: error e_uknow unknow: error e_uknow
@ -2262,12 +2307,10 @@ dtanxt: lodsb
cmp al, ',' cmp al, ','
je dta1 je dta1
dec si dec si
ret paret: ret
; Zapisz liczbe rzeczywista ; Zapisz liczbe rzeczywista
dtar1: lodsb dtar1:
cmp al, '('
jne mparen
dtar2: xor bx, bx dtar2: xor bx, bx
xor edx, edx xor edx, edx
xor cx, cx xor cx, cx
@ -2289,22 +2332,7 @@ dreal3: inc cx
jnc dreal3 jnc dreal3
cmp al, '.' cmp al, '.'
je drealp je drealp
and al, 0dfh jmp dreale
cmp al, 'E'
jne drealf
dreale: call getsgn
call getdig
jc ilchar
mov ah, al
call getdig
jnc dreal4
shr ax, 8
dreal4: aad
add di, di
jnc drealn
neg ax
drealn: add cx, ax
jmp drealf
dreal5: test edx, edx dreal5: test edx, edx
jnz dreal9 jnz dreal9
test bl, bl test bl, bl
@ -2313,9 +2341,23 @@ dreal5: test edx, edx
dreal9: call putdig dreal9: call putdig
drealp: call getdig drealp: call getdig
jnc dreal5 jnc dreal5
and al, 0dfh dreale: and al, 0dfh
cmp al, 'E' cmp al, 'E'
je dreale jne drealf
call getsgn
call getdig
jc ilchar
mov ah, al
call getdig
jnc dreal4
shr ax, 8
dec si
dreal4: inc si
aad
add di, di
jnc drealn
neg ax
drealn: add cx, ax
drealf: test edx, edx drealf: test edx, edx
jnz drealx jnz drealx
test bl, bl test bl, bl
@ -2344,8 +2386,8 @@ dreal7: cmp bl, al
jb dreal6 jb dreal6
dreal8: lda cx dreal8: lda cx
mov ah, bl mov ah, bl
dreals: rol edx, 16 rol edx, 16
push edx dreals: push edx
call savwor call savwor
pop ax pop ax
xchg ah, al xchg ah, al
@ -2357,9 +2399,7 @@ dreals: rol edx, 16
lodsb lodsb
cmp al, ',' cmp al, ','
je dtar2 je dtar2
cmp al, ')' jmp dtanp
jne mparen
jmp dtanxt
putdig: cmp bl, 10h putdig: cmp bl, 10h
jnb rlret jnb rlret
@ -2459,10 +2499,6 @@ p_end: pop ax
call linend call linend
jmp filend jmp filend
shlelf: shl [elflag], 1
jnc cndret
error e_tmift
btself: bts [elflag], 0 btself: bts [elflag], 0
jnc cndret jnc cndret
error e_eifex error e_eifex
@ -2604,34 +2640,42 @@ comtab: cmd ADC0060p_acc
comend: comend:
operpa: opr 1ret operpa: opr 1ret
opr 5add opr 6add
opr 5sub opr 6sub
opr 6mul opr 7mul
opr 6div opr 7div
opr 6mod opr 7mod
opr 6and opr 7and
opr 5or opr 6or
opr 5xor opr 6xor
opr 4equ opr 5equ
opr 4les opr 5les
opr 4grt opr 5grt
opr 6sal opr 7sal
opr 6sar opr 7sar
opr 4leq opr 5leq
opr 4geq opr 5geq
opr 4neq opr 5neq
opr 4neq opr 5neq
opr 3anl opr 3anl
opr 2orl opr 2orl
opr 8plu
opr 8neg
opr 8low
opr 8hig
opr 4nol
opr 8not
opert2 db '<<>><=>=<>!=&&||' opert2 db '<<>><=>=<>!=&&||'
noper2 = ($-opert2)/2 noper2 = ($-opert2)/2
opert1 db '+-*/%&|^=<>' opert1 db '+-*/%&|^=<>'
noper1 = $-opert1 noper1 = $-opert1
opert0 db '+-<>!~'
noper0 = $-opert0
swilet db 'TSONLIEC' swilet db 'TSONLIEC'
hello db 'X-Assembler 2.2 by Fox/Taquart',eot hello db 'X-Assembler 2.3.-5 by Fox/Taquart',eot
hellen = $-hello-1 hellen = $-hello-1
usgtxt db "Syntax: XASM source [options]",eol usgtxt db "Syntax: XASM source [options]",eol
db "/c List false conditionals",eol db "/c List false conditionals",eol