А вот тут уже загвоздка. Две программы, которые должны делать одно и то же. Но ассемблерный вариант рисует две лишние точки (не там) и смещает часть графика.
Первая:
Вторая:Код: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
Довольно интересный артефакт вылазит. Буду разбираться. Картинки и CASы - во вложении.Код: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




Ответить с цитированием