home *** CD-ROM | disk | FTP | other *** search
Text File | 2019-04-13 | 296.1 KB | 18,061 lines |
- 17
- acehead.s
- 174
- ;===ace system-interface declarations===
-
- aceStatB = $f00 ;(256)
- aceCallB = $1303 ;(225)
- aceExitData = $700 ;(256)
- aceAppAddress = $7000
-
- zp = $f8 ;(2)
- zw = $fa ;(2)
- mp = $fc ;(4)
- syswork = $80 ;(16)
-
- errno = aceStatB+0 ;(1)
- aceArgc = aceStatB+4 ;(2)
- aceArgv = aceStatB+6 ;(2)
- aceMemTop = aceStatB+8 ;(2)
- aceDirentBuffer = aceStatB+10 ;(aceDirentLength)
- aceDirentBytes = aceDirentBuffer+0 ;(4)
- aceDirentDate = aceDirentBuffer+4 ;(8) = YY:YY:MM:DD:HH:MM:SS:TW
- aceDirentType = aceDirentBuffer+12 ;(4)
- aceDirentFlags = aceDirentBuffer+16 ;(1) = drwx*e-t
- aceDirentUsage = aceDirentBuffer+17 ;(1) = ulshb---
- aceDirentNameLen = aceDirentBuffer+18 ;(1)
- aceDirentName = aceDirentBuffer+19 ;(17)
- aceDirentLength = 36
-
- open = aceCallB+0 ;( (zp)=name, .A=mode[rwaWA] ) : .A=fd
- close = aceCallB+3 ;( .A=fd )
- read = aceCallB+6 ;( .X=fd, (zp)=buf, .AY=len ) : .AY=(zw)=len, .Z
- write = aceCallB+9 ;( .X=fd, (zp)=buf, .AY=len )
- aceFileLseek = aceCallB+12 ;( .X=fd, .A=origin, [sw+0]=pos ) : [sw+0]=newpos
- aceFileRemove = aceCallB+15 ;( (zp)=name )
- aceFileRename = aceCallB+18 ;( (zp)=oldName, (zw)=newName )
- aceFileBload = aceCallB+21 ;( (zp)=name, .AY=loadAddr, (zw)=limit+1):.AY=end+1
- aceFileInfo = aceCallB+24 ;( .X=fd, .A=flags ) : .A=devType, .X=cols, .Y=rows
- aceFileStat = aceCallB+27 ;( (zp)=name, .A=flags ) : direntBuffer
- aceFileIoctl = aceCallB+30 ;( .X=fd, .A=code, ??? )
- aceFileFdswap = aceCallB+33 ;( .X=fd1, .Y=fd2 )
-
- aceDirOpen = aceCallB+36 ;( (zp)=dirName ) : .A=fd
- aceDirClose = aceCallB+39 ;( .A=fd )
- aceDirRead = aceCallB+42 ;( .X=fd ) : direntBuffer, .Z=eof
- aceDirIsdir = aceCallB+45 ;( (zp)=name ) : .A=dev, .X=isDisk, .Y=isDir
- aceDirChange = aceCallB+48 ;( (zp)=dirName, .A=flags($80=home) )
- aceDirMake = aceCallB+51 ;( (zp)=newDirName, .AY=suggestedEntries )
- aceDirRemove = aceCallB+54 ;( (zp)=dirName )
- aceDirName = aceCallB+57 ;( .A=sysdir, (zp)=buf ) : buf, .Y=len
- ; .A:0=curDir, 1=homeDir, 2=execSearchPath,
- ; 3=configSearchPath, 4=tempDir
-
- aceWinMax = aceCallB+60 ;( )
- aceWinCls = aceCallB+63 ;( .A=char/color/attrFlags, .X=char, .Y=color )
- aceWinSet = aceCallB+66 ;( .A=rows, .X=cols, sw+0=scrRow, sw+1=scrCol )
- aceWinSize = aceCallB+69 ;( ) : <above>+ ,(sw+2)=addr,(sw+4)=rowinc
- aceWinPut = aceCallB+72 ;((sw+0)=addr,(sw+2)=charPtr,.A=attr,.Y=color,.X=len
- ; sw+4=fillChar, sw+5=fieldLen, sw+6=extattr )
- aceWinColor = aceCallB+75 ;( .X=screen, .Y=border, .A=which ) : .X=scr, .Y=bor
- aceWinPos = aceCallB+78 ;( .A=row, .X=col ) : (sw+0)=addr
- aceWinCursor = aceCallB+81 ;( (sw+0)=addr, .Y=color, .A=$ff:on/$00:off)
- aceWinScroll = aceCallB+84 ;(.A=attr+$08:up+$04:down,.X=rows,sw+4=chr,.Y=color)
-
- aceConRead = aceCallB+87 ;( (zp)=Buf, .AY=Len ) : .AY=(zw)=Len, .Z
- aceConWrite = aceCallB+90 ;( (zp)=Buf, .AY=Len )
- aceConPutchar = aceCallB+93 ;( .A=char )
- aceConPutlit = aceCallB+96 ;( .A=char )
- aceConPutctrl = aceCallB+99 ;( .A=char, .X=aux )
- aceConColor = aceCallB+102 ;( .A=which, .X=char, .Y=cursor ):.X=char,.Y=cursr
- aceConPalette = aceCallB+105 ;( ) : sw+0...sw+7=palette [8 colors]
- aceConScreen = aceCallB+108 ;( .A=MinRows, .X=MinCols )
- aceConPos = aceCallB+111 ;( .A=row, .X=col )
- aceConGetpos = aceCallB+114 ;( ) : .A=rowOfCursor, .X=colOfCursor
- aceConStopkey = aceCallB+117 ;( ) : .CC=notPressed
- aceConGetkey = aceCallB+120 ;( ) : .A=key
- aceConKeyAvail = aceCallB+123 ;( ) : .CC=keyIsAvailable, .A=keyboardType
- aceConKeyMat = aceCallB+126 ;( (zp)=keymatrixPtr )
- aceConInput = aceCallB+129 ;( (zp)=buf/initstr,.Y=initStrLen):.Y=len,.CS=excp
- aceConChrset = aceCallB+132 ;( (sw+0)=addr,.A=flags,.X=start,.Y=len):.A=flags
- aceConMouse = aceCallB+135 ;( ) : .A=buttons:l/r:128/64, (sw+0)=X, (sw+2)=Y
- aceConJoystick = aceCallB+138 ;( ) : .A=joy1, .X=joy2
-
- aceGrScreen = aceCallB+141 ;( .A=grType, .X=borderColor, .Y=BgFgColor )
- ; : .A=cols8, (sw+0)=rows, .X=xAspect
- aceGrExit = aceCallB+144 ;( )
- aceGrFill = aceCallB+147 ;( .A=fillValue )
- aceGrOp = aceCallB+150 ;( .A=flags, .X=X8, (sw+0)=Y, .Y=cols8, (sw+2)=rows,
- ; (sw+4)=sPtr/val,(sw+6)=dPtr,(sw+8)=mPtr,sw+a=intl8)
-
- aceProcExec = aceCallB+153 ;( (zp)=execName, (zw)=argv,.AY=argCnt,[mp]=saveArea,
- ; .X=flags):.A=exitCode, .X=exitDataLen,[mp]=saveArea
- aceProcExecSub = aceCallB+156 ;( (zp)=execAddr, ...) rest same as aceProcExec
- ; : .A=exitCode, .X=exitDataLen, [mp]=saveArea
- aceProcExit = aceCallB+159 ;( .A=exitCode, .X=exitBufDataLen, exitData )
-
- aceMemZpload = aceCallB+162 ;( [mp]=Source, .X=ZpDest, .Y=Length )
- aceMemZpstore = aceCallB+165 ;( .X=ZpSource, [mp]=Dest, .Y=Length )
- aceMemFetch = aceCallB+168 ;( [mp]=FarSource, (zp)=Ram0Dest, .AY=Length )
- aceMemStash = aceCallB+171 ;( (zp)=Ram0Source, [mp]=FarDest, .AY=length )
- aceMemAlloc = aceCallB+174 ;( .A=PageCount, .X=StartTyp,.Y=EndTyp):[mp]=FarPtr
- aceMemFree = aceCallB+177 ;( [mp]=FarPointer, .A=PageCount )
- aceMemStat = aceCallB+180 ;( .X=zpOff) : .A=procID, [.X+0]=free, [.X+4]=total
-
- aceTimeGetDate = aceCallB+183 ;( (.AY)=dateString ) : dateString
- aceTimeSetDate = aceCallB+186 ;( (.AY)=dateString )
- aceTimeJif = aceCallB+189 ;( .X=zpJifBuf ) : [zJB]=jiffies
-
- aceMiscUtoa = aceCallB+192 ;( $0+X=value32,(sw+0)=buf,.A=minLen):buf,.Y=len
- aceMiscIoPeek = aceCallB+195 ;( (zw)=ioaddr, .Y=offset ) : .A=data
- aceMiscIoPoke = aceCallB+198 ;( (zw)=ioaddr, .Y=offset, .A=data )
- aceMiscCmdOpen = aceCallB+201 ;( (zp)=DevName ) : .A=fd
- aceMiscCmdClose = aceCallB+204 ;( .A=fd )
- aceMiscCmdSend = aceCallB+207 ;( .X=fd, (zp)=cmdString, .Y=cmdLen )
- aceMiscCmdStatus = aceCallB+210 ;( .X=fd, (zp)=statBufPtr):statBuf,.A=statusCode
-
- aceModemCheck = aceCallB+213 ;( ):.AY=outstRecvBytes,.X=outstSendBytes,
- ; .Z=oRecvB==0
- aceModemParms = aceCallB+216 ;( .A=baudrate|format )
- aceModemStat = aceCallB+219 ;( .X=zpStatBuf ):.A=slSt,[zSB+0]=ovrChr,
- ; [zSB+4]=bovfChr
- aceTest = aceCallB+222 ;( (zp)=filename ) : .A=dev#, (zw)=devRelName
-
- aceID1 = $cb
- aceID2 = $06
- aceID3 = 15
-
- aceMemNull = $00
- aceMemREU = $01
- aceMemRL = $02
- aceMemInternal = $03
- aceMemRdREU = $04
- aceMemRdRL = $05
- aceMemRdInternal = $06
-
- aceErrStopped = 0
- aceErrTooManyFiles = 1
- aceErrFileOpen = 2
- aceErrFileNotOpen = 3
- aceErrFileNotFound = 4
- aceErrDeviceNotPresent = 5
- aceErrFileNotInput = 6
- aceErrFileNotOutput = 7
- aceErrMissingFilename = 8
- aceErrIllegalDevice = 9
- aceErrWriteProtect = 26
- aceErrFileExists = 63
- aceErrFileTypeMismatch = 64
- aceErrNoChannel = 70
- aceErrDiskFull = 72
- aceErrInsufficientMemory = 128
- aceErrOpenDirectory = 129
- aceErrDiskOnlyOperation = 131
- aceErrNullPointer = 132
- aceErrInvalidFreeParms = 133
- aceErrFreeNotOwned = 134
- aceErrInvalidWindowParms = 135
- aceErrInvalidConParms = 136
- aceErrInvalidFileMode = 137
- aceErrNotImplemented = 138
- aceErrBloadTruncated = 139
- aceErrPermissionDenied = 140
- aceErrNoGraphicsSpace = 141
- aceErrBadProgFormat = 142
-
- chrBEL = $07 ;bell
- chrTAB = $09 ;tab
- chrBOL = $0a ;beginning of line (return)
- chrCR = $0d ;carriage return (newline)
- chrVT = $11 ;vertical tab (down, linefeed)
- chrBS = $14 ;backspace (del)
- chrCLS = $93 ;clear screen (form feed)
-
- stdin = 0
- stdout = 1
- stderr = 2
- ;===end of ace interface declarations===
- kernhead.s
- 39
- ;===kernel header declarations===
- aceStackPtr = aceMemTop ;(2)
- aceFramePtr = aceStatB+64 ;(2)
- aceStackTop = aceStatB+66 ;(2)
- aceCurrentDevice = aceStatB+68 ;(1)
- aceDate = aceStatB+70 ;(4) YYYY:MM:DD
- aceDOW = aceStatB+74 ;(1) 1-7,1=Sun
- aceProcessID = aceStatB+75 ;(1)
- aceFreeMemory = aceStatB+76 ;(4)
- aceTotalMemory = aceStatB+80 ;(4)
- aceInternalBanks = aceStatB+84 ;(1)
- aceInternalCur = aceStatB+85 ;(1)
- aceRam0Freemap = aceStatB+86 ;(2)
- aceRam1Freemap = aceStatB+88 ;(1)
- aceReuStart = aceStatB+89 ;(1)
- aceReuBanks = aceStatB+90 ;(1)
- aceReuCur = aceStatB+91 ;(1)
- aceRamlinkStart = aceStatB+92 ;(2)
- aceRamlinkBanks = aceStatB+94 ;(1)
- aceRamlinkCur = aceStatB+95 ;(1)
- aceRamlinkAccess = aceStatB+96 ;(1) ;$00=direct, $ff=through ramlink
- aceRestoreStack = aceStatB+101 ;(1)
- aceSoft80Allocated = aceStatB+102 ;(1) ;$ff=yes,$00=no
- aceCharSetPage = aceStatB+103 ;(1)
- aceVic40Page = aceStatB+104 ;(1)
- aceModemSendPage = aceStatB+105 ;(1)
- aceModemRecvPage = aceStatB+106 ;(1)
- aceModemRecvHigh = aceStatB+107 ;(1) ;high page + 1
- aceModemType = aceStatB+108 ;(1) ;$ff=swifty,$40=user-port,$00=none
- aceModemIoPage = aceStatB+109 ;(1)
- aceTpaLimit = aceStatB+110 ;(1)
- aceReuRlSpeedTry = aceStatB+111 ;(1) ;whether reu visible when rl active
- aceReuRlSpeedPage = aceStatB+112 ;(4) ;pointer to reu-rl copying page/null
- aceModemConfig = aceStatB+116 ;(1) ;$0x=baudrate, $x0=bits+parity+stop
- aceCurDirName = aceStatB+$80 ;(128) ;name of current directory
- aceShellPath = $ac6 ;(58) [really want 64] [defunct]
-
- aceMemTypes = 8
- ;===end of kernel header info===
- ace.s
- 1048
- ;ACE-128/64 kernel by Craig Bruce, started 04-Mar-1992.
-
- ;* system zero-page memory usage:
- ;* $02-$7f = application work area
- ;* $80-$8f = system work area
- ;* $f8-$ff = system parameter area
-
- ;* regular RAM0 organization
- ;* $0100-$01ff = processor stack (0.25K)
- ;* $0200-$0eff = system storage (3.25K)
- ;* $0f00-$0fff = kernel-interface variables (0.25K)
- ;* $1000-$12ff = system storage / free on the C64 (0.75K)
- ;* $1300-$5fff = ACE kernel and device drivers (23.25K)
- ;* $7000-$bfff = application area & stack (20K / configurable size)
- ;* $c000-$edff = free memory (11K)
- ;* $ee00-$eeff = modem receive buffer (0.25K / configurable size)
- ;* $ef00-$efff = modem transmit buffer (0.25K)
- ;* $f000-$f7ff = regular character set (2K)
- ;* $f800-$fbff = vic 40-column screen (1K)
- ;* $fc00-$feff = free memory (0.75K)
- ;* $ff00-$ffff = system storage (0.25K)
-
- ;* high-RAM0 organization for C64 with soft-80 screen configured:
- ;* $c000-$c9ff = free memory (2K)
- ;* $ca00-$caff = modem receive buffer (0.25K / configurable size)
- ;* $cb00-$cbff = modem transmit buffer (0.25K)
- ;* $cc00-$cfff = vic 40-column screen (1K)
- ;* $d000-$d7ff = regular character set (2K)
- ;* $d800-$dfff = soft-80 4-bit character set (2K)
- ;* $e000-$ff3f = bitmapped screen (7.81K)
- ;* $ff40-$ffff = system storage (0.19K)
-
- computer = 128
-
- .seq acehead.s
- .seq kernhead.s
- .org $1300
-
- .if computer-64
- .obj "@0:ace128"
- .else
- .obj "@0:ace64"
- .ife
-
- jmp entryPoint
-
- ;***jump table
-
- jmp kernFileOpen
- jmp kernFileClose
- jmp kernFileRead
- jmp kernFileWrite
- jmp kernFileLseek
- jmp kernFileRemove
- jmp kernFileRename
- jmp kernFileBload
- jmp kernFileInfo
- jmp kernFileStat
- jmp kernFileIoctl
- jmp kernFileFdswap
-
- jmp kernDirOpen
- jmp kernDirClose
- jmp kernDirRead
- jmp kernDirIsdir
- jmp kernDirChange
- jmp kernDirMake
- jmp kernDirRemove
- jmp kernDirName
-
- jmp kernWinMax
- jmp kernWinCls
- jmp kernWinSet
- jmp kernWinSize
- jmp kernWinPut
- jmp kernWinColor
- jmp kernWinPos
- jmp kernWinCursor
- jmp kernWinScroll
-
- jmp kernConRead
- jmp kernConWrite
- jmp kernConPutchar
- jmp kernConPutlit
- jmp kernConPutctrl
- jmp kernConColor
- jmp kernConPalette
- jmp kernConScreen
- jmp kernConPos
- jmp kernConGetpos
- jmp kernConStopkey
- jmp kernConGetkey
- jmp kernConKeyAvail
- jmp kernConKeyMat
- jmp kernConInput
- jmp kernConChrset
- jmp kernConMouse
- jmp kernConJoystick
-
- jmp kernGrScreen
- jmp kernGrExit
- jmp kernGrFill
- jmp kernGrOp
-
- jmp kernProcExec
- jmp kernProcExecSub
- jmp kernProcExit
-
- jmp kernMemZpload
- jmp kernMemZpstore
- jmp kernMemFetch
- jmp kernMemStash
- jmp kernMemAlloc
- jmp kernMemFree
- jmp kernMemStat
-
- jmp kernTimeGetDate
- jmp kernTimeSetDate
- jmp kernTimeJif
-
- jmp kernMiscUtoa
- jmp kernMiscIoPeek
- jmp kernMiscIoPoke
- jmp kernMiscCmdOpen
- jmp kernMiscCmdClose
- jmp kernMiscCmdSend
- jmp kernMiscCmdStatus
-
- jmp kernModemCheck
- jmp kernModemParms
- jmp kernModemStat
-
- jmp kernTest
-
- .byte $ff,$fe,$3c,$e2,$fc
-
- ;***global declarations
-
- maxZpUse = $90
- stringBuffer = $400 ;(256 bytes)
- keylineBuf = $500 ;(256 bytes)
- fcbTable1 = $600 ;(256 bytes)
- freemap = $800 ;(256 bytes)
- ram0FreeMap = $900 ;(256 bytes)
- configBuf = $b00 ;(1024 bytes)
-
- .if computer-64
- maxPage = $c0
- bkACE = $0e
- bkApp = $0e
- bkRam0 = $3f
- bkRam0io = $3e
- bkKernel = $00
- bkCharset = $0f
- bkSelect = $ff00
- kernelIrqHandler = $fa65
- kernelBrkHandler = $b003
- kernelNmiHandler = $fa40
- kernelStopHandler = $f66e
- .else
- basicZpSave = $a00 ;("maxZpUse" bytes ($90))
- deviceTable = $1000 ;(256 bytes)
- workbuf = $1100 ;(256 bytes)
- unusedMem1 = $1200 ;unused so far
- maxPage = $d0
- bkSelect = $01
- bkACE = $36
- bkApp = $36
- bkRam0 = $30
- bkRam0io = $35
- bkKernel = $37
- kernelIrqHandler = $ea31
- kernelBrkHandler = $fe66
- kernelNmiHandler = $fe47
- kernelStopHandler = $f6ed
- .ife
-
- vic = $d000
- vdc = $d600
- sid = $d400
- cia1 = $dc00
- cia2 = $dd00
- st = $90
- true = $ff
- false = $00
- chrQuote = $22
-
- fcbCount = 16
- lftable .buf fcbCount
- devtable .buf fcbCount
- satable .buf fcbCount
- eoftable .buf fcbCount
- pidtable .buf fcbCount
- lfnull = $ff
- fcbNull = $ff
- minDisk = 8
- regsave .buf 3
- jiffyCount .buf 4
-
- newlf .buf 1
-
- kernelClall = $ffe7
- kernelSetbnk = $ff68
- kernelSetmsg = $ff90
- kernelReadst = $ffb7
- kernelSetlfs = $ffba
- kernelSetnam = $ffbd
- kernelOpen = $ffc0
- .if computer-64
- kernelClose = $ffc3
- .ife
- kernelChkin = $ffc6
- kernelChkout = $ffc9
- kernelClrchn = $ffcc
- kernelChrin = $ffcf
- kernelChrout = $ffd2
- kernelLoad = $ffd5
- kernelStop = $ffe1
- kernelGetin = $ffe4
- kernelScrorg = $ffed
- kernelSwapper = $ff5f
-
- .if computer-64
- ;128 nothing here
- .else
- ;*** kernel close with pseudo-close for disk command channel for the 64
- kernelClose = *
- bcs +
- jmp $ffc3
- + ldx $98
- - dex
- bmi kernelCloseExit
- cmp $259,x
- bne -
- beq +
- brk
- ;** found entry; copy last entry on top if it
- + ldy $98
- dey
- lda $259,y ;move lfn
- sta $259,x
- lda $263,y ;move dev num
- sta $263,x
- lda $26d,y ;move sec addr
- sta $26d,x
- dec $98
- kernelCloseExit = *
- clc
- rts
- .ife
-
- ;*** entrypoint()
-
- entryPoint = *
- lda #0
- pha
- plp
- lda #bkACE
- sta bkSelect
- jmp main
-
- ;*** startup()
-
- aceBootstrap = *
- php
- sei
- ldx #2
- - lda $00,x
- sta basicZpSave,x
- lda #0
- sta $00,x
- inx
- cpx #maxZpUse
- bcc -
- .if computer-64
- ldx #0
- - lda $c00,x
- sta pageC0Save,x
- inx
- bne -
- .ife
- lda #%01111111
- sta $dc0d
- lda #%01111111
- sta $dd0d
- bit $dc0d
- bit $dd0d
- lda #%00000000
- sta vic+$1a
- lda #<irqHandler
- ldy #>irqHandler
- sta $314
- sty $315
- lda #<brkHandler
- ldy #>brkHandler
- sta $316
- sty $317
- lda #<nmiHandler
- ldy #>nmiHandler
- sta $318
- sty $319
- lda #<stopHandler
- ldy #>stopHandler
- sta $328
- sty $329
- ldx #127
- lda #0
- - sta errno,x
- dex
- bpl -
- lda #$04 ;"a:"
- sta aceCurrentDevice
- lda #0
- jsr kernelSetmsg
- .if computer-64
- lda #0
- ldx #0
- jsr kernelSetbnk
- .ife
- jsr kernelClall
- plp
- rts
-
- aceConfig = *
- lda #0
- ldx bootDevice
- ldy #0
- jsr kernelSetlfs
- lda #6
- ldx #<aceConfigName
- ldy #>aceConfigName
- jsr kernelSetnam
- lda #0
- ldx #<aceAppAddress
- ldy #>aceAppAddress
- jsr kernelLoad
- bcc +
- rts
- + lda #<configBuf
- ldy #>configBuf
- sta 2
- sty 3
- lda #<aceStartupMsg
- ldy #>aceStartupMsg
- sta 4
- sty 5
- lda #<ram0FreeMap
- ldy #>ram0FreeMap
- sta 6
- sty 7
- ldx #>aceBssEnd
- lda #<aceBssEnd
- beq +
- inx
- + stx 8
- .if computer-64
- lda #128
- .else
- lda #64
- .ife
- sta 9
- lda #<charset4bit
- ldy #>charset4bit
- sta 10
- sty 11
- lda #<conKeymapNormal
- ldy #>conKeymapNormal
- sta 12
- sty 13
- jsr aceAppAddress
- rts
- aceConfigName = *
- .asc "config"
-
- aceStartup = *
- ldx #fcbCount-1
- lda #lfnull
- - sta lftable,x
- dex
- bpl -
- lda #0
- sta newlf
- jsr initStack
- lda aceCurrentDevice
- lsr
- lsr
- ora #$40
- sta aceCurDirName+0
- lda #":"
- sta aceCurDirName+1
- lda #0
- sta aceCurDirName+2
- ldx #57
- - lda configBuf+$140,x
- sta aceShellPath,x
- dex
- bpl -
- lda #1
- sta aceProcessID
- rts
-
- initStack = *
- lda #0
- ldy aceTpaLimit
- sta aceStackTop+0
- sty aceStackTop+1
- sta aceMemTop+0
- sty aceMemTop+1
- sta aceFramePtr+0
- sty aceFramePtr+1
- rts
-
- ;*** shutdown()
-
- aceShutdown = *
- lda #bkACE
- sta bkSelect
- ldx #2
- - lda basicZpSave,x
- sta $00,x
- inx
- cpx #maxZpUse
- bcc -
- .if computer-64
- ldx #0
- - lda pageC0Save,x
- sta $c00,x
- inx
- bne -
- .ife
- php
- sei
- lda #<kernelIrqHandler
- ldy #>kernelIrqHandler
- sta $314
- sty $315
- lda #<kernelBrkHandler
- ldy #>kernelBrkHandler
- sta $316
- sty $317
- lda #<kernelNmiHandler
- ldy #>kernelNmiHandler
- sta $318
- sty $319
- lda #<kernelStopHandler
- ldy #>kernelStopHandler
- sta $328
- sty $329
- .if computer-64
- lda #%01111111
- sta $dc0d
- lda #%01111111
- sta $dd0d
- bit $dc0d
- bit $dd0d
- lda #%00000001
- sta vic+$1a
- .else
- lda #%10000001
- sta $dc0d
- lda #%01111111
- sta $dd0d
- bit $dc0d
- bit $dd0d
- lda #%00000000
- sta vic+$1a
- .ife
- plp
- rts
-
- aceShutdownBasic = *
- bit exitScr
- bpl shutBasicScrDone
- ;** shut down the screens
- .if computer-64
- jsr vdcShutdown
- jsr vicShutdown
- lda textMode
- eor $d7
- bpl +
- jsr kernelSwapper
- + nop
- .else
- lda #25
- ldx #40
- ;xx check config for screen
- jsr conScreen
- jsr vicShutdown
- .ife
- ldx #0
- lda #$20
- - sta $400+000,x
- sta $400+250,x
- sta $400+500,x
- sta $400+750,x
- inx
- cpx #250
- bcc -
- shutBasicScrDone = *
- ;** shutdown system
- jsr aceShutdown
- ;** return to basic
- bit exitScr
- bpl +
- lda #147
- jsr kernelChrout
- + lda #bkKernel
- sta bkSelect
- cld
- cli
- .if computer-64
- lda #0
- sta $f8
- sta $f9
- lda #$16
- sta 2604
- sta $d018
- lda #0
- sta $1c00
- sta 208
- jsr $51d6
- jmp $4db7
- .else
- lda #0
- sta $800
- sta 198
- jsr $a642
- jmp $a474
- .ife
- brk
-
- resetIntDispatch = * ;for C64 only, RAM0
- ldx #$ff
- sei
- txs
- cld
- lda #bkKernel
- sta bkSelect
- jmp $fce2
-
- nmiIntDispatch = * ;for C64 only, RAM0
- sei
-
- nmiHandler = *
- .if computer-64
- cld
- lda #bkACE
- sta bkSelect
- nmiSlot1 = *
- jsr slInterrupt
- bcc +
- nmiContinue = *
- lda #$7f
- sta $dd0d
- ldy $dd0d
- bmi +
- lda #$7f
- sta $dc00
- lda $ff
- sta $d02f
- - lda $dc01
- cmp $dc01
- bne -
- and #$80
- bmi +
- jsr aceShutdown
- ;jsr shutdownMemory
- ;lda #147
- ;jsr kernelChrout
- ;jmp aceShutdownBasic
- jsr $e056
- jsr $e109
- jsr $c000
- lda #0
- sta $1c00
- lda #bkKernel
- sta bkSelect
- jsr $51d6
- jmp ($0a00)
- + jmp $ff33
- .else
- cld
- pha
- txa
- pha
- tya
- pha
- lda bkSelect
- pha
- lda #bkKernel
- sta bkSelect
- nmiSlot1 = *
- jsr slInterrupt
- bcc +
- nmiContinue = *
- lda #$7f
- sta $dd0d
- ldy $dd0d
- bmi +
- lda #$7f
- sta $dc00
- - lda $dc01
- cmp $dc01
- bne -
- and #$80
- bmi +
- jsr aceShutdown
- jsr $fd15
- jsr $fda3
- jsr $e518
- lda #0
- sta $800
- jsr $a642
- jmp ($a002)
- + pla
- sta bkSelect
- pla
- tay
- pla
- tax
- pla
- rti
- .ife
-
- ;*** extra-lean SwiftLink interrupt handler; the NMI vector points here;
- ;*** for the C128 only; for swiftlink at $DE00 only
-
- leanBase = $de00
- leanTail = $ca
- leanHead = $cb
- leanFreeCnt = $ce
- leanStopped = $cf
- .if computer-64
- leanBuffer .buf 256 ;this needs to be on the Commodore Kernal bank
- .else
- leanBuffer .buf 1 ;can't use on C64; don't want to waste 256 bytes
- .ife
- leanRtsOff .buf 1 ;must be non-zero (DTR,ints active)
-
- nmiSwiftlinkLeanInterrupt = *
- - lda leanBase+$1 ;(5*) ;status
- and #$08 ;(2)
- beq leanNot ;(2*)
- lda leanBase+$0 ;(5*) ;data
- ldy leanTail ;(3)
- ldx leanFreeCnt ;(3)
- beq + ;(2*)
- sta leanBuffer,y ;(5)
- inc leanTail ;(5)
- dec leanFreeCnt ;(5)
- cpx #9 ;(2)
- bcs + ;(3*)
- lda leanRtsOff ;(4)
- sta leanBase+$2 ;(5*) ;command
- sta leanStopped ;(3)
- + jmp $ff33 ;(3) ;;remove this for no-edge recovery
-
- lda leanBase+$1 ;(5*) ;status
- and #$08 ;(2)
- bne - ;(2*)
- jmp $ff33 ;(3)
-
- ;timing: normal=54+74=128 cycles, assertFlow=65+74=139 cycles, 177 cycles avail
- ;
- ;NMI overhead=74 cycles: int=8, maxLatency=7, ROMenter=33, ROMexit=26
-
- leanNot = *
- cld
- lda #bkACE
- sta bkSelect
- jmp nmiContinue
-
- aceIrqInit = *
- php
- sei
- .if computer-64
- .else
- ldx #5
- - lda c64IntVecs,x
- sta $fffa,x
- dex
- bpl -
- .ife
- lda #<irqHandler
- ldy #>irqHandler
- sta $314
- sty $315
- .if computer-64
- ;xx on the C128, we must use the VIC raster interrupt as the timer
- lda vic+$11
- and #$7f
- sta vic+$11
- lda #252
- sta vic+$12
- .else
- ;** use CIA1 timer A to generate 60-Hz IRQ on the C64
- lda #<17045 ;1_022_727 / 60 for NTSC
- ldy #>17045
- ldx configBuf+$c7
- beq +
- lda #<16421 ;985_248 / 60 for PAL
- ldy #>16421
- + sta $dc04
- sty $dc05
- lda $dc0e
- and #%10000000
- ora #%00010001
- sta $dc0e
- .ife
- ldx #3
- - lda #$00
- sta jiffyCount,x
- dex
- bpl -
- plp
- rts
-
- c64IntVecs = *
- .word nmiIntDispatch,resetIntDispatch,irqIntDispatch
-
- irqIntDispatch = * ;for C64 only, RAM0
- pha
- txa
- pha
- tya
- pha
- lda bkSelect
- pha
- lda #bkKernel
- sta bkSelect
- cld
- tsx
- lda $0105,x
- and #$10
- beq irqHandlerInt64
- jmp brkHandler
-
- irqHandler = * ;(.AXY already saved, 128 bank)
- cld
- .if computer-64
- .else
- lda bkSelect
- pha
- .ife
- irqHandlerInt64 = *
- lda #bkACE
- sta bkSelect
- .if computer-64
- lda vic+$19
- bpl +
- and #$01
- beq +
- sta vic+$19
- jmp sixty
- .else
- lda $dc0d
- bpl +
- and #$01
- bne sixty
- .ife
- + jmp irqExit
-
- sixty = *
- inc jiffyCount+0
- bne +
- inc jiffyCount+1
- bne +
- inc jiffyCount+2
- bne +
- inc jiffyCount+3
- + jsr conScreenSave
- jsr vicIrqCursor
- jsr vdcIrqCursor
- jsr conIrqKeyscan
- jmp irqExit
-
- .if computer-64
- irqExit = $ff33
- .else
- irqExit = *
- pla
- sta bkSelect
- pla
- tay
- pla
- tax
- pla
- rti
- .ife
-
- brkHandler = *
- cld
- ldx #0
- - lda $00,x
- sta $0400,x
- dex
- bne -
- jsr aceShutdown
- .if computer-64
- lda #0
- sta $1c00
- ;jsr $51d6
- .else
- lda #0
- sta $800
- jsr $a642
- .ife
- jmp kernelBrkHandler
-
- stopHandler = *
- lda #$ff
- rts
-
- .seq acecall.s
- .seq acemem.s
- .seq acewin.s
- .if computer-64
- .seq acevdc.s
- aceVicColorOff .byte $b8
- .seq acevic.s
- .else
- .seq acevic80.s
- aceVicColorOff .byte $d8
- .seq acevic.s
- .ife
- .seq acecon.s
- .seq acerd.s
- .seq aceswift.s
- .seq acepar.s
-
- ;*** main()
-
- bootDevice .buf 1
- titlePtr .buf 2
- titleLen .buf 2
- exitScr .byte 0
-
- main = *
- lda 186
- sta bootDevice
- lda #147
- jsr kernelChrout
- lda #14
- jsr kernelChrout
- ldx #0
- - lda aceStartupMsg,x
- beq +
- jsr kernelChrout
- inx
- bne -
- + sei
- jsr aceBootstrap
- jsr initMemory
- jsr aceConfig
- bcc +
- jmp configErrMainExit
- + lda 2
- ldy 3
- sta titlePtr+0
- sty titlePtr+1
- lda 4
- ldy 5
- sta titleLen+0
- sty titleLen+1
- jsr aceIrqInit
- jsr aceStartup
- jsr initMemoryAlloc
- sei
- jsr screenInit
- jsr conInit
- lda #$ff
- sta exitScr
- jsr devTableInit
- jsr rdInit
- jsr parInit
- jsr slInit
- .if computer-64
- lda #$01
- sta vic+$1a ;enable VIC raster IRQ on C128
- .else
- bit $dc0d
- lda #%10000001 ;enable 60-Hz IRQ on C64
- sta $dc0d
- .ife
- cli
- lda titlePtr+0
- ldx titlePtr+1
- inx
- inx
- sta syswork+0
- stx syswork+1
- ldy #5
- lda (syswork+0),y
- tay
- clc
- lda syswork+0
- adc #8
- bcc +
- inx
- + sta syswork+0
- stx syswork+1
- lda #%11100000
- cpy #$00
- beq +
- ora #%00010000
- + ldx #$00
- ldy #40
- jsr conChrset
- clc
- lda syswork+0
- adc #40
- sta syswork+0
- bcc +
- inc syswork+1
- + lda #%10001010
- ldx #$00
- ldy #0
- jsr conChrset
- clc
- lda syswork+1
- adc #>2048
- sta syswork+1
- lda #%10000110
- ldx #$00
- ldy #0
- jsr conChrset
-
- ;** open std files
- lda #<configBuf+$100
- ldy #>configBuf+$100
- sta zp+0
- sty zp+1
- lda #$00
- jsr internDirChange
- lda #<stdinName
- ldy #>stdinName
- sta zp+0
- sty zp+1
- lda #"r"
- jsr internOpen ;fcb=0
- lda #<stdoutName
- ldy #>stdoutName
- sta zp
- sty zp+1
- lda #"w"
- jsr internOpen ;fcb=1
- lda #"w"
- jsr internOpen ;fcb=2
- lda titlePtr+0
- ldy titlePtr+1
- sta zp+0
- sty zp+1
- lda titleLen+0
- ldy titleLen+1
- ldx #stdout
- jsr internWrite
- cli
-
- ;** call shell
- lda aceMemTop+0
- ldy aceMemTop+1
- sec
- sbc #13
- bcs +
- dey
- + sta zw+0
- sty zw+1
- ldy #12
- - lda startupArgs,y
- sta (zw),y
- dey
- bpl -
- ldy #0
- clc
- lda zw+0
- adc #6
- sta (zw),y
- iny
- lda zw+1
- adc #0
- sta (zw),y
- iny
- clc
- lda zw+0
- adc #9
- sta (zw),y
- iny
- lda zw+1
- adc #0
- sta (zw),y
- lda #<shellName
- ldy #>shellName
- sta zp+0
- sty zp+1
- lda #2
- ldy #0
- jsr internProcExec
- lda #$00
- bcc +
- lda errno
- + sta 1021
-
- ;** exit
- lda #stdin
- jsr internClose
- lda #stdout
- jsr internClose
- lda #stderr
- jsr internClose
- lda #chrCLS
- jsr conPutchar
- configErrMainExit = *
- lda bootDevice
- sta 186
- jsr slShutdown
- jsr shutdownMemory
- jmp aceShutdownBasic
-
- stdoutName .asc "s:"
- .byte 0
- stdinName .asc "k:"
- .byte 0
-
- startupArgs .byte 0,0,0,0,0,0,"s","h",0,"-","v","i",0
- shellName .byte "s","h",0
-
- aceStartupMsg = *
- .if computer-64
- .asc "ACE-128 "
- .else
- .asc "ACE-64 "
- .ife
- .asc "Kernel 0.98 - by CSB 17-Dec-95"
- .byte chrCR,chrCR,0
-
- ;*** bss: c128=512 bytes, c64=0 bytes
-
- aceBss = *
- .if computer-64
- charset4bit = aceBss+0 ;(0 bytes)
- basicZpSave = aceBss+0 ;("maxZpUse" bytes)
- deviceTable = basicZpSave+maxZpUse ;(256 bytes)
- workbuf = deviceTable+256 ;(256 bytes)
- pageC0Save = workbuf+256 ;(256 bytes)
- aceBssEnd = pageC0Save+256
- .else
- aceBssEnd = aceBss+0
- .ife
- acecall.s
- 2046
- ;*** ACE Kernel main file/dir/other system calls
-
- ;====== file calls ======
-
- ;*** open( zp=filenameZ, .A=mode["r","w","a","W","A"] ) : .A=fcb
-
- aceOpenOverwrite = *
- lda #"w"
- jsr open
- bcs +
- rts
- + ldy errno
- cpy #aceErrFileExists
- beq +
- sec
- rts
- + jsr internRemove
- bcs +
- lda #"w"
- jsr open
- + rts
-
- aceOpenForceAppend = *
- lda #"a"
- jsr open
- bcs +
- rts
- + ldy errno
- cpy #aceErrFileNotFound
- beq +
- sec
- rts
- + lda #"w"
- jsr open
- rts
-
- openFcb = syswork+0
- openNameScan = syswork+1
- openMode = syswork+2
- openNameLength = syswork+3
- openDevice = syswork+4
- checkStat .buf 1
-
- kernFileOpen = *
- internOpen = *
- sta openMode
- cmp #"W"
- bne +
- jmp aceOpenOverwrite
- + cmp #"A"
- bne +
- jmp aceOpenForceAppend
- + lda #true
- sta checkStat
- jsr getLfAndFcb
- bcc +
- rts
- + sta lftable,x
- lda #$00
- sta eoftable,x
- stx openFcb
- jsr getDevice
- sty openNameScan
- ldx openFcb
- sta devtable,x
- sta openDevice
- tax
-
- ;get sa here
- lda configBuf+0,x
- cmp #0
- bne +
- ldy configBuf+2,x
- jmp nonDiskSa
- + ldy #0
- cmp #1
- beq openDiskSa
- ;** check console
- cmp #2
- bne +
- - lda openFcb
- clc
- rts
- ;** check null device
- + cmp #3
- beq -
- ;** check ramdisk device
- cmp #4
- bne +
- jmp rdOpen
- ;** check parallel port device
- + cmp #5
- bne +
- jmp parOpen
- ;** check SwiftLink modem device
- + cmp #6
- bne +
- jmp slOpen
- ;** illegal device
- + lda #aceErrIllegalDevice
- sta errno
- sec
- rts
-
- openDiskSa = *
- ldy #2
- diskSaSearch = *
- ldx #fcbCount-1
- - lda lftable,x
- bmi +
- lda devtable,x
- cmp openDevice
- bne +
- tya
- cmp satable,x
- bne +
- iny
- bne diskSaSearch
- + dex
- bpl -
-
- nonDiskSa = *
- ldx openFcb
- tya
- sta satable,x
-
- ;set the name
- ldx #0
- ldy openNameScan
- - lda (zp),y
- sta stringBuffer,x
- beq +
- iny
- inx
- bne -
- + ldy openDevice
- lda configBuf+0,y
- cmp #1
- bne nonDiskOpen
- ;** stick the mode for disk files
- cpx #0
- bne +
- lda #aceErrOpenDirectory
- sec
- rts
- + lda #","
- sta stringBuffer,x
- inx
- lda openMode
- sta stringBuffer,x
- inx
- jmp openGotName
-
- ;** get rid of the filename for non-disks
- nonDiskOpen = *
- ldx #0
-
- openGotName = *
- ;** dispatch here for non-kernel devices
- txa
- ldx #<stringBuffer
- ldy #>stringBuffer
- jsr kernelSetnam
-
- ;set lfs
- ldx openFcb
- lda lftable,x
- pha
- lda satable,x
- tay
- lda devtable,x
- tax
- lda configBuf+1,x
- tax
- pla
- jsr kernelSetlfs
-
- ;do the open
- jsr kernelOpen
- bcs openError
- + ldx openDevice
- lda configBuf+0,x
- cmp #1
- bne +
- lda checkStat
- beq +
- txa
- jsr openDiskStatus
- bcc +
-
- openError = *
- sta errno
- ldx openFcb
- lda lftable,x
- clc
- jsr kernelClose
- ldx openFcb
- lda #lfnull
- sta lftable,x
- sec
- lda #fcbNull
- rts
- + lda openFcb
- clc
- rts
-
- openDiskStatus = * ;( .A=device ) : errno=.A=errcode, .CS=errflag
- jsr cmdchOpen
- bcs +
- jsr checkDiskStatus
- php
- pha
- jsr cmdchClose
- pla
- plp
- + rts
-
- cmdchOpen = * ;( .A=device )
- pha
- jsr cmdchClose
- pla
- tax
- lda configBuf+1,x
- tax
- ldy #15
- lda #lfnull
- jsr kernelSetlfs
- lda #0
- jsr kernelSetnam
- jsr kernelOpen
- bcc +
- sta errno
- + rts
-
- cmdchSend = * ;( stringBuffer )
- ldx #lfnull
- jsr kernelChkout
- bcs cmdchErr
- ldx #0
- - lda stringBuffer,x
- beq +
- jsr kernelChrout
- bcs cmdchErr
- inx
- bne -
- + jsr kernelClrchn
- clc
- rts
-
- cmdchErr = *
- sta errno
- pha
- jsr kernelClrchn
- pla
- sec
- rts
-
- checkDiskStatusCode .buf 1
-
- checkDiskStatus = *
- ldx #lfnull
- jsr kernelChkin
- bcs cmdchErr
- jsr kernelChrin
- bcs cmdchErr
- and #$0f
- sta checkDiskStatusCode
- asl
- asl
- adc checkDiskStatusCode
- asl
- sta checkDiskStatusCode
- jsr kernelChrin
- bcs cmdchErr
- and #$0f
- clc
- adc checkDiskStatusCode
- sta checkDiskStatusCode
- - jsr kernelReadst
- and #$80
- beq +
- lda #aceErrDeviceNotPresent
- sec
- bcs cmdchErr
- + jsr kernelChrin
- bcs cmdchErr
- cmp #chrCR
- bne -
- jsr kernelClrchn
- lda checkDiskStatusCode
- cmp #62
- bne +
- lda #aceErrFileNotFound
- sta errno
- sec
- rts
- + cmp #20
- bcc +
- sta errno
- + rts
-
- cmdchClose = *
- sec
- lda #lfnull
- jsr kernelClose
- bcc +
- sta errno
- + rts
-
- ;*** close( .A=fcb )
-
- closeFd .buf 1
-
- kernFileClose = *
- aceClose = *
- internClose = *
- tax
- lda pidtable,x
- cmp aceProcessID
- beq +
- clc
- rts
- + ldy devtable,x
- stx closeFd
- lda configBuf+0,y
- cmp #2
- bne +
- jmp closeFdEntry
- + cmp #3
- bne +
- jmp closeFdEntry
- + cmp #4
- bne +
- jsr rdClose
- jmp closeFdEntry
- + cmp #5
- bne +
- jmp parClose
- + cmp #6
- bne +
- jmp slClose
- + ldx closeFd
- lda lftable,x
- jsr kernelClose
-
- closeFdEntry = *
- ldx closeFd
- lda #lfnull
- sta lftable,x
- clc
- rts
-
- ;*** read( .X=fcb, (zp)=data, .AY=maxLength ) : .AY=(zw)=length, .Z=eof
-
- readMaxLen = syswork+0
- readPtr = syswork+2
- readLength = syswork+4
- readFcb = syswork+6
- readDeviceDisk = syswork+7
-
- kernFileRead = *
- sta readMaxLen+0
- sty readMaxLen+1
- stx readFcb
- lda zp+0
- ldy zp+1
- sta readPtr+0
- sty readPtr+1
- lda #0
- sta readLength+0
- sta readLength+1
- lda eoftable,x
- beq +
- jmp readEofExit
- + ldy #0
- lda devtable,x
- tax
- lda configBuf+0,x
- cmp #4
- bne +
- jmp rdRead
- + cmp #5
- bne +
- jmp parRead
- + cmp #6
- bne +
- jmp slRead
- + cmp #2
- bne +
- lda readMaxLen+0
- ldy readMaxLen+1
- ldx readFcb
- jmp conRead
- + cmp #3
- bne +
- lda #0
- ldy #0
- sta zw+0
- sty zw+1
- clc
- rts
- + cmp #1
- bne +
- ldy #$ff
- + ldx readFcb
- sty readDeviceDisk
- lda lftable,x
- tax
- jsr kernelChkin
- bcc readByte
- sta errno
- rts
-
- readByte = *
- lda readLength+0
- cmp readMaxLen+0
- lda readLength+1
- sbc readMaxLen+1
- bcs readExit
- jsr kernelChrin
- ldy #0
- sta (readPtr),y
- inc readPtr+0
- bne +
- inc readPtr+1
- + inc readLength+0
- bne +
- inc readLength+1
- + bit readDeviceDisk
- bpl readByte
- lda st
- and #$40
- beq readByte
- ldx readFcb
- sta eoftable,x
-
- readExit = *
- jsr kernelClrchn
- readExitNoclr = *
- lda readLength+0
- ldy readLength+1
- sta zw+0
- sty zw+1
- ldx #$ff
- clc
- rts
-
- readEofExit = *
- lda #0
- ldy #0
- + sta zw+0
- sty zw+1
- clc
- rts
-
- ;*** write( .X=fcb, (zp)=data, .AY=length )
-
- writeLength = syswork+0
- writePtr = syswork+2
-
- kernFileWrite = *
- internWrite = *
- sta writeLength+0
- sty writeLength+1
- lda zp+0
- ldy zp+1
- sta writePtr+0
- sty writePtr+1
- stx regsave+1
- lda devtable,x
- tax
- lda configBuf+0,x
- ;** check ramdisk
- cmp #4
- bne +
- jmp rdWrite
- ;** check parallel port
- + cmp #5
- bne +
- jmp parWrite
- ;** check SwiftLink modem
- + cmp #6
- bne +
- jmp slWrite
- ;** check console
- + cmp #2
- bne +
- lda writeLength+0
- ldy writeLength+1
- ldx regsave+1
- jmp conWrite
- ;** check null device
- + cmp #3
- bne +
- clc
- rts
- + ldx regsave+1
- lda lftable,x
- tax
- jsr kernelChkout
- bcc writeByte
- rts
-
- writeByte = *
- lda writeLength+0
- ora writeLength+1
- beq writeFinish
- ldy #0
- lda (writePtr),y
- jsr kernelChrout
- bcc +
- sta errno
- jsr kernelClrchn
- sec
- rts
- + inc writePtr+0
- bne +
- inc writePtr+1
- + lda writeLength+0
- bne +
- dec writeLength+1
- + dec writeLength+0
- jmp writeByte
-
- writeFinish = *
- jsr kernelClrchn
- clc
- rts
-
- ;*** aceFileLseek( ... ) : ...
-
- kernFileLseek = *
- lda #aceErrNotImplemented
- sta errno
- sec
- rts
-
- ;*** aceFileRemove( (zp)=Name )
-
- removeDevice = syswork
-
- kernFileRemove = *
- internRemove = *
- jsr getDiskDevice
- bcc +
- rts
- + sta removeDevice
- cpx #4
- bne +
- jmp rdRemove
- + lda #"s"
- sta stringBuffer
- lda #":"
- sta stringBuffer+1
- ldx #1
- lda (zp),y
- cmp #"/"
- beq +
- ldx #2
- / lda (zp),y
- sta stringBuffer,x
- beq +
- iny
- inx
- bne -
- + lda #0
- sta stringBuffer,x
- lda removeDevice
- jsr cmdchOpen
- bcs ++
- jsr cmdchSend
- bcs +
- jsr checkDiskStatus
- + php
- jsr cmdchClose
- plp
- + rts
-
- ;*** aceFileRename( (zp)=OldName, (zw)=NewName )
- ;*** don't even think about renaming files outside the current directory
-
- renameDevice = syswork+0
- renameScan = syswork+1
-
- kernFileRename = *
- jsr getDiskDevice
- bcc +
- rts
- + sta renameDevice
- cpx #4
- bne +
- jmp rdRename
- + sty renameScan
- lda #"r"
- sta stringBuffer+0
- lda #":"
- sta stringBuffer+1
- ;** copy new name
- ldy #0
- ldx #2
- - lda (zw),y
- sta stringBuffer,x
- beq +
- iny
- inx
- bne -
- + lda #"="
- sta stringBuffer,x
- inx
- ;** copy old name
- ldy renameScan
- - lda (zp),y
- sta stringBuffer,x
- beq +
- inx
- iny
- bne -
- + lda renameDevice
- jsr cmdchOpen
- bcs ++
- jsr cmdchSend
- bcs +
- jsr checkDiskStatus
- + php
- jsr cmdchClose
- plp
- + rts
-
- ;*** aceFileBload( (zp)=Name, .AY=Address, (zw)=Limit+1 ) : .AY=End+1
-
- bloadAddress = syswork
- bloadFilename = syswork+2
- bloadDevice = syswork+4
-
- kernFileBload = *
- internBload = *
- sta bloadAddress+0
- sty bloadAddress+1
- jsr getDevice
- sta bloadDevice
- tax
- clc
- tya
- adc zp+0
- sta bloadFilename+0
- lda zp+1
- adc #0
- sta bloadFilename+1
- lda configBuf+0,x
- cmp #4
- bne +
- jmp rdBload
- + cmp #1
- beq +
- lda #aceErrIllegalDevice
- sta errno
- sec
- rts
- + lda configBuf+1,x
- tax
- lda #0
- ldy #0
- jsr kernelSetlfs
- ldy #0
- - lda (bloadFilename),y
- beq +
- iny
- bne -
- + tya
- ldx bloadFilename+0
- ldy bloadFilename+1
- jsr kernelSetnam
- lda #0
- ldx bloadAddress+0
- ldy bloadAddress+1
- jsr kernelLoad
- stx bloadAddress+0
- sty bloadAddress+1
- bcc bloadOk
- pha
- cmp #aceErrDeviceNotPresent
- beq +
- ldx bloadDevice
- lda configBuf+0,x
- cmp #1
- bne +
- txa
- jsr openDiskStatus
- + pla
- - sta errno
- lda #0
- ldx #0
- ldy #0
- sec
- rts
-
- bloadOk = *
- ldx bloadDevice
- lda configBuf+0,x
- cmp #1
- bne +
- txa
- jsr openDiskStatus
- bcs -
- + lda bloadAddress+0
- ldy bloadAddress+1
- rts
-
- ;*** aceFileInfo( .X=Fcb ) : .A=DevType(0=con,1=char,2=disk), .X=Cols, .Y=Rows
-
- kernFileInfo = *
- lda devtable,x
- tax
- lda configBuf+0,x
- cmp #2
- bne +
- jsr kernWinSize
- tay
- lda #0
- rts
-
- + ldx #80
- ldy #66
- cmp #1
- beq +
- cmp #4
- beq +
- lda #1
- rts
- + lda #2
- rts
-
- ;*** aceFileStat( ... ) : ...
-
- kernFileStat = *
- lda #aceErrNotImplemented
- sta errno
- sec
- rts
-
- ;*** aceFileIoctl( ... ) : ...
-
- kernFileIoctl = *
- lda #aceErrNotImplemented
- sta errno
- sec
- rts
-
- ;*** aceFileFdswap( .X=Fcb1, .Y=Fcb2 )
-
- kernFileFdswap = *
- lda lftable,x
- pha
- lda lftable,y
- sta lftable,x
- pla
- sta lftable,y
- lda devtable,x
- pha
- lda devtable,y
- sta devtable,x
- pla
- sta devtable,y
- lda satable,x
- pha
- lda satable,y
- sta satable,x
- pla
- sta satable,y
- lda eoftable,x
- pha
- lda eoftable,y
- sta eoftable,x
- pla
- sta eoftable,y
- lda pidtable,x
- pha
- lda pidtable,y
- sta pidtable,x
- pla
- sta pidtable,y
- txa
- asl
- asl
- asl
- asl
- tax
- tya
- asl
- asl
- asl
- asl
- tay
- lda #16
- sta syswork+15
- - lda fcbTable1,x
- pha
- lda fcbTable1,y
- sta fcbTable1,x
- pla
- sta fcbTable1,y
- inx
- iny
- dec syswork+15
- bne -
- clc
- rts
-
- ;====== directory calls ======
-
- ;*** aceDirOpen( (zp)=deviceName ) : .A=fcb
-
- kernDirOpen = *
- lda #true
- sta checkStat
- jsr getDiskDevice
- bcc +
- rts
- + sta openDevice
- sty openNameScan
- jsr getLfAndFcb
- bcc +
- rts
- + sta lftable,x
- lda openDevice
- sta devtable,x
- lda #0
- sta eoftable,x
- lda #0
- sta satable,x
- stx openFcb
- ldx openDevice
- lda configBuf+0,x
- cmp #4
- bne +
- jmp rdDirOpen
- + lda #"$"
- sta stringBuffer+0
- lda #"0"
- sta stringBuffer+1
- lda #0
- sta stringBuffer+2
- ldx #2
- jsr dirOpenSetName
- jsr openGotName
- bcc +
- rts
- + ldx openFcb
- lda lftable,x
- tax
- jsr kernelChkin
- jsr kernelChrin
- jsr kernelChrin
- jsr kernelClrchn
- lda openFcb
- clc
- rts
-
- dirOpenSetName = *
- ldy openDevice
- lda configBuf+3,y
- bmi dirNameDate
- ldy openNameScan
- lda (zp),y
- bne +
- rts
- + ldx #1
-
- dirNameNormal = *
- - lda (zp),y
- sta stringBuffer,x
- beq +
- iny
- inx
- bne -
- + dex
- lda #":"
- cmp stringBuffer,x
- beq +
- inx
- sta stringBuffer,x
- + inx
- lda #"*"
- sta stringBuffer,x
- inx
- lda #0
- sta stringBuffer,x
- rts
-
- dirNameDate = *
- lda #"="
- sta stringBuffer+1
- lda #"t"
- sta stringBuffer+2
- ldx #3
- ldy openNameScan
- jsr dirNameNormal
- lda #"="
- sta stringBuffer,x
- inx
- lda #"l"
- sta stringBuffer,x
- inx
- lda #0
- sta stringBuffer,x
- rts
-
- ;*** aceDirClose( ... ) : ...
-
- kernDirClose = *
- tax
- lda pidtable,x
- cmp aceProcessID
- beq +
- clc
- rts
- + ldy devtable,x
- stx closeFd
- lda configBuf+0,y
- cmp #4
- beq +
- lda closeFd
- jmp aceClose
- + jmp rdDirClose
-
- ;*** aceDirRead( .X=fcb ) : .Z=eof, aceDirentBuffer=data
-
- dirBlocks = syswork+0
-
- kernDirRead = *
- ldy devtable,x
- lda configBuf+0,y
- cmp #4
- bne +
- jmp rdDirRead
- + lda lftable,x
- tax
- jsr kernelChkin
- bcc +
- lda #0
- rts
- ;** read the link
- + jsr kernelChrin
- sta syswork+4
- jsr kernelReadst
- and #$40
- bne dirreadEofExit
- jsr kernelChrin
- ora syswork+4
- bne +
-
- dirreadEofExit = *
- jsr kernelClrchn
- ldx #0
- rts
- dirreadErrExit = *
- sta errno
- jsr kernelClrchn
- ldx #0
- sec
- rts
-
- ;** read the block count
- + jsr kernelChrin
- sta dirBlocks
- sta aceDirentBytes+1
- jsr kernelChrin
- sta dirBlocks+1
- sta aceDirentBytes+2
- asl dirBlocks
- rol dirBlocks+1
- lda #0
- rol
- sta dirBlocks+2
- sec
- lda #0
- sbc dirBlocks
- sta aceDirentBytes+0
- lda aceDirentBytes+1
- sbc dirBlocks+1
- sta aceDirentBytes+1
- lda aceDirentBytes+2
- sbc dirBlocks+2
- sta aceDirentBytes+2
- ;** read the filename
- lda #0
- sta aceDirentName
- sta aceDirentNameLen
- - jsr kernelChrin
- bcs dirreadErrExit
- bit st
- bvs dirreadErrExit
- cmp #" "
- beq -
- cmp #18
- beq -
- cmp #$22
- bne dirreadExit
- ldx #0
- - jsr kernelChrin
- bcs dirreadErrExit
- bit st
- bvs dirreadErrExit
- cmp #$22
- beq +
- sta aceDirentName,x
- inx
- bne -
- + lda #0
- sta aceDirentName,x
- stx aceDirentNameLen
- - jsr kernelChrin
- cmp #" "
- beq -
- ;** read type and flags
- ldx #%01100000
- stx aceDirentFlags
- ldx #%10000000
- stx aceDirentUsage
- cmp #"*"
- bne +
- lda aceDirentFlags
- ora #%00001000
- sta aceDirentFlags
- jsr kernelChrin
- + ldx #3
- ldy #0
- jmp dirTypeFirst
- - jsr kernelChrin
- dirTypeFirst = *
- sta aceDirentType,y
- iny
- dex
- bne -
- lda #0
- sta aceDirentType+3
- lda aceDirentType
- cmp #"d"
- bne +
- lda aceDirentFlags
- ora #%10010000
- sta aceDirentFlags
- jmp dirreadExit
- + cmp #"p"
- bne dirreadExit
- lda aceDirentFlags
- ora #%00010000
- sta aceDirentFlags
- jmp dirreadExit
-
- dirreadExit = *
- jsr kernelChrin
- cmp #0
- bne +
- jmp dirreadRealExit
- + cmp #"<"
- bne +
- lda aceDirentFlags
- and #%11011111
- sta aceDirentFlags
- + ldx #7
- lda #0
- - sta aceDirentDate,x
- dex
- bpl -
- - jsr kernelChrin
- cmp #0
- beq dirreadRealExit
- cmp #"0"
- bcc -
- cmp #"9"+1
- bcs -
-
- dirreadDate = *
- jsr dirGetNumGot
- bcs dirreadRealExit
- sta aceDirentDate+2
- jsr dirGetNum
- bcs dirreadRealExit
- sta aceDirentDate+3
- jsr dirGetNum
- bcs dirreadRealExit
- sta aceDirentDate+1
- ldx #$19
- cmp #$70
- bcs +
- ldx #$20
- + stx aceDirentDate+0 ;century
- jsr dirGetNum
- bcs dirreadRealExit
- sta aceDirentDate+4
- jsr dirGetNum
- bcs dirreadRealExit
- sta aceDirentDate+5
- jsr kernelChrin
- and #$ff
- beq dirreadRealExit
- jsr kernelChrin
- and #$ff
- beq dirreadRealExit
- cmp #"a"
- bne dirreadPM
-
- dirreadAM = *
- lda aceDirentDate+4
- cmp #$12
- bne +
- lda #$00
- sta aceDirentDate+4
- jmp +
-
- dirreadPM = *
- lda aceDirentDate+4
- cmp #$12
- beq +
- clc
- sei
- sed
- adc #$12
- cld
- cli
- sta aceDirentDate+4
-
- / jsr kernelChrin
- cmp #0
- bne -
-
- dirreadRealExit = *
- jsr kernelClrchn
- ldx #$ff
- clc
- rts
-
- dirGetNum = *
- - jsr kernelChrin
- dirGetNumGot = *
- cmp #0
- beq +
- cmp #"0"
- bcc -
- cmp #"9"+1
- bcs -
- asl
- asl
- asl
- asl
- sta syswork+6
- jsr kernelChrin
- cmp #0
- beq +
- and #$0f
- ora syswork+6
- clc
- + rts
-
- ;*** aceDirIsdir( (zp)=FilenameZ ) : .A=Dev, .X=isDisk, .Y=isDir
-
- kernDirIsdir = *
- jsr getDevice
- pha
- tax
- lda configBuf+0,x
- cmp #1
- beq +
- cmp #4
- beq +
- ldx #false
- ldy #false
- jmp isDirExit
- ldx #true
- + ldy #255
- - iny
- lda (zp),y
- bne -
- dey
- lda (zp),y
- ldy #true
- cmp #":"
- beq isDirExit
- ldy #false
-
- isDirExit = *
- pla
- rts
-
- ;*** aceDirChange( (zp)=DirName, .A=flags($80=home) )
-
- chdirDevice = syswork+0
- chdirScan = syswork+1
- chdirNameScan = syswork+2
- chdirCharSave = syswork+3
-
- kernDirChange = *
- internDirChange = *
- cmp #$80
- bcc +
- lda #<configBuf+$100
- ldy #>configBuf+$100
- sta zp+0
- sty zp+1
- + jsr getDiskDevice
- bcc +
- rts
- + sty chdirNameScan
- sta chdirDevice
- cpx #4
- bne +
- jmp rdChDir
- + lda #"c"
- sta stringBuffer+0
- lda #"d"
- sta stringBuffer+1
- ldx #2
- - lda (zp),y
- sta stringBuffer,x
- beq +
- cmp #":"
- beq +
- iny
- inx
- bne -
- + lda #0
- sta stringBuffer,x
- cpx #2
- beq chdirSetName
- lda #"/"
- cmp stringBuffer-1,x
- beq +
- sta stringBuffer,x
- inx
- lda #0
- sta stringBuffer,x
- + lda chdirDevice
- jsr cmdchOpen
- bcc +
- rts
- + jsr cmdchSend
- bcs chdirAbort
- jsr checkDiskStatus
- bcs chdirAbort
-
- lda #"p"
- sta stringBuffer+1
- ldx #0
- - lda stringBuffer+2,x
- cmp #"0"
- bcc +
- cmp #"9"+1
- bcs +
- inx
- bne -
- + cpx #0
- beq +
- cmp #"/"
- bne +
- sta chdirCharSave
- stx chdirNameScan
- lda #0
- sta stringBuffer+2,x
- jsr cmdchSend
- bcs chdirAbort
- ldx chdirNameScan
- lda chdirCharSave
- sta stringBuffer+2,x
- jsr checkDiskStatus
- bcs chdirAbort
- + jsr cmdchClose
- lda chdirDevice
- sta aceCurrentDevice
-
- chdirSetName = *
- lda chdirDevice
- sta aceCurrentDevice
- lsr
- lsr
- ora #$40
- sta aceCurDirName+0
- lda #":"
- sta aceCurDirName+1
- ldx #0
- - lda stringBuffer+2,x
- sta aceCurDirName+2,x
- beq +
- inx
- bne -
- + lda aceCurDirName+1,x
- cmp #":"
- beq +
- lda #":"
- sta aceCurDirName+2,x
- inx
- + lda #0
- sta aceCurDirName+2,x
- clc
- rts
-
- chdirAbort = *
- jsr cmdchClose
- sec
- rts
-
- ;*** aceDirMake( (zp)=Name, .AY=minimumEntries )
-
- mkdirDevice = syswork
-
- kernDirMake = *
- jsr getDiskDevice
- bcc +
- rts
- + sta mkdirDevice
- lda #"m"
- sta stringBuffer+0
- lda #"d"
- sta stringBuffer+1
- lda #":"
- sta stringBuffer+2
- ldx #3
- - lda (zp),y
- sta stringBuffer,x
- beq +
- iny
- inx
- bne -
- + lda mkdirDevice
- jsr cmdchOpen
- bcs ++
- jsr cmdchSend
- bcs +
- jsr checkDiskStatus
- + php
- jsr cmdchClose
- plp
- + rts
-
- ;*** aceDirRemove( (zp)=Name )
-
- rmdirDevice = syswork
-
- kernDirRemove = *
- jsr getDiskDevice
- bcc +
- rts
- + sta rmdirDevice
- lda #"r"
- sta stringBuffer+0
- lda #"d"
- sta stringBuffer+1
- lda #":"
- sta stringBuffer+2
- ldx #3
- - lda (zp),y
- sta stringBuffer,x
- beq +
- iny
- inx
- bne -
- + lda rmdirDevice
- jsr cmdchOpen
- bcs ++
- jsr cmdchSend
- bcs +
- jsr checkDiskStatus
- + php
- jsr cmdchClose
- plp
- + rts
-
- ;*** aceDirName( .A=sysdir, (zp)=buf, .Y=assignLen ) : buf, .Y=len
- ;*** .A : 0=curDir, 1=homedir, 2=execSearchPath, 3=configSearchPath, 4=tempDir
- ;*** .A : $80+above: assign directory
-
- dirnamePath .buf 1
- dirnameSet .buf 1
- dirnameSetLen .buf 1
-
- kernDirName = *
- ldx #$00
- cmp #$80
- bcc +
- sty dirnameSetLen
- ldx #$ff
- + stx dirnameSet
- and #$07
- ldx #$ff
- cmp #2
- beq +
- cmp #3
- beq +
- ldx #$00
- + stx dirnamePath
- ldx #<aceCurDirName
- ldy #>aceCurDirName
- cmp #0
- beq +
- sec
- sbc #1
- lsr
- ror
- ror
- and #$c0
- ldy #>configBuf
- iny
- clc
- adc #<configBuf
- tax
- bcc +
- iny
- + stx syswork+0
- sty syswork+1
- bit dirnameSet
- bmi dirnameSetCopy
- ldy #0
- - lda (syswork+0),y
- sta (zp),y
- beq +
- iny
- bne -
- + bit dirnamePath
- bpl +
- iny
- lda (syswork+0),y
- bne -
- sta (zp),y
- + rts
-
- dirnameSetCopy = *
- ldy #0
- - lda (zp),y
- sta (syswork+0),y
- iny
- cpy dirnameSetLen
- bcc -
- rts
-
- ;====== time calls ======
-
- ;*** aceTimeGetDate( (.AY)=dateString ) fmt:YY:YY:MM:DD:HH:MM:SS:TW
- ; 0 1 2 3 4 5 6 7
-
- prevHour .buf 1
-
- kernTimeGetDate = *
- internGetDate = *
- php
- sei
- sta syswork+$e
- sty syswork+$f
- ldy #3
- - lda aceDate,y
- sta (syswork+$e),y
- dey
- bpl -
- ldy #4
- lda cia1+$b
- bpl +
- and #$1f
- sei
- sed
- clc
- adc #$12
- cld
- cli
- + cmp #$12
- bne +
- lda #$00
- + cmp #$24
- bne +
- lda #$12
- + sta (syswork+$e),y
- iny
- lda cia1+$a
- sta (syswork+$e),y
- iny
- lda cia1+$9
- sta (syswork+$e),y
- iny
- lda cia1+$8
- asl
- asl
- asl
- asl
- ora aceDOW
- sta (syswork+$e),y
- ;** check for increment date
- ldy #4
- lda (syswork+$e),y
- cmp prevHour
- sta prevHour
- bcs +
- ldy #3
- lda aceDate,y
- sed
- clc
- adc #$01
- cld
- sta aceDate,y
- sta (syswork+$e),y
- ;** exit
- + plp
- clc
- rts
-
- ;*** aceTimeSetDate( (.AY)=dateString )
-
- kernTimeSetDate = *
- sta syswork+0
- sty syswork+1
- ldy #3
- - lda (syswork),y
- sta aceDate,y
- dey
- bpl -
- ldy #4
- lda (syswork),y
- sta prevHour
- cmp #$13
- bcc +
- sei
- sed
- sec
- sbc #$12
- cld
- cli
- ora #$80
- + sta cia1+$b
- iny
- lda (syswork),y
- sta cia1+$a
- iny
- lda (syswork),y
- sta cia1+$9
- iny
- lda (syswork),y
- lsr
- lsr
- lsr
- lsr
- sta cia1+$8
- lda (syswork),y
- and #$07
- sta aceDOW
- rts
-
- ;*** aceTimeJif( .X=zpJifBuf ) : [zpJB]=jiffyCount
-
- kernTimeJif = *
- php
- sei
- ldy #0
- - lda jiffyCount,y
- sta 0,x
- inx
- iny
- cpy #4
- bcc -
- plp
- clc
- rts
-
- ;====== miscellaneous calls ======
-
- ;*** aceMiscUtoa( $0+X=value32, (zp)=buf, .A=minLen ) : buf, .Y=len
-
- utoaBin = syswork+2 ;(4)
- utoaBcd = syswork+6 ;(5)
- utoaFlag = syswork+11 ;(1)
- utoaLen = syswork+12 ;(1)
- utoaPos = syswork+13 ;(1)
- utoaInitOff .buf 1 ;(1)
-
- kernMiscUtoa = *
- ldy #0
- sty utoaInitOff
- cmp #0
- bne +
- lda #1
- + cmp #11
- bcc +
- sec
- sbc #10
- sta utoaInitOff
- ;.y == 0
- lda #" "
- - sta (zp),y
- iny
- cpy utoaInitOff
- bcc -
- lda #10
- + sta utoaLen
- sec
- lda #10
- sbc utoaLen
- sta utoaLen
- ldy #0
- - lda 0,x
- sta utoaBin,y
- inx
- iny
- cpy #4
- bcc -
- ldx #4
- lda #0
- - sta utoaBcd,x
- dex
- bpl -
- sta utoaFlag
- ldy #32
- sei
- sed
-
- utoaNextBit = *
- asl utoaBin+0
- rol utoaBin+1
- rol utoaBin+2
- rol utoaBin+3
- ldx #4
- - lda utoaBcd,x
- adc utoaBcd,x
- sta utoaBcd,x
- dex
- bpl -
- dey
- bne utoaNextBit
- cld
- cli
-
- lda #10
- sta utoaPos
- ldx #0
- ldy utoaInitOff
- - lda utoaBcd,x
- jsr utoaPutHex
- inx
- cpx #5
- bcc -
- lda #0
- sta (zp),y
- rts
-
- utoaPutHex = *
- pha
- lsr
- lsr
- lsr
- lsr
- jsr utoaPutDigit
- pla
- and #$0f
-
- utoaPutDigit = *
- dec utoaPos
- beq utoaForceDigit
- cmp utoaFlag
- bne utoaForceDigit
- dec utoaLen
- bmi +
- rts
- + lda #$20
- bne utoaPoke
- utoaForceDigit = *
- ora #$30
- sta utoaFlag
-
- utoaPoke = *
- sta (zp),y
- iny
- rts
-
- ;*** aceMiscIoPeek( (zw)=ioaddr, .Y=offset ) : .A=data
-
- kernMiscIoPeek = *
- lda #bkKernel
- sta bkSelect
- lda (zw),y
- pha
- lda #bkApp
- sta bkSelect
- pla
- rts
-
- ;*** aceMiscIoPoke( (zw)=ioaddr, .Y=offset, .A=data )
-
- kernMiscIoPoke = *
- pha
- lda #bkKernel
- sta bkSelect
- pla
- sta (zw),y
- pha
- lda #bkApp
- sta bkSelect
- pla
- rts
-
- ;*** aceMiscCmdOpen( (zp)=DevName ) : .A=Fcb
-
- kernMiscCmdOpen = *
- jsr getDiskDevice
- bcc +
- rts
- + sta openDevice
- jsr getLfAndFcb
- bcc +
- rts
- + sta lftable,x
- stx openFcb
- lda openDevice
- sta devtable,x
- lda #0
- sta eoftable,x
- lda #15
- sta satable,x
- stx openFcb
- lda #0
- sta stringBuffer
- lda #false
- sta checkStat
- ldx #0
- jsr openGotName
- bcc +
- rts
- + lda st
- and #$80
- beq +
- lda #aceErrDeviceNotPresent
- sta errno
- sec
- rts
- + lda openFcb
- rts
-
- ;*** aceMiscCmdClose( .A=fcb )
-
- kernMiscCmdClose = *
- tax
- lda lftable,x
- pha
- lda #lfnull
- sta lftable,x
- pla
- sec
- jmp kernelClose
-
- ;*** aceMiscCmdSend( .X=Fcb, .AY=Cmd )
-
- kernMiscCmdSend = *
- sta syswork+0
- sty syswork+1
- lda lftable,x
- tax
- jsr kernelChkout
- bcc +
- sta errno
- rts
- + ldy #0
- - lda (syswork),y
- beq +
- jsr kernelChrout
- bcs ++
- iny
- bne -
- + jsr kernelClrchn
- clc
- rts
- + sta errno
- jsr kernelClrchn
- sec
- rts
-
- ;*** aceMiscCmdStatus( .X=Fcb, .AY=StatusBuf ) : StatusBuf, .A=statusCode
-
- kernMiscCmdStatus = *
- sta syswork+0
- sty syswork+1
- lda lftable,x
- tax
- jsr kernelChkin
- bcc +
- - sta errno
- jsr kernelClrchn
- sec
- rts
- + ldy #0
- - jsr kernelChrin
- bcs --
- cmp #$0d
- beq +
- sta (syswork),y
- iny
- jsr kernelReadst
- and #$40
- beq -
- + lda #0
- sta (syswork),y
- jsr kernelClrchn
- ldy #0
- lda (syswork),y
- and #$0f
- asl
- asl
- adc (syswork),y
- asl
- sta syswork+3
- iny
- lda (syswork),y
- and #$0f
- adc syswork+3
- clc
- rts
-
- ;====== support functions ======
-
- ;*** getDevice( zp=filenameZ ) : .A=device, .Y=scanPos
-
- getDevice = *
- ldy #0
- lda (zp),y
- beq useDefault
- ldy #1
- lda (zp),y
- cmp #":"
- bne useDefault
- ldy #0
- lda (zp),y
- ldy #2
- cmp #"."
- bne +
- lda aceCurrentDevice
- jmp gotDev
- + and #$1f
- asl
- asl
- jmp gotDev
-
- useDefault = *
- lda aceCurrentDevice
- ldy #0
-
- gotDev = *
- rts
-
- getLfAndFcb = * ;() : .X=fcb, .A=lf
- openLfSearch = *
- inc newlf
- lda newlf
- and #$7f
- ldx #fcbCount-1
- - cmp lftable,x
- beq openLfSearch
- dex
- bpl -
- tay
- ldx #0
- - lda lftable,x
- bmi +
- inx
- cpx #fcbCount
- bcc -
- lda #aceErrTooManyFiles
- sta errno
- sec
- rts
- + lda aceProcessID
- sta pidtable,x
- tya
- clc
- rts
-
- devTableInit = *
- ldx #0
- lda #aceMemNull
- - sta deviceTable,x
- inx
- bne -
- rts
-
- getDiskDevice = * ;( (zp)=devname ) : .A=device, .Y=scan, .X=dev_t, .CC=isDisk
- jsr getDevice
- pha
- tax
- lda configBuf+0,x
- cmp #1
- bne +
- - tax
- pla
- clc
- rts
- + cmp #4
- beq -
- pla
- lda #aceErrDiskOnlyOperation
- sta errno
- sec
- rts
-
- ;====== experimental stuff ======
-
- ;*** aceTest( (zp)=filename ) : .A=dev#(0-31), (zw)=devRelName
-
- testCurDir .asc "/acedev"
- .byte 0
- testHomeDir .asc "/csbruce"
- .byte 0
- fnameScan .buf 1
- fnameSkip = fnameScan
-
- kernTest = *
- ;; lda #"/"
- ;; sta stringBuffer+0
- ;;
- ;; ;** fetch prefix+name into stringBuffer
- ;; ldy #0
- ;; lda (zp),y
- ;; ldx #1
- ;; cmp #"/"
- ;; beq +++
- ;; cmp #"~"
- ;; bne +
- ;; iny
- ;;- lda testHomeDir,x
- ;; sta stringBuffer,x
- ;; beq ++
- ;; inx
- ;; bne -
- ;;+ nop
- ;;- lda testCurDir,x
- ;; sta stringBuffer,x
- ;; beq +
- ;; inx
- ;; bne -
- ;;+ lda #"/"
- ;; sta stringBuffer,x
- ;; inx
- ;;+ nop
- ;;- lda (zp),y
- ;; sta stringBuffer,x
- ;; beq +
- ;; inx
- ;; iny
- ;; bne -
- ;;
- ;; ;** scan for extra slashes, ".", and ".."
- ;;+ ldx #1
- ;; ldy #1
- ;; scanNext = *
- ;; lda stringBuffer,x
- ;; cmp #"/"
- ;; bne scanCont
- ;; stx fnameScan
- ;;- inx
- ;; lda stringBuffer,x
- ;; cmp #"."
- ;; beq -
- ;; cmp #"/"
- ;; beq +
- ;; cmp #$00
- ;; bne ++
- ;;+ clc ;sic
- ;; txa
- ;; sbc fnameScan
- ;; beq +
- ;; cmp #3
- ;; bcs +
- ;; cmp #1
- ;; beq scanNext
- ;; cpy #2
- ;; bcc scanNext
- ;; dey
- ;;- dey
- ;; lda stringBuffer,y
- ;; cmp #"/"
- ;; bne -
- ;; iny
- ;; jmp scanNext
- ;;+ ldx fnameScan
- ;; lda #"/"
- ;; scanCont = *
- ;; cmp #"/"
- ;; bne +
- ;; cmp stringBuffer-1,y
- ;; bne +
- ;; dey
- ;;+ sta stringBuffer,y
- ;; cmp #$00
- ;; beq +
- ;; iny
- ;; inx
- ;; bne scanNext
- ;;+ cpy #2
- ;; bcc +
- ;; lda stringBuffer-1,y
- ;; cmp #"/"
- ;; bne +
- ;; lda #$00
- ;; sta stringBuffer-1,y
- ;;
- ;; ;** search for longest match among the mounted device names
- ;;+ lda #<configBuf+512
- ;; ldy #>configBuf+512
- ;; sta syswork+14
- ;; sty syswork+15
- ;;- ldy #2
- ;;- iny
- ;; lda (syswork+14),y
- ;; beq +
- ;; cmp stringBuffer-3,y
- ;; beq -
- ;;- clc
- ;; ldy #0
- ;; lda (syswork+14),y
- ;; adc syswork+14
- ;; sta syswork+14
- ;; bcc ---
- ;; inc syswork+15
- ;; jmp ---
- ;;+ lda stringBuffer-3,y
- ;; cmp #$00
- ;; beq +
- ;; cmp #"/"
- ;; beq ++
- ;; cpy #5
- ;; bcs -
- ;;+ dey
- ;; lda #"/"
- ;; sta stringBuffer-3,y
- ;;+ sec
- ;; tya
- ;; sbc #3
- ;; tax
- ;; ldy #1
- ;; lda (syswork+14),y
- ;; ora #$40
- ;; ;** return
- ;; pha
- ;; ldy #0
- ;;- lda stringBuffer,y
- ;; sta (zw),y
- ;; beq +
- ;; iny
- ;; bne -
- ;;+ pla
- ;; clc
- ;; rts
-
- ;blank line
-
- acemem.s
- 1651
- ;ACE-128/64 kernel Dynamic Memory & Process routines, by Craig Bruce.
-
- ;*** memory routines ***
-
- .if computer-64
- comCodeBuffer = $200
- .ife
- temp1 = $93
-
- bkSelectRam0 = $ff01
- reu = $df00
- rl = $de00
- ;rlRegs = $e0a9 ;old
- ;rlExec = $fe1e ;old
- rlActivate = $df7e
- rlDeactivate = $df7f
- rlSram = $dfc0
- rlPageSelect = $dfa0
- rlPageActivate = $dfc1
- rlPageData = $de00
-
- ;***startup
-
- initMemory = *
- .if computer-64
- ldx #0
- - lda comCodeStart,x
- sta comCodeBuffer,x
- inx
- cpx #comCodeEnd-comCodeStart
- bcc -
- .ife
- rts
-
- shutdownMemory = *
- .if computer-64
- ldx #0
- lda #0
- - sta comCodeBuffer,x
- inx
- cpx #comCodeEnd-comCodeStart
- bne -
- .ife
- rts
-
- internBankConfigs = *
- .if computer-64
- .byte $3f,$7f,$bf,$ff,$bf,$ff,$bf,$ff
- .byte $3f,$7f,$bf,$ff,$bf,$ff,$bf,$00
- .else
- .byte $70,$70
- .ife
-
- internBankGroups = *
- .if computer-64
- .byte $04,$04,$04,$04,$14,$14,$24,$24
- .byte $04,$04,$04,$04,$14,$14,$24,$04
- .ife
-
- ;***common code
-
- comCodeStart = *
- .if computer-64
- .else
- comCodeBuffer = comCodeStart
- .ife
-
- comZpLoad = *
- sty temp1
- ldy mp+2
- .if computer-64
- lda internBankGroups,y
- sta $d506
- .ife
- lda internBankConfigs,y
- sta bkSelect
- ldy #0
- - lda (mp),y
- sta 0,x
- inx
- iny
- cpy temp1
- bcc -
- lda #bkACE
- sta bkSelect
- clc
- rts
-
- comZpStore = *
- sty temp1
- ldy mp+2
- .if computer-64
- lda internBankGroups,y
- sta $d506
- .ife
- lda internBankConfigs,y
- sta bkSelect
- ldy #0
- - lda 0,x
- sta (mp),y
- inx
- iny
- cpy temp1
- bcc -
- lda #bkACE
- sta bkSelect
- clc
- rts
-
- comCopyToRam0 = *
- ldx mp+2
- .if computer-64
- lda internBankGroups,x
- sta $d506
- lda internBankConfigs,x
- tax
- .else
- lda internBankConfigs,x
- sta bkSelect
- .ife
- dey
- beq +
- .if computer-64
- - stx bkSelect
- lda (mp),y
- sta bkSelectRam0
- .else
- - lda (mp),y
- .ife
- sta (zp),y
- dey
- bne -
- .if computer-64
- + stx bkSelect
- lda (mp),y
- sta bkSelectRam0
- .else
- + lda (mp),y
- .ife
- sta (zp),y
- lda #bkACE
- sta bkSelect
- clc
- rts
-
- comCopyFromRam0 = *
- ldx mp+2
- .if computer-64
- lda internBankGroups,x
- sta $d506
- lda internBankConfigs,x
- tax
- .else
- lda internBankConfigs,x
- sta bkSelect
- .ife
- dey
- beq +
- .if computer-64
- - sta bkSelectRam0
- lda (zp),y
- stx bkSelect
- .else
- - lda (zp),y
- .ife
- sta (mp),y
- dey
- bne -
- .if computer-64
- + sta bkSelectRam0
- lda (zp),y
- stx bkSelect
- .else
- + lda (zp),y
- .ife
- sta (mp),y
- lda #bkACE
- sta bkSelect
- clc
- rts
- comCodeEnd = *
-
- ;*** aceMemZpload( [mp]=Source, .X=ZpDest, .Y=Length ) : .CS=err
-
- kernMemZpload = *
- lda mp+3
- beq nullPtrError
- cmp #aceMemRL
- bcc +
- beq zpLoadRL
- jmp comZpLoad-comCodeStart+comCodeBuffer
- + tya
- ldy #$91
-
- zeroPageReuOp = *
- bit aceRamlinkAccess
- bpl +
- php
- sei
- sta rlActivate
- + sta reu+7
- lda mp+2
- sta reu+6
- stx reu+2
- lda #0
- sta reu+3
- sta reu+8
- lda mp+0
- sta reu+4
- lda mp+1
- sta reu+5
- .if computer-64
- lda vic+$30
- ldx #$00
- stx vic+$30
- .ife
- sty reu+1
- .if computer-64
- sta vic+$30
- .ife
- bit aceRamlinkAccess
- bpl +
- sta rlSram
- sta rlDeactivate
- plp
- + clc
- rts
-
- nullPtrError = *
- lda #aceErrNullPointer
- sta errno
- sec
- rts
-
- zpLoadRL = *
- lda #$91
- zeroPageRlOp = * ;( .A=opcode, .X=zpaddr, .Y=len, [mp]=farPtr )
- sta ramlinkOpcode
- lda #0
- sty ramlinkLength+0
- sta ramlinkLength+1
- stx ramlinkNearPtr+0
- sta ramlinkNearPtr+1
- jmp ramlinkOp
-
- ramlinkOpcode .buf 1
- ramlinkLength .buf 2
- ramlinkNearPtr .buf 2
- ramlinkMpSave .buf 3
- ramlinkZpSave .buf 2
-
- ramlinkOp = * ;( [mp]=farPtr, ramlinkNearPtr, ramlinkLength, ramlinkOpcode )
- ;jmp ramlinkOpOld
- lda mp+0
- ldy mp+1
- ldx mp+2
- sta ramlinkMpSave+0
- sty ramlinkMpSave+1
- stx ramlinkMpSave+2
- lda zp+0
- ldy zp+1
- sta ramlinkZpSave+0
- sty ramlinkZpSave+1
- lda ramlinkNearPtr+0
- ldy ramlinkNearPtr+1
- sta zp+0
- sty zp+1
- clc
- lda mp+1
- adc aceRamlinkStart+0
- sta mp+1
- lda mp+2
- adc aceRamlinkStart+1
- sta mp+2
- - lda ramlinkLength+0
- ora ramlinkLength+1
- beq +
- jsr rlTransferChunk
- jmp -
- + lda ramlinkMpSave+0
- ldy ramlinkMpSave+1
- ldx ramlinkMpSave+2
- sta mp+0
- sty mp+1
- stx mp+2
- lda ramlinkZpSave+0
- ldy ramlinkZpSave+1
- sta zp+0
- sty zp+1
- clc
- rts
-
- rlTrSize .buf 1
-
- rlTransferChunk = * ;( [mp]=rlmem, (zp)=nearmem, rlLength, rlOpcode )
- ;** figure maximum page operation
- lda ramlinkLength+1
- beq +
- lda #0
- ldx mp+0
- beq rlTrDo
- sec
- sbc mp+0
- jmp rlTrDo
- + lda mp+0
- beq +
- lda #0
- sec
- sbc mp+0
- cmp ramlinkLength+0
- bcc rlTrDo
- + lda ramlinkLength+0
-
- ;** do the transfer
- rlTrDo = *
- tay
- sty rlTrSize
- jsr rlPageOp
-
- ;** update the pointers and remaining length
- clc
- lda rlTrSize
- bne +
- inc mp+1
- inc zp+1
- dec ramlinkLength+1
- rts
- + adc mp+0
- sta mp+0
- bcc +
- inc mp+1
- + clc
- lda zp+0
- adc rlTrSize
- sta zp+0
- bcc +
- inc zp+1
- + sec
- lda ramlinkLength+0
- sbc rlTrSize
- sta ramlinkLength+0
- bcs +
- dec ramlinkLength+1
- + rts
-
- rlPageOp = * ;( [mp]=rlmem, (zp)=nearmem, .Y=bytes, ramlinkOpcode )
- php
- sei
- sta rlActivate
- lda mp+1
- sta rlPageSelect+0
- lda mp+2
- sta rlPageSelect+1
- sta rlPageActivate
- lda aceReuRlSpeedPage+3
- bne rlPageOpReu ;xxx dependency on aceMemNull==0
- rlPageOpNonReu = *
- tya
- clc
- adc mp+0
- tax
-
- lda ramlinkOpcode
- cmp #$91
- bne rlPageOpWrite
- dex
- dey
- beq +
- - lda rlPageData,x
- sta (zp),y
- dex
- dey
- bne -
- + lda rlPageData,x
- sta (zp),y
- jmp rlPageOpContinue
-
- rlPageOpWrite = *
- dex
- dey
- beq +
- - lda (zp),y
- sta rlPageData,x
- dex
- dey
- bne -
- + lda (zp),y
- sta rlPageData,x
-
- rlPageOpContinue = *
- sta rlSram
- sta rlDeactivate
- plp
- rts
-
- rlPageOpReu = * ;( [mp]=rlmem, (zp)=nearmem, .Y=bytes, ramlinkOpcode )
- ;** ramlink hardware already switched in
- ldx #1
- tya
- beq +
- ldx #0
- cmp #0 ;xx cut-off value
- bcc rlPageOpNonReu
- + ldy ramlinkOpcode
- cpy #$90
- beq +
- ldy #$90 ;rl->reu->intern
- jsr rlPageOpReuRl
- ldy #$91
- jsr rlPageOpReuIntern
- jmp ++
- + ldy #$90 ;intern->reu->rl
- jsr rlPageOpReuIntern
- ldy #$91
- jsr rlPageOpReuRl
- + sta rlSram
- sta rlDeactivate
- plp
- rts
-
- rlPageOpReuIntern = * ;( .AX=bytes, .Y=op )
- sta reu+7 ;len
- stx reu+8
- sty temp1
- pha
- lda zp+0
- ldy zp+1
- sta reu+2
- sty reu+3
- lda aceReuRlSpeedPage+0
- ldy aceReuRlSpeedPage+1
- sta reu+4
- sty reu+5
- lda aceReuRlSpeedPage+2
- sta reu+6
- .if computer-64
- ldy vic+$30
- lda #0
- sta vic+$30
- .ife
- lda temp1
- sta reu+1
- .if computer-64
- sty vic+$30
- .ife
- pla
- rts
-
- rlPageOpReuRl = * ;( .AX=bytes, .Y=op )
- sta reu+7 ;len
- stx reu+8
- sty temp1
- pha
- lda mp+0
- ldy #>rlPageData
- sta reu+2
- sty reu+3
- lda aceReuRlSpeedPage+0
- ldy aceReuRlSpeedPage+1
- sta reu+4
- sty reu+5
- lda aceReuRlSpeedPage+2
- sta reu+6
- .if computer-64
- ldy vic+$30
- lda #0
- sta vic+$30
- .ife
- lda temp1
- sta reu+1
- .if computer-64
- sty vic+$30
- .ife
- pla
- rts
-
- ;ramlinkOpOld = * ;( [mp]=farPtr, ramlinkNearPtr, ramlinkLength, ramlinkOpcode)
- ; jsr rlRegs
- ; lda ramlinkOpcode
- ; sta rl+1
- ; lda ramlinkNearPtr+0
- ; ldy ramlinkNearPtr+1
- ; sta rl+2
- ; sty rl+3
- ; ldx #0
- ; lda mp+3
- ; cmp #aceMemRL
- ; beq +
- ; ldx #4
- ;+ lda mp+0
- ; sta rl+4
- ; clc
- ; lda aceRamlinkStart+0,x
- ; adc mp+1
- ; sta rl+5
- ; lda aceRamlinkStart+1,x
- ; adc mp+2
- ;clc
- ;adc #8
- ; sta rl+6
- ; lda ramlinkLength+0
- ; ldy ramlinkLength+1
- ; sta rl+7
- ; sty rl+8
- ; lda #0
- ; sta rl+10
- ; sta rl+16
- ; jsr rlExec
- ; clc
- ; rts
-
- ;*** aceMemZpstore( .X=ZpSource, [mp]=Dest, .Y=Length ) : .CS=err
-
- kernMemZpstore = *
- zpstore = * ;;internally called operation
- lda mp+3
- bne +
- jmp nullPtrError
- + cmp #aceMemRL
- bcc +
- beq zpStoreRL
- jmp comZpStore-comCodeStart+comCodeBuffer
- + tya
- ldy #$90
- jmp zeroPageReuOp
-
- zpStoreRL = *
- lda #$90
- jmp zeroPageRlOp
-
- ;*** aceMemFetch( [mp]=FarSource, (zp)=Ram0Dest, .AY=Length )
-
- fetchLength .buf 2
- fetchSaveSource .buf 1
- fetchSaveDest .buf 1
-
- kernMemFetch = *
- fetch = * ;;internally called operation
- ldx mp+3
- beq fetchNullPtrError
- cpx #aceMemRL
- bcs +
- ldx #$91
- jmp doReu
- + beq fetchRL
- cpy #0
- bne fetchLong
- tay
- bne fetchPage
- clc
- rts
-
- fetchNullPtrError = *
- jmp nullPtrError
-
- fetchPage = * ;( [mp]=from, (zp)=to, .Y=len(0=256) )
- ldx mp+2
- cpx #0
- beq +
- ;xx don't have to worry about the 64 having more than one bank yet
- jmp comCopyToRam0-comCodeStart+comCodeBuffer
- .if computer-64
- + stx bkSelectRam0
- .else
- + ldx #bkRam0
- stx bkSelect
- .ife
- dey
- beq +
- - lda (mp),y
- sta (zp),y
- dey
- bne -
- + lda (mp),y
- sta (zp),y
- lda #bkACE
- sta bkSelect
- clc
- rts
-
- fetchLong = *
- sta fetchLength
- sty fetchLength+1
- lda mp+1
- sta fetchSaveSource
- lda zp+1
- sta fetchSaveDest
- lda fetchLength+1
- beq fetchLongExit
- - ldy #0
- jsr fetchPage
- inc mp+1
- inc zp+1
- dec fetchLength+1
- bne -
-
- fetchLongExit = *
- ldy fetchLength
- beq +
- jsr fetchPage
- + lda fetchSaveSource
- sta mp+1
- lda fetchSaveDest
- sta zp+1
- clc
- rts
-
- fetchRL = *
- ldx #$91
- largeRlOp = *
- stx ramlinkOpcode
- sta ramlinkLength+0
- sty ramlinkLength+1
- lda zp+0
- ldy zp+1
- sta ramlinkNearPtr+0
- sty ramlinkNearPtr+1
- jmp ramlinkOp
-
- ;*** aceMemStash( (zp)=Ram0Source, [mp]=FarDest, .AY=length )
-
- stashLength .buf 2
- stashSaveSource .buf 1
- stashSaveDest .buf 1
-
- kernMemStash = *
- stash = * ;;internally called operation
- ldx mp+3
- beq stashNullPtrError
- cpx #aceMemRL
- bcs +
- ldx #$90
- jmp doReu
- + beq stashRL
- cpy #0
- bne stashLong
- tay
- bne stashPage
- clc
- rts
-
- stashNullPtrError = *
- jmp nullPtrError
-
- stashPage = *
- ldx mp+2
- cpx #0
- beq +
- ;xx don't have to worry about the 64 having more than one bank yet
- jmp comCopyFromRam0-comCodeStart+comCodeBuffer
- .if computer-64
- + stx bkSelectRam0
- .else
- + ldx #bkRam0
- stx bkSelect
- .ife
- dey
- beq +
- - lda (zp),y
- sta (mp),y
- dey
- bne -
- + lda (zp),y
- sta (mp),y
- lda #bkACE
- sta bkSelect
- clc
- rts
-
- stashLong = *
- sta stashLength
- sty stashLength+1
- lda zp+1
- sta stashSaveSource
- lda mp+1
- sta stashSaveDest
- lda stashLength+1
- beq stashLongExit
- - ldy #0
- jsr stashPage
- inc mp+1
- inc zp+1
- dec stashLength+1
- bne -
-
- stashLongExit = *
- ldy stashLength
- beq +
- ldx mp+2
- jsr stashPage
- + lda stashSaveSource
- sta zp+1
- lda stashSaveDest
- sta mp+1
- clc
- rts
-
- stashRL = *
- ldx #$90
- jmp largeRlOp
-
- ;*** ram0 load/store(.X) expansion memory [mp] <- -> (zp) for .AY bytes
-
- doReu = *
- bit aceRamlinkAccess
- bpl +
- php
- sei
- sta rlActivate
- + sta reu+7
- sty reu+8
- lda zp+0
- ldy zp+1
- sta reu+2
- sty reu+3
- lda mp+0
- ldy mp+1
- sta reu+4
- sty reu+5
- lda mp+2
- sta reu+6
- .if computer-64
- ldy vic+$30
- lda #0
- sta vic+$30
- .ife
- stx reu+1
- .if computer-64
- sty vic+$30
- .ife
- bit aceRamlinkAccess
- bpl +
- sta rlSram
- sta rlDeactivate
- plp
- + clc
- rts
-
- ;*** memory-allocation routines
-
- freemapBank .buf 2
- freemapDirty .buf 1
- freemapPage .buf 1
- searchMinFail .buf aceMemTypes
-
- initMemoryAlloc = *
- ldx #0
- ldy #0
- stx freemapPage
- stx freemapDirty
- - lda ram0FreeMap,x
- sta freemap,x
- bne +
- iny
- + inx
- bne -
- lda #0
- ldy #aceMemInternal
- sta freemapBank+0
- sty freemapBank+1
- lda #$00
- ldx #0
- - sta searchMinFail,x
- inx
- cpx #aceMemTypes
- bcc -
- jsr memReuRlSpeedInit
- clc
- rts
-
- memReuRlSpeedInit = * ;allocate reu page for ramlink-accessing speedup
- bit aceReuRlSpeedTry
- bmi +
- rts
- + lda #$ff ;owned by malloc
- sta allocProcID
- lda #1
- ldx #aceMemREU
- ldy #aceMemREU
- jsr kernPageAlloc
- ldx #3
- - lda mp,x
- sta aceReuRlSpeedPage,x
- dex
- bpl -
- rts
-
- freemapBankSave .buf 2
-
- getFreemap = * ;( .AY=bank )
- cmp freemapBank+0
- bne +
- cpy freemapBank+1
- bne +
- rts
-
- ;** save old freemap
- + sta freemapBankSave+0
- sty freemapBankSave+1
- lda freemapDirty
- beq +
- lda freemapBank+0
- ldy freemapBank+1
- jsr locateBankFreemap
- jsr setZpFreemap
- jsr stash
-
- ;** load new freemap
- + lda freemapBankSave+0
- ldy freemapBankSave+1
- sta freemapBank+0
- sty freemapBank+1
- jsr locateBankFreemap
- jsr setZpFreemap
- jsr fetch
- lda #0
- sta freemapDirty
- sta freemapPage
- rts
-
- setZpFreemap = * ;() : (zp)=#freemap, .AY=#256
- lda #<freemap
- ldy #>freemap
- sta zp+0
- sty zp+1
- lda #<256
- ldy #>256
- rts
-
- locateBankFreemap = * ;( .AY=bank ) : [mp]
- sta mp+2
- sty mp+3
- lda #<$ff00
- ldx #>$ff00
- sta mp+0
- stx mp+1
- cpy #aceMemInternal
- beq +
- rts
- + lda mp+2
- bne +
- ;** ram0
- lda aceRam0Freemap+0
- ldy aceRam0Freemap+1
- - sta mp+0
- sty mp+1
- rts
- + cmp #1
- bne +
- ;** ram1
- lda #0
- ldy aceRam1Freemap
- jmp -
- ;** exp.int.ram
- + lda #<$0400
- ldy #>$0400
- jmp -
-
- searchTypeStart .buf 1
- searchTypeStop .buf 1
- searchSize .buf 1
- allocProcID .buf 1
- searchTypeJmp .word 0,pageAllocREU,pageAllocRL,pageAllocInternal,0,0,0,0
- realMemTypes .byte aceMemNull,aceMemREU,aceMemRL,aceMemInternal
- .byte aceMemREU,aceMemRL,aceMemInternal
-
- ;kernel procids for pages: $00=free,$01=kernel,$ff=malloc,$fe=tpa,$fd=ramdisk,
- ; $fc=devices,$fb=reservedRamdisk
-
- kernMemAlloc = * ;( .A=pages, .X=stType, .Y=endType ) : [mp]=farPtr
- pha
- lda aceProcessID
- sta allocProcID
- pla
- kernPageAlloc = *
- sta searchSize
- cmp #0
- bne +
- jsr pageAllocFail
- clc
- rts
- + cpx #aceMemREU
- bcs +
- ldx #aceMemREU
- + cpy #aceMemInternal
- beq +
- bcc +
- ldy #aceMemInternal
- + stx searchTypeStart
- sty searchTypeStop
- - lda searchTypeStart
- cmp searchTypeStop
- beq +
- bcs pageAllocFail
- + ldx searchTypeStart
- lda searchMinFail,x
- beq +
- cmp searchSize
- beq pageAllocNext
- bcc pageAllocNext
- + lda searchTypeStart
- asl
- tax
- lda searchTypeJmp+0,x
- sta mp+0
- lda searchTypeJmp+1,x
- beq pageAllocNext
- sta mp+1
- jsr pageAllocDispatch
- bcc ++
- ldx searchTypeStart
- lda searchMinFail,x
- beq +
- cmp searchSize
- bcc pageAllocNext
- + lda searchSize
- sta searchMinFail,x
-
- pageAllocNext = *
- inc searchTypeStart
- jmp -
- + ldx mp+3
- lda mp+2
- cmp minUsedBank,x
- bcs +
- sta minUsedBank,x
- + cmp maxUsedBank,x
- bcc +
- sta maxUsedBank,x
- + clc
- rts
-
- pageAllocDispatch = *
- jmp (mp)
-
- pageAllocFail = *
- lda #aceErrInsufficientMemory
- sta errno
- lda #$00
- sta mp+0
- sta mp+1
- sta mp+2
- sta mp+3
- sec
- rts
-
- pageAllocREU = * ;( ) : .X=page, freemapBank, .CC=ok
- lda #aceMemREU
- sta mp+3
- lda aceReuCur
- ldx aceReuStart
- ldy aceReuBanks
- jsr searchType
- sta aceReuCur
- rts
-
- pageAllocInternal = *
- lda #aceMemInternal
- sta mp+3
- lda aceInternalCur
- ldx #$00
- ldy aceInternalBanks
- jsr searchType
- sta aceInternalCur
- rts
-
- pageAllocRL = *
- lda #aceMemRL
- sta mp+3
- lda aceRamlinkCur
- ldx #$00
- ldy aceRamlinkBanks
- jsr searchType
- sta aceRamlinkCur
- rts
-
- searchCurrent .buf 1
- searchStart .buf 1
- searchStop .buf 1
-
- searchType = * ;( mp+3=type, .A=current, .X=start, .Y=stop ):[mp],.CC,.A=cur,.X
- sta searchCurrent
- sta mp+2
- stx searchStart
- sty searchStop
- cpx searchStop
- bcc +
- rts
- / lda mp+2
- ldy mp+3
- jsr getFreemap
- ldy searchSize
- jsr searchFreemap
- bcs +
- lda #0
- sta mp+0
- stx mp+1
- lda mp+2
- clc
- rts
- + inc mp+2
- lda mp+2
- cmp searchStop
- bcc +
- lda searchStart
- sta mp+2
- + lda mp+2
- cmp searchCurrent
- bne -
- sec
- rts
-
- searchPages .buf 1
- newmax .buf 1
-
- searchFreemap = * ;( .Y=pages ) : .CC=found, .X=firstPg
- ;** first free
- ldx freemapPage
- lda freemap,x
- beq +
- - inx
- beq freemapFull
- lda freemap,x
- bne -
- stx freemapPage
- jmp +
- freemapFull = *
- sec
- rts
-
- ;** search
- + sty searchPages
- cpx #0
- beq +
- dex
- - ldy searchPages
- - inx
- beq freemapFull
- + lda freemap,x
- bne --
- dey
- bne -
-
- ;** allocate
- stx newmax
- ldy searchPages
- lda allocProcID
- - sta freemap,x
- dex
- dey
- bne -
- inx
- cpx freemapPage
- bne +
- ldy newmax
- iny
- sty freemapPage
- + lda #$ff
- sta freemapDirty
- sec
- lda aceFreeMemory+1
- sbc searchPages
- sta aceFreeMemory+1
- lda aceFreeMemory+2
- sbc #0
- sta aceFreeMemory+2
- bcs +
- dec aceFreeMemory+3
- + clc
- rts
-
- freePage .buf 1
- freeLen .buf 1
-
- kernMemFree = * ;( [mp]=FarPtr, .A=pages )
- ldx aceProcessID
- stx allocProcID
- kernPageFree = *
- sta freeLen
- cmp #0
- bne +
- jmp pageFreeExit
- + lda mp+3
- cmp #aceMemNull
- bne +
- lda #aceErrNullPointer
- jmp pageFreeFail
- + lda #aceErrInvalidFreeParms
- ldx mp+0
- bne pageFreeFail
- lda mp+1
- sta freePage
- clc
- adc freeLen
- bcc +
- lda #aceErrInvalidFreeParms
- jmp pageFreeFail
- + lda mp+2
- ldy mp+3
- jsr getFreemap
- lda allocProcID
- ldx freePage
- ldy freeLen
- - cmp freemap,x
- beq +
- lda #aceErrFreeNotOwned
- jmp pageFreeFail
- + inx
- dey
- bne -
- ldx freePage
- ldy freeLen
- lda #$00
- - sta freemap,x
- inx
- dey
- bne -
- lda #$ff
- sta freemapDirty
- lda freePage
- cmp freemapPage
- bcs +
- sta freemapPage
- ;** assume 2*(min-1)+len+1 new min
- + ldx mp+3
- lda searchMinFail,x
- beq ++
- sec
- sbc #1
- asl
- bcs +
- sec
- adc freeLen
- bcc ++
- + lda #0
- + sta searchMinFail,x
-
- clc
- lda aceFreeMemory+1
- adc freeLen
- sta aceFreeMemory+1
- bcc pageFreeExit
- inc aceFreeMemory+2
- bne pageFreeExit
- inc aceFreeMemory+3
-
- pageFreeExit = *
- clc
- rts
-
- pageFreeFail = *
- sta errno
- sec
- rts
-
- kernMemStat = *
- ldy #0
- - lda aceFreeMemory,y
- sta 0,x
- lda aceTotalMemory,y
- sta 4,x
- inx
- iny
- cpy #4
- bcc -
- lda aceProcessID
- clc
- rts
-
- reclaimMemType .buf 1
-
- reclaimProcMemory = *
- ldx #0
- - lda minUsedBank,x
- cmp maxUsedBank,x
- beq +
- bcs ++
- + stx reclaimMemType
- lda minUsedBank,x
- ldy maxUsedBank,x
- tax
- lda reclaimMemType
- jsr reclaimProcType
- ldx reclaimMemType
- + inx
- cpx #aceMemTypes
- bcc -
- rts
-
- rpBank .buf 2
- rpEnd .buf 1
-
- reclaimProcType = * ;( .A=type, .X=startBank, .Y=endBank )
- stx rpBank+0
- sta rpBank+1
- sty rpEnd
- - lda rpBank+0
- ldy rpBank+1
- cmp rpEnd
- beq +
- bcs ++
- + jsr getFreemap
- jsr reclaimProcFreemap
- inc rpBank+0
- bne -
- + rts
-
- reclaimProcFreemap = * ;( ) : .Y=pagesRemoved
- ldy #0
- ldx #0
- lda aceProcessID
- jmp +
- - inx
- beq ++
- + cmp freemap,x
- bne -
- lda #0
- sta freemap,x
- iny
- lda aceProcessID
- jmp -
- + cpy #0
- beq +
- lda #0
- sta freemapPage
- ldx freemapBank+1
- sta searchMinFail,x
- lda #$ff
- sta freemapDirty
- tya
- clc
- adc aceFreeMemory+1
- sta aceFreeMemory+1
- bcc +
- inc aceFreeMemory+2
- bne +
- inc aceFreeMemory+3
- + clc
- rts
-
- minUsedBank .buf aceMemTypes
- maxUsedBank .buf aceMemTypes ;plus 1
-
- clearMemoryInfo = *
- ldx #aceMemTypes-1
- - lda #$ff
- sta minUsedBank,x
- lda #$00
- sta maxUsedBank,x
- dex
- bpl -
- rts
-
- ;*** process primitives
-
- reclaimSave .buf 1
-
- reclaimOpenFiles = *
- jsr kernelClrchn
- ldx #0
- - lda lftable,x
- cmp #lfnull
- beq +
- lda pidtable,x
- cmp aceProcessID
- bne +
- stx reclaimSave
- txa
- jsr close
- ldx reclaimSave
- + inx
- cpx #fcbCount
- bcc -
- rts
-
- execArgc .buf 2
- execFrame .buf 44+4
- execStackNeed .buf 1
- execAddr .buf 2
- execWork .buf 2
- execErrExit .buf 1
- reloadFlag .buf 1
-
- kernProcExec = *
- internProcExec = *
- sta execArgc+0
- sty execArgc+1
- ;** load executable
- lda #<aceAppAddress
- ldy #>aceAppAddress
- sta execAddr+0
- sty execAddr+1
- jsr execLoadExternal
- bcc ++
- lda errno
- cmp #aceErrFileNotFound
- beq +
- pha
- jsr execReloadProg
- pla
- sta errno
- + sec
- rts
- + ldy #$ff
- - iny
- lda (zp),y
- sta stringBuffer,y
- bne -
- lda #$80
- sta reloadFlag
- jmp execCommon
-
- kernProcExecSub = *
- sta execArgc+0
- sty execArgc+1
- lda #0 ;null reload name means execsub
- sta stringBuffer+0
- lda #10
- sta execStackNeed
- lda zp+0
- ldy zp+1
- sta execAddr+0
- sty execAddr+1
- lda #$00
- sta reloadFlag
-
- execCommon = *
- ;** put in filename
- ldx #$ff
- - inx
- lda stringBuffer,x
- bne -
- inx
- stx syswork+0
- sec
- lda zw+0
- sbc syswork+0
- sta syswork+0
- lda zw+1
- sbc #0
- sta syswork+1
- ldy #0
- - lda stringBuffer,y
- sta (syswork),y
- beq +
- iny
- bne -
-
- ;** set up new frame info
- + ldx #1
- - lda aceFramePtr,x
- sta execFrame+0,x
- lda aceArgc,x
- sta execFrame+2,x
- lda aceArgv,x
- sta execFrame+4,x
- dex
- bpl -
- ldx #3
- - lda mp,x
- sta execFrame+14,x
- lda #0
- sta execFrame+18,x
- lda #aceMemNull
- sta execFrame+24,x
- dex
- bpl -
- tsx
- stx execFrame+22
- lda reloadFlag
- sta execFrame+23
- ldx #7
- - lda minUsedBank,x
- sta execFrame+28,x
- lda maxUsedBank,x
- sta execFrame+36,x
- dex
- bpl -
-
- ;** store new frame info
- sec
- lda syswork+0
- sbc #44
- sta syswork+0
- bcs +
- dec syswork+1
- + ldy #43
- - lda execFrame,y
- sta (syswork),y
- dey
- bpl -
-
- ;** set up globals for new process
- ldx #1
- - lda syswork+0,x
- sta aceFramePtr,x
- sta aceMemTop,x
- lda execArgc,x
- sta aceArgc,x
- lda zw,x
- sta aceArgv,x
- dex
- bpl -
- jsr clearMemoryInfo
-
- ;** call the new program
- inc aceProcessID
- lda execAddr+0
- ldy execAddr+1
- sta zp+0
- sty zp+1
- lda #0
- tax
- tay
- pha
- plp
- jsr aceEnter
- lda #0
- ldx #0
- jmp internExit
-
- aceEnter = *
- jmp (zp)
-
- exitCodeSave .buf 2
- exitArgc .buf 2
- exitArgv .buf 2
-
- kernProcExit = *
- internExit = *
- sta exitCodeSave+0
- stx exitCodeSave+1
- lda aceFramePtr+0
- ldy aceFramePtr+1
- sta syswork+0
- sty syswork+1
- ldy #43
- - lda (syswork),y
- sta execFrame,y
- dey
- bpl -
- ldx execFrame+22
- txs
- ldx #1
- - lda aceArgc,x
- sta exitArgc,x
- lda aceArgv,x
- sta exitArgv,x
- lda execFrame+2,x
- sta aceArgc,x
- lda execFrame+4,x
- sta aceArgv,x
- lda execFrame+0,x
- sta aceMemTop,x
- sta aceFramePtr,x
- dex
- bpl -
- lda execFrame+23
- sta reloadFlag
-
- jsr reclaimOpenFiles
- jsr reclaimProcMemory
- dec aceProcessID
- ldx #7
- - lda execFrame+28,x
- sta minUsedBank,x
- lda execFrame+36,x
- sta maxUsedBank,x
- dex
- bpl -
-
- ;** reload previous program if necessary
- ;xx note: currently, a process that was "execsub"ed cannot "exec" another
- ;xx process or else the "execsub"ed process will not be reloaded, since I
- ;xx only check the reactivated frame and I don't go all the way back up
- ;xx looking for a program to reload
- bit reloadFlag
- bpl +
- jsr execReloadProg
- + nop
-
- ;** prepare exit parameters
- ldx #3
- - lda execFrame+14,x
- sta mp,x
- dex
- bpl -
- ldx #1
- - lda exitArgc,x
- sta zp,x
- lda exitArgv,x
- sta zw,x
- dex
- bpl -
- lda exitCodeSave+0
- ldx exitCodeSave+1
- ldy #0
- clc
- rts
-
- execReloadProg = *
- lda aceFramePtr+0
- ldy aceFramePtr+1
- clc
- adc #44
- bcc +
- iny
- + sta zp+0
- sty zp+1
- lda zp+1
- cmp aceStackTop+1
- bcs +
- ldy #0
- lda (zp),y
- beq +
- lda aceFramePtr+0
- ldy aceFramePtr+1
- sta zw+0
- sty zw+1
- jsr execLoadExternal
- bcc +
- lda #<execReloadErrMsg
- ldy #>execReloadErrMsg
- sta zp+0
- sty zp+1
- lda #<execReloadErrMsgEnd-execReloadErrMsg
- ldy #>execReloadErrMsgEnd-execReloadErrMsg
- ldx #stderr
- jsr write
- lda #255
- ldx #0
- jmp internExit
- + clc
- rts
-
- execReloadErrMsg = *
- .asc "acekernel: Error attempting to reload program"
- .byte chrCR
- execReloadErrMsgEnd = *
-
- ;** load external file into transient program area
- loadPathPos .buf 1
- loadGiveUp .buf 1
- loadZpSave .buf 2
-
- execLoadExternal = * ;( (zp)=given program name, (zw)=high load address ) : (zp)
- lda #0
- sta aceAppAddress+3
- lda #0
- sta loadPathPos
- sta loadGiveUp
- lda zp+0
- ldy zp+1
- sta loadZpSave+0
- sty loadZpSave+1
-
- execTryLoadAgain = *
- ldy loadPathPos
- lda configBuf+$140,y
- beq execCmdNotFound
- lda loadGiveUp
- bne execCmdNotFound
- jsr getloadRestoreZp
- jsr getLoadPathname
- lda #<aceAppAddress
- ldy #>aceAppAddress
- jsr internBload
- jsr getloadRestoreZp
- bcs execLoadError
- lda aceAppAddress+3
- cmp #aceID1
- bne execBadProg
- lda aceAppAddress+4
- cmp #aceID2
- bne execBadProg
- lda aceAppAddress+5
- cmp #aceID3
- bne execBadProg
- clc
- rts
-
- execLoadError = *
- lda errno
- cmp #aceErrFileNotFound
- beq execTryLoadAgain
- cmp #aceErrDeviceNotPresent
- beq execTryLoadAgain
- cmp #aceErrIllegalDevice
- beq execTryLoadAgain
- cmp #aceErrDiskOnlyOperation
- beq execTryLoadAgain
- sec
- rts
-
- execBadProg = *
- lda #aceErrBadProgFormat
- sta errno
- sec
- rts
-
- execCmdNotFound = *
- lda #aceErrFileNotFound
- sta errno
- sec
- rts
-
- getloadRestoreZp = *
- lda loadZpSave+0
- ldy loadZpSave+1
- sta zp+0
- sty zp+1
- rts
-
- getLoadPathname = * ;( (zp)=filename, aceShellPath, loadPathPos ) : (zp)=lname
- ldy loadPathPos
- ldx #0
- - lda configBuf+$140,y
- beq +
- sta stringBuffer,x
- iny
- inx
- bne -
- + iny
- sty loadPathPos
- ldy #1
- lda (zp),y
- cmp #":"
- beq +
- dey
- lda (zp),y
- cmp #"/"
- bne getPathReally
- + sta loadGiveUp
- ldx #0
-
- getPathReally = *
- ldy #0
- - lda (zp),y
- sta stringBuffer,x
- beq +
- inx
- iny
- bne -
- + lda #<stringBuffer
- ldy #>stringBuffer
- sta zp+0
- sty zp+1
- rts
-
- ;blank line at end
-
- acewin.s
- 103
- ;ACE-128/64 kernel window driver: low-level screen-device operations
-
- winStart .buf 2
- winRows .buf 1
- winCols .buf 1
- winStartRow .buf 1
- winStartCol .buf 1
- winRowInc .buf 2
- winUnderline .buf 1
-
- textMode .buf 1
-
- screenInit = *
- lda #0
- sta textMode
- .if computer-64
- lda #25
- sta conScrReqRows
- jsr vdcStartup
- jsr vicInit
- ldx #80
- bit $d7
- bmi +
- ldx #40
- + lda #0
- jsr kernConScreen
- .else
- jsr vdcStartup
- jsr vicInit
- ldx #40
- bit configBuf+$c0
- bvc +
- ldx #80
- + lda #0
- jsr kernConScreen
- .ife
- rts
-
- kernWinMax = *
- winmax = *
- bit textMode
- bmi +
- jmp vicWinmax
- + jmp vdcWinmax
-
- kernWinCls = *
- wincls = *
- bit textMode
- bmi +
- jmp vicWincls
- + jmp vdcWincls
-
- kernWinSet = *
- winset = *
- bit textMode
- bmi +
- jmp vicWinset
- + jmp vdcWinset
-
- kernWinSize = *
- winsize = *
- bit textMode
- bmi +
- jmp vicWinsize
- + jmp vdcWinsize
-
- kernWinPut = *
- winput = *
- bit textMode
- bmi +
- jmp vicWinput
- + jmp vdcWinput
-
- kernWinColor = *
- wincolor = *
- bit textMode
- bmi +
- jmp vicWincolor
- + jmp vdcWincolor
-
- kernWinPos = *
- winpos = *
- bit textMode
- bmi +
- jmp vicWinpos
- + jmp vdcWinpos
-
- kernWinCursor = *
- wincursor = *
- bit textMode
- bmi +
- jmp vicWincursor
- + jmp vdcWincursor
-
- kernWinScroll = *
- winscroll = *
- bit textMode
- bmi +
- jmp vicWinscroll
- + jmp vdcWinscroll
-
- ;the end + blank line
-
- acevdc.s
- 1239
- ;ACE-128/64 kernel VDC 80-column screen driver code
-
- ;vdc memory layout: $0000=char,$1000=color,$2000=charset,$3000=altcharset
-
- vdcColorAddr = $1000
- vdcCharsetAddr = $2000
- vdcSelect = $d600
- vdcStatus = $d600
- vdcData = $d601
- vdcRowInc = 80
-
- vdcWinScrX .buf 1
- vdcWinScrY .buf 1
- vdcWinRows .buf 1
- vdcWinCols .buf 1
- vdcWinStart .buf 2
- vdcWinSaveSz .buf 2
- vdcScrRows .byte 25
- vdcScrCols .byte 80
- vdcRegNum .buf 1
- vdcCursorLoc .buf 2
- vdcRegSaves .buf 5
- vdcRegSave5 .buf 1
- vdcRegSave7 .buf 1
-
- vdcRegSaveIndex .byte 0,4,8,9,6,5,7
-
- vdcStartup = *
- ldy #6
- - lda vdcRegSaveIndex,y
- tax
- jsr vdcRead
- sta vdcRegSaves,y
- dey
- bpl -
- vdcReloadInit = *
- ;** charset
- jsr vdcFillMode
- jsr vdcLoadCharset
- ;xx fall through
-
- vdcInit = *
- jsr vdcFillMode
- ;** init screen colors
- nop
- ;** set attributes address
- lda #<vdcColorAddr
- ldy #>vdcColorAddr
- ldx #$14
- jsr vdcWrite16
- ;** cursor height
- lda #8
- ldx #$0b
- jsr vdcWrite
- ;** screen rows
- lda conScrReqRows
- sta vdcScrRows
- jsr vdcSetRows
- ;** window parameters
- jsr vdcWinmax
- rts
-
- vdcShutdown = *
- lda #25
- sta conScrReqRows
- jsr vdcInit
- ;** restore charsets
- lda #<$d000
- ldy #>$d000
- jsr vdcGetRomCharset
- jsr vdcLoadCharset
- lda #<$d800
- ldy #>$d800
- jsr vdcGetRomCharset
- lda #<$3000
- ldy #>$3000
- jsr vdcLoadSpecCharset
- ;** restore attributes
- lda #<$800
- ldy #>$800
- ldx #$14
- jsr vdcWrite16
- ;** restore cursor height
- lda #7
- ldx #$0b
- jsr vdcWrite
- rts
-
- vdcGetRomCharset = *
- sta syswork+0
- sty syswork+1
- lda #<$f000
- ldy #>$f000
- sta syswork+2
- sty syswork+3
- php
- sei
- lda #bkCharset
- sta bkSelect
- ldx #8
- ldy #0
- - lda (syswork+0),y
- sta (syswork+2),y
- iny
- bne -
- inc syswork+1
- inc syswork+3
- dex
- bne -
- lda #bkACE
- sta bkSelect
- plp
- rts
-
- chsSource = syswork+0
- chsCount = syswork+2
-
- vdcLoadCharset = *
- lda #<vdcCharsetAddr
- ldy #>vdcCharsetAddr
- vdcLoadSpecCharset = *
- jsr vdcAddrWrite16
- lda #<$f000
- ldy #>$f000
- sta chsSource+0
- sty chsSource+1
- ldx #0
- stx chsCount
- lda #%00111110 ;ram0 + i/o
- sta bkSelect
-
- charLoop = *
- lda #$1f
- sta vdcRegNum
- sta vdcSelect
- ldy #0
- - lda (chsSource),y
- - bit vdcStatus
- bpl -
- sta vdcData
- iny
- cpy #8
- bcc --
- lda #$00
- jsr vdcRamWrite
- ldx #$1e
- lda #7
- jsr vdcWrite
- clc
- lda chsSource+0
- adc #8
- sta chsSource+0
- bcc +
- inc chsSource+1
- + inc chsCount
- bne charLoop
- lda #bkACE
- sta bkSelect
- rts
-
- vdcFillMode = * ;( )
- ldx #$18
- jsr vdcRead
- and #$7f
- jsr vdcWrite
- rts
-
- vdcCopyMode = * ;( )
- ldx #$18
- jsr vdcRead
- ora #$80
- jsr vdcWrite
- rts
-
- vdcRamWrite = * ;( .A=value )
- ldx #$1f
-
- vdcWrite = * ;( .X=register, .A=value )
- stx vdcRegNum
- stx vdcSelect
- - bit vdcStatus
- bpl -
- sta vdcData
- rts
-
- vdcAddrWrite16 = * ;( .AY=value )
- ldx #$12
-
- vdcWrite16 = * ;( .X=hiRegister, .AY=value )
- stx vdcRegNum
- stx vdcSelect
- - bit vdcStatus
- bpl -
- sty vdcData
- inx
- stx vdcRegNum
- stx vdcSelect
- - bit vdcStatus
- bpl -
- sta vdcData
- rts
-
- vdcRamRead = * ;( ) : .A=value
- ldx #$1f
-
- vdcRead = * ;( .X=register ) : .A=value
- stx vdcRegNum
- stx vdcSelect
- - bit vdcStatus
- bpl -
- lda vdcData
- rts
-
- vdcWinmax = *
- lda #0
- sta vdcWinScrX
- sta vdcWinScrY
- sta vdcWinStart+0
- sta vdcWinStart+1
- lda vdcScrRows
- ldx vdcScrCols
- sta vdcWinRows
- stx vdcWinCols
- jsr conWinChangeCallback
- clc
- rts
-
- vdcClsColor .buf 1
-
- vdcWincls = *
- stx vdcFillByte
- sty vdcClsColor
- sta syswork+2
- bit syswork+2
- bpl +
- jsr vdcWinclsSetup
- jsr vdcRowFill
- + bit syswork+2
- bvc +
- jsr vdcWinclsSetup
- lda vdcClsColor
- sta vdcFillByte
- jsr vdcAddColor
- jsr vdcRowFill
- + rts
-
- vdcWinclsSetup = *
- lda vdcWinStart+0
- ldy vdcWinStart+1
- sta syswork+0
- sty syswork+1
- lda vdcWinRows
- sta vdcFillRows
- rts
-
- vdcAddColor = *
- clc
- lda syswork+1
- adc #>vdcColorAddr
- sta syswork+1
- rts
-
- vdcFillByte .buf 1
- vdcFillRows .buf 1
- vdcFillCols .buf 1
-
- vdcRowFill = * ;( (sw+0)=addr++, vdcFillByte, vdcFillRows-- )
- lda vdcWinCols
- sta vdcFillCols
- lda vdcFillRows
- bne +
- rts
- / jsr vdcColFill
- clc
- lda syswork+0
- adc #vdcRowInc
- sta syswork+0
- bcc +
- inc syswork+1
- + dec vdcFillRows
- bne -
- rts
-
- vdcColFill = * ;( (sw+0)=addr, vdcFillByte, vdcFillCols )
- lda syswork+0
- ldy syswork+1
- jsr vdcAddrWrite16
- vdcColFillGotAddr = *
- lda vdcFillCols
- beq +
- lda vdcFillByte
- jsr vdcRamWrite
- ldx vdcFillCols
- dex
- beq +
- txa
- ldx #$1e
- jsr vdcWrite
- + rts
-
- vdcWinsetRows .buf 1
- vdcWinsetCols .buf 1
-
- vdcWinset = *
- sta vdcWinsetRows
- cmp #0
- beq vdcWinsetErr
- stx vdcWinsetCols
- cpx #0
- beq vdcWinsetErr
- clc
- adc syswork+0
- cmp vdcScrRows
- beq +
- bcc +
-
- vdcWinsetErr = *
- lda #aceErrInvalidWindowParms
- sta errno
- sec
- rts
-
- + clc
- lda vdcWinsetCols
- adc syswork+1
- cmp vdcScrCols
- beq +
- bcs vdcWinsetErr
- + lda syswork+0
- ldx syswork+1
- sta vdcWinScrY
- stx vdcWinScrX
- jsr vdcMult80
- lda syswork+0
- ldy syswork+1
- sta vdcWinStart+0
- sty vdcWinStart+1
- lda vdcWinsetRows
- ldx vdcWinsetCols
- sta vdcWinRows
- stx vdcWinCols
- ;xx vdcWinSaveSz
- jsr conWinChangeCallback
- lda vdcWinScrY
- ldx vdcWinScrX
- sta syswork+0
- stx syswork+1
- clc
- rts
-
- vdcWinsize = *
- lda vdcWinStart+0
- ldy vdcWinStart+1
- sta syswork+2
- sty syswork+3
- lda #<vdcRowInc
- ldy #>vdcRowInc
- sta syswork+4
- sty syswork+5
- lda vdcWinScrY
- ldx vdcWinScrX
- sta syswork+0
- stx syswork+1
- lda vdcWinRows
- ldx vdcWinCols
- clc
- rts
-
- vdcPutWhich .buf 1
- vdcPutColor .buf 1
- vdcPutLen .buf 1
-
- vdcWinput = *
- sta vdcPutWhich
- sty vdcFillByte
- stx vdcPutLen
- bit vdcPutWhich
- bpl vdcWinputColor
- lda syswork+0
- ldy syswork+1
- jsr vdcAddrWrite16
- ldy #0
- cpy vdcPutLen
- beq +
- lda #$1f
- sta vdcRegNum
- sta vdcSelect
- - lda (syswork+2),y
- - bit vdcStatus
- bpl -
- sta vdcData
- iny
- cpy vdcPutLen
- bcc --
- + sec
- lda syswork+5
- sbc vdcPutLen
- beq vdcWinputColor
- tay
- lda syswork+4
- jsr vdcRamWrite
- dey
- beq vdcWinputColor
- tya
- ldx #$1e
- jsr vdcWrite
-
- vdcWinputColor = *
- bit vdcPutWhich
- bvs +
- rts
- + lda vdcPutWhich
- and #$20
- beq +
- lda vdcFillByte
- and #$0f
- sta vdcFillByte
- + lda vdcPutWhich
- and #$10
- beq +
- lda syswork+6
- and #$f0
- ora vdcFillByte
- sta vdcFillByte
- + lda syswork+1
- clc
- adc #>vdcColorAddr
- tay
- lda syswork+0
- jsr vdcAddrWrite16
- lda syswork+5
- sta vdcFillCols
- jsr vdcColFillGotAddr
- rts
-
- vdcWincolor = *
- php
- sei
- bit vdcSsActive
- bmi vdcWincolorSsActive
- cmp #128
- bcc +
- txa
- ldx #$1a
- jsr vdcWrite
- + and #64
- beq +
- tya
- nop
- + ldx #$1a
- jsr vdcRead
- and #$0f
- tax
- tay
- plp
- rts
-
- vdcWincolorSsActive = *
- cmp #128
- bcc +
- stx vdcSsColor
- + lda vdcSsColor
- and #$0f
- tax
- tay
- plp
- rts
-
- vdcWinpos = *
- jsr vdcMult80
- clc
- lda syswork+0
- adc vdcWinStart+0
- sta syswork+0
- lda syswork+1
- adc vdcWinStart+1
- sta syswork+1
- rts
-
- vdcMult80 = * ;( .A=row:0-255, .X=col ) : (sw+0)=row*80+col, .X:unch
- sta syswork+0
- ldy #0
- sty syswork+1
- asl
- rol syswork+1
- asl
- rol syswork+1
- adc syswork+0
- bcc +
- inc syswork+1
- + asl
- rol syswork+1
- asl
- rol syswork+1
- asl
- rol syswork+1
- asl
- rol syswork+1
- stx syswork+0
- clc
- adc syswork+0
- bcc +
- inc syswork+1
- + sta syswork+0
- rts
-
- vdcCursorSave .buf 1
- vdcCursorColor .buf 1
-
- vdcWincursor = *
- cmp #0
- beq vdcCursorOff
- sta vdcCursorSave
- sty vdcCursorColor
- lda syswork+0
- ldy syswork+1
- sta vdcCursorLoc+0
- sty vdcCursorLoc+1
- ldx #$0e
- jsr vdcWrite16
- ldx #$0a
- jsr vdcRead
- and #$1f
- ldy vdcCursorSave
- cpy #$fa
- bne +
- ora #$40
- jmp ++
- + ora #$60
- + jsr vdcWrite
- jsr vdcSetColorAddr
- jsr vdcRamRead
- sta vdcCursorSave
- jsr vdcSetColorAddr
- lda vdcCursorSave
- and #$f0
- ora vdcCursorColor
- jsr vdcRamWrite
- rts
-
- vdcCursorOff = *
- lda vdcCursorLoc+0
- ldy vdcCursorLoc+1
- sta syswork+0
- sty syswork+1
- ldx #$0a
- jsr vdcRead
- and #$1f
- ora #$20
- jsr vdcWrite
- jsr vdcSetColorAddr
- lda vdcCursorSave
- jsr vdcRamWrite
- rts
-
- vdcSetColorAddr = * ;( (sw+0)=addr )
- clc
- lda syswork+1
- adc #>vdcColorAddr
- tay
- lda syswork+0
- jmp vdcAddrWrite16
-
- vdcIrqCursor = *
- ;** do nothing
- rts
-
- vdcScrollDest = syswork+0
- vdcScrollSource = syswork+2
- vdcScrollRows .buf 1
- vdcScrollExtra .buf 1
-
- vdcWinscroll = *
- sta syswork+5
- sty vdcClsColor
- stx vdcScrollExtra
- cpx #0
- bne +
- rts
- + cpx vdcWinRows
- bcc +
- ldx syswork+4
- lda syswork+5
- ldy vdcClsColor
- jsr vdcWincls
- - rts
- + lda syswork+5
- and #%1000
- bne +
- lda syswork+5
- and #%0100
- beq -
- jmp vdcScrollDown
- + bit syswork+5
- bpl +
- jsr vdcScrollUpSetup
- jsr vdcRowScrollUp
- lda syswork+4
- jsr vdcDoScrollExtra
- + bit syswork+5
- bvc +
- jsr vdcScrollUpSetup
- jsr vdcScrollAddColor
- jsr vdcRowScrollUp
- lda vdcClsColor
- jsr vdcDoScrollExtra
- + rts
-
- vdcScrollUpSetup = *
- lda vdcScrollExtra
- ldx #0
- jsr vdcWinpos
- lda syswork+0
- ldy syswork+1
- sta vdcScrollSource+0
- sty vdcScrollSource+1
- lda vdcWinStart+0
- ldy vdcWinStart+1
- sta vdcScrollDest+0
- sty vdcScrollDest+1
- sec
- lda vdcWinRows
- sbc vdcScrollExtra
- sta vdcScrollRows
- rts
-
- vdcScrollAddColor = *
- clc
- lda syswork+1
- adc #>vdcColorAddr
- sta syswork+1
- lda syswork+3
- adc #>vdcColorAddr
- sta syswork+3
- rts
-
- vdcDoScrollExtra = * ;( .A=fillByte, (vdcScrollDest)=addr )
- sta vdcFillByte
- lda vdcScrollExtra
- sta vdcFillRows
- lda vdcWinCols
- sta vdcFillCols
- jsr vdcRowFill
- rts
-
- vdcRowScrollUp = * ;( vdcScrollSource++, vdcScrollDest++, vdcScrollRows-- )
- lda vdcScrollRows
- bne +
- rts
- + jsr vdcCopyMode
- - jsr vdcColScroll
- clc
- lda vdcScrollSource+0
- adc #vdcRowInc
- sta vdcScrollSource+0
- bcc +
- inc vdcScrollSource+1
- + clc
- lda vdcScrollDest+0
- adc #vdcRowInc
- sta vdcScrollDest+0
- bcc +
- inc vdcScrollDest+1
- + dec vdcScrollRows
- bne -
- jsr vdcFillMode
- rts
-
- vdcColScroll = * ;( vdcScrollSource, vdcScrollDest, vdcWinCols )
- lda vdcScrollDest+0
- ldy vdcScrollDest+1
- jsr vdcAddrWrite16
- lda vdcScrollSource+0
- ldy vdcScrollSource+1
- ldx #$20
- jsr vdcWrite16
- lda vdcWinCols
- ldx #$1e
- jsr vdcWrite
- rts
-
- vdcScrollDown = *
- bit syswork+5
- bpl +
- jsr vdcScrollDownSetup
- jsr vdcRowScrollDown
- lda syswork+4
- jsr vdcDoScrollDownExtra
- + bit syswork+5
- bvc +
- jsr vdcScrollDownSetup
- jsr vdcScrollAddColor
- jsr vdcRowScrollDown
- lda vdcClsColor
- jsr vdcDoScrollDownExtra
- + rts
-
- vdcScrollDownSetup = *
- clc ;sic
- lda vdcWinRows
- sbc vdcScrollExtra
- ldx #0
- jsr vdcWinpos
- lda syswork+0
- ldy syswork+1
- sta vdcScrollSource+0
- sty vdcScrollSource+1
- sec
- lda vdcWinRows
- sbc #1
- ldx #0
- jsr vdcWinpos
- lda syswork+0
- ldy syswork+1
- sta vdcScrollDest+0
- sty vdcScrollDest+1
- sec
- lda vdcWinRows
- sbc vdcScrollExtra
- sta vdcScrollRows
- rts
-
- vdcRowScrollDown = * ;( vdcScrollSource--, vdcScrollDest--, vdcScrollRows-- )
- lda vdcScrollRows
- bne +
- rts
- + jsr vdcCopyMode
- - jsr vdcColScroll
- sec
- lda vdcScrollSource+0
- sbc #vdcRowInc
- sta vdcScrollSource+0
- bcs +
- dec vdcScrollSource+1
- + sec
- lda vdcScrollDest+0
- sbc #vdcRowInc
- sta vdcScrollDest+0
- bcs +
- dec vdcScrollDest+1
- + dec vdcScrollRows
- bne -
- jsr vdcFillMode
- rts
-
- vdcDoScrollDownExtra = *
- pha
- clc
- lda vdcScrollSource+0
- ldy vdcScrollSource+1
- adc #vdcRowInc
- bcc +
- iny
- + sta vdcScrollDest+0
- sty vdcScrollDest+1
- pla
- jmp vdcDoScrollExtra
-
- ;*** interrupt screen-saver code: **potential vdc-access conflicts**
-
- vdcSsColor .buf 1
- vdcSsMode .buf 1
- vdcSsActive .byte $00
-
- vdcScreenSave = *
- - bit vdcStatus
- bpl -
- lda vdcRegNum
- pha
- ldx #$19
- jsr vdcRead
- sta vdcSsMode
- ldx #$1a
- jsr vdcRead
- sta vdcSsColor
- lda #$ff
- sta vdcSsActive
- ldx #$19
- lda vdcSsMode
- and #%10111111
- jsr vdcWrite
- ldx #$1a
- lda #$00
- jsr vdcWrite
- pla
- sta vdcRegNum
- sta vdcSelect
- - bit vdcStatus
- bpl -
- rts
-
- vdcScreenUnsave = *
- - bit vdcStatus
- bpl -
- lda vdcRegNum
- pha
- ldx #$19
- lda vdcSsMode
- jsr vdcWrite
- ldx #$1a
- lda vdcSsColor
- jsr vdcWrite
- lda #$00
- sta vdcSsActive
- pla
- sta vdcRegNum
- sta vdcSelect
- - bit vdcStatus
- bpl -
- rts
-
- ;=== hires stuff ===
-
- ;vdc register values courtesy of Fred Bowen of Commodore
-
- ;vdc memory: 00000-21359=even frame, 21360-42719=odd frame
-
- vdcEvenFrame = 0
- vdcOddFrame = 21360
- vdcGrMode .buf 1 ;$00=lores, $ff=hires
- vdcGrColor .buf 1
-
- kernGrScreen = * ; ( .A=grType, .X=borderColor, .Y=BgFgColor )
- pha ; : .A=cols8, (sw+0)=rows, .X=xAspect
- sty vdcGrColor
- tya
- ldx #4
- - asl
- lsr vdcGrColor
- dex
- bne -
- ora vdcGrColor
- sta vdcGrColor
- ldx #26
- jsr vdcWrite
- lda #<640
- ldy #>640
- sta conMouseMaxX+0
- sty conMouseMaxX+1
- pla
- cmp #1
- beq +
- lda configBuf+$aa
- cmp #64
- bcc +
- jmp aceGrScreenHires
- + lda #$00
- sta vdcGrMode
- ;** re-select 25 rows
- lda #25
- sta conScrReqRows
- jsr vdcInit
- ldx #25
- jsr vdcRead
- and #%00001111
- ora #%10000000
- jsr vdcWrite
- lda #$00
- jsr vdcGrFill
- lda #<200
- ldy #>200
- sta syswork+0
- sty syswork+1
- sta conMouseMaxY+0
- sty conMouseMaxY+1
- jsr conMouseBounds
- lda #80
- ldx #2
- clc
- rts
-
- aceGrScreenHires = *
- lda #$ff
- sta vdcGrMode
- ldy #0
- - ldx initRegs,y
- lda initVals,y
- cpx #25
- bne +
- jsr vdcRead
- and #$0f
- ora initVals,y
- + jsr vdcWrite
- iny
- cpy #initVals-initRegs
- bcc -
- lda #$00
- jsr vdcGrFill
- lda #<491
- ldy #>491
- sta syswork+0
- sty syswork+1
- sta conMouseMaxY+0
- sty conMouseMaxY+1
- jsr conMouseBounds
- lda #80
- ldx #1
- clc
- rts
-
- initRegs = *
- .byte 000,001,002,004,005,006,007,008,009,024,025,027,028,020,021
- .byte 012,013,026,012,013
- initVals = *
- .byte $7e,$50,$66,$4c,006,$4c,$47,003,006,000,$80,000,016,166,224
- .byte 000,000,224,0,0 ;last two = >evenFrame,<evenFrame
-
- kernGrExit = * ;( )
- jsr $e179
- lda configBuf+$a9
- sta conScrReqRows
- jsr vdcReloadInit
- lda #$e0
- ldx #$20
- ldy #$0f
- jsr vdcWincls
- jsr conWinInit
- clc
- rts
-
- kernGrFill = * ;( .A=fillValue )
- vdcGrFill = *
- pha
- lda #>vdcEvenFrame
- ldy #<vdcEvenFrame
- jsr vdcAddrWrite16
- ldx #31
- pla
- jsr vdcWrite
- ldy #161
- bit vdcGrMode
- bmi +
- ldy #63
- + nop
- - ldx #30
- lda #$00
- jsr vdcWrite
- dey
- bne -
- bit vdcGrMode
- bpl +
- lda #<vdcOddFrame+19600
- ldy #>vdcOddFrame+19600
- jsr vdcAddrWrite16
- lda #$00
- jsr vdcRamWrite
- lda #79
- ldx #$1e
- jsr vdcWrite
- + clc
- rts
-
- vdcBmFrame .buf 1
- vdcBmRows .buf 1
- vdcBmCols .buf 1
- vdcBmBuffer = stringBuffer
- vdcGrOpFlags = syswork+15
- vdcGrOpFlagsIn .buf 1
-
- kernGrOp = * ;( .A=opflags, .X=X, (sw+0)=Y, .Y=cols, (sw+2)=rows, sw+4=interlv,
- ;** sw+5=fillval, (sw+6)=sPtr, (sw+8)=dPtr, (sw+10)=mPtr )
- ;** <all syswork arguments can change>
- ;** opflags: $80=get, $40=put, $20=copy, $10=fill,$8=mask,$4=and,$2=xor,$1=or
- sta vdcGrOpFlags
- sta vdcGrOpFlagsIn
- sty vdcBmCols
- and #$0f
- beq +
- bit vdcGrOpFlags
- bmi +
- lda #<vdcBmBuffer
- ldy #>vdcBmBuffer
- sta syswork+8
- sty syswork+9
- lda vdcGrOpFlags
- ora #$80
- sta vdcGrOpFlags
- + clc
- lda vdcBmCols
- adc syswork+4
- sta syswork+4
- bit vdcGrMode
- bmi +
- lda syswork+0
- ldy syswork+1
- jsr vdcMult80
- jmp vdcGrOpLoop
- + lsr syswork+1
- lda syswork+0
- sta vdcBmFrame
- ror
- jsr vdcMult80
- lda vdcBmFrame
- and #$01
- beq vdcGrOpLoop
- clc
- lda syswork+0
- adc #<vdcOddFrame
- sta syswork+0
- lda syswork+1
- adc #>vdcOddFrame
- sta syswork+1
- vdcGrOpLoop = *
- ldy #0
- cpy vdcBmCols
- bne vdcGrOpGet
- jmp vdcGrOpContinue
- vdcGrOpGet = *
- bit vdcGrOpFlags
- bpl vdcGrOpPut
- lda syswork+0
- ldy syswork+1
- jsr vdcAddrWrite16
- lda #$1f
- sta vdcRegNum
- sta vdcSelect
- ldy #0
- - bit vdcStatus
- bpl -
- lda vdcData
- sta (syswork+8),y
- iny
- cpy vdcBmCols
- bcc -
- vdcGrOpPut = *
- bit vdcGrOpFlags
- bvc vdcGrOpCopy
- lda syswork+0
- ldy syswork+1
- jsr vdcAddrWrite16
- lda #$1f
- sta vdcRegNum
- sta vdcSelect
- ldy #0
- - lda vdcGrOpFlags
- and #$0f
- bne +
- - lda (syswork+6),y
- jmp vdcGrPut
- + and #$08
- bne +
- lda (syswork+8),y
- jmp ++
- + lda (syswork+10),y
- eor #$ff
- and (syswork+8),y
- + ldx vdcGrOpFlags
- stx syswork+14
- lsr syswork+14
- bcc +
- ora (syswork+6),y
- jmp vdcGrPut
- + lsr syswork+14
- bcc +
- eor (syswork+6),y
- jmp vdcGrPut
- + lsr syswork+14
- bcc -
- sta syswork+14
- lda (syswork+6),y
- eor #$ff
- and syswork+14
-
- vdcGrPut = *
- - bit vdcStatus
- bpl -
- sta vdcData
- iny
- cpy vdcBmCols
- bcc ---
- vdcGrOpCopy = *
- lda vdcGrOpFlags
- and #$20
- beq vdcGrOpFill
- ldx #$20
- lda syswork+0
- ldy syswork+1
- jsr vdcWrite16
- lda #$00 ;xx get real address
- ldy #$00
- jsr vdcAddrWrite16
- ldx #$1e
- lda vdcBmCols
- jsr vdcWrite
- vdcGrOpFill = *
- lda vdcGrOpFlags
- and #$10
- beq vdcGrOpContinue
- lda syswork+0
- ldy syswork+1
- jsr vdcAddrWrite16
- lda syswork+5
- jsr vdcRamWrite
- ldx vdcBmCols
- dex
- beq vdcGrOpContinue
- txa
- ldx #$1e
- jsr vdcWrite
- vdcGrOpContinue = *
- lda syswork+2+0
- bne +
- dec syswork+2+1
- + dec syswork+2+0
- lda syswork+2+0
- ora syswork+2+1
- bne +
- clc
- rts
- + bit vdcGrOpFlagsIn
- bmi +
- clc
- lda syswork+8+0
- adc syswork+4
- sta syswork+8+0
- bcc +
- inc syswork+8+1
- + bit vdcGrOpFlags
- bvc +
- clc
- lda syswork+6+0
- adc syswork+4
- sta syswork+6+0
- bcc +
- inc syswork+6+1
- + lda vdcGrOpFlags
- and #$08
- beq +
- clc
- lda syswork+10+0
- adc syswork+4
- sta syswork+10+0
- bcc +
- inc syswork+10+1
- + bit vdcGrMode
- bmi +
- lda #<80
- ldy #>80
- jmp +++
- + lda vdcBmFrame
- inc vdcBmFrame
- and #$01
- bne +
- lda #<vdcOddFrame
- ldy #>vdcOddFrame
- jmp ++
- vdcOddToEvenDiff = 65535-vdcOddFrame+1+80
- + lda #<vdcOddToEvenDiff
- ldy #>vdcOddToEvenDiff
- + clc
- adc syswork+0
- sta syswork+0
- tya
- adc syswork+1
- sta syswork+1
- jmp vdcGrOpLoop
-
- vdcScreenRvs = *
- ldx #$18
- jsr vdcRead
- ora #%01000000
- jsr vdcWrite
- rts
-
- vdcScreenRvsOff = *
- ldx #$18
- jsr vdcRead
- and #%10111111
- jsr vdcWrite
- rts
-
- vdcSetRows = * ;( .A=rows )
- cmp #25+1
- bcc +
- cmp configBuf+$cf
- bcs vdcVerticalCrossover
- + cmp #30
- bcc +
- lda #30
- + pha
- ldy #6
- - lda vdcRegSaveIndex,y
- tax
- lda vdcRegSaves,y
- jsr vdcWrite
- dey
- bpl -
- pla
- ldx #6
- jsr vdcWrite
- cmp #25+1
- bcc +
- sec
- sbc #26
- tay
- clc
- lda vdcRegSave7
- adc vdcVert7Vals,y
- ldx #7
- jsr vdcWrite
- lda vdcVert5Vals,y
- ldx #5
- jsr vdcWrite
- + rts
- vdcVert7Vals .byte 1,1,2,2,2
- vdcVert5Vals .byte 6,4,6,5,1
-
- vdcVerticalCrossover = * ;( .A=rows ) : .A=vdcReg5, .Y=vdcReg7
- cmp #51
- bcc +
- lda #51
- + pha
- ldy #6
- - lda vdcRegSaveIndex,y
- tax
- lda vdcRegFiftyRows,y
- jsr vdcWrite
- dey
- bpl -
- pla
- ldx #6
- jsr vdcWrite
- tay
- clc
- adc #1
- lsr
- and #%11111110
- clc
- adc #27
- cpy #50
- bcc +
- lda #53
- + ldx #7
- jsr vdcWrite
- rts
- vdcRegFiftyRows .byte $80,$38,$ff,$e8,51,$06,$35
-
- ;the end + blank line
-
- acevic.s
- 738
- ;ACE-128/64 kernel VIC 40-column screen driver code
-
- ;aceCharSetPage = aceStatB+103 ;(1)
- ;aceVic40Page = aceStatB+104 ;(1)
-
- vicRowInc = 40
-
- vicWinScrX .buf 1
- vicWinScrY .buf 1
- vicWinRows .buf 1
- vicWinCols .buf 1
- vicWinStart .buf 2
- vicColorOff .buf 1
-
- vicInitTemp .buf 1
-
- vicInit = *
- lda vic+$11
- and #%00011111
- sta vic+$11
- lda aceVic40Page
- asl
- asl
- and #%11110000
- sta vicInitTemp
- lda aceCharSetPage
- lsr
- lsr
- and #%00001111
- ora vicInitTemp
- sta vic+$18
- lda $dd00
- and #%11111100
- sta $dd00
- ;** window parameters
- sec
- lda #$d8
- sbc aceVic40Page
- sta vicColorOff
- jsr vicWinmax
- rts
-
- vicShutdown = *
- lda vic+$11
- and #%00011111
- sta vic+$11
- lda $dd00
- and #%11111100
- ora #%00000011
- sta $dd00
- lda #$16
- sta vic+$18
- rts
-
- vicWinmax = *
- lda #0
- sta vicWinScrX
- sta vicWinScrY
- lda #$00
- ldy aceVic40Page
- sta vicWinStart+0
- sty vicWinStart+1
- lda #25
- ldx #40
- sta vicWinRows
- stx vicWinCols
- jsr conWinChangeCallback
- clc
- rts
-
- rgbi2vicTab .byte 0,11,6,14,5,13,12,3,2,10,8,4,9,7,15,1
-
- rgbi2vic = *
- and #$0f
- tax
- lda rgbi2vicTab,x
- rts
-
- vic2rgbiTab .byte 0,15,8,7,11,4,2,13,10,12,9,1,6,5,3,14
-
- vic2rgbi = *
- and #$0f
- tax
- lda vic2rgbiTab,x
- rts
-
- vicClsColor .buf 1
-
- vicWincls = *
- stx vicFillByte
- sty vicClsColor
- sta syswork+2
- bit syswork+2
- bpl +
- jsr vicWinclsSetup
- jsr vicRowFill
- + bit syswork+2
- bvc +
- jsr vicWinclsSetup
- lda vicClsColor
- jsr rgbi2vic
- sta vicFillByte
- jsr vicAddColor
- jsr vicRowFill
- + rts
-
- vicWinclsSetup = *
- lda vicWinStart+0
- ldy vicWinStart+1
- sta syswork+0
- sty syswork+1
- lda vicWinRows
- sta vicFillRows
- rts
-
- vicAddColor = *
- clc
- lda syswork+1
- adc vicColorOff
- sta syswork+1
- rts
-
- vicFillByte .buf 1
- vicFillRows .buf 1
- vicFillCols .buf 1
-
- vicRowFill = * ;( (sw+0)=addr++, vicFillByte, vicFillRows-- )
- lda vicWinCols
- sta vicFillCols
- lda vicFillRows
- bne +
- rts
- / jsr vicColFill
- clc
- lda syswork+0
- adc #vicRowInc
- sta syswork+0
- bcc +
- inc syswork+1
- + dec vicFillRows
- bne -
- rts
-
- vicColFill = * ;( (sw+0)=addr, vicFillByte, vicFillCols )
- ldy vicFillCols
- beq +
- dey
- lda vicFillByte
- - sta (syswork),y
- dey
- bpl -
- + rts
-
- vicWinsetRows .buf 1
- vicWinsetCols .buf 1
-
- vicWinset = *
- sta vicWinsetRows
- cmp #0
- beq vicWinsetErr
- stx vicWinsetCols
- cpx #0
- beq vicWinsetErr
- clc
- adc syswork+0
- cmp #25
- beq +
- bcc +
-
- vicWinsetErr = *
- lda #aceErrInvalidWindowParms
- sta errno
- sec
- rts
-
- + clc
- lda vicWinsetCols
- adc syswork+1
- cmp #40
- beq +
- bcs vicWinsetErr
- + lda syswork+0
- ldx syswork+1
- sta vicWinScrY
- stx vicWinScrX
- jsr vicMult40
- lda syswork+0
- sta vicWinStart+0
- clc
- lda syswork+1
- adc aceVic40Page
- sta vicWinStart+1
- lda vicWinsetRows
- ldx vicWinsetCols
- sta vicWinRows
- stx vicWinCols
- jsr conWinChangeCallback
- lda vicWinScrY
- ldx vicWinScrX
- sta syswork+0
- stx syswork+1
- clc
- rts
-
- vicWinsize = *
- lda vicWinStart+0
- ldy vicWinStart+1
- sta syswork+2
- sty syswork+3
- lda #<vicRowInc
- ldy #>vicRowInc
- sta syswork+4
- sty syswork+5
- lda vicWinScrY
- ldx vicWinScrX
- sta syswork+0
- stx syswork+1
- lda vicWinRows
- ldx vicWinCols
- clc
- rts
-
- vicPutWhich .buf 1
- vicPutLen .buf 1
- vicExtAttr .buf 1
-
- vicWinput = *
- sta vicPutWhich
- sty vicFillByte
- stx vicPutLen
- ldx #$00
- and #$10
- beq +
- ldx syswork+6
- + stx vicExtAttr
- bit vicPutWhich
- bpl vicWinputColor
- ldy #0
- cpy vicPutLen
- beq ++
- - lda (syswork+2),y
- bit vicExtAttr
- bvc +
- bit conChsetRvsChars
- bpl +
- jsr vicReverseChar
- + sta (syswork+0),y
- iny
- cpy vicPutLen
- bcc -
- + cpy syswork+5
- beq vicWinputColor
- lda syswork+4
- bit vicExtAttr
- bvc +
- bit conChsetRvsChars
- bpl +
- jsr vicReverseChar
- + nop
- - sta (syswork+0),y
- iny
- cpy syswork+5
- bcc -
-
- vicWinputColor = *
- bit vicPutWhich
- bvs +
- rts
- + clc
- lda syswork+1
- adc vicColorOff
- sta syswork+1
- lda vicFillByte
- and #$0f
- tax
- ldy aceVicColorOff
- cmp configBuf+0,y
- bne vicWinputGotColor
- lda vicExtAttr
- and #%01110000
- beq vicWinputGotColor
- and #$40
- beq +
- bit conChsetRvsChars
- bmi +
- ldx configBuf+4,y
- jmp vicWinputGotColor
- + lda vicExtAttr
- and #$20
- beq +
- ldx configBuf+2,y
- jmp vicWinputGotColor
- + lda vicExtAttr
- and #$10
- beq vicWinputGotColor
- ldx configBuf+1,y
- jmp vicWinputGotColor
-
- vicWinputGotColor = *
- txa
- jsr rgbi2vic
- ldy syswork+5
- dey
- bmi +
- - sta (syswork),y
- dey
- bpl -
- + sec
- lda syswork+1
- sbc vicColorOff
- sta syswork+1
- rts
-
- vicWincolor = *
- php
- sei
- cmp #128
- bcc +
- pha
- txa
- jsr rgbi2vic
- sta vic+$21
- pla
- + and #64
- beq vicWincolorExit
- tya
- jsr rgbi2vic
- bit vicSsActive
- bmi +
- sta vic+$20
- jmp vicWincolorExit
- + sta vicSsColor
-
- vicWincolorExit = *
- bit vicSsActive
- bmi +
- lda vic+$20
- jmp ++
- + lda vicSsColor
- + jsr vic2rgbi
- tay
- lda vic+$21
- jsr vic2rgbi
- tax
- plp
- rts
-
- vicWinpos = *
- jsr vicMult40
- clc
- lda syswork+0
- adc vicWinStart+0
- sta syswork+0
- lda syswork+1
- adc vicWinStart+1
- sta syswork+1
- rts
-
- vicMult40 = * ;( .A=row:0-24, .X=col ) : (sw+0)=row*40+col, .X:unch
- sta syswork+0
- ldy #0
- sty syswork+1
- asl
- asl
- adc syswork+0
- asl
- rol syswork+1
- asl
- rol syswork+1
- asl
- rol syswork+1
- stx syswork+0
- clc
- adc syswork+0
- bcc +
- inc syswork+1
- + sta syswork+0
- rts
-
- vicCursorChar .buf 1
- vicCursorColor .buf 1
- vicCursorFlash .byte $00 ;$00=inactive, $ff=active
- vicCursorState .buf 1 ;$00=flashedOff, $ff=flashedOn
- vicCursorCountdown .buf 1
- vicCursorMaxcount .buf 1
- vicCursorAddr .buf 2
-
- vicWincursor = *
- cmp #0
- beq vicCursorOff
- ldx #20
- cmp #$fa
- bne +
- ldx #10
- + stx vicCursorMaxcount
- tya
- jsr rgbi2vic
- sta vicCursorColor
- lda syswork+0
- ldy syswork+1
- sta vicCursorAddr+0
- sty vicCursorAddr+1
- ldx #bkRam0
- stx bkSelect
- ldy #0
- lda (syswork+0),y
- ldx #bkACE
- stx bkSelect
- sta vicCursorChar
- jsr vicSetColorAddr
- ldy #0
- lda (syswork+0),y
- tax
- lda vicCursorColor
- sta (syswork+0),y
- stx vicCursorColor
- jsr vicUnsetColorAddr
- lda #1
- sta vicCursorCountdown
- lda #$00
- sta vicCursorState
- jsr vicIrqCursorEnter
- lda #$ff
- sta vicCursorFlash
- rts
-
- vicCursorOff = *
- lda #$00
- sta vicCursorFlash
- lda vicCursorAddr+0
- ldy vicCursorAddr+1
- sta syswork+0
- sty syswork+1
- ldy #0
- lda vicCursorChar
- sta (syswork+0),y
- jsr vicSetColorAddr
- lda vicCursorColor
- sta (syswork+0),y
- jsr vicUnsetColorAddr
- rts
-
- vicIrqWork = $a0
-
- vicIrqCursor = *
- bit vicCursorFlash
- bmi vicIrqCursorEnter
- - rts
- vicIrqCursorEnter = *
- dec vicCursorCountdown
- bne -
- lda vicCursorMaxcount
- sta vicCursorCountdown
- lda vicCursorState
- eor #$ff
- sta vicCursorState
- lda vicCursorAddr+0
- ldy vicCursorAddr+1
- sta vicIrqWork+0
- sty vicIrqWork+1
- bit conChsetRvsChars
- bmi +
- jmp vicIrqNonRvsCharCursor
- + ldx #bkRam0
- stx bkSelect
- ldy #0
- lda (vicIrqWork),y
- ldx #bkACE
- stx bkSelect
- jsr vicReverseChar
- sta (vicIrqWork),y
- rts
-
- vicReverseChar = *
- pha
- sec
- sbc #32
- and #%01000000
- bne +
- pla
- sec
- sbc #64
- jmp ++
- + pla
- clc
- adc #64
- + rts
-
- vicIrqNonRvsCharCursor = *
- lda conCharPalette+$1a
- bit vicCursorState
- bmi +
- lda vicCursorChar
- + ldy #0
- sta (vicIrqWork),y
- rts
-
- vicSetColorAddr = * ;( (sw+0)=addr ) : (sw+0)=colorAddr
- clc
- lda syswork+1
- adc vicColorOff
- sta syswork+1
- rts
-
- vicUnsetColorAddr = * ;( (sw+0)=colorAddr ) : (sw+0)=addr
- sec
- lda syswork+1
- sbc vicColorOff
- sta syswork+1
- rts
-
- vicScrollDest = syswork+0
- vicScrollSource = syswork+2
- vicScrollRows .buf 1
- vicScrollExtra .buf 1
-
- vicWinscroll = *
- sta syswork+5
- sty vicClsColor
- stx vicScrollExtra
- cpx #0
- bne +
- - rts
- + lda syswork+5
- and #%1000
- bne +
- lda syswork+5
- and #%0100
- beq -
- jmp vicScrollDown
- + bit syswork+5
- bpl +
- cpx vicWinRows
- bcc +
- ldx syswork+4
- lda syswork+5
- ldy vicClsColor
- jsr vicWincls
- rts
- + bit syswork+5
- bpl +
- jsr vicScrollUpSetup
- jsr vicRowScrollUp
- lda syswork+4
- jsr vicDoScrollExtra
- + bit syswork+5
- bvc +
- jsr vicScrollUpSetup
- jsr vicScrollAddColor
- jsr vicRowScrollUp
- lda vicClsColor
- jsr rgbi2vic
- jsr vicDoScrollExtra
- + rts
-
- vicScrollUpSetup = *
- lda vicScrollExtra
- ldx #0
- jsr vicWinpos
- lda syswork+0
- ldy syswork+1
- sta vicScrollSource+0
- sty vicScrollSource+1
- lda vicWinStart+0
- ldy vicWinStart+1
- sta vicScrollDest+0
- sty vicScrollDest+1
- sec
- lda vicWinRows
- sbc vicScrollExtra
- sta vicScrollRows
- rts
-
- vicScrollAddColor = *
- clc
- lda syswork+1
- adc vicColorOff
- sta syswork+1
- clc
- lda syswork+3
- adc vicColorOff
- sta syswork+3
- rts
-
- vicDoScrollExtra = * ;( .A=fillByte, (sw+0)=addr )
- sta vicFillByte
- lda vicScrollExtra
- sta vicFillRows
- lda vicWinCols
- sta vicFillCols
- jsr vicRowFill
- rts
-
- vicRowScrollUp = * ;( vicScrollSource++, vicScrollDest++, vicScrollRows-- )
- lda vicScrollRows
- bne +
- rts
- + nop
- - jsr vicColScroll
- clc
- lda vicScrollSource+0
- adc #vicRowInc
- sta vicScrollSource+0
- bcc +
- inc vicScrollSource+1
- + clc
- lda vicScrollDest+0
- adc #vicRowInc
- sta vicScrollDest+0
- bcc +
- inc vicScrollDest+1
- + dec vicScrollRows
- bne -
- rts
-
- vicColScroll = * ;( vicScrollSource, vicScrollDest, vicWinCols )
- lda #bkRam0io
- sta bkSelect
- ldy vicWinCols
- dey
- - lda (vicScrollSource),y
- sta (vicScrollDest),y
- dey
- bpl -
- lda #bkACE
- sta bkSelect
- rts
-
- ;========
- vicScrollDown = *
- bit syswork+5
- bpl +
- jsr vicScrollDownSetup
- jsr vicRowScrollDown
- lda syswork+4
- jsr vicDoScrollDownExtra
- + bit syswork+5
- bvc +
- jsr vicScrollDownSetup
- jsr vicScrollAddColor
- jsr vicRowScrollDown
- lda vicClsColor
- jsr rgbi2vic
- jsr vicDoScrollDownExtra
- + rts
-
- vicScrollDownSetup = *
- clc ;sic
- lda vicWinRows
- sbc vicScrollExtra
- ldx #0
- jsr vicWinpos
- lda syswork+0
- ldy syswork+1
- sta vicScrollSource+0
- sty vicScrollSource+1
- sec
- lda vicWinRows
- sbc #1
- ldx #0
- jsr vicWinpos
- lda syswork+0
- ldy syswork+1
- sta vicScrollDest+0
- sty vicScrollDest+1
- sec
- lda vicWinRows
- sbc vicScrollExtra
- sta vicScrollRows
- rts
-
- vicRowScrollDown = * ;( vicScrollSource--, vicScrollDest--, vicScrollRows-- )
- lda vicScrollRows
- bne +
- rts
- + nop
- - jsr vicColScroll
- sec
- lda vicScrollSource+0
- sbc #vicRowInc
- sta vicScrollSource+0
- bcs +
- dec vicScrollSource+1
- + sec
- lda vicScrollDest+0
- sbc #vicRowInc
- sta vicScrollDest+0
- bcs +
- dec vicScrollDest+1
- + dec vicScrollRows
- bne -
- rts
-
- vicDoScrollDownExtra = *
- pha
- clc
- lda vicScrollSource+0
- ldy vicScrollSource+1
- adc #vicRowInc
- bcc +
- iny
- + sta vicScrollDest+0
- sty vicScrollDest+1
- pla
- jmp vicDoScrollExtra
- ;========
-
- ;*** interrupt screen-save stuff
-
- vicSsColor .buf 1
- vicSsRows .buf 1
- vicSsActive .byte $00
-
- vicScreenSave = *
- lda vic+$11
- sta vicSsRows
- lda vic+$20
- sta vicSsColor
- lda #$ff
- sta vicSsActive
- lda #$00
- sta vic+$11
- lda #$00
- sta vic+$20
- rts
-
- vicScreenUnsave = *
- lda vicSsRows
- and #%01111111
- sta vic+$11
- lda vicSsColor
- sta vic+$20
- lda #$00
- sta vicSsActive
- rts
-
- ;the end + blank line
-
- acevic80.s
- 1499
- ;ACE-64 kernel VIC bitmapped 80-column screen driver code
-
- ;vic memory layout: $e000=bitmap, $dc00=color, $d800=charset4bit
-
- vdcCharAddr = $e000
- vdcColorAddr = $cc00
- charset4bit = $d800
- vdcRowInc = 80
- vdcRowPhysInc = 320
- vdcRowColorInc = 40
-
- vdcWinScrX .buf 1 ;maintained in 80x25 style
- vdcWinScrY .buf 1 ;80x25 style
- vdcWinRows .buf 1 ;80x25 style
- vdcWinCols .buf 1 ;80x25 style
- vdcWinStart .buf 2 ;address from zero based on 80x25 style
- vdcScrRows .byte 25
- vdcScrCols .byte 80
- vdcBackColor .buf 1
- vdcChar .buf 8
-
- vdcStartup = *
- lda #aceMemNull
- sta vdcScrollReuWork+3
- lda configBuf+$c0
- and #$20
- beq +
- lda #$fc
- sta allocProcID
- lda #>8192
- ldx #aceMemREU
- ldy #aceMemREU
- jsr kernPageAlloc
- bcs ++
- ldx #3
- - lda mp,x
- sta vdcScrollReuWork,x
- dex
- bpl -
- + clc
- lda mp+1
- adc #>7680
- sta mp+1
- lda #$00
- ldx #0
- - sta stringBuffer,x
- inx
- bne -
- lda #<stringBuffer
- ldy #>stringBuffer
- sta zp+0
- sty zp+1
- lda #<256
- ldy #>256
- jsr stash
- inc mp+1
- lda #<256
- ldy #>256
- jsr stash
- + rts
-
- vdcInit = *
- bit aceSoft80Allocated
- bmi +
- sec
- rts
- + lda vic+$11
- and #%01111111
- ora #%00100000
- sta vic+$11
- lda #$38
- sta vic+$18
- lda $dd00
- and #%11111100
- sta $dd00
- jsr vdcWinmax
- lda configBuf+$d7
- jsr rgbi2vic
- asl
- asl
- asl
- asl
- sta vdcBackColor
- clc
- rts
-
- vdcShutdown = *
- lda vic+$11
- and #%00011111
- sta vic+$11
- lda #$16
- sta vic+$18
- lda $dd00
- and #%11111100
- ora #%00000011
- sta $dd00
- rts
-
- vicbitWork .buf 1
-
- rgbi2vicbit = * ;.A=color, .Y=modPattern
- pha
- and #$0f
- tax
- lda rgbi2vicTab,x
- asl
- asl
- asl
- asl
- sta vicbitWork
- tya
- and #$20
- beq +
- pla
- lsr
- lsr
- lsr
- lsr
- tax
- lda rgbi2vicTab,x
- jmp ++
- + pla
- lda vdcBackColor
- + ora vicbitWork
- rts
-
- vicbit2rgbi = *
- brk
-
- vdcWinmax = *
- lda #0
- sta vdcWinStart+0
- sta vdcWinStart+1
- sta vdcWinScrX
- sta vdcWinScrY
- lda vdcScrRows
- ldx vdcScrCols
- sta vdcWinRows
- stx vdcWinCols
- jsr conWinChangeCallback
- clc
- rts
-
- vdcClsColor .buf 1
-
- vdcWincls = *
- ldx #$00 ;forced fill pattern, for now
- vdcWinclsPattern = *
- stx vdcFillByte
- sta syswork+2
- tya
- ldy syswork+2
- jsr rgbi2vicbit
- sta vdcClsColor
- bit syswork+2
- bpl +
- jsr vdcWinclsSetup
- jsr vdcAddChar
- jsr vdcRowFill
- + bit syswork+2
- bvc +
- lda vdcClsColor
- sta vdcFillByte
- jsr vdcWinclsSetup
- jsr vdcAddColor
- lda #bkRam0
- sta bkSelect
- jsr vdcRowFillColor
- lda #bkACE
- sta bkSelect
- + rts
-
- vdcWinclsSetup = *
- lda vdcWinStart+0
- ldy vdcWinStart+1
- sta syswork+0
- sty syswork+1
- lda vdcWinRows
- sta vdcFillRows
- rts
-
- vdcAddChar = *
- lda syswork+1
- asl syswork+0
- rol
- asl syswork+0
- rol
- clc
- adc #>vdcCharAddr
- sta syswork+1
- rts
-
- vdcAddColor = *
- lda syswork+1
- lsr
- ror syswork+0
- clc
- adc #>vdcColorAddr
- sta syswork+1
- rts
-
- vdcFillByte .buf 1
- vdcFillRows .buf 1
- vdcFillCols .buf 1
-
- vdcRowFill = * ;( (sw+0)=addr++, vdcFillByte, vdcFillRows-- )
- lda vdcWinCols
- sta vdcFillCols
- lda vdcFillRows
- bne +
- rts
- / jsr vdcColFill
- clc
- lda syswork+0
- adc #<vdcRowPhysInc
- sta syswork+0
- lda syswork+1
- adc #>vdcRowPhysInc
- sta syswork+1
- dec vdcFillRows
- bne -
- rts
-
- vdcRowFillColor = * ;( (sw+0)=addr++, vdcFillByte, vdcFillRows-- )
- lda vdcWinCols
- sta vdcFillCols
- lda vdcFillRows
- bne +
- rts
- / jsr vdcColFill
- clc
- lda syswork+0
- adc #<vdcRowColorInc
- sta syswork+0
- lda syswork+1
- adc #>vdcRowColorInc
- sta syswork+1
- dec vdcFillRows
- bne -
- rts
-
- vdcColFill = * ;( (sw+0)=addr, vdcFillByte, vdcFillCols )
- vdcColFillGotAddr = *
- ldy vdcFillCols
- beq ++
- lda syswork+1
- cmp #>vdcCharAddr
- bcs vdcColFillBitmap
- lda vdcFillCols
- clc
- adc #1 ;round up
- lsr
- tay
- beq ++
-
- vdcColf256 = *
- lda vdcFillByte
- dey
- beq +
- - sta (syswork+0),y
- dey
- bne -
- + sta (syswork+0),y
- + rts
-
- vdcColFillBitmap = *
- ;xx put in REU-fill option
- lda vdcFillCols
- and #%11111110
- asl
- asl
- tay
- bcc vdcColf256
- inc syswork+1
- jsr vdcColf256
- dec syswork+1
- ldy #0
- jmp vdcColf256
-
- vdcWinsetRows .buf 1
- vdcWinsetCols .buf 1
-
- vdcWinset = *
- sta vdcWinsetRows
- cmp #0
- beq vdcWinsetErr
- stx vdcWinsetCols
- cpx #0
- beq vdcWinsetErr
- clc
- adc syswork+0
- cmp vdcScrRows
- beq +
- bcc +
-
- vdcWinsetErr = *
- lda #aceErrInvalidWindowParms
- sta errno
- sec
- rts
-
- + lda syswork+1 ;align left margin
- and #%11111110
- sta syswork+1
- clc
- lda vdcWinsetCols ;make even cols
- adc #1
- and #%11111110
- sta vdcWinsetCols
- adc syswork+1
- cmp vdcScrCols
- beq +
- bcs vdcWinsetErr
- + lda syswork+0
- ldx syswork+1
- sta vdcWinScrY
- stx vdcWinScrX
- jsr vdcMult80
- lda syswork+0
- ldy syswork+1
- sta vdcWinStart+0
- sty vdcWinStart+1
- lda vdcWinsetRows
- ldx vdcWinsetCols
- sta vdcWinRows
- stx vdcWinCols
- jsr conWinChangeCallback
- lda vdcWinScrY
- ldx vdcWinScrX
- sta syswork+0
- stx syswork+1
- clc
- rts
-
- vdcWinsize = *
- lda vdcWinStart+0
- ldy vdcWinStart+1
- sta syswork+2
- sty syswork+3
- lda #<vdcRowInc
- ldy #>vdcRowInc
- sta syswork+4
- sty syswork+5
- lda vdcWinScrY
- ldx vdcWinScrX
- sta syswork+0
- stx syswork+1
- lda vdcWinRows
- ldx vdcWinCols
- clc
- rts
-
- vdcPutWhich .buf 1
- vdcPutColor .buf 1
- vdcPutLen .buf 1
- vdcAddr .buf 2
- vdcPos .buf 1
- vdcAttrib .buf 1
- vdcRvsXorLhs .buf 1
- vdcRvsXorRhs .buf 1
-
- vdcWinput = *
- sta vdcPutWhich
- stx vdcPutLen
- sty vdcPutColor
- ldx #$00
- lda vdcPutWhich
- and #$10
- beq +
- ldx syswork+6
- + stx vdcAttrib
- lda #$00
- sta vdcRvsXorLhs
- sta vdcRvsXorRhs
- lda vdcAttrib
- and #$40
- beq +
- lda #$f0
- sta vdcRvsXorLhs
- lda #$0f
- sta vdcRvsXorRhs
- + lda syswork+0
- ldy syswork+1
- sta vdcAddr+0
- sty vdcAddr+1
- jsr vdcAddChar
- lda #bkRam0
- sta bkSelect
- bit vdcPutWhich
- bmi +
- jmp vdcWinputColor
- + ldy #0
- sty vdcPos
-
- vdcWinputNext = *
- ldy vdcPos
- cpy vdcPutLen
- bcs +
- lda (syswork+2),y
- jmp +++
- + cpy syswork+5
- bcc +
- jmp vdcWinputColor
- + lda syswork+0
- and #$07
- tay
- lda syswork+4
- cmp #" "
- bne +
- cpy #$00
- bne +
- ldy vdcScrollReuWork+3
- cpy #aceMemNull
- beq +
- sec
- lda syswork+5
- sbc vdcPos
- tay
- lda syswork+4
- cpy #4
- bcc +
- jsr vdcPutQuickFill
- jmp vdcWinputNext
-
- ;** locate character
- + ldy #0
- sty syswork+7
- asl
- rol syswork+7
- asl
- rol syswork+7
- asl
- rol syswork+7
- clc
- adc #<charset4bit
- sta syswork+6
- lda syswork+7
- adc #>charset4bit
- sta syswork+7
-
- vdcWinputLhs = *
- lda syswork+0
- and #$07
- bne vdcWinputRhs
- ldy #7
- - lda (syswork+6),y
- and #$f0
- sta vdcChar
- lda (syswork+0),y
- and #$0f
- ora vdcChar
- eor vdcRvsXorLhs
- sta (syswork+0),y
- dey
- bpl -
- lda vdcAttrib
- and #$20
- beq +
- ldy #7
- lda (syswork+0),y
- ora #$f0
- sta (syswork+0),y
- + jmp vdcWinputCont
-
- vdcWinputRhs = *
- lda syswork+0
- and #%11111000
- sta syswork+0
- ldy #7
- - lda (syswork+6),y
- and #$0f
- sta vdcChar
- lda (syswork+0),y
- and #$f0
- ora vdcChar
- eor vdcRvsXorRhs
- sta (syswork+0),y
- dey
- bpl -
- lda vdcAttrib
- and #$20
- beq +
- ldy #7
- lda (syswork+0),y
- ora #$0f
- sta (syswork+0),y
- + lda syswork+0
- ora #%00000100
- sta syswork+0
-
- vdcWinputCont = *
- inc vdcPos
- clc
- lda syswork+0
- adc #4
- sta syswork+0
- bcc +
- inc syswork+1
- + jmp vdcWinputNext
-
- vdcWinputColor = *
- bit vdcPutWhich
- bvc vdcWinputExit
- lda vdcAttrib
- and #$10
- beq +
- lda vdcPutColor
- cmp configBuf+$d0+0
- beq +
- lda configBuf+$d0+1
- sta vdcPutColor
- + lda vdcPutColor
- ldy vdcPutWhich
- jsr rgbi2vicbit
- sta vdcFillByte
- lda vdcAddr+0
- ldy vdcAddr+1
- sta syswork+0
- sty syswork+1
- jsr vdcAddColor
- lda syswork+5
- sta vdcFillCols
- jsr vdcColFill
-
- vdcWinputExit = *
- lda #bkACE
- sta bkSelect
- lda vdcAddr+0
- ldy vdcAddr+1
- sta syswork+0
- sty syswork+1
- rts
-
- vdcQuickSize .buf 2
- vdcQuickChars .buf 1
-
- vdcPutQuickFill = *
- jsr vdcZpMpSave
- ldx #3
- - lda vdcScrollReuWork,x
- sta mp,x
- dex
- bpl -
- clc
- lda mp+1
- adc #>7680
- sta mp+1
- lda syswork+0
- ldy syswork+1
- sta zp+0
- sty zp+1
- sec
- lda syswork+5
- sbc vdcPos
- and #$fe
- sta vdcQuickChars
- ldy #0
- sty vdcQuickSize+1
- asl
- rol vdcQuickSize+1
- asl
- rol vdcQuickSize+1
- sta vdcQuickSize+0
- ldy vdcQuickSize+1
- ldx #%01110101
- stx bkSelect
- jsr fetch
- lda #bkRam0
- sta bkSelect
- clc
- lda vdcPos
- adc vdcQuickChars
- sta vdcPos
- clc
- lda syswork+0
- adc vdcQuickSize+0
- sta syswork+0
- lda syswork+1
- adc vdcQuickSize+1
- sta syswork+1
- jsr vdcZpMpRestore
- rts
-
- vdcWincolor = *
- php
- sei
- cmp #128
- bcc +
- pha
- txa
- jsr rgbi2vic
- sta vic+$21
- asl
- asl
- asl
- asl
- sta vdcBackColor
- pla
- + and #64
- beq vdcWincolorExit
- tya
- jsr rgbi2vic
- bit vicSsActive
- bmi +
- sta vic+$20
- jmp vdcWincolorExit
- + sta vicSsColor
-
- vdcWincolorExit = *
- bit vicSsActive
- bmi +
- lda vic+$20
- jmp ++
- + lda vicSsColor
- + jsr vic2rgbi
- tay
- lda vic+$21
- jsr vic2rgbi
- tax
- plp
- rts
-
- vdcWinpos = *
- jsr vdcMult80
- clc
- lda syswork+0
- adc vdcWinStart+0
- sta syswork+0
- lda syswork+1
- adc vdcWinStart+1
- sta syswork+1
- rts
-
- vdcPos320 = *
- jsr vdcMult320
- clc ;add four times the 80x25-style start of screen
- lda vdcWinStart+0
- ldy vdcWinStart+1
- sty vdcPos320start+1
- asl
- rol vdcPos320start+1
- asl
- rol vdcPos320start+1
- clc
- adc syswork+0
- sta syswork+0
- lda syswork+1
- adc vdcPos320start+1
- sta syswork+1
- vdcPosAdd = * ;add start addr of bitmap
- clc
- lda syswork+0
- adc #<vdcCharAddr
- sta syswork+0
- lda syswork+1
- adc #>vdcCharAddr
- sta syswork+1
- rts
- vdcPos320start .buf 2
-
- vdcMult320 = * ;( .A=row:0-50, .X=col ) : (sw+0)=(row*80+col)*4
- jsr vdcMult80
- asl syswork+0
- rol syswork+1
- asl syswork+0
- rol syswork+1
- rts
-
- vdcMult80 = * ;( .A=row:0-50, .X=col ) : (sw+0)=row*80+col, .X:unch
- sta syswork+0
- ldy #0
- sty syswork+1
- asl
- asl
- adc syswork+0
- asl
- rol syswork+1
- asl
- rol syswork+1
- asl
- rol syswork+1
- asl
- rol syswork+1
- stx syswork+0
- clc
- adc syswork+0
- bcc +
- inc syswork+1
- + sta syswork+0
- rts
-
- vdcCursorFlash .byte $00 ;$00=inactive, $ff=active
- vdcCursorState .buf 1 ;$00=flashOff, $ff=flashOn
- vdcCursorCountdown .buf 1
- vdcCursorMaxCntdn .byte 20
- vdcCursorAddr .buf 2
-
- vdcWincursor = *
- cmp #0
- beq vdcCursorOff
- ldx #20
- cmp #$fa
- bne +
- ldx #10
- + stx vdcCursorMaxCntdn
- jsr vdcAddChar
- lda syswork+0
- ldy syswork+1
- sta vdcCursorAddr+0
- sty vdcCursorAddr+1
- lda #0
- sta vdcCursorState
- lda #1
- sta vdcCursorCountdown
- jsr vdcIrqCursorEnter
- lda #$ff
- sta vdcCursorFlash
- rts
-
- vdcCursorOff = *
- lda #0
- sta vdcCursorFlash
- lda vdcCursorAddr+0
- ldy vdcCursorAddr+1
- sta syswork+0
- sty syswork+1
- lda vdcCursorState
- beq +
- lda #1
- sta vdcCursorCountdown
- jsr vdcIrqCursorEnter
- + rts
-
- vdcIrqWork = $a0
- vdcCursorMask .buf 1
-
- vdcIrqCursor = *
- bit vdcCursorFlash
- bmi vdcIrqCursorEnter
- - rts
- vdcIrqCursorEnter = *
- dec vdcCursorCountdown
- bne -
- lda vdcCursorMaxCntdn
- sta vdcCursorCountdown
- lda vdcCursorAddr+0
- ldy vdcCursorAddr+1
- and #%11111000
- sta vdcIrqWork+0
- sty vdcIrqWork+1
- ldx #$f0
- lda vdcCursorAddr+0
- and #%00000111
- beq +
- ldx #$0f
- + stx vdcCursorMask
- lda #bkRam0
- sta bkSelect
- ldy #7
- - lda (vdcIrqWork),y
- eor vdcCursorMask
- sta (vdcIrqWork),y
- dey
- bpl -
- lda #bkACE
- sta bkSelect
- lda vdcCursorState
- eor #$ff
- sta vdcCursorState
- rts
-
- ;*** interrupt screen-saver: work handled by VIC screen driver
-
- vdcSsColor .buf 1
- vdcSsMode .buf 1
- vdcSsActive .byte $00
-
- vdcScreenSave = *
- rts
-
- vdcScreenUnsave = *
- rts
-
- ;*** screen-scrolling code ***
-
- vdcScrollDest = syswork+0 ;xx dependency
- vdcScrollSource = syswork+2 ;xx dependency
- vdcScrollBytes = syswork+4
- vdcScrollRows .buf 1
- vdcScrollExtra .buf 1
- vdcScrollReuWork .buf 4
- vdcScrollFlags .buf 1
- vdcScrollFillChar .buf 1
-
- vdcWinscroll = *
- sta vdcScrollFlags
- sty vdcClsColor
- stx vdcScrollExtra
- lda syswork+4
- sta vdcScrollFillChar
- cpx #0
- bne +
- rts
- + cpx vdcWinRows
- bcc +
- ldx vdcScrollFillChar
- lda vdcScrollFlags
- ldy vdcClsColor
- jsr vdcWincls
- - rts
- + lda vdcScrollFlags
- and #$08
- bne +
- lda vdcScrollFlags
- and #$04
- beq -
- jmp vdcScrollDown
- + bit vdcScrollFlags
- bpl ++
- ;** scroll characters
- lda vdcWinCols
- cmp vdcScrCols
- bcc +
- jsr vdcFastScrollUp ;fast
- jmp ++
- + jsr vdcScrollUpSetup ;slow
- jsr vdcScrollAddChar
- lda #<vdcRowPhysInc
- ldy #>vdcRowPhysInc
- jsr vdcRowScrollUp
- lda #$00 ;xx vdcScrollFillChar
- jsr vdcDoScrollExtra
- + bit vdcScrollFlags
- bvc +
- ;** scroll colors
- jsr vdcScrollUpSetup
- jsr vdcScrollAddColor
- lda #<vdcRowColorInc
- ldy #>vdcRowColorInc
- jsr vdcRowScrollUp
- jmp +
- lda vdcClsColor
- ldy #$60
- jsr rgbi2vicbit
- jsr vdcDoScrollExtra
- + rts
-
- vdcFastScrollUp = * ;if window is entire screen width
- ;** set length
- sec
- lda vdcWinRows
- sbc vdcScrollExtra
- ldx #0
- jsr vdcMult320
- lda syswork+0
- ldy syswork+1
- sta vdcScrollBytes+0
- sty vdcScrollBytes+1
- ;** set source
- lda vdcScrollExtra
- ldx #0
- jsr vdcPos320
- lda syswork+0
- ldy syswork+1
- sta vdcScrollSource+0
- sty vdcScrollSource+1
- ;** set dest
- lda #0
- ldx #0
- jsr vdcPos320
- ;** scroll
- jsr vdcCopyForward
- ;** blank screen bottom
- sec
- lda vdcWinRows
- sbc vdcScrollExtra
- ldx #0
- jsr vdcPos320
- lda vdcScrollExtra
- sta vdcFillRows
- lda #0
- sta vdcFillByte
- jsr vdcRowFill
- rts
-
- vdcCopyForward = * ;( vdcScrollSource, vdcScrollDest, vdcScrollBytes )
- lda vdcScrollReuWork+3
- cmp #aceMemNull
- beq +
- jmp vdcCopyReu
- ;** set up soft copy
- + lda #bkRam0
- sta bkSelect
- lda vdcScrollSource+0
- ldy vdcScrollSource+1
- sta vdcFsFrom+1
- sty vdcFsFrom+2
- lda vdcScrollDest+0
- ldy vdcScrollDest+1
- sta vdcFsTo+1
- sty vdcFsTo+2
- ldy vdcScrollBytes+1
- ldx #0
- ;** copy
- vdcFsFrom lda $ffff,x
- vdcFsTo sta $ffff,x
- inx
- bne vdcFsFrom
- inc vdcFsFrom+2
- inc vdcFsTo+2
- dey
- bne vdcFsFrom
- ;** copy last page
- ldx #5
- - lda vdcFsFrom,x
- sta vdcCopyLast,x
- dex
- bpl -
- ldx #0
- cpx vdcScrollBytes+0
- beq +
- vdcCopyLast = *
- lda $ffff,x
- sta $ffff,x
- inx
- cpx vdcScrollBytes+0
- bne vdcCopyLast
- ;** finish
- + lda #bkACE
- sta bkSelect
- rts
-
- vdcCopyReu = *
- jsr vdcZpMpSave
- lda #%01110101
- sta bkSelect
- lda vdcScrollSource+0
- ldy vdcScrollSource+1
- sta zp+0
- sty zp+1
- ldx #3
- - lda vdcScrollReuWork,x
- sta mp,x
- dex
- bpl -
- lda vdcScrollBytes+0
- ldy vdcScrollBytes+1
- jsr stash
- lda vdcScrollDest+0
- ldy vdcScrollDest+1
- sta zp+0
- sty zp+1
- lda vdcScrollBytes+0
- ldy vdcScrollBytes+1
- jsr fetch
- lda #bkACE
- sta bkSelect
- jsr vdcZpMpRestore
- rts
-
- vdcCopyReuSave .buf 10
-
- vdcZpMpSave = *
- ldx #7
- - lda zp,x
- sta vdcCopyReuSave+0,x
- dex
- bpl -
- rts
-
- vdcZpMpRestore = *
- ldx #7
- - lda vdcCopyReuSave+0,x
- sta zp,x
- dex
- bpl -
- rts
-
- vdcScrollUpSetup = *
- lda vdcScrollExtra
- ldx #0
- jsr vdcWinpos
- lda syswork+0
- ldy syswork+1
- sta vdcScrollSource+0
- sty vdcScrollSource+1
- lda vdcWinStart+0
- ldy vdcWinStart+1
- sta vdcScrollDest+0
- sty vdcScrollDest+1
- sec
- lda vdcWinRows
- sbc vdcScrollExtra
- sta vdcScrollRows
- rts
-
- vdcScrollAddChar = *
- lda syswork+1
- asl syswork+0
- rol
- asl syswork+0
- rol
- clc
- adc #>vdcCharAddr
- sta syswork+1
- lda syswork+3
- asl syswork+2
- rol
- asl syswork+2
- rol
- clc
- adc #>vdcCharAddr
- sta syswork+3
- rts
-
- vdcScrollAddColor = *
- lda syswork+1
- lsr
- ror syswork+0
- clc
- adc #>vdcColorAddr
- sta syswork+1
- lda syswork+3
- lsr
- ror syswork+2
- clc
- adc #>vdcColorAddr
- sta syswork+3
- rts
-
- vdcDoScrollExtra = * ;( .A=fillByte, (vdcScrollDest)=addr )
- sta vdcFillByte
- lda vdcScrollExtra
- sta vdcFillRows
- lda vdcWinCols
- sta vdcFillCols
- lda syswork+1
- cmp #>vdcCharAddr
- bcc +
- jmp vdcRowFill
- + jmp vdcRowFillColor
-
- vdcRowScupInc .buf 2
-
- vdcRowScrollUp = * ;(.AY=rowinc, vdcScrollSource, vdcScrollDest, vdcScrollRows)
- sta vdcRowScupInc+0
- sty vdcRowScupInc+1
- lda #bkRam0
- sta bkSelect
- lda vdcScrollRows
- beq +
- - jsr vdcColScroll
- clc
- lda vdcScrollSource+0
- adc vdcRowScupInc+0
- sta vdcScrollSource+0
- lda vdcScrollSource+1
- adc vdcRowScupInc+1
- sta vdcScrollSource+1
- clc
- lda vdcScrollDest+0
- adc vdcRowScupInc+0
- sta vdcScrollDest+0
- lda vdcScrollDest+1
- adc vdcRowScupInc+1
- sta vdcScrollDest+1
- dec vdcScrollRows
- bne -
- + lda #bkACE
- sta bkSelect
- rts
-
- vdcScrollDown = *
- bit vdcScrollFlags
- bpl +
- jsr vdcScrollDownSetup
- jsr vdcScrollAddChar
- lda #<vdcRowPhysInc
- ldy #>vdcRowPhysInc
- jsr vdcRowScrollDown
- lda #$00 ;xx vdcScrollFillChar
- ldx #<vdcRowPhysInc
- ldy #>vdcRowPhysInc
- jsr vdcDoScrollDownExtra
- + bit vdcScrollFlags
- bvc +
- jsr vdcScrollDownSetup
- jsr vdcScrollAddColor
- lda #<vdcRowColorInc
- ldy #>vdcRowColorInc
- jsr vdcRowScrollDown
- lda vdcClsColor
- ldy #$60
- jsr rgbi2vicbit
- ldx #<vdcRowColorInc
- ldy #>vdcRowColorInc
- jsr vdcDoScrollDownExtra
- + rts
-
- vdcScrollDownSetup = *
- clc ;sic
- lda vdcWinRows
- sbc vdcScrollExtra
- ldx #0
- jsr vdcWinpos
- lda syswork+0
- ldy syswork+1
- sta vdcScrollSource+0
- sty vdcScrollSource+1
- sec
- lda vdcWinRows
- sbc #1
- ldx #0
- jsr vdcWinpos
- lda syswork+0
- ldy syswork+1
- sta vdcScrollDest+0
- sty vdcScrollDest+1
- sec
- lda vdcWinRows
- sbc vdcScrollExtra
- sta vdcScrollRows
- rts
-
- vdcRowScdnInc .buf 2
-
- vdcRowScrollDown = * ;( vdcScrollSource--, vdcScrollDest--, vdcScrollRows-- )
- sta vdcRowScdnInc+0
- sty vdcRowScdnInc+1
- lda #bkRam0
- sta bkSelect
- lda vdcScrollRows
- beq +
- - jsr vdcColScroll
- sec
- lda vdcScrollSource+0
- sbc vdcRowScdnInc+0
- sta vdcScrollSource+0
- lda vdcScrollSource+1
- sbc vdcRowScdnInc+1
- sta vdcScrollSource+1
- sec
- lda vdcScrollDest+0
- sbc vdcRowScdnInc+0
- sta vdcScrollDest+0
- lda vdcScrollDest+1
- sbc vdcRowScdnInc+1
- sta vdcScrollDest+1
- dec vdcScrollRows
- bne -
- + lda #bkACE
- sta bkSelect
- rts
-
- vdcScexInc .buf 2
-
- vdcDoScrollDownExtra = * ;( .XY=physical bytes between rows, .A=rows to clr )
- stx vdcScexInc+0
- sty vdcScexInc+1
- pha
- clc
- lda vdcScrollSource+0
- adc vdcScexInc+0
- sta vdcScrollDest+0
- lda vdcScrollSource+1
- adc vdcScexInc+1
- sta vdcScrollDest+1
- pla
- jmp vdcDoScrollExtra
-
- vdcColScroll = * ;( vdcScrollSource, vdcScrollDest, vdcWinCols )
- ldy vdcWinCols
- beq ++
- lda vdcScrollSource+1
- cmp #>vdcCharAddr
- bcs vdcColScrollBitmap
- lda vdcWinCols
- clc
- adc #1 ;round up
- lsr
- tay
- beq ++
-
- vdcColSc256 = *
- dey
- beq +
- - lda (vdcScrollSource),y
- sta (vdcScrollDest),y
- dey
- bne -
- + lda (vdcScrollSource),y
- sta (vdcScrollDest),y
- + rts
-
- vdcColScrollBitmap = *
- ;xx put in REU-fill option
- lda vdcWinCols
- and #%11111110
- asl
- asl
- tay
- bcc vdcColSc256
- inc vdcScrollSource+1
- inc vdcScrollDest+1
- jsr vdcColSc256
- dec vdcScrollSource+1
- dec vdcScrollDest+1
- ldy #0
- jmp vdcColSc256
-
- ;*** graphics routines ***
-
- vdcBmColor .buf 1
-
- kernGrScreen = *
- sty vdcBmColor
- lda configBuf+$c0
- bmi +
- lda #aceErrNoGraphicsSpace
- sta errno
- sec
- rts
- + txa
- jsr rgbi2vic
- sta vic+$20
- jsr vdcInit
- lda #$e0
- ldx #$00
- ldy vdcBmColor
- jsr vdcWinclsPattern
- lda #<200
- ldy #>200
- sta syswork+0
- sty syswork+1
- sta conMouseMaxY+0
- sty conMouseMaxY+1
- lda #<320
- ldy #>320
- sta conMouseMaxX+0
- sty conMouseMaxX+1
- jsr conMouseBounds
- lda #40
- ldx #1
- clc
- rts
-
- kernGrExit = *
- ldx #40
- bit textMode
- bpl +
- ldx #80
- + lda #25
- jsr conScreen
- clc
- rts
-
- kernGrFill = *
- vdcGrFill = *
- tax
- lda #$80
- jsr vdcWinclsPattern
- clc
- rts
-
- vdcBmRows .buf 1
- vdcBmCols .buf 1
- vdcBmCol .buf 1
- vdcBmRow .buf 1
- vdcBmBuffer = stringBuffer
- vdcGrOpFlags = syswork+15
- vdcGrTemp = syswork+14
- vdcGrSor = syswork+12
-
- kernGrOp = * ;( .A=opflags, .X=X, (sw+0)=Y, .Y=cols, (sw+2)=rows, sw+4=interlv,
- ;** sw+5=fillval, (sw+6)=sPtr, (sw+8)=dPtr, (sw+10)=mPtr )
- ;** <all syswork arguments can change>
- ;** opflags: $80=get, $40=put, $20=copy, $10=fill,$8=mask,$4=and,$2=xor,$1=or
- sta vdcGrOpFlags
- stx vdcBmCol
- sty vdcBmCols
- clc
- tya
- adc syswork+4
- sta syswork+4
- lda syswork+0
- sta vdcBmRow
- lsr
- lsr
- lsr
- ldx #0
- jsr vdcMult320
- lda vdcBmRow
- and #$07
- clc
- adc syswork+0
- sta syswork+0
- bcc +
- inc syswork+1
- + lda vdcBmCol
- ldy #0
- sty vdcGrTemp
- ldx #3
- - asl
- rol vdcGrTemp
- dex
- bne -
- clc
- adc syswork+0
- sta syswork+0
- lda syswork+1
- adc vdcGrTemp
- sta syswork+1
- jsr vdcPosAdd
- ;** at this point, we have the screen position in (sw+0)
- lda vdcBmCols
- bne +
- clc
- rts
- vdcGrOpLoop = *
- + lda syswork+0
- ldy syswork+1
- sta vdcGrSor+0
- sty vdcGrSor+1
- lda #bkRam0
- sta bkSelect
- vdcGrOpGet = *
- bit vdcGrOpFlags
- bpl vdcGrOpPut
- ldx #0
- ldy #0
- - lda (syswork+0,x)
- sta (syswork+8),y
- clc
- lda syswork+0
- adc #8
- sta syswork+0
- bcc +
- inc syswork+1
- + iny
- cpy vdcBmCols
- bcc -
- lda vdcGrSor+0
- ldy vdcGrSor+1
- sta syswork+0
- sty syswork+1
- vdcGrOpPut = *
- bit vdcGrOpFlags
- bvc vdcGrOpCopy
- ldx #0
- ldy #0
- lda vdcGrOpFlags
- and #$0f
- bne vdcGrOpPutComplex
- - lda (syswork+6),y
- sta (syswork+0,x)
- clc
- lda syswork+0
- adc #8
- sta syswork+0
- bcc +
- inc syswork+1
- + iny
- cpy vdcBmCols
- bcc -
- jmp vdcGrOpPutFinish
-
- vdcGrOpPutComplex = *
- - lda vdcGrOpFlags
- and #$08
- beq +
- ;** mask
- lda (syswork+10),y
- eor #$ff
- and (syswork+0,x)
- sta (syswork+0,x)
- ;** or
- + lda vdcGrOpFlags
- and #$01
- bne +
- lda (syswork+6),y
- ora (syswork+0,x)
- jmp vdcGrOpPutDo
- ;** xor
- + lda vdcGrOpFlags
- and #$02
- bne +
- lda (syswork+6),y
- eor (syswork+0,x)
- jmp vdcGrOpPutDo
- ;** and
- + lda (syswork+6),y
- eor #$ff
- and (syswork+0,x)
-
- vdcGrOpPutDo = *
- sta (syswork+0,x)
- clc
- lda syswork+0
- adc #8
- sta syswork+0
- bcc +
- inc syswork+1
- + iny
- cpy vdcBmCols
- bcc -
-
- vdcGrOpPutFinish = *
- lda vdcGrSor+0
- ldy vdcGrSor+1
- sta syswork+0
- sty syswork+1
- vdcGrOpCopy = * ;xx not implemented
- lda vdcGrOpFlags
- and #$20
- beq vdcGrOpFill
- ldx #0
- ldy #0
- nop
- lda vdcGrSor+0
- ldy vdcGrSor+1
- sta syswork+0
- sty syswork+1
- vdcGrOpFill = *
- lda vdcGrOpFlags
- and #$10
- beq vdcGrOpContinue
- ldx #0
- ldy #0
- - lda #$00
- sta (syswork+0,x)
- clc
- lda syswork+0
- adc #8
- sta syswork+0
- bcc +
- inc syswork+1
- + iny
- cpy vdcBmCols
- bcc -
- lda vdcGrSor+0
- ldy vdcGrSor+1
- sta syswork+0
- sty syswork+1
- vdcGrOpContinue = *
- lda #bkACE
- sta bkSelect
- lda syswork+2+0
- bne +
- dec syswork+2+1
- + dec syswork+2+0
- lda syswork+2+0
- ora syswork+2+1
- bne +
- clc
- rts
- + bit vdcGrOpFlags
- bmi +
- clc
- lda syswork+8+0
- adc syswork+4
- sta syswork+8+0
- bcc +
- inc syswork+8+1
- + bit vdcGrOpFlags
- bvc +
- clc
- lda syswork+6+0
- adc syswork+4
- sta syswork+6+0
- bcc +
- inc syswork+6+1
- + lda vdcGrOpFlags
- and #$08
- beq +
- clc
- lda syswork+10+0
- adc syswork+4
- sta syswork+10+0
- bcc +
- inc syswork+10+1
- + inc vdcBmRow
- lda vdcBmRow
- and #$07
- beq +
- lda #<1
- ldy #>1
- jmp ++
- + lda #<320-7
- ldy #>320-7
- + clc
- adc syswork+0
- sta syswork+0
- tya
- adc syswork+1
- sta syswork+1
- jmp vdcGrOpLoop
-
- ;the end + blank line
-
- acecon.s
- 2628
- ;ACE-128/64 kernel console driver: high level I/O & keyboard
-
- conWinStart .buf 2
- conWinRows .buf 1
- conWinCols .buf 1
- conLineAddr .buf 2
- conCurRow .buf 1
- conCurCol .buf 1
- conWinStartRow .buf 1
- conWinStartCol .buf 1
- conWinDataEnd = *
- conRowInc .buf 2
-
- conPutMask .byte $80 ;$80=char,$40=color,$20=hiattr,$10=extattr
- conCharColor .byte $0e
- conFillColor .byte $0e
- conCursorColor .byte $07
- conIgnoreCtrl .byte $00
- conIgnoreShift .byte $00
- conExtAttr .byte $00 ;extended attrs:$80=alt,$40=rvs,$20=ul,$10=blink
- conPrescrollOverride .byte $00
- conChsetRvsChars .byte $ff ;$ff=rvsChars, $00=nonRvsChars
- conCharPalette .buf 42
-
- keylineNext = keylineBuf+0 ;(3)
- keylinePrev = keylineBuf+3 ;(3)
- keylineLen = keylineBuf+6 ;(1)
- keylineFlags = keylineBuf+7 ;(1)
- keyline = keylineBuf+8 ;(248)
- keylineMax = 248
-
- keylinePtr .buf 1
- keylinePos .buf 1
- keylineCount .buf 1
-
- .if computer-64
- shiftValue = $d3
- .else
- shiftValue = $28d
- .ife
-
- conInitLineNum .buf 1
- conHistbufScanPtr .buf 4
- conHistbufReplacePtr .buf 4
- conInitPrev = syswork+4
-
- conInit = *
- lda #$9a
- sta conCharPalette+$1a
-
- lda configBuf+$86
- sta conSsMax
- sta conSsCountdown
- lda #0
- sta keylineCount
- jsr keyscanInit
- lda #aceMemNull
- sta conHistbufScanPtr+3
- sta conHistbufReplacePtr+3
- sta conInitPrev+3
- lda #$00
- sta conInitPrev+0
- lda configBuf+$cb
- bne +
- jmp conWinInit
- + sta conInitLineNum
-
- conInitNext = *
- lda conInitLineNum
- bne +
- jmp conInitCleanHist
- + lda #1
- ldx #$00 ;xxx go for the slow
- ldy #$ff
- jsr kernPageAlloc
- bcs conInitCleanHist
- ;** check first line
- lda conHistbufReplacePtr+3
- cmp #aceMemNull
- bne +
- ldx #3
- - lda mp,x
- sta conHistbufReplacePtr,x
- dex
- bpl -
- ;** initialize line
- + ldx #2
- - lda conHistbufReplacePtr+1,x
- sta keylineNext,x
- lda conInitPrev+1,x
- sta keylinePrev,x
- lda mp+1,x
- sta conInitPrev+1,x
- dex
- bpl -
- lda #0
- sta keylineLen
- sta keylineFlags
- ;** store new line
- lda #<keylineBuf
- ldy #>keylineBuf
- sta zp+0
- sty zp+1
- lda #9
- ldy #0
- jsr stash
- ;** link previous line's next pointer
- ldx #2
- - lda keylinePrev,x
- sta mp+1,x
- dex
- bpl -
- lda #$00
- sta mp+0
- ldx #conInitPrev+1
- ldy #3
- jsr zpstore
- ;** go on to next line
- dec conInitLineNum
- jmp conInitNext
-
- conInitCleanHist = *
- lda conHistbufReplacePtr+3
- cmp #aceMemNull
- beq conWinInit
- ;** link first line's prev ptr to last line
- ldx #3
- - lda conHistbufReplacePtr,x
- sta mp,x
- dex
- bpl -
- lda #$03
- sta mp+0
- ldx #conInitPrev+1
- ldy #3
- jsr zpstore
- ;xx fall through
-
- conWinInit = *
- jsr conWinParms
- jmp conCls
-
- conWinParms = *
- jsr winsize
- sta conWinRows
- stx conWinCols
- lda syswork+0
- ldx syswork+1
- sta conWinStartRow
- stx conWinStartCol
- lda syswork+2
- ldy syswork+3
- sta conWinStart+0
- sty conWinStart+1
- lda syswork+4
- ldy syswork+5
- sta conRowInc+0
- sty conRowInc+1
- rts
-
- conCls = *
- lda #$e0
- ldx #" "
- ldy conFillColor
- jsr wincls
- jsr conHome
- rts
-
- conShutdown = *
- rts
-
- conWinChangeCallback = *
- jsr conWinParms
- jmp conHome
- rts
-
- conHome = *
- lda conWinStart+0
- ldy conWinStart+1
- sta conLineAddr+0
- sty conLineAddr+1
- lda #0
- sta conCurRow
- sta conCurCol
- rts
-
- conPutSave .buf 1
-
- kernConPutchar = *
- conPutchar = * ;( .A=char )
- cmp #chrCR
- bne +
- jmp conNewline
- + cmp #chrCLS
- beq conCls
- cmp #chrTAB
- bne +
- jmp conTab
- + cmp #chrBS
- bne +
- jmp conBackspace
- + cmp #chrBEL
- bne +
- jmp conBell
- + cmp #chrVT
- bne +
- jmp conCtrlDown
- + cmp #chrBOL
- bne conPutcharLit
- jmp conReturnOnly
-
- kernConPutlit = *
- conPutcharLit = * ;( .A=char )
- sta conPutSave
- lda conCurCol
- cmp conWinCols
- bcc +
- jsr conNewline
- + clc
- lda conLineAddr+0
- adc conCurCol
- sta syswork+0
- lda conLineAddr+1
- adc #0
- sta syswork+1
- lda #<conPutSave
- ldy #>conPutSave
- sta syswork+2
- sty syswork+3
- ldx #1
- stx syswork+5
- lda conExtAttr
- sta syswork+6
- lda conPutMask
- ldy conCharColor
- jsr winput
- inc conCurCol
- rts
-
- conGetCursorAddr = *
- clc
- lda conLineAddr+0
- adc conCurCol
- sta syswork+0
- lda conLineAddr+1
- adc #0
- sta syswork+1
- rts
-
- conSynchCursor = *
- lda conCurCol
- cmp conWinCols
- bcc +
- jsr conNewline
- + rts
-
- conNewline = *
- lda conIgnoreCtrl
- bmi +
- lda conIgnoreShift
- bmi +
- - lda shiftValue
- and #$0f
- cmp #$04
- beq -
- lda scrollFreeze
- bne -
- + lda #0
- sta conCurCol
- inc conCurRow
- lda conCurRow
- cmp conWinRows
- bcs +
- clc
- lda conLineAddr+0
- adc conRowInc+0
- sta conLineAddr+0
- lda conLineAddr+1
- adc conRowInc+1
- sta conLineAddr+1
- clc
- rts
- + dec conCurRow
- jsr conScroll
- clc
- rts
-
- conScroll = *
- bit conIgnoreCtrl
- bmi +
- bit conIgnoreShift
- bmi +
- lda #20
- sta scrollCountdown
- - lda shiftValue
- and #%10
- beq +
- cli
- lda scrollCountdown
- bne -
- + lda #" "
- sta syswork+4
- lda conPutMask
- ora #$08
- ldx #1
- ldy conFillColor
- jsr winscroll
- rts
-
- conTab = *
- lda conCurCol
- and #7
- sta syswork+0
- sec
- lda #8
- sbc syswork+0
- clc
- adc conCurCol
- cmp conWinCols
- bcc +
- lda conWinCols
- + sta conCurCol
- rts
-
- conReturnOnly = *
- lda #0
- sta conCurCol
- rts
-
- conBell = *
- lda #$15
- sta $d418
- ldy #$09
- ldx #$00
- sty $d405
- stx $d406
- lda #$30
- sta $d401
- lda #$20
- sta $d404
- lda #$21
- sta $d404
- rts
-
- ;*** aceConWrite( (zp)=buf, .AY=writeLength ) **zw gets modified**
-
- conWritePtr = syswork+8
- conWriteLength = syswork+10
- conWriteTemp = syswork+12
-
- kernConWrite = *
- conWrite = *
- sta conWriteLength+0
- sty conWriteLength+1
- lda zp+0
- ldy zp+1
- sta conWritePtr+0
- sty conWritePtr+1
-
- conWriteNextChunk = *
- lda #255
- ldx conWriteLength+1
- bne +
- lda conWriteLength+0
- beq conWriteFinish
- + jsr conWriteChunk
- sta conWriteTemp
- clc
- adc conWritePtr+0
- sta conWritePtr+0
- bcc +
- inc conWritePtr+1
- + sec
- lda conWriteLength+0
- sbc conWriteTemp
- sta conWriteLength+0
- bcs +
- dec conWriteLength+1
- + jmp conWriteNextChunk
-
- conWriteFinish = *
- clc
- rts
-
- conWrChkMaxLen .buf 1
-
- conWriteChunk = * ;( conWritePtr, .A=dataLen ) : .A=dataWritten
- sta conWrChkMaxLen
- - sec
- lda conWinCols
- sbc conCurCol
- bne +
- ldy #0
- lda (conWritePtr),y
- cmp #chrBOL
- beq ++
- cmp #chrBEL
- beq ++
- cmp #chrVT
- beq ++
- cmp #chrCLS
- beq ++
- cmp #chrBS
- beq ++
- jsr conWriteNewline
- ldy #0
- lda (conWritePtr),y
- cmp #chrCR
- bne -
- lda #1
- rts
- + cmp conWrChkMaxLen
- bcs +
- sta conWrChkMaxLen
- + ldy #0
-
- - lda (conWritePtr),y
- cmp #$14+1
- bcs ++
- - cpy #0
- bne conWrChkFlush
- cmp #chrCR
- bne +
- jsr conWriteNewline
- lda #1
- rts
- + jsr conPutchar
- lda #1
- rts
- + cmp #147
- beq -
- iny
- cpy conWrChkMaxLen
- bcc --
-
- conWrChkFlush = *
- sty conWrChkMaxLen
- clc
- lda conLineAddr+0
- adc conCurCol
- sta syswork+0
- lda conLineAddr+1
- adc #0
- sta syswork+1
- lda conWritePtr+0
- ldx conWritePtr+1
- sta syswork+2
- stx syswork+3
- sty syswork+5
- lda conExtAttr
- sta syswork+6
- lda conPutMask
- ldy conCharColor
- ldx syswork+5
- jsr winput
- clc
- lda conCurCol
- adc conWrChkMaxLen
- sta conCurCol
- lda conWrChkMaxLen
- rts
-
- ;*** kernConRead( (zp)=buf, .AY=readMaxLen ) : .AY=(zw)=len, .Z
-
- kernConRead = *
- conRead = *
- sta readMaxLen+0
- sty readMaxLen+1
- lda #0
- sta readLength+0
- sta readLength+1
- lda zp+0
- ldy zp+1
- sta readPtr+0
- sty readPtr+1
-
- conReadLoop = *
- lda readLength+0
- cmp readMaxLen+0
- lda readLength+1
- sbc readMaxLen+1
- bcs conReadExit
- jsr keylineGet
- bcs conReadEofExit
- ldy #0
- sta (readPtr),y
- inc readPtr+0
- bne +
- inc readPtr+1
- + inc readLength+0
- bne +
- inc readLength+1
- + cmp #$0d
- beq conReadExit
- jmp conReadLoop
-
- conReadExit = *
- lda readLength+0
- ldy readLength+1
- sta zw+0
- sty zw+1
- ldx #$ff
- clc
- rts
-
- conReadEofExit = *
- lda #0
- ldy #0
- sta zw+0
- sty zw+1
- clc
- rts
-
- keylineGet = * ;( keylinePtr, keylineCount ) : .A=char, .CS=eof
- lda keylineCount
- bne +
- jsr conInput
- bcs ++
- + ldx keylinePtr
- inc keylinePtr
- dec keylineCount
- lda keyline,x
- clc
- + rts
-
- conParmSave .buf 8
- conParmMp .buf 4
- conParmZp .buf 2
-
- conInput = *
- lda #$00
- sta conInputMode
- sta conInputFakeCount
- conInputIn = *
- ldx #0
- stx keylinePos
- stx keylineCount
- stx keylinePtr
- ldx #7
- - lda syswork,x
- sta conParmSave,x
- dex
- bpl -
- lda #$00
- sta conHistbufReplacePtr+0
- ldx #3
- - lda conHistbufReplacePtr,x
- sta conHistbufScanPtr,x
- lda mp,x
- sta conParmMp,x
- lda conHistbufReplacePtr,x
- sta mp,x
- dex
- bpl -
- lda #$06
- sta mp+0
- lda #0
- sta syswork
- ldx #syswork
- ldy #1
- jsr zpstore
- lda #$00
- sta mp+0
- ldx #1
- - lda zp,x
- sta conParmZp,x
- dex
- bpl -
-
- conInNext = *
- jsr conSynchCursor
- ldx conInputFakeCount
- beq +
- ldx conInputFakePos
- lda stringBuffer,x
- inc conInputFakePos
- dec conInputFakeCount
- jmp conInRegular
- + jsr conCursorOn
- jsr conGetkey
- jsr conCursorOff
- cmp #chrCR
- bne +
- jmp conInReturn
- + cmp #chrBS ;backspace
- bne +
- jmp conInBackspace
- + cmp #$03 ;stop
- bne +
- bit conInputMode
- bpl conInNext
- jsr conRestoreParms
- lda #$03
- ldx keylineCount
- sta keyline,x
- inc keylineCount
- sec
- rts
- + cmp #chrCLS ;clear
- bne +
- jmp conInClear
- + cmp #$e4
- bne +
- ldx keylineCount
- bne +
- jsr conRestoreParms
- lda #$e4
- sec
- rts
- + cmp #$f5 ;ct-u
- bne +
- jmp conInKill
- + cmp #29 ;right
- bne +
- jmp conInRight
- + cmp #157 ;left
- bne +
- jmp conInLeft
- + cmp #$10 ;co-left
- bne +
- - jmp conInBol
- + cmp #$ea ;ct-j
- beq -
- cmp #$15 ;co-right
- bne +
- - jmp conInEol
- + cmp #$eb ;ct-k
- beq -
- cmp #$f2 ;ct-r
- bne +
- jmp conInRedisplay
- + cmp #145 ;up
- bne +
- jmp conInPrevLine
- + cmp #17 ;down
- bne +
- jmp conInNextLine
- + cmp #$12 ;rvs
- bne +
- jsr conCtrlScreenRvs
- jmp conInNext
- + cmp #$92 ;rvs off
- bne +
- jsr conCtrlScreenRvsOff
- jmp conInNext
-
- conInRegular = *
- + ldx keylineCount
- cpx #keylineMax
- bcc +
- jsr conBell
- jmp conInNext
- + pha
- ;** insert space for new char
- inx
- stx keylineCount
- - lda keyline-1,x
- sta keyline,x
- dex
- beq +
- cpx keylinePos
- bcs -
- beq -
- + pla
- ldx keylinePos
- sta keyline,x
- inc keylinePos
- jsr conPutcharLit
- jsr conInSlosh
- jsr conInBackup
- jsr conInSaveLine
- jmp conInNext
-
- conInReturn = *
- jsr conInSaveLine
- jsr conInSlosh
- lda #chrCR
- ldx keylineCount
- sta keyline,x
- inc keylineCount
- jsr conPutchar
- ldx #0
- stx keylinePtr
- lda keylineLen
- beq +
- ldx #3
- - lda conHistbufReplacePtr,x
- sta mp,x
- dex
- bpl -
- lda #<keylineBuf
- ldy #>keylineBuf
- sta zp+0
- sty zp+1
- lda #3
- ldy #0
- jsr fetch
- ldx #2
- - lda keylineNext,x
- sta conHistbufReplacePtr+1,x
- dex
- bpl -
- + jsr conRestoreParms
- lda #chrCR
- clc
- rts
-
- conInClear = *
- jsr conPutchar
- lda #0
- sta keylinePos
- sta keylineCount
- jmp conInNext
-
- conInBackspace = *
- ldx keylinePos
- bne +
- jmp conInNext
- + dec keylinePos
- dec keylineCount
- ldx keylinePos
- jmp +
- - lda keyline+1,x
- sta keyline,x
- inx
- + cpx keylineCount
- bcc -
- jsr conBackspace
- jsr conInSlosh
- pha
- lda #" "
- jsr conPutchar
- pla
- clc
- adc #1
- jsr conInBackup
- jsr conInSaveLine
- jmp conInNext
-
- conInLeft = *
- lda keylinePos
- beq +
- jsr conBackspace
- dec keylinePos
- + jmp conInNext
-
- conInRight = *
- ldx keylinePos
- cpx keylineCount
- beq +
- lda keyline,x
- jsr conPutchar
- inc keylinePos
- + jmp conInNext
-
- conInBol = *
- lda keylinePos
- jsr conInBackup
- lda #0
- sta keylinePos
- jmp conInNext
-
- conInEol = *
- jsr conInSlosh
- lda keylineCount
- sta keylinePos
- jmp conInNext
-
- conInRedisplay = *
- lda keylinePos
- pha
- jsr conInBackup
- lda #0
- sta keylinePos
- jsr conInSlosh
- pla
- sta keylinePos
- sec
- lda keylineCount
- sbc keylinePos
- jsr conInBackup
- jmp conInNext
-
- conInKill = *
- jsr conInKillSub
- jmp conInNext
- conInKillCnt .buf 1
- conInKillSub = *
- ;** goto beginning of line
- lda keylinePos
- jsr conInBackup
- ;** blank out line
- lda #$ff
- sta conIgnoreCtrl
- lda keylineCount
- sta conInKillCnt
- beq +
- - lda #" "
- jsr conPutchar
- dec conInKillCnt
- bne -
- ;** backup
- + lda keylineCount
- jsr conInBackup
- lda #$00
- sta conIgnoreCtrl
- ;** internal
- lda #0
- sta keylinePos
- sta keylineCount
- rts
-
- conSloshPtr .buf 1
-
- conInSlosh = * ;( ) : BScount ;slosh out line from keylinePos to keylineCount
- lda #$ff
- sta conIgnoreCtrl
- lda keylinePos
- sta conSloshPtr
- - ldx conSloshPtr
- cpx keylineCount
- bcs +
- lda keyline,x
- jsr conPutcharLit
- inc conSloshPtr
- jmp -
- + lda #$00
- sta conIgnoreCtrl
- sec
- lda keylineCount
- sbc keylinePos
- rts
-
- conBackupCount .buf 1
-
- conInBackup = * ;( .A=count ) ;backup the cursor .A spaces
- sta conBackupCount
- cmp #0
- beq +
- - lda #chrBS
- jsr conPutchar
- dec conBackupCount
- bne -
- + rts
-
- conRestoreParms = *
- ldx #7
- - lda conParmSave,x
- sta syswork,x
- dex
- bpl -
- ldx #3
- - lda conParmMp,x
- sta mp,x
- dex
- bpl -
- ldx #1
- - lda conParmZp,x
- sta zp,x
- dex
- bpl -
- rts
-
- conInNextLine = *
- ;** locate next scan line
- lda conHistbufReplacePtr+3
- cmp #aceMemNull
- beq +
- jsr conInLineFetchHead
- ldx #2
- - lda conHistbufScanPtr+1,x
- cmp conHistbufReplacePtr+1,x
- bne ++
- dex
- bpl -
- + jmp conInNext
- + ldx #2
- - lda keylineNext,x
- sta conHistbufScanPtr+1,x
- sta mp+1,x
- dex
- bpl -
- jmp +++
-
- conInPrevLine = *
- ;** locate previous scan line
- lda conHistbufReplacePtr+3
- cmp #aceMemNull
- beq +
- jsr conInLineFetchHead
- ldx #2
- - lda keylinePrev,x
- cmp conHistbufReplacePtr+1,x
- bne ++
- dex
- bpl -
- + jsr conBell
- jmp conInNext
- + ldx #2
- - lda keylinePrev,x
- sta conHistbufScanPtr+1,x
- sta mp+1,x
- dex
- bpl -
- + lda #$00
- sta mp+0
- ;** undisplay current line
- jsr conInKillSub
- ;** fetch new line
- lda #<256
- ldy #>256
- jsr fetch
- ;** display new line
- lda #0
- sta keylinePos
- lda keylineLen
- sta keylineCount
- jsr conInSlosh
- lda keylineCount
- sta keylinePos
- jmp conInNext
-
- conInLineFetchHead = *
- ldx #3
- - lda conHistbufScanPtr,x
- sta mp,x
- dex
- bpl -
- lda #<keylineBuf
- ldy #>keylineBuf
- sta zp+0
- sty zp+1
- lda #6
- ldy #0
- jsr fetch
- rts
-
- conInSaveLine = *
- lda conHistbufReplacePtr+3
- cmp #aceMemNull
- bne +
- rts
- + lda keylineCount
- sta keylineLen
- ldx #3
- - lda conHistbufReplacePtr,x
- sta mp,x
- dex
- bpl -
- lda #$06
- sta mp+0
- lda #<keylineBuf+6
- ldy #>keylineBuf+6
- sta zp+0
- sty zp+1
- clc
- lda keylineCount
- adc #2
- ldy #0
- jsr stash
- lda #$00
- sta mp+0
- rts
-
- conBackspace = *
- dec conCurCol
- bpl +
- ldx conWinCols
- dex
- stx conCurCol
- lda conCurRow
- beq +
- dec conCurRow
- sec
- lda conLineAddr+0
- sbc conRowInc+0
- sta conLineAddr+0
- lda conLineAddr+1
- sbc conRowInc+1
- sta conLineAddr+1
- + rts
-
- conCursorOn = * ;( )
- jsr conGetCursorAddr
- ldy conCursorColor
- lda #$ff
- jsr wincursor
- rts
-
- conCursorOff = * ;( ) ;.A preserved
- pha
- jsr conGetCursorAddr
- lda #0
- jsr wincursor
- pla
- rts
-
- kernConColor = *
- conColor = *
- sta syswork+15
- and #$80
- beq ++
- lda syswork+15
- and #$40
- beq +
- ora #$f0
- + ora #$80
- sta conPutMask
- + lda syswork+15
- and #$02
- beq +
- stx conCharColor
- + lda syswork+15
- and #$01
- beq +
- sty conCursorColor
- + lda syswork+15
- and #$04
- beq +
- lda syswork+0
- sta conFillColor
- + lda conFillColor
- sta syswork+0
- ldx conCharColor
- ldy conCursorColor
- lda conPutMask
- and #%01000000
- ora #%10110111
- rts
-
- kernConPalette = *
- conPalette = *
- ldx #7
- - jsr conGetPaletteColor
- sta syswork+0,x
- dex
- bpl -
- rts
-
- conGetPaletteColor = * ;( .X=color ) : .A=color, .X unchanged
- bit textMode
- bpl +
- .if computer-64
- lda configBuf+$b0,x
- .else
- lda configBuf+$d0,x
- .ife
- rts
- + nop
- .if computer-64
- lda configBuf+$b8,x
- .else
- lda configBuf+$d8,x
- .ife
- rts
-
- conScrMaxRows .buf 1
- conScrDefRows .buf 1
- conScrReqRows .buf 1
-
- kernConScreen = *
- conScreen = *
- ;** check special sizes
- cpx #0
- bne +
- ldx #40
- bit textMode
- bpl +
- ldx #80
- + cpx #255
- bne +
- ldx #80
- .if computer-64
- .else
- bit configBuf+$c0
- bmi conScr6480cont
- ldx #40
- conScr6480cont = *
- .ife
- + ldy #25
- sty conScrMaxRows
- sty conScrDefRows
- .if computer-64
- cpx #40+1
- bcc +
- ldy configBuf+$ce
- sty conScrMaxRows
- ldy configBuf+$a9
- sty conScrDefRows
- .ife
- + cmp #0
- bne +
- lda conScrDefRows
- + cmp #255
- bne +
- lda conScrMaxRows
- ;** check screen limits
- + sta conScrReqRows
- cmp conScrMaxRows
- beq +
- bcc +
- - lda #aceErrInvalidConParms
- sta errno
- sec
- rts
- + cpx #81
- bcs -
- ;** set screen
- ldy #$00
- cpx #40+1
- bcc +
- ldy #$80
- + sty textMode
- .if computer-64
- ;** 128-set fast/slow
- cpy #0
- beq +
- lda vic+$11
- and #%01101111
- sta vic+$11
- lda #1
- sta vic+$30
- jsr vdcInit
- jmp ++
- + lda #0
- sta vic+$30
- lda vic+$11
- and #%01111111
- ora #%00010000
- sta vic+$11
- + nop
- .else
- ;** 64-initialize screen hardware
- cpy #$00
- bne +
- jsr vicInit
- jmp ++
- + jsr vdcInit
- bcc +
- lda #$00
- sta textMode
- lda #aceErrNoGraphicsSpace
- sta errno
- sec
- rts
- + nop
- .ife
- ;** change colors
- jsr conPalette
- ldx syswork+0
- ldy syswork+1
- lda #%10100111
- jsr conColor
- jsr conPalette
- ldx syswork+7
- ldy syswork+6
- lda #$c0
- jsr wincolor
- ;** window parms
- jsr winmax
- jsr conWinInit
- lda conWinRows
- ldx conWinCols
- ldy #0
- sta conMouseMaxX+0
- sty conMouseMaxX+1
- stx conMouseMaxY+0
- sty conMouseMaxY+1
- ldy #3
- - asl conMouseMaxX+0
- rol conMouseMaxX+1
- asl conMouseMaxY+0
- rol conMouseMaxY+1
- dey
- bne -
- jsr conMouseBounds
- lda conWinRows
- ldx conWinCols
- clc
- rts
-
- kernConPos = *
- cmp conWinRows
- bcc +
- - lda #aceErrInvalidConParms
- sta errno
- sec
- rts
- + cpx conWinCols
- bcs -
- sta conCurRow
- stx conCurCol
- ldx #0
- jsr winpos
- lda syswork+0
- ldy syswork+1
- sta conLineAddr+0
- sty conLineAddr+1
- clc
- rts
-
- kernConGetpos = *
- lda conCurRow
- ldx conCurCol
- clc
- rts
-
- ;3-Key Rollover-128 by Craig Bruce 18-Jun-93 from C= Hacking magazine
-
- .if computer-64
- scanrows = 11
- pk = $d02f
- newpos = $cc
- keycode = $d4
- prevKeycode = $d5
- xsave = $cd
- mask = $cc
- scanval = $d2
- capsPort = $0001
- keymapPtr = $cc
- .else
- scanrows = 8
- newpos = $f5
- keycode = $cb
- prevKeycode = $c5
- xsave = $f6
- mask = $f5
- scanval = $d9
- pk = $da ;dummy
- capsPort .byte $40
- keymapPtr = $f5
- .ife
- stopKeyRow .buf 1
- rollover = 3
- nullKey = $ff
-
- pa = $dc00
- pb = $dc01
- ddrb = $dc03
-
- conIrqKeyscan = *
- jsr conMouseIrq
- lda scrollCountdown
- beq +
- dec scrollCountdown
- + lda #0
- sta pa
- sta pk
- - lda pb
- cmp pb
- bne -
- cmp #$ff
- beq noKeyPressed
-
- jsr checkJoystick
- bcc noKeyPressed
- jsr keyscan
- jsr checkJoystick
- bcc noKeyPressed
- lda scanTable+7
- sta stopKeyRow
- jsr selectMouse
- jsr shiftdecode
- jsr keydecode
- jsr conScreenUnsave
- jsr keyorder
- bit ignoreKeys
- bmi +
- lda prevKeys+0
- cmp #nullKey
- beq +
- sta keycode
- jmp interpKey
-
- noKeyPressed = *
- jsr selectMouse
- lda #nullKey
- ldx #rollover-1
- - sta prevKeys,x
- dex
- bpl -
- jsr scanCaps
- lda #0
- sta ignoreKeys
- sta stopKeyRow
-
- + lda #nullKey
- sta keycode
- sta prevKeycode
- rts
-
- selectMouse = *
- lda #$ff
- sta pk
- lda #$7f ;selects paddle/mouse A
- sta pa
- rts
-
- keyscanInit = *
- lda #nullKey
- ldx #rollover-1
- - sta prevKeys,x
- dex
- bpl -
- lda #0
- sta ignoreKeys
- rts
-
- ;the idea for the keyscan routine comes from Marko Makela
-
- keyscan = *
- lda #$ff
- sty pa
- sty pk
- sta ddrb
- lda #$fe
- sta mask+0
- lda #$ff
- sta mask+1
- ldy #0
- nextRow = *
- lda mask+0
- sta pa
- lda mask+1
- sta pk
- sec
- rol mask+0
- rol mask+1
- lda #$ff
- sta scanval
- ldx #8
- lda #$fe
- - sta ddrb
- sta pb
- sec
- rol
- pha
- - lda pb
- cmp pb
- bne -
- and scanval
- sta scanval
- pla
- dex
- bne --
- lda #$ff
- sta pa
- sta pk
- lda scanval
- eor #$ff
- sta scanTable,y
- iny
- cpy #scanrows
- bcc nextRow
- lda #$00
- sta ddrb
- rts
-
- shiftRows .byte $01,$06,$07,$07,$0a
- shiftBits .byte $80,$10,$20,$04,$01
- shiftMask .byte $01,$01,$02,$04,$08
-
- shiftdecode = *
- jsr scanCaps
- .if computer-64
- ldy #4
- .else
- ldy #3
- .ife
- - ldx shiftRows,y
- lda scanTable,x
- and shiftBits,y
- beq +
- lda shiftMask,y
- ora shiftValue
- sta shiftValue
- lda shiftBits,y
- eor #$ff
- and scanTable,x
- sta scanTable,x
- + dey
- bpl -
- rts
-
- scanCaps = *
- - lda capsPort
- cmp capsPort
- bne -
- eor #$ff
- and #$40
- lsr
- lsr
- sta shiftValue
- rts
-
- keydecode = *
- ldx #rollover-1
- lda #$ff
- - sta newKeys,x
- dex
- bpl -
- ldy #0
- sty newpos
- ldx #0
- stx keycode
-
- decodeNextRow = *
- lda scanTable,x
- beq decodeContinue
-
- ldy keycode
- - lsr
- bcc ++
- pha
- stx xsave
- ldx newpos
- cpx #rollover
- bcs +
- tya
- sta newKeys,x
- inc newpos
- + ldx xsave
- pla
- + iny
- cmp #$00
- bne -
-
- decodeContinue = *
- clc
- lda keycode
- adc #8
- sta keycode
- inx
- cpx #scanrows
- bcc decodeNextRow
- rts
-
- keyorder = *
- ;** remove old keys no longer held
- ldy #0
- nextRemove = *
- lda prevKeys,y
- cmp #$ff
- beq ++
- ldx #rollover-1
- - cmp newKeys,x
- beq +
- dex
- bpl -
- tya
- tax
- - lda prevKeys+1,x
- sta prevKeys+0,x
- inx
- cpx #rollover-1
- bcc -
- lda #$ff
- sta prevKeys+rollover-1
- sta ignoreKeys
- + iny
- cpy #rollover
- bcc nextRemove
-
- ;** insert new key at front
- + ldy #0
- nextInsert = *
- lda newKeys,y
- cmp #$ff
- beq ++
- ldx #rollover-1
- - cmp prevKeys,x
- beq +
- dex
- bpl -
- pha
- ldx #rollover-2
- - lda prevKeys+0,x
- sta prevKeys+1,x
- dex
- bpl -
- lda #0
- sta ignoreKeys
- pla
- sta prevKeys+0
- ldy #rollover
- + iny
- cpy #rollover
- bcc nextInsert
- + rts
-
- checkJoystick = *
- lda #$ff
- sta pa
- sta pk
- - lda pb
- cmp pb
- bne -
- cmp #$ff
- rts
-
- scanTable .buf scanrows
- newKeys .buf rollover
- ignoreKeys .buf 1
- prevKeys .buf rollover+2
-
- scrollFreeze .byte $00
- delayCountdown .byte $00
- repeatCountdown .byte $00
- scrollCountdown .byte $00
-
- interpKey = * ;( keycode )
- lda keycode
- ;** noscroll
- cmp #87 ;noscroll
- bne interpCaps
- beq +
- cmp #63 ;run/stop
- bne interpCaps
- lda shiftValue
- and #%1111
- cmp #4 ;control
- bne interpCaps
- lda keycode
- + cmp prevKeycode
- beq +
- sta prevKeycode
- lda scrollFreeze
- eor #$ff
- sta scrollFreeze
- + rts
-
- interpCaps = *
- .if computer-64
- .else
- lda keycode
- cmp #63 ;run/stop
- bne interpShifts
- lda shiftValue
- and #%1111
- cmp #2 ;commodore
- bne interpShifts
- lda keycode
- cmp prevKeycode
- beq +
- sta prevKeycode
- lda capsPort
- eor #$40
- sta capsPort
- + rts
- .ife
-
- interpShifts = *
- lda shiftValue
- and #%00011111
- cmp #%00010000
- bne +
- lda #$05
- jmp handleKey ;caps
- + and #%1111
- tax
- lda shiftPriVec,x
- jmp handleKey
-
- shiftPriVec = *
- ; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- .byte $00,$01,$02,$06,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04
-
- handleKey = * ;( keycode, .A=shiftTableNum )
- asl
- tax
- lda keycode
- cmp prevKeycode
- beq handleRepeat
- jmp handleOrigKey
-
- handleRepeat = *
- stx xsave
- lda delayCountdown
- beq +
- dec delayCountdown
- beq ++
- rts
- + dec repeatCountdown
- beq +
- - rts
- + lda configBuf+$c9
- sta repeatCountdown
- lda keybufCount
- bne -
- ldx xsave
- jmp +
-
- handleOrigKey = * ;( .X=shiftTabOff )
- lda configBuf+$c8
- sta delayCountdown
- lda #0
- sta scrollFreeze
- + lda conKeymapIndirect+0,x
- sta keymapPtr+0
- lda conKeymapIndirect+1,x
- sta keymapPtr+1
- ldy keycode
- sty prevKeycode
- lda (keymapPtr),y
- bne storeKey
- rts
-
- keybufHead .byte 0
- keybufTail .byte 0
- keybufCount .byte 0
- keybufSize = 32 ;power of 2
- keybufData .buf keybufSize
- keybufShift .buf keybufSize
-
- storeKey = * ;( .A=char )
- ldx keybufCount
- cpx #keybufSize
- bcc +
- ;xx ring bell--intr
- rts
- + ldx keybufTail
- sta keybufData,x
- lda shiftValue
- and #$0f
- cmp #$03
- bne +
- - lda shiftValue
- ora #$20
- jmp ++
- + lda keycode
- cmp #64
- bcs -
- lda shiftValue
- + sta keybufShift,x
- inc keybufTail
- lda keybufTail
- and #keybufSize-1
- sta keybufTail
- inc keybufCount
- rts
-
- ;*** getkey( ) : .A=keyChar, .X=keyShift
-
- kernConGetkey = *
- conGetkey = *
- php
- - cli
- lda keybufCount
- beq -
- sei
- ldy keybufHead
- dec keybufCount
- inc keybufHead
- lda keybufHead
- and #keybufSize-1
- sta keybufHead
- lda keybufData,y
- ldx keybufShift,y
- plp
- rts
-
- ;*** conkeyavail( ) : .CC=.Z=keyIsAvailable, .A=availKey[notRemoved], .X=shift
- kernConKeyAvail = *
- .if computer-64
- ldy #$80
- .else
- ldy #$00
- .ife
- lda keybufCount
- beq +
- ldy keybufHead
- lda keybufData,y
- ldx keybufShift,y
- clc
- rts
- + lda #$00
- ldx #$00
- sec
- rts
-
- ;*** stopkey( ) : .CC=notPressed
-
- kernConStopkey = *
- conStopkey = *
- lda stopKeyRow
- cmp #$80
- beq +
- - clc
- rts
- + lda shiftValue
- and #$0f
- bne -
- lda #0
- sta keybufCount
- sta keybufHead
- sta keybufTail
- sta scrollFreeze
- lda #aceErrStopped
- sta errno
- sec
- rts
-
- conKeymapIndirect = *
- .word conKeymapNormal,conKeymapShift,conKeymapCommodore,conKeymapControl
- .word conKeymapAlternate,conKeymapCaps,conKeymapShiftComm
-
- conKeymapNormal = *
- .byte $14,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- .byte $33,$57,$41,$34,$5a,$53,$45,$01 ;row 1
- .byte $35,$52,$44,$36,$43,$46,$54,$58 ;row 2
- .byte $37,$59,$47,$38,$42,$48,$55,$56 ;row 3
- .byte $39,$49,$4a,$30,$4d,$4b,$4f,$4e ;row 4
- .byte $2b,$50,$4c,$2d,$2e,$3a,$40,$2c ;row 5
- .byte $5c,$2a,$3b,$13,$01,$3d,$5e,$2f ;row 6
- .byte $31,$5f,$04,$32,$20,$02,$51,$03 ;row 7
- .byte $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- conKeymapShift = *
- .byte $94,$8d,$9d,$8c,$89,$8a,$8b,$91 ;row 0
- .byte $23,$d7,$c1,$24,$da,$d3,$c5,$01 ;row 1
- .byte $25,$d2,$c4,$26,$c3,$c6,$d4,$d8 ;row 2
- .byte $27,$d9,$c7,$28,$c2,$c8,$d5,$d6 ;row 3
- .byte $29,$c9,$ca,$30,$cd,$cb,$cf,$ce ;row 4
- .byte $db,$d0,$cc,$dd,$3e,$5b,$ba,$3c ;row 5
- .byte $dc,$c0,$5d,$93,$01,$3d,$de,$3f ;row 6
- .byte $21,$df,$04,$22,$20,$02,$d1,$83 ;row 7
- .byte $84,$38,$35,$02,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$07,$8d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$16,$17,$06,$0b,$00 ;row 10
-
- conKeymapCommodore = *
- .byte $08,$0d,$16,$8f,$80,$82,$84,$17 ;row 0
- .byte $96,$b7,$a1,$97,$ba,$b3,$a5,$01 ;row 1
- .byte $98,$b2,$a4,$99,$a3,$a6,$b4,$b8 ;row 2
- .byte $9a,$b9,$a7,$9b,$a2,$a8,$b5,$b6 ;row 3
- .byte $29,$a9,$aa,$30,$ad,$ab,$af,$ae ;row 4
- .byte $2b,$b0,$ac,$2d,$3e,$bb,$a0,$3c ;row 5
- .byte $bc,$7f,$bd,$93,$01,$bf,$be,$3f ;row 6
- .byte $81,$bf,$04,$95,$5f,$02,$b1,$03 ;row 7
- .byte $84,$38,$35,$18,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$07,$8d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$0c,$0f,$10,$15,$00 ;row 10
-
- conKeymapControl = *
- .byte $08,$00,$00,$8f,$80,$82,$84,$00 ;row 0
- .byte $1c,$f7,$e1,$9f,$fa,$f3,$e5,$00 ;row 1
- .byte $9c,$f2,$e4,$1e,$e3,$e6,$f4,$f8 ;row 2
- .byte $1f,$f9,$e7,$9e,$e2,$e8,$f5,$f6 ;row 3
- .byte $12,$e9,$ea,$92,$ed,$eb,$ef,$ee ;row 4
- .byte $2b,$f0,$ec,$2d,$00,$fb,$e0,$00 ;row 5
- .byte $fc,$60,$fd,$00,$00,$ff,$fe,$00 ;row 6
- .byte $90,$ff,$00,$05,$20,$00,$f1,$00 ;row 7
- .byte $84,$8c,$87,$18,$89,$8a,$88,$85 ;row 8
- .byte $1b,$84,$8f,$0a,$00,$8b,$80,$86 ;row 9
- .byte $08,$82,$2e,$16,$17,$19,$1a,$00 ;row 10
-
- conKeymapAlternate = *
- .byte $08,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- .byte $33,$77,$61,$34,$7a,$73,$65,$00 ;row 1
- .byte $35,$72,$64,$36,$63,$66,$74,$78 ;row 2
- .byte $37,$79,$67,$78,$62,$68,$75,$76 ;row 3
- .byte $39,$69,$6a,$30,$6d,$6b,$6f,$6e ;row 4
- .byte $2b,$70,$6c,$2d,$2e,$7b,$ba,$2c ;row 5
- .byte $a9,$60,$7d,$13,$00,$7f,$7e,$2f ;row 6
- .byte $31,$7f,$04,$32,$20,$02,$71,$03 ;row 7
- .byte $84,$38,$35,$09,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- conKeymapCaps = *
- .byte $14,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- .byte $33,$d7,$c1,$34,$da,$d3,$c5,$01 ;row 1
- .byte $35,$d2,$c4,$36,$c3,$c6,$d4,$d8 ;row 2
- .byte $37,$d9,$c7,$38,$c2,$c8,$d5,$d6 ;row 3
- .byte $39,$c9,$ca,$30,$cd,$cb,$cf,$ce ;row 4
- .byte $2b,$d0,$cc,$2d,$2e,$3a,$40,$2c ;row 5
- .byte $5c,$2a,$3b,$13,$01,$3d,$5e,$2f ;row 6
- .byte $31,$5f,$04,$32,$20,$02,$d1,$03 ;row 7
- .byte $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- conKeymapShiftComm = *
- .byte $00,$0d,$16,$00,$00,$00,$00,$17 ;row 0
- .byte $33,$0c,$10,$34,$0f,$15,$1b,$00 ;row 1
- .byte $35,$00,$0e,$36,$00,$00,$09,$00 ;row 2
- .byte $37,$18,$84,$38,$06,$04,$00,$00 ;row 3
- .byte $39,$16,$19,$30,$17,$1a,$00,$0b ;row 4
- .byte $2b,$07,$0a,$2d,$2e,$10,$00,$2c ;row 5
- .byte $00,$00,$15,$0c,$00,$00,$00,$04 ;row 6
- .byte $31,$1b,$00,$32,$00,$00,$00,$00 ;row 7
- .byte $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- .byte $00,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- conSsCountdown .byte 1
- conJifsPerMin = 3600
- conSsMinute .word conJifsPerMin
- conSsMax .byte 1
- conSsActive .byte $00
-
- conScreenSave = *
- lda conSsCountdown
- bne +
- - rts
- + lda conSsMinute+0
- bne +
- dec conSsMinute+1
- + dec conSsMinute+0
- lda conSsMinute+0
- ora conSsMinute+1
- bne -
- lda #<conJifsPerMin
- ldy #>conJifsPerMin
- sta conSsMinute+0
- sty conSsMinute+1
- dec conSsCountdown
- bne -
- jsr vdcScreenSave
- jsr vicScreenSave
- lda #$ff
- sta conSsActive
- rts
-
- conScreenUnsave = *
- lda conSsMax
- sta conSsCountdown
- lda #<conJifsPerMin
- ldy #>conJifsPerMin
- sta conSsMinute+0
- sty conSsMinute+1
- lda conSsActive
- bne +
- rts
- + jsr vdcScreenUnsave
- jsr vicScreenUnsave
- lda #$00
- sta conSsActive
- rts
-
- ;This is to be done when we are in the write routine about to scroll the screen
- ;because we have hit the bottom line of the display. It is also to be done in
- ;the context of the data remaining to be printed at the time. I've changed
- ;the design a little to quickly go through and count the number of newline
- ;characters in the buffer and then scroll by that amount.
-
- conLinesToScroll .buf 1
- conBytesToScroll .buf 2
- conScanPtr = syswork+14 ;(2)
- conScanLen .buf 2
- conMaxPrescroll .buf 1
- conSoft80NonReu .buf 1
-
- ;conWritePtr = syswork+8
- ;conWriteLength = syswork+10
-
- conWriteNewline = *
- bit conIgnoreCtrl
- bmi +
- bit conIgnoreShift
- bmi +
- lda shiftValue
- and #$07
- beq +
- - jmp conNewline
- + ldx conCurRow
- inx
- cpx conWinRows
- bcc -
-
- ;find maximum prescroll amount;
- ;if maximum prescroll amount < 2 then never mind;
-
- ldy #$00
- .if computer-64
- lda configBuf+$ac
- bit textMode
- bmi conPrescrollBegin
- lda configBuf+$ad
- .else
- lda configBuf+$af
- bit textMode
- bpl conPrescrollBegin
- ldy #$ff
- lda configBuf+$ae
- ldx vdcScrollReuWork+3
- cpx #aceMemNull
- beq conPrescrollBegin
- lda configBuf+$ab
- ldy #$00
- .ife
- conPrescrollBegin = *
- sty conSoft80NonReu
- ldx conPrescrollOverride
- beq +
- txa
- + sta conMaxPrescroll
- cmp #2
- bcs +
- jmp conNewline
- + cmp conWinRows
- bcc +
- lda conWinRows
- sta conMaxPrescroll
- + lda #1
- sta conLinesToScroll
- lda #0 ;number of bytes to move cursor up
- ldy #0
- sta conBytesToScroll+0
- sty conBytesToScroll+1
- lda conWritePtr+0
- ldy conWritePtr+1
- sta conScanPtr+0
- sty conScanPtr+1
- lda conWriteLength+0
- ldy conWriteLength+1
- sta conScanLen+0
- sty conScanLen+1
-
- ;** ignore first char of buffer
- inc conScanPtr+0
- bne +
- inc conScanPtr+1
- + lda conScanLen+0
- bne +
- dec conScanLen+1
- + dec conScanLen+0
- lda conScanLen+0
- ora conScanLen+1
- bne +
- jmp conPrescrollExit
-
- ;** count the CRs
- + ldy conScanLen+1
- beq +
- - ldy #0
- jsr conCountCrs
- bcs ++
- inc conScanPtr+1
- dec conScanLen+1
- bne -
- + ldy conScanLen+0
- jsr conCountCrs
- + jmp conPrescrollExit
-
- conCountCrs = * ;( (conScanPtr)=ptr, .Y=bytes, conCrCount ) : conCrCount,.CS=f
- dey
- beq ++
- - lda (conScanPtr),y
- cmp #chrCR
- bne +
- jsr conPrescrollLine
- bcc +
- rts
- + dey
- bne -
- + lda (conScanPtr),y
- cmp #chrCR
- beq +
- clc
- rts
- + jsr conPrescrollLine
- + rts
-
- conPrescrollLine = * ;.CS=maxed
- inc conLinesToScroll
- clc
- lda conBytesToScroll+0
- adc conRowInc+0
- sta conBytesToScroll+0
- bcc +
- inc conBytesToScroll+1
- + lda conLinesToScroll
- cmp conMaxPrescroll
- rts
-
- conPrescrollExit = *
- bit conSoft80NonReu
- bpl +
- lda conPrescrollOverride
- bne +
- - lda conLinesToScroll
- cmp configBuf+$a4
- bcs +
- jsr conPrescrollLine
- bcs +
- jmp -
-
- + lda #" "
- sta syswork+4
- lda conPutMask
- ora #$08
- ldx conLinesToScroll
- ldy conFillColor
- jsr winscroll
- inc conCurRow
- sec
- lda conCurRow
- sbc conLinesToScroll
- sta conCurRow
- sec
- lda conLineAddr+0
- sbc conBytesToScroll+0
- sta conLineAddr+0
- lda conLineAddr+1
- sbc conBytesToScroll+1
- sta conLineAddr+1
- lda #0
- sta conCurCol
- rts
-
- kernConPutctrl = *
- conPutctrl = *
- stx conPutctrlParm
- ;** check recognized
- ldx #conPutctrlDispatch-conPutctrlChars-1
- - cmp conPutctrlChars,x
- beq +
- dex
- bpl -
- bmi ++
- + txa
- asl
- tax
- lda conPutctrlDispatch+0,x
- sta syswork+0
- lda conPutctrlDispatch+1,x
- sta syswork+1
- ldx conPutctrlParm
- jmp (syswork+0)
- ;** check color
- + nop
- ;** print regular char
- jmp conPutchar
-
- conPutctrlChars = *
- .byte chrCR,chrCLS,chrTAB,chrBS,chrBEL,chrBOL,chrVT
- .byte $13,$91,$11,$9d,$1d
- .byte $12,$92,$08,$94
- .byte $fe,$e0
- .byte $f0,$f1,$f8
- .byte $e9,$e4,$ec
- .byte $ed,$e7,$f2,$ee
- .byte $f5,$ef,$e2
- conPutctrlDispatch = *
- .word conNewline,conCls,conTab,conBackspace,conBell,conReturnOnly,conCtrlDown
- .word conHome,conCtrlUp,conCtrlDown,conCtrlLeft,conCtrlRight
- .word conCtrlRvs,conCtrlRvsOff,conCtrlRub,conCtrlInsert
- .word conCtrlScreenEraseBegToCur,conCtrlScreenEraseCurToEnd
- .word conCtrlLineEraseBegToCur,conCtrlLineEraseCurToEnd,conCtrlLineErase
- .word conCtrlInsertLine,conCtrlDeleteLine,conCtrlPrescrollOverride
- .word conCtrlShiftScroll,conCtrlSynch,conCtrlScreenRvs,conCtrlScreenRvsOff
- .word conCtrlUnderline,conCtrlAttribOff,conCtrlBlink
- conPutctrlParm .buf 1
-
- conCtrlUp = * ;$91
- lda conCurRow
- beq +
- dec conCurRow
- sec
- lda conLineAddr+0
- sbc conRowInc+0
- sta conLineAddr+0
- lda conLineAddr+1
- sbc conRowInc+1
- sta conLineAddr+1
- clc
- rts
- + jsr conScrollDown
- clc
- rts
-
- conScrollDown = *
- lda #" "
- sta syswork+4
- lda conPutMask
- ora #$04
- ldx #1
- ldy conFillColor
- jsr winscroll
- rts
-
- conCtrlDown = * ;$11
- lda conCurCol
- pha
- jsr conNewline
- pla
- sta conCurCol
- rts
-
- conCtrlLeft = * ;$9d
- lda conCurRow
- ora conCurCol
- beq +
- jmp conBackspace
- + jsr conCtrlUp
- ldx conWinCols
- dex
- stx conCurCol
- rts
-
- conCtrlRight = * ;$1d
- inc conCurCol
- lda conCurCol
- cmp conWinCols
- bcc +
- jmp conNewline
- + rts
-
- conCtrlRvs = * ;$12
- lda conExtAttr
- ora #$40
- sta conExtAttr
- rts
-
- conCtrlRvsOff = * ;$92
- lda conExtAttr
- and #$ff-$40
- sta conExtAttr
- rts
-
- conCtrlLineEraseBegToCur = * ;$f0 (ESC p)
- ldx #0
- ldy conCurCol
- jmp conCtrlLineEraseWork
-
- conCtrlLineEraseCurToEnd = * ;$f1 (ESC q)
- ldx conCurCol
- ldy conWinCols
- dey
- jmp conCtrlLineEraseWork
-
- conCtrlLineErase = * ;$f8 (ESC x)
- ldx #0
- ldy conWinCols
- dey
-
- conCtrlLineEraseWork = * ;(.X=fromOff, .Y=toOffInclusive)
- stx syswork+0
- iny
- tya
- sec
- sbc syswork+0
- sta syswork+5
- lda conLineAddr+0
- ldy conLineAddr+1
- clc
- adc syswork+0
- bcc +
- iny
- + sta syswork+0
- sty syswork+1
- lda #" "
- sta syswork+4
- lda #$00
- sta syswork+6
- lda conPutMask
- ldx #0
- ldy conFillColor
- jsr winput
- rts
-
- conCtrlPrescrollOverride = * ;$ec (ESC l)
- stx conPrescrollOverride
- rts
-
- conCtrlShiftScroll = * ;$ed (ESC m)
- stx conIgnoreShift
- rts
-
- conCtrlSynch = * ;$e7 (ESC g)
- jsr conSynchCursor
- rts
-
- conCtrlInsertLine = * ;$e9 (ESC i)
- jsr conCtrlScreenGetBelow
- clc
- adc #1
- dec syswork+0
- jsr conSubwinSet
- lda conPutMask
- ora #$04
- jmp conCtrlDeleteWork
-
- conCtrlDeleteLine = * ;$e4 (ESC d)
- jsr conCtrlScreenGetBelow
- clc
- adc #1
- dec syswork+0
- jsr conSubwinSet
- lda conPutMask
- ora #$08
- conCtrlDeleteWork = *
- ldx #" "
- stx syswork+4
- ldx #1
- ldy conFillColor
- jsr winscroll
- jsr conSubwinExit
- rts
-
- conCtrlScreenEraseBegToCur = * ;$ef (ESC o)
- jsr conCtrlLineEraseBegToCur
- lda conWinStartRow
- ldx conWinStartCol
- sta syswork+0
- stx syswork+1
- lda conCurRow
- ldx conWinCols
- jmp conCtrlScreenEraseWork
-
- conCtrlScreenEraseCurToEnd = * ;$e0 (ESC @)
- jsr conCtrlLineEraseCurToEnd
- jsr conCtrlScreenGetBelow
- conCtrlScreenEraseWork = *
- jsr conSubwinSet
- bcs +
- lda conPutMask
- ldy conFillColor
- ldx #" "
- jsr wincls
- jsr conSubwinExit
- + rts
-
- conCtrlScreenGetBelow = * ;( ) : (sw+0)=start_row/col, .AX=size_rows/cols
- sec ;sic
- lda conWinStartRow
- adc conCurRow
- ldx conWinStartCol
- sta syswork+0
- stx syswork+1
- clc ;sic
- lda conWinRows
- sbc conCurRow
- ldx conWinCols
- rts
-
- conSubwinSave .buf conWinDataEnd-conWinStart
-
- conSubwinSet = * ;( ) : .CS=err
- pha
- ldy #conWinDataEnd-conWinStart-1
- - lda conWinStart,y
- sta conSubwinSave,y
- dey
- bpl -
- pla
- jmp winset
-
- conSubwinExit = * ;( )
- lda conWinStartRow-conWinStart+conSubwinSave ;use saved value
- ldx conWinStartCol-conWinStart+conSubwinSave
- sta syswork+0
- stx syswork+1
- lda conWinRows-conWinStart+conSubwinSave
- ldx conWinCols-conWinStart+conSubwinSave
- jsr winset
- ldx #conWinDataEnd-conWinStart-1
- - lda conSubwinSave,x
- sta conWinStart,x
- dex
- bpl -
- rts
-
- conCtrlScreenRvs = *
- .if computer-64
- bit textMode
- bpl +
- jsr vdcScreenRvs
- + nop
- .ife
- rts
-
- conCtrlScreenRvsOff = *
- .if computer-64
- bit textMode
- bpl +
- jsr vdcScreenRvsOff
- + nop
- .ife
- rts
-
- conCtrlUnderline = * ;$f5 (ESC U)
- lda conExtAttr
- ora #$20
- sta conExtAttr
- rts
-
- conCtrlBlink = * ;$e2 (ESC B)
- lda conExtAttr
- ora #$10
- sta conExtAttr
- rts
-
- conCtrlAttribOff = * ;$ef (ESC O)
- lda conExtAttr
- and #$80
- sta conExtAttr
- rts
-
- conCtrlRub = * ;$08
- rts
-
- conCtrlInsert = * ;$94
- rts
-
- kernConKeyMat = *
- lda zp+0
- ldy zp+1
- sta syswork+0
- sty syswork+1
- ldy #0
- - lda (syswork+0),y
- sta conKeymapNormal+0,y
- iny
- bne -
- inc syswork+1
- - lda (syswork+0),y
- sta conKeymapNormal+256,y
- iny
- bne -
- inc syswork+1
- - lda (syswork+0),y
- sta conKeymapNormal+512,y
- iny
- cpy #104
- bcc -
- clc
- rts
-
- conInputMode .buf 1
- conInputFakeCount .buf 1
- conInputFakePos .buf 1
-
- kernConInput = * ;( (zp)=buf/initstr, .Y=initStrLen ):.Y=len,.CS=excp,.A=fchar
- lda #$ff
- sta conInputMode
- sty conInputFakeCount
- ldy #0
- sty conInputFakePos
- - lda (zp),y
- sta stringBuffer,y
- iny
- cpy conInputFakeCount
- bcc -
- jsr conInputIn
- php
- pha
- dec keylineCount
- ldy #0
- cpy keylineCount
- beq +
- - lda keyline,y
- sta (zp),y
- iny
- cpy keylineCount
- bcc -
- + lda #$00
- sta (zp),y
- sta keylinePos
- sta keylineCount
- sta keylinePtr
- pla
- plp
- rts
-
- conMousePotx = sid+$19
- conMousePoty = sid+$1a
- conMouseOpotx .buf 1
- conMouseOpoty .buf 1
- conMouseNewValue .buf 1
- conMouseOldValue .buf 1
- conMouseX .buf 2
- conMouseY .buf 2
- conMouseButtons .buf 1
- conMouseMaxX .word 640
- conMouseMaxY .word 491
- conMouseScaleX .byte 8
- conMouseScaleY .byte 8
-
- kernConMouse = * ;( ) : .A=buttons:l/r:128/64,(sw+0)=pX,(sw+2)=pY,sw+4=cX,sw+5Y
- php
- sei
- jsr conMouseBounds
- lda conMouseX+0
- ldy conMouseX+1
- sta syswork+0
- sty syswork+1
- lda conMouseY+0
- ldy conMouseY+1
- sta syswork+2
- sty syswork+3
- lda conMouseButtons
- plp
- clc
- rts
-
- conMouseIrq = *
- lda conMousePotx
- ldy conMouseOpotx
- jsr conMouseMoveCheck
- sty conMouseOpotx
- clc
- adc conMouseX+0
- sta conMouseX+0
- txa
- adc conMouseX+1
- sta conMouseX+1
- lda conMousePoty
- ldy conMouseOpoty
- jsr conMouseMoveCheck
- sty conMouseOpoty
- sec
- eor #$ff
- adc conMouseY+0
- sta conMouseY+0
- txa
- eor #$ff
- adc conMouseY+1
- sta conMouseY+1
- lda #$00
- sta conMouseButtons
- rts
-
- conMouseMoveCheck = *
- sty conMouseOldValue
- sta conMouseNewValue
- ldx #0
- sec
- sbc conMouseOldValue
- and #%01111111
- cmp #%01000000
- bcs +
- lsr
- beq ++
- ldy conMouseNewValue
- rts
- + ora #%11000000
- cmp #$ff
- beq +
- sec
- ror
- ldx #$ff
- ldy conMouseNewValue
- rts
- + lda #0
- rts
-
- conMouseBounds = *
- ldx #0
- jsr +
- ldx #2
- + lda conMouseX+1,x
- bpl +
- lda #$00
- sta conMouseX+0,x
- sta conMouseX+1,x
- + lda conMouseX+0,x
- cmp conMouseMaxX+0,x
- lda conMouseX+1,x
- sbc conMouseMaxX+1,x
- bcc +
- lda conMouseMaxX+0,x
- sbc #1
- sta conMouseX+0,x
- lda conMouseMaxX+1,x
- sbc #0
- sta conMouseX+1,x
- + rts
-
- kernConJoystick = *
- lda #$00
- ldx #$00
- clc
- rts
-
- kernConChrset = * ;( .A=flags, (sw+0)=dataAddr, .X=start, .Y=len ) : .A=flags
- conChrset = *
- ;** flags: $80=put, $40=get, $20=0:chr/1:palette, $10=0:full/1:rvs
- ;** $08=8-bit, $04=4-bit, $02=main, $01=alternate
- ;** out flags tells what exists, both put&get means ignore full/rvs
- ;** initialize
- sta syswork+4 ;sw+4 = flags
- sty syswork+5 ;sw+5 = len
- lda syswork+0
- ldy syswork+1
- sta syswork+6 ;(sw+6) = dataAddr
- sty syswork+7
- ;** set up return code
- .if computer-64
- lda #%00001010
- .else
- lda #%00001010
- bit configBuf+$c0
- bpl +
- ora #%10000100
- + nop
- .ife
- sta syswork+8 ;sw+8 = exitFlags
- lda syswork+4
- and #$20
- beq +
- jmp conChrsetPalette
- ;** handle regular character definitions
- + txa
- ;** set start-character address
- ldy #0
- sty syswork+3 ;(syswork+2)=chrAddr
- ldx #3
- - asl
- rol syswork+3
- dex
- bne -
- sta syswork+2
- lda syswork+4
- ldx #$80
- and #$0c
- cmp #$04
- bne +
- lda #$d8
- bit syswork+8
- bmi ++
- jmp conChrsetExit
- + ldx #$00
- lda #$f0
- bit syswork+8
- bpl +
- lda #$d0
- + stx syswork+9 ;sw+9 = 4-bit flag
- clc
- adc syswork+3
- sta syswork+3
- ;** copy
- lda #bkRam0
- sta bkSelect
- - ldy #7
- - bit syswork+4
- bpl ++
- lda (syswork+6),y ;source
- bit syswork+9
- bpl +
- and #$f0
- sta syswork+10
- lsr
- lsr
- lsr
- lsr
- ora syswork+10
- + sta (syswork+2),y ;char
- + bit syswork+4
- bvc +
- lda (syswork+2),y ;char
- sta (syswork+6),y ;source
- + dey
- bpl -
- clc
- lda syswork+2
- adc #8
- sta syswork+2
- bcc +
- inc syswork+3
- + clc
- lda syswork+6
- adc #8
- sta syswork+6
- bcc +
- inc syswork+7
- + dec syswork+5
- bne --
- lda #bkACE
- sta bkSelect
- ;** load 80-col if necessary
- .if computer-64
- bit syswork+4
- bpl conChrsetExit
- lda syswork+0
- pha
- lda syswork+1
- pha
- jsr vdcLoadCharset
- pla
- sta syswork+1
- pla
- sta syswork+0
- .ife
-
- conChrsetExit = *
- ;** set full/rvs flag, exit
- lda syswork+4
- and #$c0
- cmp #$c0
- bne ++
- ldx #$00
- lda syswork+4
- and #$10
- beq +
- ldx #$ff
- + stx conChsetRvsChars
- + lda syswork+8
- and #$7f
- bit conChsetRvsChars
- bpl +
- ora #$10
- + clc
- rts
-
- conChrsetPalette = * ;( sw+4=flags, .X=startChar, sw+5=len, (sw+6)=dataAddr )
- ldy #0
- cpy syswork+5
- beq conChrsetExit
- - bit syswork+4
- bpl +
- lda (syswork+6),y
- sta conCharPalette,x
- + bit syswork+4
- bvc +
- lda conCharPalette,x
- sta (syswork+6),y
- + inx
- iny
- dec syswork+5
- bne -
- jmp conChrsetExit
-
- ;the end + blank line
-
- acerd.s
- 1665
- ;ACE-128/64 kernel ramdisk driver, started 18-Apr-1994.
-
- rdDirentLength = 48
- rdDirentBuf .buf rdDirentLength
- rdDirentBytes = aceDirentBytes-aceDirentBuffer+rdDirentBuf
- rdDirentDate = aceDirentDate-aceDirentBuffer+rdDirentBuf
- rdDirentType = aceDirentType-aceDirentBuffer+rdDirentBuf
- rdDirentFlags = aceDirentFlags-aceDirentBuffer+rdDirentBuf
- rdDirentUsage = aceDirentUsage-aceDirentBuffer+rdDirentBuf
- rdDirentNameLen = aceDirentNameLen-aceDirentBuffer+rdDirentBuf
- rdDirentName = aceDirentName-aceDirentBuffer+rdDirentBuf
- rdDirentHeadPtr = rdDirentBuf+$24
- rdDirentTailPtr = rdDirentBuf+$28
- rdDirentReserved = rdDirentBuf+$2c
- rdDcbOpenMode = fcbTable1+0 ;(1)
- rdDcbStatus = fcbTable1+1 ;(1)
- rdDcbNextDirent = fcbTable1+2 ;(4)
- rdFcbrOpenMode = fcbTable1+0 ;(1)
- rdFcbrNextBlk = fcbTable1+1 ;(3)
- rdFcbrFilePtr = fcbTable1+4 ;(4)
- rdFcbrBlkBytes = fcbTable1+8 ;(2)
-
- rdFcbwOpenMode = fcbTable1+0 ;(1)
- rdFcbwBlkPage = fcbTable1+1 ;(1)
- rdFcbwRemBytes = fcbTable1+2 ;(2)
- rdFcbwFilePtr = fcbTable1+4 ;(4)
- rdFcbwFileSize = fcbTable1+8 ;(4)
- rdFcbwDirent = fcbTable1+$c ;(4)
-
- rdFcbwBuf .buf 18
- rdFcbwBufOpenMode = rdFcbwOpenMode-rdFcbwOpenMode+rdFcbwBuf
- rdFcbwBufBlkPage = rdFcbwBlkPage-rdFcbwOpenMode+rdFcbwBuf
- rdFcbwBufRemBytes = rdFcbwRemBytes-rdFcbwOpenMode+rdFcbwBuf
- rdFcbwBufFilePtr = rdFcbwFilePtr-rdFcbwOpenMode+rdFcbwBuf
- rdFcbwBufFileSize = rdFcbwFileSize-rdFcbwOpenMode+rdFcbwBuf
- rdFcbwBufDirent = rdFcbwDirent-rdFcbwOpenMode+rdFcbwBuf
- rdInitIndex .buf 1
-
- rdInit = *
- ldx #0
- stx rdInitIndex
- - ldx rdInitIndex
- lda configBuf+0,x
- cmp #4
- bne +
- jsr rdInitDrive
- + clc
- lda rdInitIndex
- adc #4
- sta rdInitIndex
- cmp #$80
- bcc -
- rts
-
- rdMallocFlags .buf 1 ;xx not used yet
-
- rdVarMalloc = * ;( .A=pagesRequested ) : .CS=err, [mp]=mem, .A=pagesGotten
- jsr rdMalloc
- bcc +
- lda errno
- cmp #aceErrInsufficientMemory
- beq ++
- sec
- + rts
- + lda #1
- ;xx fall through
-
- rdMalloc = * ;( .A=pagesRequired ) : .CS=err, [mp]=mem, .A=pagesGotten
- pha
- pha
- lda #$fd
- sta allocProcID
- pla
- ldx #$00
- ldy #$ff
- jsr kernPageAlloc
- pla
- rts
-
- rdFree = * ;( [mp]=memPtr, .A=pages ) : .CS=err
- pha
- lda #$fd
- sta allocProcID
- pla
- jsr kernPageFree
- rts
-
- rdInitDrive = * ;( rdInitIndex )
- ;** alloc root dirent, root dir contents
- lda #2
- jsr rdMalloc
- bcc +
- rts
-
- ;** init device table entry: root dir, current dir
- + lda rdInitIndex
- asl
- tay
- lda rdDirentOffsetTab+0
- sta deviceTable+0,y
- sta deviceTable+4,y
- iny
- ldx #1
- - lda mp,x
- sta deviceTable+0,y
- sta deviceTable+4,y
- iny
- inx
- cpx #4
- bcc -
-
- ;** init root dirent
- jsr rdInitDirBlockStrbuf
- ldx #rdDirentLength-1
- lda #0
- - sta rdDirentBuf,x
- dex
- bpl -
- lda #1
- sta rdDirentBytes+1
- lda #<rdDirentDate
- ldy #>rdDirentDate
- jsr internGetDate
- ldx #3
- - lda rdRootType,x
- sta rdDirentType,x
- dex
- bpl -
- lda #%11110100
- sta rdDirentFlags
- lda #13
- sta rdDirentNameLen
- ldx #16
- - lda rdRootName,x
- sta rdDirentName,x
- dex
- bpl -
- lda rdInitIndex
- lsr
- lsr
- clc
- adc #"@"
- sta rdDirentName+12
- lda #%10000000
- sta rdDirentUsage
- ldx #3
- - lda mp,x
- sta rdDirentHeadPtr,x
- sta rdDirentTailPtr,x
- dex
- bpl -
- inc rdDirentHeadPtr+1
- inc rdDirentTailPtr+1
- ldx #rdDirentLength-1
- - lda rdDirentBuf,x
- sta workbuf+$10,x
- dex
- bpl -
- lda #<workbuf
- ldy #>workbuf
- sta zp+0
- sty zp+1
- lda #<256
- ldy #>256
- jsr stash
-
- ;** init root dir contents
- ;** "." entry
- lda #0
- sta rdDirentBytes+1
- lda #%01100100
- sta rdDirentFlags
- ldx #3
- - lda rdDotType,x
- sta rdDirentType,x
- dex
- bpl -
- lda #1
- sta rdDirentNameLen
- ldx #16
- lda #0
- - sta rdDirentName,x
- dex
- bpl -
- lda #"."
- sta rdDirentName+0
- lda #%11010000
- sta rdDirentUsage
- lda #$10
- sta rdDirentHeadPtr+0
- dec rdDirentHeadPtr+1
- ldx #rdDirentLength-1
- - lda rdDirentBuf,x
- sta workbuf+$10,x
- dex
- bpl -
- ;** ".." entry
- lda #2
- sta rdDirentNameLen
- lda #"."
- sta rdDirentName+1
- ldx #rdDirentLength-1
- - lda rdDirentBuf,x
- sta workbuf+$40,x
- dex
- bpl -
- ;** store dir block
- inc mp+1
- lda #<256
- ldy #>256
- jsr stash
- rts
-
- rdRootName = *
- .asc "ace-ramdisk-a"
- .byte 0,0,0,0
- rdRootType = *
- .asc "dir"
- .byte 0
- rdDotType = *
- .asc "hln"
- .byte 0
- rdDirentOffsetTab = *
- .byte $10,$40,$70,$a0,$d0
-
- rdInitDirBlockStrbuf = *
- ldx #0
- lda #0
- - sta workbuf,x
- inx
- bne -
- lda #1
- sta workbuf+$00
- sta workbuf+$05
- lda #aceMemNull
- sta workbuf+$03
- rts
-
- rdDcbOffset .buf 1
- rdFcbOffset = rdDcbOffset
- rdDevOffset .buf 1
- rdMpSave .buf 4
- rdZpSave .buf 2
- rdCount .buf 1
- rdRegSave .buf 3
-
- rdSaveMpZp = *
- ldx #3
- - lda mp,x
- sta rdMpSave,x
- dex
- bpl -
- lda zp+0
- ldy zp+1
- sta rdZpSave+0
- sty rdZpSave+1
- rts
-
- rdRestoreMpZp = *
- ldx #3
- - lda rdMpSave,x
- sta mp,x
- dex
- bpl -
- lda rdZpSave+0
- ldy rdZpSave+1
- sta zp+0
- sty zp+1
- rts
-
- rdDirOpen = *
- rdOpenPreamble = *
- lda openDevice
- asl
- sta rdDevOffset
- lda openFcb
- asl
- asl
- asl
- asl
- sta rdDcbOffset
- tax
- lda #"d"
- sta rdDcbOpenMode,x
- inx
- ldy #15
- lda #0
- - sta rdDcbOpenMode,x
- inx
- dey
- bne -
- ldx rdDcbOffset
- lda #$00
- sta rdDcbStatus,x
- ldy rdDevOffset
- iny
- iny
- iny
- iny
- lda #0
- sta rdCount
- ldx rdDcbOffset
- - lda deviceTable,y
- sta rdDcbNextDirent,x
- stx rdRegSave+1
- ldx rdCount
- sta rdWorkDir,x
- ldx rdRegSave+1
- inx
- iny
- inc rdCount
- lda rdCount
- cmp #4
- bcc -
- lda openFcb
- clc
- rts
-
- rdDirClose = *
- jmp closeFdEntry
-
- ;*** dirread( .X=dcb, .Y=devCfgOff ) : .Z=eof, aceDirentBuffer=data
-
- rdDcbNum .buf 1
-
- rdDirRead = *
- stx rdDcbNum
- tya
- asl
- sta rdDevOffset
- lda rdDcbNum
- asl
- asl
- asl
- asl
- sta rdDcbOffset
- jsr rdSaveMpZp
- ldx rdDcbOffset
- lda rdDcbOpenMode,x
- cmp #"d"
- beq +
- lda #aceErrFileNotInput
- jmp rdDirReadError
- + lda rdDcbStatus,x
- cmp #$00
- beq rdDirReadTitle
- cmp #$01
- bne +
- jmp rdDirReadDirent
- + lda #0
- sta aceDirentNameLen
- sta aceDirentName+0
- clc
- ;** fall through
- rdDirReadExit = *
- php
- jsr rdRestoreMpZp
- plp
- rts
- rdDirReadError = *
- sta errno
- sec
- lda #0
- jmp rdDirReadExit
-
- rdDirReadTitle = *
- ldx rdDcbOffset
- lda #$01
- sta rdDcbStatus,x
- ldy #0
- - lda rdDcbNextDirent,x
- sta mp,y
- inx
- iny
- cpy #4
- bcc -
- lda #<rdDirentBuf
- ldy #>rdDirentBuf
- sta zp+0
- sty zp+1
- lda #rdDirentLength
- ldy #0
- jsr fetch
- ldx #aceDirentLength-1
- - lda rdDirentBuf,x
- sta aceDirentBuffer,x
- dex
- bpl -
- ldx rdDcbOffset
- ldy #0
- - lda rdDirentHeadPtr,y
- sta rdDcbNextDirent,x
- inx
- iny
- cpy #4
- bcc -
- ldx rdDcbOffset
- lda #$10
- sta rdDcbNextDirent+0,x
- lda #$ff
- clc
- jmp rdDirReadExit
-
- rdDirReadDirent = *
- ldx rdDcbOffset
- ldy #0
- - lda rdDcbNextDirent,x
- sta mp,y
- inx
- iny
- cpy #4
- bcc -
- lda mp+0
- cmp #$ff
- beq rdDirReadNextBlock
- ldx rdDcbOffset
- clc
- adc #rdDirentLength
- bcc +
- lda #$ff
- + sta rdDcbNextDirent+0,x
- lda #<rdDirentBuf
- ldy #>rdDirentBuf
- sta zp+0
- sty zp+1
- lda #rdDirentLength
- ldy #0
- jsr fetch
- lda rdDirentUsage
- bpl rdDirReadDirent
- ldx #aceDirentLength-1
- - lda rdDirentBuf,x
- sta aceDirentBuffer,x
- dex
- bpl -
- lda #$ff
- clc
- jmp rdDirReadExit
-
- rdBlockHead .buf 6
- rdBhPages = rdBlockHead+0
- rdBhNextPg = rdBlockHead+1
- rdBhBytes = rdBlockHead+4
-
- rdDirReadNextBlock = *
- lda #$00
- sta mp+0
- lda #<rdBlockHead
- ldy #>rdBlockHead
- sta zp+0
- sty zp+1
- lda #6
- ldy #0
- jsr fetch
- lda rdBhNextPg+2
- cmp #aceMemNull
- beq rdDirReadFree
- ldx rdDcbOffset
- lda #$10
- sta rdDcbNextDirent+0,x
- inx
- ldy #0
- - lda rdBhNextPg,y
- sta rdDcbNextDirent,x
- inx
- iny
- cpy #3
- bcc -
- jmp rdDirReadDirent
-
- rdDirReadFree = *
- ldx rdDcbOffset
- lda #$ff
- sta rdDcbStatus,x
- lda #0
- ldx #aceDirentLength-1
- - sta aceDirentBuffer,x
- dex
- bpl -
- ldx #3
- - lda aceFreeMemory,x
- sta aceDirentBytes,x
- dex
- bpl -
- lda #%01000100
- sta aceDirentFlags
- lda #%00000000
- sta aceDirentUsage
- jsr rdRestoreMpZp
- lda #$ff
- clc
- rts
-
- rdChDir = *
- lda #0
- sta stringBuffer+2
- jmp chdirSetName
-
- rdFileType .buf 1
-
- rdOpen = *
- jsr rdOpenPreamble
- jsr rdSaveMpZp
- ldy openNameScan
- ldx #0
- - lda (zp),y
- sta stringBuffer,x
- beq +
- inx
- iny
- bne -
- + lda #"s"
- sta rdFileType
- lda stringBuffer-2,x
- cmp #","
- bne +
- lda stringBuffer-1,x
- sta rdFileType
- lda #0
- sta stringBuffer-2,x
- + ldx rdFcbOffset
- lda openMode
- sta rdFcbrOpenMode,x
- cmp #"r"
- beq +
- jmp rdOpenWrite
-
- ;** open for read
- + jsr rdScanDir
- bcc +
- lda errno
- jmp rdOpenError
- + ldx rdFcbOffset
- lda #0
- sta rdFcbrBlkBytes+0,x
- sta rdFcbrBlkBytes+1,x
- ldy #0
- - lda rdDirentHeadPtr+1,y
- sta rdFcbrNextBlk,x
- inx
- iny
- cpy #3
- bcc -
- jsr rdRestoreMpZp
- lda openFcb
- clc
- rts
-
- rdOpenWrite = *
- cmp #"w"
- beq +
- jmp rdOpenAppend
- + jsr rdScanDir
- bcs +
- lda #aceErrFileExists
- rdOpenError = *
- pha
- jsr rdRestoreMpZp
- pla
- sta errno
- ldx openFcb
- lda #lfnull
- sta lftable,x
- sec
- lda #fcbNull
- rts
- + lda rdFreeDirent+3
- cmp #aceMemNull
- bne +
- jsr rdAddDirBlock
- bcc +
- lda #aceErrDiskFull
- jmp rdOpenError
- ;** initialize directory entry
- + ldx #rdDirentLength-1
- lda #0
- - sta rdDirentBuf,x
- dex
- bpl -
- lda #$00
- sta stringBuffer+16
- ldx #$ff
- - inx
- lda stringBuffer,x
- sta rdDirentName,x
- bne -
- stx rdDirentNameLen
- lda #<rdDirentDate
- ldy #>rdDirentDate
- jsr internGetDate
- ldy #0
- lda rdFileType
- cmp #"p"
- bne +
- ldy #4
- + ldx #0
- - lda rdOpenWriteTypes,y
- sta rdDirentType,x
- iny
- inx
- cpx #4
- bcc -
- lda #%01101100
- sta rdDirentFlags
- lda #%10000000
- sta rdDirentUsage
- ldx #3
- - lda #aceMemNull
- sta rdDirentHeadPtr,x
- sta rdDirentTailPtr,x
- dex
- bpl -
- ;** initialize fcb buffer
- ldx #15
- lda #$00 ;xx assume null=$00
- - sta rdFcbwBufOpenMode,x
- dex
- bpl -
- lda #"w"
- sta rdFcbwBufOpenMode
- ldx #3
- - lda rdFreeDirent,x
- sta rdFcbwBufDirent,x
- sta mp,x
- dex
- bpl -
- ;** write directory entry
- rdOpenWriteFlush = *
- lda #<rdDirentBuf
- ldy #>rdDirentBuf
- sta zp+0
- sty zp+1
- lda #rdDirentLength
- ldy #0
- jsr stash
- ;** write fcb entry
- ldx #0
- ldy rdFcbOffset
- - lda rdFcbwBufOpenMode,x
- sta rdFcbwOpenMode,y
- iny
- inx
- cpx #16
- bcc -
- jsr rdRestoreMpZp
- lda openFcb
- clc
- rts
-
- rdOpenWriteTypes = *
- .asc "seq"
- .byte $00
- .asc "prg"
- .byte $00
-
- rdOpenAppend = *
- cmp #"a"
- beq +
- lda #aceErrInvalidFileMode
- jmp rdOpenError
- + jsr rdScanDir
- bcc +
- lda errno
- jmp rdOpenError
- + lda rdDirentFlags
- bpl +
- lda #aceErrOpenDirectory
- jmp rdOpenError
- + and #%00100000
- bne +
- lda #aceErrPermissionDenied
- jmp rdOpenError
- + lda rdDirentFlags
- ora #%00001000
- sta rdDirentFlags
- lda #<rdDirentDate
- ldy #>rdDirentDate
- jsr internGetDate
- lda #"w"
- sta rdFcbwBufOpenMode
- ldx #3
- - lda rdDirentTailPtr,x
- sta rdFcbwBufFilePtr,x
- sta mp,x
- lda rdDirentBytes,x
- sta rdFcbwBufFileSize,x
- lda rdDirentPtr,x
- sta rdFcbwBufDirent,x
- dex
- bpl -
- lda #$06
- sta rdFcbwBufFilePtr+0
- lda rdFcbwBufFilePtr+1
- sta rdFcbwBufBlkPage ;%%%
- lda #<rdOpenBlkHdr
- ldy #>rdOpenBlkHdr
- sta zp+0
- sty zp+1
- lda #6
- ldy #0
- jsr fetch
- clc
- lda rdFcbwBufFilePtr+0
- adc rdOpenBlkHdr+4
- sta rdFcbwBufFilePtr+0
- lda rdFcbwBufFilePtr+1
- adc rdOpenBlkHdr+5
- sta rdFcbwBufFilePtr+1
- sec
- lda #250
- sbc rdOpenBlkHdr+4
- sta rdFcbwBufRemBytes+0
- ldx rdOpenBlkHdr+0
- dex
- txa
- sbc rdOpenBlkHdr+5
- sta rdFcbwBufRemBytes+1
- ldx #3
- - lda rdDirentPtr,x
- sta mp,x
- dex
- bpl -
- jmp rdOpenWriteFlush
-
- rdOpenBlkHdr .buf 6
-
- rdWorkDir .buf 4
- rdDirentPtr .buf 4
- rdFreeDirent .buf 4
- rdScanDirOffset .buf 1
-
- rdScanDir = * ;( stringBuffer=filename, [rdWorkDir] ) : [rdDirentPtr]=dirent
- ldx #3
- - lda rdWorkDir,x
- sta mp,x
- lda #aceMemNull
- sta rdFreeDirent,x
- dex
- bpl -
- lda #<rdDirentBuf
- ldy #>rdDirentBuf
- sta zp+0
- sty zp+1
- lda #rdDirentLength
- ldy #0
- jsr fetch
- ldx #3
- - lda rdDirentHeadPtr,x
- sta mp,x
- dex
- bpl -
- lda #<workbuf
- ldy #>workbuf
- sta zp+0
- sty zp+1
-
- rdScanDirNextBlock = *
- lda mp+3
- cmp #aceMemNull
- bne +
- lda #aceErrFileNotFound
- sta errno
- sec
- rts
- + lda #<256
- ldy #>256
- jsr fetch
- lda #$10
- sta rdScanDirOffset
-
- rdScanDirNextDirent = *
- ldx rdScanDirOffset
- lda rdDirentUsage-rdDirentBuf+workbuf,x
- bmi +
- lda rdFreeDirent+3
- cmp #aceMemNull
- bne rdScanDirContinue
- ldx #3
- - lda mp,x
- sta rdFreeDirent,x
- dex
- bpl -
- lda rdScanDirOffset
- sta rdFreeDirent+0
- jmp rdScanDirContinue
- + ldy #0
- - lda rdDirentName-rdDirentBuf+workbuf,x
- cmp stringBuffer,y
- bne rdScanDirContinue
- inx
- iny
- cmp #0
- bne -
- lda rdScanDirOffset
- sta mp+0
- ldx #3
- - lda mp,x
- sta rdDirentPtr,x
- dex
- bpl -
- ldx rdScanDirOffset
- ldy #0
- - lda workbuf,x
- sta rdDirentBuf,y
- inx
- iny
- cpy #rdDirentLength
- bcc -
- clc
- rts
-
- rdScanDirContinue = *
- clc
- lda rdScanDirOffset
- adc #rdDirentLength
- sta rdScanDirOffset
- bcc rdScanDirNextDirent
- ldx #3
- - lda workbuf,x
- sta mp,x
- dex
- bpl -
- lda #$00
- sta mp+0
- jmp rdScanDirNextBlock
-
- rdAddDirBlock = * ;( [rdWorkDir] ) : [rdFreeDirent], .CS=err
- ;** alloc new block
- lda #$00 ;xx
- sta rdMallocFlags
- lda #1
- jsr rdMalloc
- bcc +
- lda #aceErrDiskFull
- sta errno
- sec
- rts
- ;** init new block
- + jsr rdInitDirBlockStrbuf
- lda #<workbuf
- ldy #>workbuf
- sta zp+0
- sty zp+1
- lda #<256
- ldy #>256
- jsr stash
- ldx #3
- - lda mp,x
- sta rdFreeDirent,x
- dex
- bpl -
-
- ;** modify working directory dirent
- ldx #3
- - lda rdWorkDir,x
- sta mp,x
- dex
- bpl -
- lda #<rdDirentBuf
- ldy #>rdDirentBuf
- sta zp+0
- sty zp+1
- lda #rdDirentLength
- ldy #0
- jsr fetch
- ldx #3
- - lda rdDirentTailPtr,x
- sta rdPrevBlkPtr,x
- lda rdFreeDirent,x
- sta rdDirentTailPtr,x
- dex
- bpl -
- lda #rdDirentLength
- ldy #0
- jsr stash
- ;** link previous dir block
- ldx #3
- - lda rdPrevBlkPtr,x
- sta mp,x
- dex
- bpl -
- lda #$01
- sta mp+0
- lda #<rdDirentTailPtr+1
- ldy #>rdDirentTailPtr+1
- sta zp+0
- sty zp+1
- lda #3
- ldy #0
- jsr stash
- ;** clean up
- lda #$10
- sta rdFreeDirent+0
- clc
- rts
-
- rdPrevBlkPtr .buf 4
-
- rdReadChunk = syswork+8
- rdFcbrBuf .buf 12
- rdFcbrBufOpenMode = rdFcbrOpenMode-rdFcbrOpenMode+rdFcbrBuf
- rdFcbrBufNextBlk = rdFcbrNextBlk-rdFcbrOpenMode+rdFcbrBuf
- rdFcbrBufFilePtr = rdFcbrFilePtr-rdFcbrOpenMode+rdFcbrBuf
- rdFcbrBufBlkBytes = rdFcbrBlkBytes-rdFcbrOpenMode+rdFcbrBuf
-
- rdRead = * ;( ) :.AY=(zw)=len,.Z=eof
- lda readFcb
- asl
- asl
- asl
- asl
- sta rdFcbOffset
- jsr rdSaveMpZp
- ldx rdFcbOffset
- ldy #0
- - lda rdFcbrOpenMode,x
- sta rdFcbrBuf,y
- inx
- iny
- cpy #10
- bcc -
- lda rdFcbrBufOpenMode
- cmp #"r"
- beq rdReadMore
- lda #aceErrFileNotInput
-
- rdReadError = *
- sta errno
- lda #0
- ldy #0
- sec
- rdReadExit = *
- php
- sta zw+0
- sty zw+1
- ldy #0
- ldx rdFcbOffset
- - lda rdFcbrBuf,y
- sta rdFcbrOpenMode,x
- inx
- iny
- cpy #10
- bcc -
- jsr rdRestoreMpZp
- lda zw+0
- ldy zw+1
- plp
- rts
-
- rdReadMore = *
- lda readMaxLen+0
- ora readMaxLen+1
- bne +
- - lda readLength+0
- ora readLength+1
- php
- lda readLength+0
- ldy readLength+1
- plp
- clc
- jmp rdReadExit
- + lda rdFcbrBufBlkBytes+0
- ldy rdFcbrBufBlkBytes+1
- sta rdReadChunk+0
- sty rdReadChunk+1
- ora rdReadChunk+1
- bne +
- lda #$06
- sta rdFcbrBufFilePtr+0
- lda #$00
- sta mp+0
- ldx #2
- - lda rdFcbrBufNextBlk,x
- sta rdFcbrBufFilePtr+1,x
- sta mp+1,x
- dex
- bpl -
- lda mp+3
- cmp #aceMemNull
- beq --
- lda #<workbuf
- ldy #>workbuf
- sta zp+0
- sty zp+1
- lda #6
- ldy #0
- jsr fetch
- lda workbuf+$04
- ldy workbuf+$05
- sta rdFcbrBufBlkBytes+0
- sty rdFcbrBufBlkBytes+1
- ldx #2
- - lda workbuf+$01,x
- sta rdFcbrBufNextBlk,x
- dex
- bpl -
- jmp rdReadMore
-
- + lda rdReadChunk+0
- cmp readMaxLen+0
- lda rdReadChunk+1
- sbc readMaxLen+1
- bcc +
- lda readMaxLen+0
- ldy readMaxLen+1
- sta rdReadChunk+0
- sty rdReadChunk+1
- + ldx #3
- - lda rdFcbrBufFilePtr,x
- sta mp,x
- dex
- bpl -
- lda readPtr+0
- ldy readPtr+1
- sta zp+0
- sty zp+1
- lda rdReadChunk+0
- ldy rdReadChunk+1
- jsr fetch
-
- clc
- lda readPtr+0
- adc rdReadChunk+0
- sta readPtr+0
- lda readPtr+1
- adc rdReadChunk+1
- sta readPtr+1
- clc
- lda readLength+0
- adc rdReadChunk+0
- sta readLength+0
- lda readLength+1
- adc rdReadChunk+1
- sta readLength+1
- clc
- lda rdFcbrBufFilePtr+0
- adc rdReadChunk+0
- sta rdFcbrBufFilePtr+0
- lda rdFcbrBufFilePtr+1
- adc rdReadChunk+1
- sta rdFcbrBufFilePtr+1
- sec
- lda readMaxLen+0
- sbc rdReadChunk+0
- sta readMaxLen+0
- lda readMaxLen+1
- sbc rdReadChunk+1
- sta readMaxLen+1
- sec
- lda rdFcbrBufBlkBytes+0
- sbc rdReadChunk+0
- sta rdFcbrBufBlkBytes+0
- lda rdFcbrBufBlkBytes+1
- sbc rdReadChunk+1
- sta rdFcbrBufBlkBytes+1
- jmp rdReadMore
-
- rdCfgOffset .buf 1
- rdWriteChunk = syswork+4
-
- rdWrite = * ;( writeLength, writePtr ) : (zp)=dataStart
- stx rdCfgOffset
- lda configBuf+$03,x
- sta rdMallocFlags
- lda regsave+1 ;fd
- asl
- asl
- asl
- asl
- sta rdFcbOffset
- jsr rdSaveMpZp
- ldx rdFcbOffset
- ldy #0
- - lda rdFcbwOpenMode,x
- sta rdFcbwBuf,y
- inx
- iny
- cpy #16
- bcc -
- lda rdFcbwBufOpenMode
- cmp #"w"
- beq rdWriteMore
- lda #aceErrFileNotOutput
-
- rdWriteError = *
- sta errno
- lda #0
- ldy #0
- sec
- rdWriteExit = *
- php
- ldy #0
- ldx rdFcbOffset
- - lda rdFcbwBuf,y
- sta rdFcbwOpenMode,x
- inx
- iny
- cpy #16
- bcc -
- jsr rdRestoreMpZp
- plp
- rts
-
- rdWriteMore = *
- lda writeLength+0
- ora writeLength+1
- bne +
- clc
- jmp rdWriteExit
- ;** get new block if old one full
- + lda rdFcbwBufRemBytes+0
- ora rdFcbwBufRemBytes+1
- beq +
- jmp rdWriteCopy
- ;** get new block
- + ldx writeLength+1
- lda writeLength+0
- beq +
- inx
- + txa
- jsr rdVarMalloc
- bcc +
- lda #aceErrDiskFull
- jmp rdWriteError
- + tax
- lda #0
- sec
- sbc #6
- sta rdFcbwBufRemBytes+0
- txa
- sbc #0
- sta rdFcbwBufRemBytes+1
- ;** initialize new block
- stx rdNewBlkData+0
- lda #<rdNewBlkData
- ldy #>rdNewBlkData
- sta zp+0
- sty zp+1
- lda #6
- ldy #0
- jsr stash ;necessary?
- ;** link in block, init fcb
- sec
- lda rdFcbwBufFilePtr+1
- sbc rdFcbwBufBlkPage
- sec
- sbc #1
- sta rdOldBlkData+5
- lda #250
- sta rdOldBlkData+4
- ldx #3
- - lda mp,x
- ldy rdFcbwBufFilePtr,x
- sta rdFcbwBufFilePtr,x
- sta rdOldBlkData,x
- sty mp,x
- dex
- bpl -
- lda rdFcbwBufBlkPage
- sta mp+1
- lda #$01
- sta mp+0
- lda rdFcbwBufFilePtr+1
- sta rdFcbwBufBlkPage
- lda #<rdOldBlkData+1
- ldy #>rdOldBlkData+1
- sta zp+0
- sty zp+1
- lda #5
- ldx mp+3
- cpx #aceMemNull
- bne +
- ldx #3
- - lda rdFcbwBufDirent,x
- sta mp,x
- dex
- bpl -
- clc
- lda mp+0
- adc #rdDirentHeadPtr-rdDirentBuf+1
- sta mp+0
- lda #3
- + ldy #0
- jsr stash
- lda #$06
- sta rdFcbwBufFilePtr+0
-
- ;** copy data into block
- rdWriteCopy = *
- ldx writeLength+0
- ldy writeLength+1
- cpx rdFcbwBufRemBytes+0
- tya
- sbc rdFcbwBufRemBytes+1
- bcc +
- ldx rdFcbwBufRemBytes+0
- ldy rdFcbwBufRemBytes+1
- + stx rdWriteChunk+0
- sty rdWriteChunk+1
- ldx #3
- - lda rdFcbwBufFilePtr,x
- sta mp,x
- dex
- bpl -
- lda writePtr+0
- ldy writePtr+1
- sta zp+0
- sty zp+1
- lda rdWriteChunk+0
- ldy rdWriteChunk+1
- jsr stash
-
- ;** update control variables
- clc
- lda rdFcbwBufFilePtr+0
- adc rdWriteChunk+0
- sta rdFcbwBufFilePtr+0
- lda rdFcbwBufFilePtr+1
- adc rdWriteChunk+1
- sta rdFcbwBufFilePtr+1
- sec
- lda rdFcbwBufRemBytes+0
- sbc rdWriteChunk+0
- sta rdFcbwBufRemBytes+0
- lda rdFcbwBufRemBytes+1
- sbc rdWriteChunk+1
- sta rdFcbwBufRemBytes+1
- clc
- lda writePtr+0
- adc rdWriteChunk+0
- sta writePtr+0
- lda writePtr+1
- adc rdWriteChunk+1
- sta writePtr+1
- sec
- lda writeLength+0
- sbc rdWriteChunk+0
- sta writeLength+0
- lda writeLength+1
- sbc rdWriteChunk+1
- sta writeLength+1
- clc
- lda rdFcbwBufFileSize+0
- adc rdWriteChunk+0
- sta rdFcbwBufFileSize+0
- lda rdFcbwBufFileSize+1
- adc rdWriteChunk+1
- sta rdFcbwBufFileSize+1
- bcc +
- inc rdFcbwBufFileSize+2
- bne +
- inc rdFcbwBufFileSize+3
- + jmp rdWriteMore
-
- rdNewBlkData = * ;gets modified
- .byte $00
- .byte aceMemNull,aceMemNull,aceMemNull
- .byte $00,$00
- rdOldBlkData = * ;gets modified
- .byte $00
- .byte aceMemNull,aceMemNull,aceMemNull
- .byte 250,$00
-
- rdClose = * ;( closeFd )
- lda closeFd
- asl
- asl
- asl
- asl
- sta rdFcbOffset
- tax
- lda rdFcbrOpenMode,x
- cmp #"w"
- beq +
- rts
- + ldy #0
- - lda rdFcbwOpenMode,x
- sta rdFcbwBuf,y
- inx
- iny
- cpy #16
- bcc -
- jsr rdSaveMpZp
- ;** tidy up last block control info
- ldx #3
- - lda rdFcbwBufFilePtr,x
- sta mp,x
- dex
- bpl -
- lda rdFcbwBufBlkPage
- sta mp+1
- lda #$01
- sta mp+0
- sec
- lda rdFcbwBufFilePtr+0
- sbc #$06
- sta rdOldBlkData+4
- lda rdFcbwBufFilePtr+1
- sbc rdFcbwBufBlkPage
- sta rdOldBlkData+5
- lda #aceMemNull
- sta rdOldBlkData+1
- sta rdOldBlkData+2
- sta rdOldBlkData+3
- lda #<rdOldBlkData+1
- ldy #>rdOldBlkData+1
- sta zp+0
- sty zp+1
- lda #5
- ldy #0
- jsr stash
- ;** tidy up directory entry
- ldx #3
- - lda mp,x
- sta rdFcbwBufFilePtr,x
- lda rdFcbwBufDirent,x
- sta mp,x
- dex
- bpl -
- lda #$00
- sta rdFcbwBufFilePtr+0
- lda #<rdDirentBuf
- ldy #>rdDirentBuf
- sta zp+0
- sty zp+1
- lda #rdDirentLength
- ldy #0
- jsr fetch
- lda rdDirentFlags
- and #%11110111
- sta rdDirentFlags
- ldx #3
- - lda rdFcbwBufFilePtr,x
- sta rdDirentTailPtr,x
- lda rdFcbwBufFileSize,x
- sta rdDirentBytes,x
- dex
- bpl -
- lda #rdDirentLength
- ldy #0
- jsr stash
- jsr rdRestoreMpZp
- rts
-
- rdBloadAddr .buf 2
- rdBloadTop .buf 2
- rdBloadLen .buf 2
- rdBloadFd .buf 1
- rdBloadBytes .buf 2
- rdBloadName .buf 2
- rdBloadEnd .buf 2
-
- rdBload = *
- ;** binary-load a file
- ;** this routine is fairly high-level and calls the regular file system
- ;** calls; make sure one fcb is free
- ldx #1
- - lda bloadAddress,x
- sta rdBloadAddr,x
- lda zp,x
- sta rdBloadName,x
- dex
- bpl -
- sec
- lda zw+0
- sta rdBloadTop+0
- sbc bloadAddress+0
- sta rdBloadLen+0
- lda zw+1
- sta rdBloadTop+1
- sbc bloadAddress+1
- sta rdBloadLen+1
- ;** (zp) already contains filename
- lda #"r"
- jsr open
- sta rdBloadFd
- bcc +
- rts
- + lda #<rdBloadBytes
- ldy #>rdBloadBytes
- sta zp+0
- sty zp+1
- lda #2
- ldy #0
- ldx rdBloadFd
- jsr read
- bcs rdBloadErrClose
- lda rdBloadAddr+0
- ldy rdBloadAddr+1
- sta zp+0
- sty zp+1
- lda rdBloadLen+0
- ldy rdBloadLen+1
- ldx rdBloadFd
- jsr read
- bcc +
- rdBloadErrClose = *
- lda errno
- pha
- lda rdBloadFd
- jsr close
- pla
- sta errno
- jsr rdBloadCleanup
- sec
- rts
-
- + clc
- adc rdBloadAddr+0
- sta rdBloadEnd+0
- tya
- adc rdBloadAddr+1
- sta rdBloadEnd+1
- lda #<rdBloadBytes
- ldy #>rdBloadBytes
- sta zp+0
- sty zp+1
- lda #1
- ldy #0
- ldx rdBloadFd
- jsr read
- beq +
-
- lda #aceErrBloadTruncated
- sta errno
- jmp rdBloadErrClose
-
- + lda rdBloadFd
- jsr close
- rdBloadCleanup = *
- ldx #1
- - lda rdBloadName,x
- sta zp,x
- lda rdBloadTop,x
- sta zw,x
- dex
- bpl -
- lda rdBloadEnd+0
- ldy rdBloadEnd+1
- clc
- rts
-
- rdExtractFiletype = * ;( stringBuffer, .X=strlen ) : .A=filetype, strBuf
- lda #"s"
- cpx #2
- bcs +
- - lda #"s"
- sec
- rts
- + lda stringBuffer-2,x
- cmp #","
- bne -
- lda #0
- sta stringBuffer-2,x
- lda stringBuffer-1,x
- clc
- rts
-
- rdRemoveDevice .buf 1
- rdRemoveBlkHdr .buf 7
- rdummy .buf 1
-
- rdRemove = * ;( .A=device, .Y=scanPos ) : .CC=ok
- sta rdRemoveDevice
- ;** fetch filename string for dir-scan
- ldx #0
- - lda (zp),y
- sta stringBuffer,x
- beq +
- inx
- iny
- bne -
- + jsr rdExtractFiletype
- jsr rdSaveMpZp
- ;** get working directory for dir-scan
- lda rdRemoveDevice
- asl
- tay
- iny
- iny
- iny
- iny
- ldx #0
- - lda deviceTable,y
- sta rdWorkDir,x
- iny
- inx
- cpx #4
- bcc -
- ;** scan directory, get file entry
- jsr rdScanDir
- bcc +
- jsr rdRestoreMpZp
- sec
- rts
- ;** remove all blocks of file
- + ldx #3
- - lda rdDirentHeadPtr,x
- sta mp,x
- dex
- bpl -
- rdRemoveNextBlock = *
- lda mp+3
- cmp #aceMemNull
- beq rdRemoveDirent
- ;*** fetch block header
- lda #<rdRemoveBlkHdr
- ldy #>rdRemoveBlkHdr
- sta zp+0
- sty zp+1
- lda #6
- ldy #0
- jsr fetch
- ;*** free block
- lda rdRemoveBlkHdr+0
- jsr rdFree
- ;*** go to next block
- ldx #2
- - lda rdRemoveBlkHdr+1,x
- sta mp+1,x
- dex
- bpl -
- lda #0
- sta mp+0
- jmp rdRemoveNextBlock
-
- ;** mark directory entry deleted
- rdRemoveDirent = *
- lda rdDirentUsage
- and #%01111111
- sta rdDirentUsage
- ;** write out updated directory entry
- ldx #3
- - lda rdDirentPtr,x
- sta mp,x
- dex
- bpl -
- lda #<rdDirentBuf
- ldy #>rdDirentBuf
- sta zp+0
- sty zp+1
- lda #rdDirentLength
- ldy #0
- jsr stash
- ;** tidy up and exit
- jsr rdRestoreMpZp
- clc
- rts
-
- rdRenameDevice .buf 1
- rdRenameScan .buf 1
- rdRenameType .buf 1
- rdRenameNewName .buf 17
-
- rdRename = * ;( .A=device, .Y=scanPos ) : .CC=ok
- sta rdRenameDevice
- sty rdRenameScan
- ;** scan for new name (should not exist)
- ldy #0
- ldx #0
- - lda (zw),y
- sta stringBuffer,x
- beq +
- inx
- iny
- bne -
- + jsr rdExtractFiletype
- bcc +
- lda #0
- + sta rdRenameType
- lda #0
- sta stringBuffer+16
- ldx #16
- - lda stringBuffer,x
- sta rdRenameNewName,x
- dex
- bpl -
- jsr rdSaveMpZp
- ;** get working directory for new-name-dir-scan
- lda rdRenameDevice
- asl
- tay
- iny
- iny
- iny
- iny
- ldx #0
- - lda deviceTable,y
- sta rdWorkDir,x
- iny
- inx
- cpx #4
- bcc -
- ;** scan directory, get file entry
- jsr rdScanDir
- bcs +
- jsr rdRestoreMpZp
- lda #aceErrFileExists
- sta errno
- sec
- rts
- ;** scan for dirent to modify
- + lda rdZpSave+0
- ldy rdZpSave+1
- sta zp+0
- sty zp+1
- ldy rdRenameScan
- ldx #0
- - lda (zp),y
- sta stringBuffer,x
- beq +
- inx
- iny
- bne -
- + jsr rdExtractFiletype
- jsr rdSaveMpZp
- ;** scan directory, get file entry
- jsr rdScanDir
- bcc +
- jsr rdRestoreMpZp
- sec
- rts
- + ldx #0
- - lda rdRenameNewName,x
- sta rdDirentName,x
- beq +
- inx
- bne -
- + stx rdDirentNameLen
- ldx #2
- - lda rdRenameKnownTypes1,x
- cmp rdRenameType
- beq +
- dex
- bpl -
- jmp ++
- + sta rdDirentType+0
- lda rdRenameKnownTypes2,x
- sta rdDirentType+1
- lda rdRenameKnownTypes3,x
- sta rdDirentType+2
- ;** write out updated directory entry
- + ldx #3
- - lda rdDirentPtr,x
- sta mp,x
- dex
- bpl -
- lda #<rdDirentBuf
- ldy #>rdDirentBuf
- sta zp+0
- sty zp+1
- lda #rdDirentLength
- ldy #0
- jsr stash
- ;** tidy up and exit
- jsr rdRestoreMpZp
- clc
- rts
-
- rdRenameKnownTypes1 .asc "spu"
- rdRenameKnownTypes2 .asc "ers"
- rdRenameKnownTypes3 .asc "qgr"
-
- ;the end + blank line
-
- aceswift.s
- 802
- ;ACE-128/64 kernel SwiftLink serial device driver, started 03-Mar-1995.
-
- ;This device driver uses the SwiftLink RS-232 Serial Cartridge, available from
- ;Creative Micro Designs, Inc. The device is based on the 6551 ACIA chip.
-
- ; baud rates: baud rates: format: crystal:
- ; ----------- ----------- ------- ------------
- ; $00=reserved $08=2400 $00=8N1 $00=2x(norm)
- ; $01=50 $09=4800 $80=7E1 $40=1x
- ; $02=110 $0a=7200
- ; $03=134.5 $0b=9600
- ; $04=300 $0c=19200
- ; $05=600 $0d=38400
- ; $06=1200 $0e=57600
- ; $07=1800 $0f=115200
-
- ;Note: this device driver is organized so that it will not "touch" the SL
- ;registers until the first Open call is executed. This is to prevent bad
- ;things from happening if the cartridge is "not present" when ACE
- ;initializes. Then, the device will be active until ACE shuts down,
- ;regardless of Open and Close calls.
-
- ;Note also: this device driver is rather complicated because of all kinds of
- ;race conditions and funky hardware mis-features. Interrupts are used for
- ;receive interrupts, with a user-defined maximum buffer size, and there are
- ;no transmit interrups, as data transmission is done with polling. The
- ;device driver also implements hardware flow control. Since the 6551 requires
- ;that the transmitter be disabled in order to drop the RTS signal (ready to
- ;accept data from modem), data to be transmitted when the transmitter is off
- ;is buffered until flow can be restore. The transmit buffer has a maximum
- ;capacity of 255 bytes, and if this is exceeded, transmit bytes are
- ;unceremoneously dropped on the floor.
-
- ;;slData = $de00 ;fixed for now
- ;;slStatus = $de01
- ;;slCommand = $de02
- ;;slControl = $de03
- slDataOff = 0
- slStatusOff = 1
- slCommandOff = 2
- slControlOff = 3
- slReady .buf 1 ;$00=not initialized, $ff=ready
- slOpened .buf 1
- slRecvFlowStopped .buf 1 ;$00=normal, $ff=RTS flow signal asserted (no Tx)
- slSendHead .buf 1
- slSendTail .buf 1
- slSendCount .buf 1
- slRecvFullCount .buf 1
- slOverrunBytes .buf 4
- slBufOverflowBytes .buf 4
- slSentBytes .buf 4
- slReceivedBytes .buf 4
- slLeanFlag .buf 1 ;flag: use lean or regular interrupt handler
-
- ;;The following variables are imported from the rest of the kernel
- ;;aceModemSendPage = aceStatB+105 ;(1) ;page of send buffer
- ;;aceModemRecvPage = aceStatB+106 ;(1) ;start page of recevie buffer
- ;;aceModemRecvHigh = aceStatB+107 ;(1) ;high page + 1
- ;;aceModemType = aceStatB+108 ;(1) ;$ff=swifty,$40=user-port,$00=none
- ;;aceModemIoPage = aceStatB+109 ;(1) ;page for SwiftLink registers
- ;;aceModemConfig = aceStatB+116 ;(1) ;$0x=baudrate, $80=0:8N1/1:7E1,
- ;$40=0:doubleCrystal/1:singleCrystal
- .if computer-64
- slSendPage = $c8
- slRecvHead = $ca
- slRecvTail = $b4
- slRecvFree = $ce
- slIoPage = $b2
- .else
- slSendPage = $a8
- slRecvHead = $aa
- slRecvTail = $b4
- slRecvFree = $ac
- slIoPage = $b2
- .ife
-
- slInit = *
- lda #$00
- sta slReady
- sta slOpened
- lda aceModemType
- cmp #$ff
- bne +
- lda #$00
- ldy aceModemSendPage
- sta slSendPage+0
- sty slSendPage+1
- sta slSendHead
- sta slSendTail
- sta slSendCount
- jsr slInitRegularRecv
- ldx #3
- lda #0
- - sta slOverrunBytes,x
- sta slBufOverflowBytes,x
- sta slSentBytes,x
- sta slReceivedBytes,x
- dex
- bpl -
- lda #$00
- ldy aceModemIoPage
- sta slIoPage+0
- sty slIoPage+1
- + clc
- rts
-
- slInitRegularRecv = *
- lda #$00
- sta slLeanFlag
- ldy aceModemRecvPage
- sta slRecvHead+0
- sty slRecvHead+1
- sta slRecvTail+0
- sty slRecvTail+1
- sta slRxCriticalSection
- sta slRecvFree+0
- sta slRecvFlowStopped
- sec
- lda aceModemRecvHigh
- sbc aceModemRecvPage
- sta slRecvFullCount
- sta slRecvFree+1
- lda #<nmiHandler ;bit of a hack
- ldy #>nmiHandler
- sta $318
- sty $319
- slInitFlow = *
- ldy #slCommandOff
- lda (slIoPage),y
- and #%11110011
- ora #%00001000
- sta (slIoPage),y
- rts
-
- slInitLeanRecv = *
- lda #$ff
- sta slLeanFlag
- sta leanFreeCnt
- lda #$00
- sta leanHead
- sta leanTail
- sta leanStopped
- lda #%00000001
- bit aceModemConfig
- bpl +
- lda #%01100001
- + sta leanRtsOff
- lda #<nmiSwiftlinkLeanInterrupt ;bit of a hack
- ldy #>nmiSwiftlinkLeanInterrupt
- sta $318
- sty $319
- jmp slInitFlow
-
- slTestLean = * ;( ) : .CC=useLean
- ;** must have: single-speed crystal, C128, Fast mode, 115200 baudrate, $de00
- bit aceModemConfig
- bvc +
- .if computer-64
- clc
- .else
- sec
- .ife
- bcs +
- lda $d030
- and #1
- beq +
- lda aceModemConfig
- and #$0f
- cmp #$0f
- bne +
- lda aceModemIoPage
- cmp #$de
- bne +
- clc
- rts
- + sec
- rts
-
- slShutdown = *
- ;** make sure that interrupts are turned off before exiting from ACE
- lda slReady
- bpl +
- lda #%00000010
- ldy #slCommandOff
- sta (slIoPage),y
- lda #%00011100
- ldy #slControlOff
- sta (slIoPage),y
- lda #$00
- sta slReady
- + clc
- rts
-
- slParmsTemp .buf 1
-
- kernModemParms = * ;( .A=baudrate|crystal|format, .X=change ) : .A=baud|c|format
- cpx #$00
- beq +
- ldy aceModemConfig
- sty slParmsTemp
- sta aceModemConfig
- bit slReady
- clc
- bpl +
- jsr slSetParms
- bcc +
- ldy slParmsTemp
- sty aceModemConfig
- + lda aceModemConfig
- rts
-
- slInitHardware = *
- lda #$00
- ldy #slStatusOff
- sta (slIoPage),y
- lda #%00001001
- ldy #slCommandOff
- sta (slIoPage),y
- lda #%00011100
- ldy #slControlOff
- sta (slIoPage),y
- ldy #slDataOff
- lda (slIoPage),y
- ;xx fall through
-
- slSetParms = * ;( aceModemConfig ) : .CS=error
- ;** control: baud + wordlen
- lda aceModemConfig
- and #$0f
- tax
- lda slBaudLookup,x
- bit aceModemConfig
- bvs +
- and #$0f
- jmp ++
- + lsr
- lsr
- lsr
- lsr
- + cmp #$00
- bne ++
- jsr slTestLean
- bcs +
- lda #$00
- jmp ++
- + sec
- rts
- + ora #%00010000
- bit aceModemConfig
- bpl +
- ora #%00100000
- + ldy #slControlOff
- sta (slIoPage),y
-
- ;** command: parity
- ldy #slCommandOff
- lda (slIoPage),y
- and #%00011111
- bit aceModemConfig
- bpl +
- ora #%01100000
- + sta (slIoPage),y
-
- ;** switch lean <--> normal receive
- jsr slTestLean
- bcs ++
- bit slLeanFlag
- bmi +
- jsr slInitLeanRecv
- + clc
- rts
- + bit slLeanFlag
- bpl +
- jsr slInitRegularRecv
- + clc
- rts
-
- slTemp .buf 1
- slBaudLookup = *
- .byte $00,$10,$30,$40,$65,$76,$87,$90,$a8,$ca,$db,$ec,$fe,$0f,$00,$00
- ; 0 1 2 3 4 5 6 7 8 9 a b c d e f
-
-
- kernModemCheck = * ;( ) : .X=outstSendBytes, .A=sendBytesFree,
- ; .Y=sendFlowStoppedFlag, .Z=oRecvB==0
- ldx slSendCount
- stx slTemp
- sec
- lda #0
- sbc slTemp
- sta slTemp
- bit slLeanFlag
- bmi +
- lda slRecvFree+1
- cmp slRecvFullCount
- php
- lda slTemp
- ldy slRecvFlowStopped
- plp
- clc
- rts
- + lda leanFreeCnt
- cmp #$ff
- php
- lda slTemp
- ldy leanStopped
- beq +
- ldy #$ff
- + plp
- clc
- rts
-
- kernModemStat = * ;( .X=zpStatBuf):.A=slStatus,[zSB+0]=ovrChrs,[zSB+4]=bovfChrs,
- ;[zSB+8]=receivedBytes, [zSB+12]=sentBytes
- ldy #0
- - lda slOverrunBytes,y
- sta 0,x
- lda slBufOverflowBytes,y
- sta 4,x
- lda slReceivedBytes,y
- sta 8,x
- lda slSentBytes,y
- sta 12,x
- inx
- iny
- cpy #4
- bcc -
- ldy #slStatusOff
- lda (slIoPage),y
- pha
- ldy #slDataOff
- lda (slIoPage),y ;bug-recovery hack
- tax
- pla
- clc
- rts
-
- slVic80ReuScrollSave .buf 1 ;xx horrible hack!
-
- slOpen = *
- bit slReady
- bmi +
- jsr slInitHardware
- lda #$ff
- sta slReady
- + lda slOpened
- bne +
- .if computer-64
- .else
- lda vdcScrollReuWork+3
- sta slVic80ReuScrollSave
- lda #aceMemNull
- sta vdcScrollReuWork+3
- .ife
- + php
- sei
- jsr slPollReceive ;get character received slightly before flow stopped
- inc slOpened
- ldy #slCommandOff
- lda (slIoPage),y
- and #%11110001
- ora #%00001000
- bit slRecvFlowStopped
- bpl +
- and #%11110011
- + sta (slIoPage),y
- jsr slPollReceive ;make sure we don't receive a char in race condition
- plp
- lda openFcb
- clc
- rts
-
- slPollReceive = *
- bit slLeanFlag
- bmi +
- jmp slIntConfirm
- + ldy #slStatusOff
- lda #$08
- and (slIoPage),y
- beq +
- and (slIoPage),y
- beq +
- ldy #slDataOff
- lda (slIoPage),y
- ldx leanFreeCnt
- beq +
- dec leanFreeCnt
- ldx leanTail
- sta leanBuffer,x
- inc leanTail
- + rts
-
- slCloseWait .buf 1
-
- slClose = *
- lda slOpened
- beq +
- dec slOpened
- bne +
- php
- sei
- ldy #slCommandOff
- lda (slIoPage),y
- and #%11110001
- sta (slIoPage),y
- pha
- ldx #20 ;wait for edge conditions after
- - dex ;dropping RTS, before disabling receive interrupts
- bne -
- pla
- ora #%00000010
- sta (slIoPage),y
- ;here, we are waiting for the modem to believe the RTS drop.
- ; The value used is a fudge factor that may have to change
- ; for different modems.
- lda configBuf+$87
- sta slCloseWait
- - jsr slPollReceive ;try receiving polled char
- dec slCloseWait
- bne -
- plp
- .if computer-64
- .else
- lda slVic80ReuScrollSave
- sta vdcScrollReuWork+3
- .ife
- + clc
- jmp closeFdEntry
-
- slReadBytesLeft .buf 2
- slReadChunkLen .buf 1
-
- slRead = *
- slReadNext = *
- sec
- lda readMaxLen+0
- sbc readLength+0
- sta slReadBytesLeft+0
- lda readMaxLen+1
- sbc readLength+1
- sta slReadBytesLeft+1
- ora slReadBytesLeft+0
- beq slReadEnd
- bcs ++
- slReadEnd = *
- lda slSendCount
- beq +
- jsr slTryToSend
- + lda readLength+0
- ldy readLength+1
- sta zw+0
- sty zw+1
- clc
- ldx #$ff
- rts
- + lda #128
- ldx slReadBytesLeft+1
- bne +
- ldx slReadBytesLeft+0
- cpx #128
- bcs +
- txa
- + jsr slReadBytes
- bcc +
- lda readLength+0
- ora readLength+1
- beq slReadNext ;** don't return on zero bytes read
- jmp slReadEnd
- + sty slReadChunkLen
- clc
- tya
- adc readPtr+0
- sta readPtr+0
- bcc +
- inc readPtr+1
- + clc
- lda readLength+0
- adc slReadChunkLen
- sta readLength+0
- bcc +
- inc readLength+1
- + clc
- lda slReceivedBytes+0
- adc slReadChunkLen
- sta slReceivedBytes+0
- bcc +
- inc slReceivedBytes+1
- bne +
- inc slReceivedBytes+2
- bne +
- inc slReceivedBytes+3
- + jmp slReadNext
-
- slReadLean = * ;( .A=maxBytes, readPtr ) : .Y=actualBytes, .CS=empty
- sta slReadChunkLen
- lda leanFreeCnt
- cmp #$ff
- bne +
- sec
- rts
- + php
- sei
- sec
- lda #$ff
- sbc leanFreeCnt
- cmp slReadChunkLen
- bcs +
- sta slReadChunkLen
- + ldy #0
- ldx leanHead
- - lda leanBuffer,x
- sta (readPtr),y
- inx
- iny
- inc leanFreeCnt
- cpy slReadChunkLen
- bcc -
- + stx leanHead
- ldx leanStopped
- beq +
- ldx leanFreeCnt
- cpx #64
- bcc +
- sty slReadChunkLen
- ldy #slCommandOff
- ldx #$00
- lda (slIoPage),y
- and #%11110011
- ora #%00001000
- stx leanStopped
- sta (slIoPage),y
- ldy slReadChunkLen
- + plp
- clc
- rts
-
- slRxCriticalSection .buf 1
-
- slReadBytes = * ;( .A=maxBytes, readPtr ) : .Y=actualBytes, .CS=empty
- bit slLeanFlag
- bmi slReadLean
- lda slRecvFree+1
- cmp slRecvFullCount
- bcc +
- sec
- rts
- + php
- sei
- lda #bkRam0
- sta bkSelect
- ldy #0
- lda (slRecvHead),y
- pha
- lda #bkACE
- sta bkSelect
- inc slRecvHead+0
- bne +
- inc slRecvHead+1
- lda slRecvHead+1
- cmp aceModemRecvHigh
- bcc +
- lda aceModemRecvPage
- sta slRecvHead+1
- ;** we should disable receive interrupts while decrementing count, since
- ;** it is shared between this routine and the interrupt handler, and
- ;** updates are non-atomic. However, there seems to be a problem with
- ;** missing interrupts altogether if interrupts are disabled when a
- ;** character is received.
- + lda #$ff
- sta slRxCriticalSection
- inc slRecvFree+0
- bne +
- inc slRecvFree+1
- + lda #$00
- sta slRxCriticalSection
- lda slRecvFlowStopped
- bpl ++
- lda slRecvFree+1 ;flow stopped; re-enable it if >= 16 bytes free
- bne +
- lda slRecvFree+0 ;this dual access is not critical
- and #$f0
- beq ++
- + ldx #$00
- ldy #slCommandOff
- lda (slIoPage),y
- ora #%00001000
- stx slRecvFlowStopped
- sta (slIoPage),y
- + pla
- plp
- ldy #0
- sta (readPtr),y
- iny
- clc
- rts
-
- slTryToSend = *
- ;** send as many buffered transmit bytes as possible, until either the
- ;** send buffer is empty or flow control is re-asserted
- lda slSendCount
- bne +
- - rts
- + ldy #slStatusOff
- - bit slLeanFlag
- bpl +
- lda leanStopped
- bne --
- jmp ++
- + bit slRecvFlowStopped
- bmi --
- + lda #%00010000
- and (slIoPage),y
- beq -
- ldy slSendHead
- ldx #bkRam0
- stx bkSelect
- lda (slSendPage),y
- ldx #bkACE
- stx bkSelect
- ;** because the 6551 works semi-intelligently, the race condition here
- ;** between detecting that it is okay to send and the possibility of
- ;** flow stoppage being re-asserted in the meantime, is non-critical:
- ;** the 6551 will automatically send the byte when data flow is reactivated
- ldy #slDataOff
- sta (slIoPage),y
- inc slSendHead
- dec slSendCount
- jmp slTryToSend
-
- slWrite = *
- slWriteNext = *
- lda writeLength+0
- ora writeLength+1
- bne +
- clc
- rts
- + ldy #0
- lda (writePtr),y
- jsr slWriteByte
- inc writePtr+0
- bne +
- inc writePtr+1
- + lda writeLength+0
- bne +
- dec writeLength+1
- + dec writeLength+0
- jmp slWriteNext
-
- slWriteByte = * ;( .A=byte ) : .CS=couldn't do(flow stopped), .A=char
- tax
- ldy #slStatusOff
- - bit slLeanFlag
- bpl +
- lda leanStopped
- bne slWriteStopped
- jmp ++
- + bit slRecvFlowStopped
- bmi slWriteStopped
- + lda #%00010000
- and (slIoPage),y
- beq -
- txa
- ldy #slDataOff
- sta (slIoPage),y
- inc slSentBytes+0
- bne +
- inc slSentBytes+1
- bne +
- inc slSentBytes+2
- bne +
- inc slSentBytes+3
- + clc
- rts
-
- slWriteStopped = *
- txa
- ;** send flow is disabled--put the char into the send buffer
- ;** note that if flow is disabled, it will not be re-enabled until after
- ;** the next "read" call
- ldy slSendCount
- cpy #255
- bcc +
- ;** send buffer is full--return with error
- sec
- rts
- + ldy slSendTail
- ldx #bkRam0
- stx bkSelect
- sta (slSendPage),y
- ldx #bkACE
- stx bkSelect
- inc slSendTail
- inc slSendCount
- clc
- rts
-
- ;** This interrupt is negative-edge triggered. This means that we can disable
- ;** further interrupts as long as we don't clear the current one. However,
- ;** we also must make sure that ALL interrupts are serviced and cleared before
- ;** we return.
-
- slInterrupt = * ;( ) : .CS=notSlInt
- bit slReady
- bmi +
- - sec
- rts
- + ldy #slStatusOff
- lda (slIoPage),y
- and #%00001000
- beq -
- bne +
-
- slIntAgain = *
- ldy #slStatusOff
- lda (slIoPage),y
- and #%00001000
- bne +
- clc
- rts
- ;** receive interrupt
- + lda (slIoPage),y ;slStatusOff
- and #%00000100
- beq +
- inc slOverrunBytes+0
- bne +
- inc slOverrunBytes+1
- bne +
- inc slOverrunBytes+2
- bne +
- inc slOverrunBytes+3
- + lda slRecvFree+0
- ora slRecvFree+1
- bne ++
- ;** The following condition checks for the case that we have interrupted
- ;** a receive-free count incrementing between $0ff -> $100. The increment
- ;** goes through $0ff -> $000 -> $100, so we could get a false zero
- ;** reading. If have interrupted that critical section of the increment
- ;** in the read-byte routine, then it is okay to proceed, since the
- ;** final count cannot be actually zero but must be $100. After we have
- ;** finished processing, the count will be $ffff, which will be incremented
- ;** to the correct result of $00ff when the interrupted code resumes. This
- ;** measure will also work even if the critical section is interrupted
- ;** again before it completes, provided that this doesn't happen more than
- ;** 256 times in a row (not very likely, in fact, impossible at 38.4 kbaud).
- lda slRxCriticalSection
- bmi ++
- ;** otherwise, the buffer really is full, so we drop the new character
- inc slBufOverflowBytes+0
- bne +
- inc slBufOverflowBytes+1
- bne +
- inc slBufOverflowBytes+2
- bne +
- inc slBufOverflowBytes+3
- + ldy #slDataOff
- lda (slIoPage),y
- nop ;drop the character on the floor
- jmp slIntConfirm
- + ldy #slDataOff
- lda (slIoPage),y
- ldy #bkRam0
- sty bkSelect
- ldy #0
- sta (slRecvTail),y
- lda #bkACE
- sta bkSelect
- inc slRecvTail+0
- bne +
- inc slRecvTail+1
- lda slRecvTail+1
- cmp aceModemRecvHigh
- bcc +
- lda aceModemRecvPage
- sta slRecvTail+1
- + lda slRecvFree+0
- bne +
- dec slRecvFree+1
- + dec slRecvFree+0
- ;nop ;we should be pulling the data out here.
- lda slRecvFree+1 ;if fewer than 8 bytes free, engage flow control
- bne slIntConfirm
- lda slRecvFree+0
- and #$f8
- bne slIntConfirm
- ldy #slCommandOff
- lda (slIoPage),y
- and #%11110011 ;drop RTS, disable Tx
- sta (slIoPage),y
- lda #$ff
- sta slRecvFlowStopped
-
- slIntConfirm = * ;confirm that all interrupts are clear
- ldy #slStatusOff
- lda (slIoPage),y
- and #%00001000
- beq +
- jmp slIntAgain
- + clc
- rts
-
- ;the end + blank line
-
- acepar.s
- 260
- ;ACE-128/64 kernel parallel port driver, started 18-Sep-1994.
-
- ;This device driver uses the parallel port network cable described in Issue #8
- ;of C= Hacking net magazine. If you don't have such a cable, then don't
- ;include this device in your device configuration. This device driver has
- ;also been extended to work with the geoCable parallel printer cable.
-
- parPA = $dd00
- parData = $dd01
- parDDR = $dd03
- parFlag = $dd0d
- parFlagVal = $10
- parLastOp .buf 1 ;$00=read, $01=write, $ff=no last op
- parReady .buf 1
- parReadCount .buf 2
- parProtocol .buf 1 ;$00=raw-PC, $40=use-PA2, $80=packet-oriented, $c0=packPA2
- parPa2Neutral .buf 1
- parPa2Assert .buf 1
-
- parInit = *
- lda #$00
- sta parReady
- ldx #0
- - lda configBuf+0,x
- cmp #5
- beq +
- txa
- clc
- adc #4
- tax
- cpx #$80
- bcc -
- clc
- rts
- ;** got a live one!
- + lda configBuf+3,x
- sta parProtocol
- lda #$00
- sta parDDR
- lda parDDR-1
- ora #$04
- sta parDDR-1
- sta parReadCount+0
- sta parReadCount+1
- lda #$ff
- sta parLastOp
- sta parReady
- lda parPA
- ora #$04
- sta parPA
- clc
- rts
-
- parGetPa2Parms = *
- lda parPA
- ora #$04
- sta parPa2Neutral
- eor #$04
- sta parPa2Assert
- rts
-
- parOpen = *
- lda openFcb
- clc
- rts
-
- parClose = *
- jsr parGetPa2Parms
- lda parLastOp
- cmp #$01
- bne +
- bit parProtocol
- bpl +
- lda #$e6 ;write EOF packet if we were last writer
- jsr parWriteByte
- lda #$00
- jsr parWriteByte
- lda #$00
- jsr parWriteByte
- + clc
- jmp closeFdEntry
-
- parRead = *
- jsr parGetPa2Parms
- lda parLastOp
- cmp #$01
- bne +
- lda #$00
- sta parDDR
- lda parData
- bit parProtocol
- bvc +
- ldx parPa2Assert
- stx parPA
- ldx parPa2Neutral
- stx parPA
- + lda #$00
- sta parLastOp
-
- parReadHeader = *
- lda parReadCount+0
- ora parReadCount+1
- bne ++
- bit parProtocol
- bmi +
- lda readMaxLen+0
- ldy readMaxLen+1
- sta parReadCount+0
- sty parReadCount+1
- jmp ++
- + jsr parReadByte
- cmp #$e6
- ;xx should check it here
- jsr parReadByte
- sta parReadCount+0
- jsr parReadByte
- sta parReadCount+1
- ora parReadCount+0
- bne +
- jsr parReadEnd ;eof
- ldx #$00
- rts
- + lda parReadCount+0
- cmp readMaxLen+0
- lda parReadCount+1
- sbc readMaxLen+1
- bcs +
- lda parReadCount+0
- ldy parReadCount+1
- sta readMaxLen+0
- sty readMaxLen+1
- + sec
- lda parReadCount+0 ;set count for next time
- sbc readMaxLen+0
- sta parReadCount+0
- lda parReadCount+1
- sbc readMaxLen+1
- sta parReadCount+1
-
- parReadNext = *
- lda readLength+0
- cmp readMaxLen+0
- lda readLength+1
- sbc readMaxLen+1
- bcc +
- parReadEnd = *
- lda readLength+0
- ldy readLength+1
- sta zw+0
- sty zw+1
- clc
- ldx #$ff
- rts
- + ldy #0
- lda #parFlagVal
- - bit parFlag
- beq -
- lda parData
- bit parProtocol
- bvc +
- ldx parPa2Assert
- stx parPA
- ldx parPa2Neutral
- stx parPA
- + sta (readPtr),y
- inc readPtr+0
- bne +
- inc readPtr+1
- + inc readLength+0
- bne +
- inc readLength+1
- + jmp parReadNext
-
- parReadByte = *
- lda #parFlagVal
- - bit parFlag
- beq -
- lda parData
- bit parProtocol
- bvc +
- ldx parPa2Assert
- stx parPA
- ldx parPa2Neutral
- stx parPA
- + rts
-
- parWrite = *
- jsr parGetPa2Parms
- lda parLastOp
- cmp #$01
- beq parWriteHeader
- ldx #$ff
- stx parDDR
- cmp #$00
- bne +
- lda #parFlagVal
- - bit parFlag
- beq -
- + lda #$01
- sta parLastOp
-
- parWriteHeader = *
- lda writeLength+0
- ora writeLength+1
- bne +
- clc
- rts
- + bit parProtocol
- bpl parWriteNext
- lda #$e6
- jsr parWriteByte
- lda writeLength+0
- jsr parWriteByte
- lda writeLength+1
- jsr parWriteByte
-
- parWriteNext = *
- lda writeLength+0
- ora writeLength+1
- bne +
- clc
- rts
- + ldy #0
- lda (writePtr),y
- bit parFlag ;** preventative
- sta parData
- bit parProtocol
- bvc +
- ldx parPa2Assert
- stx parPA
- ldx parPa2Neutral
- stx parPA
- + inc writePtr+0
- bne +
- inc writePtr+1
- + lda writeLength+0
- bne +
- dec writeLength+1
- + dec writeLength+0
- lda #parFlagVal
- - bit parFlag
- beq -
- jmp parWriteNext
-
- parWriteByte = *
- bit parFlag ;** preventative
- sta parData
- bit parProtocol
- bvc +
- ldx parPa2Assert
- stx parPA
- ldx parPa2Neutral
- stx parPA
- + lda #parFlagVal
- - bit parFlag
- beq -
- rts
-
- ;the end + blank line
-
- acekey-qwerty.s
- 130
- ;ACE-128/64 Dvorak keymatrix, by Craig Bruce - 07-June-1995
- ;
- ;this file is in ACE-assembler format.
-
- .org $2000
-
- ;The mapping of keyscan matrix positions to keys is as follows:
- ;
- ; \ COLUMNS:
- ;ROWS:\
- ; \ 0 1 2 3 4 5 6 7
- ; +-------+-------+-------+-------+-------+-------+-------+-------+ code
- ; 0 | DELETE| RETURN| RIGHT | F7 | F1 | F3 | F5 | DOWN | (0)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 1 | 3 | W | A | 4 | Z | S | E |L-SHIFT| (8)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 2 | 5 | R | D | 6 | C | F | T | X | (16)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 3 | 7 | Y | G | 8 | B | H | U | V | (24)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 4 | 9 | I | J | 0 | M | K | O | N | (32)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 5 | + | P | L | - | . | : | @ | , | (40)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 6 | \ | * | ; | HOME |R-SHIFT| = | ^ | / | (48)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 7 | 1 | _ |CONTROL| 2 | SPACE |COMMODR| Q | STOP | (56)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 8 | HELP | 8 | 5 | TAB | 2 | 4 | 7 | 1 | (64)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 9 | ESC | + | - | LF | ENTER | 6 | 9 | 3 | (72)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 10 | ALT | 0 | . | UP | DOWN | LEFT | RIGHT |NO-SCRL| (80)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
-
- ;Note that the C128's keyboard has all eleven rows (0-10) whereas the C64's
- ;keyboard only has the first eight (0-7). The entires with $00 mean that
- ;pressing the associated key does nothing. There are multiple key matrices
- ;to produce the codes for use with various "shift" keys.
-
- conKeymapNormal = *
- .byte $14,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- .byte $33,$57,$41,$34,$5a,$53,$45,$01 ;row 1
- .byte $35,$52,$44,$36,$43,$46,$54,$58 ;row 2
- .byte $37,$59,$47,$38,$42,$48,$55,$56 ;row 3
- .byte $39,$49,$4a,$30,$4d,$4b,$4f,$4e ;row 4
- .byte $2b,$50,$4c,$2d,$2e,$3a,$40,$2c ;row 5
- .byte $5c,$2a,$3b,$13,$01,$3d,$5e,$2f ;row 6
- .byte $31,$5f,$04,$32,$20,$02,$51,$03 ;row 7
- .byte $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- conKeymapShift = *
- .byte $94,$8d,$9d,$8c,$89,$8a,$8b,$91 ;row 0
- .byte $23,$d7,$c1,$24,$da,$d3,$c5,$01 ;row 1
- .byte $25,$d2,$c4,$26,$c3,$c6,$d4,$d8 ;row 2
- .byte $27,$d9,$c7,$28,$c2,$c8,$d5,$d6 ;row 3
- .byte $29,$c9,$ca,$30,$cd,$cb,$cf,$ce ;row 4
- .byte $db,$d0,$cc,$dd,$3e,$5b,$ba,$3c ;row 5
- .byte $dc,$c0,$5d,$93,$01,$3d,$de,$3f ;row 6
- .byte $21,$df,$04,$22,$20,$02,$d1,$83 ;row 7
- .byte $84,$38,$35,$02,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$07,$8d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$16,$17,$06,$0b,$00 ;row 10
-
- conKeymapCommodore = *
- .byte $08,$0d,$16,$8f,$80,$82,$84,$17 ;row 0
- .byte $96,$b7,$a1,$97,$ba,$b3,$a5,$01 ;row 1
- .byte $98,$b2,$a4,$99,$a3,$a6,$b4,$b8 ;row 2
- .byte $9a,$b9,$a7,$9b,$a2,$a8,$b5,$b6 ;row 3
- .byte $29,$a9,$aa,$30,$ad,$ab,$af,$ae ;row 4
- .byte $2b,$b0,$ac,$2d,$3e,$bb,$a0,$3c ;row 5
- .byte $bc,$7f,$bd,$93,$01,$bf,$be,$3f ;row 6
- .byte $81,$bf,$04,$95,$5f,$02,$b1,$03 ;row 7
- .byte $84,$38,$35,$18,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$07,$8d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$0c,$0f,$10,$15,$00 ;row 10
-
- conKeymapControl = *
- .byte $08,$00,$00,$8f,$80,$82,$84,$00 ;row 0
- .byte $1c,$f7,$e1,$9f,$fa,$f3,$e5,$00 ;row 1
- .byte $9c,$f2,$e4,$1e,$e3,$e6,$f4,$f8 ;row 2
- .byte $1f,$f9,$e7,$9e,$e2,$e8,$f5,$f6 ;row 3
- .byte $12,$e9,$ea,$92,$ed,$eb,$ef,$ee ;row 4
- .byte $2b,$f0,$ec,$2d,$00,$fb,$e0,$00 ;row 5
- .byte $fc,$60,$fd,$00,$00,$ff,$fe,$00 ;row 6
- .byte $90,$ff,$00,$05,$20,$00,$f1,$00 ;row 7
- .byte $84,$8c,$87,$18,$89,$8a,$88,$85 ;row 8
- .byte $1b,$84,$8f,$0a,$00,$8b,$80,$86 ;row 9
- .byte $08,$82,$2e,$16,$17,$19,$1a,$00 ;row 10
-
- conKeymapAlternate = *
- .byte $08,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- .byte $33,$77,$61,$34,$7a,$73,$65,$00 ;row 1
- .byte $35,$72,$64,$36,$63,$66,$74,$78 ;row 2
- .byte $37,$79,$67,$78,$62,$68,$75,$76 ;row 3
- .byte $39,$69,$6a,$30,$6d,$6b,$6f,$6e ;row 4
- .byte $2b,$70,$6c,$2d,$2e,$7b,$ba,$2c ;row 5
- .byte $a9,$60,$7d,$13,$00,$7f,$7e,$2f ;row 6
- .byte $31,$7f,$04,$32,$20,$02,$71,$03 ;row 7
- .byte $84,$38,$35,$09,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- conKeymapCaps = *
- .byte $14,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- .byte $33,$d7,$c1,$34,$da,$d3,$c5,$01 ;row 1
- .byte $35,$d2,$c4,$36,$c3,$c6,$d4,$d8 ;row 2
- .byte $37,$d9,$c7,$38,$c2,$c8,$d5,$d6 ;row 3
- .byte $39,$c9,$ca,$30,$cd,$cb,$cf,$ce ;row 4
- .byte $2b,$d0,$cc,$2d,$2e,$3a,$40,$2c ;row 5
- .byte $5c,$2a,$3b,$13,$01,$3d,$5e,$2f ;row 6
- .byte $31,$5f,$04,$32,$20,$02,$d1,$03 ;row 7
- .byte $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- .byte $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- conKeymapShiftComm = *
- .byte $00,$0d,$16,$00,$00,$00,$00,$17 ;row 0
- .byte $33,$0c,$10,$34,$0f,$15,$1b,$00 ;row 1
- .byte $35,$00,$0e,$36,$00,$00,$09,$00 ;row 2
- .byte $37,$18,$84,$38,$06,$04,$00,$00 ;row 3
- .byte $39,$16,$19,$30,$17,$1a,$00,$0b ;row 4
- .byte $2b,$07,$0a,$2d,$2e,$10,$00,$2c ;row 5
- .byte $00,$00,$15,$0c,$00,$00,$00,$04 ;row 6
- .byte $31,$1b,$00,$32,$00,$00,$00,$00 ;row 7
- .byte $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- .byte $00,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
- acekey-dvorak.s
- 211
- ;ACE-128/64 Dvorak keymatrix, by Craig Bruce - 07-June-1995
- ;
- ;this file is in ACE-assembler format.
-
- org $2000
-
- ;The mapping of keyscan matrix positions to keys is as follows (for the
- ;QWERTY layout):
- ;
- ; \ COLUMNS:
- ;ROWS:\
- ; \ 0 1 2 3 4 5 6 7
- ; +-------+-------+-------+-------+-------+-------+-------+-------+ code
- ; 0 | DELETE| RETURN| RIGHT | F7 | F1 | F3 | F5 | DOWN | (0)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 1 | 3 | W | A | 4 | Z | S | E |L-SHIFT| (8)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 2 | 5 | R | D | 6 | C | F | T | X | (16)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 3 | 7 | Y | G | 8 | B | H | U | V | (24)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 4 | 9 | I | J | 0 | M | K | O | N | (32)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 5 | + | P | L | - | . | : | @ | , | (40)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 6 | \ | * | ; | HOME |R-SHIFT| = | ^ | / | (48)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 7 | 1 | _ |CONTROL| 2 | SPACE |COMMODR| Q | STOP | (56)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 8 | HELP | 8 | 5 | TAB | 2 | 4 | 7 | 1 | (64)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 9 | ESC | + | - | LF | ENTER | 6 | 9 | 3 | (72)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
- ; 10 | ALT | 0 | . | UP | DOWN | LEFT | RIGHT |NO-SCRL| (80)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
-
- ;Note that the C128's keyboard has all eleven rows (0-10) whereas the C64's
- ;keyboard only has the first eight (0-7). The entires with $00 mean that
- ;pressing the associated key does nothing. There are multiple key matrices
- ;to produce the codes for use with various "shift" keys.
-
- ;The layout of the standard C128/64 QWERTY keyboard is as follows:
- ;
- ; +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
- ; | _ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + | - | \ |hom|del|
- ; +---------------------------------------------------------------+
- ; |ctrl | Q | W | E | R | T | Y | U | I | O | P | @ | * | ^ |restr|
- ; +---------------------------------------------------------------+
- ; |stp|shl| A | S | D | F | G | H | J | K | L | : | ; | = | return|
- ; +---------------------------------------------------------------+
- ; | C=|shift| Z | X | C | V | B | N | M | , | . | / |shift| v |-> |
- ; +---+-----+---+---+---+---+---+---+---+---+---+---+-----+---+---+
- ;
- ;This is translated into the following Dvorak layout in this keymatrix:
- ;
- ; +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
- ; | _ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + | - | \ |hom|del|
- ; +---------------------------------------------------------------+
- ; |ctrl | @ | , | . | P | Y | F | G | C | R | L | / | * | ^ |restr|
- ; +---------------------------------------------------------------+
- ; |stp|shl| A | O | E | U | I | D | H | T | N | S | ; | = | return|
- ; +---------------------------------------------------------------+
- ; | C=|shift| : | Q | J | K | X | B | M | W | V | Z |shift| v |-> |
- ; +---+-----+---+---+---+---+---+---+---+---+---+---+-----+---+---+
- ;
- ;A couple of keys are different from the standard Dvorak layout:
- ;
- ; the (2) key above should be (2) normally and (@) when shifted
- ; the (6) key above should be (6) normally and (^) when shifted
- ; the (8) key above should be (8) normally and (*) when shifted
- ; the (9) key above should be (9) normally and (() when shifted
- ; the (0) key above should be (0) normally and ()) when shifted
- ; the (+) key above should be ([) normally and ({) when shifted
- ; the (-) key above should be (=) normally and (+) when shifted
- ; the (@) key above should be (') normally and (") when shifted
- ; the (*) key above should be (]) normally and (}) when shifted
- ; the (;) key above should be (-) normally and (_) when shifted
- ; the (:) key above should be (;) normally and (:) when shifted
- ;
- ;In other words, the Dvorak layout should be:
- ;
- ; ! @ # $ % ^ & * ( ) { + Layout differs from the
- ; 1 2 3 4 5 6 7 8 9 0 [ = ANSI standard because
- ; " < > P Y F G C R L ? } the following substitution
- ; ' , . p y f g c r l / ] was made:
- ; A O E U I D H T N S _
- ; a o e u i d h t n s - [ => {
- ; : Q J K X B M W V Z ] => [
- ; ; q j k x b m w v z
- ;
- ;Here is the standard lawyershit that applies exclusively the keyboard
- ;diagram included immediately above:
- ;
- ; Copyright 1991 by The MITRE Corporation.
- ; Permission to use, copy, modify, and distribute this
- ; software and its documentation for any purpose and without
- ; fee is hereby granted, provided that the above copyright
- ; notice appear in all copies. The MITRE Corporation
- ; makes no representations about the suitability of this
- ; software for any purpose. It is provided "as is" without
- ; express or implied warranty.
- ;
- ;Anyhow, the key translation martix for the Dvorak keyboard becomes:
- ;
- ; \ COLUMNS:
- ;ROWS:\
- ; \ 0 1 2 3 4 5 6 7
- ; +-------+-------+-------+-------+-------+-------+-------+-------+ code
- ; 0 | DELETE| RETURN| RIGHT | F7 | F1 | F3 | F5 | DOWN | (0)
- ; 1 | 3 | , | A | 4 | : | O | . |L-SHIFT| (8)
- ; 2 | 5 | P | E | 6 | J | U | Y | Q | (16)
- ; 3 | 7 | F | I | 8 | X | D | G | K | (24)
- ; 4 | 9 | C | H | 0 | M | T | R | B | (32)
- ; 5 | + | L | N | - | V | S | / | W | (40)
- ; 6 | \ | * | ; | HOME |R-SHIFT| = | ^ | Z | (48)
- ; 7 | 1 | _ |CONTROL| 2 | SPACE |COMMODR| @ | STOP | (56)
- ; 8 | HELP | 8 | 5 | TAB | 2 | 4 | 7 | 1 | (64)
- ; 9 | ESC | + | - | LF | ENTER | 6 | 9 | 3 | (72)
- ; 10 | ALT | 0 | . | UP | DOWN | LEFT | RIGHT |NO-SCRL| (80)
- ; +-------+-------+-------+-------+-------+-------+-------+-------+
-
- keymapNormal = *
- db $14,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- db $33,$2c,$41,$34,$3a,$4f,$2e,$01 ;row 1
- db $35,$50,$45,$36,$4a,$55,$59,$51 ;row 2
- db $37,$46,$49,$38,$58,$44,$47,$4b ;row 3
- db $39,$43,$48,$30,$4d,$54,$52,$42 ;row 4
- db $2b,$4c,$4e,$2d,$56,$53,$2f,$57 ;row 5
- db $5c,$2a,$3b,$13,$01,$3d,$5e,$5a ;row 6
- db $31,$5f,$04,$32,$20,$02,$40,$03 ;row 7
- db $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- db $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- db $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- keymapShift = *
- db $94,$8d,$9d,$8c,$89,$8a,$8b,$91 ;row 0
- db $23,$3c,$c1,$24,$5b,$cf,$3e,$01 ;row 1
- db $25,$d0,$c5,$26,$ca,$d5,$d9,$d1 ;row 2
- db $27,$c6,$c9,$28,$d8,$c4,$c7,$cb ;row 3
- db $29,$c3,$c8,$30,$cd,$d4,$d2,$c2 ;row 4
- db $db,$cc,$ce,$dd,$d6,$d3,$3f,$d7 ;row 5
- db $dc,$c0,$5d,$93,$01,$3d,$de,$da ;row 6
- db $21,$df,$04,$22,$20,$02,$40,$83 ;row 7
- db $84,$38,$35,$02,$32,$34,$37,$31 ;row 8
- db $0e,$2b,$2d,$07,$8d,$36,$39,$33 ;row 9
- db $08,$30,$2e,$16,$17,$06,$0b,$00 ;row 10
-
- keymapCommodore = *
- db $08,$0d,$15,$8f,$80,$82,$8e,$0f ;row 0
- db $96,$3c,$a1,$97,$bb,$af,$3e,$01 ;row 1
- db $98,$b0,$a5,$99,$aa,$b5,$b9,$b1 ;row 2
- db $9a,$a6,$a9,$9b,$b8,$a4,$a7,$ab ;row 3
- db $29,$a3,$a8,$30,$ad,$b4,$b2,$a2 ;row 4
- db $2b,$ac,$ae,$2d,$b6,$b3,$3f,$b7 ;row 5
- db $bc,$2a,$bd,$93,$01,$3d,$be,$ba ;row 6
- db $81,$bf,$04,$95,$5f,$02,$a0,$83 ;row 7
- db $84,$38,$35,$18,$32,$34,$37,$31 ;row 8
- db $1b,$2b,$2d,$07,$8d,$36,$39,$33 ;row 9
- db $08,$30,$2e,$0c,$0f,$10,$15,$00 ;row 10
-
- keymapControl = *
- db $08,$01,$1a,$8f,$80,$82,$8e,$17 ;row 0
- db $1c,$2c,$e1,$9f,$fb,$ef,$2e,$01 ;row 1
- db $9c,$f0,$e5,$1e,$ea,$f5,$f9,$f1 ;row 2
- db $1f,$e6,$e9,$9e,$f8,$e4,$e7,$eb ;row 3
- db $12,$e3,$e8,$92,$ed,$f4,$f2,$e2 ;row 4
- db $2b,$ec,$ee,$2d,$f6,$f3,$2f,$f7 ;row 5
- db $fc,$2a,$fd,$13,$01,$3d,$fe,$fa ;row 6
- db $90,$ff,$04,$05,$20,$02,$e0,$03 ;row 7
- db $04,$8c,$87,$18,$89,$8a,$88,$85 ;row 8
- db $1b,$84,$8f,$0a,$00,$8b,$80,$86 ;row 9
- db $08,$82,$2e,$16,$17,$19,$1a,$00 ;row 10
-
- keymapAlternate = *
- db $14,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- db $33,$2c,$61,$34,$7b,$6f,$2e,$01 ;row 1
- db $35,$70,$65,$36,$6a,$75,$79,$71 ;row 2
- db $37,$66,$69,$38,$78,$64,$67,$6b ;row 3
- db $39,$63,$68,$30,$6d,$74,$72,$62 ;row 4
- db $2b,$6c,$6e,$2d,$76,$73,$2f,$77 ;row 5
- db $7c,$2a,$7d,$13,$01,$3d,$7e,$7a ;row 6
- db $31,$7f,$04,$32,$20,$02,$60,$03 ;row 7
- db $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- db $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- db $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- keymapCaps = *
- db $14,$0d,$1d,$88,$85,$86,$87,$11 ;row 0
- db $33,$2c,$c1,$34,$3a,$cf,$2e,$01 ;row 1
- db $35,$d0,$c5,$36,$ca,$d5,$d9,$d1 ;row 2
- db $37,$c6,$c9,$38,$d8,$c4,$c7,$cb ;row 3
- db $39,$c3,$c8,$30,$cd,$d4,$d2,$c2 ;row 4
- db $2b,$cc,$ce,$2d,$d6,$d3,$2f,$d7 ;row 5
- db $5c,$2a,$3b,$13,$01,$3d,$5e,$da ;row 6
- db $31,$5f,$04,$32,$20,$02,$40,$03 ;row 7
- db $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- db $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- db $08,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
-
- keymapShiftComm = *
- db $00,$00,$16,$00,$00,$00,$00,$17 ;row 0
- db $00,$00,$02,$00,$10,$00,$0b,$01 ;row 1
- db $00,$07,$1b,$00,$19,$00,$18,$00 ;row 2
- db $00,$00,$16,$00,$00,$0e,$00,$1a ;row 3
- db $00,$00,$04,$00,$17,$09,$02,$06 ;row 4
- db $17,$0a,$0b,$16,$00,$15,$00,$0c ;row 5
- db $00,$00,$15,$00,$01,$00,$00,$0f ;row 6
- db $00,$1b,$04,$00,$00,$00,$00,$00 ;row 7
- db $04,$38,$35,$09,$32,$34,$37,$31 ;row 8
- db $1b,$2b,$2d,$0a,$0d,$36,$39,$33 ;row 9
- db $00,$30,$2e,$91,$11,$9d,$1d,$00 ;row 10
- config.s
- 1680
- ;*** Configuration Program ***
-
- .seq acehead.s
- .seq kernhead.s
- .org aceAppAddress
- .obj "@0:config"
-
- jmp main
- .byte "c","F",aceID3
- .byte 64,0
-
- kernelSetlfs = $ffba
- kernelSetnam = $ffbd
- kernelOpen = $ffc0
- kernelClose = $ffc3
- kernelChkin = $ffc6
- kernelChkout = $ffc9
- kernelClrchn = $ffcc
- kernelChrin = $ffcf
- kernelLoad = $ffd5
- kernelSwapper = $ff5f
- st = $90
- totalBanks .buf 2
- chrQuote = 34
-
- configBuf = 2 ;(2)
- sysName = 4 ;(2)
- ram0FreeMap = 6 ;(2)
- aceEndPage = 8 ;(1)
- sysType = 9 ;(1)
- charset4bitP = 10 ;(2)
- keymapAddr = 12 ;(2)
- memRead = 16 ;(2)
- memWrite = 18 ;(2)
- banks = 20 ;(1)
- bankLimit = 21 ;(1)
- save0 = 22 ;(2)
- save2 = 24 ;(2)
- saveN = 26 ;(2)
- cpfrom = $60 ;(2)
- cpto = $62 ;(2)
- indirectReuBanks = $64 ;(1)
- loadCharsetNameP = $66 ;(2)
- work = $68 ;(8)
- titlePtr = $70 ;(2)
- keymapName = $72 ;(2)
-
- main = *
- lda #0
- sta aceTotalMemory+0
- sta aceTotalMemory+1
- sta totalBanks+0
- sta totalBanks+1
- sta aceReuRlSpeedTry
- lda #aceMemNull
- sta aceReuRlSpeedPage+3
- lda #<title
- ldy #>title
- sta titlePtr+0
- sty titlePtr+1
- jsr loadConfig
- bcs +
- jsr loadCharset
- bcs +
- jsr loadKeymap
- bcs +
- jsr screenInit
- jsr setDate
- jsr displayDate
- jsr getRamlinkParms
- jsr internalMemory
- jsr reuMemory
- jsr rlMemory
- lda totalBanks+0
- ldy totalBanks+1
- sta aceTotalMemory+2
- sty aceTotalMemory+3
- jsr totalMemory
- ldx #3
- - lda aceFreeMemory,x
- sta aceTotalMemory,x
- dex
- bpl -
- clc
- lda #<title
- ldy #>title
- sta 2
- sty 3
- sec
- lda titlePtr+0
- sbc #<title
- sta 4
- lda titlePtr+1
- sbc #>title
- sta 5
- clc
- + rts
-
- testMemoryType = * ;( .A=type, .X=bankLimit ) : .A=bankCount
- sta mp+3
- stx bankLimit
- lda #$00
- ldy #$80 ;** page to use for testing ram
- ldx #$00
- sta mp+0
- sty mp+1
- stx mp+2
- lda #0
- sta banks
-
- nextBank = *
- lda banks
- sta mp+2
- jsr saveBank
- lda #$ff-$cb
- sta memWrite
- lda mp+2
- sta memWrite+1
- ldx #memWrite
- ldy #2
- jsr aceMemZpstore
- lda #$ff-$cb
- ldx mp+2
- jsr testBank
- bcs bankFail
- lda #$cb
- sta memWrite
- ldx #memWrite
- ldy #2
- jsr aceMemZpstore
- lda #$cb
- ldx mp+2
- jsr testBank
- bcs bankFail
- lda #$cb
- ldx #0
- jsr testBank
- bcs bankFail
- lda mp+2
- cmp #2
- bcc +
- lda #$cb
- ldx #2
- jsr testBank
- bcs bankFail
- + jsr restoreBank
- inc banks
- lda banks
- cmp bankLimit
- bcc nextBank
-
- bankFail = *
- jsr restoreWrapBanks
- lda banks
- rts
-
- saveBank = * ;()
- ldx #saveN
- ldy #2
- lda mp+2
- cmp #0
- bne +
- ldx #save0
- + cmp #2
- bne +
- ldx #save2
- + jsr aceMemZpload
- rts
-
- restoreBank = * ;()
- lda mp+2
- cmp #0
- beq +
- cmp #2
- beq +
- ldx #saveN
- ldy #2
- jsr aceMemZpstore
- + rts
-
- restoreWrapBanks = * ;()
- lda banks
- cmp #3
- bcc +
- + lda #2
- sta mp+2
- ldx #save2
- ldy #2
- jsr aceMemZpstore
- lda banks
- cmp #1
- bcc +
- lda #0
- sta mp+2
- ldx #save0
- ldy #2
- jsr aceMemZpstore
- + rts
-
- rdVal = 10 ;(1)
- rdBank = 11 ;(1)
-
- testBank = * ;( .A=data, .X=bank ) : .CS=err
- sta rdVal
- lda mp+2
- sta rdBank
- stx mp+2
- lda #$ff
- sta memRead
- sta memRead+1
- ldx #memRead
- ldy #2
- jsr aceMemZpload
- lda memRead
- cmp rdVal
- bne +
- lda memRead+1
- cmp mp+2
- bne +
- lda rdBank
- sta mp+2
- clc
- rts
- + lda rdBank
- sta mp+2
- sec
- rts
-
- puts = *
- sta $40
- sty $41
- ldy #0
- - lda ($40),y
- beq +
- jsr chrout
- iny
- bne -
- inc $41
- bne -
- + rts
-
- loadConfig = *
- lda #0
- ldx 186
- ldy #0
- jsr kernelSetlfs
- lda 1023
- cmp #1
- beq +
- ora #$30
- sta loadConfigName+6
- lda #7
- jmp ++
- + lda #6
- + ldx #<loadConfigName
- ldy #>loadConfigName
- jsr kernelSetnam
- lda #0
- ldx configBuf+0
- ldy configBuf+1
- jsr kernelLoad
- bcs +
- clc
- rts
- + lda #<badConfig
- ldy #>badConfig
- jsr puts
- sec
- rts
-
- loadConfigName = *
- .asc ".acerc0"
- badConfig = *
- .asc "Error attempting to b-load "
- .byte chrQuote
- .asc ".acerc"
- .byte chrQuote
- .asc ", aborting."
- .byte chrCR,0
-
- loadCharset = *
- lda configBuf+0
- ldy configBuf+1
- iny
- clc
- adc #$e0
- bcc +
- iny
- + sta loadCharsetNameP+0
- sty loadCharsetNameP+1
- lda #0
- ldx 186
- ldy #0
- jsr kernelSetlfs
- ldy #$ff
- - iny
- lda (loadCharsetNameP),y
- bne -
- tya
- ldx loadCharsetNameP+0
- ldy loadCharsetNameP+1
- jsr kernelSetnam
- lda #0
- ldx #<charsetBuf
- ldy #>charsetBuf
- jsr kernelLoad
- bcc +
- lda #<badCharset
- ldy #>badCharset
- jsr puts
- lda loadCharsetNameP+0
- ldy loadCharsetNameP+1
- jsr puts
- lda #<badCharset2
- ldy #>badCharset2
- jsr puts
- sec
- + rts
-
- loadCharsetName = *
- .asc "acechr-commodore"
- .byte 0
- badCharset = *
- .asc "Error attempting to b-load "
- .byte chrQuote,0
- badCharset2 = *
- .byte chrQuote
- .asc ", aborting."
- .byte chrCR,0
-
- loadKeymap = *
- lda #0
- ldx 186
- ldy #0
- jsr kernelSetlfs
- lda configBuf+0
- ldy configBuf+1
- iny
- clc
- adc #$20
- bcc +
- iny
- + sta keymapName+0
- sty keymapName+1
- ldy #$ff
- - iny
- lda (keymapName),y
- bne -
- tya
- bne +
- rts
- + ldx keymapName+0
- ldy keymapName+1
- jsr kernelSetnam
- lda #0
- ldx keymapAddr+0
- ldy keymapAddr+1
- jsr kernelLoad
- bcs +
- clc
- rts
- + lda #<badKeymap
- ldy #>badKeymap
- jsr puts
- sec
- rts
-
- badKeymap = *
- .asc "Error attempting to b-load keymap file"
- .asc ", aborting."
- .byte chrCR,0
-
- screenInit = *
- lda #147
- jsr $ffd2
- lda sysName+0
- ldy sysName+1
- jsr puts
- rts
-
- displayDate = *
- lda #<dateBuf
- ldy #>dateBuf
- jsr aceTimeGetDate
- ;** year
- lda dateBuf+0
- ldx #11
- jsr putDigits
- lda dateBuf+1
- ldx #13
- jsr putDigits
- ;** month
- lda dateBuf+2
- cmp #$10
- bcc +
- sec
- sbc #$10-10
- + tax
- lda monthStr+0,x
- sta dateStr+7
- lda monthStr+13,x
- sta dateStr+8
- lda monthStr+26,x
- sta dateStr+9
- ;** day
- lda dateBuf+3
- ldx #4
- jsr putDigits
- ;** hour
- lda dateBuf+4
- ldx #"a"
- cmp #$00
- bne +
- lda #$12
- jmp putHour
- + cmp #$12
- bcc putHour
- ldx #"p"
- cmp #$12
- beq putHour
- sei
- sed
- sec
- sbc #$12
- cld
- cli
- putHour = *
- stx dateStr+26
- ldx #17
- jsr putDigits
- ;** minute
- lda dateBuf+5
- ldx #20
- jsr putDigits
- ;** second
- lda dateBuf+6
- ldx #23
- jsr putDigits
- ;** day of week
- lda dateBuf+7
- and #$07
- tax
- lda dowStr+0,x
- sta dateStr+0
- lda dowStr+8,x
- sta dateStr+1
- lda dowStr+16,x
- sta dateStr+2
- lda #<dateStr
- ldy #>dateStr
- jsr puts
- rts
-
- putDigits = * ;( .A=num, .X=offset )
- pha
- lsr
- lsr
- lsr
- lsr
- ora #$30
- sta dateStr,x
- pla
- and #$0f
- ora #$30
- sta dateStr+1,x
- rts
-
- dateStr = *
- ;0123456789012345678901234567
- .asc "Tue-05-May-1993 11:34:12 pm"
- .byte 13,13,0
- dateBuf .buf 16
- dowStr = *
- .asc "SMTWTFSX"
- .asc "uouehrax"
- .asc "nneduitx"
- monthStr = *
- .asc "XJFMAMJJASOND"
- .asc "xaeapauuuecoe"
- .asc "xnbrrynlgptvc"
-
- tryDate = 10
-
- setDate = *
- ldy #$82
- - sty tryDate
- lda (configBuf),y
- cmp #$ff
- beq dateQueryNext
- cmp #$fe
- bne +
- jmp dateTrySmartWatch
- + jsr cmdOpen
- bcs dateQueryNext
- lda #<queryDateStr
- ldy #>queryDateStr
- jsr cmdSend
- bcs queryError
- lda #<dateBuf
- ldy #>dateBuf
- ldx #9
- jsr cmdData
- bcs queryError
- jsr cmdClose
- jmp convertCmdDate
-
- queryError = *
- jsr cmdClose
- dateQueryNext = *
- inc tryDate
- ldy tryDate
- cpy #$86
- bcc -
- jmp setDefaultDate
-
- queryDateStr = *
- .asc "t-rb"
- .byte 13,0
-
- convertCmdDate = *
- lda dateBuf+4
- ldx dateBuf+7
- beq +
- sei
- sed
- clc
- adc #$12
- cld
- cli
- + cmp #$12
- bne +
- lda #$00
- + cmp #$24
- bne +
- lda #$12
- + sta dateBuf+4
- clc
- lda dateBuf+0
- adc #$50
- sta dateBuf+7
- ldx #$19
- lda dateBuf+1
- cmp #$70
- bcs +
- ldx #$20
- + stx dateBuf+0
- lda #<dateBuf
- ldy #>dateBuf
- jsr aceTimeSetDate
- rts
-
- setDefaultDate = *
- ldy #$90
- ldx #0
- - lda (configBuf),y
- sta dateBuf,x
- inx
- iny
- cpy #$9c
- bcc -
- lda dateBuf+7
- and #$f0
- sta dateBuf+7
- lda dateBuf+8
- and #$0f
- ora dateBuf+7
- sta dateBuf+7
- lda #<dateBuf
- ldy #>dateBuf
- jmp aceTimeSetDate
-
- cmdOpen = * ;( .A=device ) : .CS=err
- tax
- lda #6
- ldy #15
- jsr kernelSetlfs
- lda #0
- jsr kernelSetnam
- jsr kernelOpen
- rts
-
- cmdClose = * ;()
- clc
- lda #6
- jsr kernelClose
- rts
-
- cmdSend = * ;( (.AY)=cmdStrZ ) : .CS=err
- sta $40
- sty $41
- ldx #6
- jsr kernelChkout
- bcc +
- rts
- + ldy #0
- - lda ($40),y
- beq +
- jsr $ffd2
- iny
- bne -
- + jsr kernelClrchn
- clc
- rts
-
- cmdData = * ;( (.AY)=cmdBuf, .X=len ) : .CS=err
- sta $40
- sty $41
- stx $42
- ldx #6
- jsr kernelChkin
- bcc +
- rts
- + ldx #0
- jsr kernelChrin
- cmp #"0"
- bcc ++
- cmp #"9"+1
- bcs ++
- badData = *
- - jsr kernelChrin
- bcs +
- bit st
- bvs +
- cmp #13
- bne -
- + jsr kernelClrchn
- sec
- rts
- + ldy #0
- sta ($40),y
- iny
- - jsr kernelChrin
- sta ($40),y
- iny
- cpy $42
- bcc -
- cmp #13
- bne badData
- jsr kernelClrchn
- clc
- rts
-
- getRlParmReuBanks .buf 1
-
- getRamlinkParms = *
- ldy #$80
- lda (configBuf),y
- jsr cmdOpen
- bcs rlParmsError
-
- ;** ramlink ram access
- lda #<partRlCmd
- ldy #>partRlCmd
- jsr cmdSend
- bcs rlParmsError
- lda #<rlIdent
- ldy #>rlIdent
- jsr checkPartition
- bcs +
- sta aceRamlinkStart+0
- sty aceRamlinkStart+1
- stx aceRamlinkBanks
- jsr rlReuPhysSize ;returns .A=reu banks in ram-port
- sta aceReuRlSpeedTry
- cmp #0
- beq +
- sta getRlParmReuBanks
- sec
- lda aceRamlinkStart+1
- sbc getRlParmReuBanks
- sta aceRamlinkStart+1
- lda #$ff
- sta aceReuRlSpeedTry
-
- ;** indirect reu access
- + lda #<partRlreuCmd
- ldy #>partRlreuCmd
- jsr cmdSend
- bcs rlParmsError
- lda #<rlreuIdent
- ldy #>rlreuIdent
- jsr checkPartition
- bcs rlParmsError
- stx indirectReuBanks
-
- rlParmsError = *
- jsr cmdClose
- rts
-
- checkPartition = * ;( (.AY)=name ) : .CS=err, .AY=start, .X=banks
- sta $44
- sty $45
- lda #<partitionBuf
- ldy #>partitionBuf
- ldx #31
- jsr cmdData
- bcs checkErrExit
- lda partitionBuf+0
- cmp #7
- bne checkErrExit
- ldy #0
- - lda ($44),y
- beq +
- cmp partitionBuf+3,y
- bne checkErrExit
- iny
- bne -
- + lda partitionBuf+21
- ldy partitionBuf+20
- ldx partitionBuf+28
- clc
- rts
-
- checkErrExit = *
- sec
- rts
-
- partRlCmd = *
- .asc "g-p"
- .byte 31,0
- rlIdent = *
- .asc "rl-ram"
- .byte $a0,0
- partRlreuCmd = *
- .asc "g-p"
- .byte 30,0
- rlreuIdent = *
- .asc "indirect-reu"
- .byte $a0,0
- partitionBuf .buf 35
-
- putnum = * ;( [$44]=num, .A=width )
- pha
- lda #<outchar
- ldy #>outchar
- sta zp+0
- sty zp+1
- ldx #$44
- pla
- jsr aceMiscUtoa
- jsr putcomma
- ldx #0
- - lda outchar,x
- beq +
- jsr chrout
- inx
- bne -
- + rts
- outchar .buf 16
-
- putcomma = * ;( outchar )
- ldx #$ff
- - inx
- lda outchar,x
- bne -
- - dex
- dex
- dex
- dex
- cpx #$80
- bcc +
- rts
- + cpx #0
- bcs +
- rts
- + lda outchar,x
- cmp #" "
- bne +
- rts
- + stx $44
- ldy #0
- - lda outchar+1,y
- sta outchar,y
- iny
- cpy $44
- bcc -
- lda #"_"
- sta outchar,y
- jmp --
- rts
-
- displayAvail = * ;( (.AY)=name, (.X,$45)=banks )
- sta $40
- sty $41
- stx $44
- ldy #0
- - lda ($40),y
- jsr chrout
- iny
- cpy #6
- bcc -
- lda #":"
- jsr chrout
- txa
- clc
- adc totalBanks
- sta totalBanks
- lda $45
- adc totalBanks+1
- sta totalBanks+1
- lda #0
- sta $46
- sta $47
- ldx #6
- - asl $44
- rol $45
- rol $46
- rol $47
- dex
- bne -
- lda #7
- jsr putnum
- lda #"K"
- jsr chrout
- rts
-
- addToFree = * ;( [$44]=bytes )
- clc
- lda $44
- adc aceFreeMemory+0
- sta aceFreeMemory+0
- lda $45
- adc aceFreeMemory+1
- sta aceFreeMemory+1
- lda $46
- adc aceFreeMemory+2
- sta aceFreeMemory+2
- bcc +
- inc aceFreeMemory+3
- + rts
-
- displayFree = * ;( [$44]=bytes )
- lda #<freeMsg
- ldy #>freeMsg
- jsr puts
- lda #11
- jsr putnum
- lda #13
- jsr chrout
- rts
- freeMsg = *
- .asc " free:"
- .byte 0
-
- resetFree = *
- lda #0
- ldx #3
- - sta $44,x
- dex
- bpl -
- rts
-
- internalMemory = *
- lda #aceMemInternal
- ldx #255
- sei
- jsr testMemoryType
- cli
- sta aceInternalBanks
- pha
- jsr installInternVectors
- pla
- tax
- lda #0
- sta $45
- lda #<internalName
- ldy #>internalName
- jsr displayAvail
- jsr resetFree
-
- ;** ram0
- lda #aceMemInternal
- sta mp+3
- lda #0
- sta aceInternalCur
- lda ram0FreeMap+0
- ldy ram0FreeMap+1
- sta aceRam0Freemap+0
- sty aceRam0Freemap+1
- ldx #0
- sta mp+0
- sty mp+1
- stx mp+2
- ldy #$a3
- bit sysType
- bmi +
- ldy #$c1
- + lda (configBuf),y
- tay
- lda #1
- ldx #>aceAppAddress
- jsr initBanks
- jsr freeRam0AfterKernel
-
- ;** ram1
- bit sysType
- bpl expInternal64
- lda #$00
- sta mp+0
- ldy #$a0
- lda (configBuf),y
- sta mp+1
- sta aceRam1Freemap
- lda #1
- sta mp+2
- ldy #$a1
- lda (configBuf),y
- tay
- lda #2
- ldx mp+1
- inx
- jsr initBanks
-
- ;** ram2-7 c128
- expInternal128 = *
- lda #2
- sta mp+2
- lda #$00
- ldy #$04
- sta mp+0
- sty mp+1
- ldy #$a5
- lda (configBuf),y
- ldx aceInternalBanks
- jsr min
- sta aceInternalBanks
- ldx #$05
- ldy #$ff
- jsr initBanks
- jsr addToFree
- jsr displayFree
- rts
-
- ;** ram1-3 c64
- expInternal64 = *
- lda #1
- sta aceInternalBanks
- jsr addToFree
- jsr displayFree
- rts
-
- internalName = *
- .asc "intern"
-
- freeRam0AfterKernel = *
- ;** free end.kernel->st.app
- ldy aceEndPage
- cpy #>aceAppAddress
- bcs +
- lda #$00
- - sta (ram0FreeMap),y
- iny
- cpy #>aceAppAddress
- bcc -
- + sec
- lda #>aceAppAddress
- sbc aceEndPage
- sta $40
- clc
- lda $45
- adc $40
- sta $45
- bcc +
- inc $46
- bne +
- inc $47
- + rts
-
- installInternVectors = *
- bit sysType
- bpl installVectors64
- lda aceInternalBanks
- cmp #2
- bcs +
- rts
- + sei
- lda #2
- ldy #aceMemInternal
- sta mp+2
- sty mp+3
- - lda #$05
- ldy #$ff
- sta mp+0
- sty mp+1
- sta zp+0
- sty zp+1
- lda #<251
- ldy #>251
- jsr aceMemStash
- inc mp+2
- lda mp+2
- cmp aceInternalBanks
- bcc -
- cli
- rts
-
- installVectors64 = *
- ;xx copy to exp banks
- rts
-
- ram0HiMemPtr .buf 1
-
- reserveRam0HiMem = *
- lda #$ff
- sta ram0HiMemPtr
- jsr reserveVic80
- lda ram0HiMemPtr
- cmp #$ff
- beq +
- jsr reserveCharSet
- jsr reserveVic40
- jsr reserveModem
- jmp ++
- + jsr reserveDymem
- jsr reserveVic40
- jsr reserveCharSet
- jsr reserveModem
- + nop
- rts
-
- reserveVic80 = *
- lda #$00
- sta aceSoft80Allocated
- bit sysType
- bvs +
- - rts
- + ldy #$c0
- lda (configBuf),y
- bpl -
- lda #$fc
- ldy #$d8
- - sta (ram0FreeMap),y
- iny
- cpy #$ff
- bcc -
- sec
- lda aceFreeMemory+1
- sbc #$ff-$d8
- sta aceFreeMemory+1
- lda aceFreeMemory+2
- sbc #0
- sta aceFreeMemory+2
- lda aceFreeMemory+3
- sbc #0
- sta aceFreeMemory+3
- lda #$d8
- sta ram0HiMemPtr
- lda #$ff
- sta aceSoft80Allocated
- rts
-
- reserveCharSet = *
- sec
- lda ram0HiMemPtr
- sbc #>2048
- tax
- tay
- sta aceCharSetPage
- lda #$fc
- - sta (ram0FreeMap),y
- iny
- cpy ram0HiMemPtr
- bcc -
- stx ram0HiMemPtr
- sec
- lda aceFreeMemory+1
- sbc #>2048
- sta aceFreeMemory+1
- lda aceFreeMemory+2
- sbc #0
- sta aceFreeMemory+2
- lda aceFreeMemory+3
- sbc #0
- sta aceFreeMemory+3
- rts
-
- reserveVic40 = *
- sec
- lda ram0HiMemPtr
- sbc #>1024
- tax
- tay
- sta aceVic40Page
- lda #$fc
- - sta (ram0FreeMap),y
- iny
- cpy ram0HiMemPtr
- bcc -
- stx ram0HiMemPtr
- sec
- lda aceFreeMemory+1
- sbc #>1024
- sta aceFreeMemory+1
- lda aceFreeMemory+2
- sbc #0
- sta aceFreeMemory+2
- lda aceFreeMemory+3
- sbc #0
- sta aceFreeMemory+3
- rts
-
- reserveModem = *
- ;aceModemSendPage = aceStatB+105 ;(1)
- ;aceModemRecvPage = aceStatB+106 ;(1)
- ;aceModemRecvHigh = aceStatB+107 ;(1)
- ;aceModemType = aceStatB+108 ;(1) ;$ff=swifty,$40=user-port,$00=none
- ;aceModemIoPage = aceStatB+109 ;(1)
- ;aceModemConfig = aceStatB+113 ;(1)
- lda #$00
- sta aceModemType
- ldy #0
- - lda (configBuf),y
- cmp #6
- beq +
- tya
- clc
- adc #4
- tay
- cpy #$80
- bcc -
- rts
- + lda #$ff
- sta aceModemType
- iny
- lda (configBuf),y
- sta aceModemIoPage
- iny
- iny
- lda (configBuf),y
- sta aceModemConfig
- dec ram0HiMemPtr
- lda ram0HiMemPtr
- sta aceModemSendPage
- sta aceModemRecvHigh
- inc ram0HiMemPtr
- dey
- lda (configBuf),y
- sta modemPagesM1
- clc ;minus extra 1
- lda ram0HiMemPtr
- sbc (configBuf),y
- tax
- tay
- sta aceModemRecvPage
- lda #$fc
- - sta (ram0FreeMap),y
- iny
- cpy ram0HiMemPtr
- bcc -
- stx ram0HiMemPtr
- clc
- lda aceFreeMemory+1
- sbc modemPagesM1
- sta aceFreeMemory+1
- lda aceFreeMemory+2
- sbc #0
- sta aceFreeMemory+2
- lda aceFreeMemory+3
- sbc #0
- sta aceFreeMemory+3
- rts
-
- modemPagesM1 .buf 1
-
- reserveDymem = *
- sec
- lda ram0HiMemPtr
- sbc #>768
- sta ram0HiMemPtr
- rts
-
- reserveTPA = *
- ldy #$a8
- ldx #$c0
- bit sysType
- bmi +
- ldy #$c6
- ldx #$d0
- + lda (configBuf),y
- cmp ram0HiMemPtr
- bcc +
- lda ram0HiMemPtr
- + stx $40
- cmp $40
- bcc +
- lda $40
- + sta $40
- sta aceTpaLimit
- ldy #>aceAppAddress
- lda #$fe
- cpy $40
- bcs +
- - sta (ram0FreeMap),y
- iny
- cpy $40
- bcc -
- + sec
- lda $40
- sbc #>aceAppAddress
- sta $40
- sec
- lda aceFreeMemory+1
- sbc $40
- sta aceFreeMemory+1
- lda aceFreeMemory+2
- sbc #0
- sta aceFreeMemory+2
- lda aceFreeMemory+3
- sbc #0
- sta aceFreeMemory+3
- rts
-
- reuBleedSaveBuf .buf 16
-
- reuBleedSave = *
- bit sysType
- bpl +
- lda #$3f
- sta $ff00
- jmp ++
- + lda #$30
- sta $01
- + nop
- ldx #15
- - lda $df00,x
- sta reuBleedSaveBuf,x
- dex
- bpl -
- bit sysType
- bpl +
- lda #$0e
- sta $ff00
- jmp ++
- + lda #$36
- sta $01
- + nop
- rts
-
- reuBleedRestore = *
- bit sysType
- bpl +
- lda #$3f
- sta $ff00
- jmp ++
- + lda #$30
- sta $01
- + ldx #15
- - lda reuBleedSaveBuf,x
- sta $df00,x
- dex
- bpl -
- bit sysType
- bpl +
- lda #$0e
- sta $ff00
- jmp ++
- + lda #$36
- sta $01
- + nop
- rts
-
- reuMemory = *
- lda #$00
- sta aceRamlinkAccess
- jsr reuBleedSave
- lda #aceMemREU
- ldx #255
- jsr testMemoryType
- pha
- jsr reuBleedRestore
- lda #0
- sta $45
- pla
- sta aceReuBanks
- tax
- bne +
- lda indirectReuBanks
- beq +
- sta aceReuBanks
- tax
- lda #$ff
- sta aceRamlinkAccess
- lda #<rlreuName
- ldy #>rlreuName
- jmp ++
- + lda #<reuName
- ldy #>reuName
- + jsr displayAvail
- jsr resetFree
- lda #aceMemREU
- sta mp+3
- ldy #$a6
- bit sysType
- bmi +
- ldy #$c2
- + lda (configBuf),y
- sta aceReuStart
- sta aceReuCur
- ldy #$a7
- bit sysType
- bmi +
- ldy #$c3
- + lda (configBuf),y
- ldx aceReuBanks
- jsr min
- sta aceReuBanks
- lda #$00
- ldy #$ff
- ldx aceReuStart
- sta mp+0
- sty mp+1
- stx mp+2
- lda aceReuBanks
- ldx #$00
- ldy #$ff
- jsr initBanks
- jsr addToFree
- jsr displayFree
- rts
- reuName = *
- .asc "reu "
- rlreuName = *
- .asc "rl-reu"
-
- rlMemory = *
- ldx aceRamlinkBanks
- lda #0
- sta $45
- lda #<rlName
- ldy #>rlName
- jsr displayAvail
- jsr resetFree
- ldy #$81
- lda (configBuf),y
- ldx aceRamlinkBanks
- jsr min
- sta aceRamlinkBanks
- lda #aceMemRL
- sta mp+3
- lda #$00
- ldy #$ff
- ldx #0
- stx aceRamlinkCur
- sta mp+0
- sty mp+1
- stx mp+2
- lda aceRamlinkBanks
- ldx #$00
- ldy #$ff
- jsr initBanks
- jsr addToFree
- jsr displayFree
- rts
- rlName = *
- .asc "rl-ram"
-
- totalMemory = *
- ldx totalBanks
- lda totalBanks+1
- sta $45
- lda #<totalName
- ldy #>totalName
- jsr displayAvail
- ldx #3
- - lda aceFreeMemory,x
- sta $44,x
- dex
- bpl -
- jsr displayFree
- lda #13
- jsr chrout
- jsr reserveRam0HiMem
- jsr reserveTPA
- rts
- totalName = *
- .asc "total "
- rts
-
- endBank = 10 ;(1)
- startFree = 11 ;(1)
- endFree = 12 ;(1)
-
- initBanks = * ;( [mp]=firstFreemap, .A=endBank+1, .X=startFree, .Y=endFree+1 )
- sta endBank
- stx startFree
- sty endFree
- lda #<freemap
- ldy #>freemap
- sta zp+0
- sty zp+1
- ldx #0
- lda #$ff
- - sta freemap,x
- inx
- bne -
- ldx startFree
- cpx endFree
- bcs freeNextBank
- lda #$00
- - sta freemap,x
- inx
- cpx endFree
- bcc -
-
- freeNextBank = *
- lda mp+2
- cmp endBank
- bcs +
- lda #<256
- ldy #>256
- jsr aceMemStash
- inc mp+2
- sec
- lda endFree
- sbc startFree
- clc
- adc $45
- sta $45
- bcc freeNextBank
- inc $46
- bne freeNextBank
- inc $47
- jmp freeNextBank
- + rts
-
- min = * ;( .A=num1, .X=num2 ) : .A=min
- stx $40
- cmp $40
- bcc +
- lda $40
- + rts
-
- chroutSave .buf 1
-
- chrout = *
- jsr $ffd2
- sty chroutSave
- ldy #0
- sta (titlePtr),y
- inc titlePtr+0
- bne +
- inc titlePtr+1
- + ldy chroutSave
- clc
- rts
-
- rlReuPhysSize = * ;( ) : .A=reu banks in ram-port
- sei
- lda #$ff
- sta aceRamlinkAccess
- jsr reuBleedSave
- lda #aceMemREU
- ldx #255
- jsr testMemoryType
- pha
- jsr reuBleedRestore
- pla
- sta 1022
- ldx #$00
- stx aceRamlinkAccess
- cli
- rts
-
- ;=== smart-watch stuff ===
-
- ;*** adapted from:
- ;***
- ;*** swread v1.00: SmartWatch reader
- ;*** by Randy Weems - 20-Mar-1995
- ;***
- ;*** Read SmartWatch connected to joystick port 1
- ;*** and set system date/time.
-
- dateTrySmartWatch = *
- jsr swMain
- bcs +
- rts
- + jmp dateQueryNext
-
- swByte = work+0 ;(1) ;swap byte during read/write
- swPRASave = work+1 ;(1) ;save for port A
- swDDRASave = work+2 ;(1) ;save for port A DDR
-
- swCIA1PRA = $dc00 ;(1) ;CIA 1 port A
- swCIA1DDRA = $dc02 ;(1) ;CIA 1 Data Direction Register port A
-
- ;*** sw main routine ***
- swMain = *
- php
- sei
- ;** save CIA 1's registers
- lda swCIA1PRA
- sta swPRASave
- lda swCIA1DDRA
- sta swDDRASave
-
- ;** setup CIA 1 port A
- lda #%00001111
- sta swCIA1DDRA
- sta swCIA1PRA
-
- ;** start SmartWatch read sequence and get date/time
- jsr swInitRead
- ldx #7
- - jsr swReadByte
- sta vbDTBuffer,x
- dex
- bpl -
-
- ;** restore CIA1's ports
- lda swDDRASave
- sta swCIA1DDRA
- lda swPRASave
- sta swCIA1PRA
-
- ;** rearrange results from smartwatch to
- ;** to match setdate's format
-
- ;only need lower 6 bits of hour
- lda vbDTBuffer+4
- and #%00111111
- sta vbDTBuffer+4
-
- ;upper nibble is tenths of second, and
- ;lower nibble is day of week
- lda vbDTBuffer+7
- asl
- asl
- asl
- asl
- sta vbDTBuffer+7
- lda vbDTBuffer+3
- and #$0f
- ;smartwatch returns 0-6 for Sun-Sat, ACE uses same (now)
- ora vbDTBuffer+7
- sta vbDTBuffer+7
-
- ;shift year, month, and day up by one byte
- ldx #2
- - lda vbDTBuffer+0,x
- sta vbDTBuffer+1,x
- jsr swIsValidBCD
- bcs swBadRead
- dex
- bpl -
-
- ; ** determine century
- ;lda vbDTBuffer+1 ;not necessary, left over from above
- cmp #$80 ;if the year's < '80 assume it's 20xx
- lda #$19
- bcs +
- lda #$20
- + sta vbDTBuffer+0
-
- ;**display buffer in hex; for debugging only
- ; ldy #0
- ;- sty swByte
- ; lda vbDTBuffer,y
- ; jsr puthex
- ; lda #' '
- ; jsr chrout
- ; ldy swByte
- ; iny
- ; cpy #8
- ; bne -
- ; lda #chrCR
- ; jsr chrout
-
- lda #<vbDTBuffer
- ldy #>vbDTBuffer
- jsr aceTimeSetDate
-
- swExit = *
- plp
- clc
- rts
-
- swBadRead = *
- plp
- sec
- rts
-
- swInitRead = *
- lda #%00001111
- sta swCIA1DDRA
-
- lda #%00001110
- ldx #%00000010
- sta swCIA1PRA
- stx swCIA1PRA
- sta swCIA1PRA
-
- ldx #7
- - lda swReadSeq,x
- jsr swSendByte
- dex
- bpl -
- rts
-
- swReadSeq = *
- .byte $5c,$a3,$3a,$c5,$5c,$a3,$3a,$c5
-
- swSendByte = *
- sta swByte
- lda #%00001111
- sta swCIA1DDRA
-
- ldy #8
- lda #%00001100
- sta swCIA1PRA
- - lda swByte
- and #%00000001
- sta swCIA1PRA
- ora #%00001100
- sta swCIA1PRA
- lsr swByte
- dey
- bne -
- rts
-
- swReadByte = *
- lda #%00001110
- sta swCIA1DDRA
-
- ldy #8
- - lda #%00001110
- sta swCIA1PRA
- lda #%00000010
- sta swCIA1PRA
- lda swCIA1PRA
- lsr
- ror swByte
- dey
- bne -
- lda swByte
- rts
-
- ;*** end of sw program ***
-
- ;*** sw utility routines ***
-
- swIsValidBCD = *
- ; test upper and lower nibble of .A for valid BCD digits
- ; returns with carry flag clear for valid packed BCD, set otherwise
- pha
- and #%00001111
- cmp #$0a
- pla
- bcs +
- cmp #$a0
- + rts
-
- ;puthex = * ;( .A=value )
- ; pha
- ; lsr
- ; lsr
- ; lsr
- ; lsr
- ; tax
- ; lda puthexChars,x
- ; jsr chrout
- ; pla
- ; and #$0f
- ; tax
- ; lda puthexChars,x
- ; jsr chrout
- ; rts
- ; puthexChars = *
- ; .byte "0123456789abcdef"
-
- ;** uninitialzed data
- vbDTBuffer .buf 8 ;(8) ;buffer for date/time - vector of bytes
-
- ;=== bss ===
-
- bss = *
- freemap = bss+0
- title = freemap+256
- charsetBuf = title+512
- bssEnd = charsetBuf+4300
- sh.s
- 2112
- ;ACE command shell by Craig Bruce -- now an external program
-
- .seq "acehead.s"
- .org aceAppAddress
- .obj "@0:sh"
-
- jmp main
- .byte aceID1,aceID2,aceID3
- .byte 64,0 ;*stack,reserved
-
- libwork = $60
- chrQuote = 34
- true = $ff
- false = $00
-
- ;** these five fields need to be saved and
- ;** restored between exec calls, into mp
- shellRedirectStdin .buf 1
- shellRedirectStdout .buf 1
- shellRedirectStderr .buf 1
- inputFd .buf 1
- suppressPromptFlag .buf 1
-
- stackPtr = $60
- name = $62
- parseArgc .buf 2
- parseArgv .buf 2
- shellExitFlag .buf 1
- shellPromptFlag .buf 1
- checkPromptFlag .buf 1
- abortCommandFlag .buf 1
- regsave .buf 3
-
- ;******** shell ********
-
- main = *
- lda #stdin
- sta inputFd
- lda #1
- ldy #0
- jsr getarg
- bne +
- jmp shell
- ;** check for flags
- + ldy #0
- lda (zp),y
- cmp #"-"
- beq +
- lda #1
- ldy #0
- jmp mainCont
- ;** check for "-v" flag
- + ldy #0
- - iny
- lda (zp),y
- cmp #"v"
- bne +
- tya
- pha
- lda #<shellTitle
- ldy #>shellTitle
- jsr eputs
- lda #1
- ldy #0
- jsr getarg
- pla
- tay
- jmp -
- ;** check for "-i" flag
- + cmp #"i"
- bne +
- tya
- pha
- jsr ashrc
- lda #1
- ldy #0
- jsr getarg
- pla
- tay
- jmp -
- + lda #2
- ldy #0
- ;xx shift the arguments when you get that far
- ;** try to get filename to execute
- mainCont = *
- ldx #stdin
- stx inputFd
- jsr getarg
- bne +
- jmp shell
- + lda #"r"
- jsr open
- bcs +
- sta inputFd
- ;xx shift the arguments when you get that far
- ;** file will close when shell exits
- jmp shell
- ;** error opening shell script--abort
- + ldx #stderr
- jsr zpputs
- lda #<scriptOpenError
- ldy #>scriptOpenError
- jsr eputs
- lda #1
- ldx #0
- jmp aceProcExit
-
- shellTitle .byte "ACE Shell vers 0.92 - by CSB 17-Dec-95",chrCR,chrCR,0
- scriptOpenError .byte ": cannot open shell script for execution",chrCR,0
-
- ashrc = *
- ;xx get home-directory name
- lda #<cmdBuffer
- ldy #>cmdBuffer
- sta zp+0
- sty zp+1
- nop ;jsr gethomedir
- ldy #0 ;xx
- ;** append ".ashrc" filename
- ldx #0
- - lda ashrcName,x
- sta cmdBuffer,y
- beq +
- iny
- inx
- bne -
- ;** open file
- + lda #"r"
- jsr open
- bcs +
- sta inputFd
- ;** execute shell as same process
- jsr shell
- ;** close and return
- lda inputFd
- jmp close
- ;** handle error
- + ldx #stderr
- jsr zpputs
- lda #<scriptOpenError
- ldy #>scriptOpenError
- jmp eputs
-
- ashrcName .asc ".ashrc"
- .byte 0
- ashrcOpenError .asc ": cannot open "
- .byte chrQuote
- .asc ".ashrc"
- .byte chrQuote
- .asc "script for execution"
- .byte chrCR,0
-
- shell = *
- lda #$ff
- sta checkPromptFlag
- sta shellRedirectStdin
- sta shellRedirectStdout
- sta shellRedirectStderr
- lda #0
- sta suppressPromptFlag
-
- getCommand = *
- lda #0
- sta abortCommandFlag
- lda checkPromptFlag
- beq +
- jsr shellCheckPromptability
- + lda shellPromptFlag
- beq +
- lda suppressPromptFlag
- bne +
- lda #<argBuffer
- ldy #>argBuffer
- sta zp+0
- sty zp+1
- lda #0
- jsr aceDirName
- lda #"["
- ldx #stderr
- jsr putc
- lda #<argBuffer
- ldy #>argBuffer
- jsr eputs
- lda #<shellReady2
- ldy #>shellReady2
- jsr eputs
- + lda #0
- sta suppressPromptFlag
- sta shellExitFlag
- lda aceMemTop+0
- ldy aceMemTop+1
- sta stackPtr+0
- sty stackPtr+1
- jsr shellGetArgs
- bcs shellFinish
- lda parseArgc+0
- ora parseArgc+1
- beq +
- lda abortCommandFlag
- bne +
- jsr setupRedirects
- jsr shellConstructFrame
- jsr shellExecCommand
- lda #$ff
- sta checkPromptFlag
- jsr shellRemoveFrame
- jsr unsetRedirects
- + jsr closeRedirects
- bit shellExitFlag
- bmi shellFinish
- jmp getCommand
-
- shellFinish = *
- rts
-
- shellReady2 .asc "] "
- .byte 0
-
- shellCheckPromptability = *
- ldx inputFd
- jsr aceFileInfo
- ldx #$ff
- cmp #0
- beq +
- ldx #0
- + stx shellPromptFlag
- lda #0
- sta checkPromptFlag
- rts
-
- ;=== command parsing ===
-
- argPtr = $02
- argQuote = $03
- argWasQuoted = $04
-
- shellGetArgChar = *
- ldx inputFd
- jmp getc
-
- shellGetArgs = *
- lda #0
- sta parseArgc+0
- sta parseArgc+1
-
- newarg = *
- jsr shellGetArgChar
- bcc +
- jmp argEof
- + cmp #" "
- beq newarg
- cmp #chrTAB
- beq newarg
- cmp #chrCR
- bne +
- jmp argEndOfLine
- + cmp #";"
- bne +
- lda #$ff
- sta suppressPromptFlag
- jmp argEndOfLine
- + cmp #"#"
- bne ++
- - jsr shellGetArgChar
- bcc +
- jmp argEof
- + cmp #chrCR
- bne -
- jmp argEndOfLine
-
- + ldx #0
- stx argPtr
- stx argWasQuoted
- + cmp #"\"
- bne ++
- jsr shellGetArgChar
- bcc +
- jmp argEof
- + cmp #chrCR
- beq newarg
- jmp ++
-
- + nop
-
- argNewQuote = *
- ldx #0
- stx argQuote
- cmp #$22
- beq argStartQuote
- cmp #"'"
- bne +
- argStartQuote = *
- sta argQuote
- sta argWasQuoted
- jmp argNextChar
-
- + ldx argPtr
- sta argBuffer,x
- inc argPtr
-
- argNextChar = *
- jsr shellGetArgChar
- bcs argEof
- ldx argQuote
- bne argQuoteMode
- cmp #" "
- beq argProcess
- cmp #chrTAB
- beq argProcess
- - cmp #";"
- bne +
- ldx argWasQuoted
- bne +
- lda #$ff
- sta suppressPromptFlag
- lda #chrCR
- + cmp #chrCR
- beq argProcess
- ldx argPtr
- sta argBuffer,x
- inc argPtr
- jmp argNextChar
-
- argQuoteMode = *
- cmp #0
- beq -
- cmp argQuote
- bne -
- jsr shellGetArgChar
- bcs argEof
- cmp #" "
- beq argProcess
- cmp #chrTAB
- beq argProcess
- cmp #chrCR
- beq argProcess
- jmp argNewQuote
-
- argProcess = *
- pha
- ldx argPtr
- lda #0
- sta argBuffer,x
- jsr shellHandleArg
- pla
- cmp #chrCR
- beq argEndOfLine
- jmp newarg
- argEndOfLine = *
- clc
- argEof = *
- rts
-
- shellHandleArg = *
- lda abortCommandFlag
- beq +
- rts
- + lda argWasQuoted
- bne +
- ldx #stdin
- ldy #"r"
- lda argBuffer
- cmp #"<"
- beq shellHandleRedirect
- ldx #stdout
- ldy #"W"
- cmp #">"
- beq shellHandleRedirect
- jsr checkWildcards
- bcc +
- rts
- + jsr shellStoreArg
- rts
-
- shellStoreArg = *
- lda stackPtr+0
- ldy stackPtr+1
- clc
- sbc argPtr
- bcs +
- dey
- + sta stackPtr+0
- sty stackPtr+1
- sta zp+0
- sty zp+1
- ldy #0
- - lda argBuffer,y
- sta (zp),y
- beq +
- iny
- bne -
- + lda parseArgc+1
- sta zp+1
- lda parseArgc+0
- asl
- rol zp+1
- clc
- adc #<argArgvBuffer
- sta zp+0
- lda zp+1
- adc #>argArgvBuffer
- sta zp+1
- ldy #0
- lda stackPtr+0
- sta (zp),y
- iny
- lda stackPtr+1
- sta (zp),y
- inc parseArgc+0
- bne +
- inc parseArgc+1
- + rts
-
- shellHandleRedirect = * ;( .X=fd, .Y=mode )
- lda #<argBuffer+1
- sta zp+0
- lda #>argBuffer+1
- sta zp+1
- lda argBuffer+1
- cmp #">"
- bne +
- jsr shellRedirInc
- ldy #"A"
- lda argBuffer+2
- + cmp #"!"
- bne +
- - ldx #stderr
- jsr shellRedirInc
- lda #0
- + cmp #"&"
- beq -
- lda shellRedirectStdin,x
- cmp #255
- bne redirectMultiError
- tya
- stx cmdBuffer
- sta regsave
- jsr open
- bcs redirectError
- ldx cmdBuffer
- sta shellRedirectStdin,x
- rts
-
- redirectError = *
- lda #<redirectErrorMsg
- ldy #>redirectErrorMsg
- redirectErrorWmsg = *
- pha
- tya
- pha
- lda #$ff
- sta abortCommandFlag
- lda zp+0
- ldy zp+1
- jsr eputs
- pla
- tay
- pla
- jsr eputs
- rts
-
- redirectErrorMsg = *
- .asc ": Error opening redirection file."
- .byte chrCR,0
-
- redirectMultiError = *
- lda #<redirectMultiErrorMsg
- ldy #>redirectMultiErrorMsg
- jmp redirectErrorWmsg
-
- redirectMultiErrorMsg = *
- .asc ": Error - Multiple redirections of same stream."
- .byte chrCR,0
-
- shellRedirInc = *
- inc zp+0
- bne +
- inc zp+1
- + rts
-
- shellSetupRed = 2
-
- setupRedirects = *
- unsetRedirects = *
- ldx #0
- stx shellSetupRed
- - lda shellRedirectStdin,x
- cmp #255
- beq +
- tay
- jsr aceFileFdswap
- + inc shellSetupRed
- ldx shellSetupRed
- cpx #3
- bcc -
- rts
-
- shellCloseRed = 2
-
- closeRedirects = *
- ldx #0
- stx shellCloseRed
- - lda shellRedirectStdin,x
- cmp #$ff
- beq +
- jsr close
- ldx shellCloseRed
- lda #$ff
- sta shellRedirectStdin,x
- + inc shellCloseRed
- ldx shellCloseRed
- cpx #3
- bcc -
- rts
-
- wildPrefix = 10
- wildSuffix = 11
-
- checkWildcards = *
- lda #255
- sta wildPrefix
- sta wildSuffix
- ldx argPtr
- - dex
- cpx #255
- beq +
- lda argBuffer,x
- cmp #":"
- beq +
- cmp #"*"
- bne -
- ldy wildSuffix
- cpy #255
- bne -
- stx wildSuffix
- inc wildSuffix
- jmp -
- + inx
- stx wildPrefix
- lda wildSuffix
- cmp #255
- bne +
- clc
- rts
- + jsr handleWildcards
- sec
- rts
-
- wildLength = 12
- wildSuffixLength = 13
- wildFcb = 14
- wildMatch = 15
-
- handleWildcards = *
- lda #0
- sta wildMatch
- ldx argPtr
- inx
- - dex
- lda argBuffer,x
- sta cmdBuffer+1,x
- cpx wildPrefix
- bne -
- lda #0
- sta cmdBuffer,x
- sta argBuffer,x
- ldx wildSuffix
- sta cmdBuffer,x
- inc wildPrefix
- inc wildSuffix
- ldx #0
- - lda argBuffer,x
- beq +
- sta cmdBuffer,x
- inx
- bne -
- + sec
- lda argPtr
- sbc wildSuffix
- sta wildSuffixLength
- inc wildSuffixLength
- sec
- lda argPtr
- sbc wildPrefix
- sta wildLength
-
- lda #<cmdBuffer
- ldy #>cmdBuffer
- sta zp+0
- sty zp+1
- jsr aceDirOpen
- bcs noMatch
- sta wildFcb
- ldx wildFcb
- jsr aceDirRead
- bcs +
- beq +
- jsr scanWildcard
- + lda wildFcb
- jsr aceDirClose
- lda wildMatch
- bne +
- noMatch = *
- lda #$ff
- sta abortCommandFlag
- lda #<noMatchMsg
- ldy #>noMatchMsg
- jsr eputs
- + rts
-
- noMatchMsg = *
- .asc "No match for wildcard"
- .byte chrCR,0
-
- scanWildcard = *
- ldx wildFcb
- jsr aceDirRead
- bcs +
- bne ++
- + rts
- + lda aceDirentName
- bne +
- rts
- + lda aceDirentUsage
- and #%00010000
- bne scanWildcard
- lda aceDirentNameLen
- cmp wildLength
- bcc scanWildcard
- ldx wildPrefix
- ldy #0
- jsr substrCmp
- bcs scanWildcard
- ldx wildSuffix
- sec
- lda aceDirentNameLen
- sbc wildSuffixLength
- tay
- jsr substrCmp
- bcs scanWildcard
-
- ldx #0
- - lda cmdBuffer,x
- beq +
- sta argBuffer,x
- inx
- bne -
- + ldy #0
- - lda aceDirentName,y
- sta argBuffer,x
- beq +
- inx
- iny
- bne -
- + lda aceDirentType
- cmp #"s"
- beq +
- sta argBuffer+1,x
- lda #","
- sta argBuffer,x
- inx
- inx
- lda #0
- sta argBuffer,x
- + stx argPtr
- jsr shellStoreArg
- lda #$ff
- sta wildMatch
- jmp scanWildcard
-
- substrCmp = * ;( .X=cmdbufOff, .Y=direntNameOff ) : .CC=match
- - lda cmdBuffer,x
- bne +
- clc
- rts
- + cmp aceDirentName,y
- bne +
- iny
- inx
- bne -
- + sec
- rts
-
- ;=== stack management ===
-
- frameArgvSource = $02
- frameArgvDest = $04
- frameArgvBytes = $06
-
- shellConstructFrame = *
- ;** push the ZERO trailer argv
- sec
- lda stackPtr+0
- sbc #2
- sta stackPtr+0
- bcs +
- dec stackPtr+1
- + ldy #0
- lda #0
- sta (stackPtr),y
- iny
- sta (stackPtr),y
-
- ;** push argv[] array here
- lda parseArgc+0
- ldy parseArgc+1
- sty frameArgvBytes+1
- asl
- sta frameArgvBytes+0
- rol frameArgvBytes+1
- sec
- lda stackPtr+0
- sbc frameArgvBytes+0
- sta stackPtr+0
- sta frameArgvDest+0
- lda stackPtr+1
- sbc frameArgvBytes+1
- sta stackPtr+1
- sta frameArgvDest+1
- lda #<argArgvBuffer
- ldy #>argArgvBuffer
- sta frameArgvSource+0
- sty frameArgvSource+1
- - lda frameArgvBytes+0
- ora frameArgvBytes+1
- beq frameSetArgvPtr
- ldy #0
- lda (frameArgvSource),y
- sta (frameArgvDest),y
- inc frameArgvSource+0
- bne +
- inc frameArgvSource+1
- + inc frameArgvDest+0
- bne +
- inc frameArgvDest+1
- + lda frameArgvBytes+0
- bne +
- dec frameArgvBytes+1
- + dec frameArgvBytes+0
- jmp -
-
- ;** set argv pointer
- frameSetArgvPtr = *
- lda stackPtr+0
- ldy stackPtr+1
- sta parseArgv+0
- sty parseArgv+1
- ;** put un-redirection info into [mp]
- lda shellRedirectStdin
- ldx shellRedirectStdout
- ldy shellRedirectStderr
- sta mp+0
- stx mp+1
- sty mp+2
- lda inputFd
- sta mp+3
- rts
-
- shellRemoveFrame = *
- ;** recover un-redirection info from [mp]
- lda mp+0
- ldx mp+1
- ldy mp+2
- sta shellRedirectStdin
- stx shellRedirectStdout
- sty shellRedirectStderr
- lda mp+3
- sta inputFd
- rts
-
- ;=== dispatch ===
-
- dispArgv = $02
- dispArgPtr = $04
- dispVector = $02
-
- shellExecCommand = *
- ;** fetch the command name
- lda parseArgv+0
- ldy parseArgv+1
- sta dispArgv+0
- sty dispArgv+1
- ldy #1
- - lda (dispArgv),y
- sta dispArgPtr,y
- sta name,y
- dey
- bpl -
- ldy #0
- - lda (dispArgPtr),y
- sta argBuffer,y
- beq +
- iny
- bne -
-
- ;** search internal dispatch table for name
- + ldy #0
- dispCmpCommand = *
- lda dispTable,y
- beq shellLoadExternal
- ldx #0
- - lda argBuffer,x
- cmp dispTable,y
- bne +
- cmp #0
- beq dispMatch
- inx
- iny
- bne -
- brk
- + dey
- - iny
- lda dispTable,y
- bne -
- iny
- iny
- iny
- jmp dispCmpCommand
-
- dispMatch = *
- lda suppressPromptFlag
- pha
- lda dispTable+1,y
- pha
- lda dispTable+2,y
- tay
- pla
- jsr dispSetup
- jsr aceProcExecSub
- pla
- sta suppressPromptFlag
- rts
-
- dispSetup = * ;( (.AY)=zp contents ) : zp, zw, .AY=argc
- sta zp+0
- sty zp+1
- lda parseArgv+0
- ldy parseArgv+1
- sta zw+0
- sty zw+1
- lda parseArgc+0
- ldy parseArgc+1
- rts
-
- ;** load external file into transient program area
- loadPath = 2
- loadPathPos = 4
- loadGiveUp = 7
-
- shellLoadExternal = *
- lda suppressPromptFlag
- pha
- lda name+0
- ldy name+1
- jsr dispSetup
- jsr aceProcExec
- bcs +
- pla
- sta suppressPromptFlag
- rts
- + pla
- sta suppressPromptFlag
- lda errno
- pha
- lda name+0
- ldy name+1
- jsr eputs
- pla
- cmp #aceErrFileNotFound
- beq dispCmdNotFound
- cmp #aceErrBadProgFormat
- beq dispBadProg
- lda #<dispLoadErrorMsg1
- ldy #>dispLoadErrorMsg1
- jmp eputs
-
- dispBadProg = *
- lda #<dispBadProgMsg
- ldy #>dispBadProgMsg
- jmp eputs
-
- dispCmdNotFound = *
- lda #<dispLoadErrorMsg2
- ldy #>dispLoadErrorMsg2
- jmp eputs
- dispLoadErrorMsg1 = *
- .asc ": External-program load error"
- .byte chrCR,0
- dispLoadErrorMsg2 = *
- .asc ": Command not found"
- .byte chrCR,0
- dispBadProgMsg = *
- .asc ": Bad external-program format"
- .byte chrCR,0
-
- ;===internal command name and dispatch table===
-
- dispTable = *
- .asc "echo"
- .byte 0
- .word echo
- ;xx .asc "sh"
- ;xx .byte 0
- ;xx .word shellCmd ;this must be an external call for the time being
- .asc "cd"
- .byte 0
- .word cd
- .asc "cat"
- .byte 0
- .word cat
- .asc "cls"
- .byte 0
- .word cls
- .asc "clear"
- .byte 0
- .word cls
- .asc "exit"
- .byte 0
- .word shellExit
- .asc "x"
- .byte 0
- .word shellExit
- .asc "@"
- .byte 0
- .word dos
- .asc "dos"
- .byte 0
- .word dos
- .asc "path"
- .byte 0
- .word path
- .asc "ls"
- .byte 0
- .word dirMain
- .asc "clsl"
- .byte 0
- .word dirCmdClsl
- .asc "dir"
- .byte 0
- .word dirCmdDir
- .asc "d"
- .byte 0
- .word dirCmdD
-
- .byte 0
-
- ;===echo===
-
- echoArgv = $02
- echoSpace = $04
- echoTemp = $06
-
- echo = *
- lda #0
- sta echoSpace
- lda aceArgv+0
- ldy aceArgv+1
-
- echoNewArg = *
- clc
- adc #2
- bcc +
- iny
- + sta echoArgv+0
- sty echoArgv+1
- ldy #0
- lda (echoArgv),y
- sta echoTemp+0
- iny
- lda (echoArgv),y
- sta echoTemp+1
- ora echoTemp+0
- beq echoExit
- lda #" "
- cmp echoSpace
- bne +
- jsr putchar
- + lda #" "
- sta echoSpace
- lda echoTemp+0
- ldy echoTemp+1
- jsr puts
- lda echoArgv+0
- ldy echoArgv+1
- jmp echoNewArg
-
- echoExit = *
- lda #chrCR
- jsr putchar
- rts
-
- ;===copy parameters===
-
- copyBufferPtr = $02
- copyBufferLength = $04
-
- getBufferParms = *
- lda #<copyBuffer
- ldy #>copyBuffer
- sta copyBufferPtr+0
- sty copyBufferPtr+1
- sec
- lda aceMemTop+0
- sbc copyBufferPtr+0
- sta copyBufferLength+0
- lda aceMemTop+1
- sbc copyBufferPtr+1
- sta copyBufferLength+1
- rts
-
- ;===cd===
-
- cdScanSave .buf 1
-
- cd = *
- lda aceArgc+0
- cmp #2
- lda aceArgc+1
- sbc #0
- bcs +
- lda #$80
- jsr aceDirChange
- rts
- + lda #1
- ldy #0
- jsr getarg
-
- cdSetDevice = *
- ldx #2
- ldy #0
- lda (zp),y
- sta argBuffer+0
- iny
- lda (zp),y
- sta argBuffer+1
- iny
- cmp #":"
- bne +
- lda argBuffer+0
- cmp #$40
- bcc +
- cmp #$60
- bcc cdCheckPath
- + ldx #0
- ldy #0
-
- cdCheckPath = *
- sty cdScanSave
- - lda (zp),y
- cmp #"0"
- bcc +
- cmp #"9"+1
- bcs +
- iny
- bne -
- + sta argBuffer,x
- cmp #0
- bne +
- cpy cdScanSave
- beq cdOkay
- + ldy cdScanSave
- cmp #"/"
- beq cdPathOkay
- cmp #":"
- beq cdPathOkay
- + lda #"/"
- sta argBuffer,x
- inx
-
- cdPathOkay = *
- - lda (zp),y
- sta argBuffer,x
- beq cdCheckEnd
- inx
- iny
- bne -
-
- cdCheckEnd = *
- dex
- lda argBuffer,x
- cmp #":"
- beq +
- inx
- lda #":"
- sta argBuffer,x
- lda #0
- sta argBuffer+1,x
- + dex
- lda argBuffer,x
- cmp #"/"
- beq cdOkay
- lda #"/"
- sta argBuffer+1,x
- lda #":"
- sta argBuffer+2,x
- lda #0
- sta argBuffer+3,x
-
- cdOkay = *
- lda #<argBuffer
- ldy #>argBuffer
- sta zp+0
- sty zp+1
- lda #$00
- jsr aceDirChange
- bcs +
- rts
- + lda #<cdErrMsg
- ldy #>cdErrMsg
- jmp eputs
-
- cdErrMsg = *
- .asc "Error changing directory"
- .byte chrCR,0
-
- ;===cat===
-
- catBufferPtr = $02
- catBufferLength = $04
- catArg = $06
- catFcb = $08
- catAbort = 10
-
- cat = *
- lda #0
- sta catAbort
- jsr getBufferParms
- ldx #stdout
- jsr aceFileInfo
- cmp #0
- bne +
- lda catBufferLength+1
- beq +
- lda #<254
- ldy #>254
- sta catBufferLength+0
- sty catBufferLength+1
- + lda #1
- ldy #0
- sta catArg+0
- sty catArg+1
- lda aceArgc+0
- cmp #2
- lda aceArgc+1
- sbc #0
- bcs catFiles
- lda #0
- sta catFcb
- jmp catFile
-
- catFiles = *
- lda catArg+0
- ldy catArg+1
- jsr getarg
- lda #"r"
- jsr open
- bcc +
- lda zp+0
- ldy zp+1
- jsr eputs
- lda #<catErrMsg
- ldy #>catErrMsg
- jsr eputs
- jmp ++
- + sta catFcb
- jsr catFile
- lda catFcb
- jsr close
- + inc catArg
- bne +
- inc catArg+1
- + lda catAbort
- bne +
- lda catArg
- cmp aceArgc
- lda catArg+1
- sbc aceArgc+1
- bcc catFiles
- + rts
-
- catErrMsg = *
- .asc ": cannot open"
- .byte chrCR,0
-
- catFile = *
- lda catBufferPtr
- ldy catBufferPtr+1
- sta zp
- sty zp+1
- - lda catBufferLength
- ldy catBufferLength+1
- ldx catFcb
- jsr read
- beq +
- bcs +
- ldx #1
- jsr write
- bcs +
- jsr aceConStopkey
- bcs printStoppedMsg
- jmp -
- + rts
-
- printStoppedMsg = *
- lda #$ff
- sta catAbort
- lda #<stoppedMsg
- ldy #>stoppedMsg
- jmp eputs
- stoppedMsg = *
- .asc "<Stopped>"
- .byte chrCR,0
-
- ;===exit===
-
- shellExit = *
- lda #$ff
- sta shellExitFlag
- rts
-
- ;===dos===
-
- dosFcb = $02
-
- dos = *
- ;** open command channel
- lda #<dosCurDevice
- ldy #>dosCurDevice
- sta zp
- sty zp+1
- jsr aceMiscCmdOpen
- bcc +
- rts
- + sta dosFcb
-
- ;** send command
- lda #1
- ldy #0
- jsr getarg
- lda zp
- ora zp+1
- beq dosStatusOnly
- lda zp
- ldy zp+1
- ldx dosFcb
- jsr aceMiscCmdSend
- bcs +
-
- ;** read status
- dosStatusOnly = *
- lda #<cmdBuffer
- ldy #>cmdBuffer
- ldx dosFcb
- jsr aceMiscCmdStatus
- bcs +
- lda #<cmdBuffer
- ldy #>cmdBuffer
- jsr puts
- lda #chrCR
- jsr putchar
-
- ;** close command channel
- + lda dosFcb
- jmp aceMiscCmdClose
-
- dosCurDevice .asc ".:"
- .byte 0
-
- ;===shell===
-
- shellCmd = *
- jsr main
- lda #0
- sta shellExitFlag
- lda #255
- sta checkPromptFlag
- rts
-
- ;===path===
-
- pathPos = 4
- pathArg = 6
- pathSourcePos = 7
-
- path = *
- lda #0
- sta pathPos
- lda aceArgc+1
- beq +
- rts
- + lda aceArgc
- cmp #2
- bcs pathSet
- lda #<pathMsg
- ldy #>pathMsg
- jsr puts
- lda #$00
- sta argBuffer+0
- sta argBuffer+1
- lda #<argBuffer
- ldy #>argBuffer
- sta zp+0
- sty zp+1
- lda #2
- jsr aceDirName
-
- displayPath = *
- ldy pathPos
- lda argBuffer,y
- bne +
- lda #chrCR
- jsr putchar
- rts
- + lda #chrQuote
- sta cmdBuffer
- ldx #1
- - lda argBuffer,y
- sta cmdBuffer,x
- beq +
- iny
- inx
- bne -
- + iny
- sty pathPos
- lda #chrQuote
- sta cmdBuffer,x
- inx
- lda #" "
- sta cmdBuffer,x
- inx
- lda #<cmdBuffer
- ldy #>cmdBuffer
- sta zp
- sty zp+1
- txa
- ldy #0
- ldx #1
- jsr write
- jmp displayPath
-
- pathMsg = *
- .asc "path "
- .byte 0
-
- pathSet = *
- ldy #0
- sty pathPos
- lda #1
- sta pathArg
-
- pathNextArg = *
- lda pathArg
- ldy #0
- jsr getarg
- lda zp
- ora zp+1
- bne +
- lda #0
- ldy pathPos
- sta argBuffer,y
- iny
- lda #<argBuffer
- ldx #>argBuffer
- sta zp+0
- stx zp+1
- lda #$82
- jsr aceDirName
- rts
- + ldy #0
- ldx pathPos
- - lda (zp),y
- sta argBuffer,x
- beq +
- inx
- iny
- bne -
- + inx
- stx pathPos
- inc pathArg
- jmp pathNextArg
-
- ;===dir===
-
- ;*** ls 1.10: directory-lister program - by Craig Bruce
-
- ; This file is in the BUDDY-assembler format
-
- ; ls [-lcf] [[directory_name] [filename] ...]
- ;
- ; -l : long-form directory listing
- ; -c : clear screen
- ; -f : give number of files, bytes used, and bytes free at end of listing
- ; -help : give usage information
-
- ;*** global declarations
-
- dirArg = 2
- dirName = 4
- dirString = 8
- dirFcb = 16
- dirColumns = 17
- dirCurCol = 18
- dirLong = 19
- dirSpaces = 20
- dirlineLen = 21
- dirChCols = 22
- dirPaged = 23
- dirShown = 24
- dirCls = 25
- dirFiles = 32
- dirBytes = 36
- dirFree = 40
- dirFileSum = 44
- dirCheckFi = 45
- dirWork = 64
-
- dirCmdDir = *
- lda #true
- sta dirCls
- sta dirLong
- lda #false
- sta dirFileSum
- jmp dirMainEntry
-
- dirCmdD = *
- lda #false
- sta dirCls
- lda #true
- sta dirLong
- sta dirFileSum
- jmp dirMainEntry
-
- dirCmdClsl = *
- lda #true
- sta dirCls
- lda #false
- sta dirLong
- sta dirFileSum
- jmp dirMainEntry
-
- dirMain = *
- lda #false
- sta dirLong
- sta dirCls
- sta dirFileSum
- dirMainEntry = *
- lda #false
- sta dirPaged
- sta dirShown
- lda #true
- sta dirCheckFi
-
- lda #0
- ldy #0
- sta dirArg+0
- sty dirArg+1
-
- dirNextArg = *
- jsr aceConStopkey
- bcc +
- jmp dirStopped
- + inc dirArg+0
- bne +
- inc dirArg+1
- + lda dirArg+0
- ldy dirArg+1
- jsr getarg
- lda zp+0
- ora zp+1
- beq dirMainExit
- ldy #0
- lda (zp),y
- cmp #"-"
- bne dirNameArg
- jsr dirHandleOption
- jmp dirNextArg
-
- dirNameArg = *
- lda zp+0
- ldy zp+1
- sta dirName+0
- sty dirName+1
- jsr dir
- lda #true
- sta dirShown
- jmp dirNextArg
-
- dirMainExit = *
- lda dirShown
- bne +
- lda #false
- sta dirCheckFi
- lda #<dirDefaultDir
- ldy #>dirDefaultDir
- sta dirName+0
- sty dirName+1
- jsr dir
- + rts
-
- dirDefaultDir = *
- .byte ".",":",0
-
- dirHandleOption = *
- ldy #0
- sty dirWork+2
- lda zp+0
- ldy zp+1
- sta dirWork+0
- sty dirWork+1
-
- dirNextOption = *
- inc dirWork+2
- ldy dirWork+2
- lda (dirWork),y
- bne +
- rts
- + cmp #"f"
- bne +
- lda #true
- sta dirFileSum
- jmp dirNextOption
- + cmp #"l"
- bne +
- lda #true
- sta dirLong
- jmp dirNextOption
- + cmp #"c"
- bne +
- lda #true
- sta dirCls
- jmp dirNextOption
- + lda #<dirUsageMsg
- ldy #>dirUsageMsg
- jsr eputs
- lda #0
- ldx #0
- jmp aceProcExit
-
- dirUsageMsg = *
- .asc "ls [-lcf] [[directory_name] [filename] ...]"
- .byte chrCR,chrCR
- .asc " -l : long-form directory listing"
- .byte chrCR
- .asc " -c : clear screen before listing"
- .byte chrCR
- .asc " -f : give number of files, bytes used, and bytes free at "
- .asc "end of listing"
- .byte chrCR
- .asc " -help : give this help information"
- .byte chrCR,0
-
- dirStopped = *
- lda #<dirStoppedMsg
- ldy #>dirStoppedMsg
- jsr eputs
- lda #1
- ldx #0
- jmp aceProcExit
- dirStoppedMsg = *
- .asc "<Stopped>"
- .byte chrCR,0
-
- dirError = *
- lda #<dirErrorMsg1
- ldy #>dirErrorMsg1
- jsr eputs
- lda dirName+0
- ldy dirName+1
- jsr eputs
- lda #<dirErrorMsg2
- ldy #>dirErrorMsg2
- jmp eputs
-
- dirErrorMsg1 = *
- .asc "Error reading file/directory "
- .byte chrQuote,0
- dirErrorMsg2 = *
- .byte chrQuote,chrCR,0
-
- dir = *
- bit dirCheckFi
- bpl +
- lda #<dirName
- ldy #>dirName
- jsr aceDirIsdir
- cpy #0
- bne +
- jmp dirFile
- + lda dirCls
- beq +
- lda #chrCLS
- jsr putchar
- + lda dirLong
- bne dirLsLong
-
- dirLsShort = *
- ldx #1
- jsr aceFileInfo
- stx dirChCols
- cmp #0
- bne +
- txa
- ldx #$ff
- - inx
- sbc #20
- bcs -
- txa
- bne ++
- + lda #1
- + sta dirColumns
- jmp dirCommon
-
- dirLsLong = *
- ldx #1
- jsr aceFileInfo
- stx dirChCols
- lda #1
- sta dirColumns
-
- dirCommon = *
- lda #0
- sta dirCurCol
- ldx #3
- - sta dirBytes,x
- sta dirFiles,x
- dex
- bpl -
-
- dirGotName = *
- lda dirName+0
- ldy dirName+1
- sta zp+0
- sty zp+1
- jsr aceDirOpen
- bcc +
- jmp dirError
- + sta dirFcb
- ldx dirFcb
- jsr aceDirRead
- bcs dirExit
- beq dirExit
- jsr aceConStopkey
- bcc +
- jmp dirStopped
- + lda dirLong
- bpl dirNext
- jsr dirDisplayHeading
-
- dirNext = *
- ldx dirFcb
- jsr aceDirRead
- bcs dirExit
- beq dirExit
- jsr aceConStopkey
- bcc +
- jsr dirExit
- jmp dirStopped
- + lda aceDirentName+0
- beq dirTrailerExit
- lda aceDirentUsage
- and #%00010000
- bne dirNext
- jsr dirDisplay
- jmp dirNext
-
- dirTrailerExit = *
- lda dirLong
- bpl dirExit
- jsr dirDisplayTrailer
- jmp dirExit
-
- dirExit = *
- lda dirCurCol
- beq +
- lda #chrCR
- jsr putchar
- + lda dirFcb
- jmp aceDirClose
-
- dirDisplay = *
- bit aceDirentFlags
- bmi ++
- inc dirFiles+0
- bne +
- inc dirFiles+1
- bne +
- inc dirFiles+2
- bne +
- inc dirFiles+3
- + ldx #0
- ldy #4
- clc
- - lda dirBytes,x
- adc aceDirentBytes,x
- sta dirBytes,x
- inx
- dey
- bne -
- + bit dirLong
- bmi +
- jmp dirDisplayShort
- + jsr dirSetupDirline
- lda #<dirline
- ldy #>dirline
- sta zp+0
- sty zp+1
- lda dirlineLen
- ldy #0
- ldx #stdout
- jmp write
-
- ;* 000000000011111111112222222222333333333344444444445555555555
- ;* pos: 012345678901234567890123456789012345678901234567890123456789
- dirline .asc "drwx*e-t 00-Xxx-00 12:00a 12345678 *SEQ 1234567890123456\n"
- .byte 0
- dirFlagNames .asc "drwx*e-t"
- dirDateStr .asc " 00-Xxx-00 12:00a "
- dirDateEnd = *
-
- dirSetupDirline = *
- ;** flags
- ldx #0
- lda aceDirentFlags
- - asl
- pha
- lda #"-"
- bcc +
- lda dirFlagNames,x
- + sta dirline+0,x
- pla
- inx
- cpx #8
- bcc -
-
- ;** date
- jsr dirPutInDate
- ldx #dirDateEnd-dirDateStr-1
- - lda dirDateStr,x
- sta dirline+8,x
- dex
- bpl -
-
- ;** bytes
- ldx #3
- - lda aceDirentBytes,x
- sta dirFree,x
- dex
- bpl -
- lda #<dirUtoaNumber
- ldy #>dirUtoaNumber
- sta zp+0
- sty zp+1
- lda #8
- ldx #dirFree
- jsr aceMiscUtoa
- ldy #28
- lda dirChCols
- cmp #60
- bcs +
- ldy #8
- + ldx #0
- - lda dirUtoaNumber,x
- sta dirline,y
- iny
- inx
- cpx #8
- bcc -
- lda #" "
- sta dirline,y
- iny
-
- ;** unclosed flag
- lda dirline+4
- cmp #"-"
- bne +
- lda #" "
- + sta dirline,y
- iny
-
- ;** filetype
- ldx #0
- - lda aceDirentType,x
- ora #$80
- sta dirline,y
- iny
- inx
- cpx #3
- bcc -
- lda #" "
- sta dirline,y
- iny
- sta dirline,y
- iny
-
- ;** filename
- ldx #0
- - lda aceDirentName,x
- beq +
- sta dirline,y
- iny
- inx
- bne -
- + lda #chrCR
- sta dirline,y
- iny
- lda #0
- sta dirline,y
- sty dirlineLen
- rts
-
- dirDisplayShort = *
- lda #<aceDirentName
- ldy #>aceDirentName
- jsr puts
- inc dirCurCol
- lda dirCurCol
- cmp dirColumns
- bcc +
- lda #0
- sta dirCurCol
- lda #chrCR
- jmp putchar
- + ldy #$ff
- - iny
- lda aceDirentName,y
- bne -
- sty dirSpaces
- lda #20
- sbc dirSpaces
- sta dirSpaces
- - lda #" "
- jsr putchar
- dec dirSpaces
- bne -
- rts
-
- dirDisplayHeading = *
- lda #<dirHeadingMsg
- ldy #>dirHeadingMsg
- jsr puts
- lda #<aceDirentName
- ldy #>aceDirentName
- jsr puts
- lda #chrCR
- jsr putchar
- rts
-
- dirHeadingMsg = *
- .asc "Dir: "
- .byte 0
-
- dirDisplayTrailer = *
- ldx #3
- - lda aceDirentBytes,x
- sta dirFree,x
- dex
- bpl -
- ldx dirFileSum
- beq dirDisplayShortTrailer
- ldx #0
- ldy #0
- - lda dirTrailingMsg,x
- beq +
- cmp #4
- bcc dirStoreNum
- sta dirTrailBuf,y
- inx
- iny
- bne -
- + lda #<dirTrailBuf
- ldx #>dirTrailBuf
- sta zp+0
- stx zp+1
- tya
- ldy #0
- ldx #stdout
- jmp write
-
- dirDisplayShortTrailer = *
- lda #<dirUtoaNumber
- ldy #>dirUtoaNumber
- sta zp+0
- sty zp+1
- ldx #dirFree
- lda #0
- jsr aceMiscUtoa
- lda #<dirUtoaNumber
- ldy #>dirUtoaNumber
- jsr puts
- lda #<dirTrailShMsg
- ldy #>dirTrailShMsg
- jmp puts
-
- dirTrailShMsg = *
- .asc " bytes free"
- .byte chrCR,0
-
- dirStoreNum = *
- stx dirWork+0
- sty dirWork+1
- sec
- sbc #1
- asl
- asl
- adc #dirFiles
- tax
- lda #<dirUtoaNumber
- ldy #>dirUtoaNumber
- sta zp+0
- sty zp+1
- lda #1
- jsr aceMiscUtoa
- ldx #0
- ldy dirWork+1
- - lda dirUtoaNumber,x
- beq +
- sta dirTrailBuf,y
- inx
- iny
- bne -
- + ldx dirWork+0
- inx
- jmp --
-
- dirTrailingMsg = *
- .asc "files="
- .byte 1
- .asc " bytes="
- .byte 2
- .asc " free="
- .byte 3,chrCR,0
-
- dirTrailBuf .buf 64
-
- dirPutInDate = *
- ;** year
- lda aceDirentDate+1
- ldx #9
- jsr dirPutDigits
- ;** month
- lda aceDirentDate+2
- cmp #$10
- bcc +
- sec
- sbc #$10-10
- + tax
- lda dirMonthStr+0,x
- sta dirDateStr+5
- lda dirMonthStr+13,x
- sta dirDateStr+6
- lda dirMonthStr+26,x
- sta dirDateStr+7
- ;** day
- lda aceDirentDate+3
- ldx #2
- jsr dirPutDigits
- ;** hour
- lda aceDirentDate+4
- ldx #"a"
- cmp #$00
- bne +
- lda #$12
- jmp dirPutHour
- + cmp #$12
- bcc dirPutHour
- ldx #"p"
- cmp #$12
- beq dirPutHour
- sei
- sed
- sec
- sbc #$12
- cld
- cli
- dirPutHour = *
- stx dirDateStr+18
- ldx #13
- jsr dirPutDigits
- ;** minute
- lda aceDirentDate+5
- ldx #16
- jsr dirPutDigits
- rts
-
- dirPutDigits = * ;( .A=num, .X=offset )
- pha
- lsr
- lsr
- lsr
- lsr
- ora #$30
- sta dirDateStr,x
- pla
- and #$0f
- ora #$30
- sta dirDateStr+1,x
- rts
-
- dirMonthStr = *
- .asc "XJFMAMJJASOND"
- .asc "xaeapauuuecoe"
- .asc "xnbrrynlgptvc"
-
- dirUtoaNumber .buf 11
-
- dirFile = *
- ldx #stdout
- jsr aceFileInfo
- cpx #60
- bcc +
- lda #<dirFileLongMsg
- ldy #>dirFileLongMsg
- jmp ++
- + lda #<dirFileShortMsg
- ldy #>dirFileShortMsg
- + jsr puts
- lda dirName+0
- ldy dirName+1
- jsr puts
- lda #chrCR
- jsr putchar
- rts
-
- dirFileLongMsg = *
- .asc "*argument is a file--option not supported: "
- .byte 0
- dirFileShortMsg = *
- .asc "*argument is a file-n: "
- .byte 0
-
- ;******** standard library ********
-
- eputs = *
- ldx #stderr
- jmp fputs
- puts = *
- ldx #stdout
- fputs = *
- sta zp+0
- sty zp+1
- zpputs = *
- ldy #$ff
- - iny
- lda (zp),y
- bne -
- tya
- ldy #0
- jmp write
-
- putchar = *
- ldx #stdout
- putc = *
- sta putcBuffer
- lda #<putcBuffer
- ldy #>putcBuffer
- sta zp+0
- sty zp+1
- lda #1
- ldy #0
- jmp write
- putcBuffer .buf 1
-
- getchar = *
- ldx #stdin
- getc = *
- lda #<getcBuffer
- ldy #>getcBuffer
- sta zp+0
- sty zp+1
- lda #1
- ldy #0
- jsr read
- beq +
- lda getcBuffer
- rts
- + sec
- rts
- getcBuffer .buf 1
-
- cls = *
- lda #chrCLS
- jmp putchar
-
- getarg = *
- sty zp+1
- asl
- sta zp+0
- rol zp+1
- clc
- lda aceArgv+0
- adc zp+0
- sta zp+0
- lda aceArgv+1
- adc zp+1
- sta zp+1
- ldy #0
- lda (zp),y
- tax
- iny
- lda (zp),y
- stx zp+0
- sta zp+1
- ora zp+0
- rts
-
- ;===bss===
-
- bss = *
- cmdBuffer = bss+0
- copyBuffer = bss+0
- argBuffer = cmdBuffer+256
- argArgvBuffer = argBuffer+256
-