X-BOOT 4.0 beta 2.

This commit is contained in:
Piotr Fusik 1999-03-22 16:14:12 +01:00
parent da00b4d6b8
commit 8fd13bc4f4
1 changed files with 436 additions and 150 deletions

586
xboot.asm
View File

@ -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