c2t/asm/diskload2.s

546 lines
9.7 KiB
ArmAsm

;diskload2.s
; apple vectors
cout = $FDED ; character out sub
crout = $FD8E ; CR out sub
prbyte = $FDDA ; print byte in hex
tapein = $C060 ; read tape interface
warm = $FF69 ; back to monitor
clear = $FC58 ; clear screen
movecur = $FB5B ; move cursor to ch,a
dos = $9D84
asrom = $9D72
locrpl = $3E3 ; locate RWTS paramlist jsr
rwts = $3D9 ; RWTS jsr
cleos = $FC42 ; clear to end of screen
init = $A54F
motoroff= $C088 ; Turn drive motor off
motoron = $C089 ; Turn drive motor on
reboot = $FAA6 ; reboot machine
bell = $FBDD ; ding
rdkey = $FD0C ; read key
; my vectors
;print = $90CE ; from diskload.s
readtape= $9000
inflate = $9B00
; zero page parameters
begload = $00 ; begin load location LSB/MSB
endload = $02 ; end load location LSB/MSB
chksum = $04 ; checksum location
secnum = $05 ; loop var
trknum = $06 ; loop var
segcnt = $07 ; loop var
buffer = $08 ; MSB of RWTS buffer
trkcnt = $09 ; track counter (0-6)
pointer = $0A ; pointer LSB/MSB
prtptr = $0C ; pointer LSB/MSB
fmptr = $0E ; file manager pointer
inf_zp = $10 ; inflate vars (10)
temp = $1E ; temp var
ch = $24 ; cursor horizontal
preg = $48 ; mon p reg
; other vars
org = $9700 ; should be $9700
invsp = $60 ; inverse space for draw
data = $1000 ; 7 track dump from inflate
boot1o = $96D0 ; tape loaded boot 1 location
boot1 = $3D0 ; target boot 1 location
cmpbuf = $9200 ; buffer for sector check
count = $900
.org org
ldx #0 ; move 9cd0 to 3d0
move1:
lda boot1o,x
sta boot1,x
inx
cpx #$48
bne move1 ; branch on positive (0-127)
patch:
lda #$B3 ; hack since chksum could not be written to C000
sta $BFFF ; chksum was written do BFFF
start:
jsr clear ; clear screen
lda #<title ; print title
ldy #>title
jsr inv
; TRACK
lda #19 ; col 20
sta ch
lda #0 ; row 0
jsr movecur
lda #<track ; print track
ldy #>track
jsr print
lda #<header ; print header
ldy #>header
jsr print
ldx #35 ; length of line
jsr line
lda #<left ; print left side of grid
ldy #>left
jsr print
setupiob:
jsr locrpl ; locate rwts paramlist
sty pointer ; and save pointer
sta pointer+1
lda #1 ; table type
ldy #0 ; offset in RWTS
sta (pointer),y ; write it to RWTS
lda #6 * 16 ; slot 6
ldy #1 ; offset in RWTS
sta (pointer),y ; write it to RWTS
lda #1 ; drive number
ldy #2 ; offset in RWTS
sta (pointer),y ; write it to RWTS
lda #254 ; volume number
ldy #3 ; offset in RWTS
sta (pointer),y ; write it to RWTS
format: ; format the diskette
lda infdata+20 ; check noformat flag
bne endformat ; if not 0 jump to endformat
jsr status
lda #<formatm ; print formatting
ldy #>formatm
jsr print
;;; RWTS format (issues)
; lda #4 ; format(4) command
; ldy #$0C ; offset in RWTS
; sta (pointer),y ; write it to RWTS
; jsr locrpl ; locate rwts paramlist
; jsr rwts ; do it!
; bcs formaterror
; lda #0
; sta preg ; fix p reg so mon is happy
; jmp endformat
;;; file manager format (works!)
jsr $3DC ; load up Y and A
sty fmptr
sta fmptr+1
lda #$0B ; init command
ldy #0
sta (fmptr),y
lda #$9D ; DOS location
ldy #1
sta (fmptr),y
lda #254 ; volume number
ldy #4
sta (fmptr),y
lda #$01 ; drive number
ldy #5
sta (fmptr),y
lda #$06 ; slot number
ldy #6
sta (fmptr),y
lda #$00 ; scratch area LSB
ldy #$0C
sta (fmptr),y
lda #$92 ; scratch area MSB
ldy #$0D
sta (fmptr),y
jsr $3D6 ; doit!
ldy #$0A ; return code
lda (fmptr),y
beq endformat
formaterror:
jmp diskerror
endformat:
;;;begin segment loop (5)
lda #0 ; 256 bytes/sector
ldy #$0b ; offset in RWTS
sta (pointer),y ; write it to RWTS
lda #0 ; buffer LSB
ldy #8 ; offset in RWTS
sta (pointer),y ; write it to RWTS
lda #0
sta trknum ; start with track 0
lda #5
sta segcnt
segloop:
;;; fancy status here
; jsr status
; lda #<waitm ; print waiting for data
; ldy #>waitm
; jsr print
;countdown:
; lda #<count ; store begin location LSB
; sta begload
; lda #>count ; store begin location MSB
; sta begload+1
; lda #<count+4 ; store end location LSB
; sta endload
; lda #>count ; store end location MSB
; sta endload+1
;;;; hack readtape, fix later, POC for now
; lda #$60 ; return without check
; sta $9091
; jsr readtape ; get the code
; lda #$8A ; put TXA back
; sta $9091
;;;; end hack
; lda #18
; sta $24 ; horiz
; lda #22 ; vert
; jsr movecur ; move cursor to $24,a; 0 base
; jsr cleos
; lda #<count ; print count down
; ldy #>count
; jsr print
; lda count
; cmp #$B0
; bne countdown
; lda count+1
; cmp #$B0
; bne countdown
;;; end fancy stuff
;;; get 7 tracks from tape
load:
jsr status
lda #<loadm ; print loading data
ldy #>loadm
jsr flash
lda #<loadm2 ; print loading data
ldy #>loadm2
jsr print
sec
lda #5
sbc segcnt
asl
asl
tax
stx temp
lda infdata+2,x ; get sec
jsr cout
lda infdata+3,x ; get sec
beq second
jsr cout
second:
lda #<secm ; print sec
ldy #>secm
jsr print
ldx temp
lda infdata+0,x ; store begin location LSB
sta begload
lda infdata+1,x ; store begin location MSB
sta begload+1
lda #$00 ; store end location LSB
sta endload
lda #$90 ; store end location MSB
sta endload+1
jsr readtape ; get the code
inf:
; turn motor on to save 1-2 sec
ldx #$60 ; slot #6
lda motoron,x ; turn it on
jsr status
lda #<inflatem ; print inflating
ldy #>inflatem
jsr print
ldx temp
lda infdata+0,x ;src lsb
sta inf_zp+0
lda infdata+1,x ;src msb
sta inf_zp+1
lda #<data ;dst lsb
sta inf_zp+2
lda #>data ;dst msb
sta inf_zp+3
jsr inflate
lda #$00 ;dst end +1 lsb
cmp inf_zp+2
bne error
lda #$80 ;dst end +1 msb
cmp inf_zp+3
bne error
;;;begin track loop (7)
jsr status
lda #<writem ; print writing
ldy #>writem
jsr print
lda #>data
sta buffer
lda #7
sta trkcnt ; do 7 tracks/segment
trkloop:
lda trknum ; track number
ldy #4 ; offset in RWTS
sta (pointer),y ; write it to RWTS
; lda #0 ; seek(0) command
; ldy #$0C ; offset in RWTS
; sta (pointer),y ; write it to RWTS
; jsr locrpl ; locate rwts paramlist
; jsr rwts ; do it!
; bcs diskerror
;;;begin sector loop (16), backwards is faster, much faster
lda #$F
sta secnum
secloop:
;jsr draw_w ; write sector from buffer to disk
jsr draw_s ; write sector from buffer to disk
lda secnum ; sector number
ldy #5 ; offset in RWTS
sta (pointer),y ; write it to RWTS
lda buffer ; buffer MSB
clc
adc secnum
ldy #9 ; offset in RWTS
sta (pointer),y ; write it to RWTS
lda #2 ; read(1)/write(2) command
ldy #$0C ; offset in RWTS
sta (pointer),y ; write it to RWTS
jsr locrpl ; locate rwts paramlist
jsr rwts ; do it!
bcs diskerror
lda #0
sta preg ; fix p reg so mon is happy
;jsr draw_r ; read sector from disk to compare addr
;lda #>cmpbuf ; compare MSB
;ldy #9 ; offset in RWTS
;sta (pointer),y ; write it to RWTS
;lda #1 ; read(1)/write(2) command
;ldy #$0C ; offset in RWTS
;sta (pointer),y ; write it to RWTS
;jsr locrpl ; locate rwts paramlist
;jsr rwts ; do it!
;bcs diskerror
;lda #0
;sta preg ; fix p reg so mon is happy
;;; compare code
;jsr draw_s ; draw a space in the grid if OK
dec secnum
bpl secloop
;;;end sector loop
lda buffer ; buffer += $10
clc
adc #$10
sta buffer
inc trknum ; next track
dec trkcnt ;
bne trkloop ; 0, all done with 7 tracks
;;;end track loop
dec segcnt ;
beq done ; 0, all done with 5 segments
jmp segloop
;;;end segment loop
;;; prompt for data only load?
done:
jsr status
lda #<donem ; print done
ldy #>donem
jsr print
jsr bell
jsr rdkey
jmp reboot
error:
; turn motor off, just in case left on
ldx #$60 ; slot #6
lda motoroff,x ; turn it off
lda #<errorm ; print error
ldy #>errorm
jsr print
jmp warm
diskerror:
lda #0
sta preg ; fix p reg so mon is happy
jsr status
lda #<diskerrorm ; print error
ldy #>diskerrorm
jsr print
jmp warm
status:
lda #0
sta $24 ; horiz
lda #22 ; vert
jsr movecur ; move cursor to $24,a; 0 base
jmp cleos
draw_w: ; print a 'W' in the grid
clc
lda #4
adc secnum
tay
lda #4
adc trknum
ldx #'W'
jmp draw
draw_r: ; print a 'R' in the grid
clc
lda #4
adc secnum
tay
lda #4
adc trknum
ldx #'R'
jmp draw
draw_s: ; print a ' ' in the grid
clc
lda #4
adc secnum
tay
lda #4
adc trknum
ldx #invsp
draw: ; a=horiz, y=vert, x=letter
sta $24 ; horiz
tya
jsr movecur
txa
eor #$40
jsr cout
rts
line:
lda #'-'
ora #$80
loop0:
jsr cout
dex
bne loop0
jsr crout
rts
inv:
sta prtptr
sty prtptr+1
ldy #0
lda (prtptr),y ; load initial char
inv1: and #$3F
jsr cout
iny
lda (prtptr),y
bne inv1
rts
flash:
sta prtptr
sty prtptr+1
ldy #0
lda (prtptr),y ; load initial char
flash1: ora #$40
jsr cout
iny
lda (prtptr),y
bne flash1
rts
print:
sta prtptr
sty prtptr+1
ldy #0
lda (prtptr),y ; load initial char
print1: ora #$80
jsr cout
iny
lda (prtptr),y
bne print1
rts
title:
.asciiz "INSTA-DISK"
errorm:
.asciiz "ERROR"
diskerrorm:
.asciiz "DISK ERROR"
donem:
.asciiz "DONE. PRESS [RETURN] TO REBOOT."
inflatem:
.asciiz "INFLATING DATA "
loadm:
.asciiz "LOADING DATA"
loadm2:
.asciiz ", ETA "
secm:
.asciiz " SEC. "
formatm:
.asciiz "FORMATTING DISK "
waitm:
.asciiz "WAITING FOR DATA: "
writem:
.asciiz "WRITING DATA "
track:
.byte "TRACK",$0D,0
header:
.byte " 1111111111222222222233333",$0D
.byte " 01234567890123456789012345678901234",$0D
.byte " ",0
left:
.byte " 0|",$0D
.byte " 1|",$0D
.byte " 2|",$0D
.byte " 3|",$0D
.byte " 4|",$0D
.byte "S 5|",$0D
.byte "E 6|",$0D
.byte "C 7|",$0D
.byte "T 8|",$0D
.byte "O 9|",$0D
.byte "R A|",$0D
.byte " B|",$0D
.byte " C|",$0D
.byte " D|",$0D
.byte " E|",$0D
.byte " F|",$0D,0
infdata:
;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec
;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec
;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec
;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec
;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec
;.byte 0 ; format flag, 1 = no format