Ну что ж... пора приступить к отладке клиента для
MPF-II на реальном железе?
А то у меня лишь эти эмуляторы, которые меня уже зело подутомили без аппаратной поддержки,
а у вас хотя бы кнопка
Busy работающая есть - воспользуется ей!
Ниже - альфа-версия софта. Собственно, частично заглушенная аппаратно для эмулятора,
но в эмуляции практически всё на первый взгляд безошибочно работает...
MPF-II BASIC LOADER V1Code: Select all
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, на который влияет клавиатура:
Code: Select all
[Пробел] - устанавливает бит 5
клавиши: '[', ']', '\' - сбрасывают бит 5 в любом регистре - проверено на эмуляторе!
Формат передачи блока кодов следующий:
Первые два байта:
адрес загрузки блока -
Старший байт, Младший байт.
Вторые два байта:
длина блока кодов -
Старший байт, Младший байт.
Далее подряд идёт блок кодов указанной длины.
Каждый
байт передаётся начиная от
старшего бита (
бит 7) к
младшему биту (
бит 0).
Формат передачи -
манчестерское кодирование, подробно изображено на картинках здесь в топике.
Чтобы от тестирования с клавиатуры перейти к тестированию аппаратно кнопкой
Busy,
необходимо исправить следующий участок кода:
Code: Select all
1900 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
1960 RETURN
P.S. Имитировал я биты с клавиатуры, глядя на следующую картинку:
манчестер2.png
Ни одного перехода за 2 такта STROBE = 1 такт CLOCK - ОШИБКА!
Более двух переходов за 2 такта STROBE = 1 такт CLOCK - ОШИБКА!
Переход "0"->"1" = лог."0", переход "1"->"0" = лог."1".
You do not have the required permissions to view the files attached to this post.