NSC: Driver details

This commit is contained in:
Joshua Bell 2017-11-25 17:35:48 -08:00
parent d7b48628f4
commit e8e6ead1c5

View File

@ -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)