diff --git a/gr0.asm b/gr0.asm new file mode 100644 index 0000000..cc15ecb --- /dev/null +++ b/gr0.asm @@ -0,0 +1,355 @@ + IDEAL + P386 + MODEL TINY + CODESEG + ORG 100h + include 'fox.mak' +smartio = 1 + +start: + db 2048 dup(0) ;compack + +o_a = 1 +o_b = 2 +o_c = 4 +o_d = 8 +o_f = 10h +o_i = 20h +o_l = 40h +o_n = 80h +o_x = 100h + +MACRO topt _op + testflag dx, _op + ENDM + + mov si, 81h + mov bx, 0ff00h ;bh=attr mask, bl=attr set + xor dx, dx ;m_xxx + +gsw1: lodsb + cmp al, ' ' + je gsw1 + cmp al, 9 + je gsw1 + cmp al, 0dh + je gswx + cmp al, '/' + je gsw2 + cmp al, '-' + je gsw2 +usage: mov dx, offset usgtxt +panic: print + int 20h + + smartdisk + +rdpage: mov cx, 100h + fread + cmp ax, 100h + jb _derr + ret + +rdnum: lodsb + cmp al, ':' + jne usage + lodsw + cmp al, '9' + ja usage + sub al, '0' + jb usage + cmp ah, '9' + ja rdnum1 + sub ah, '0' + jb rdnum1 + xchg al, ah + aad ;al:=10*ah+al + cmp al, 15 + ja usage + ret +rdnum1: dec si + ret + +gsw2: lodsb + and al, 0dfh + mov di, offset swilet + mov cx, 9 + repne scasb + jne usage + bts dx, cx + jc usage + cmp al, 'B' + je sw_b + cmp al, 'C' + je sw_c + cmp al, 'F' + je sw_f + jmp gsw1 + +sw_b: call rdnum + shl al, 4 + and bh, 0fh + or bl, al + jmp gsw1 + +sw_c: call rdnum + and bh, 0f0h + or bl, al + jmp gsw1 + +sw_f: cmp [byte si], ':' + jne usage + mov di, offset fname-1 +swf1: movsb + cmp [byte si], ' ' + je swf2 + cmp [byte si], 9 + je swf2 + cmp [byte si], 0dh + jne swf1 +swf2: pusha + mov bx, di + mov cx, di + sub cx, offset fname + je usage +adex1: dec bx + cmp [byte bx], '.' + je adexn + cmp [byte bx], '\' + loopne adex1 +adex2: mov eax, 'TNF.' + stosd +adexn: mov [byte di], 0 + + fopen fname + mov dx, offset font+100h ;digits + call rdpage + mov dx, offset font+200h ;letters + call rdpage + mov dx, offset font ;controls + call rdpage + mov dx, offset font+300h ;low letters + call rdpage + fclose + popa + jmp gsw1 + +gswx: test dx, dx + jz usage + + topt o_a ;obsluz opcje a + jz atrok + setflag dx, o_n+o_l + topt o_b + jnz anob + and bx, 0f0fh + or bl, 10h +anob: topt o_c + jnz anoc + and bx, 0f0f0h + or bl, 7 +anoc: topt o_d+o_f+o_x + jnz atrok + setflag dx, o_x +atrok: + + mov ax, dx ;sprawdz opcje fontu + and ax, o_d+o_f+o_x + jz nofnt + bsf cx, ax ;dozwolona max 1 z opcji d,f,x + btr ax, cx + test ax, ax + jz fntok + jmp usage +nofnt: topt o_l ;jezeli l i zadna z d,f,x, to ustaw d + jz fntok + setflag dx, o_d +fntok: + + push bx + +; inicjuj tryb tekstowy + topt o_n + jz noini + push dx + mov ax, 3 + int 10h + pop dx +noini: + +; wczytaj font domyslny + topt o_d + jz nodef + mov ax, 1112h + topt o_l + jnz def50 + mov al, 14h +def50: push dx + int 10h + pop dx +nodef: + +; wczytaj font uzytkownika + topt o_f+o_x + jz nocust + +; ustaw odpowiedni font + mov cx, 128 + topt o_i + jz noinv +; inwertuj znaki 0-127 na 128-255 + mov si, offset font + mov di, offset ifont + mov cx, 1024 +mkinv: lodsb + not al + stosb + loop mkinv + mov cx, 256 +noinv: mov bp, offset font + mov bx, 800h + topt o_l + jnz nodbl +; rob font o podwojonej wysokosci + mov si, offset font + mov di, offset dfont + push cx + mov cx, 2048 +mkdbl: lodsb + mov ah, al + stosw + loop mkdbl + pop cx + mov bp, offset dfont + mov bh, 16 +nodbl: push dx + xor dx, dx + mov ax, 1110h + int 10h + pop dx + +nocust: +; jezeli przelaczylismy 50->25 to skorygowac polozenie kursora + topt o_l + jnz nococu + topt o_d+o_f+o_x + jz nococu + xor bh, bh + mov ah, 3 + int 10h ;wez pozycje kursora + sub dh, 25 + jb nococu + xor bh, bh + mov ah, 2 + int 10h ;ustaw kursor + mov ax, 0b800h ;przesuwa dolna polowke ekranu do gory + mov ds, ax + mov es, ax + mov si, 2*80*25 + xor di, di + mov cx, si + rep movsb + mov ax, [di] ;czysci dolna polowke + mov al, ' ' + mov cx, 80*25 + rep stosw + push cs + pop ds + push cs + pop ds + +nococu: +; ustaw kolory + pop bx + cmp bh, 0ffh + je nocol + push 0b800h + pop es + xor di, di + mov cx, 80*50 +cls: inc di + and [es:di], bh + or [es:di], bl + inc di + loop cls +nocol: ret + +swilet db 'XNLIFDCBA' +usgtxt db 'GR0 version 1.0 by Fox/Taquart',eol + db 'Customizes DOS screen.',eol + db 'Available options:',eol + db '/a Set Atari scheme = /b:1 /c:7 /n /l /x',eol + db '/b:nn Set background color 0-15',eol + db '/c:nn Set foreground color 0-15',eol + db '/d Set default PC font',eol + db '/f:fname Set external Atari font',eol + db '/i Set chars 128-255 to inverse',eol + db '/l Select 50 lines font',eol + db '/n Initialize text mode (clears screen)',eol + db '/x Set Atari build-in font',eot + smarterr + +font db 0,54,127,127,62,28,8,0,24,24,24,31,31,24,24,24,3 + db 3,3,3,3,3,3,3,24,24,24,248,248,0,0,0,24,24,24 + db 248,248,24,24,24,0,0,0,248,248,24,24,24,3,7,14,28,56 + db 112,224,192,192,224,112,56,28,14,7,3,1,3,7,15,31,63,127 + db 255,0,0,0,0,15,15,15,15,128,192,224,240,248,252,254,255,15 + db 15,15,15,0,0,0,0,240,240,240,240,0,0,0,0,255,255,0 + db 0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,240 + db 240,240,240,0,28,28,119,119,8,28,0,0,0,0,31,31,24,24 + db 24,0,0,0,255,255,0,0,0,24,24,24,255,255,24,24,24,0 + db 0,60,126,126,126,60,0,0,0,0,0,255,255,255,255,192,192,192 + db 192,192,192,192,192,0,0,0,255,255,24,24,24,24,24,24,255,255 + db 0,0,0,240,240,240,240,240,240,240,240,24,24,24,31,31,0,0 + db 0,120,96,120,96,126,24,30,0,0,24,60,126,24,24,24,0,0 + db 24,24,24,126,60,24,0,0,24,48,126,48,24,0,0,0,24,12 + db 126,12,24,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24 + db 0,24,0,0,102,102,102,0,0,0,0,0,102,255,102,102,255,102 + db 0,24,62,96,60,6,124,24,0,0,102,108,24,48,102,70,0,28 + db 54,28,56,111,102,59,0,0,24,24,24,0,0,0,0,0,14,28 + db 24,24,28,14,0,0,112,56,24,24,56,112,0,0,102,60,255,60 + db 102,0,0,0,24,24,126,24,24,0,0,0,0,0,0,0,24,24 + db 48,0,0,0,126,0,0,0,0,0,0,0,0,0,24,24,0,0 + db 6,12,24,48,96,64,0,0,60,102,110,118,102,60,0,0,24,56 + db 24,24,24,126,0,0,60,102,12,24,48,126,0,0,126,12,24,12 + db 102,60,0,0,12,28,60,108,126,12,0,0,126,96,124,6,102,60 + db 0,0,60,96,124,102,102,60,0,0,126,6,12,24,48,48,0,0 + db 60,102,60,102,102,60,0,0,60,102,62,6,12,56,0,0,0,24 + db 24,0,24,24,0,0,0,24,24,0,24,24,48,6,12,24,48,24 + db 12,6,0,0,0,126,0,0,126,0,0,96,48,24,12,24,48,96 + db 0,0,60,102,12,24,0,24,0,0,60,102,110,110,96,62,0,0 + db 24,60,102,102,126,102,0,0,124,102,124,102,102,124,0,0,60,102 + db 96,96,102,60,0,0,120,108,102,102,108,120,0,0,126,96,124,96 + db 96,126,0,0,126,96,124,96,96,96,0,0,62,96,96,110,102,62 + db 0,0,102,102,126,102,102,102,0,0,126,24,24,24,24,126,0,0 + db 6,6,6,6,102,60,0,0,102,108,120,120,108,102,0,0,96,96 + db 96,96,96,126,0,0,99,119,127,107,99,99,0,0,102,118,126,126 + db 110,102,0,0,60,102,102,102,102,60,0,0,124,102,102,124,96,96 + db 0,0,60,102,102,102,108,54,0,0,124,102,102,124,108,102,0,0 + db 60,96,60,6,6,60,0,0,126,24,24,24,24,24,0,0,102,102 + db 102,102,102,126,0,0,102,102,102,102,60,24,0,0,99,99,107,127 + db 119,99,0,0,102,102,60,60,102,102,0,0,102,102,60,24,24,24 + db 0,0,126,12,24,48,96,126,0,0,30,24,24,24,24,30,0,0 + db 64,96,48,24,12,6,0,0,120,24,24,24,24,120,0,0,8,28 + db 54,99,0,0,0,0,0,0,0,0,0,255,0,0,24,60,126,126 + db 60,24,0,0,0,60,6,62,102,62,0,0,96,96,124,102,102,124 + db 0,0,0,60,96,96,96,60,0,0,6,6,62,102,102,62,0,0 + db 0,60,102,126,96,60,0,0,14,24,62,24,24,24,0,0,0,62 + db 102,102,62,6,124,0,96,96,124,102,102,102,0,0,24,0,56,24 + db 24,60,0,0,6,0,6,6,6,6,60,0,96,96,108,120,108,102 + db 0,0,56,24,24,24,24,60,0,0,0,102,127,127,107,99,0,0 + db 0,124,102,102,102,102,0,0,0,60,102,102,102,60,0,0,0,124 + db 102,102,124,96,96,0,0,62,102,102,62,6,6,0,0,124,102,96 + db 96,96,0,0,0,62,96,60,6,124,0,0,24,126,24,24,24,14 + db 0,0,0,102,102,102,102,62,0,0,0,102,102,102,60,24,0,0 + db 0,99,107,127,62,54,0,0,0,102,60,24,60,102,0,0,0,102 + db 102,102,62,12,120,0,0,126,12,24,48,126,0,0,24,60,126,126 + db 24,60,0,24,24,24,24,24,24,24,24,0,126,120,124,110,102,6 + db 0,8,24,56,120,56,24,8,0,16,24,28,30,28,24,16,0 +fname: +ifont db 1024 dup(?) + +dfont db 4096 dup(?) + + ENDS + END start \ No newline at end of file