; langton's ant ------- [ lxi s,16384 ; stack lxi h,0x707 ; xy push h ant1: lxi h,16382 ; fetch x+y*16 push h ; ( we'll need this later ) mov a,m add a add a add a add a inx h add m inx h ; now points to start of screen mov e,a mov d,l ; d = 0 dad d dad d ; hl += 2*de lxi d,dlist call draw ; draw ant, toggle border, erase ant ; turn left/right mov a,m ani 2 dcr a add c ;;ani 3 mov c,a ; move forward pop h ; hl = 16382 ani 1 ; bit 0 = modify x or y? add l mov l,a mov a,c ani 2 ; bit 1 = add 1 or subtract 1? dcr a add m ani 15 mov m,a jmp ant1 ; draw ant at hl draw: ldax d xra m mov m,a inx h ldax d xra m mov m,a dcx h ; if ant's been erased, we're done ani 0x44 rz inx d ; pause pause1: hlt jmp draw ; display-list dlist: db 0x44 ; draw ant db 0x33 ; toggle box db 0x44 ; erase ant ; ---------- ] ant