mirror of
https://github.com/pfusik/xasm.git
synced 2025-08-07 23:24:58 +00:00
X-Assembler 1.6.
This commit is contained in:
572
xasm.asm
572
xasm.asm
@@ -6,11 +6,11 @@
|
|||||||
CODESEG
|
CODESEG
|
||||||
ORG 100h
|
ORG 100h
|
||||||
start:
|
start:
|
||||||
db 4096 dup(0) ;for packing
|
db 5*1024 dup(0) ;for packing
|
||||||
|
|
||||||
l_icl = 1000
|
l_icl = 1000
|
||||||
l_org = 1000*2
|
l_org = 1000*2
|
||||||
l_lab = 50000
|
l_lab = 48000
|
||||||
|
|
||||||
STRUC com
|
STRUC com
|
||||||
cod db ?
|
cod db ?
|
||||||
@@ -28,6 +28,11 @@ nam db ?
|
|||||||
STRUC lab
|
STRUC lab
|
||||||
prev dw ?
|
prev dw ?
|
||||||
val dw ?
|
val dw ?
|
||||||
|
flags db ?
|
||||||
|
b_sign = 7
|
||||||
|
m_sign = 80h
|
||||||
|
m_lnus = 40h
|
||||||
|
m_ukp1 = 20h
|
||||||
nam db ?
|
nam db ?
|
||||||
ENDS
|
ENDS
|
||||||
|
|
||||||
@@ -42,12 +47,22 @@ m_eofl = 40h
|
|||||||
eol equ 13,10
|
eol equ 13,10
|
||||||
eot equ 13,10,'$'
|
eot equ 13,10,'$'
|
||||||
|
|
||||||
MACRO lda _rg
|
MACRO lda _rg ;shorter than 'mov (e)ax, _rg'
|
||||||
xchg ax, _rg ;shorter than 'mov ax, _rg'
|
_rge SUBSTR <_rg>, 1, 1
|
||||||
|
IFIDNI _rge, <e>
|
||||||
|
xchg eax, _rg
|
||||||
|
ELSE
|
||||||
|
xchg ax, _rg
|
||||||
|
ENDIF
|
||||||
ENDM
|
ENDM
|
||||||
|
|
||||||
MACRO sta _rg
|
MACRO sta _rg ;shorter than 'mov _rg, (e)ax'
|
||||||
xchg _rg, ax ;shorter than 'mov _rg, ax'
|
_rge SUBSTR <_rg>, 1, 1
|
||||||
|
IFIDNI _rge, <e>
|
||||||
|
xchg _rg, eax
|
||||||
|
ELSE
|
||||||
|
xchg _rg, ax
|
||||||
|
ENDIF
|
||||||
ENDM
|
ENDM
|
||||||
|
|
||||||
MACRO dos _func
|
MACRO dos _func
|
||||||
@@ -105,6 +120,14 @@ _tp SUBSTR <_oper>, 6
|
|||||||
dw _tp
|
dw _tp
|
||||||
ENDM
|
ENDM
|
||||||
|
|
||||||
|
MACRO opr _oper
|
||||||
|
_tp SUBSTR <_oper>, 1, 1
|
||||||
|
db _tp
|
||||||
|
_tp SUBSTR <_oper>, 2
|
||||||
|
_tp CATSTR <v_>, _tp
|
||||||
|
dw _tp
|
||||||
|
ENDM
|
||||||
|
|
||||||
;*****************************
|
;*****************************
|
||||||
|
|
||||||
print hello
|
print hello
|
||||||
@@ -180,31 +203,37 @@ syntax: mov si, offset line
|
|||||||
je s_cmd
|
je s_cmd
|
||||||
cmp al, 9
|
cmp al, 9
|
||||||
je s_cmd
|
je s_cmd
|
||||||
call rlabel
|
jpass2 deflp2
|
||||||
jc asilab
|
call flabel
|
||||||
cmp bx, [p1laben]
|
jnc ltwice
|
||||||
jnb ltwice
|
push si
|
||||||
mov [pslaben], bx
|
|
||||||
inc [labvec] ;1
|
|
||||||
jmp s_cmd
|
|
||||||
ltwice: error e_twice
|
|
||||||
asilab: push si
|
|
||||||
mov si, offset tlabel
|
mov si, offset tlabel
|
||||||
mov di, [laben]
|
mov di, [laben]
|
||||||
scasw
|
|
||||||
mov [labvec], di
|
mov [labvec], di
|
||||||
|
scasw ;add di, 2
|
||||||
mov ax, [origin]
|
mov ax, [origin]
|
||||||
stosw
|
stosw
|
||||||
mov ax, di
|
mov al, m_lnus
|
||||||
add ax, dx
|
stosb
|
||||||
cmp ax, offset t_lab+l_lab
|
|
||||||
jnb tmlab
|
|
||||||
mov cx, dx
|
mov cx, dx
|
||||||
rep movsb
|
rep movsb
|
||||||
mov ax, di
|
mov ax, di
|
||||||
|
cmp ax, offset t_lab+l_lab-5
|
||||||
|
jnb tmlab
|
||||||
xchg ax, [laben]
|
xchg ax, [laben]
|
||||||
stosw
|
stosw
|
||||||
pop si
|
pop si
|
||||||
|
jmp s_cmd
|
||||||
|
|
||||||
|
ltwice: error e_twice
|
||||||
|
tmlab: error e_tlab
|
||||||
|
|
||||||
|
deflp2: call rlabel
|
||||||
|
mov ax, [pslab]
|
||||||
|
mov [labvec], ax
|
||||||
|
add ax, offset (lab).nam
|
||||||
|
add ax, dx
|
||||||
|
mov [pslab], ax
|
||||||
|
|
||||||
s_cmd: lodsb
|
s_cmd: lodsb
|
||||||
cmp al, ' '
|
cmp al, ' '
|
||||||
@@ -277,9 +306,6 @@ adex1: mov [byte di-1], '.'
|
|||||||
mov [orgvec], offset t_org
|
mov [orgvec], offset t_org
|
||||||
xor ax, ax
|
xor ax, ax
|
||||||
call pheadr
|
call pheadr
|
||||||
mov ax, [laben]
|
|
||||||
mov [p1laben], ax
|
|
||||||
inc [pslaben] ;0
|
|
||||||
jmp begin
|
jmp begin
|
||||||
|
|
||||||
fin: mov bx, [ohand]
|
fin: mov bx, [ohand]
|
||||||
@@ -294,8 +320,6 @@ fin: mov bx, [ohand]
|
|||||||
mov ax, [exitcod]
|
mov ax, [exitcod]
|
||||||
dos
|
dos
|
||||||
|
|
||||||
tmlab: error e_tlab
|
|
||||||
|
|
||||||
linlon: push offset e_long
|
linlon: push offset e_long
|
||||||
jmp erron
|
jmp erron
|
||||||
|
|
||||||
@@ -503,81 +527,95 @@ rstr1: call get
|
|||||||
|
|
||||||
strer: error e_str
|
strer: error e_str
|
||||||
|
|
||||||
; Przepisuje etykiete do tlabel, szuka w t_lab
|
; Przepisuje etykiete do tlabel (wyj: dx-dl.etykiety)
|
||||||
; na wyjsciu: dx-dlugosc etykiety
|
|
||||||
; C=0: znaleziona, bx=adres wpisu
|
|
||||||
; C=1: nie ma jej
|
|
||||||
rlabel: mov di, offset tlabel
|
rlabel: mov di, offset tlabel
|
||||||
mov [byte di], 0
|
mov [byte di], 0
|
||||||
ldlab1: lodsb
|
rlab1: lodsb
|
||||||
cmp al, '0'
|
cmp al, '0'
|
||||||
jb sflab0
|
jb rlabx
|
||||||
cmp al, '9'
|
cmp al, '9'
|
||||||
jbe ldlab2
|
jbe rlab2
|
||||||
cmp al, 'A'
|
cmp al, 'A'
|
||||||
jb sflab0
|
jb rlabx
|
||||||
cmp al, 'Z'
|
cmp al, 'Z'
|
||||||
jbe ldlab2
|
jbe rlab2
|
||||||
cmp al, '_'
|
cmp al, '_'
|
||||||
je ldlab2
|
je rlab2
|
||||||
cmp al, 'a'
|
cmp al, 'a'
|
||||||
jb sflab0
|
jb rlabx
|
||||||
cmp al, 'z'
|
cmp al, 'z'
|
||||||
ja sflab0
|
ja rlabx
|
||||||
add al, 'A'-'a'
|
add al, 'A'-'a'
|
||||||
ldlab2: stosb
|
rlab2: stosb
|
||||||
jmp ldlab1
|
jmp rlab1
|
||||||
sflab0: mov dx, di
|
rlabx: mov dx, di
|
||||||
mov di, offset tlabel
|
mov di, offset tlabel
|
||||||
cmp [byte di], 'A'
|
cmp [byte di], 'A'
|
||||||
jb ilchar
|
jb ilchar
|
||||||
sub dx, di
|
sub dx, di
|
||||||
dec si
|
dec si
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Czyta etykiete i szuka w t_lab
|
||||||
|
; wyj: dx-dlugosc etykiety
|
||||||
|
; C=0: znaleziona, bx=adres wpisu
|
||||||
|
; C=1: nie ma jej
|
||||||
|
flabel: call rlabel
|
||||||
push si
|
push si
|
||||||
mov bx, [laben]
|
mov bx, [laben]
|
||||||
sflab1: cmp bx, offset (lab t_lab).nam
|
flab1: cmp bx, offset t_lab
|
||||||
jb sflabn
|
jb flabx
|
||||||
lea cx, [bx-4]
|
lea cx, [bx-5]
|
||||||
mov bx, [(lab bx).prev]
|
mov bx, [(lab bx).prev]
|
||||||
sub cx, bx
|
sub cx, bx
|
||||||
cmp cx, dx
|
cmp cx, dx
|
||||||
jne sflab1
|
jne flab1
|
||||||
lea si, [(lab bx).nam]
|
lea si, [(lab bx).nam]
|
||||||
mov di, offset tlabel
|
mov di, offset tlabel
|
||||||
repe cmpsb
|
repe cmpsb
|
||||||
jne sflab1
|
jne flab1
|
||||||
clc
|
clc
|
||||||
sflabn: pop si
|
flabx: pop si
|
||||||
ret
|
ret
|
||||||
|
|
||||||
getval: call spaces
|
wropar: error e_wpar
|
||||||
|
|
||||||
|
spaval: call spaces
|
||||||
; Czyta wyrazenie i zwraca jego wartosc w [val]
|
; Czyta wyrazenie i zwraca jego wartosc w [val]
|
||||||
; (C=1 wartosc nieokreslona w pass 1)
|
; (C=1 wartosc nieokreslona w pass 1)
|
||||||
value: mov [val], 0
|
getval: xor bx, bx
|
||||||
mov [ukp1], 0
|
mov [ukp1], bh
|
||||||
lodsb
|
push bx
|
||||||
|
|
||||||
|
v_lop:
|
||||||
|
v_par1: inc bh
|
||||||
|
call get
|
||||||
|
cmp al, '['
|
||||||
|
je v_par1
|
||||||
|
cmp al, '('
|
||||||
|
je wropar
|
||||||
cmp al, '-'
|
cmp al, '-'
|
||||||
je valuem
|
je valuem
|
||||||
dec si
|
dec si
|
||||||
mov al, '+'
|
mov al, '+'
|
||||||
|
valuem: mov bl, al
|
||||||
valuem: mov [oper], al
|
xor eax, eax
|
||||||
call get
|
call get
|
||||||
cmp al, '*'
|
cmp al, '*'
|
||||||
je valorg
|
je valorg
|
||||||
xor dx, dx
|
|
||||||
cmp al, "'"
|
cmp al, "'"
|
||||||
je valchr
|
je valchr
|
||||||
cmp al, '^'
|
cmp al, '^'
|
||||||
je valreg
|
je valreg
|
||||||
mov ch, -1
|
mov bp, -1
|
||||||
mov bx, 16
|
xor edx, edx
|
||||||
|
mov ecx, 16
|
||||||
cmp al, '$'
|
cmp al, '$'
|
||||||
je rdnum3
|
je rdnum3
|
||||||
mov bl, 2
|
mov cl, 2
|
||||||
cmp al, '%'
|
cmp al, '%'
|
||||||
je rdnum3
|
je rdnum3
|
||||||
mov bl, 10
|
mov cl, 10
|
||||||
cmp al, '0'
|
cmp al, '0'
|
||||||
jb ilchar
|
jb ilchar
|
||||||
cmp al, '9'
|
cmp al, '9'
|
||||||
@@ -590,27 +628,39 @@ rdnum1: cmp al, '9'
|
|||||||
jb value0
|
jb value0
|
||||||
add al, '0'+10-'A'
|
add al, '0'+10-'A'
|
||||||
rdnum2: sub al, '0'
|
rdnum2: sub al, '0'
|
||||||
cmp al, bl
|
cmp al, cl
|
||||||
jnb value0
|
jnb value0
|
||||||
movzx cx, al
|
movzx ebp, al
|
||||||
mov ax, dx
|
lda edx
|
||||||
mul bx
|
mul ecx
|
||||||
add ax, cx
|
add eax, ebp
|
||||||
adc dx, dx
|
js toobig
|
||||||
|
adc edx, edx
|
||||||
jnz toobig
|
jnz toobig
|
||||||
sta dx
|
sta edx
|
||||||
rdnum3: lodsb
|
rdnum3: lodsb
|
||||||
jmp rdnum1
|
jmp rdnum1
|
||||||
|
|
||||||
vlabel: dec si
|
vlabel: push bx
|
||||||
call rlabel
|
dec si
|
||||||
jnc vlabkn
|
call flabel
|
||||||
jpass1 vlabun
|
jnc vlabfn
|
||||||
jmp unknow
|
jpass1 vlukp1
|
||||||
vlabkn: mov dx, [(lab bx).val]
|
error e_undec
|
||||||
cmp bx, [pslaben]
|
vlabfn: test [(lab bx).flags], m_ukp1
|
||||||
jbe value1
|
jz vlabkn
|
||||||
vlabun: mov [ukp1], 0ffh
|
jpass1 vlukp1
|
||||||
|
cmp bx, [pslab]
|
||||||
|
jb vlukp1
|
||||||
|
error e_fref
|
||||||
|
vlukp1: mov [ukp1], 0ffh
|
||||||
|
vlabkn: bt [word (lab bx).flags], b_sign
|
||||||
|
sbb eax, eax
|
||||||
|
mov ax, [(lab bx).val]
|
||||||
|
pop bx
|
||||||
|
jmp value1
|
||||||
|
|
||||||
|
valorg: mov ax, [origin]
|
||||||
jmp value1
|
jmp value1
|
||||||
|
|
||||||
valchr: call get
|
valchr: call get
|
||||||
@@ -619,14 +669,13 @@ valchr: call get
|
|||||||
lodsb
|
lodsb
|
||||||
cmp al, "'"
|
cmp al, "'"
|
||||||
jne strer
|
jne strer
|
||||||
valch1: mov dl, al
|
valch1: cmp [byte si], "'"
|
||||||
lodsb
|
|
||||||
cmp al, "'"
|
|
||||||
jne strer
|
jne strer
|
||||||
|
inc si
|
||||||
cmp [byte si], '*'
|
cmp [byte si], '*'
|
||||||
jne value1
|
jne value1
|
||||||
inc si
|
inc si
|
||||||
xor dl, 80h
|
xor al, 80h
|
||||||
jmp value1
|
jmp value1
|
||||||
|
|
||||||
valreg: call get
|
valreg: call get
|
||||||
@@ -647,49 +696,205 @@ valre1: sub al, '0'
|
|||||||
cmp al, 0fh
|
cmp al, 0fh
|
||||||
ja ilchar
|
ja ilchar
|
||||||
cmp ah, 0d1h
|
cmp ah, 0d1h
|
||||||
jne valre2
|
jne value1
|
||||||
sub ax, 0f0h
|
sub ax, 0f0h
|
||||||
valre2: sta dx
|
valre2: jmp value1
|
||||||
jmp value1
|
|
||||||
|
|
||||||
valorg: mov dx, [origin]
|
|
||||||
jmp value1
|
|
||||||
|
|
||||||
value0: dec si
|
value0: dec si
|
||||||
test ch, ch
|
test bp, bp
|
||||||
jnz ilchar
|
js ilchar
|
||||||
value1: cmp [oper], '-'
|
lda edx
|
||||||
|
value1: cmp bl, '-'
|
||||||
jne value2
|
jne value2
|
||||||
neg dx
|
neg eax
|
||||||
value2: add [val], dx
|
value2: push eax
|
||||||
|
v_par2: dec bh
|
||||||
|
js mbrack
|
||||||
lodsb
|
lodsb
|
||||||
cmp al, '+'
|
cmp al, ']'
|
||||||
je valuem
|
je v_par2
|
||||||
cmp al, '-'
|
|
||||||
je valuem
|
mov ah, [si]
|
||||||
|
mov di, offset opert2
|
||||||
|
mov cx, noper2
|
||||||
|
repne scasw
|
||||||
|
je foper2
|
||||||
|
mov cx, noper1
|
||||||
|
repne scasb
|
||||||
|
je foper1
|
||||||
|
test bh, bh
|
||||||
|
jnz mbrack
|
||||||
dec si
|
dec si
|
||||||
mov al, 1
|
mov di, offset opert1
|
||||||
cmp al, [ukp1]
|
foper1: sub di, offset opert1
|
||||||
|
jmp goper
|
||||||
|
foper2: inc si
|
||||||
|
sub di, offset opert2
|
||||||
|
shr di, 1
|
||||||
|
add di, noper1
|
||||||
|
goper: lea ax, [di+operpa]
|
||||||
|
add di, di
|
||||||
|
add di, ax
|
||||||
|
mov bl, [di]
|
||||||
|
mov bp, [di+1]
|
||||||
|
pop eax
|
||||||
|
v_com: pop cx
|
||||||
|
cmp cx, bx
|
||||||
|
jb v_xcm
|
||||||
|
pop ecx
|
||||||
|
xchg eax, ecx
|
||||||
|
pop dx
|
||||||
|
push offset v_com
|
||||||
|
push dx
|
||||||
|
ret
|
||||||
|
v_xcm: cmp bl, 1
|
||||||
|
jbe v_xit
|
||||||
|
push cx bp eax bx
|
||||||
|
jmp v_lop
|
||||||
|
v_xit: mov [dword val], eax
|
||||||
|
cmp [ukp1], 1
|
||||||
|
cmc
|
||||||
|
jc v_ret
|
||||||
|
cmp eax, 10000h
|
||||||
|
cmc
|
||||||
|
jnb v_ret
|
||||||
|
cmp eax, -0ffffh
|
||||||
|
jb orange
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
brange: cmp eax, 100h
|
||||||
|
jb v_ret
|
||||||
|
cmp eax, -0ffh
|
||||||
|
jb orange
|
||||||
|
ret
|
||||||
|
|
||||||
|
spauns: call spaces
|
||||||
|
getuns: call getval
|
||||||
|
jc v_ret
|
||||||
|
test eax, eax
|
||||||
|
jns v_ret
|
||||||
|
orange: error e_range
|
||||||
|
|
||||||
|
mbrack: error e_brack
|
||||||
|
|
||||||
toobig: error e_nbig
|
toobig: error e_nbig
|
||||||
|
|
||||||
|
v_add: add eax, ecx
|
||||||
|
jmp v_cov
|
||||||
|
|
||||||
|
v_sub: sub eax, ecx
|
||||||
|
v_cov: jno v_ret
|
||||||
|
oflow: error e_over
|
||||||
|
|
||||||
|
div0: error e_div0
|
||||||
|
|
||||||
|
v_mul: mov edx, ecx
|
||||||
|
xor ecx, eax
|
||||||
|
imul edx
|
||||||
|
test ecx, ecx
|
||||||
|
js v_mu1
|
||||||
|
test edx, edx
|
||||||
|
jnz oflow
|
||||||
|
test eax, eax
|
||||||
|
js oflow
|
||||||
|
ret
|
||||||
|
v_mu1: inc edx
|
||||||
|
jnz oflow
|
||||||
|
test eax, eax
|
||||||
|
jns oflow
|
||||||
|
ret
|
||||||
|
|
||||||
|
v_div: jecxz div0
|
||||||
|
cdq
|
||||||
|
idiv ecx
|
||||||
|
ret
|
||||||
|
|
||||||
|
v_mod: jecxz div0
|
||||||
|
cdq
|
||||||
|
idiv ecx
|
||||||
|
sta edx
|
||||||
|
v_ret: ret
|
||||||
|
|
||||||
|
v_sln: neg ecx
|
||||||
|
v_sal: test ecx, ecx
|
||||||
|
js v_srn
|
||||||
|
jz v_ret
|
||||||
|
cmp ecx, 20h
|
||||||
|
jb v_sl1
|
||||||
|
test eax, eax
|
||||||
|
jnz oflow
|
||||||
|
ret
|
||||||
|
v_sl1: add eax, eax
|
||||||
|
jo oflow
|
||||||
|
loop v_sl1
|
||||||
|
ret
|
||||||
|
|
||||||
|
v_srn: neg ecx
|
||||||
|
v_sar: test ecx, ecx
|
||||||
|
js v_sln
|
||||||
|
cmp ecx, 20h
|
||||||
|
jb v_sr1
|
||||||
|
mov cl, 1fh
|
||||||
|
v_sr1: sar eax, cl
|
||||||
|
ret
|
||||||
|
|
||||||
|
v_and: and eax, ecx
|
||||||
|
ret
|
||||||
|
|
||||||
|
v_or: or eax, ecx
|
||||||
|
ret
|
||||||
|
|
||||||
|
v_xor: xor eax, ecx
|
||||||
|
ret
|
||||||
|
|
||||||
|
v_equ: cmp eax, ecx
|
||||||
|
je v_one
|
||||||
|
v_zer: xor eax, eax
|
||||||
|
ret
|
||||||
|
v_one: mov eax, 1
|
||||||
|
ret
|
||||||
|
|
||||||
|
v_neq: cmp eax, ecx
|
||||||
|
jne v_one
|
||||||
|
jmp v_zer
|
||||||
|
|
||||||
|
v_les: cmp eax, ecx
|
||||||
|
jl v_one
|
||||||
|
jmp v_zer
|
||||||
|
|
||||||
|
v_grt: cmp eax, ecx
|
||||||
|
jg v_one
|
||||||
|
jmp v_zer
|
||||||
|
|
||||||
|
v_leq: cmp eax, ecx
|
||||||
|
jle v_one
|
||||||
|
jmp v_zer
|
||||||
|
|
||||||
|
v_geq: cmp eax, ecx
|
||||||
|
jge v_one
|
||||||
|
jmp v_zer
|
||||||
|
|
||||||
|
v_anl: jecxz v_zer
|
||||||
|
test eax, eax
|
||||||
|
jz v_ret
|
||||||
|
jmp v_one
|
||||||
|
|
||||||
|
v_orl: or eax, ecx
|
||||||
|
jz v_ret
|
||||||
|
jmp v_one
|
||||||
|
|
||||||
; Pobiera operand rozkazu i rozpoznaje tryb adresowania
|
; Pobiera operand rozkazu i rozpoznaje tryb adresowania
|
||||||
getadr: call spaces
|
getadr: call spaces
|
||||||
lodsb
|
lodsb
|
||||||
xor dx, dx
|
xor dx, dx
|
||||||
cmp al, '@'
|
cmp al, '@'
|
||||||
je getadx
|
je getadx
|
||||||
inc dx
|
|
||||||
cmp al, '#'
|
cmp al, '#'
|
||||||
je getad1
|
je getaim
|
||||||
mov dl, 4
|
|
||||||
cmp al, '<'
|
cmp al, '<'
|
||||||
je getad1
|
je getaim
|
||||||
inc dx
|
|
||||||
cmp al, '>'
|
cmp al, '>'
|
||||||
je getad1
|
je getaim
|
||||||
mov dl, 8
|
mov dl, 8
|
||||||
cmp al, '('
|
cmp al, '('
|
||||||
je getad1
|
je getad1
|
||||||
@@ -707,18 +912,15 @@ getadr: call spaces
|
|||||||
xor dx, dx
|
xor dx, dx
|
||||||
|
|
||||||
getad1: push dx
|
getad1: push dx
|
||||||
call value
|
call getuns
|
||||||
sbb al, al
|
sbb al, al
|
||||||
jnz getad2
|
jnz getad2
|
||||||
mov al, [byte high val]
|
mov al, [byte high val]
|
||||||
getad2: pop dx
|
getad2: pop dx
|
||||||
cmp dl, 8
|
cmp dl, 8
|
||||||
jae getaid
|
jae getaid
|
||||||
cmp dl, 4
|
cmp dl, 2
|
||||||
jae getalh
|
jae getad3
|
||||||
cmp dl, 1
|
|
||||||
je getadx
|
|
||||||
ja getad3
|
|
||||||
cmp al, 1
|
cmp al, 1
|
||||||
adc dl, 2
|
adc dl, 2
|
||||||
getad3: lodsw
|
getad3: lodsw
|
||||||
@@ -746,19 +948,23 @@ getadx: lda dx
|
|||||||
mov [word amod], ax
|
mov [word amod], ax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
getalh: mov bx, offset val
|
getaim: cmp al, '<'
|
||||||
je getal1
|
pushf
|
||||||
inc bx
|
call getval
|
||||||
getal1: movzx ax, [bx]
|
popf
|
||||||
mov [val], ax
|
jb getai2
|
||||||
mov dl, 1
|
je getai1
|
||||||
|
mov al, ah
|
||||||
|
getai1: movzx eax, al
|
||||||
|
mov [dword val], eax
|
||||||
|
getai2: mov dx, 1
|
||||||
jmp getadx
|
jmp getadx
|
||||||
|
|
||||||
getaid: lodsb
|
getaid: lodsb
|
||||||
cmp al, ','
|
cmp al, ','
|
||||||
je getaix
|
je getaix
|
||||||
cmp al, ')'
|
cmp al, ')'
|
||||||
jne mbrack
|
jne mparen
|
||||||
lodsw
|
lodsw
|
||||||
mov dx, 709h
|
mov dx, 709h
|
||||||
cmp ax, '0,'
|
cmp ax, '0,'
|
||||||
@@ -875,11 +1081,10 @@ putcmd: call savbyt
|
|||||||
xlat
|
xlat
|
||||||
cmp al, 2
|
cmp al, 2
|
||||||
jb putret
|
jb putret
|
||||||
mov ax, [val]
|
mov eax, [dword val]
|
||||||
jne savwor
|
jne savwor
|
||||||
jpass1 putcm1
|
jpass1 putcm1
|
||||||
test ah, ah
|
call brange
|
||||||
jnz toobig
|
|
||||||
putcm1: jmp savbyt
|
putcm1: jmp savbyt
|
||||||
|
|
||||||
p_sti: call getadr
|
p_sti: call getadr
|
||||||
@@ -931,7 +1136,7 @@ toofar: cmp ax, 8080h
|
|||||||
sub ax, 0ffh
|
sub ax, 0ffh
|
||||||
neg ax
|
neg ax
|
||||||
toofa1: neg ax
|
toofa1: neg ax
|
||||||
mov di, offset brange
|
mov di, offset brout
|
||||||
call phword
|
call phword
|
||||||
error e_bra
|
error e_bra
|
||||||
|
|
||||||
@@ -996,13 +1201,13 @@ getops: call getadr
|
|||||||
movzx bx, [cod]
|
movzx bx, [cod]
|
||||||
add bx, offset movtab
|
add bx, offset movtab
|
||||||
ldop1: mov si, offset op1
|
ldop1: mov si, offset op1
|
||||||
ldop: lodsw
|
ldop: lodsd
|
||||||
mov [val], ax
|
mov [dword val], eax
|
||||||
lodsw
|
lodsw
|
||||||
mov [word amod], ax
|
mov [word amod], ax
|
||||||
ret
|
ret
|
||||||
stop: mov ax, [val]
|
stop: mov eax, [dword val]
|
||||||
stosw
|
stosd
|
||||||
mov ax, [word amod]
|
mov ax, [word amod]
|
||||||
stosw
|
stosw
|
||||||
ret
|
ret
|
||||||
@@ -1036,6 +1241,7 @@ p_mws: call getops
|
|||||||
cmp al, 1
|
cmp al, 1
|
||||||
jne p_mw1
|
jne p_mw1
|
||||||
mov [byte high val], 0
|
mov [byte high val], 0
|
||||||
|
mov [word val+2], 0
|
||||||
p_mw1: call mcall1
|
p_mw1: call mcall1
|
||||||
mov si, offset op2
|
mov si, offset op2
|
||||||
call ldop
|
call ldop
|
||||||
@@ -1047,12 +1253,12 @@ p_mw1: call mcall1
|
|||||||
je p_mwi
|
je p_mwi
|
||||||
inc [val]
|
inc [val]
|
||||||
jmp p_mw2
|
jmp p_mw2
|
||||||
p_mwi: movzx ax, [byte high val]
|
p_mwi: movzx eax, [byte high val]
|
||||||
cmp [ukp1], ah ;0
|
cmp [ukp1], ah ;0
|
||||||
jnz p_mwh
|
jnz p_mwh
|
||||||
cmp al, [byte val]
|
cmp al, [byte val]
|
||||||
je p_mw3
|
je p_mw3
|
||||||
p_mwh: mov [val], ax
|
p_mwh: mov [dword val], eax
|
||||||
p_mw2: call mcall1
|
p_mw2: call mcall1
|
||||||
p_mw3: mov si, offset op2
|
p_mw3: mov si, offset op2
|
||||||
call ldop
|
call ldop
|
||||||
@@ -1061,26 +1267,30 @@ p_mw3: mov si, offset op2
|
|||||||
|
|
||||||
p_opt: error e_opt
|
p_opt: error e_opt
|
||||||
|
|
||||||
|
p_ert: call spaval
|
||||||
|
jpass1 equret
|
||||||
|
test eax, eax
|
||||||
|
jz equret
|
||||||
|
error e_user
|
||||||
|
|
||||||
p_equ: mov di, [labvec]
|
p_equ: mov di, [labvec]
|
||||||
cmp di, 1
|
test di, di
|
||||||
jb nolabl
|
jz nolabl
|
||||||
je equret
|
mov [(lab di).val], 0
|
||||||
mov [word di], 0
|
and [(lab di).flags], not m_sign
|
||||||
call getval
|
call spaval
|
||||||
mov di, [labvec]
|
mov di, [labvec]
|
||||||
jnc equ1
|
jnc equ1
|
||||||
jpass1 lbund
|
or [(lab di).flags], m_ukp1
|
||||||
equ1: mov ax, [val]
|
equ1: mov [(lab di).val], ax
|
||||||
stosw
|
test eax, eax
|
||||||
|
jns equret
|
||||||
|
or [(lab di).flags], m_sign
|
||||||
equret: ret
|
equret: ret
|
||||||
|
|
||||||
lbund: lea ax, [di-2]
|
|
||||||
mov [laben], ax
|
|
||||||
ret
|
|
||||||
|
|
||||||
nolabl: error e_label
|
nolabl: error e_label
|
||||||
|
|
||||||
p_org: call getval
|
p_org: call spauns
|
||||||
jc unknow
|
jc unknow
|
||||||
p_org1: jpass2 org1
|
p_org1: jpass2 org1
|
||||||
call putorg
|
call putorg
|
||||||
@@ -1111,11 +1321,11 @@ tmorgs: error e_orgs
|
|||||||
p_rui: mov ah, 2
|
p_rui: mov ah, 2
|
||||||
mov [val], ax
|
mov [val], ax
|
||||||
call p_org1
|
call p_org1
|
||||||
call getval
|
call spauns
|
||||||
mov ax, [val]
|
mov ax, [val]
|
||||||
jmp savwor
|
jmp savwor
|
||||||
|
|
||||||
valuco: call value
|
valuco: call getval
|
||||||
jc unknow
|
jc unknow
|
||||||
call get
|
call get
|
||||||
cmp al, ','
|
cmp al, ','
|
||||||
@@ -1144,7 +1354,7 @@ dta1: call get
|
|||||||
|
|
||||||
dtan1: lodsb
|
dtan1: lodsb
|
||||||
cmp al, '('
|
cmp al, '('
|
||||||
jne mbrack
|
jne mparen
|
||||||
|
|
||||||
dtan2: lodsd
|
dtan2: lodsd
|
||||||
and eax, 0ffdfdfdfh
|
and eax, 0ffdfdfdfh
|
||||||
@@ -1154,11 +1364,10 @@ dtan2: lodsd
|
|||||||
mov [sinadd], ax
|
mov [sinadd], ax
|
||||||
call valuco
|
call valuco
|
||||||
mov [sinamp], ax
|
mov [sinamp], ax
|
||||||
call value
|
call getuns
|
||||||
jc unknow
|
jc unknow
|
||||||
mov ax, [val]
|
mov ax, [val]
|
||||||
test ax, ax
|
test ax, ax
|
||||||
js badsin
|
|
||||||
jz badsin
|
jz badsin
|
||||||
mov [sinsiz], ax
|
mov [sinsiz], ax
|
||||||
mov [sinmin], 0
|
mov [sinmin], 0
|
||||||
@@ -1170,20 +1379,18 @@ dtan2: lodsd
|
|||||||
cmp al, ','
|
cmp al, ','
|
||||||
jne badsin
|
jne badsin
|
||||||
call valuco
|
call valuco
|
||||||
test ax, ax
|
test eax, eax
|
||||||
js badsin
|
js badsin
|
||||||
mov [sinmin], ax
|
mov [sinmin], ax
|
||||||
call value
|
call getuns
|
||||||
jc unknow
|
jc unknow
|
||||||
mov ax, [val]
|
mov ax, [val]
|
||||||
test ax, ax
|
|
||||||
js badsin
|
|
||||||
cmp ax, [sinmin]
|
cmp ax, [sinmin]
|
||||||
jb badsin
|
jb badsin
|
||||||
mov [sinmax], ax
|
mov [sinmax], ax
|
||||||
lodsb
|
lodsb
|
||||||
cmp al, ')'
|
cmp al, ')'
|
||||||
jne mbrack
|
jne mparen
|
||||||
presin: finit
|
presin: finit
|
||||||
fldpi
|
fldpi
|
||||||
fld st
|
fld st
|
||||||
@@ -1200,7 +1407,7 @@ gensin: fild [sinmin]
|
|||||||
jmp dtasto
|
jmp dtasto
|
||||||
|
|
||||||
dtansi: sub si, 4
|
dtansi: sub si, 4
|
||||||
call value
|
call getval
|
||||||
dtasto: jpass1 dtan3
|
dtasto: jpass1 dtan3
|
||||||
mov al, [cod]
|
mov al, [cod]
|
||||||
cmp al, 'B'
|
cmp al, 'B'
|
||||||
@@ -1213,10 +1420,9 @@ dtasto: jpass1 dtan3
|
|||||||
call savwor
|
call savwor
|
||||||
jmp dtanx
|
jmp dtanx
|
||||||
|
|
||||||
dtanb: mov ax, [val]
|
dtanb: mov eax, [dword val]
|
||||||
test ah, ah
|
call brange
|
||||||
jz dtans
|
jmp dtans
|
||||||
jmp toobig
|
|
||||||
|
|
||||||
dtanl: mov al, [byte low val]
|
dtanl: mov al, [byte low val]
|
||||||
jmp dtans
|
jmp dtans
|
||||||
@@ -1238,7 +1444,7 @@ dtanx: mov ax, [sinmin]
|
|||||||
cmp al, ')'
|
cmp al, ')'
|
||||||
je dtanxt
|
je dtanxt
|
||||||
|
|
||||||
mbrack: error e_brack
|
mparen: error e_paren
|
||||||
|
|
||||||
unknow: error e_uknow
|
unknow: error e_uknow
|
||||||
|
|
||||||
@@ -1348,6 +1554,7 @@ comtab: cmd ADC60p_acc
|
|||||||
cmd END00p_end
|
cmd END00p_end
|
||||||
cmd EOR40p_acc
|
cmd EOR40p_acc
|
||||||
cmd EQU00p_equ
|
cmd EQU00p_equ
|
||||||
|
cmd ERT00p_ert
|
||||||
cmd ICL00p_icl
|
cmd ICL00p_icl
|
||||||
cmd INCe0p_srt
|
cmd INCe0p_srt
|
||||||
cmd INIe2p_rui
|
cmd INIe2p_rui
|
||||||
@@ -1404,7 +1611,33 @@ comtab: cmd ADC60p_acc
|
|||||||
cmd TYA98p_imp
|
cmd TYA98p_imp
|
||||||
comend:
|
comend:
|
||||||
|
|
||||||
hello db 'X-Assembler 1.5 by Fox/Taquart',eot
|
operpa: opr 1ret
|
||||||
|
opr 5add
|
||||||
|
opr 5sub
|
||||||
|
opr 6mul
|
||||||
|
opr 6div
|
||||||
|
opr 6mod
|
||||||
|
opr 6and
|
||||||
|
opr 5or
|
||||||
|
opr 5xor
|
||||||
|
opr 4equ
|
||||||
|
opr 4les
|
||||||
|
opr 4grt
|
||||||
|
opr 6sal
|
||||||
|
opr 6sar
|
||||||
|
opr 4leq
|
||||||
|
opr 4geq
|
||||||
|
opr 4neq
|
||||||
|
opr 4neq
|
||||||
|
opr 3anl
|
||||||
|
opr 2orl
|
||||||
|
|
||||||
|
opert2 db '<<>><=>=<>!=&&||'
|
||||||
|
noper2 = ($-opert2)/2
|
||||||
|
opert1 db '+-*/%&|^=<>'
|
||||||
|
noper1 = $-opert1
|
||||||
|
|
||||||
|
hello db 'X-Assembler 1.6 by Fox/Taquart',eot
|
||||||
usgtxt db 'Give a source filename. Default extension is .ASX.',eol
|
usgtxt db 'Give a source filename. Default extension is .ASX.',eol
|
||||||
db 'Object file will be written with .COM extension.',eot
|
db 'Object file will be written with .COM extension.',eot
|
||||||
lintxt db ' lines assembled',eot
|
lintxt db ' lines assembled',eot
|
||||||
@@ -1425,28 +1658,35 @@ e_char db 'Illegal character',eol
|
|||||||
e_twice db 'Label declared twice',eol
|
e_twice db 'Label declared twice',eol
|
||||||
e_inst db 'Illegal instruction',eol
|
e_inst db 'Illegal instruction',eol
|
||||||
e_nbig db 'Number too big',eol
|
e_nbig db 'Number too big',eol
|
||||||
e_uknow db 'Unknown value',eol
|
|
||||||
e_xtra db 'Extra characters on line',eol
|
e_xtra db 'Extra characters on line',eol
|
||||||
e_label db 'Label name required',eol
|
e_label db 'Label name required',eol
|
||||||
e_str db 'String error',eol
|
e_str db 'String error',eol
|
||||||
e_orgs db 'Too many ORGs',eol
|
e_orgs db 'Too many ORGs',eol
|
||||||
e_brack db 'Need parenthesis',eol
|
e_paren db 'Need parenthesis',eol
|
||||||
e_tlab db 'Too many labels',eol
|
e_tlab db 'Too many labels',eol
|
||||||
e_amod db 'Illegal adressing mode',eol
|
e_amod db 'Illegal addressing mode',eol
|
||||||
e_bra db 'Branch out of range by $'
|
e_bra db 'Branch out of range by $'
|
||||||
brange db ' bytes',eol
|
brout db ' bytes',eol
|
||||||
e_sin db 'Bad or missing sinus parameter',eol
|
e_sin db 'Bad or missing sinus parameter',eol
|
||||||
e_spac db 'Space expected',eol
|
e_spac db 'Space expected',eol
|
||||||
e_opt db 'OPT directive not supported',eol
|
e_opt db 'OPT directive not supported',eol
|
||||||
|
e_over db 'Arithmetic overflow',eol
|
||||||
|
e_div0 db 'Divide by zero',eol
|
||||||
|
e_range db 'Value out of range',eol
|
||||||
|
e_uknow db 'Label not defined before',eol
|
||||||
|
e_undec db 'Undeclared label',eol
|
||||||
|
e_fref db 'Illegal forward reference',eol
|
||||||
|
e_wpar db 'Use square brackets instead',eol
|
||||||
|
e_brack db 'Not matching brackets',eol
|
||||||
|
e_user db 'User error',eol
|
||||||
|
|
||||||
exitcod dw 4c00h
|
exitcod dw 4c00h
|
||||||
flags db 0
|
flags db 0
|
||||||
lines dd 0
|
lines dd 0
|
||||||
bytes dd 0
|
bytes dd 0
|
||||||
iclen dw t_icl
|
iclen dw t_icl
|
||||||
laben dw t_lab
|
laben dw t_lab-2
|
||||||
p1laben dw 0
|
pslab dw t_lab-2
|
||||||
pslaben dw -1
|
|
||||||
orgvec dw t_org
|
orgvec dw t_org
|
||||||
sinmin dw 1
|
sinmin dw 1
|
||||||
sinmax dw 0
|
sinmax dw 0
|
||||||
@@ -1454,7 +1694,7 @@ sinadd dw ?
|
|||||||
sinamp dw ?
|
sinamp dw ?
|
||||||
sinsiz dw ?
|
sinsiz dw ?
|
||||||
ohand dw ?
|
ohand dw ?
|
||||||
val dw ?
|
val dw ?,?
|
||||||
amod db ?,?
|
amod db ?,?
|
||||||
ukp1 db ?,?
|
ukp1 db ?,?
|
||||||
oper db ?
|
oper db ?
|
||||||
@@ -1463,14 +1703,16 @@ origin dw ?
|
|||||||
labvec dw ?
|
labvec dw ?
|
||||||
fnad dw ?
|
fnad dw ?
|
||||||
tempsi dw ?
|
tempsi dw ?
|
||||||
op1 dw ?,?
|
op1 dd ?
|
||||||
op2 dw ?,?
|
dw ?
|
||||||
|
op2 dd ?
|
||||||
|
dw ?
|
||||||
|
|
||||||
line db 258 dup(?)
|
line db 258 dup(?)
|
||||||
tlabel db 256 dup(?)
|
tlabel db 256 dup(?)
|
||||||
t_icl db l_icl dup(?)
|
t_icl db l_icl dup(?)
|
||||||
t_org db l_org dup(?)
|
t_org db l_org dup(?)
|
||||||
t_lab db l_lab+4 dup(?)
|
t_lab db l_lab dup(?)
|
||||||
|
|
||||||
ENDS
|
ENDS
|
||||||
END start
|
END start
|
Reference in New Issue
Block a user