mirror of
https://github.com/pfusik/xasm.git
synced 2025-02-14 17:31:39 +00:00
X-BOOT 4.0 beta 2.
This commit is contained in:
parent
da00b4d6b8
commit
8fd13bc4f4
586
xboot.asm
586
xboot.asm
@ -1,181 +1,437 @@
|
||||
; ><-B00T III b. Fox
|
||||
; ><-B00T IV b. Fox
|
||||
|
||||
IDEAL
|
||||
P386
|
||||
MODEL TINY
|
||||
CODESEG
|
||||
ORG 100h
|
||||
include 'fox.mak'
|
||||
zero db 100h dup(?)
|
||||
|
||||
blen = 60*1024
|
||||
|
||||
m_pro = 1 ; /p switch
|
||||
m_wild = 2 ; obx has wild char
|
||||
m_errs = 4 ; error/warning occured while current file
|
||||
m_donta = 8 ; don't change output ext to atr
|
||||
|
||||
ffnam = 80h+1eh
|
||||
|
||||
eol equ 13,10
|
||||
eot equ 13,10,'$'
|
||||
|
||||
MACRO lda _rg ;shorter than 'mov (e)ax, _rg'
|
||||
_rge SUBSTR <_rg>, 1, 1
|
||||
IFIDNI _rge, <e>
|
||||
xchg eax, _rg
|
||||
ELSE
|
||||
xchg ax, _rg
|
||||
ENDIF
|
||||
ENDM
|
||||
|
||||
MACRO sta _rg ;shorter than 'mov _rg, (e)ax'
|
||||
_rge SUBSTR <_rg>, 1, 1
|
||||
IFIDNI _rge, <e>
|
||||
xchg _rg, eax
|
||||
ELSE
|
||||
xchg _rg, ax
|
||||
ENDIF
|
||||
ENDM
|
||||
|
||||
MACRO dos _func
|
||||
IFNB <_func>
|
||||
IF _func and 0ff00h
|
||||
mov ax, _func
|
||||
ELSE
|
||||
mov ah, _func
|
||||
ENDIF
|
||||
ENDIF
|
||||
int 21h
|
||||
ENDM
|
||||
|
||||
MACRO file _func
|
||||
IFNB <_func>
|
||||
IF _func and 0ff00h
|
||||
mov ax, _func
|
||||
ELSE
|
||||
mov ah, _func
|
||||
ENDIF
|
||||
ENDIF
|
||||
call xdisk
|
||||
ENDM
|
||||
|
||||
MACRO jfile _func
|
||||
IFNB <_func>
|
||||
IF _func and 0ff00h
|
||||
mov ax, _func
|
||||
ELSE
|
||||
mov ah, _func
|
||||
ENDIF
|
||||
ENDIF
|
||||
jmp xdisk
|
||||
ENDM
|
||||
|
||||
MACRO print _text
|
||||
IFNB <_text>
|
||||
mov dx, offset _text
|
||||
ENDIF
|
||||
dos 9
|
||||
ENDM
|
||||
|
||||
|
||||
start:
|
||||
db 1024 dup(0) ;for COMpack
|
||||
db 1536 dup(0) ; COMpack sux
|
||||
mov [spt], sp
|
||||
print hello
|
||||
mov di, 81h
|
||||
movzx cx, [di-1]
|
||||
jcxz usg
|
||||
mov al, '?'
|
||||
repne scasb
|
||||
jne nousg
|
||||
|
||||
usg: mov dx, offset usgtxt
|
||||
panic: print
|
||||
dos 4c01h
|
||||
mov si, 81h ; pobierz argumenty
|
||||
mov di, offset obxnam
|
||||
mov ch, -1
|
||||
|
||||
getfil: mov ch, -1
|
||||
mov al, ' '
|
||||
repe scasb
|
||||
mov dx, offset fname
|
||||
lea si, [di-1]
|
||||
cmp [byte si], 0dh
|
||||
je usg
|
||||
mov di, dx
|
||||
movfn1: movsb
|
||||
cmp [si], al
|
||||
ja movfn1
|
||||
mov bx, di
|
||||
srchex: dec bx
|
||||
cmp [byte bx], '\'
|
||||
je addext
|
||||
cmp [byte bx], '.'
|
||||
je extexs
|
||||
cmp bx, dx
|
||||
ja srchex
|
||||
addext: xchg eax, ebp
|
||||
arg1: lodsb
|
||||
cmp al, ' '
|
||||
je arg1 ; spacje omijamy
|
||||
cmp al, '/'
|
||||
jne nswit
|
||||
lodsb ; '/' - switch
|
||||
and al, 0dfh
|
||||
cmp al, 'P'
|
||||
jne usg
|
||||
or [flags], m_pro ; '/P'
|
||||
jmp arg1
|
||||
nswit: cmp al, 0dh
|
||||
je argx
|
||||
cmp di, offset atrnam
|
||||
ja usg ; byly juz dwie nazwy
|
||||
|
||||
spath: mov dl, -1 ; dolaczaj rozsz.
|
||||
cmp di, offset atrnam
|
||||
jnb snam1
|
||||
and [flags], not m_wild
|
||||
mov [onam], di ; onam - adres nazwy PLIKU .obx
|
||||
snam1: cmp di, offset atrnam
|
||||
ja snam2
|
||||
cmp al, '*' ; w obx sprawdzaj wildy
|
||||
je wildch
|
||||
cmp al, '?'
|
||||
jne snam2
|
||||
wildch: or [flags], m_wild
|
||||
snam2: cmp al, '.'
|
||||
jne npoint
|
||||
xor dl, dl ; jest rozszerzenie - nie dolaczaj .obx
|
||||
npoint: stosb ; przepisz nazwe
|
||||
lodsb
|
||||
cmp al, ' ' ; spacja lub eol konczy
|
||||
je snamx
|
||||
cmp al, 0dh
|
||||
je snamx
|
||||
cmp al, '/'
|
||||
je snamx ; '/' tez konczy
|
||||
cmp [byte di-1], '\'
|
||||
je spath
|
||||
jmp snam1
|
||||
|
||||
snamx: mov eax, 'XBO.'
|
||||
cmp di, offset atrnam
|
||||
jb adobx
|
||||
test [flags], m_wild
|
||||
jz atrnwl
|
||||
mov al, '\'
|
||||
cmp al, [di-1]
|
||||
je panam
|
||||
stosb
|
||||
panam: mov [anam], di
|
||||
jmp nadext
|
||||
atrnwl: test dl, dl
|
||||
jz adatr ; jest podane rozszerzenie -
|
||||
or [flags], m_donta ; nie zmieniaj go na atr
|
||||
adatr: mov eax, 'RTA.'
|
||||
adobx: test dl, dl
|
||||
jz nadext
|
||||
stosd
|
||||
extexs: mov [byte di], 0
|
||||
rts: ret
|
||||
|
||||
smartdisk
|
||||
|
||||
badf: mov dx, offset badtxt
|
||||
jmp panic
|
||||
|
||||
nousg: mov ch, -1
|
||||
mov di, 81h
|
||||
mov al, ' '
|
||||
repe scasb
|
||||
mov ax, [di-1]
|
||||
nadext: xor al, al
|
||||
stosb
|
||||
mov [nfin], di
|
||||
dec si
|
||||
cmp di, offset atrnam
|
||||
mov di, offset atrnam
|
||||
jb arg1
|
||||
inc di
|
||||
or ah, 20h
|
||||
cmp ax, 'p/'
|
||||
je romsw
|
||||
dec [romfl]
|
||||
mov di, 81h
|
||||
romsw: mov ebp, 'XBO.'
|
||||
call getfil
|
||||
push si
|
||||
jmp arg1
|
||||
|
||||
fopen
|
||||
mov cx, blen
|
||||
fread bufr
|
||||
mov dx, offset lontxt
|
||||
cmp ax, blen
|
||||
jnb panic
|
||||
mov [len], ax
|
||||
fclose
|
||||
usg: print usgtxt
|
||||
dos 4c03h
|
||||
|
||||
mov si, offset bufr
|
||||
mov di, si
|
||||
lodsw
|
||||
cmp ax, -1
|
||||
jne badf
|
||||
argx: cmp di, offset atrnam
|
||||
jb usg ; nie ma nazwy
|
||||
ja jesatr
|
||||
mov cx, [nfin]
|
||||
test [flags], m_wild
|
||||
jz nowil1 ; jak jeden plik, to przepiszemy cala nazwe
|
||||
mov cx, [onam] ; jak wiele, to tylko sciezke
|
||||
nowil1: mov si, offset obxnam
|
||||
sub cx, si
|
||||
rep movsb
|
||||
mov [nfin], di
|
||||
jesatr:
|
||||
|
||||
mov ax, [si]
|
||||
test [flags], m_wild
|
||||
jz nowild
|
||||
xor cx, cx
|
||||
mov dx, offset obxnam
|
||||
mov ah, 4eh ; jak wiele, to szukamy
|
||||
|
||||
main1: and [flags], not m_errs
|
||||
mov [ohand], 0
|
||||
mov [ahand], 0
|
||||
mov [len], lodlen+endlen
|
||||
dos
|
||||
jc fin
|
||||
mov si, 80h+1eh
|
||||
mov di, [anam]
|
||||
mov bx, [onam]
|
||||
mona1: lodsb
|
||||
stosb
|
||||
mov [bx], al
|
||||
inc bx
|
||||
test al, al
|
||||
jnz mona1
|
||||
mov [nfin], di
|
||||
|
||||
nowild: mov si, offset obxnam
|
||||
call printz ; file.obx
|
||||
mov dx, offset obxnam
|
||||
mov bp, offset e_open
|
||||
file 3d00h ; open for reading
|
||||
mov [ohand], ax
|
||||
call xreadh
|
||||
jb enate
|
||||
cmp [head], -1
|
||||
jne enate
|
||||
|
||||
mov dx, offset head
|
||||
mov cx, 4
|
||||
call xread
|
||||
jb enate
|
||||
|
||||
mov ax, [head]
|
||||
mov [l1runl], al
|
||||
mov [l2runl], al
|
||||
mov [l1runh], ah
|
||||
mov [l2runh], ah
|
||||
|
||||
cutf1: lodsw
|
||||
cmp ax, -1
|
||||
je cutf1
|
||||
stosw
|
||||
sta bx
|
||||
lodsw
|
||||
stosw
|
||||
sub ax, bx
|
||||
jb badf
|
||||
inc ax
|
||||
sta cx
|
||||
rep movsb
|
||||
cutfn: mov ax, si
|
||||
sub ax, offset bufr
|
||||
cmp ax, [len]
|
||||
jb cutf1
|
||||
mov si, offset endseq1
|
||||
cmp [romfl], 0
|
||||
jz stdld
|
||||
push di
|
||||
mov si, offset romlod
|
||||
mov di, offset sect
|
||||
mov cx, 64
|
||||
rep movsw
|
||||
pop di
|
||||
mov si, offset endseq2
|
||||
stdld: mov cx, endlen
|
||||
rep movsb
|
||||
mov cx, offset sect
|
||||
sub cx, di
|
||||
and cx, 7fh
|
||||
xor al, al
|
||||
rep stosb
|
||||
sub di, offset begin
|
||||
mov [len], di
|
||||
shr di, 4
|
||||
dec di
|
||||
mov [paras], di
|
||||
print arrow ; ->
|
||||
test [flags], m_donta
|
||||
jnz jatrex
|
||||
mov di, [nfin]
|
||||
mov si, di
|
||||
cetatr: dec si
|
||||
cmp [byte si], '\'
|
||||
je cetafn
|
||||
cmp [byte si], '.'
|
||||
jne cetatr
|
||||
mov di, si
|
||||
cetafn: mov eax, 'RTA.'
|
||||
stosd
|
||||
mov [byte di], 0
|
||||
jatrex:
|
||||
mov si, offset atrnam
|
||||
call printz ; file.atr
|
||||
xor cx, cx
|
||||
mov dx, offset atrnam
|
||||
mov bp, offset e_creat
|
||||
file 3ch ; create
|
||||
mov [ahand], ax
|
||||
print kropki ; ...
|
||||
|
||||
pop di
|
||||
mov ebp, 'RTA.'
|
||||
call getfil
|
||||
fcreate
|
||||
mov cx, [len]
|
||||
mov cx, beglen
|
||||
mov dx, offset begin
|
||||
fwrite
|
||||
fclose
|
||||
call xwrite
|
||||
mov cx, lodlen
|
||||
mov dx, offset stdlod
|
||||
test [flags], m_pro
|
||||
jz stlo
|
||||
mov dx, offset prolod
|
||||
stlo: call xwrite
|
||||
jmp firs
|
||||
|
||||
skff:
|
||||
call xreadh
|
||||
jb finfil
|
||||
cmp [head], -1
|
||||
je skff
|
||||
mov dx, offset head+2
|
||||
call xread2
|
||||
jb finfil
|
||||
|
||||
firs: mov cx, [head+2]
|
||||
sub cx, [head]
|
||||
jb einva
|
||||
inc cx
|
||||
cmp cx, blen
|
||||
ja einva
|
||||
mov dx, offset blok
|
||||
call xread
|
||||
jb trunc
|
||||
call xwrihd
|
||||
jmp skff
|
||||
|
||||
trunc: test ax, ax
|
||||
jz finfil
|
||||
dec ax
|
||||
push ax
|
||||
add ax, [head]
|
||||
mov [head+2], ax
|
||||
mov dx, offset w_trunc
|
||||
call warni
|
||||
pop ax
|
||||
call xwrihd
|
||||
|
||||
finfil: mov dx, offset endseq1
|
||||
test [flags], m_pro
|
||||
jz endst
|
||||
mov dx, offset endseq2
|
||||
endst: mov cx, endlen
|
||||
call xwrite
|
||||
mov cx, 40h
|
||||
xor ax, ax
|
||||
mov di, offset head
|
||||
rep stosw
|
||||
sta cx
|
||||
sub cl, [byte len]
|
||||
and ecx, 7fh
|
||||
jz fuls
|
||||
call xwrith
|
||||
fuls: xor cx, cx ; seek back to para's atr header field
|
||||
mov dx, 2
|
||||
mov bp, offset e_write
|
||||
file 4200h
|
||||
shr [len], 4
|
||||
mov cx, 2
|
||||
mov dx, offset len
|
||||
call xwrite
|
||||
|
||||
shut: mov bx, [ahand]
|
||||
mov bp, offset e_write
|
||||
call xclose
|
||||
mov bx, [ohand]
|
||||
mov bp, offset e_read
|
||||
call xclose
|
||||
|
||||
test [flags], m_errs
|
||||
jnz nook
|
||||
print oktxt
|
||||
dos 4c00h
|
||||
nook: print eoltxt
|
||||
test [flags], m_wild
|
||||
jz fin
|
||||
mov ah, 4fh
|
||||
jmp main1
|
||||
|
||||
; Poetry
|
||||
hello db 'X-BOOT 3.2 by Fox/Taquart',eot
|
||||
usgtxt db 'Converts Atari 8-bit executable into .ATR disk image.',eol
|
||||
db 'Syntax: XBOOT [/p] obxfile atrfile',eol
|
||||
db 'Use /p switch to write professional loader rather than standard.',eot
|
||||
oktxt db 'O.K.',eot
|
||||
badtxt db 'Bad format of file!',eot
|
||||
lontxt db 'File too long',eot
|
||||
smarterr
|
||||
fin: mov ax, [exitcod]
|
||||
dos
|
||||
|
||||
romfl db 1
|
||||
xdisk: push bp
|
||||
dos
|
||||
pop dx
|
||||
jnc rts
|
||||
error: mov sp, [spt]
|
||||
mov [byte exitcod], 2
|
||||
or [flags], m_errs
|
||||
print
|
||||
jmp shut
|
||||
|
||||
; Ending Header for loader #1
|
||||
endseq1 db 233,7,235,7,108,224,2
|
||||
; Ending Header for loader #2
|
||||
endseq2 db 244,4,246,4,108,224,2
|
||||
endlen = $-endseq2
|
||||
warni: cmp [byte exitcod], 1
|
||||
jae nwacod
|
||||
mov [byte exitcod], 1
|
||||
nwacod: or [flags], m_errs
|
||||
print
|
||||
ret
|
||||
|
||||
; Loader #2 (rom)
|
||||
romlod db 96,1,128,4,119,228,169,0,141,47,2,169,82,141,200,2,165
|
||||
db 20,197,20,240,252,169
|
||||
l2runl db 128,141,224,2,169
|
||||
l2runh db 4,141,225,2,160,254,169
|
||||
db 128,141,226,2,169,4,141,227,2,162,251,149,72,232,134,67,76,188
|
||||
db 4,230,68,208,2,230,69,200,16,32,238,10,3,208,3,238,11,3
|
||||
db 169,255,141,1,211,78,14,212,88,32,83,228,56,48,170,120,160,0
|
||||
db 140,14,212,206,1,211,185,0,4,166,67,208,200,129,68,165,68,197
|
||||
db 70,208,200,165,69,197,71,208,194,152,72,32,253,4,104,168,16,165
|
||||
db 108,226,2
|
||||
enate: mov dx, offset e_nota
|
||||
jmp error
|
||||
|
||||
einva: mov dx, offset e_head
|
||||
jmp error
|
||||
|
||||
xreadh: mov dx, offset head
|
||||
xread2: mov cx, 2
|
||||
xread: mov bx, [ohand]
|
||||
mov bp, offset e_read
|
||||
file 3fh
|
||||
cmp ax, cx
|
||||
ret
|
||||
|
||||
xwrihd: add ax, 4
|
||||
movzx ecx, ax
|
||||
mov ax, [head]
|
||||
mov dx, [head+2]
|
||||
test [flags], m_pro
|
||||
jnz chkpro
|
||||
cmp ah, 8
|
||||
jae chkst1
|
||||
cmp dh, 7
|
||||
jae ememc
|
||||
chkst1: cmp dh, 0c0h
|
||||
jb xwrith
|
||||
cmp dh, 0d0h
|
||||
jb eproc
|
||||
cmp ah, 0d8h
|
||||
jb xwrith
|
||||
eproc: mov dx, offset w_prof
|
||||
jmp xwwarn
|
||||
|
||||
chkpro: cmp ah, 5
|
||||
jae xwrith
|
||||
cmp dh, 4
|
||||
jb xwrith
|
||||
|
||||
ememc: mov dx, offset w_mem
|
||||
xwwarn: push ecx
|
||||
call warni
|
||||
pop ecx
|
||||
|
||||
xwrith: mov dx, offset head
|
||||
xwritl: add [len], ecx
|
||||
xwrite: mov bx, [ahand]
|
||||
mov bp, offset e_write
|
||||
jfile 40h
|
||||
|
||||
xclose: test bx, bx
|
||||
jz rts
|
||||
jfile 3eh
|
||||
|
||||
pnam1: sta dx
|
||||
dos 2
|
||||
printz: lodsb
|
||||
test al, al
|
||||
jnz pnam1
|
||||
rts: ret
|
||||
|
||||
hello db 'X-BOOT 4.0á2 by Fox/Taquart',eot
|
||||
usgtxt db 'XBOOT [/p] obxfile [atrfile]',eol
|
||||
db ' Convert single Atari 8-bit executable into .ATR disk image.',eol
|
||||
db 'XBOOT [/p] obxfiles [atrpath]',eol
|
||||
db ' Convert many files - wildcards allowed.',eol
|
||||
db '/p switch',eol
|
||||
db ' Write professional loader rather than standard.'
|
||||
eoltxt db eot
|
||||
arrow db ' -> $'
|
||||
kropki db ' ... $'
|
||||
oktxt db 'OK$'
|
||||
w_mem db eol,' WARNING: Memory conflict$'
|
||||
w_prof db eol,' WARNING: Professional loader needed$'
|
||||
w_trunc db eol,' WARNING: Last block truncated$'
|
||||
e_nota db eol,' ERROR: Not Atari executable$'
|
||||
e_head db eol,' ERROR: Invalid header$'
|
||||
e_open db eol,' ERROR: Can''t open file$'
|
||||
e_read db eol,' ERROR: Disk read error$'
|
||||
e_creat db eol,' ERROR: Can''t create file$'
|
||||
e_write db eol,' ERROR: Disk write error$'
|
||||
|
||||
; ATR Header
|
||||
begin dw 296h
|
||||
paras dw 0
|
||||
dw 80h,5 dup(0)
|
||||
; Atari Boot Sector(s)
|
||||
sect:
|
||||
begin dw 296h,0,80h,5 dup(0)
|
||||
beglen = $-begin
|
||||
|
||||
; Loader #1 (std)
|
||||
db 96,1,128,7,119,228,160,215,185,30,7,145,88,200,192,226,144
|
||||
stdlod db 96,1,128,7,119,228,160,215,185,30,7,145,88,200,192,226,144
|
||||
db 246,169
|
||||
l1runl db 128,141,224,2,169
|
||||
l1runh db 7,141,225,2,169,7,141,5,3,160,255
|
||||
@ -186,12 +442,42 @@ l1runh db 7,141,225,2,169,7,141,5,3,160,255
|
||||
db 32,242,7,104,168,16,181,108,226,2,44,111,97,100,105,110,103,14
|
||||
db 14,14,0
|
||||
|
||||
beglen = $-begin
|
||||
bufr db blen dup(?)
|
||||
lodlen = $-stdlod
|
||||
|
||||
len dw ?
|
||||
; Ending Header for loader #1
|
||||
endseq1 db 233,7,235,7,108,224,2
|
||||
|
||||
fname db 128 dup(?)
|
||||
; Loader #2 (rom)
|
||||
prolod db 96,1,128,4,119,228,169,0,141,47,2,169,82,141,200,2,165
|
||||
db 20,197,20,240,252,169
|
||||
l2runl db 128,141,224,2,169
|
||||
l2runh db 4,141,225,2,160,254,169
|
||||
db 128,141,226,2,169,4,141,227,2,162,251,149,72,232,134,67,76,188
|
||||
db 4,230,68,208,2,230,69,200,16,32,238,10,3,208,3,238,11,3
|
||||
db 169,255,141,1,211,78,14,212,88,32,83,228,56,48,170,120,160,0
|
||||
db 140,14,212,206,1,211,185,0,4,166,67,208,200,129,68,165,68,197
|
||||
db 70,208,200,165,69,197,71,208,194,152,72,32,253,4,104,168,16,165
|
||||
db 108,226,2
|
||||
|
||||
; Ending Header for loader #2
|
||||
endseq2 db 244,4,246,4,108,224,2
|
||||
endlen = $-endseq2
|
||||
|
||||
exitcod dw 4c00h
|
||||
flags db 0
|
||||
len dd lodlen+endlen
|
||||
ohand dw 0
|
||||
ahand dw 0
|
||||
anam dw atrnam
|
||||
onam dw ?
|
||||
nfin dw ?
|
||||
spt dw ?
|
||||
|
||||
obxnam db 100h dup(?)
|
||||
atrnam db 100h dup(?)
|
||||
|
||||
head dw ?,?
|
||||
blok db blen dup(?)
|
||||
|
||||
ENDS
|
||||
END start
|
Loading…
x
Reference in New Issue
Block a user