Program pobiera kolejne parametry i wypisuje je w kolejnych liniach. Na koniec wyświetla ile parametrów podano. Kod od "noarg" odpowiada za wyświetlenie liczby podanych argumentów. "nosupp" wyświrtla komunikat o niewłaściwym DOS-ie. "print" wyświetla parametr.
Poprawiłem funkcję "getpar". Pierwotna wersja zwracała pod SDX długość argumentu o 3 bajty krótszą niż pod DOS-em II+/D. SpartaDOS przy obliczaniu długości parametru nie uwzględnia początkowej nazwy urządzenia ("Dn:").
opt ?+
iccmnd = $0342
icbufa = $0344
icbufl = $0348
ciov = $e456
fr0 = $d4
inbufp = $f3
lbuff = $0580
ifp = $d9aa
fasc = $d8e6
org $2000
start jsr getpar
bcs nosupp
beq noarg
jsr print
inc argc
jmp start
noarg lda #<argc_s
ldy #>argc_s
ldx #argc_l
jsr print
lda argc
sta fr0
lda #$00
sta fr0+1
jsr ifp
jsr fasc
ldy #$ff
?lp iny
lda (inbufp),y
bpl ?lp
and #$7f
sta (inbufp),y
iny
lda #$9b
sta (inbufp),y
iny
tya
tax
lda inbufp
ldy inbufp+1
bne print
nosupp lda #<bdos_s
ldy #>bdos_s
ldx #bdos_l
print sta icbufa
sty icbufa+1
stx icbufl
ldx #$00
stx icbufl+1
lda #$09
sta iccmnd
jmp ciov
argc_s .by "Liczba parametrow:"
argc_l = *-argc_s
bdos_s .by "Nie ten DOS"
bdos_l = *-bdos_s
argc .by 0
; Get Parameter for DOS II+/D
; Results:
; C=1 - neither DOS II+/D nor SDX
; Z=1 - no more parameters
; If Z=0 & C=0:
; AY - pointer to parameter
; X - length of parameter
Getpar lda $0700
asl
cmp #'D'*2
beq ?d2p
cmp #'S'*2
beq ?sdx
sec
rts
?d2p lda #<?d2dp ; Init for
ldx #>?d2dp ; DOS II+/D
jsr ?stdos
lda $13c3
sta ?cur
ldy $0348
lda $1b00
cmp #'M'
beq ?dec
lda $1b01
cmp $13c3
beq ?skp
?dec dey
dey
?skp lda #$9b
sta $1b02,y
?dos2d ldy #$00 ; DOS II+/D
?nxt lda $1b03,y
iny
cmp #$20
beq ?fnd
cmp #$9b
bne ?nxt
php
ldx #$03
?ccr lda ?cur,x
sta $0580,x
dex
bpl ?ccr
bmi ?aex
?fnd ldx #<$1b03
stx $f3
ldx #>$1b03
stx $f4
jsr $dba5
jsr $14b9
ldx #$ff
?mv inx
lda $1b00,x
sta $0580,x
cmp #$20
beq ?pel
cmp #$9b
bne ?mv
?pel lda #$9b
sta $0580,x
php
?aex lda #<$0580
ldy #>$0580
plp
clc
rts
?cur .by "D :" $9b
?sdx lda #<?spx ; Init for
ldx #>?spx ; SpartaDOS
jsr ?stdos
ldy #$04
lda ($0a),y
sta ?spdos+1
iny
lda ($0a),y
sta ?spdos+2
lda $0a
adc #$20 ; C=0
sta ?lo+1
lda $0b
adc #$00
sta ?hi+1
?spdos jsr 0 ; SpartaDOS
php
?lo lda #$00
?hi ldy #$00
inx
inx
inx
plp
clc
rts
?stdos sta ?ad+1
stx ?ad+2
ldy #$02
?ad lda 0,y
sta getpar,y
dey
bpl ?ad
rts
?d2dp jmp ?dos2d
?spx jmp ?spdos
.en
Zawsze mam rację, tylko nikt mnie nie słucha.