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
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!