.MODEL SMALL
.DATA
prevx DW 320
prevy DW 240
prevbt DW 0
newx DW 320
newy DW 240
posx DW 0
posy DW 0
newbt DW 0
stepx DW 0
stepy DW 0
diffx DW 0
diffy DW 0
errv DW 0
.CODE
.STARTUP
MOV AH, 00h
MOV AL, 12h
INT 10h
MOV AX, 00h
INT 33h
CMP AX, 00h
JE go_exit
MOV AX, 01h
INT 33h
MOV AX, 04h
MOV CX, prevx
MOV DX, prevy
INT 33h
loop_1:
IN AL, 60h
CMP AL, 1
JE go_exit
MOV AX, 03h
INT 33h
MOV newbt, BX
MOV newx, CX
MOV newy, DX
CMP BX, 0
JE go_save
CMP prevbt, 0
JE go_point
CMP prevx, CX
JNE go_draw
CMP prevy, DX
JE go_save
JMP go_draw
go_point:
MOV AX, 02h
INT 33h
MOV AH, 0Ch
MOV AL, 0Fh
MOV BH, 00h
MOV CX, newx
MOV DX, newy
INT 10h
MOV AX, 01h
INT 33h
JMP go_save
go_draw:
MOV AX, prevbt
CMP AX, 0
JE go_save
MOV AX, 02h
INT 33h
CALL drawline
MOV AX, 01h
INT 33h
go_save:
MOV BX, newbt
MOV prevbt, BX
MOV CX, newx
MOV prevx, CX
MOV DX, newy
MOV prevy, DX
JMP loop_1
go_exit:
MOV AH, 00h
MOV AL, 03h
INT 10h
.EXIT
drawline:
MOV AX, newx
SUB AX, prevx
MOV stepx, 1
CMP AX, 0
JGE next_1
MOV stepx, -1
NEG AX
next_1:
MOV diffx, AX
MOV AX, newy
SUB AX, prevy
MOV stepy, 1
CMP AX, 0
JGE next_2
MOV stepy, -1
NEG AX
next_2:
MOV diffy, AX
MOV AX, diffx
SUB AX, diffy
MOV errv, AX
MOV AX, prevx
MOV posx, AX
MOV AX, prevy
MOV posy, AX
loop_2:
MOV AH, 0Ch
MOV AL, 0Fh
MOV BH, 00h
MOV CX, posx
MOV DX, posy
PUSH CX
PUSH DX
INT 10h
POP DX
POP CX
CMP CX, newx
JNE next_3
CMP DX, newy
JE go_return
next_3:
MOV DX, errv
ADD DX, DX
MOV BX, diffy
NEG BX
CMP DX, BX
JLE next_4
MOV AX, diffy
SUB errv, AX
MOV AX, stepx
ADD posx, AX
next_4:
MOV BX, diffx
CMP DX, BX
JGE loop_2
MOV AX, diffx
ADD errv, AX
MOV AX, stepy
ADD posy, AX
JMP loop_2
go_return:
RET
.STACK
END