1
0
mirror of https://github.com/pfusik/xasm.git synced 2024-06-08 03:29:30 +00:00

xasm 2.4.-3.

This commit is contained in:
Piotr Fusik 2002-04-06 20:51:52 +02:00
parent 4d04b07860
commit f9a11b10e3
2 changed files with 199 additions and 115 deletions

2
t.bat Normal file
View File

@ -0,0 +1,2 @@
tasm xasm /m5 /t /z /l
tlink xasm /x

312
xasm.asm
View File

@ -1,18 +1,28 @@
; X-Assembler ; X-Assembler
EXE = 1
IDEAL IDEAL
P386 P386
IFDEF EXE
MODEL SMALL
ELSE
MODEL TINY MODEL TINY
ENDIF
CODESEG CODESEG
; comment out to disable ; comment out to disable
SET_WIN_TITLE = 1 SET_WIN_TITLE = 1
compak = 1d00h ; compak = 1d00h
l_icl = 1024 l_icl = 1024
l_org = 4096 l_org = 4096
IFDEF EXE
l_lab = 55000
ELSE
l_lab = 48000 l_lab = 48000
ENDIF
STRUC com STRUC com
c_code db ? c_code db ?
@ -81,9 +91,10 @@ m_swl = 8
b_swn = 4 b_swn = 4
m_swn = 10h m_swn = 10h
m_swo = 20h m_swo = 20h
m_sws = 40h m_swp = 40h
m_swt = 80h m_sws = 80h
m_swu = 100h m_swt = 100h
m_swu = 200h
;[flist] ;[flist]
m_lsti = 4 m_lsti = 4
@ -229,7 +240,7 @@ lstorg db 26 dup(?)
line db 258 dup(?) line db 258 dup(?)
tlabel db 256 dup(?) tlabel db 256 dup(?)
obuf db 128 dup(?) obuf db 128 dup(?)
obufen: obufen = $
objnam db 128 dup(?) objnam db 128 dup(?)
lstnam db 128 dup(?) lstnam db 128 dup(?)
tabnam db 128 dup(?) tabnam db 128 dup(?)
@ -239,13 +250,28 @@ t_org db l_org dup(?)
;***************************** ;*****************************
IFNDEF EXE
zero db 100h dup(?) zero db 100h dup(?)
ENDIF
start: start:
IFDEF compak IFDEF compak
undata undata
db compak+start-$ dup(?) db compak+start-$ dup(?)
ENDIF ENDIF
IFDEF EXE
mov dx, @data
mov es, dx
mov ss, dx
mov sp, offset staken
mov di, offset tlabel
mov ax, [16h]
stosw
mov si, 81h
movzx cx, [byte si-1]
inc cx
rep movsb
mov ds, dx
ENDIF
ifdef SET_WIN_TITLE ifdef SET_WIN_TITLE
mov di, offset hello mov di, offset hello
mov ax, 168eh mov ax, 168eh
@ -254,108 +280,87 @@ ENDIF
mov [titfin], ' ' mov [titfin], ' '
endif endif
print hello print hello
mov di, 81h IFDEF EXE
movzx cx, [di-1] mov si, offset tlabel+3
jcxz usg ; brak parametrow - usage ELSE
mov al, ' ' mov si, 82h
repe scasb ENDIF
je usg ; same spacje - usage mov [objnam], 0
dec di mov [lstnam], 0
inc cx mov [tabnam], 0
mov si, di mov [(icl t_icl).nam], 0 ; pusta nazwa zrodla
mov al, '?'
repne scasb ; parsuj argumenty
jne begin ; '?' - usage parg0: dec si
parg1: lodsb
cmp al, ' '
je parg1
cmp al, 9
je parg1
cmp al, 0dh
je pargx
cmp al, '/'
je popt1
mov di, offset (icl t_icl).nam
cmp [byte di], 0
jnz usg ; juz byla nazwa zrodla
mov dx, di
call clfname
call adasx
mov [fslen], di
jmp parg0
usg: print usgtxt ; usage - instrukcja usg: print usgtxt ; usage - instrukcja
dos 4c03h dos 4c03h
begin: lodsb ; pobierz nazwe popt1: lodsb
cmp al, '/' and al, 0dfh ; mala litera -> duza
je usg ; najpierw musi byc nazwa
mov di, offset (icl t_icl).nam+1
lea dx, [di-1]
xor ah, ah
mov [tabnam], ah ; nie ma nazwy tabeli symboli
dinam equ di-t_icl-offset (icl).nam
mnam1: dec di ; zapisz do t_icl.nam, ...
mov [objnam+dinam], ax ; ... objnam, ...
mov [lstnam+dinam], ax ; ... lstnam
stosw
lodsb
cmp al, ' '
je mnam2
cmp al, '/'
je mnam2
cmp al, 0dh
jne mnam1
mnam2: call adasx ; doczep .ASX
mov [fslen], di
chex1: dec di
cmp [byte di], '.'
jne chex1
mov [byte objnam+dinam], '.' ; doczep .OBX
mov [dword objnam+dinam+1], 'XBO'
mov [byte lstnam+dinam], '.' ; doczep .LST
mov [dword lstnam+dinam+1], 'TSL'
gsw0: dec si
gsw1: lodsb ; pobierz switche
cmp al, ' '
je gsw1 ; pomin spacje
cmp al, 0dh
je gswx
cmp al, '/'
jne usg ; musi byc '/'
lodsb
and al,0dfh ; mala litera -> duza
mov di, offset swilet mov di, offset swilet
mov cx, 9 mov cx, 10
repne scasb repne scasb
neusg: jne usg ; nie ma takiego switcha jne usg ; nie ma takiego switcha
bts [swits], cx ; sprawdz bit i ustaw bts [swits], cx ; sprawdz bit i ustaw
jc usg ; juz byl taki jc usg ; juz byl taki
mov di, offset lstnam mov di, offset lstnam
mov ecx, 'TSL'
cmp al, 'L' cmp al, 'L'
je gsw2 ; /L je popt2
mov di, offset tabnam mov di, offset tabnam
mov ecx, 'BAL'
cmp al, 'T' cmp al, 'T'
je gsw2 ; /T je popt2
cmp al, 'O' cmp al, 'O'
jne gsw1 ; switch bez parametru jne parg1 ; switch bez parametru
cmp [byte si], ':' cmp [byte si], ':' ; /O wymaga ':'
jne neusg ; /O wymaga ':' jne usg
mov di, offset objnam mov di, offset objnam
mov ecx, 'XBO' popt2: lodsb
gsw2: lodsb
cmp al, ':' cmp al, ':'
jne gsw0 jne parg0
mov dx, di ; jesli ':', to ... call clfna ; pobierz nazwe
gsw3: lodsb ; ... pobierz nazwe jmp parg0
stosb
cmp al, ' ' pargx:
je gsw4 cmp [(icl t_icl).nam], 0 ; czy jest nazwa?
cmp al, '/' je usg
je gsw4 mov di, offset lstnam
cmp al, 0dh mov eax, 'TSL'
jne gsw3 call defnam
gsw4: mov [byte di-1], 0 mov di, offset objnam
lda ecx ; doczep ecx mov eax, 'XBO'
call adext call defnam
jmp gsw0
gswx: mov al, [byte swits] mov al, [byte swits]
and al, m_lstl and al, m_lstl
xor al, m_lstl+m_lsto xor al, m_lstl+m_lsto
mov [flist], al mov [flist], al
testsw m_swe testsw m_swe
jz noswe jz noswe
IFDEF EXE
mov ax, [word tlabel]
jmp prpsp1
ENDIF
prpsp: mov ax, [16h] prpsp: mov ax, [16h]
mov ds, ax prpsp1: mov ds, ax
cmp ax, [16h] cmp ax, [16h]
jne prpsp jne prpsp
@ -363,7 +368,11 @@ prpsp: mov ax, [16h]
test ax, ax test ax, ax
jz enver jz enver
dec ax dec ax
IFDEF EXE
mov [ss:envseg], ax
ELSE
mov [cs:envseg], ax mov [cs:envseg], ax
ENDIF
mov ds, ax mov ds, ax
mov es, ax mov es, ax
mov si, 10h mov si, 10h
@ -391,12 +400,22 @@ renv3: lodsb
jnz renv3 jnz renv3
jmp renv1 jmp renv1
enver: push cs enver:
IFDEF EXE
push ss
ELSE
push cs
ENDIF
pop ds pop ds
print envtxt print envtxt
dos 4c02h dos 4c02h
renvx: push cs renvx:
IFDEF EXE
push ss
ELSE
push cs
ENDIF
pop ds pop ds
mov [envofs], di mov [envofs], di
stosb stosb
@ -909,7 +928,22 @@ hclose: cmp bx, nhand
fopen: cmp di, offset t_icl+l_icl-2 fopen: cmp di, offset t_icl+l_icl-2
jnb icler jnb icler
mov bx, [iclen] testsw m_swp
jz fopen1
push si
mov si, offset (icl).nam
add si, [iclen]
mov di, offset tlabel
file 60h, e_open
mov si, offset tlabel
mov di, offset (icl).nam
add di, [iclen]
fomna: lodsb
stosb
test al, al
jnz fomna
pop si
fopen1: mov bx, [iclen]
mov [(icl bx).line], 0 mov [(icl bx).line], 0
mov [(icl bx).flags], 0 mov [(icl bx).flags], 0
lea dx, [(icl bx).nam] lea dx, [(icl bx).nam]
@ -1140,8 +1174,9 @@ ctrail: cmp [byte di-1], ' '
je strail je strail
putlst: mov ax, 0a0dh putlst: mov ax, 0a0dh
stosw stosw
lea cx, [di+zero-lstnum]
mov dx, offset lstnum mov dx, offset lstnum
mov cx, di
sub cx, dx
putlad: mov bx, [lhand] putlad: mov bx, [lhand]
jfile 40h, e_wrlst jfile 40h, e_wrlst
@ -1217,6 +1252,37 @@ phbyte: aam 10h
stosw stosw
ret ret
; Pobierz nazwe pliku z linii polecen (al=#1 znak si=adr kolejnego) i zapisz do di
clfname:
clf1: stosb
clfna:
lodsb
cmp al, ' '
je clfx
cmp al, 9
je clfx
cmp al, '/'
je clfx
cmp al, 0dh
jne clf1
clfx: xor al, al
stosb
ret
; wpisz domyslna nazwe dla obx lub lst
defnam: cmp [byte di], 0
jnz defnr
mov si, [fslen]
defn1: dec si
cmp [byte si], '.'
jne defn1
lea cx, [si+1]
mov si, offset (icl t_icl).nam
sub cx, si
rep movsb
stosd
defnr: ret
; Pobierz znak (eol=error) ; Pobierz znak (eol=error)
get: lodsb get: lodsb
cmp al, 0dh cmp al, 0dh
@ -1286,7 +1352,8 @@ rlab2: stosb
jb rlab1 jb rlab1
linlon: push offset e_long linlon: push offset e_long
jmp erron jmp erron
rlabx: lea dx, [di+zero-tlabel+lab.nam] rlabx: lea dx, [(lab di).nam]
sub dx, offset tlabel
dec si dec si
cmp [byte tlabel], 'A' cmp [byte tlabel], 'A'
ret ret
@ -1313,7 +1380,8 @@ flab1: add si, cx
mov di, offset tlabel mov di, offset tlabel
repe cmpsb repe cmpsb
jne flab1 jne flab1
lea bx, [si+tlabel-offset (lab).nam] mov bx, offset tlabel - offset (lab).nam
add bx, si
sub bx, di ; c=0 sub bx, di ; c=0
flabx: pop si flabx: pop si
ret ret
@ -2074,8 +2142,7 @@ p_mws: call getops
jae ilamod jae ilamod
cmp al, 1 cmp al, 1
jne p_mw1 jne p_mw1
mov [byte high val], 0 and [dword val], 0ffh
mov [word val+2], 0
p_mw1: call mcall1 p_mw1: call mcall1
lea si, [op2] lea si, [op2]
call ldop call ldop
@ -2106,7 +2173,7 @@ p_mw4: test al, al
call savbyt call savbyt
jmp p_mw3 jmp p_mw3
p_mwh: shr [dword val], 8 p_mwh: sar [dword val], 8
p_mw2: call mcall1 p_mw2: call mcall1
p_mw3: lea si, [op2] p_mw3: lea si, [op2]
call ldop call ldop
@ -2596,6 +2663,11 @@ emift: error e_mift
etmift: error e_tmift etmift: error e_tmift
IFDEF EXE
ENDS
DATASEG
; ORG 0
ENDIF
; 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
@ -2611,7 +2683,8 @@ movtab movt <0a0h,p_ac1,080h,p_ac1,0,0>
movt <0a2h,p_ld1,086h,p_st1,0e8h,0cah> movt <0a2h,p_ld1,086h,p_st1,0e8h,0cah>
movt <0a0h,p_ld1,084h,p_st1,0c8h,088h> movt <0a0h,p_ld1,084h,p_st1,0c8h,088h>
comtab: cmd ADC0060p_acc comtab = $
cmd ADC0060p_acc
cmd ADD8018p_ads cmd ADD8018p_ads
cmd AND0020p_acc cmd AND0020p_acc
cmd ASL0000p_srt cmd ASL0000p_srt
@ -2714,9 +2787,10 @@ comtab: cmd ADC0060p_acc
cmd TXA008ap_imp cmd TXA008ap_imp
cmd TXS009ap_imp cmd TXS009ap_imp
cmd TYA0098p_imp cmd TYA0098p_imp
comend: comend = $
operpa: opr 1ret operpa = $
opr 1ret
opr 6add opr 6add
opr 6sub opr 6sub
opr 7mul opr 7mul
@ -2757,9 +2831,9 @@ optvec dw optl0,optl1,opth0,opth1,opto0,opto1
cndtxt dd 'DNE','TFI','ILE','SLE','FIE' cndtxt dd 'DNE','TFI','ILE','SLE','FIE'
cndvec dw pofend,0,p_ift,0,p_eli,0,p_els,0,p_eif cndvec dw pofend,0,p_ift,0,p_eli,0,p_els,0,p_eif
swilet db 'UTSONLIEC' swilet db 'UTSPONLIEC'
hello db 'X-Assembler 2.4.-4' hello db 'X-Assembler 2.4.-3'
ifdef SET_WIN_TITLE ifdef SET_WIN_TITLE
titfin db 0 titfin db 0
else else
@ -2768,26 +2842,27 @@ titfin db 0
db 'by Fox/Taquart',eot db '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 code excluded by ift/els/eli",eol
db "/e Set environment variables on error",eol db "/e Set environment variables ERRFILE and ERRLINE if error occurs",eol
db "/i Don't list included source",eol db "/i Don't list included files",eol
db "/l[:fname] Generate listing",eol db "/l[:fname] Generate listing",eol
db "/n Assemble only if source newer than object",eol db "/n Assemble only if source file is newer than object file",eol
db "/o:fname Write object as 'fname'",eol db "/o:fname Write object file as 'fname'",eol
db "/p Print fully qualified file names in listing and error messages",eol
db "/s Don't convert spaces to tabs in listing",eol db "/s Don't convert spaces to tabs in listing",eol
db "/t[:fname] List label table",eol db "/t[:fname] List label table",eol
db "/u Warn of unused labels",eot db "/u Warn of unused labels",eot
oldtxt db 'Source is older than object - not assembling',eot oldtxt db 'Source file is older than object file - not assembling',eot
envtxt db 'Can''t change environment',eot envtxt db 'Can''t change environment',eot
objtxt db 'Writing object...',eot objtxt db 'Writing object file...',eot
lsttxt db 'Writing listing...' lsttxt db 'Writing listing file...'
eoltxt db eot eoltxt db eot
srctxt db 'Source: ' srctxt db 'Source: '
srctxl = $-srctxt srctxl = $-srctxt
tabtxt db 'Label table:',eol tabtxt db 'Label table:',eol
tabtxl = $-tabtxt tabtxl = $-tabtxt
lintxt db ' lines of source assembled',eot lintxt db ' lines of source assembled',eot
byttxt db ' bytes written to object',eot byttxt db ' bytes written to the object file',eot
dectxt db 10 dup(' '),'$' dectxt db 10 dup(' '),'$'
wartxt db 'WARNING: $' wartxt db 'WARNING: $'
w_bugjp db 'Buggy indirect jump',eol w_bugjp db 'Buggy indirect jump',eol
@ -2798,10 +2873,10 @@ w_repl db 'Repeating only last instruction',eol
errtxt db 'ERROR: $' errtxt db 'ERROR: $'
e_open db 'Can''t open file',cr e_open db 'Can''t open file',cr
e_read db 'Disk read error',cr e_read db 'Disk read error',cr
e_crobj db 'Can''t write object',cr e_crobj db 'Can''t write to the object file',cr
e_wrobj db 'Error writing object',cr e_wrobj db 'Error writing to the object file',cr
e_crlst db 'Can''t write listing',cr e_crlst db 'Can''t write to the listing file',cr
e_wrlst db 'Error writing listing',cr e_wrlst db 'Error writing to the listing file',cr
e_icl db 'Too many files nested',cr e_icl db 'Too many files nested',cr
e_long db 'Line too long',cr e_long db 'Line too long',cr
e_uneol db 'Unexpected eol',cr e_uneol db 'Unexpected eol',cr
@ -2820,7 +2895,7 @@ e_bra db 'Branch out of range by $'
brout db ' bytes',cr brout db ' bytes',cr
e_sin db 'Bad or missing sinus parameter',cr e_sin db 'Bad or missing sinus parameter',cr
e_spac db 'Space expected',cr e_spac db 'Space expected',cr
e_opt db 'Invalid options',cr e_opt db 'Invalid option',cr
e_over db 'Arithmetic overflow',cr e_over db 'Arithmetic overflow',cr
e_div0 db 'Divide by zero',cr e_div0 db 'Divide by zero',cr
e_range db 'Value out of range',cr e_range db 'Value out of range',cr
@ -2894,7 +2969,7 @@ envnam dw ?
envnum dw ? envnum dw ?
envlen dw ? envlen dw ?
var: var = $
MACRO bb _name MACRO bb _name
_name&o = $-var _name&o = $-var
_name equ byte bp+_name&o _name equ byte bp+_name&o
@ -2923,5 +2998,12 @@ ENDIF
t_lab db l_lab dup(?) t_lab db l_lab dup(?)
IFDEF EXE
stak db 400h dup(?)
staken = $
ENDS
STACK 100h
ENDIF
ENDS ENDS
END start END start