home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er 1992 July
/
64er_Magazin_92-07_1992-12-02_Markt__Technik_de.d64
/
escos.src
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2022-10-26
|
8KB
|
230 lines
1000 rem open1,8,1,"o:escos.obj"
1020 sys 9*4096
1040 ;
1060 .opt p,oo
1080 ;
1100 *= $8000
1120 ;
1140 ; **********************************************************
1160 ; * expanded sprites controlled screen by m. sachs in 1992 *
1180 ; **********************************************************
1200 ;
1220 ; benutzte vektoren und adressen
1240 ;
1260 nmivek = $fffa ; nmi-vektor
1280 irqvek = $fffe ; irq-vektor
1300 icr = $dc0e ; interrupt control register der cia1
1320 cra = $dc0d ; control register a der cia1
1340 vic = $d000 ; basisadresse des vic
1360 vicpos = $dd00 ; adressbereich des vic wird hier festgelegt
1380 spoint01 = $c7f8 ; sprite-pointer fuer die ersten acht sprites
1400 spoint02 = $cbf8 ; sprite-pointer fuer die zweiten acht sprites
1420 spoint03 = $cff8 ; sprite-pointer fuer die dritten acht sprites
1440 spoint04 = $d3f8 ; sprite-pointer fuer die vierten acht sprites
1460 spoint05 = $d7f8 ; sprite-pointer fuer die fuenften acht sprites
1480 spoint06 = $dbf8 ; sprite-pointer fuer die sechsten acht sprites
1500 streg1 = $d011 ; steuerregister 1 des vic
1520 streg2 = $d016 ; steuerregister 2 des vic (scroll register)
1540 irr = $d019 ; interrupt request register
1560 exterior = $d021 ; exterior color (rahmenfarbe)
1580 basis = $d018 ; basisadresse von zeichengenerator und video ram
1600 cpuport = $01 ; hier wird festgelegt ob rom oder ram aktiv ist
1620 kotab1 = $3000 ; tabelle mit zeigern auf vic-adressen
1640 kotab2 = $3100 ; tabelle mit werten fuer vic-adressen
1660 block = $e000 ; sprite-block $80
1680 ;
1700 ; ***********************************************************************
1720 ;
1740 ; generierung der hilfstabellen kotab1 und kotab2
1760 ;
1780 : ldy #$00
1800 : tya
1820 clear sta kotab1,y
1840 : sta kotab2,y
1860 : iny
1880 : bne clear
1900 : clc
1920 : ldx #$06
1940 : ldy #$00
1960 loop2 lda #$01
1980 loop1 iny
2000 : sta kotab1,y
2020 : pha
2040 : lda #$2a
2060 : sta kotab2,y
2080 : pla
2100 : adc #$02
2120 : cmp #$11
2140 : bne loop1
2160 : tya
2180 : adc #$1f
2200 : tay
2220 : lda #$18
2240 : sta kotab1,y
2260 : lda #$10
2280 : sta kotab2,y
2300 : iny
2320 : iny
2340 : dex
2360 : bne loop2
2380 : lda #$11
2400 : sta kotab1+$1e
2420 : sta kotab1+$e4
2440 : lda #$10
2460 : sta kotab2+$1e
2480 : lda #$88
2500 : sta kotab2+$e4
2520 ;
2540 ; interruptroutine vorbereiten
2560 ;
2580 : sei ; interrupt sperren
2600 : lda #$35 ; kernal ram einblenden
2620 : sta cpuport
2640 : ldx #<newnmi ; nmi-vektor auf newnmi 'verbiegen'
2660 : ldy #>newnmi ; dient nur dazu um die restore-taste
2680 : stx nmivek ; zu neutralisieren
2700 : sty nmivek+1
2720 : ldx #<newirq ; irq-vektor auf newirq 'verbiegen'
2740 : ldy #>newirq
2760 : stx irqvek
2780 : sty irqvek+1
2800 : lda #$00
2820 : sta icr
2840 : sta cra ; interrupt durch timer verhindern
2860 : sta vicpos ; adressbereich des vic nach $c000-$ffff
2880 ;
2900 ; vic mit entsprechenden werten versorgen
2920 ;
2940 : ldx #$2e
2960 vicset lda vicvalue,x
2980 : sta vic,x
3000 : dex
3020 : bpl vicset
3040 ;
3060 ; spritepointer setzen
3080 ;
3100 : ldy #$07
3120 setpoint lda postab01,y
3140 : sta spoint01,y
3160 : lda postab02,y
3180 : sta spoint02,y
3200 : lda postab03,y
3220 : sta spoint03,y
3240 : dec cpuport ; i/o bereich ausblenden
3260 : lda postab04,y ; da die spritepointer
3280 : sta spoint04,y ; spoint04-spoint06
3300 : lda postab05,y ; in diesem bereich liegen
3320 : sta spoint05,y
3340 : lda postab06,y
3360 : sta spoint06,y
3380 : inc cpuport ; i/o bereich wieder einblenden
3400 : dey
3420 : bpl setpoint
3440 ;
3460 ; spritedaten nach $e000 kopieren (block $80)
3480 ;
3500 : ldy #$3f
3520 label5 lda sprite,y
3540 : sta block,y
3560 : dey
3580 : bpl label5
3600 ;
3620 : cli ; interrupt wieder freigeben
3640 : ldy #$00 ; und in endlosschleife springen
3660 : ldx #$00 ; um das timing des interruptprogrammes
3680 endless jmp endless ; nicht zu stoeren
3700 ;
3720 ; ***********************************************************************
3740 ; ***********************************************************************
3760 ;
3780 ; hier beginnt das eigentliche interruptprogramm
3800 ;
3820 newirq bit $00 ; timing
3840 : nop ; timing
3860 next nop ; timing
3880 : clc ; timing
3900 : bit $00 ; timing
3920 : ldx kotab1,y ; vic-adressen holen
3940 : stx execute+1 ; und abspeichern
3960 : lda vic,x ; alte vic-werte holen
3980 : adc kotab2,y ; und neue dazu addieren
4000 : dec streg2 ; scroll-register schalten
4020 execute sta vic ; neue werte abspeichern
4040 : inc streg2 ; scroll-register schalten
4060 : nop ; timing
4080 : iny ; schon alle werte durch
4100 : bne next ; nein, dann zurueck
4120 ;
4140 : ldx #$01
4160 : lda #$13 ; sprite y-koordinaten wieder
4180 oldpos sta vic,x ; auf anfangswert setzen
4200 : inx
4220 : inx
4240 : cpx #$11 ; schon alle sprites
4260 : bne oldpos ; nein, dann zurueck
4280 : lda #$01
4300 : sta irr ; interrupt loeschen
4320 : lda #$08
4340 : sta streg1 ; up-down border einschalten
4360 : lda #$10
4380 : sta basis ; basisadresse wieder auf anfangswert
4400 : sta exterior ; rahmenfarbe auf schwarz
4420 newnmi rti ; return from interrupt
4440 ;
4460 ; ***********************************************************************
4480 ; ***********************************************************************
4500 ;
4520 ; ab hier folgen die benutzten werte
4540 ;
4560 vicvalue .byte $f0,$13,$28,$13
4580 : .byte $58,$13,$88,$13 ; sprite koordinaten
4600 : .byte $b8,$13,$e8,$13
4620 : .byte $18,$13,$48,$13
4640 : .byte $c1 ; msb fuer x-koordinaten der sprites
4660 : .byte $08 ; steuerregister 1
4680 : .byte $14 ; interrupt bei rasterzeile $14
4700 : .byte $00 ; x-wert (lightpenstrobe)
4720 : .byte $00 ; dasselbe fuer y-wert (hier nicht benutzt)
4740 : .byte $ff ; alle sprites einschalten
4760 : .byte $08 ; steuerregister 2 (up-down border)
4780 : .byte $ff ; spriteexpand in x-richtung
4800 : .byte $10 ; basisadresse von zeicheng. und video ram
4820 : .byte $00 ; interrupt request register
4840 : .byte $01 ; interrupt mask register
4860 : .byte $00 ; sprite-background-prioritaet
4880 : .byte $ff ; multicolormode fuer sprites
4900 : .byte $ff ; spriteexpand in y-richtung
4920 : .byte $00 ; sprite-sprite-kollision
4940 : .byte $00 ; sprite-background-kollision
4960 : .byte $00 ; exteriorcolor (rahmenfarbe)
4980 : .byte $00 ; backgroundcolor (hintergrundfarbe)
5000 : .byte $00 ; backgroundcolor 1
5020 : .byte $00 ; backgroundcolor 2
5040 : .byte $00 ; backgroundcolor 3
5060 : .byte $0a ; spritemulticolor 0
5080 : .byte $0e ; spritemulticolor 1
5100 : .byte $07,$07,$07,$07 ; color sprite 0
5120 : .byte $07,$07,$07,$07 ; bis sprite 7
5140 ;
5160 ; werte fuer die spritepointer
5180 ;
5200 postab01 .byte $80,$80,$80,$80,$80,$80,$80,$80
5220 postab02 .byte $80,$80,$80,$80,$80,$80,$80,$80
5240 postab03 .byte $80,$80,$80,$80,$80,$80,$80,$80
5260 postab04 .byte $80,$80,$80,$80,$80,$80,$80,$80
5280 postab05 .byte $80,$80,$80,$80,$80,$80,$80,$80
5300 postab06 .byte $80,$80,$80,$80,$80,$80,$80,$80
5320 ;
5340 ; daten fuer sprite
5360 ;
5380 sprite .byte $00,$00,$00,$27,$6d,$ec,$39,$db
5400 : .byte $b8,$1e,$76,$64,$37,$99,$dc,$2e
5420 : .byte $66,$74,$19,$9d,$98,$26,$77,$6c
5440 : .byte $39,$99,$98,$27,$6e,$e4,$39,$db
5460 : .byte $9c,$1e,$66,$74,$37,$9d,$ec,$1e
5480 : .byte $e7,$b8,$39,$99,$ec,$27,$76,$74
5500 : .byte $19,$dd,$98,$2e,$76,$ec,$1b,$9b
5520 : .byte $74,$36,$6d,$dc,$00,$00,$00
5540 : .end
5560 rem close1