mirror of
https://github.com/datajerk/c2d.git
synced 2025-02-05 10:30:01 +00:00
207 lines
3.6 KiB
ArmAsm
207 lines
3.6 KiB
ArmAsm
;bar.s
|
|
;
|
|
; moves itself to another page memory,
|
|
; then reads binary from disk using params at end,
|
|
; then jumps to binary
|
|
;
|
|
|
|
; apple params/vectors
|
|
|
|
warm = $FF69 ; back to monitor
|
|
bell = $FBDD ; ding
|
|
preg = $48 ; mon p reg
|
|
ch = $24 ; cursor horizontal
|
|
movecur = $FB5B ; move cursor to ch,a
|
|
cout = $FDED ; character out sub
|
|
|
|
; dos params/vectors
|
|
|
|
rwtsprm = $B7E8 ; looked at dos 3.3 disk, not using $3E3 to find
|
|
rwts = $B7B5 ; rwts jsr
|
|
|
|
; vars
|
|
|
|
stage1 = $C00
|
|
stage2 = $300 ; $300 looks open
|
|
invsp = $20 ; inverse space for draw
|
|
trkcnt = $00 ; track counter
|
|
segcnt = $01 ; loop var
|
|
buffer = $02 ; MSB of RWTS buffer
|
|
secnum = $03 ; loop var
|
|
trknum = $04 ; loop var
|
|
barcnt = $05 ; bar counter
|
|
barptr = $06 ; bar pointer
|
|
|
|
|
|
.org stage1
|
|
|
|
grcheck:
|
|
lda *+(gr-loader)+(moved-grcheck)
|
|
beq movetext
|
|
lda #0 ; GR mode
|
|
sta $C050
|
|
sta $C053
|
|
movetext:
|
|
ldx #0
|
|
movetx:
|
|
lda $800,x
|
|
sta $400,x
|
|
lda $880,x
|
|
sta $480,x
|
|
lda $900,x
|
|
sta $500,x
|
|
lda $980,x
|
|
sta $580,x
|
|
lda $A00,x
|
|
sta $600,x
|
|
lda $A80,x
|
|
sta $680,x
|
|
lda $B00,x
|
|
sta $700,x
|
|
lda $B80,x
|
|
sta $780,x
|
|
inx
|
|
cpx #120
|
|
bne movetx ; move 120 bytes
|
|
init:
|
|
lda #0 ; reset pointer and counter
|
|
sta barcnt
|
|
sta barptr
|
|
|
|
lda #1 ; read(1)/write(2) command
|
|
ldy #$0C ; offset in RWTS
|
|
sta rwtsprm,y ; write it to RWTS
|
|
|
|
lda #0 ; buffer LSB
|
|
ldy #8 ; offset in RWTS
|
|
sta rwtsprm,y ; write it to RWTS
|
|
|
|
lda #2
|
|
sta trknum ; start with track 2
|
|
|
|
start:
|
|
ldx #0 ; move code to stage2
|
|
move:
|
|
lda moved,x
|
|
sta loader,x
|
|
inx
|
|
cpx #$D0
|
|
bne move ; move 208 bytes
|
|
jmp loader
|
|
|
|
moved:
|
|
.org stage2
|
|
|
|
loader:
|
|
lda loadpage ; where to dump the tracks
|
|
sta buffer
|
|
|
|
ldx lasttrack
|
|
dex ; because data starts at track 2
|
|
dex
|
|
stx trkcnt ; number of complete and partial tracks
|
|
|
|
;;;begin track loop
|
|
trkloop:
|
|
lda trknum ; track number
|
|
ldy #4 ; offset in RWTS
|
|
sta rwtsprm,y ; write it to RWTS
|
|
|
|
;;;begin sector loop (16), backwards is faster, much faster
|
|
lda trkcnt ; check if last track
|
|
bne fulltrack ; if not then full track
|
|
lda lastsector ; if so, get last sector number
|
|
bpl subtrack
|
|
fulltrack:
|
|
lda #$F
|
|
subtrack:
|
|
sta secnum
|
|
secloop:
|
|
lda secnum ; sector number
|
|
ldy #5 ; offset in RWTS
|
|
sta rwtsprm,y ; write it to RWTS
|
|
|
|
lda buffer ; buffer MSB
|
|
clc
|
|
adc secnum ; compute page load address
|
|
ldy #9 ; offset in RWTS
|
|
sta rwtsprm,y ; write it to RWTS
|
|
|
|
ldy #<rwtsprm ; load rwts paramlist B7E8
|
|
lda #>rwtsprm
|
|
jsr rwts ; do it!
|
|
bcs diskerror
|
|
lda #0
|
|
sta preg ; fix p reg so mon is happy
|
|
|
|
;;;draw code
|
|
inc barcnt ; sectors read
|
|
ldx barptr ; get current pointer value
|
|
lda bar,x
|
|
cmp barcnt ; is bar,x = barcnt?
|
|
bne nodraw ; if bar,x = barcnt draw bar
|
|
lda barptr ; get position
|
|
;clc
|
|
;adc #5 ; indent
|
|
|
|
; new version, no rom calls, just poke to screen
|
|
clc ; clear carry
|
|
adc rowlsb ; add the text page row lsb
|
|
sta screen+1 ; store that in self mod code
|
|
lda rowmsb ; get text page row msb
|
|
sta screen+2 ; store that in self mod code
|
|
lda #invsp ; load block char
|
|
screen:
|
|
sta $400 ; write out char
|
|
|
|
; old version, rom calls, cout will scroll windows on 40x24
|
|
;sta ch
|
|
;lda row ; row 19
|
|
;jsr movecur
|
|
;lda #invsp
|
|
;jsr cout
|
|
|
|
inc barptr ; move pointer to next bar position
|
|
nodraw:
|
|
;;;end draw code
|
|
|
|
dec secnum
|
|
bpl secloop
|
|
;;;end sector loop
|
|
|
|
lda buffer ; buffer += $10
|
|
clc
|
|
adc #$10
|
|
sta buffer
|
|
|
|
inc trknum ; next track
|
|
dec trkcnt ;
|
|
bpl trkloop ; 0, all done with tracks
|
|
;;;end track loop
|
|
|
|
done:
|
|
jmp (nextjump) ; down with load, run it
|
|
|
|
diskerror:
|
|
jmp warm
|
|
|
|
lasttrack:
|
|
.org *+1
|
|
lastsector:
|
|
.org *+1
|
|
loadpage:
|
|
.org *+1
|
|
nextjump:
|
|
.org *+2
|
|
gr:
|
|
.org *+1
|
|
row:
|
|
.org *+1
|
|
rowlsb:
|
|
.org *+1
|
|
rowmsb:
|
|
.org *+1
|
|
bar:
|
|
.org *+40
|
|
end:
|