From 35bf3f192dae3be8ced86ed5a9d6d996721f31f5 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Thu, 13 Aug 1998 13:37:32 +0200 Subject: [PATCH] X-BOOT 3.1 - converts Atari 8-bit executables to bootable disk images. --- xboot.asm | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++ xboot.txt | 12 ++++ xbootpro.asx | 79 +++++++++++++++++++++ xbootstd.asx | 78 +++++++++++++++++++++ 4 files changed, 364 insertions(+) create mode 100644 xboot.asm create mode 100644 xboot.txt create mode 100644 xbootpro.asx create mode 100644 xbootstd.asx diff --git a/xboot.asm b/xboot.asm new file mode 100644 index 0000000..53bb3c0 --- /dev/null +++ b/xboot.asm @@ -0,0 +1,195 @@ +; ><-B00T III b. Fox + + IDEAL + P386 + MODEL TINY + CODESEG + ORG 100h + include 'fox.mak' + +blen = 60*1024 + +start: + db 1024 dup(0) ;for COMpack + 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 + +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 + 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] + inc di + or ah, 20h + cmp ax, 'p/' + je romsw + dec [romfl] + mov di, 81h +romsw: mov ebp, 'moc.' + call getfil + push si + + fopen + mov cx, blen + fread bufr + mov dx, offset lontxt + cmp ax, blen + jnb panic + mov [len], ax + fclose + + mov si, offset bufr + mov di, si + lodsw + cmp ax, -1 + jne badf + + mov ax, [si] + 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 + + pop di + mov ebp, 'rta.' + call getfil + fcreate + mov cx, [len] + mov dx, offset begin + fwrite + fclose + print oktxt + dos 4c00h + +; Poetry +hello db 'X-BOOT 3.1 by Fox/Taquart',eot +usgtxt db 'Converts Atari 8-bit executable into .ATR disk image.',eol + db 'Usage: XBOOT [/p] comfile 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 + +romfl db 1 + +; 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 + +; Loader #2 (rom) +romlod: db 96,1,128,4,119,228,169,0,141,47,2 + db 169,82,141,200,2,165,20,197,20,240,252,169 +l2runl db 128,141,224,2,169 +l2runh db 4,141,225,2,160,254,169,128,141,226,2,169,4,141,227,2,162,251,149 + db 72,232,134,67,76,188,4,230,68,208,2,230,69,200,16,32,238,10 + db 3,208,3,238,11,3,169,255,141,1,211,78,14,212,88,32,83,228 + db 56,48,170,160,0,120,140,14,212,206,1,211,185,0,4,166,67,208 + db 200,129,68,165,68,197,70,208,200,165,69,197,71,208,194,152,72,32 + db 253,4,104,168,16,165,108,226,2 + +; ATR Header +begin dw 296h +paras dw 0 + dw 80h,5 dup(0) +; Atari Boot Sector(s) +sect: +; Loader #1 (std) + db 96,1,128,7,119,228,160,215,185,30,7 + db 145,88,200,192,226,144,246,169 +l1runl db 128,141,224,2,169 +l1runh db 7,141,225,2,169 + db 7,141,5,3,160,255,140,1,211,136,169,128,141,226,2,169,7,141 + db 227,2,162,251,149,72,232,134,67,76,193,7,230,68,208,2,230,69 + db 200,16,16,238,10,3,208,3,238,11,3,32,83,228,56,48,174,160 + db 0,185,0,7,166,67,208,216,129,68,165,68,197,70,208,216,165,69 + db 197,71,208,210,152,72,32,242,7,104,168,16,181,108,226,2,44,111 + db 97,100,105,110,103,14,14,14,0 +beglen = $-begin +bufr db blen dup(?) + +len dw ? + +fname db 128 dup(?) + + ENDS + END start \ No newline at end of file diff --git a/xboot.txt b/xboot.txt new file mode 100644 index 0000000..2cf0779 --- /dev/null +++ b/xboot.txt @@ -0,0 +1,12 @@ +X-Boot 3.1 by Fox/Taquart +Some (un)important notes +------------------------- +This tool converts Atari executable (.COM) into Atari disk image (.ATR). +Produced ATR is single density and as short as possible. It has a loader +in one boot sector. You can choose one of two built-in loaders: +standard and professional. Professional loader allows you to load code/data +under ROM and disables ROM and interrupts while starting program. +Both loaders disable Atari Basic. For details, view sources of loaders. +X-Boot does not write your program in ATR as Atari file, you can only run it +by booting. +--- diff --git a/xbootpro.asx b/xbootpro.asx new file mode 100644 index 0000000..bb71f76 --- /dev/null +++ b/xbootpro.asx @@ -0,0 +1,79 @@ +* Boot executable file loader coded by Fox/Taquart +* Version for professionals - can load file under ROM. +* Note interrupts and ROM are disabled when running loaded program. + + org $480 + +bufr equ $400 + +tp equ $43 +vc equ $44 + +* Boot header +boot equ * +rts rts + dta b(1),a(boot,$e477) +* Nice blank screen + lda #0 + sta $22f + lda #$52 + sta $2c8 + lda 20 + cmp 20 + beq *-2 +* Init run vector + lda rts + sta $2e1 + ldy #$fe +* Load header +lhead lda rts + sta $2e3 + ldx <-5 +* Store byte of header +hput sta vc+4,x + inx + stx tp + jmp get +next inw vc +get iny + bpl getx + inw $30a + lda #$ff + sta ^31 + lsr ^4e + cli + jsr $e453 + sec + bmi rts + ldy #0 + sei + sty ^4e + dec ^31 +getx lda bufr,y + ldx tp + bne hput + sta (vc,x) + lda vc + cmp vc+2 + bne next + lda vc+1 + cmp vc+3 + bne next +endseq tya + pha + jsr init + pla + tay + bpl lhead ! + +init jmp ($2e2) + +* This will be added at the end of loaded file + org endseq + jmp ($2e0) + + end \ No newline at end of file diff --git a/xbootstd.asx b/xbootstd.asx new file mode 100644 index 0000000..a60c07e --- /dev/null +++ b/xbootstd.asx @@ -0,0 +1,78 @@ +* Boot executable file loader coded by Fox/Taquart +* Standard loader - ROM and interrupts enabled. + + org $780 + +bufr equ $700 + +tp equ $43 +vc equ $44 + +* Boot header +boot equ * +rts rts + dta b(1),a(boot,$e477) +* Print text +txtpos equ 215 + ldy #txtpos +print lda text-txtpos,y + sta ($58),y + iny + cpy #txtpos+txtlen + bcc print +* Init run vector + lda rts + sta $2e1 + lda >bufr + sta $305 + ldy #$ff + sty ^31 + dey #$fe +* Load header +lhead lda rts + sta $2e3 + ldx <-5 +* Store byte of header +hput sta vc+4,x + inx + stx tp + jmp get +next inw vc +get iny + bpl getx + inw $30a + jsr $e453 + sec + bmi rts + ldy #0 +getx lda bufr,y + ldx tp + bne hput + sta (vc,x) + lda vc + cmp vc+2 + bne next + lda vc+1 + cmp vc+3 + bne next +endseq tya + pha + jsr init + pla + tay + bpl lhead ! + +init jmp ($2e2) + +text dta d'Loading... ' +txtlen equ *-text + +* This will be added at the end of loaded file + org endseq + jmp ($2e0) + + end \ No newline at end of file