mirror of
https://github.com/pfusik/xasm.git
synced 2025-02-17 06:31:12 +00:00
X-LOAD 1.0 - loads Atari 8-bit executables via a SIO2PC cable.
This commit is contained in:
parent
299ab916c8
commit
fd5370e7c4
446
xload.asm
Normal file
446
xload.asm
Normal file
@ -0,0 +1,446 @@
|
||||
IDEAL
|
||||
P386
|
||||
MODEL TINY
|
||||
CODESEG
|
||||
zero db 100h dup(?)
|
||||
|
||||
ratio equ 671/1000
|
||||
timeAnswer = 2500*ratio
|
||||
timeChecksum = 1500*ratio
|
||||
timeSending = 600*ratio
|
||||
timeNormal = 900*ratio
|
||||
timeBefore = 1500*ratio
|
||||
timeBetween = 600*ratio
|
||||
timeUltra = 310*ratio
|
||||
|
||||
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 fread _fbufr
|
||||
mov dx, offset _fbufr
|
||||
call xread
|
||||
ENDM
|
||||
|
||||
MACRO print _text
|
||||
IFNB <_text>
|
||||
mov dx, offset _text
|
||||
ENDIF
|
||||
dos 9
|
||||
ENDM
|
||||
|
||||
|
||||
start:
|
||||
db 1536 dup(0) ;compack
|
||||
print hello
|
||||
|
||||
mov si, 81h
|
||||
mov di, offset obxnam
|
||||
|
||||
arg1: lodsb
|
||||
cmp al, ' '
|
||||
je arg1
|
||||
cmp al, '/'
|
||||
jne nswit
|
||||
lodsb
|
||||
cmp al, '4'
|
||||
ja ndigt
|
||||
sub al, '1'
|
||||
jb usg
|
||||
mov [byte port], al
|
||||
jmp arg1
|
||||
ndigt: and al, 0dfh
|
||||
cmp al, 'P'
|
||||
jne usg
|
||||
mov [prof], al
|
||||
jmp arg1
|
||||
nswit: cmp al, 0dh
|
||||
je argx
|
||||
cmp di, offset obxnam
|
||||
ja usg
|
||||
mnam1: stosb
|
||||
lodsb
|
||||
cmp al, ' '
|
||||
je mnam2
|
||||
cmp al, '/'
|
||||
je mnam2
|
||||
cmp al, 0dh
|
||||
jne mnam1
|
||||
mnam2: dec si
|
||||
mov bx, di
|
||||
lea cx, [di+zero-obxnam]
|
||||
adex1: dec bx
|
||||
cmp [byte bx], '.'
|
||||
je adexn
|
||||
cmp [byte bx], '\'
|
||||
loopne adex1
|
||||
mov eax, 'XBO.'
|
||||
stosd
|
||||
adexn: mov [byte di], 0
|
||||
jmp arg1
|
||||
|
||||
usg: print usgtxt
|
||||
dos 4c03h
|
||||
|
||||
noport: mov dx, offset nocom
|
||||
jmp panic
|
||||
nobin: mov dx, offset e_nota
|
||||
jmp panic
|
||||
|
||||
xdisk: push bp
|
||||
dos
|
||||
pop dx
|
||||
jc panic
|
||||
ret
|
||||
|
||||
panic: print
|
||||
dos 4c02h
|
||||
|
||||
xread: mov bp, offset e_read
|
||||
file 3fh
|
||||
cmp ax, cx
|
||||
ret
|
||||
|
||||
argx: cmp di, offset obxnam
|
||||
jbe usg
|
||||
mov bx, [port]
|
||||
add [comnum1], bl
|
||||
add [comnum2], bl
|
||||
add bx, bx
|
||||
push ds
|
||||
push 40h
|
||||
pop ds
|
||||
mov cx, [bx]
|
||||
pop ds
|
||||
jcxz noport
|
||||
mov [port], cx
|
||||
|
||||
mov dx, offset obxnam
|
||||
mov bp, offset e_open
|
||||
file 3d00h ; open for reading
|
||||
sta bx
|
||||
mov cx, 2
|
||||
fread dcb
|
||||
cmp [word dcb], 0ffffh
|
||||
jne nobin
|
||||
|
||||
mov dx, [port]
|
||||
mov al, 3
|
||||
add dl, al
|
||||
out dx, al
|
||||
and dl, 0feh
|
||||
xor al, al
|
||||
out dx, al
|
||||
|
||||
print rboot
|
||||
|
||||
mov dx, [port]
|
||||
mov cx, 6
|
||||
call speed
|
||||
and dl, 0f8h
|
||||
mov al, 5
|
||||
out dx, al
|
||||
in al, dx
|
||||
|
||||
mov di, offset dcb
|
||||
|
||||
main: mov dx, [port]
|
||||
in al, 60h
|
||||
cmp al, 1
|
||||
je byebye
|
||||
|
||||
add dl, 5
|
||||
in al, dx
|
||||
test al, 1
|
||||
jz main
|
||||
|
||||
and dl, 0f8h
|
||||
in al, dx
|
||||
mov [di+5], al
|
||||
stosb
|
||||
cmp di, offset dcb+5
|
||||
jb sk1
|
||||
mov di, offset dcb
|
||||
sk1: cmp [byte di], 31h
|
||||
jne main
|
||||
|
||||
cmp [byte di+1], 'R'
|
||||
je xcom_r
|
||||
cmp [byte di+1], 'S'
|
||||
jne main
|
||||
|
||||
xcom_s: call ack
|
||||
mov si, offset statdat
|
||||
mov cx, 5
|
||||
call send
|
||||
print booting
|
||||
jmp main
|
||||
|
||||
xcom_r: cmp [word di+2], 1
|
||||
jne main
|
||||
call ack
|
||||
mov si, offset bootstd
|
||||
test [prof], 0ffh
|
||||
jz sk3
|
||||
mov si, offset bootpro
|
||||
sk3: mov cx, 129
|
||||
call send
|
||||
call wate
|
||||
|
||||
mov cx, 2
|
||||
call speed
|
||||
mov [trtime], timeUltra
|
||||
|
||||
test [prof], 0ffh
|
||||
jz nodrom
|
||||
call wtblok
|
||||
mov si, offset bankdat
|
||||
mov cx, 4
|
||||
call send
|
||||
nodrom:
|
||||
|
||||
call wtblok
|
||||
|
||||
ffff: mov cx, 2
|
||||
fread head
|
||||
jb kpliq
|
||||
cmp [head], 0ffffh
|
||||
je ffff
|
||||
mov cx, 2
|
||||
fread head+2
|
||||
jb kpliq
|
||||
mov di, offset hexnum
|
||||
mov ax, [head]
|
||||
call hexw
|
||||
inc di
|
||||
mov ax, [head+2]
|
||||
call hexw
|
||||
print loading
|
||||
mov ax, [head]
|
||||
dec ax
|
||||
sub [head+2], ax
|
||||
|
||||
dalej: mov ax, [head+2]
|
||||
cmp ax, 100h
|
||||
jbe sk2
|
||||
mov ax, 100h
|
||||
sk2: sub [head+2], ax
|
||||
sta cx
|
||||
fread buf+3
|
||||
mov cx, ax
|
||||
jcxz kpliq
|
||||
mov si, offset buf
|
||||
add ax, [head]
|
||||
dec ah
|
||||
xchg al, ah
|
||||
mov [si], ax
|
||||
mov al, cl
|
||||
neg al
|
||||
mov [si+2], al
|
||||
add cx, 3
|
||||
call send
|
||||
|
||||
inc [byte high head]
|
||||
call wtblok
|
||||
cmp [head+2], 0
|
||||
jnz dalej
|
||||
jmp ffff
|
||||
|
||||
kpliq:
|
||||
mov si, offset runstd
|
||||
test [prof], 0ffh
|
||||
jz sk4
|
||||
mov si, offset runpro
|
||||
sk4: mov cx, 4
|
||||
call send
|
||||
|
||||
mov bp, offset e_read
|
||||
file 3eh ; close file
|
||||
print done
|
||||
byebye: dos 4c00h
|
||||
|
||||
wtblok: in al, 60h
|
||||
cmp al, 1
|
||||
je byebye
|
||||
and dl, 0f8h
|
||||
add dl, 5
|
||||
in al, dx
|
||||
test al, 1
|
||||
jz wtblok
|
||||
and dl, 0f8h
|
||||
in al, dx
|
||||
mov si, offset bttime
|
||||
jmp wate
|
||||
|
||||
speed: and dl, 0f8h
|
||||
add dl, 3
|
||||
in al, dx
|
||||
push ax
|
||||
or al, 80h
|
||||
out dx, al
|
||||
and dl, 0f8h
|
||||
mov ax, cx
|
||||
out dx, ax
|
||||
add dl, 3
|
||||
pop ax
|
||||
out dx, al
|
||||
ret
|
||||
|
||||
send: push si
|
||||
mov si, offset trtime
|
||||
call wate
|
||||
pop si
|
||||
mov dx, [port]
|
||||
outsb
|
||||
loop send
|
||||
ret
|
||||
|
||||
ack: mov si, offset ackdat
|
||||
call wate
|
||||
outsb
|
||||
call wate
|
||||
outsb
|
||||
wate: in al, 61h
|
||||
and al, 0fch
|
||||
out 61h, al
|
||||
mov ah, al
|
||||
mov al, 0b0h
|
||||
out 43h, al
|
||||
lodsb
|
||||
out 42h, al
|
||||
lodsb
|
||||
out 42h, al
|
||||
mov al, 1
|
||||
or al, ah
|
||||
out 61h, al
|
||||
mov al, 080h
|
||||
out 43h, al
|
||||
wate1: in al, 42h
|
||||
in al, 42h
|
||||
cmp al, 255
|
||||
je wate1
|
||||
wate2: in al, 42h
|
||||
in al, 42h
|
||||
cmp al, 255
|
||||
jne wate2
|
||||
mov al, ah
|
||||
out 61h, al
|
||||
ret
|
||||
|
||||
hexw: push ax
|
||||
mov al, ah
|
||||
call hexb
|
||||
pop ax
|
||||
hexb: aam 10h
|
||||
cmp al, 10
|
||||
sbb al, 69h
|
||||
das
|
||||
xchg al, ah
|
||||
cmp al, 10
|
||||
sbb al, 69h
|
||||
das
|
||||
stosw
|
||||
ret
|
||||
|
||||
ackdat: dw timeAnswer
|
||||
db 'A'
|
||||
dw timeChecksum
|
||||
db 'A'
|
||||
dw timeSending
|
||||
|
||||
statdat db 098h,0FFh,001h,000h,099h
|
||||
bankdat db 0D2h,002h,0FFh,0FEh
|
||||
|
||||
runstd db 006h,060h,0FFh,0E0h
|
||||
runpro db 003h,05Fh,0FFh,0E0h
|
||||
|
||||
bootstd:
|
||||
db 000h,001h,000h,007h,007h,007h,0A9h,060h,078h,0EEh,00Eh,0D4h,0A9h,008h,08Dh,004h
|
||||
db 0D2h,0A9h,000h,08Dh,006h,0D2h,0A9h,028h,08Dh,008h,0D2h,08Dh,009h,0D2h,0A9h,023h
|
||||
db 08Dh,00Fh,0D2h,08Dh,00Dh,0D2h,08Dh,00Ah,0D4h,00Ah,090h,0FAh,0A9h,013h,08Dh,00Fh
|
||||
db 0D2h,0A0h,002h,020h,061h,007h,099h,04Ah,007h,0B9h,003h,007h,099h,0E1h,002h,048h
|
||||
db 088h,0D0h,0F0h,020h,061h,007h,0AAh,020h,061h,007h,09Dh,000h,000h,0E8h,0D0h,0F7h
|
||||
db 0A5h,010h,08Dh,00Eh,0D2h,0A9h,003h,08Dh,00Fh,0D2h,04Eh,00Eh,0D4h,058h,06Ch,0E2h
|
||||
db 002h,0A9h,020h,08Dh,00Eh,0D2h,02Ch,00Eh,0D2h,0D0h,0FBh,08Ch,00Eh,0D2h,0ADh,00Dh
|
||||
db 0D2h,060h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h
|
||||
db 089h
|
||||
dw timeBefore
|
||||
|
||||
bootpro:
|
||||
db 000h,001h,000h,004h,007h,004h,0A9h,060h,078h,0EEh,00Eh,0D4h,0EEh,000h,0D4h,0A9h
|
||||
db 008h,08Dh,004h,0D2h,0A9h,000h,08Dh,006h,0D2h,0A9h,028h,08Dh,008h,0D2h,08Dh,009h
|
||||
db 0D2h,0A9h,023h,08Dh,00Fh,0D2h,08Dh,00Dh,0D2h,08Dh,00Ah,0D4h,00Ah,090h,0FAh,0A9h
|
||||
db 013h,08Dh,00Fh,0D2h,0A0h,002h,020h,060h,004h,099h,04Dh,004h,0B9h,003h,004h,099h
|
||||
db 0E1h,002h,048h,088h,0D0h,0F0h,020h,060h,004h,0AAh,020h,060h,004h,09Dh,000h,000h
|
||||
db 0E8h,0D0h,0F7h,0A5h,010h,08Dh,00Eh,0D2h,0A9h,003h,08Dh,00Fh,0D2h,06Ch,0E2h,002h
|
||||
db 0A9h,020h,08Dh,00Eh,0D2h,02Ch,00Eh,0D2h,0D0h,0FBh,08Ch,00Eh,0D2h,0ADh,00Dh,0D2h
|
||||
db 060h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h
|
||||
db 0AEh
|
||||
dw timeBefore
|
||||
|
||||
hello db 'X-LOAD 1.0 by Fox/Taquart',eot
|
||||
usgtxt db 'Syntax: XLOAD obxfile [options]',eol
|
||||
db '/1 - /4 Specify COM port (default COM2)',eol
|
||||
db '/p Professional loader',eot
|
||||
nocom db 'COM'
|
||||
comnum1 db '1 not found!',eot
|
||||
rboot db 'Ready for booting Atari at COM'
|
||||
comnum2 db '1...',eot
|
||||
booting db 'Booting...',eot
|
||||
loading db 'Loading '
|
||||
hexnum db ' - ',eot
|
||||
done db 'Done.',eot
|
||||
e_nota db 'ERROR: Not Atari executable',eot
|
||||
e_open db 'ERROR: Can''t open file',eot
|
||||
e_read db 'ERROR: Disk read error',eot
|
||||
|
||||
prof db 0
|
||||
port dw 1
|
||||
trtime dw timeNormal
|
||||
bttime dw timeBetween
|
||||
dcb db 5 dup(0),5 dup(?)
|
||||
head dw ?,?
|
||||
buf db 103h dup(?)
|
||||
obxnam:
|
||||
|
||||
ENDS
|
||||
END start
|
92
xloadcnv.asm
Normal file
92
xloadcnv.asm
Normal file
@ -0,0 +1,92 @@
|
||||
IDEAL
|
||||
P386
|
||||
MODEL TINY
|
||||
CODESEG
|
||||
ORG 100h
|
||||
include 'fox.mak'
|
||||
|
||||
start: mov [csum], 0
|
||||
fopen inpfile
|
||||
mov [ihand], bx
|
||||
fcreate outfile
|
||||
mov [ohand], bx
|
||||
|
||||
mov cx, 8
|
||||
main: push cx
|
||||
mov bx, [ihand]
|
||||
mov cx, 16
|
||||
fread buf
|
||||
|
||||
mov si, offset buf
|
||||
mov di, offset data
|
||||
mov cx, 16
|
||||
jmp c0
|
||||
c1: mov al, ','
|
||||
stosb
|
||||
c0: mov al, '0'
|
||||
stosb
|
||||
mov al, [si]
|
||||
add [csum], al
|
||||
adc [csum], 0
|
||||
shr al, 4
|
||||
d2a
|
||||
stosb
|
||||
lodsb
|
||||
and al, 0fh
|
||||
d2a
|
||||
stosb
|
||||
mov al, 'h'
|
||||
stosb
|
||||
loop c1
|
||||
mov ax, 0a0dh
|
||||
stosw
|
||||
|
||||
mov bx, [ohand]
|
||||
mov cx, 85
|
||||
fwrite line
|
||||
|
||||
pop cx
|
||||
loop main
|
||||
|
||||
mov bx, [ihand]
|
||||
fclose
|
||||
mov bx, [ohand]
|
||||
mov di, offset data+1
|
||||
mov al, [csum]
|
||||
shr al, 4
|
||||
d2a
|
||||
stosb
|
||||
mov al, [csum]
|
||||
and al, 0fh
|
||||
d2a
|
||||
stosb
|
||||
mov al, 'h'
|
||||
stosb
|
||||
mov ax, 0a0dh
|
||||
stosw
|
||||
mov cx, 10
|
||||
fwrite line
|
||||
fclose
|
||||
|
||||
mov eax, '.orp'
|
||||
cmp eax, [dword typ1]
|
||||
je wroc
|
||||
mov [dword typ1], eax
|
||||
mov [dword typ2], eax
|
||||
jmp start
|
||||
wroc: ret
|
||||
|
||||
inpfile db '\atari\xasm\xload'
|
||||
typ1 db 'std.obx',0
|
||||
outfile db 'xload'
|
||||
typ2 db 'std.db',0
|
||||
|
||||
line db ' db '
|
||||
data db 81 dup(?)
|
||||
ihand dw ?
|
||||
ohand dw ?
|
||||
buf db 16 dup(?)
|
||||
csum db ?
|
||||
|
||||
ENDS
|
||||
END start
|
Loading…
x
Reference in New Issue
Block a user