mirror of
https://github.com/Pecusx/jataricart.git
synced 2026-05-20 22:33:22 +02:00
README mod
This commit is contained in:
@@ -1 +1,31 @@
|
|||||||
# jataricart
|
# JatariCart
|
||||||
|
|
||||||
|
This software is for use with my super simple flash cartridge (no gals, only 3 74xx elements and some caps and resistors). Top side is that without elements.
|
||||||
|
|
||||||
|
The cartridge is driven by addresses D500-D580; write to D500 sets the first bank - this is boot bank. Write to D501 sets second bank etc. The max usable number with cart on is set by write to D51F; write to D580 switches off the cartridge.
|
||||||
|
|
||||||
|
The internal construction of JatariCart allows utilise max 256kB of flash memory (32 banks)
|
||||||
|
|
||||||
|
Remember to fool the Operating System not to hang up by cart on/off, by:
|
||||||
|
|
||||||
|
carton (x - bank to switch)
|
||||||
|
pha
|
||||||
|
sta $D580,x
|
||||||
|
sta wsync ; needed for ntsc, no big difference in speed
|
||||||
|
sta wsync ; needed for ntsc
|
||||||
|
lda trig3
|
||||||
|
sta gintlk
|
||||||
|
pla
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
flashwritelib.asx - 6502 code library for formatting flash/formatting sector and write byte.
|
||||||
|
|
||||||
|
flashsrite.asx - 6502 code for generate flasher (when compiled, it contains either flash routines and cartridge image itself)
|
||||||
|
|
||||||
|
crc16_v2.asm - crc16 library for fast checking every sector (when flash is damaged, it happens that write sector damages another)
|
||||||
|
|
||||||
|
Compile (mads needed, http://mads.atari8.info):
|
||||||
|
|
||||||
|
mads flashwrite.asx -o:flashwrite.xex
|
||||||
|
|||||||
@@ -0,0 +1,290 @@
|
|||||||
|
opt l-
|
||||||
|
|
||||||
|
.enum @dmactl
|
||||||
|
blank = %00
|
||||||
|
narrow = %01
|
||||||
|
normal = %10
|
||||||
|
wide = %11
|
||||||
|
missiles= %100
|
||||||
|
players = %1000
|
||||||
|
oneline = %10000
|
||||||
|
dma = %100000
|
||||||
|
.ende
|
||||||
|
|
||||||
|
scr48 = @dmactl(wide|dma|players|missiles|oneline) ;screen 48b
|
||||||
|
scr40 = @dmactl(normal|dma|players|missiles|oneline) ;screen 40b
|
||||||
|
scr32 = @dmactl(narrow|dma|players|missiles|oneline) ;screen 32b
|
||||||
|
|
||||||
|
.enum @pmcntl
|
||||||
|
missiles= %1
|
||||||
|
players = %10
|
||||||
|
trigs = %100
|
||||||
|
.ende
|
||||||
|
|
||||||
|
.enum @gtictl
|
||||||
|
prior0 = %0
|
||||||
|
prior1 = %1
|
||||||
|
prior2 = %10
|
||||||
|
prior4 = %100
|
||||||
|
prior8 = %1000
|
||||||
|
ply5 = %10000 ; Fifth Player Enable
|
||||||
|
mlc = %100000 ; Multiple Color Player Enable
|
||||||
|
mode9 = %01000000
|
||||||
|
mode10 = %10000000
|
||||||
|
mode11 = %11000000
|
||||||
|
.ende
|
||||||
|
|
||||||
|
|
||||||
|
.enum @antic
|
||||||
|
lms = $40
|
||||||
|
hsc = $50
|
||||||
|
vsc = $60
|
||||||
|
.ende
|
||||||
|
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
* --- OS
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ramlo = $04 ; (2) wektor RAM dla testu wielko?ci pami?ci
|
||||||
|
|
||||||
|
warmst = $08 ; znacznik gor?cego startu
|
||||||
|
boot? = $09 ; znacznik odczytu wst?pnego
|
||||||
|
dosvec = $0A ; (2) wektor startowy programu dyskowego
|
||||||
|
dosini = $0C ; (2) wektor inicjacji po odczycie z dyskietki
|
||||||
|
|
||||||
|
rtclok = $12 ; (3) zegar czasu rzeczywistego
|
||||||
|
|
||||||
|
lmargin = $52
|
||||||
|
rmargin = $53
|
||||||
|
rowcrs = $54 ; wiersz kursora
|
||||||
|
colcrs = $55 ; (2) Kolumna kursora
|
||||||
|
savmsc = $58 ; (2) Adres pamięci obrazu
|
||||||
|
|
||||||
|
keydef = $79 ; (2) tablica konwersji kod?w klawiatury na ATASCII
|
||||||
|
|
||||||
|
|
||||||
|
vdslst = $0200 ; (2) wektor przerwa? NMI listy displejowej
|
||||||
|
timcnt3 = $021C ; trzeci licznik systemu
|
||||||
|
vvblki = $0222 ; (2) wektor NMI natychmiastowego VBI
|
||||||
|
vvblkd = $0224 ; (2) wektor NMI op??nionego VBI
|
||||||
|
timflg3 = $022a ; znacznik wyzerowania licznika TIMCNT3
|
||||||
|
sdmctl = $022f ; cień DMACTL
|
||||||
|
sdlstl = $0230 ; cień DLISTL
|
||||||
|
sdlsth = $0231 ; cień DLISTH
|
||||||
|
|
||||||
|
colpf0s = $02C4 ; rejestr-cie? COLPF0
|
||||||
|
colpf1s = $02C5 ; rejestr-cie? COLPF1
|
||||||
|
colpf2s = $02C6 ; rejestr-cie? COLPF2
|
||||||
|
colpf3s = $02C7 ; rejestr-cie? COLPF3
|
||||||
|
colbaks = $02C8 ; rejestr-cie? COLBAK
|
||||||
|
|
||||||
|
dsctln = $02D5 ; (2) Disk sector size register; default of 128 ($80) bytes
|
||||||
|
dvstat = $02EA ; (4) device status
|
||||||
|
|
||||||
|
crsinh = $02F0 ; znacznik widoczno?ci kursora
|
||||||
|
chact = $02F3 ; rejestr cien CHRCTL
|
||||||
|
chbas = $02F4 ; rejestr cien CHBASE
|
||||||
|
|
||||||
|
atachr = $02Fb ; numer koloru dla PLOT, DRAW (kod ATASCII znaku)
|
||||||
|
kbcodes = $02Fc ; kod ostatnio naci?ni?tego klawisza, $ff je?li ?aden nie zosta? naci?ni?ty (KBCODE)
|
||||||
|
fildat = $02Fd ; numer koloru dla FILL
|
||||||
|
chart = $02F3 ; cie? rejestru kontroli wy?wietlania znak?w (CHRCTL)
|
||||||
|
|
||||||
|
ddevic = $0300 ; Device Control Block, identyfikator urz?dzenia
|
||||||
|
dunit = $0301 ; Numer urz?dzenia; w przypadku stacji dysk?w numer nap?du
|
||||||
|
dcmnd = $0302 ; Komenda dla urz?dzenia.
|
||||||
|
dstats = $0303 ; Przed wywo?aniem SIO nale?y ustawi? tu rodzaj operacji ($40 odczyt, $80 zapis, $C0 zapis i odczyt, $00 brak transferu danych). Po powrocie z systemu znajduje si? tu status operacji (kod b??du).
|
||||||
|
dbufa = $0304 ; (2) Adres bufora. Przy operacji zapisu i odczytu jednocze?nie (DSTATS = $C0) bufor na odczytywane dane znajduje si? w tym samym miejscu, co bufor danch przeznaczonych do zapisu.
|
||||||
|
dtimlo = $0306 ; Czas oczekiwania na pozytywn? odpowied? urz?dzenia, tzw. timeout, najczesciej = 7
|
||||||
|
dunuse = $0307 ; Bajt nieu?ywany, zarezerwowany do przysz?ych zastosowa?.
|
||||||
|
dbyt = $0308 ; (2) Wielko?? bufora; musi by? zgodna z wielko?ci? transmitowanego bloku danych. Zero oznacza 64 kilobajty.
|
||||||
|
daux1 = $030A ; Pierwszy bajt pomocniczy. W operacjach dyskowych m?odszy bajt numeru sektora.
|
||||||
|
daux2 = $030B ; Drugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora.
|
||||||
|
casflg = $030F ; When set to zero, the current operation is a standard SIO operation; when non-zero, it is a cassette operation.
|
||||||
|
|
||||||
|
hatabs = $031A ; tabela wektor?w procedur obs?ugi
|
||||||
|
|
||||||
|
iocb = $0340 ; IOCB 0..7 ($340, $350, $360 ...)
|
||||||
|
iocom = iocb+2 ; Komenda dla IOCB
|
||||||
|
ioadr = iocb+4 ; (2) Adres bufora dla IOCB
|
||||||
|
ioaux1 = iocb+10 ; Bajt pomocniczy 1 IOCB
|
||||||
|
ioaux2 = iocb+11 ; Bajt pomocniczy 2 IOCB
|
||||||
|
|
||||||
|
icchid = $0340
|
||||||
|
icdno = $0341
|
||||||
|
iccmd = $0342 ; kod rozkazu operacji I/O
|
||||||
|
icstat = $0343 ; status operacji I/O
|
||||||
|
icbufa = $0344 ; (2) adres bufora danych dla operacji I/O
|
||||||
|
icputb = $0346 ; (2) adres procedury przesy?ania danych
|
||||||
|
icbufl = $0348 ; (2) d?ugo?? bufora danych dla operacji I/O
|
||||||
|
icax1 = $034A ; rejestr pomocniczy dla operacji I/O
|
||||||
|
icax2 = $034B ; rejestr pomocniczy dla operacji I/O
|
||||||
|
icax3 = $034C ; rejestr pomocniczy dla operacji I/O
|
||||||
|
icax4 = $034D ; rejestr pomocniczy dla operacji I/O
|
||||||
|
icax5 = $034E ; rejestr pomocniczy dla operacji I/O
|
||||||
|
icax6 = $034F ; rejestr pomocniczy dla operacji I/O
|
||||||
|
|
||||||
|
casbuf = $0400 ; bufor magnetofonu
|
||||||
|
casben = $047F ; koniec bufora magnetofonu
|
||||||
|
|
||||||
|
setvbv = $E45C
|
||||||
|
xitvbv = $E462
|
||||||
|
ciov = $E456 ; Wektor do CIOMAIN
|
||||||
|
jsioint = $E459 ; Wektor do SIO
|
||||||
|
jdskint = $E453 ; Wektor do sterownika dyskowego
|
||||||
|
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
* --- KEY ($d209)
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
key_esc = 28
|
||||||
|
key_space = 33
|
||||||
|
|
||||||
|
key_a = 63
|
||||||
|
key_b = 21
|
||||||
|
key_d = 58
|
||||||
|
key_m = 37
|
||||||
|
key_n = 35
|
||||||
|
key_v = 16
|
||||||
|
key_o = 8
|
||||||
|
key_p = 10
|
||||||
|
key_s = 62
|
||||||
|
key_w = 46
|
||||||
|
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
* --- GTIA
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
hposp0 = $D000 ; pozioma pozycja gracza 0 (Z)
|
||||||
|
hposp1 = $D001 ; pozioma pozycja gracza 1 (Z)
|
||||||
|
hposp2 = $D002 ; pozioma pozycja gracza 2 (Z)
|
||||||
|
hposp3 = $D003 ; pozioma pozycja gracza 3 (Z)
|
||||||
|
hposm0 = $D004 ; pozioma pozycja pocisku 0 (Z)
|
||||||
|
hposm1 = $D005 ; pozioma pozycja pocisku 1 (Z)
|
||||||
|
hposm2 = $D006 ; pozioma pozycja pocisku 2 (Z)
|
||||||
|
hposm3 = $D007 ; pozioma pozycja pocisku 3 (Z)
|
||||||
|
sizep0 = $D008 ; poziomy rozmiar gracza 0 (Z)
|
||||||
|
sizep1 = $D009 ; poziomy rozmiar gracza 1 (Z)
|
||||||
|
sizep2 = $D00A ; poziomy rozmiar gracza 2 (Z)
|
||||||
|
sizep3 = $D00B ; poziomy rozmiar gracza 3 (Z)
|
||||||
|
sizem = $D00C ; poziomy rozmiar pocisk?w (Z)
|
||||||
|
grafp0 = $D00D ; rejestr grafiki gracza 0 (Z)
|
||||||
|
grafp1 = $D00E ; rejestr grafiki gracza 1 (Z)
|
||||||
|
grafp2 = $D00F ; rejestr grafiki gracza 2 (Z)
|
||||||
|
grafp3 = $D010 ; rejestr grafiki gracza 3 (Z)
|
||||||
|
grafm = $D011 ; rejestr grafiki pocisk?w (Z)
|
||||||
|
colpm0 = $D012 ; rejestr koloru gracza i pocisku 0 (Z)
|
||||||
|
colpm1 = $D013 ; rejestr koloru gracza i pocisku 1 (Z)
|
||||||
|
colpm2 = $D014 ; rejestr koloru gracza i pocisku 2 (Z)
|
||||||
|
colpm3 = $D015 ; rejestr koloru gracza i pocisku 3 (Z)
|
||||||
|
colpf0 = $D016 ; rejestr koloru pola gry 0 (Z)
|
||||||
|
colpf1 = $D017 ; rejestr koloru pola gry 1 (Z)
|
||||||
|
colpf2 = $D018 ; rejestr koloru pola gry 2 (Z)
|
||||||
|
colpf3 = $D019 ; rejestr koloru pola gry 3 (Z)
|
||||||
|
colpf4 = $D01A
|
||||||
|
colbak = $D01A ; rejestr koloru t?a (Z)
|
||||||
|
|
||||||
|
color0 = colpf0
|
||||||
|
color1 = colpf1
|
||||||
|
color2 = colpf2
|
||||||
|
color3 = colpf3
|
||||||
|
|
||||||
|
kolm0pf = $D000 ; kolizja pocisku 0 z polem gry (O)
|
||||||
|
kolm1pf = $D001 ; kolizja pocisku 1 z polem gry (O)
|
||||||
|
kolm2pf = $D002 ; kolizja pocisku 2 z polem gry (O)
|
||||||
|
kolm3pf = $D003 ; kolizja pocisku 3 z polem gry (O)
|
||||||
|
kolp0pf = $D004 ; kolizja gracza 0 z polem gry (O)
|
||||||
|
kolp1pf = $D005 ; kolizja gracza 1 z polem gry (O)
|
||||||
|
kolp2pf = $D006 ; kolizja gracza 2 z polem gry (O)
|
||||||
|
kolp3pf = $D007 ; kolizja gracza 3 z polem gry (O)
|
||||||
|
kolm0p = $D008 ; kolizja pocisku 0 z graczem (O)
|
||||||
|
kolm1p = $D009 ; kolizja pocisku 1 z graczem (O)
|
||||||
|
kolm2p = $D00A ; kolizja pocisku 2 z graczem (O)
|
||||||
|
kolm3p = $D00B ; kolizja pocisku 3 z graczem (O)
|
||||||
|
kolp0p = $D00C ; kolizja gracza 0 z innym graczem (O)
|
||||||
|
kolp1p = $D00D ; kolizja gracza 1 z innym graczem (O)
|
||||||
|
kolp2p = $D00E ; kolizja gracza 2 z innym graczem (O)
|
||||||
|
kolp3p = $D00F ; kolizja gracza 3 z innym graczem (O)
|
||||||
|
trig0 = $D010 ; stan przycisku joysticka 0 (O)
|
||||||
|
trig1 = $D011 ; stan przycisku joysticka 1 (O)
|
||||||
|
trig3 = $D013 ; znacznik do??czenia cartridge-a (O)
|
||||||
|
pal = $D014 ; znacznik systemu TV (O) PAL = 1, NTSC = 15
|
||||||
|
|
||||||
|
gtictl = $D01B ; rejestr kontroli uk?adu GTIA
|
||||||
|
gtiactl = gtictl
|
||||||
|
|
||||||
|
vdelay = $D01C ; licznik op??nienia pionowego P/MG
|
||||||
|
pmcntl = $D01D ; rejestr kontroli graczy i pocisk?w
|
||||||
|
hitclr = $D01E ; rejestr kasowania rejestr?w kolizji
|
||||||
|
consol = $D01F ; rejestr stanu klawiszy konsoli
|
||||||
|
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
* --- POKEY
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
irqens = $0010 ; rejestr-cie? IRQEN
|
||||||
|
irqstat = $0011 ; rejestr-cie? IRQST
|
||||||
|
|
||||||
|
audf1 = $d200 ; cz?stotliwo?? pracy generatora 1 (Z)
|
||||||
|
audc1 = $d201 ; rejestr kontroli d?wi?ku generatora 1 (Z)
|
||||||
|
audf2 = $d202 ; cz?stotliwo?? pracy generatora 2 (Z)
|
||||||
|
audc2 = $d203 ; rejestr kontroli d?wi?ku generatora 2 (Z)
|
||||||
|
audf3 = $d204 ; cz?stotliwo?? pracy generatora 3 (Z)
|
||||||
|
audc3 = $d205 ; rejestr kontroli d?wi?ku generatora 3 (Z)
|
||||||
|
audf4 = $d206 ; cz?stotliwo?? pracy generatora 4 (Z)
|
||||||
|
audc4 = $d207 ; rejestr kontroli d?wi?ku generatora 4 (Z)
|
||||||
|
|
||||||
|
audctl = $D208 ; rejestr kontroli generator?w d?wi?ku (Z)
|
||||||
|
stimer = $D209 ; rejestr zerowania licznik?w (Z)
|
||||||
|
kbcode = $D209 ; kod ostatnio naci?ni?tego klawisza (O)
|
||||||
|
skstres = $D20A ; rejestr statusu z??cza szeregowego (Z)
|
||||||
|
random = $D20A ; rejestr liczby losowej (O)
|
||||||
|
serout = $D20D ; szeregowy rejestr wyj?ciowy (Z)
|
||||||
|
serin = $D20D ; szeregowy rejestr wej?ciowy (O)
|
||||||
|
irqen = $D20E ; zezwolenie przerwa? IRQ (Z)
|
||||||
|
irqst = $D20E ; status przerwa? IRQ (O)
|
||||||
|
skctl = $D20F ; rejestr kontroli z??cza szeregowego (Z)
|
||||||
|
skstat = $D20F ; rejestr statusu z??cza szeregowego (O)
|
||||||
|
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
* --- PIA
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
porta = $D300 ; port A uk?adu PIA
|
||||||
|
portb = $D301 ; port B uk?adu PIA
|
||||||
|
pactl = $D302 ; rejestr kontroli portu A
|
||||||
|
pbctl = $D303 ; rejestr kontroli portu B
|
||||||
|
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
* --- ANTIC
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
dmactl = $D400 ; rejestr kontroli dost?pu do pami?ci
|
||||||
|
chrctl = $D401 ; rejestr kontroli wy?wietlania znak?w
|
||||||
|
dlptr = $D402 ; adres programu ANTIC-a
|
||||||
|
dlistl = $D402
|
||||||
|
dlisth = $D403
|
||||||
|
hscrol = $D404 ; znacznik poziomego przesuwu obrazu
|
||||||
|
vscrol = $D405 ; znacznik pionowego przesuwu obrazu
|
||||||
|
pmbase = $D407 ; adres pami?ci graczy i pocisk?w
|
||||||
|
chbase = $D409 ; adres zestawu znak?w
|
||||||
|
wsync = $D40A ; znacznik oczekiwania na synchronizacj? poziom?
|
||||||
|
vcount = $D40B ; licznik linii obrazu
|
||||||
|
lpenh = $D40C ; poziome po?o?enie pi?ra ?wietlengo
|
||||||
|
lpenv = $D40D ; pionowe po?o?enie pi?ra ?wietlnego
|
||||||
|
nmien = $D40E ; rejestr zezwole? na przerwania NMI
|
||||||
|
nmist = $D40F ; rejestr statusu przerwa? NMI (O)
|
||||||
|
nmires = $D40F ; (Z)
|
||||||
|
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
* --- HARDWARE
|
||||||
|
* ---------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
nmivec = $FFFA ; wektor przerwania NMI (6502)
|
||||||
|
resetvec= $FFFC ; wektor przerwania RESET
|
||||||
|
irqvec = $FFFE ; wektor przerwania IRQ
|
||||||
|
|
||||||
|
nmivec16 = $FFEA ; wektor przerwania NMI (nativ 65816)
|
||||||
|
irqvec16 = $FFEE ; wektor przerwania IRQ
|
||||||
|
|
||||||
|
opt l+
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
org $2000
|
||||||
|
|
||||||
|
mwa #$ffff crc16.crc
|
||||||
|
|
||||||
|
lda #'B'
|
||||||
|
jsr crc16.updCRC
|
||||||
|
lda #'N'
|
||||||
|
jsr crc16.updCRC
|
||||||
|
lda #'E'
|
||||||
|
jsr crc16.updCRC
|
||||||
|
|
||||||
|
jmp *
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
.proc crc16
|
||||||
|
|
||||||
|
crc equ $80
|
||||||
|
tmpx equ $82
|
||||||
|
tmpy equ $83
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
updCRC
|
||||||
|
stx tmpx
|
||||||
|
sty tmpy
|
||||||
|
EOR CRC+1 ; A contained the data
|
||||||
|
STA CRC+1 ; XOR it into high byte
|
||||||
|
LSR @ ; right shift A 4 bits
|
||||||
|
LSR @ ; to make top of x^12 term
|
||||||
|
LSR @ ; ($1...)
|
||||||
|
LSR @
|
||||||
|
TAX ; save it
|
||||||
|
ASL @ ; then make top of x^5 term
|
||||||
|
EOR CRC ; and XOR that with low byte
|
||||||
|
STA CRC ; and save
|
||||||
|
TXA ; restore partial term
|
||||||
|
EOR CRC+1 ; and update high byte
|
||||||
|
STA CRC+1 ; and save
|
||||||
|
ASL @ ; left shift three
|
||||||
|
ASL @ ; the rest of the terms
|
||||||
|
ASL @ ; have feedback from x^12
|
||||||
|
TAX ; save bottom of x^12
|
||||||
|
ASL @ ; left shift two more
|
||||||
|
ASL @ ; watch the carry flag
|
||||||
|
EOR CRC+1 ; bottom of x^5 ($..2.)
|
||||||
|
TAY ; save high byte
|
||||||
|
TXA ; fetch temp value
|
||||||
|
ROL @ ; bottom of x^12, middle of x^5!
|
||||||
|
EOR CRC ; finally update low byte
|
||||||
|
STA CRC+1 ; then swap high and low bytes
|
||||||
|
STY CRC
|
||||||
|
ldx tmpx
|
||||||
|
ldy tmpy
|
||||||
|
RTS
|
||||||
|
.endp
|
||||||
+340
@@ -0,0 +1,340 @@
|
|||||||
|
; flash eeprom library
|
||||||
|
; by JHusak , 04.01.2020
|
||||||
|
; free to use.
|
||||||
|
icl 'atari.hea'
|
||||||
|
BankNum equ $88
|
||||||
|
Counter equ $89
|
||||||
|
operation equ $8a
|
||||||
|
start equ 6 ; format chip and program
|
||||||
|
select equ 5 ; ferify and format sectors
|
||||||
|
option equ 3 ; verify
|
||||||
|
outchar equ $F2B0
|
||||||
|
memtop equ $2e5
|
||||||
|
dmactls equ $22f
|
||||||
|
|
||||||
|
_SOURCE equ $6000
|
||||||
|
_DEST equ $A000
|
||||||
|
|
||||||
|
; test code
|
||||||
|
org $2000
|
||||||
|
jsr $f420 ; clrscr
|
||||||
|
lda portb
|
||||||
|
cmp #$fd
|
||||||
|
beq @+
|
||||||
|
jsr print
|
||||||
|
dta c'Run with BASIC enabled and restart.',0
|
||||||
|
jmp *
|
||||||
|
@ lda #$1
|
||||||
|
sta 66
|
||||||
|
; waiting for cart to be inserted
|
||||||
|
jsr print
|
||||||
|
dta c'Insert cartridge...',0
|
||||||
|
@ lda $D013
|
||||||
|
lsr
|
||||||
|
bcc @-
|
||||||
|
jsr print
|
||||||
|
dta c' inserted.',$9b,0
|
||||||
|
|
||||||
|
; cart inserted, fake it was not changed
|
||||||
|
lda $d013
|
||||||
|
sta $3fa
|
||||||
|
|
||||||
|
;lda #$ff
|
||||||
|
;sta $d301
|
||||||
|
|
||||||
|
jsr print
|
||||||
|
dta c'Press:',$9b
|
||||||
|
dta c'START - format cart and programm',$9b
|
||||||
|
dta c'SELECT - verify; repair bad blocks.',$9b
|
||||||
|
dta c'OPTION - verify only',$9b,0
|
||||||
|
@ lda 53279
|
||||||
|
cmp #7
|
||||||
|
beq @-
|
||||||
|
sta operation
|
||||||
|
|
||||||
|
cmp #select
|
||||||
|
beq VERIFYREPAIR
|
||||||
|
|
||||||
|
cmp #option
|
||||||
|
beq CHECKONLY
|
||||||
|
; start
|
||||||
|
FORMAT
|
||||||
|
jsr print
|
||||||
|
dta c'Formatting cart ...',0
|
||||||
|
jsr flashformatchip
|
||||||
|
bcs formatfailed
|
||||||
|
jsr print
|
||||||
|
dta c'done:)',$9b,0
|
||||||
|
rts
|
||||||
|
formatfailed
|
||||||
|
jsr print
|
||||||
|
dta c'failed:(',$9b,'Waiting for reboot...',$9b,0
|
||||||
|
jmp *
|
||||||
|
VERIFYREPAIR
|
||||||
|
jsr print
|
||||||
|
dta c'Verify and ',0
|
||||||
|
CHECKONLY
|
||||||
|
jsr print
|
||||||
|
dta c'Compare.',$9b,0
|
||||||
|
rts
|
||||||
|
crcsums
|
||||||
|
:128 dta 0,0
|
||||||
|
|
||||||
|
CHECKINIT
|
||||||
|
mwa #_SOURCE _csrc
|
||||||
|
mwa #_DEST _cdst
|
||||||
|
sei
|
||||||
|
CHECK
|
||||||
|
|
||||||
|
mva #0 badcompare_counter
|
||||||
|
sta badcompare_counter+1
|
||||||
|
ldx BankNum
|
||||||
|
sta $d500,x
|
||||||
|
checkloop
|
||||||
|
_csrc equ * + 1
|
||||||
|
lda $6000 ; src
|
||||||
|
_cdst equ * + 1
|
||||||
|
cmp $A000 ; dst
|
||||||
|
beq @+
|
||||||
|
lda _csrc
|
||||||
|
ldx _csrc+1
|
||||||
|
jsr BADCOMPARE
|
||||||
|
@ inw _csrc
|
||||||
|
inw _cdst
|
||||||
|
lda _csrc+1
|
||||||
|
cmp #>_SOURCE+$20
|
||||||
|
bne checkloop
|
||||||
|
cpw #0 badcompare_counter
|
||||||
|
beq @+
|
||||||
|
sta $d580
|
||||||
|
lda $d013
|
||||||
|
sta $3fa
|
||||||
|
cli
|
||||||
|
jsr print
|
||||||
|
dta c'non-match byte#:',0
|
||||||
|
lda badcompare_counter+1
|
||||||
|
jsr printhex
|
||||||
|
lda badcompare_counter
|
||||||
|
jsr printhex
|
||||||
|
jsr printnl
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
@ sta $d580
|
||||||
|
lda $d013
|
||||||
|
sta $3fa
|
||||||
|
cli
|
||||||
|
lda #'o'
|
||||||
|
jsr outchar
|
||||||
|
@ clc
|
||||||
|
dmaon mva #34 dmactls
|
||||||
|
sta dmactl
|
||||||
|
rts
|
||||||
|
VERIFY
|
||||||
|
;mwa #_SOURCE _csrc
|
||||||
|
;mwa #_DEST _cdst
|
||||||
|
jsr CHECKINIT
|
||||||
|
bcc v_rts
|
||||||
|
lda #'f'
|
||||||
|
jsr outchar
|
||||||
|
ldx BankNum
|
||||||
|
lda #$a0
|
||||||
|
jsr flashformatsector
|
||||||
|
ldx BankNum
|
||||||
|
lda #$b0
|
||||||
|
jsr flashformatsector
|
||||||
|
jsr FORMATTED
|
||||||
|
dec Counter
|
||||||
|
bne VERIFY
|
||||||
|
v_rts jmp dmaon
|
||||||
|
|
||||||
|
COMPARE_CRC16_DEST_ALL
|
||||||
|
lda BankNum
|
||||||
|
sta _tbanknum
|
||||||
|
@ sei
|
||||||
|
_tbanknum equ * + 1
|
||||||
|
sta $D500
|
||||||
|
clc
|
||||||
|
mva _tbanknum calccrc_bank
|
||||||
|
jsr CALCCRC_DEST
|
||||||
|
jsr status_crc
|
||||||
|
dec _tbanknum
|
||||||
|
bpl @-
|
||||||
|
sta $D580
|
||||||
|
lda $d013
|
||||||
|
sta $3fa
|
||||||
|
cli
|
||||||
|
rts
|
||||||
|
status_crc
|
||||||
|
php
|
||||||
|
jsr printBank_t
|
||||||
|
plp
|
||||||
|
php
|
||||||
|
sne
|
||||||
|
lda #'o'
|
||||||
|
plp
|
||||||
|
seq
|
||||||
|
lda #'!'
|
||||||
|
jsr outchar
|
||||||
|
lda #','
|
||||||
|
jmp outchar
|
||||||
|
|
||||||
|
|
||||||
|
CALCCRC_DEST
|
||||||
|
php
|
||||||
|
mwa #_DEST _tsrc
|
||||||
|
bne crccont
|
||||||
|
|
||||||
|
CALCCRC ; c=1 - write; c=0 - check
|
||||||
|
php
|
||||||
|
mwa #_SOURCE _tsrc
|
||||||
|
mwa #$2000 _tcnt
|
||||||
|
crccont mwa #$ffff crc16.crc
|
||||||
|
_tsrc equ * + 1
|
||||||
|
lda $ffff
|
||||||
|
jsr crc16.updCRC
|
||||||
|
inw _tsrc
|
||||||
|
dew _tcnt
|
||||||
|
bne _tsrc -1
|
||||||
|
calccrc_bank equ * +1
|
||||||
|
lda #$ba ; nk number
|
||||||
|
asl
|
||||||
|
tax
|
||||||
|
plp
|
||||||
|
bcc crccheck
|
||||||
|
mwa crc16.crc crcsums,x
|
||||||
|
rts
|
||||||
|
_tcnt :2 dta 0
|
||||||
|
crccheck
|
||||||
|
cpw crc16.crc crcsums,x
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
printBank_t
|
||||||
|
lda _tbanknum
|
||||||
|
bpl @+
|
||||||
|
printBank
|
||||||
|
jsr printnl
|
||||||
|
lda BankNum
|
||||||
|
@ pha
|
||||||
|
lda #'B'
|
||||||
|
jsr outchar
|
||||||
|
pla
|
||||||
|
jsr printhex
|
||||||
|
lda #':'
|
||||||
|
jmp outchar
|
||||||
|
|
||||||
|
MAIN_PROCESS
|
||||||
|
;mva #0 dmactls
|
||||||
|
;sta dmactl
|
||||||
|
sec
|
||||||
|
mva BankNum calccrc_bank
|
||||||
|
jsr CALCCRC
|
||||||
|
mwa #_DEST flashaddr
|
||||||
|
jsr printBank
|
||||||
|
|
||||||
|
lda operation
|
||||||
|
cmp #select
|
||||||
|
jeq VERIFY
|
||||||
|
|
||||||
|
cmp #option
|
||||||
|
jeq CHECKINIT
|
||||||
|
|
||||||
|
FORMATTED
|
||||||
|
mwa #_SOURCE _writeaddr
|
||||||
|
lda _writeaddr+1
|
||||||
|
clc
|
||||||
|
adc #$20
|
||||||
|
sta _cmpaddr
|
||||||
|
mwa #_DEST flashaddr
|
||||||
|
sec
|
||||||
|
formatted_next
|
||||||
|
ldx BankNum
|
||||||
|
formatted_next2
|
||||||
|
_writeaddr equ *+1
|
||||||
|
lda $ffff
|
||||||
|
jsr flashwritebyte
|
||||||
|
jsr flashincaddr
|
||||||
|
inw _writeaddr
|
||||||
|
_cmpaddr equ * + 1
|
||||||
|
lda #$ff
|
||||||
|
cmp _writeaddr+1
|
||||||
|
bne formatted_next2
|
||||||
|
|
||||||
|
jmp COMPARE_CRC16_DEST_ALL
|
||||||
|
|
||||||
|
FINISH_PROCESS
|
||||||
|
jsr print
|
||||||
|
dta $9b,'Finished',0
|
||||||
|
jmp *
|
||||||
|
rts
|
||||||
|
badcompare_counter dta 0,0
|
||||||
|
BADCOMPARE
|
||||||
|
ldy 53279
|
||||||
|
cpy #7
|
||||||
|
beq @+
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
lda #'!'
|
||||||
|
jsr outchar
|
||||||
|
pla
|
||||||
|
jsr printhex
|
||||||
|
pla
|
||||||
|
jsr printhex
|
||||||
|
lda #':'
|
||||||
|
jsr outchar
|
||||||
|
mwa _csrc badcompare_tmp1
|
||||||
|
badcompare_tmp1 equ * +1
|
||||||
|
lda $ffff
|
||||||
|
jsr printhex
|
||||||
|
lda #'/'
|
||||||
|
jsr outchar
|
||||||
|
mwa _cdst badcompare_tmp2
|
||||||
|
badcompare_tmp2 equ * +1
|
||||||
|
lda $ffff
|
||||||
|
jsr printhex
|
||||||
|
jsr printnl
|
||||||
|
@ inw badcompare_counter
|
||||||
|
sec
|
||||||
|
jmp dmaon
|
||||||
|
; -------
|
||||||
|
icl 'flashwritelib.asx'
|
||||||
|
|
||||||
|
icl 'crc16_v2.asm'
|
||||||
|
|
||||||
|
;jsr print
|
||||||
|
;dta c'AlaMaKota.',$9b,0
|
||||||
|
;lda #$55
|
||||||
|
;jsr printhex
|
||||||
|
;lda #$aa
|
||||||
|
;jsr printhex
|
||||||
|
;jmp *
|
||||||
|
icl 'print2.asx'
|
||||||
|
org $2e2
|
||||||
|
dta a($2000)
|
||||||
|
; ---------------------------------------
|
||||||
|
; code generator for bank by bank programming.
|
||||||
|
; .rept number of cartridge banks of 8kb; set this for 8kb banks number:
|
||||||
|
; 256kb flash - 32
|
||||||
|
; 128 kb flash - 16
|
||||||
|
; 8 kb flash - 1
|
||||||
|
;.rept 32, #
|
||||||
|
.rept 1, #
|
||||||
|
.print "A :1"
|
||||||
|
.local block:1
|
||||||
|
;------------
|
||||||
|
org BankNum
|
||||||
|
dta b(:1)
|
||||||
|
dta b(1) ; Counter
|
||||||
|
;------------
|
||||||
|
org _SOURCE
|
||||||
|
ins "missile.bin",+:1*8192,8192
|
||||||
|
;------------
|
||||||
|
org $2e2
|
||||||
|
dta a(MAIN_PROCESS)
|
||||||
|
;------------
|
||||||
|
.endl
|
||||||
|
.endr
|
||||||
|
;------------
|
||||||
|
org $2e2
|
||||||
|
dta a(FINISH_PROCESS)
|
||||||
Binary file not shown.
@@ -0,0 +1,287 @@
|
|||||||
|
; flash eeprom library
|
||||||
|
; by JHusak , 04.01.2020
|
||||||
|
; free to use.
|
||||||
|
|
||||||
|
; x - bank to select on exit
|
||||||
|
; c - 1 - format, 0 - write
|
||||||
|
;.print flashcnt
|
||||||
|
flashoppreamble
|
||||||
|
|
||||||
|
; $5555<$aa
|
||||||
|
sty $d502
|
||||||
|
ldy #$aa
|
||||||
|
sty $b555
|
||||||
|
; $2aaa<$55
|
||||||
|
sty $d501
|
||||||
|
ldy #$55
|
||||||
|
sty $aaaa
|
||||||
|
; $5555<$80
|
||||||
|
sty $d502
|
||||||
|
; sector format: carry set
|
||||||
|
scc
|
||||||
|
ldy #$80 ; sector erase
|
||||||
|
scs
|
||||||
|
ldy #$a0 ; byte programm
|
||||||
|
sty $b555
|
||||||
|
bcc @+
|
||||||
|
; $5555<$aa
|
||||||
|
sty $d502
|
||||||
|
ldy #$aa
|
||||||
|
sty $b555
|
||||||
|
; $2aaa<$55
|
||||||
|
sty $d501
|
||||||
|
ldy #$55
|
||||||
|
sty $aaaa
|
||||||
|
|
||||||
|
; PREPARE FOR SECTOR TO ERASE
|
||||||
|
|
||||||
|
; set upper bank bits
|
||||||
|
|
||||||
|
@ rts
|
||||||
|
|
||||||
|
; --------------------------
|
||||||
|
; PROCEDURE
|
||||||
|
flashformatchip
|
||||||
|
|
||||||
|
sei
|
||||||
|
sec ; format preamble
|
||||||
|
jsr flashoppreamble ; does not touch A
|
||||||
|
sta $d502
|
||||||
|
lda #$10
|
||||||
|
sta $b555
|
||||||
|
lda #$ff
|
||||||
|
sta flashcmp
|
||||||
|
jsr flashcheckresult
|
||||||
|
beq @+
|
||||||
|
; cart is off and cli
|
||||||
|
; sec ; error
|
||||||
|
; rts
|
||||||
|
@ lda #$1f
|
||||||
|
sta flashformatcounter
|
||||||
|
@ sei
|
||||||
|
flashformatcounter equ*+1
|
||||||
|
sta $d51f
|
||||||
|
ldx #0
|
||||||
|
ldy #$20
|
||||||
|
lda #$a0
|
||||||
|
sta flashformataddrcheck + 2
|
||||||
|
lda #$ff
|
||||||
|
jsr flashformataddrcheck
|
||||||
|
bcs @+ ; format error
|
||||||
|
dec flashformatcounter
|
||||||
|
bpl @-
|
||||||
|
@ jmp flashcartoff ; preserves C
|
||||||
|
|
||||||
|
|
||||||
|
; --------------------------
|
||||||
|
; PROCEDURE
|
||||||
|
flashformatsector
|
||||||
|
; x - even sector 00 - 1f
|
||||||
|
; a - erase 4KB from $B000 if A=$B0, FROM $A000 IF A=$A0
|
||||||
|
; format 4kb evensector
|
||||||
|
; strange form - easily maps to cartridge banks
|
||||||
|
; to format bank, must format sector (x<<1) and (x<<1) +1
|
||||||
|
; first check if all ff
|
||||||
|
; this is to avoid wear
|
||||||
|
stx flashformatstorex
|
||||||
|
sta flashformatstorea
|
||||||
|
sei
|
||||||
|
sta $d500,x
|
||||||
|
sta flashformataddrcheck + 2
|
||||||
|
jsr flashchecksectorformatted
|
||||||
|
bcc flashsectorformatgood
|
||||||
|
;php
|
||||||
|
;lda #'F'
|
||||||
|
;jsr PRINTWHAT
|
||||||
|
;plp
|
||||||
|
sei
|
||||||
|
flashformatstorex equ * + 1
|
||||||
|
ldx #0 ; filled before
|
||||||
|
flashformatstorea equ * + 1
|
||||||
|
lda #0 ; filled before
|
||||||
|
; check least sector bit
|
||||||
|
|
||||||
|
sec ; format preamble
|
||||||
|
jsr flashoppreamble ; does not touch A,X
|
||||||
|
sta $D500,x
|
||||||
|
; A must be either $A0 or $B0
|
||||||
|
sta flashtmpaddr+1
|
||||||
|
sta flashformataddrcheck + 2
|
||||||
|
|
||||||
|
lda #$30
|
||||||
|
flashtmpaddr equ *+1
|
||||||
|
sta $a000 ; Format!
|
||||||
|
jsr flashcheckresult
|
||||||
|
sei
|
||||||
|
|
||||||
|
lda flashformatstorea
|
||||||
|
sta flashformataddrcheck+2
|
||||||
|
|
||||||
|
ldx flashformatstorex
|
||||||
|
sta $d500,x
|
||||||
|
|
||||||
|
; check if all data in sector is $ff
|
||||||
|
flashchecksectorformatted
|
||||||
|
ldx #0
|
||||||
|
ldy #$10
|
||||||
|
lda #$ff
|
||||||
|
flashformataddrcheck
|
||||||
|
cmp $a000,x
|
||||||
|
bne flashsectorformaterror
|
||||||
|
inx
|
||||||
|
bne flashformataddrcheck
|
||||||
|
inc flashformataddrcheck + 2
|
||||||
|
dey
|
||||||
|
bne flashformataddrcheck
|
||||||
|
|
||||||
|
flashsectorformatgood
|
||||||
|
jsr flashcartoff
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
flashsectorformaterror
|
||||||
|
jsr flashcartoff
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
; ---------------------
|
||||||
|
; PROCEDURE
|
||||||
|
|
||||||
|
flashwritebyte
|
||||||
|
|
||||||
|
; a - byte to write
|
||||||
|
; x - 8kb bank to switch
|
||||||
|
; flashaddr - addres in flash - must be a000-offset
|
||||||
|
; do not programm byte if already good
|
||||||
|
sei
|
||||||
|
sta $D500,x
|
||||||
|
ldy #{ cmp.w }
|
||||||
|
jsr flashprocessbyte
|
||||||
|
bne @+
|
||||||
|
sta $D580
|
||||||
|
cli
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
@ sta flashcmp
|
||||||
|
|
||||||
|
sei
|
||||||
|
clc ; write byte preamble
|
||||||
|
|
||||||
|
jsr flashoppreamble ; preserves A,X
|
||||||
|
|
||||||
|
sta $D500,x
|
||||||
|
|
||||||
|
ldy #{ sta.w }
|
||||||
|
jsr flashprocessbyte
|
||||||
|
|
||||||
|
flashcheckresult ; sei mode
|
||||||
|
mva #0 flashcnt
|
||||||
|
ldy #5 ; first time wait short first turn to speed up byte write.
|
||||||
|
bne @+
|
||||||
|
|
||||||
|
flashwaitfordone
|
||||||
|
; approx 100ms in overall for chip erase:
|
||||||
|
; as many cycles needed, as 256*cycles >100ms * (1+epsilon)
|
||||||
|
; 100 ms is 180000 cycles
|
||||||
|
; so max 256 rough loops must last longer
|
||||||
|
; 180000 / 256 = 703
|
||||||
|
; 700 cycles by 6 cycles loop lasts = 116.
|
||||||
|
; so flipipng values, and adding margin,
|
||||||
|
; we count 128*6 cycles in inner loop.
|
||||||
|
; max sector erase by datasheet: 25 ms
|
||||||
|
; max chip erase by datasheet: 100 ms
|
||||||
|
ldy#250
|
||||||
|
@ dey
|
||||||
|
nop
|
||||||
|
bne @-
|
||||||
|
|
||||||
|
@ ldy #{ lda.w }
|
||||||
|
jsr flashprocessbyte
|
||||||
|
ldy #{ eor.w }
|
||||||
|
jsr flashprocessbyte
|
||||||
|
inc flashcnt
|
||||||
|
bne @+
|
||||||
|
jsr flashcartoff
|
||||||
|
lda #$ff ; status
|
||||||
|
rts
|
||||||
|
@
|
||||||
|
and #$40
|
||||||
|
bne flashwaitfordone
|
||||||
|
; in acc will be mismatched byte
|
||||||
|
ldy #{ lda.w }
|
||||||
|
jsr flashprocessbyte
|
||||||
|
jsr flashcartoff ; preserves axy, not p
|
||||||
|
flashcmp equ *+1
|
||||||
|
cmp #0
|
||||||
|
; when non zero = error
|
||||||
|
rts
|
||||||
|
|
||||||
|
flashcnt
|
||||||
|
brk
|
||||||
|
; ----------------------
|
||||||
|
; PROCEDURE
|
||||||
|
|
||||||
|
flashprocessbyte
|
||||||
|
|
||||||
|
; y - byteop for cpu to do with byte
|
||||||
|
; flashaddr - stored address
|
||||||
|
sty flashbyteop
|
||||||
|
flashaddr equ *+1
|
||||||
|
flashbyteop
|
||||||
|
sta $aaaa
|
||||||
|
rts
|
||||||
|
|
||||||
|
flashincaddr
|
||||||
|
inw flashaddr
|
||||||
|
rts
|
||||||
|
|
||||||
|
flashsetaddr
|
||||||
|
stx flashaddr
|
||||||
|
sty flashaddr+1
|
||||||
|
rts
|
||||||
|
|
||||||
|
flashcartoff
|
||||||
|
pha
|
||||||
|
sta $d580
|
||||||
|
lda $d013
|
||||||
|
sta $3fa
|
||||||
|
cli
|
||||||
|
pla
|
||||||
|
rts
|
||||||
|
|
||||||
|
; PROCEDURE
|
||||||
|
; Y-char to write
|
||||||
|
PRINTWHAT
|
||||||
|
php
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
jsr $f2b0
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
PRINTDOT
|
||||||
|
php
|
||||||
|
pha
|
||||||
|
txa
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
lda #'.'
|
||||||
|
jsr $f2b0
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
tax
|
||||||
|
pla
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
; ----------------------- IINT
|
||||||
|
; org $2e2
|
||||||
|
; dta a($600)
|
||||||
BIN
Binary file not shown.
+66
@@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
; jsr print
|
||||||
|
; dta c'Ala ma kota',$9b,0
|
||||||
|
; next instructions
|
||||||
|
print .proc
|
||||||
|
clc
|
||||||
|
pla
|
||||||
|
adc #$01
|
||||||
|
sta ?strv
|
||||||
|
pla
|
||||||
|
adc #$00
|
||||||
|
sta ?strv+1
|
||||||
|
|
||||||
|
?strv equ *+1
|
||||||
|
lda $ffff
|
||||||
|
bne ?prt
|
||||||
|
lda ?strv+1
|
||||||
|
pha
|
||||||
|
lda ?strv
|
||||||
|
pha
|
||||||
|
rts
|
||||||
|
?prt jsr $f2b0
|
||||||
|
inw ?strv
|
||||||
|
bne ?strv-1
|
||||||
|
rts
|
||||||
|
.endp
|
||||||
|
|
||||||
|
printhex .proc
|
||||||
|
jsr lHex
|
||||||
|
sta ?printhextmp
|
||||||
|
txa
|
||||||
|
jsr $f2b0
|
||||||
|
|
||||||
|
?printhextmp equ * +1
|
||||||
|
lda #$ff
|
||||||
|
jmp $f2b0
|
||||||
|
.endp
|
||||||
|
|
||||||
|
lHex .proc
|
||||||
|
|
||||||
|
// po deklaracji procedury .PROC z parametrami, automatycznie wymuszone zostaje wykonanie
|
||||||
|
// makra @PULL, ktore zdejmie za nas parametry ze stosu programowego i umiesci je w pamieci
|
||||||
|
// od adresu @PROC_VARS_ADR, etykiecie parametru LOW zostaje przypisany adres @PROC_VARS_ADR
|
||||||
|
|
||||||
|
pha
|
||||||
|
:4 lsr @
|
||||||
|
|
||||||
|
jsr HEX2INT
|
||||||
|
|
||||||
|
tax ; wynik dzialania w regX
|
||||||
|
|
||||||
|
pla
|
||||||
|
and #$0f
|
||||||
|
|
||||||
|
HEX2INT SED
|
||||||
|
CMP #$0A
|
||||||
|
ADC #'0'
|
||||||
|
CLD
|
||||||
|
; wynik dzialania w regA
|
||||||
|
rts
|
||||||
|
.endp
|
||||||
|
|
||||||
|
printnl .proc
|
||||||
|
lda #$9b
|
||||||
|
jmp $f2b0
|
||||||
|
.endp
|
||||||
Reference in New Issue
Block a user