mirror of
https://github.com/a2stuff/prodos-drivers.git
synced 2024-06-07 04:29:30 +00:00
NSC: Driver details
This commit is contained in:
parent
d7b48628f4
commit
e8e6ead1c5
|
@ -46,6 +46,11 @@ SETNORM := $FE84
|
||||||
SETKBD := $FE89
|
SETKBD := $FE89
|
||||||
SETVID := $FE93
|
SETVID := $FE93
|
||||||
|
|
||||||
|
.macro PASCAL_STRING arg
|
||||||
|
.byte .strlen(arg)
|
||||||
|
.byte arg
|
||||||
|
.endmacro
|
||||||
|
|
||||||
.macro HIASCII arg
|
.macro HIASCII arg
|
||||||
.repeat .strlen(arg), i
|
.repeat .strlen(arg), i
|
||||||
.byte .strat(arg, i) | $80
|
.byte .strat(arg, i) | $80
|
||||||
|
@ -98,7 +103,7 @@ store: sta dst,y ; self-modified
|
||||||
lda #0
|
lda #0
|
||||||
sta $A8
|
sta $A8
|
||||||
ldx PATHNAME
|
ldx PATHNAME
|
||||||
beq L1046
|
beq pre_install
|
||||||
floop: inc $A8
|
floop: inc $A8
|
||||||
dex
|
dex
|
||||||
beq copy
|
beq copy
|
||||||
|
@ -117,19 +122,24 @@ cloop: iny
|
||||||
bcc cloop
|
bcc cloop
|
||||||
sty self_name
|
sty self_name
|
||||||
.endproc
|
.endproc
|
||||||
|
;; fall through...
|
||||||
|
|
||||||
;;; --------------------------------------------------
|
;;; --------------------------------------------------
|
||||||
|
|
||||||
L1046: cld
|
.proc pre_install
|
||||||
|
cld
|
||||||
bit ROMIN2
|
bit ROMIN2
|
||||||
lda #$46
|
|
||||||
|
lda #$46 ; reset vector???
|
||||||
sta $03F2
|
sta $03F2
|
||||||
lda #$10
|
lda #$10
|
||||||
sta $03F3
|
sta $03F3
|
||||||
eor #$A5
|
eor #$A5
|
||||||
sta $03F4
|
sta $03F4
|
||||||
lda #$95
|
|
||||||
|
lda #$95 ; Ctrl+U
|
||||||
jsr COUT
|
jsr COUT
|
||||||
|
|
||||||
ldx #$FF
|
ldx #$FF
|
||||||
txs
|
txs
|
||||||
sta CLR80VID
|
sta CLR80VID
|
||||||
|
@ -138,22 +148,25 @@ L1046: cld
|
||||||
jsr SETKBD
|
jsr SETKBD
|
||||||
jsr SETNORM
|
jsr SETNORM
|
||||||
jsr INIT
|
jsr INIT
|
||||||
ldx #$17
|
|
||||||
lda #$01
|
ldx #$17 ; Update system page bitmap
|
||||||
|
lda #1
|
||||||
: sta BITMAP,x
|
: sta BITMAP,x
|
||||||
lda #$00
|
lda #0
|
||||||
dex
|
dex
|
||||||
bne :-
|
bne :-
|
||||||
lda #$CF
|
lda #$CF
|
||||||
sta BITMAP
|
sta BITMAP
|
||||||
|
|
||||||
lda MACHID
|
lda MACHID
|
||||||
and #$88
|
and #$88 ; //e or //c ?
|
||||||
bne L1090
|
bne :+
|
||||||
lda #$DF
|
lda #$DF
|
||||||
sta lowercase_mask ; lower case to upper case
|
sta lowercase_mask ; lower case to upper case
|
||||||
L1090: lda MACHID
|
: lda MACHID
|
||||||
and #$01
|
and #$01 ; existing clock card?
|
||||||
beq L10BD
|
beq detect_nsc ; nope, check for NSC
|
||||||
|
|
||||||
jsr MON_HOME
|
jsr MON_HOME
|
||||||
jsr zstrout
|
jsr zstrout
|
||||||
|
|
||||||
|
@ -164,14 +177,19 @@ L1090: lda MACHID
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
jmp exit
|
jmp exit
|
||||||
|
.endproc
|
||||||
|
|
||||||
;;; --------------------------------------------------
|
;;; --------------------------------------------------
|
||||||
|
;;; Detect NSC
|
||||||
|
|
||||||
L10BD: ldy #$03
|
detect_nsc:
|
||||||
L10BF: lda DATELO,y
|
;; Preserve date/time
|
||||||
|
ldy #3 ; copy 4 bytes
|
||||||
|
: lda DATELO,y
|
||||||
sta L1197,y
|
sta L1197,y
|
||||||
dey
|
dey
|
||||||
bpl L10BF
|
bpl :-
|
||||||
|
|
||||||
lda #$CF
|
lda #$CF
|
||||||
ldy #$FF
|
ldy #$FF
|
||||||
sta ld4+2
|
sta ld4+2
|
||||||
|
@ -188,7 +206,7 @@ L10E4: sta ld1+2
|
||||||
sta st2+2
|
sta st2+2
|
||||||
lda #$03
|
lda #$03
|
||||||
sta L119B
|
sta L119B
|
||||||
L10F2: jsr L13FF
|
L10F2: jsr driver
|
||||||
lda DATELO+1
|
lda DATELO+1
|
||||||
ror a
|
ror a
|
||||||
lda DATELO
|
lda DATELO
|
||||||
|
@ -233,11 +251,15 @@ L1128: inc L119C
|
||||||
sty st4+1
|
sty st4+1
|
||||||
lda #$C8
|
lda #$C8
|
||||||
bne L10E4
|
bne L10E4
|
||||||
|
|
||||||
|
;; Restore date/time
|
||||||
L1151: ldy #$03
|
L1151: ldy #$03
|
||||||
L1153: lda L1197,y
|
: lda L1197,y
|
||||||
sta DATELO,y
|
sta DATELO,y
|
||||||
dey
|
dey
|
||||||
bpl L1153
|
bpl :-
|
||||||
|
|
||||||
|
;; Show failure message
|
||||||
jsr MON_HOME
|
jsr MON_HOME
|
||||||
jsr zstrout
|
jsr zstrout
|
||||||
|
|
||||||
|
@ -260,21 +282,23 @@ L119C: brk
|
||||||
;;; Install NSC Date Driver
|
;;; Install NSC Date Driver
|
||||||
|
|
||||||
.proc install_driver
|
.proc install_driver
|
||||||
|
ptr := $A5
|
||||||
|
|
||||||
lda DATETIME+1
|
lda DATETIME+1
|
||||||
sta $A5
|
sta ptr
|
||||||
clc
|
clc
|
||||||
adc #$73
|
adc #$73
|
||||||
sta ld3+1
|
sta ld3+1
|
||||||
lda DATETIME+2
|
lda DATETIME+2
|
||||||
sta $A6
|
sta ptr+1
|
||||||
adc #0
|
adc #0
|
||||||
sta ld3+2
|
sta ld3+2
|
||||||
lda RWRAM1
|
lda RWRAM1
|
||||||
lda RWRAM1
|
lda RWRAM1
|
||||||
ldy #$7C
|
ldy #sizeof_driver-1
|
||||||
|
|
||||||
loop: lda L13FF,y
|
loop: lda driver,y
|
||||||
sta ($A5),y
|
sta (ptr),y
|
||||||
dey
|
dey
|
||||||
bpl loop
|
bpl loop
|
||||||
|
|
||||||
|
@ -344,68 +368,88 @@ exit:
|
||||||
|
|
||||||
.proc find_next_sys_file
|
.proc find_next_sys_file
|
||||||
ptr := $A5
|
ptr := $A5
|
||||||
|
len := $A8
|
||||||
|
|
||||||
lda DEVNUM
|
;; Volume Directory Header structure
|
||||||
|
entry_length := $23
|
||||||
|
entries_per_block := $24
|
||||||
|
header_length := $2B
|
||||||
|
|
||||||
|
lda DEVNUM ; stick with most recent device
|
||||||
sta read_block_params_unit_num
|
sta read_block_params_unit_num
|
||||||
jsr read_block
|
jsr read_block
|
||||||
lda data_buffer + $23
|
|
||||||
|
lda data_buffer + entry_length
|
||||||
sta adc1+1
|
sta adc1+1
|
||||||
lda data_buffer + $24
|
lda data_buffer + entries_per_block
|
||||||
sta cmp1+1
|
sta cmp1+1
|
||||||
lda #1
|
lda #1
|
||||||
sta $A7
|
sta $A7 ; ???
|
||||||
lda #<(data_buffer + $2B)
|
|
||||||
|
lda #<(data_buffer + header_length)
|
||||||
sta ptr
|
sta ptr
|
||||||
lda #>(data_buffer + $2B)
|
lda #>(data_buffer + header_length)
|
||||||
sta ptr+1
|
sta ptr+1
|
||||||
L124F: ldy #$10
|
|
||||||
|
;; File Entry structure
|
||||||
|
storage_type := $00
|
||||||
|
name_length := $00
|
||||||
|
file_name := $01
|
||||||
|
file_type := $10
|
||||||
|
|
||||||
|
;; Process directory entry
|
||||||
|
entry: ldy #file_type ; file_type
|
||||||
lda (ptr),y
|
lda (ptr),y
|
||||||
cmp #$FF ; type=SYS ???
|
cmp #$FF ; type=SYS
|
||||||
bne L1288
|
bne next
|
||||||
ldy #$00
|
ldy #storage_type
|
||||||
lda (ptr),y
|
lda (ptr),y
|
||||||
and #$30
|
and #$30 ; regular file (not directory, pascal)
|
||||||
beq L1288
|
beq next
|
||||||
lda (ptr),y
|
lda (ptr),y
|
||||||
and #$0F
|
and #$0F ; name_length
|
||||||
sta $A8
|
sta len
|
||||||
tay
|
tay
|
||||||
|
|
||||||
;; Compare suffix - is it .SYSTEM?
|
;; Compare suffix - is it .SYSTEM?
|
||||||
ldx #.strlen(SYSTEM_SUFFIX)-1
|
ldx #.strlen(SYSTEM_SUFFIX)-1
|
||||||
L1268: lda (ptr),y
|
: lda (ptr),y
|
||||||
cmp suffix,x
|
cmp suffix,x
|
||||||
bne L1288
|
bne next
|
||||||
dey
|
dey
|
||||||
dex
|
dex
|
||||||
bpl L1268
|
bpl :-
|
||||||
|
|
||||||
|
;; Yes; is it *this* .SYSTEM file?
|
||||||
ldy self_name
|
ldy self_name
|
||||||
cpy $A8
|
cpy len
|
||||||
bne L12BE
|
bne handle_sys_file
|
||||||
: lda (ptr),y
|
: lda (ptr),y
|
||||||
cmp self_name,y
|
cmp self_name,y
|
||||||
bne L12BE
|
bne handle_sys_file
|
||||||
dey
|
dey
|
||||||
bne :-
|
bne :-
|
||||||
sec
|
sec
|
||||||
ror found_self_flag
|
ror found_self_flag
|
||||||
|
|
||||||
;; go on to next file (???)
|
;; Move to the next entry
|
||||||
L1288: lda ptr
|
next: lda ptr
|
||||||
clc
|
clc
|
||||||
adc1: adc #$27
|
adc1: adc #$27 ; self-modified: entry_length
|
||||||
sta ptr
|
sta ptr
|
||||||
bcc L1293
|
bcc L1293
|
||||||
inc ptr+1
|
inc ptr+1
|
||||||
L1293: inc $A7
|
L1293: inc $A7
|
||||||
lda $A7
|
lda $A7
|
||||||
cmp1: cmp #$0D
|
cmp1: cmp #$0D ; self-modified: entries_per_block
|
||||||
bcc $124F
|
bcc entry
|
||||||
lda $1802
|
|
||||||
|
lda data_buffer + $2
|
||||||
sta read_block_params_block_num
|
sta read_block_params_block_num
|
||||||
lda $1803
|
lda data_buffer + $3
|
||||||
sta read_block_params_block_num+1
|
sta read_block_params_block_num+1
|
||||||
ora read_block_params_block_num
|
ora read_block_params_block_num
|
||||||
beq L12E6
|
beq not_found
|
||||||
jsr read_block
|
jsr read_block
|
||||||
lda #$00
|
lda #$00
|
||||||
sta $A7
|
sta $A7
|
||||||
|
@ -413,32 +457,38 @@ cmp1: cmp #$0D
|
||||||
sta ptr
|
sta ptr
|
||||||
lda #>(data_buffer + $04)
|
lda #>(data_buffer + $04)
|
||||||
sta ptr+1
|
sta ptr+1
|
||||||
jmp L124F
|
jmp entry
|
||||||
|
|
||||||
L12BE: bit found_self_flag
|
|
||||||
bpl L1288
|
|
||||||
|
|
||||||
|
;; Found a .SYSTEM file which is not this one; invoke
|
||||||
|
;; it if follows this one.
|
||||||
|
handle_sys_file:
|
||||||
|
bit found_self_flag
|
||||||
|
bpl next
|
||||||
|
|
||||||
|
;; Compose the path to invoke. First walk self path
|
||||||
|
;; backwards to '/'.
|
||||||
ldx PATHNAME
|
ldx PATHNAME
|
||||||
beq L12D3
|
beq append
|
||||||
L12C8: dex
|
: dex
|
||||||
beq L12D3
|
beq append
|
||||||
lda PATHNAME,x
|
lda PATHNAME,x
|
||||||
eor #'/'
|
eor #'/'
|
||||||
asl a
|
asl a
|
||||||
bne L12C8
|
bne :-
|
||||||
|
|
||||||
L12D3: ldy #0
|
;; Now append name of found file.
|
||||||
L12D5: iny
|
append: ldy #0
|
||||||
|
: iny
|
||||||
inx
|
inx
|
||||||
L12D7: lda (ptr),y
|
lda (ptr),y
|
||||||
sta PATHNAME,x
|
sta PATHNAME,x
|
||||||
cpy $A8
|
cpy len
|
||||||
bcc L12D5
|
bcc :-
|
||||||
stx PATHNAME
|
stx PATHNAME
|
||||||
jmp invoke_system_file
|
jmp invoke_system_file
|
||||||
|
|
||||||
L12E6: jsr zstrout
|
not_found:
|
||||||
|
jsr zstrout
|
||||||
|
|
||||||
.byte CR
|
.byte CR
|
||||||
.byte CR
|
.byte CR
|
||||||
|
@ -626,11 +676,13 @@ suffix: .byte SYSTEM_SUFFIX
|
||||||
|
|
||||||
|
|
||||||
self_name:
|
self_name:
|
||||||
.byte $F, "NS.CLOCK.SYSTEM"
|
PASCAL_STRING "NS.CLOCK.SYSTEM"
|
||||||
|
|
||||||
;;; --------------------------------------------------
|
;;; --------------------------------------------------
|
||||||
|
;;; The driver - copied into ProDOS
|
||||||
|
|
||||||
L13FF: php
|
driver:
|
||||||
|
php
|
||||||
sei
|
sei
|
||||||
ld4: lda $CFFF
|
ld4: lda $CFFF
|
||||||
pha
|
pha
|
||||||
|
@ -696,14 +748,20 @@ st4: sta $CFFF ; self-modified
|
||||||
L1471: plp
|
L1471: plp
|
||||||
rts
|
rts
|
||||||
|
|
||||||
.byte $5C
|
unlock:
|
||||||
.byte $A3
|
;; NSC unlock sequence
|
||||||
dec a
|
.byte $5C, $A3, $3A, $C5
|
||||||
cmp $5C
|
.byte $5C, $A3, $3A, $C5
|
||||||
.byte $A3
|
.byte $00
|
||||||
dec a
|
|
||||||
cmp $00
|
sizeof_driver := * - driver
|
||||||
|
|
||||||
|
;;; --------------------------------------------------
|
||||||
|
;;; Junk from here on?
|
||||||
|
|
||||||
|
;; ??
|
||||||
.byte $B3
|
.byte $B3
|
||||||
|
|
||||||
pla
|
pla
|
||||||
adc ($F0)
|
adc ($F0)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user