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

X-Assembler 1.7.

This commit is contained in:
Piotr Fusik 1998-09-16 10:39:58 +02:00
parent 1a31c1ddd5
commit 5213b3a799

222
xasm.asm
View File

@ -43,6 +43,7 @@ vec dw ?
m_pass = 80h m_pass = 80h
m_eofl = 40h m_eofl = 40h
m_skip = 20h
eol equ 13,10 eol equ 13,10
eot equ 13,10,'$' eot equ 13,10,'$'
@ -198,7 +199,40 @@ syntax: mov si, offset line
je main je main
cmp al, '|' cmp al, '|'
je main je main
mov [labvec], 0 test [flags], m_skip
jz nskip
skip1: call get
cmp al, ' '
je skip2
cmp al, 9
jne skip1
skip2: call space1
push offset main
lodsd
and eax, 0dfdfdfh
cmp eax, 'TFI'
je skift
cmp eax, 'SLE'
je skels
cmp eax, 'DNE'
je filend
cmp eax, 'FIE'
jne skret
call p_eif
dec [sift]
jns skret
and [flags], not m_skip
inc [sift] ;0
skret: ret
skift: call shlelf
inc [sift]
ret
skels: call btself
cmp [sift], 0
jnz skret
jmp fliski
nskip: mov [labvec], 0
cmp al, ' ' cmp al, ' '
je s_cmd je s_cmd
cmp al, 9 cmp al, 9
@ -282,6 +316,8 @@ filend: and [flags], not m_eofl
ja main ja main
jpass2 fin jpass2 fin
cmp [elflag], 1
jne miseif
or [flags], m_pass or [flags], m_pass
call putorg call putorg
call ldname call ldname
@ -323,6 +359,9 @@ fin: mov bx, [ohand]
linlon: push offset e_long linlon: push offset e_long
jmp erron jmp erron
miseif: push offset e_meif
jmp erron
; ERROR ; ERROR
errln: call ppline errln: call ppline
erron: call prname erron: call prname
@ -510,14 +549,17 @@ rfname: call spaces
; Czyta lancuch i zapisuje do [di] ; Czyta lancuch i zapisuje do [di]
rstr: call get rstr: call get
cmp al, "'" cmp al, "'"
je rstr0
cmp al, '"'
jne strer jne strer
mov dx, di rstr0: mov dx, di
mov ah, al
rstr1: call get rstr1: call get
stosb stosb
cmp al, "'" cmp al, ah
jne rstr1 jne rstr1
lodsb lodsb
cmp al, "'" cmp al, ah
je rstr1 je rstr1
dec si dec si
mov [byte di-1], 0 mov [byte di-1], 0
@ -605,6 +647,8 @@ valuem: mov bl, al
je valorg je valorg
cmp al, "'" cmp al, "'"
je valchr je valchr
cmp al, '"'
je valchr
cmp al, '^' cmp al, '^'
je valreg je valreg
mov bp, -1 mov bp, -1
@ -663,13 +707,14 @@ vlabkn: bt [word (lab bx).flags], b_sign
valorg: mov ax, [origin] valorg: mov ax, [origin]
jmp value1 jmp value1
valchr: call get valchr: mov dl, al
cmp al, "'" call get
cmp al, dl
jne valch1 jne valch1
lodsb lodsb
cmp al, "'" cmp al, dl
jne strer jne strer
valch1: cmp [byte si], "'" valch1: cmp dl, [si]
jne strer jne strer
inc si inc si
cmp [byte si], '*' cmp [byte si], '*'
@ -1350,6 +1395,8 @@ dta1: call get
je dtat1 je dtat1
cmp al, 'D' cmp al, 'D'
je dtat1 je dtat1
cmp al, 'R'
je dtar1
jmp ilchar jmp ilchar
dtan1: lodsb dtan1: lodsb
@ -1480,6 +1527,129 @@ dtanxt: lodsb
dec si dec si
ret ret
dtar1: lodsb
cmp al, '('
jne mparen
dtar2: xor bx, bx
xor edx, edx
xor cx, cx
call getsgn
dreal1: call getdig
jnc dreal2
cmp al, '.'
je drealp
test bh, bh
jnz drealz
jmp ilchar
dreal2: mov bh, 1
test al, al
jz dreal1
dec cx
dreal3: inc cx
call putdig
call getdig
jnc dreal3
cmp al, '.'
je drealp
and al, 0dfh
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
jnz dreal9
test bl, bl
jnz dreal9
dec cx
dreal9: call putdig
drealp: call getdig
jnc dreal5
and al, 0dfh
cmp al, 'E'
je dreale
drealf: test edx, edx
jnz drealx
test bl, bl
jnz drealx
drealz: xor ax, ax
xor edx, edx
jmp dreals
drealx: add cx, 80h
cmp cx, 20h
js drealz
cmp cx, 0e2h
jnb toobig
add di, di
rcr cl, 1
mov al, 10h
jc dreal7
cmp bl, al
mov al, 1
jb dreal7
shrd edx, ebx, 4
shr bl, 4
jmp dreal8
dreal6: shld ebx, edx, 4
shl edx, 4
dreal7: cmp bl, al
jb dreal6
dreal8: lda cx
mov ah, bl
dreals: rol edx, 16
push edx
call savwor
pop ax
xchg ah, al
call savwor
pop ax
xchg ah, al
call savwor
dec si
lodsb
cmp al, ','
je dtar2
cmp al, ')'
jne mparen
jmp dtanxt
putdig: cmp bl, 10h
jnb rlret
shld ebx, edx, 4
shl edx, 4
add dl, al
ret
getsgn: call get
cmp al, '-'
stc
je sgnret
cmp al, '+'
clc
je sgnret
dec si
sgnret: rcr di, 1
rlret: ret
getdig: call get
cmp al, '0'
jb rlret
cmp al, '9'+1
cmc
jb rlret
sub al, '0'
ret
p_icl: call rfname p_icl: call rfname
pop ax pop ax
call linend call linend
@ -1512,6 +1682,31 @@ 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
jnc cndret
error e_eifex
p_ift: call spaval
jc unknow
call shlelf
test eax, eax
jz fliski
cndret: ret
p_els: cmp [elflag], 1
je misift
call btself
fliski: xor [flags], m_skip
ret
p_eif: shr [elflag], 1
jnz cndret
misift: error e_mift
; addressing modes: ; addressing modes:
; 0-@ 1-# 2-A 3-Z 4-A,X 5-Z,X 6-A,Y 7-Z,Y 8-(Z,X) 9-(Z),Y 10-(A) ; 0-@ 1-# 2-A 3-Z 4-A,X 5-Z,X 6-A,Y 7-Z,Y 8-(Z,X) 9-(Z),Y 10-(A)
lentab db 1,2,3,2,3,2,3,2,2,2,3 lentab db 1,2,3,2,3,2,3,2,2,2,3
@ -1551,11 +1746,14 @@ comtab: cmd ADC60p_acc
cmd DEXcap_imp cmd DEXcap_imp
cmd DEY88p_imp cmd DEY88p_imp
cmd DTA00p_dta cmd DTA00p_dta
cmd EIF00p_eif
cmd ELS00p_els
cmd END00p_end cmd END00p_end
cmd EOR40p_acc cmd EOR40p_acc
cmd EQU00p_equ cmd EQU00p_equ
cmd ERT00p_ert cmd ERT00p_ert
cmd ICL00p_icl cmd ICL00p_icl
cmd IFT00p_ift
cmd INCe0p_srt cmd INCe0p_srt
cmd INIe2p_rui cmd INIe2p_rui
cmd INS00p_ins cmd INS00p_ins
@ -1637,7 +1835,7 @@ noper2 = ($-opert2)/2
opert1 db '+-*/%&|^=<>' opert1 db '+-*/%&|^=<>'
noper1 = $-opert1 noper1 = $-opert1
hello db 'X-Assembler 1.6 by Fox/Taquart',eot hello db 'X-Assembler 1.7 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
@ -1679,6 +1877,10 @@ e_fref db 'Illegal forward reference',eol
e_wpar db 'Use square brackets instead',eol e_wpar db 'Use square brackets instead',eol
e_brack db 'Not matching brackets',eol e_brack db 'Not matching brackets',eol
e_user db 'User error',eol e_user db 'User error',eol
e_tmift db 'Too many IFTs nested',eol
e_eifex db 'EIF expected',eol
e_mift db 'Missing IFT',eol
e_meif db 'Missing EIF',eol
exitcod dw 4c00h exitcod dw 4c00h
flags db 0 flags db 0
@ -1688,6 +1890,8 @@ iclen dw t_icl
laben dw t_lab-2 laben dw t_lab-2
pslab dw t_lab-2 pslab dw t_lab-2
orgvec dw t_org orgvec dw t_org
sift dw 0
elflag dd 1
sinmin dw 1 sinmin dw 1
sinmax dw 0 sinmax dw 0
sinadd dw ? sinadd dw ?