Forum

Machinecode Miniatuurtjes  

Pagina 3 / 3 Vorige
  RSS
LJ
 LJ
(@lj)
Honorable Member

"Vierkante vlakken"
Met de volgende code kunnen er vierkante vlakken op het scherm worden gezet.
De kleur van het vlak zal overeenkomen met die van de cursor (adres 646).
Een vlak moet in zijn geheel binnen het scherm passen anders zal er niet worden getekend.

Voorbeeld:

SYS8192,23,8,17 zal een vlak van 17x17 in de rechter onderhoek plaatsen.

          *= 8192

XPOS = $AA
YPOS = $AB
SIZE = $02
XMAX = $FB
YMAX = $FC
LBYTE = $FD
HBYTE = $FE

JSR ARG ; lees x coordinaat
STX XPOS ; schrijf X naar XPOS
JSR ARG ; lees y coordinaat
STX YPOS ; schrijf X naar YPOS
JSR ARG ; lees grootte
CPX #$00 ; is het 0?
BEQ END ; zo ja; stoppen
STX SIZE ; schrijf X naar SIZE

LDA XPOS ; lees XPOS
CMP #$29 ; kleiner dan 41?
BCS END ; indien groter; stoppen
CLC ; maak carry leeg
ADC SIZE ; tel SIZE bij XPOS op
CMP #$29 ; is het kleiner dan 41?
BCS END ; indien groter; thee drinken
LDA YPOS ; lees YPOS
CMP #$1A ; kleiner dan 26?
BCS END ; indien groter; ga fietsen
CLC ; maak carry leeg
ADC SIZE ; tel SIZE bij YPOS op
CMP #$1A ; is het kleiner dan 41?
BCS END ; zo ja; naar de uitgang

LDA XPOS ; lees XPOS
TAY ; Y=A
CLC ; maak carry leeg
ADC SIZE ; tel SIZE bij XPOS op
STA XMAX ; en schrijf naar XMAX
LDA YPOS ; lees YPOS
CLC ; maak carry leeg
ADC SIZE ; tel SIZE bij XPOS op
STA YMAX ; en schrijf naar YMAX
DEC YMAX ; verlaag YMAX met 1 (compensatie)

GETLIN LDA YPOS ; lees YPOS
ASL ; vermenigvuldig met 2
TAX ; X=A
LDA LINE,X ; lees lobyte voor regel
STA LBYTE ; schrijf in LBYTE
INX ; X=X+1
LDA LINE,X ; lees hibyte voor regel
STA HBYTE ; schrijf in HBYTE

LDY XPOS ; Y=XPOS
PRINT LDA #$A0 ; A=cursor blokje
STA (LBYTE),Y ; schrijf naar scherm
LDA HBYTE ; A=HBYTE
PHA ; schrijf A naar de stack
CLC ; maak carry leeg
ADC #$D4 ; tel 212 op bij A
STA HBYTE ; schrijf naar HBYTE
LDA $0286 ; A=cursor kleur
STA (LBYTE),Y ; schrijf naar kleuren ram
PLA ; lees A van de stack
STA HBYTE ; en schrijf terug in HBYTE
INY ; Y=Y+1
CPY XMAX ; vergelijk met XMAX
BNE PRINT ; indien gelijk; ga verder printen
LDA YPOS ; A=YPOS
CMP YMAX ; vergelijk met YMAX
BEQ END ; indien gelijk; stoppen
INC YPOS ; verhoog YPOS
JMP GETLIN ; spring om volgende lijn te berekenen

END RTS ; einde

ARG JSR $AEFD ; routine om argumenten te lezen
JSR $B79E ; achter de komma
RTS

LINE .WORD $0400,$0428,$0450,$0478
.WORD $04A0,$04C8,$04F0,$0518
.WORD $0540,$0568,$0590,$05B8
.WORD $05E0,$0608,$0639,$0658
.WORD $0680,$06A8,$06D0,$06F8
.WORD $0720,$0748,$0770,$0798
.WORD $07C0

Een basic programma met een demonstratie:

5 PRINTCHR$(147)
10 FORZ=0to255STEP.1
11 POKE646,Z
12 X%=RND(0)*31
13 Y%=RND(0)*16
14 Z%=RND(0)*10
15 SYS8192,X%,Y%,Z%
16 NEXTZ
ReageerCitaat
Geplaatst : 20/01/2016 6:33 pm
LJ
 LJ
(@lj)
Honorable Member

"Druk op spatie om verder te gaan"
De volgende code zal een tekst gecentreerd op een regel zetten, laat het knipperen en wacht op de spatiebalk.

          *= 8192

PRI = $E716
CALC = $FC
TELLER = $FD
WIJZL = $FE
WIJZH = $FF

LDA #$00 ; X=0
STA $A2 ; zet JIFFY CLOCK mid byte op 0
STA TELLER ; zet teller op 0
LDA #<DATA ; lees lobyte van data adres
STA WIJZL ; schrijf naar wijzer lobyte
LDA #>DATA ; lees hibyte van data adres
STA WIJZH ; schrijf naar wijzer hibyte

JSR SCAN ; scan data voor woordlengte
LOOP JSR TAB ; positioneer de cursor
JSR KNIPPER ; schakel tussen RVS aan/uit
JSR PRINT ; print text naar scherm
LDA $C5 ; scan toetsenbord
CMP #$3D ; is de spatiebalk ingedrukt?
BNE ; indien niet; naar LOOP
LDA #$00
STA $C6 ; maak keyboard buffer leeg
RTS

SCAN LDY #$00 ; Y=0
L1 LDA (WIJZL),Y ; lees teken uit DATA+Y
CMP #$5F ; is char een pijltje naar links?
BEQ ENDSCAN ; indien ja; naar ENDSCAN
INC TELLER ; verhoog de teller met 1
INY ; Y=Y+1
JMP L1 ; spring naar L1
ENDSCAN RTS

TAB LDA TELLER ; zinslengte
LSR ; delen door 2
STA CALC ; schrijf naar CALC
LDA #$15 ; halve schermbreedte+1
CLC ; maak carry leeg
SBC CALC ; A=halveschermbreedte-halvezinslengte
TAX ; X=A
LDA #$1D ; cursor naar rechts
L2 JSR PRI ; print naar scherm
DEX ; X=X-1
BNE L2 ; indien X groter dan 0; naar L2
RTS

PRINT LDY #$00 ; Y=0
L3 LDA (WIJZL),Y ; lees teken uit DATA+Y
JSR PRI ; printen naar scherm
INY ; Y=Y+1
CPY TELLER ; is Y gelijk aan TELLER?
BNE L3 ; indien nee; naar L3
JSR $AAD7 ; naar volgende regel op scherm
LDA #$91 ; cursor omhoog
JSR PRI ; print naar scherm
RTS

KNIPPER LDA $A2 ; lees JIFFY CLOCK mid byte
ASL ; vermenigvuldig met 2
ASL ; en nogmaals
BMI ON ; indien A=negatief; naar ON
BPL OFF ; indien A=positief; naar OFF
ON LDA #$12 ; RVS on
JSR PRI ; print naar scherm
RTS
OFF LDA #$92 ; RVS off
JSR PRI ; print naar scherm
RTS

DATA .TEXT "druk op spatie om"
.TEXT " verder te gaan<-"

Let op! De laatste regel toont een 'pijltje naar links' op de C64.

This post was modified 3 maanden  geleden by LJ
ReageerCitaat
Geplaatst : 21/01/2016 1:13 pm
LJ
 LJ
(@lj)
Honorable Member

"Regel teller"
De volgende code zal het aantal Basic regels weergeven. De teller gaat tot maximimaal 255.

Voorbeeld:

10 REM TEST
11 PRINT
12 PRINT

SYS828

BASIC REGELS: 3

         *= 828

TELLER = $FB
ADDRL = $fC
ADDRH = $FD
NEXTL = $FE
NEXTH = $FF

LDA #$00 ;
STA TELLER ; zet teller op 0
LDA #$01 ; A=1
STA ADDRL ; schrijf naar addr lobyte
LDA #$08 ; A=8
STA ADDRH ; schrijf in ADDR hibyte

LEES LDY #$00 ; Y=0
LDA (ADDRL),Y ; lees 'next line' lobyte
STA NEXTL ; scrhijf in NEXT lobyte
INY ; Y=Y+1
LDA (ADDRL),Y ; lees 'next line' hibyte
STA NEXTH ; schrijf in NEXT hibyte
CMP #$00 ; vergelijk met 0
BEQ END ; indien waar; spring naar END
INC TELLER ; verhoog TELLER met 1

LDA NEXTL ; A=NEXT lobyte
STA ADDRL ; schrijf naar ADDR lobyte
LDA NEXTH ; A=NEXT hibyte
STA ADDRH ; schrijf naar ADDR hibyte
JMP LEES ; spring naar LEES

END JSR $AAD7 ; regel overslaan [RETURN]
LDX #$00 ; X=0
L1 LDA DATA,X ; lees DATA+X
JSR $E716 ; en print naar scherm
INX ; X=X+1
CPX #$0E ; is X al 14?
BNE L1 ; zo niet, spring naar L1

LDX TELLER ; X=inoud TELLER
LDA #$00 ; A=0
JSR $BDCD ; print 16 bits waarde
RTS ;

DATA .TEXT "BASIC REGELS: "

De eerste Basic regel begint op geheugen locatie 2049 met een 16 bits adres waarin de locatie van de volgende regel staat. Als er geen volgende regel bestaat zal deze waarde 0 zijn. Daarna komt een 16 bits adres met het regelnummer gevolgt door de Basic instructies. Een regel eindigt met een 0.

Wat de code doet is het steeds lezen van 'het adres van de volgende regel', springt er naartoe indien geen 0 en verhoogt de teller.

ReageerCitaat
Geplaatst : 05/04/2016 5:48 am
LJ
 LJ
(@lj)
Honorable Member

"Ondergrens/Bovengrens"
De volgende code zal controleren of een waarde binnen een bepaalde marge valt (3 t/m 7).
De border zal op basis van het ingegeven getal van kleur veranderen.

Voorbeeld:

SYS828,5

[een groene border]


*= 828

JSR ARG ; lees argument achter komma en laad in X
CPX #$03 ; ondergrens 3 of groter?
BCC NEE ; indien niet waar (carry=0) vertak naar NEE
CPX #$08 ; bovengrens 8 of groter?
BCS NEE ; indien waar (carry=1) vertak naar NEE
JA LDA #$05 ;
STA DO20 ; maak border groen
RTS

NEE LDA #$03 ;
STA D020 ; maak border rood
RTS

ARG JSR $AEFD ; subroutine om waarden achter de
JSR $B79E ; komma van het SYS adress te lezen

De waarde moet dus WEL gelijk aan of boven de ondergrens zijn maar NIET gelijk aan of boven de bovengrens.

ReageerCitaat
Geplaatst : 06/04/2016 8:09 pm
LJ
 LJ
(@lj)
Honorable Member

"Cursor positie"
Op de bovenste regel van het scherm zullen de coördinaten van de cursor en het startadres van de regel worden weergegeven in hex. Handig als je tekst wilt uitlijnen en het juiste adres daarbij zoekt etc.

Voorbeeld:

SYS828

X:1C Y:0C R:05E0

          *= 828

TAB = $FC
BYTE = $FD
LADDR = $FE
HADDR = $FF

SEI
LDA #$31
STA $01
LDA #<INSERT
STA $0314
LDA #>INSERT
STA $315
LDA #$37
STA $01
CLI
RTS

INSERT LDA #$00
CMP $D012
BNE INSERT

LDX #$00
LOOP LDA TEKST,X
STA $0400,X
INX
CPX #$0C
BNE LOOP

LDA $D3
LDX #$02
JSR DEEL
LDA $D6
LDX #$07
JSR DEEL
JSR REGEL
LDA HADDR
LDX #$0C
JSR DEEL
LDA LADDR
LDX #$0E
JSR DEEL
JMP $EA31

DEEL STX TAB
STA BYTE
LSR
LSR
LSR
LSR
TAX
LDA DATA,X
LDX TAB
STA $0400,X
LDA BYTE
AND #$0F
TAX
LDA DATA,X
LDX TAB
STA $0401,X
RTS

REGEL LDX $D6
LDA $ECF0,X
STA LADDR
LDX $D6
LDA $D9,X
CLC
SBC #$7F
STA HADDR
RTS

DATA .TEXT "0123456789ABCDEF"
TEKST .TEXT "X: Y: R:"
ReageerCitaat
Geplaatst : 09/04/2016 4:28 am
LJ
 LJ
(@lj)
Honorable Member

"Tegelzetter"
De volgende code zal op basis van 3 argumenten (tegel, x en y) 64 karakters uit het geheugen halen en op het scherm plaatsen in de vorm van een 8x8 blok.

Voorbeeld:

SYS8192,5,3,2

Leest 64 bytes vanaf $2940 en plaatst het op de coördinaten 24x16.
De tegels moeten zelf gemaakt worden, bijv. met de MC monitor door op adressen die eindigen met 00, 40, 80 of C0 te beginnen met data inkloppen. Je kan natuurlijk ook een code schrijven die de rechter bovenhoek van het scherm leest, vervolgens om een tegel-nummer vraagt en het geheel op de juiste plek in het geheugen plaatst.


*= 8192

basis = $2800
;
teller = $02
addrl = $b0
addrh = $b1
sp = $b4
pp = $b5
endx = $ca
xpos = $fc
ypos = $fd
pattl = $fe
patth = $ff

2000 a9 00 lda #$00
2002 85 02 sta teller
2004 85 b5 sta pp ; pattern pointer=0
2006 85 b4 sta sp ; screen pointer=0

2008 20 80 20 getpara jsr arg ; lees tegelnummer argument
200b 8a txa ; stop in A
200c 48 pha ; zet A op de stack
200d 4a lsr a ; deel door 4
200e 4a lsr a ;
200f 18 clc ; carry=0
2010 69 28 adc #>basis ; A=A+BASIS
2012 85 ff sta patth ; schrijf in PATTH
2014 68 pla ; haal A van de stack
2015 0a asl a ; vermenigvuldig met 64
2016 0a asl a ;
2017 0a asl a ;
2018 0a asl a ;
2019 0a asl a ;
201a 0a asl a ;
201b 85 fe sta pattl ; schrijf naar PATTL
201d 20 80 20 jsr arg ; lees X-pos argument
2020 e0 05 cpx #$05 ; controleer max waarde
2022 b0 58 bcs error ; indien meer; ga naar ERROR
2024 8a txa ; A=X
2025 0a asl a ; vermenigvuldig met 8
2026 0a asl a ;
2027 0a asl a ;
2028 85 fc sta xpos ; scrijf naar XPOS
202a 18 clc ; carry=0
202b 69 08 adc #$08 ; A=A+8
202d 85 ca sta endx ; schrijf naar ENDX
202f 20 80 20 jsr arg ; lees Y-POS
2032 e0 03 cpx #$03 ; controleer max waarde
2034 b0 46 bcs error ; indien meer; ga naar ERROR
2036 8a txa ; A=X
2037 0a asl a ; vermenigvuldig met 8
2038 0a asl a ;
2039 0a asl a ;
203a 85 fd sta ypos ; schrijf naar YPOS
;
203c a2 00 next ldx #$00
203e 20 68 20 jsr getline ; bereken regelnum adres
2041 a4 b5 write ldy pp ; Y=pattern pointer
2043 b1 fe lda (pattl),y ; lees lobyte van tegel adres
2045 48 pha ; zet A op de stack
2046 a5 b4 lda sp ; A=scherm pointer
2048 18 clc ; carry=0
2049 65 fc adc xpos ; A=A+XPOS
204b a8 tay ; Y=A
204c 68 pla ; haal A van de stack
204d 91 b0 sta (addrl),y ; schrijf naar scherm
204f e6 b5 inc pp ; verhoog pattern pointer met 1
2051 e6 b4 inc sp ; verhoog scherm pointer met 1
2053 e8 inx ; verhoog X met 1
2054 e0 08 cpx #$08 ; is X al 8?
2056 d0 e9 bne write ; zo niet; ga naar WRITE
2058 a9 00 lda #$00
205a 85 b4 sta sp ; zet scherm pointer op 0
205c e6 fd inc ypos ; verhoog YPOS met 1
205e e6 02 inc teller ; verhoog teller met 1
2060 a5 02 lda teller ; A=TELLER
2062 c9 08 cmp #$08 ; is A al 8?
2064 d0 d6 bne next ; zo niet; ga naar NEXT

2066 60 rts
;
2067 60 end rts

2068 98 getline tya ; A=Y
2069 48 pha ; zet A op de stack
206a a4 fd ldy ypos ; Y=YPOS
206c b9 d9 00 lda $d9,y ; lees scherm hibyte
206f 18 clc ; carry=0
2070 e9 7f sbc #$7f ; A=A-127
2072 85 b1 sta addrh ; schrijf naar ADDRH
2074 b9 f0 ec lda $ecf0,y ; lees scherm lobyte
2077 85 b0 sta addrl ; schrijf naar ADDRL
2079 68 pla ; haal A van de stack
207a a8 tay ; Y=A
207b 60 rts

207c 20 48 b2 error jsr $b248 ; print "illegal quantity"
207f 60 rts

2080 20 fd ae arg jsr $aefd ; routine om argumenten te lezen
2083 20 9e b7 jsr $b79e ; achter de komma
2086 60 rts
ReageerCitaat
Geplaatst : 10/04/2016 7:53 pm
LJ
 LJ
(@lj)
Honorable Member

<span style="font-size:200]foutje">[/size]

Code:

CMP #$3D ; is de spatiebalk ingedrukt?

dit moet zijn:

Code:
CMP #$3C ; is de spatiebalk ingedrukt?

ReageerCitaat
Geplaatst : 28/04/2017 9:25 am
LJ
 LJ
(@lj)
Honorable Member

"8 Bits naar 1 Byte"
De eerste 8 adressen van het scherm zullen worden gelezen, alleen het laagste bit zal van belang zijn.
Deze 8 bits worden samengevoegd tot 1 byte.

Voorbeeld:

aa aa

sys8192

27

Dit kan bijvoorbeeld worden gebruikt om op simpele wijze de sprite adressen voor Enable, MSB, Expand etc. te schrijven.
Voorbeeld: door adres 2 te peeken en te schrijven naar 54248+21 kan je individuele sprites aan of uitzetten. 

     
*=8192

LDA #0 A=0
STA 2 schrijf A naar adres 2
LDX #0 X=0
L1 LDA $03FF,X A=inhoud adres $03FF+X
AND #1 lees alleen bit 1
CLC Carry=0
ASL 2 schuif bits 1 positie naar links in adres 2
ADC 2 A=A+Carry+adress 2
STA 2 schrijf A naar adres 2
DEX X=X-1
BNE L1 indien ongelijk aan 0 spring naar L1
LDX 2 X=inhoud adres 2
LDA #0 A=0
JSR $BDCD print getal naar scherm (X is lobyte, A is hibyte)
RTS

 

This post was modified 3 maanden  geleden 5 times by LJ
This post was modified 2 maanden  geleden 2 times by LJ
ReageerCitaat
Geplaatst : 02/09/2018 5:03 pm
LJ
 LJ
(@lj)
Honorable Member

"Dynamische Jump tabel"
De volgende code laat zien hoe er naar verschillende onderdelen kan worden gesprongen doormiddel van een dynamische jump tabel. De adressen passen zich automatisch aan wanneer de code word uitgebreid. De waarde in Y is de part index.

        *=8192

LDY #1 ; Y=1 (part index)
JSR JGET ; spring naar JGET
RTS

JGET PHA ; zet A op de stack
TYA ; A=Y
ASL ; A=A*2 (schuif bits 1x links)
TAY ; Y=A (Y is nu 2)
LDA JTABLE,Y ; A is lobyte van PART2 via JTABLE
STA $FE ; schrijf A naar adres $FE
INY ; Y=Y+1
LDA JTABLE,Y ; A is hibyte van PART2 via JTABLE
STA $FF ; schrijf A naar adres $FF
PLA ; haal A van de stack
JMP ($FE) ; spring naar adres in $FE,$FF (PART2)

JTABLE .WORD PART1,PART2,PART3 ; labels

PART1 LDA #5 ; maak border groen
STA 53280 ;
RTS ;

PART2 LDA #7 ; maak border geel
STA 53280 ;
RTS ;

PART3 LDA #2 ; maak border rood
STA 53280 ;
RTS ;
This post was modified 3 maanden  geleden 3 times by LJ
ReageerCitaat
Geplaatst : 02/09/2018 9:40 pm
LJ
 LJ
(@lj)
Honorable Member

D64: MC MINIATUURTJES 2018

Hier een diskette met bijna alle stukjes code die in dit topic voorbij zijn gekomen, inclusief TASM.

Boot de diskette om TASM te laden, type dan NEW, dan 0SYS36864 en RUN.

in TASM:
[PIJLTJE LINKS] + [L] om een programma naam in te geven en het dan te laden
[PIJLTJE LINKS] + [3] om te compilen en dan te runnen
geef RUN vanuit Basic om weer terug te keren naar TASM

This post was modified 2 maanden  geleden by LJ
ReageerCitaat
Geplaatst : 02/09/2018 11:27 pm
Pagina 3 / 3 Vorige
Share:
  
Bezig

Inloggen van Registreer aub