А вот тут уже загвоздка. Две программы, которые должны делать одно и то же. Но ассемблерный вариант рисует две лишние точки (не там) и смещает часть графика.
Первая:
Код:
10 SCREEN2
30 LINE(0,96)-(255,96),12
40 LINE(128,0)-(128,192),12
100 FOR X=0 TO 255
110 Y=10*SIN(X/10)+96
120 PSET(X,Y),3
200 NEXT
1000 IF INKEY$="" GOTO1000
Вторая:
Код:
ORG 0x5000-0x26
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DB 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0
DB 'tstprg'
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DW START, ENDE, START
START: mvi a, 2
call 0x286d; SETMODE2
lxi h, 0xfd8f; адрес PSETC
mvi m, 12; в переменную PSETC записываем 12 цвет
inx h
mvi m, 0; X1=0
inx h
mvi m, 96; Y1=96
inx h
mvi m, 255; X2=255
inx h
mvi m, 96; Y2=96
call 0x1908; LINE_ASM - рисуем ось абсцисс
lxi h, 0xfd90; адрес X1
mvi m, 128; X1=128
inx h
mvi m, 0; Y1=0
inx h
mvi m, 128; X2=128
inx h
mvi m, 192; Y2=192
call 0x1908; LINE_ASM - рисуем ось ординат
lxi h, 0xfd8f; адрес PSETC
mvi m, 3; в переменную PSETC записываем 3 цвет
mvi c, 0; параметр цикла
loop: push b
mov a, c
call 0x12d5; FCHARTOFLOAT - перевод параметра цикла в плавающую точку
call 0x120c; FDIVBYTEN
call 0x1666; SIN
call 0x12b3; FMULBYTEN
call 0x130d; FCOPYTOBCDE - переводим FACCUM в BCDE формат
push b; сохраним BCDE временно
push d
lxi h, ord
call 0x13c6; FIN - переводим строку в FACCUM
pop d; восстановим BCDE
pop b
call 0x1082; FADD2 - складываем FACCUM и BCDE, результат остаётся в FACCUM
call 0x1367; FASINTEGER переводим FACCUM в целое
lxi h, 0xfd90; адрес X1
pop b
push b
mov m, c
inx h
mov m, e
call 0x182c; PSET_ASM
pop b
inr c
mov a, c
cpi 0x0
jnz loop
xra a
lock: call 0x007c; BUFBT2A - IF INKEY$=""
cpi 0x0
jz lock
ret
ord: db "96"
db 0x0
ENDE:
END
Довольно интересный артефакт вылазит. Буду разбираться. Картинки и CASы - во вложении.