Ваша адресация пикселей кажется неправильной.
width
- [ваша переменная] для ширины экрана, которая является 64
. Но в вашем примере битмап имеет ширину 512 и высоту 256 [которые являются значениями по умолчанию в mars
].
Итак, вам нужно либо изменить геометрию отображения в mars
или установите для параметра width
значение. То же самое для высоты.
Примечание: mars
выполняет not сохранение установленных вами значений, поэтому, если вы хотите использовать геометрию, отличную от значения по умолчанию , вам нужно будет установить каждое время. Итак, возможно, простой способ - использовать значения по умолчанию mars
.
UPDATE:
Я изменил значения, чтобы они совпадали с ошибками по умолчанию, но все же. Я думаю, может быть, мне нужно что-то изменить в коде setpixel. N также добавить счетчик где-нибудь
blockquote>. Боюсь, что появилось множество ошибок. В основном, ваши функции сделали не сохранение / восстановление
$ra
в стеке и сделатьjr $ra
в конце.Также мне показалось, что ваш октант код отражения был намного сложнее [и, следовательно, подвержен ошибкам], чем это необходимо.
Я создал две версии. Первый - это ваш оригинальный код с аннотациями о [некоторых] ошибках. Второй - полная переделка, которая работает.
Вот аннотированная версия [пожалуйста, помилуй о бесплатной стильной очистке]:
.data # midpoint circle algorithm variables radius: .word 10 err: .word -10 colour: .word 0x00FFFFFF # yvalue = radius bmp: .space 0x80000 dpy_width: .word 512 dpy_height: .word 256 dpy_base: .word 0x10040000 .text lw $a0,radius # x li $a1,0 # y # BUG: this bge has no meaning since, either way, it goes to "loading" # probably should be "end_loading" drawn: bge $a0,$a1,loading # BUG: this falls through into the plot8points function loading: lw $t1,err jal plot8points add $t1,$t1,$a1 # err += y addi $a1,$a1,1 # y++ add $t1,$t1,$a1 # err + = y bltz $a0,drawn sub $t1,$t1,$a0 # err -= x addi $a0,$a0,-1 # x-- sub $t1,$t1,$a0 # err-= x # BUG: this is a function but has no return and does _not_ save $ra plot8points: lw $t3,radius # xcenter li $t4,0 # ycenter move $t7,$a0 # x move $t8,$a1 # y jal plot4points # BUG: we're in a function but this jumps to a label outside the function blt $a0,$a1,end_loading jal plot4points jal plot4morepoints # jal exit end_loading: jr $ra # BUG: this is a function but has no return and does _not_ save $ra plot4points: add $a0,$t7,$t3 add $a1,$t8,$t4 jal setpixel sub $a0,$t3,$t7 add $a1,$t4,$t8 jal setpixel add $a0,$t3,$t7 sub $a1,$t4,$t8 jal setpixel sub $a0,$t3,$7 sub $a1,$t4,$t8 jal setpixel # BUG: this is a function but has no return and does _not_ save $ra plot4morepoints: add $a0,$t3,$t8 add $a1,$t4,$t7 jal setpixel sub $a0,$t3,$t8 add $a1,$t4,$t7 jal setpixel add $a0,$t3,$t8 sub $a1,$t4,$t7 jal setpixel sub $a0,$t3,$t8 sub $a1,$t4,$t7 jal setpixel # setpixel -- draw pixel on display # # arguments: # a0 -- X coord # a1 -- Y coord setpixel: lw $t0,colour # color lw $s4,dpy_width # display width lw $s2,dpy_base # display base address mul $t6,$a1,$s4 # get y * width add $t6,$t6,$a0 # get (y * width) + x sll $t6,$t6,2 # convert to offset add $t6,$t6,$s2 # add in base address sw $t0,($t6) # store pixel jr $ra # exit: li $v0,10 syscall
Вот очищенная , отредактированная рабочая версия.
Когда я сделал переделку, я попытался использовать алгоритм со страницы wikipedia для алгоритма круга, но либо их версия сломана, либо I сломал ее , Он не создает круг, а образец алмаза / шестиугольника. Итак, я оставил его в качестве опции.
Итак, я добавил версию Джону Кеннеди [Santa Monica College] [с сайта OSU]. Он работает.
Я также добавил некоторые опции для автоматического отображения на дисплей и автоматического вычисления центроида. Проверьте значения дисплея, так как он предполагает 512x256 и «статический» базовый адрес дисплея.
Я также добавил некоторые опции, позволяющие рисовать концентрические круги, только для развлечения.
# breshenham circle algorithm .data radius: .word 10 center_x: .word 0 center_y: .word 0 dpy_color: .word 0x00FFFFFF # midpoint circle algorithm variables bmp: .space 0x80000 dpy_width: .word 512 dpy_height: .word 256 dpy_base: .word 0x10010000 .eqv dpy_margin 8 ask_diamond: .word 0 ask_radmin: .word 0 ask_radinc: .word 16 msg_nl: .asciiz "\n" msg_comma: .asciiz "," .text .globl main main: .eqv dflg $fp li dflg,0 # clear debug flag # prompt user for ask_diamond value la $a0,_S_000 # prompt user li $v0,4 # print string syscall li $v0,5 syscall sw $v0,ask_diamond # prompt user for ask_radmin value la $a0,_S_001 # prompt user li $v0,4 # print string syscall li $v0,5 syscall sw $v0,ask_radmin lw $t0,ask_radmin beqz $t0,main_skipinc # prompt user for ask_radinc value la $a0,_S_002 # prompt user li $v0,4 # print string syscall li $v0,5 syscall sw $v0,ask_radinc main_skipinc: lw $t0,ask_radmin # compute circle center from display geometry lw $s6,dpy_width srl $s6,$s6,1 sw $s6,center_x lw $s5,dpy_height srl $s5,$s5,1 sw $s5,center_y # set radius to min((width / 2) - 16,(height / 2) - 16) move $s0,$s6 blt $s6,$s5,main_gotradius move $s0,$s5 main_gotradius: subi $s0,$s0,dpy_margin # give us some margin sw $s0,radius main_loop: # output circle jal kdraw jal radbump # output diamond/hexagon lw $t0,ask_diamond # is it enabled? beqz $t0,main_next # if no, skip jal wdraw jal radbump main_next: bnez $v0,main_loop # done with concentric circles? if no, loop main_done: li $v0,10 syscall # wdraw -- draw circle (wikipedia) # # NOTES: # (1) this is wikipedia's algorithm for a circle, but it is more like a # diamond or polygon # (2) https://en.wikipedia.org/wiki/Midpoint_circle_algorithm # (2) either it's "broken" or _I_ broke it # # registers: # s0 -- x # s1 -- y # s2 -- decision/error term (err) # # * void # * DrawCircle(int x0,int y0,int radius) # * { # * int x = radius; # * int y = 0; # * # * // Decision criterion divided by 2 evaluated at x=r, y=0 # * int decisionOver2 = 1 - x; # * # * while (y <= x) { # * DrawPixel(x + x0,y + y0); // Octant 1 # * DrawPixel(y + x0,x + y0); // Octant 2 # * DrawPixel(-x + x0,y + y0); // Octant 4 # * DrawPixel(-y + x0,x + y0); // Octant 3 # * DrawPixel(-x + x0,-y + y0); // Octant 5 # * DrawPixel(-y + x0,-x + y0); // Octant 6 # * DrawPixel(x + x0,-y + y0); // Octant 7 # * DrawPixel(y + x0,-x + y0); // Octant 8 # * # * y++; # * # * // Change in decision criterion for y -> y+1 # * if (decisionOver2 <= 0) { # * decisionOver2 += 2 * y + 1; # * } # * # * // Change for y -> y+1, x -> x-1 # * else { # * x--; # * decisionOver2 += 2 * (y - x) + 1; # * } # * } # * } wdraw: subi $sp,$sp,4 sw $ra,0($sp) lw $s0,radius # x = radius li $s1,0 # y = 0 # get initial decision (err = 1 - x) li $s2,1 # err = 1 sub $s2,$s2,$s0 # err = 1 - x wdraw_loop: bgt $s1,$s0,wdraw_done # y <= x? if no, fly (we're done) # draw pixels in all 8 octants jal draw8 addi $s1,$s1,1 # y += 1 bgtz $s2,wdraw_case2 # err <= 0? if no, fly # change in decision criterion for y -> y+1 # err += (2 * y) + 1 wdraw_case1: sll $t0,$s2,1 # get 2 * y addu $s2,$s2,$t0 # err += 2 * y (NOTE: this can overflow) add $s2,$s2,1 # err += 1 j wdraw_loop # change for y -> y+1, x -> x-1 # x -= 1 # err += (2 * (y - x)) + 1 wdraw_case2: subi $s0,$s0,1 # x -= 1 sub $t0,$s1,$s0 # get y - x sll $t0,$t0,1 # get 2 * (y - x) addi $t0,$t0,1 # get 2 * (y - x) + 1 add $s2,$s2,$t0 # add it to err j wdraw_loop wdraw_done: lw $ra,0($sp) addi $sp,$sp,4 jr $ra # kdraw -- draw circle (john kennedy) # # NOTES: # (1) this is John Kennedy's algorithm from: # http://web.engr.oregonstate.edu/~sllu/bcircle.pdf # # registers: # s0 -- x # s1 -- y # s2 -- raderr # s3 -- xchg # s4 -- ychg # # * void # * PlotCircle(int CX, int CY, int r) # * { # * int x; # * int y; # * int xchg; # * int ychg; # * int raderr; # * # * x = r; # * y = 0; # * # * xchg = 1 - (2 * r); # * ychg = 1; # * # * raderr = 0; # * # * while (x >= y) { # * draw8(x,y); # * y += 1; # * # * raderr += ychg; # * ychg += 2; # * # * if (((2 * raderr) + xchg) > 0) { # * x -= 1; # * raderr += xchg; # * xchg += 2; # * } # * } # * } kdraw: subi $sp,$sp,4 sw $ra,0($sp) lw $s0,radius # x = radius li $s1,0 # y = 0 # initialize: xchg = 1 - (2 * r) li $s3,1 # xchg = 1 sll $t0,$s0,1 # get 2 * r sub $s3,$s3,$t0 # xchg -= (2 * r) li $s4,1 # ychg = 1 li $s2,0 # raderr = 0 kdraw_loop: blt $s0,$s1,kdraw_done # x >= y? if no, fly (we're done) # draw pixels in all 8 octants jal draw8 addi $s1,$s1,1 # y += 1 add $s2,$s2,$s4 # raderr += ychg addi $s4,$s4,2 # ychg += 2 sll $t0,$s2,1 # get 2 * raderr add $t0,$t0,$s3 # get (2 * raderr) + xchg blez $s2,kdraw_loop # >0? if no, loop subi $s0,$s0,1 # x -= 1 add $s2,$s2,$s3 # raderr += xchg addi $s3,$s3,2 # xchg += 2 j kdraw_loop kdraw_done: lw $ra,0($sp) addi $sp,$sp,4 jr $ra # draw8 -- draw single point in all 8 octants # # arguments: # s0 -- X coord # s1 -- Y coord # # registers: # t8 -- center_x # t9 -- center_y draw8: subi $sp,$sp,4 sw $ra,0($sp) #+drawctr $t8,$t9 lw $t8,center_x #+ lw $t9,center_y #+ #+ # draw [+x,+y] add $a0,$t8,$s0 add $a1,$t9,$s1 jal setpixel # draw [+y,+x] add $a0,$t8,$s1 add $a1,$t9,$s0 jal setpixel # draw [-x,+y] sub $a0,$t8,$s0 add $a1,$t9,$s1 jal setpixel # draw [-y,+x] add $a0,$t8,$s1 sub $a1,$t9,$s0 jal setpixel # draw [-x,-y] sub $a0,$t8,$s0 sub $a1,$t9,$s1 jal setpixel # draw [-y,-x] sub $a0,$t8,$s1 sub $a1,$t9,$s0 jal setpixel # draw [+x,-y] add $a0,$t8,$s0 sub $a1,$t9,$s1 jal setpixel # draw [+y,-x] sub $a0,$t8,$s1 add $a1,$t9,$s0 jal setpixel lw $ra,0($sp) addi $sp,$sp,4 jr $ra # setpixel -- draw pixel on display # # arguments: # a0 -- X coord # a1 -- Y coord # # clobbers: # v0 -- bitmap offset/index # v1 -- bitmap address # trace: # v0,a0 setpixel: bnez dflg,setpixel_show # debug output? if yes, fly setpixel_go: lw $v0,dpy_width # off = display width mul $v0,$a1,$v0 # off = y * width add $v0,$v0,$a0 # off += x sll $v0,$v0,2 # convert to offset lw $v1,dpy_base # ptr = display base address add $v1,$v1,$v0 # ptr += off lw $v0,dpy_color # color sw $v0,($v1) # store pixel jr $ra setpixel_show: move $a2,$a0 move $a3,$a1 # print x li $v0,1 move $a0,$a2 syscall # print comma li $v0,4 la $a0,msg_comma syscall # print y li $v0,1 move $a0,$a3 syscall # print newline li $v0,4 la $a0,msg_nl syscall move $a0,$a2 move $a1,$a3 j setpixel_go # radbump -- bump down radius # # RETURNS: # v0 -- 1=more to do, 0=done # # registers: # t0 -- radius value radbump: lw $t0,radius lw $t1,ask_radinc sub $t0,$t0,$t1 lw $v0,ask_radmin # do multiple rings? beqz $v0,radbump_store # if no, fly slt $v0,$v0,$t0 # radius < ask_radmin? radbump_store: beqz $t0,radbump_safe sw $t0,radius radbump_safe: jr $ra #+dfnc #+ .data _S_000: .asciiz "output diamond pattern? " _S_001: .asciiz "minimum radius (0=single) > " _S_002: .asciiz "radius decrement > " _S_003: .asciiz "dpy_width" _S_004: .asciiz "dpy_height" _S_005: .asciiz "radius"
Недавно я получил ответ MIPS для структурированного / связанного списка. Я также добавил много предложений о том, как хорошо писать код MIPS. Это может помочь вам понять, что я здесь сделал. См .: Связанный с MIPS список
Вы можете попробовать это:
if (!string.IsNullOrEmpty(dirName) && Directory.Exists(dirName))
{
try
{
System.IO.Compression.ZipFile.ExtractToDirectory(fileName, dirName);
}
catch (ArgumentException ex)
{
// file is empty (as we already checked for directory)
File.Delete(fileName);
}
// OR
if (new FileInfo(fileName).Length == 0)
{
// empty
File.Delete(fileName);
}
else
{
System.IO.Compression.ZipFile.ExtractToDirectory(fileName, dirName);
}
}