Hallo zusammen,
folgendes Basic-Listing, welches auf Maschinencode zurückgreift, würde ich gerne zu Turbo Pascal übertragen:
Code
10 MEMORY &HCB00-10
20 DIM tval%(25),cps%(25)
30 FOR i=0 TO 24
40 READ tval%(i),cps%(i)
50 NEXT
60 DATA 3324,131,3132,139,2961,147,2789,156,2636,165,2485,175,2350,185,2227,196
70 DATA 2098,208,1994,220,1863,233,1770,247,1655,262,1564,277,1473,294,1391,311
80 DATA 1311,330,1258,349,1167,370,1101,392,1039,415,979,440,924,466,877,493,819,524
90 GOSUB 410
100 RESTORE 170
110 PRINT: PRINT "Die zwei Oktaven....."
120 FOR scale=0 TO 14
130 READ note,duration
140 t%=tval%(note): c%=cps%(note)/8 * duration
150 CALL psound(t%,c%)
160 NEXT
170 DATA 0,4,2,1,4,1,5,1,7,1,9,1,11,1,12,4,14,1,16,1,17,1,19,1,21,1,23,1,24,4
180 FOR pause=0 TO 500: NEXT
190 PRINT: PRINT "Melodie:": PRINT
200 PRINT "Rule Britannia!": PRINT
210 FOR repaat=0 TO 1
220 tune$="O2E8E3F3F6E3F4E1D3O1C3B9B3O2G5F5E1D1E1F1G3F3E6D6O1C9"
230 GOSUB 260
240 NEXT
250 END
260 p=0:WHILE p<LEN(tune$)
270 n$=MID$(tune$,p+1,1)
280 IF n$="R" THEN p=p+1: rest=VAL(MID$(tune$,p+1,1)): FOR r=0 TO rest*25:NEXT:GOTO 380
290 IF n$="O" THEN p=p+1: oct=VAL(MID$(tune$,p+1,1)): GOTO 380
300 note=INSTR(1,"D_EF_G_A_BC",n$)-1
310 IF oct=2 THEN note=note+12
320 IF MID$(tune$,p+2,1)="#" THEN note=note+1: p=p+1
330 IF MID$(tune$,p+2,1)="b" THEN note=note-1: p=p+1
340 p=p+1
350 duration=VAL(MID$(tune$,p+1,1))
360 t%=tval%(note) : c%=cps%(note)/10 * duration
370 CALL psound(t%,c%)
380 p=p+1
390 WEND
400 RETURN
410 RESTORE 540
420 address=&HCB00
430 FOR i=1 TO 12
440 sum=0: READ mcode$,check$
450 FOR j=1 TO 21 STEP 2
460 byte=VAL("&H"+MID$(mcode$,j,2))
470 POKE address,byte
480 sum=sum+byte: address=address+1
490 NEXT
500 REM IF sum<>VAL("&H"+check$) THEN PRINT "Fehler in M-Code data":STOP
510 NEXT
520 psound=&HCB00
530 RETURN
540 DATA e5d5c5dde54e2346eb5e23,664
550 DATA 566960cd1bcb3e0cd3f8dd,5c4
560 DATA e1c1d1e1c9f37dcb3dcb3d,79d
570 DATA 2fe6034f0600dd2130cbdd,443
580 DATA 093e0b000000040c0d20fd,18c
590 DATA 0e3f0520f83cfe0d20023d,310
600 DATA 3dd3f8444ffe0b20097ab3,4fa
610 DATA 2809794d1bdde94d0cdde9,4f7
620 DATA fbc90d0a43423432206d6f,3c2
630 DATA 64756c610943423533206c,326
640 DATA 7032094342353720657869,302
650 DATA 74091ac974091a00000000,1f7
Alles anzeigen
Die DATA-Zeilen werde ich vermutlich in ARRAYS übertragen müssen, oder? Wie sieht es mit Pascal-Entsprechungen für die Basic-Befehle MEMORY, CALL, PEAK und POKE aus?
Vielen Dank im voraus!