mirror of
https://github.com/mgcaret/davex-mg-utils.git
synced 2024-12-22 00:29:15 +00:00
initial
This commit is contained in:
commit
d9b665d62a
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
*.o
|
||||||
|
*.p8c
|
||||||
|
*.lst
|
||||||
|
*.map
|
||||||
|
*.po
|
||||||
|
*.SHK
|
||||||
|
*.shk
|
||||||
|
help
|
||||||
|
test
|
49
Makefile
Executable file
49
Makefile
Executable file
@ -0,0 +1,49 @@
|
|||||||
|
DAVEX=../davex-code/src
|
||||||
|
ACMD=java -jar ~/bin/AppleCommander-1.3.5-ac.jar
|
||||||
|
NULIB2=nulib2
|
||||||
|
BOOTDSK=~/vii_hd.2mg
|
||||||
|
CA65=ca65
|
||||||
|
LD65=utils/auto_origin.sh ld65
|
||||||
|
GENHELP=utils/gen_help.sh
|
||||||
|
MG_CMDS=at.info.p8c at.zones.p8c afp.userprefix.p8c afp.sessions.p8c alias.p8c at.boot.p8c deschw.p8c dmem.p8c nbp.lookup.p8c tardis.p8c nbp.parse.p8c iie.card.p8c idemu.p8c mig.insp.p8c
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: shk ;
|
||||||
|
|
||||||
|
.phony: shk
|
||||||
|
shk: DAVEX.MG.SHK ;
|
||||||
|
|
||||||
|
.phony: disk
|
||||||
|
disk: davex.mg.po ;
|
||||||
|
|
||||||
|
davex.mg.po: $(MG_CMDS)
|
||||||
|
$(ACMD) -pro140 davex.mg.po DAVEX.MG
|
||||||
|
set -x; for CMD in $(MG_CMDS); do $(ACMD) -p davex.mg.po $${CMD%.*} 'BIN' '0x8001' < $$CMD; done
|
||||||
|
#set -x; for HLP in help/*; do $(ACMD) -p davex.mg.po $$HLP 'TXT' < $$HLP; done
|
||||||
|
|
||||||
|
# Adjust for your emulation scenario
|
||||||
|
emulate: davex.mg.po
|
||||||
|
open $(BOOTDSK) davex.mg.po -a 'Virtual ]['
|
||||||
|
|
||||||
|
DAVEX.MG.SHK: $(MG_CMDS)
|
||||||
|
rm -f DAVEX.MG.SHK
|
||||||
|
set -x; for CMD in $(MG_CMDS); do cp -p $$CMD "$${CMD%.*}#2E8001"; done
|
||||||
|
$(NULIB2) -ae DAVEX.MG.SHK *2E8001
|
||||||
|
rm -f *2E8001
|
||||||
|
set -x; for HLP in help/*; do cp -p $$HLP "$$HLP#040000"; done
|
||||||
|
$(NULIB2) -ae DAVEX.MG.SHK help/*040000
|
||||||
|
rm -f help/*040000
|
||||||
|
ls -l DAVEX.MG.SHK
|
||||||
|
|
||||||
|
%.p8c: %.o
|
||||||
|
${LD65} -t none -m $@.map -o $@ $<
|
||||||
|
|
||||||
|
%.o: %.s
|
||||||
|
$(CA65) --include-dir $(DAVEX) -l $@.lst -o $@ $<
|
||||||
|
mkdir -p help; FILE="$<"; $(GENHELP) $< "help/$${FILE%.*}"
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -f *.o *.p8c *.lst *.map davex.mg.po DAVEX.MG.SHK help/*
|
||||||
|
rmdir help
|
||||||
|
|
108
README.md
Normal file
108
README.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# MG's DaveX Utilities
|
||||||
|
|
||||||
|
This is a collection utilities for [davex](https://sourceforge.net/p/davex/home/Home/), mostly centered around AppleTalk, but also a few others including fixed or enhanced versions of a few existing davex.
|
||||||
|
|
||||||
|
## Utilities
|
||||||
|
|
||||||
|
See the source or generated help files for each utility, for further information/options/etc.
|
||||||
|
|
||||||
|
### AppleTalk
|
||||||
|
|
||||||
|
#### afp.sessions
|
||||||
|
|
||||||
|
Displays AFP sessions.
|
||||||
|
|
||||||
|
#### afp.userprefix
|
||||||
|
|
||||||
|
Print or set the AFP user prefix.
|
||||||
|
|
||||||
|
#### at.boot
|
||||||
|
|
||||||
|
Boots over Appletalk.
|
||||||
|
|
||||||
|
#### at.info
|
||||||
|
|
||||||
|
Display some AppleTalk info
|
||||||
|
|
||||||
|
#### at.zones
|
||||||
|
|
||||||
|
Display AppleTalk zone information.
|
||||||
|
|
||||||
|
#### nbp.lookup
|
||||||
|
|
||||||
|
Look up NBP names registered on the network.
|
||||||
|
|
||||||
|
#### nbp.parse
|
||||||
|
|
||||||
|
Parse an NBP name and display the parts. Mainly used for testing the parsing routine.
|
||||||
|
|
||||||
|
#### tardis
|
||||||
|
|
||||||
|
Get time from TimeLord server.
|
||||||
|
|
||||||
|
|
||||||
|
### Fixed/Enhanced
|
||||||
|
|
||||||
|
#### alias
|
||||||
|
|
||||||
|
This is a fixed version of the alias command included in davex 1.30p.
|
||||||
|
|
||||||
|
#### deschw
|
||||||
|
|
||||||
|
This has been enhanced to identify the CPU and to detect emulation. If an emulator supporting EMUBYTE is found, displays its name and version if known.
|
||||||
|
|
||||||
|
See idemu for more comprehensive emulator detection.
|
||||||
|
|
||||||
|
There are also a few other enhancements around SmartPort device info.
|
||||||
|
|
||||||
|
### Misc
|
||||||
|
|
||||||
|
#### dmem
|
||||||
|
|
||||||
|
Displays info on davex "dynamic memory." Mainly for testing purposes.
|
||||||
|
|
||||||
|
#### idemu
|
||||||
|
|
||||||
|
Identifies emulators. If a positive ID on EMUBYTE can be used, uses it. Otherwise, attempts to use the various emulators' idiosynchracies regarding emulator ROM and I/O space to make the identification. It does not interact with any slot hardware.
|
||||||
|
|
||||||
|
#### iie.card
|
||||||
|
|
||||||
|
Display or change the speed of the 65C02 on the Apple //e Card for Macintosh LC.
|
||||||
|
|
||||||
|
Optionally, use undocumented features to display the user-selected startup slot.
|
||||||
|
|
||||||
|
#### mig.insp
|
||||||
|
|
||||||
|
View the contents of the Apple IIc Plus MIG RAM.
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Building the utilities requires a Unix-like environment with GNU Make and the usual set of Unix utilities such as sed, awk, egrep, etc.
|
||||||
|
|
||||||
|
A working installtion of cc65 must be present and in the PATH (for ca65, ld65, od65).
|
||||||
|
|
||||||
|
The davex source code (link at top) must be present somewhere, and the DAVEX variable in the Makefile should point to it.
|
||||||
|
|
||||||
|
In order to build the default target (a ShrinkIt file), nulib2 must be present and in the PATH.
|
||||||
|
|
||||||
|
In order to build a disk image, you must have AppleCommander CLI version set up and must modify the Makefile.
|
||||||
|
|
||||||
|
The utilities are developed on macOS X.
|
||||||
|
|
||||||
|
### Interesting make targets
|
||||||
|
|
||||||
|
* ``all``: build shrinkit file DAVEX.MG.SHK
|
||||||
|
* ``disk``: build davex.mg.po
|
||||||
|
* ``emulate``: builds disk and attempts to open with Virtual ][. Set BOOTDSK in Makefile first.
|
||||||
|
|
||||||
|
## Developing
|
||||||
|
|
||||||
|
Fork it, send pull requests, etc.
|
||||||
|
|
||||||
|
I created a custom set of macros and tools for doing davex external commands. These are in ``davex-mg.inc`` and in the ``utils`` directory.
|
||||||
|
|
||||||
|
In particular, the macros along with ``utils/auto_origin.sh`` allow automatically meeting the davex external command loading recommendations, which are "load on a page boundary so that the end of the file loads between $AF00 and $AFFF."
|
||||||
|
|
||||||
|
Additionaly, ``utils/gen_help.sh`` is used to extract the help file contents from the source code of each utility.
|
||||||
|
|
||||||
|
|
169
afp.sessions.s
Normal file
169
afp.sessions.s
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
; %help
|
||||||
|
; afp.sessions - Display AFP sessions.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
sptr = xczpage
|
||||||
|
altbuf = filebuff3 ; if no dynamic mem avail
|
||||||
|
altbufsz = $04 ; pages
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $01,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Display AFP sessions."
|
||||||
|
DX_main
|
||||||
|
cli ; appletalk requires interrupts
|
||||||
|
ATcall inforeq
|
||||||
|
bcc :+
|
||||||
|
jmp noatalk
|
||||||
|
: jsr getatbuf
|
||||||
|
sta bufp+1
|
||||||
|
sty bufp
|
||||||
|
stx buflen+1
|
||||||
|
ATcall filsess
|
||||||
|
bcs nosess1
|
||||||
|
lda nument ; number of entries returned
|
||||||
|
bne :+
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "No sessions."
|
||||||
|
.byte $8d,$00
|
||||||
|
nosess1: jmp nosess
|
||||||
|
: lda bufp+1
|
||||||
|
sta sptr+1
|
||||||
|
lda bufp
|
||||||
|
sta sptr
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " session vol id dev volume name (* = user volume)"
|
||||||
|
.byte $8d
|
||||||
|
asc_hi " ------- ------ --- --------------------------------"
|
||||||
|
.byte $8d,$00
|
||||||
|
; loop to display sessions
|
||||||
|
dispsess: ldy #$00
|
||||||
|
sty num+1
|
||||||
|
sty num+2
|
||||||
|
lda (sptr),y ; ref num
|
||||||
|
sta num
|
||||||
|
jsr xprdec_pad
|
||||||
|
lda #' '+$80
|
||||||
|
jsr cout
|
||||||
|
ldy #$1e ; offset of volume id
|
||||||
|
lda (sptr),y
|
||||||
|
sta num
|
||||||
|
iny
|
||||||
|
lda (sptr),y
|
||||||
|
sta num
|
||||||
|
jsr xprdec_pad
|
||||||
|
lda #' '+$80
|
||||||
|
jsr cout
|
||||||
|
ldy #$01 ; offset of devnum
|
||||||
|
lda (sptr),y
|
||||||
|
pha
|
||||||
|
jsr xprint_sd
|
||||||
|
lda #' '+$80
|
||||||
|
jsr cout
|
||||||
|
pla
|
||||||
|
and #$01 ; isolate user volume flag
|
||||||
|
beq notuser
|
||||||
|
lda #'*'+$80
|
||||||
|
bne :+
|
||||||
|
notuser: lda #' '+$80
|
||||||
|
: jsr cout
|
||||||
|
lda sptr+1
|
||||||
|
pha ; save sptr
|
||||||
|
lda sptr
|
||||||
|
pha
|
||||||
|
lda #$02 ; offset to volume name
|
||||||
|
jsr addsptr
|
||||||
|
jsr prpas
|
||||||
|
lda #$8d
|
||||||
|
jsr cout
|
||||||
|
pla ; restore sptr to where it was
|
||||||
|
sta sptr
|
||||||
|
pla
|
||||||
|
sta sptr+1
|
||||||
|
lda #$20 ; size of entry
|
||||||
|
jsr addsptr ; now point at next entry
|
||||||
|
jsr xcheck_wait ; see if should pause or quit
|
||||||
|
bcs nosess ; quit if esc pressed
|
||||||
|
dec nument
|
||||||
|
bne dispsess
|
||||||
|
nosess: ;ldx mli_close ; free mem
|
||||||
|
;jsr xmmgr ; do it
|
||||||
|
rts
|
||||||
|
noatalk: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "AppleTalk offline!"
|
||||||
|
.byte $00
|
||||||
|
exiterr: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
jmp xerr
|
||||||
|
;
|
||||||
|
; increment sptr by a
|
||||||
|
.proc addsptr
|
||||||
|
clc
|
||||||
|
adc sptr
|
||||||
|
sta sptr
|
||||||
|
bcc :+
|
||||||
|
inc sptr+1
|
||||||
|
: rts
|
||||||
|
.endproc
|
||||||
|
; print pascal string at sptr
|
||||||
|
; leave sptr pointed at one past end
|
||||||
|
; of string
|
||||||
|
.proc prpas
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr),y ; get length
|
||||||
|
tax
|
||||||
|
next: lda #$01
|
||||||
|
jsr addsptr
|
||||||
|
dex
|
||||||
|
bpl :+
|
||||||
|
rts
|
||||||
|
: lda (sptr),y ; get char
|
||||||
|
ora #$80 ; make printable
|
||||||
|
jsr cout
|
||||||
|
bra next
|
||||||
|
.endproc
|
||||||
|
; allocate a big buffer for appletalk operations
|
||||||
|
; returns ay = start, x = size in pages
|
||||||
|
; tries to use dynamic mem for operations
|
||||||
|
; otherwise returns altbuf
|
||||||
|
.proc getatbuf
|
||||||
|
ldx #mli_read
|
||||||
|
jsr xmmgr
|
||||||
|
bcs usealt
|
||||||
|
cmp #altbufsz
|
||||||
|
bcc usealt
|
||||||
|
sta tmp ; save num pages
|
||||||
|
ldx #mli_open
|
||||||
|
jsr xmmgr ; allocate all
|
||||||
|
bcc usealt ; if error
|
||||||
|
ldx tmp ; get num pages
|
||||||
|
ldy #$00 ; always on page boundary
|
||||||
|
rts
|
||||||
|
usealt: ldy #<altbuf
|
||||||
|
lda #>altbuf
|
||||||
|
ldx altbufsz
|
||||||
|
rts
|
||||||
|
tmp: .byte $00
|
||||||
|
.endproc
|
||||||
|
;
|
||||||
|
inforeq: .byte 0,2 ; sync GetInfo
|
||||||
|
.word $0000 ; result code
|
||||||
|
.dword $00000000 ; completion address
|
||||||
|
thisnet: .word $0000 ; this network #
|
||||||
|
abridge: .byte $00 ; local bridge
|
||||||
|
hwid: .byte $00 ; hardware ID, IIgs only
|
||||||
|
romver: .word $00 ; ROM version, IIgs only
|
||||||
|
nodenum: .byte $00 ; node number
|
||||||
|
;
|
||||||
|
filsess: .byte 0,$2f ; sync FIListSessions
|
||||||
|
.word $0000 ; result code
|
||||||
|
buflen: .word altbufsz*$100 ; buffer length
|
||||||
|
bufp: .dword altbuf ; buffer pointer
|
||||||
|
nument: .byte $00 ; entries returned
|
||||||
|
DX_end
|
177
afp.userprefix.s
Normal file
177
afp.userprefix.s
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
; %help
|
||||||
|
; afp.userprefix - Display or set the AFP user prefix.
|
||||||
|
;
|
||||||
|
; options: -s <path> Set to <path>, normally only if not already set.
|
||||||
|
; -f Force setting even if it is already set.
|
||||||
|
; -c Set current prefix to user prefix.
|
||||||
|
;
|
||||||
|
; Note that setting the user prefix uses undocumented features of the
|
||||||
|
; AppleTalk stack.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
sptr = xczpage
|
||||||
|
setflag = sptr+2
|
||||||
|
|
||||||
|
pfxbuf = filebuff2
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $01,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_parm 's',t_path ; path to set
|
||||||
|
DX_parm 'f',t_nil ; force setting
|
||||||
|
DX_parm 'c',t_nil ; set prefix
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Display or set AFP User Prefix."
|
||||||
|
DX_main
|
||||||
|
cli ; appletalk requires interrupts
|
||||||
|
ATcall inforeq
|
||||||
|
bcc :+
|
||||||
|
jmp noatalk
|
||||||
|
: stz setflag
|
||||||
|
lda #'s'|$80
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs :+ ; set not requested
|
||||||
|
inc setflag
|
||||||
|
: lda #'f'|$80
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs getit ; not being forced to set
|
||||||
|
lda setflag
|
||||||
|
beq :+ ; user said -f without -s, go to error
|
||||||
|
jmp setpfx ; -s and -f, set prefix
|
||||||
|
: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "-f without -s!"
|
||||||
|
.byte $00
|
||||||
|
bra exiterr
|
||||||
|
getit: stz dirflag ; make sure we are getting, not setting
|
||||||
|
ATcall pfxreq ; get user prefix
|
||||||
|
bcc :+ ; if no error
|
||||||
|
lda setflag ; error, see if we should try setting it?
|
||||||
|
beq pfxerr ; nope, error out
|
||||||
|
bra tryset ; otherwise, try setting
|
||||||
|
: lda #<pfxbuf ; set sptr to prefix buffer
|
||||||
|
sta sptr
|
||||||
|
lda #>pfxbuf
|
||||||
|
sta sptr+1
|
||||||
|
ldy #$00 ; index of length byte
|
||||||
|
lda (sptr),y ; check length
|
||||||
|
beq :+ ; no prefix, see if we should set it
|
||||||
|
stz setflag ; have a prefix already, so flag don't set
|
||||||
|
jsr prpas ; and print
|
||||||
|
: lda setflag ; user wants prefix set?
|
||||||
|
beq :+ ; no, so skip doing it
|
||||||
|
tryset: jmp setpfx ; go to the set routine
|
||||||
|
: lda #'c'|$80
|
||||||
|
jsr xgetparm_ch ; change to wanted?
|
||||||
|
bcs :+ ; nope, skip to the end
|
||||||
|
P8call $c6,p8pfxreq ; enact the change
|
||||||
|
bcc :+ ; all good, skip error
|
||||||
|
jmp xProDOS_err ; if something went pear-shaped
|
||||||
|
: rts ; buhbye
|
||||||
|
pfxerr: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Get/set user prefix error!"
|
||||||
|
.byte $00
|
||||||
|
bra exiterr
|
||||||
|
noatalk: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "AppleTalk offline!"
|
||||||
|
.byte $00
|
||||||
|
exiterr: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
jmp xerr
|
||||||
|
;
|
||||||
|
setpfx: lda #'s'|$80 ; get the pointer to option
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs badpath ; shouldn't happen here!!!
|
||||||
|
sty sptr ; set sptr to check length
|
||||||
|
sty parm1 ; and parm1 for copy
|
||||||
|
sta sptr+1
|
||||||
|
sta parm1+1
|
||||||
|
lda (sptr),y ; check length
|
||||||
|
beq badpath ; and if zero, it must be bad
|
||||||
|
jsr xpmgr ; copy from user option to pfxbuf
|
||||||
|
.byte pm_copy ; davex function
|
||||||
|
parm1: .addr pfxbuf ; source, initially something not entirely insane
|
||||||
|
.addr pfxbuf ; destination
|
||||||
|
P8call $c4,fileinfo ; P8 GET_FILE_INFO
|
||||||
|
bcc :+ ; no error, continue
|
||||||
|
jmp xProDOS_err ; something went pear-shaped
|
||||||
|
: lda fitype ; get file type
|
||||||
|
cmp #$0f ; is directory?
|
||||||
|
bne badpath ; nope... error out
|
||||||
|
lda #$aa ; undocumented, found in LOGON program
|
||||||
|
sta dirflag
|
||||||
|
ATcall pfxreq ; set user prefix
|
||||||
|
bcc :+ ; all good, skip error
|
||||||
|
jmp pfxerr ; sigh... error out
|
||||||
|
: stz setflag ; avoid infinite loop
|
||||||
|
jmp getit ; wind back to get/print/maybe change dir
|
||||||
|
badpath: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Bad new prefix!"
|
||||||
|
.byte $00
|
||||||
|
bra exiterr
|
||||||
|
; increment sptr by a
|
||||||
|
.proc addsptr
|
||||||
|
clc
|
||||||
|
adc sptr
|
||||||
|
sta sptr
|
||||||
|
bcc :+
|
||||||
|
inc sptr+1
|
||||||
|
: rts
|
||||||
|
.endproc
|
||||||
|
; print pascal string at sptr
|
||||||
|
; leave sptr pointed at one past end
|
||||||
|
; of string
|
||||||
|
.proc prpas
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr),y ; get length
|
||||||
|
tax
|
||||||
|
next: lda #$01
|
||||||
|
jsr addsptr
|
||||||
|
dex
|
||||||
|
bpl :+
|
||||||
|
rts
|
||||||
|
: lda (sptr),y ; get char
|
||||||
|
ora #$80 ; make printable
|
||||||
|
jsr cout
|
||||||
|
bra next
|
||||||
|
.endproc
|
||||||
|
;
|
||||||
|
inforeq: .byte 0,2 ; sync GetInfo
|
||||||
|
.word $0000 ; result code
|
||||||
|
.dword $00000000 ; completion address
|
||||||
|
thisnet: .word $0000 ; this network #
|
||||||
|
abridge: .byte $00 ; local bridge
|
||||||
|
hwid: .byte $00 ; hardware ID, IIgs only
|
||||||
|
romver: .word $00 ; ROM version, IIgs only
|
||||||
|
nodenum: .byte $00 ; node number
|
||||||
|
;
|
||||||
|
pfxreq: .byte 0,$2a ; sync FIUserPrefix
|
||||||
|
.word $0000 ; result
|
||||||
|
dirflag: .byte $00 ; direction flag (bit 7)
|
||||||
|
.dword pfxbuf ; buffer (at least 64 bytes)
|
||||||
|
;
|
||||||
|
p8pfxreq: .byte $01
|
||||||
|
.addr pfxbuf
|
||||||
|
;
|
||||||
|
fileinfo: .byte $0a
|
||||||
|
.addr pfxbuf ; buffer
|
||||||
|
.byte $00 ; access
|
||||||
|
fitype: .byte $00 ; want to see $0f
|
||||||
|
.word $0000 ; aux type
|
||||||
|
.byte $00 ; storage type
|
||||||
|
.word $0000 ; blocks used
|
||||||
|
.word $0000 ; mod date
|
||||||
|
.word $0000 ; mod time
|
||||||
|
.word $0000 ; create date
|
||||||
|
.word $0000 ; create time
|
||||||
|
DX_end
|
581
alias.s
Normal file
581
alias.s
Normal file
@ -0,0 +1,581 @@
|
|||||||
|
;*************************************************
|
||||||
|
;*************************************************
|
||||||
|
;
|
||||||
|
; 'alias' -- external command for Davex
|
||||||
|
;
|
||||||
|
; alias -- view and modify Davex aliases
|
||||||
|
;
|
||||||
|
; alias [-s] [-l] [-r] <str1> <str2>
|
||||||
|
;
|
||||||
|
; alias displays all aliases
|
||||||
|
; alias <a> <b> adds alias
|
||||||
|
; alias -r <a> removes alias <a>
|
||||||
|
; alias -s saves aliases to %aliases
|
||||||
|
; alias -l loads aliases from %aliases
|
||||||
|
;
|
||||||
|
;*************************************************
|
||||||
|
;
|
||||||
|
; Converted to MPW IIgs 20-Sep-92 DAL
|
||||||
|
;
|
||||||
|
; Fixed from the 1.30P version on SourceForge 26-Jul-17 MG
|
||||||
|
;
|
||||||
|
;*************************************************
|
||||||
|
|
||||||
|
;.segment "CODE_A000"
|
||||||
|
|
||||||
|
OrgAdr = $A000 ;change as necessary (end below $B000)
|
||||||
|
.org OrgAdr ; Makes the listing more readable, though it doesn't really org the code - the linker does that.
|
||||||
|
.include "Common/2/Globals2.asm"
|
||||||
|
.include "Common/2/Apple.Globals2.asm"
|
||||||
|
.include "Common/2/Mli.Globals2.asm"
|
||||||
|
.include "Common/Macros.asm"
|
||||||
|
;include 'm16.util2'
|
||||||
|
low_cr = $0D
|
||||||
|
;
|
||||||
|
MyVersion = $09
|
||||||
|
MinVersion = $12
|
||||||
|
MinVerAux = $05
|
||||||
|
;*************************************************
|
||||||
|
rts
|
||||||
|
.byte $ee,$ee
|
||||||
|
.byte MyVersion,MinVersion
|
||||||
|
.byte %00000000 ;hardware req
|
||||||
|
.addr descr
|
||||||
|
.addr OrgAdr
|
||||||
|
.addr start
|
||||||
|
.byte MinVerAux,0,0,0
|
||||||
|
; parameters here
|
||||||
|
.byte 0,t_string
|
||||||
|
.byte 0,t_string
|
||||||
|
.byte $80+'r',t_nil
|
||||||
|
.byte $80+'s',t_nil
|
||||||
|
.byte $80+'l',t_nil
|
||||||
|
.byte 0,0
|
||||||
|
descr:
|
||||||
|
pstr "display or modify command aliases"
|
||||||
|
;*************************************************
|
||||||
|
; dum xczpage ;32 locations
|
||||||
|
AliasPages = xczpage
|
||||||
|
AliasP = AliasPages+1
|
||||||
|
AliasEnd = AliasP+2
|
||||||
|
myP = AliasEnd+2
|
||||||
|
str1 = myP+2
|
||||||
|
str2 = str1+2
|
||||||
|
char = str2+2
|
||||||
|
count = char+1 ;.res 2
|
||||||
|
; dend
|
||||||
|
;
|
||||||
|
start = *
|
||||||
|
sta str1+1
|
||||||
|
sty str1
|
||||||
|
|
||||||
|
lda #1
|
||||||
|
jsr xgetparm_n
|
||||||
|
sta str2+1
|
||||||
|
sty str2
|
||||||
|
|
||||||
|
ldx #1
|
||||||
|
jsr xshell_info
|
||||||
|
sta AliasP+1
|
||||||
|
sty AliasP
|
||||||
|
sty AliasEnd
|
||||||
|
stx AliasPages
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc AliasP+1
|
||||||
|
sta AliasEnd+1
|
||||||
|
|
||||||
|
lda #$80+'l'
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs noLoad
|
||||||
|
jsr load_aliases
|
||||||
|
noLoad:
|
||||||
|
|
||||||
|
jsr DoAlias
|
||||||
|
|
||||||
|
lda #$80+'s'
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs noSave
|
||||||
|
jsr save_aliases
|
||||||
|
noSave:
|
||||||
|
rts
|
||||||
|
|
||||||
|
;*************************************************
|
||||||
|
;
|
||||||
|
; handle adding, removing, or showing aliases
|
||||||
|
;
|
||||||
|
DoAlias:
|
||||||
|
lda #$80+'r'
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs noRmv
|
||||||
|
jmp remove_alias
|
||||||
|
|
||||||
|
noRmv:
|
||||||
|
ldy #0
|
||||||
|
lda (str1),y
|
||||||
|
bne doAdd
|
||||||
|
lda (str2),y
|
||||||
|
bne doAdd
|
||||||
|
jsr xgetnump
|
||||||
|
cmp #2
|
||||||
|
beq show_aliases
|
||||||
|
rts
|
||||||
|
|
||||||
|
doAdd: jmp add_alias
|
||||||
|
|
||||||
|
;*************************************************
|
||||||
|
;
|
||||||
|
; Display all the aliases
|
||||||
|
;
|
||||||
|
show_aliases:
|
||||||
|
jsr CalcUsedSize
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " bytes used (of "
|
||||||
|
.byte 0
|
||||||
|
lda AliasPages
|
||||||
|
ldy #0
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ") to store these aliases:"
|
||||||
|
.byte low_cr
|
||||||
|
asc_hi " "
|
||||||
|
.byte 0
|
||||||
|
;
|
||||||
|
lda AliasP+1
|
||||||
|
ldy AliasP
|
||||||
|
sta myP+1
|
||||||
|
sty myP
|
||||||
|
ShowA1: lda (myP),y
|
||||||
|
beq ShowedA
|
||||||
|
jsr NeatCout
|
||||||
|
bcs ShowedA
|
||||||
|
iny
|
||||||
|
bne ShowA1
|
||||||
|
inc myP+1
|
||||||
|
bne ShowA1
|
||||||
|
ShowedA: rts
|
||||||
|
|
||||||
|
NeatCout: ora #$80
|
||||||
|
cmp #$8d
|
||||||
|
beq isCR
|
||||||
|
jsr cout
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
isCR: jsr xcheck_wait
|
||||||
|
bcs isCR2
|
||||||
|
jsr crout
|
||||||
|
lda #$80+' '
|
||||||
|
jsr cout
|
||||||
|
jsr cout
|
||||||
|
clc
|
||||||
|
isCR2: rts
|
||||||
|
|
||||||
|
;*************************************************
|
||||||
|
;
|
||||||
|
; Save aliases to %aliases file
|
||||||
|
;
|
||||||
|
save_aliases:
|
||||||
|
lda #>AliasName
|
||||||
|
ldy #<AliasName
|
||||||
|
jsr xbuild_local
|
||||||
|
sta aPath+1
|
||||||
|
sty aPath
|
||||||
|
sta acPath+1
|
||||||
|
sty acPath
|
||||||
|
|
||||||
|
jsr mli
|
||||||
|
.byte mli_create
|
||||||
|
.addr CreateA
|
||||||
|
bcc CreateOK
|
||||||
|
cmp #err_dupfil
|
||||||
|
bne DiskError
|
||||||
|
CreateOK:
|
||||||
|
|
||||||
|
jsr mli
|
||||||
|
.byte mli_open
|
||||||
|
.addr OpenA
|
||||||
|
bcs DiskError
|
||||||
|
|
||||||
|
lda aRef
|
||||||
|
sta aRef2
|
||||||
|
sta aRef3
|
||||||
|
sta aRef4
|
||||||
|
|
||||||
|
jsr CalcUsedSize
|
||||||
|
sta WriteA+5
|
||||||
|
sty WriteA+4
|
||||||
|
jsr mli
|
||||||
|
.byte mli_write
|
||||||
|
.addr WriteA
|
||||||
|
bcs DiskError
|
||||||
|
|
||||||
|
jsr mli
|
||||||
|
.byte mli_getmark
|
||||||
|
.addr MarkA
|
||||||
|
jsr mli
|
||||||
|
.byte mli_seteof
|
||||||
|
.addr MarkA
|
||||||
|
|
||||||
|
jsr mli
|
||||||
|
.byte mli_close
|
||||||
|
.addr CloseA
|
||||||
|
bcs DiskError
|
||||||
|
rts
|
||||||
|
|
||||||
|
;*************************************************
|
||||||
|
;
|
||||||
|
; Load aliases from %aliases file
|
||||||
|
;
|
||||||
|
load_aliases:
|
||||||
|
lda #>AliasName
|
||||||
|
ldy #<AliasName
|
||||||
|
jsr xbuild_local
|
||||||
|
sta aPath+1
|
||||||
|
sty aPath
|
||||||
|
|
||||||
|
jsr mli
|
||||||
|
.byte mli_open
|
||||||
|
.addr OpenA
|
||||||
|
bcs DiskError
|
||||||
|
|
||||||
|
lda aRef
|
||||||
|
sta aRef2
|
||||||
|
sta aRef3
|
||||||
|
|
||||||
|
lda AliasPages
|
||||||
|
ldy #0
|
||||||
|
sta ReadA+5
|
||||||
|
sty ReadA+4
|
||||||
|
jsr mli
|
||||||
|
.byte mli_read
|
||||||
|
.addr WriteA
|
||||||
|
php
|
||||||
|
pha
|
||||||
|
jsr strip7
|
||||||
|
pla
|
||||||
|
plp
|
||||||
|
bcs DiskError
|
||||||
|
|
||||||
|
jsr mli
|
||||||
|
.byte mli_close
|
||||||
|
.addr CloseA
|
||||||
|
bcs DiskError
|
||||||
|
rts
|
||||||
|
|
||||||
|
DiskError: jmp xProDOS_err
|
||||||
|
|
||||||
|
CreateA: .byte 7
|
||||||
|
acPath: .addr 0
|
||||||
|
.byte $C3 ;access
|
||||||
|
.byte tTXT ;filetype
|
||||||
|
.addr 0 ;auxtype
|
||||||
|
.byte 1 ;storage type
|
||||||
|
.addr 0,0 ;create date/time
|
||||||
|
|
||||||
|
OpenA: .byte 3
|
||||||
|
aPath: .addr 0
|
||||||
|
.addr filebuff
|
||||||
|
aRef: .byte 0
|
||||||
|
|
||||||
|
ReadA:
|
||||||
|
WriteA: .byte 4
|
||||||
|
aRef2: .byte 0
|
||||||
|
.addr Aliases,$0000,0
|
||||||
|
|
||||||
|
MarkA: .byte 2
|
||||||
|
aRef4: .byte 0
|
||||||
|
.byte 0,0,0
|
||||||
|
CloseA: .byte 1
|
||||||
|
aRef3: .byte 0
|
||||||
|
|
||||||
|
AliasName:
|
||||||
|
.byte 7,"ALIASES"
|
||||||
|
|
||||||
|
strip7: lda AliasPages
|
||||||
|
sta count
|
||||||
|
lda AliasP+1
|
||||||
|
ldy AliasP
|
||||||
|
sta myP+1
|
||||||
|
sty myP
|
||||||
|
ldy #0
|
||||||
|
strip1: lda (myP),y
|
||||||
|
and #%01111111
|
||||||
|
sta (myP),y
|
||||||
|
dey
|
||||||
|
bne strip1
|
||||||
|
dec count
|
||||||
|
bne strip1
|
||||||
|
rts
|
||||||
|
|
||||||
|
;*************************************************
|
||||||
|
;
|
||||||
|
; remove an alias
|
||||||
|
;
|
||||||
|
remove_alias:
|
||||||
|
ldy #0
|
||||||
|
lda (str2),y
|
||||||
|
beq rmv2ok
|
||||||
|
jsr xmess
|
||||||
|
.byte cr
|
||||||
|
asc_hi "*** too many parameters for removing an alias"
|
||||||
|
.byte low_cr,0
|
||||||
|
jmp xerr
|
||||||
|
rmv2ok:
|
||||||
|
jsr FindAlias
|
||||||
|
bcc rmvFound
|
||||||
|
jsr xmess
|
||||||
|
.byte cr
|
||||||
|
asc_hi "*** no such alias found"
|
||||||
|
.byte low_cr,0
|
||||||
|
jmp xerr
|
||||||
|
rmvFound: jsr remove_it
|
||||||
|
rts
|
||||||
|
;
|
||||||
|
; Add an alias, possibly replacing an existing one
|
||||||
|
;
|
||||||
|
add_alias:
|
||||||
|
jsr FindAlias
|
||||||
|
bcs addMissing
|
||||||
|
|
||||||
|
lda #1
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Okay to replace existing alias "
|
||||||
|
.byte $A2,0
|
||||||
|
lda str1+1
|
||||||
|
ldy str1
|
||||||
|
jsr xprint_path
|
||||||
|
lda #$A2
|
||||||
|
jsr cout
|
||||||
|
lda #$80+'n'
|
||||||
|
jsr xyesno2
|
||||||
|
php
|
||||||
|
lda #<-1
|
||||||
|
jsr xredirect
|
||||||
|
plp
|
||||||
|
bne ReplacIt
|
||||||
|
rts
|
||||||
|
ReplacIt: jsr remove_it
|
||||||
|
addMissing:
|
||||||
|
jsr CalcUsedSize
|
||||||
|
ldy #0
|
||||||
|
clc
|
||||||
|
lda (str1),y
|
||||||
|
adc (str2),y
|
||||||
|
adc #3
|
||||||
|
adc count
|
||||||
|
lda count+1
|
||||||
|
adc #0
|
||||||
|
cmp AliasPages
|
||||||
|
bcc haveRoom
|
||||||
|
jsr xmess
|
||||||
|
.byte cr
|
||||||
|
asc_hi "*** no room for that alias"
|
||||||
|
.byte low_cr,0
|
||||||
|
jmp xerr
|
||||||
|
|
||||||
|
haveRoom:
|
||||||
|
ldy #0
|
||||||
|
lda (str1),y
|
||||||
|
tax
|
||||||
|
bne aNameOK
|
||||||
|
jsr xmess
|
||||||
|
.byte cr
|
||||||
|
asc_hi "*** empty string is not a legal alias"
|
||||||
|
.byte low_cr,0
|
||||||
|
jmp xerr
|
||||||
|
aNameOK: iny
|
||||||
|
lda (str1),y
|
||||||
|
jsr CramChar
|
||||||
|
dex
|
||||||
|
bne aNameOK
|
||||||
|
|
||||||
|
lda #$80+' '
|
||||||
|
jsr CramChar
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
lda (str2),y
|
||||||
|
tax
|
||||||
|
beq aDefDone
|
||||||
|
AddDef: iny
|
||||||
|
lda (str2),y
|
||||||
|
jsr CramChar
|
||||||
|
dex
|
||||||
|
bne AddDef
|
||||||
|
aDefDone: lda #$0d
|
||||||
|
jsr CramChar
|
||||||
|
lda #0
|
||||||
|
jmp CramChar
|
||||||
|
|
||||||
|
;
|
||||||
|
; CramChar -- append A to (myP)
|
||||||
|
;
|
||||||
|
CramChar: sty cramY
|
||||||
|
ldy #0
|
||||||
|
sta (myP),y
|
||||||
|
ldy cramY
|
||||||
|
inc myP
|
||||||
|
bne cram_ok
|
||||||
|
inc myP+1
|
||||||
|
cram_ok: rts
|
||||||
|
cramY: .byte 0
|
||||||
|
|
||||||
|
;
|
||||||
|
; FindAlias -- return CLC if found, myP points to it
|
||||||
|
;
|
||||||
|
FindAlias:
|
||||||
|
lda AliasP+1
|
||||||
|
ldy AliasP
|
||||||
|
sta myP+1
|
||||||
|
sty myP
|
||||||
|
FindA1:
|
||||||
|
jsr compare
|
||||||
|
bcc FoundIt
|
||||||
|
jsr NextAlias
|
||||||
|
ldy #0
|
||||||
|
lda (myP),y
|
||||||
|
bne FindA1
|
||||||
|
sec
|
||||||
|
FoundIt: rts
|
||||||
|
;
|
||||||
|
; compare--check if alias at myP matches str1, returning
|
||||||
|
; CLC if they do (and preserving myP)
|
||||||
|
;
|
||||||
|
compare:
|
||||||
|
lda myP+1
|
||||||
|
pha
|
||||||
|
lda myP
|
||||||
|
pha
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
lda (str1),y
|
||||||
|
tax
|
||||||
|
beq NoMatch
|
||||||
|
iny ;Y=1
|
||||||
|
jsr decP
|
||||||
|
cmp1:
|
||||||
|
lda (str1),y
|
||||||
|
jsr xdowncase
|
||||||
|
sta char
|
||||||
|
jsr FetchChar
|
||||||
|
and #%01111111
|
||||||
|
beq NoMatch
|
||||||
|
jsr xdowncase
|
||||||
|
cmp char
|
||||||
|
bne NoMatch
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne cmp1
|
||||||
|
jsr FetchChar
|
||||||
|
cmp #$80+' '
|
||||||
|
bne NoMatch
|
||||||
|
matches: clc
|
||||||
|
compared:
|
||||||
|
pla
|
||||||
|
sta myP
|
||||||
|
pla
|
||||||
|
sta myP+1
|
||||||
|
rts
|
||||||
|
NoMatch:
|
||||||
|
sec
|
||||||
|
bcs compared
|
||||||
|
;
|
||||||
|
; increment myP and return the character it points at
|
||||||
|
;
|
||||||
|
FetchChar: inc myP
|
||||||
|
bne P2ok
|
||||||
|
inc myP+1
|
||||||
|
P2ok = *
|
||||||
|
sty ytemp
|
||||||
|
ldy #0
|
||||||
|
lda (myP),y
|
||||||
|
ldy ytemp
|
||||||
|
ora #%10000000
|
||||||
|
rts
|
||||||
|
ytemp: .res 1
|
||||||
|
;
|
||||||
|
; advance myP to next alias
|
||||||
|
;
|
||||||
|
NextAlias: jsr FetchChar
|
||||||
|
cmp #$8d
|
||||||
|
beq FetchChar
|
||||||
|
and #%01111111
|
||||||
|
bne NextAlias
|
||||||
|
rts
|
||||||
|
|
||||||
|
;*************************************************
|
||||||
|
;
|
||||||
|
; Remove the alias that myP is pointing at
|
||||||
|
;
|
||||||
|
remove_it:
|
||||||
|
ldy #0
|
||||||
|
lda (myP),y
|
||||||
|
beq removed
|
||||||
|
pha
|
||||||
|
jsr KillCharP
|
||||||
|
pla
|
||||||
|
and #$7f
|
||||||
|
cmp #$0d
|
||||||
|
bne remove_it
|
||||||
|
removed: rts
|
||||||
|
;
|
||||||
|
; Kill a character at myP, shifting forward all the
|
||||||
|
; characters after myP until AliasEnd
|
||||||
|
;
|
||||||
|
KillCharP:
|
||||||
|
lda myP+1
|
||||||
|
pha
|
||||||
|
lda myP
|
||||||
|
pha
|
||||||
|
KillLoop:
|
||||||
|
ldy #1
|
||||||
|
lda (myP),y
|
||||||
|
dey
|
||||||
|
sta (myP),y
|
||||||
|
inc myP
|
||||||
|
bne p_ok
|
||||||
|
inc myP+1
|
||||||
|
p_ok: lda myP+1
|
||||||
|
cmp AliasEnd+1
|
||||||
|
bne KillLoop
|
||||||
|
lda myP
|
||||||
|
cmp AliasEnd
|
||||||
|
bne KillLoop
|
||||||
|
pla
|
||||||
|
sta myP
|
||||||
|
pla
|
||||||
|
sta myP+1
|
||||||
|
rts
|
||||||
|
;
|
||||||
|
; CalcUsedSize--return used bytes in AY,
|
||||||
|
; myP pointing at the $00 marker at the end
|
||||||
|
; of the alias data
|
||||||
|
;
|
||||||
|
CalcUsedSize:
|
||||||
|
lda #0
|
||||||
|
sta count
|
||||||
|
sta count+1
|
||||||
|
lda AliasP+1
|
||||||
|
ldy AliasP
|
||||||
|
sta myP+1
|
||||||
|
sty myP
|
||||||
|
ldy #0
|
||||||
|
cus1: lda (myP),y
|
||||||
|
beq cus_done
|
||||||
|
inc count
|
||||||
|
bne count_ok
|
||||||
|
inc count+1
|
||||||
|
count_ok: inc myP
|
||||||
|
bne cus1
|
||||||
|
inc myP+1
|
||||||
|
bne cus1
|
||||||
|
cus_done: lda count+1
|
||||||
|
ldy count
|
||||||
|
rts
|
||||||
|
;
|
||||||
|
decP: lda myP
|
||||||
|
bne decP1
|
||||||
|
dec myP+1
|
||||||
|
decP1: dec myP
|
||||||
|
rts
|
47
at.boot.s
Normal file
47
at.boot.s
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
; %help
|
||||||
|
; at.boot - Boot over AppleTalk.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
; TODO: If AT is not initialized, then:
|
||||||
|
; If //e: Find and init workstation card and execute boot if it's not already
|
||||||
|
; initialized.
|
||||||
|
; If IIgs: Try Apple IIgs AT boot vectors.
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $01,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Reboot over the network."
|
||||||
|
DX_main
|
||||||
|
cli ; appletalk requires interrupt
|
||||||
|
ATcall inforeq
|
||||||
|
bcs noatalk
|
||||||
|
ATcall boot
|
||||||
|
lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Network boot failed!"
|
||||||
|
.byte $00
|
||||||
|
bra errexit
|
||||||
|
noatalk: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "AppleTalk offline!"
|
||||||
|
.byte $00
|
||||||
|
errexit: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
jmp xerr
|
||||||
|
inforeq: .byte 0,2 ; sync GetInfo
|
||||||
|
.word $0000 ; result code
|
||||||
|
.dword $00000000 ; completion address
|
||||||
|
thisnet: .word $0000 ; this network #
|
||||||
|
abridge: .byte $00 ; local bridge
|
||||||
|
hwid: .byte $00 ; hardware ID, IIgs only
|
||||||
|
romver: .word $00 ; ROM version, IIgs only
|
||||||
|
nodenum: .byte $00 ; node number
|
||||||
|
boot: .byte $00,$06 ; sync boot
|
||||||
|
.word $0000 ; result code
|
||||||
|
DX_end
|
123
at.info.s
Normal file
123
at.info.s
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
; %help
|
||||||
|
; at.info -- Display AppleTalk info.
|
||||||
|
;
|
||||||
|
; syntax: at.info
|
||||||
|
;
|
||||||
|
; Displays AppleTalk node number, bridge node, and (for IIgs) hardware
|
||||||
|
; ID and ROM version.
|
||||||
|
;
|
||||||
|
; If AppleTalk is offline, will print the slot number of an installed
|
||||||
|
; Workstation Card.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
cardptr = xczpage
|
||||||
|
|
||||||
|
DX_start $ae00 ; load address
|
||||||
|
DX_info $01,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Display AppleTalk info."
|
||||||
|
DX_main
|
||||||
|
cli ; appletalk requires interrupt
|
||||||
|
ATcall inforeq
|
||||||
|
bcs noatalk
|
||||||
|
lda thisnet
|
||||||
|
ldy thisnet+1
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "."
|
||||||
|
.byte $00
|
||||||
|
lda #$00
|
||||||
|
ldy nodenum
|
||||||
|
jsr xprdec_2
|
||||||
|
ldy abridge
|
||||||
|
beq :+
|
||||||
|
phy
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ", bridge "
|
||||||
|
.byte $00
|
||||||
|
ply
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
: lda #$8d
|
||||||
|
jsr cout
|
||||||
|
sec
|
||||||
|
jsr checkmach
|
||||||
|
bcs :+
|
||||||
|
; display IIgs specific
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Hardware ID: "
|
||||||
|
.byte $00
|
||||||
|
lda #$00
|
||||||
|
ldy hwid
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ", ROM version "
|
||||||
|
.byte $00
|
||||||
|
lda #$00
|
||||||
|
ldy romver
|
||||||
|
jsr xprdec_2
|
||||||
|
lda #$8d
|
||||||
|
jsr cout
|
||||||
|
: rts
|
||||||
|
noatalk: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "AppleTalk offline!"
|
||||||
|
.byte $00
|
||||||
|
jsr FindCard
|
||||||
|
bcs :+ ; no card
|
||||||
|
and #$0f ; get slot #
|
||||||
|
pha
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Workstation Card in slot "
|
||||||
|
.byte $00
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
jmp xerr
|
||||||
|
.proc FindCard
|
||||||
|
lda #$f9 ; offset to ID bytes
|
||||||
|
sta cardptr
|
||||||
|
lda #$c7 ; start at slot 7
|
||||||
|
sta cardptr+1
|
||||||
|
NextSlot: ldy #$03
|
||||||
|
: lda (cardptr),y
|
||||||
|
cmp idtbl,y ; check ID byte
|
||||||
|
bne NoMatch
|
||||||
|
dey
|
||||||
|
bpl :-
|
||||||
|
ldy #$04
|
||||||
|
lda (cardptr),y
|
||||||
|
beq NoMatch ; Skip IIgs AppleTalk
|
||||||
|
cmp #$01 ; Workstation card?
|
||||||
|
bne NoCard ; nope, something else
|
||||||
|
clc
|
||||||
|
lda cardptr+1 ; get slot
|
||||||
|
rts
|
||||||
|
NoMatch: dec cardptr+1
|
||||||
|
lda cardptr+1
|
||||||
|
cmp #$c0 ;are we finished scanning the slots?
|
||||||
|
bne NextSlot
|
||||||
|
NoCard: lda #$00
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
idtbl: .byte "ATLK" ; msb off
|
||||||
|
.endproc
|
||||||
|
inforeq: .byte 0,2 ; sync GetInfo
|
||||||
|
.word $0000 ; result code
|
||||||
|
.dword $00000000 ; completion address
|
||||||
|
thisnet: .word $0000 ; this network #
|
||||||
|
abridge: .byte $00 ; local bridge
|
||||||
|
hwid: .byte $00 ; hardware ID, IIgs only
|
||||||
|
romver: .word $00 ; ROM version, IIgs only
|
||||||
|
nodenum: .byte $00 ; node number
|
||||||
|
DX_end
|
163
at.zones.s
Normal file
163
at.zones.s
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
; %help
|
||||||
|
; at.zones -- Display AppleTalk zones.
|
||||||
|
;
|
||||||
|
; syntax: at.info
|
||||||
|
;
|
||||||
|
; Displays local AppleTalk zone and all known zones.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
sptr = xczpage
|
||||||
|
altbuf = filebuff3 ; if no dynamic mem avail
|
||||||
|
altbufsz = $04 ; pages
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $01,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Display AppleTalk zones."
|
||||||
|
DX_main
|
||||||
|
cli ; appletalk requires interrupts
|
||||||
|
ATcall inforeq
|
||||||
|
bcc :+
|
||||||
|
jmp noatalk
|
||||||
|
jsr getatbuf ; allocate buffer
|
||||||
|
sta bufp1+1
|
||||||
|
sty bufp1
|
||||||
|
sta bufp2+1
|
||||||
|
sty bufp2
|
||||||
|
stx buflen2+1
|
||||||
|
: lda abridge
|
||||||
|
sta zbridge ; zone req needs it
|
||||||
|
ATcall myzone
|
||||||
|
bcs nozone
|
||||||
|
lda bufp1+1
|
||||||
|
sta sptr+1
|
||||||
|
lda bufp1
|
||||||
|
sta sptr
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr),y
|
||||||
|
beq nozone
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Local zone: "
|
||||||
|
.byte $00
|
||||||
|
jsr prpas
|
||||||
|
lda #$8d
|
||||||
|
jsr cout
|
||||||
|
nozone: ATcall getzones
|
||||||
|
bcs nozones ; TODO: check for buffer overflow and display what we get
|
||||||
|
lda numzones+1
|
||||||
|
ora numzones
|
||||||
|
beq nozones ; short circuit if no zones
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Zone list:"
|
||||||
|
.byte $8d,$00
|
||||||
|
lda bufp2+1 ; set up pointer
|
||||||
|
sta sptr+1
|
||||||
|
lda bufp2
|
||||||
|
sta sptr
|
||||||
|
przone: ;lda numzones+1
|
||||||
|
;ldy numzones
|
||||||
|
;jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " "
|
||||||
|
.byte $00
|
||||||
|
jsr prpas ; print zone name
|
||||||
|
lda #$8d
|
||||||
|
jsr cout
|
||||||
|
lda numzones
|
||||||
|
sec
|
||||||
|
sbc #$01
|
||||||
|
sta numzones
|
||||||
|
bcs :+ ; no borrow
|
||||||
|
dec numzones+1
|
||||||
|
bit numzones+1 ; set N flag
|
||||||
|
bmi nozones
|
||||||
|
: jsr xcheck_wait
|
||||||
|
bcs nozones
|
||||||
|
lda numzones
|
||||||
|
ora numzones+1
|
||||||
|
beq nozones ; if zero
|
||||||
|
bra przone
|
||||||
|
nozones: rts
|
||||||
|
noatalk: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "AppleTalk offline!"
|
||||||
|
.byte $00
|
||||||
|
exiterr: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
jmp xerr
|
||||||
|
; print pascal string at sptr
|
||||||
|
; leave sptr pointed at one past end
|
||||||
|
; of string
|
||||||
|
.proc prpas
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr),y ; get length
|
||||||
|
tax
|
||||||
|
next: lda sptr
|
||||||
|
clc
|
||||||
|
adc #$01
|
||||||
|
sta sptr
|
||||||
|
bcc :+
|
||||||
|
inc sptr+1
|
||||||
|
: dex
|
||||||
|
bpl :+
|
||||||
|
rts
|
||||||
|
: lda (sptr),y ; get char
|
||||||
|
ora #$80 ; make printable
|
||||||
|
jsr cout
|
||||||
|
bra next
|
||||||
|
.endproc
|
||||||
|
; allocate a big buffer for appletalk operations
|
||||||
|
; returns ay = start, x = size in pages
|
||||||
|
; tries to use dynamic mem for operations
|
||||||
|
; otherwise returns altbuf
|
||||||
|
.proc getatbuf
|
||||||
|
ldx #mli_read
|
||||||
|
jsr xmmgr
|
||||||
|
bcs usealt
|
||||||
|
cmp #altbufsz
|
||||||
|
bcc usealt
|
||||||
|
sta tmp ; save num pages
|
||||||
|
ldx #mli_open
|
||||||
|
jsr xmmgr ; allocate all
|
||||||
|
bcc usealt ; if error
|
||||||
|
ldx tmp ; get num pages
|
||||||
|
ldy #$00 ; always on page boundary
|
||||||
|
rts
|
||||||
|
usealt: ldy #<altbuf
|
||||||
|
lda #>altbuf
|
||||||
|
ldx altbufsz
|
||||||
|
rts
|
||||||
|
tmp: .byte $00
|
||||||
|
.endproc
|
||||||
|
inforeq: .byte 0,2 ; sync GetInfo
|
||||||
|
.word $0000 ; result code
|
||||||
|
.dword $00000000 ; completion address
|
||||||
|
thisnet: .word $0000 ; this network #
|
||||||
|
abridge: .byte $00 ; local bridge
|
||||||
|
hwid: .byte $00 ; hardware ID, IIgs only
|
||||||
|
romver: .word $00 ; ROM version, IIgs only
|
||||||
|
nodenum: .byte $00 ; node number
|
||||||
|
;
|
||||||
|
myzone: .byte 0,$1a ; sync GetMyZone
|
||||||
|
.word $0000 ; result
|
||||||
|
.dword $00000000 ; completion
|
||||||
|
bufp1: .dword altbuf ; buffer
|
||||||
|
.byte 4,4 ; 4 times every 1 sec
|
||||||
|
.word $0000 ; reserved
|
||||||
|
;
|
||||||
|
getzones: .byte 0,$1b ; async GetZoneList
|
||||||
|
.word $0000 ; result
|
||||||
|
.dword $00000000 ; completion
|
||||||
|
buflen2: .word altbufsz*$100 ; buffer len
|
||||||
|
bufp2: .dword altbuf ; buffer
|
||||||
|
zbridge: .byte $00 ; bridge node
|
||||||
|
.word $0001 ; start index
|
||||||
|
.byte 8,16 ; 16 times every 2 secs
|
||||||
|
numzones: .word $0000 ; num zones returned
|
||||||
|
.dword $0000000 ; reserved
|
||||||
|
DX_end
|
174
davex-mg.inc
Normal file
174
davex-mg.inc
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
|
||||||
|
; MG's davex macros
|
||||||
|
;
|
||||||
|
; A skeleton for using this:
|
||||||
|
; DX_start $a000 ; load address
|
||||||
|
; DX_info $01,$26,dx_cc_iie_or_iigs,$00
|
||||||
|
; DX_ptab
|
||||||
|
; DX_parm 's',t_path
|
||||||
|
; DX_end_ptab
|
||||||
|
; DX_desc "My command"
|
||||||
|
; DX_main
|
||||||
|
; <code>
|
||||||
|
; DX_end
|
||||||
|
;
|
||||||
|
|
||||||
|
; *********
|
||||||
|
.ifdef I_MG_DAVEX
|
||||||
|
.warning "davex-mg included more than once"
|
||||||
|
.else
|
||||||
|
I_MG_MAC = 1
|
||||||
|
; *********
|
||||||
|
|
||||||
|
.include "Common/2/Globals2.asm"
|
||||||
|
.include "Common/2/MLI.Globals2.asm"
|
||||||
|
.include "Common/2/Macros2.asm"
|
||||||
|
|
||||||
|
cout = $fded ; character out
|
||||||
|
checkmach = $fe1f ; clears carry on IIgs, no effect on //e
|
||||||
|
|
||||||
|
p8_mli = $bf00
|
||||||
|
mli_atlk = $42
|
||||||
|
|
||||||
|
dx_cc_any = 0
|
||||||
|
dx_cc_40col = 1 << 7
|
||||||
|
dx_cc_80col = 1 << 6
|
||||||
|
dx_cc_iie_or_iigs = 1 << 5
|
||||||
|
dx_cc_iic = 1 << 4
|
||||||
|
dx_cc_iigs = 1 << 3
|
||||||
|
dx_cc_bit2 = 1 << 2
|
||||||
|
dx_cc_bit1 = 1 << 1
|
||||||
|
dx_cc_bit0 = 1 << 0
|
||||||
|
|
||||||
|
dx_mg_auto_origin = 0 ; value for auto origination
|
||||||
|
; using utils/auto_origin.sh
|
||||||
|
|
||||||
|
dx_desc_none = 0
|
||||||
|
|
||||||
|
.macro P8call CallNum, PList
|
||||||
|
jsr p8_mli
|
||||||
|
.byte CallNum
|
||||||
|
.addr PList
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro ATcall PList
|
||||||
|
P8call mli_atlk, PList
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; if the Load address is zero, we don't export X_DX_LOAD
|
||||||
|
; so that later we can calculate an appropriate start addr
|
||||||
|
; and let the linker do it.
|
||||||
|
.macro DX_start Load
|
||||||
|
.ifdef DID_DX_start
|
||||||
|
.warning "DX_start used more than once"
|
||||||
|
.else
|
||||||
|
.export DID_YOU_DX_end
|
||||||
|
.export X_DX_MACROS
|
||||||
|
X_DX_MACROS = 1
|
||||||
|
.if Load > 0
|
||||||
|
.org Load
|
||||||
|
.export X_DX_LOAD
|
||||||
|
.else
|
||||||
|
.export X_DX_AUTO_LOAD
|
||||||
|
X_DX_AUTO_LOAD = 1
|
||||||
|
.endif
|
||||||
|
X_DX_LOAD := *
|
||||||
|
ext_start:
|
||||||
|
rts
|
||||||
|
.byte $ee, $ee
|
||||||
|
DID_DX_start = 1
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DX_info CVer, DXVer, CCs, DAVer
|
||||||
|
.ifdef DID_DX_start
|
||||||
|
.byte CVer, DXVer, CCs ; versions and characteristics
|
||||||
|
.addr X_DX_DESC ; description pointer to pascal str
|
||||||
|
.addr X_DX_LOAD ; load address
|
||||||
|
.addr X_DX_EXEC ; exec address
|
||||||
|
.byte DAVer ; minor version
|
||||||
|
.byte $00, $00, $00 ; spares
|
||||||
|
DID_DX_info = 1
|
||||||
|
.else
|
||||||
|
.warning "DX_info must happen after DX_start"
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DX_ptab
|
||||||
|
.ifdef DID_DX_info
|
||||||
|
; start parameter table
|
||||||
|
DID_DX_ptab = 1
|
||||||
|
.else
|
||||||
|
.warning "DX_ptab must come after DX_info"
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DX_parm Char, Type
|
||||||
|
.ifdef DID_DX_ptab
|
||||||
|
.if Char > 0
|
||||||
|
.byte Char|$80,Type
|
||||||
|
.else
|
||||||
|
.byte Char,Type
|
||||||
|
.endif
|
||||||
|
.else
|
||||||
|
.warning "DX_parm must come after DX_ptab"
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DX_end_ptab
|
||||||
|
.ifdef DID_DX_info
|
||||||
|
.byte $00,$00
|
||||||
|
DID_DX_end_ptab = 1
|
||||||
|
.else
|
||||||
|
.warning "DX_end_ptab must come after DX_info"
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DX_desc Desc
|
||||||
|
.ifndef DID_DX_end_ptab
|
||||||
|
.warning "DX_desc must come after DX_end_ptab"
|
||||||
|
.endif
|
||||||
|
X_DX_DESC: .byte .strlen(Desc)
|
||||||
|
asc_hi Desc
|
||||||
|
.assert (* - ext_start) < 512, warning, "Description must end in the first 512 bytes"
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DX_main
|
||||||
|
X_DX_EXEC = *
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
.macro DX_end
|
||||||
|
.ifndef DID_DX_start
|
||||||
|
.error "DX_start not used"
|
||||||
|
.endif
|
||||||
|
X_DX_END = *
|
||||||
|
X_DX_SIZE = X_DX_END - X_DX_LOAD
|
||||||
|
DID_YOU_DX_end = 1
|
||||||
|
.ifndef DID_DX_info
|
||||||
|
.error "DX_info not used"
|
||||||
|
.endif
|
||||||
|
.ifndef X_DX_EXEC
|
||||||
|
.error "DX_main not used"
|
||||||
|
.endif
|
||||||
|
.ifndef X_DX_DESC
|
||||||
|
.out "Note: no DX_end_ptab used, hope that's okay"
|
||||||
|
.endif
|
||||||
|
.ifndef X_DX_DESC
|
||||||
|
.out "Note: no description provided"
|
||||||
|
X_DX_DESC := 0
|
||||||
|
.endif
|
||||||
|
.ifndef X_DX_AUTO_LOAD
|
||||||
|
.out .sprintf("Code ends at $%x, size $%x", X_DX_END, X_DX_SIZE)
|
||||||
|
.assert * < $b000, error, "Code is past $b000!"
|
||||||
|
.if * < $af00
|
||||||
|
.out "Consider moving code start to place end shortly before $b000"
|
||||||
|
.out .sprintf("Perhaps at $%x", ($b000-X_DX_SIZE)&$ff00)
|
||||||
|
.endif
|
||||||
|
.else
|
||||||
|
.out .sprintf("Auto load address, size $%x", X_DX_SIZE)
|
||||||
|
.endif
|
||||||
|
.endmacro
|
||||||
|
|
||||||
|
; *********
|
||||||
|
.endif
|
||||||
|
; *********
|
48
dmem.s
Normal file
48
dmem.s
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
; %help
|
||||||
|
; dmem -- Display davex dynamic memory info.
|
||||||
|
;
|
||||||
|
; syntax: dmem
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $01,$12,dx_cc_any,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Display DaveX dynamic memory info."
|
||||||
|
DX_main
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Dynamic memory available to external cmds:"
|
||||||
|
.byte $8d,$8d,00
|
||||||
|
ldx #mli_close ; free all
|
||||||
|
jsr xmmgr ; ask for it
|
||||||
|
; fall-through
|
||||||
|
.proc showfree
|
||||||
|
ldx #mli_read ; num free pages
|
||||||
|
jsr xmmgr ; ask for it
|
||||||
|
pha
|
||||||
|
tay
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " page"
|
||||||
|
.byte $00
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
lda #$00
|
||||||
|
jsr xplural
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " free"
|
||||||
|
.byte $8d
|
||||||
|
asc_hi "Lowest page: $"
|
||||||
|
.byte $00
|
||||||
|
ldx #mli_gfinfo ; lowest free page
|
||||||
|
jsr xmmgr
|
||||||
|
jsr $fdda ; prbyte
|
||||||
|
jsr xmess
|
||||||
|
.byte $8d,00
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
DX_end
|
214
idemu.s
Normal file
214
idemu.s
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
; %help
|
||||||
|
; idemu -- Identify emulator.
|
||||||
|
;
|
||||||
|
; syntax: idemu
|
||||||
|
;
|
||||||
|
; Uses official ways of detecting emulators if possible, otherwise uses the
|
||||||
|
; various idiosyncrasies that many emulators have regarding the ROM or I/O
|
||||||
|
; pages.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.p02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
temp0 = xczpage
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $02,$12,dx_cc_any,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Identify emulator."
|
||||||
|
DX_main
|
||||||
|
;rts
|
||||||
|
jsr idemu
|
||||||
|
; bcs noemu
|
||||||
|
stx temp0
|
||||||
|
jsr xprint_path
|
||||||
|
lda temp0
|
||||||
|
beq :+
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ", version "
|
||||||
|
.byte $00
|
||||||
|
lda temp0
|
||||||
|
jsr xprint_ver
|
||||||
|
: jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
rts
|
||||||
|
|
||||||
|
; identify emulator
|
||||||
|
; return cs if no emulator found
|
||||||
|
; return cc if one is found
|
||||||
|
; ay = name pointer (even for none), x = version (if nonzero)
|
||||||
|
.proc idemu
|
||||||
|
lda #$00
|
||||||
|
sta emuver
|
||||||
|
sec
|
||||||
|
jsr $fe1f
|
||||||
|
bcc doemub ; skip the BS if it claims to be a GS
|
||||||
|
; okay, let's check for some obvious things first
|
||||||
|
lda $fbb3
|
||||||
|
cmp #$06 ; Apple IIe or better
|
||||||
|
bne :+
|
||||||
|
lda $fbdd
|
||||||
|
cmp #$02 ; PDS card or IIe for classic MacOS
|
||||||
|
bne :+
|
||||||
|
lda $fbde
|
||||||
|
cmp #$40 ; IIe for classic MacOS
|
||||||
|
bne iiecard
|
||||||
|
ldy #<emIIe
|
||||||
|
lda #>emIIe
|
||||||
|
bne foundemu1
|
||||||
|
iiecard: lda $fbbe
|
||||||
|
sta emuver
|
||||||
|
ldy #<emPDS
|
||||||
|
lda #>emPDS
|
||||||
|
bne foundemu1
|
||||||
|
: jmp doemub ; fall back to emubyte
|
||||||
|
;
|
||||||
|
; Routine to handle emulator detected, but emubyte=$00
|
||||||
|
zeroid: sec
|
||||||
|
jsr $fe1f ; is GS?
|
||||||
|
bcs :+
|
||||||
|
ldy #<emGus ; assume Gus if GS and ID 0
|
||||||
|
lda #>emGus
|
||||||
|
bne foundemu1
|
||||||
|
; check for Virtual II
|
||||||
|
: ldy #$00
|
||||||
|
ldx #$10 ; loop to check for Virtual ][
|
||||||
|
viilp: lda $c04f
|
||||||
|
and #$b0
|
||||||
|
cmp #$b0 ; VII has mostly this here
|
||||||
|
bne :+
|
||||||
|
iny
|
||||||
|
: dex
|
||||||
|
bne viilp
|
||||||
|
cpy #$0d ; more than 14 $Bx?
|
||||||
|
bcc :+ ; nope
|
||||||
|
stx emuver ; zero version
|
||||||
|
ldy #<emVII
|
||||||
|
lda #>emVII
|
||||||
|
bne foundemu1
|
||||||
|
; check for Apple IIjs or jse
|
||||||
|
; which always have zeros from $c001-$c00f
|
||||||
|
: lda #$00
|
||||||
|
ldx #$0f
|
||||||
|
jslp: lda $c000,x
|
||||||
|
bne :+
|
||||||
|
dex
|
||||||
|
bne jslp
|
||||||
|
stx emuver
|
||||||
|
ldy #<emJS
|
||||||
|
lda #>emJS
|
||||||
|
bne foundemu1
|
||||||
|
: jmp unkemu
|
||||||
|
; Routine to identify by emubyte value if possible
|
||||||
|
doemub: jsr getemub
|
||||||
|
bne noemu
|
||||||
|
cmp #$00 ; yes this is needed
|
||||||
|
beq zeroid ; do zero identification
|
||||||
|
cmp #$ad ; Catakig always has this in $c04f
|
||||||
|
bne :+
|
||||||
|
lda #$00
|
||||||
|
sta emuver ; catakig doesn't have a version byte
|
||||||
|
ldy #<emCatak
|
||||||
|
lda #>emCatak
|
||||||
|
foundemu1:
|
||||||
|
jmp foundemu
|
||||||
|
: cmp #$fe ; Bernie
|
||||||
|
bne :+
|
||||||
|
ldy #<emBernie
|
||||||
|
lda #>emBernie
|
||||||
|
bne foundemu
|
||||||
|
: cmp #$16 ; Sweet 16
|
||||||
|
bne :+
|
||||||
|
ldy #<emS16
|
||||||
|
lda #>emS16
|
||||||
|
bne foundemu
|
||||||
|
: cmp #$47 ; GSport
|
||||||
|
bne :+
|
||||||
|
ldy #<emGSport
|
||||||
|
lda #>emGSport
|
||||||
|
bne foundemu
|
||||||
|
: cmp #$4b ; KEGS
|
||||||
|
bne :+
|
||||||
|
ldy #<emKEGS
|
||||||
|
lda #>emKEGS
|
||||||
|
bne foundemu
|
||||||
|
: cmp #$ab ; AppleBlossom
|
||||||
|
bne :+
|
||||||
|
ldy #<emAB
|
||||||
|
lda #>emAB
|
||||||
|
bne foundemu
|
||||||
|
: ; well, ID byte didn't match a known emu
|
||||||
|
; but we don't have floating bus at $c04f
|
||||||
|
; so it must be an emulator
|
||||||
|
unkemu: lda emubyte
|
||||||
|
jsr setemub
|
||||||
|
ldy #<emUnk
|
||||||
|
lda #>emUnk
|
||||||
|
foundemu: ldx emuver
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
noemu: ldy #<emNone
|
||||||
|
lda #>emNone
|
||||||
|
ldx #$00
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
|
||||||
|
; get emubyte and version if possible
|
||||||
|
; returns with z clear if floating bus found instead
|
||||||
|
; if z set, a has emubute and y has emuver
|
||||||
|
; which are also saved in memory
|
||||||
|
getemub: sta $c04f ; de-facto standard among IIgs emulators
|
||||||
|
lda $c04f ; program ID
|
||||||
|
ldy $c04f ; version
|
||||||
|
sta emubyte
|
||||||
|
sty emuver
|
||||||
|
ldx #$ff ; now check ID again 255 times
|
||||||
|
: sta $c04f
|
||||||
|
lda $c04f
|
||||||
|
cmp emubyte ; floating bus gonna float
|
||||||
|
bne :+ ; and if it does, we gotta nope
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
: rts
|
||||||
|
; set emubyte in unknown entry, enter with a = emubyte
|
||||||
|
setemub: sed ; decimal mode trick for hex->ascii
|
||||||
|
tax ; save it
|
||||||
|
and #$0f ; low nibble
|
||||||
|
cmp #$0a
|
||||||
|
adc #$30
|
||||||
|
ora #$80 ; to Apple II
|
||||||
|
sta unkemub+1
|
||||||
|
txa
|
||||||
|
lsr ; high nibble
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
cmp #$0a
|
||||||
|
adc #$30
|
||||||
|
ora #$80
|
||||||
|
sta unkemub
|
||||||
|
cld
|
||||||
|
rts
|
||||||
|
; ***
|
||||||
|
emubyte: .byte $00
|
||||||
|
emuver: .byte $00
|
||||||
|
; ***
|
||||||
|
emNone: pstr_hi "None identified"
|
||||||
|
emUnk: pstr_hi "Unknown, emubyte = $XX"
|
||||||
|
unkemub = *-2
|
||||||
|
emPDS: pstr_hi "Apple IIe Card"
|
||||||
|
emVII: pstr_hi "Virtual ]["
|
||||||
|
emIIe: pstr_hi "IIe"
|
||||||
|
emGus: pstr_hi "Gus (probably)"
|
||||||
|
emCatak: pstr_hi "Catakig"
|
||||||
|
emBernie: pstr_hi "Bernie ][ the Rescue"
|
||||||
|
emS16: pstr_hi "Sweet 16"
|
||||||
|
emGSport: pstr_hi "GSport"
|
||||||
|
emKEGS: pstr_hi "KEGS"
|
||||||
|
emAB: pstr_hi "AppleBlossom"
|
||||||
|
emJS: pstr_hi "Apple IIjs or jse"
|
||||||
|
.endproc
|
||||||
|
|
||||||
|
DX_end
|
163
iie.card.s
Normal file
163
iie.card.s
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
; %help
|
||||||
|
; iie.card -- Display info about or control the Apple //e Card for Mac LC.
|
||||||
|
;
|
||||||
|
; options:
|
||||||
|
; -s <num> Set speed, 0 = normal (1 MHz), 1 = fast (1.9 MHz),
|
||||||
|
; anything else = option panel speed
|
||||||
|
; -x Show experimental info, uses undocumented features.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
curspeed = xczpage
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $01,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_parm 's',t_int1 ; set speed (0 = normal, 1 = fast, others = default)
|
||||||
|
DX_parm 'x',t_nil ; experimental info
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Control Apple //e LC PDS Card."
|
||||||
|
DX_main
|
||||||
|
; davex has already identified the machine as a //e or IIgs
|
||||||
|
sec
|
||||||
|
jsr checkmach ; see if IIgs
|
||||||
|
bcs :+ ; not a IIgs
|
||||||
|
badiie: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "This program requires the Apple //e Card for Macintosh LC!"
|
||||||
|
.byte $8d,$00
|
||||||
|
exiterr: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
jmp xerr
|
||||||
|
: lda $fbc0 ; check for enhanced monitor
|
||||||
|
cmp #$e0 ; $e0 = enhanced
|
||||||
|
bne badiie
|
||||||
|
lda $fbdd ; //e Card ID byte
|
||||||
|
cmp #$02
|
||||||
|
bne badiie
|
||||||
|
lda #'s'|$80 ; set speed?
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs doinfo
|
||||||
|
jsr setspeed
|
||||||
|
jmp dispspeed
|
||||||
|
doinfo: jsr dispinfo
|
||||||
|
lda #'x'|$80 ; experimental?
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs :+
|
||||||
|
jsr dispslot
|
||||||
|
: jsr dispspeed
|
||||||
|
rts
|
||||||
|
.proc dispinfo
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Card revision: "
|
||||||
|
.byte $00
|
||||||
|
ldy $fbbe
|
||||||
|
iny
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
.proc dispspeed
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "CPU speed: "
|
||||||
|
.byte $00
|
||||||
|
lda $c02b
|
||||||
|
and #%00000100 ; bit 2 = CPU speed
|
||||||
|
sta curspeed
|
||||||
|
jsr speedmsg
|
||||||
|
lda $c05c
|
||||||
|
and #%00000100 ; bit 2 = option panel speed
|
||||||
|
cmp curspeed
|
||||||
|
beq done
|
||||||
|
pha
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " (option panel: "
|
||||||
|
.byte $00
|
||||||
|
pla
|
||||||
|
jsr speedmsg
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ")"
|
||||||
|
.byte $00
|
||||||
|
done: jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
.proc speedmsg
|
||||||
|
bne fast
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "normal"
|
||||||
|
.byte $00
|
||||||
|
rts
|
||||||
|
fast: jsr xmess
|
||||||
|
asc_hi "fast"
|
||||||
|
.byte $00
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
.proc setspeed
|
||||||
|
cpy #$00
|
||||||
|
beq norm ; set normal
|
||||||
|
dey
|
||||||
|
beq fast
|
||||||
|
lda $c05c
|
||||||
|
and #%00000100 ; bit 2 = option panel speed
|
||||||
|
beq norm
|
||||||
|
fast: lda #%00000100
|
||||||
|
ora $c02b
|
||||||
|
store: sta $c02b
|
||||||
|
rts
|
||||||
|
norm: lda #%11111011
|
||||||
|
and $c02b
|
||||||
|
bra store
|
||||||
|
.endproc
|
||||||
|
.proc dispslot
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Startup slot: "
|
||||||
|
.byte $00
|
||||||
|
.byte $02,$02 ; magic trick 1
|
||||||
|
cmp #$c8
|
||||||
|
beq chkscan
|
||||||
|
prslot: and #$0f
|
||||||
|
tay
|
||||||
|
dey
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
done: jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
rts
|
||||||
|
chkscan: lda #$c6 ; see if slot 7 is picked, less likely than scan
|
||||||
|
.byte $02,$03 ; magic trick 2, introduces a visual anomaly if slot 7
|
||||||
|
bne prscan
|
||||||
|
; the following is to fix the screen up after it prints
|
||||||
|
; "UNABLE TO BOOT FROM STARTUP SLOT"
|
||||||
|
; if slot 7 is selected.
|
||||||
|
lda $28 ; save BASL
|
||||||
|
pha
|
||||||
|
lda $29 ; save BASH
|
||||||
|
pha
|
||||||
|
ldx #23 ; row 23
|
||||||
|
: txa
|
||||||
|
jsr $fbc1 ; bascalc, preserves x
|
||||||
|
ldy #39
|
||||||
|
: lda ($28),y ; read char from screen via BASL/BASH
|
||||||
|
sta ($28),y ; write back, clearing message
|
||||||
|
dey
|
||||||
|
bpl :- ; if line not done
|
||||||
|
dex
|
||||||
|
bpl :-- ; if screen not done
|
||||||
|
pla
|
||||||
|
sta $29 ; restore BASH
|
||||||
|
pla
|
||||||
|
sta $28 ; restore BASL
|
||||||
|
lda #$c8 ; slot 7+1
|
||||||
|
bne prslot
|
||||||
|
prscan: jsr xmess
|
||||||
|
asc_hi "scan"
|
||||||
|
.byte $00
|
||||||
|
bra done
|
||||||
|
.endproc
|
||||||
|
DX_end
|
312
mig.insp.s
Normal file
312
mig.insp.s
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
; %help
|
||||||
|
; mig.insp -- MIG Inspector by M.G., davex version
|
||||||
|
;
|
||||||
|
; Displays the MIG RAM from the Apple IIc Plus this is used by the 3.5 drive
|
||||||
|
; firmware and the accelerator.
|
||||||
|
;
|
||||||
|
; When run, 4 pages of the MIG RAM are displayed at a time. If a dynamic
|
||||||
|
; buffer is allocated, its address is placed on the screen in the lower-right
|
||||||
|
; corner.
|
||||||
|
;
|
||||||
|
; Keys:
|
||||||
|
; Arrows - change pages in view
|
||||||
|
; 0 - 9 - jump to page n*7, 0 = page 0, 9 = page 63
|
||||||
|
; ESC - quit
|
||||||
|
; ~ - Jump to page 0 and copy all 2K of the MIG to the buffer, if it's big
|
||||||
|
; enough. Beeps if not.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
; Technical:
|
||||||
|
|
||||||
|
; The MIG is briefly mentioned in the Apple IIc
|
||||||
|
; Techincal Reference 2nd Edition. It gives the
|
||||||
|
; pinouts of the chip and general function description
|
||||||
|
; but not the level of detail we are used to for Apple
|
||||||
|
; II technical manuals.
|
||||||
|
|
||||||
|
; I wanted to see what was behind the smoke and mirrors.
|
||||||
|
|
||||||
|
; The MIG RAM is a 2K SRAM that is accessed through
|
||||||
|
; a small window from $CE00-$CFFF (and $DE00-$DFFF)
|
||||||
|
; when the alternate firmware bank is active.
|
||||||
|
|
||||||
|
; 32 bytes of MIG RAM are accessed in 64 pages, with
|
||||||
|
; $CEA0 resetting to page 0, and $CE20 incrementing it
|
||||||
|
|
||||||
|
; All but page 2 is used by the 3.5 code. Page 2 is
|
||||||
|
; used by the accelerator code.
|
||||||
|
|
||||||
|
; Other locations in the MIG window are likely used to
|
||||||
|
; control the 3.5 drive control signals that the MIG
|
||||||
|
; outputs.
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.code
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
; build options
|
||||||
|
SKIPROMID = 1 ; skip ROM identification
|
||||||
|
; lets you use on a non-
|
||||||
|
; IIc Plus, but obviously
|
||||||
|
; isn't useful beyond some
|
||||||
|
; testing purposes
|
||||||
|
|
||||||
|
; Our authorized zero page storage
|
||||||
|
BufFlag = xczpage ; if $FF, have big buffer
|
||||||
|
BufLoc = BufFlag+1
|
||||||
|
BufPtr = BufLoc+2
|
||||||
|
MigPage = BufPtr+2
|
||||||
|
|
||||||
|
; entry points
|
||||||
|
COut1 = $fdf0
|
||||||
|
TabV = $fb5b
|
||||||
|
PrByte = $fdda
|
||||||
|
Home = $fc58
|
||||||
|
VTab = $fc22
|
||||||
|
;KeyIn = $fd1b ; do not use for davex
|
||||||
|
PrntAX = $f941
|
||||||
|
|
||||||
|
; locs
|
||||||
|
CH = $24
|
||||||
|
CV = $25
|
||||||
|
AltBuffer = filebuff3 ; if we can't get big buffer
|
||||||
|
ROMBank = $c028
|
||||||
|
MigBase = $ce00
|
||||||
|
MigRAM = MigBase
|
||||||
|
MigPage0 = MigBase+$A0
|
||||||
|
MigPageI = MigBase+$20
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
.if SKIPROMID
|
||||||
|
DX_info $01,$12,dx_cc_any|dx_cc_40col,$00
|
||||||
|
.else
|
||||||
|
DX_info $01,$12,dx_cc_iic|dx_cc_40col,$00
|
||||||
|
.endif
|
||||||
|
DX_ptab
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Display MIG RAM."
|
||||||
|
DX_main
|
||||||
|
|
||||||
|
cld
|
||||||
|
.if SKIPROMID
|
||||||
|
bra init
|
||||||
|
.else
|
||||||
|
lda $fbbf ; davex says it's a //c already
|
||||||
|
cmp #$05 ; but is it a IIc Plus?
|
||||||
|
beq init ; all good!
|
||||||
|
lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Requires a IIc Plus!"
|
||||||
|
.byte $00
|
||||||
|
.endif
|
||||||
|
exiterr: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
jmp xerr
|
||||||
|
init: stz MigPage
|
||||||
|
stz BufFlag
|
||||||
|
lda #<AltBuffer
|
||||||
|
sta BufLoc
|
||||||
|
lda #>AltBuffer
|
||||||
|
sta BufLoc+1
|
||||||
|
ldx #mli_read
|
||||||
|
jsr xmmgr
|
||||||
|
cmp #$08 ; 8 pages available?
|
||||||
|
bcc :+ ; nope
|
||||||
|
lda #$08
|
||||||
|
ldx #mli_open
|
||||||
|
jsr xmmgr
|
||||||
|
bcs :+ ; shouldn't happen
|
||||||
|
stz BufLoc
|
||||||
|
sta BufLoc+1
|
||||||
|
dec BufFlag ; flag it
|
||||||
|
: ; moving on...
|
||||||
|
; davex does the below for us
|
||||||
|
;lda #$91
|
||||||
|
;jsr COut1 ; go to 40 cols if 80 col firmware active
|
||||||
|
jsr Home
|
||||||
|
lda #21
|
||||||
|
jsr TabV
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Arrows=Page, 0-9=Jump, ESC=Quit"
|
||||||
|
.byte $8d,$8d
|
||||||
|
asc_hi "MIG Inspector by M.G. 08/30/2017 "
|
||||||
|
.byte $00
|
||||||
|
bit BufFlag
|
||||||
|
bpl dispmig ; Don't print addr if using AltBuffer
|
||||||
|
lda #'@'|$80
|
||||||
|
jsr COut1
|
||||||
|
ldx BufLoc ; display buffer location
|
||||||
|
lda BufLoc+1
|
||||||
|
jsr PrntAX
|
||||||
|
dispmig: jsr get4mig ; 4 mig pages to buffer
|
||||||
|
jsr d4page
|
||||||
|
uinput: lda #' '+$80
|
||||||
|
jsr xrdkey ; davex read key
|
||||||
|
cmp #$8b ; up arrow
|
||||||
|
beq goup
|
||||||
|
cmp #$8a ; down arrow
|
||||||
|
beq godn
|
||||||
|
cmp #$88 ; left arrow
|
||||||
|
bne :+
|
||||||
|
goup: dec MigPage
|
||||||
|
bra dispmig
|
||||||
|
: cmp #$95 ; right arrow
|
||||||
|
bne :+
|
||||||
|
godn: inc MigPage
|
||||||
|
bra dispmig
|
||||||
|
: cmp #'~'+$80 ; tilde - git all MIG RAM to buffer, maybe
|
||||||
|
bne :+
|
||||||
|
jsr getallmig
|
||||||
|
bra dispmig
|
||||||
|
: cmp #$9b ; escape
|
||||||
|
bne jump
|
||||||
|
rts
|
||||||
|
jump: sbc #$b0 ; check for digit for page jump
|
||||||
|
bmi uinput ; nope
|
||||||
|
cmp #10 ; 10 or bigger?
|
||||||
|
bcs uinput ; also nope
|
||||||
|
sta MigPage ; compute digit * 7
|
||||||
|
asl ; * 2
|
||||||
|
asl ; * 4
|
||||||
|
asl ; * 8
|
||||||
|
sec
|
||||||
|
sbc MigPage ; * 7
|
||||||
|
sta MigPage
|
||||||
|
bra dispmig
|
||||||
|
; display 4 MIG pages on screen
|
||||||
|
.proc d4page
|
||||||
|
jsr rsetbptr
|
||||||
|
lda #$00
|
||||||
|
jsr TabV
|
||||||
|
ldx #$00
|
||||||
|
: stz CH
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc MigPage
|
||||||
|
and #$3f
|
||||||
|
jsr PrByte
|
||||||
|
lda #':'+$80
|
||||||
|
jsr COut1
|
||||||
|
jsr d4line
|
||||||
|
inc CV
|
||||||
|
jsr VTab
|
||||||
|
inx
|
||||||
|
cpx #$04
|
||||||
|
bne :-
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; display 4 lines at BufPtr, inc bufptr as we go
|
||||||
|
; assume CV is where we want it to be
|
||||||
|
.proc d4line
|
||||||
|
phx
|
||||||
|
ldx #$03
|
||||||
|
: jsr dline
|
||||||
|
inc CV
|
||||||
|
jsr VTab
|
||||||
|
lda #$08
|
||||||
|
jsr addbptr
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
plx
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; display 1 line at BufPtr
|
||||||
|
.proc dline
|
||||||
|
lda #4
|
||||||
|
sta CH
|
||||||
|
ldy #$00 ; start hex display
|
||||||
|
: lda (BufPtr),y
|
||||||
|
jsr PrByte
|
||||||
|
lda #' '+$80
|
||||||
|
jsr COut1
|
||||||
|
iny
|
||||||
|
cpy #$08 ; done?
|
||||||
|
bne :- ; nope, next hex
|
||||||
|
ldy #$00 ; start ASCII display
|
||||||
|
: lda (BufPtr),y
|
||||||
|
ora #$80
|
||||||
|
cmp #' '+$80 ; space
|
||||||
|
bcs :+ ; if not ctrl char
|
||||||
|
lda #'.'+$80 ; if so, use dot
|
||||||
|
: jsr COut1
|
||||||
|
iny
|
||||||
|
cpy #$08 ; done?
|
||||||
|
bne :-- ; nope, next ASCII
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; reset buffer BufPtr
|
||||||
|
.proc rsetbptr
|
||||||
|
pha
|
||||||
|
lda BufLoc
|
||||||
|
sta BufPtr
|
||||||
|
lda BufLoc+1
|
||||||
|
sta BufPtr+1
|
||||||
|
pla
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; add A to buffer BufPtr
|
||||||
|
.proc addbptr
|
||||||
|
clc
|
||||||
|
adc BufPtr
|
||||||
|
bcc done
|
||||||
|
inc BufPtr+1
|
||||||
|
done: sta BufPtr
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; copy all mig pages (2048 bytes) to (bufptr)
|
||||||
|
.proc getallmig
|
||||||
|
bit BufFlag
|
||||||
|
bmi :+
|
||||||
|
jsr xbell
|
||||||
|
rts
|
||||||
|
: stz MigPage
|
||||||
|
ldx #$3f
|
||||||
|
bra getxmig
|
||||||
|
.endproc
|
||||||
|
; copy 4 mig pages (128 bytes) to (bufptr)
|
||||||
|
.proc get4mig
|
||||||
|
ldx #$03
|
||||||
|
; fall through
|
||||||
|
.endproc
|
||||||
|
; copy x mig pages (x*32 bytes) to (bufptr)
|
||||||
|
.proc getxmig
|
||||||
|
lda MigPage
|
||||||
|
and #$3f ; enforce range
|
||||||
|
sta MigPage
|
||||||
|
sta ROMBank ; mig only visible when alt ROM switched in
|
||||||
|
jsr setmigpg
|
||||||
|
jsr rsetbptr
|
||||||
|
: jsr copymig
|
||||||
|
lda #$20
|
||||||
|
jsr addbptr ; next buffer segment
|
||||||
|
bit MigPageI ; next MIG page
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
sta ROMBank
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; copy one mig page (32 bytes) to (bufptr)
|
||||||
|
.proc copymig
|
||||||
|
phy
|
||||||
|
ldy #$1f
|
||||||
|
: lda MigRAM,y
|
||||||
|
sta (BufPtr),y
|
||||||
|
dey
|
||||||
|
bpl :-
|
||||||
|
ply
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; set MIG page
|
||||||
|
.proc setmigpg
|
||||||
|
phx
|
||||||
|
bit MigPage0
|
||||||
|
ldx MigPage
|
||||||
|
beq done
|
||||||
|
: bit MigPageI
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
done: plx
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
DX_end
|
426
nbp.lookup.s
Normal file
426
nbp.lookup.s
Normal file
@ -0,0 +1,426 @@
|
|||||||
|
; %help
|
||||||
|
; nbp.lookup [nbp-name]
|
||||||
|
;
|
||||||
|
; Perform NBP lookups.
|
||||||
|
;
|
||||||
|
; options:
|
||||||
|
; nbp-name Optional, name or partial name to lookup.
|
||||||
|
;
|
||||||
|
; -v Verbose mode, prints query and zone
|
||||||
|
; info.
|
||||||
|
;
|
||||||
|
; Returns a list of addresses and associated NBP entries.
|
||||||
|
; or "No results." if none found.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.pc02 ; appletalk requires it anyway
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
ch = $24 ; cursor horizontal pos
|
||||||
|
|
||||||
|
sptr = xczpage
|
||||||
|
sptr2 = sptr+2
|
||||||
|
stemp = sptr2+2
|
||||||
|
verbose = stemp+1 ; flag to show zone
|
||||||
|
|
||||||
|
zonebuf = filebuff2 ; for local zone name
|
||||||
|
namebuf = zonebuf+$0100 ; for building NBP name for lookup req
|
||||||
|
altbuf = filebuff3 ; used if no dynamic mem avail
|
||||||
|
altbufsz = $04 ; pages
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $02,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_parm $00,t_string ; name
|
||||||
|
DX_parm 'v',t_nil ; verbose
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Perform AppleTalk NBP lookups."
|
||||||
|
DX_main
|
||||||
|
cli ; appletalk requires interrupts
|
||||||
|
ATcall inforeq
|
||||||
|
bcc :+
|
||||||
|
jmp noatalk ; commented for debug
|
||||||
|
: jsr getatbuf ; allocate buffer
|
||||||
|
sta bufp+1
|
||||||
|
sty bufp
|
||||||
|
stx buflen+1
|
||||||
|
; process command line parms
|
||||||
|
stz verbose
|
||||||
|
lda #'v'|$80 ; verbose
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs :+
|
||||||
|
inc verbose
|
||||||
|
: lda #<namebuf
|
||||||
|
sta sptr
|
||||||
|
lda #>namebuf
|
||||||
|
sta sptr+1
|
||||||
|
; get name
|
||||||
|
lda #$00
|
||||||
|
jsr xgetparm_n
|
||||||
|
ldx #$80 ; name, return wildcard if not given
|
||||||
|
jsr get_nbp
|
||||||
|
bcs badnbp1
|
||||||
|
inx
|
||||||
|
txa
|
||||||
|
jsr addsptr
|
||||||
|
; get type
|
||||||
|
lda #$00
|
||||||
|
jsr xgetparm_n
|
||||||
|
ldx #$81 ; type, return wildcard if not given
|
||||||
|
jsr get_nbp
|
||||||
|
badnbp1: bcs badnbp
|
||||||
|
inx
|
||||||
|
txa
|
||||||
|
jsr addsptr
|
||||||
|
; get zone
|
||||||
|
lda #$00
|
||||||
|
jsr xgetparm_n
|
||||||
|
ldx #$82 ; type, return * if not given
|
||||||
|
jsr get_nbp
|
||||||
|
bcs badnbp
|
||||||
|
; sptr points at where we put the zone
|
||||||
|
ldy #$01
|
||||||
|
lda (sptr),y
|
||||||
|
cmp #'*' ; were we given it?
|
||||||
|
bne doit
|
||||||
|
; get local zone if possible
|
||||||
|
ATcall myzone
|
||||||
|
bcs doit ; error, just stick with what we got
|
||||||
|
lda zonebuf ; if none
|
||||||
|
beq doit ; attempt with default value
|
||||||
|
ldx #<zonebuf ; copy returned zone in place of what we have
|
||||||
|
lda #>zonebuf
|
||||||
|
ldy #$00
|
||||||
|
jsr copystr
|
||||||
|
; now we have a complete name to look up
|
||||||
|
; rts ; DEBUG
|
||||||
|
doit: lda #<namebuf
|
||||||
|
sta sptr
|
||||||
|
lda #>namebuf
|
||||||
|
sta sptr+1
|
||||||
|
lda verbose
|
||||||
|
beq :+ ; don't print unless verbose
|
||||||
|
jsr prnbptup
|
||||||
|
jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
: ATcall lkupreq
|
||||||
|
bcc :+
|
||||||
|
jmp error ; TODO: check for buffer overflow and display what we get
|
||||||
|
: lda matches
|
||||||
|
bne :+
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "No results."
|
||||||
|
.byte $8d,$00
|
||||||
|
rts
|
||||||
|
: lda bufp+1 ; set up pointer to response buffer
|
||||||
|
sta sptr+1
|
||||||
|
lda bufp
|
||||||
|
sta sptr
|
||||||
|
prent: ;lda #$00 ; this and next 2 debugging
|
||||||
|
;ldy matches
|
||||||
|
;jsr xprdec_2
|
||||||
|
jsr prnbpent
|
||||||
|
jsr xcheck_wait
|
||||||
|
bcs :+ ; if user pressed escape
|
||||||
|
dec matches
|
||||||
|
bne prent
|
||||||
|
: rts
|
||||||
|
badnbp: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Bad name."
|
||||||
|
.byte $00
|
||||||
|
bra exiterr
|
||||||
|
noatalk: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "AppleTalk offline!"
|
||||||
|
.byte $00
|
||||||
|
exiterr: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
error: jmp xerr
|
||||||
|
;
|
||||||
|
; ***
|
||||||
|
; get_nbp - get part of a name at ay and copy to sptr
|
||||||
|
; x = 0:name 1:type 2:zone, +$80 sub wildcard or default if none given
|
||||||
|
; return: (sptr) = string, x = length of it
|
||||||
|
.proc get_nbp
|
||||||
|
sty sptr2
|
||||||
|
sta sptr2+1
|
||||||
|
stx stemp
|
||||||
|
ldy #$00
|
||||||
|
sty colon ; init these
|
||||||
|
sty at
|
||||||
|
lda sptr ; copy sptr to self-modifying wrtdest
|
||||||
|
sta wrtdest+1
|
||||||
|
lda sptr+1
|
||||||
|
sta wrtdest+2
|
||||||
|
jsr incdest ; and move to first char position
|
||||||
|
lda (sptr2),y ; length
|
||||||
|
beq notfound ; zero, just give up
|
||||||
|
sta end
|
||||||
|
; find the delimiters
|
||||||
|
tay
|
||||||
|
: lda (sptr2),y
|
||||||
|
cmp #':'
|
||||||
|
bne notcolon
|
||||||
|
sty colon
|
||||||
|
notcolon: cmp #'@'
|
||||||
|
bne nxtdelim
|
||||||
|
sty at
|
||||||
|
nxtdelim: dey
|
||||||
|
bne :-
|
||||||
|
; now make sure that if @ is given, it is after :
|
||||||
|
lda at
|
||||||
|
beq :+
|
||||||
|
cmp colon
|
||||||
|
bcc bad
|
||||||
|
; now get the part requested
|
||||||
|
: lda stemp
|
||||||
|
and #$7f
|
||||||
|
beq getname
|
||||||
|
cmp #$01
|
||||||
|
beq gettype
|
||||||
|
getzone: ldy at
|
||||||
|
beq notfound
|
||||||
|
cpy end
|
||||||
|
beq notfound
|
||||||
|
; need to copy from at(+1) to end
|
||||||
|
docopy: ldx #$00
|
||||||
|
: iny
|
||||||
|
lda (sptr2),y
|
||||||
|
jsr wrtdest
|
||||||
|
cpy end ; was that the last char
|
||||||
|
bcc :- ; nope, next char
|
||||||
|
ldy #$00
|
||||||
|
txa
|
||||||
|
sta (sptr),y ; save copied length
|
||||||
|
clc
|
||||||
|
rts ; and return
|
||||||
|
getname: ldy colon
|
||||||
|
bne :+
|
||||||
|
ldy at
|
||||||
|
beq :++
|
||||||
|
: dey
|
||||||
|
sty end
|
||||||
|
: ldy end
|
||||||
|
beq notfound
|
||||||
|
ldy #$00 ; initially at pos 0
|
||||||
|
; need to copy from pos 1 to end
|
||||||
|
beq docopy ; always
|
||||||
|
gettype: ldy colon
|
||||||
|
beq notfound ; early out if no colon
|
||||||
|
cpy end
|
||||||
|
beq notfound
|
||||||
|
ldy at
|
||||||
|
beq :+ ; use end as-is
|
||||||
|
dey ; otherwise end at pos before @
|
||||||
|
sty end
|
||||||
|
: ldy colon
|
||||||
|
; need to copy from colon(+1) to end
|
||||||
|
bne docopy ; should be always
|
||||||
|
notfound: lda stemp
|
||||||
|
and #$80
|
||||||
|
bne :+ ; if client asked for a default
|
||||||
|
lda #$00
|
||||||
|
tay
|
||||||
|
tax ; x is officially length of string result
|
||||||
|
sta (sptr),y ; put a zero in destination
|
||||||
|
bad: sec ; tell client we gave an empty string
|
||||||
|
rts
|
||||||
|
: ldx #$01 ; length of default
|
||||||
|
ldy #$00
|
||||||
|
txa
|
||||||
|
sta (sptr),y
|
||||||
|
iny
|
||||||
|
lda stemp
|
||||||
|
cmp #$82 ; want default zone? ('*')
|
||||||
|
bne :++ ; nope
|
||||||
|
lda #'*'
|
||||||
|
: sta (sptr),y
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
: lda #'=' ; wildcard for name or type
|
||||||
|
bne :-- ; always
|
||||||
|
wrtdest: sta $ffff
|
||||||
|
inx ; inc count of copied chars
|
||||||
|
incdest: inc wrtdest+1
|
||||||
|
bne :+
|
||||||
|
inc wrtdest+2
|
||||||
|
: rts
|
||||||
|
colon: .byte $00
|
||||||
|
at: .byte $00
|
||||||
|
end: .byte $00
|
||||||
|
.endproc
|
||||||
|
; print an NBP entry at sptr
|
||||||
|
.proc prnbpent
|
||||||
|
ldy #$00 ; offset into entry, net number low byte
|
||||||
|
lda (sptr),y ; big end of network num
|
||||||
|
pha
|
||||||
|
iny
|
||||||
|
lda (sptr),y
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "."
|
||||||
|
.byte $00
|
||||||
|
; print node
|
||||||
|
ldy #$02
|
||||||
|
lda (sptr),y
|
||||||
|
tay
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ":"
|
||||||
|
.byte $00
|
||||||
|
; print socket
|
||||||
|
ldy #$03
|
||||||
|
lda (sptr),y
|
||||||
|
tay
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " " ; print space in case output is not to screen.
|
||||||
|
.byte $00
|
||||||
|
lda #20 ; Position NBP tuple on screen.
|
||||||
|
sta ch
|
||||||
|
lda #$05 ; offset to NBP tuple
|
||||||
|
jsr addsptr
|
||||||
|
jsr prnbptup
|
||||||
|
jsr xmess ; CR
|
||||||
|
.byte $8d,$00
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; print an NBP tuple at sptr
|
||||||
|
; leave sptr at byte just after tuple
|
||||||
|
.proc prnbptup
|
||||||
|
; print name
|
||||||
|
jsr prpas
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ":"
|
||||||
|
.byte $00
|
||||||
|
; print type
|
||||||
|
jsr prpas
|
||||||
|
lda verbose
|
||||||
|
beq skipzone ; if not verbose, don't display @zone
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "@"
|
||||||
|
.byte $00
|
||||||
|
; print zone
|
||||||
|
jsr prpas
|
||||||
|
bra :+
|
||||||
|
skipzone: ldy #$00
|
||||||
|
lda (sptr),y ; get length of zone name
|
||||||
|
inc a ; account for length byte
|
||||||
|
jsr addsptr ; and skip the lot
|
||||||
|
: rts ; done
|
||||||
|
.endproc
|
||||||
|
; increment sptr by a
|
||||||
|
.proc addsptr
|
||||||
|
clc
|
||||||
|
adc sptr
|
||||||
|
sta sptr
|
||||||
|
bcc :+
|
||||||
|
inc sptr+1
|
||||||
|
: rts
|
||||||
|
.endproc
|
||||||
|
; print pascal string at sptr
|
||||||
|
; leave sptr pointed at one past end
|
||||||
|
; of string
|
||||||
|
.proc prpas
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr),y ; get length
|
||||||
|
tax
|
||||||
|
next: lda #$01
|
||||||
|
jsr addsptr
|
||||||
|
dex
|
||||||
|
bpl :+
|
||||||
|
rts
|
||||||
|
: lda (sptr),y ; get char
|
||||||
|
ora #$80 ; make printable
|
||||||
|
jsr cout
|
||||||
|
bra next
|
||||||
|
.endproc
|
||||||
|
; copy a pascal string to sptr offset by y
|
||||||
|
; a,x = source
|
||||||
|
; return: y = new offset after copied str
|
||||||
|
.proc copystr
|
||||||
|
sta sptr2+1
|
||||||
|
stx sptr2
|
||||||
|
sty stemp ; save offset
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr2),y ; get number of chars
|
||||||
|
tax ; to copy
|
||||||
|
ldy stemp ; get the offset
|
||||||
|
sta (sptr),y ; store the length byte
|
||||||
|
inc stemp ; increment the offset
|
||||||
|
inc sptr2 ; next source char
|
||||||
|
bne :+
|
||||||
|
inc sptr2+1
|
||||||
|
: ldy #0
|
||||||
|
; copy loop
|
||||||
|
: phy
|
||||||
|
lda (sptr2),y
|
||||||
|
ldy stemp
|
||||||
|
sta (sptr),y
|
||||||
|
inc stemp
|
||||||
|
ply
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
ldy stemp
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; allocate a big buffer for appletalk operations
|
||||||
|
; returns ay = start, x = size in pages
|
||||||
|
; tries to use dynamic mem for operations
|
||||||
|
; otherwise returns altbuf, which should usually
|
||||||
|
; be one of the file buffers.
|
||||||
|
.proc getatbuf
|
||||||
|
ldx #mli_read
|
||||||
|
jsr xmmgr
|
||||||
|
bcs usealt
|
||||||
|
cmp #altbufsz
|
||||||
|
bcc usealt
|
||||||
|
sta tmp ; save num pages
|
||||||
|
ldx #mli_open
|
||||||
|
jsr xmmgr ; allocate all
|
||||||
|
bcc usealt ; if error
|
||||||
|
ldx tmp ; get num pages
|
||||||
|
ldy #$00 ; always on page boundary
|
||||||
|
rts
|
||||||
|
usealt: ldy #<altbuf
|
||||||
|
lda #>altbuf
|
||||||
|
ldx altbufsz
|
||||||
|
rts
|
||||||
|
tmp: .byte $00
|
||||||
|
.endproc
|
||||||
|
;
|
||||||
|
inforeq: .byte 0,2 ; sync GetInfo
|
||||||
|
.word $0000 ; result code
|
||||||
|
.dword $00000000 ; completion address
|
||||||
|
thisnet: .word $0000 ; this network #
|
||||||
|
abridge: .byte $00 ; local bridge
|
||||||
|
hwid: .byte $00 ; hardware ID, IIgs only
|
||||||
|
romver: .word $00 ; ROM version, IIgs only
|
||||||
|
nodenum: .byte $00 ; node number
|
||||||
|
;
|
||||||
|
myzone: .byte 0,$1a ; sync GetMyZone
|
||||||
|
.word $0000 ; result
|
||||||
|
.dword $00000000 ; completion
|
||||||
|
.dword zonebuf ; buffer, needs at least 33 bytes
|
||||||
|
.byte 4,4 ; 4 times every 1 sec
|
||||||
|
.word $0000 ; reserved
|
||||||
|
;
|
||||||
|
lkupreq: .byte 0,$10 ; sync LookupName
|
||||||
|
.word $0000 ; result
|
||||||
|
.dword $00000000 ; completion
|
||||||
|
.dword namebuf ; name pointer
|
||||||
|
.byte 4,4 ; 4 times every 1 sec
|
||||||
|
.word $0000 ; reserved
|
||||||
|
buflen: .word $0000 ; buffer length
|
||||||
|
bufp: .dword $00000000 ; buffer pointer
|
||||||
|
.byte $ff ; max # matches
|
||||||
|
matches: .byte $00 ; actual matches
|
||||||
|
DX_end
|
235
nbp.parse.s
Normal file
235
nbp.parse.s
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
; %help
|
||||||
|
; nbp.parse <name> - parse and output parts of NBP <name>
|
||||||
|
;
|
||||||
|
; options: -s Substitute defaults for unspecified portions.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
ch = $24 ; cursor horizontal pos
|
||||||
|
|
||||||
|
sptr = xczpage
|
||||||
|
sptr2 = sptr+2
|
||||||
|
stemp = sptr2+2
|
||||||
|
mode = stemp+1
|
||||||
|
|
||||||
|
namebuf = filebuff2
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin
|
||||||
|
DX_info $01,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_parm $00,t_string ; NBP name to parse
|
||||||
|
DX_parm 's',t_nil ; if given, sub defaults
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Parse AppleTalk NBP names."
|
||||||
|
DX_main
|
||||||
|
lda #$00
|
||||||
|
sta mode
|
||||||
|
lda #'s'+$80
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs :+
|
||||||
|
lda #$80
|
||||||
|
sta mode
|
||||||
|
: jsr setsptr
|
||||||
|
lda #$00
|
||||||
|
jsr xgetparm_n
|
||||||
|
ldx mode
|
||||||
|
jsr get_nbp
|
||||||
|
php
|
||||||
|
phx
|
||||||
|
ply
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
.byte ' '+$80,$00
|
||||||
|
plp
|
||||||
|
bcc printv
|
||||||
|
lda #<nonestr
|
||||||
|
sta sptr
|
||||||
|
lda #>nonestr
|
||||||
|
sta sptr+1
|
||||||
|
printv: jsr prpas
|
||||||
|
jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
next: inc mode
|
||||||
|
lda mode
|
||||||
|
and #$7f
|
||||||
|
cmp #$03
|
||||||
|
bcc :-
|
||||||
|
rts
|
||||||
|
setsptr: lda #<namebuf
|
||||||
|
sta sptr
|
||||||
|
lda #>namebuf
|
||||||
|
sta sptr+1
|
||||||
|
rts
|
||||||
|
nonestr: .byte 6,"(none)"
|
||||||
|
; ***
|
||||||
|
; get_nbp - get part of a name at ay and copy to sptr
|
||||||
|
; x = 0:name 1:type 2:zone, +$80 sub wildcard or default if none given
|
||||||
|
; return: (sptr) = string, x = length of it
|
||||||
|
.proc get_nbp
|
||||||
|
sty sptr2
|
||||||
|
sta sptr2+1
|
||||||
|
stx stemp
|
||||||
|
ldy #$00
|
||||||
|
sty colon ; init these
|
||||||
|
sty at
|
||||||
|
lda sptr ; copy sptr to self-modifying wrtdest
|
||||||
|
sta wrtdest+1
|
||||||
|
lda sptr+1
|
||||||
|
sta wrtdest+2
|
||||||
|
jsr incdest ; and move to first char position
|
||||||
|
lda (sptr2),y ; length
|
||||||
|
beq notfound ; zero, just give up
|
||||||
|
sta end
|
||||||
|
; find the delimiters
|
||||||
|
tay
|
||||||
|
: lda (sptr2),y
|
||||||
|
cmp #':'
|
||||||
|
bne notcolon
|
||||||
|
sty colon
|
||||||
|
notcolon: cmp #'@'
|
||||||
|
bne nxtdelim
|
||||||
|
sty at
|
||||||
|
nxtdelim: dey
|
||||||
|
bne :-
|
||||||
|
; now make sure that if @ is given, it is after :
|
||||||
|
lda at
|
||||||
|
beq :+
|
||||||
|
cmp colon
|
||||||
|
bcc bad
|
||||||
|
; now get the part requested
|
||||||
|
: lda stemp
|
||||||
|
and #$7f
|
||||||
|
beq getname
|
||||||
|
cmp #$01
|
||||||
|
beq gettype
|
||||||
|
getzone: ldy at
|
||||||
|
beq notfound
|
||||||
|
cpy end
|
||||||
|
beq notfound
|
||||||
|
; need to copy from at(+1) to end
|
||||||
|
docopy: ldx #$00
|
||||||
|
: iny
|
||||||
|
lda (sptr2),y
|
||||||
|
jsr wrtdest
|
||||||
|
cpy end ; was that the last char
|
||||||
|
bcc :- ; nope, next char
|
||||||
|
ldy #$00
|
||||||
|
txa
|
||||||
|
sta (sptr),y ; save copied length
|
||||||
|
clc
|
||||||
|
rts ; and return
|
||||||
|
getname: ldy colon
|
||||||
|
bne :+
|
||||||
|
ldy at
|
||||||
|
beq :++
|
||||||
|
: dey
|
||||||
|
sty end
|
||||||
|
: ldy end
|
||||||
|
beq notfound
|
||||||
|
ldy #$00 ; initially at pos 0
|
||||||
|
; need to copy from pos 1 to end
|
||||||
|
beq docopy ; always
|
||||||
|
gettype: ldy colon
|
||||||
|
beq notfound ; early out if no colon
|
||||||
|
cpy end
|
||||||
|
beq notfound
|
||||||
|
ldy at
|
||||||
|
beq :+ ; use end as-is
|
||||||
|
dey ; otherwise end at pos before @
|
||||||
|
sty end
|
||||||
|
: ldy colon
|
||||||
|
; need to copy from colon(+1) to end
|
||||||
|
bne docopy ; should be always
|
||||||
|
notfound: lda stemp
|
||||||
|
and #$80
|
||||||
|
bne :+ ; if client asked for a default
|
||||||
|
lda #$00
|
||||||
|
tay
|
||||||
|
tax ; x is officially length of string result
|
||||||
|
sta (sptr),y ; put a zero in destination
|
||||||
|
bad: sec ; tell client we gave an empty string
|
||||||
|
rts
|
||||||
|
: ldx #$01 ; length of default
|
||||||
|
ldy #$00
|
||||||
|
txa
|
||||||
|
sta (sptr),y
|
||||||
|
iny
|
||||||
|
lda stemp
|
||||||
|
cmp #$82 ; want default zone? ('*')
|
||||||
|
bne :++ ; nope
|
||||||
|
lda #'*'
|
||||||
|
: sta (sptr),y
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
: lda #'=' ; wildcard for name or type
|
||||||
|
bne :-- ; always
|
||||||
|
wrtdest: sta $ffff
|
||||||
|
inx ; inc count of copied chars
|
||||||
|
incdest: inc wrtdest+1
|
||||||
|
bne :+
|
||||||
|
inc wrtdest+2
|
||||||
|
: rts
|
||||||
|
colon: .byte $00
|
||||||
|
at: .byte $00
|
||||||
|
end: .byte $00
|
||||||
|
.endproc
|
||||||
|
; increment sptr by a
|
||||||
|
.proc addsptr
|
||||||
|
clc
|
||||||
|
adc sptr
|
||||||
|
sta sptr
|
||||||
|
bcc :+
|
||||||
|
inc sptr+1
|
||||||
|
: rts
|
||||||
|
.endproc
|
||||||
|
; print pascal string at sptr
|
||||||
|
; leave sptr pointed at one past end
|
||||||
|
; of string
|
||||||
|
.proc prpas
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr),y ; get length
|
||||||
|
tax
|
||||||
|
next: lda #$01
|
||||||
|
jsr addsptr
|
||||||
|
dex
|
||||||
|
bpl :+
|
||||||
|
rts
|
||||||
|
: lda (sptr),y ; get char
|
||||||
|
ora #$80 ; make printable
|
||||||
|
jsr cout
|
||||||
|
bra next
|
||||||
|
.endproc
|
||||||
|
; copy a pascal string to sptr offset by y
|
||||||
|
; a,x = source
|
||||||
|
; return: y = new offset after copied str
|
||||||
|
.proc copystr
|
||||||
|
sta sptr2+1
|
||||||
|
stx sptr2
|
||||||
|
sty stemp ; save offset
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr2),y ; get number of chars
|
||||||
|
tax ; to copy
|
||||||
|
ldy stemp ; get the offset
|
||||||
|
sta (sptr),y ; store the length byte
|
||||||
|
inc stemp ; increment the offset
|
||||||
|
inc sptr2 ; next source char
|
||||||
|
bne :+
|
||||||
|
inc sptr2+1
|
||||||
|
: ldy #0
|
||||||
|
; copy loop
|
||||||
|
: phy
|
||||||
|
lda (sptr2),y
|
||||||
|
ldy stemp
|
||||||
|
sta (sptr),y
|
||||||
|
inc stemp
|
||||||
|
ply
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
ldy stemp
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
DX_end
|
483
tardis.s
Normal file
483
tardis.s
Normal file
@ -0,0 +1,483 @@
|
|||||||
|
; %help
|
||||||
|
; tardis - Get date/time from TimeLord server.
|
||||||
|
;
|
||||||
|
; options:
|
||||||
|
; -v Verbose mode, prints server info.
|
||||||
|
; -n <nbp-name> Specify NBP query, default =:TimeLord@*
|
||||||
|
; -p Set ProDOS global page date/time.
|
||||||
|
; -s <type> Set a clock of <type>, current supported
|
||||||
|
; types: none.
|
||||||
|
; %hend
|
||||||
|
|
||||||
|
.pc02
|
||||||
|
.include "davex-mg.inc"
|
||||||
|
|
||||||
|
ch = $24 ; cursor horizontal pos
|
||||||
|
|
||||||
|
entname = filebuff2 ; buffer to build NBP entity name
|
||||||
|
NBPBuf = filebuff3 ; buffer for NBP request
|
||||||
|
NBPBufSz = $0400 ; size of the file buffer
|
||||||
|
|
||||||
|
P8DtTm = $bf90
|
||||||
|
|
||||||
|
sptr = xczpage
|
||||||
|
sptr2 = sptr+2
|
||||||
|
stemp = sptr2+2
|
||||||
|
verbose = stemp+1 ; verbose flag
|
||||||
|
|
||||||
|
DX_start dx_mg_auto_origin ; load address
|
||||||
|
DX_info $01,$12,dx_cc_iie_or_iigs,$00
|
||||||
|
DX_ptab
|
||||||
|
DX_parm 'v',t_nil ; verbose
|
||||||
|
DX_parm 'n',t_string ; name
|
||||||
|
DX_parm 'z',t_string ; zone
|
||||||
|
DX_parm 'p',t_nil ; set prodos time
|
||||||
|
DX_parm 's',t_string ; set clock
|
||||||
|
DX_end_ptab
|
||||||
|
DX_desc "Get time from TimeLord server."
|
||||||
|
DX_main
|
||||||
|
cli ; appletalk requires interrupts
|
||||||
|
ATcall inforeq
|
||||||
|
bcc :+
|
||||||
|
jmp noatalk
|
||||||
|
: stz verbose
|
||||||
|
lda #'v'|$80 ; verbose
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs :+
|
||||||
|
inc verbose
|
||||||
|
: lda #<entname
|
||||||
|
sta sptr
|
||||||
|
lda #>entname
|
||||||
|
sta sptr+1
|
||||||
|
; get name
|
||||||
|
lda #'n'|$80 ; NBP name param
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcc :+ ; was specified
|
||||||
|
; name param not given, use default
|
||||||
|
lda #<entname
|
||||||
|
sta sptr
|
||||||
|
lda #>entname
|
||||||
|
sta sptr+1
|
||||||
|
ldy #$00
|
||||||
|
ldx #<defname
|
||||||
|
lda #>defname
|
||||||
|
jsr copystr
|
||||||
|
ldx #<deftype
|
||||||
|
lda #>deftype
|
||||||
|
jsr copystr
|
||||||
|
ldx #<defzone
|
||||||
|
lda #>defzone
|
||||||
|
jsr copystr
|
||||||
|
jmp doit
|
||||||
|
: ldx #$80 ; name, return wildcard if not given
|
||||||
|
jsr get_nbp
|
||||||
|
bcs badnbp
|
||||||
|
inx
|
||||||
|
txa
|
||||||
|
jsr addsptr
|
||||||
|
; get type
|
||||||
|
lda #'n'|$80
|
||||||
|
jsr xgetparm_ch
|
||||||
|
ldx #$01 ; type, return empty if not given
|
||||||
|
jsr get_nbp
|
||||||
|
bcc :+
|
||||||
|
ldy #$00
|
||||||
|
ldx #<deftype
|
||||||
|
lda #>deftype
|
||||||
|
jsr copystr
|
||||||
|
tya
|
||||||
|
bra :++ ; to addsptr
|
||||||
|
: inx
|
||||||
|
txa
|
||||||
|
: jsr addsptr
|
||||||
|
; get zone
|
||||||
|
lda #'n'+$80
|
||||||
|
jsr xgetparm_ch
|
||||||
|
ldx #$82 ; zone, return * if not given
|
||||||
|
jsr get_nbp
|
||||||
|
bcc doit
|
||||||
|
badnbp: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Bad NBP name."
|
||||||
|
.byte $00
|
||||||
|
bra exiterr1
|
||||||
|
doit: lda #<entname
|
||||||
|
sta sptr
|
||||||
|
lda #>entname
|
||||||
|
sta sptr+1
|
||||||
|
lda verbose
|
||||||
|
beq :+ ; don't print unless verbose
|
||||||
|
jsr prnbptup
|
||||||
|
jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
; Locate TimeLord on network
|
||||||
|
: ATcall lookup
|
||||||
|
bcc :+ ; no error, don't bail
|
||||||
|
notlord: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "No TimeLord found!"
|
||||||
|
.byte $00
|
||||||
|
exiterr1: jmp exiterr
|
||||||
|
: lda matches ; check # matches
|
||||||
|
beq notlord ; no matches
|
||||||
|
; Copy found address/socket to request
|
||||||
|
ldx #3
|
||||||
|
: lda NBPBuf,x
|
||||||
|
sta ATPaddr,x
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
lda verbose
|
||||||
|
beq :+
|
||||||
|
; display NBP entry if verbose
|
||||||
|
lda bufp+1 ; set up pointer to response buffer
|
||||||
|
sta sptr+1
|
||||||
|
lda bufp
|
||||||
|
sta sptr
|
||||||
|
jsr prnbpent
|
||||||
|
; now make ATP request to TimeLord
|
||||||
|
: lda #$01
|
||||||
|
sta ATPbmap
|
||||||
|
ATcall ATPparms
|
||||||
|
bcs notime ; if error, bail now
|
||||||
|
; now do big-endian addition of the base offset
|
||||||
|
sec
|
||||||
|
ldx #$03
|
||||||
|
: lda To,x
|
||||||
|
sbc Base,x
|
||||||
|
sta From,x
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
; Use the WS card to convert it to ProDOS format
|
||||||
|
ATcall CvtParms
|
||||||
|
bcs notime ; bail if error
|
||||||
|
; Display date/time
|
||||||
|
ldy To
|
||||||
|
lda To+1
|
||||||
|
jsr xpr_date_ay
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " "
|
||||||
|
.byte $00
|
||||||
|
ldy To+2
|
||||||
|
lda To+3
|
||||||
|
jsr xpr_time_ay
|
||||||
|
jsr xmess
|
||||||
|
.byte $8d,$00
|
||||||
|
; set Prodos date/time if asked
|
||||||
|
lda #'p'|$80 ; set prodos date/time?
|
||||||
|
jsr xgetparm_ch
|
||||||
|
bcs nosetp8 ; skip if -p not given
|
||||||
|
; Copy converted values to the global page
|
||||||
|
ldx #$03
|
||||||
|
: lda To,x
|
||||||
|
sta P8DtTm,x
|
||||||
|
dex
|
||||||
|
bpl :-
|
||||||
|
nosetp8: ; TODO: set NSC or ThunderClock or something
|
||||||
|
rts
|
||||||
|
notime: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "Error getting date/time!"
|
||||||
|
.byte $00
|
||||||
|
bra exiterr
|
||||||
|
noatalk: lda #$01
|
||||||
|
jsr xredirect
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "AppleTalk offline!"
|
||||||
|
.byte $00
|
||||||
|
exiterr: lda #$ff
|
||||||
|
jsr xredirect
|
||||||
|
jmp xerr
|
||||||
|
; ***
|
||||||
|
; get_nbp - get part of a name at ay and copy to sptr
|
||||||
|
; x = 0:name 1:type 2:zone, +$80 sub wildcard or default if none given
|
||||||
|
; return: (sptr) = string, x = length of it
|
||||||
|
.proc get_nbp
|
||||||
|
sty sptr2
|
||||||
|
sta sptr2+1
|
||||||
|
stx stemp
|
||||||
|
ldy #$00
|
||||||
|
sty colon ; init these
|
||||||
|
sty at
|
||||||
|
lda sptr ; copy sptr to self-modifying wrtdest
|
||||||
|
sta wrtdest+1
|
||||||
|
lda sptr+1
|
||||||
|
sta wrtdest+2
|
||||||
|
jsr incdest ; and move to first char position
|
||||||
|
lda (sptr2),y ; length
|
||||||
|
beq notfound ; zero, just give up
|
||||||
|
sta end
|
||||||
|
; find the delimiters
|
||||||
|
tay
|
||||||
|
: lda (sptr2),y
|
||||||
|
cmp #':'
|
||||||
|
bne notcolon
|
||||||
|
sty colon
|
||||||
|
notcolon: cmp #'@'
|
||||||
|
bne nxtdelim
|
||||||
|
sty at
|
||||||
|
nxtdelim: dey
|
||||||
|
bne :-
|
||||||
|
; now make sure that if @ is given, it is after :
|
||||||
|
lda at
|
||||||
|
beq :+
|
||||||
|
cmp colon
|
||||||
|
bcc bad
|
||||||
|
; now get the part requested
|
||||||
|
: lda stemp
|
||||||
|
and #$7f
|
||||||
|
beq getname
|
||||||
|
cmp #$01
|
||||||
|
beq gettype
|
||||||
|
getzone: ldy at
|
||||||
|
beq notfound
|
||||||
|
cpy end
|
||||||
|
beq notfound
|
||||||
|
; need to copy from at(+1) to end
|
||||||
|
docopy: ldx #$00
|
||||||
|
: iny
|
||||||
|
lda (sptr2),y
|
||||||
|
jsr wrtdest
|
||||||
|
cpy end ; was that the last char
|
||||||
|
bcc :- ; nope, next char
|
||||||
|
ldy #$00
|
||||||
|
txa
|
||||||
|
sta (sptr),y ; save copied length
|
||||||
|
clc
|
||||||
|
rts ; and return
|
||||||
|
getname: ldy colon
|
||||||
|
bne :+
|
||||||
|
ldy at
|
||||||
|
beq :++
|
||||||
|
: dey
|
||||||
|
sty end
|
||||||
|
: ldy end
|
||||||
|
beq notfound
|
||||||
|
ldy #$00 ; initially at pos 0
|
||||||
|
; need to copy from pos 1 to end
|
||||||
|
beq docopy ; always
|
||||||
|
gettype: ldy colon
|
||||||
|
beq notfound ; early out if no colon
|
||||||
|
cpy end
|
||||||
|
beq notfound
|
||||||
|
ldy at
|
||||||
|
beq :+ ; use end as-is
|
||||||
|
dey ; otherwise end at pos before @
|
||||||
|
sty end
|
||||||
|
: ldy colon
|
||||||
|
; need to copy from colon(+1) to end
|
||||||
|
bne docopy ; should be always
|
||||||
|
notfound: lda stemp
|
||||||
|
and #$80
|
||||||
|
bne :+ ; if client asked for a default
|
||||||
|
lda #$00
|
||||||
|
tay
|
||||||
|
tax ; x is officially length of string result
|
||||||
|
sta (sptr),y ; put a zero in destination
|
||||||
|
bad: sec ; tell client we gave an empty string
|
||||||
|
rts
|
||||||
|
: ldx #$01 ; length of default
|
||||||
|
ldy #$00
|
||||||
|
txa
|
||||||
|
sta (sptr),y
|
||||||
|
iny
|
||||||
|
lda stemp
|
||||||
|
cmp #$82 ; want default zone? ('*')
|
||||||
|
bne :++ ; nope
|
||||||
|
lda #'*'
|
||||||
|
: sta (sptr),y
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
: lda #'=' ; wildcard for name or type
|
||||||
|
bne :-- ; always
|
||||||
|
wrtdest: sta $ffff
|
||||||
|
inx ; inc count of copied chars
|
||||||
|
incdest: inc wrtdest+1
|
||||||
|
bne :+
|
||||||
|
inc wrtdest+2
|
||||||
|
: rts
|
||||||
|
colon: .byte $00
|
||||||
|
at: .byte $00
|
||||||
|
end: .byte $00
|
||||||
|
.endproc
|
||||||
|
;
|
||||||
|
; print an NBP entry at sptr
|
||||||
|
.proc prnbpent
|
||||||
|
ldy #$00 ; offset into entry, net number low byte
|
||||||
|
lda (sptr),y ; big end of network num
|
||||||
|
pha
|
||||||
|
iny
|
||||||
|
lda (sptr),y
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "."
|
||||||
|
.byte $00
|
||||||
|
; print node
|
||||||
|
ldy #$02
|
||||||
|
lda (sptr),y
|
||||||
|
tay
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ":"
|
||||||
|
.byte $00
|
||||||
|
; print socket
|
||||||
|
ldy #$03
|
||||||
|
lda (sptr),y
|
||||||
|
tay
|
||||||
|
lda #$00
|
||||||
|
jsr xprdec_2
|
||||||
|
jsr xmess
|
||||||
|
asc_hi " " ; print space in case output is not to screen.
|
||||||
|
.byte $00
|
||||||
|
;lda #20 ; Position NBP tuple on screen.
|
||||||
|
;sta ch
|
||||||
|
lda #$05 ; offset to NBP tuple
|
||||||
|
jsr addsptr
|
||||||
|
jsr prnbptup
|
||||||
|
jsr xmess ; CR
|
||||||
|
.byte $8d,$00
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
; print an NBP tuple at sptr
|
||||||
|
; leave sptr at byte just after tuple
|
||||||
|
; does not print zone unless verbose flag set
|
||||||
|
.proc prnbptup
|
||||||
|
; print name
|
||||||
|
jsr prpas
|
||||||
|
jsr xmess
|
||||||
|
asc_hi ":"
|
||||||
|
.byte $00
|
||||||
|
; print type
|
||||||
|
jsr prpas
|
||||||
|
lda verbose
|
||||||
|
beq skipzone ; if not verbose, don't display @zone
|
||||||
|
jsr xmess
|
||||||
|
asc_hi "@"
|
||||||
|
.byte $00
|
||||||
|
; print zone
|
||||||
|
jsr prpas
|
||||||
|
bra :+
|
||||||
|
skipzone: ldy #$00
|
||||||
|
lda (sptr),y ; get length of zone name
|
||||||
|
inc a ; account for length byte
|
||||||
|
jsr addsptr ; and skip the lot
|
||||||
|
: rts ; done
|
||||||
|
.endproc
|
||||||
|
; increment sptr by a
|
||||||
|
.proc addsptr
|
||||||
|
clc
|
||||||
|
adc sptr
|
||||||
|
sta sptr
|
||||||
|
bcc :+
|
||||||
|
inc sptr+1
|
||||||
|
: rts
|
||||||
|
.endproc
|
||||||
|
; print pascal string at sptr
|
||||||
|
; leave sptr pointed at one past end
|
||||||
|
; of string
|
||||||
|
.proc prpas
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr),y ; get length
|
||||||
|
tax
|
||||||
|
next: lda #$01
|
||||||
|
jsr addsptr
|
||||||
|
dex
|
||||||
|
bpl :+
|
||||||
|
rts
|
||||||
|
: lda (sptr),y ; get char
|
||||||
|
ora #$80 ; make printable
|
||||||
|
jsr cout
|
||||||
|
bra next
|
||||||
|
.endproc
|
||||||
|
; copy a pascal string to sptr offset by y
|
||||||
|
; a,x = source
|
||||||
|
; return: y = new offset after copied str
|
||||||
|
.proc copystr
|
||||||
|
sta sptr2+1
|
||||||
|
stx sptr2
|
||||||
|
sty stemp ; save offset
|
||||||
|
ldy #$00
|
||||||
|
lda (sptr2),y ; get number of chars
|
||||||
|
tax ; to copy
|
||||||
|
ldy stemp ; get the offset
|
||||||
|
sta (sptr),y ; store the length byte
|
||||||
|
inc stemp ; increment the offset
|
||||||
|
inc sptr2 ; next source char
|
||||||
|
bne :+
|
||||||
|
inc sptr2+1
|
||||||
|
: ldy #0
|
||||||
|
; copy loop
|
||||||
|
: phy
|
||||||
|
lda (sptr2),y
|
||||||
|
ldy stemp
|
||||||
|
sta (sptr),y
|
||||||
|
inc stemp
|
||||||
|
ply
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne :-
|
||||||
|
ldy stemp
|
||||||
|
rts
|
||||||
|
.endproc
|
||||||
|
;
|
||||||
|
inforeq: .byte 0,2 ; sync GetInfo
|
||||||
|
.word $0000 ; result code
|
||||||
|
.dword $00000000 ; completion address
|
||||||
|
thisnet: .word $0000 ; this network #
|
||||||
|
abridge: .byte $00 ; local bridge
|
||||||
|
hwid: .byte $00 ; hardware ID, IIgs only
|
||||||
|
romver: .word $00 ; ROM version, IIgs only
|
||||||
|
nodenum: .byte $00 ; node number
|
||||||
|
; some pointers & values for building names
|
||||||
|
defname: .byte 1,"=" ; object
|
||||||
|
deftype: .byte 8,"TimeLord" ; type
|
||||||
|
defzone: .byte 1,"*" ; zone
|
||||||
|
; Base offset for epoch conversion
|
||||||
|
Base: .byte $B4,$93,$56,$70 ; in big-endian order
|
||||||
|
; parameter list for NBPLookup
|
||||||
|
lookup: .byte 0,16 ; sync NBPLookup
|
||||||
|
.word $0000 ; result
|
||||||
|
.dword $00000000 ; completion
|
||||||
|
.dword entname ; pointer to name to find
|
||||||
|
.byte 4,4 ; 4 times, every 1 sec
|
||||||
|
.word $0000 ; reserved
|
||||||
|
.word NBPBufSz ; buffer size
|
||||||
|
bufp: .dword NBPBuf ; buffer loc
|
||||||
|
.byte 1 ; matches wanted
|
||||||
|
matches: .byte $00 ; matches found
|
||||||
|
; ATP request parameters
|
||||||
|
ATPparms: .byte 0,18 ; sync SendATPReq
|
||||||
|
.word $0000 ; result
|
||||||
|
.dword $00000000 ; compl. addr
|
||||||
|
.byte $00 ; socket #
|
||||||
|
ATPaddr: .dword $00000000 ; destination address
|
||||||
|
.word $0000 ; TID
|
||||||
|
.word $0000 ; req buffer size
|
||||||
|
.dword $00000000 ; req buffer addr
|
||||||
|
.dword $00000000 ; user bytes, $00 = get time
|
||||||
|
.byte $01 ; one response buffer
|
||||||
|
.dword BDS ; pointer to response BDS
|
||||||
|
.byte $00 ; ATP flags
|
||||||
|
.byte 4,4 ; try 4 times every 1/4 second
|
||||||
|
ATPbmap: .byte $00 ; bitmap of blocks to recieve
|
||||||
|
.byte $00 ; number of responses
|
||||||
|
.res 6 ; 6 bytes reserved
|
||||||
|
; BDS for ATP request
|
||||||
|
BDS: .word $000c ; 12-byte buffer for full response from TimeLord
|
||||||
|
.dword From ; Buffer pointer
|
||||||
|
Status: .dword $00000000 ; returned user bytes, first byte = 12 if OK
|
||||||
|
.word $0000 ; actual length
|
||||||
|
; Convert time paraameters
|
||||||
|
; note that ATP response is written to From
|
||||||
|
CvtParms: .byte 0,$34 ; sync ConvertTime
|
||||||
|
.word $0000 ; result
|
||||||
|
.byte $00 ; 0 = from AFP to ProDOS, 1 = reverse
|
||||||
|
From: .dword $00000000 ;
|
||||||
|
To: .dword $00000000 ; initially contains time from ATP response
|
||||||
|
.res 4 ; fill out remaining part of buffer
|
||||||
|
DX_end
|
77
utils/auto_origin.sh
Executable file
77
utils/auto_origin.sh
Executable file
@ -0,0 +1,77 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
END_FENCE=45056
|
||||||
|
|
||||||
|
if [ -z "${1}" ]; then
|
||||||
|
cat <<USAGE_END
|
||||||
|
Usage: $0 <command> <args>
|
||||||
|
|
||||||
|
<command>+<args> should be an ld65 command line with exactly one object
|
||||||
|
file containing
|
||||||
|
|
||||||
|
Appends --start-addr <address> to <command> if the first object file in
|
||||||
|
<command> has X_DX_AUTO_LOAD exported. Such a command should probably
|
||||||
|
only have one object file, one CODE segment, and no other initialized
|
||||||
|
segments.
|
||||||
|
|
||||||
|
<address> is calculated to be a page boundary that causes the linked
|
||||||
|
object file in question to end somewhere between $AF00 and $AFFF.
|
||||||
|
|
||||||
|
od65 should be in the same location as <command>
|
||||||
|
USAGE_END
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
shopt -s extglob
|
||||||
|
|
||||||
|
COMMW=`which ${1}`
|
||||||
|
if [ "${?}" -gt 0 ]; then
|
||||||
|
echo "Cannot locate ${1}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
OD65="`dirname ${COMMW}`/od65"
|
||||||
|
if [ ! -x "${OD65}" ]; then
|
||||||
|
echo "Cannot use ${OD65}"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
CMD_SUFFIX=
|
||||||
|
OBJECT_FILE=
|
||||||
|
for ARG in ${*}; do
|
||||||
|
# echo "${ARG}"
|
||||||
|
if [[ "${ARG}" == @(\-*) ]]; then
|
||||||
|
:
|
||||||
|
# echo "Skipping ${ARG}"
|
||||||
|
else
|
||||||
|
if [ -r "${ARG}" ]; then
|
||||||
|
${OD65} --dump-exports ${ARG} | grep -q X_DX_AUTO_LOAD
|
||||||
|
RESULT="${?}"
|
||||||
|
if [ "${RESULT}" -eq 0 ]; then
|
||||||
|
OBJECT_FILE="${ARG}"
|
||||||
|
else
|
||||||
|
:
|
||||||
|
# echo "No X_DX_AUTO_LOAD found in ${ARG}: ${RESULT}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -z "${OBJECT_FILE}" ]; then
|
||||||
|
echo "X_DX_AUTO_LOAD not detected, not auto-originating"
|
||||||
|
else
|
||||||
|
echo "Auto-originating ${OBJECT_FILE}"
|
||||||
|
CODE_SIZE=`${OD65} -S ${OBJECT_FILE} | awk '/CODE:/{print $2}'`
|
||||||
|
if [ -z "${CODE_SIZE}" -o "${CODE_SIZE}" -lt 1 ]; then
|
||||||
|
echo "Could not determine code size, got '${CODE_SIZE}'!"
|
||||||
|
exit 4
|
||||||
|
fi
|
||||||
|
echo "Code size: ${CODE_SIZE}"
|
||||||
|
START=$(( (${END_FENCE} - ${CODE_SIZE}) / 256 * 256 ))
|
||||||
|
if [ -z "${START}" ]; then
|
||||||
|
echo "Could not calculate a start address!"
|
||||||
|
exit 4
|
||||||
|
else
|
||||||
|
CMD_SUFFIX="${CMD_SUFFIX} --start-addr ${START}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
CMD="${*}${CMD_SUFFIX}"
|
||||||
|
echo "${CMD}"
|
||||||
|
${CMD}
|
||||||
|
|
14
utils/gen_help.sh
Executable file
14
utils/gen_help.sh
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
if [ -z "$2" ]; then
|
||||||
|
echo "Usage: $0 infile outfile"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sed -n '/%help/,/%hend/p' "$1" | awk -F '; ' '{print $2}' | egrep -v '^%.+' | tr '\n' '\r' > "$2"
|
||||||
|
if [ -s "$2" ]; then
|
||||||
|
echo "Help file created."
|
||||||
|
else
|
||||||
|
echo "Help file missing or size zero."
|
||||||
|
rm -f "$2"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
|
Loading…
Reference in New Issue
Block a user