disasm: firmware and prodos global page

This commit is contained in:
Joshua Bell 2019-04-20 17:38:31 -07:00
parent acd10c460c
commit 74ea7a4c22
2 changed files with 190 additions and 59 deletions

View File

@ -34,16 +34,16 @@ L2003 := * + 1
L2013: ldx #$FF
txs
lda #$00
sta $BFFC
sta $BFFD
sta IBAKVER
sta IVERSION
sta ROMIN2
lda $03F3
eor #$FF
sta $03F4
ldy #$00
ldx #$00
lda $BF98
and #$88
lda MACHID
and #%10001000 ; IIe or later, modifier
beq L2035
inx
L2035: cmp #$88
@ -55,8 +55,8 @@ L2035: cmp #$88
L2041: sty $07
lda L239C,x
sta $08
lda $BF98
and #$02
lda MACHID
and #%00000010 ; 80 Column card?
lsr a
sta $09
bne L206B
@ -103,8 +103,8 @@ L2099 := * + 1
sta L22C7
jsr L222B
sta $11FF
ldx $BF31
L20AF: lda $BF32,x
ldx DEVCNT
L20AF: lda DEVLST,x
and #$0F
beq L20C8
dex
@ -118,7 +118,7 @@ L20C2: asl a
asl a
asl a
bne L20CB
L20C8: lda $BF32,x
L20C8: lda DEVLST,x
L20CB: and #$70
ora #$80
sta L22E3
@ -170,24 +170,24 @@ L2111: lda $07
bne L20FE
L2135: ldy #$07
sty $0B
lda $BF98
lda MACHID
ror a
bcc L2145
jsr MON_HOME
jmp L1000
L2145: lda #$00
sta $BF90
sta $BF91
sta $BF92
sta $BF93
sta DATELO
sta DATELO+1
sta TIMELO
sta TIMELO+1
jmp L11AA
L2156: lda #OPC_JMP_abs
sta DATETIME
lda $BF98
ora #$01
sta $BF98
lda MACHID
ora #%00000001 ; has clock
sta MACHID
bit $C000
bmi L218C
lda $0A
@ -200,9 +200,9 @@ L2176: lda $1204
lsr a
cmp #$56
bcc L218C
lda $BF90
lda DATELO
cmp $1203
lda $BF91
lda DATELO+1
sbc $1204
bcs L21DF
L218C: bit $C010
@ -242,12 +242,12 @@ L21D3: lda $1204
jsr L111A
L21DF: lda $C08B
lda $C08B
lda $BF07
lda DATETIME+1
sta L2202
clc
adc #$76
sta L22B1
lda $BF08
lda DATETIME+2
sta L2203
adc #$00
sta L22B2
@ -297,9 +297,9 @@ L222D: inx
rts
L223F: jsr L238A
lda $BF91
lda DATELO+1
ror a
lda $BF90
lda DATELO
rol a
rol a
rol a
@ -310,10 +310,10 @@ L223F: jsr L238A
cmp #$0D
bcs L2264
sta $0A
lda $BF93
lda TIMELO+1
cmp #$18
bcs L2264
lda $BF92
lda TIMELO
cmp #$3C
L2264: rts
@ -371,19 +371,19 @@ L22B0:
L22B1 := * + 1
L22B2 := * + 2
ldy L22DB,x
sta $BF30,y
sta $BF30,y ; Modifying DEVLST ???
dex
dex
bne L22A3
L22BA: lda $0200
asl a
and #$E0
ora $BF90
sta $BF90
ora DATELO
sta DATELO
L22C7 := * + 1
lda #$56
rol a
sta $BF91
sta DATELO+1
ldy #$01
L22CE: lda $0208,y
ora #$B0
@ -575,9 +575,9 @@ L2415: lda ($00),y
bne L2415
jsr L114F
lda #$00
sta $22
sta WNDTOP
lda #$18
sta $23
sta WNDBTM
jsr MON_HOME
lda $09
beq L2443
@ -646,21 +646,20 @@ L24B7: rts
lda #$07
sta $11F9
ldy #$03
L24BF: lda $BF90,y
L24BF: lda DATELO,y
sta $1203,y
dey
bpl L24BF
lda #OPC_RTS
sta DATETIME
PRODOS_CALL $C3, $11F9
.byte $D0
asl $A9
jmp L068D
PRODOS_CALL MLI_SET_FILE_INFO, $11F9
bne :+
.byte $BF
lda #OPC_JMP_abs
sta DATETIME
rts
cmp #$2B
: cmp #$2B
bne L2546
ldy #$0B
jsr L10EF
@ -668,47 +667,44 @@ L24BF: lda $BF90,y
jsr RDKEY
jmp L111A
PRODOS_CALL $C8, $11E9
PRODOS_CALL MLI_OPEN, $11E9
bne L2546
lda $11EE
sta $11F0
PRODOS_CALL $CA, $11EF
.byte $D0
.byte $43
PRODOS_CALL MLI_READ, $11EF
bne L2546
PRODOS_CALL $CC, $11F7
PRODOS_CALL MLI_CLOSE, $11F7
bne L2546
rts
lda $BF30
lda DEVNUM
sta $11DD
sta $11E4
PRODOS_CALL $C5, $11DC
.byte $D0
and #$AD
.byte $0C
.byte $12
PRODOS_CALL MLI_ON_LINE, $11DC
bne L2546
lda $120C
and #$0F
tay
iny
sty $120B
lda #$2F
lda #'/'
sta $120C
PRODOS_CALL $C6, $11E0
.byte $D0
.byte $12
PRODOS_CALL MLI_SET_PREFIX, $11E0
bne L2546
PRODOS_CALL $C4, $11F9
.byte $D0
asl a
PRODOS_CALL MLI_GET_FILE_INFO, $11F9
bne L2546
rts
PRODOS_CALL MLI_READ_BLOCK, $11E3
bne L2546
rts
PRODOS_CALL $80, $11E3
.byte $D0
ora ($60,x)
L2546: ldy #$02
sty $0B
jsr L10EF

135
common.inc Normal file
View File

@ -0,0 +1,135 @@
;;; ------------------------------------------------------------
;;; ASCII
BELL := $07
BS := $08
CR := $0D
;;; ------------------------------------------------------------
;;; Constants
MAX_DW := $FFFF
;;; ------------------------------------------------------------
;;; Softswitches
CLR80VID := $C00C ; 40 Columns
ROMIN2 := $C082 ; Read ROM; no write
RWRAM1 := $C08B ; Read/write RAM bank 1
;;; ------------------------------------------------------------
;;; ProDOS
PRODOS := $BF00
DATETIME := $BF06
DEVNUM := $BF30
DEVCNT := $BF31
DEVLST := $BF32
BITMAP := $BF58
BITMAP_SIZE := 24 ; 24 bytes in system bit map
DATELO := $BF90
TIMELO := $BF92
MACHID := $BF98
IBAKVER := $BFFC
IVERSION := $BFFD
SYS_ADDR := $2000 ; Load address for SYSTEM files
PATHNAME := $0280 ; Pathname of loaded system file
;;; MLI commands
MLI_QUIT := $65
MLI_READ_BLOCK := $80
MLI_GET_TIME := $82
MLI_SET_FILE_INFO := $C3
MLI_GET_FILE_INFO := $C4
MLI_ON_LINE := $C5
MLI_SET_PREFIX := $C6
MLI_OPEN := $C8
MLI_READ := $CA
MLI_CLOSE := $CC
.macro PRODOS_CALL call, params
jsr PRODOS
.byte call
.addr params
.endmacro
;;; Volume Directory Block Header structure
.scope VolumeDirectoryBlockHeader
prev_block := $00
next_block := $02
entry_length := $23
entries_per_block := $24
header_length := $2B
.endscope
;; File Entry structure
.scope FileEntry
storage_type := $00
name_length := $00
file_name := $01
file_type := $10
.endscope
;;; ------------------------------------------------------------
;;; Monitor
INIT := $FB2F
MON_HOME := $FC58
WAIT := $FCA8
RDKEY := $FD0C
GETLN := $FD6A ; with prompt character
GETLN2 := $FD6F ; no prompt character
CROUT := $FD8E
PRBYTE := $FDDA
COUT := $FDED
SETNORM := $FE84
SETKBD := $FE89
SETVID := $FE93
INPUT_BUFFER := $200
;;; ------------------------------------------------------------
;;; I/O Registers (for Slot 2)
TDREG := $C088 + $20 ; ACIA Transmit Register (write)
RDREG := $C088 + $20 ; ACIA Receive Register (read)
STATUS := $C089 + $20 ; ACIA Status/Reset Register
COMMAND := $C08A + $20 ; ACIA Command Register (read/write)
CONTROL := $C08B + $20 ; ACIA Control Register (read/write)
;;; ------------------------------------------------------------
;;; Length-prefixed string
.macro PASCAL_STRING arg
.byte .strlen(arg)
.byte arg
.endmacro
;;; ------------------------------------------------------------
;;; Define a string with high bits set
;;; e.g. HIASCII "Ding ding", $7, $7
.macro HIASCII arg, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
.if .blank(arg)
.exitmacro
.endif
.if .match ({arg}, "") ; string?
.repeat .strlen(arg), i
.byte .strat(arg, i) | $80
.endrep
.else ; otherwise assume number/char/identifier
.byte (arg | $80)
.endif
HIASCII arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
.endmacro
;;; Like HIASCII, but null-terminated
.macro HIASCIIZ arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
HIASCII arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9
.byte 0
.endmacro
;;; Set the high bit on the passed byte
.define HI(c) ((c)|$80)