274
24.09.2024, 10:55 Uhr
Dresdenboy
|
Nach dem tollen Treffen mit viel positiver Stimmung und viel BIC-Interesse ist hier das BASIC-Listing des Plasma-Effekts (falls sich jemand noch nicht das 0-day release auf dem Treffen gezogen hat ):
Quellcode: | 10 SCREEN 0:CLS 20 A=55000!:DEFUSR0=A:DEFUSR1=A+16 30 READX$: IF X$<>"*" THEN POKEA,VAL("&H"+X$):A=A+1:GOTO 30 34 A=&HD800:B=0 35 READX$: IF X$<>"*" THEN POKEA,VAL("&H"+X$):A=A+1:GOTO 35 40 X=USR0(0):GOTO40 60 WAIT &H98,32:GOTO40 1000 DATA 21,00,d8: 'ld hl, sine 1003 DATA 3e,49,d3,99 :'ld a,49h:out 99h,a CURS 1007 DATA 3e,00,d3,98,d3,98:' ld a,0:out 98h,a:out 98h,a 1013 DATA 3e,20,d3,99 :'ld a,21h:out 99h,a WDAT word replace 1017 DATA 0e,18:' ld c,24 1019 DATA 06,28:' ld b,40 1021 DATA 78,c6,2c,e6,3f:' ld a,b:add a,44:and 63 1026 DATA 6f,56:' ld l,a:ld d,(hl) 1027 DATA 79,82,81,cb,3f,c6,22,e6,3f,6f,7e,82 1028 DATA 57,79,80,e6,3f,6f,7e,82 1029 DATA cb,3f,cb,3f,cb,3f:' srl a:srl a 1031 DATA e6,1e,00:' and 15:add a 1034 DATA c6,40,6f,7e:' add 64:ld l,a:ld a,(hl) 1038 DATA d3,98,23,7e:' out($98),a:dec hl:ld a,(hl) 1040 DATA d3,98:' out($98),a 1042 DATA 10,d0:' djnz charloop 1043 DATA 0d:' dec c 1045 DATA 20,cb:' jr nz, lineloop 1046 DATA 3a,ef,d6,3c,32,ef,d6:' inc d6efh 1047 DATA 3a,fa,d6,3c,32,fa,d6:' inc d6fah 1050 DATA c9,*:' ret 1200 DATA 3F,45,4B,51,57,5D,62,67,6C,70,73,77,79,7B,7D,7E,7E,7E,7D,7B 1210 DATA 79,77,73,70,6C,67,62,5D,57,51,4B,45,3F,39,33,2D,27,21,1C,17 1220 DATA 12,E,B,7,5,3,1,0,0,0,1,3,5,7,B,E,12,17,1C,21,27,2D,33,39:'64B sin table 1230 DATA B1,24,B2,81,DB,01,B0,29,DB,29,B1,23,DB,23,B1,42,B1,4A,DB 1240 DATA 4A,B1,4E,DB,4E,B1,86,DB,04,B1,04,B2,24,*:'16x2B character+color data |
Und hier ist das extra nochmal ausführlich kommentierte Assembler-Listing (muss vermutlich für den von euch genutzten Assembler angepasst werden):
Quellcode: | org 0d6d8h ld hl,sine ; address of data ld a,49h ; CURS command out ($99),a ; ld a,0 ; screen start address out ($98),a ; low byte out ($98),a ; high byte ld a,20h ; WDAT command: word write mode out ($99),a ; ld c, 24 ; number of lines lineloop ld b, 40 ; number of characters charloop ld a,b add a,44 ; some changing offset and 63 ; mask ld l,a ld d,(hl) ; get sin value based on processed b ld a,c add c ; *2 add d ; combine with former sine srl a ; (2*c+d)/2 add a,34 ; another changing offset and 63 ; mask ld l,a ld a,(hl) ; modulated sin value based on c add a,d ; + sin based on b ld d,a ; this could surely be optimized ;) ld a,c add a,b ; intermingle sines even further and 63 ld l,a ld a,(hl) ; sin value based on all that add a,d ; add intermediate value srl a ; scale down sine value srl a ; /4 and 15 ; map to 16 color words add a ; <<1 add 65 ; point into color table, 2nd byte ld l,a ; -> low byte ld a,(hl) ; get color value (could be swapped as optimization) out ($98),a ; write to text screen dec hl ; dec l should work too ld a,(hl) ; get ASCII code out ($98),a ; write to text screen djnz charloop ; next character dec c jr nz,lineloop ; next line ld a,($D6EF) inc a ; inc offset 1 via self mod code ld ($D6EF),a ld a,($D6FA) dec a ; dec offset 2 via self mod code ld ($D6FA),a ret
; sine wave with range -63..63 with offset 63 (=0) in 64 steps (2pi) org 0xd800 sine defb 3Fh,45h,4Bh,51h,57h,5Dh,62h,67h defb 6Ch,70h,73h,77h,79h,7Bh,7Dh,7Eh defb 7Eh,7Eh,7Dh,7Bh,79h,77h,73h,70h defb 6Ch,67h,62h,5Dh,57h,51h,4Bh,45h defb 3Fh,39h,33h,2Dh,27h,21h,1Ch,17h defb 12h,0Eh,0Bh,07h,05h,03h,01h,00h defb 00h,00h,01h,03h,05h,07h,0Bh,0Eh defb 12h,17h,1Ch,21h,27h,2Dh,33h,39h ; 16 x 2B character + color pairs org 0xd840 chars defb 0B1h,24h,0B2h,81h,0DBh,01h,0B0h,29h defb 0DBh,29h,0B1h,23h,0DBh,23h,0B1h,42h defb 0B1h,4Ah,0DBh,4Ah,0B1h,4Eh,0DBh,4Eh defb 0B1h,86h,0DBh,04h,0B1h,04h,0B2h,24h |
Hier kann sicher noch schönerer und schnellerer Code geschrieben werden. Ich hatte leider nur wenig Zeit und wollte natürlich noch ein paar Dinge für Garitz einpacken.
Die Zeichencodes wurden hiermit erzeugt:
Quellcode: | 1 SCREEN 1:' 80x25 Zeichen 2 CLS 3 READ N 4 DIM CC%(N):DIM CH%(N):DIM CZ%(N):N=N-1 5 FOR I=0 TO N:READ CC%(I):NEXT I:' Vordergrund-Farb-Feld 6 FOR I=0 TO N:READ CH%(I):NEXT I:' Hintergrund-Farb-Feld 7 FOR I=0 TO N:READ Z%:IF Z%=3 THEN CZ%(I)=219 ELSE CZ%(I)=Z%+176 8 NEXT I 9 I=0 10 FOR V%=0 TO N 30 COLOR CC%(V%),CH%(V%):' Farben setzen 40 PRINT CHR$(CZ%(V%));CHR$(CZ%(V%));:' Zeichen 2mal ausgeben 50 I=I+1:IF I<31 THEN GOTO70 ELSE I=0:PRINT 70 NEXT V% 75 PRINT 80 FOR V%=0 TO N 81 PRINT HEX$(CZ%(V%));","; 82 PRINT HEX$(CH%(V%)*2);HEX$(CC%(V%));","; 83 NEXT V% 84 PRINT:COLOR 15,0 85 LIST 1000- 1000 DATA 16,4,1,1,9,9,3,3,2,10,10,14,14, 6,4,4,4:' VG 1010 DATA 1,4,0,1,1,1,1,2, 2, 2, 2, 2, 4,0,0,1:' HG 1020 DATA 1,2,3,0,3,1,3,1, 1, 3, 1, 3, 1,3,1,2:' Z |
Die Sinus-Tabelle wurde einfach mit
Quellcode: | 10 FOR I=0 TO 63:PRINT HEX$(INT(SIN(I*.098175)*63+63.5));",";:NEXT I |
erzeugt und händisch angepasst.
VG und viel Spaß, Matthias -- ___________________________________ Demoscene-Produktionen: https://demozoo.org/sceners/64936/, YT-Kanal: https://www.youtube.com/@4lpha0ne/videos Programmierung seit '86 in BASIC: KC85/3, C64, A1200, PC | ASM: LC-80, C64, KC87, A1200, NeoGeo, PC, Mega 65, µC | Turbo Pascal: BIC, PC | C: RS/6000, Alpha, PC, µC | C++, Java, Javascript, Rust, Lua, Perl, PHP u.a. auf PC HW: LC-80, BIC A5105 komplett, KC87, KC85/2-4, KCC, C64s, C16, Plus/4s, A500s, A1200, Mega 65, ESP32s, RasPis, PCs, Laptops, MR 610, ... Dieser Beitrag wurde am 24.09.2024 um 12:04 Uhr von Dresdenboy editiert. |