En ces temps de confinement, le compilateur BAS_ORIC avance.
J'ai codé les entiers sur 2 octets, de -32768 à 32767, une bibliothèque arithmétique, quelques commandes graphiques (HIRES, CURSET, CURMOV, CIRCLE,…), le GOTO, le GOSUB/RETURN et j'ai commencé à coder le IF/THEN/ELSE.
J'ai eu envie de voir quelle était sa vitesse d'exécution.
Pour cela, j'ai effectué le programme suivant qui remplit l'écran de points espacés de 5 pixels:
10 HIRES
20 X%=0:Y%=0
30 CURSET X%,Y%,1
40 X%=X%+5
50 IF X%<>240 THEN GOTO 30
60 X%=0:Y%=Y%+5
70 IF Y%<>200 THEN GOTO 30
80 END
Je l'ai fait exécuter directement sur Oricutron, cela donne une idée de l'exécution de l'interpréteur intégré à l'ORIC.
Le même source dans BAS_ORIC est le suivant:
DIM X%,Y%
LABEL BOUCLE
HIRES
X%=0:Y%=0
BOUCLE:
CURSET X%,Y%,1
X%=X%+5
IF X%<>240 THEN GOTO BOUCLE
X%=0:Y%=Y%+5
IF Y%<>200 THEN GOTO BOUCLE
END
On peut remarquer:
- qu'il faut déclarer les variables par DIM
- qu'il n'y a pas de numéros de ligne et que pour faire un GOTO, il faut au préalable avoir déclaré un LABEL (ici BOUCLE).
Ce source, une fois compilé et assemblé donne:
33588 8334 --- début du code
33588 8334 --- DIM X%,Y%
33588 8334 --- LABEL BOUCLE
33588 8334 --- HIRES
33588 8334 20 33 EC JSR $EC33
33591 8337 --- X%=0
33591 8337 A9 00 LDA #0
33593 8339 48 PHA
33594 833A A9 00 LDA #0
33596 833C A2 00 LDX #0
33598 833E 9D 23 84 SAX X
33601 8341 68 PLA
33602 8342 E8 INX
33603 8343 9D 23 84 SAX X
33606 8346 --- Y%=0
33606 8346 A9 00 LDA #0
33608 8348 48 PHA
33609 8349 A9 00 LDA #0
33611 834B A2 00 LDX #0
33613 834D 9D 25 84 SAX Y
33616 8350 68 PLA
33617 8351 E8 INX
33618 8352 9D 25 84 SAX Y
33621 8355 --- BOUCLE:
33621 8355 EA BOUCLE NOP
33622 8356 --- CURSET X%,Y%,1
33622 8356 A2 01 LDX #1
33624 8358 BD 23 84 LAX X
33627 835B 48 PHA
33628 835C CA DEX
33629 835D BD 23 84 LAX X
33632 8360 48 PHA
33633 8361 A2 01 LDX #1
33635 8363 BD 25 84 LAX Y
33638 8366 48 PHA
33639 8367 CA DEX
33640 8368 BD 25 84 LAX Y
33643 836B 48 PHA
33644 836C A9 01 LDA #1
33646 836E 48 PHA
33647 836F A9 00 LDA #0
33649 8371 8D E6 02 STA $02E6
33652 8374 68 PLA
33653 8375 8D E5 02 STA $02E5
33656 8378 68 PLA
33657 8379 8D E4 02 STA $02E4
33660 837C 68 PLA
33661 837D 8D E3 02 STA $02E3
33664 8380 68 PLA
33665 8381 8D E2 02 STA $02E2
33668 8384 68 PLA
33669 8385 8D E1 02 STA $02E1
33672 8388 20 C8 F0 JSR $F0C8
33675 838B --- X%=X%+5
33675 838B A2 01 LDX #1
33677 838D BD 23 84 LAX X
33680 8390 48 PHA
33681 8391 CA DEX
33682 8392 BD 23 84 LAX X
33685 8395 48 PHA
33686 8396 A9 05 LDA #5
33688 8398 48 PHA
33689 8399 A9 00 LDA #0
33691 839B 48 PHA
33692 839C 20 10 80 JSR =OPADD
33695 839F 68 PLA
33696 83A0 A2 00 LDX #0
33698 83A2 9D 23 84 SAX X
33701 83A5 68 PLA
33702 83A6 E8 INX
33703 83A7 9D 23 84 SAX X
33706 83AA --- IF X%<>240
33706 83AA A2 01 LDX #1
33708 83AC BD 23 84 LAX X
33711 83AF 48 PHA
33712 83B0 CA DEX
33713 83B1 BD 23 84 LAX X
33716 83B4 48 PHA
33717 83B5 A9 F0 LDA #240
33719 83B7 48 PHA
33720 83B8 A9 00 LDA #0
33722 83BA 48 PHA
33723 83BB 20 45 80 JSR =OPSUB
33726 83BE 68 PLA
33727 83BF A8 TAY
33728 83C0 68 PLA
33729 83C1 AA TAX
33730 83C2 C0 00 CPY #0
33732 83C4 D0 04 BNE #4
33734 83C6 E0 00 CPX #0
33736 83C8 F0 03 BEQ =ENDIF1
33738 83CA --- GOTO BOUCLE
33738 83CA 4C 55 83 JMP BOUCLE
33741 83CD --- END_IF
33741 83CD --- X%=0
33741 83CD EA =ENDIF1 NOP
33742 83CE A9 00 LDA #0
33744 83D0 48 PHA
33745 83D1 A9 00 LDA #0
33747 83D3 A2 00 LDX #0
33749 83D5 9D 23 84 SAX X
33752 83D8 68 PLA
33753 83D9 E8 INX
33754 83DA 9D 23 84 SAX X
33757 83DD --- Y%=Y%+5
33757 83DD A2 01 LDX #1
33759 83DF BD 25 84 LAX Y
33762 83E2 48 PHA
33763 83E3 CA DEX
33764 83E4 BD 25 84 LAX Y
33767 83E7 48 PHA
33768 83E8 A9 05 LDA #5
33770 83EA 48 PHA
33771 83EB A9 00 LDA #0
33773 83ED 48 PHA
33774 83EE 20 10 80 JSR =OPADD
33777 83F1 68 PLA
33778 83F2 A2 00 LDX #0
33780 83F4 9D 25 84 SAX Y
33783 83F7 68 PLA
33784 83F8 E8 INX
33785 83F9 9D 25 84 SAX Y
33788 83FC --- IF Y%<>200
33788 83FC A2 01 LDX #1
33790 83FE BD 25 84 LAX Y
33793 8401 48 PHA
33794 8402 CA DEX
33795 8403 BD 25 84 LAX Y
33798 8406 48 PHA
33799 8407 A9 C8 LDA #200
33801 8409 48 PHA
33802 840A A9 00 LDA #0
33804 840C 48 PHA
33805 840D 20 45 80 JSR =OPSUB
33808 8410 68 PLA
33809 8411 A8 TAY
33810 8412 68 PLA
33811 8413 AA TAX
33812 8414 C0 00 CPY #0
33814 8416 D0 04 BNE #4
33816 8418 E0 00 CPX #0
33818 841A F0 03 BEQ =ENDIF2
33820 841C --- GOTO BOUCLE
33820 841C 4C 55 83 JMP BOUCLE
33823 841F --- END_IF
33823 841F --- END
33823 841F EA =ENDIF2 NOP
33824 8420 60 RTS
33825 8421 --- déclaration des variables
33825 8421 EA =DEBSTR NOP
33826 8422 EA =FINSTR NOP
33827 8423 EA X NOP
33828 8424 EA NOP
33829 8425 EA Y NOP
33830 8426 EA NOP
-----> OK Date=13/04/2020 Time=10:48:04
-----> with BAS_ORIC Release 13/04/2020
-----> compiled using integer configuration
On peut remarquer que pour l'assembleur "maison" qui est intégré dans BAS_ORIC, j'ai fait en sorte que tous les mnémoniques tiennent sur 3 caractères.
Ainsi:
LAX $ABCD signifie LDA $ABCD,X
SAX $ABCD signifie STA $ABCD,X
De même,
LAY $ABCD signifie LDA $ABCD,Y
SAY $ABCD signifie STA $ABCD,Y
BAS_ORIC génère également un source BASIC qui permet de lancer le code binaire généré:
100 HIMEM 32767
110 GOSUB 120:CLS:INPUT A:CALL #8000:END
120 AD=32768:READ CD$
130 REPEAT
140 FOR I=1 TO LEN(CD$) STEP 2
150 POKE AD,VAL("#"+MID$(CD$,I,2)):AD=AD+1
160 NEXT I
170 READ CD$
180 UNTIL CD$="END"
190 RETURN
200 DATA "4C2783EAEAEAEAEAEAEAEAEA"
210 DATA "EAEAEAEAA9018D0F80688D0C"
220 DATA "80688D0D80688D0380688D04"
230 DATA "80688D0580688D068018AD06"
240 DATA "806D048048AD05806D038048"
250 DATA "AD0D8048AD0C804860A9028D"
260 DATA "0F80688D0C80688D0D80688D"
270 DATA "0380688D0480688D0580688D"
280 DATA "068038AD0680ED048048AD05"
290 DATA "80ED038048AD0D8048AD0C80"
300 DATA "4860A9038D0F80688D0C8068"
310 DATA "8D0D80688D0380688D048068"
320 DATA "8D0580688D0680A9008D0780"
330 DATA "8D0880186E03806E04809013"
340 DATA "18AD06806D08808D0880AD05"
350 DATA "806D07808D0780182E06802E"
360 DATA "0580AD0380C900D0D6AD0480"
370 DATA "C900D0CFAD088048AD078048"
380 DATA "AD0D8048AD0C804860A9048D"
390 DATA "0F80688D0C80688D0D80688D"
400 DATA "0380688D0480688D0580688D"
410 DATA "0680A9008D07808D08808D09"
420 DATA "808D0A808D0B80AD05801019"
430 DATA "38A900ED06808D0680A900ED"
440 DATA "05808D0580AD0B8049FF8D0B"
450 DATA "80AD0380101938A900ED0480"
460 DATA "8D0480A900ED03808D0380AD"
470 DATA "0B8049FF8D0B80A210182E06"
480 DATA "802E05802E0A802E098038AD"
490 DATA "0A80ED04808D0A80AD0980ED"
500 DATA "03808D0980101D182E08802E"
510 DATA "078018AD0A806D04808D0A80"
520 DATA "AD09806D03808D0980189007"
530 DATA "382E08802E0780CAE000D0B5"
540 DATA "AD0B80101138A900ED08808D"
550 DATA "0880A900ED07808D0780AD08"
560 DATA "8048AD078048AD0D8048AD0C"
570 DATA "804860688D0C80688D0D8068"
580 DATA "A8B92784F008AA207CF7C84C"
590 DATA "C981AD0D8048AD0C80486068"
600 DATA "8D0C80688D0D8068AA68A88A"
610 DATA "2099D420D5E0AE0001207CF7"
620 DATA "AE0101F023207CF7AE0201F0"
630 DATA "1B207CF7AE0301F013207CF7"
640 DATA "AE0401F00B207CF7AE0501F0"
650 DATA "03207CF7AD0D8048AD0C8048"
660 DATA "60AE0380F007CACABD2784F0"
670 DATA "0160AE03808AA888A9018D05"
680 DATA "80BD2784F008992784E8C84C"
690 DATA "4182CE0380CAA9009D27844C"
700 DATA "2982A200E88E0480BD2184F0"
710 DATA "F7C9FFF0178D0380A9008D05"
720 DATA "80202982AE0480AD03809D21"
730 DATA "844C5C82AD0580D0D560A001"
740 DATA "B92784F00CC8B92784D0FAC8"
750 DATA "B92784D0F460AD0480AABD27"
760 DATA "84F008992784E8C84C9E8260"
770 DATA "688D0C80688D0D80688D0380"
780 DATA "688D0480F019AD0380F01C20"
790 DATA "86829848209A82AD03808D04"
800 DATA "80209A824CE482AC03809848"
810 DATA "4CE482AC04809848AD0D8048"
820 DATA "AD0C804860688D0C80688D0D"
830 DATA "80688D0380688D0480CD0380"
840 DATA "F018AD0380F013AC0380A900"
850 DATA "992784C8B92784F005A9004C"
860 DATA "0C83AD048048AD0D8048AD0C"
870 DATA "804860A078A90099278488D0"
880 DATA "FA8D0E802033ECA90048A900"
890 DATA "A2009D238468E89D2384A900"
900 DATA "48A900A2009D258468E89D25"
910 DATA "84EAA201BD238448CABD2384"
920 DATA "48A201BD258448CABD258448"
930 DATA "A90148A9008DE602688DE502"
940 DATA "688DE402688DE302688DE202"
950 DATA "688DE10220C8F0A201BD2384"
960 DATA "48CABD238448A90548A90048"
970 DATA "20108068A2009D238468E89D"
980 DATA "2384A201BD238448CABD2384"
990 DATA "48A9F048A9004820458068A8"
1000 DATA "68AAC000D004E000F0034C55"
1010 DATA "83EAA90048A900A2009D2384"
1020 DATA "68E89D2384A201BD258448CA"
1030 DATA "BD258448A90548A900482010"
1040 DATA "8068A2009D258468E89D2584"
1050 DATA "A201BD258448CABD258448A9"
1060 DATA "C848A9004820458068A868AA"
1070 DATA "C000D004E000F0034C5583EA"
1080 DATA "60EAEAEAEAEAEAEAEAEAEAEA"
1090 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1100 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1110 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1120 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1130 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1140 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1150 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1160 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1170 DATA "EAEAEAEAEAEAEAEAEAEAEAEA"
1180 DATA "EAEAEAEAEAEAEAEA","END"
Voici le fichier tap correspondant à ce "lanceur":
http://panoramic-language.pagesperso-orange.fr/Reference/IQUADRILL3.tap
On constate que son exécution est beaucoup plus rapide qu'avec l'interpréteur intégré.
C'était le but.
A bientôt pour de nouvelles aventures.
Bravo, c'est impressionnant. Mais je n'arrive pas à lancer le tap avec oricutron. Une fois chargé il ne se passe rien.
Du coup j'ai copié le source du lanceur dans Oricutron et en effet c'est beaucoup plus rapide à l'exécution.
👍
Je n'ai pas essayé de faire fonctionner mais j'ai lu la description du principe et je trouve ça très intéressant.
Ce langage est proche du basic traditionnel de l'Oric mais comme il est compilé plutôt qu'interprété, il va offrir un niveau de performance plus proche de celui du C ou de l'assembleur.
Comme il existe un bon nombre de sources en Basic et qu'il y a des codeurs dans ce langage, ça peut permettre d'accélérer les performances de certains anciens jeux et augmenter la puissance des nouvelles productions.
Personnellement je ne code pas beaucoup en BASIC .. donc je ne me sens pas concerné au premier abord .. mais par contre .. si ce BASIC peut permettre de partager des routines ASM et/ou C pour les rendre accessibles aux codeurs en BASIC .. ca m'intéresserait au plus haut point.
Bravo pour ce langage .. c'est vraiment une bonne idée. Selon moi le potentiel pour la communauté Oric est déjà énorme.
S'il pouvait y avoir, en cerise sur le gâteau, un interfaçage avec des routines précompilées écrites en C ou en assembleur .. alors là .. ma ma mia ..