NSC: Tracing through self-modified code

This commit is contained in:
Joshua Bell 2017-11-25 15:41:44 -08:00
parent 99e4d15a12
commit 613c12d7f0

View File

@ -52,6 +52,9 @@ SETVID := $FE93
.endrep .endrep
.endmacro .endmacro
.define HI(c) ((c)|$80)
;;; -------------------------------------------------- ;;; --------------------------------------------------
@ -146,7 +149,7 @@ L1077: sta BITMAP,x
and #$88 and #$88
bne L1090 bne L1090
lda #$DF lda #$DF
sta cout_mask ; lower case to upper case sta lowercase_mask ; lower case to upper case
L1090: lda MACHID L1090: lda MACHID
and #$01 and #$01
beq L10BD beq L10BD
@ -168,18 +171,18 @@ L10BF: lda DATELO,y
bpl L10BF bpl L10BF
lda #$CF lda #$CF
ldy #$FF ldy #$FF
sta L1403 sta ld4+2
sty L1402 sty ld4+1
sta L1470 sta st4+2
sty L146F sty st4+1
lda #$00 lda #$00
sta L119C sta L119C
lda #$03 lda #$03
L10DF: ora #$C0 L10DF: ora #$C0
sta L1407 sta st1+2
L10E4: sta L140A L10E4: sta ld1+2
sta L1419 sta ld2+2
sta L1427 sta st2+2
lda #$03 lda #$03
sta L119B sta L119B
L10F2: jsr L13FF L10F2: jsr L13FF
@ -217,14 +220,14 @@ L1128: inc L119C
bne L1151 bne L1151
lda #$C0 lda #$C0
ldy #$15 ldy #$15
sta L1403 sta ld4+2
sty L1402 sty ld4+1
ldy #$07 ldy #$07
sta L1407 sta st1+2
sty L1406 sty st1+1
dey dey
sta L1470 sta st4+2
sty L146F sty st4+1
lda #$C8 lda #$C8
bne L10E4 bne L10E4
L1151: ldy #$03 L1151: ldy #$03
@ -251,29 +254,37 @@ L119B: .byte $03
L119C: brk L119C: brk
;;; -------------------------------------------------- ;;; --------------------------------------------------
;;; Install NSC Date Driver
L119D: lda DATETIME+1 .proc install_driver
lda DATETIME+1
sta $A5 sta $A5
clc clc
adc #$73 adc #$73
sta L140E sta ld3+1
lda DATETIME+2 lda DATETIME+2
sta $A6 sta $A6
adc #$00 adc #0
sta L140F sta ld3+2
lda RWRAM1 lda RWRAM1
lda RWRAM1 lda RWRAM1
ldy #$7C ldy #$7C
L11BA: lda L13FF,y
loop: lda L13FF,y
sta ($A5),y sta ($A5),y
dey dey
bpl L11BA bpl loop
lda MACHID lda MACHID
ora #$01 ora #$01
sta MACHID sta MACHID
lda #$4C ; JMP opcode lda #$4C ; JMP opcode
sta DATETIME sta DATETIME
;; Invoke the driver to init the time
jsr DATETIME jsr DATETIME
;; Display success message
bit ROMIN2 bit ROMIN2
jsr MON_HOME jsr MON_HOME
jsr zstrout jsr zstrout
@ -282,6 +293,7 @@ L11BA: lda L13FF,y
HIASCII "No-Slot Clock Installed " HIASCII "No-Slot Clock Installed "
.byte 0 .byte 0
;; Display the current date
lda DATELO+1 lda DATELO+1
ror a ror a
pha pha
@ -291,18 +303,19 @@ L11BA: lda L13FF,y
rol a rol a
rol a rol a
rol a rol a
and #$0F and #%00001111
jsr L1347 jsr cout_number
lda #$AF lda #(HI '/')
jsr COUT jsr COUT
pla pla
and #$1F and #%00011111
jsr L1347 jsr cout_number
lda #$AF lda #(HI '/')
jsr COUT jsr COUT
pla pla
jsr L1347 jsr cout_number
jsr CROUT jsr CROUT
.endproc
;;; -------------------------------------------------- ;;; --------------------------------------------------
@ -439,9 +452,9 @@ L12E6: jsr zstrout
pla pla
sta $A6 sta $A6
bne L1334 bne L1334
L132A: cmp #('a'|$80) ; lower-case? L132A: cmp #(HI 'a') ; lower-case?
bcc :+ bcc :+
and cout_mask ; make upper-case if needed and lowercase_mask ; make upper-case if needed
: jsr COUT : jsr COUT
L1334: inc $A5 L1334: inc $A5
bne L133A bne L133A
@ -457,26 +470,35 @@ L133A: ldy #$00
.endproc .endproc
;;; -------------------------------------------------- ;;; --------------------------------------------------
;;; COUT a 2-digit number in A
L1347: ldx #$B0 .proc cout_number
cmp #$0A ldx #(HI '0')
bcc L1354 cmp #10 ; >= 10?
L134D: sbc #$0A bcc tens
;; divide by 10, dividend(+'0') in x remainder in a
: sbc #10
inx inx
cmp #$0A cmp #10
bcs L134D bcs :-
L1354: pha
cpx #$B0 tens: pha
beq L135D cpx #(HI '0')
beq units
txa txa
L135A: jsr COUT jsr COUT
L135D: pla
ora #$B0 units: pla
ora #(HI '0')
jsr COUT jsr COUT
rts rts
.endproc
cout_mask: ;;; --------------------------------------------------
.byte $FF
lowercase_mask:
.byte $FF ; Set to $DF on systems w/o lower-case
;;; -------------------------------------------------- ;;; --------------------------------------------------
@ -596,36 +618,29 @@ self_name:
L13FF: php L13FF: php
sei sei
.byte $AD ld4: lda $CFFF
L1402: .byte $FF pha
L1403: bbs4 $48,$1393 st1: sta $C300 ; self-modified
L1406: brk ld1: lda $C304 ; self-modified
L1407: .byte $C3 ldx #8
.byte $AD L140D:
.byte $04 ld3: lda $1472,x ; self-modified
L140A: .byte $C3 sec
ldx #$08
L140D: .byte $BD
L140E: .byte $72
L140F: trb $38
ror a ror a
L1412: pha L1412: pha
lda #$00 lda #0
rol a rol a
tay tay
.byte $B9 ld2: lda $C300,y ; self-modified
brk
L1419: .byte $C3
pla pla
lsr a lsr a
bne L1412 bne L1412
dex dex
bne L140D bne L140D
ldx #$08 ldx #8
L1423: ldy #$08 L1423: ldy #8
L1425: .byte $AD st2:
.byte $04 L1425: lda $C304 ; self-modified
L1427: .byte $C3
ror a ror a
ror $01FF,x ror $01FF,x
dey dey
@ -643,9 +658,7 @@ L1427: .byte $C3
L143F: adc #$0A L143F: adc #$0A
dey dey
bne L143F bne L143F
.byte $9D sta $01FF,x
L1445: .byte $FF
.byte $01
L1447: dex L1447: dex
bne L1423 bne L1423
lda $0204 lda $0204
@ -665,9 +678,7 @@ L1447: dex
sta DATELO+1 sta DATELO+1
pla pla
bmi L1471 bmi L1471
.byte $8D st4: sta $CFFF ; self-modified
L146F: .byte $FF
L1470: .byte $CF
L1471: plp L1471: plp
rts rts