This commit is contained in:
Rémy GIBERT 2015-03-08 22:45:23 +01:00
parent 037c4d590f
commit 62f272bbf2
66 changed files with 16306 additions and 0 deletions

185
A2osX.S.GP.txt Normal file
View File

@ -0,0 +1,185 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* **** START OF A2osX Global Page ****
*--------------------------------------
A2osX.GP.start .EQ *
*--------------------------------------
.PH $300
*--------------------------------------
A2osX.GP bra A2osX.SYSCALL3
bra A2osX.MLICALL3
bra A2osX.LIBCALL3
bra A2osX.SLEEP3
bra Kernel.MLICALL3
bra Kernel.DRVCALL3
bra Kernel.BINCALL3
bra Kernel.LIBCALL3
.BS A2osX.300CODE-*
*--------------------------------------
* A2osX.SYSCALL (MAINLC to AUXLC)
* In:
* X = SYSfnc.Index
* Y,A = free for Inline param
*--------------------------------------
A2osX.SYSCALL3 jsr GO.AUXLC
jsr $E003
jsr GO.MAINLC
rts
*--------------------------------------
* A2osX.MLICALL (MAINLC to MAINLC)
* In:
* X = MLI Function
* A = Param Count
*--------------------------------------
A2osX.MLICALL3 stx .1
sta MLICALL.PARAMS
jsr MLI
.1 .BS 1
.DA MLICALL.PARAMS
rts
*--------------------------------------
* LIBCALL (MAINLC to MAINLC)
* In:
* Y = LIB.ID
* X = LIBfnc.Index
* A = free for Inline param
*--------------------------------------
A2osX.LIBCALL3 pha
phx
tya
>SYSCALL SYS.GetMemPtrA
>STYA .1+1
plx
pla
.1 jmp $FFFF
*--------------------------------------
A2osX.SLEEP3 jmp A2osX.SLEEP31
*--------------------------------------
* SLEEP (MAINLC to AUXLC)
* In:
*--------------------------------------
* Kernel.MLICALL (AUXLC to MAINLC)
* In:
* X = MLI Function
* A = Param Count
*--------------------------------------
Kernel.MLICALL3 jsr GO.MAINLC
jsr A2osX.MLICALL3
jsr GO.AUXLC
rts
*--------------------------------------
* Kernel.DRVCALL (AUXLC to MAINLC)
* In:
* X = DRV Function Index
* Y,A = pDevContext
*--------------------------------------
Kernel.DRVCALL3 jsr GO.MAINLC
>STYA pDevContext
jsr Kernel.JMP3
jsr GO.AUXLC
rts
*--------------------------------------
* Kernel.BINCALL (AUXLC to MAINLC)
* In:
* X = BIN Function Index
* Y,A = pPsContext
*--------------------------------------
Kernel.BINCALL3 jsr GO.MAINLC
>STYA pPsContext
jsr Kernel.JMP3
jsr GO.AUXLC
rts
*--------------------------------------
* Kernel.LIBCALL (AUXLC to MAINLC)
* In:
* X = Lib Function Index
*--------------------------------------
Kernel.LIBCALL3 jsr GO.MAINLC
jsr Kernel.JMP3
jsr GO.AUXLC
rts
*--------------------------------------
Kernel.JMP3 jmp (Kernel.JMP)
*--------------------------------------
GO.MAINLC php
clc
bra GO.SAVE.REG
GO.AUXLC php
sec
GO.SAVE.REG sta A2osX.SaveA
pla keep P in A for later
stx A2osX.SaveX
sty A2osX.SaveY
plx
ply
inx
bne .1
iny
.1 stx GO.EXIT.JMP+1
sty GO.EXIT.JMP+2
sei
ldy R.SP
tsx
stx A2osX.SaveS
bcs GO.AUXLC1
GO.MAINLC1 stx CLRALTZP
ldx RROMBNK2
ldx A2osX.SaveS
txs
sty R.SP
bra GO.EXIT
*--------------------------------------
GO.AUXLC1 stx SETALTZP
ldx RRAMWRAMBNK2
ldx RRAMWRAMBNK2
ldx A2osX.SaveS
txs
sty R.SP
*--------------------------------------
GO.EXIT pha push P on stack
ldy A2osX.SaveY
ldx A2osX.SaveX
lda A2osX.SaveA
plp
GO.EXIT.JMP jmp $FFFF
*--------------------------------------
A2osX.SLEEP31 ldy #S.PS.hCS
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>STYA Kernel.JMP
ldy #S.PS.PC
pla get PC LO
plx get PC HI
inc Advance PC one Byte
bne .1
inx
.1 sec
sbc Kernel.JMP
sta (pPsContext),y
iny
txa
sbc Kernel.JMP+1
sta (pPsContext),y
clc No error,
rts back to Kernel
*--------------------------------------
.EP
*--------------------------------------
A2osX.GP.End
*--------------------------------------
MAN
SAVE A2OSX.S.GP
LOAD A2OSX.S
ASM

571
A2osX.S.RW.txt Normal file
View File

@ -0,0 +1,571 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
RWBankSelect .EQ $C073
*--------------------------------------
RWDetect jsr MLI
.DA #MLIONLINE
.DA RW.ONLINE
rts
*--------------------------------------
RW.ONLINE .DA #2
.DA #$30 Slot 3,Drive 1
.DA RW.ONLINEBUFFER
RW.ONLINEBUFFER .BS 16
*--------------------------------------
RWInit php
sei
sta SETALTZP
ldx #0 start detection at page $00
.1 stx RWBankSelect
lda 0
sta RW.SAVEZP0,x save Bank 0 $0000 to prevent ALTZP trash
lda 1
sta RW.SAVEZP1,x
inx
bne .1
lda #0
.2 sta RWBankSelect
sta 0
eor #$FF
sta 1
eor #$FF
inc
bne .2
ldx #0
.3 txa
sta RWBankSelect
cmp 0
bne .4
eor #$FF
cmp 1
bne .4
inx
bne .3
dex we reached 0,last detected page was 255
.4 ldy #255 X = detected page count
.6 sty RWBankSelect
lda RW.SAVEZP0,y
sta 0
lda RW.SAVEZP1,y
sta 1
dey
bne .6
stz RWBankSelect
lda RW.SAVEZP0 Don't forget to restore Bank 0
sta 0
lda RW.SAVEZP1
sta 1
txa
stx RW.PGCNT PGCNT = last detected page, as we do -1 for AuxMem
sta CLRALTZP
plp
lda RW.PGCNT
beq .9
clc
rts
.9 sec
rts
*--------------------------------------
*
*--------------------------------------
RWInstall lda RRAMWRAMBNK1
lda RRAMWRAMBNK1
ldx #RWDRV.SIZE
.1 lda RWDRV.B.START-1,x
sta RWDRV.START-1,x
dex
bne .1
lda RW.PGCNT
lsr
sta RWDRV.MAXHI+1
lda #0
ror
sta RWDRV.MAXLO+1
lda RROMBNK1
sta SETWRITEAUX
ldx #RWDRVX.SIZE
.2 lda RWDRVX.B.START-1,x
sta RWDRVX.START-1,x
dex
bne .2
sta CLRWRITEAUX
inc DEVCNT
ldx DEVCNT
lda #$30 Slot 3,Drive 1
sta DEVLST,x
lda #RWDRV.START
sta DEVPTRS3D1
lda /RWDRV.START
sta DEVPTRS3D1+1
clc
rts
*--------------------------------------
*
*--------------------------------------
RWFormat jsr RW.BLOCK.SET00
lda RW.PGCNT
lsr
sta RW.BLOCK2.TB+1
lda #0
ror
sta RW.BLOCK2.TB
jsr MLI
.DA #MLIGETTIME
.DA 0
ldx #3
.1 lda DATELO,x
sta RW.BLOCK2.CT,x
dex
bpl .1
ldx #RW.BLOCK2.END-RW.BLOCK2
.2 lda RW.BLOCK2-1,x
sta RW.BLOCK-1,x
dex
bne .2
jsr MLI Write Block 2,First VOL directory block
.DA #MLIWRITEBLOCK
.DA RW.MLIWRITEBLOCK
bcc .22
rts
*--------------------------------------
.22 jsr RW.BLOCK.SET00
lda #2
sta RW.BLOCK LO byte of previous block pointer
inc RW.MLIWRITEBLOCK.BLK
jsr MLI Write Block 3,Last VOL directory block
.DA #MLIWRITEBLOCK
.DA RW.MLIWRITEBLOCK
bcc .33
rts
*--------------------------------------
.33 lda RW.PGCNT divide RW.PGCNT by 32 to get how many bitmap
lsr blocks we need :
lsr 1 page = 128 blocks = 16 bytes
lsr 32 pages = 512 bytes = 1 Block
lsr
lsr
sta RW.FBITMAPCNT store FULL bitmap block count needed
tax
lda RW.PGCNT
and #$1F need an extra incomplete bitmap block?
beq .3
inx
.3 stx RW.BITMAPCNT store TOTAL bitmap block needed
.4 lda RW.FBITMAPCNT
beq .49
dec RW.FBITMAPCNT
jsr RW.BLOCK.SETFF
bra .5
.49 jsr RW.BLOCK.SET00
lda RW.PGCNT
and #$1F compute incomplete bitmap block
asl
asl
asl
asl times 16 for byte count
tay
lda #$FF
bcc .42 first half of block only
ldx #0
.40 sta RW.BLOCK,x
inx
bne .40
cpy #0
beq .5
.41 sta RW.BLOCK+$ff,y
dey
bne .41
bra .5
.42 sta RW.BLOCK-1,y
dey
bne .42
.5 inc RW.MLIWRITEBLOCK.BLK
lda RW.MLIWRITEBLOCK.BLK
cmp #4 Are we writing first volume bitmap ?
bne .63 no, regular one
lda #$CF Mark Block 0 & 1 free, 2,3 used (vol hdr)
sta RW.BLOCK
ldy #0
lda #$8 Start a BLOCK 4 (%00001000)
ldx RW.BITMAPCNT
.62 pha
eor RW.BLOCK,y Mark bitmap blocks as "used"
sta RW.BLOCK,y
pla
dex
beq .63
lsr
bne .62
lda #$80
iny
bra .62
.63 jsr MLI Write Block 4,5...
.DA #MLIWRITEBLOCK
.DA RW.MLIWRITEBLOCK
bcs .9
dec RW.BITMAPCNT another bitmap block needed ?
bne .4
clc
.9 rts
*--------------------------------------
RW.BLOCK.SETFF lda #$FF
bra RW.BLOCK.SET
RW.BLOCK.SET00 lda #$00
RW.BLOCK.SET ldx #0
.1 sta RW.BLOCK,x
sta RW.BLOCK+$100,x
inx
bne .1
rts
*--------------------------------------
RW.MLIWRITEBLOCK
.DA #3
.DA #$30 Slot 3,Drive 1
.DA RW.BLOCK
RW.MLIWRITEBLOCK.BLK
.DA 2 Start writing block at #2
*--------------------------------------
RW.RAM31 .DA #$30
.DA #5 len=5 chars
.AS 'RAM31'
*--------------------------------------
RW.PGCNT .BS 1
RW.FBITMAPCNT .BS 1
RW.BITMAPCNT .BS 1
RW.SAVEZP0 .BS 256
RW.SAVEZP1 .BS 256
*--------------------------------------
RW.BLOCK2 .DA 0 pointer to previous block
.DA 3 pointer to next block
.DA #$F5 $F=Vol Dir Header, 5=name len
.AS 'RAM31'
.BS 10 (RAM31 len=5, fill to 15)
.HS 0000000000000000
RW.BLOCK2.CT .BS 4 Creation time
.HS 0100C3270D version/min version/access/EL/EPB
.DA 0 File Count
.DA 4 bitmap pointer (Block 2&3 are Volume directory)
RW.BLOCK2.TB .BS 2 Total Blocks
RW.BLOCK2.END .EQ *
*--------------------------------------
RW.BLOCK .BS 512
*--------------------------------------
* Driver for Ramworks in main LC
* $FF00 -> $FF9A (Inclusive)
* $FF58 MUST BE $60 (RTS)
* DO NOT trash DRV.BLKNUM as ProDOS
* reuses it after Block operation
*--------------------------------------
DRV.COMMAND .EQ $42
DRV.BUFF .EQ $44
DRV.BLKNUM .EQ $46
*--------------------------------------
RWDRV.B.START
.PH $FF00
RWDRV.START cld ProDOS will check that byte!!!
ldy DRV.COMMAND 0 = Status ?
beq RMDRV.CMDSTATUS
cpy #3
beq RWDRV.EXITOK 3 = Format : nothing to do, exit with no error
bcs RWDRV.IOERR > 3 = Invalid OP, IO error
lda DRV.BLKNUM
sec
sbc RWDRV.MAXLO+1
lda DRV.BLKNUM+1
sbc RWDRV.MAXHI+1
bcs RWDRV.IOERR DRV.BLKNUM >= RW.DRV.SIZE, IO error
lda DRV.BLKNUM compute PAGE = blocknumLO *2
asl
pha
lda DRV.BLKNUM+1 compute BANK = blocknumHI *2
rol
inc +1 for skipping Aux BANK 0
plx move page into X
beq RWDRV.GOAUX move from/to aux page0/1
cpx #$C0
bcs RWDRV.GOAUX move from/to aux LC
*--------------------------------------
* X=Page($02 -> $BF),A=Bank,Y=CMD
*--------------------------------------
php
sei Disable IRQ as no vector set in RW Banks
sta RWBankSelect Select RAMWorks Bank
sta CLR80STORE make sure SETREADAUX/SETWRITEAUX effective everywhere
stx DRV.COMMAND+1 Reuse DRV.COMMAND for RAM PTR
stz DRV.COMMAND
dey Y=CMD, zero if read
bne RWDRV.W CC, go write
sta SETREADAUX
ldx #DRV.COMMAND READ:copy from RAM to BUFF
ldy #DRV.BUFF
bra RWDRV.RW
RWDRV.W sta SETWRITEAUX
ldx #DRV.BUFF
ldy #DRV.COMMAND WRITE:copy from BUFF to RAM
RWDRV.RW stx RWDRV.RW.SRC+1
sty RWDRV.RW.DST+1
ldx #2 2 pages to copy
ldy #0
RWDRV.RW.SRC lda ($FF),y
RWDRV.RW.DST sta ($FF),y
iny
bne RWDRV.RW.SRC
.HS 24 BIT Zero Page to skip RTS
RWDRV.RTS rts $FF58 Must Be RTS
inc DRV.BUFF+1
inc DRV.COMMAND+1
dex
bne RWDRV.RW.SRC
stz RWBankSelect
sta CLRREADAUX
sta CLRWRITEAUX
plp
RMDRV.CMDSTATUS
RWDRV.MAXLO ldx #$FF return device block count in X,Y...
RWDRV.MAXHI ldy #$FF
RWDRV.EXITOK lda #0 make A=0
clc
rts
RWDRV.IOERR lda #MLI.ERR.IO Carry already set
rts
*--------------------------------------
* X=Page(0/1 or LC),A=Bank
*--------------------------------------
RWDRV.GOAUX pha save BANK
sta SETWRITEAUX
ldy #RWDRVX.XM.SIZE Backup begining of $300 to generate move code
.1 lda RWDRV.XM.RUN-1,y
sta RWDRVX.XM.SAVE-1,y
dey
bne .1
pla restore BANK
sta SETREADAUX
jsr RWDRVX.START Setup Code in main mem at $300 for data move
* returns : CC=WRITE, CS=READ
sta CLRREADAUX CLRWRITEAUX already triggered by code copy
jsr RWDRV.XM.RUN Now execute generated code in main memory
sta SETREADAUX
jsr RWDRVX.RESTORE
sta CLRREADAUX
rts A & carry setup properly by RWDRVX.RESTORE
RWDRV.END .EP
RWDRV.B.END
RWDRV.SIZE .EQ RWDRV.B.END-RWDRV.B.START
*--------------------------------------
* Driver for Ramworks in aux memory
* $0200 -> $02FF TMP buffer for PAGE copy
* $0300 -> $03FD (Inclusive)
* do not trash $03FE-$03FF (IRQ Vector)
* X=Page(0/1 or LC),A=Bank
*--------------------------------------
RMDRVX.TMP .EQ $200
RWDRV.XM.RUN .EQ $300
*--------------------------------------
RWDRVX.B.START
.PH $0300
RWDRVX.START sta RWDRVX.XM.BANK+1 setup BANK
txa
beq .1 page 0/1, no need to check BANK
cmp #$D0 $C0 <= PAGE < $D0 ?
bcc .1 no, store in BNK1
ora #$10 Remap $C0 page to $D0 BNK2
.1 ror RWDRVX.XM.RWLC+1 Save Carry to select proper RW bank later
ldy DRV.BUFF
ldx DRV.BUFF+1
lsr DRV.COMMAND DRV.COMMAND: 1=READ,2=WRITE
bcc .2 CC=WRITE, CS=READ
stz RWDRVX.XM.SRC+1 READ from src LO = 0
sta RWDRVX.XM.SRC+2 READ from src HI = PAGE
sty RWDRVX.XM.DST+1 WRITE to DRV.BUFF
stx RWDRVX.XM.DST+2
bra .3
.2 sty RWDRVX.XM.SRC+1 READ from DRV.BUFF
stx RWDRVX.XM.SRC+2
stz RWDRVX.XM.DST+1 WRITE to dst LO = 0
sta RWDRVX.XM.DST+2 WRITE to dst HI = PAGE
.3 sta CLRWRITEAUX
ldy #RWDRVX.XM.SIZE
.4 lda RWDRVX.XM.START-1,y
sta RWDRV.XM.RUN-1,y
dey
bne .4
rts
*--------------------------------------
* Called form Main LC after RWDRVX.XM execution
*--------------------------------------
RWDRVX.RESTORE ldy #RWDRVX.XM.SIZE Now, restore begining of $300
.1 lda RWDRVX.XM.SAVE-1,y
sta RWDRV.XM.RUN-1,y
dey
bne .1
tya setup A=0 and CC for exit with non error
clc
rts
*--------------------------------------
* "auXMove" Code, moved from Aux to main $300
* $0200 -> $02FF TMP buffer for 2 steps moving between LCs
* CC=WRITE :
* CS=READ :
*--------------------------------------
RWDRVX.XM.START php
sei
ldx #0
ldy #2 2 pages to copy
RWDRVX.XM.COPY jsr RWDRV.XM.RUN+RWDRVX.XM.MNLC-RWDRVX.XM.START WRITE:copy from MAIN to TMP
bcc RWDRVX.XM.SRC CC=WRITE,CS=READ?
jsr RWDRV.XM.RUN+RWDRVX.XM.RWLC-RWDRVX.XM.START READ:copy from BANK to TMP
sta SETALTZP
RWDRVX.XM.SRC lda $FFFF,x
sta RMDRVX.TMP,x
inx
bne RWDRVX.XM.SRC
sta CLRALTZP
jsr RWDRV.XM.RUN+RWDRVX.XM.MNLC-RWDRVX.XM.START READ:copy from TMP to MAIN
bcs RWDRVX.XM.1 CC=WRITE,CS=READ?
jsr RWDRV.XM.RUN+RWDRVX.XM.RWLC-RWDRVX.XM.START WRITE:copy from TMP to BANK
sta SETALTZP
RWDRVX.XM.1 lda RMDRVX.TMP,x
RWDRVX.XM.DST sta $FFFF,x
inx
bne RWDRVX.XM.1
sta CLRALTZP
inc RWDRV.XM.RUN+RWDRVX.XM.SRC+2-RWDRVX.XM.START
inc RWDRV.XM.RUN+RWDRVX.XM.DST+2-RWDRVX.XM.START
dey
bne RWDRVX.XM.COPY
plp
RWDRVX.XM.MNLC stz RWBankSelect ProDOS always uses LCBANK1
bit RRAMWRAMBNK1
bit RRAMWRAMBNK1
rts
RWDRVX.XM.RWLC lda #$FF
bpl RWDRVX.XM.BANK
bit RRAMWRAMBNK2
bit RRAMWRAMBNK2
RWDRVX.XM.BANK lda #$FF
sta RWBankSelect
rts
RWDRVX.XM.END
*--------------------------------------
RWDRVX.XM.SIZE .EQ RWDRVX.XM.END-RWDRVX.XM.START
*--------------------------------------
RWDRVX.XM.SAVE .BS RWDRVX.XM.SIZE
*--------------------------------------
.EP
*--------------------------------------
RWDRVX.B.END
RWDRVX.SIZE .EQ RWDRVX.B.END-RWDRVX.B.START
*--------------------------------------
* CONTROL SECTION :
*--------------------------------------
.DO RWDRV.RTS=$FF58
.ELSE
ERROR:RWDRV.RTS <> $FF58
.FIN
.DO RWDRV.SIZE>$9B
ERROR:RWDRV.SIZE too big
.FIN
.DO RWDRVX.SIZE>$FE
ERROR:RWDRVX.SIZE too big
.FIN
.DO RWDRVX.XM.SIZE>$F0
ERROR:RWDRVX.XM.SIZE too big
.FIN
*--------------------------------------
MAN
SAVE A2OSX.S.RW
LOAD A2OSX.S
ASM

55
A2osX.S.Z80.txt Normal file
View File

@ -0,0 +1,55 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
InitZ80 ldx Z80Code.Len
.1 lda Z80Code-1,x
sta $1000-1,x 00000H for Z80
dex
bne .1
stz TmpPtr1
lda #$C1
sta TmpPtr1+1
.2 sta (TmpPtr1)
lda $100D
bmi .8
inc TmpPtr1+1
lda TmpPtr1+1
cmp #$C8
beq .9
clc
adc #$20
sta $100A
bra .2
.8 lda TmpPtr1+1
and #$0F
sta A2osX.Z80Slot
clc
rts
.9 stz A2osX.Z80Slot
sec
rts
*--------------------------------------
* Moved to $1000 (0000H)
*--------------------------------------
Z80Code .HS 31FFFF START: LD SP,0FFFFH Init Stack
.HS 3EFF LD A,0FFH Set Flag
.HS 320D00 LD (FLAG),A
.HS 3200E1 LD (0E100H),A Back to 6502
.HS 18F3 JR START Loop
.HS 00 FLAG: .DB 0
*31FFFF3EFF320D003200E118F300
Z80Code.Len .EQ *-Z80Code
*--------------------------------------
MAN
SAVE A2OSX.S.Z80
LOAD A2OSX.S
ASM

538
A2osX.S.txt Normal file
View File

@ -0,0 +1,538 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
* .TF A2osX.SYSTEM
.TF A
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/IO.I
.INB INC/MONITOR.I
.INB INC/PRODOS.I
*--------------------------------------
TmpPtr1 .EQ $0 main & aux ZP
TmpPtr2 .EQ $2 main & aux ZP
*--------------------------------------
IO.Buffer .EQ $3C00 1k Buffer for MLI open
Load.Address .EQ $4000 for loading kernel.bin before relocation
*--------------------------------------
* A2osX LOADER
*--------------------------------------
* TODO :
* /intercept MLI CALLS with
* PREFIX=/MNT/
*--------------------------------------
START jmp A2osX.INIT
.DA $EEEE
.DA #$7F
.BS $7F
*--------------------------------------
A2osX.INIT ldx #$FF init 6502 stack to highest
* txs
php
sei
sta SETALTZP Switch to alt ZP
stx A2osX.SaveS make Alt SP to highest too
sta CLRALTZP Switch to main ZP
plp
>LDYAI D.STACKSEG
>STYA R.SP init Soft Stack
* >LDYAI WARMBOOT
* >STYA POWERUP
* jsr SETPWRC
>LDAXI MSG.SYSMEM
jsr PrintCStrAX
lda MACHID
and #MACHIDRAM
cmp #MACHIDRAM128
beq A2osX.SysMemOK
>LDAXI MSG.SYSMEM.KO
jsr PrintCStrAX
bra *
*--------------------------------------
A2osX.SysMemOK >LDAXI MSG.SYSMEM.OK
jsr PrintCStrAX
>LDAXI MSG.65x
jsr PrintCStrAX
jsr Init6502
ldy A2osX.CPUTYPE
lda MSG.CPUTYPEH,y
tax
lda MSG.CPUTYPEL,y
jsr PrintCStrAX
lda A2osX.CPUTYPE
bne A2osX.RamDrv
>LDAXI MSG.65x.KO
jsr PrintCStrAX
bra *
*--------------------------------------
A2osX.RamDrv >LDAXI MSG.RAMDRV
jsr PrintCStrAX
jsr DisableRamDRV
bcc .2
tax
beq .1
>LDAXI MSG.RAMDRV.KO1
jsr PrintCStrAX
bra A2osX.RamWorks
.1 >LDAXI MSG.RAMDRV.KO0
jsr PrintCStrAX
bra A2osX.RamWorks
.2 >LDAXI MSG.RAMDRV.OK
jsr PrintCStrAX
*--------------------------------------
A2osX.RamWorks >LDAXI MSG.RW
jsr PrintCStrAX
jsr RWDetect
bcs .10
>LDAXI MSG.RW.OK
jsr PrintCStrAX
bra A2osX.Z80
.10 jsr RWInit
bcc .1
>LDAXI MSG.RW.KO1
jsr PrintCStrAX
bra A2osX.Z80
.1 pha
>LDAXI MSG.RW.OK1
jsr PrintCStrAX
jsr RWInstall
bcc .2
>LDAXI MSG.RW.KO2
jsr PrintCStrAX
bra A2osX.Z80
.2 >LDAXI MSG.RW.OK2
jsr PrintCStrAX
jsr RWFormat
bcc .3
>LDAXI MSG.RW.KO3
jsr PrintCStrAX
bra A2osX.Z80
.3 >LDAXI MSG.RW.OK3
jsr PrintCStrAX
*--------------------------------------
A2osX.Z80 >LDAXI MSG.Z80
jsr PrintCStrAX
jsr InitZ80
bcs .1
pha Push Z80Slot
>LDAXI MSG.Z80.OK
jsr PrintCStrAX
bra .8
.1 >LDAXI MSG.Z80.KO
jsr PrintCStrAX
.8 >LDAXI MSG.LOADING
jsr PrintCStrAX
jsr LoadKernel
bcs .9
phx
pha
>LDAXI MSG.LOADING.OK
jsr PrintCStrAX
ldx #A2osX.GP.End-A2osX.GP.start
.81 lda A2osX.GP.start-1,x
sta A2osX.GP-1,x
dex
bne .81
>DEBUG
php
pla
sei
tsx
stx A2osX.SaveS
stx SETALTZP
bit RRAMWRAMBNK1
bit RRAMWRAMBNK1
ldx A2osX.SaveS
txs
pha
plp
jmp $E000
.9 pha
>LDAXI MSG.LOADING.KO
jsr PrintCStrAX
bra *
*--------------------------------------
* Out:
* A = 0, 6502
* A = 1, 65C02
* A = 2, R65C02
* A = 3, 65C816
*--------------------------------------
Init6502 ldy #0 Test 6502 BCD bug
sed
lda #$99
clc
adc #$01
cld
bmi .9 BUG!, we have 6502
ldy #3 test 65C816 TYX Instruction
ldx #0
.OP 65816
tyx TYX: if 65C816, x becomes non-zero
.OP 65C02
bne .9 worked! 65C816
dey y=2 -> R65C02
ldx $EA save zp $EA
stz $EA store 0 in $EA
.OP 65R02
smb 7,$EA if not Rockwell, assemble as nop nop
.OP 65C02
asl $EA cs if Rockwell
stx $EA restore zp $EA
bcs .9
dey y=1 -> 65C02
.9 sty A2osX.CPUTYPE
rts
*--------------------------------------
DisableRamDRV php
sei
lda DEVPTRS3D2
cmp DEVPTRS0D1
bne .1
lda DEVPTRS3D2+1
cmp DEVPTRS0D1+1
beq .9 S3D2=NODEV, nothing to do
.1 ldx DEVCNT
.2 lda DEVLST,x LOOKING FOR $BF, $BB, $B7, $B3
and #$F3
cmp #$B3
beq .3
dex
bpl .2
plp
lda #1 No device found, exit with error
sec
rts
.3 ldx #0
.4 lda DEVLST+1,x
sta DEVLST,x
inx
cpx DEVCNT
bne .4
stz DEVLST,x
dec DEVCNT
lda DEVPTRS0D1
sta DEVPTRS3D2
lda DEVPTRS0D1+1
sta DEVPTRS3D2+1
plp
clc Success!!
rts
.9 plp
lda #0 Not detected
sec
rts
*--------------------------------------
LoadKernel jsr MLI
.DA #MLIGETPREFIX
.DA MLIGETPREFIX01
bcs .9
ldy #0
ldx Path.Buffer
.1 lda SYSKERNEL,y
beq .2
sta Path.Buffer+1,x
inx
iny
bra .1
.2 stx Path.Buffer
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN01
bcs .9
lda MLIOPEN01+5
sta MLIREAD01+1
sta MLICLOSE01+1
jsr MLI
.DA #MLIREAD
.DA MLIREAD01
bcs .9
jsr MLI
.DA #MLICLOSE
.DA MLICLOSE01
bcs .9
php
sei
sta SETALTZP
lda RRAMWRAMBNK1
lda RRAMWRAMBNK1
>LDYAI Load.Address+$1F00
>STYA TmpPtr1
>LDYAI $E000+$1F00
>STYA TmpPtr2
ldy #$F9 do not trash NMI,BRK,IRQ Vectors
.3 lda (TmpPtr1),y
sta (TmpPtr2),y
dey
cpy #$FF
bne .3
dec TmpPtr1+1
dec TmpPtr2+1
lda TmpPtr2+1
cmp #$DF
bne .3
lda RROMBNK1
sta CLRALTZP
plp
>LDAX MLIREAD01+6
clc
.9 rts
*--------------------------------------
MLIGETPREFIX01 .DA #1
.DA Path.Buffer
MLIOPEN01 .DA #3
.DA Path.Buffer
.DA IO.Buffer
.BS 1
MLIREAD01 .DA #4
.BS 1
.DA Load.Address
.DA $2000
.BS 2
MLICLOSE01 .DA #1
.BS 1
*--------------------------------------
Path.Buffer .BS MLI.MAXPATH
SYSKERNEL >CSTRING "SYS/KERNEL"
*--------------------------------------
PrintCStrAX >STAX TmpPtr1
pla
sta TmpPtr2
pla
sta TmpPtr2+1
ldy #0
.1 lda (TmpPtr1),y
beq .9
cmp #'%'
bne .4
iny
lda (TmpPtr1),y
beq .9
cmp #'d'
bne .2
pla
jsr PrintADec
bra .8
.2 cmp #'D'
bne .3
pla
plx
jsr PrintAXDec
bra .8
.3 cmp #'h'
bne .4
pla
jsr PRBYTE
.4 cmp #'\'
bne .7
iny
lda (TmpPtr1),y
beq .9
cmp #'n'
bne .9
lda #$0D
.7 ora #$80
jsr COUT
.8 iny
bne .1
.9 lda TmpPtr2+1
pha
lda TmpPtr2
pha
rts
*--------------------------------------
PrintADec ldx #0
PrintAXDec >STAX HEX
PrintDec stz BCD
stz BCD+1
stz BCD+2
phy
ldx #16 let's roll 16 bits
sed
.2 asl HEX
rol HEX+1
php cpy will disturb carry while BCD adc
ldy #0
.3 plp
lda BCD,y
adc BCD,y
sta BCD,y
php
iny
cpy #3 Last byte of BCDBUF?
bne .3
plp
dex
bne .2
cld
stz bFlag
ldx #2
.4 lda BCD,x
lsr
lsr
lsr
lsr
bne .5
bit bFlag
bpl .6
.5 sec
ror bFlag
ora #$B0
jsr COUT
.6 lda BCD,x
and #$0F
bne .7
bit bFlag
bpl .8
.7 sec
ror bFlag
ora #$B0
jsr COUT
.8 dex
bpl .4
bit bFlag
bmi .9
lda #$B0
jsr COUT
.9 ply
rts
*--------------------------------------
MSG.SYSMEM >CSTRING "Checking System Memory..."
MSG.SYSMEM.OK >CSTRING "128k Detected.\n"
MSG.SYSMEM.KO >CSTRING "A2osX Requires At Least 128k Memory.\n"
MSG.65x >CSTRING "Checking 65x CPU..."
MSG.65x.KO >CSTRING "A2osX Requires At Least A 65C02 CPU.\n"
MSG.RAMDRV >CSTRING "Checking ProDOS RamDrive..."
MSG.RAMDRV.OK >CSTRING "Successfully Disabled.\n"
MSG.RAMDRV.KO0 >CSTRING "Not Detected.\n"
MSG.RAMDRV.KO1 >CSTRING "Uninstall Failed !!!\n"
MSG.CLOCK.OK1 >CSTRING "Already Installed.\n"
MSG.CLOCK.OK2 >CSTRING "Successfully Installed.\n"
MSG.CLOCK.KO >CSTRING "Install Failed !!!\n"
MSG.RW >CSTRING "Detecting Ramworks Card..."
MSG.RW.OK >CSTRING "Already Installed as /RAM31.\n"
MSG.RW.OK1 >CSTRING "%d Pages Detected.\n"
MSG.RW.OK2 >CSTRING "RamWorks Driver Installed.\n"
MSG.RW.OK3 >CSTRING "RamWorks Drive Formatted.\n"
MSG.RW.KO1 >CSTRING "Not Detected.\n"
MSG.RW.KO2 >CSTRING "RamWorks Driver Install Error.\n"
MSG.RW.KO3 >CSTRING "RamWorks Drive Format Error.\n"
MSG.Z80 >CSTRING "Detecting Z80 CPU..."
MSG.Z80.OK >CSTRING "Detected In Slot %d.\n"
MSG.Z80.KO >CSTRING "Not Detected.\n"
MSG.LOADING >CSTRING "Loading Kernel..."
MSG.LOADING.OK >CSTRING "%D Bytes Read.\n"
MSG.LOADING.KO >CSTRING "Error $%h While Loading Kernel.\n"
*--------------------------------------
MSG.CPUTYPEL .DA #MSG.6502
.DA #MSG.65C02
.DA #MSG.R65C02
.DA #MSG.65C816
MSG.CPUTYPEH .DA /MSG.6502
.DA /MSG.65C02
.DA /MSG.R65C02
.DA /MSG.65C816
*--------------------------------------
MSG.6502 >CSTRING "NMOS 6502.\n"
MSG.65C02 >CSTRING "CMOS 65C02.\n"
MSG.R65C02 >CSTRING "Rockwell R65C02.\n"
MSG.65C816 >CSTRING "16 Bits 65C816.\n"
*--------------------------------------
HEX .BS 2
BCD .BS 3
bFlag .BS 1
*--------------------------------------
.INB A2OSX.S.GP
.INB A2OSX.S.RW
.INB A2OSX.S.Z80
*--------------------------------------
* ****** START OF MLI QUIT CODE ******
* setup $0300 Global page :
* Copy Back from $D010-$D0FF to $300-$3F0
* setup $1000 Z80 switch code
*--------------------------------------
.PH $1000
cld
rts
ROOT.PATH .BS MLI.MAXPATH
.EP
*--------------------------------------
* Driver for NoSlotClock
* Load at (DATETIME+1)
*--------------------------------------
*--------------------------------------
MAN
SAVE A2OSX.S
ASM

22
A2osX.STARTUP.txt Normal file
View File

@ -0,0 +1,22 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
SET PATH=%A2OSX%SBIN/;%A2OSX%BIN/
SET DRV=%A2OSX%DRV/
SET ETC=%A2OSX%ETC/
SET LIB=%A2OSX%LIB/
LOAD CONSOLE.DRV
EXEC GETTY KBD CON SHELL
*LOAD SSC.DRV 9600 N 8 1
*EXEC GETTY COM2 COM2 SHELL
*LOAD PPIC.DRV
LOAD UTHERNET.DRV 000E3A123456
EXEC TCPIP ETH3
EXEC DHCPCLNT
*EXEC TELNETD
*MOUNT TFTP 192.168.1.5:/AO2SX /TFTP
LOAD DHGR.DRV
MAN
TEXT A2OSX.STARTUP

219
BIN/ARP.S.txt Normal file
View File

@ -0,0 +1,219 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/ARP
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ARP.TIMEOUT .EQ 50 50*100ms = 5 sec.
*--------------------------------------
ZPPTR1 .EQ ZPBIN
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.LIBTCPIP .DA LIBTCPIP
L.SSCANF.IP .DA SSCANF.IP
L.DST.IP .DA DST.IP
L.DST.MAC .DA DST.MAC
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIBSTR
sta hLIBSTR
>LIBLOADP L.LIBTCPIP
sta hLIBTCPIP
ldy #S.PS.hARGS
lda (pPsContext),y
beq CS.INIT.CACHE
pha
>PUSHW L.DST.IP
>PUSHW L.SSCANF.IP
pla
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.SSCANF
bcs .9
stz bCTRLC
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
rts CC,Give back control to CS.RUN
.9 lda #SYSMGR.ERRSYN
sec
rts
CS.INIT.CACHE >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE
>STYA ZPPTR1
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldx #K.ARPCACHE.SIZE
.1 lda (ZPPTR1)
* beq .8
ldy #S.ARPCACHE.IP+4
.2 dey
lda (ZPPTR1),y
>PUSHA
cpy #S.ARPCACHE.IP
bne .2
ldy #S.ARPCACHE.MAC+6
.3 dey
lda (ZPPTR1),y
>PUSHA
cpy #S.ARPCACHE.MAC
bne .3
ldy #S.ARPCACHE.RETRYCNT
lda (ZPPTR1),y
>PUSHA
>PUSHB (ZPPTR1)
>PUSHW L.MSG1
phx
>LIBCALL hLIBSTR,LIBSTR.PRINTF
plx
lda ZPPTR1
clc
adc #S.ARPCACHE
sta ZPPTR1
bcc .4
inc ZPPTR1+1
.4 dex
bne .1
.8 lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
*--------------------------------------
CS.RUN lda #ARP.TIMEOUT
sta TimeOut
.1 lda bCTRLC
bne .9
>PUSHW L.DST.MAC
>PUSHW L.DST.IP
>LIBCALL hLIBTCPIP,LIBTCPIP.ARP.QUERY
bcc .2 success, print & exit
lda TimeOut
beq .9
jsr A2osX.SLEEP
bra .1
.2 ldx #5
.3 >PUSHB DST.MAC,x
dex
bpl .3
ldx #3
.4 >PUSHB DST.IP,x
dex
bpl .4
>PUSHW L.MSG2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.9 sec
rts
*--------------------------------------
CS.EVENT >PULLW pEvent
lda (pEvent)
and #S.EVT.F.TIMER is it a TIMER event?
beq .1 no....
lda TimeOut
beq .9
dec TimeOut
bra .9
.1 lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPsContext),y
bne .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .9
lda #$FF
sta bCTRLC
clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA
lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
LIBTCPIP >PSTRING "libtcpip.o"
SSCANF.IP >PSTRING "%d.%d.%d.%d"
MSG0 >CSTRING "STS RET MAC Address IP Address\n"
MSG1 >CSTRING "$%h %03d %h:%h:%h:%h:%h:%h %d.%d.%d.%d\n"
MSG2 >CSTRING "%d.%d.%d.%d is at %h:%h:%h:%h:%h:%h\n"
*--------------------------------------
DS.START
hLIBSTR .BS 1
hLIBTCPIP .BS 1
DST.IP .BS 4
DST.MAC .BS 6
TimeOut .BS 1
bCTRLC .BS 1
DS.END
*--------------------------------------
MAN
SAVE BIN/ARP.S
ASM

382
BIN/ASM.S.txt Normal file
View File

@ -0,0 +1,382 @@
PR#3
PREFIX /DATA/A2OS
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /DATA/A2OS/BIN/ASM
*---------------------------------------
.INB INC/MACROS.I
.INB INC/A2OS.I
.INB INC/LIBSTR.I
*---------------------------------------
SYM.BLOCK.SIZE .EQ 4096
SYM.BLOCK.MAX .EQ 8
*---------------------------------------
ERR.INV.ARGS .EQ 1
ERR.SRC.INV.TYPE .EQ 2
ERR.SRC.TOO.LONG .EQ 3
ERR.SYM.TOO.LARGE .EQ 10
*---------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.MSG.HELP1 .DA MSG.HELP1
L.MSG.HELP2 .DA MSG.HELP2
L.MSG.SRCLINE .DA MSG.SRCLINE
L.READ.BUFFER .DA READ.BUFFER
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA 0 Data Segment to Allocate
*---------------------------------------
CS.INIT >LIBLOADP L.LIBSTR
sta hLIBSTR
ldx #VAR.INIT.END-VAR.INIT
.1 stz VAR.INIT-1,x
dex
bne .1
ldy #S.PS.hARGS
lda (TSKMGR.TSKPTR),y
bne CS.INIT.ARGS
>PUSHW L.MSG.HELP1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW L.MSG.HELP2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda #ERR.INV.ARGS
sec
rts
CS.INIT.ARGS >SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
bne .1
lda #ERR.INV.ARGS
sec
rts
.1 ldy #1
lda (ZPQuickPtr1),y
cmp #'/'
bne .2
ldy #S.PS.hARGS
lda (TSKMGR.TSKPTR),y
>SYSCALL SYS.PStrCpyA
bra CS.INIT.ARGS.OK
.2 ldy #S.PS.hARGS
lda (TSKMGR.TSKPTR),y
>PUSHA
ldy #S.PS.hPREFIX
lda (TSKMGR.TSKPTR),y
>PUSHA
>SYSCALL SYS.PStrCat
CS.INIT.ARGS.OK sta SRC.hFILENAMES
>SYSCALL SYS.OpenFileA
bcc CS.INIT.OPEN
sec
rts
CS.INIT.OPEN sta SRC.hREFNUMS
stx SRC.hBUFFERS
inc SRC.COUNT
lda SRC.hFILENAMES
>SYSCALL SYS.GetFileInfoA
bcs .99
>STYA ZPQuickPtr1
ldy #1
lda (ZPQuickPtr1),y
sta SRC.hFILETYPES
cmp #$04 TXT?
bne .1
>PUSHBI $0D
>PUSHBI $FF
>PUSHB SRC.hREFNUMS
>SYSCALL SYS.NewLine
bcs .99
.1 cmp #$FA BAS?
bne .98
stz bSTOP
stz bCANCEL
lda (TSKMGR.TSKPTR)
ora #S.PS.F.EVENT Now accept events
sta (TSKMGR.TSKPTR)
clc
rts
.98 lda #ERR.SRC.INV.TYPE
sec
.99 rts
*--------------------------------------
CS.RUN lda bCANCEL
beq .1
sec
rts
.1 lda bSTOP
beq .2
clc
rts
.2 jsr CS.RUN.READLINE
bcs .9
>PUSHWI TmpBuffer256
>PUSHW SRC.LINENUM
>PUSHW L.MSG.SRCLINE
>LIBCALL hLIBSTR,LIBSTR.PRINTF
clc
.9 rts
*---------------------------------------
CS.RUN.READLINE ldx SRC.COUNT
lda SRC.hFILETYPES-1,x
bmi CS.RUN.READLINE.BIN
jmp CS.RUN.READLINE.TXT
*---------------------------------------
CS.RUN.READLINE.BIN >LDYAI 3 LEN + LINENUM
jsr CS.RUN.READLINE.YA
bcs .9
lda READ.BUFFER+1
sta SRC.LINENUM
lda READ.BUFFER+2
sta SRC.LINENUM+1
lda READ.BUFFER
dec
dec
dec
beq .8
tay
lda #0
jsr CS.RUN.READLINE.YA
bcs .9
ldy #0
ldx #0
.1 lda READ.BUFFER,y
bmi .2
sta TmpBuffer256,x
beq .8 Ending 00
inx
beq .99
iny
bne .1
bra .99
.2 cmp #$C0 REPEAT char?
bne .5
iny
beq .99
lda READ.BUFFER,y
iny
beq .99
.3 pha
lda READ.BUFFER,y
sta TmpBuffer256,x
pla
inx
beq .99
dec
bne .3
iny
bne .1
bra .99
.5 and #$3F Compute blank count
.6 pha
lda #$20
sta TmpBuffer256,x
pla
inx
beq .99
dec
bne .6
iny
bne .1
bra .99
.8 clc
.9 rts
.99 lda #ERR.SRC.TOO.LONG
sec
rts
*--------------------------------------
CS.RUN.READLINE.TXT >LDYAI 256 newline = $0D
jsr CS.RUN.READLINE.YA
bcs .9
clc
.9 rts
*--------------------------------------
CS.RUN.READLINE.YA >PUSHYA
>PUSHW L.READ.BUFFER
ldx SRC.COUNT
lda SRC.hREFNUMS-1,x
>PUSHA
>SYSCALL SYS.ReadFile
rts
*--------------------------------------
CS.EVENT ldy #S.EVT.hDEV is Event from active IN device?
lda (EVTMGR.EVTPTR),y
ldy #S.PS.hINDEV
cmp (TSKMGR.TSKPTR),y
bne .9
lda (EVTMGR.EVTPTR)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (EVTMGR.EVTPTR),y
bne .9
ldy #S.EVT.DATALO
lda (EVTMGR.EVTPTR),y
cmp #$03 Ctrl-C
bne .1
lda #$FF
sta bCANCEL
bra .8
.1 cmp #$13 Ctrl-S
bne .8
lda bSTOP
eor #$FF
sta bSTOP
.8 >SYSCALL SYS.DestroyEvent
clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT ldx SRC.COUNT
beq .1
lda SRC.hREFNUMS-1,x
>SYSCALL SYS.CloseFileA
ldx SRC.COUNT
lda SRC.hFILENAMES-1,x
>SYSCALL SYS.FreeMemA
ldx SRC.COUNT
lda SRC.hBUFFERS-1,x
>SYSCALL SYS.FreeMemA
dec SRC.COUNT
bne CS.QUIT
.1 lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*---------------------------------------
LOAD.ASM.T
clc
rts
*---------------------------------------
SYM.ADD
clc
rts
*---------------------------------------
SYM.LOOKUP
clc
rts
*---------------------------------------
SYM.BLOCK.ALLOC ldx #0
.1 lda SYM.BLOCKS,x
beq .2
inx
cpx #SYM.BLOCK.MAX
bne .1
lda #ERR.SYM.TOO.LARGE
sec Out of block error
rts
.2 phx Save next free block
>LDYA SYM.BLOCK.SIZE
>SYSCALL SYS.GetMem
bcs .9
txa
plx
sta SYM.BLOCKS,x
clc
.9 rts
*---------------------------------------
CS.END
T.DIRECTIVES .AS "AS"
.AS "AT"
.AS "AZ"
.AS "BS"
.AS "DA"
.AS "DO"
.AS "DU"
.AS "ED"
.AS "EL"
.AS "EN"
.AS "EP"
.AS "EQ"
.AS "FI"
.AS "HS"
.AS "IN"
.AS "LI"
.AS "MA"
.AS "OP"
.AS "OR"
.AS "PG"
.AS "PH"
.AS "TA"
.AS "TF"
.AS "TI"
.AS "US"
*---------------------------------------
LIBSTR >PSTRING "libstr.o"
MSG.HELP1 >CSTRING "A2OS-Macro Assembler (S-C MASM 2.0 Based)\n"
MSG.HELP2 >CSTRING "Usage : ASM <src file> [type TXT ($04) or S-C/BAS ($FA)]\n"
MSG.SRCLINE >CSTRING "%05D-%s\n"
*---------------------------------------
DS.START
*---------------------------------------
hLIBSTR .BS 1
bSTOP .BS 1
bCANCEL .BS 1
*---------------------------------------
VAR.INIT
SRC.COUNT .BS 1
SRC.hFILENAMES .BS 8 Store full path to opened SRC files
SRC.hFILETYPES .BS 8 Store file type of opened SRC files
SRC.hREFNUMS .BS 8 Store ref_num of opened files (Main, .INs & .INBs)
SRC.hBUFFERS .BS 8 Store hMem to allocated buffers
SRC.LINENUM .BS 2
ASM.T.hFILENAME .BS 1
ASM.T.hFILE .BS 1 handle to loaded ASM.T.xxxxx
DST.hFILENAME .BS 1
DST.hFILE .BS 1
DST.hBUFFER .BS 1
VAR.INIT.END
*---------------------------------------
ASM.T.FILENAME .BS 65 PStr ProDOS Max Path Len +1
TARGET.FILENAME .BS 65 PStr ProDOS Max Path Len +1
TARGET.FILETYPE .BS 1
READ.BUFFER .BS 256
*---------------------------------------
PASS .BS 1
ORIGIN .BS 4 32Bits Origin
SYM.BLOCKS .BS SYM.BLOCK.MAX
DS.END
*---------------------------------------
MAN
SAVE /DATA/A2OS/BIN/ASM.S
ASM

264
BIN/ASM.T.6502.S.txt Normal file
View File

@ -0,0 +1,264 @@
PR#3
PREFIX /DATA/A2OS
NEW
INC 1
AUTO 6
.TF /DATA/A2OS/BIN/ASM.T.6502
.OR $2000
*---------------------------------------
.MA AMS AMSID,"Syntax",0,"Operand",0,"Range",0
.DA #]1
.AS ]2
.DA #0
.AS ]3
.DA #0
.AS ]4
.DA #0
.EM
*---------------------------------------
.DA T.ADDR.MODES.SYNTAX
.DA T.OPCODES
*---------------------------------------
T.ADDR.MODES.SYNTAX >AMS 1,"","","" Implicit
>AMS 2,"#$1",$1","" Immediate
>AMS 3,"$2","$1=$2-@+1","-127,128" rel
>AMS 4,"$1","$1","" zp
>AMS 5,"$1,X","$1","" zp,x
>AMS 6,"$2","$2","" abs
>AMS 7,"$2,X","$2","" abs,x
>AMS 8,"$2,Y","$2","" abs,y
>AMS 9,"($2)","$2","" (abs)
>AMS 10,"($1)","$1","" (zp)
>AMS 11,"($1,X)","$1","" (zp,x)
>AMS 12,"($1),Y","$1","" (zp),x
.HS 0
*---------------------------------------
T.OPCODES .AS "ADC"
.HS 0
.HS 2,$69,4,$65,5,$75,6,$6D,7,$7D,8,$79,11,$61,12,$71
.HS 0
.AS "AND"
.HS 0
.HS
.HS 0
.AS "ASL"
.HS 0
.HS
.HS 0
.AS "BCC"
.HS 0
.HS 3,$90
.HS 0
.AS "BCS"
.HS 0
.HS 3,$B0
.HS 0
.AS "BEQ"
.HS 0
.HS
.HS 0
.AS "BIT"
.HS 0
.HS
.HS 0
.AS "BMI"
.HS 0
.HS
.HS 0
.AS "BNE"
.HS 0
.HS
.HS 0
.AS "BPL"
.HS 0
.HS
.HS 0
.AS "BRK"
.HS 0
.HS
.HS 0
.AS "BVC"
.HS 0
.HS
.HS 0
.AS "BVS"
.HS 0
.HS
.HS 0
.AS "CLC"
.HS 0
.HS
.HS 0
.AS "CLD"
.HS 0
.HS
.HS 0
.AS "CLI"
.HS 0
.HS
.HS 0
.AS "CLV"
.HS 0
.HS
.HS 0
.AS "CMP"
.HS 0
.HS
.HS 0
.AS "CPX"
.HS 0
.HS
.HS 0
.AS "CPY"
.HS 0
.HS
.HS 0
.AS "DEC"
.HS 0
.HS
.HS 0
.AS "DEX"
.HS 0
.HS
.HS 0
.AS "DEY"
.HS 0
.HS
.HS 0
.AS "EOR"
.HS 0
.HS
.HS 0
.AS "INC"
.HS 0
.HS
.HS 0
.AS "INX"
.HS 0
.HS
.HS 0
.AS "INY"
.HS 0
.HS
.HS 0
.AS "JMP"
.HS 0
.HS
.HS 0
.AS "JSR"
.HS 0
.HS
.HS 0
.AS "LDA"
.HS 0
.HS
.HS 0
.AS "LDX"
.HS 0
.HS
.HS 0
.AS "LDY"
.HS 0
.HS
.HS 0
.AS "LSR"
.HS 0
.HS
.HS 0
.AS "NOP"
.HS 0
.HS
.HS 0
.AS "NOP"
.HS 0
.HS
.HS 0
.AS "ORA"
.HS 0
.HS
.HS 0
.AS "PHA"
.HS 0
.HS
.HS 0
.AS "PHP"
.HS 0
.HS
.HS 0
.AS "PLA"
.HS 0
.HS
.HS 0
.AS "ROL"
.HS 0
.HS
.HS 0
.AS "ROR"
.HS 0
.HS
.HS 0
.AS "RTI"
.HS 0
.HS
.HS 0
.AS "RTS"
.HS 0
.HS
.HS 0
.AS "SBC"
.HS 0
.HS
.HS 0
.AS "SEC"
.HS 0
.HS
.HS 0
.AS "SED"
.HS 0
.HS
.HS 0
.AS "SEI"
.HS 0
.HS
.HS 0
.AS "STA"
.HS 0
.HS
.HS 0
.AS "STX"
.HS 0
.HS
.HS 0
.AS "STY"
.HS 0
.HS
.HS 0
.AS "TAX"
.HS 0
.HS
.HS 0
.AS "TAY"
.HS 0
.HS
.HS 0
.AS "TSX"
.HS 0
.HS
.HS 0
.AS "TXA"
.HS 0
.HS
.HS 0
.AS "TXS"
.HS 0
.HS
.HS 0
.AS "TYA"
.HS 0
.HS
.HS 0
*---------------------------------------
.HS 0
MAN
SAVE /DATA/A2OS/BIN/ASM.T.6502.S
ASM

100
BIN/ASM.T.65C02.S.txt Normal file
View File

@ -0,0 +1,100 @@
PR#3
NEW
AUTO 6
.TF /DATA/A2OS/BIN/ASM.T.65C02
.OR $2000
*---------------------------------------
.MA AMS AMSID,"Syntax",0,"Operand",0,"Rule",0
.DA #]1
.AS ]2
.DA #0
.AS ]3
.DA #0
.AS ]4
.DA #0
.EM
*---------------------------------------
T.ADDR.MODES.SYNTAX >AMS 1,"","","" Implicit
>AMS 2,"#$1",$1","" Immediate
>AMS 3,"$2","$1=$2-@+1","-127<$1<128" rel
>AMS 4,"$1","$1","" zp
>AMS 5,"$1,X","$1","" zp,x
>AMS 6,"$2","$2","" abs
>AMS 7,"$2,X","$2","" abs,x
>AMS 8,"$2,Y","$2","" abs,y
>AMS 9,"($2)","$2","" (abs)
>AMS 10,"($1)","$1","" (zp)
>AMS 11,"($1,X)","$1","" (zp,x)
>AMS 12,"($1),Y","$1","" (zp),x
T.OPCODES .AS "ADC"
.HS 0
.HS 2,$69,4,$65,5,$75,6,$6D,7,$7D,8,$79,11,$61,12,$71
.HS 0
.AS "AND"
.AS "ASL"
.AS "BCC"
.HS 0
.HS 3,$90
.HS 0
.AS "BCS"
.HS 0
.HS 3,$B0
.HS 0
.AS "BEQ"
.AS "BIT"
.AS "BMI"
.AS "BNE"
.AS "BPL"
.AS "BRK"
.AS "BVC"
.AS "BVS"
.AS "CLC"
.AS "CLD"
.AS "CLI"
.AS "CLV"
.AS "CMP"
.AS "CPX"
.AS "CPY"
.AS "DEC"
.AS "DEX"
.AS "DEY"
.AS "EOR"
.AS "INC"
.AS "INX"
.AS "INY"
.AS "JMP"
.AS "JSR"
.AS "LDA"
.AS "LDX"
.AS "LDY"
.AS "LSR"
.AS "NOP"
.AS "NOP"
.AS "ORA"
.AS "PHA"
.AS "PHP"
.AS "PLA"
.AS "ROL"
.AS "ROR"
.AS "RTI"
.AS "RTS"
.AS "SBC"
.AS "SEC"
.AS "SED"
.AS "SEI"
.AS "STA"
.AS "STX"
.AS "STY"
.AS "TAX"
.AS "TAY"
.AS "TSX"
.AS "TXA"
.AS "TXS"
.AS "TYA"
*---------------------------------------
.HS 0
MAN
SAVE /DATA/A2OS/BIN/ASM.T.65C02.S
ASM

36
BIN/ASM.T.Z80.S.txt Normal file
View File

@ -0,0 +1,36 @@
PR#3
NEW
AUTO 6
.TF /DATA/A2OS/BIN/ASM.T.Z80
.OR $2000
*---------------------------------------
.MA AMS AMSID,"Syntax",0,"Operand",0,"Rule",0
.DA #]1
.AS ]2
.DA #0
.AS ]3
.DA #0
.AS ]4
.DA #0
.EM
.DA T.ADDR.MODES.SYNTAX
.DA T.OPCODES
*---------------------------------------
T.ADDR.MODES.SYNTAX >AMS 1,"","","" Implicit
>AMS 2,"#$1",$1","" Immediate8
>AMS 3,"#$2",$2","" Immediate16
>AMS 4, Modified zp
>AMS 3,"$2","$1=$2-@+1","-127<$1<128" rel
>AMS 6,"$2","$2","" abs
*---------------------------------------
T.OPCODES .AS "ADC"
.HS 0
.HS 2,$69,4,$65,5,$75,6,$6D,7,$7D,8,$79,11,$61,12,$71
.HS 0
*---------------------------------------
.HS 0
MAN
SAVE /DATA/A2OS/BIN/ASM.T.Z80.S
ASM

0
BIN/CHMOD.S.txt Normal file
View File

401
BIN/CHTYP.S.txt Normal file
View File

@ -0,0 +1,401 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/CHTYP
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBSTR.I
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIB.LIBSTR .DA LIB.LIBSTR
L.MSG.VOL.HEADER .DA MSG.VOL.HEADER
L.MSG.DIR.HEADER .DA MSG.DIR.HEADER
L.MSG.VOL .DA MSG.VOL
L.MSG.DIR .DA MSG.DIR
L.MSG.FILE .DA MSG.FILE
L.MSG.VOL.END .DA MSG.VOL.END
L.MSG.DIR.END .DA MSG.DIR.END
L.PRODOS.FT.TXT .DA PRODOS.FT.TXT
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIB.LIBSTR
sta hLIBSTR
stz hDIRPATH
stz hS.LISTDIR
stz hVOLHEADER
stz hDIRHEADER
stz bSTOP
stz bCANCEL
ldy #S.PS.hARGS
lda (pPsContext),y
beq .99 no arg, exit with err=0
>PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 1 Push 1 for getting First arg
>SYSCALL SYS.PStrGetTkn
bcs .99 error, exit with error code
sta hArg
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
beq .99
ldy #1
lda (ZPQuickPtr1),y
cmp #'$' is it a TYPE ?
bne .11
.11 cmp #'/'
bne .10
ldy #S.PS.hARGS
bra .2
.10 ldy #S.PS.hARGS
lda (pPsContext),y
>PUSHA
ldy #S.PS.hPREFIX
lda (pPsContext),y
>PUSHA
>SYSCALL SYS.PStrCat
sta hDIRPATH
bra .3
.1 ldy #S.PS.hPREFIX
.2 lda (pPsContext),y
.3 >SYSCALL SYS.ListDirInitA
bcs .98
sta hS.LISTDIR
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc
rts
.98 pha
lda hLIBSTR
>SYSCALL SYS.FreeMemA
pla
.99 sec
rts
*--------------------------------------
CS.RUN lda bCANCEL
beq .1
sec
rts
.1 lda bSTOP
beq .2
clc
rts
.2 lda hS.LISTDIR
>SYSCALL SYS.ListDirNextA
bcc .3
jmp Push.Footer
.3 pha
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
pha
and #$0F
sta (ZPQuickPtr1) Adjust Filename len
pla
and #$F0
cmp #$F0 Volume ($F) HEADER ?
bne .31
pla
sta hVOLHEADER
>PUSHW ZPQuickPtr1
>PUSHW L.MSG.VOL.HEADER
>LIBCALL hLIBSTR,LIBSTR.PRINTF
clc
rts
.31 cmp #$E0 Dir ($E) HEADER ?
bne .4
pla
sta hDIRHEADER
>PUSHW ZPQuickPtr1
>PUSHW L.MSG.DIR.HEADER
>LIBCALL hLIBSTR,LIBSTR.PRINTF
clc
rts
.4 cmp #$D0 Directory ?
bne .5
jsr Push.Dates
jsr Push.Dir
>PUSHW L.MSG.DIR
bra .8
.5 cmp #$C0 Volume Name ?
bne .6
>PUSHW ZPQuickPtr1
>PUSHW L.MSG.VOL
bra .8
.6 jsr Push.Dates File
jsr Push.File
>PUSHW L.MSG.FILE
.8 >LIBCALL hLIBSTR,LIBSTR.PRINTF
.9 pla
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
Push.Dir ldy #$1E get access mask
lda (ZPQuickPtr1),y
>PUSHA
>PUSHW ZPQuickPtr1
rts
*--------------------------------------
Push.File >PUSHBI 0 4th byte of file len=0
ldy #$17 get file len (3 bytes)
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$1E get access mask
lda (ZPQuickPtr1),y
>PUSHA
ldy #$20 get aux type
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$10 get filetype
lda L.PRODOS.FT.TXT
sta ZPQuickPtr2
lda L.PRODOS.FT.TXT+1
sta ZPQuickPtr2+1
ldx #0
.1 lda (ZPQuickPtr1),y
cmp PRODOS.FT.ID,x
beq .3
lda ZPQuickPtr2
clc
adc #4
sta ZPQuickPtr2
bcc .2
inc ZPQuickPtr2+1
.2 inx
cpx PRODOS.FT.COUNT
bne .1
lda (ZPQuickPtr1),y
lsr
lsr
lsr
lsr
tax
lda HEXDIGIT,x
sta PRODOS.FT.DFLT+2
lda (ZPQuickPtr1),y
and #$0F
tax
lda HEXDIGIT,x
sta PRODOS.FT.DFLT+3
.3 >PUSHW ZPQuickPtr2
>PUSHW ZPQuickPtr1
>LIBCALL hLIBSTR,LIBSTR.LCASEP
>PUSHW ZPQuickPtr1
rts
*--------------------------------------
Push.Dates ldy #$24 get modification time
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$22
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$1B get creation time
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$19
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
rts
*--------------------------------------
Push.Footer lda hVOLHEADER
beq .20
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
ldy #22 file_count
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
>PUSHW L.MSG.VOL.END
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.20 lda hDIRHEADER
beq .21
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
ldy #22 file_count
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
>PUSHW L.MSG.DIR.END
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.21 sec
rts
*--------------------------------------
CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPsContext),y
bne .9
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .1
lda #$FF
sta bCANCEL
bra .8
.1 cmp #$13 Ctrl-S
bne .8
lda bSTOP
eor #$FF
sta bSTOP
.8 >SYSCALL SYS.DestroyEvent
clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hVOLHEADER
beq .1
>SYSCALL SYS.FreeMemA
.1 lda hDIRHEADER
beq .2
>SYSCALL SYS.FreeMemA
.2 lda hS.LISTDIR
>SYSCALL SYS.ListDirCloseA
lda hDIRPATH
beq .3
>SYSCALL SYS.FreeMemA
.3 lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
CS.END
LIB.LIBSTR >PSTRING "libstr.o"
MSG.VOL.HEADER >CSTRING "Volume Listing Of %S\n"
MSG.DIR.HEADER >CSTRING "Directory Listing Of %S\n"
MSG.VOL >CSTRING "/%S\n"
MSG.DIR >CSTRING "/%15S <dir> %a %T %t %T %t\n"
MSG.FILE >CSTRING "%15S %S $%H %a %8L %T %t %T %t\n"
MSG.VOL.END >CSTRING "%D Files In Volume.\n"
MSG.DIR.END >CSTRING "%D Files In Directory.\n"
*--------------------------------------
PRODOS.FT.COUNT .HS 07
PRODOS.FT.ID .HS 0406FAFCFDE2FF
PRODOS.FT.TXT
T04 >PSTRING "TXT"
T06 >PSTRING "BIN"
TFA >PSTRING "S-C"
TFC >PSTRING "BAS"
TFD >PSTRING "VAR"
TE2 >PSTRING "ATK"
TFF >PSTRING "SYS"
PRODOS.FT.DFLT >PSTRING "$ "
HEXDIGIT .AS '0123456789ABCDEF'
*--------------------------------------
DS.START
hLIBSTR .BS 1
hDIRPATH .BS 1
hS.LISTDIR .BS 1
hVOLHEADER .BS 1
hDIRHEADER .BS 1
bSTOP .BS 1
bCANCEL .BS 1
DS.END
*--------------------------------------
MAN
SAVE BIN/CHTYP.S
ASM

183
BIN/DNS.S.txt Normal file
View File

@ -0,0 +1,183 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST ON
.OP 65C02
.OR $2000
.TF BIN/DNS
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.LIBTCPIP .DA LIBTCPIP
L.SSCANF.IP .DA SSCANF.IP
L.IP .DA IP
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT stz hHostName
stz hIP
>LIBLOADP L.LIBSTR
sta hLIBSTR
>LIBLOADP L.LIBTCPIP
sta hLIBTCPIP
ldy #S.PS.hARGS
lda (pPsContext),y
bne CS.INIT.ADD
jmp CS.INIT.DUMP
CS.INIT.ADD >PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 1 Push 1 for getting hostname
>SYSCALL SYS.PStrGetTkn
bcs .91
sta hHostName
ldy #S.PS.hARGS
lda (pPsContext),y
>PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 2 Push 2 for getting IP
>SYSCALL SYS.PStrGetTkn
.91 bcs .9
sta hIP
>PUSHW L.IP
>PUSHW L.SSCANF.IP
lda hIP
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.SSCANF
bcs .9
>PUSHWI 1800 default TTL
>PUSHW L.IP
>PUSHB hHostName
>LIBCALL hLIBTCPIP,LIBTCPIP.DNS.ADD
bcs .99
lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
.9 lda #SYSMGR.ERRSYN
sec
.99 rts
CS.INIT.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.DNS.GETCACHE
>STYA ZPPTR1
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldx #K.DNSCACHE.SIZE
.1 phx
lda (ZPPTR1)
beq .2
ldy #S.DNSCACHE.IP+3
lda (ZPPTR1),y
>PUSHA
dey
lda (ZPPTR1),y
>PUSHA
dey
lda (ZPPTR1),y
>PUSHA
dey
lda (ZPPTR1),y
>PUSHA
ldy #S.DNSCACHE.TTL
lda (ZPPTR1),y
pha
iny
lda (ZPPTR1),y
ply
>PUSHYA
ldy #S.DNSCACHE.hNAME
lda (ZPPTR1),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHB (ZPPTR1)
>PUSHW L.MSG1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.2 lda ZPPTR1
clc
adc #S.DNSCACHE
sta ZPPTR1
bcc .3
inc ZPPTR1+1
.3 plx
dex
bne .1
lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
*--------------------------------------
CS.RUN
CS.EVENT clc
rts
*--------------------------------------
CS.QUIT lda hHostName
beq .1
>SYSCALL SYS.FreeMemA
.1 lda hIP
beq .2
>SYSCALL SYS.FreeMemA
.2 lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA
lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
LIBTCPIP >PSTRING "libtcpip.o"
SSCANF.IP >PSTRING "%d.%d.%d.%d"
MSG0 >CSTRING "STS Hostname TTL IP Address\n"
MSG1 >CSTRING "$%h %32S %05D %d.%d.%d.%d\n"
DS.START
hLIBSTR .BS 1
hLIBTCPIP .BS 1
hHostName .BS 1
hIP .BS 1
IP .BS 4
DS.END
MAN
SAVE BIN/DNS.S
ASM

0
BIN/EDIT.S.txt Normal file
View File

0
BIN/KILL.S.txt Normal file
View File

389
BIN/LS.S.txt Normal file
View File

@ -0,0 +1,389 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/LS
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBSTR.I
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIB.LIBSTR .DA LIB.LIBSTR
L.MSG.VOL.HEADER .DA MSG.VOL.HEADER
L.MSG.DIR.HEADER .DA MSG.DIR.HEADER
L.MSG.VOL .DA MSG.VOL
L.MSG.DIR .DA MSG.DIR
L.MSG.FILE .DA MSG.FILE
L.MSG.VOL.END .DA MSG.VOL.END
L.MSG.DIR.END .DA MSG.DIR.END
L.PRODOS.FT.TXT .DA PRODOS.FT.TXT
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIB.LIBSTR
sta hLIBSTR
stz hDIRPATH
stz hS.LISTDIR
stz hVOLHEADER
stz hDIRHEADER
stz bSTOP
stz bCANCEL
ldy #S.PS.hARGS
lda (pPsContext),y
beq .1
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
beq .1
ldy #1
lda (ZPQuickPtr1),y
cmp #'/'
bne .10
ldy #S.PS.hARGS
bra .2
.10 ldy #S.PS.hARGS
lda (pPsContext),y
>PUSHA
ldy #S.PS.hPREFIX
lda (pPsContext),y
>PUSHA
>SYSCALL SYS.PStrCat
sta hDIRPATH
bra .3
.1 ldy #S.PS.hPREFIX
.2 lda (pPsContext),y
.3 >SYSCALL SYS.ListDirInitA
bcs .98
sta hS.LISTDIR
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc
rts
.98 pha
lda hLIBSTR
>SYSCALL SYS.FreeMemA
pla
sec
rts
*--------------------------------------
CS.RUN lda bCANCEL
beq .1
sec
rts
.1 lda bSTOP
beq .2
clc
rts
.2 lda hS.LISTDIR
>SYSCALL SYS.ListDirNextA
bcc .3
jmp Push.Footer
.3 pha
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
pha
and #$0F
sta (ZPQuickPtr1) Adjust Filename len
pla
and #$F0
cmp #$F0 Volume ($F) HEADER ?
bne .31
pla
sta hVOLHEADER
>PUSHW ZPQuickPtr1
>PUSHW L.MSG.VOL.HEADER
>LIBCALL hLIBSTR,LIBSTR.PRINTF
clc
rts
.31 cmp #$E0 Dir ($E) HEADER ?
bne .4
pla
sta hDIRHEADER
>PUSHW ZPQuickPtr1
>PUSHW L.MSG.DIR.HEADER
>LIBCALL hLIBSTR,LIBSTR.PRINTF
clc
rts
.4 cmp #$D0 Directory ?
bne .5
jsr Push.Dates
jsr Push.Dir
>PUSHW L.MSG.DIR
bra .8
.5 cmp #$C0 Volume Name ?
bne .6
>PUSHW ZPQuickPtr1
>PUSHW L.MSG.VOL
bra .8
.6 jsr Push.Dates File
jsr Push.File
>PUSHW L.MSG.FILE
.8 >LIBCALL hLIBSTR,LIBSTR.PRINTF
.9 pla
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
Push.Dir ldy #$1E get access mask
lda (ZPQuickPtr1),y
>PUSHA
>PUSHW ZPQuickPtr1
rts
*--------------------------------------
Push.File >PUSHBI 0 4th byte of file len=0
ldy #$17 get file len (3 bytes)
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$1E get access mask
lda (ZPQuickPtr1),y
>PUSHA
ldy #$20 get aux type
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$10 get filetype
lda L.PRODOS.FT.TXT
sta ZPQuickPtr2
lda L.PRODOS.FT.TXT+1
sta ZPQuickPtr2+1
ldx #0
.1 lda (ZPQuickPtr1),y
cmp PRODOS.FT.ID,x
beq .3
lda ZPQuickPtr2
clc
adc #4
sta ZPQuickPtr2
bcc .2
inc ZPQuickPtr2+1
.2 inx
cpx PRODOS.FT.COUNT
bne .1
lda (ZPQuickPtr1),y
lsr
lsr
lsr
lsr
tax
lda HEXDIGIT,x
sta PRODOS.FT.DFLT+2
lda (ZPQuickPtr1),y
and #$0F
tax
lda HEXDIGIT,x
sta PRODOS.FT.DFLT+3
.3 >PUSHW ZPQuickPtr2
>PUSHW ZPQuickPtr1
>LIBCALL hLIBSTR,LIBSTR.LCASEP
>PUSHW ZPQuickPtr1
rts
*--------------------------------------
Push.Dates ldy #$24 get modification time
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$22
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$1B get creation time
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
ldy #$19
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
rts
*--------------------------------------
Push.Footer lda hVOLHEADER
beq .20
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
ldy #22 file_count
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
>PUSHW L.MSG.VOL.END
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.20 lda hDIRHEADER
beq .21
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
ldy #22 file_count
lda (ZPQuickPtr1),y
>PUSHA
dey
lda (ZPQuickPtr1),y
>PUSHA
>PUSHW L.MSG.DIR.END
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.21 sec
rts
*--------------------------------------
CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPsContext),y
bne .9
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .1
lda #$FF
sta bCANCEL
bra .8
.1 cmp #$13 Ctrl-S
bne .8
lda bSTOP
eor #$FF
sta bSTOP
.8 >SYSCALL SYS.DestroyEvent
clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hVOLHEADER
beq .1
>SYSCALL SYS.FreeMemA
.1 lda hDIRHEADER
beq .2
>SYSCALL SYS.FreeMemA
.2 lda hS.LISTDIR
>SYSCALL SYS.ListDirCloseA
lda hDIRPATH
beq .3
>SYSCALL SYS.FreeMemA
.3 lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
CS.END
LIB.LIBSTR >PSTRING "libstr.o"
MSG.VOL.HEADER >CSTRING "Volume Listing Of %S\n"
MSG.DIR.HEADER >CSTRING "Directory Listing Of %S\n"
MSG.VOL >CSTRING "/%S\n"
MSG.DIR >CSTRING "/%15S <dir> %a %T %t %T %t\n"
MSG.FILE >CSTRING "%15S %S $%H %a %8L %T %t %T %t\n"
MSG.VOL.END >CSTRING "%D Files In Volume.\n"
MSG.DIR.END >CSTRING "%D Files In Directory.\n"
*--------------------------------------
PRODOS.FT.COUNT .HS 07
PRODOS.FT.ID .HS 0406FAFCFDE2FF
PRODOS.FT.TXT
T04 >PSTRING "TXT"
T06 >PSTRING "BIN"
TFA >PSTRING "S-C"
TFC >PSTRING "BAS"
TFD >PSTRING "VAR"
TE2 >PSTRING "ATK"
TFF >PSTRING "SYS"
PRODOS.FT.DFLT >PSTRING "$ "
HEXDIGIT .AS '0123456789ABCDEF'
*--------------------------------------
DS.START
hLIBSTR .BS 1
hDIRPATH .BS 1
hS.LISTDIR .BS 1
hVOLHEADER .BS 1
hDIRHEADER .BS 1
bSTOP .BS 1
bCANCEL .BS 1
DS.END
*--------------------------------------
MAN
SAVE BIN/LS.S
ASM

139
BIN/LSDEV.S.txt Normal file
View File

@ -0,0 +1,139 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/LSDEV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBSTR.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPPTR2 .EQ ZPBIN+2
ZPPTR3 .EQ ZPBIN+4
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA 0 Data Segment to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIBSTR
* bcs .9
sta hLIBSTR
>SYSCALL SYS.GetDevTable
>STYA ZPPTR1
stz DEV.COUNT
L0 >PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda #22
sta LINE.COUNT
L1 lda (ZPPTR1)
bmi .1
jmp L41
.1 ldy #S.DEV.hARGS
lda (ZPPTR1),y
beq L10
>SYSCALL SYS.GetMemPtrA
>PUSHYA
bra L11
L10 >PUSHW L.MSG2
L11 ldy #S.DEV.hCMD
lda (ZPPTR1),y
beq L12
>SYSCALL SYS.GetMemPtrA
>PUSHYA
bra L13
L12 >PUSHW L.MSG2
L13 lda ZPPTR1
clc
adc #S.DEV.NAME
sta ZPPTR2
lda ZPPTR1+1
adc #0
sta ZPPTR2+1
>PUSHW ZPPTR2
ldy #S.DEV.hOWNERPS
lda (ZPPTR1),y
>PUSHA Owner PSID
lda (ZPPTR1) push flags
>PUSHA
ldy #S.DEV.ID
lda (ZPPTR1),y
>PUSHA DevID
>PUSHW L.MSG1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
L4 dec LINE.COUNT
L41 lda ZPPTR1
clc
adc #S.DEV.SIZE
sta ZPPTR1
bcc L5
inc ZPPTR1+1
L5 inc DEV.COUNT
lda DEV.COUNT
cmp #K.DEV.MAX
beq L8
lda LINE.COUNT
beq L6
jmp L1
L6 >DEBUG
jmp L0
L8 lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
*--------------------------------------
CS.RUN
CS.EVENT clc
rts
*--------------------------------------
CS.QUIT lda hLIBSTR
bra *
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
CS.END
hLIBSTR .BS 1
DEV.COUNT .BS 1
LINE.COUNT .BS 1
LIBSTR >PSTRING "libstr.o"
MSG0 >CSTRING "hDev Flags PID NAME CMD ARGS\n"
MSG1 >CSTRING " %03d %b $%h %4S %16S %32S\n"
MSG2 >PSTRING "(none)"
MAN
SAVE BIN/LSDEV.S
ASM

285
BIN/MEM.S.txt Normal file
View File

@ -0,0 +1,285 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/MEM
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBSTR.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPPTR2 .EQ ZPBIN+2
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
L.MSG3 .DA MSG3
L.MSG4 .DA MSG4
L.MSG5 .DA MSG5
L.MSG6 .DA MSG6
L.MSG7 .DA MSG7
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIBSTR
bcs .9
sta hLIBSTR
stz LINE.COUNT
stz MEM.COUNT
stz USED.COUNT
stz bSTOP
stz bCANCEL
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc
.9 rts
*--------------------------------------
CS.RUN lda bCANCEL
bne .99
lda bSTOP
bne .8
lda LINE.COUNT
bne .1
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.1 lda MEM.COUNT
>SYSCALL SYS.GetMemByIDA
>STYA ZPPTR1
lda (ZPPTR1)
bpl .2
inc USED.COUNT
.2 jsr CS.RUN.PRINTMEM
inc MEM.COUNT
lda MEM.COUNT
cmp MEMMGR.TABLESIZE
beq .9
.8
clc
rts
.9 jsr CS.RUN.PRINTEND
.99 sec
rts
*--------------------------------------
CS.RUN.PRINTMEM ldy #S.MEM.LEN
lda (ZPPTR1),y
pha
iny
lda (ZPPTR1),y
ply
>PUSHYA
ldy #S.MEM.PTR
lda (ZPPTR1),y
pha
iny
lda (ZPPTR1),y
ply
>PUSHYA
ldy #S.MEM.REFCNT
lda (ZPPTR1),y
>PUSHA
ldy #S.MEM.OWNERPID
lda (ZPPTR1),y
>PUSHA
lda (ZPPTR1)
>PUSHA
lda MEM.COUNT
>PUSHA
>PUSHW L.MSG1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.MEM.BIN
lda (ZPPTR1),y
bne .3
ldy #S.MEM.PTR
lda (ZPPTR1),y
sta ZPPTR2
iny
lda (ZPPTR1),y
sta ZPPTR2+1
lda #"{"
jsr COUT
lda (ZPPTR2)
jsr PRBYTE
lda #"|"
jsr COUT
ldy #1
.1 lda (ZPPTR2),y
ora #$80
cmp #$A0
bcs .2
ora #$20
.2 jsr COUT
iny
cpy #40
bne .1
lda #"}"
jsr COUT
bra .4
.3 >SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.PRINTP
.4 jsr CROUT
inc LINE.COUNT
lda LINE.COUNT
cmp #22
bne .5
lda #$FF
sta bSTOP
stz LINE.COUNT
.5 rts
*--------------------------------------
CS.RUN.PRINTEND >PUSHB MEM.COUNT
>PUSHB USED.COUNT
>PUSHW L.MSG2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MEMMGR.LOMEM
>PUSHW L.MSG3
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MEMMGR.MLLIMIT
>PUSHW L.MSG4
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MEMMGR.MHLIMIT
>PUSHW L.MSG5
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MEMMGR.HIMEM
>PUSHW L.MSG6
>LIBCALL hLIBSTR,LIBSTR.PRINTF
>PUSHW MEMMGR.MFREE
>PUSHW L.MSG7
>LIBCALL hLIBSTR,LIBSTR.PRINTF
rts
*--------------------------------------
CS.DOEVENT >PULLW pEvent
ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPsContext),y
bne .9
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .1
lda #$FF
sta bCANCEL
bra .8
.1 cmp #$13 Ctrl-S
bne .2
lda bSTOP
eor #$FF
sta bSTOP
bra .8
.2 lda bSTOP
beq .8
stz bSTOP
.8 >SYSCALL SYS.DestroyEvent
clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
PRBYTE pha
lsr
lsr
lsr
lsr
ora #$B0
cmp #$BA
bcc .1
adc #6
.1 jsr COUT
pla
and #$0F
ora #$B0
cmp #$BA
bcc COUT
adc #6
bra COUT
*--------------------------------------
CROUT lda #13
*--------------------------------------
COUT phx
phy
>PUSHA
ldy #S.PS.hOUTDEV
lda (pPsContext),y
>SYSCALL SYS.DevOutA
ply
plx
rts
*--------------------------------------
CS.END
DS.START
*--------------------------------------
hLIBSTR .BS 1
LINE.COUNT .BS 1
MEM.COUNT .BS 1
USED.COUNT .BS 1
bSTOP .BS 1
bCANCEL .BS 1
LIBSTR >PSTRING "libstr.o"
MSG0 >CSTRING "hMem Flags PID REF PTR LEN BINPATH/DATA\n"
MSG1 >CSTRING " %03d %b $%h $%h $%H $%H "
MSG2 >CSTRING "\nAllocated hMem:%d, Total:%d\n"
MSG3 >CSTRING "Low Memory: $%H\n"
MSG4 >CSTRING "Low Free PTR: $%H\n"
MSG5 >CSTRING "High Free PTR: $%H\n"
MSG6 >CSTRING "High Memory: $%H\n"
MSG7 >CSTRING "\nFree Memory: %D Bytes.\n"
DS.END
*--------------------------------------
MAN
SAVE BIN/MEM.S
ASM

0
BIN/MOUNT.S.txt Normal file
View File

206
BIN/NETCFG.S.txt Normal file
View File

@ -0,0 +1,206 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/NETCFG
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPPTR2 .EQ ZPBIN+2
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.MSG0 .DA MSG0
L.MSG0.0 .DA MSG0.0
L.MSG0.1 .DA MSG0.1
L.MSG0.2 .DA MSG0.2
L.MSG0.N .DA MSG0.N
L.MSG0.U .DA MSG0.U
L.MSG0.C .DA MSG0.C
L.MSG1.DEV .DA MSG1.DEV
L.MSG1.DHCPSRVR .DA MSG1.DHCPSRVR
L.MSG1.IP .DA MSG1.IP
L.MSG1.GW .DA MSG1.GW
L.MSG1.DNS .DA MSG1.DNS
L.MSG1.HOSTNAME .DA MSG1.HOSTNAME
L.MSG1.DOMAIN .DA MSG1.DOMAIN
L.MSG1.END .DA MSG1.END
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segemnt to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIBSTR
sta hLIBSTR
lda #K.PROTOID.IP
>SYSCALL SYS.GetNetCfgA
bcc CS.INIT.LOADED
>PUSHW L.MSG0.N
>PUSHW L.MSG0.2
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
jmp CS.INIT.END
CS.INIT.LOADED >STYA ZPPTR1
ldy #S.IPCFG.STATUS
lda (ZPPTR1),y
bmi CS.INIT.CONFOK
>PUSHW L.MSG0.U
>PUSHW L.MSG0.2
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
jsr CS.INIT.DEV.MAC
jmp CS.INIT.END
CS.INIT.CONFOK >PUSHW L.MSG0.C
>PUSHW L.MSG0.2
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
jsr CS.INIT.DEV.MAC
ldy #S.IPCFG.DHCPSRVR+3
ldx #4
L1 >PUSHB (ZPPTR1),y
dey
dex
bne L1
>PUSHW L.MSG1.DHCPSRVR
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.IPCFG.IP+7 IP/MASK
ldx #8
L2 >PUSHB (ZPPTR1),y
dey
dex
bne L2
>PUSHW L.MSG1.IP
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.IPCFG.GW+3
ldx #4
L4 >PUSHB (ZPPTR1),y
dey
dex
bne L4
>PUSHW L.MSG1.GW
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.IPCFG.DNS+7
ldx #8
L5 >PUSHB (ZPPTR1),y
dey
dex
bne L5
>PUSHW L.MSG1.DNS
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda ZPPTR1
clc
adc #S.IPCFG.HOSTNAME
tay
lda ZPPTR1+1
adc #0
>PUSHYA
>PUSHW L.MSG1.HOSTNAME
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.IPCFG.DOMAIN
lda (ZPPTR1),y
beq L6
lda ZPPTR1
clc
adc #S.IPCFG.DOMAIN
tay
lda ZPPTR1+1
adc #0
>PUSHYA
>PUSHW L.MSG1.DOMAIN
>LIBCALL hLIBSTR,LIBSTR.PRINTF
L6 >PUSHW L.MSG1.END
>LIBCALL hLIBSTR,LIBSTR.PRINTF
CS.INIT.END lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
*--------------------------------------
CS.INIT.DEV.MAC ldy #S.IPCFG.MAC+6
.1 dey
>PUSHB (ZPPTR1),y
cpy #S.IPCFG.MAC
bne .1
ldy #S.IPCFG.hDEV
>PUSHB (ZPPTR1),y
>PUSHW L.MSG1.DEV
>LIBCALL hLIBSTR,LIBSTR.PRINTF
rts
*--------------------------------------
CS.RUN clc
rts
*--------------------------------------
CS.DOEVENT clc
rts
*--------------------------------------
CS.QUIT lda hLIBSTR
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
MSG0 >CSTRING "Protocol:%s (%s)\n"
MSG0.0 >CSTRING "AppleTalk"
MSG0.1 >CSTRING "EtherTalk"
MSG0.2 >CSTRING "TCP/IP"
MSG0.N >CSTRING "Not Loaded"
MSG0.U >CSTRING "Unconfigured"
MSG0.C >CSTRING "Configured"
MSG1.DEV >CSTRING " DeviceID : %h,MAC=%02h:%02h:%02h:%02h:%02h:%02h\n"
MSG1.DHCPSRVR >CSTRING " DHCP Server : %d.%d.%d.%d\n"
MSG1.IP >CSTRING " IP/Mask : %d.%d.%d.%d/%d.%d.%d.%d\n"
MSG1.GW >CSTRING " Gateway : %d.%d.%d.%d\n"
MSG1.DNS >CSTRING " DNS : %d.%d.%d.%d,%d.%d.%d.%d\n"
MSG1.HOSTNAME >CSTRING " Hostname : %s"
MSG1.DOMAIN >CSTRING ".%s"
MSG1.END >CSTRING "\nEnd of network configuration.\n"
*--------------------------------------
DS.START
*--------------------------------------
hLIBSTR .BS 1
*--------------------------------------
DS.END
MAN
SAVE BIN/NETCFG.S
ASM

0
BIN/NTPDATE.S.txt Normal file
View File

367
BIN/PING.S.txt Normal file
View File

@ -0,0 +1,367 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/PING
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
PING.TIMEOUT .EQ 40 40*100ms = 4 sec.
*--------------------------------------
ZPFrameBase1 .EQ ZPBIN
ZPFrameLen1 .EQ ZPBIN+2
ZPFramePtr1 .EQ ZPBIN+4
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.LIBTCPIP .DA LIBTCPIP
L.SSCANF.IP .DA SSCANF.IP
L.DST.IP .DA DST.IP
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
L.MSG3 .DA MSG3
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT ldy #S.PS.hARGS
lda (pPsContext),y
bne .1
lda #SYSMGR.ERRSYN
sec
rts
.1 >LIBLOADP L.LIBSTR
sta hLIBSTR
>LIBLOADP L.LIBTCPIP
sta hLIBTCPIP
>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ?
bcs .9
>STYA ZPQuickPtr1
lda (ZPQuickPtr1) Configured ?
bpl .9
ldy #S.IPCFG.HDEV
lda (ZPQuickPtr1),y
sta hDev
lda A2OSX.RANDOM16
sta Identifier
lda A2OSX.RANDOM16+1
sta Identifier+1
stz Sequence
stz Sequence+1
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc
.9 rts
*--------------------------------------
CS.RUN >PUSHW L.DST.IP
>PUSHW L.SSCANF.IP
ldy #S.PS.hARGS
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.SSCANF
bcc CS.RUN.IPOK
lda #PING.TIMEOUT
sta TimeOut
CS.RUN.DNSQUERY >PUSHW L.DST.IP
ldy #S.PS.hARGS
lda (pPsContext),y
>PUSHA
>LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY
bcc CS.RUN.IPOK
jsr A2osX.SLEEP
lda TimeOut
bne CS.RUN.DNSQUERY
ldy #S.PS.hARGS
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
sec
CS.RUN.RTS rts
CS.RUN.IPOK ldy #S.PS.hARGS
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHB DST.IP+3
>PUSHB DST.IP+2
>PUSHB DST.IP+1
>PUSHB DST.IP
>PUSHW L.MSG1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
CS.RUN.ECHO >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ICMP.FRAME
bcs CS.RUN.RTS
>STYA ZPFrameBase1
stx hFrame
ldx #3
ldy #S.IP.DST+3
.1 lda DST.IP,x
sta (ZPFrameBase1),y
dey
dex
bpl .1
ldy #S.ICMP.TYPE
lda #S.ICMP.TYPE.ECHOREQ
sta (ZPFrameBase1),y
ldy #S.ICMP.IDENTIFIER
lda Identifier
sta (ZPFrameBase1),y
iny
lda Identifier+1
sta (ZPFrameBase1),y
inc Sequence
bne .2
inc Sequence+1
.2 ldy #S.ICMP.SEQUENCE
lda Sequence
sta (ZPFrameBase1),y
iny
lda Sequence+1
sta (ZPFrameBase1),y
lda #PING.TIMEOUT
sta TimeOut
.3 >PUSHWI S.ICMP+32
lda hFrame
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ICMP.FRAME
bcc .4
jsr A2osX.SLEEP
lda TimeOut
bne .3
.4 lda hFrame
>SYSCALL SYS.FreeMemA
stz bReply
lda #PING.TIMEOUT
sta TimeOut
CS.RUN.WAIT jsr A2osX.SLEEP
lda bReply
bne .1
lda bCTRLC
bne CS.RUN.ERROR
lda TimeOut
bne CS.RUN.WAIT
>PUSHB DST.IP+3
>PUSHB DST.IP+2
>PUSHB DST.IP+1
>PUSHB DST.IP
>PUSHW L.MSG2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.1 lda bCTRLC
bne CS.RUN.ERROR
lda TimeOut
beq .2
jsr A2osX.SLEEP
bra .1
.2 jmp CS.RUN.ECHO
CS.RUN.ERROR sec
rts
*--------------------------------------
CS.EVENT lda (pEvent)
and #S.EVT.F.TIMER is it a TIMER event?
beq .1 no....
lda TimeOut
beq .10
dec TimeOut
.10 sec do not discard TIMER event
rts
.1 lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .2
ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPsContext),y
bne .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .8
lda #$FF
sta bCTRLC
bra .8
.2 lda (pEvent)
and #S.EVT.F.NET
beq .9
ldy #S.EVT.hDEV
lda (pEvent),y
cmp hDev
bne .9
ldy #S.EVT.DATALO Get Frame hMem
lda (pEvent),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase1
ldy #S.IP.PROTOCOL
lda (ZPFrameBase1),y
cmp #S.IP.PROTOCOL.ICMP
bne .9
ldy #S.ICMP.TYPE
lda (ZPFrameBase1),y
cmp #S.ICMP.TYPE.ECHOREP
bne .9
ldy #S.ICMP.IDENTIFIER
lda (ZPFrameBase1),y
cmp Identifier
bne .9
iny
lda (ZPFrameBase1),y
cmp Identifier+1
bne .9
jsr CS.EVENT.REPLY
.8 >SYSCALL SYS.DestroyEvent
clc
rts
.9 sec
rts
*--------------------------------------
CS.EVENT.REPLY lda #PING.TIMEOUT
sec
sbc TimeOut
stz TimeOut.ms
stz TimeOut.ms+1
tay
beq .3
.1 lda TimeOut.ms
clc
adc #K.TIMER16RESOLUTION*20
sta TimeOut.ms
bcc .2
inc TimeOut+1+1
.2 dey
bne .1
.3 >PUSHW TimeOut.ms
ldy #S.IP.TTL
>PUSHB (ZPFrameBase1),y
ldy #S.ICMP.SEQUENCE+1
>PUSHB (ZPFrameBase1),y
dey
>PUSHB (ZPFrameBase1),y
ldy #S.IP.SRC+3
>PUSHB (ZPFrameBase1),y
dey
>PUSHB (ZPFrameBase1),y
dey
>PUSHB (ZPFrameBase1),y
dey
>PUSHB (ZPFrameBase1),y
>PUSHW L.MSG3
>LIBCALL hLIBSTR,LIBSTR.PRINTF
inc bReply
rts
*--------------------------------------
CS.QUIT lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA
lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
LIBTCPIP >PSTRING "libtcpip.o"
SSCANF.IP >PSTRING "%d.%d.%d.%d"
MSG0 >CSTRING "%S: Unknown host\n"
MSG1 >CSTRING "PING %d.%d.%d.%d (%S)\n"
MSG2 >CSTRING "%d.%d.%d.%d: TimeOut/Host unreachable\n"
MSG3 >CSTRING "32 bytes from %d.%d.%d.%d, icmp_seq=%D, ttl=%d, time=%D ms\n"
*--------------------------------------
DS.START
hLIBSTR .BS 1
hLIBTCPIP .BS 1
hDev .BS 1
DST.IP .BS 4
hFrame .BS 1
TimeOut .BS 1
TimeOut.ms .BS 2
Identifier .BS 2
Sequence .BS 2
bCTRLC .BS 1
bReply .BS 1
DS.END
*--------------------------------------
MAN
SAVE BIN/PING.S
ASM

114
BIN/PS.S.txt Normal file
View File

@ -0,0 +1,114 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/PS
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBSTR.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPPTR2 .EQ ZPBIN+2
ZPPTR3 .EQ ZPBIN+4
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA 0 Data Segment to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIBSTR
sta hLibStr
>LDYAI TSKMGR.TABLE
>STYA ZPPTR1
stz PS.COUNT
>PUSHW L.MSG0
>LIBCALL hLibStr,LIBSTR.PRINTF
.1 lda (ZPPTR1)
bpl .4
ldy #S.PS.hARGS
lda (ZPPTR1),y
beq .2
>SYSCALL SYS.GetMemPtrA
>PUSHYA
bra .3
.2 >PUSHW L.MSG2
.3 ldy #S.PS.hCMD
lda (ZPPTR1),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
ldy #S.PS.PID
lda (ZPPTR1),y
>PUSHA Parent PID
lda (ZPPTR1) push flags
>PUSHA
ldy #S.PS.ID
lda (ZPPTR1),y
>PUSHA DevID
>PUSHW L.MSG1
>LIBCALL hLibStr,LIBSTR.PRINTF
.4 lda ZPPTR1
clc
adc #S.PS.SIZE
sta ZPPTR1
bcc .5
inc ZPPTR1+1
.5 inc PS.COUNT
lda PS.COUNT
cmp #K.PS.MAX
beq .8
jmp .1
.8 lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
*--------------------------------------
CS.RUN
CS.DOEVENT clc
rts
*--------------------------------------
CS.QUIT lda hLibStr
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
CS.END
hLibStr .BS 1
PS.COUNT .BS 1
LIBSTR >PSTRING "libstr.o"
MSG0 >CSTRING "hPS Flags PID CMD ARGS\n"
MSG1 >CSTRING " %03d %b $%h %16S %32S\n"
MSG2 >PSTRING "(none)"
MAN
SAVE BIN/PS.S
ASM

153
BIN/TEST.S.txt Normal file
View File

@ -0,0 +1,153 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF BIN/TEST
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBSTR.I
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
L.MSG3 .DA MSG3
L.SSCANF.IP .DA SSCANF.IP
L.DST.IP .DA DST.IP
L.TEST1 .DA TEST1
L.TEST2 .DA TEST2
L.TEST3 .DA TEST3
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA 0 Data Segment to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIBSTR
sta hLIBSTR
ldy #S.PS.hOUTDEV
lda (TSKMGR.TSKPTR),y
>SYSCALL SYS.DevSelectA
ldy #S.PS.hPREFIX
lda (TSKMGR.TSKPTR),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.PS.hCS
lda (TSKMGR.TSKPTR),y
>SYSCALL SYS.GetMemByIDA
>STYA ZPQuickPtr1
ldy #S.MEM.BIN
lda (ZPQuickPtr1),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHW L.MSG1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.PS.hARGS
lda (TSKMGR.TSKPTR),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
ldy #S.PS.hCMD
lda (TSKMGR.TSKPTR),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHW L.MSG2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #S.PS.hENV
lda (TSKMGR.TSKPTR),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPBIN
.1 lda (ZPBIN)
beq .2
>PUSHW ZPBIN
>PUSHW L.MSG3
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda (ZPBIN)
sec
adc ZPBIN
sta ZPBIN
bcc .1
inc ZPBIN+1
bra .1
.2 >PUSHW L.DST.IP
>PUSHW L.SSCANF.IP
>PUSHW L.TEST1
>LIBCALL hLIBSTR,LIBSTR.SSCANF
lda DST.IP+3
jsr PRBYTE
jsr CROUT
>PUSHW L.DST.IP
>PUSHW L.SSCANF.IP
>PUSHW L.TEST2
>LIBCALL hLIBSTR,LIBSTR.SSCANF
lda DST.IP+3
jsr PRBYTE
jsr CROUT
>PUSHW L.DST.IP
>PUSHW L.SSCANF.IP
>PUSHW L.TEST3
>LIBCALL hLIBSTR,LIBSTR.SSCANF
lda DST.IP+3
jsr PRBYTE
jsr CROUT
lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
*--------------------------------------
CS.RUN
CS.EVENT clc
rts
*--------------------------------------
CS.QUIT lda hLIBSTR
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
CS.END
hLIBSTR .BS 1
LIBSTR >PSTRING "libstr.o"
MSG0 >CSTRING "PREFIX=%S\n"
MSG1 >CSTRING "BIN={%S}\n"
MSG2 >CSTRING "CMD={%S},ARGS={%S}\nENV:\n"
MSG3 >CSTRING " %S\n"
TEST1 >PSTRING "198.168.1.1"
TEST2 >PSTRING "198.168.1.23"
TEST3 >PSTRING "198.168.1.4"
SSCANF.IP >PSTRING "%d.%d.%d.%d"
DST.IP .BS 4
*--------------------------------------
MAN
SAVE BIN/TEST.S
ASM

0
BIN/TOUCH.S.txt Normal file
View File

57
BIN/_TEMPLATE.S.txt Normal file
View File

@ -0,0 +1,57 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/MONITOR.I
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
.DA CS.QUIT
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segemnt to Allocate
*--------------------------------------
CS.INIT
CS.INIT.EXIT lda #0 tell TSKMGR that all done ok, but
sec we do not want to stay in memory
rts
*--------------------------------------
CS.RUN clc
rts
*--------------------------------------
CS.EVENT clc
rts
*--------------------------------------
CS.QUIT clc
rts
*--------------------------------------
CS.END
DS.START
*--------------------------------------
*--------------------------------------
DS.END
MAN
SAVE SBIN/ .S
ASM

332
DRV/CONSOLE.DRV.S.txt Normal file
View File

@ -0,0 +1,332 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF DRV/CONSOLE.DRV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/IO.I
*--------------------------------------
ZPBASL1 .EQ ZPDRV
ZPBASL2 .EQ ZPDRV+2
*--------------------------------------
* Main DRV entry point
* input :
* X = CMD
* 0 : OPEN
* 2 : GETEVENT
* 6 : OUT
* 8 : CLOSE
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CURSOR.BLINK.SPEED .EQ 2
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA OPEN
.DA GETEVENT
.DA OUT
.DA CLOSE
.DA GETINFO
.DA 0 end or relocation
.DA CS.END-CS.START Code Length To Relocate
.DA 0 Data Segemnt to Allocate
*--------------------------------------
OPEN stz CURON
lda #$80
sta INVFLG
jsr HOME
lda #S.DEV.F.CHAR+S.DEV.F.EVENT+S.DEV.F.OUT
sta (pDevContext)
ldy #S.DEV.NAME
ldx #0
.1 lda DEVNAME,x
sta (pDevContext),y
cpx DEVNAME
beq .8
inx
iny
bne .1
.8 lda A2osX.SCREENS
ora #A2osX.SCREENS.C
sta A2osX.SCREENS
clc
rts
*--------------------------------------
GETEVENT >PULLW pEvent
lda A2osX.TIMER16
and #CURSOR.BLINK.SPEED
eor CURON
beq .9
jsr CURBLNK
.9 lda #0 Error = no event
sec
rts
*--------------------------------------
OUT >PULLA
jsr COUT
clc
rts
*--------------------------------------
CLOSE lda A2osX.SCREENS
and #$FF^A2osX.SCREENS.C
sta A2osX.SCREENS
clc
rts
*--------------------------------------
GETINFO clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
COUT cmp #8
bne .2
ldx CH
beq .10
dec CH
bra .12
.10 ldy CV
bne .11
rts
.11 lda #79
sta CH
dec CV
.12 lda #$A0
ldx CH
ldy CV
jsr SetCharAtXY
rts
.2 cmp #13
beq CROUT
ldx CH
ldy CV
jsr SetCharAtXY
FSOUT ldx CH
cpx #79
beq CROUT1
inc CH
rts
*--------------------------------------
CROUT jsr CLREOL
CROUT1 stz CH
ldy CV
cpy #23
beq SCROLL.UP
inc CV
rts
SCROLL.UP ldx #0
sta SET80STORE
.1 lda BASEL,x
sta ZPBASL1
lda BASEH,x
sta ZPBASL1+1
inx
lda BASEL,x
sta ZPBASL2
lda BASEH,x
sta ZPBASL2+1
ldy #39
sta SETPAGE2
.2 lda (ZPBASL2),y
sta (ZPBASL1),y
dey
bpl .2
ldy #39
sta CLRPAGE2
.3 lda (ZPBASL2),y
sta (ZPBASL1),y
dey
bpl .3
cpx #23
bne .1
*--------------------------------------
CLREOL ldx CH
.1 phx
ldy CV
lda #$A0
jsr SetCharAtXY
plx
inx
cpx #80
bne .1
rts
*--------------------------------------
HOME stz CH
stz CV
lda RDPAGE2
pha
lda RD80STORE
pha
sta SET80STORE
ldx #23
.1 lda BASEL,x
sta ZPBASL1
lda BASEH,x
sta ZPBASL1+1
lda #' '
ora INVFLG
sta CLRPAGE2
ldy #39
.2 sta (ZPBASL1),y
dey
bpl .2
sta SETPAGE2
ldy #39
.3 sta (ZPBASL1),y
dey
bpl .3
dex
bpl .1
pla
bmi .4
sta CLR80STORE
bra .5
.4 sta SET80STORE
.5 pla
bmi .6
sta CLRPAGE2
bra .8
.6 sta SETPAGE2
.8 rts
*--------------------------------------
CUROFF lda CURON
beq CUREXIT.RTS
CURBLNK lda A2osX.ACTIVESCRN
and #A2osX.SCREENS.C
bne CURBLNK1
lda CURON
bne CURBLNK.OFF
rts do not Light if screen is not active
CURBLNK1 lda CURON
bne CURBLNK.OFF
ldx CH
ldy CV
jsr GetCharAtXY
sta CURCHAR
ldx CH
ldy CV
lda #$20
jsr SetCharAtXY
bra CUREXIT
CURBLNK.OFF ldx CH
ldy CV
lda CURCHAR
jsr SetCharAtXY
CUREXIT lda CURON
eor #CURSOR.BLINK.SPEED
sta CURON
CUREXIT.RTS rts
*--------------------------------------
SetCharAtXY pha
lda RDPAGE2
pha
lda RD80STORE
pha
sta SET80STORE
txa
lsr
bcc .1
clc
sta CLRPAGE2
bra .2
.1 sta SETPAGE2
.2 adc BASEL,y
sta ZPBASL1
lda BASEH,y
sta ZPBASL1+1
ply
plx
pla
sta (ZPBASL1)
tya
bmi .3
sta CLR80STORE
.3 txa
bpl .4
sta SETPAGE2
rts
.4 sta CLRPAGE2
rts
*--------------------------------------
GetCharAtXY sta SET80STORE
txa
lsr
bcc .1
clc
sta CLRPAGE2
bra .2
.1 sta SETPAGE2
.2 adc BASEL,y
sta ZPBASL1
lda BASEH,y
sta ZPBASL1+1
lda (ZPBASL1)
rts
*--------------------------------------
CS.END
DEVNAME >PSTRING "CON"
CH .BS 1
CV .BS 1
INVFLG .BS 1
CURON .BS 1
CURCHAR .BS 1
*--------------------------------------
BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0
BASEH .HS 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07
*--------------------------------------
MAN
SAVE DRV/CONSOLE.DRV.S
ASM

483
DRV/DHGR.DRV.S.txt Normal file
View File

@ -0,0 +1,483 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF DRV/DHGR.DRV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/IO.I
*--------------------------------------
ZPBASE .EQ ZPDRV
ZPCOLOR .EQ ZPDRV+2
*--------------------------------------
* Main DRV entry point
* input :
* X = CMD
* 0 : OPEN
* 2 : GETEVENT
* 6 : OUT
* 8 : CLOSE
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA OPEN
.DA GETEVENT
.DA OUT
.DA CLOSE
.DA GETINFO
.DA SETPIXEL
.DA GETPIXEL
.DA HLINE
.DA VLINE
.DA FILLREC
.DA BITBLT
L.DEVINFO .DA DEVINFO
.DA 0 end or relocation
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
OPEN
lda #S.DEV.F.GFX
sta (pDevContext)
ldy #S.DEV.NAME
ldx #0
.1 lda DEVNAME,x
sta (pDevContext),y
cpx DEVNAME
beq .8
inx
iny
bne .1
.8 lda A2osX.SCREENS
ora #A2osX.SCREENS.G
sta A2osX.SCREENS
clc
rts
*--------------------------------------
GETEVENT
OUT clc
rts
*--------------------------------------
CLOSE lda A2osX.SCREENS
and #$FF^A2osX.SCREENS.G
sta A2osX.SCREENS
clc
rts
*--------------------------------------
GETINFO >LDYA L.DEVINFO
clc
rts
*--------------------------------------
* SETPIXEL
*--------------------------------------
* PULLB = X.LO
* PULLB = X.HI
* PULLB = Y
* PULLB = Mode
* 00000000=mono
* 00000001=xor (mono on 1 bit)
* 10000000=color
* PULLB = Color (if not xor)
*--------------------------------------
SETPIXEL >PULLA X.LO
tax
>PULLA X.HI
lsr if 256 =< x < 511
bcs .1
lsr
bcs .2 if 512 < x
lda DIV7.0,x
tay
lda MOD7.0,x
bra .3
.1 lda DIV7.256,x
tay
lda MOD7.256,x
bra .3
.2 lda DIV7.512,x
tay
lda MOD7.512,x
.3 pha save MOD,y=DIV
>PULLA Pull Y
tax
lda BASEL,x setup line Base Ptr
sta ZPBASE
lda BASEH,x
sta ZPBASE+1
sta SET80STORE and prepare for page switching
plx get back MOD in x
>PULLA Pull Mode
bmi SETPIXEL.COLOR
*--------------------------------------
* X=MOD,Y=DIV
*--------------------------------------
SETPIXEL.MONO pha
tya
lsr
tay
bcs .1 odd=main ram
sta SETPAGE2
bra .2
.1 sta CLRPAGE2
.2 pla
lsr CS=xor
bcs SETPIXEL.MONOX
>PULLA get COLOR
lsr
bcs SETPIXEL.MONOW
lda (ZPBASE),y
and Mono.NMasks,x
sta (ZPBASE),y
rts
SETPIXEL.MONOW lda (ZPBASE),y
and #$7F switch back ths byte to mono
ora Mono.Masks,x
sta (ZPBASE),y
rts
SETPIXEL.MONOX lda (ZPBASE),y
eor Mono.Masks,x
sta (ZPBASE),y
rts
*--------------------------------------
* X=MOD,Y=DIV
*--------------------------------------
SETPIXEL.COLOR tya
lsr Divide Col by 2 to get in range 0->39
and #$FE make it 0->38 as color mask on 4 bytes
clc
adc ZPBASE ZPBASE now point to first of the 4 columns
sta ZPBASE
txa get MOD
asl times 4 to compute index in color tables
asl
tax set in X for Masks,NMasks
>PULLA get COLOR
asl
asl
tay
lda Color.Masks,x
beq .1
sta SETPAGE2
lda (ZPBASE)
and Color.NMasks,x reset existing pixel,
ora Color.Pixels,y apply color
and Color.Enable,x filter 4 color bits color.enable bit
sta (ZPBASE)
.1 inx
iny
lda Color.Masks,x
beq .2
sta CLRPAGE2
lda (ZPBASE)
and Color.NMasks,x reset existing pixel,
ora Color.Pixels,y apply color
and Color.Enable,x filter 4 color bits color.enable bit
sta (ZPBASE)
.2 inc ZPBASE
inx
iny
lda Color.Masks,x
beq .3
sta SETPAGE2
lda (ZPBASE)
and Color.NMasks,x reset existing pixel,
ora Color.Pixels,y apply color
and Color.Enable,x filter 4 color bits color.enable bit
sta (ZPBASE)
.3 inx
iny
lda Color.Masks,x
beq .8
sta CLRPAGE2
lda (ZPBASE)
and Color.NMasks,x reset existing pixel,
ora Color.Pixels,y apply color
and Color.Enable,x filter 4 color bits color.enable bit
sta (ZPBASE)
.8 rts
*--------------------------------------
GETPIXEL
*--------------------------------------
HLINE
*--------------------------------------
VLINE
*--------------------------------------
FILLREC
*--------------------------------------
* params : X,Y,W,H
*--------------------------------------
BITBLT
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
DIV7.0 .HS 0000000000000001010101010101
.HS 0202020202020203030303030303
.HS 0404040404040405050505050505
.HS 0606060606060607070707070707
.HS 0808080808080809090909090909
.HS 0A0A0A0A0A0A0A0B0B0B0B0B0B0B
.HS 0C0C0C0C0C0C0C0D0D0D0D0D0D0D
.HS 0E0E0E0E0E0E0E0F0F0F0F0F0F0F
.HS 1010101010101011111111111111
.HS 1212121212121213131313131313
.HS 1414141414141415151515151515
.HS 1616161616161617171717171717
.HS 1818181818181819191919191919
.HS 1A1A1A1A1A1A1A1B1B1B1B1B1B1B
.HS 1C1C1C1C1C1C1C1D1D1D1D1D1D1D
.HS 1E1E1E1E1E1E1E1F1F1F1F1F1F1F
.HS 2020202020202021212121212121
.HS 2222222222222223232323232323
.HS 24242424
DIV7.256 .HS 24242425252525252525
.HS 2626262626262627272727272727
.HS 2828282828282829292929292929
.HS 2A2A2A2A2A2A2A2B2B2B2B2B2B2B
.HS 2C2C2C2C2C2C2C2D2D2D2D2D2D2D
.HS 2E2E2E2E2E2E2E2F2F2F2F2F2F2F
.HS 3030303030303031313131313131
.HS 3232323232323233333333333333
.HS 3434343434343435353535353535
.HS 3636363636363637373737373737
.HS 3838383838383839393939393939
.HS 3A3A3A3A3A3A3A3B3B3B3B3B3B3B
.HS 3C3C3C3C3C3C3C3D3D3D3D3D3D3D
.HS 3E3E3E3E3E3E3E3F3F3F3F3F3F3F
.HS 4040404040404041414141414141
.HS 4242424242424243434343434343
.HS 4444444444444445454545454545
.HS 4646464646464647474747474747
.HS 4848484848484849
DIV7.512 .HS 494949494949
.HS 4A4A4A4A4A4A4A4B4B4B4B4B4B4B
.HS 4C4C4C4C4C4C4C4D4D4D4D4D4D4D
.HS 4E4E4E4E4E4E4E4F4F4F4F4F4F4F
*--------------------------------------
MOD7.0 .HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 00010203
MOD7.256 .HS 04050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600
MOD7.512 .HS 010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
.HS 0001020304050600010203040506
*--------------------------------------
BASEL .HS 00.00.00.00.00.00.00.00
.HS 80.80.80.80.80.80.80.80
.HS 00.00.00.00.00.00.00.00
.HS 80.80.80.80.80.80.80.80
.HS 00.00.00.00.00.00.00.00
.HS 80.80.80.80.80.80.80.80
.HS 00.00.00.00.00.00.00.00
.HS 80.80.80.80.80.80.80.80
.HS 28.28.28.28.28.28.28.28
.HS A8.A8.A8.A8.A8.A8.A8.A8
.HS 28.28.28.28.28.28.28.28
.HS A8.A8.A8.A8.A8.A8.A8.A8
.HS 28.28.28.28.28.28.28.28
.HS A8.A8.A8.A8.A8.A8.A8.A8
.HS 28.28.28.28.28.28.28.28
.HS A8.A8.A8.A8.A8.A8.A8.A8
.HS 50.50.50.50.50.50.50.50
.HS D0.D0.D0.D0.D0.D0.D0.D0
.HS 50.50.50.50.50.50.50.50
.HS D0.D0.D0.D0.D0.D0.D0.D0
.HS 50.50.50.50.50.50.50.50
.HS D0.D0.D0.D0.D0.D0.D0.D0
.HS 50.50.50.50.50.50.50.50
.HS D0.D0.D0.D0.D0.D0.D0.D0
*--------------------------------------
BASEH .HS 20.24.28.2C.30.34.38.3C
.HS 20.24.28.2C.30.34.38.3C
.HS 21.25.29.2D.31.35.39.3D
.HS 21.25.29.2D.31.35.39.3D
.HS 22.26.2A.2E.32.36.3A.3E
.HS 22.26.2A.2E.32.36.3A.3E
.HS 23.27.2B.2F.33.37.3B.3F
.HS 23.27.2B.2F.33.37.3B.3F
.HS 20.24.28.2C.30.34.38.3C
.HS 20.24.28.2C.30.34.38.3C
.HS 21.25.29.2D.31.35.39.3D
.HS 21.25.29.2D.31.35.39.3D
.HS 22.26.2A.2E.32.36.3A.3E
.HS 22.26.2A.2E.32.36.3A.3E
.HS 23.27.2B.2F.33.37.3B.3F
.HS 23.27.2B.2F.33.37.3B.3F
.HS 20.24.28.2C.30.34.38.3C
.HS 20.24.28.2C.30.34.38.3C
.HS 21.25.29.2D.31.35.39.3D
.HS 21.25.29.2D.31.35.39.3D
.HS 22.26.2A.2E.32.36.3A.3E
.HS 22.26.2A.2E.32.36.3A.3E
.HS 23.27.2B.2F.33.37.3B.3F
.HS 23.27.2B.2F.33.37.3B.3F
*--------------------------------------
Mono.NMasks .DA %01111110
.DA %01111101
.DA %01111011
.DA %01110111
.DA %01101111
.DA %01011111
.DA %00111111
*--------------------------------------
Mono.Masks .DA %00000001
.DA %00000010
.DA %00000100
.DA %00001000
.DA %00010000
.DA %00100000
.DA %01000000
*--------------------------------------
* bits to "and" to reset color of pixel (0 means nothing to do)
*--------------------------------------
Color.NMasks .DA %01110000.00000000.00000000.00000000
.DA %00001111.01111110.00000000.00000000
.DA %00000000.01100001.00000000.00000000
.DA %00000000.00011111.01111100.00000000
.DA %00000000.00000000.01000011.00000000
.DA %00000000.00000000.00111111.01111000
.DA %00000000.00000000.00000000.00000111
*--------------------------------------
* bits to "and" to Get color of pixel (0 means nothing to do)
* 4 bytes * 7 mods
*--------------------------------------
Color.Masks .DA %00001111.00000000.00000000.00000000 (nothing to do)
.DA %01110000.00000001.00000000.00000000 asl0,asl0,rol1,asl0,rol1,asl0,rol1
.DA %00000000.00011110.00000000.00000000 lsr1
.DA %00000000.01100000.00000011.00000000 asl1,asl1,rol2,asl1,rol2
.DA %00000000.00000000.00111100.00000000 lsr2,lsr2
.DA %00000000.00000000.01000000.00000111 asl2,asl2,rol3
.DA %00000000.00000000.00000000.01111000 lsr3,lsr3,lsr3
*--------------------------------------
Color.Enable .DA %10001111.00000000.00000000.00000000
.DA %11110000.00000001.00000000.00000000
.DA %00000000.10011110.00000000.00000000
.DA %00000000.11100000.00000011.00000000
.DA %00000000.00000000.10111100.00000000
.DA %00000000.00000000.11000000.00000111
.DA %00000000.00000000.00000000.11111000
*--------------------------------------
* bits to "ora" to set color of pixel (including "color bit set " for byte hosting bit0)
* 4 bytes * 16 Colors
* pixel masks c1110000.c3322221.c5444433.c6666555
*--------------------------------------
Color.Pixels .DA %00000000.00000000.00000000.00000000 0000,Black (color bit disable)
.DA %10010001.10100010.11000100.10001000 0001,Magenta
.DA %10100010.11000100.10001000.10010001 0010,Brown
.DA %10110011.11100110.11001100.10011001 0011,Orange
.DA %11000100.10001000.10010001.10100010 0100,Dark Green
.DA %11010101.10101010.11010101.10101010 0101,Grey1
.DA %11100110.11001100.10011001.10110011 0110,Green
.DA %11110111.11101110.11011101.10111011 0111,Yellow
.DA %10001000.10010001.10100010.11000100 1000,Dark Blue
.DA %10011001.10110011.11100110.11001100 1001,Violet
.DA %10101010.11010101.10101010.11010101 1010,Grey2
.DA %10111011.11110111.11101111.11011101 1011,Pink
.DA %11001100.10011001.10110011.11100110 1100,Medium Blue
.DA %11011101.10111011.11110111.11101110 1101,Light Blue
.DA %11101110.11011101.10111011.11110111 1110,Aqua
.DA %01111111.01111111.01111111.01111111 1111,White (color bit disable)
*Black 00 00 00 00 0000
*Magenta 08 11 22 44 0001
*Brown 44 08 11 22 0010
*Orange 4C 19 33 66 0011
*Dark Green 22 44 08 11 0100
*Grey1 2A 55 2A 55 0101
*Green 66 4C 19 33 0110
*Yellow 6E 5D 3B 77 0111
*Dark Blue 11 22 44 08 1000
*Violet 19 33 66 4C 1001
*Grey2 55 2A 55 2A 1010
*Pink 5D 3B 77 6E 1011
*Medium Blue 33 66 4C 19 1100
*Light Blue 3B 77 6E 5D 1101
*Aqua 77 6E 5D 3B 1110
*White 7F 7F 7F 7F 1111
*--------------------------------------
CS.END
DEVNAME >PSTRING "GFX"
*--------------------------------------
DS.START
*--------------------------------------
DEVINFO .DA #S.DEV.F.GFX type of DEVINFO STRUCT
DEVINFO.W .DA 560 X.SIZE
DEVINFO.H .DA 192 Y.SIZE
DS.END
*--------------------------------------
MAN
SAVE DRV/DHGR.DRV.S
ASM

108
DRV/PPIC.DRV.S.txt Normal file
View File

@ -0,0 +1,108 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF DRV/PPIC.DRV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/ZP.I
*--------------------------------------
ZPTmpPtr1 .EQ ZPDRV
*--------------------------------------
SIG.05 .EQ $48
SIG.07 .EQ $48
*--------------------------------------
* Main DRV entry point
* input :
* X = CMD
* 0 : OPEN
* 2 : GETEVENT
* 4 : SELECT
* 6 : RELEASE
* 8 : OUT
* 10 : CLOSE
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA OPEN
.DA GETEVENT
.DA SELECT
.DA RELEASE
.DA OUT
.DA CLOSE
.DA 0 end or relocation
.DA CS.END-CS.START
*--------------------------------------
OPEN stz ZPTmpPtr1
lda #$C1
sta ZPTmpPtr1+1
.1 ldy #5
lda (ZPTmpPtr1),y
cmp #SIG.05
bne .2
ldy #7
lda (ZPTmpPtr1),y
cmp #SIG.07
beq .3
.2 inc ZPTmpPtr1+1
lda ZPTmpPtr1+1
cmp #$C8
bne .1
beq .99
.3 lda ZPTmpPtr1+1
and #$0F
sta DEVSLOT
ora #$30
sta DEVNAME+4
lda #S.DEV.F.CHAR+S.DEV.F.OUT
sta (DEVMGR.DEVPTR)
ldy #S.DEV.NAME
ldx #0
.7 lda DEVNAME,x
sta (DEVMGR.DEVPTR),y
cpx DEVNAME
beq .8
inx
iny
bne .7
.8 clc
rts
.99 lda #DEVMGR.ERRNOHW
sec
rts
*--------------------------------------
GETEVENT lda #0
sec
rts
*--------------------------------------
SELECT
RELEASE
*--------------------------------------
OUT clc
rts
*--------------------------------------
CLOSE clc
rts
*--------------------------------------
CS.END
DEVNAME >PSTRING "LPT0"
DEVSLOT .BS 1
*--------------------------------------
MAN
SAVE DRV/PPIC.DRV.S
ASM

112
DRV/SSC.DRV.S.txt Normal file
View File

@ -0,0 +1,112 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF DRV/SSC.DRV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
*--------------------------------------
ZPTmpPtr1 .EQ ZPDRV
*--------------------------------------
SIG.05 .EQ $38
SIG.07 .EQ $18
SIG.0B .EQ $01
SIG.0C .EQ $31
*--------------------------------------
* Main DRV entry point
* input :
* X = CMD
* 0 : OPEN
* 2 : GETEVENT
* 4 : OUT
* 6 : CLOSE
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA OPEN
.DA GETEVENT
.DA OUT
.DA CLOSE
.DA 0 end or relocation
.DA CS.END-CS.START
*--------------------------------------
OPEN stz ZPTmpPtr1
lda #$C1
sta ZPTmpPtr1+1
.1 ldy #5
lda (ZPTmpPtr1),y
cmp #SIG.05
bne .2
ldy #7
lda (ZPTmpPtr1),y
cmp #SIG.07
bne .2
ldy #$B
lda (ZPTmpPtr1),y
cmp #SIG.0B
bne .2
ldy #$C
lda (ZPTmpPtr1),y
cmp #SIG.0C
beq .3
.2 inc ZPTmpPtr1+1
lda ZPTmpPtr1+1
cmp #$C8
bne .1
beq .99
.3 lda ZPTmpPtr1+1
and #$0F
sta DEVSLOT
ora #$30
sta DEVNAME+4
lda #S.DEV.F.CHAR+S.DEV.F.OUT
sta (pDevContext)
ldy #S.DEV.NAME
ldx #0
.7 lda DEVNAME,x
sta (pDevContext),y
cpx DEVNAME
beq .8
inx
iny
bne .7
.8 clc
rts
.99 lda #DEVMGR.ERRNOHW
sec
rts
*--------------------------------------
GETEVENT lda #0
sec
rts
*--------------------------------------
OUT clc
rts
*--------------------------------------
CLOSE clc
rts
*--------------------------------------
CS.END
DEVNAME >PSTRING "COM0"
DEVSLOT .BS 1
*--------------------------------------
MAN
SAVE DRV/SSC.DRV.S
ASM

434
DRV/UTHERNET.DRV.S.txt Normal file
View File

@ -0,0 +1,434 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF DRV/UTHERNET.DRV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
* .INB INC/ZP.I
*--------------------------------------
ZPTmpPTR .EQ ZPDRV
*--------------------------------------
DEVID .EQ $630E
*--------------------------------------
* CS8900A IO Registers
*--------------------------------------
RTDATA .EQ $C080 Receive/Transmit Data (DWORD)
TxCMD .EQ $C084 Transmit Command
TxLength .EQ $C086 Transmission Length
IntStatusQueue .EQ $C088 Interrupt Status Queue
PacketPagePTR .EQ $C08A PacketPage Pointer
PacketPageDATA .EQ $C08C PacketPage Data (DWORD)
*--------------------------------------
TxCMD.LID .EQ %00000000.00001001
TxCMD.TxStart5 .EQ %00000000.00000000 00 = start after 5 Bytes
TxCMD.TxStart381 .EQ %00000000.01000000 01 = start after 381 Bytes
TxCMD.TxStart1021 .EQ %00000000.10000000 10 = start after 1021 Bytes
TxCMD.TxStartFULL .EQ %00000000.11000000 11 = start after ENTIRE Frame
TxCMD.Force .EQ %00000001.00000000
TxCMD.OneColl .EQ %00000010.00000000
TxCMD.InhibitCRC .EQ %00010000.00000000
TxCMD.TxPadDis .EQ %00100000.00000000
*--------------------------------------
* PacketPage Offsets & Masks
*--------------------------------------
PP.ID .EQ $0000 Product ID code (RO)
PP.RFBCNT .EQ $0050 Received Frame Byte Counter (RO)
PP.RxCFG .EQ $0102 Receiver Configuration (RW)
PP.RxCFG.LID .EQ %00000000.00000011
PP.RxCTL .EQ $0104 Receiver Control (RW)
PP.RxCTL.LID .EQ %00000000.00000101
PP.RxCTL.IAHashA .EQ %00000000.01000000
PP.RxCTL.PromisA .EQ %00000000.10000000
PP.RxCTL.RxOKA .EQ %00000001.00000000
PP.RxCTL.MulticastA .EQ %00000010.00000000
PP.RxCTL.IA .EQ %00000100.00000000
PP.RxCTL.BroadcastA .EQ %00001000.00000000
PP.RxCTL.CRCerrorA .EQ %00010000.00000000
PP.RxCTL.RuntA .EQ %00100000.00000000
PP.RxCTL.ExtradataA .EQ %01000000.00000000
PP.TxCFG .EQ $0106 Transmit Configuration (RW)
PP.TxCMD .EQ $0108 Receiver Control (RW)
PP.BufCFG .EQ $010A
PP.LineCTL .EQ $0112 Line Control (RW)
PP.LineCTL.LID .EQ %00000000.00010011
PP.LineCTL.SerRxOn .EQ %00000000.01000000
PP.LineCTL.SerTxOn .EQ %00000000.10000000
PP.LineCTL.AUIonly .EQ %00000001.00000000
PP.LineCTL.Auto .EQ %00000010.00000000
PP.SelfCTL .EQ $0114 Self Control (RW)
PP.SelfCTL.LID .EQ %00000000.00010101
PP.SelfCTL.RESET .EQ %00000000.01000000
PP.SelfCTL.SWSuspnd .EQ %00000000.10000000
PP.SelfCTL.HWSleepE .EQ %00000001.00000000
PP.SelfCTL.HWStndby .EQ %00000010.00000000
PP.BufCTL .EQ $0116
PP.TestCTL .EQ $0118
PP.ISQ .EQ $0120
PP.RxEvent .EQ $0124 Receiver Event (RO)
PP.RxEvent.LID .EQ %00000000.00000100
PP.RxEvent.RxOK .EQ %00000001.00000000
PP.RxEvent.IA .EQ %00000100.00000000
PP.RxEvent.Brdcast .EQ %00001000.00000000
PP.RxEvent.CRCerror .EQ %00010000.00000000
PP.RxEvent.Runt .EQ %00100000.00000000
PP.RxEvent.Xtradata .EQ %01000000.00000000
PP.TxEvent .EQ $0128 Transmitter Event (RO)
PP.TxEvent.LID .EQ %00000000.00001000
PP.BufEvent .EQ $012C
PP.RxMISS .EQ $0130
PP.TxCOL .EQ $0132
PP.LineST .EQ $0134 Line Status (RO)
PP.LineST.LID .EQ %00000000.00010100
PP.LineST.LinkOK .EQ %00000000.10000000
PP.LineST.AUI .EQ %00000001.00000000
PP.LineST.10BT .EQ %00000010.00000000
PP.LineST.PolOK .EQ %00010000.00000000
PP.LineST.CRS .EQ %01000000.00000000
PP.SelfST .EQ $0136 Self Status (RO)
PP.SelfST.INITD .EQ %00000000.10000000
PP.BusST .EQ $0138 Bus Status (RO)
PP.BusST.LID .EQ %00000000.00011000
PP.BusST.TxBidErr .EQ %00000000.10000000
PP.BusST.Rdy4TxNOW .EQ %00000001.00000000
PP.TDR .EQ $013C
PP.MAC .EQ $0158 MAC Address (RW)
PP.RxStatus .EQ $0400
PP.RxLength .EQ $0402
PP.RxFrame .EQ $0404
PP.TxFrame .EQ $0A00
*--------------------------------------
ERRTNOFRAME .EQ 0
ERRNOBUFFER .EQ 1
ERRTIMEOUT .EQ 2
*--------------------------------------
* Main DRV entry point
* input :
* X = CMD
* 0 : OPEN
* 2 : GETEVENT
* 4 : OUT
* 6 : CLOSE
* 8 : GETINFO
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA OPEN
.DA GETEVENT
.DA OUT
.DA CLOSE
.DA GETINFO
L.DEVINFO .DA DEVINFO
.DA 0 end or relocation
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
* input :
* none
* output :
* CC on success
* CS on error
*--------------------------------------
OPEN ldx #$10
.1 stx DEVSLOTx0
>LDYAI PP.ID
>STYA PacketPagePTR,x
>LDYA PacketPageDATA,x
cpy #DEVID
bne .2
cmp /DEVID
beq .3
.2 inc DEVNAME+4
txa
clc
adc #$10
tax
cpx #$80
bne .1
lda #DEVMGR.ERRNOHW
sec
rts
.3 ldy #S.DEV.hARGS
lda (pDevContext),y
beq .4
>SYSCALL SYS.GetMemPtrA
>STYA ZPTmpPTR
jsr DecodeMac
bcc .4
lda #DEVMGR.ERRNICL
sec
rts
.4 jsr Reset
>LDYAI PP.RxCTL
>STYA PacketPagePTR,x
>LDYAI PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA
>STYA PacketPageDATA,x
>LDYAI PP.MAC
>STYA PacketPagePTR,x
>LDYA MAC
>STYA PacketPageDATA,x
>LDYAI PP.MAC+2
>STYA PacketPagePTR,x
>LDYA MAC+2
>STYA PacketPageDATA,x
>LDYAI PP.MAC+4
>STYA PacketPagePTR,x
>LDYA MAC+4
>STYA PacketPageDATA,x
>LDYAI PP.LineCTL
>STYA PacketPagePTR,x
>LDYAI PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.Auto
>STYA PacketPageDATA,x
lda #S.DEV.F.NET+S.DEV.F.EVENT+S.DEV.F.OUT
sta (pDevContext)
ldy #S.DEV.NAME
ldx #0
.7 lda DEVNAME,x
sta (pDevContext),y
cpx DEVNAME
beq .8
inx
iny
bne .7
.8 clc
rts
*--------------------------------------
* input :
* pEvent
* output :
* CC no event
* CS event
*--------------------------------------
GETEVENT >PULLW pEvent
ldx DEVSLOTx0
>LDYAI PP.RxEvent
>STYA PacketPagePTR,x
>LDYA PacketPageDATA,x
and /PP.RxEvent.RxOK+PP.RxEvent.Brdcast+PP.RxEvent.IA
bne GETEVENT.RxOK
lda #ERRTNOFRAME
sec
rts
GETEVENT.RxOK
and /PP.RxEvent.Brdcast
beq .10
lda #$80
.10 ldy #S.EVT.DATAHI
sta (pEvent),y
>LDYA RTDATA,x discard RxStatus
>LDYA RTDATA,x get RxLength
>STYA FRAMELEN
>PUSHYA
>PUSHB 0
>SYSCALL SYS.GetMem
bcs .99
>STYA ZPTmpPTR
txa
ldy #S.EVT.DATALO
sta (pEvent),y
ldy #S.EVT.DATAW1
lda FRAMELEN
sta (pEvent),y
iny
lda FRAMELEN+1
sta (pEvent),y
lda #S.EVT.F.NET+S.EVT.F.hMEM1
sta (pEvent)
ldy #0
ldx DEVSLOTx0
.1 lda RTDATA,x
sta (ZPTmpPTR),y
iny
bne .2
inc ZPTmpPTR+1
.2 jsr DecFrameLen
beq .8
lda RTDATA+1,x
sta (ZPTmpPTR),y
iny
bne .3
inc ZPTmpPTR+1
.3 jsr DecFrameLen
beq .8
bra .1
.8 clc
rts
.99 sec
rts
*--------------------------------------
* in:
* PULLW = FRAME PTR
* PULLW = FRAME LEN
* out:
* CC on success
* CS on error
*--------------------------------------
OUT >PULLW ZPTmpPTR
>PULLW FRAMELEN
ldy #11 Add Src MAC Address
ldx #5
.10 lda MAC,x
sta (ZPTmpPTR),y
dey
dex
bpl .10
ldx DEVSLOTx0
>LDYAI TxCMD.LID+TxCMD.TxStartFULL
>STYA TxCMD,x
>LDYA FRAMELEN
>STYA TxLength,x
>LDYAI PP.BusST
>STYA PacketPagePTR,x
ldy #16
.1 lda PacketPageDATA,x
and #PP.BusST.TxBidErr
bne .9
lda PacketPageDATA+1,x
and /PP.BusST.Rdy4TxNOW
bne SENDPREADY
bra *
lda #0
.2 dec
bne .2
dey
bne .1
bra *
lda #ERRTIMEOUT
sec
rts
.9 bra *
lda #ERRNOBUFFER
sec
rts
SENDPREADY ldy #0
.1 lda (ZPTmpPTR),y
sta RTDATA,x
iny
bne .2
inc ZPTmpPTR+1
.2 jsr DecFrameLen
beq .8
.3 lda (ZPTmpPTR),y
sta RTDATA+1,x
iny
bne .5
inc ZPTmpPTR+1
.5 jsr DecFrameLen
bne .1
.8 clc
rts
*--------------------------------------
CLOSE jsr Reset
clc
rts
*--------------------------------------
* in:
* out:
* Y,A = BUFFER PTR
* CC on success
* CS on error
*--------------------------------------
GETINFO >LDYA L.DEVINFO
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
Reset ldx DEVSLOTx0
>LDYAI PP.SelfCTL
>STYA PacketPagePTR,x
>LDYAI PP.SelfCTL.LID+PP.SelfCTL.RESET
>STYA PacketPageDATA,x
rts
*--------------------------------------
DecodeMac lda (ZPTmpPTR)
cmp #12
bne .9
ldy #1
ldx #0
.1 lda (ZPTmpPTR),y
jsr Asc2NibbleA
bcs .9
asl
asl
asl
asl
sta MAC,x
iny
lda (ZPTmpPTR),y
jsr Asc2NibbleA
bcs .9
ora MAC,x
sta MAC,x
inx
iny
cpy #13
bne .1
clc
rts
.9 sec
rts
*--------------------------------------
Asc2NibbleA cmp #$30
bcc .9
cmp #$3A
bcs .1
and #$0F
clc
rts
.1 cmp #$41
bcc .9
cmp #$47
bcs .9
sbc #$36
clc
rts
.9 sec
rts
*--------------------------------------
DecFrameLen lda FRAMELEN
bne .1
lda FRAMELEN+1
beq .2
dec FRAMELEN+1
.1 dec FRAMELEN
.2 lda FRAMELEN
ora FRAMELEN+1
rts
*--------------------------------------
CS.END
DEVNAME >PSTRING "ETH1"
*--------------------------------------
DS.START
*--------------------------------------
DEVSLOTx0 .BS 1
FRAMELEN .BS 2
*--------------------------------------
DEVINFO
MAC .BS 6
*--------------------------------------
DS.END
*--------------------------------------
MAN
SAVE DRV/UTHERNET.DRV.S
ASM

14
ETC/TCPIP.CONF Normal file
View File

@ -0,0 +1,14 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
IP=192.168.1.150
MASK=255.255.255.0
GW=192.168.1.1
DNS=192.168.1.2
DNS=192.168.1.1
HOSTNAME=apple2
DOMAIN=coincoin.hd.free.fr
MAN
TEXT ETC/TCPIP.CONF

324
INC/A2osX.I.txt Normal file
View File

@ -0,0 +1,324 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
* KERNEL Reserved ZP Location 00-1F,56-FF
*--------------------------------------
ZPQuickPtr1 .EQ $90 Temp Ptrs for use in very limited scope
ZPQuickPtr2 .EQ $92 (could be trashed by any JSR)
ZPQuickPtr3 .EQ $94
ZPQuickPtr4 .EQ $96
ZPLIB .EQ $A0 Main
ZPDRV .EQ $B0 Main
ZPBIN .EQ $C0 Main
*--------------------------------------
pPsContext .EQ $F0
pDevContext .EQ $F2
pEvent .EQ $F4
*--------------------------------------
R.SP .EQ $FE Main
*--------------------------------------
* A2OS.SYSCALL Functions Indexes
*--------------------------------------
SYS.GetMem .EQ $00
SYS.FreeMemA .EQ $02
SYS.ClrMemA .EQ $04
SYS.GetMemPtrA .EQ $06
SYS.GetMemLenA .EQ $08
SYS.GetMemByIDA .EQ $0A
SYS.GetMemByNameA .EQ $0C
*--------------------------------------
SYS.NewPStr .EQ $10
SYS.PStrCpyA .EQ $12
SYS.PStrCat .EQ $14
SYS.PStrCmp .EQ $16
SYS.PStrGetTkn .EQ $18
SYS.GetPStrIndex .EQ $1A
*--------------------------------------
SYS.LoadBinA .EQ $20
SYS.LoadLib .EQ $22
SYS.UnloadLibA .EQ $24
SYS.LoadDrvA .EQ $26
*--------------------------------------
SYS.ExpandPStrA .EQ $30
SYS.ExpandPStr .EQ $32
SYS.GetEnvVarH .EQ $34
SYS.GetEnvVarP .EQ $36
SYS.SetEnvVarH .EQ $38
SYS.SetEnvVarP .EQ $3A
*--------------------------------------
SYS.MLICreate .EQ $40
SYS.MLIDestroy .EQ $42
SYS.MLIRename .EQ $44
SYS.MLISetFileInfo .EQ $46
SYS.MLIGetFileInfoA .EQ $48
SYS.MLIOnline .EQ $4A
SYS.MLISetPrefix .EQ $4C
SYS.MLIGetPrefixA .EQ $4E
SYS.MLIOpenA .EQ $50
SYS.MLINewLine .EQ $52
SYS.MLIRead .EQ $54
SYS.MLIWrite .EQ $56
SYS.MLICloseA .EQ $58
SYS.MLIFlushA .EQ $5A
SYS.MLISetMark .EQ $5C
SYS.MLIGetMark .EQ $5E
SYS.MLISetEOF .EQ $60
SYS.MLIGetEOFA .EQ $62
*--------------------------------------
SYS.GetDevByIDA .EQ $70
SYS.GetDevByNameA .EQ $72
SYS.GetDevTable .EQ $74
SYS.GetDevInfoA .EQ $76
SYS.DevOutA .EQ $78
*--------------------------------------
SYS.GetEvent .EQ $80
SYS.DestroyEvent .EQ $82
*--------------------------------------
SYS.ExecProcessA .EQ $90
SYS.CreateProcessA .EQ $92
SYS.GetPSByIDA .EQ $98
*--------------------------------------
SYS.CheckPrefixA .EQ $A0
SYS.FileSearch .EQ $A2
SYS.LoadFileA .EQ $A4
SYS.ListDirInitA .EQ $A6
SYS.ListDirNextA .EQ $A8
SYS.ListDirCloseA .EQ $AA
*--------------------------------------
SYS.AddNetCfg .EQ $B0
SYS.SetNetCfg .EQ $B2
SYS.GetNetCfgA .EQ $B4
SYS.ClrNetCfgA .EQ $B6
*--------------------------------------
A2osX.SaveS .EQ $100 Main,Aux
*--------------------------------------
* Main $200 -> 2FF : (Reserved, ProDOS,Clock DRV....)
* Main $300 -> 3EF : A2osX Global Page
* Main $3F0 -> 3FF : ProDOS Vectors
* Aux $200 -> 3FD : /RAM Driver
* Aux $3FE -> 3FF : RESET Vector
*--------------------------------------
* A2osX GLOBAL PAGE
*--------------------------------------
A2osX.SYSCALL .EQ $0300
A2osX.MLICALL .EQ $0302
A2osX.LIBCALL .EQ $0304
A2osX.SLEEP .EQ $0306
Kernel.MLICALL .EQ $0308
Kernel.DRVCALL .EQ $030A
Kernel.BINCALL .EQ $030C
Kernel.LIBCALL .EQ $030E
*--------------------------------------
A2osX.SCREENS .EQ $0310
A2osX.SCREENS.G .EQ %00000100
A2osX.SCREENS.C .EQ %00000010
A2osX.SCREENS.S .EQ %00000001
A2osX.ACTIVESCRN .EQ $0311
A2osX.TIMER16 .EQ $0312
A2osX.RANDOM16 .EQ $0314
A2osX.CPUTYPE .EQ $0316
A2osX.Z80SLOT .EQ $0317
Kernel.JMP .EQ $0318
A2osX.300CODE .EQ $031A
*--------------------------------------
* Console Screen .EQ $400 -> $7FF
* System Screen .EQ $800 -> $BFF
*--------------------------------------
TmpBuffer256 .EQ $0C00
*--------------------------------------
D.STACKSEG .EQ $0D00 $0DFF Down to $0D00
*--------------------------------------
MLICALL.PARAMS .EQ $0E00 size=$12 (SET_FILE_INFO +1)
A2osX.SaveA .EQ $0E20
A2osX.SaveX .EQ $0E21
A2osX.SaveY .EQ $0E22
*--------------------------------------
MEMMGR.LOMEM .EQ $0E30
MEMMGR.MLLIMIT .EQ $0E32
MEMMGR.MHLIMIT .EQ $0E34
MEMMGR.HIMEM .EQ $0E36
MEMMGR.MFREE .EQ $0E38
MEMMGR.TABLESIZE .EQ $0E3A
*--------------------------------------
Z80STACK .EQ $0FFF (0FFFFh) Down to $0F00
Z80JMP .EQ $1000
*--------------------------------------
MEMMGR.TABLE .EQ $1100 256 Handles
DEVMGR.TABLE .EQ $1200 K.DEV.MAX*S.DEV.SIZE=20*12=240
TSKMGR.TABLE .EQ $1300 K.PS.MAX*S.PS.SIZE=32*16=512
*--------------------------------------
A2osX.LOMEM .EQ $1500
*--------------------------------------
* MEM STRUCT
*--------------------------------------
S.MEM.F .EQ 0
S.MEM.F.INUSE .EQ %10000000
S.MEM.F.CLEAR .EQ %10000000 Fill with "0"
S.MEM.F.CODE .EQ %01000000
S.MEM.F.NOMOV .EQ %00100000
S.MEM.F.ALIGN .EQ %00010000
S.MEM.F.SPARE .EQ %00001000
S.MEM.F.AUX .EQ %00000100
S.MEM.F.LC1 .EQ %00000010
S.MEM.F.LC2 .EQ %00000001
S.MEM.REFCNT .EQ 1
S.MEM.PTR .EQ 2
S.MEM.LEN .EQ 4
S.MEM.BIN .EQ 6
S.MEM.OWNERPID .EQ 7
*
S.MEM.SIZE .EQ 8
*--------------------------------------
MEMMGR.ERROOM .EQ $FF Out Of Memory Error
MEMMGR.ERROOS .EQ $FE Out Of Slot Error
*--------------------------------------
* DEV STRUCT
*--------------------------------------
S.DEV.F .EQ 0
S.DEV.F.INUSE .EQ %10000000
S.DEV.F.EVENT .EQ %01000000
S.DEV.F.OUT .EQ %00100000
S.DEV.F.XYP .EQ %00010000
S.DEV.F.GFX .EQ %00001000
S.DEV.F.NET .EQ %00000100
S.DEV.F.BLOCK .EQ %00000010
S.DEV.F.CHAR .EQ %00000001
S.DEV.ID .EQ 1
S.DEV.NAME .EQ 2 5 Bytes : NUL KBD CON COMx LPTx ETHx
S.DEV.hCS .EQ 7
S.DEV.hDS .EQ 8
S.DEV.hCMD .EQ 9
S.DEV.hARGS .EQ 10
S.DEV.hOWNERPS .EQ 11
*
S.DEV.SIZE .EQ 12
*--------------------------------------
* Driver Function Indexes
*--------------------------------------
DEVMGR.OPEN .EQ 0
DEVMGR.GETEVENT .EQ 2
DEVMGR.OUT .EQ 4
DEVMGR.CLOSE .EQ 6
DEVMGR.GETINFO .EQ 8
*--------------------------------------
DEVMGR.ERRNICL .EQ $EB Invalid Command Line
DEVMGR.ERRNOHW .EQ $EC No Hardware
DEVMGR.ERRDNF .EQ $ED Device Not Found Error
DEVMGR.ERROOS .EQ $EE Out Of Slot Error
*--------------------------------------
* PS STRUCT
*--------------------------------------
S.PS.F .EQ 0
S.PS.F.INUSE .EQ %10000000
S.PS.F.HOLD .EQ %01000000
S.PS.F.EVENT .EQ %00100000
S.PS.ID .EQ 1
S.PS.PID .EQ 2
S.PS.hCS .EQ 3
S.PS.hDS .EQ 4
S.PS.hPREFIX .EQ 5
S.PS.hENV .EQ 6
S.PS.hCMD .EQ 7
S.PS.hARGS .EQ 8
S.PS.hINDEV .EQ 9
S.PS.hOUTDEV .EQ 10
S.PS.hERRDEV .EQ 11
S.PS.CID .EQ 12
S.PS.LASTERROR .EQ 13
S.PS.PC .EQ 14
*
S.PS.SIZE .EQ 16
*--------------------------------------
* LIB Function Indexes
*--------------------------------------
LIBMGR.LOAD .EQ 0
LIBMGR.UNLOAD .EQ 2
*--------------------------------------
* Task Function Indexes
*--------------------------------------
TSKMGR.INIT .EQ 0
TSKMGR.RUN .EQ 2
TSKMGR.DOEVENT .EQ 4
TSKMGR.QUIT .EQ 6
*--------------------------------------
TSKMGR.ERROOS .EQ $DE Out Of Slot Error
TSKMGR.ERRNSP .EQ $DF No Such Process Error
*--------------------------------------
* EVENT STRUCT
*--------------------------------------
S.EVT.F .EQ 0
S.EVT.F.SYS .EQ %10000000
S.EVT.F.WND .EQ %01000000
S.EVT.F.hMEM2 .EQ %00100000 Indicates That S.EVT.DATAHI is a hMem
S.EVT.F.hMEM1 .EQ %00010000 Indicates That S.EVT.DATALO is a hMem
S.EVT.F.TIMER .EQ %00001000
S.EVT.F.NET .EQ %00000100
S.EVT.F.MOUSE .EQ %00000010
S.EVT.F.KEY .EQ %00000001
S.EVT.hDEV .EQ 1
S.EVT.DATA .EQ 2
S.EVT.DATALO .EQ 2
S.EVT.DATAHI .EQ 3
S.EVT.DATAW1 .EQ 4
S.EVT.DATAW2 .EQ 6
*
S.EVT.SIZE .EQ 8
*--------------------------------------
SYSMGR.ERRENVF .EQ $CB Env is Full
SYSMGR.ERRIDIR .EQ $CC Invalid Directory
SYSMGR.ERRFTB .EQ $CD File Too Big Error
SYSMGR.ERRFNF .EQ $CE File Not Found Error
SYSMGR.ERRSYN .EQ $CF Syntax Error
*--------------------------------------
* S.LISTDIR STRUCT
*--------------------------------------
S.LISTDIR.hONLINE .EQ 0
S.LISTDIR.ONLINEPTR .EQ 1
S.LISTDIR.REFNUM .EQ 2 ref_num file
S.LISTDIR.hIOBUF .EQ 3 hMem to ProDOS IO buffer
S.LISTDIR.hREADBUF .EQ 4 hMem to 512 Read Buffer
S.LISTDIR.EL .EQ 5 entry_length
S.LISTDIR.EIB .EQ 6 ENTRY_INDEX in block
S.LISTDIR.EPB .EQ 7 entry_per_block
S.LISTDIR.BLKPTR .EQ 8 entry PTR in block
S.LISTDIR.FI .EQ 10 FILE_INDEX in DIR
S.LISTDIR.FC .EQ 12 file_count
S.LISTDIR.hPATTERN .EQ 14 Pattern for file filtering
*
S.LISTDIR.SIZE .EQ 16
*--------------------------------------
* S.FENTRY STRUCT
*--------------------------------------
S.FENTRY.F .EQ 0
S.FENTRY.COUNT .EQ 1
*--------------------------------------
* S.BUFRDR STRUCT
*--------------------------------------
S.BUFRDR.hMEM .EQ 0
S.BUFRDR.DELIM .EQ 1
S.BUFRDR.LEN .EQ 2
S.BUFRDR.IDX .EQ 4
*
S.BUFRDR.SIZE .EQ 6
*--------------------------------------
MAN
SAVE INC/A2OSX.I

103
INC/IO.I.txt Normal file
View File

@ -0,0 +1,103 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
* Screen Holes
*--------------------------------------
OURCH .EQ $57B
OURCV .EQ $5FB
*--------------------------------------
* Software Switches & Cxxx ROMs
*--------------------------------------
KBD .EQ $C000 R
CLR80STORE .EQ $C000 W
SET80STORE .EQ $C001 W
CLRREADAUX .EQ $C002 W
SETREADAUX .EQ $C003 W
CLRWRITEAUX .EQ $C004 W
SETWRITEAUX .EQ $C005 W
CLRCXROM .EQ $C006 W
SETCXROM .EQ $C007 W
CLRALTZP .EQ $C008 W
SETALTZP .EQ $C009 W
CLRC3ROM .EQ $C00A W
SETC3ROM .EQ $C00B W
CLR80DISP .EQ $C00C W
SET80DISP .EQ $C00D W
CLRALTCHAR .EQ $C00E W
SETALTCHAR .EQ $C00F W
KBDSTROBE .EQ $C010 W
RDBNK2 .EQ $C011 R
RDLCRAM .EQ $C012 R
RDREADAUX .EQ $C013 R
RDWRITEAUX .EQ $C014 R
RDCXROM .EQ $C015 R
RDALTZP .EQ $C016 R
RDC3ROM .EQ $C017 R
RD80STORE .EQ $C018 R
VBL .EQ $C019 R
RDTEXT .EQ $C01A R
RDMIXED .EQ $C01B R
RDPAGE2 .EQ $C01C R
RDHIRES .EQ $C01D R
RDALTCHAR .EQ $C01E R
RD80DISP .EQ $C01F R
TAPEOUT .EQ $C020 W
SPEAKER .EQ $C030 W, toggle speaker diaphragm
STROBE .EQ $C040 R, generate .5 uS low pulse @ Game pin 5
EMUBYTE .EQ $C04F WRR, Write once then Read EMUL, Read Version
CLRTEXT .EQ $C050 W
SETTEXT .EQ $C051 W
CLRMIXED .EQ $C052 W
SETMIXED .EQ $C053 W
CLRPAGE2 .EQ $C054 W
SETPAGE2 .EQ $C055 W
CLRHIRES .EQ $C056 W
SETHIRES .EQ $C057 W
SETAN0 .EQ $C058 W, Set annunciator-0 output to 0
CLRAN0 .EQ $C059 W, Set annunciator-0 output to 1
SETAN1 .EQ $C05A W, Set annunciator-1 output to 0
CLRAN1 .EQ $C05B W, Set annunciator-1 output to 1
SETAN2 .EQ $C05C W, Set annunciator-2 output to 0
CLRAN2 .EQ $C05D W, Set annunciator-2 output to 1
SETAN3 .EQ $C05E W, Set annunciator-3 output to 0
SETDHIRES .EQ $C05E W, if IOUDIS Set, turn on double-hires
CLRAN3 .EQ $C05F W, Set annunciator-3 output to 1
CLRDHIRES .EQ $C05F W, if IOUDIS Set, turn off double-hires
TAPEIN .EQ $C060 R
OPENAPPLE .EQ $C061 R
SOLIDAPPLE .EQ $C062 R
PB2 .EQ $C063 R
PADDLE0 .EQ $C064 R, bit 7 = status of pdl-0 timer
PADDLE1 .EQ $C065 R, bit 7 = status of pdl-1 timer
PADDLE2 .EQ $C066 R, bit 7 = status of pdl-2 timer
PADDLE3 .EQ $C067 R, bit 7 = status of pdl-3 timer
PDLTRIG .EQ $C070 W, trigger paddles
SETIOUDIS .EQ $C07E W, enable DHIRES & disable $C058-5F
CLRIOUDIS .EQ $C07F W, disable DHIRES & enable $C058-5F
*--------------------------------------
RRAMBNK2 .EQ $C080 R
RROMWRAMBNK2 .EQ $C081 RR
RROMBNK2 .EQ $C082 R
RRAMWRAMBNK2 .EQ $C083 RR
RRAMBNK1 .EQ $C088 R
RROMWRAMBNK1 .EQ $C089 RR
RROMBNK1 .EQ $C08A R
RRAMWRAMBNK1 .EQ $C08B RR
*--------------------------------------
* Cxxx ROMs
*--------------------------------------
CX00ROM .EQ $C100
C300ROM .EQ $C300
MAN
SAVE INC/IO.I

60
INC/KERNEL.I.txt Normal file
View File

@ -0,0 +1,60 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
* KERNEL CONSTANTS DEFINITON
*--------------------------------------
K.BIN.MAGICHEADER .EQ $7CD8
*--------------------------------------
K.TIMER16RESOLUTION .EQ 5 every 5 VBL (50hz), so 100ms
*--------------------------------------
K.ENV.SIZE .EQ $100
K.DEV.MAX .EQ 20
K.PS.MAX .EQ 32
*--------------------------------------
K.NETCFG.MAX .EQ 4
K.NETCFG.SIZE .EQ 128
K.PROTOID.ATALK .EQ 0
K.PROTOID.ETALK .EQ 1
K.PROTOID.IP .EQ 2
K.PROTOID.SPARE .EQ 3
K.ARPCACHE.SIZE .EQ 10
K.DNSCACHE.SIZE .EQ 10
K.UDPTABLE.SIZE .EQ 16
K.TCPTABLE.SIZE .EQ 16
K.ETH.FRAME.LEN .EQ 1514
K.IP.TTL .EQ 64
*--------------------------------------
* KERNEL Reserved ZP Location 00-1F,56-FF
*--------------------------------------
DEVMGR.DEVPTR .EQ $80
EVTMGR.EVTPTR .EQ $82
TSKMGR.TSKPTR .EQ $84
TSKMGR.pNewPS .EQ $86
*--------------------------------------
ZPMemMgr .EQ $D0 Aux
ZPSysScr .EQ $E0 Aux
*--------------------------------------
R.VCPU16 .EQ $F0 Aux
R.AX .EQ R.VCPU16
R.AL .EQ R.VCPU16
R.AH .EQ R.VCPU16+$1
R.BX .EQ R.VCPU16+$2
R.BL .EQ R.VCPU16+$2
R.BH .EQ R.VCPU16+$3
R.CX .EQ R.VCPU16+$4
R.CL .EQ R.VCPU16+$4
R.CH .EQ R.VCPU16+$5
R.DX .EQ R.VCPU16+$6
R.DL .EQ R.VCPU16+$6
R.DH .EQ R.VCPU16+$7
*R.CS .EQ R.VCPU16+$8
*R.DS .EQ R.VCPU16+$A
R.LS .EQ R.VCPU16+$C
*R.SP .EQ R.VCPU16+$E
*--------------------------------------
MAN
SAVE INC/KERNEL.I

23
INC/LIBSTR.I.txt Normal file
View File

@ -0,0 +1,23 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
LIBSTR.PRINTF .EQ 4
LIBSTR.PRINTC .EQ 6
LIBSTR.PRINTP .EQ 8
LIBSTR.STRMATCHP .EQ 10
LIBSTR.STRCPYP .EQ 12
LIBSTR.STRCATP .EQ 14
LIBSTR.UCASEP .EQ 16
LIBSTR.LCASEP .EQ 18
LIBSTR.PRINTDATE .EQ 20
LIBSTR.PRINTTIME .EQ 22
LIBSTR.SSCANF .EQ 24
*--------------------------------------
MAN
SAVE INC/LIBSTR.I

221
INC/LIBTCPIP.I.txt Normal file
View File

@ -0,0 +1,221 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
LIBTCPIP.SET.IPCFG .EQ 4
LIBTCPIP.GET.IPCFG .EQ 6
LIBTCPIP.NEW.ICMP.FRAME .EQ 8
LIBTCPIP.NEW.TCP.FRAME .EQ 10
LIBTCPIP.NEW.UDP.FRAME .EQ 12
LIBTCPIP.NEW.IP.FRAME .EQ 14
LIBTCPIP.NEW.ARP.FRAME .EQ 16
LIBTCPIP.NEW.ETH.FRAME .EQ 18
LIBTCPIP.SEND.ICMP.FRAME .EQ 20
LIBTCPIP.SEND.TCP.FRAME .EQ 22
LIBTCPIP.SEND.UDP.FRAME .EQ 24
LIBTCPIP.SEND.IP.FRAME .EQ 26
LIBTCPIP.SEND.ARP.FRAME .EQ 28
LIBTCPIP.SEND.ETH.FRAME .EQ 30
LIBTCPIP.ARP.CLEAR .EQ 32
LIBTCPIP.ARP.QUERY .EQ 34
LIBTCPIP.ARP.ADD .EQ 36
LIBTCPIP.ARP.GETCACHE .EQ 38
LIBTCPIP.DNS.CLEAR .EQ 40
LIBTCPIP.DNS.QUERY .EQ 42
LIBTCPIP.DNS.ADD .EQ 44
LIBTCPIP.DNS.GETCACHE .EQ 46
LIBTCPIP.UDP.LISTENER .EQ 48
LIBTCPIP.TCP.LISTENER .EQ 50
LIBTCPIP.ADD.LISTENER .EQ 52
LIBTCPIP.REM.LISTENER .EQ 54
*--------------------------------------
TCP.PORT.TELNETS .EQ 23
UDP.PORT.DNS .EQ 53
UDP.PORT.DHCPC .EQ 68
UDP.PORT.DHCPS .EQ 67
*--------------------------------------
S.IPCFG.STATUS .EQ 0
S.IPCFG.STATUS.OFF .EQ %00000000 TCPIP Unconfigured
S.IPCFG.STATUS.SDISC .EQ %00000001 DISCOVERY Sent
S.IPCFG.STATUS.ROFFER .EQ %00000010 OFFER Received
S.IPCFG.STATUS.SREQ .EQ %00000100 REQUEST Sent
S.IPCFG.STATUS.RACK .EQ %00001000 ACK Received
S.IPCFG.STATUS.OK .EQ %10000000 Fully configured (static or DHCP)
S.IPCFG.HDEV .EQ 1
S.IPCFG.MAC .EQ 2
S.IPCFG.DHCPSRVR .EQ 8
S.IPCFG.IP .EQ 12
S.IPCFG.MASK .EQ 16
S.IPCFG.GW .EQ 20
S.IPCFG.DNS .EQ 24 2 x 4
S.IPCFG.HOSTNAME .EQ 32 1+15 char PSTR
S.IPCFG.DOMAIN .EQ 48 1+35 char PSTR
*
S.IPCFG .EQ K.NETCFG.SIZE
*--------------------------------------
S.ARPCACHE.STATUS .EQ 0
S.ARPCACHE.STATUS.PENDING .EQ 64
S.ARPCACHE.STATUS.RESOLVED .EQ 128
S.ARPCACHE.RETRYCNT .EQ 1
S.ARPCACHE.IP .EQ 2
S.ARPCACHE.MAC .EQ 6
*
S.ARPCACHE .EQ 12
*--------------------------------------
S.DNSCACHE.STATUS .EQ 0
S.DNSCACHE.STATUS.PENDING .EQ 64
S.DNSCACHE.STATUS.RESOLVED .EQ 128
S.DNSCACHE.hNAME .EQ 1
S.DNSCACHE.TTL .EQ 2
S.DNSCACHE.IP .EQ 4
*
S.DNSCACHE .EQ 8
*--------------------------------------
S.LISTENER.PORT .EQ 0
S.LISTENER.hPS .EQ 2
S.LISTENER.fIDX .EQ 3
S.LISTENER .EQ 4
*--------------------------------------
S.ETH.DSTMAC .EQ 0
S.ETH.SRCMAC .EQ 6
S.ETH.ETHERTYPE .EQ 6+6
S.ETH.ETHERTYPE.IP .EQ $800
S.ETH.ETHERTYPE.ARP .EQ $806
*
S.ETH .EQ 6+6+2
*--------------------------------------
S.ARP.HTYPE .EQ S.ETH+0 $0001
S.ARP.PTYPE .EQ S.ETH+2 $0800
S.ARP.HLEN .EQ S.ETH+4 $06
S.ARP.PLEN .EQ S.ETH+5 $04
S.ARP.OPERATION .EQ S.ETH+6 REQ=$0001,REPLY=$0002
S.ARP.OPERATION.REQ .EQ 1
S.ARP.OPERATION.REP .EQ 2
S.ARP.SHA .EQ S.ETH+8 Sender MAC
S.ARP.SPA .EQ S.ETH+14 Sender IP
S.ARP.THA .EQ S.ETH+18 Target MAC
S.ARP.TPA .EQ S.ETH+24 Target IP
*
S.ARP .EQ S.ETH+28
*--------------------------------------
S.IP.V.IHL.DSCP.ECN .EQ S.ETH+0 $0045, IPV4,HDR=5DWORDs
S.IP.TOTAL.LENGTH .EQ S.ETH+2
S.IP.IDENTIFICATION .EQ S.ETH+4 $0000
S.IP.FRAGMENT.FLAGS .EQ S.ETH+6
S.IP.TTL .EQ S.ETH+8
S.IP.PROTOCOL .EQ S.ETH+9
S.IP.PROTOCOL.ICMP .EQ 1
S.IP.PROTOCOL.TCP .EQ 6
S.IP.PROTOCOL.UDP .EQ 17
S.IP.HDR.CHECKSUM .EQ S.ETH+10
S.IP.SRC .EQ S.ETH+12
S.IP.DST .EQ S.ETH+16
*
S.IP .EQ S.ETH+20
*--------------------------------------
S.ICMP.TYPE .EQ S.IP+0
S.ICMP.TYPE.ECHOREP .EQ 0
S.ICMP.TYPE.UNREACH .EQ 3
S.ICMP.TYPE.ECHOREQ .EQ 8
S.ICMP.CODE .EQ S.IP+1
S.ICMP.CHECKSUM .EQ S.IP+2
S.ICMP.IDENTIFIER .EQ S.IP+4
S.ICMP.SEQUENCE .EQ S.IP+6
*
S.ICMP .EQ S.IP+8
*--------------------------------------
S.UDP.SRCPORT .EQ S.IP+0
S.UDP.DSTPORT .EQ S.IP+2
S.UDP.LENGTH .EQ S.IP+4
S.UDP.CHECKSUM .EQ S.IP+6 $0000 = DISABLE
*
S.UDP .EQ S.IP+8
*--------------------------------------
S.DHCP.OP .EQ S.UDP+0 1 = BOOTREQUEST, 2 = BOOTREPLY
S.DHCP.OP.BOOTREQUEST .EQ 1
S.DHCP.OP.BOOTREPLY .EQ 2
S.DHCP.HTYPE .EQ S.UDP+1 1 = ETHERNET
S.DHCP.HTYPE.ETHERNET .EQ 1
S.DHCP.HLEN .EQ S.UDP+2 6 (MAC len)
S.DHCP.HLEN.ETHERNET .EQ 6
S.DHCP.HOPS .EQ S.UDP+3 0
S.DHCP.XID .EQ S.UDP+4 client : random number
S.DHCP.SECS .EQ S.UDP+8
S.DHCP.FLAGS .EQ S.UDP+10
S.DHCP.FLAGS.BRDCST .EQ %10000000
S.DHCP.CIADDR .EQ S.UDP+12
S.DHCP.YIADDR .EQ S.UDP+16
S.DHCP.SIADDR .EQ S.UDP+20
S.DHCP.GIADDR .EQ S.UDP+24
S.DHCP.CHADDR .EQ S.UDP+28
S.DHCP.SNAME .EQ S.UDP+44
S.DHCP.FILE .EQ S.UDP+108
S.DHCP.COOKIE .EQ S.UDP+236
S.DHCP.OPTIONS .EQ S.UDP+240
S.DHCP.OPTIONS.DHCPDiscover .EQ 1
S.DHCP.OPTIONS.DHCPOffer .EQ 2
S.DHCP.OPTIONS.DHCPRequest .EQ 3
S.DHCP.OPTIONS.DHCPDecline .EQ 4
S.DHCP.OPTIONS.DHCPAck .EQ 5
S.DHCP.OPTIONS.DHCPNak .EQ 6
S.DHCP.OPTIONS.DHCPRelease .EQ 7
S.DHCP.OPTIONS.DHCPInform .EQ 8
S.DHCP.OPTIONS.MASK .EQ 1
S.DHCP.OPTIONS.GW .EQ 3
S.DHCP.OPTIONS.DNS .EQ 6
S.DHCP.OPTIONS.DOMAIN .EQ 15
S.DHCP.OPTIONS.END .EQ 255
*
S.DHCP .EQ S.UDP+240
*--------------------------------------
S.DNS.ID .EQ S.UDP+0
S.DNS.F .EQ S.UDP+2
S.DNS.F.QR .EQ %10000000.00000000
S.DNS.F.OPCODE.I .EQ %01000000.00000000
S.DNS.F.OPCODE.S .EQ %00100000.00000000
S.DNS.F.AA .EQ %00000100.00000000
S.DNS.F.TC .EQ %00000010.00000000
S.DNS.F.RD .EQ %00000001.00000000
S.DNS.F.RA .EQ %00000000.10000000
S.DNS.F.RCODE.FRMT .EQ %00000000.00000001
S.DNS.F.RCODE.SRVR .EQ %00000000.00000010
S.DNS.F.RCODE.UKWN .EQ %00000000.00000011
S.DNS.F.RCODE.NIMP .EQ %00000000.00000100
S.DNS.F.RCODE.DENY .EQ %00000000.00000101
S.DNS.QDCOUNT .EQ S.UDP+4
S.DNS.ANCOUNT .EQ S.UDP+6
S.DNS.NSCOUNT .EQ S.UDP+8
S.DNS.ARCOUNT .EQ S.UDP+10
*
S.DNS .EQ S.UDP+12
*--------------------------------------
S.DNS.QTYPE.A .EQ 1
S.DNS.QTYPE.NS .EQ 2
S.DNS.QTYPE.CNAME .EQ 5
S.DNS.QTYPE.SOA .EQ 6
S.DNS.QTYPE.WKS .EQ 11
S.DNS.QTYPE.PTR .EQ 12
S.DNS.QTYPE.MX .EQ 15
S.DNS.QTYPE.SRV .EQ 33
S.DNS.QTYPE.ANY .EQ 255
S.DNS.QCLASS.IN .EQ 1
*--------------------------------------
S.TCP.SRCPORT .EQ S.IP+0
S.TCP.DSTPORT .EQ S.IP+2
S.TCP.SEQ.NUMBER .EQ S.IP+4
S.TCP.ACK.NUMBER .EQ S.IP+8
*
S.TCP
*--------------------------------------
MAN
SAVE INC/LIBTCPIP.I

451
INC/MACROS.I.txt Normal file
View File

@ -0,0 +1,451 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
.MA DEBUG
.70 bit $C000
bpl .70
sta $C010
.EM
*--------------------------------------
* SYSCALLs Macros
*--------------------------------------
.MA SYSCALL
ldx #]1
jsr A2osX.SYSCALL
.EM
*--------------------------------------
.MA MLICALL
ldx #]1
.DO ]1=MLIREADBLOCK
lda #3
.FIN
.DO ]1=MLIWRITEBLOCK
lda #3
.FIN
.DO ]1=MLICREATE
lda #7
.FIN
.DO ]1=MLIDESTROY
lda #1
.FIN
.DO ]1=MLIRENAME
lda #2
.FIN
.DO ]1=MLISETFILEINFO
lda #7
.FIN
.DO ]1=MLIGETFILEINFO
lda #10
.FIN
.DO ]1=MLIONLINE
lda #2
.FIN
.DO ]1=MLISETPREFIX
lda #1
.FIN
.DO ]1=MLIGETPREFIX
lda #1
.FIN
.DO ]1=MLIOPEN
lda #3
.FIN
.DO ]1=MLINEWLINE
lda #3
.FIN
.DO ]1=MLIREAD
lda #4
.FIN
.DO ]1=MLIWRITE
lda #4
.FIN
.DO ]1=MLICLOSE
lda #1
.FIN
.DO ]1=MLIFLUSH
lda #1
.FIN
.DO ]1=MLISETMARK
lda #2
.FIN
.DO ]1=MLIGETMARK
lda #2
.FIN
.DO ]1=MLISETEOF
lda #2
.FIN
.DO ]1=MLIGETEOF
lda #2
.FIN
.DO ]1=MLISETBUF
lda #2
.FIN
.DO ]1=MLIGETBUF
lda #2
.FIN
jsr A2osX.MLICALL
.EM
*--------------------------------------
.MA KMLICALL
ldx #]1
.DO ]1=MLIREADBLOCK
lda #3
.FIN
.DO ]1=MLIWRITEBLOCK
lda #3
.FIN
.DO ]1=MLICREATE
lda #7
.FIN
.DO ]1=MLIDESTROY
lda #1
.FIN
.DO ]1=MLIRENAME
lda #2
.FIN
.DO ]1=MLISETFILEINFO
lda #7
.FIN
.DO ]1=MLIGETFILEINFO
lda #10
.FIN
.DO ]1=MLIONLINE
lda #2
.FIN
.DO ]1=MLISETPREFIX
lda #1
.FIN
.DO ]1=MLIGETPREFIX
lda #1
.FIN
.DO ]1=MLIOPEN
lda #3
.FIN
.DO ]1=MLINEWLINE
lda #3
.FIN
.DO ]1=MLIREAD
lda #4
.FIN
.DO ]1=MLIWRITE
lda #4
.FIN
.DO ]1=MLICLOSE
lda #1
.FIN
.DO ]1=MLIFLUSH
lda #1
.FIN
.DO ]1=MLISETMARK
lda #2
.FIN
.DO ]1=MLIGETMARK
lda #2
.FIN
.DO ]1=MLISETEOF
lda #2
.FIN
.DO ]1=MLIGETEOF
lda #2
.FIN
.DO ]1=MLISETBUF
lda #2
.FIN
.DO ]1=MLIGETBUF
lda #2
.FIN
jsr Kernel.MLICALL
.EM
*--------------------------------------
.MA DRVCALL
ldy ]1
ldx #]2
jsr A2osX.DRVCALL
.EM
*--------------------------------------
.MA LIBLOADP
>PUSHW ]1
ldx #SYS.LoadLib
jsr A2osX.SYSCALL
.EM
*--------------------------------------
.MA LIBLOADA
ldx #SYS.LoadLibA
jsr A2osX.SYSCALL
.EM
*--------------------------------------
.MA LIBCALL
ldy ]1
ldx #]2
jsr A2osX.LIBCALL
.EM
*--------------------------------------
* LOCAL SEGMENT Manipulation Macros
*--------------------------------------
.MA ADDLOCAL
pha
lda R.LS
dec R.SP
sta (R.SP)
lda R.SP
sec
sbc #]1
sta R.SP
sta R.LS
pla
.EM
*--------------------------------------
.MA REMLOCAL
php
pha
lda R.SP
clc
adc #]1
sta R.SP
lda (R.SP)
inc R.SP
sta R.LS
pla
plp
.EM
*--------------------------------------
.MA LDAL
ldy #]1
lda (R.LS),y
.EM
*--------------------------------------
.MA ADCL
ldy #]1
adc (R.LS),y
.EM
*--------------------------------------
.MA SBCL
ldy #]1
adc (R.LS),y
.EM
*--------------------------------------
.MA STAL
ldy #]1
sta (R.LS),y
.EM
*--------------------------------------
.MA LDYAL
ldy #]1
lda (R.LS),y
pha
iny
lda (R.LS),y
ply
.EM
*--------------------------------------
.MA STYAL
phy
ldy #]1+1
sta (R.LS),y
dey
pla
sta (R.LS),y
tay
.EM
*--------------------------------------
.MA INCL
ldy #]1
lda (R.LS),y
inc
sta (R.LS),y
.EM
*--------------------------------------
.MA INCLW
ldy #]1
lda (R.LS),y
inc
bne .71
sta (R.LS),y
iny
lda (R.LS),y
inc
.71 sta (R.LS),y
.EM
*--------------------------------------
.MA DECL
ldy #]1
lda (R.LS),y
dec
sta (R.LS),y
.EM
*--------------------------------------
.MA DECLW
ldy #]1
lda (R.LS),y
bne .72
pha
iny
lda (R.LS),y
dec
sta (R.LS),y
dey
pla
.72 dec
sta (R.LS),y
.EM
*--------------------------------------
* D.STACK PUSH/PULL Macros
*--------------------------------------
.MA PUSHA
dec R.SP
sta (R.SP)
.EM
*--------------------------------------
.MA PULLA
lda (R.SP)
inc R.SP
.EM
*--------------------------------------
.MA PUSHYA
dec R.SP
sta (R.SP)
pha
tya
dec R.SP
sta (R.SP)
pla
.EM
*--------------------------------------
.MA PULLYA
lda (R.SP)
inc R.SP
tay
lda (R.SP)
inc R.SP
.EM
*--------------------------------------
.MA PUSHBI
dec R.SP
lda #]1
sta (R.SP)
.EM
*--------------------------------------
.MA PUSHB
.DO ]#=2
dec R.SP
lda ]1,]2
sta (R.SP)
.ELSE
dec R.SP
lda ]1
sta (R.SP)
.FIN
.EM
*--------------------------------------
.MA PULLB
.DO ]#=2
lda (R.SP)
sta ]1,]2
inc R.SP
.ELSE
lda (R.SP)
sta ]1
inc R.SP
.FIN
.EM
*--------------------------------------
.MA PUSHWI
dec R.SP
lda /]1
sta (R.SP)
dec R.SP
lda #]1
sta (R.SP)
.EM
*--------------------------------------
.MA PUSHW
dec R.SP
lda ]1+1
sta (R.SP)
dec R.SP
lda ]1
sta (R.SP)
.EM
*--------------------------------------
.MA PULLW
lda (R.SP)
sta ]1
inc R.SP
lda (R.SP)
sta ]1+1
inc R.SP
.EM
*--------------------------------------
* General WORD Manipulation Macros
*--------------------------------------
.MA LDYAI
ldy #]1
lda /]1
.EM
*--------------------------------------
.MA LDAXI
lda #]1
ldx /]1
.EM
*--------------------------------------
.MA LDYA
.DO ]#=2
lda ]1+1,]2
ldy ]1,]2
.ELSE
lda ]1+1
ldy ]1
.FIN
.EM
*--------------------------------------
.MA LDAX
.DO ]#=2
ldx ]1+1,]2
lda ]1,]2
.ELSE
ldx ]1+1
lda ]1
.FIN
.EM
*--------------------------------------
.MA STYA
.DO ]#=2
sta ]1+1,]2
tya
sta ]1,]2
.ELSE
sta ]1+1
sty ]1
.FIN
.EM
*--------------------------------------
.MA STAX
.DO ]#=2
sta ]1+1,]2
txa
sta ]1,]2
.ELSE
stx ]1+1
sta ]1
.FIN
.EM
*--------------------------------------
* General Strings Macros
*--------------------------------------
.MA CSTRING
.AS "]1"
.HS 00
.EM
*--------------------------------------
.MA PSTRING
.DA #.74-.73
.73 .AS "]1"
.74 .AS ""
.EM
MAN
SAVE INC/MACROS.I

95
INC/MONITOR.I.txt Normal file
View File

@ -0,0 +1,95 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 1000
*--------------------------------------
* ROM Standard Routines
*--------------------------------------
.LIST OFF
POWERUP .EQ $3F2
*--------------------------------------
COL80FIRM .EQ $C300
*--------------------------------------
BASICLD .EQ $E000 ENTER BASIC COLD
BASICWM .EQ $E003 RE-ENTER BASIC WARM
HGR2 .EQ $F3D8 APPLESOFT CLEAR TO HIRES 2
HGR .EQ $F3E2 APPLESOFT CLEAR TO HIRES 1
BKGND .EQ $F3F4 APPLESOFT HIRES BACKGROUND CLEAR
HCOLOR .EQ $F6F0 APPLESOFT HIRES COLOR SELECT
HPOSN .EQ $F411 APPLESOFT HIRES POSITION
HPLOT .EQ $F457 APPLESOFT HIRES PLOT
PLOT .EQ $F800 PLOT LORES BLOCK
HLINE .EQ $F819 HORIZ LORES LINE
VLINE .EQ $F828 VERTICAL LORES LINE
CLRSCR .EQ $F832 CLEAR FULL LORES SCREEN
CLRTOP .EQ $FB36 CLEAR TOP. LORES SCREEN
GBSCALC .EQ $F847 LORES BASE CALCULATION
NEXTCOL .EQ $F85F INCREASE LORES COLOR BY 3
SETCOL .EQ $F864 SET LORES COLOR
SCRN .EQ $F871 READ LORES SCREEN COLOR
PRNTAX .EQ $F941 OUTPUT A THEN X. AS HEX
PRBLNK .EQ $F948 OUTPUT 3 SPACES VIA BOOKS
PRBL2 .EQ $F94A OUTPUT X BLANKS VIA HOOKS
REGDSP .EQ $FAD7 DISPLAY WORKING REGISTERS
PREAD .EQ $FB1E READ GAME PADDLE X
INIT .EQ $FB2F INITIALIZE TEXT SCREEN
SETTXT .EQ $FB93 SET UP TEXT SCREEN (NOT 2E!)
SETGR .EQ $FB40 SET UP GRAPHICS SCREEN
SETWND .EQ $FB4B SET NORMAL TEXT WINDOW
SETPWRC .EQ $FB6F
BASCALC .EQ $FBC1 CALCULATE TEXT BASE ADDRESS (NOT 2E!}
BELL1 .EQ $FBD9 BEEP SPEAKER IF CTRL-G
BELL2 .EQ $FBE4 BEEP SPEAKER ONCE
ADVANCE .EQ $FBF4 TEXT CURSOR ONE TO RIGHT
VIDOUT .EQ $FBFD OUTPUT ASCII TO SCREEN ONLY
BS .EQ $FC10 BACKSPACE SCREEN
UP .EQ $FC1A MOVE SCREEN CURSOR UP ONE LINE
VTAB .EQ $FC22 VERTICAL SCREEN TAB USING CV
VTABA .EQ $FC24 VERTICAL SCREEN TAB USING A
ESC1 .EQ $FC66 PROCESS ESCAPE CURSOR MOVES
CLREOP .EQ $FC42 CLEAR TO END OF PAGE
HOME .EQ $FC58 CLEAR TEXT SCREEN AND HOME CURSOR
CR .EQ $FC62 CARRIAGE RETURN TO SCREEN
LF .EQ $FC66 LINEFEED TO SCREEN ONLY
SCROLL .EQ $FC70 SCROLL TEXT SCREEN UP ONE
CLEOL .EQ $FC9C CLEAR TEXT TO END OF LINE
WAIT .EQ $FCA8 TIME DELAY SET BY ACCUMULATOR
RDKEY .EQ $FD0C GET INPUT CHARACTER VIA HOOKS
KEYIN .EQ $FD1B READ THE APPLE KEYBOARD
RDCHAR .EQ $FD35 GET KEY AND PROCESS ESC A-F
CANCEL .EQ $FD62 CANCEL KEYBOARD LINE ENTRY
GETLNZ .EQ $FD67 CR THEN GET KEYBOARD INPUT LINE
GETLN .EQ $FD6A GET KEYBOARD INPUT LINE
GETLN1 .EQ $FD6F GET KBD INPUT, NO PROMPT
CROUT1 .EQ $FD8B CLEAR EOL THEN CR VIA BOOKS
CROUT .EQ $FD8E OUTPUT CR VIA HOOKS
PRBYTE .EQ $FDDA OUTPUT FULL A IN HEX TO HOOKS
PRHEX .EQ $FDE3 OUTPUT LOW A IN HEX TO HOOKS
COUT .EQ $FDED OUTPUT CHARACTER VIA HOOKS
COUTl .EQ $FDF0 OUTPUT CHARACTER TO SCREEN
MOVE .EQ $FE2C MOVE BLOCK OF MEMORY
VERIFY .EQ $FE36 VERIFY BLOCK OF MEMORY
LIST .EQ $FE5E DISASSEMBLE 20 INSTRUCTIONS
LIST2 .EQ $FE63 DISASSEMBLE •A• INSTRUCTIONS
SETINV .EQ $FE80 PRINT INVERSE TEXT TO SCREEN
SETNORM .EQ $FE84 PRINT NORMAL TEXT TO SCREEN
SETVID .EQ $FE93 GRAB OUTPUT HOOKS FOR SCREEN
XBASIC .EQ $FEB0 GO BASIC, DESTROYING OLD
BASCON .EQ $FEB3 GO BASIC, CONTINUING OLD
TRACE .EQ $FEC2 START TRACING (OLD ROM ONLY!)
STEP .EQ $FEC4 SINGLE STEP (OLD ROM ONLY!)
WRITE .EQ $FECD WRITE TO CASSETTE TAPE
READ .EQ $FEF0 READ TO CASSETTE TAPE
PRERR .EQ $FF2D PRINT "ERR" TO OUTPUT HOOK
BELL .EQ $FF3A OUTPUT BELL TO HOOKS
IORESR .EQ $FF3F RESTORE ALL WORKING REGISTER
IOSAVE .EQ $FF4A SAVE ALL WORKING REGISTERS
RETURN .EQ $FF58 "GUARANTEED" RETURN
OLDRST .EQ $FF59 OLD RESET, NO AUTOSTART
MON .EQ $FF65 ENTER MONITOR AND BEEP SPEAKER
MONZ .EQ $FF69 ENTER MONITOR QUIETLY
GETNUM .EQ $FFA7 ASCII TO HEX IN 3E & 3F
*--------------------------------------
MAN
SAVE INC/MONITOR.I

131
INC/PRODOS.I.txt Normal file
View File

@ -0,0 +1,131 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 1000
.LIST OFF
*--------------------------------------
* PRODOS Constants
*--------------------------------------
MLI.MAXPATH .EQ 64
*--------------------------------------
* PRODOS Defines
*--------------------------------------
MLIALLOCIRQ .EQ $40
MLIDEALLOCIRQ .EQ $41
MLIATALK .EQ $42
MLIQUIT .EQ $65
MLIREADBLOCK .EQ $80
MLIWRITEBLOCK .EQ $81
MLIGETTIME .EQ $82
MLICREATE .EQ $C0
MLIDESTROY .EQ $C1
MLIRENAME .EQ $C2
MLISETFILEINFO .EQ $C3
MLIGETFILEINFO .EQ $C4
MLIONLINE .EQ $C5
MLISETPREFIX .EQ $C6
MLIGETPREFIX .EQ $C7
MLIOPEN .EQ $C8
MLINEWLINE .EQ $C9
MLIREAD .EQ $CA
MLIWRITE .EQ $CB
MLICLOSE .EQ $CC
MLIFLUSH .EQ $CD
MLISETMARK .EQ $CE
MLIGETMARK .EQ $CF
MLISETEOF .EQ $D0
MLIGETEOF .EQ $D1
MLISETBUF .EQ $D2
MLIGETBUF .EQ $D3
*--------------------------------------
MLI.ERR.BADCALL .EQ $01
MLI.ERR.BADCNT .EQ $04
MLI.ERR.IRQFULL .EQ $25
MLI.ERR.IO .EQ $27
MLI.ERR.NODEV .EQ $28
MLI.ERR.WRTPROT .EQ $2B
MLI.ERR.DSKSWIT .EQ $2E
MLI.ERR.INVPATH .EQ $40
MLI.ERR.FCBFULL .EQ $42
MLI.ERR.BADREF .EQ $43
MLI.ERR.PNOTFND .EQ $44
MLI.ERR.VNOTFND .EQ $45
MLI.ERR.FNOTFND .EQ $46
MLI.ERR.DUPFILE .EQ $47
MLI.ERR.OVERRUN .EQ $48
MLI.ERR.VOLFULL .EQ $49
*--------------------------------------
MLI .EQ $BF00
JSPARE .EQ $BF03
DATETIME .EQ $BF06
SYSERR .EQ $BF09
SYSDEATH .EQ $BF0C
SERR .EQ $BF0F
DEVPTRS0D1 .EQ $BF10
DEVPTRS1D1 .EQ $BF12
DEVPTRS2D1 .EQ $BF14
DEVPTRS3D1 .EQ $BF16
DEVPTRS4D1 .EQ $BF18
DEVPTRS5D1 .EQ $BF1A
DEVPTRS6D1 .EQ $BF1C
DEVPTRS7D1 .EQ $BF1E
DEVPTRS0D2 .EQ $BF20
DEVPTRS1D2 .EQ $BF22
DEVPTRS2D2 .EQ $BF24
DEVPTRS3D2 .EQ $BF26
DEVPTRS4D2 .EQ $BF28
DEVPTRS5D2 .EQ $BF2A
DEVPTRS6D2 .EQ $BF2C
DEVPTRS7D2 .EQ $BF2E
DEVNUM .EQ $BF30
DEVCNT .EQ $BF31
DEVLST .EQ $BF32 -> $BF3F
DEVLST0END .EQ $BF40 A 0 was added to ensure list ended with 0 if 14 devices in list
PRODOSCOPYRIGHT .EQ $BF41 ;free->$BF4B
MEMTABL .EQ $BF58 -> $BF6F
GL.BUFF .EQ $BF70
INTRUPT1 .EQ $BF80
INTRUPT2 .EQ $BF82
INTRUPT3 .EQ $BF84
INTRUPT4 .EQ $BF86
DATELO .EQ $BF90
TIMELO .EQ $BF92
LEVEL .EQ $BF94
BUBIT .EQ $BF95
SPARE1 .EQ $BF96
MACHID .EQ $BF98
*--------------------------------------
MACHID.TYPE .EQ %11001000
MACHID.TYPE.II .EQ %00000000
MACHID.TYPE.IIp .EQ %01000000
MACHID.TYPE.IIe .EQ %10000000
MACHID.TYPE.IIc .EQ %10001000
MACHID.TYPE.III .EQ %11000000
MACHID.RAM .EQ %00110000
MACHID.RAM.128 .EQ %00110000
MACHID.RAM.64 .EQ %00100000
MACHID.RAM.48 .EQ %00010000
MACHID.SPARE .EQ %00000100
MACHID.COL80 .EQ %00000010
MACHID.CLK .EQ %00000001
*--------------------------------------
SLTBYT .EQ $BF99
PFIXPTR .EQ $BF9A
MLIACTV .EQ $BF9B
CMDADR .EQ $BF9C
SAVEX .EQ $BF9E
SAVEY .EQ $BF9F
*--------------------------------------
* code $BFA0 -> $BFF3
*--------------------------------------
BNKBYT1 .EQ $BFF4
BNKBYT2 .EQ $BFF5
SYS.RTS .EQ $BFF6 code -> $BFFB
IBAKVER .EQ $BFFC
IVERSION .EQ $BFFD
KBAKVER .EQ $BFFE
KVERSION .EQ $BFFF
MAN
SAVE INC/PRODOS.I

30
INC/ZP.I.txt Normal file
View File

@ -0,0 +1,30 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
*--------------------------------------
WNDLFT .EQ $20 SCROLL WINDOW LEFT
WNDWDTH .EQ $21 SCROLL WINDOW WIDTH
WNDTOP .EQ $22 SCROLL WINDOW TOP
WNDBOT .EQ $23 SCROLL WINDOW BOTTOM
CH .EQ $24 CURSOR HORIZONTAL
CV .EQ $25 CURSOR VERTICAL
GBASL .EQ $26 LORES BASE LOW
GBASH .EQ $27 LORES BASE HIGH
BASL .EQ $28 TEXT BASE LOW
BASH .EQ $29 TEXT BASE HIGH
BEND .EQ $2C LORES RIGHT END H LINE
VBOT .EQ $2D LORES BOTTOM OF V LINE
COLOR .EQ $30 LORES COLOR
INVFLG .EQ $31 NORMAL/INVERSE /FLASH (FF,7F,3F)
PROMPT .EQ $33 HOLDS PROMPT SYMBOL
CSWL .EQ $36 OUTPUT CHARACTER HOOK LOW
CSWH .EQ $37 OUTPUT CHARACTER HOOK HIGH
KSWL .EQ $38 INPUT CHARACTER HOOOK LOW
KSWH .EQ $39 INPUT CHARACTER HOOK HIGH
RNDL .EQ $4E RANDOM NUMBER LOW
RNDH .EQ $4F RANDOM NUMBER HIGH
*--------------------------------------
MAN
SAVE INC/ZP.I

29
LIB/LIBCRYPT.I.txt Normal file
View File

@ -0,0 +1,29 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
LIBCRYPT.MD5PStrA .EQ 4
LIBCRYPT.MD5Init .EQ 6
LIBCRYPT.MD5Update .EQ 8
LIBCRYPT.MD5FinalizeA .EQ 10
*--------------------------------------
* S.MD5 STRUCT
*--------------------------------------
S.MD5.ABCD0 .EQ 0
S.MD5.A0 .EQ 0
S.MD5.B0 .EQ 4
S.MD5.C0 .EQ 8
S.MD5.D0 .EQ 12
S.MD5.BITCOUNT .EQ 16
S.MD5.EXTRABIT .EQ 24
S.MD5.FINALIZED .EQ 25
*
S.MD5.SIZE .EQ 26
*--------------------------------------
MAN
SAVE INC/LIBCRYPT.I

511
LIB/LIBCRYPT.S.txt Normal file
View File

@ -0,0 +1,511 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF LIB/LIBCRYPT.O
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBCRYPT.I
*--------------------------------------
* DWORD Macros : Do NOT disturb carry with cpx, cpy...
*--------------------------------------
.MA ADC32
ldx #3
ldy #0
clc
:1 lda ]1,y
adc ]2,y
sta ]3,y
iny
dex
bpl :1
.EM
*--------------------------------------
.MA AND32
ldx #3
:1 lda ]1,x
and ]2,x
sta ]3,x
dex
bpl :1
.EM
*--------------------------------------
.MA ORA32
ldx #3
:1 lda ]1,x
ora ]2,x
sta ]3,x
dex
bpl :1
.EM
*--------------------------------------
.MA EOR32
ldx #3
:1 lda ]1,x
eor ]2,x
sta ]3,x
dex
bpl :1
.EM
*--------------------------------------
.MA NOT32
ldx #3
:1 lda ]1,x
eor #$FF
sta ]2,x
dex
bpl :1
.EM
*--------------------------------------
.MA MOV32
ldx #3
:1 lda ]1,x
sta ]2,x
dex
bpl :1
.EM
*--------------------------------------
.MA ROL32x
:2 lda ]1+3
rol
rol ]1
rol ]1+1
rol ]1+2
rol ]1+3
dex
bne :2
.EM
*--------------------------------------
* Main entry point
* input :
* X = Function
*--------------------------------------
* Code signature and relocation table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA LIB.LOAD
.DA LIB.UNLOAD
.DA MD5PStrA
.DA MD5Init
.DA MD5Update
.DA MD5FinalizeA
*--------------------------------------
.DA 0
.DA CS.END-CS.START
.DA 0
*--------------------------------------
LIB.LOAD
LIB.UNLOAD clc
rts
*--------------------------------------
* MD5PStrA
* in :
* A = hMem To PSTR
* out :
* A = hMem To MessageDigest
*--------------------------------------
MD5PStrA >SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr3 1 and 2 used by other MD5 functions
ldy #0
lda (ZPQuickPtr3),y get PStr len
sta ZPQuickPtr4 ZPQuickPtr4 = str len
stz ZPQuickPtr4+1 0,PSTR len <= 255
inc ZPQuickPtr3
bne .1
inc ZPQuickPtr3+1 Make DATA skip PSTR Len Byte
.1 jsr MD5Init
bcs .9
pha save MD5 Context hMem
>PUSHW ZPQuickPtr4 Push LEN
>PUSHW ZPQuickPtr3 Push DATA
pla
pha
>PUSHA Push MD5 Context
jsr MD5Update
pla get back MD5 Context
pha
jsr MD5FinalizeA
plx get back MD5 Context hMem
pha save MessageDigest hMem
txa
>SYSCALL SYS.FreeMemA Free MD5 Context
pla get back MessageDigest hMem
clc
.9 rts
*--------------------------------------
* MD5Init
* In :
* Out :
* A = hMem To S.MD5
*--------------------------------------
MD5Init >PUSHWI S.MD5.SIZE
>PUSHBI 0
>SYSCALL SYS.GetMem
bcs .9
>STYA ZPQuickPtr1
ldy #0
.1 lda MD5.ABCDINIT,y
sta (ZPQuickPtr1),y
iny
cpy #16
bne .1
lda #0
.2 sta (ZPQuickPtr1),y
iny
cpy #S.MD5.SIZE Includes S.MD5.FINALIZED Flag
bne .2
txa
clc
.9 rts
*--------------------------------------
* MD5Update (Append "$80" & Padding & original size)
* In:
* PULLB MD5 Context hMem
* PULLW DATA PTR
* PULLW DATA LEN
*--------------------------------------
MD5Update >PULLA get MD5 Context
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1 get MD5 Context
>PULLW R.AX get DATA
>PULLW R.BX get LEN
ldy #S.MD5.FINALIZED
lda (ZPQuickPtr1),y
beq .1
sec
rts
.1 lda R.BH More than 256 Bytes remaining to hash ?
bne .3 yes
lda R.BL
bne .2 Len = O ?
clc All data processed
rts
.2 cmp #64 More than 64 Bytes remaining to hash ?
bcc .50 yes
.3 lda #64
.50 sta R.CL Save Chunk Len
jsr MD5UpdateBitCount
ldy #0
.51 lda (R.AX),y Load Buffer with data
sta MD5.BUFFER64,y
iny
cpy R.CL
bne .51
cpy #64 Full 64 Bytes DATA ?
beq .58
lda #$80 no, Append $80
sta MD5.BUFFER64,y
lda #0
.52 iny Pad with 0 to 64
cpy #64
beq .53
sta MD5.BUFFER64,y
bra .52
.53 ldy #S.MD5.EXTRABIT Mark MD5 Context as Appended
lda #$80
sta (ZPQuickPtr1),y
lda R.CL
cmp #56 Enough room for BITCOUNT ?
bcs .58 no
jsr MD5AppendBitCount
.58 jsr MD5Transform
jsr MD5UpdateABCD0
.8 lda R.BL Substract Bytes processed from LEN
sec
sbc R.CL get back chunk Len
sta R.BL
bcs .81
dec R.BH
.81 lda R.AL Add Bytes processed to DATA
clc
adc R.CL
sta R.AL
bcc .82
inc R.AH
.82 jmp .1
*--------------------------------------
* MD5FinalizeA
* In :
* A = hMem To S.MD5
* Out:
* A = MessageDigest (PSTR, 16 Bytes, 32 Chars)
*--------------------------------------
MD5FinalizeA >SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1 get MD5 Context
ldy #S.MD5.FINALIZED
lda (ZPQuickPtr1),y
bne .11
jsr MD5ExtraChunk
.11 >PUSHWI 33 Len + 32 Digits
>PUSHBI 0
>SYSCALL SYS.GetMem
bcs .9
>STYA ZPQuickPtr2
phx save hMem for return
lda #32
sta (ZPQuickPtr2)
inc ZPQuickPtr2
bne .10
inc ZPQuickPtr2+1
.10 ldy #S.MD5.ABCD0
.1 lda (ZPQuickPtr1),y
lsr
lsr
lsr
lsr
tax
lda MD5.DIGITS,x
sta (ZPQuickPtr2)
inc ZPQuickPtr2
bne .2
inc ZPQuickPtr2+1
.2 lda (ZPQuickPtr1),y
and #$0F
tax
lda MD5.DIGITS,x
sta (ZPQuickPtr2)
inc ZPQuickPtr2
bne .3
inc ZPQuickPtr2+1
.3 iny
cpy #S.MD5.ABCD0+16
bne .1
pla get back hMem
clc
.9 rts
*--------------------------------------
* PRIVATE
*--------------------------------------
* MD5AppendBitCount
* In :
* ZPQuickPtr1 = MD5 Context
*--------------------------------------
MD5AppendBitCount
ldx #56
ldy #S.MD5.BITCOUNT Append 8 Bytes of BITCOUNT
.1 lda (ZPQuickPtr1),y
sta MD5.BUFFER64,x
inx
iny
cpy #S.MD5.BITCOUNT+8
bne .1
ldy #S.MD5.FINALIZED Mark MD5 Context as Finalized
lda #$80
sta (ZPQuickPtr1),y
rts
*--------------------------------------
* MD5UpdateBitCount
* In :
* CL = Size (in bytes) to add to MD5 context
* ZPQuickPtr1 = MD5 Context
*--------------------------------------
MD5UpdateBitCount
stz R.CH
lda R.CL
asl
rol R.CH
asl times 8 to get bit count
rol R.CH
asl
rol R.CH
clc
ldy #S.MD5.BITCOUNT
adc (ZPQuickPtr1),y
sta (ZPQuickPtr1),y
iny
lda R.CH
adc (ZPQuickPtr1),y
sta (ZPQuickPtr1),y
bcc .8
.1 iny
lda (ZPQuickPtr1),y
inc
sta (ZPQuickPtr1),y
bne .8
cpy #7
bne .1
.8 rts
*--------------------------------------
* MD5ExtraChunk
* In :
* ZPQuickPtr1 = MD5 Context
*--------------------------------------
MD5ExtraChunk ldy #S.MD5.FINALIZED
lda #$80
sta (ZPQuickPtr1),y Mark MD5 Context as "finalized"
ldx #0
ldy #S.MD5.EXTRABIT Extra Bit already appended ?
lda (ZPQuickPtr1),y
bne .1
lda #$80
sta MD5.BUFFER64 Add extra bit to buffer
sta (ZPQuickPtr1),y Mark Extrabit added
inx
.1 stz MD5.BUFFER64,x pad with "0"...
inx
cpx #56
bne .1 ...until room for bitcount
jsr MD5AppendBitCount
jsr MD5Transform
*--------------------------------------
* MD5UpdateABCD0
* In:
* ZPQuickPtr1 = MD5 Context
*--------------------------------------
MD5UpdateABCD0 ldy #0
.1 clc ADC32 A+A0->A0, B, C, D....
.2 lda MD5.ABCD,y
adc (ZPQuickPtr1),y
sta (ZPQuickPtr1),y
iny
tya
and #3
bne .2
cpy #16
bne .1
rts
*--------------------------------------
* MD5Transform
* In:
* ZPQuickPtr1 = MD5 Context
* 512 Bits Padded chunk in MD5.BUFFER64
* Out:
* Updated MD5.ABCD
*--------------------------------------
MD5Transform ldy #15 init ABCD Chunk with Context ABCD0
.1 lda (ZPQuickPtr1),y
sta MD5.ABCD,y
dey
bpl .1
stz MD5.i Start Proceed 0 to 63 bytes
*--------------------------------------
MD5.0015 lda MD5.i
cmp #16
bcs MD5.1631
>AND32 MD5.B,MD5.C,MD5.F1
>NOT32 MD5.B,MD5.F2
>AND32 MD5.F2,MD5.D,MD5.F2
>ORA32 MD5.F1,MD5.F2,MD5.F
jmp MD5.NEXTi
*--------------------------------------
MD5.1631 cmp #32
bcs MD5.3247
>AND32 MD5.D,MD5.B,MD5.F1
>NOT32 MD5.D,MD5.F2
>AND32 MD5.F2,MD5.C,MD5.F2
>ORA32 MD5.F1,MD5.F2,MD5.F
jmp MD5.NEXTi
*--------------------------------------
MD5.3247 cmp #48
bcs MD5.4863
>EOR32 MD5.B,MD5.C,MD5.F
>EOR32 MD5.F,MD5.D,MD5.F
jmp MD5.NEXTi
*--------------------------------------
MD5.4863 cmp #64
bne .1
rts
.1 >NOT32 MD5.D,MD5.F1
>ORA32 MD5.F1,MD5.B,MD5.F2
>EOR32 MD5.F2,MD5.C,MD5.F
*--------------------------------------
MD5.NEXTi >MOV32 MD5.D,MD5.DTemp
>MOV32 MD5.C,MD5.D
>MOV32 MD5.B,MD5.C
>ADC32 MD5.A,MD5.F,MD5.F
lda MD5.i
asl
asl
tay
ldx #0
clc
.1 lda MD5.K,y ADC32 MD5.K[i],MD5.F,MD5.F
adc MD5.F,x
sta MD5.F,x
iny
inx
txa
eor #4 DO NOT DISTURB carry with cpx !!!
bne .1
ldy MD5.i
lda MD5.g,y
asl
asl
tay
ldx #0
clc
.2 lda MD5.BUFFER64,y ADC32 M[g],MD5.F,MD5.F
adc MD5.F,x
sta MD5.F,x
iny
inx
txa
eor #4 DO NOT DISTURB carry with cpx !!!
bne .2
ldy MD5.i
lda MD5.s,y get s[i] in x
tax
>ROL32x MD5.F
>ADC32 MD5.B,MD5.F,MD5.B
>MOV32 MD5.DTemp,MD5.A
inc MD5.i
jmp MD5.0015
*--------------------------------------
CS.END
MD5.ABCD
MD5.A .BS 4 Chunk Level,A,B,C,D
MD5.B .BS 4
MD5.C .BS 4
MD5.D .BS 4
MD5.DTemp .BS 4
MD5.F .BS 4
MD5.F1 .BS 4
MD5.F2 .BS 4
MD5.i .BS 1
MD5.BUFFER64 .BS 64
*--------------------------------------
MD5.ABCDINIT .HS 01234567.89ABCDEF.FEDCBA98.76543210
*--------------------------------------
MD5.s .DA #7,#12,#17,#22,#7,#12,#17,#22,#7,#12,#17,#22,#7,#12,#17,#22
.DA #5,#9,#14,#20,#5,#9,#14,#20,#5,#9,#14,#20,#5,#9,#14,#20
.DA #4,#11,#16,#23,#4,#11,#16,#23,#4,#11,#16,#23,#4,#11,#16,#23
.DA #6,#10,#15,#21,#6,#10,#15,#21,#6,#10,#15,#21,#6,#10,#15,#21
*--------------------------------------
MD5.g .DA #0,#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15
.DA #1,#6,#11,#0,#5,#10,#15,#4,#9,#14,#3,#8,#13,#2,#7,#12
.DA #5,#8,#11,#14,#1,#4,#7,#10,#13,#0,#3,#6,#9,#12,#15,#2
.DA #0,#7,#14,#5,#12,#3,#10,#1,#8,#15,#6,#13,#4,#11,#2,#9
*--------------------------------------
MD5.K .HS 78A46AD7.56B7C7E8.DB702024.EECEBDC1
.HS AF0F7CF5.2AC68747.134630A8.019546FD
.HS D8988069.AFF7448B.B15BFFFF.BED75C89
.HS 2211906B.937198FD.8E4379A6.2108B449
.HS 62251EF6.40B340C0.515A5E26.AAC7B6E9
.HS 5D102FD6.53144402.81E6A1D8.C8FBD3E7
.HS E6CDE121.D60737C3.870DD5F4.ED145A45
.HS 05E9E3A9.F8A3EFFC.D9026F67.8A4C2A8D
.HS 4239FAFF.81F67187.22619D6D.0C38E5FD
.HS 44EABEA4.A9CFDE4B.604BBBF6.70BCBFBE
.HS C67E9B28.FA27A1EA.8530EFD4.051D8804
.HS 39D0D4D9.E599DBE6.F87CA21F.6556ACC4
.HS 442229F4.97FF2A43.A72394AB.39A093FC
.HS C3595B65.92CC0C8F.7DF4EFFF.D15D8485
.HS 4F7EA86F.E0E62CFE.144301A3.A111084E
.HS 827E53F7.35F23ABD.BBD2D72A.91D386EB
*--------------------------------------
MD5.DIGITS .AS "0123456789ABCDEF"
*--------------------------------------
MAN
SAVE LIB/LIBCRYPT.S
ASM

783
LIB/LIBSTR.S.txt Normal file
View File

@ -0,0 +1,783 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF LIB/LIBSTR.O
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
*--------------------------------------
ZPTmpPtr1 .EQ ZPLIB+2
ZPTmpPtr2 .EQ ZPLIB+4
ZPTmpPtr3 .EQ ZPLIB+6
*--------------------------------------
* Main entry point
* input :
* X = Function
*--------------------------------------
* Code signature and relocation table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA LIB.LOAD
.DA LIB.UNLOAD
.DA PRINTF
.DA PRINTC
.DA PRINTP
.DA STRMATCHP
.DA STRCPYP
.DA STRCATP
.DA UCASEP
.DA LCASEP
.DA PRINTDATE
.DA PRINTTIME
.DA SSCANF
*--------------------------------------
PRINTFJMP1 .DA PRINTFA
.DA PRINTFB,PRINTFBB
.DA PRINTFD,PRINTFDD,PRINTFL
.DA PRINTFE,PRINTFEE
.DA PRINTFH,PRINTFHH
.DA PRINTFI,PRINTFII
.DA PRINTFSC,PRINTFSP
.DA PRINTFT,PRINTFTT
PRINTFJMP2 .DA PRINTFCR,PRINTFBKSLH,PRINTFPERCENT
*--------------------------------------
.DA 0
.DA CS.END-CS.START
.DA 0
*--------------------------------------
LIB.LOAD
LIB.UNLOAD clc
rts
*--------------------------------------
* PRINTF :
* Prints C-Style String
* PULLW Pointer to Sting,Last Byte negative
* %a pull 1 byte to print ATTRIB String
* %b pull 1 byte to print BIN
* %B pull 2 byte to print BIN
* %d pull 1 byte to print unsigned DEC
* %D pull 2 bytes to print unsigned DEC
* %L pull 4 bytes to print unsigned DEC
* %e pull 1 byte to print low Nibble HEX
* %E pull 1 byte to print high Nibble HEX
* %h pull 1 byte to print HEX
* %H pull 2 bytes to print HEX
* %i pull 1 byte to print signed DEC
* %I pull 2 bytes to print signed DEC
* %s pull 2 bytes ptr to C-Style String
* %S pull 2 bytes ptr to P-Style String
* \n print CR=13
* \\ print \
* \% print %
* padding :
* %d '9' '12'
* %2d ' 9' '12'
* %02d '09' '12'
* %16s 'ABCDEFGHIjkl '
* %011s 'ABCDEFGH000'
*--------------------------------------
PRINTF >PULLW ZPTmpPtr1
ldy #0
PRINTFCOUT lda (ZPTmpPtr1),y
beq .1
ora #$80
cmp #"%"
beq PRINTFESC1
cmp #"\"
beq PRINTFESC2
jsr COUT
iny
bne PRINTFCOUT
.1 rts
PRINTFEXIT ply
iny
bne PRINTFCOUT
rts
*--------------------------------------
PRINTFESC1 stz PADLEN
lda #" "
sta PADCHAR
.1 ldx #PRINTFTBL1.END-PRINTFTBL1-1
iny
lda (ZPTmpPtr1),y
beq .9
ora #$80
.2 cmp PRINTFTBL1,x do we have a %x command?
beq .8 yes, jmp to it!
dex
bpl .2 no valid letter...
cmp #"0" ...a 0...mmm... padding char!!
beq .4
bcc .9
cmp #"9"
bcs .9
.3 and #$0F we have a digit
pha save it...
lda PADLEN starts PADLEN * 10
asl times 2
pha save times 2
asl times 4
asl times 8
sta PADLEN
pla get back times 2
clc
adc PADLEN times 8 + times 2 = times 10
sta PADLEN
pla get back current digit
adc PADLEN
sta PADLEN
bra .5
.4 lda PADLEN do we already had met digits to build PADLEN ?
bne .3 yes, continue to build PADLEN
lda #"0"
sta PADCHAR no, this is the first 0, so make it PADCHAR
.5 bra .1
.8 phy
txa
asl
tax
jmp (PRINTFJMP1,x)
.9 rts
*--------------------------------------
PRINTFESC2 ldx #PRINTFTBL2.END-PRINTFTBL2-1
iny
lda (ZPTmpPtr1),y
beq .9
ora #$80
.2 cmp PRINTFTBL2,x
beq .3
dex
bpl .2
rts
.3 phy
txa
asl
tax
jmp (PRINTFJMP2,x)
.9 rts
*--------------------------------------
PRINTFA >PULLA
ldx #0
.1 asl
pha
lda #"-"
bcc .2
lda PRINTF.ATTRIB,x
.2 jsr COUT
pla
inx
cpx #8
bne .1
jmp PRINTFEXIT
PRINTFB ldx #8
>PULLA
.1 asl
pha
lda #$B0
bcc .2
inc
.2 jsr COUT
pla
dex
bne .1
jmp PRINTFEXIT
PRINTFBB >PULLA
>PULLA
jmp PRINTFEXIT
PRINTFD >PULLA
sta HEXBUF
stz HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
jsr HEX2DEC
jmp PRINTFEXIT
PRINTFDD >PULLA
sta HEXBUF
>PULLA
sta HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
jsr HEX2DEC
jmp PRINTFEXIT
PRINTFL >PULLA
sta HEXBUF
>PULLA
sta HEXBUF+1
>PULLA
sta HEXBUF+2
>PULLA
sta HEXBUF+3
jsr HEX2DEC
jmp PRINTFEXIT
PRINTFE >PULLA
jsr PRHEX
jmp PRINTFEXIT
PRINTFEE >PULLA
lsr
lsr
lsr
lsr
jsr PRHEX
jmp PRINTFEXIT
PRINTFH >PULLA
jsr PRBYTE
jmp PRINTFEXIT
PRINTFHH >PULLA
pha
>PULLA
jsr PRBYTE
pla
jsr PRBYTE
jmp PRINTFEXIT
PRINTFI >PULLA
jmp PRINTFEXIT
PRINTFII >PULLA
>PULLA
jmp PRINTFEXIT
PRINTFSC >PULLYA
jsr PRINTYA
jmp PRINTFEXIT
PRINTFSP >PULLYA
jsr PRINTYAP
jmp PRINTFEXIT
PRINTFT jsr PRINTTIME
jmp PRINTFEXIT
PRINTFTT jsr PRINTDATE
jmp PRINTFEXIT
PRINTFCR jsr CROUT
jmp PRINTFEXIT
PRINTFBKSLH lda #"\"
jsr COUT
jmp PRINTFEXIT
PRINTFPERCENT lda #"%"
jsr COUT
jmp PRINTFEXIT
*--------------------------------------
PRINTC >PULLW ZPTmpPtr2
ldy #0
.1 lda (ZPTmpPtr2),y
beq .8
ora #$80
jsr COUT
iny
bne .1
.8 rts
*--------------------------------------
PRINTP >PULLW ZPTmpPtr2
ldy #0
lda (ZPTmpPtr2),y
tax
beq .8
.1 iny
lda (ZPTmpPtr2),y
ora #$80
jsr COUT
dex
bne .1
.8 rts
*--------------------------------------
* STRMATCHP : (P-Style Strings)
* pull PTR to Dest String
* pull PTR to Src string
* works with wildcards :
* Dest Str Src str
* message = m?ss*
* = me*ge
* = *ge
* = *
* message = me?sage != me?age
*--------------------------------------
STRMATCHP >PULLW ZPTmpPtr1
>PULLW ZPTmpPtr2
rts
*--------------------------------------
* STRCPYP : (P-Style Strings)
* pull PTR to Dest String
* pull PTR to Src string
*--------------------------------------
STRCPYP >PULLW ZPTmpPtr1
>PULLW ZPTmpPtr2
lda (ZPTmpPtr2)
sta (ZPTmpPtr1)
tay
beq .2
.1 lda (ZPTmpPtr2),y
sta (ZPTmpPtr1),y
dey
bne .1
.2 rts
*--------------------------------------
* STRCATP : (P-Style Strings)
* pull PTR to Dest String
* pull PTR to Src string
*--------------------------------------
STRCATP >PULLW ZPTmpPtr1
>PULLW ZPTmpPtr2
lda (ZPTmpPtr1)
tay
iny
lda (ZPTmpPtr2)
tax
beq .3
.1 inc ZPTmpPtr2
bne .2
inc ZPTmpPtr2+1
.2 lda (ZPTmpPtr2)
sta (ZPTmpPtr1),y
iny
dex
bne .1
dey
tya
sta (ZPTmpPtr1)
.3 rts
*--------------------------------------
UCASEP phx
>PULLW ZPTmpPtr2
ldy #0
lda (ZPTmpPtr2),y
tax
beq .9
.1 iny
lda (ZPTmpPtr2),y
cmp #$61 "a"
bmi .2
cmp #$7B "z"+1
bpl .2
sec
sbc #$20
sta (ZPTmpPtr2),y
.2 dex
bne .1
.9 plx
rts
*--------------------------------------
LCASEP phx
>PULLW ZPTmpPtr2
ldy #0
lda (ZPTmpPtr2),y
tax
beq .9
.1 iny
lda (ZPTmpPtr2),y
cmp #$41 "A"
bmi .2
cmp #$5B "Z"+1
bpl .2
clc
adc #$20
sta (ZPTmpPtr2),y
.2 dex
bne .1
.9 plx
rts
*--------------------------------------
* PULLW = DATE in ProDOS Format
* A = year, Y = month/day
*--------------------------------------
PRINTDATE stz HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
ldx #"0"
stx PADCHAR
ldx #2
stx PADLEN
>PULLYA
pha save year to get high bit of month later
lsr
pha
cmp #70 are we in the 70s ?
bcc .1
lda #$19
bra .2
.1 lda #$20
.2 jsr PRBYTE
pla
sta HEXBUF
jsr HEX2DEC
lda #"/"
jsr COUT
ldx #"0"
stx PADCHAR
ldx #2
stx PADLEN
pla get back year
lsr get high bit of month in carry
tya get month/day
pha save it for day
ror pick high bit from carry
lsr
lsr
lsr
lsr
sta HEXBUF
jsr HEX2DEC
lda #"/"
jsr COUT
ldx #"0"
stx PADCHAR
ldx #2
stx PADLEN
pla get back month/day
and #$1F
sta HEXBUF
jmp HEX2DEC
*--------------------------------------
* PULLW = TIME in ProDOS Format
* A = hours, Y = minutes
*--------------------------------------
PRINTTIME stz HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
ldx #"0"
stx PADCHAR
ldx #2
stx PADLEN
>PULLYA
and #$1F
sta HEXBUF
jsr HEX2DEC
lda #":"
jsr COUT
ldx #"0"
stx PADCHAR
ldx #2
stx PADLEN
tya get minutes
and #$3F
sta HEXBUF
jmp HEX2DEC
*--------------------------------------
*
*--------------------------------------
SSCANF >PULLW ZPTmpPtr1 get PString to scan (ex: "192.168.1.5")
>PULLW ZPTmpPtr2 get PString pattern (ex: "%d.%d.%d.%d")
>PULLW ZPTmpPtr3 get target buffer
ldy #0 Y = PTR in pattern
lda (ZPTmpPtr1)
beq .9
tax X = COUNT to scan
inc ZPTmpPtr1
bne .1
inc ZPTmpPtr1+1
.1 txa End Of String?
beq .8
tya
cmp (ZPTmpPtr2) End of pattern?
beq .8
iny
lda (ZPTmpPtr2),y
cmp #'%' Escape?
beq .2
cmp (ZPTmpPtr1) Same char?
bne .9
jsr SSCANF.IncPtr1
bne .1
clc
rts
.2 tya
cmp (ZPTmpPtr2) unexpected End of pattern after "%" ?
beq .9
iny
lda (ZPTmpPtr2),y
cmp #'d' BYTE ?
bne .3
stz ASCBUF
.20 lda (ZPTmpPtr1)
jsr SSCANF.IsDigit
bcs .21
phx
inc ASCBUF
ldx ASCBUF
sta ASCBUF,x
plx
jsr SSCANF.IncPtr1
bne .20 end of string ?
.21 jsr DEC2HEX
lda HEXBUF
sta (ZPTmpPtr3)
inc ZPTmpPtr3
bne .1
inc ZPTmpPtr3+1
bra .1
.3 cmp #'D' WORD ?
bne .4
bra .1
.4 cmp #'s' STRING ?
bne .9
bra .1
.8 clc
rts
.9 sec
rts
*--------------------------------------
SSCANF.IncPtr1 dex
beq .1
inc ZPTmpPtr1
bne .1
inc ZPTmpPtr1+1 never Zero
.1 rts
*--------------------------------------
SSCANF.IsDigit cmp #'0'
bcc .1
cmp #'9'+1
bcs .1
rts
.1 sec
rts
*--------------------------------------
********** PRIVATE FUNCTIONS **********
*--------------------------------------
* PRINTYAC :
* Prints C-Style String
* Y,A=Pointer to Sting, Last Byte 0
*--------------------------------------
PRINTYA >STYA ZPTmpPtr2
ldy #0
.1 lda (ZPTmpPtr2),y
beq .2
ora #$80
jsr COUT
iny
bne .1
.2 rts
*--------------------------------------
* PRINTYAP :
* Prints Pascal-Style String
* Y,A=Pointer to Sting, LEN=1st Byte
*--------------------------------------
PRINTYAP phx
>STYA ZPTmpPtr2
ldy #0
lda (ZPTmpPtr2),y
tax
beq .8
.1 iny
lda (ZPTmpPtr2),y
ora #$80
jsr COUT
lda PADLEN
beq .2
cpy PADLEN
beq .8
.2 dex
bne .1
lda PADLEN
beq .8
.3 lda PADCHAR
jsr COUT
iny
cpy PADLEN
bne .3
.8 plx
rts
*--------------------------------------
* Convert HEXBUF to ASCBUF decimal padded with 0
*--------------------------------------
HEX2DEC phx
phy
ldx #4
.1 stz BCDBUF,x Clear all 5 bytes
dex
bpl .1
ldx #32 let's roll 32 bits
sed
.2 asl HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
php cpy will disturb carry while BCD adc
ldy #0
.3 plp
lda BCDBUF,y
adc BCDBUF,y
sta BCDBUF,y
php
iny
cpy #5 Last byte of BCDBUF?
bne .3
plp
dex
bne .2
cld
ldy #0
ldx #9
.4 lda BCDBUF,y
pha
and #$0F
ora #$B0
sta ASCBUF,x
dex
pla
lsr
lsr
lsr
lsr
ora #$B0
sta ASCBUF,x
iny
dex
bpl .4
lda PADLEN any Len format ?
beq .5 no
lda #10
sec yes, print only digits starting at pos 10-padlen
sbc PADLEN
.5 tax x=0 if no padlen, or x=10-padlen
.6 lda ASCBUF,x
cmp #$B0 a zero?
beq .7
inc PADLEN found a non zero, print all digits, even if 0, next time
ldy #"0"
sty PADCHAR
bra .8
.7 cpx #9 last digit ?
beq .8 print always
ldy PADLEN no pad to fill, do not print 0
beq .9
lda PADCHAR fill with PADCHAR
.8 jsr COUT
.9 inx
cpx #10
bne .6
ply
plx
rts
*--------------------------------------
* Convert ASCBUF decimal to HEXBUF
*--------------------------------------
DEC2HEX phx
phy
stz HEXBUF
stz HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
ldx #0
.1 asl HEXBUF HEXBUF * 2 -> HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
lda HEXBUF HEXBUF * 2 -> HEXBUFTMP
asl
sta HEXBUFTMP
lda HEXBUF+1
rol
sta HEXBUFTMP+1
lda HEXBUF+2
rol
sta HEXBUFTMP+2
lda HEXBUF+3
rol
sta HEXBUFTMP+3
asl HEXBUFTMP HEXBUFTMP * 2 -> HEXBUFTMP
rol HEXBUFTMP+1
rol HEXBUFTMP+2
rol HEXBUFTMP+3
lda HEXBUF HEXBUF + HEXBUFTMP -> HEXBUF
clc
adc HEXBUFTMP
sta HEXBUF
lda HEXBUF+1
adc HEXBUFTMP+1
sta HEXBUF+1
lda HEXBUF+2
adc HEXBUFTMP+2
sta HEXBUF+2
lda HEXBUF+3
adc HEXBUFTMP+3
sta HEXBUF+3
inx
lda ASCBUF,x
and #$0F
clc
adc HEXBUF
sta HEXBUF
bcc .2
inc HEXBUF+1
bne .2
inc HEXBUF+2
bne .2
inc HEXBUF+3
.2 cpx ASCBUF
bne .1
ply
plx
rts
*--------------------------------------
PRBYTE pha
lsr
lsr
lsr
lsr
ora #$B0
cmp #$BA
bcc .1
adc #6
.1 jsr COUT
pla
PRHEX and #$0F
ora #$B0
cmp #$BA
bcc COUT
adc #6
bra COUT
*--------------------------------------
CROUT lda #13
*--------------------------------------
COUT phx
phy
>PUSHA
ldy #S.PS.hOUTDEV
lda (pPsContext),y
>SYSCALL SYS.DevOutA
ply
plx
rts
*--------------------------------------
CS.END
PRINTFTBL1 .AS -"abBdDLeEhHiIsStT"
PRINTFTBL1.END
PRINTFTBL2 .AS -"n\%"
PRINTFTBL2.END
PRINTF.ATTRIB .AS -"dnb+++wr"
*--------------------------------------
PADCHAR .BS 1
PADLEN .BS 1
HEXBUF .BS 4 32 bits max
HEXBUFTMP .BS 4
BCDBUF .BS 5 5, enough to handle 32bits
ASCBUF .BS 11 LEN + 10 digits ($FFFFFFFF=4.294.967.295)
*--------------------------------------
MAN
SAVE LIB/LIBSTR.S
ASM

266
LIB/LIBTCPIP.S.ARP.txt Normal file
View File

@ -0,0 +1,266 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* ARP.CLEAR
*--------------------------------------
ARP.CLEAR ldx #K.ARPCACHE.SIZE*S.ARPCACHE
.1 stz ARP.CACHE-1,x
dex
bne .1
clc
rts
*--------------------------------------
* ARP.QUERY
* In:
* PULLW PTR to IP
* PULLW PTR to MAC (to fill)
* Out:
* CC: hit: MAC filled
* CS: missed
*--------------------------------------
ARP.QUERY >PULLW ZPARPIP IP
>PULLW ZPARPMAC MAC
jmp ARP.QUERY.I
*--------------------------------------
* ARP.ADD
* In:
* PULLW PTR to IP
* PULLW PTR to MAC
*--------------------------------------
ARP.ADD >PULLW ZPARPIP IP
>PULLW ZPARPMAC MAC
lda #S.ARPCACHE.STATUS.RESOLVED
jmp ARP.ADD.I
*--------------------------------------
* ARP.GETCACHE
* Out:
* Y,A = PTR to ARP.CACHE
*--------------------------------------
ARP.GETCACHE >LDYA L.ARP.CACHE
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
ARP.RESOLVE ldy #S.IP.DST
lda (ZPFrameBase1),y
iny
.1 and (ZPFrameBase1),y
iny
cpy #S.IP.DST+4
bne .1
cmp #$FF
bne .3 not a broadcast....
ldy #S.ETH.DSTMAC
.2 sta (ZPFrameBase1),y
iny
cpy #S.ETH.DSTMAC+6
bne .2
clc
rts
.3 ldy #S.IP.DST+3
ldx #3
.4 lda (ZPFrameBase1),y
eor IPCFG+S.IPCFG.IP,x
and IPCFG+S.IPCFG.MASK,x
bne .5
dey
dex
bpl .4
lda ZPFrameBase1 Same network, query ARP for dest IP
clc
adc #S.IP.DST
sta ZPARPIP
lda ZPFrameBase1+1
adc /S.IP.DST
sta ZPARPIP+1
bra .6
.5 lda L.IPCFG Not Same network, query ARP for GW
clc
adc #S.IPCFG.GW
sta ZPARPIP
lda L.IPCFG+1
adc /S.IPCFG.GW
sta ZPARPIP+1
.6 lda ZPFrameBase1
clc
adc #S.ETH.DSTMAC
sta ZPARPMAC
lda ZPFrameBase1+1
adc /S.ETH.DSTMAC
sta ZPARPMAC+1
*--------------------------------------
ARP.QUERY.I ldx #0
.1 phx
lda ARP.CACHE,x
beq .5 empty ARP Cache entry, try next...
ldy #0
.2 lda ARP.CACHE+S.ARPCACHE.IP,x
cmp (ZPARPIP),y
bne .5 wrong IP, try next...
inx
iny
cpy #4
bne .2
plx
lda ARP.CACHE,x get back status
bpl .4 Pending...
ldy #0 already resolved, get MAC
.3 lda ARP.CACHE+S.ARPCACHE.MAC,x
sta (ZPARPMAC),y
inx
iny
cpy #6
bne .3
clc
rts
.4 inc ARP.CACHE+S.ARPCACHE.RETRYCNT,x Pending, increase Retry Count
bne .41
stz ARP.CACHE,x reached max retry,mark as free
.41 sec
rts
.5 pla
clc
adc #S.ARPCACHE
tax
cmp #K.ARPCACHE.SIZE*S.ARPCACHE
bne .1
jsr NEW.ARP.FRAME nothing in ARP cache, send ARP request
bcs .9
phx
ldy #S.ARP.OPERATION+1
lda #S.ARP.OPERATION.REQ
sta (ZPFrameBase1),y
ldx #5
ldy #S.ARP.SHA+5
.71 lda IPCFG+S.IPCFG.MAC,x
sta (ZPFrameBase1),y
dey
dex
bpl .71
ldx #3
ldy #S.ARP.SPA+3
.72 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameBase1),y
dey
dex
bpl .72
ldy #3
.73 lda (ZPARPIP),y
pha
dey
bpl .73
ldy #S.ARP.TPA
.74 pla
sta (ZPFrameBase1),y
iny
cpy #S.ARP.TPA+4
bne .74
lda #255
ldy #S.ETH.DSTMAC
.75 sta (ZPFrameBase1),y
iny
cpy #S.ETH.DSTMAC+6
bne .75
jsr SEND.ARP.FRAME.I
bcs .76
jsr ARP.ADD.PENDING ZPARPIP still pointing IP
.76 pla
>SYSCALL SYS.FreeMemA
sec
.9 rts
*--------------------------------------
ARP.ADD.PENDING lda #S.ARPCACHE.STATUS.PENDING
ARP.ADD.I sta Status
ldx #0
.1 lda ARP.CACHE,x get status
beq .7 empty ARP cache entry
phx
ldy #0
.2 lda (ZPARPIP),y
cmp ARP.CACHE+S.ARPCACHE.IP,x
bne .4
inx
iny
cpy #4
bne .2
plx
bra .7 same IP,update MAC
.4 pla get back index in ARP.CACHE
clc
adc #S.ARPCACHE
cmp #K.ARPCACHE.SIZE*S.ARPCACHE
beq .5 Cache is full ?
tax
bra .1
.5 ldx #K.ARPCACHE.SIZE*S.ARPCACHE-S.ARPCACHE
.6 lda ARP.CACHE+S.ARPCACHE-1,x
sta ARP.CACHE-1,x
dex
bne .6
ldx #K.ARPCACHE.SIZE*S.ARPCACHE-S.ARPCACHE
.7 lda Status
sta ARP.CACHE,x mark ARP entry Status
inx
stz ARP.CACHE,x Init retry count
inx
ldy #0
.8 lda (ZPARPIP),y store IP in cache
sta ARP.CACHE,x
inx
iny
cpy #4
bne .8
lda Status
bpl .82 no MAC if "pending"
ldy #0
.81 lda (ZPARPMAC),y store MAC in cache
sta ARP.CACHE,x
inx
iny
cpy #6
bne .81
.82 clc
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.ARP
LOAD LIB/LIBTCPIP.S
ASM

314
LIB/LIBTCPIP.S.DNS.txt Normal file
View File

@ -0,0 +1,314 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE
.1 stz DNS.CACHE-1,x
dex
bne .1
clc
rts
*--------------------------------------
* DNS.QUERY
* In:
* PULLA = hostname PSTR
* PULLW = PTR to IP to fill with cached data
* Out:
* CC: hit: IP filled with address
* CS: missed
*--------------------------------------
DNS.QUERY >PULLB hHOST Get host string hMem
>SYSCALL SYS.GetMemPtrA
>STYA ZPDNSHostname
>PULLW ZPDNSIP Get IP address to fill
ldx #0
.1 lda DNS.CACHE,x
beq .6 empty DNS cache entry?
lda DNS.CACHE+S.DNSCACHE.hNAME,x
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr3
lda (ZPDNSHostname)
cmp (ZPQuickPtr3) Same Length?
bne .6
tay
.2 lda (ZPDNSHostname),y
jsr ToLowerCaseA
cmp (ZPQuickPtr3),y
bne .6
dey
bne .2
lda DNS.CACHE,x get back status...
bpl .4 Pending...
ldy #0
.3 lda DNS.CACHE+S.DNSCACHE.IP,x
sta (ZPDNSIP),y
inx
iny
cpy #4
bne .3
clc
rts
.4 sec
rts
.6 txa
clc
adc #S.DNSCACHE
tax
cmp #K.DNSCACHE.SIZE*S.DNSCACHE
bne .1
DNS.REQUEST jsr NEW.UDP.FRAME
bcc .1
bra *
rts
.1 phx
ldy #S.UDP.SRCPORT
lda /UDP.PORT.DNS
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DNS
sta (ZPFrameBase1),y
ldy #S.UDP.DSTPORT
lda /UDP.PORT.DNS
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DNS
sta (ZPFrameBase1),y
ldy #S.DNS.F
lda /S.DNS.F.RD
sta (ZPFrameBase1),y
iny
lda #S.DNS.F.RD
sta (ZPFrameBase1),y
ldy #S.DNS.QDCOUNT
lda /1
sta (ZPFrameBase1),y
iny
lda #1
sta (ZPFrameBase1),y
lda #S.DNS
clc
adc ZPFrameBase1
sta ZPFramePtr1
lda /S.DNS
adc ZPFrameBase1+1
sta ZPFramePtr1+1
lda (ZPDNSHostname) Get hostname len
tay
ldx #0
.2 lda (ZPDNSHostname),y
cmp #'.'
bne .3
txa
ldx #$FF
.3 sta (ZPFramePtr1),y
inx
dey
bne .2
txa
sta (ZPFramePtr1)
lda (ZPDNSHostname)
tay
iny
lda #$0 Ending #0
sta (ZPFramePtr1),y
iny
lda /S.DNS.QTYPE.A
sta (ZPFramePtr1),y
iny
lda #S.DNS.QTYPE.A
sta (ZPFramePtr1),y
iny
lda /S.DNS.QCLASS.IN
sta (ZPFramePtr1),y
iny
lda #S.DNS.QCLASS.IN
sta (ZPFramePtr1),y
lda (ZPDNSHostname) Get hostname len again (QNAME)
clc
adc #6 (len+1) + Ending 0 + QTYPE + QCLASS
adc #S.DNS
sta ZPFrameLen1
lda #0
adc /S.DNS
sta ZPFrameLen1+1
ldx #S.IPCFG.DNS
ldy #S.IP.DST
lda IPCFG,x
beq .5
.4 lda IPCFG,x
sta (ZPFrameBase1),y
iny
inx
cpx #S.IPCFG.DNS+4
bne .4
jsr SEND.UDP.FRAME.I
bcs .8
.5 ldx #S.IPCFG.DNS+4
ldy #S.IP.DST
lda IPCFG,x
beq .7
.6 lda IPCFG,x
sta (ZPFrameBase1),y
iny
inx
cpx #S.IPCFG.DNS+8
bne .6
jsr SEND.UDP.FRAME.I
bcs .8
.7 jsr DNS.ADD.PENDING.I
.8 pla
>SYSCALL SYS.FreeMemA
sec
rts
*--------------------------------------
* DNS.ADD
* In:
* PULLA = hostname PSTR to Add
* PULLW = PTR to IP
* PULLW = TTL
*--------------------------------------
DNS.ADD >PULLB hHOST Get host string hMem
>SYSCALL SYS.GetMemPtrA
>STYA ZPDNSHostname
>PULLW ZPDNSIP Get host IP address
>PULLW HOST.TTL
lda #S.DNSCACHE.STATUS.RESOLVED
bra DNS.ADD.I
DNS.ADD.PENDING.I
lda #S.DNSCACHE.STATUS.PENDING
DNS.ADD.I sta Status
ldx #0
.1 lda DNS.CACHE,x
beq DNS.ADD.ENTRY free ?
lda DNS.CACHE+S.DNSCACHE.hNAME,x
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr3
lda (ZPDNSHostname)
cmp (ZPQuickPtr3) Same Length?
bne .4
tay
.2 lda (ZPDNSHostname),y
jsr ToLowerCaseA
cmp (ZPQuickPtr3),y
bne .4
dey
bne .2
bra DNS.UPD.ENTRY
.4 txa
clc
adc #S.DNSCACHE
cmp #K.DNSCACHE.SIZE*S.DNSCACHE
beq .5
tax
bra .1
.5 lda DNS.CACHE+S.DNSCACHE.hNAME discard oldest entry hNAME
>SYSCALL SYS.FreeMemA
ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE
.6 lda DNS.CACHE+S.DNSCACHE-1,x
sta DNS.CACHE-1,x
dex
bne .6
ldx #K.DNSCACHE.SIZE*S.DNSCACHE-S.DNSCACHE
DNS.ADD.ENTRY phx
lda (ZPDNSHostname)
inc add 1 for len
tay
lda #0
>PUSHYA push PSTR len
>PUSHBI 0 no option
>SYSCALL SYS.GetMem
bcc .10
plx
rts
.10 >STYA ZPQuickPtr3
txa
plx
sta DNS.CACHE+S.DNSCACHE.hNAME,x
lda (ZPDNSHostname)
sta (ZPQuickPtr3)
tay
.1 lda (ZPDNSHostname),y
jsr ToLowerCaseA
sta (ZPQuickPtr3),y
dey
bne .1
DNS.UPD.ENTRY lda Status
sta DNS.CACHE,x
bpl .9 pending...
lda HOST.TTL
sta DNS.CACHE+S.DNSCACHE.TTL,x
lda HOST.TTL+1
sta DNS.CACHE+S.DNSCACHE.TTL+1,x
ldy #0
.2 lda (ZPDNSIP),y
sta DNS.CACHE+S.DNSCACHE.IP,x
inx
iny
cpy #4
bne .2
clc
rts
.9 sec
rts
*--------------------------------------
DNS.GETCACHE >LDYA L.DNS.CACHE
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.DNS
LOAD LIB/LIBTCPIP.S
ASM

482
LIB/LIBTCPIP.S.txt Normal file
View File

@ -0,0 +1,482 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF LIB/LIBTCPIP.O
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPFrameBase1 .EQ ZPLIB
ZPFrameLen1 .EQ ZPLIB+2
ZPFramePtr1 .EQ ZPLIB+4
ZPARPIP .EQ ZPLIB+6
ZPARPMAC .EQ ZPLIB+8
ZPDNSHostname .EQ ZPLIB+10
ZPDNSIP .EQ ZPLIB+12
*--------------------------------------
* Main entry point
* input :
* X = Function
*--------------------------------------
* Code signature and relocation table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA LIB.LOAD
.DA LIB.UNLOAD
.DA SET.IPCFG
.DA GET.IPCFG
.DA NEW.ICMP.FRAME
.DA NEW.TCP.FRAME
.DA NEW.UDP.FRAME
.DA NEW.IP.FRAME
.DA NEW.ARP.FRAME
.DA NEW.ETH.FRAME
.DA SEND.ICMP.FRAME
.DA SEND.TCP.FRAME
.DA SEND.UDP.FRAME
.DA SEND.IP.FRAME
.DA SEND.ARP.FRAME
.DA SEND.ETH.FRAME
.DA ARP.CLEAR
.DA ARP.QUERY
.DA ARP.ADD
.DA ARP.GETCACHE
.DA DNS.CLEAR
.DA DNS.QUERY
.DA DNS.ADD
.DA DNS.GETCACHE
.DA UDP.LISTENER
.DA TCP.LISTENER
.DA ADD.LISTENER
.DA REM.LISTENER
*--------------------------------------
L.IPCFG .DA IPCFG
L.ARP.CACHE .DA ARP.CACHE
L.DNS.CACHE .DA DNS.CACHE
.DA 0
.DA CS.END-CS.START
.DA DS.END-DS.START
*--------------------------------------
LIB.LOAD lda bFirstLoad
bne .8
jsr ARP.CLEAR
jsr DNS.CLEAR
inc bFirstLoad
.8 clc
rts
*--------------------------------------
LIB.UNLOAD clc
rts
*--------------------------------------
* PULLW = PTR to S.IPCFG
*--------------------------------------
SET.IPCFG >PUSHBI K.PROTOID.IP
>SYSCALL SYS.SetNetCfg
bcs GET.IPCFG.RTS
*--------------------------------------
* grab a copy on the fly for lib function
* OUT :
* Y,A = PTR to S.IPCFG
*--------------------------------------
GET.IPCFG lda #K.PROTOID.IP
>SYSCALL SYS.GetNetCfgA
bcs GET.IPCFG.RTS
>STYA ZPQuickPtr1
ldy #S.IPCFG
.1 dey
lda (ZPQuickPtr1),y
sta IPCFG,y
tya
bne .1
>LDYA ZPQuickPtr1
clc
GET.IPCFG.RTS rts
*--------------------------------------
* Out:
* Y,A = Frame PTR
* X = hMem
*--------------------------------------
NEW.ICMP.FRAME jsr NEW.IP.FRAME
bcs .9
ldy #S.IP.PROTOCOL
lda #S.IP.PROTOCOL.ICMP
sta (ZPFrameBase1),y
>LDYA ZPFrameBase1
clc
.9 rts
*--------------------------------------
* Out:
* Y,A = Frame PTR
* X = hMem
*--------------------------------------
NEW.TCP.FRAME jsr NEW.IP.FRAME
bcs .9
ldy #S.IP.PROTOCOL
lda #S.IP.PROTOCOL.TCP
sta (ZPFrameBase1),y
>LDYA ZPFrameBase1
clc
.9 rts
*--------------------------------------
* Out:
* Y,A = Frame PTR
* X = hMem
*--------------------------------------
NEW.UDP.FRAME jsr NEW.IP.FRAME
bcs .9
ldy #S.IP.PROTOCOL
lda #S.IP.PROTOCOL.UDP
sta (ZPFrameBase1),y
>LDYA ZPFrameBase1
clc
.9 rts
*--------------------------------------
* Out:
* Y,A = Frame PTR
* X = hMem
*--------------------------------------
NEW.IP.FRAME jsr NEW.ETH.FRAME
bcs .9
ldy #S.ETH.ETHERTYPE
lda /S.ETH.ETHERTYPE.IP
sta (ZPFrameBase1),y
iny
lda #S.ETH.ETHERTYPE.IP
sta (ZPFrameBase1),y
ldy #S.IP.V.IHL.DSCP.ECN
lda #$45
sta (ZPFrameBase1),y
iny
lda #$0
sta (ZPFrameBase1),y
ldy #S.IP.IDENTIFICATION
sta (ZPFrameBase1),y
inc
iny
sta (ZPFrameBase1),y
dec
ldy #S.IP.FRAGMENT.FLAGS
sta (ZPFrameBase1),y
iny
sta (ZPFrameBase1),y
ldy #S.IP.TTL
lda #K.IP.TTL
sta (ZPFrameBase1),y
>LDYA ZPFrameBase1
clc
.9 rts
*--------------------------------------
* Out:
* Y,A = Frame PTR
* X = hMem
*--------------------------------------
NEW.ARP.FRAME jsr NEW.ETH.FRAME
bcs .9
ldy #S.ETH.ETHERTYPE
lda /S.ETH.ETHERTYPE.ARP
sta (ZPFrameBase1),y
iny
lda #S.ETH.ETHERTYPE.ARP
sta (ZPFrameBase1),y
ldy #S.ARP.HTYPE
lda #0
sta (ZPFrameBase1),y
iny
lda #1
sta (ZPFrameBase1),y
iny
lda #8
sta (ZPFrameBase1),y
iny
lda #0
sta (ZPFrameBase1),y
iny
lda #6
sta (ZPFrameBase1),y
iny
lda #4
sta (ZPFrameBase1),y
>LDYA ZPFrameBase1
clc
.9 rts
*--------------------------------------
* Out:
* Y,A = Frame PTR
* X = hMem
*--------------------------------------
NEW.ETH.FRAME >PUSHWI K.ETH.FRAME.LEN
>PUSHBI 0
>SYSCALL SYS.GetMem
bcs .9
>STYA ZPFrameBase1
phx
txa
>SYSCALL SYS.ClrMemA
plx
clc
.9 rts
*--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.ICMP.FRAME >PULLW ZPFrameBase1
>PULLW ZPFrameLen1
>PUSHW ZPFrameLen1
>PUSHWI S.ICMP.TYPE
jsr ComputeChecksum
phy
ldy #S.ICMP.CHECKSUM
sta (ZPFrameBase1),y
iny
pla
sta (ZPFrameBase1),y
bra SEND.IP.FRAME.I
*--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.TCP.FRAME >PULLW ZPFrameBase1
>PULLW ZPFrameLen1
bra SEND.IP.FRAME.I
*--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.UDP.FRAME >PULLW ZPFrameBase1
>PULLW ZPFrameLen1
SEND.UDP.FRAME.I
ldy #S.UDP.LENGTH+1
lda ZPFrameLen1
sec
sbc #S.IP
sta (ZPFrameBase1),y
dey
lda ZPFrameLen1+1
sbc /S.IP
sta (ZPFrameBase1),y
lda #0 SET.UDP.CHECKSUM
ldy #S.UDP.CHECKSUM (0 = Disable UDP Checksum)
sta (ZPFrameBase1),y
iny
sta (ZPFrameBase1),y
bra SEND.IP.FRAME.I
*--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.IP.FRAME >PULLW ZPFrameBase1
>PULLW ZPFrameLen1
SEND.IP.FRAME.I ldx #S.IPCFG.IP
ldy #S.IP.SRC
.10 lda IPCFG,x
sta (ZPFrameBase1),y
inx
iny
cpy #S.IP.SRC+4
bne .10
jsr ARP.RESOLVE
bcs .9
ldy #S.IP.TOTAL.LENGTH+1
lda ZPFrameLen1
sec
sbc #S.ETH
sta (ZPFrameBase1),y
dey
lda ZPFrameLen1+1
sbc /S.ETH
sta (ZPFrameBase1),y
stz IP.CHECKSUM RESET.IP.CHECKSUM
stz IP.CHECKSUM+1
stz IP.CHECKSUM+2
* stz IP.CHECKSUM+3 Optimized for IP Header
ldy #S.IP.V.IHL.DSCP.ECN
.1 lda (ZPFrameBase1),y
tax
iny
lda (ZPFrameBase1),y
iny
clc
adc IP.CHECKSUM
sta IP.CHECKSUM
txa
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
bcc .2
inc IP.CHECKSUM+2
*.2 bne .3 Optimized for IP Header
* inc IP.CHECKSUM+3 Optimized for IP Header
.2 cpy #S.IP
bne .1
lda IP.CHECKSUM
clc
adc IP.CHECKSUM+2
eor #$FF
ldy #S.IP.HDR.CHECKSUM+1
sta (ZPFrameBase1),y
dey
lda IP.CHECKSUM+1
* adc IP.CHECKSUM+3 Optimized for IP Header
adc #0 Optimized for IP Header
eor #$FF
sta (ZPFrameBase1),y
bra SEND.ETH.FRAME
.9 rts
*--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.ARP.FRAME >PULLW ZPFrameBase1
SEND.ARP.FRAME.I
>LDYAI S.ARP default ARP Frame length
>STYA ZPFrameLen1
*--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.ETH.FRAME >PUSHW ZPFrameLen1
>PUSHW ZPFrameBase1
ldx #S.IPCFG.HDEV
lda IPCFG,x
>SYSCALL SYS.DevOutA
rts
*--------------------------------------
UDP.LISTENER >PULLW ZPFrameBase1
>PULLW ZPFrameLen1
sec
rts
*--------------------------------------
TCP.LISTENER >PULLW ZPFrameBase1
>PULLW ZPFrameLen1
sec
rts
*--------------------------------------
ADD.LISTENER sec
rts
*--------------------------------------
REM.LISTENER sec
rts
*--------------------------------------
.INB LIB/LIBTCPIP.S.ARP
.INB LIB/LIBTCPIP.S.DNS
*--------------------------------------
* PRIVATE
*--------------------------------------
ToLowerCaseA cmp #'A'
bcc .1
cmp #'Z'+1
bcs .1
adc #$20
.1 rts
*--------------------------------------
* In:
* PULLW = Start Offset
* PULLW = End Offset
* Out:
* Y,A = CheckSum
*--------------------------------------
ComputeChecksum >PULLA
clc
adc ZPFrameBase1
sta ZPQuickPtr1
>PULLA
adc ZPFrameBase1+1
sta ZPQuickPtr1+1
>PULLA
clc
adc ZPFrameBase1
sta ZPQuickPtr2
>PULLA
adc ZPFrameBase1+1
sta ZPQuickPtr2+1
stz IP.CHECKSUM RESET.IP.CHECKSUM
stz IP.CHECKSUM+1
stz IP.CHECKSUM+2
stz IP.CHECKSUM+3
ldy #1
.1 lda (ZPQuickPtr1),y
clc
adc IP.CHECKSUM
sta IP.CHECKSUM
lda (ZPQuickPtr1)
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
bcc .3
inc IP.CHECKSUM+2
bne .3
inc IP.CHECKSUM+3
.3 lda ZPQuickPtr1
clc
adc #2
sta ZPQuickPtr1
bcc .4
inc ZPQuickPtr1+1
.4 cmp ZPQuickPtr2
bne .1
lda ZPQuickPtr1+1
cmp ZPQuickPtr2+1
bne .1
lda IP.CHECKSUM
clc
adc IP.CHECKSUM+2
eor #$FF
tay
lda IP.CHECKSUM+1
adc IP.CHECKSUM+3
eor #$FF
rts
*--------------------------------------
CS.END
*--------------------------------------
bFirstLoad .DA #0
Status .BS 1
hHOST .BS 1 for DNS Cache functions
HOST.TTL .BS 2 for DNS Cache functions
IP.CHECKSUM .BS 4
IPCFG .BS S.IPCFG
ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE
DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE
UDP.TABLE .BS K.UDPTABLE.SIZE*S.LISTENER
TCP.TABLE .BS K.TCPTABLE.SIZE*S.LISTENER
*--------------------------------------
DS.START
DS.END
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S
ASM

502
SBIN/DHCPCLNT.S.txt Normal file
View File

@ -0,0 +1,502 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF SBIN/DHCPCLNT
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPFrameBase1 .EQ ZPBIN
ZPFrameLen1 .EQ ZPBIN+2
ZPFramePtr1 .EQ ZPBIN+4
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.LIBTCPIP .DA LIBTCPIP
L.IPCFG .DA IPCFG
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segemnt to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIBSTR
sta hLIBSTR
>LIBLOADP L.LIBTCPIP
sta hLIBTCPIP
>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG
bcs .9
>STYA ZPQuickPTR1
ldy #S.IPCFG
.1 dey
lda (ZPQuickPTR1),y
sta IPCFG,y
tya
bne .1
>LDYA A2OSX.TIMER16
>STYA FRAME.DISC.XID
>STYA FRAME.REQ.XID
>LDYA A2OSX.RANDOM16
>STYA FRAME.DISC.XID+2
>STYA FRAME.REQ.XID+2
lda #0
sta IPCFG
ldy #S.IPCFG.MAC+5
ldx #5
.2 lda IPCFG,y
sta FRAME.DISC.CHADDR,x
sta FRAME.REQ.CHADDR,x
dey
dex
bpl .2
lda #20
sta TimeOut
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc
.9 rts
*--------------------------------------
CS.RUN
CS.RUN.DISC jsr SendDHCPDiscFrame
bcs CS.RUN.KO
lda #S.IPCFG.STATUS.SDISC
sta IPCFG
CS.RUN.OFFER jsr A2osX.SLEEP
lda IPCFG
and #S.IPCFG.STATUS.ROFFER
bne CS.RUN.REQ
lda TimeOut
bne CS.RUN.OFFER
lda #1
bra CS.RUN.KO
CS.RUN.REQ jsr SendDHCPReqFrame
bcs CS.RUN.KO
lda #S.IPCFG.STATUS.SREQ
sta IPCFG
CS.RUN.RACK jsr A2osX.SLEEP
lda IPCFG
and #S.IPCFG.STATUS.RACK
bne CS.RUN.OK
lda TimeOut
bne CS.RUN.RACK
lda #2
bra CS.RUN.KO
CS.RUN.OK lda #S.IPCFG.STATUS.OK
sta IPCFG
>PUSHW L.IPCFG
>LIBCALL hLIBTCPIP,LIBTCPIP.SET.IPCFG
lda #0 Leave with NO ERROR
sec
rts
CS.RUN.KO sec
rts
*--------------------------------------
CS.DOEVENT >PULLW pEvent
lda (pEvent)
and #S.EVT.F.TIMER is it a TIMER event?
beq .1 no....
lda TimeOut
beq .9
dec TimeOut
bra .9 do not discard TIMER event
.1 lda (pEvent)
and #S.EVT.F.NET
beq .9
ldy #S.IPCFG.HDEV
lda IPCFG,y
ldy #S.EVT.hDEV
cmp (pEvent),y
bne .9
ldy #S.EVT.DATALO Get Frame hMem
lda (pEvent),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase1
ldy #S.EVT.DATAW1 Get Frame Len
lda (pEvent),y
sta ZPFrameLen1
iny
lda (pEvent),y
sta ZPFrameLen1+1
lda IPCFG
and #S.IPCFG.STATUS.SDISC
beq .2
jsr CheckDHCPOfferFrame
bcs .9
lda #S.IPCFG.STATUS.ROFFER
sta IPCFG
bra .88
.2 lda IPCFG
and #S.IPCFG.STATUS.SREQ
beq .9
jsr CheckDHCPAckFrame
bcs .9
lda #S.IPCFG.STATUS.RACK
sta IPCFG
.88 >SYSCALL SYS.DestroyEvent
.89 clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA
lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
* SendDHCPDiscFrame
* In:
* Out:
*--------------------------------------
SendDHCPDiscFrame
jsr NewDHCPFrame
bcs .9
phx
lda ZPFrameBase1
clc
adc #S.UDP
sta ZPQuickPTR1
lda ZPFrameBase1+1
adc /S.UDP
sta ZPQuickPTR1+1
ldy #FRAME.DISC.LEN
.1 dey
lda FRAME.DISC,y
sta (ZPQuickPTR1),y
tya
bne .1
>LDYAI S.UDP+FRAME.DISC.LEN
>PUSHYA
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME
pla
php
>SYSCALL SYS.FreeMemA
plp
.9 rts
*--------------------------------------
CheckDHCPOfferFrame
jsr CheckDHCPXID
bcs .9
>LDAXI S.DHCP.OPTIONS
jsr SetFramePtr1AX
ldy #2 DHCPOffer ?
lda (ZPFramePtr1),y
cmp #S.DHCP.OPTIONS.DHCPOffer
bne .9
ldy #S.DHCP.YIADDR+3
ldx #3
.1 lda (ZPFrameBase1),y
sta FRAME.REQ.OPT.REQIP,x
dey
dex
bpl .1
ldx #3
ldy #S.IPCFG.IP+3
.2 lda FRAME.REQ.OPT.REQIP,x
sta IPCFG,y
dey
dex
bpl .2
ldy #S.IP.SRC+3
ldx #3
.3 lda (ZPFrameBase1),y
sta FRAME.REQ.OPT.SVRIP,x
dey
dex
bpl .3
ldx #3
ldy #S.IPCFG.DHCPSRVR+3
.4 lda FRAME.REQ.OPT.SVRIP,x
sta IPCFG,y
dey
dex
bpl .4
.5 inc ZPFramePtr1 skip Option 53 (DHCPOffer:530102)
bne .6
inc ZPFramePtr1+1
.6 lda (ZPFramePtr1)
sec
adc ZPFramePtr1 add option len + 1
sta ZPFramePtr1
bcc .7
inc ZPFramePtr1+1
.7 lda (ZPFramePtr1)
cmp #S.DHCP.OPTIONS.END
beq .8
jsr GetDHCPOption
bra .5
.8 clc
rts
.9 sec
rts
*--------------------------------------
GetDHCPOption cmp #S.DHCP.OPTIONS.MASK
bne .1
ldy #S.IPCFG.MASK
bra GetDHCPOption.CopyIP
.1 cmp #S.DHCP.OPTIONS.GW
bne .2
ldy #S.IPCFG.GW
bra GetDHCPOption.CopyIP
.2 cmp #S.DHCP.OPTIONS.DNS
bne .3
ldy #S.IPCFG.DNS
bra GetDHCPOption.CopyIP
.3 cmp #S.DHCP.OPTIONS.DOMAIN
bne .9
ldy #1
ldx #$FF
.4 iny
inx
lda (ZPFramePtr1),y
sta TmpBuffer256,x
bne .4
ldy #S.IPCFG.DOMAIN-1
ldx #$FF
.5 iny
inx
lda TmpBuffer256,x
sta IPCFG,y
bne .5
.9 rts
GetDHCPOption.CopyIP
phy
ldy #2
ldx #0
.1 lda (ZPFramePtr1),y
sta TmpBuffer256,x
iny
inx
cpx #4
bne .1
ply
ldx #0
.2 lda TmpBuffer256,x
sta IPCFG,y
iny
inx
cpx #4
bne .2
rts
*--------------------------------------
* SendDHCPReqFrame
* In:
* Out:
*--------------------------------------
SendDHCPReqFrame
jsr NewDHCPFrame
bcs .9
phx
lda ZPFrameBase1
clc
adc #S.UDP
sta ZPQuickPTR1
lda ZPFrameBase1+1
adc /S.UDP
sta ZPQuickPTR1+1
ldy #FRAME.REQ.LEN
.1 dey
lda FRAME.REQ,y
sta (ZPQuickPTR1),y
tya
bne .1
>LDYAI S.UDP+FRAME.REQ.LEN
>PUSHYA
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME
pla
php
>SYSCALL SYS.FreeMemA
plp
.9 rts
*--------------------------------------
CheckDHCPAckFrame
jsr CheckDHCPXID
bcs .9
>LDAXI S.DHCP.OPTIONS
jsr SetFramePtr1AX
ldy #2 DHCPAck ?
lda (ZPFramePtr1),y
cmp #S.DHCP.OPTIONS.DHCPAck
bne .9
clc
rts
.9 sec
rts
*--------------------------------------
CheckDHCPXID ldy #S.DHCP.XID+3
ldx #3
.1 lda (ZPFrameBase1),y
cmp FRAME.DISC.XID,x same XID ?
bne .9
dey
dex
bpl .1
clc
rts
.9 sec
rts
*--------------------------------------
NewDHCPFrame >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.UDP.FRAME
bcs .9
>STYA ZPFrameBase1
ldy #S.UDP.SRCPORT
lda /UDP.PORT.DHCPC
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DHCPC
sta (ZPFrameBase1),y
ldy #S.UDP.DSTPORT
lda /UDP.PORT.DHCPS
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DHCPS
sta (ZPFrameBase1),y
lda #255 S.IP.DST = 255.255.255.255
ldy #S.IP.DST
.1 sta (ZPFrameBase1),y
iny
cpy #S.IP.DST+4
bne .1
clc x = hMem
.9 rts
*--------------------------------------
SetFramePtr1AX clc
adc ZPFrameBase1
sta ZPFramePtr1
txa
adc ZPFrameBase1+1
sta ZPFramePtr1+1
rts
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
LIBTCPIP >PSTRING "libtcpip.o"
*--------------------------------------
FRAME.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS
FRAME.DISC.XID .BS 4
FRAME.DISC.SECS .HS 0000
FRAME.DISC.FLAGS .HS 0000
FRAME.DISC.CIADDR .HS 00000000
FRAME.DISC.YIADDR .HS 00000000
FRAME.DISC.SIADDR .HS 00000000
FRAME.DISC.GIADDR .HS 00000000
FRAME.DISC.CHADDR .HS 00000000.00000000.00000000.00000000
FRAME.DISC.SNAME .BS 64
FRAME.DISC.FILE .BS 128
FRAME.DISC.COOKIE .HS 63825363
FRAME.DISC.OPT .HS 3501
.DA #S.DHCP.OPTIONS.DHCPDiscover
.HS 37040103060FFF
FRAME.DISC.LEN .EQ *-FRAME.DISC
*--------------------------------------
FRAME.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS
FRAME.REQ.XID .BS 4
FRAME.REQ.SECS .HS 0000
FRAME.REQ.FLAGS .HS 0000
FRAME.REQ.CIADDR .HS 00000000
FRAME.REQ.YIADDR .HS 00000000
FRAME.REQ.SIADDR .HS 00000000
FRAME.REQ.GIADDR .HS 00000000
FRAME.REQ.CHADDR .HS 00000000.00000000.00000000.00000000
FRAME.REQ.SNAME .BS 64
FRAME.REQ.FILE .BS 128
FRAME.REQ.COOKIE .HS 63825363
FRAME.REQ.OPT .HS 3501
.DA #S.DHCP.OPTIONS.DHCPRequest
.HS 3204
FRAME.REQ.OPT.REQIP .BS 4
.HS 3604
FRAME.REQ.OPT.SVRIP .BS 4
.HS FF
FRAME.REQ.LEN .EQ *-FRAME.REQ
*--------------------------------------
DS.START
*--------------------------------------
hLIBSTR .BS 1
hLIBTCPIP .BS 1
TimeOut .BS 1
IPCFG .BS S.IPCFG
*--------------------------------------
DS.END
MAN
SAVE SBIN/DHCPCLNT.S
ASM

304
SBIN/GETTY.S.txt Normal file
View File

@ -0,0 +1,304 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF SBIN/GETTY
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.GREETINGS .DA MSG.GREETINGS
L.MSG.LOGIN .DA MSG.LOGIN
L.MSG.PASSWORD .DA MSG.PASSWORD
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT ldy #S.PS.hARGS
lda (pPsContext),y
>PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 1 Push 1 for getting INDEV
>SYSCALL SYS.PStrGetTkn
bcs .9
sta hDEVNAME
>SYSCALL SYS.GetDevByNameA
bcs .8
sta hINDEV
ldy #S.PS.hINDEV
sta (pPsContext),y
lda hDEVNAME
>SYSCALL SYS.FreeMemA
ldy #S.PS.hARGS
lda (pPsContext),y
>PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 2 Push 1 for getting OUTDEV
>SYSCALL SYS.PStrGetTkn
.9 bcs .99
sta hDEVNAME
>SYSCALL SYS.GetDevByNameA
.8 bcs .98
sta hOUTDEV
ldy #S.PS.hOUTDEV
sta (pPsContext),y
ldy #S.PS.hERRDEV
sta (pPsContext),y
lda hDEVNAME
>SYSCALL SYS.FreeMemA
ldy #S.PS.hARGS
lda (pPsContext),y
>PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 3 Push 3 for getting BIN
>SYSCALL SYS.PStrGetTkn
bcs .99
sta BINID
ldy #S.PS.ID
lda (pPsContext),y
* ldy #S.DEV.hOWNERPS
* sta (DEVMGR.DEVPTR),y
>LDYA L.MSG.GREETINGS
jsr PRINT.MSG
lda hOUTDEV
jsr PRBYTE
stz STATUS
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc Tell TskMgr To stay in memory
rts
.98 pha
lda hDEVNAME
>SYSCALL SYS.FreeMemA
pla
sec
.99 rts
*--------------------------------------
CS.RUN lda STATUS
bne CS.RUN.1
jsr CROUT
jsr CROUT
>LDYA L.MSG.LOGIN
jsr PRINT.MSG
jsr INPUT.INIT
inc STATUS
clc
rts
CS.RUN.1 cmp #1
bne CS.RUN.2
ldx INSTATUS
beq .9
ldx INBUFFER
beq .2
.1 lda INBUFFER,x
sta USERNAME,x
dex
bpl .1
inc STATUS
clc
rts
.2 dec STATUS
.9 clc
rts
CS.RUN.2 cmp #2
bne CS.RUN.3
jsr CROUT
>LDYA L.MSG.PASSWORD
jsr PRINT.MSG
jsr INPUT.INIT
inc STATUS
clc
rts
CS.RUN.3 cmp #3
bne CS.RUN.4
ldx INSTATUS
beq .9
ldx INBUFFER
beq .2
.1 lda INBUFFER,x
sta PASSWORD,x
dex
bpl .1
.2 inc STATUS
.9 clc
rts
CS.RUN.4 cmp #4
bne CS.RUN.5
jsr CROUT
inc STATUS TODO:CHECK USER/PASS
clc
rts
CS.RUN.5 cmp #5
bne CS.RUN.6
lda BINID
ldx pPsContext
stx pPsContext.SAVE
ldx pPsContext+1
stx pPsContext.SAVE+1
>SYSCALL SYS.CreateProcessA
ldx pPsContext.SAVE
stx pPsContext
ldx pPsContext.SAVE+1
stx pPsContext+1
bcs .9
sta CHILDPSID
inc STATUS
clc
rts
.9 jsr PRBYTE
stz STATUS
clc
rts
CS.RUN.6 dec CHILDPSIDPOLL
bne .8
lda CHILDPSID Check for CHILDTSKID
>SYSCALL SYS.GetPSByIDA
bcc .8 Still Alive ?
stz STATUS
stz CHILDPSID
.8 clc
rts
*--------------------------------------
CS.DOEVENT >PULLW pEvent
lda CHILDPSID
bne .99
ldy #S.EVT.hDEV
lda (pEvent),y
cmp hINDEV
bne .99
lda (pEvent)
and #S.EVT.F.KEY
beq .99
ldy #S.EVT.DATAHI
lda (pEvent),y
bne .99
ldy #S.EVT.DATALO
lda (pEvent),y
jsr INPUT.CHARIN
>SYSCALL SYS.DestroyEvent
clc
rts
.99 sec
rts
*--------------------------------------
CS.QUIT clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
PRINT.MSG >STYA ZPQuickPtr1
ldy #0
.1 lda (ZPQuickPtr1),y
beq .2
ora #$80
jsr COUT
iny
bne .1
.2 rts
*--------------------------------------
INPUT.INIT stz INSTATUS
stz INBUFFER
rts
*--------------------------------------
INPUT.CHARIN ldx INSTATUS
bne .9
cmp #$20
bcc .1
ldx INBUFFER
inx
cpx #16
beq .9
sta INBUFFER,x
stx INBUFFER
ora #$80
jmp COUT
.1 cmp #$0D
bne .9
inc INSTATUS
.9 rts
*--------------------------------------
PRBYTE pha
lsr
lsr
lsr
lsr
ora #$B0
cmp #$BA
bcc .1
adc #6
.1 jsr COUT
pla
and #$0F
ora #$B0
cmp #$BA
bcc COUT
adc #6
bra COUT
*--------------------------------------
CROUT lda #13
*--------------------------------------
COUT >PUSHA
phx
phy
ldy #S.PS.hOUTDEV
lda (pPsContext),y
>SYSCALL SYS.DevOutA
ply
plx
rts
*--------------------------------------
MSG.GREETINGS >CSTRING "A2osX-GeTTY on Dev="
MSG.LOGIN >CSTRING "login:"
MSG.PASSWORD >CSTRING "password:"
*--------------------------------------
CS.END
DS.START
*--------------------------------------
hDEVNAME .BS 1
hINDEV .BS 1
hOUTDEV .BS 1
BINID .BS 1
STATUS .BS 1
CHILDPSID .BS 1
CHILDPSIDPOLL .BS 1
INSTATUS .BS 1
INBUFFER .BS 16
USERNAME .BS 16
PASSWORD .BS 16
pPsContext.SAVE .BS 2
*--------------------------------------
DS.END
MAN
SAVE SBIN/GETTY.S
ASM

568
SBIN/SHELL.S.txt Normal file
View File

@ -0,0 +1,568 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF SBIN/SHELL
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/PRODOS.I
.INB INC/LIBSTR.I
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPPTR2 .EQ ZPBIN+2
ZPPTR3 .EQ ZPBIN+4
*--------------------------------------
CmdBuffer.MAX .EQ 127
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
*--------------------------------------
L.LIBSTR .DA LIBSTR
L.CmdBuffer .DA CmdBuffer
L.MSG.GREETINGS .DA MSG.GREETINGS
L.MSG.UNKNOWN .DA MSG.UNKNOWN
L.MSG.SYNERR .DA MSG.SYNERR
L.CMDS .DA CMDS
T.INTCMDS .DA EXEC.CMD.CD
.DA EXEC.CMD.SET
.DA EXEC.CMD.DATE
.DA EXEC.CMD.TIME
.DA EXEC.CMD.ECHO
.DA EXEC.CMD.TYPE
.DA EXEC.CMD.EXIT
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT stz bEXIT
stz CmdHistory
stz CmdHistory.IDX
stz CmdHistory.END
>LIBLOADP L.LIBSTR
bcs .99
sta hLIBSTR
ldy #S.PS.ID
lda (pPsContext),y
>PUSHA
ldy #S.PS.hOUTDEV
lda (pPsContext),y
>PUSHA
ldy #S.PS.hINDEV
lda (pPsContext),y
>PUSHA
>PUSHW L.MSG.GREETINGS
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc
.99 rts
*--------------------------------------
CS.RUN stz CmdBuffer
lda #"$"
jsr COUT
lda #" "
jsr COUT
.1 lda CmdBuffer
bmi .2
jsr A2osX.SLEEP
bra .1
.2 and #$7F
sta CmdBuffer
beq CS.RUN Empty line
>PUSHW L.CmdBuffer
>SYSCALL SYS.NewPStr
bcs .99
sta hCMDLINE
jsr HISTORY.ADD
jsr EXEC.CMD
bcc .3
pha
lda #"["
jsr COUT
pla
jsr PRBYTE
lda #"]"
jsr COUT
jsr CROUT
.3 lda hCMDLINE
>SYSCALL SYS.FreeMemA
stz hCMDLINE
lda bEXIT
bne .99
clc
rts
.99 sec
rts
*--------------------------------------
CS.DOEVENT >PULLW pEvent
ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPsContext),y
bne .9
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$1F
bpl .1
jsr CS.EVENT.CTRL.CHAR
bra .8
.1 cmp #$7f
bne .2
jsr CmdBuffer.DEL
bra .8
.2 ldx CmdBuffer
cpx #CmdBuffer.MAX
beq .8
inx
sta CmdBuffer,x
inc CmdBuffer
ora #$80
jsr COUT
.8 >SYSCALL SYS.DestroyEvent
clc
rts
.9 sec
rts
*--------------------------------------
CS.EVENT.CTRL.CHAR
cmp #13 CR
bne .10
jsr CROUT
lda CmdBuffer
ora #$80
sta CmdBuffer
clc
rts
.10 cmp #3
bne .1
jsr CmdBuffer.CLR
clc
rts
.1 cmp #8 BS (left arrow)
bne .2
jsr CmdBuffer.DEL
clc
rts
.2 cmp #10 LF (down arrow)
bne .3
jsr HISTORY.GETNEXT
clc
rts
.3 cmp #11 VT (up arrow)
bne .4
jsr HISTORY.GETPREV
clc
rts
.4 cmp #21 NAK (right arrow)
bne .8
clc
rts
.8 jsr PRBYTE
clc
rts
*--------------------------------------
CS.QUIT lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
EXEC.CMD >PUSHB hCMDLINE
>PUSHBI $20 Push SEP=' '
>PUSHBI 0 Push 0 for getting CMD & ARGS
>SYSCALL SYS.PStrGetTkn
bcs .99
sta hCMD
stx hARGS
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.UCASEP
>PUSHW L.CMDS
>SYSCALL SYS.GetPStrIndex
bcs .1 Not An internal command
jsr EXEC.CMD.INT
bcs .98
jsr .98
clc
rts
.1 jsr .98 Discard CMD & ARGS
lda hCMDLINE
>SYSCALL SYS.ExecProcessA
rts
.98 pha
lda hCMD
>SYSCALL SYS.FreeMemA
lda hARGS
>SYSCALL SYS.FreeMemA
pla
sec
.99 rts
*--------------------------------------
EXEC.CMD.INT asl
tax
jmp (T.INTCMDS,x)
*--------------------------------------
EXEC.CMD.CD lda hARGS
bne EXEC.CMD.CD.C
ldy #S.PS.hPREFIX
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.PRINTP
jsr CROUT
clc
rts
EXEC.CMD.CD.C >SYSCALL SYS.GetMemPtrA
>STYA ZPPTR2
ldy #S.PS.hPREFIX
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPPTR1
>PUSHWI MLI.MAXPATH+1 Get a buffer for new PATH
>PUSHBI 0 no particular Option
>SYSCALL SYS.GetMem
bcs .99
stx hNEWPATH
>STYA ZPPTR3
lda #0
sta (ZPPTR3)
ldy #1
lda (ZPPTR2),y
cmp #'/' Full Path?
beq .3
cmp #'.' ".." ?
bne .2
lda (ZPPTR2)
cmp #2
bne .97
iny
lda (ZPPTR2),y
cmp #'.'
bne .97
lda (ZPPTR1)
tay
.1 dey
beq .97
lda (ZPPTR1),y
cmp #'/'
bne .1
tya
sta (ZPPTR3)
.11 lda (ZPPTR1),y
sta (ZPPTR3),y
dey
bne .11
bra .4
.97 lda #SYSMGR.ERRSYN
.98 pha
lda hNEWPATH
>SYSCALL SYS.FreeMemA
pla
sec
.99 rts
.2 >PUSHW ZPPTR1
>PUSHW ZPPTR3
>LIBCALL hLIBSTR,LIBSTR.STRCPYP
.3 >PUSHW ZPPTR2
>PUSHW ZPPTR3
>LIBCALL hLIBSTR,LIBSTR.STRCATP
lda (ZPPTR3)
tay
lda #'/' Ending with '/'?
cmp (ZPPTR3),y
beq .4
iny
sta (ZPPTR3),y
tya
sta (ZPPTR3)
.4 lda hNEWPATH
>SYSCALL SYS.CheckPrefixA
bcs .98
ldy #S.PS.hPREFIX
lda (pPsContext),y
pha
lda hNEWPATH
sta (pPsContext),y
pla
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
EXEC.CMD.SET clc
rts
*--------------------------------------
EXEC.CMD.DATE jsr MLI
.DA #MLIGETTIME
.DA 0
bcs .9
>PUSHW DATELO
>LIBCALL hLIBSTR,LIBSTR.PRINTDATE
jsr CROUT
clc
.9 rts
*--------------------------------------
EXEC.CMD.TIME jsr MLI
.DA #MLIGETTIME
.DA 0
bcs .9
>PUSHW TIMELO
>LIBCALL hLIBSTR,LIBSTR.PRINTTIME
jsr CROUT
clc
.9 rts
*--------------------------------------
EXEC.CMD.ECHO lda #$DD
sec
rts
*--------------------------------------
EXEC.CMD.TYPE lda hARGS
beq .98
>SYSCALL SYS.LoadFileA
bcs .99
>STYA ZPPTR2 store file len
phx
txa
>SYSCALL SYS.GetMemPtrA
>STYA ZPPTR1
.1 lda ZPPTR2
bne .2
lda ZPPTR2+1
beq .3
dec ZPPTR2+1
.2 dec ZPPTR2
lda (ZPPTR1)
ora #$80
jsr COUT
inc ZPPTR1
bne .1
inc ZPPTR1+1
bra .1
.3 pla
>SYSCALL SYS.FreeMemA
clc
rts
.98 lda #SYSMGR.ERRSYN
.99 rts
*--------------------------------------
EXEC.CMD.EXIT lda #$FF
sta bEXIT
clc
rts
*--------------------------------------
HISTORY.ADD lda CmdHistory.END ending 0
inc keep room for new ending 0
sec add len+1
adc CmdBuffer
bcc .2 enough room
ldx CmdHistory get len of oldest string
ldy #0
.1 inx
iny
lda CmdHistory,x move back until 0 found
sta CmdHistory-1,y
bne .1
sty CmdHistory.END mark new end of history
bra HISTORY.ADD retry....
.2 ldx CmdHistory.END
ldy #$FF
.3 iny
lda CmdBuffer,y
sta CmdHistory,x
inx
cpy CmdBuffer
bne .3
stz CmdHistory,x set ending 0
stx CmdHistory.IDX
stx CmdHistory.END
.9 rts
*--------------------------------------
HISTORY.GETPREV lda CmdHistory.END
beq HISTORY.RTS empty history,nothing to do
lda CmdHistory.IDX
beq HISTORY.RTS already oldest,nothing to do
lda #0
.1 tax save current index
sec
adc CmdHistory,x
cmp CmdHistory.IDX
bne .1 not yet reached current index
stx CmdHistory.IDX set new index
bra HISTORY.SETBUF
HISTORY.RTS rts
*--------------------------------------
HISTORY.GETNEXT ldx CmdHistory.END
beq HISTORY.RTS empty history,nothing to do
cpx CmdHistory.IDX
beq HISTORY.RTS
ldx CmdHistory.IDX
lda CmdHistory,x
sec
adc CmdHistory.IDX
cmp CmdHistory.END
sta CmdHistory.IDX
beq CmdBuffer.CLR end of history, just blank buffer
*--------------------------------------
HISTORY.SETBUF jsr CmdBuffer.CLR
ldx CmdHistory.IDX
ldy #$ff
.1 iny
lda CmdHistory,x
inx
sta CmdBuffer,y
cpy CmdBuffer
bne .1
bra CmdBuffer.PRINT
*--------------------------------------
CmdBuffer.PRINT ldx #0
.1 inx
lda CmdBuffer,x
ora #$80
phx
jsr COUT
plx
cpx CmdBuffer
bne .1
rts
*--------------------------------------
CmdBuffer.CLR jsr CmdBuffer.DEL
bne CmdBuffer.CLR
.9 rts
*--------------------------------------
CmdBuffer.DEL lda CmdBuffer
beq .9
lda #8
jsr COUT
dec CmdBuffer
.9 rts
*--------------------------------------
PRBYTE pha
lsr
lsr
lsr
lsr
ora #$B0
cmp #$BA
bcc .1
adc #6
.1 jsr COUT
pla
and #$0F
ora #$B0
cmp #$BA
bcc COUT
adc #6
bra COUT
*--------------------------------------
CROUT lda #13
*--------------------------------------
COUT phx
phy
>PUSHA
ldy #S.PS.hOUTDEV
lda (pPsContext),y
>SYSCALL SYS.DevOutA
ply
plx
rts
*--------------------------------------
CS.END
*--------------------------------------
CMDS >PSTRING "CD"
CMDS1 >PSTRING "SET"
CMDS2 >PSTRING "DATE"
CMDS3 >PSTRING "TIME"
CMDS4 >PSTRING "ECHO"
CMDS5 >PSTRING "TYPE"
CMDS6 >PSTRING "EXIT"
.DA #0
*--------------------------------------
LIBSTR >PSTRING "libstr.o"
MSG.GREETINGS >CSTRING "\nA2osX-Shell on Dev=(%h:%h),PS=%h\n\n"
MSG.UNKNOWN >CSTRING "Command Not Found\n"
MSG.SYNERR >CSTRING "Syntax Error Or Invalid Pathname\n"
*--------------------------------------
DS.START
*--------------------------------------
hLIBSTR .BS 1
bEXIT .BS 1
hCMDLINE .BS 1
hCMD .BS 1
hARGS .BS 1
hNEWPATH .BS 1
CmdBuffer .BS CmdBuffer.MAX+1
CmdBuffer.POS .BS 1
CmdHistory .BS 256
CmdHistory.IDX .BS 1
CmdHistory.END .BS 1
*--------------------------------------
DS.END
*--------------------------------------
MAN
SAVE SBIN/SHELL.S
ASM

449
SBIN/TCPIP.S.txt Normal file
View File

@ -0,0 +1,449 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF SBIN/TCPIP
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/KERNEL.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPFrameBase1 .EQ ZPBIN
ZPFrameLen1 .EQ ZPBIN+2
ZPFramePtr1 .EQ ZPBIN+4
ZPFrameBase2 .EQ ZPBIN+6
ZPFrameLen2 .EQ ZPBIN+8
ZPFramePtr2 .EQ ZPBIN+10
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBTCPIP .DA LIBTCPIP
L.CFGFILENAME .DA CFGFILENAME
L.IPCFG .DA IPCFG
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
*--------------------------------------
CS.INIT >LIBLOADP L.LIBTCPIP
bcs .99
sta hLIBTCPIP
ldx #0
.1 stz IPCFG,x
inx
cpx #S.IPCFG
bne .1
jsr CS.INIT.DEV
bcs .99
* jsr CS.INIT.CFGFILE continue even if error opening CFG file
ldx #S.IPCFG.HOSTNAME
lda IPCFG,x
bne .3
ldy #0
.2 lda DefaultHostName,y
sta IPCFG,x
beq .3
inx
iny
bne .2
.3 >PUSHW L.IPCFG
>PUSHBI K.PROTOID.IP
>SYSCALL SYS.AddNetCfg
bcs .99
lda (pPsContext)
ora #S.PS.F.EVENT Now accept events
sta (pPsContext)
clc
.99 rts
*--------------------------------------
CS.INIT.DEV ldy #S.PS.hARGS
lda (pPsContext),y
>PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 1 Push 1 for getting DEV
>SYSCALL SYS.PStrGetTkn
bcs .99
sta hDEVNAME save DevName for discard
>SYSCALL SYS.GetDevByNameA
bcs .98
sta hDev
ldx #S.IPCFG.HDEV
sta IPCFG,x
>SYSCALL SYS.GetDevInfoA
>STYA ZPQuickPtr1
ldy #0
ldx #S.IPCFG.MAC
.1 lda (ZPQuickPtr1),y
sta IPCFG,x
inx
iny
cpy #S.IPCFG.MAC+6
bne .1
lda hDEVNAME
>SYSCALL SYS.FreeMemA
clc
rts
.98 pha
lda hDEVNAME
>SYSCALL SYS.FreeMemA
pla
.99 rts
*--------------------------------------
CS.INIT.CFGFILE >PUSHW L.CFGFILENAME
>SYSCALL SYS.ExpandPStr
bcs .99
sta hCfgFileName
>SYSCALL SYS.LoadFileA
bcs .98
stx hCfgFile
>STYA hCfgFileLen
txa
>SYSCALL SYS.GetMemPtrA
>STYA ZPQuickPtr1
.89 lda hCfgFile
>SYSCALL SYS.FreeMemA
lda hCfgFileName
>SYSCALL SYS.FreeMemA
clc
rts
.98 pha
lda hCfgFileName
>SYSCALL SYS.FreeMemA
pla
.99 sec
rts
*--------------------------------------
CS.RUN clc
rts
*--------------------------------------
CS.DOEVENT >PULLW pEvent
lda (pEvent)
and #S.EVT.F.NET
beq .9
ldy #S.EVT.hDEV
lda (pEvent),y
cmp hDev
beq CS.DOEVENT.NET
.9 sec
rts
CS.DOEVENT.NET ldy #S.EVT.DATALO Get Frame hMem
lda (pEvent),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase1
ldy #S.EVT.DATAW1 Get Frame Len
lda (pEvent),y
sta ZPFrameLen1
iny
lda (pEvent),y
sta ZPFrameLen1+1
ldy #S.ETH.ETHERTYPE
lda (ZPFrameBase1),y
tax
iny
lda (ZPFrameBase1),y
cmp #S.ETH.ETHERTYPE.ARP
bne .1
cpx /S.ETH.ETHERTYPE.ARP
bne .1
jsr ARPListener
bcc .89
rts
.1 cmp #S.ETH.ETHERTYPE.IP
bne .99
cpx /S.ETH.ETHERTYPE.IP
bne .99
ldy #S.IP.PROTOCOL
lda (ZPFrameBase1),y
cmp #S.IP.PROTOCOL.ICMP
bne .2
jsr ICMPListener
bcc .89
rts
.2 cmp #S.IP.PROTOCOL.UDP
bne .3
>PUSHW ZPFrameLen1
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.UDP.LISTENER
bcc .89
rts
.3 cmp #S.IP.PROTOCOL.TCP
bne .99
>PUSHW ZPFrameLen1
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.TCP.LISTENER
bcc .89
rts
.89 >SYSCALL SYS.DestroyEvent
clc
rts
.99 sec
rts
*--------------------------------------
CS.QUIT lda hLIBTCPIP
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
ARPListener jsr GetIPCFG
ldy #S.ARP.TPA
ldx #S.IPCFG.IP
.1 lda (ZPFrameBase1),y
cmp IPCFG,x
bne .9
iny
inx
cpx #S.IPCFG.IP+4
bne .1
ldy #S.ARP.OPERATION+1 HI byte
lda (ZPFrameBase1),y
cmp #S.ARP.OPERATION.REQ
beq ARPListener.REQ
cmp #S.ARP.OPERATION.REP
beq ARPListener.REP
.9 clc Discard any other ARP frames
rts
ARPListener.REP >LDAXI S.ARP.SHA
jsr SetFramePtr1AX
>PUSHW ZPFramePtr1
>LDAXI S.ARP.SPA
jsr SetFramePtr1AX
>PUSHW ZPFramePtr1
>LIBCALL hLIBTCPIP,LIBTCPIP.ARP.ADD
clc
ARPListener.RTS rts
ARPListener.REQ >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ARP.FRAME
bcs ARPListener.RTS
phx
>STYA ZPFrameBase2
ldy #S.ARP.OPERATION+1
lda #S.ARP.OPERATION.REP
sta (ZPFrameBase2),y
>LDAXI S.ARP.SHA
jsr SetFramePtr1AX
>LDAXI S.ETH.DSTMAC
jsr SetFramePtr2AX
ldy #6
jsr CopyFramePtr12
>LDAXI S.ARP.THA
jsr SetFramePtr2AX
ldy #10 IP(4) + MAC(6)
jsr CopyFramePtr12
>PUSHW ZPFramePtr1 still point to SHA
>LDAXI S.ARP.SPA
jsr SetFramePtr1AX
>PUSHW ZPFramePtr1
>LIBCALL hLIBTCPIP,LIBTCPIP.ARP.ADD
ldx #5
ldy #S.ARP.SHA+5
.4 lda IPCFG+S.IPCFG.MAC,x
sta (ZPFrameBase2),y
dey
dex
bpl .4
ldx #3
ldy #S.ARP.SPA+3
.5 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameBase2),y
dey
dex
bpl .5
>PUSHW ZPFrameBase2
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ARP.FRAME
pla
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
ICMPListener ldy #S.ICMP.TYPE
lda (ZPFrameBase1),y
cmp #S.ICMP.TYPE.ECHOREQ
bne .9
jsr GetIPCFG
ldy #S.IP.DST
ldx #S.IPCFG.IP
.10 lda (ZPFrameBase1),y
cmp IPCFG,x
bne .9
iny
inx
cpx #S.IPCFG.IP+4
bne .10
>LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ICMP.FRAME
bcs .9
phx
>STYA ZPFrameBase2
ldy #S.ICMP.TYPE
lda #S.ICMP.TYPE.ECHOREP
sta (ZPFrameBase2),y
jsr MakeIPReply
ldy #S.ICMP.IDENTIFIER
.1 lda (ZPFrameBase1),y
sta (ZPFrameBase2),y
iny
cpy #ZPFrameLen1
bne .1
>PUSHW ZPFrameLen1
>PUSHW ZPFrameBase2
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ICMP.FRAME
pla
>SYSCALL SYS.FreeMemA
clc
rts
.9 sec
rts
*--------------------------------------
GetIPCFG >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG
>STYA ZPQuickPtr1
ldy #S.IPCFG
.1 dey
lda (ZPQuickPtr1),y
sta IPCFG,y
tya
bne .1
rts
*--------------------------------------
MakeIPReply >LDAXI S.IP.SRC
jsr SetFramePtr1AX
>LDAXI S.IP.DST
jsr SetFramePtr2AX
ldy #4
jsr CopyFramePtr12
>LDAXI S.IP.DST
jsr SetFramePtr1AX
>LDAXI S.IP.SRC
jsr SetFramePtr2AX
ldy #4
jsr CopyFramePtr12
>LDAXI S.ETH.SRCMAC
jsr SetFramePtr1AX
>LDAXI S.ETH.DSTMAC
jsr SetFramePtr2AX
ldy #6
jsr CopyFramePtr12
rts
*--------------------------------------
* A,X = Frame PTR
*--------------------------------------
SetFramePtr1AX clc
adc ZPFrameBase1
sta ZPFramePtr1
txa
adc ZPFrameBase1+1
sta ZPFramePtr1+1
rts
*--------------------------------------
* A,X = Frame PTR
*--------------------------------------
SetFramePtr2AX clc
adc ZPFrameBase2
sta ZPFramePtr2
txa
adc ZPFrameBase2+1
sta ZPFramePtr2+1
rts
*--------------------------------------
* Y = bytes to copy from ZPFramePtr1 to ZPFramePtr2
*--------------------------------------
CopyFramePtr12 dey
lda (ZPFramePtr1),y
sta (ZPFramePtr2),y
tya
bne CopyFramePtr12
rts
*--------------------------------------
CS.END
*--------------------------------------
LIBTCPIP >PSTRING "libtcpip.o"
CFGFILENAME >PSTRING "%ETC%TCPIP.CONF"
DefaultHostName >CSTRING "a2osx-host"
*--------------------------------------
DS.START
*--------------------------------------
hLIBTCPIP .BS 1
hDEVNAME .BS 1
hDev .BS 1
hCfgFileName .BS 1
hCfgFile .BS 1
hCfgFileLen .BS 2
IPCFG .BS S.IPCFG Get in cache for faster access with ,X
*--------------------------------------
DS.END
*--------------------------------------
MAN
SAVE SBIN/TCPIP.S
ASM

49
SBIN/TELNETD.S.txt Normal file
View File

@ -0,0 +1,49 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF SBIN/TELNETD
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/MONITOR.I
*--------------------------------------
* Main entry point
*--------------------------------------
* Code signature and INIT table
*--------------------------------------
* CLD $D8
* JMP (*,x) $7C
* #JMPTABLE
* /JMPTABLE
*--------------------------------------
CS.START cld
jmp (.1,x)
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.EVENT
.DA CS.QUIT
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA 0 Data Segemnt to Allocate
*--------------------------------------
CS.INIT clc
rts
*--------------------------------------
CS.RUN clc
rts
*--------------------------------------
CS.EVENT clc
rts
*--------------------------------------
CS.QUIT clc
rts
*--------------------------------------
CS.END
MAN
SAVE SBIN/TELNETD.S
ASM

411
SYS/KERNEL.S.BIN.txt Normal file
View File

@ -0,0 +1,411 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.LoadBinA
* in :
* A = hMem of FilePath (PSTRING)
* out :
* Y,A = MEMPTR
* X = hMem of Code Segment
*--------------------------------------
S.LoadBinA sta R.DH save file path
jsr S.GetMemByNameA
bcs .1 not already loaded
>STYA R.AX Save base address
ldy #S.MEM.REFCNT
lda (R.AX),y
inc
sta (R.AX),y
ldy #S.MEM.PTR
lda (R.AX),y
pha Y,A = MEM PTR...
iny
lda (R.AX),y
ply X=hMem from S.GetMemByNameA
clc
rts
.1 lda R.DH
jsr S.LoadFileA
bcs .99
>STYA R.BX save file length for relocation
stx R.DL save hMem
txa
jsr S.GetMemPtrA
>STYA R.AX save base address for relocation
lda R.DH
jsr S.MLIGetFileInfoA Get File Info for AUXTYPE
bcs .98
>STYA ZPQuickPtr1
ldy #2 get AUXTYPE
lda (ZPQuickPtr1),y
sta R.CL
iny
lda (ZPQuickPtr1),y
sta R.CH save File load address for relocation
lda R.AL compute offset for relocation....
sec
sbc R.CL ...AX-CX...
sta R.CL
lda R.AH
sbc R.CH
sta R.CH ...to CX
jsr S.BinRelocate
bcs .98 relocation error, dicard Code segment
lda R.DH get back bin path
jsr S.PStrCpyA
bcs .98
pha save copy of bin path
lda R.DL
jsr S.GetMemByIDA
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
ora #S.MEM.F.CODE This is a code segment
sta (ZPQuickPtr1)
ldy #S.MEM.BIN
pla get back copy of bin path
sta (ZPQuickPtr1),y
>LDYA R.AX return CS PTR ... not modified by S.LoadCodeReloc
ldx R.DL ...and hMEM to Caller
clc
rts
.98 pha
lda R.DL
jsr S.FreeMemA Discard Loaded Code
pla
.99 sec
rts
*--------------------------------------
* S.LoadDrvA
* in :
* A = hMem To Full Cmd Line
* out :
* none
*--------------------------------------
S.LoadDrvA >PUSHA push Cmd Line for S.PStrGetTkn
>LDYAI MSG.DRVLOAD
jsr S.SysScrPPSTR
jsr S.CreateDevice
bcc .1
pha save error code
>PULLA discard Cmd Line
pla
sec
rts
.1 >PUSHBI $20 Push SEP=' '
>PUSHBI 0 Push 0 for getting CMD And ARGS
jsr S.PStrGetTkn
bcs .98
ldy #S.DEV.hCMD
sta (DEVMGR.DEVPTR),y
>PUSHA push CMD for S.FileSearch
txa
ldy #S.DEV.hARGS
sta (DEVMGR.DEVPTR),y
>PUSHWI ENV.DRV push ENVNAME=DRV
ldy #S.PS.hENV
lda TSKMGR.TABLE,y Get PS #0 Env
>PUSHA
jsr S.GetEnvVarP get value for ENV=%DRV%
bcs .98
sta LoadDrv.ENV
>PUSHA A=PStr to Value
jsr S.FileSearch find File in %DRV%
bcs .98 not Found
sta LoadDrv.BIN
jsr S.SysScrPPSTRA
lda LoadDrv.BIN
jsr S.LoadBinA X = BinPath hMem
bcs .97
>STYA Kernel.JMP save PTR to Code Segment
txa
ldy #S.DEV.hCS
sta (DEVMGR.DEVPTR),y save CS hMem in DEVSLOT
lda LoadDrv.BIN
jsr S.FreeMemA
lda LoadDrv.ENV
jsr S.FreeMemA
ldx #DEVMGR.OPEN
>LDYA DEVMGR.DEVPTR
jsr Kernel.DRVCALL Call DRV Open function
bcs .99
lda (DEVMGR.DEVPTR)
ora #S.DEV.F.INUSE Get Device Flags in A
sta (DEVMGR.DEVPTR)
clc
rts
.97 pha save error code
lda LoadDrv.BIN
jsr S.FreeMemA discard BIN in case of failed load
pla
.98 pha
lda LoadDrv.ENV
jsr S.FreeMemA
pla
.99 pha
jsr S.DestroyDevice
pla
sec
rts
*--------------------------------------
* S.LoadLib
* in :
* PULLW = PTR To Lib Name
* out :
* A = hMem To loaded LIB
*--------------------------------------
S.LoadLib jsr S.NewPStr
bcs .99
pha save LibName hMem for discard
jsr S.LoadLibA
bcs .98
plx get back STR hMem
pha save error code/hMem
txa
jsr S.FreeMemA discard STR hMem
pla get back error code/hMem
clc
rts
.98 plx get back STR hMem
pha save error code/hMem
txa
jsr S.FreeMemA discard STR hMem
pla get back error code/hMem
sec
.99 rts
*--------------------------------------
* S.LoadLibA
* in :
* A = hMem To Lib Name
* out :
* A = hMem of Loaded Lib
*--------------------------------------
S.LoadLibA >PUSHA push libname for S.FileSearch
>LDYAI MSG.LOADLIB
jsr S.SysScrPPSTR
>PUSHWI ENV.LIB push ENVNAME=LIB
ldy #S.PS.hENV
lda (TSKMGR.TSKPTR),y
>PUSHA
jsr S.GetEnvVarP get value for ENV=LIB
bcs .99
pha save hMem to LIB VALUE
>PUSHA Push %LIB% VALUE
jsr S.FileSearch find libname in %LIB%
bcs .98
pha save hMem to LIB full path
jsr S.SysScrPPSTRA
pla
pha
jsr S.LoadBinA A = hMem of filename full path
bcs .97
phx
>STYA Kernel.JMP
ldx #LIBMGR.LOAD
jsr Kernel.LIBCALL Call LIB.LOAD function
bcs .97
plx
pla discard LIB PATH
jsr S.FreeMemA
pla discard LIB VALUE
jsr S.FreeMemA
txa
clc
rts
.97 pla discard LIB PATH
jsr S.FreeMemA
.98 pla discard LIB VALUE
jsr S.FreeMemA
sec
.99 rts
*--------------------------------------
* S.UnloadLibA
* in :
* A = hMem To Lib
* out :
*--------------------------------------
S.UnloadLibA pha
jsr S.GetMemByIDA
>STYA ZPQuickPtr1
ldy #S.MEM.REFCNT
lda (ZPQuickPtr1),y Get count of those referencing this lib
dec only one left ?
beq .1
sta (ZPQuickPtr1),y
pla
clc
rts
.1 ldy #S.MEM.PTR
lda (ZPQuickPtr1),y
pha
iny
lda (ZPQuickPtr1),y
ply
>STYA Kernel.JMP
ldx #LIBMGR.UNLOAD
jsr Kernel.BINCALL Call LIB.UNLOAD function
pla
jmp S.FreeMemA
*--------------------------------------
* S.BinRelocate :
* R.AX = base address to start relocate
* R.BX = segment length (including data)
* R.CX = offset to apply to all abs addresses within segment
* R.DX unmodified
*--------------------------------------
S.BinRelocate lda (R.AX)
cmp #K.BIN.MAGICHEADER
bne .99
ldy #1
lda (R.AX),y
cmp /K.BIN.MAGICHEADER
beq .1
.99 sec Not a Valid Relocatable BIN File, exiting
rts
.1 >PUSHW R.DX
lda R.AL
clc
adc R.BL Make BX end of Segment Range (BX=AX+BX)
sta R.BL
lda R.AH
adc R.BH
sta R.BH
iny
.2 lda (R.AX),y Start Relocate JMP table
clc
adc R.CL
tax save LO to X
iny
lda (R.AX),y if HI = 0,we are done
beq .3
adc R.CH
sta (R.AX),y
dey
txa get back LO
sta (R.AX),y
iny
iny
bra .2
.3 iny we already skipped the 2 "0" bytes indicating end of JMP table
lda R.AL
clc
adc (R.AX),y make DX = end of opcode range
sta R.DL
iny
lda R.AH
adc (R.AX),y
sta R.DH
iny
* Start relocating opcodes between R.AX and R.DX with abs addressing pointing between R.AX and R.BX
* Applying offset = R.CX
tya add current offset in Y to R.AX
clc
adc R.AL
sta ZPQuickPtr1
lda #0
adc R.AH
sta ZPQuickPtr1+1
.4 lda (ZPQuickPtr1) get OPCODE
tax
lda OPCODES,x get OPCODE definition
bpl .7 abs addressing?
ldy #1
lda (ZPQuickPtr1),y Get LO
clc
adc R.CL add CX to abs address
sta ZPQuickPtr2 store relocated addr LO
iny
lda (ZPQuickPtr1),y Get HI
adc R.CH
sta ZPQuickPtr2+1 store relocated addr LO
dey
lda ZPQuickPtr2 Get new LO
sec
sbc R.AL
iny
lda ZPQuickPtr2+1 Get new HI
sbc R.AH
bcc .6 new addr < AX, out of range
dey
lda ZPQuickPtr2 Get new LO
sec
sbc R.BL
iny
lda ZPQuickPtr2+1 Get new HI
sbc R.BH
bcs .6 new addr > BX, out of range
dey
lda ZPQuickPtr2 Get new LO
sta (ZPQuickPtr1),y
iny
lda ZPQuickPtr2+1 Get new HI
sta (ZPQuickPtr1),y
.6 lda OPCODES,x
.7 and #$3 get OPCODE length
clc
adc ZPQuickPtr1
sta ZPQuickPtr1
bcc .8
inc ZPQuickPtr1+1
.8 sec A already got Ptr LO
sbc R.DL
lda ZPQuickPtr1+1 is Ptr greater than DX ?
sbc R.DH
bcc .4 no, continue relocating
>PULLW R.DX
clc
rts
*--------------------------------------
MSG.DRVLOAD >PSTRING "\nLoadDrv:"
MSG.LOADLIB >PSTRING "\nLoadLib:"
LoadDrv.ENV .BS 1
LoadDrv.BIN .BS 1
*--------------------------------------
* 65C02 OPCODES
* Bit 7 : 1 absolute addressing
* Bit 1-0 : opcode + @ length
*--------------------------------------
* x0.x1.x2.x3.x4.x5.x6.x7.x8.x9.xA.xB.xC.xD.xE.xF
OPCODES .HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
.HS 83.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
.HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03
.HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03
.HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03
.HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.BIN
LOAD SYS/KERNEL.S
ASM

248
SYS/KERNEL.S.DEV.txt Normal file
View File

@ -0,0 +1,248 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.DevMgrInit
*--------------------------------------
S.DevMgrInit ldx #S.DEV.SIZE*K.DEV.MAX
.1 stz DEVMGR.TABLE-1,x
dex
bne .1
ldy #5
.2 lda DEVMGR.TABLE.NUL,y
sta DEVMGR.TABLE,y
dey
bpl .2
ldy #5
ldx #S.DEV.SIZE+5
.3 lda DEVMGR.TABLE.KBD,y
sta DEVMGR.TABLE,x
dex
dey
bpl .3
lda #1 reserve #0=NUL, #1=KBD
sta DEVMGR.LASTID
clc
rts
*--------------------------------------
* S.GetDevByIDA
* IN:
* A = DevID
* OUT:
* CC = OK, CS = ERROR
* Y,A = devslot
* X Unmodified
*--------------------------------------
S.GetDevByIDA sta ZPQuickPtr1
lda #K.DEV.MAX
sta ZPQuickPtr1+1
>LDYAI DEVMGR.TABLE
>STYA ZPQuickPtr2
.1 lda (ZPQuickPtr2) get S.DEV.F
bpl .3 In use ?
ldy #S.DEV.ID
lda (ZPQuickPtr2),y
cmp ZPQuickPtr1
beq .8
.2 lda ZPQuickPtr2
clc
adc #S.DEV.SIZE
sta ZPQuickPtr2
bcc .3
inc ZPQuickPtr2+1
.3 dec ZPQuickPtr1+1
bne .1
sec
rts
.8 >LDYA ZPQuickPtr2
clc
rts
*--------------------------------------
* GetDevIDByNameA
* IN:
* A = hPStr
* OUT:
* CC = OK, CS = ERROR
* A = DEVID
* set DEVMGR.DEVPTR to devslot
*--------------------------------------
S.GetDevByNameA jsr S.GetMemPtrA
>STYA ZPQuickPtr1
>LDYAI DEVMGR.TABLE
>STYA DEVMGR.DEVPTR
ldx #K.DEV.MAX
.1 lda (DEVMGR.DEVPTR) get S.DEV.F
bpl .3 empty ?
lda DEVMGR.DEVPTR
clc
adc #S.DEV.NAME
sta ZPQuickPtr2
lda DEVMGR.DEVPTR+1
adc /S.DEV.NAME
sta ZPQuickPtr2+1
lda (ZPQuickPtr1)
cmp (ZPQuickPtr2)
bne .3
tay
.2 lda (ZPQuickPtr1),y
cmp (ZPQuickPtr2),y
bne .3
dey
bne .2
ldy #S.DEV.ID
lda (DEVMGR.DEVPTR),y
clc
rts
.3 lda DEVMGR.DEVPTR
clc
adc #S.DEV.SIZE
sta DEVMGR.DEVPTR
bcc .5
inc DEVMGR.DEVPTR+1
.5 dex
bne .1
lda #DEVMGR.ERRDNF
sec
rts
*--------------------------------------
* S.GetDevTable
* IN :
* OUT CC = OK, CS = ERROR
* Y,A = PTR to dev table
* X = LASTID
*--------------------------------------
S.GetDevTable >LDYAI DEVMGR.TABLE
ldx DEVMGR.LASTID
rts
*--------------------------------------
* S.DevOutA
* IN :
* A = hDev
*--------------------------------------
S.DevOutA ldx #DEVMGR.OUT
jmp S.DevCallFunc
*--------------------------------------
* S.GetDevInfoA
*--------------------------------------
S.GetDevInfoA ldx #DEVMGR.GETINFO
jmp S.DevCallFunc
*--------------------------------------
* PRIVATE
*--------------------------------------
* S.DevOpenA
* IN :
* A = hDev
* OUT CC = OK, CS = ERROR
*--------------------------------------
S.DevOpenA ldx #DEVMGR.OPEN
bra S.DevCallFunc
*--------------------------------------
* S.DevGetEventA
* IN :
* A = hDev
* OUT CC = OK, CS = ERROR
*--------------------------------------
S.DevGetEventA ldx #DEVMGR.GETEVENT
bra S.DevCallFunc
*--------------------------------------
* S.DevCloseA
*--------------------------------------
S.DevCloseA ldx #DEVMGR.CLOSE
bra S.DevCallFunc
*--------------------------------------
S.DevCallFunc jsr S.GetDevByIDA
bcs .9
>STYA pDevContext
ldy #S.DEV.hCS
lda (pDevContext),y
jsr S.GetMemPtrA X = unmodified
>STYA Kernel.JMP
>LDYA pDevContext
jsr Kernel.DRVCALL Call DRV function
.9 rts
*--------------------------------------
* S.CreateDevSlot
* IN : none
* OUT : A = DevID
* set DEVMGR.DEVPTR to freeslot
* init (DEVMGR.DEVPTR),S.DEV.ID with Dev.ID
*--------------------------------------
S.CreateDevice >LDYAI DEVMGR.TABLE
>STYA DEVMGR.DEVPTR
ldx #K.DEV.MAX
.1 lda (DEVMGR.DEVPTR)
bpl .3
lda DEVMGR.DEVPTR
clc
adc #S.DEV.SIZE
sta DEVMGR.DEVPTR
bcc .2
inc DEVMGR.DEVPTR+1
.2 dex
bne .1
lda #DEVMGR.ERROOS
sec
rts
.3 lda #0
tay
.4 sta (DEVMGR.DEVPTR),y
iny
cpy #S.DEV.SIZE
bne .4
inc DEVMGR.LASTID
lda DEVMGR.LASTID
ldy #S.DEV.ID
sta (DEVMGR.DEVPTR),y
clc
rts
*--------------------------------------
* S.DestroyDevSlot
* selected by (DEVMGR.DEVPTR)
*--------------------------------------
S.DestroyDevice ldy #S.DEV.hCS
lda (DEVMGR.DEVPTR),y
beq .1
jsr S.FreeMemA
.1 ldy #S.DEV.hDS
lda (DEVMGR.DEVPTR),y
beq .2
jsr S.FreeMemA
.2 ldy #S.DEV.hCMD
lda (DEVMGR.DEVPTR),y
beq .3
jsr S.FreeMemA
.3 ldy #S.DEV.hARGS
lda (DEVMGR.DEVPTR),y
beq .4
jsr S.FreeMemA
.4 rts
*--------------------------------------
DEVMGR.TABLE.NUL .DA #S.DEV.F.INUSE+S.DEV.F.CHAR+S.DEV.F.BLOCK
.HS 00 ID
>PSTRING "NUL" NAME
DEVMGR.TABLE.KBD .DA #S.DEV.F.INUSE+S.DEV.F.CHAR
.HS 01 ID
>PSTRING "KBD" NAME
DEVMGR.LASTID .BS 1
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.DEV
LOAD SYS/KERNEL.S
ASM

385
SYS/KERNEL.S.ENV.txt Normal file
View File

@ -0,0 +1,385 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.ExpandPStr
* In:
* PULLW = PSTR to String to Expand (PSTRING)
* Out:
* A = hMem to Expanded String (PSTRING)
*--------------------------------------
* S.ExpandPStrA
* In:
* A = hMem of String to Expand (PSTRING)
* Out:
* A = hMem to Expanded String (PSTRING)
*--------------------------------------
S.ExpandPStr >PULLW R.AX
bra S.ExpandPStr2
S.ExpandPStrA jsr S.GetMemPtrA
>STYA R.AX
S.ExpandPStr2 stz TmpBuffer256 init Expanded String len=0
stz R.BL reset "in var"
ldy #0
.1 iny
lda (R.AX),y
cmp #'%'
beq .10
jmp .7
.10 ldx R.BL in var?
bne .2
sty R.BL no, save start
jmp .8 skip this char
.2 sty R.BH yes, save end
phy save Actual char position
tya
sec
sbc R.BL compute len of %VAR% -1
tay
lda #0
>PUSHYA
>PUSHBI 0
jsr S.GetMem create VARNAME
phx save hMem for discard
>STYA R.CX
lda R.BH
sec
sbc R.BL
dec skip %
sta (R.CX)
ldy R.BL
iny
.3 inc R.CL
bne .4
inc R.CH
.4 lda (R.AX),y Copy string between % to ENVNAME
sta (R.CX)
iny
cpy R.BH
bne .3
pla
pha Get back ENVNAME hMem
>PUSHA
ldy #S.PS.hENV
lda (TSKMGR.TSKPTR),y
>PUSHA
jsr S.GetEnvVarH
bcs .5
pha save hMem of VALUE
jsr S.GetMemPtrA
>STYA R.DX
ldy #0
.41 iny
lda (R.DX),y
inc TmpBuffer256
ldx TmpBuffer256
sta TmpBuffer256,x
tya
cmp (R.DX)
bne .41
pla
jsr S.FreeMemA discard VALUE hMem
.5 pla
jsr S.FreeMemA discard VARNAME hMem
* ldy R.BL TODO:continue scanning from first % found
stz R.BL reset "in var"
ply
bra .8
.7 ldx R.BL in var?
bne .8 yes, skip this char
inc TmpBuffer256
ldx TmpBuffer256
sta TmpBuffer256,x
.8 tya
cmp (R.AX) last char?
beq .81
jmp .1
.81 >PUSHWI TmpBuffer256
jsr S.NewPStr
rts
*--------------------------------------
* S.CreateEnv
* in :
* out :
* A = hMem to new env
*--------------------------------------
S.CreateEnv >PUSHWI K.ENV.SIZE get a buffer for ENV
>PUSHBI 0
jsr S.GetMem create it...
bcs .9
>STYA ZPQuickPtr1
lda #0
sta (ZPQuickPtr1)
txa
clc
.9 rts
*--------------------------------------
* S.DupEnvA2
* In:
* A = ENV hMem To Duplicate
* Out:
* A = hMem to new ENV
*--------------------------------------
S.DupEnvA pha
jsr S.GetMemPtrA
>STYA ZPQuickPtr1
pla
jsr S.GetMemLenA
>PUSHYA
>PUSHBI 0
jsr S.GetMem
bcs .9
>STYA ZPQuickPtr2
phx
.1 lda (ZPQuickPtr1)
sta (ZPQuickPtr2)
beq .8
inc ZPQuickPtr1
bne .2
inc ZPQuickPtr1+1
.2 inc ZPQuickPtr2
bne .1
inc ZPQuickPtr2+1
bra .1
.8 pla
clc
.9 rts
*--------------------------------------
* S.GetEnvVarH
* In:
* PULLB = hENV
* PULLB = hMem to NAME (PSTRING)
*--------------------------------------
* S.GetEnvVarP
* In:
* PULLB = hENV
* PULLW = PTR to NAME (PSTRING)
* Out:
* A = hMem to VALUE (PSTRING) 0,"" if not exist
*--------------------------------------
S.GetEnvVarH jsr S.SelectEnvH
bra S.GetEnvVar
S.GetEnvVarP jsr S.SelectEnvP
S.GetEnvVar bcc .1
>LDYAI 1 not found
>PUSHYA create "" PSTR
>PUSHBI 0
jsr S.GetMem create a new PSTR
bcs .99
>STYA ZPQuickPtr3
lda #0
sta (ZPQuickPtr3) set len of PSTR
txa
clc
rts
.1 lda (ZPQuickPtr1) get NAME=VALUE len
sec
sbc (ZPQuickPtr2) substract (NAME len)
tay y=len("=VALUE")
lda #0
>PUSHYA
>PUSHBI 0
jsr S.GetMem create a new PSTR
bcs .99
>STYA ZPQuickPtr3
phx save hMem
lda (ZPQuickPtr1) get NAME=VALUE len
clc
sbc (ZPQuickPtr2) compute VALUE len
sta (ZPQuickPtr3) set new PSTR Len
tax x = chr to copy
lda (ZPQuickPtr2) get name len
inc add 1 to skip "="
tay
.2 iny
inc ZPQuickPtr3
bne .3
inc ZPQuickPtr3+1
.3 lda (ZPQuickPtr1),y
sta (ZPQuickPtr3)
dex
bne .2
pla get back PSTR hMem
clc
.99 rts
*--------------------------------------
* S.SetEnvVarH
* In:
* PULLB = hENV
* PULLB = hMem To Name (PSTRING)
* PULLB = hMem To Value (PSTRING)
*--------------------------------------
* S.SetEnvVarP
* In:
* PULLB = hENV
* PULLW = PTR To Name (PSTRING)
* PULLW = PTR To Value (PSTRING)
* Out:
*--------------------------------------
S.SetEnvVarH jsr S.SelectEnvH
php
>PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr3 ZPQuickPtr3 = VALUE
bra S.SetEnvVar
S.SetEnvVarP jsr S.SelectEnvP
php
>PULLW ZPQuickPtr3 ZPQuickPtr3 = VALUE
S.SetEnvVar plp
bcs .3 Not Found,ZPQuickPtr1 -> End Of Env
lda (ZPQuickPtr1) Found, Discard current NAME definition
sec
adc ZPQuickPtr1 add NAME=VALUE len+1 to ZPQuickPtr1
sta ZPQuickPtr4
lda #0
adc ZPQuickPtr1+1 store it in ZPQuickPtr4
sta ZPQuickPtr4+1
.1 lda (ZPQuickPtr4)
sta (ZPQuickPtr1)
beq .3 until we move ending 0
inc ZPQuickPtr1
bne .2
inc ZPQuickPtr1+1
.2 inc ZPQuickPtr4
bne .1
inc ZPQuickPtr4+1
bra .1
.3 lda ZPQuickPtr1 Compute ENV UPPER LIMIT
clc
adc #K.ENV.SIZE
sta ZPQuickPtr4
lda ZPQuickPtr1+1
adc /K.ENV.SIZE
sta ZPQuickPtr4+1
ldy ZPQuickPtr1+1
lda ZPQuickPtr1 Compute New Env Upper limit in A,Y
sec
adc (ZPQuickPtr2) add NAME len +1(for len)
bcc .4
iny
.4 sec
adc (ZPQuickPtr3) add VALUE len +1(for "=")
bcc .5
iny
.5 sec A,Y=new upper limit
sbc ZPQuickPtr4 greater than hMem Upper limit ?
bcc .51
tya
sbc ZPQuickPtr4+1
bcs .99
.51 lda (ZPQuickPtr2) make len = NAME+VALUE+1
sec
adc (ZPQuickPtr3)
sta (ZPQuickPtr1)
inc ZPQuickPtr1
bne .6
inc ZPQuickPtr1+1
.6 ldy #0
.7 iny
lda (ZPQuickPtr2),y
sta (ZPQuickPtr1)
inc ZPQuickPtr1
bne .8
inc ZPQuickPtr1+1
.8 tya
cmp (ZPQuickPtr2)
bne .7
lda #'='
sta (ZPQuickPtr1)
inc ZPQuickPtr1
bne .9
inc ZPQuickPtr1+1
.9 ldy #0
.10 iny
lda (ZPQuickPtr3),y
sta (ZPQuickPtr1)
inc ZPQuickPtr1
bne .11
inc ZPQuickPtr1+1
.11 tya
cmp (ZPQuickPtr3)
bne .10
lda #0
sta (ZPQuickPtr1)
clc
rts
.99 lda #SYSMGR.ERRENVF
sec
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
* S.SelectEnvH
* In:
* PULLB = hENV
* PULLB = hMem to NAME (PSTRING)
*--------------------------------------
* S.SelectEnvP
* In:
* PULLB = hENV
* PULLW = PTR to NAME (PSTRING)
*--------------------------------------
* Out:
* CC: Found
* ZPQuickPtr1 -> NAME=VALUE
* ZPQuickPtr2 -> NAME
* CS: Not Found
* ZPQuickPtr1 -> PTR to Ending 0
* ZPQuickPtr2 -> NAME
*--------------------------------------
S.SelectEnvH >PULLA get ENV
jsr S.GetMemPtrA
>STYA ZPQuickPtr1 Store ENV
>PULLA get NAME
jsr S.GetMemPtrA
>STYA ZPQuickPtr2 Store VAR Name
bra S.SelectEnv
S.SelectEnvP >PULLA get ENV
jsr S.GetMemPtrA
>STYA ZPQuickPtr1 Store ENV
>PULLW ZPQuickPtr2 get NAME
S.SelectEnv
.1 lda (ZPQuickPtr1)
beq .9
ldy #0
.2 iny
lda (ZPQuickPtr1),y
cmp #'=' End Of VAR Name ?
beq .4
.3 cmp (ZPQuickPtr2),y
bne .7
tya
cmp (ZPQuickPtr2)
bne .2
iny
lda (ZPQuickPtr1),y
cmp #'=' End Of VAR Name ?
bne .3
.4 dey
tya
cmp (ZPQuickPtr2) Y = VAR Name Len ?
beq .8 yes, found VAR
.7 lda (ZPQuickPtr1) no, go to next NAME=VALUE
sec
adc ZPQuickPtr1
sta ZPQuickPtr1
bcc .1
inc ZPQuickPtr1+1
bra .1
.8 clc
rts
.9 sec
rts
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.ENV
LOAD SYS/KERNEL.S
ASM

180
SYS/KERNEL.S.EVT.txt Normal file
View File

@ -0,0 +1,180 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.EvtMgrInit
*--------------------------------------
S.EvtMgrInit stz EVTMGR.PENDING
clc
rts
*--------------------------------------
* GETEVENT :
* IN :
* OUT :
* CS = no event, A = ERROR
* CC * event in YA
* (EVTMGR.EVTPTR)
*--------------------------------------
S.GetEvent lda EVTMGR.PENDING Get Pending EVENT hMem if any
beq .1
jsr S.GetMemPtrA
>STYA EVTMGR.EVTPTR
clc
rts
.1 jsr S.CreateEvent
bcs .9
stx EVTMGR.PENDING
jsr S.GetSysEvent
bcc .9 got SYS event
jsr S.GetDevEvent
bcc .9 got DEV event
jsr S.DestroyEvent discard empty event
lda #0 error code=0
sec no event
.9 rts
*--------------------------------------
S.GetSysEvent lda VBL get VLINE status
eor EVTMGR.VBLSTATE
bpl .2 no change
sta EVTMGR.VBLSTATE save new
dec EVTMGR.FRAMECNT
bne .2
lda #K.TIMER16RESOLUTION
sta EVTMGR.FRAMECNT
inc A2osX.TIMER16
bne .1
inc A2osX.TIMER16+1
.1 lda #S.EVT.F.TIMER
sta (EVTMGR.EVTPTR)
clc
rts
.2 lda KBD
bpl .9
and #$7F
sta KBDSTROBE
ldy #S.EVT.DATA
sta (EVTMGR.EVTPTR),y
iny
lda OPENAPPLE
asl
lda SOLIDAPPLE
ror
and #$C0
sta (EVTMGR.EVTPTR),y
lda #S.EVT.F.KEY
sta (EVTMGR.EVTPTR)
ldy #S.EVT.hDEV
lda #1 Source dev = KBD
sta (EVTMGR.EVTPTR),y
clc
rts
.9 inc A2osX.RANDOM16
bne .99
inc A2osX.RANDOM16+1
.99 lda #0 error code=0
sec no event
rts
*--------------------------------------
S.GetDevEvent >LDYAI DEVMGR.TABLE
>STYA DEVMGR.DEVPTR
ldx #K.DEV.MAX
.1 lda (DEVMGR.DEVPTR) get S.DEV.F
bpl .3 empty ?
and #S.DEV.F.EVENT
beq .3 EVENT enabled ?
ldy #S.DEV.ID
lda (DEVMGR.DEVPTR),y
ldy #S.EVT.hDEV
sta (EVTMGR.EVTPTR),y
ldy #S.DEV.hCS
lda (DEVMGR.DEVPTR),y
jsr S.GetMemPtrA
>STYA Kernel.JMP
phx
>PUSHW EVTMGR.EVTPTR
ldx #DEVMGR.GETEVENT
jsr Kernel.DRVCALL Call DRV GetEvent function
plx
bcc .9 Got An Event
.3 lda DEVMGR.DEVPTR
clc
adc #S.DEV.SIZE
sta DEVMGR.DEVPTR
bcc .4
inc DEVMGR.DEVPTR+1
.4 dex
bne .1
lda #0 error code=0
sec no event
.9 rts
*--------------------------------------
* S.CreateEvent
* OUT :
* X = hMem
* Y,A = PTR to EVENT
*--------------------------------------
S.CreateEvent >PUSHWI S.EVT.SIZE
>PUSHBI 0
jsr S.GetMem
bcs .9
>STYA EVTMGR.EVTPTR
lda #0
ldy #S.EVT.SIZE-1
.1 sta (EVTMGR.EVTPTR),y
dey
bpl .1
clc
.9 rts
*--------------------------------------
S.DestroyEvent lda EVTMGR.PENDING
beq .9
jsr S.DestroyEventA
stz EVTMGR.PENDING
.9 rts
*--------------------------------------
* S.DestroyEvent
* IN :
* A = Event hMem
* OUT :
*--------------------------------------
S.DestroyEventA pha
jsr S.GetMemPtrA
>STYA EVTMGR.EVTPTR
lda (EVTMGR.EVTPTR)
and #S.EVT.F.hMEM1
beq .1
ldy #S.EVT.DATALO
lda (EVTMGR.EVTPTR),y
jsr S.FreeMemA
.1 lda (EVTMGR.EVTPTR)
and #S.EVT.F.hMEM2
beq .2
ldy #S.EVT.DATAHI
lda (EVTMGR.EVTPTR),y
jsr S.FreeMemA
.2 pla
jsr S.FreeMemA
rts
*--------------------------------------
EVTMGR.VBLSTATE .BS 1
EVTMGR.FRAMECNT .BS 1
EVTMGR.PENDING .BS 1
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.EVT
LOAD SYS/KERNEL.S
ASM

556
SYS/KERNEL.S.FS.txt Normal file
View File

@ -0,0 +1,556 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* PUBLIC
*--------------------------------------
S.CheckPrefixA jsr S.GetMemPtrA
S.CheckPrefix >STYA MLICALL.PARAMS+1
>STYA ZPQuickPtr1
lda (ZPQuickPtr1)
beq .98
tax
ldy #1
lda (ZPQuickPtr1),y
cmp #'/'
bne .98
cpx #1 "/" allowed for listing online volumes
beq .8
>KMLICALL MLIGETFILEINFO
bcs .98 No, invalid path...
lda MLICALL.PARAMS+4 Check file type
cmp #$0F Directory?
bne .98
.8 clc
rts
.98 lda #SYSMGR.ERRIDIR
.99 sec
rts
*--------------------------------------
* S.FileSearch
* in :
* PULLB = hMem to Search Path (PSTRING) %LIB%;/SYS/SLIB
* PULLB = hMem to File Name (PSTRING)
* out :
* A = hMem of FilePath (PSTRING)
*--------------------------------------
S.FileSearch >PULLA Get Search path
jsr S.ExpandPStrA Expand it
bcc .10
pha save error code
>PULLA discard file name
pla
sec
rts
.10 sta R.BL Store Expanded path list to search
>PULLB R.AH Store Filename
lda #1
sta R.BH Start At Token 1
.1 >PUSHB R.BL push expanded path list
>PUSHBI $3B Push SEP=';'
>PUSHB R.BH Push Token IDX
jsr S.PStrGetTkn Get R.BL token in A
bcs .98
sta R.CL Store Token path
>PUSHB R.AH push filename
>PUSHB R.CL Push Token path
jsr S.PStrCat
bcs .97
sta R.CH Store Full path (Token Path+filename)
jsr S.MLIGetFileInfoA
bcc .8
lda R.CH Discard this Full Path
jsr S.FreeMemA
lda R.CL Discard Token path
jsr S.FreeMemA
inc R.BH Try next Token
bne .1
beq .98 go to discard Expanded path list
.97 lda R.CL Discard Token path
jsr S.FreeMemA
.98 lda R.BL Discard Expanded Path list
jsr S.FreeMemA
lda #SYSMGR.ERRFNF
sec
rts
.8 jsr .97 Dicard all except Full Path
lda R.CH
clc
rts
*--------------------------------------
* S.LoadFileA
* in :
* A = hMem of FilePath (PSTRING)
* out :
* Y,A = File Length
* X = hMem of Loaded File
*--------------------------------------
S.LoadFileA jsr S.MLIOpenA
bcs .99
sta R.AL save ref_num
stx R.AH save Prodos Buffer for freemem
jsr S.MLIGetEOFA
bcs .98
phx Larger than 64k?
plx
beq .1 File too big!!!!
lda #SYSMGR.ERRFTB
bra .98
.1 >STYA R.BX save Length
>PUSHYA Push Length for S.GetMem
>PUSHBI 0
jsr S.GetMem
bcs .98
>STYA R.CX
stx R.DL save Segment hMem
>PUSHW R.BX Push Length for S.ReadFile
>PUSHW R.CX Push Dest PTR
>PUSHB R.AL Push ref_num
jsr S.MLIRead
bcs .97
lda R.AL
jsr S.MLICloseA
lda R.AH
jsr S.FreeMemA Discard ProDOS IO Buffer
>LDYA R.BX Return File Length...
ldx R.DL ...and hMem to Caller
clc
rts
.97 pha
lda R.DL
jsr S.FreeMemA freemem because of failed load
pla
.98 pha
lda R.AL
jsr S.MLICloseA
lda R.AH
jsr S.FreeMemA ProDOS IO Buffer
pla
.99 sec
rts
*--------------------------------------
* S.ListDirInitA
* in :
* A = PATH (PSTR) /DIR,/DIR/*.?s
* out :
* A = hMem of Dir Listing
*--------------------------------------
S.ListDirInitA sta R.AL
stz TmpFileName Reset File.Pattern
jsr S.GetMemPtrA
>STYA R.BX Store path
jsr S.CheckPrefix is it a existing directory?
bcc .4 yes, continue with empty pattern
lda (R.BX) no, get pattern at end of full path
tay
ldx #0
.1 lda (R.BX),y
cmp #'/'
beq .2
inx
dey
bne .1
.2 stx TmpFileName
txa
beq .4
lda (R.BX)
tay
.3 lda (R.BX),y
sta TmpFileName,x
dey
dex
bne .3
tya
sta (R.BX) remove pattern from path
.4 >PUSHWI S.LISTDIR.SIZE get LISTDIR Struct
>PUSHBI 0
jsr S.GetMem
bcs .99
stx R.AH
>STYA R.CX Store LISTDIR Struct
txa
jsr S.ClrMemA reset all bytes
ldy TmpFileName
beq .5
lda #0
>PUSHYA
>PUSHBI 0
jsr S.GetMem
bcs .98
>STYA ZPQuickPtr1
txa
ldy #S.LISTDIR.hPATTERN
sta (R.CX),y
ldy TmpFileName
.40 lda TmpFileName,y
sta (ZPQuickPtr1),y
dey
bpl .40
.5 lda (R.BX)
cmp #1 length = 1 ? ('/')
bne .6
jsr S.ListDirInitAV
bcs .98
lda R.AH
rts
.6 jsr S.ListDirInitAD
bcs .98
lda R.AH
rts
.98 pha
lda R.AH Discard S.LISTDIR
jsr S.ListDirCloseA
pla
.99 sec
rts
*--------------------------------------
S.ListDirInitAV >PUSHWI 256
>PUSHBI 0
jsr S.GetMem
bcs .99
>PUSHYA push buffer for online call
txa
sta (R.CX) save hONLINE buffer
>PUSHBI 0 All devices
jsr S.MLIOnline
bcs .98
ldy #S.LISTDIR.ONLINEPTR
lda #0 make index point first Entry
sta (R.CX),y
clc
rts
.98 lda (R.CX)
jsr S.FreeMemA
.99 sec
rts
*--------------------------------------
S.ListDirInitAD lda #0
sta (R.CX) reset hONLINE
>LDYA R.BX Open DIR
jsr S.MLIOpen
bcs .99
ldy #S.LISTDIR.REFNUM
sta (R.CX),y save ref_num
txa
ldy #S.LISTDIR.hIOBUF
sta (R.CX),y save ProDOS IO buffer hMem
>PUSHWI 512 get Read buffer
>PUSHBI 0
jsr S.GetMem
bcs .99
txa
ldy #S.LISTDIR.hREADBUF save Read Buffer hMem
sta (R.CX),y
jsr S.ListDirReadBlock
bcs .99
>STYA ZPQuickPtr1
ldy #$23 get entry_length
lda (ZPQuickPtr1),y
ldy #S.LISTDIR.EL
sta (R.CX),y
ldy #$24 get entry_per_block
lda (ZPQuickPtr1),y
ldy #S.LISTDIR.EPB
sta (R.CX),y
ldy #$25 get File_count LO
lda (ZPQuickPtr1),y
ldy #S.LISTDIR.FC
sta (R.CX),y
ldy #$26 get File_count HI
lda (ZPQuickPtr1),y
ldy #S.LISTDIR.FC+1
sta (R.CX),y
ldy #S.LISTDIR.FI
sta (R.CX),y
iny
sta (R.CX),y set FI to $0000
clc
.99 rts
*--------------------------------------
* S.DirListNextA
* A = S.LISTDIR hMEM
* out :
* A = hMem To Dir Entry
*--------------------------------------
S.ListDirNextA jsr S.GetMemPtrA Get PTR to S.LISTDIR
>STYA R.CX
lda (R.CX) Online Data?
beq S.ListDirNextAD no,list files
*--------------------------------------
S.ListDirNextAV jsr S.GetMemPtrA
>STYA ZPQuickPtr1 ZPQuickPtr1 = Online DATA
.10 ldy #S.LISTDIR.ONLINEPTR
lda (R.CX),y
cmp #16
beq .9
inc
sta (R.CX),y
dec
asl
asl
asl
asl
tay
lda (ZPQuickPtr1),y
and #$0F
beq .10
sta TmpFileName
ldx #0
.1 iny
inx
lda (ZPQuickPtr1),y
sta TmpFileName,x
cpx TmpFileName
bne .1
>PUSHWI 16
>PUSHBI 0
jsr S.GetMem
bcs .9
>STYA ZPQuickPtr2
ldy #15
.2 lda TmpFileName,y
sta (ZPQuickPtr2),y
dey
bpl .2
lda (ZPQuickPtr2) Mark Record as "VOL"
ora #$C0
sta (ZPQuickPtr2)
txa Get back hMem of Volume.Name
clc
rts
.9 sec
rts
*--------------------------------------
S.ListDirNextAD stz R.DL Reset Return Record hMem
ldy #S.LISTDIR.FI File Index = File count ?
lda (R.CX),y
ldy #S.LISTDIR.FC
cmp (R.CX),y
bne .1
ldy #S.LISTDIR.FI+1
lda (R.CX),y
ldy #S.LISTDIR.FC+1
cmp (R.CX),y
bne .1
sec yes, exit no more file
rts
*--------------------------------------
.1 ldy #S.LISTDIR.EIB Entry Index in block = Entry per block ?
lda (R.CX),y
ldy #S.LISTDIR.EPB
cmp (R.CX),y
bne .2
jsr S.ListDirReadBlock
bcc .3
rts
*--------------------------------------
.2 ldy #S.LISTDIR.hREADBUF
lda (R.CX),y
jsr S.GetMemPtrA
.3 >STYA R.AX R.AX = READ BUFFER
ldy #S.LISTDIR.BLKPTR
lda (R.CX),y
clc
adc R.AX
sta R.AX
iny
lda (R.CX),y
adc R.AX+1
sta R.AX+1
lda (R.AX) Is is a deleted file ? (storage_type=0)
and #$F0
beq .40
cmp #$F0 Volume header ?
beq .30 yes, do not filter
cmp #$E0 Directory header ?
beq .30 yes, do not filter
ldy #S.LISTDIR.hPATTERN any filter ?
lda (R.CX),y
beq .30
jsr S.GetMemPtrA
>PUSHYA push Filter hMem
lda (R.AX)
and #$0F
sta TmpFileName
tay
.31 lda (R.AX),y
sta TmpFileName,y
dey
bne .31
>PUSHWI TmpFileName push Filename
jsr S.PStrMatchP
bcs .40 no match
.30 ldy #S.LISTDIR.EL Get Entry length
lda (R.CX),y
tay
lda #0
>PUSHYA Get an entry_length buffer
>PUSHBI 0
jsr S.GetMem
bcs .99
>STYA R.BX R.BX = DEST RECORD
stx R.DL
ldy #S.LISTDIR.EL
lda (R.CX),y
tay
dey
.4 lda (R.AX),y
sta (R.BX),y
dey
bpl .4
.40 ldy #S.LISTDIR.EIB Set ENTRY INDEX IN BLOCK +=1
lda (R.CX),y
inc
sta (R.CX),y
ldy #S.LISTDIR.EL Set BLOCK PTR +=entry_length
lda (R.CX),y
ldy #S.LISTDIR.BLKPTR
clc
adc (R.CX),y
sta (R.CX),y
bcc .5
iny
lda (R.CX),y
inc
sta (R.CX),y
.5 lda (R.AX)
and #$E0 is storage_type = $F or $E ?
cmp #$E0 yes, do NOT increase FI
bne .6
ldy #S.LISTDIR.FI Increase FILE INDEX
lda (R.CX),y
inc
sta (R.CX),y
bne .6
iny
lda (R.CX),y
inc
sta (R.CX),y
.6 lda R.DL
bne .8
jmp S.ListDirNextAD Nothing to return, start over for next file entry
.8 clc
rts
.99 sec
rts
*--------------------------------------
* S.DirListCloseA
* in :
* A = hS.LISTDIR
*--------------------------------------
S.ListDirCloseA pha
jsr S.GetMemPtrA
>STYA ZPQuickPtr1
ldy #S.LISTDIR.REFNUM
lda (ZPQuickPtr1),y
beq .1
jsr S.MLICloseA
bcs * If Close Failed, we cannot free IOBUF
.1 ldy #S.LISTDIR.hIOBUF
lda (ZPQuickPtr1),y
beq .2
jsr S.FreeMemA
.2 ldy #S.LISTDIR.hREADBUF
lda (ZPQuickPtr1),y
beq .3
jsr S.FreeMemA
.3 lda (ZPQuickPtr1) Online buffer
beq .4
jsr S.FreeMemA
.4 ldy #S.LISTDIR.hPATTERN
lda (ZPQuickPtr1),y
beq .5
jsr S.FreeMemA
.5 pla
jsr S.FreeMemA
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
* S.ListDirReadBlock
* In :
* CX = LISTDIR
* Out :
* Y,A = READ BUFFER
*--------------------------------------
S.ListDirReadBlock
ldy #S.LISTDIR.REFNUM
lda (R.CX),y get ref_num
sta MLICALL.PARAMS+1
ldy #S.LISTDIR.hREADBUF
lda (R.CX),y get READ BUFFER
jsr S.GetMemPtrA
>STYA MLICALL.PARAMS+2
>LDYAI 512
>STYA MLICALL.PARAMS+4
>KMLICALL MLIREAD
bcs .9
ldy #S.LISTDIR.BLKPTR set BLKPTR to $0004
lda #4
sta (R.CX),y
iny
lda #0
sta (R.CX),y
ldy #S.LISTDIR.EIB set EIB to 0
sta (R.CX),y
>LDYA MLICALL.PARAMS+2
.9 rts
*--------------------------------------
TmpFileName .BS 16
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.FS
LOAD SYS/KERNEL.S
ASM

0
SYS/KERNEL.S.MD5.txt Normal file
View File

474
SYS/KERNEL.S.MEM.txt Normal file
View File

@ -0,0 +1,474 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* !!!!!!!! DO NOT USE VCPU16 !!!!!!!!
* !!!!!! DO NOT USE ZPQuickPTRs !!!!!
*--------------------------------------
ZPMemMgrReqS .EQ ZPMemMgr store requested Size
ZPMemMgrReqF .EQ ZPMemMgr+2 store requested Flags
ZPMemMgrSPtr .EQ ZPMemMgr+6 Pointer To Slot selected
ZPMemMgrTmp1 .EQ ZPMemMgr+8
ZPMemMgrTmp2 .EQ ZPMemMgr+10
ZPMemMgrTmp3 .EQ ZPMemMgr+12
*--------------------------------------
* TODO :
* Create a 256 bytes table in SLOT #0
* (eh, mem.ID=0 always used! useful to test if hMem=0)
* mapping hMem's to real memory blocks to help
* Garbage collector move blocks
*--------------------------------------
S.MemMgrInit ldx /A2osX.LOMEM
lda #A2osX.LOMEM
beq .1
inx
.1 phx
txa
lsr
lsr
lsr
tay
txa
and #7
tax
lda #$80
.2 dex
bmi .3
lsr
bra .2
.3 and MEMTABL,y
bne .4
plx
inx
cpx /MLI
bne .1
bra .5
.4 plx
.5 stz MEMMGR.MHLIMIT
stz MEMMGR.HIMEM
stx MEMMGR.MHLIMIT+1
stx MEMMGR.HIMEM+1
>LDYAI A2osX.LOMEM
>STYA MEMMGR.LOMEM
>STYA MEMMGR.MLLIMIT
stz MEMMGR.TABLESIZE Init Table Size to 0
* jsr S.UpdateMemStats Not needed, will be called by S.GetMem
>PUSHWI 256 get a 256 bytes buffer for Map Table, hMem=0
>PUSHBI 0
jsr S.GetMem create it...
clc
rts
*--------------------------------------
* PUBLIC
*--------------------------------------
S.SetLowMemLimit
clc
rts
*--------------------------------------
S.GarbageCollector
clc
rts
*--------------------------------------
* S.GetMem
* In:
* PULLB = FLAGS
* PULLW = Size Requested
* Out:
* YA = PTR to Mem
* X = S.MEM.ID
* CS on err
*--------------------------------------
S.GetMem >PULLB ZPMemMgrReqF store requested flags
>PULLW ZPMemMgrReqS store requested size
lda ZPMemMgrReqS align REQS to 16 bytes
and #$0F
beq .10
lda ZPMemMgrReqS
and #$F0
clc
adc #$10
sta ZPMemMgrReqS
bcc .10
inc ZPMemMgrReqS+1
.10 ldx #0 init to SLOT #0 of MEMSLOT list
lda MEMMGR.TABLESIZE Check if some free slot to reuse first
beq .6
.1 txa
jsr S.GetMemByIDA
lda (ZPMemMgrSPtr) Get Flags
bmi .4 in use ?
.2 lda ZPMemMgrReqF Found an empty slot
and #S.MEM.F.ALIGN is request needs a page align ?
beq .3
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y get LO of PTR
bne .4 not page-aligned
.3 ldy #S.MEM.LEN
lda (ZPMemMgrSPtr),y get LEN of this block
cmp ZPMemMgrReqS compare with requested size
bne .4
iny
lda (ZPMemMgrSPtr),y
cmp ZPMemMgrReqS+1
beq .5 requested size matches slot size !!!
.4 inx move to next slot
cpx MEMMGR.TABLESIZE last slot ?
bne .1 check for another slot
beq .6 last one, create a new slot
*-------------- Reuse this SLOT
.5 lda ZPMemMgrReqF get requested flags
ora #S.MEM.F.INUSE mark as in use
sta (ZPMemMgrSPtr)
lda #0
ldy #S.MEM.BIN
sta (ZPMemMgrSPtr),y
inc Mark this slot used by one task
ldy #S.MEM.REFCNT
sta (ZPMemMgrSPtr),y
ldy #S.PS.ID
lda (TSKMGR.TSKPTR),y
ldy #S.MEM.OWNERPID
sta (ZPMemMgrSPtr),y
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y
pha
iny
lda (ZPMemMgrSPtr),y A = HI PTR
ply Y = LO PTR
clc X = Current hMem
rts
*-------------- Create a New SLOT
.6 lda ZPMemMgrReqF
and #S.MEM.F.ALIGN is request needs a page align ?
beq .7
lda MEMMGR.MHLIMIT target PTR will be page aligned ?
sec
sbc ZPMemMgrReqS
beq .7 yes, allocate
tay no, reserve a free slot to fill gap
lda #0
jsr S.AddSlot
bcs .99
.7 >LDYA ZPMemMgrReqS
jsr S.AddSlot
bcs .99
phx Save hMem
>STYA ZPMemMgrTmp1
lda ZPMemMgrReqF
ora #S.MEM.F.INUSE
sta (ZPMemMgrSPtr) set Flags
lda #1
ldy #S.MEM.REFCNT Mark this slot referenced
sta (ZPMemMgrSPtr),y
ldy #S.PS.ID
lda (TSKMGR.TSKPTR),y
ldy #S.MEM.OWNERPID
sta (ZPMemMgrSPtr),y
jsr S.UpdateMemStats
>LDYA ZPMemMgrTmp1 Y,A = PTR
plx X = hMem
clc
rts
.99 sec
rts
*--------------------------------------
* S.FreeMemA
* In:
* A = hMem To Free
* Out:
* X,Y unmodified
*--------------------------------------
S.FreeMemA and #$FF
bne S.FreeMemA0 Slot=0, reserved by Kernel
rts
S.FreeMemA0 phy
phx
jsr S.GetMemByIDA
lda (ZPMemMgrSPtr)
bmi .10 In use ?
bra *
.10 ldy #S.MEM.REFCNT
lda (ZPMemMgrSPtr),y Get count of those referencing this hMem
dec only one left ?
sta (ZPMemMgrSPtr),y
bne .82 no, must be a code segment loaded several times
ldy #S.MEM.BIN
lda (ZPMemMgrSPtr),y Any BINPATH to discard ?
beq .11
pha save hMem
>PUSHW ZPMemMgrSPtr
pla
jsr S.GetMemByIDA
lda (ZPMemMgrSPtr)
bmi .12 In use ?
bra *
.12 lda (ZPMemMgrSPtr) mark record as free
and #$7F
sta (ZPMemMgrSPtr)
>PULLW ZPMemMgrSPtr
.11 lda (ZPMemMgrSPtr) mark record as free
and #$7F
sta (ZPMemMgrSPtr)
.20 lda MEMMGR.TABLESIZE
beq .82
.21 dec
jsr S.GetMemByIDA
lda (ZPMemMgrSPtr)
bmi .81
dec MEMMGR.TABLESIZE discard last record
ldy #S.MEM.LEN
lda (ZPMemMgrSPtr),y give back LEN bytes
clc
adc MEMMGR.MHLIMIT to HLIMIT
sta MEMMGR.MHLIMIT
iny
lda (ZPMemMgrSPtr),y
adc MEMMGR.MHLIMIT+1
sta MEMMGR.MHLIMIT+1
lda MEMMGR.MLLIMIT And give back S.MEM.SIZE
sec
sbc #S.MEM.SIZE
sta MEMMGR.MLLIMIT to LLIMIT
bcs .2
dec MEMMGR.MLLIMIT+1
.2 lda MEMMGR.TABLESIZE
bne .21 no slot left, exit
.81 jsr S.UpdateMemStats
.82 plx
ply
clc
rts
*--------------------------------------
* IN/OUT
* A = hMem
*--------------------------------------
S.ClrMemA pha
jsr S.GetMemByIDA
ldy #S.MEM.LEN ZPMemMgrSPtr already set by S.GetMemByIDA
lda (ZPMemMgrSPtr),y
sta ZPMemMgrReqS set ZPMemMgrReqS to mem size
iny
lda (ZPMemMgrSPtr),y
sta ZPMemMgrReqS+1
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y
tax
iny
lda (ZPMemMgrSPtr),y
stx ZPMemMgrSPtr
sta ZPMemMgrSPtr+1 set ZPMemMgrSPtr to Mem
lda #0
.1 ldx ZPMemMgrReqS
bne .2
ldx ZPMemMgrReqS+1
beq .3
dec ZPMemMgrReqS+1
.2 dec ZPMemMgrReqS
sta (ZPMemMgrSPtr)
inc ZPMemMgrSPtr
bne .1
inc ZPMemMgrSPtr+1
bra .1
.3 pla
rts
*--------------------------------------
* S.GetMemByIDA
* In:
* A = hMem
* Out:
* Y,A = ZPMemMgrSPtr = PTR to S.MEM
* X unmodified
*--------------------------------------
S.GetMemByIDA stz ZPMemMgrSPtr+1
asl
rol ZPMemMgrSPtr+1
asl
rol ZPMemMgrSPtr+1
asl
rol ZPMemMgrSPtr+1
clc
adc MEMMGR.LOMEM
sta ZPMemMgrSPtr
tay
lda ZPMemMgrSPtr+1
adc MEMMGR.LOMEM+1
sta ZPMemMgrSPtr+1
rts
*--------------------------------------
* In:
* A = hMem to BINPATH (PSTR)
* Out:
* Y,A = ZPMemMgrSPtr = PTR to S.MEM
* X = hMem
*--------------------------------------
S.GetMemByNameA jsr S.GetMemPtrA
>STYA ZPMemMgrTmp1 save BINPATH
>LDYA MEMMGR.LOMEM
>STYA ZPMemMgrTmp2
ldx #0
.1 lda (ZPMemMgrTmp2)
bpl .6 In Use?
ldy #S.MEM.BIN any BIN PATH in this slot?
lda (ZPMemMgrTmp2),y
beq .6
jsr S.GetMemPtrA get pathname
>STYA ZPMemMgrTmp3
ldy #0
.2 lda (ZPMemMgrTmp1),y
cmp (ZPMemMgrTmp3),y
bne .6
tya
iny
cmp (ZPMemMgrTmp1)
bne .2
>LDYA ZPMemMgrTmp2
clc
rts
.6 lda ZPMemMgrTmp2
clc
adc #S.MEM.SIZE
sta ZPMemMgrTmp2
bcc .7
inc ZPMemMgrTmp2+1
.7 inx
cpx MEMMGR.TABLESIZE
bne .1
sec
rts
*--------------------------------------
* S.GetMemPtrA
* In:
* A = hMem
* Out:
* Y,A = PTR to MemBlock
* X unmodified
*--------------------------------------
S.GetMemPtrA jsr S.GetMemByIDA
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y
pha
iny
lda (ZPMemMgrSPtr),y
ply
rts
*--------------------------------------
* S.GetMemLenA
* In:
* A = hMem
* Out:
* Y,A = PTR to MemLength
* X unmodified
*--------------------------------------
S.GetMemLenA jsr S.GetMemByIDA
ldy #S.MEM.LEN
lda (ZPMemMgrSPtr),y
pha
iny
lda (ZPMemMgrSPtr),y
ply
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
* S.AddSlot
* In:
* Y,A = Requested size
* Out:
* Y,A = PTR to MemSlot
* X = SLOT.ID
*--------------------------------------
S.AddSlot >STYA ZPMemMgrTmp1 save req size
lda MEMMGR.TABLESIZE
inc
beq .99 > 255 ERR:OUT OF SLOT
dec
jsr S.GetMemByIDA yes, get PTR to slot
lda MEMMGR.MHLIMIT Compute base PTR=HLIMIT-REQ size
sec
sbc ZPMemMgrTmp1
sta ZPMemMgrTmp2 store new HLIMIT in ZPMemMgrTmp2
lda MEMMGR.MHLIMIT+1
sbc ZPMemMgrTmp1+1
sta ZPMemMgrTmp2+1
lda MEMMGR.MLLIMIT compute new LLIMIT
clc
adc #S.MEM.SIZE
sta ZPMemMgrTmp3 store new LLIMIT in ZPMemMgrTmp3
lda MEMMGR.MLLIMIT+1
adc #0
sta ZPMemMgrTmp3+1
lda ZPMemMgrTmp2 ensure new LLIMIT is not higher
sec than new HLIMIT
sbc ZPMemMgrTmp3
lda ZPMemMgrTmp2+1
sbc ZPMemMgrTmp3+1
bcc .98 ERR out of mem
>LDYA ZPMemMgrTmp3 get new LLIMIT
>STYA MEMMGR.MLLIMIT And set it allocated
lda #0
sta (ZPMemMgrSPtr)
ldy #S.MEM.BIN
sta (ZPMemMgrSPtr),y
ldy #S.MEM.REFCNT
sta (ZPMemMgrSPtr),y
ldy #S.MEM.OWNERPID
sta (ZPMemMgrSPtr),y
ldy #S.MEM.PTR
lda ZPMemMgrTmp2 get new HLIMIT
sta MEMMGR.MHLIMIT set as system HLIMIT value
sta (ZPMemMgrSPtr),y store is as base address of new slot
iny
lda ZPMemMgrTmp2+1
sta MEMMGR.MHLIMIT+1
sta (ZPMemMgrSPtr),y
ldy #S.MEM.LEN
lda ZPMemMgrTmp1 get requested size
sta (ZPMemMgrSPtr),y setup slot LEN
iny
lda ZPMemMgrTmp1+1
sta (ZPMemMgrSPtr),y
>LDYA ZPMemMgrTmp2 Y,A = PTR
ldx MEMMGR.TABLESIZE X = SLOT.ID
inc MEMMGR.TABLESIZE mark this slot allocated
clc
rts
.98 lda #MEMMGR.ERROOM
sec
rts
.99 lda #MEMMGR.ERROOS
sec
rts
*--------------------------------------
S.UpdateMemStats
lda MEMMGR.MHLIMIT
sec
sbc MEMMGR.MLLIMIT
sta MEMMGR.MFREE
lda MEMMGR.MHLIMIT+1
sbc MEMMGR.MLLIMIT+1
sta MEMMGR.MFREE+1
rts
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.MEM
LOAD SYS/KERNEL.S
ASM

151
SYS/KERNEL.S.MLI.txt Normal file
View File

@ -0,0 +1,151 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* PUBLIC
*--------------------------------------
S.MLICreate
S.MLIDestroy
S.MLIRename
S.MLISetFileInfo
*--------------------------------------
* S.MLIGetFileInfoA
* in :
* A = hMem To FileName
* out :
* Y,A = PTR To Buffer (L=15)
*--------------------------------------
S.MLIGetFileInfoA
jsr S.GetMemPtrA
S.MLIGetFileInfo
>STYA MLICALL.PARAMS+1
>KMLICALL MLIGETFILEINFO
bcs .9
>LDYAI MLICALL.PARAMS+3
.9 rts
*--------------------------------------
* S.MLIOnline
* in :
* PULLB = Device
* PULLW = Dest PTR
*--------------------------------------
S.MLIOnline >PULLB MLICALL.PARAMS+1
>PULLW MLICALL.PARAMS+2
>KMLICALL MLIONLINE
rts
*--------------------------------------
S.MLISetPrefix
*--------------------------------------
S.MLIGetPrefixA jsr S.GetMemPtrA
S.MLIGetPrefix >STYA MLICALL.PARAMS+1
>KMLICALL MLIGETPREFIX
rts
*--------------------------------------
* S.MLIOpenA
* in :
* A = hMem To FileName
* out :
* A = ref_num
* X = buf hMem
*--------------------------------------
S.MLIOpenA jsr S.GetMemPtrA
S.MLIOpen >STYA MLICALL.PARAMS+1
>PUSHWI 1024 get a ProDOS IO buffer
>PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOV
jsr S.GetMem
bcs .99
phx save Prodos Buffer hMem
>STYA MLICALL.PARAMS+3
>KMLICALL MLIOPEN
bcs .98
lda MLICALL.PARAMS+5 get ref_num
plx get back Prodos Buffer hMem
rts CC
.98 plx get back Prodos Buffer hMem
pha save MLI error
txa
jsr S.FreeMemA discard Prodos Buffer
pla get back MLI error
sec
.99 rts
*--------------------------------------
* S.MLINewline
* in :
* PULLB = ref_num
* PULLB = Enable Mask
* PULLB = Newline Char
*--------------------------------------
S.MLINewLine >PULLB MLICALL.PARAMS+1
>PULLB MLICALL.PARAMS+2
>PULLB MLICALL.PARAMS+3
>KMLICALL MLINEWLINE
rts
*--------------------------------------
* S.MLIRead
* in :
* PULLB = ref_num
* PULLW = Dest PTR
* PULLW = Bytes To Read
* out :
* Y,A = Bytes Read
*--------------------------------------
S.MLIRead >PULLB MLICALL.PARAMS+1
>PULLW MLICALL.PARAMS+2
>PULLW MLICALL.PARAMS+4
>KMLICALL MLIREAD
bcs .9
>LDYA MLICALL.PARAMS+6
.9 rts
*--------------------------------------
* S.MLIWrite
* in :
* PULLB = ref_num
* PULLW = Dest PTR
* PULLW = Bytes To Read
* out :
* Y,A = Bytes Written
*--------------------------------------
S.MLIWrite >PULLB MLICALL.PARAMS+1
>PULLW MLICALL.PARAMS+2
>PULLW MLICALL.PARAMS+4
>KMLICALL MLIWRITE
bcs .9
>LDYA MLICALL.PARAMS+6
.9 rts
*--------------------------------------
* S.MLIClose
* in :
* A = ref_num
* out :
*--------------------------------------
S.MLICloseA sta MLICALL.PARAMS+1
>KMLICALL MLICLOSE
rts
*--------------------------------------
S.MLIFlushA
S.MLISetMark
S.MLIGetMark
S.MLISetEOF
*--------------------------------------
* S.MLIGetEOF
* in :
* A = ref_num
* out :
* Y,A,X = EOF
*--------------------------------------
S.MLIGetEOFA sta MLICALL.PARAMS+1
>KMLICALL MLIGETEOF
bcs .9
>LDYA MLICALL.PARAMS+2
ldx MLICALL.PARAMS+4
clc
.9 rts
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.MLI
LOAD SYS/KERNEL.S
ASM

154
SYS/KERNEL.S.NET.txt Normal file
View File

@ -0,0 +1,154 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.AddNetCfg
* in :
* PULLB = ProtocolID
* PULLW = PTR to NetCfg Struct
* out :
* A =
* cc,cs
*--------------------------------------
S.AddNetCfg lda NetCfgCnt
cmp #K.NETCFG.MAX
beq .9
asl
sta NetCfgIdx
tax
>PULLB NetCfgTbl,x save PROTOID
>PULLW ZPQuickPtr1
>PUSHWI K.NETCFG.SIZE
>PUSHBI 0
jsr S.GetMem
bcs .99
>STYA ZPQuickPtr2
txa
ldx NetCfgIdx
sta NetCfgTbl+1,x
ldy #K.NETCFG.SIZE
.1 dey
lda (ZPQuickPtr1),y
sta (ZPQuickPtr2),y
tya
bne .1
lda NetCfgCnt
inc NetCfgCnt
clc
rts
.9 >PULLA discard parameters
>PULLA
>PULLA
sec
.99 rts
*--------------------------------------
* S.SetNetCfg
* in :
* PULLB = ProtocolID
* PULLW = PTR to NetConfig
* out :
*--------------------------------------
S.SetNetCfg >PULLA
pha
>PULLW ZPQuickPtr1
pla
ldx NetCfgCnt
beq .9
ldy #0
.1 cmp NetCfgTbl,y
beq .2
iny
iny
dex
bne .1
.9 sec
rts
.2 lda NetCfgTbl+1,y
jsr S.GetMemPtrA
>STYA ZPQuickPtr2
ldy #K.NETCFG.SIZE
.3 dey
lda (ZPQuickPtr1),y
sta (ZPQuickPtr2),y
tya
bne .3
clc
rts
*--------------------------------------
* S.GetNetCfgA
* in :
* A = ProtocolID
* out :
* Y,A = PTR to NetConfig
*--------------------------------------
S.GetNetCfgA ldx NetCfgCnt
beq .9
ldy #0
.1 cmp NetCfgTbl,y
beq .2
iny
iny
dex
bne .1
.9 sec
rts
.2 lda NetCfgTbl+1,y
jsr S.GetMemPtrA
clc
rts
*--------------------------------------
* S.ClrNetCfgA
* in :
* A = ProtocolID
* out :
* cc,cs
*--------------------------------------
S.ClrNetCfgA ldx NetCfgCnt
beq .9
ldy #0
.1 cmp NetCfgTbl,y
beq .2
iny
iny
dex
bne .1
.9 sec
rts
.2 lda NetCfgTbl+1,y
jsr S.FreeMemA X,Y unmodified
cpy #K.NETCFG.MAX*2-2 last slot?
beq .4
.3 lda NetCfgTbl+2,y
sta NetCfgTbl,y
lda NetCfgTbl+3,y
sta NetCfgTbl+1,y
iny
iny
cpy #K.NETCFG.MAX*2-2 last slot?
bne .3
.4 lda #0
sta NetCfgTbl+1,y
sta NetCfgTbl,y
clc
rts
*--------------------------------------
NetCfgCnt .HS 00
NetCfgIdx .BS 1
NetCfgTbl .BS K.NETCFG.MAX*2
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.NET
LOAD SYS/KERNEL.S
ASM

151
SYS/KERNEL.S.RDR.txt Normal file
View File

@ -0,0 +1,151 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.NewBufRdr
* In :
* PULLB = DATA hMem
* PULLB = Delim Char
* PULLW = Size of DATA
* Out :
* A = hMem To newly created BufRdr
*--------------------------------------
S.NewBufRdr >PUSHWI S.BUFRDR.SIZE
>PUSHBI 0 0 = no option
jsr S.GetMem
bcs .98
phx save hMem
>STYA ZPQuickPtr1
ldy #S.BUFRDR.hMEM
>PULLB (ZPQuickPtr1),y
ldy #S.BUFRDR.DELIM
>PULLB (ZPQuickPtr1),y
ldy #S.BUFRDR.LEN+1
>PULLB (ZPQuickPtr1),y
dey
>PULLB (ZPQuickPtr1),y
ldy #S.BUFRDR.IDX
lda #0
sta (ZPQuickPtr1),y
iny
sta (ZPQuickPtr1),y
pla
clc
rts
.98 pha
>PULLA
>PULLYA
pla
.99 rts
*--------------------------------------
* S.BufRdrReadA
* In :
* A = hMem To BufRdr
* Out :
* CC: Y,A = PTR to line (PSTR)
* CS: EOF
*--------------------------------------
S.BufRdrReadA jsr S.GetMemPtrA
>STYA ZPQuickPtr1
ldy #S.BUFRDR.hMEM
jsr S.GetMemPtrA
>STYA ZPQuickPtr2 PTR to DATA
ldy #S.BUFRDR.IDX
lda (ZPQuickPtr1),y
sta ZPQuickPtr3 IDX
clc
adc ZPQuickPtr2 PTR=PTR+IDX
sta ZPQuickPtr2
iny
lda (ZPQuickPtr1),y
sta ZPQuickPtr3+1
adc ZPQuickPtr2+1
sta ZPQuickPtr2+1
ldy #S.BUFRDR.LEN
lda (ZPQuickPtr1),y
sta ZPQuickPtr4
iny
lda (ZPQuickPtr1),y
sta ZPQuickPtr4+1
stz TmpBuffer256
ldy #S.BUFRDR.DELIM
.1 lda ZPQuickPtr4
bne .2
lda ZPQuickPtr4
beq .8
dec ZPQuickPtr4+1
.2 dec ZPQuickPtr4
lda (ZPQuickPtr2)
inc ZPQuickPtr2
bne .3
inc ZPQuickPtr2+1
.3 inc ZPQuickPtr3
bne .4
inc ZPQuickPtr3+1
.4 cmp (ZPQuickPtr1),y DELIM
beq .8
inc TmpBuffer256
beq .8
ldx TmpBuffer256
sta TmpBuffer256,x
bra .1
.8 lda TmpBuffer256
bne .81
sec
rts
.81 ldy #S.BUFRDR.IDX
lda ZPQuickPtr3
sta (ZPQuickPtr1),y
iny
lda ZPQuickPtr3+1
sta (ZPQuickPtr1),y
ldy #S.BUFRDR.LEN
lda ZPQuickPtr4
sta (ZPQuickPtr1),y
iny
lda ZPQuickPtr4+1
sta (ZPQuickPtr1),y
>LDYAI TmpBuffer256
clc
rts
*--------------------------------------
* S.BufRdrCloseA
* In :
* A = hMem To BufRdr
*--------------------------------------
S.BufRdrCloseA pha
jsr S.GetMemPtrA
>STYA S.BUFRDR.hMEM
ldy #S.BUFRDR.hMEM
lda (S.BUFRDR.hMEM),y
jsr S.FreeMemA
pla
jsr S.FreeMemA
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.RDR
LOAD SYS/KERNEL.S
ASM

283
SYS/KERNEL.S.SCR.txt Normal file
View File

@ -0,0 +1,283 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* !!!!!!!! DO NOT USE VCPU16 !!!!!!!!
* !!!!!! DO NOT USE ZPQuickPTRs !!!!!
*--------------------------------------
SYSSCR.BASL .EQ ZPSysScr COUT
SYSSCR.BASLTMP .EQ ZPSysScr+2 Scrolling
SYSSCR.STRPTR .EQ ZPSysScr+4 PPSTR
*--------------------------------------
SYSSCR.BASL0 .EQ $800
*--------------------------------------
* S.SysScrInit
*--------------------------------------
S.SysScrInit stz SYSSCR.CPULOADI
stz SYSSCR.CH
stz SYSSCR.CV
ldx #0
ldy #0
.1 lda SYSSCR.TITLE,y
beq .2
jsr S.SysScrSetCharAtYX
iny
bne .1
.2 lda #$20
jsr S.SysScrSetCharAtYX
iny
cpy #80
bne .2
jsr S.SysScrHOME
lda A2osX.SCREENS
ora #A2osX.SCREENS.S
sta A2osX.SCREENS
lda #A2osX.SCREENS.S
jsr S.ScreenSelectA
clc
rts
*--------------------------------------
S.SysScrCPULoad ldx SYSSCR.CPULOADI
lda SYSSCR.CPULOADC,x
sta SYSSCR.BASL0+38
dec SYSSCR.CPULOADI
bpl .1
lda #3
sta SYSSCR.CPULOADI
.1 rts
*--------------------------------------
* S.SysScrPRCode
* In:
* CC : Prints [OK]
* CS : [$$] at column 36-39
*--------------------------------------
S.SysScrPRCode php save P to keep carry
bcs .1
lda #0 ensure we have ERR=0 if cc
.1 pha
ldy #76 HTAB to 76
sty SYSSCR.CH
lda #"["
jsr S.SysScrCOUTA
pla
pha
bne .2
lda #"O"
jsr S.SysScrCOUTA
lda #"K"
jsr S.SysScrCOUTA
bra .3
.2 jsr S.SysScrPRBYTEA
.3 lda #"]"
jsr S.SysScrCOUTA
pla
plp
rts
*--------------------------------------
S.SysScrPPSTRA jsr S.GetMemPtrA
S.SysScrPPSTR >STYA SYSSCR.STRPTR
lda (SYSSCR.STRPTR)
beq .9
ldy #0
.1 iny
lda (SYSSCR.STRPTR),y
cmp #'\'
bne .7
tya
cmp (SYSSCR.STRPTR)
beq .9
iny
lda (SYSSCR.STRPTR),y
cmp #'n'
bne .7
lda #13
.7 jsr S.SysScrCOUTA
.8 tya
cmp (SYSSCR.STRPTR)
bne .1
.9 >LDYA SYSSCR.STRPTR
rts
*--------------------------------------
S.SysScrPRBYTEA pha
lsr
lsr
lsr
lsr
ora #$B0
cmp #$BA
bcc .1
adc #6
.1 jsr S.SysScrCOUTA
pla
and #$0F
ora #$B0
cmp #$BA
bcc S.SysScrCOUTA
adc #6
*--------------------------------------
S.SysScrCOUTA phx
phy
cmp #13
bne .1
jsr S.SysScrCROUT
ply
plx
rts
.1 ldy SYSSCR.CH
ldx SYSSCR.CV
ora #$80
jsr S.SysScrSetCharAtYX
jsr S.SysScrFSOUT
ply
plx
rts
*--------------------------------------
S.SysScrFSOUT lda SYSSCR.CH
cmp #79
beq S.SysScrCROUT1
inc SYSSCR.CH
rts
*--------------------------------------
S.SysScrCROUT jsr S.SysScrCLREOL
S.SysScrCROUT1 stz SYSSCR.CH
ldx SYSSCR.CV
cpx #23
beq S.SysScrScroll
inc SYSSCR.CV
rts
*--------------------------------------
S.SysScrCLREOL ldx SYSSCR.CV
lda #$A0
ldy SYSSCR.CH
.1 cpy #79
beq .2
jsr S.SysScrSetCharAtYX
iny
bne .1
.2 rts
*--------------------------------------
S.SysScrScroll ldx #1
.1 lda SYSSCR.BASEL,x
sta SYSSCR.BASL
lda SYSSCR.BASEH,x
sta SYSSCR.BASL+1
inx
lda SYSSCR.BASEL,x
sta SYSSCR.BASLTMP
lda SYSSCR.BASEH,x
sta SYSSCR.BASLTMP+1
ldy #39
sta SETWRITEAUX
sta SETREADAUX
.2 lda (SYSSCR.BASLTMP),y
sta (SYSSCR.BASL),y
dey
bpl .2
ldy #39
sta CLRWRITEAUX
sta CLRREADAUX
.3 lda (SYSSCR.BASLTMP),y
sta (SYSSCR.BASL),y
dey
bpl .3
cpx #23
bne .1
ldy #39
lda #$A0
.4 sta SETWRITEAUX
sta (SYSSCR.BASLTMP),y
sta CLRWRITEAUX
sta (SYSSCR.BASLTMP),y
dey
bpl .4
rts
*--------------------------------------
S.SysScrClrLineAtX
lda SYSSCR.BASEL,x
sta SYSSCR.BASL
lda SYSSCR.BASEH,x
sta SYSSCR.BASL+1
lda #$A0
ldy #39
sta SETWRITEAUX
.1 sta (SYSSCR.BASL),y
dey
bpl .1
ldy #39
sta CLRWRITEAUX
.2 sta (SYSSCR.BASL),y
dey
bpl .2
rts
*--------------------------------------
S.SysScrHOME ldx #23
.1 jsr S.SysScrClrLineAtX
dex
bne .1
stz SYSSCR.CH
lda #1
sta SYSSCR.CV
rts
*--------------------------------------
S.SysScrSetCharAtYX
cmp #$40
bcc .1
cmp #$5F
bcs .1
and #$3F
.1 phy
pha
lda SYSSCR.BASEL,x
sta SYSSCR.BASL
lda SYSSCR.BASEH,x
sta SYSSCR.BASL+1
tya
lsr
tay
bcs .2
sta SETWRITEAUX
.2 pla
sta (SYSSCR.BASL),y
sta CLRWRITEAUX
ply
rts
*--------------------------------------
SYSSCR.CH .BS 1
SYSSCR.CV .BS 1
SYSSCR.CPULOADI .BS 1
SYSSCR.CPULOADC .AS -"|\-/"
*--------------------------------------
SYSSCR.TITLE >CSTRING "A2osX System Screen"
SYSSCR.BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0
SYSSCR.BASEH .HS 08.08.09.09.0A.0A.0B.0B.08.08.09.09.0A.0A.0B.0B.08.08.09.09.0A.0A.0B.0B
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.SCR
LOAD SYS/KERNEL.S
ASM

384
SYS/KERNEL.S.STR.txt Normal file
View File

@ -0,0 +1,384 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.NewPStr
* IN:
* PULLW = PTR to buffer
* OUT:
* A = hMem to S (PSTRING)
*--------------------------------------
S.NewPStr >PULLW ZPQuickPtr1
bra S.PStrCpy2
*--------------------------------------
* S.PStrCpyA
* In:
* A = hMem of Src String
* Out:
* A = hMem of Dest String
*--------------------------------------
S.PStrCpyA jsr S.GetMemPtrA
>STYA ZPQuickPtr1
S.PStrCpy2 lda (ZPQuickPtr1)
inc
tay
lda #0 Y,A = len of new string
>PUSHYA
>PUSHA 0 = no option
jsr S.GetMem
bcs .9
phx
>STYA ZPQuickPtr2
lda (ZPQuickPtr1)
sta (ZPQuickPtr2)
tay
beq .2
.1 lda (ZPQuickPtr1),y
sta (ZPQuickPtr2),y
dey
bne .1
.2 pla
clc
rts
.9 sec
rts
*--------------------------------------
* S.PStrCat
* IN:
* PULLB = hMem to S1 (PSTRING)
* PULLB = hMem to S2 (PSTRING)
* OUT:
* A = hMem to S1+S2 (PSTRING)
*--------------------------------------
S.PStrCat >PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr1 save S1
>PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr2 save S2
lda (ZPQuickPtr1) Compute length of new path = S1 + S2 + 1
sec
adc (ZPQuickPtr2)
tay
lda #0 Y,A = len of new string
>PUSHYA
>PUSHA 0 = no option
jsr S.GetMem
bcs .9 OOM error
>STYA ZPQuickPtr3
phx save New hMem
lda (ZPQuickPtr1)
tax
ldy #0
.2 iny
lda (ZPQuickPtr1),y
sta (ZPQuickPtr3),y
dex
bne .2
lda (ZPQuickPtr2)
tax
.3 inc ZPQuickPtr2
bne .4
inc ZPQuickPtr2+1
.4 iny
lda (ZPQuickPtr2)
sta (ZPQuickPtr3),y
dex
bne .3
tya
sta (ZPQuickPtr3)
pla returns A = new hMem
clc
rts
.9 sec
rts
*--------------------------------------
* S.PStrCmp
* IN:
* PULLB = hMem to S1 (PSTRING)
* PULLB = hMem to S2 (PSTRING)
* OUT:
* cc or cs
*--------------------------------------
S.PStrCmp >PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr1 save S1
>PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr2 save S2
lda (ZPQuickPtr1)
tay
cmp (ZPQuickPtr2)
bne .9
.1 lda (ZPQuickPtr1),y
cmp (ZPQuickPtr2),y
bne .9
dey
bne .1
clc
rts
.9 sec
rts
*--------------------------------------
* S.PStrMatch
* IN:
* PULLB = hMem to String (PSTRING)
* PULLB = hMem to Pattern (PSTRING)
* OUT:
* cc = match
* cs = no match
*--------------------------------------
S.PStrMatch >PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr2 save String
>PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr1 save Pattern
bra S.PStrMatch1
S.PStrMatchP >PULLW ZPQuickPtr2 pull String
>PULLW ZPQuickPtr1 pull Pattern
S.PStrMatch1 lda (ZPQuickPTR1) Keep Pattern Length in X
tax
beq .8 Match always if empty
ldy #0
.1 inc ZPQuickPTR1 Make PTR1 advance to next char
bne .2
inc ZPQuickPTR1+1
.2 lda (ZPQuickPTR1) get pattern char
cmp #'*'
beq .5
.3 tya we must match ? or regular char
cmp (ZPQuickPTR2) check if at end of string
beq .9 yes, no char left, exit with error
iny advance to next char to compare
lda (ZPQuickPTR1) get back pattern char
cmp #'?'
beq .4 no need to compare, any char will match
cmp (ZPQuickPTR2),y Regular Char, compare with string at Y
bne .9 no match, exit
.4 dex char matched, check if end of pattern
bne .1 continue if remaining char in pattern
tya end of pattern, but end of string ?
cmp (ZPQuickPTR2) end of string ?
beq .8 yes, string matched entirely
bra .9 no, remaining char in string, no match
.5 dex we have '*', last char of pattern ?
beq .8 yes, match everything, including empty string
inc ZPQuickPTR1 Make PTR1 advance to next char
bne .6
inc ZPQuickPTR1+1
.6 lda (ZPQuickPTR1) get next char of pattern
cmp #'*' another '*' ?
beq .5 yes, '**' = '*', go next char
cmp #'?' '*?' ??? we must match a least one char
beq .3
.7 tya we need at least one remaining char in string,
cmp (ZPQuickPTR2) check if at end of string
beq .9 no chance to match ? or regular char
iny
lda (ZPQuickPTR1) get again char in pattern
cmp (ZPQuickPTR2),y compare with char in string
bne .7 not equal to next non wildcard in pattern
bra .4 go check remaining char in pattern...
.8 clc
rts
.9 sec
rts
*--------------------------------------
* S.PStrGetTkn
* IN:
* PULLB = Token IDX
* 0: "Split mode": first token + remaining
* !0: "Std Mode": Return token #
* PULLB = SEP char
* PULLB = hMem to PSTRING
* OUT:
* A = hMem to Token (PSTRING)
* X = hMem to Remaining String After Token "Split Mode"
*--------------------------------------
S.PStrGetTkn >PULLA Get IDX
sta ZPQuickPtr2+1
>PULLA Get SEP
sta ZPQuickPtr2
>PULLA Get PStr
jsr S.GetMemPtrA
>STYA ZPQuickPtr1
ldx #0 init token count to 0
ldy #0
stz ZPQuickPtr3 init INTOKEN start to 0
.1 iny
lda (ZPQuickPtr1),y
and #$7F
cmp ZPQuickPtr2 char=SEP ?
bne .3 no, start a new token if not alredy in
lda ZPQuickPtr3 SEP:in INTOKEN ?
beq .4 no, skip this SEP
inx yes, increase token count
lda ZPQuickPtr2+1 requested token=0 ?
beq .71 yes, we are in "split mode"
cpx ZPQuickPtr2+1 no,is current X=requested IDX?
beq .71
stz ZPQuickPtr3 reset in INTOKEN start
bra .4
.3 lda ZPQuickPtr3 char:already INTOKEN ?
bne .4 yes, keep existing start index
sty ZPQuickPtr3 mark begining of token
.4 tya
cmp (ZPQuickPtr1) end of string ?
bne .1 no, get next one
lda ZPQuickPtr3 INTOKEN?
beq .6
inx yes, last one is ending with string
.6 lda ZPQuickPtr2+1 split mode ?
beq .7
cpx ZPQuickPtr2+1 is token = requested?
beq .7
sec End of String reached, no matching token
.61 rts
.71 dey move back yo end of token before this SEP
.7 sty ZPQuickPtr3+1 we have matching token (or 1st one in split mode) at [ZPQuickPtr3,ZPQuickPtr3+1]
tya compute token len=Y-ZPQuickPtr3+1
sec
sbc ZPQuickPtr3
inc +1
inc +1 for string len
tay
lda #0
>PUSHYA Get a hMem for this token
>PUSHA 0 = no option
jsr S.GetMem
bcs .61
phx save hMem
>STYA ZPQuickPtr4
lda ZPQuickPtr3+1
sec
sbc ZPQuickPtr3
inc
sta (ZPQuickPtr4) set this string length
ldy ZPQuickPtr3
dey
.8 iny
inc ZPQuickPtr4
bne .9
inc ZPQuickPtr4+1
.9 lda (ZPQuickPtr1),y
sta (ZPQuickPtr4)
cpy ZPQuickPtr3+1
bne .8
lda ZPQuickPtr2+1 requested token=0 ?
bne .87
tya yes, we are in "split mode"
cmp (ZPQuickPtr1) Remaining chars ?
beq .87
.10 iny move to next char
lda (ZPQuickPtr1),y
cmp ZPQuickPtr2 char=SEP?
bne .11
tya
cmp (ZPQuickPtr1) last one ?
bne .10
bra .87 yes, nothing to return
.11 sty ZPQuickPtr3+1 ZPQuickPtr3+1=1st non SEP char
lda (ZPQuickPtr1) compute reamining len=Y-ZPQuickPtr3+1
sec
sbc ZPQuickPtr3+1
inc
inc +1 for string len
tay
lda #0
>PUSHYA Get a hMem for remaining string
>PUSHA 0 = no option
jsr S.GetMem
bcs .98
phx save hMem
>STYA ZPQuickPtr4
lda (ZPQuickPtr1)
sec
sbc ZPQuickPtr3+1
inc
sta (ZPQuickPtr4)
ldy ZPQuickPtr3+1
dey
.12 iny
inc ZPQuickPtr4
bne .13
inc ZPQuickPtr4+1
.13 lda (ZPQuickPtr1),y
sta (ZPQuickPtr4)
tya
cmp (ZPQuickPtr1)
bne .12
plx get back remaining string hMem
pla get back token hMem
clc
rts
.87 ldx #0 Splitmode but no remaining string to return
pla get back token hMem
clc
rts
.98 pla get back Token hMem
jsr S.FreeMemA discard Token
.99 sec
rts
*--------------------------------------
* S.GetPStrIndex
* in :
* PULLW = String Table (Array Of PSTR)
* PULLW = String To Search (PSTR)
* out :
* CC: A = String Index In Table
*--------------------------------------
S.GetPStrIndex >PULLW ZPQuickPtr1
>PULLW ZPQuickPtr2
ldx #0
.1 lda (ZPQuickPtr1)
beq .99
cmp (ZPQuickPtr2)
bne .3
tay
.2 lda (ZPQuickPtr1),y
eor (ZPQuickPtr2),y
and #$7F
bne .3
dey
bne .2
txa
clc
rts
.3 inx
lda (ZPQuickPtr1)
sec
adc ZPQuickPtr1
sta ZPQuickPtr1
bcc .1
inc ZPQuickPtr1+1
bra .1
.99 lda #SYSMGR.ERRSYN
sec
rts
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.STR
LOAD SYS/KERNEL.S
ASM

544
SYS/KERNEL.S.TSK.txt Normal file
View File

@ -0,0 +1,544 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.TskMgrInit
*--------------------------------------
S.TskMgrInit stz TSKMGR.LASTID
>LDYAI TSKMGR.TABLE
>STYA TSKMGR.TSKPTR
ldx #K.PS.MAX
.1 lda #0
ldy #S.PS.SIZE-1
.2 sta (TSKMGR.TSKPTR),y
dey
bpl .2
lda TSKMGR.TSKPTR
clc
adc #S.PS.SIZE
sta TSKMGR.TSKPTR
bcc .3
inc TSKMGR.TSKPTR+1
.3 dex
bne .1
>LDYAI TSKMGR.TABLE Make PS #0 as current process
>STYA TSKMGR.TSKPTR
jsr S.CreateEnv
bcs .9
ldy #S.PS.hENV
sta TSKMGR.TABLE,y
>LDYAI TmpBuffer256
jsr S.MLIGetPrefix
bcs .9
>PUSHWI TmpBuffer256
jsr S.NewPStr
bcs .9
ldy #S.PS.hPREFIX
sta TSKMGR.TABLE,y
>PUSHWI TmpBuffer256 push ENV value
>PUSHWI ENV.A2osX push ENV name
ldy #S.PS.hENV
lda TSKMGR.TABLE,y
>PUSHA
jsr S.SetEnvVarP
rts
.9 sec
rts
*--------------------------------------
* S.TskMgrRun
*--------------------------------------
S.TskMgrRun >LDYAI TSKMGR.TABLE+S.PS.SIZE
>STYA TSKMGR.TSKPTR
lda #K.PS.MAX-1 Skip PS #0
sta TSKMGR.COUNT
.1 lda (TSKMGR.TSKPTR) get S.PS.F
and #S.PS.F.INUSE In use ?
beq .5
lda (TSKMGR.TSKPTR) get S.PS.F
and #S.PS.F.HOLD Waiting for Another Task to Terminate?
beq .3
ldy #S.PS.CID
lda (TSKMGR.TSKPTR),y
jsr S.IsPSRunningA
bcc .5 yes, running....
lda (TSKMGR.TSKPTR) get S.PS.F
and #$FF^S.PS.F.HOLD unmark as HOLD
sta (TSKMGR.TSKPTR)
.3 ldy #S.PS.hCS
lda (TSKMGR.TSKPTR),y
jsr S.GetMemPtrA Y,A = CS
pha
tya get CS LO
ldy #S.PS.PC
clc
adc (TSKMGR.TSKPTR),y
sta Kernel.JMP
iny
pla
adc (TSKMGR.TSKPTR),y
sta Kernel.JMP+1
lda #0 Don't forget to reset S.PC
sta (TSKMGR.TSKPTR),y
dey
sta (TSKMGR.TSKPTR),y
>LDYA TSKMGR.TSKPTR
ldx #TSKMGR.RUN
jsr Kernel.BINCALL Call RUN function
bcc .5 RUN said CS=QUIT?
ldy #S.PS.hCS
lda (TSKMGR.TSKPTR),y
jsr S.GetMemPtrA Y,A = CS
>STYA Kernel.JMP
>LDYA TSKMGR.TSKPTR
ldx #TSKMGR.QUIT yes, quit this process
jsr Kernel.BINCALL Call QUIT function
ldy #S.PS.ID
lda (TSKMGR.TSKPTR),y
jsr S.FreeProcessA
bcs .99
.5 lda TSKMGR.TSKPTR
clc
adc #S.PS.SIZE
sta TSKMGR.TSKPTR
bcc .6
inc TSKMGR.TSKPTR+1
.6 dec TSKMGR.COUNT
bne .1
clc
rts
.99 bra *
*--------------------------------------
* S.DispatchEvent
* IN:
* PULLW = Event
* OUT:
* CS: Not Dispatched
* CC: Event Cleared
*--------------------------------------
S.DispatchEvent >LDYAI TSKMGR.TABLE+S.PS.SIZE
>STYA TSKMGR.TSKPTR
lda #K.PS.MAX-1
sta TSKMGR.COUNT
.1 lda (TSKMGR.TSKPTR) get S.PS.F
and #S.PS.F.INUSE In use ?
beq .3
lda (TSKMGR.TSKPTR) get S.PS.F
and #S.PS.F.HOLD Waiting for Another Task to Terminate?
bne .3
lda (TSKMGR.TSKPTR) get S.PS.F
and #S.PS.F.EVENT Accept Events ?
beq .3
ldy #S.PS.hCS
lda (TSKMGR.TSKPTR),y
jsr S.GetMemPtrA
>STYA Kernel.JMP
>PUSHW EVTMGR.EVTPTR
>LDYA TSKMGR.TSKPTR
ldx #TSKMGR.DOEVENT
jsr Kernel.BINCALL Call DOEVENT function
bcc .8
.3 lda TSKMGR.TSKPTR
clc
adc #S.PS.SIZE
sta TSKMGR.TSKPTR
bcc .4
inc TSKMGR.TSKPTR+1
.4 dec TSKMGR.COUNT
bne .1
sec
.8 rts
*--------------------------------------
* S.TskMgrQuit
*--------------------------------------
S.TskMgrQuit clc
rts
*--------------------------------------
* PUBLIC
*--------------------------------------
* S.ExecProcessA (Blocking Parent PID)
* in :
* A = hMem To Full Cmd Line
* out :
* A = Child PSID
*--------------------------------------
S.ExecProcessA jsr S.CreateProcessA
bcs .9 terminated, do not set PID as HOLD
ldy #S.PS.CID
sta (TSKMGR.TSKPTR),y
pha Save Child PID
lda (TSKMGR.TSKPTR)
ora #S.PS.F.HOLD
sta (TSKMGR.TSKPTR)
pla Get Back PID
clc
.9 rts
*--------------------------------------
* S.CreateProcessA (Non Blocking)
* in :
* A = hMem To Full Cmd Line
* out :
* A = Child PSID
*--------------------------------------
S.CreateProcessA
pha save CMD line
>LDYAI MSG.NEWPS
jsr S.SysScrPPSTR
ldy #S.PS.ID
lda (TSKMGR.TSKPTR),y
jsr S.CreateChildProcessA
bcs .99
>STYA TSKMGR.pNewPS
pla Get Back CMD Line
jsr S.InitProcessA
bcs .97 Init Failed or exit?
ldy #S.PS.ID
lda (TSKMGR.pNewPS),y
clc
rts
.97 pha save error code
tay error code =0 ?
bne .98 no, init failed
>LDYA TSKMGR.pNewPS
ldx #TSKMGR.QUIT yes, simply call QUIT function
jsr Kernel.BINCALL Call QUIT function
.98 ldy #S.PS.ID
lda (TSKMGR.pNewPS),y
jsr S.FreeProcessA
bra .90
.99 plx Discard CMD Line
pha save error code
.90 pla get back error code
sec
rts
*--------------------------------------
* S.GetPSByIDA
* In :
* A = PID
* Out :
* Y,A = PTR to TSKSLOT
*--------------------------------------
S.GetPSByIDA tax
bne .10
>LDYAI TSKMGR.TABLE
clc
rts
.10 sta ZPQuickPtr1 Store requested PID
lda #K.PS.MAX
sta ZPQuickPtr1+1
>LDYAI TSKMGR.TABLE+S.PS.SIZE
>STYA ZPQuickPtr2
.1 lda (ZPQuickPtr2)
bpl .2
ldy #S.PS.ID
lda (ZPQuickPtr2),y
cmp ZPQuickPtr1
beq .8
.2 dec ZPQuickPtr1+1
beq .9
lda ZPQuickPtr2
clc
adc #S.PS.SIZE
sta ZPQuickPtr2
bcc .1
inc ZPQuickPtr2+1
bra .1
.8 >LDYA ZPQuickPtr2
clc
rts
.9 sec
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
* S.CreateChildProcessA
* in :
* A = Parent PSID
* out :
* X = PSID
* Y,A = PTR to S.PS
* we cannot use ZPQuickPtrs
* because of calling S.PStrCpyA & S.DupEnvA
*--------------------------------------
S.CreateChildProcessA
jsr S.GetPSByIDA
bcs .9
>STYA R.AX
>LDYAI TSKMGR.TABLE+S.PS.SIZE
>STYA R.BX
ldx #K.PS.MAX
.1 lda (R.BX)
bpl .3
lda R.BL
clc
adc #S.PS.SIZE
sta R.BL
bcc .2
inc R.BH
.2 dex
bne .1
lda #TSKMGR.ERROOS
sec
rts
.9 lda #TSKMGR.ERRNSP
sec
rts
.3 lda #S.PS.F.INUSE
sta (R.BX)
ldy #S.PS.ID
lda (R.AX),y
ldy #S.PS.PID
sta (R.BX),y
inc TSKMGR.LASTID
bne .4
inc TSKMGR.LASTID Ensure PSID not 0
.4 lda TSKMGR.LASTID
ldy #S.PS.ID
sta (R.BX),y
lda #0
ldy #S.PS.hCS
.5 sta (R.BX),y Blank Everything in this S.PS
iny
cpy #S.PS.SIZE
bne .5
ldy #S.PS.hPREFIX copy hPREFIX...
lda (R.AX),y
jsr S.PStrCpyA
bcs .99
ldy #S.PS.hPREFIX
sta (R.BX),y
ldy #S.PS.hENV ...and hENV from parent PS
lda (R.AX),y
jsr S.DupEnvA
bcs .99
ldy #S.PS.hENV
sta (R.BX),y
ldy #S.PS.hINDEV
lda (R.AX),y
sta (R.BX),y
ldy #S.PS.hOUTDEV
lda (R.AX),y
sta (R.BX),y
ldy #S.PS.hERRDEV
lda (R.AX),y
sta (R.BX),y
ldy #S.PS.ID
lda (R.BX),y
tax Exit with X=PSID
>LDYA R.BX And Y,A=S.PS
clc
rts
.99 sec
rts
*--------------------------------------
* S.InitProcessA
* In :
* A = hMem To Full Cmd Line
*--------------------------------------
* LS(2)
* 0 : hMem to ENVPATH value
* 1 : hMem to FULLPATH value
*--------------------------------------
S.InitProcessA >ADDLOCAL 2
>PUSHA Push Cmd Line
>PUSHBI $20 Push SEP=' '
>PUSHBI 0 Push 0 for getting CMD And ARGS
jsr S.PStrGetTkn
bcs .99 OOM error
ldy #S.PS.hCMD
sta (TSKMGR.pNewPS),y
>PUSHA push CMD for S.FileSearch
txa
ldy #S.PS.hARGS
sta (TSKMGR.pNewPS),y set ARGS hMem (0 if none)
>PUSHWI ENV.PATH push ENVNAME=PATH
ldy #S.PS.hENV
lda (TSKMGR.pNewPS),y
>PUSHA
jsr S.GetEnvVarP get value for ENV=PATH
bcs .99
>STAL 0 save VALUE hMem for discard
>PUSHA A=PStr to ENV Value
jsr S.FileSearch find File in %PATH%
bcs .98
>STAL 1 save FULLPATH hMem for discard
pha
jsr S.SysScrPPSTRA
pla
jsr S.LoadBinA A = BinPath hMem
bcs .97
>STYA Kernel.JMP save PTR to Code Segment
txa
ldy #S.PS.hCS
sta (TSKMGR.pNewPS),y save CS hMem in TSKSLOT
>LDYA TSKMGR.pNewPS
ldx #TSKMGR.INIT
jsr Kernel.BINCALL Call INIT function
bcs .97
jsr .97
clc
rts
.97 pha save ERR
>LDAL 1
jsr S.FreeMemA
pla
.98 pha save ERR
>LDAL 0
jsr S.FreeMemA
pla
.99 >REMLOCAL 2
sec
rts
*--------------------------------------
* S.QuitProcessA
* In : A = PID to Quit (call TSKMGR.QUIT)
*--------------------------------------
S.QuitProcessA jsr S.GetPSByIDA
bcs .9
>STYA ZPQuickPtr1
ldy #S.PS.hCS
lda (ZPQuickPtr1),y
jsr S.GetMemPtrA
>STYA Kernel.JMP
>LDYA ZPQuickPtr1
ldx #TSKMGR.QUIT
jsr Kernel.BINCALL Call QUIT function
clc
rts
.9 bra *
*--------------------------------------
* S.FreeProcessA
* In : A = PID to free
*--------------------------------------
S.FreeProcessA jsr S.GetPSByIDA
bcs .9
>STYA ZPQuickPtr1
ldy #S.PS.hARGS
lda (ZPQuickPtr1),y
beq .1
jsr S.FreeMemA
.1 ldy #S.PS.hCMD
lda (ZPQuickPtr1),y
beq .2
jsr S.FreeMemA
.2 ldy #S.PS.hENV
lda (ZPQuickPtr1),y
beq .3
jsr S.FreeMemA
.3 ldy #S.PS.hPREFIX
lda (ZPQuickPtr1),y
beq .4
jsr S.FreeMemA
.4 ldy #S.PS.hDS
lda (ZPQuickPtr1),y
beq .5
jsr S.FreeMemA
.5 ldy #S.PS.hCS
lda (ZPQuickPtr1),y
beq .8
jsr S.FreeMemA
.8 lda #0
sta (ZPQuickPtr1) Mark TSKSLOT as free
clc
rts
.9 bra *
*--------------------------------------
* S.IsPSRunningA
* In :
* A = PID
* Out :
* CC = Running
* CS = no PS
*--------------------------------------
S.IsPSRunningA pha save PID
ldx #K.PS.MAX
>LDYAI TSKMGR.TABLE+S.PS.SIZE
>STYA ZPQuickPtr1
.1 lda (ZPQuickPtr1)
bpl .2
ldy #S.PS.ID
pla
pha
cmp (ZPQuickPtr1),y
beq .8
lda ZPQuickPtr1
clc
adc #S.PS.SIZE
sta ZPQuickPtr1
bcc .2
inc ZPQuickPtr2+1
.2 dex
bne .1
pla
sec
rts
.8 pla
clc
rts
*--------------------------------------
TSKMGR.COUNT .BS 1
TSKMGR.LASTID .BS 1
*--------------------------------------
MSG.NEWPS >PSTRING "\nTskMgr:"
MAN
SAVE SYS/KERNEL.S.TSK
LOAD SYS/KERNEL.S
ASM

541
SYS/KERNEL.S.txt Normal file
View File

@ -0,0 +1,541 @@
PR#3
PREFIX /DATA/A2osX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $E000
.TF SYS/KERNEL
*--------------------------------------
.INB INC/MACROS.I
.INB INC/KERNEL.I
.INB INC/A2OSX.I
.INB INC/IO.I
.INB INC/PRODOS.I
*--------------------------------------
KERNEL.BOOT jmp S.Kernel
*--------------------------------------
KERNEL.SYSCALL jmp (.1,x)
*--------------------------------------
.1 .DA S.GetMem $00
.DA S.FreeMemA
.DA S.ClrMemA
.DA S.GetMemPtrA
.DA S.GetMemLenA
.DA S.GetMemByIDA
.DA S.GetMemByNameA
.DA 0
*--------------------------------------
.DA S.NewPStr $10
.DA S.PStrCpyA
.DA S.PStrCat
.DA S.PStrCmp
.DA S.PStrGetTkn
.DA S.GetPStrIndex
.DA 0
.DA 0
*--------------------------------------
.DA S.LoadBinA $20
.DA S.LoadLib
.DA S.UnloadLibA
.DA S.LoadDrvA
.DA 0
.DA 0
.DA 0
.DA 0
*--------------------------------------
.DA S.ExpandPStrA $30
.DA S.ExpandPStr
.DA S.GetEnvVarH
.DA S.GetEnvVarP
.DA S.SetEnvVarH
.DA S.SetEnvVarP
.DA 0
.DA 0
*--------------------------------------
.DA S.MLICreate $40
.DA S.MLIDestroy
.DA S.MLIRename
.DA S.MLISetFileInfo
.DA S.MLIGetFileInfoA
.DA S.MLIOnline
.DA S.MLISetPrefix
.DA S.MLIGetPrefixA
.DA S.MLIOpenA $50
.DA S.MLINewLine
.DA S.MLIRead
.DA S.MLIWrite
.DA S.MLICloseA
.DA S.MLIFlushA
.DA S.MLISetMark
.DA S.MLIGetMark
.DA S.MLISetEOF $60
.DA S.MLIGetEOFA
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
*--------------------------------------
.DA S.GetDevByIDA $70
.DA S.GetDevByNameA
.DA S.GetDevTable
.DA S.GetDevInfoA
.DA S.DevOutA
.DA 0
.DA 0
.DA 0
*--------------------------------------
.DA S.GetEvent $80
.DA S.DestroyEvent
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
.DA 0
*--------------------------------------
.DA S.ExecProcessA $90
.DA S.CreateProcessA
.DA 0
.DA 0
.DA S.GetPSByIDA
.DA 0
.DA 0
.DA 0
*--------------------------------------
.DA S.CheckPrefixA $A0
.DA S.FileSearch
.DA S.LoadFileA
.DA S.ListDirInitA
.DA S.ListDirNextA
.DA S.ListDirCloseA
.DA 0
.DA 0
*--------------------------------------
.DA S.AddNetCfg $B0
.DA S.SetNetCfg
.DA S.GetNetCfgA
.DA S.ClrNetCfgA
.DA 0
.DA 0
.DA 0
.DA 0
*--------------------------------------
S.Kernel jsr S.KernelInit
jsr S.KernelRun
jsr S.KernelQuit
bra *
*--------------------------------------
S.KernelInit >LDYAI D.STACKSEG
>STYA R.SP init Soft Stack
>STYA R.LS init LS
stz A2osX.SCREENS
stz A2osX.ACTIVESCRN
jsr S.SysScrInit
>LDYAI MSG.INIT0
jsr S.SysScrPPSTR
>LDYAI MSG.INIT1
jsr S.SysScrPPSTR
jsr S.MemMgrInit
jsr S.SysScrPRCode
bcs .1
>LDYAI MSG.INIT2
jsr S.SysScrPPSTR
jsr S.TskMgrInit
jsr S.SysScrPRCode
.1 bcs .2
>LDYAI MSG.INIT3
jsr S.SysScrPPSTR
jsr S.DevMgrInit
jsr S.SysScrPRCode
.2 bcs .3
>LDYAI MSG.INIT4
jsr S.SysScrPPSTR
jsr S.EvtMgrInit
jsr S.SysScrPRCode
.3 bcs .99
>LDYAI MSG.INIT5
jsr S.SysScrPPSTR
>PUSHWI STARTUP.FILE Build A2osX.STARTUP full path...
jsr S.NewPStr
pha save for discard
>PUSHA
>PUSHWI ENV.A2osX get KRNL root path
ldy #S.PS.hENV
lda TSKMGR.TABLE,y
>PUSHA
jsr S.GetEnvVarP
pha save for discard
>PUSHA
jsr S.PStrCat
pha save for discard
jsr S.ExecFileA
bcs .99
pla
jsr S.FreeMemA
pla
jsr S.FreeMemA
pla
jsr S.FreeMemA
>LDYAI MSG.INIT6
jsr S.SysScrPPSTR
jsr S.PrintSysEnv
.99 rts
*--------------------------------------
S.KernelRun jsr S.TskMgrRun
bcs .98
jsr S.SysScrCPULoad
jsr S.GetEvent
bcs S.KernelRun CS=no event
jsr S.DispatchEvent
bcc S.KernelRun CC=Event Dispatched
lda (EVTMGR.EVTPTR)
and #S.EVT.F.TIMER Discard any TIMER event
beq .1
jsr S.DestroyEvent
bra S.KernelRun
.1 lda (EVTMGR.EVTPTR)
and #S.EVT.F.KEY any special key?
beq .99
ldy #S.EVT.DATAHI Open-Apple?
lda (EVTMGR.EVTPTR),y
bpl .99
ldy #S.EVT.DATALO
lda (EVTMGR.EVTPTR),y
cmp #$31
bne .2
lda #A2osX.SCREENS.S
jsr S.ScreenSelectA
bra .8
.2 cmp #$32
bne .3
lda #A2osX.SCREENS.C
jsr S.ScreenSelectA
bra .8
.3 cmp #$33
bne .8
lda #A2osX.SCREENS.G
jsr S.ScreenSelectA
.8 jsr S.DestroyEvent
bra S.KernelRun
.98 lda #A2osX.SCREENS.S
jsr S.ScreenSelectA
>LDYAI MSG.KRNLPANIC
jsr S.SysScrPPSTR
bra *
.99 >LDYAI MSG.EVNTPANIC
jsr S.SysScrPPSTR
lda (EVTMGR.EVTPTR)
jsr S.SysScrPRBYTEA
ldy #S.EVT.hDEV
lda (EVTMGR.EVTPTR),y
jsr S.SysScrPRBYTEA
ldy #S.EVT.DATALO
lda (EVTMGR.EVTPTR),y
jsr S.SysScrPRBYTEA
ldy #S.EVT.DATAHI
lda (EVTMGR.EVTPTR),y
jsr S.SysScrPRBYTEA
lda #'.'
jsr S.SysScrCOUTA
ldy #S.EVT.DATAW1
lda (EVTMGR.EVTPTR),y
jsr S.SysScrPRBYTEA
iny
lda (EVTMGR.EVTPTR),y
jsr S.SysScrPRBYTEA
lda #'.'
jsr S.SysScrCOUTA
ldy #S.EVT.DATAW2
lda (EVTMGR.EVTPTR),y
jsr S.SysScrPRBYTEA
iny
lda (EVTMGR.EVTPTR),y
jsr S.SysScrPRBYTEA
jsr S.DestroyEvent
jmp S.KernelRun
*--------------------------------------
S.KernelQuit clc
rts
*--------------------------------------
* PUBLIC
*--------------------------------------
* S.ScreenSelectA
* IN :
* A = Screen to display
*--------------------------------------
S.ScreenSelectA and A2osX.SCREENS Screen is available ?
beq .9 ...not setup up
cmp #A2osX.SCREENS.S
bne .1
sta SETTEXT
sta SET80DISP
sta CLR80STORE
sta SETPAGE2
sta SETALTCHAR
lda #A2osX.SCREENS.S
bra .8
.1 cmp #A2osX.SCREENS.C
bne .2
sta SETTEXT
sta SET80DISP
sta SET80STORE
sta CLRPAGE2
sta SETALTCHAR
lda #A2osX.SCREENS.C
bra .8
.2 cmp #A2osX.SCREENS.G
bne .9
sta CLRMIXED
sta SETHIRES
sta CLRTEXT
sta SETIOUDIS
sta CLR80DISP
sta SETDHIRES
sta CLRDHIRES
sta SETDHIRES
sta CLRDHIRES
sta SET80DISP
sta SETDHIRES
sta CLRDHIRES
sta SETDHIRES
lda #A2osX.SCREENS.G
.8 sta A2osX.ACTIVESCRN
.9 rts
*--------------------------------------
* S.ExecFileA (R)
* in :
* A = hMem of FilePath (PSTRING)
* out :
*--------------------------------------
* LS : (8)
* 0 = hMem of Loaded File
* 2 = PTR to File data
* 4 = Data Len
* 6 = CMD hMem
* 7 = ARGS hMem
*--------------------------------------
S.ExecFileA jsr S.LoadFileA
bcc S.ExecFileAOK
rts
S.ExecFileAOK >ADDLOCAL 8
>STYAL 4 Store File Length
txa
>STAL 0 hMem of Loaded File
jsr S.GetMemPtrA
>STYAL 2
.1 stz TmpBuffer256
.2 >LDYAL 2
>STYA ZPQuickPtr1
>INCLW 2
>DECLW 4
lda (ZPQuickPtr1)
cmp #$0D
beq .3
inc TmpBuffer256
ldx TmpBuffer256
sta TmpBuffer256,x
>LDAL 4
bne .2
>LDAL 5
bne .2
.3 lda TmpBuffer256
beq .4
lda TmpBuffer256+1
cmp #'*'
beq .4
lda #'-'
jsr S.SysScrCOUTA
lda #'>'
jsr S.SysScrCOUTA
>LDYAI TmpBuffer256
jsr S.SysScrPPSTR
>PUSHWI TmpBuffer256
jsr S.NewPStr
bcs .99
pha
jsr S.ExecCmdLineA
jsr S.SysScrPRCode
pla
jsr S.FreeMemA
.4 >LDAL 4
.5 bne .6
>LDAL 5
beq .8
.6 jmp .1
.8 jsr .99
clc
rts
.99 >LDAL 0
jsr S.FreeMemA
>REMLOCAL 8
sec
rts
*--------------------------------------
S.ExecCmdLineA >PUSHA
>PUSHBI $20 Push SEP=' '
>PUSHBI 0 Push Token IDX
jsr S.PStrGetTkn
bcs .99
>STAL 6
pha
txa
>STAL 7
pla
jsr S.GetMemPtrA
>PUSHYA
>PUSHWI EXECCMDS
jsr S.GetPStrIndex
bcs .98
asl
tax
>LDAL 7
jsr S.ExecCmdLine
bcs .98
jsr .98
clc
rts
.98 pha
>LDAL 7
jsr S.FreeMemA
>LDAL 6
jsr S.FreeMemA
pla
.99 sec
rts
*--------------------------------------
S.ExecCmdLine jmp (.1,x)
.1 .DA S.SetSysEnvA
.DA S.LoadDrvA VCPU!!!!
.DA S.CreateProcessA VCPU!!!!
*--------------------------------------
S.SetSysEnvA >PUSHA Push Cmd Line
>PUSHBI $3D Push SEP='='
>PUSHBI 0 Push Token IDX
jsr S.PStrGetTkn
bcs *
phx save X,A for discard
pha
pha
txa
>PUSHA
pla
>PUSHA
ldy #S.PS.hENV
lda TSKMGR.TABLE,y
>PUSHA
jsr S.SetEnvVarH
pla disard NAME
jsr S.FreeMemA
pla discard VALUE
jmp S.FreeMemA
*--------------------------------------
S.PrintSysEnv ldy #S.PS.hENV
lda TSKMGR.TABLE,y Get PS #0 ENV
jsr S.GetMemPtrA
>STYA R.AX
.1 lda (R.AX)
beq .8 Ending 0 ?
>LDYA R.AX
jsr S.SysScrPPSTR
jsr S.SysScrCROUT
lda R.AL
sec
adc (R.AX) Add len+1 to PTR
sta R.AL
bcc .1
inc R.AH
bra .1
.8 rts
*--------------------------------------
EXECCMDS >PSTRING "SET"
EXECCMDS1 >PSTRING "LOAD"
EXECCMDS2 >PSTRING "EXEC"
.DA #0
*--------------------------------------
MSG.INIT0 >PSTRING "\nKernel Startup...\n"
MSG.INIT1 >PSTRING "->MemMgr Init"
MSG.INIT2 >PSTRING "->TskMgr Init"
MSG.INIT3 >PSTRING "->DevMgr Init"
MSG.INIT4 >PSTRING "->EvtMgr Init"
MSG.INIT5 >PSTRING "EXEC A2osX.Startup...\n"
MSG.INIT6 >PSTRING "SYS ENV:\n"
MSG.EVNTPANIC >PSTRING "\nEVT:F/hDev/DATA/W1/W2="
MSG.KRNLPANIC >PSTRING "\n\n!!!Kernel Panic!!!"
*--------------------------------------
STARTUP.FILE >PSTRING "A2osX.STARTUP"
*--------------------------------------
ENV.A2osX >PSTRING "A2OSX"
ENV.PATH >PSTRING "PATH"
ENV.DRV >PSTRING "DRV"
ENV.ETC >PSTRING "ETC"
ENV.LIB >PSTRING "LIB"
*--------------------------------------
.INB SYS/KERNEL.S.BIN
.INB SYS/KERNEL.S.DEV
.INB SYS/KERNEL.S.ENV
.INB SYS/KERNEL.S.EVT
.INB SYS/KERNEL.S.FS
.INB SYS/KERNEL.S.MEM
.INB SYS/KERNEL.S.MLI
.INB SYS/KERNEL.S.NET
* .INB SYS/KERNEL.S.RDR
.INB SYS/KERNEL.S.SCR
.INB SYS/KERNEL.S.STR
.INB SYS/KERNEL.S.TSK
*--------------------------------------
MAN
SAVE SYS/KERNEL.S
ASM