|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Micro-Professor MPF-II Assembler
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Нет... только когда MPF-II принимает массив байт. Вынуть из архива и запустить его... На Win-64 работать не будет, поскольку у меня 32-разрядная Windows-7, она запускает 16-разрядное приложение. Но можно попробовать 32-разрядную сборку:
_________________ iLavr
|
02 Jul 2021 05:55 |
|
|
vitali
Senior
Joined: 17 Sep 2019 09:34 Posts: 136 Location: Finland
|
У меня древний планшет на Атоме, доросший от Винды 8.0 до последней сборки десятки, 32-битная. Последний экзешник запустился.
Классная анимация. В чем такое делается?
|
02 Jul 2021 12:01 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Написано на очень древнем софте и скомпилировано весьма современным компилятором. Собственно, если б у вас был древний ноут с Виндой 98 ... ХР и портом LPT, половина дела была бы уже сделана, поскольку в этой программе написаны и клиент и сервер... А так - клиент я сейчас переношу на Applesoft BASIC, ну а сервер вам придётся написать на Piton, или что там у вас на повод дёргания лапками имеется.
_________________ iLavr
|
02 Jul 2021 15:44 |
|
|
vitali
Senior
Joined: 17 Sep 2019 09:34 Posts: 136 Location: Finland
|
Понятно. Впечатляет! Древнего ноута, к сожалению, нет. Но есть гипотетический шанс заполучить его, спрошу. А что, если лапками дрыгать из Ардуины? Конструктивно это можно было бы оформить как маленький блочок рядом с MPF-II, с SD-картой и маленьким OLED экранчиком для пролистывания софта для загрузки.
|
03 Jul 2021 03:23 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я думаю - уже не надо дёргаться на этот повод - я уже учёл, что у нас его нет. Ну это ваше дело - чем вы будете лапками дрыгать со стороны РС. Я допишу сейчас клиент для MPF-II на Applesoft BASIC и напишу вам алгоритм на русском языке. А там - решайте сами.
_________________ iLavr
|
03 Jul 2021 04:06 |
|
|
vitali
Senior
Joined: 17 Sep 2019 09:34 Posts: 136 Location: Finland
|
Да, глупо еще один ноутбук держать рядом с основным ноутбуком для загрузки MPF-II. Поэтому ногодрыг будет другой. Мне кажется, Ардуина логично ложится в концепцию - просто, 5-вольт совместимо и реалтайменно, в отличие от линукса "Малины".
Нашел свой старый логгер на SD-карточке с часами реального времени и экранчиком - добавлю 3 кнопки интерфейса, и получится MPF-II Binary Data Loader:
|
03 Jul 2021 07:42 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну что ж... пора приступить к отладке клиента для MPF-II на реальном железе? А то у меня лишь эти эмуляторы, которые меня уже зело подутомили без аппаратной поддержки, а у вас хотя бы кнопка Busy работающая есть - воспользуется ей! Ниже - альфа-версия софта. Собственно, частично заглушенная аппаратно для эмулятора, но в эмуляции практически всё на первый взгляд безошибочно работает... MPF-II BASIC LOADER V1 | | | | Code: 10 REM >>>>>>>> RECEIVING CODE BLOCK FROM PC <<<<< 20 TEXT : HOME : ON ERROR GOTO 590 : REM ERRORHAND 30 PRINT ">>>>> RECEIVING CODE BLOCK FROM PC <<<<<" 35 PRINT "STROBE=<0> " : PRINT 40 S0 = PEEK($C010) : REM SET STROBE="0" - C058 50 PRINT ">>>>> PRESS [ENTER] TO START: "; 60 GET KEY$ : IF KEY$ <> CHR$(13) THEN GOTO 60 70 PRINT : PRINT : PRINT "WAITING BUSY=<1> ..." : J = 1 80 GOSUB 1900 : REM GET BIT 6 THERE 85 PRINT B(6); : J = J + 1 90 IF J = 78 THEN NORMAL: HTAB 1: J = 1: GOTO 95 93 IF J = 39 THEN INVERSE: HTAB 1 95 IF B(6) = 0 THEN GOTO 80 100 NORMAL: PRINT : PRINT : PRINT "START LOADING... SET STROBE = 1-0-1-0... " 110 ADDR = INT(1 - 1) : LNGTH = INT(1 - 1) : REM MAKE THEM INTEGER 120 BYTE = INT(1 - 1) : PRE = INT(2 - 1) : NUM = INT(1 - 1) 130 GOSUB 660 : REM GETBYTE 140 IF NUM > 2 THEN GOTO 520 : REM ERROR GETBYTE 150 ADDR = BYTE * 256 160 C$ = "0123456789ABCDEF" 170 AH = INT(BYTE/16) : AL = BYTE - (AH * 16) 180 A1$ = MID$(C$, AH + 1, 1) : A1$ = A1$ + MID$(C$, AL + 1, 1) 190 GOSUB 660 : REM GETBYTE 200 IF NUM > 2 THEN GOTO 520 : REM ERROR GETBYTE 210 ADDR = ADDR + BYTE 220 AH = INT(BYTE/16) : AL = BYTE - (AH * 16) 230 A0$ = MID$(C$, AH + 1, 1) : A0$ = A0$ + MID$(C$, AL + 1, 1) 240 A1$ = A1$ + A0$ + "H; " 250 PRINT : PRINT "START ADDR = "; A1$; ADDR 260 GOSUB 660 : REM GETBYTE 270 IF NUM > 2 THEN GOTO 520 : REM ERROR GETBYTE 280 LNGTH = BYTE * 256 290 AH = INT(BYTE/16) : AL = BYTE - (AH * 16) 300 A1$ = MID$(C$, AH + 1, 1) : A1$ = A1$ + MID$(C$, AL + 1, 1) 310 GOSUB 660 : REM GETBYTE 320 IF NUM > 2 THEN GOTO 520 : REM ERROR 660 : REM GETBYTE 330 LNGTH = LNGTH + BYTE 340 AH = INT(BYTE/16) : AL = BYTE - (AH * 16) 350 A0$ = MID$(C$, AH + 1, 1) : A0$ = A0$ + MID$(C$, AL + 1, 1) 360 A1$ = A1$ + A0$ + "H; " 370 PRINT : PRINT "BLOCK LENGTH = "; A1$; LNGTH; " Bytes " 380 PRINT : PRINT "LOADING BLOCK FROM ADDR "; ADDR; "... " 390 GOSUB 660 : REM GETBYTE 400 IF NUM > 2 THEN GOTO 520 : REM ERROR GETBYTE 410 POKE ADDR, BYTE 420 ADDR = ADDR + 1 : LNGTH = LNGTH - 1 430 IF LNGTH > 0 THEN GOTO 390 440 PRINT 445 PRINT "THE WHOLE CODE BLOCK IS LOADED!" 450 PRINT "PRESS [ENTER] TO START OR [ESC] - EXIT:"; 460 GET KEY$ 470 IF KEY$ = CHR$(27) THEN GOTO 600 : REM EXITALL 480 IF KEY$ <> CHR$(13) THEN GOTO 460 490 CALL ADDR 500 GOTO 600 : REM EXITALL 520 PRINT 530 PRINT "ERROR WHILE LOADING CURRENT BYTE!" : REM ERROREND 540 PRINT "PRESS [ENTER] TO RESTART, [ESC]> EXIT:"; 550 GET KEY$ 560 IF KEY$ = CHR$(27) THEN GOTO 600 : REM EXITALL 570 IF KEY$ = CHR$(13) THEN GOTO 20 580 GOTO 550 590 PRINT : PRINT "INERNAL BASIC ERROR! PROGRAM ABORTED! " : REM ERRORHAND 600 END : REM EXITALL
660 BYTE = 0 : W = 256 : BN = 8 : REM GETBYTE 670 GOSUB 750 680 IF NUM > 2 THEN GOTO 720 : REM EXIT GETBYTE 690 W = W / 2 : BYTE = BYTE + (W * BIT) 700 BN = BN - 1 710 IF BN <> 0 THEN GOTO 670 720 RETURN
750 NUM = 0 : LC = 0 : REM GETBIT 755 HTAB 1 : NORMAL 760 FOR K = 1 TO 39 763 PRINT "+"; 764 NEXT K 765 HTAB 1 768 S1 = PEEK($C010) : REM SET STROBE="1" - C059 770 GOSUB 1900 : REM GET BIT 6 THERE 780 PRINT B(6); : LC = LC + 1 790 IF B(6) <> PRE THEN NUM = NUM + 1 : GOTO 810 800 IF LC < 11 THEN GOTO 770 810 IF B(6) < PRE THEN BIT = 1 820 IF B(6) > PRE THEN BIT = 0 825 PRE = B(6) 830 S0 = PEEK($C010) : REM SET STROBE="0" - C058 840 HTAB 10 : INVERSE 850 FOR K = 10 TO 20 860 PRINT B(6); 870 NEXT K 880 HTAB 20 : NORMAL : LC = 20 890 S1 = PEEK($C010) : REM SET STROBE="1" - C059 900 GOSUB 1900 : REM GET BIT 6 THERE 910 PRINT B(6); : LC = LC + 1 915 IF B(6) <> PRE THEN NUM = NUM + 1 : GOTO 925 920 IF LC < 31 THEN GOTO 900 925 IF B(6) < PRE THEN BIT = 1 930 IF B(6) > PRE THEN BIT = 0 940 PRE = B(6) 950 S0 = PEEK($C010) : REM SET STROBE="0" - C058 960 HTAB 31 : INVERSE 970 FOR K = 31 TO 39 975 PRINT B(6); 980 NEXT K 985 HTAB 1 : NORMAL 990 IF NUM = 0 THEN NUM = 15 995 RETURN
1900 GET KEY$ : BX = PEEK($C010): N = 256 : REM TEST BIT6 1910 FOR I = 7 TO 5 STEP -1 1920 N = N/2 1930 B(I) = INT(BX/N): BX = BX - (B(I)*N) 1940 NEXT I 1950 B(6) = B(5) : REM FOR DEBUG 1960 RETURN | | | | |
Для отладки используется подмена Бита 6 - Busy Битом 5, на который влияет клавиатура: Формат передачи блока кодов следующий: Первые два байта: адрес загрузки блока - Старший байт, Младший байт. Вторые два байта: длина блока кодов - Старший байт, Младший байт. Далее подряд идёт блок кодов указанной длины. Каждый байт передаётся начиная от старшего бита ( бит 7) к младшему биту ( бит 0). Формат передачи - манчестерское кодирование, подробно изображено на картинках здесь в топике. Чтобы от тестирования с клавиатуры перейти к тестированию аппаратно кнопкой Busy, необходимо исправить следующий участок кода: P.S. Имитировал я биты с клавиатуры, глядя на следующую картинку: Ни одного перехода за 2 такта STROBE = 1 такт CLOCK - ОШИБКА! Более двух переходов за 2 такта STROBE = 1 такт CLOCK - ОШИБКА! Переход "0"->"1" = лог."0", переход "1"->"0" = лог."1".
_________________ iLavr
|
03 Jul 2021 15:53 |
|
|
vitali
Senior
Joined: 17 Sep 2019 09:34 Posts: 136 Location: Finland
|
Ого, вот это софт! Расчехляю Audacity на лаптопе, буду набирать Васик и записывать промежуточные версии
|
04 Jul 2021 07:47 |
|
|
vitali
Senior
Joined: 17 Sep 2019 09:34 Posts: 136 Location: Finland
|
Такое в AppleBasic работает? Профессор ругается:
|
04 Jul 2021 08:01 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
В Applesoft BASIC это работает, но я же с самого начала показывал возможные варианты: Заменяйте сами на работающий у Профессора вариант, у меня ведь его нет. Ниже код клиента для MPF-II, из которого все отладочные условности вычищены: MPF-II BASIC LOADER V1.1 | | | | Code: 10 REM >>>>>>>> RECEIVING CODE BLOCK FROM PC <<<<< 20 TEXT : HOME : ON ERROR GOTO 590 : REM ERRORHAND 30 PRINT ">>>>> RECEIVING CODE BLOCK FROM PC <<<<<" 35 PRINT "STROBE=<0> " : PRINT 40 S0 = PEEK($C058) : REM SET STROBE="0" - C058 50 PRINT ">>>>> PRESS [ENTER] TO START: "; 60 GET KEY$ : IF KEY$ <> CHR$(13) THEN GOTO 60 70 PRINT : PRINT : PRINT "WAITING BUSY=<1> ..." : J = 1 80 GOSUB 1900 : REM GET BIT 6 THERE 85 PRINT B(6); : J = J + 1 90 IF J = 78 THEN NORMAL: HTAB 1: J = 1: GOTO 95 93 IF J = 39 THEN INVERSE: HTAB 1 95 IF B(6) = 0 THEN GOTO 80 100 NORMAL: PRINT : PRINT : PRINT "START LOADING... SET STROBE = 1-0-1-0... " 110 ADDR = INT(1 - 1) : LNGTH = INT(1 - 1) : REM MAKE THEM INTEGER 120 BYTE = INT(1 - 1) : PRE = INT(2 - 1) : NUM = INT(1 - 1) 130 GOSUB 660 : REM GETBYTE 140 IF NUM > 2 THEN GOTO 520 : REM ERROR GETBYTE 150 ADDR = BYTE * 256 160 C$ = "0123456789ABCDEF" 170 AH = INT(BYTE/16) : AL = BYTE - (AH * 16) 180 A1$ = MID$(C$, AH + 1, 1) : A1$ = A1$ + MID$(C$, AL + 1, 1) 190 GOSUB 660 : REM GETBYTE 200 IF NUM > 2 THEN GOTO 520 : REM ERROR GETBYTE 210 ADDR = ADDR + BYTE 220 AH = INT(BYTE/16) : AL = BYTE - (AH * 16) 230 A0$ = MID$(C$, AH + 1, 1) : A0$ = A0$ + MID$(C$, AL + 1, 1) 240 A1$ = A1$ + A0$ + "H; " 250 PRINT : PRINT "START ADDR = "; A1$; ADDR 260 GOSUB 660 : REM GETBYTE 270 IF NUM > 2 THEN GOTO 520 : REM ERROR GETBYTE 280 LNGTH = BYTE * 256 290 AH = INT(BYTE/16) : AL = BYTE - (AH * 16) 300 A1$ = MID$(C$, AH + 1, 1) : A1$ = A1$ + MID$(C$, AL + 1, 1) 310 GOSUB 660 : REM GETBYTE 320 IF NUM > 2 THEN GOTO 520 : REM ERROR 660 : REM GETBYTE 330 LNGTH = LNGTH + BYTE 340 AH = INT(BYTE/16) : AL = BYTE - (AH * 16) 350 A0$ = MID$(C$, AH + 1, 1) : A0$ = A0$ + MID$(C$, AL + 1, 1) 360 A1$ = A1$ + A0$ + "H; " 370 PRINT : PRINT "BLOCK LENGTH = "; A1$; LNGTH; " Bytes " 380 PRINT : PRINT "LOADING BLOCK FROM ADDR "; ADDR; "... " 390 GOSUB 660 : REM GETBYTE 400 IF NUM > 2 THEN GOTO 520 : REM ERROR GETBYTE 410 POKE ADDR, BYTE 420 ADDR = ADDR + 1 : LNGTH = LNGTH - 1 430 IF LNGTH > 0 THEN GOTO 390 440 PRINT 445 PRINT "THE WHOLE CODE BLOCK IS LOADED!" 450 PRINT "PRESS [ENTER] TO START OR [ESC] - EXIT:"; 460 GET KEY$ 470 IF KEY$ = CHR$(27) THEN GOTO 600 : REM EXITALL 480 IF KEY$ <> CHR$(13) THEN GOTO 460 490 CALL ADDR 500 GOTO 600 : REM EXITALL 520 PRINT 530 PRINT "ERROR WHILE LOADING CURRENT BYTE!" : REM ERROREND 540 PRINT "PRESS [ENTER] TO RESTART, [ESC]> EXIT:"; 550 GET KEY$ 560 IF KEY$ = CHR$(27) THEN GOTO 600 : REM EXITALL 570 IF KEY$ = CHR$(13) THEN GOTO 20 580 GOTO 550 590 PRINT : PRINT "INERNAL BASIC ERROR! PROGRAM ABORTED! " : REM ERRORHAND 600 END : REM EXITALL
660 BYTE = 0 : W = 256 : BN = 8 : REM GETBYTE 670 GOSUB 750 680 IF NUM > 2 THEN GOTO 720 : REM EXIT GETBYTE 690 W = W / 2 : BYTE = BYTE + (W * BIT) 700 BN = BN - 1 710 IF BN <> 0 THEN GOTO 670 720 RETURN
750 NUM = 0 : LC = 0 : REM GETBIT 755 HTAB 1 : NORMAL 760 FOR K = 1 TO 39 763 PRINT "+"; 764 NEXT K 765 HTAB 1 768 S1 = PEEK($C059) : REM SET STROBE="1" - C059 770 GOSUB 1900 : REM GET BIT 6 THERE 780 PRINT B(6); : LC = LC + 1 790 IF B(6) <> PRE THEN NUM = NUM + 1 : GOTO 810 800 IF LC < 11 THEN GOTO 770 810 IF B(6) < PRE THEN BIT = 1 820 IF B(6) > PRE THEN BIT = 0 825 PRE = B(6) 830 S0 = PEEK($C058) : REM SET STROBE="0" - C058 840 HTAB 10 : INVERSE 850 FOR K = 10 TO 20 860 PRINT B(6); 870 NEXT K 880 HTAB 20 : NORMAL : LC = 20 890 S1 = PEEK($C059) : REM SET STROBE="1" - C059 900 GOSUB 1900 : REM GET BIT 6 THERE 910 PRINT B(6); : LC = LC + 1 915 IF B(6) <> PRE THEN NUM = NUM + 1 : GOTO 925 920 IF LC < 31 THEN GOTO 900 925 IF B(6) < PRE THEN BIT = 1 930 IF B(6) > PRE THEN BIT = 0 940 PRE = B(6) 950 S0 = PEEK($C058) : REM SET STROBE="0" - C058 960 HTAB 31 : INVERSE 970 FOR K = 31 TO 39 975 PRINT B(6); 980 NEXT K 985 HTAB 1 : NORMAL 990 IF NUM = 0 THEN NUM = 15 995 RETURN
1900 BX = PEEK($C010): N = 256 : REM TEST BIT6 1910 FOR I = 7 TO 6 STEP -1 1920 N = N/2 1930 B(I) = INT(BX/N): BX = BX - (B(I)*N) 1940 NEXT I 1950 RETURN | | | | |
Если попадаются нерабочие строки типа PEEK($C010) и аналогичные - заменяйте HEX $C010 на DEC через калькулятор Windows. -16368 - это двухбайтное значение, 49168 - четырёхбайтное значение, оно же: 65536-16368. Ниже в архиве - алгоритм обмена на русском языке, чтобы вы смогли написать свой сервер. Желаю удачи!
_________________ iLavr
|
04 Jul 2021 08:41 |
|
|
vitali
Senior
Joined: 17 Sep 2019 09:34 Posts: 136 Location: Finland
|
Спасибо за подробнейшее описание алгоритма обмена и код на Бейсике! Поскольку проект нарисовывается серьезный, я открыл репозиторий на Гитлабе, сильно проще будет разбираться в изменениях. Вот разница между версиями 1.0 и 1.1
|
04 Jul 2021 13:53 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Чисто, чтобы было понятно, в чем разница между отладочной и оригинальной версиями: некоторые нужные нам адреса эмулятор Applesoft BASIC использовать просто не позволял: Хотя в их эмуляции и не было никакой пользы для отладки... Поэтому все они были для прохождения отладки записаны как $C010. В оригинальной версии - все адреса правильные, но её не выполнит эмулятор. При отладке, чтобы имитировать сигнал BUSY от PC, я делал подмену Бита 6 на Бит 5 - им можно управлять с клавиатуры. Программа при этом тормозилась по оператору GET. В оригинальном коде проверяется только Бит 6 - BUSY. В этом, собственно, и вся разница между этими двумя версиями...
_________________ iLavr
|
05 Jul 2021 07:48 |
|
|
vitali
Senior
Joined: 17 Sep 2019 09:34 Posts: 136 Location: Finland
|
Понятно. В общем, я взял за основу Ваш последний код (1.1), заменил шестнадцатеричные числа в PEEK() на десятичные, и выложил в ГИТ как версию 1.2, буду ее набивать в MPF.
|
05 Jul 2021 12:39 |
|
|
vitali
Senior
Joined: 17 Sep 2019 09:34 Posts: 136 Location: Finland
|
Примерно половину программы набил (спасением является работающий после переделки выхода MIC ZX-Магнитофон). Глядя на ужас экрана MPF-II с листингом программы, подумалось: а можно сделать абсолютно минимальный вариант Бейсик Загрузчика, который, скажем, грузиит два байта с ардуино? И отладить только его, все что можно, разместив в подпрограммах, вылизав до упора.
|
06 Jul 2021 15:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я не знаю реальной скорости вашего Micro-Professor MPF-II, поэтому вставки на ассемблере мне написать удалённо - очень затруднительно.
P.S. В принципе есть и другой вариант, я посмотрел, у Apple-][ интерфейс RS-232 реализован аппаратно на отдельной плате. Если существует плата расширения RS-232 под системный разъём Micro-Professor MPF-II, можно купить и использовать её.
_________________ iLavr
|
06 Jul 2021 16:42 |
|
|
Who is online |
Users browsing this forum: No registered users and 43 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|