0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
.set XSIZE 96h
.set YSIZE 68h
.org {11h * 2h}
dw @vbi
.org 80h
.include "stdvideo.inc"
process:
mov %cl YSIZE
.loopy:
mov %ch XSIZE
.loopx:
call @processCell
loop %ch @.loopx
loop %cl @.loopy
ret
processCell:
mov %d 0h
mov %bl 3h
.loopy:
mov %bh 3h
.loopx:
mov %e %c
add %e %b
sub %e 0202h
cmp %e %c
ce jmp @.xskip
push %e
mov %bp %sp
call @index2rel
pop %e
cmpb [%e + @data] 0h
cg inc %d
.xskip:
loop %bh @.loopx
loop %bl @.loopy
push %c
mov %bp %sp
call @index2rel
pop %e
mov %al [%e + @data]
movb [%e + @ndata] 0h
cmp %al 0h
cz jmp @.dead
cmp %d 2h
cl ret
cmp %d 3h
cg ret
movb [%e + @ndata] 1h
ret
.dead:
cmp %d 3h
ce movb [%e + @ndata] 1h
ret
fill:
mov %c {XSIZE * YSIZE}
.loop:
mov %b %c
mod %b 100h
div %b 8h
add %b 80h
mov %al [%b]
mov %b %c
mod %b 8h
mov %e 1h
shl %e %b
and %al %el
cnz movb [%c + @data] 1h
loop %c @.loop
ret
render:
call @clsm1
mov %cl YSIZE
.loopy:
mov %ch XSIZE
.loopx:
push %c
mov %bp %sp
call @index2rel
pop %e
cmpb [%e + @data] 1h
cge push %c
cge call @setpixelm1
cge pop
loop %ch @.loopx
loop %cl @.loopy
ret
vbi:
cli
call @render
call @process
mov %c {XSIZE * YSIZE}
.loop:
movb [%c + @data] [%c + @ndata]
loop %c @.loop
rei
T1:
.org {3AAAh + @T1}
data:
.org {XSIZE * YSIZE + @data}
ndata:
https://pastebin.com/6gm30JWR
https://imgur.com/a/uSzbrgZ
игра конвея теперь и на pvc-16!
kcalbCube ,
08.04.2022 (Updated 08.04.2022 )
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
.org 80h
src: db "++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+."
table:
db 0h db 3Eh dw @i1
db 0h db 3Ch dw @i2
db 0h db 2Bh dw @i3
db 0h db 2Dh dw @i4
db 0h db 5Dh dw @i5
db 0h db 2Eh dw @i6
db 0h db 5Bh dw @i7
start: ; %a iptr %b dptr ;
.loop:
mov %cl [%a + @src]
cmp %cl 0h
je @.loop.break
mov %si 0h
.tloop:
mov %ch [4h * %si + {@table + 1h}]
cmp %cl %ch
jne @.tloop.continue
push @.tloop.break
mov %ip [4h * %si + {@table + 2h}]
.tloop.continue:
inc %si
cmp %si 8h
jl @.tloop
.tloop.break:
inc %a
jmp @.loop
.loop.break:
int 0h
i1: ; > ;
inc %b ret
i2: ; < ;
dec %b ret
i3: ; + ;
push %el
mov %el [%b + @data]
inc %el
mov [%b + @data] %el
pop %el
ret
i4: ; - ;
push %el
mov %el [%b + @data]
dec %el
mov [%b + @data] %el
pop %el
ret
i5: ; ] ;
push %c
mov %cl [%b + @data]
cmp %cl 0h
je @.loop.break
mov %c 0h
dec %a
.loop:
cmpb [%a + @src] 5Dh ; ']' ;
jne @.loop.1
inc %c
.loop.1:
cmpb [%a + @src] 5Bh ; '[' ;
jne @.loop.2
cmp %c 0h
jz @.loop.break
dec %c
.loop.2:
loop %a @.loop
.loop.break:
pop %c
ret
i6: ; . ;
push %cl
outb E9h [%b + @data]
.wait:
inb %cl E9h
cmp %cl 0h
jne @.wait
pop %cl
ret
i7: ; [ ;
push %c
mov %c [%b + @data]
cmp %c 0h
jne @.loop.break
mov %c 0h
.loop:
cmpb [%a + @src] 5Bh ; '[' ;
jne @.loop.1
inc %c
.loop.1:
cmpb [%a + @src] 5Dh ; ']' ;
jne @.loop.2
cmp %c 0h
jz @.loop.break
dec %c
.loop.2:
inc %a
jmp @.loop
.loop.break: pop %c ret
Hello World!
kcalbCube ,
30.03.2022 (Updated 30.03.2022 )
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
.org {5h * 2h}
dw @int5
.org 30h
data:
db "10"
.org 80h
start:
mov %sp FFFFh
mov %al {3h * 2h}
int 5h
int 0h
int5:
push %a
mov %ah [{@data + 1h}]
add %al %ah
outb E9h %al
.wait:
inb %al E9h
cmp %al 0h
jne @.wait
pop %a
rei
встречайте новую фичу
kcalbCube ,
30.03.2022 (Updated 30.03.2022 )
0
1 2 3 4 5 6
vbi:
mov %al [<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="596d1977342a3c2d">[email protected]</a>]
inc %al
mov [<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d8ec98f6b5abbdac">[email protected]</a>] %al
.mset: memset [@T1] 3A98h 0h
rei
kcalbCube ,
28.03.2022 (Updated 28.03.2022 )
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
.org 80h
inc:
push %bp
mov %bp %sp
sub %sp 0010h
mov [%bp + FFFEh] %sp
mov [%bp + FFFCh] %b
lea %a [%bp + FFFCh]
mov %a [%a]
push %a
inc %a
pop %si
mov [%si] %a
jmp @.return.inc
.return.inc:
mov %sp %bp
pop %bp
ret
main:
push %bp
mov %bp %sp
sub %sp 0010h
mov [%bp + FFFCh] %sp
memset [%bp + FFFEh] 0002h 0h
lea %a [%bp + FFFEh]
push %a
mov %a 0000h
pop %si
mov [%si] %a
.L.begin.1:
mov %a 0001h
cmp %a 0h
jz @.0
lea %a [%bp + FFFEh]
push %a
pop %b
call @inc
push %a
mov %a 0050h
pop %si
cmp %si %a
jgz @.compare3
mov %al 1h
.compare3:
mov %ah 0h
cmp %a 0h
jz @.else.2
jmp @.0
jmp @.end.2
.else.2:
.end.2:
.1:
jmp @.L.begin.1
.0:
.return.main:
mov %sp %bp
pop %bp
ret
start:
mov %sp FFFFh
call @main
.return.start:
int 0h
<-------------------->
short inc(short* i)
{
return ++(*i);
}
void main(void)
{
short i = 0s;
while(1)
{
if(inc(&i) > 0x50)
break;
}
}
void start(void)
{
asm("mov %sp FFFFh");
main();
}
да что вы знаете о неоптимизированном коде
kcalbCube ,
27.02.2022 (Updated 27.02.2022 )
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
; %ch - x1, %cl - y1, %dh - x2, %dl - y2 ;
drawline:
push %a
push %b
push %c
push %d
push %e
mov %al %dh
sub %al %ch
call @abs
mov %ah %al ; ah - dX ;
mov %al %dl
sub %al %cl
call @abs
neg %al ; al - -dY ;
mov %bh FFh ; bh - signX;
mov %bl FFh ; bl - signY ;
cmp %ch %dh
jgz @.S1
neg %bh
.S1:
cmp %cl %dl
jgz @.S2
neg %bl
.S2:
mov %el %ah
add %el %al ; el - error ;
push %d
call @drawpixel
pop %d
.loop:
cmp %ch %dh
jnz @.L1
cmp %cl %dl
jnz @.L1
jmp @.loop_end
.L1:
push %c
call @drawpixel
pop %c
mov %eh %el
cmp %eh %al
jng @.L2
add %el %al
add %ch %bh
.L2:
cmp %eh %ah
jgz @.loop
add %el %ah
add %cl %bl
jmp @.loop
.loop_end:
pop %e
pop %d
pop %c
pop %b
pop %a
ret
https://pastebin.com/k8697fae
алгоритм брезенхема.
результат: https://imgur.com/a/c1twuNt
забавно что посреди тестов программа выдала красивые такие кривые на весь экран. с.м. имгур, приложил.
kcalbCube ,
16.02.2022 (Updated 16.02.2022 )
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
.org 22h
dw @vbi
.org 80h
bpos: db 0h 0h
vector: db 2h 1h
process:
push %a
push %b
mov %a [@bpos] ; {h:x, l:y} ;
mov %b [@vector] ; {h:dx, l:dy} ;
add %ah %bh
add %al %bl
cmp %ah 11h
jng @.skip_xoverflow_handle
cmp %ah 14h
jg @.overflow_left
mov %ah 11h
jmp @.xoverflow_finally
.overflow_left:
mov %ah 0h
.xoverflow_finally:
neg %bh
.skip_xoverflow_handle:
cmp %al 5Ch
jng @.skip_yoverflow_handle
cmp %al 60h
jg @.overflow_up
mov %al 5Bh
jmp @.yoverflow_finally
.overflow_up:
mov %al 1h
.yoverflow_finally:
neg %bl
.skip_yoverflow_handle:
mov [@bpos] %a
mov [@vector] %b
pop %b
pop %a
ret
cls:
push %a
push %b
mov %a 3A98h
.loop:
mov [%a + @T1] 0000h
sub %a 2h
jnz @.loop
pop %b
pop %a
ret
render:
push %a
push %b
push %c
mov %a [@bpos] ; {h:x, l:y} ;
mov %b %al
mul %b 12h
add %b %ah
add %b @T1
mov %c 8h
.loop:
movb [%b] FFh
add %b 12h
dec %c
jnz @.loop
pop %c
pop %b
pop %a
ret
start:
mov %sp FFFFh
outb 20h 1h
outb 21h 16h
out 22h @T1
mov %al 1h
int 10h
.loop:
jmp @.loop
vbi:
call @cls
call @render
call @process
ret
.org 1000h
T1:
решил пойти по накатанному пути и добавил видеоконтроллер, пока только монохромная битовая карта 144x100, но большего и не надо
сабж выводит на экран что отпрыгивает от стен, простое умножение компонента вектора на -1
digitalEugene ,
14.02.2022 (Updated 14.02.2022 )
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
.org 80h
data:
db "Hello, world!\n"
wait:
.loop:
inb %cl E9h
cmp %cl 0h
jnz @.loop
ret
start:
mov %sp 300h
.loop:
mov %al [%b + @data]
inc %b
outb E9h %al
call @wait
cmp %al Ah
jnz @.loop
int 0h
забацал port-mapped io, работает в отдельном потоке
sudo bormand
digitalEugene ,
11.02.2022 (Updated 11.02.2022 )
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
.org 80h
data:
db "Hello, world!\n"
db 0h
start:
mov %bp @data
; jmp @.exit ;
.loop:
mov %al [%si + %bp]
inc %si
cmp %al 0h
int 5h ;KOKOKO make me port-mapped io;
jnz @.loop
.exit:
int 0h
32 31 44 41 54 41 3A 30 30 38 30 3B 53 54 41 52
54 3A 30 30 38 45 3B 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 48 65 6C 6C 6F 20 77 6F 72
6C 64 21 0A 00 02 06 80 00 03 0A 38 09 05 0C 0A
00 00 0B 05 0F 92 00 0B 00
добавил комментарии, теперь можно будет красиво рисовать фреймы (радуйтесь)
digitalEugene ,
04.02.2022 (Updated 04.02.2022 )
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
.org 80h
fib:
push %b
push %d
push %c
mov %d [%sp + 8h]
mov %b 1h
mov %a 0h
.loop:
add %b %a
mov %c %a
mov %a %b
sub %a %c
dec %d
jnz @.loop
pop %c
pop %d
pop %b
ret
start:
mov %sp 2000h
push Fh
call @fib
pop
int 0h
один чел захотел написать для моей вмки компилятор лиспоподобного языка с некими S-выражениями и попросил пример вычисления ряда фибоначчи.
пришлось накопипастить с вики.
digitalEugene ,
23.01.2022 (Updated 23.01.2022 )