home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / canada-remote-systems / c64 / utils / ace15-sy.kar < prev    next >
Encoding:
Text File  |  2019-04-13  |  296.1 KB  |  18,061 lines

  1. 17
  2. acehead.s
  3. 174
  4. ;===ace system-interface declarations===
  5.  
  6. aceStatB      = $f00   ;(256)
  7. aceCallB      = $1303  ;(225)
  8. aceExitData   = $700   ;(256)
  9. aceAppAddress = $7000
  10.  
  11. zp      = $f8  ;(2)
  12. zw      = $fa  ;(2)
  13. mp      = $fc  ;(4)
  14. syswork = $80  ;(16)
  15.  
  16. errno            = aceStatB+0          ;(1)
  17. aceArgc          = aceStatB+4          ;(2)
  18. aceArgv          = aceStatB+6          ;(2)
  19. aceMemTop        = aceStatB+8          ;(2)
  20. aceDirentBuffer  = aceStatB+10         ;(aceDirentLength)
  21. aceDirentBytes   = aceDirentBuffer+0   ;(4)
  22. aceDirentDate    = aceDirentBuffer+4   ;(8) = YY:YY:MM:DD:HH:MM:SS:TW
  23. aceDirentType    = aceDirentBuffer+12  ;(4)
  24. aceDirentFlags   = aceDirentBuffer+16  ;(1) = drwx*e-t
  25. aceDirentUsage   = aceDirentBuffer+17  ;(1) = ulshb---
  26. aceDirentNameLen = aceDirentBuffer+18  ;(1)
  27. aceDirentName    = aceDirentBuffer+19  ;(17)
  28. aceDirentLength  = 36
  29.  
  30. open          = aceCallB+0   ;( (zp)=name, .A=mode[rwaWA] ) : .A=fd
  31. close         = aceCallB+3   ;( .A=fd )
  32. read          = aceCallB+6   ;( .X=fd, (zp)=buf, .AY=len ) : .AY=(zw)=len, .Z
  33. write         = aceCallB+9   ;( .X=fd, (zp)=buf, .AY=len )
  34. aceFileLseek  = aceCallB+12  ;( .X=fd, .A=origin, [sw+0]=pos ) : [sw+0]=newpos
  35. aceFileRemove = aceCallB+15  ;( (zp)=name )
  36. aceFileRename = aceCallB+18  ;( (zp)=oldName, (zw)=newName )
  37. aceFileBload  = aceCallB+21  ;( (zp)=name, .AY=loadAddr, (zw)=limit+1):.AY=end+1
  38. aceFileInfo   = aceCallB+24  ;( .X=fd, .A=flags ) : .A=devType, .X=cols, .Y=rows
  39. aceFileStat   = aceCallB+27  ;( (zp)=name, .A=flags ) : direntBuffer
  40. aceFileIoctl  = aceCallB+30  ;( .X=fd, .A=code, ??? )
  41. aceFileFdswap = aceCallB+33  ;( .X=fd1, .Y=fd2 )
  42.  
  43. aceDirOpen    = aceCallB+36  ;( (zp)=dirName ) : .A=fd
  44. aceDirClose   = aceCallB+39  ;( .A=fd )
  45. aceDirRead    = aceCallB+42  ;( .X=fd ) : direntBuffer, .Z=eof
  46. aceDirIsdir   = aceCallB+45  ;( (zp)=name ) : .A=dev, .X=isDisk, .Y=isDir
  47. aceDirChange  = aceCallB+48  ;( (zp)=dirName, .A=flags($80=home) )
  48. aceDirMake    = aceCallB+51  ;( (zp)=newDirName, .AY=suggestedEntries )
  49. aceDirRemove  = aceCallB+54  ;( (zp)=dirName )
  50. aceDirName    = aceCallB+57  ;( .A=sysdir, (zp)=buf ) : buf, .Y=len
  51.                              ; .A:0=curDir, 1=homeDir, 2=execSearchPath,
  52.                              ;    3=configSearchPath, 4=tempDir
  53.  
  54. aceWinMax    = aceCallB+60  ;( )
  55. aceWinCls    = aceCallB+63  ;( .A=char/color/attrFlags, .X=char, .Y=color )
  56. aceWinSet    = aceCallB+66  ;( .A=rows, .X=cols, sw+0=scrRow, sw+1=scrCol )
  57. aceWinSize   = aceCallB+69  ;( ) : <above>+ ,(sw+2)=addr,(sw+4)=rowinc
  58. aceWinPut    = aceCallB+72  ;((sw+0)=addr,(sw+2)=charPtr,.A=attr,.Y=color,.X=len
  59.                             ;  sw+4=fillChar, sw+5=fieldLen, sw+6=extattr )
  60. aceWinColor  = aceCallB+75  ;( .X=screen, .Y=border, .A=which ) : .X=scr, .Y=bor
  61. aceWinPos    = aceCallB+78  ;( .A=row, .X=col ) : (sw+0)=addr
  62. aceWinCursor = aceCallB+81  ;( (sw+0)=addr, .Y=color, .A=$ff:on/$00:off)
  63. aceWinScroll = aceCallB+84  ;(.A=attr+$08:up+$04:down,.X=rows,sw+4=chr,.Y=color)
  64.  
  65. aceConRead     = aceCallB+87  ;( (zp)=Buf, .AY=Len ) : .AY=(zw)=Len, .Z
  66. aceConWrite    = aceCallB+90  ;( (zp)=Buf, .AY=Len )
  67. aceConPutchar  = aceCallB+93  ;( .A=char )
  68. aceConPutlit   = aceCallB+96  ;( .A=char )
  69. aceConPutctrl  = aceCallB+99  ;( .A=char, .X=aux )
  70. aceConColor    = aceCallB+102 ;( .A=which, .X=char, .Y=cursor ):.X=char,.Y=cursr
  71. aceConPalette  = aceCallB+105 ;( ) : sw+0...sw+7=palette [8 colors]
  72. aceConScreen   = aceCallB+108 ;( .A=MinRows, .X=MinCols )
  73. aceConPos      = aceCallB+111 ;( .A=row, .X=col )
  74. aceConGetpos   = aceCallB+114 ;( ) : .A=rowOfCursor, .X=colOfCursor
  75. aceConStopkey  = aceCallB+117 ;( ) : .CC=notPressed
  76. aceConGetkey   = aceCallB+120 ;( ) : .A=key
  77. aceConKeyAvail = aceCallB+123 ;( ) : .CC=keyIsAvailable, .A=keyboardType
  78. aceConKeyMat   = aceCallB+126 ;( (zp)=keymatrixPtr )
  79. aceConInput    = aceCallB+129 ;( (zp)=buf/initstr,.Y=initStrLen):.Y=len,.CS=excp
  80. aceConChrset   = aceCallB+132 ;( (sw+0)=addr,.A=flags,.X=start,.Y=len):.A=flags
  81. aceConMouse    = aceCallB+135 ;( ) : .A=buttons:l/r:128/64, (sw+0)=X, (sw+2)=Y
  82. aceConJoystick = aceCallB+138 ;( ) : .A=joy1, .X=joy2
  83.  
  84. aceGrScreen = aceCallB+141 ;( .A=grType, .X=borderColor, .Y=BgFgColor )
  85.                            ;  : .A=cols8, (sw+0)=rows, .X=xAspect
  86. aceGrExit   = aceCallB+144 ;( )
  87. aceGrFill   = aceCallB+147 ;( .A=fillValue )
  88. aceGrOp     = aceCallB+150 ;( .A=flags, .X=X8, (sw+0)=Y, .Y=cols8, (sw+2)=rows,
  89.                            ; (sw+4)=sPtr/val,(sw+6)=dPtr,(sw+8)=mPtr,sw+a=intl8)
  90.  
  91. aceProcExec = aceCallB+153 ;( (zp)=execName, (zw)=argv,.AY=argCnt,[mp]=saveArea,
  92.                            ; .X=flags):.A=exitCode, .X=exitDataLen,[mp]=saveArea
  93. aceProcExecSub = aceCallB+156 ;( (zp)=execAddr, ...) rest same as aceProcExec
  94.                               ;  : .A=exitCode, .X=exitDataLen, [mp]=saveArea
  95. aceProcExit    = aceCallB+159 ;( .A=exitCode, .X=exitBufDataLen, exitData )
  96.  
  97. aceMemZpload  = aceCallB+162 ;( [mp]=Source, .X=ZpDest, .Y=Length )
  98. aceMemZpstore = aceCallB+165 ;( .X=ZpSource, [mp]=Dest, .Y=Length )
  99. aceMemFetch   = aceCallB+168 ;( [mp]=FarSource, (zp)=Ram0Dest, .AY=Length )
  100. aceMemStash   = aceCallB+171 ;( (zp)=Ram0Source, [mp]=FarDest, .AY=length )
  101. aceMemAlloc   = aceCallB+174 ;( .A=PageCount, .X=StartTyp,.Y=EndTyp):[mp]=FarPtr
  102. aceMemFree    = aceCallB+177 ;( [mp]=FarPointer, .A=PageCount )
  103. aceMemStat    = aceCallB+180 ;( .X=zpOff) : .A=procID, [.X+0]=free, [.X+4]=total
  104.  
  105. aceTimeGetDate = aceCallB+183 ;( (.AY)=dateString ) : dateString
  106. aceTimeSetDate = aceCallB+186 ;( (.AY)=dateString )
  107. aceTimeJif     = aceCallB+189 ;( .X=zpJifBuf ) : [zJB]=jiffies
  108.  
  109. aceMiscUtoa      = aceCallB+192 ;( $0+X=value32,(sw+0)=buf,.A=minLen):buf,.Y=len
  110. aceMiscIoPeek    = aceCallB+195 ;( (zw)=ioaddr, .Y=offset ) : .A=data
  111. aceMiscIoPoke    = aceCallB+198 ;( (zw)=ioaddr, .Y=offset, .A=data )
  112. aceMiscCmdOpen   = aceCallB+201 ;( (zp)=DevName ) : .A=fd
  113. aceMiscCmdClose  = aceCallB+204 ;( .A=fd )
  114. aceMiscCmdSend   = aceCallB+207 ;( .X=fd, (zp)=cmdString, .Y=cmdLen )
  115. aceMiscCmdStatus = aceCallB+210 ;( .X=fd, (zp)=statBufPtr):statBuf,.A=statusCode
  116.  
  117. aceModemCheck = aceCallB+213 ;( ):.AY=outstRecvBytes,.X=outstSendBytes,
  118.                              ; .Z=oRecvB==0
  119. aceModemParms = aceCallB+216 ;( .A=baudrate|format )
  120. aceModemStat  = aceCallB+219 ;( .X=zpStatBuf ):.A=slSt,[zSB+0]=ovrChr,
  121.                              ; [zSB+4]=bovfChr
  122. aceTest       = aceCallB+222 ;( (zp)=filename ) : .A=dev#, (zw)=devRelName
  123.  
  124. aceID1 = $cb
  125. aceID2 = $06
  126. aceID3 = 15
  127.  
  128. aceMemNull     = $00
  129. aceMemREU      = $01
  130. aceMemRL       = $02
  131. aceMemInternal = $03
  132. aceMemRdREU    = $04
  133. aceMemRdRL     = $05
  134. aceMemRdInternal = $06
  135.  
  136. aceErrStopped = 0
  137. aceErrTooManyFiles = 1
  138. aceErrFileOpen = 2
  139. aceErrFileNotOpen = 3
  140. aceErrFileNotFound = 4
  141. aceErrDeviceNotPresent = 5
  142. aceErrFileNotInput = 6
  143. aceErrFileNotOutput = 7
  144. aceErrMissingFilename = 8
  145. aceErrIllegalDevice = 9
  146. aceErrWriteProtect = 26
  147. aceErrFileExists = 63
  148. aceErrFileTypeMismatch = 64
  149. aceErrNoChannel = 70
  150. aceErrDiskFull = 72
  151. aceErrInsufficientMemory = 128
  152. aceErrOpenDirectory = 129
  153. aceErrDiskOnlyOperation = 131
  154. aceErrNullPointer = 132
  155. aceErrInvalidFreeParms = 133
  156. aceErrFreeNotOwned = 134
  157. aceErrInvalidWindowParms = 135
  158. aceErrInvalidConParms = 136
  159. aceErrInvalidFileMode = 137
  160. aceErrNotImplemented = 138
  161. aceErrBloadTruncated = 139
  162. aceErrPermissionDenied = 140
  163. aceErrNoGraphicsSpace = 141
  164. aceErrBadProgFormat = 142
  165.  
  166. chrBEL = $07  ;bell
  167. chrTAB = $09  ;tab
  168. chrBOL = $0a  ;beginning of line (return)
  169. chrCR  = $0d  ;carriage return (newline)
  170. chrVT  = $11  ;vertical tab (down, linefeed)
  171. chrBS  = $14  ;backspace (del)
  172. chrCLS = $93  ;clear screen (form feed)
  173.  
  174. stdin  = 0
  175. stdout = 1
  176. stderr = 2
  177. ;===end of ace interface declarations===
  178. kernhead.s
  179. 39
  180. ;===kernel header declarations===
  181. aceStackPtr       = aceMemTop    ;(2)
  182. aceFramePtr       = aceStatB+64  ;(2)
  183. aceStackTop       = aceStatB+66  ;(2)
  184. aceCurrentDevice  = aceStatB+68  ;(1)
  185. aceDate           = aceStatB+70  ;(4) YYYY:MM:DD
  186. aceDOW            = aceStatB+74  ;(1) 1-7,1=Sun
  187. aceProcessID      = aceStatB+75  ;(1)
  188. aceFreeMemory     = aceStatB+76  ;(4)
  189. aceTotalMemory    = aceStatB+80  ;(4)
  190. aceInternalBanks  = aceStatB+84  ;(1)
  191. aceInternalCur    = aceStatB+85  ;(1)
  192. aceRam0Freemap    = aceStatB+86  ;(2)
  193. aceRam1Freemap    = aceStatB+88  ;(1)
  194. aceReuStart       = aceStatB+89  ;(1)
  195. aceReuBanks       = aceStatB+90  ;(1)
  196. aceReuCur         = aceStatB+91  ;(1)
  197. aceRamlinkStart   = aceStatB+92  ;(2)
  198. aceRamlinkBanks   = aceStatB+94  ;(1)
  199. aceRamlinkCur     = aceStatB+95  ;(1)
  200. aceRamlinkAccess  = aceStatB+96  ;(1)   ;$00=direct, $ff=through ramlink
  201. aceRestoreStack   = aceStatB+101 ;(1)
  202. aceSoft80Allocated = aceStatB+102 ;(1)  ;$ff=yes,$00=no
  203. aceCharSetPage    = aceStatB+103 ;(1)
  204. aceVic40Page      = aceStatB+104 ;(1)
  205. aceModemSendPage  = aceStatB+105 ;(1)
  206. aceModemRecvPage  = aceStatB+106 ;(1)
  207. aceModemRecvHigh  = aceStatB+107 ;(1)   ;high page + 1
  208. aceModemType      = aceStatB+108 ;(1)   ;$ff=swifty,$40=user-port,$00=none
  209. aceModemIoPage    = aceStatB+109 ;(1)
  210. aceTpaLimit       = aceStatB+110 ;(1)
  211. aceReuRlSpeedTry  = aceStatB+111 ;(1)   ;whether reu visible when rl active
  212. aceReuRlSpeedPage = aceStatB+112 ;(4)   ;pointer to reu-rl copying page/null
  213. aceModemConfig    = aceStatB+116 ;(1)   ;$0x=baudrate, $x0=bits+parity+stop
  214. aceCurDirName     = aceStatB+$80 ;(128) ;name of current directory
  215. aceShellPath      = $ac6         ;(58)  [really want 64] [defunct]
  216.  
  217. aceMemTypes       = 8
  218. ;===end of kernel header info===
  219. ace.s
  220. 1048
  221. ;ACE-128/64 kernel by Craig Bruce, started 04-Mar-1992.
  222.  
  223. ;* system zero-page memory usage:
  224. ;*   $02-$7f = application work area
  225. ;*   $80-$8f = system work area
  226. ;*   $f8-$ff = system parameter area
  227.  
  228. ;* regular RAM0 organization
  229. ;*   $0100-$01ff = processor stack (0.25K)
  230. ;*   $0200-$0eff = system storage (3.25K)
  231. ;*   $0f00-$0fff = kernel-interface variables (0.25K)
  232. ;*   $1000-$12ff = system storage / free on the C64 (0.75K)
  233. ;*   $1300-$5fff = ACE kernel and device drivers (23.25K)
  234. ;*   $7000-$bfff = application area & stack (20K / configurable size)
  235. ;*   $c000-$edff = free memory (11K)
  236. ;*   $ee00-$eeff = modem receive buffer (0.25K / configurable size)
  237. ;*   $ef00-$efff = modem transmit buffer (0.25K)
  238. ;*   $f000-$f7ff = regular character set (2K)
  239. ;*   $f800-$fbff = vic 40-column screen (1K)
  240. ;*   $fc00-$feff = free memory (0.75K)
  241. ;*   $ff00-$ffff = system storage (0.25K)
  242.  
  243. ;* high-RAM0 organization for C64 with soft-80 screen configured:
  244. ;*   $c000-$c9ff = free memory (2K)
  245. ;*   $ca00-$caff = modem receive buffer (0.25K / configurable size)
  246. ;*   $cb00-$cbff = modem transmit buffer (0.25K)
  247. ;*   $cc00-$cfff = vic 40-column screen (1K)
  248. ;*   $d000-$d7ff = regular character set (2K)
  249. ;*   $d800-$dfff = soft-80 4-bit character set (2K)
  250. ;*   $e000-$ff3f = bitmapped screen (7.81K)
  251. ;*   $ff40-$ffff = system storage (0.19K)
  252.  
  253. computer = 128
  254.  
  255. .seq acehead.s
  256. .seq kernhead.s
  257. .org $1300
  258.  
  259. .if computer-64
  260.    .obj "@0:ace128"
  261. .else
  262.    .obj "@0:ace64"
  263. .ife
  264.  
  265. jmp entryPoint
  266.  
  267. ;***jump table
  268.  
  269. jmp kernFileOpen
  270. jmp kernFileClose
  271. jmp kernFileRead
  272. jmp kernFileWrite
  273. jmp kernFileLseek
  274. jmp kernFileRemove
  275. jmp kernFileRename
  276. jmp kernFileBload
  277. jmp kernFileInfo
  278. jmp kernFileStat
  279. jmp kernFileIoctl
  280. jmp kernFileFdswap
  281.  
  282. jmp kernDirOpen
  283. jmp kernDirClose
  284. jmp kernDirRead
  285. jmp kernDirIsdir
  286. jmp kernDirChange
  287. jmp kernDirMake
  288. jmp kernDirRemove
  289. jmp kernDirName
  290.  
  291. jmp kernWinMax
  292. jmp kernWinCls
  293. jmp kernWinSet
  294. jmp kernWinSize
  295. jmp kernWinPut
  296. jmp kernWinColor
  297. jmp kernWinPos
  298. jmp kernWinCursor
  299. jmp kernWinScroll
  300.  
  301. jmp kernConRead
  302. jmp kernConWrite
  303. jmp kernConPutchar
  304. jmp kernConPutlit
  305. jmp kernConPutctrl
  306. jmp kernConColor
  307. jmp kernConPalette
  308. jmp kernConScreen
  309. jmp kernConPos
  310. jmp kernConGetpos
  311. jmp kernConStopkey
  312. jmp kernConGetkey
  313. jmp kernConKeyAvail
  314. jmp kernConKeyMat
  315. jmp kernConInput
  316. jmp kernConChrset
  317. jmp kernConMouse
  318. jmp kernConJoystick
  319.  
  320. jmp kernGrScreen
  321. jmp kernGrExit
  322. jmp kernGrFill
  323. jmp kernGrOp
  324.  
  325. jmp kernProcExec
  326. jmp kernProcExecSub
  327. jmp kernProcExit
  328.  
  329. jmp kernMemZpload
  330. jmp kernMemZpstore
  331. jmp kernMemFetch
  332. jmp kernMemStash
  333. jmp kernMemAlloc
  334. jmp kernMemFree
  335. jmp kernMemStat
  336.  
  337. jmp kernTimeGetDate
  338. jmp kernTimeSetDate
  339. jmp kernTimeJif
  340.  
  341. jmp kernMiscUtoa
  342. jmp kernMiscIoPeek
  343. jmp kernMiscIoPoke
  344. jmp kernMiscCmdOpen
  345. jmp kernMiscCmdClose
  346. jmp kernMiscCmdSend
  347. jmp kernMiscCmdStatus
  348.  
  349. jmp kernModemCheck
  350. jmp kernModemParms
  351. jmp kernModemStat
  352.  
  353. jmp kernTest
  354.  
  355. .byte $ff,$fe,$3c,$e2,$fc
  356.  
  357. ;***global declarations
  358.  
  359. maxZpUse     = $90
  360. stringBuffer = $400  ;(256 bytes)
  361. keylineBuf   = $500  ;(256 bytes)
  362. fcbTable1    = $600  ;(256 bytes)
  363. freemap      = $800  ;(256 bytes)
  364. ram0FreeMap  = $900  ;(256 bytes)
  365. configBuf    = $b00  ;(1024 bytes)
  366.  
  367. .if computer-64
  368.    maxPage = $c0
  369.    bkACE = $0e
  370.    bkApp = $0e
  371.    bkRam0 = $3f
  372.    bkRam0io = $3e
  373.    bkKernel = $00
  374.    bkCharset = $0f
  375.    bkSelect = $ff00
  376.    kernelIrqHandler = $fa65
  377.    kernelBrkHandler = $b003
  378.    kernelNmiHandler = $fa40
  379.    kernelStopHandler = $f66e
  380. .else
  381.    basicZpSave  = $a00  ;("maxZpUse" bytes ($90))
  382.    deviceTable  = $1000 ;(256 bytes)
  383.    workbuf      = $1100 ;(256 bytes)
  384.    unusedMem1   = $1200 ;unused so far
  385.    maxPage = $d0
  386.    bkSelect = $01
  387.    bkACE = $36
  388.    bkApp = $36
  389.    bkRam0 = $30
  390.    bkRam0io = $35
  391.    bkKernel = $37
  392.    kernelIrqHandler = $ea31
  393.    kernelBrkHandler = $fe66
  394.    kernelNmiHandler = $fe47
  395.    kernelStopHandler = $f6ed
  396. .ife
  397.  
  398. vic   = $d000
  399. vdc   = $d600
  400. sid   = $d400
  401. cia1  = $dc00
  402. cia2  = $dd00
  403. st    = $90
  404. true  = $ff
  405. false = $00
  406. chrQuote = $22
  407.  
  408. fcbCount = 16
  409. lftable   .buf fcbCount
  410. devtable  .buf fcbCount
  411. satable   .buf fcbCount
  412. eoftable  .buf fcbCount
  413. pidtable  .buf fcbCount
  414. lfnull = $ff
  415. fcbNull = $ff
  416. minDisk = 8
  417. regsave .buf 3
  418. jiffyCount .buf 4
  419.  
  420. newlf .buf 1
  421.  
  422. kernelClall  = $ffe7
  423. kernelSetbnk = $ff68
  424. kernelSetmsg = $ff90
  425. kernelReadst = $ffb7
  426. kernelSetlfs = $ffba
  427. kernelSetnam = $ffbd
  428. kernelOpen   = $ffc0
  429. .if computer-64
  430. kernelClose  = $ffc3
  431. .ife
  432. kernelChkin  = $ffc6
  433. kernelChkout = $ffc9
  434. kernelClrchn = $ffcc
  435. kernelChrin  = $ffcf
  436. kernelChrout = $ffd2
  437. kernelLoad   = $ffd5
  438. kernelStop   = $ffe1
  439. kernelGetin  = $ffe4
  440. kernelScrorg = $ffed
  441. kernelSwapper = $ff5f
  442.  
  443. .if computer-64
  444.    ;128 nothing here
  445. .else
  446. ;*** kernel close with pseudo-close for disk command channel for the 64
  447. kernelClose = *
  448.    bcs +
  449.    jmp $ffc3
  450. +  ldx $98
  451. -  dex
  452.    bmi kernelCloseExit
  453.    cmp $259,x
  454.    bne -
  455.    beq +
  456.    brk
  457.    ;** found entry; copy last entry on top if it
  458. +  ldy $98
  459.    dey
  460.    lda $259,y   ;move lfn
  461.    sta $259,x
  462.    lda $263,y   ;move dev num
  463.    sta $263,x
  464.    lda $26d,y   ;move sec addr
  465.    sta $26d,x
  466.    dec $98
  467.    kernelCloseExit = *
  468.    clc
  469.    rts
  470. .ife
  471.  
  472. ;*** entrypoint()
  473.  
  474. entryPoint = *
  475.    lda #0
  476.    pha
  477.    plp
  478.    lda #bkACE
  479.    sta bkSelect
  480.    jmp main
  481.  
  482. ;*** startup()
  483.  
  484. aceBootstrap = *
  485.    php
  486.    sei
  487.    ldx #2
  488. -  lda $00,x
  489.    sta basicZpSave,x
  490.    lda #0
  491.    sta $00,x
  492.    inx
  493.    cpx #maxZpUse
  494.    bcc -
  495. .if computer-64
  496.    ldx #0
  497. -  lda $c00,x
  498.    sta pageC0Save,x
  499.    inx
  500.    bne -
  501. .ife
  502.    lda #%01111111
  503.    sta $dc0d
  504.    lda #%01111111
  505.    sta $dd0d
  506.    bit $dc0d
  507.    bit $dd0d
  508.    lda #%00000000
  509.    sta vic+$1a
  510.    lda #<irqHandler
  511.    ldy #>irqHandler
  512.    sta $314
  513.    sty $315
  514.    lda #<brkHandler
  515.    ldy #>brkHandler
  516.    sta $316
  517.    sty $317
  518.    lda #<nmiHandler
  519.    ldy #>nmiHandler
  520.    sta $318
  521.    sty $319
  522.    lda #<stopHandler
  523.    ldy #>stopHandler
  524.    sta $328
  525.    sty $329
  526.    ldx #127
  527.    lda #0
  528. -  sta errno,x
  529.    dex
  530.    bpl -
  531.    lda #$04  ;"a:"
  532.    sta aceCurrentDevice
  533.    lda #0
  534.    jsr kernelSetmsg
  535. .if computer-64
  536.    lda #0
  537.    ldx #0
  538.    jsr kernelSetbnk
  539. .ife
  540.    jsr kernelClall
  541.    plp
  542.    rts
  543.  
  544. aceConfig = *
  545.    lda #0
  546.    ldx bootDevice
  547.    ldy #0
  548.    jsr kernelSetlfs
  549.    lda #6
  550.    ldx #<aceConfigName
  551.    ldy #>aceConfigName
  552.    jsr kernelSetnam
  553.    lda #0
  554.    ldx #<aceAppAddress
  555.    ldy #>aceAppAddress
  556.    jsr kernelLoad
  557.    bcc +
  558.    rts
  559. +  lda #<configBuf
  560.    ldy #>configBuf
  561.    sta 2
  562.    sty 3
  563.    lda #<aceStartupMsg
  564.    ldy #>aceStartupMsg
  565.    sta 4
  566.    sty 5
  567.    lda #<ram0FreeMap
  568.    ldy #>ram0FreeMap
  569.    sta 6
  570.    sty 7
  571.    ldx #>aceBssEnd
  572.    lda #<aceBssEnd
  573.    beq +
  574.    inx
  575. +  stx 8
  576.    .if computer-64
  577.    lda #128
  578.    .else
  579.    lda #64
  580.    .ife
  581.    sta 9
  582.    lda #<charset4bit
  583.    ldy #>charset4bit
  584.    sta 10
  585.    sty 11
  586.    lda #<conKeymapNormal
  587.    ldy #>conKeymapNormal
  588.    sta 12
  589.    sty 13
  590.    jsr aceAppAddress
  591.    rts
  592.    aceConfigName = *
  593.    .asc "config"
  594.  
  595. aceStartup = *
  596.    ldx #fcbCount-1
  597.    lda #lfnull
  598. -  sta lftable,x
  599.    dex
  600.    bpl -
  601.    lda #0
  602.    sta newlf
  603.    jsr initStack
  604.    lda aceCurrentDevice
  605.    lsr
  606.    lsr
  607.    ora #$40
  608.    sta aceCurDirName+0
  609.    lda #":"
  610.    sta aceCurDirName+1
  611.    lda #0
  612.    sta aceCurDirName+2
  613.    ldx #57
  614. -  lda configBuf+$140,x
  615.    sta aceShellPath,x
  616.    dex
  617.    bpl -
  618.    lda #1
  619.    sta aceProcessID
  620.    rts
  621.  
  622. initStack = *
  623.    lda #0
  624.    ldy aceTpaLimit
  625.    sta aceStackTop+0
  626.    sty aceStackTop+1
  627.    sta aceMemTop+0
  628.    sty aceMemTop+1
  629.    sta aceFramePtr+0
  630.    sty aceFramePtr+1
  631.    rts
  632.  
  633. ;*** shutdown()
  634.  
  635. aceShutdown = *
  636.    lda #bkACE
  637.    sta bkSelect
  638.    ldx #2
  639. -  lda basicZpSave,x
  640.    sta $00,x
  641.    inx
  642.    cpx #maxZpUse
  643.    bcc -
  644. .if computer-64
  645.    ldx #0
  646. -  lda pageC0Save,x
  647.    sta $c00,x
  648.    inx
  649.    bne -
  650. .ife
  651.    php
  652.    sei
  653.    lda #<kernelIrqHandler
  654.    ldy #>kernelIrqHandler
  655.    sta $314
  656.    sty $315
  657.    lda #<kernelBrkHandler
  658.    ldy #>kernelBrkHandler
  659.    sta $316
  660.    sty $317
  661.    lda #<kernelNmiHandler
  662.    ldy #>kernelNmiHandler
  663.    sta $318
  664.    sty $319
  665.    lda #<kernelStopHandler
  666.    ldy #>kernelStopHandler
  667.    sta $328
  668.    sty $329
  669. .if computer-64
  670.    lda #%01111111
  671.    sta $dc0d
  672.    lda #%01111111
  673.    sta $dd0d
  674.    bit $dc0d
  675.    bit $dd0d
  676.    lda #%00000001
  677.    sta vic+$1a
  678. .else
  679.    lda #%10000001
  680.    sta $dc0d
  681.    lda #%01111111
  682.    sta $dd0d
  683.    bit $dc0d
  684.    bit $dd0d
  685.    lda #%00000000
  686.    sta vic+$1a
  687. .ife
  688.    plp
  689.    rts
  690.  
  691. aceShutdownBasic = *
  692.    bit exitScr
  693.    bpl shutBasicScrDone
  694.    ;** shut down the screens
  695. .if computer-64
  696.    jsr vdcShutdown
  697.    jsr vicShutdown
  698.    lda textMode
  699.    eor $d7
  700.    bpl +
  701.    jsr kernelSwapper
  702. +  nop
  703. .else
  704.    lda #25
  705.    ldx #40
  706.    ;xx check config for screen
  707.    jsr conScreen
  708.    jsr vicShutdown
  709. .ife
  710.    ldx #0
  711.    lda #$20
  712. -  sta $400+000,x
  713.    sta $400+250,x
  714.    sta $400+500,x
  715.    sta $400+750,x
  716.    inx
  717.    cpx #250
  718.    bcc -
  719.    shutBasicScrDone = *
  720.    ;** shutdown system
  721.    jsr aceShutdown
  722.    ;** return to basic
  723.    bit exitScr
  724.    bpl +
  725.    lda #147
  726.    jsr kernelChrout
  727. +  lda #bkKernel
  728.    sta bkSelect
  729.    cld
  730.    cli
  731. .if computer-64
  732.    lda #0
  733.    sta $f8
  734.    sta $f9
  735.    lda #$16
  736.    sta 2604
  737.    sta $d018
  738.    lda #0
  739.    sta $1c00
  740.    sta 208
  741.    jsr $51d6
  742.    jmp $4db7
  743. .else
  744.    lda #0
  745.    sta $800
  746.    sta 198
  747.    jsr $a642
  748.    jmp $a474
  749. .ife
  750.    brk
  751.  
  752. resetIntDispatch = *  ;for C64 only, RAM0
  753.    ldx #$ff
  754.    sei
  755.    txs
  756.    cld
  757.    lda #bkKernel
  758.    sta bkSelect
  759.    jmp $fce2
  760.  
  761. nmiIntDispatch = *  ;for C64 only, RAM0
  762.    sei
  763.  
  764. nmiHandler = *
  765. .if computer-64
  766.    cld
  767.    lda #bkACE
  768.    sta bkSelect
  769. nmiSlot1 = *
  770.    jsr slInterrupt
  771.    bcc +
  772. nmiContinue = *
  773.    lda #$7f
  774.    sta $dd0d
  775.    ldy $dd0d
  776.    bmi +
  777.    lda #$7f
  778.    sta $dc00
  779.    lda $ff
  780.    sta $d02f
  781. -  lda $dc01
  782.    cmp $dc01
  783.    bne -
  784.    and #$80
  785.    bmi +
  786.    jsr aceShutdown
  787.    ;jsr shutdownMemory
  788.    ;lda #147
  789.    ;jsr kernelChrout
  790.    ;jmp aceShutdownBasic
  791.    jsr $e056
  792.    jsr $e109
  793.    jsr $c000
  794.    lda #0
  795.    sta $1c00
  796.    lda #bkKernel
  797.    sta bkSelect
  798.    jsr $51d6
  799.    jmp ($0a00)
  800. +  jmp $ff33
  801. .else
  802.    cld
  803.    pha
  804.    txa
  805.    pha
  806.    tya
  807.    pha
  808.    lda bkSelect
  809.    pha
  810.    lda #bkKernel
  811.    sta bkSelect
  812. nmiSlot1 = *
  813.    jsr slInterrupt
  814.    bcc +
  815. nmiContinue = *
  816.    lda #$7f
  817.    sta $dd0d
  818.    ldy $dd0d
  819.    bmi +
  820.    lda #$7f
  821.    sta $dc00
  822. -  lda $dc01
  823.    cmp $dc01
  824.    bne -
  825.    and #$80
  826.    bmi +
  827.    jsr aceShutdown
  828.    jsr $fd15
  829.    jsr $fda3
  830.    jsr $e518
  831.    lda #0
  832.    sta $800
  833.    jsr $a642
  834.    jmp ($a002)
  835. +  pla
  836.    sta bkSelect
  837.    pla
  838.    tay
  839.    pla
  840.    tax
  841.    pla
  842.    rti
  843. .ife
  844.  
  845. ;*** extra-lean SwiftLink interrupt handler; the NMI vector points here;
  846. ;***  for the C128 only; for swiftlink at $DE00 only
  847.  
  848. leanBase    = $de00
  849. leanTail    = $ca
  850. leanHead    = $cb
  851. leanFreeCnt = $ce
  852. leanStopped = $cf
  853. .if computer-64
  854. leanBuffer  .buf 256 ;this needs to be on the Commodore Kernal bank
  855. .else
  856. leanBuffer  .buf 1  ;can't use on C64; don't want to waste 256 bytes
  857. .ife
  858. leanRtsOff  .buf 1  ;must be non-zero (DTR,ints active)
  859.  
  860. nmiSwiftlinkLeanInterrupt = *
  861. -  lda leanBase+$1 ;(5*) ;status
  862.    and #$08        ;(2)
  863.    beq leanNot     ;(2*)
  864.    lda leanBase+$0 ;(5*) ;data
  865.    ldy leanTail    ;(3)
  866.    ldx leanFreeCnt ;(3)
  867.    beq +           ;(2*)
  868.    sta leanBuffer,y ;(5)
  869.    inc leanTail    ;(5)
  870.    dec leanFreeCnt ;(5)
  871.    cpx #9          ;(2)
  872.    bcs +           ;(3*)
  873.    lda leanRtsOff  ;(4)
  874.    sta leanBase+$2 ;(5*) ;command
  875.    sta leanStopped ;(3)
  876. +  jmp $ff33       ;(3)   ;;remove this for no-edge recovery
  877.  
  878.    lda leanBase+$1 ;(5*) ;status
  879.    and #$08        ;(2)
  880.    bne -           ;(2*)
  881.    jmp $ff33       ;(3)
  882.  
  883. ;timing: normal=54+74=128 cycles, assertFlow=65+74=139 cycles, 177 cycles avail
  884. ;
  885. ;NMI overhead=74 cycles: int=8, maxLatency=7, ROMenter=33, ROMexit=26
  886.  
  887. leanNot = *
  888.    cld
  889.    lda #bkACE
  890.    sta bkSelect
  891.    jmp nmiContinue
  892.  
  893. aceIrqInit = *
  894.    php
  895.    sei
  896. .if computer-64
  897. .else
  898.    ldx #5
  899. -  lda c64IntVecs,x
  900.    sta $fffa,x
  901.    dex
  902.    bpl -
  903. .ife
  904.    lda #<irqHandler
  905.    ldy #>irqHandler
  906.    sta $314
  907.    sty $315
  908. .if computer-64
  909.    ;xx on the C128, we must use the VIC raster interrupt as the timer
  910.    lda vic+$11
  911.    and #$7f
  912.    sta vic+$11
  913.    lda #252
  914.    sta vic+$12
  915. .else
  916.    ;** use CIA1 timer A to generate 60-Hz IRQ on the C64
  917.    lda #<17045  ;1_022_727 / 60 for NTSC
  918.    ldy #>17045
  919.    ldx configBuf+$c7
  920.    beq +
  921.    lda #<16421  ;985_248 / 60 for PAL
  922.    ldy #>16421
  923. +  sta $dc04
  924.    sty $dc05
  925.    lda $dc0e
  926.    and #%10000000
  927.    ora #%00010001
  928.    sta $dc0e
  929. .ife
  930.    ldx #3
  931. -  lda #$00
  932.    sta jiffyCount,x
  933.    dex
  934.    bpl -
  935.    plp
  936.    rts
  937.  
  938. c64IntVecs = *
  939.    .word nmiIntDispatch,resetIntDispatch,irqIntDispatch
  940.  
  941. irqIntDispatch = *  ;for C64 only, RAM0
  942.    pha
  943.    txa
  944.    pha
  945.    tya
  946.    pha
  947.    lda bkSelect
  948.    pha
  949.    lda #bkKernel
  950.    sta bkSelect
  951.    cld
  952.    tsx
  953.    lda $0105,x
  954.    and #$10
  955.    beq irqHandlerInt64
  956.    jmp brkHandler
  957.  
  958. irqHandler = *  ;(.AXY already saved, 128 bank)
  959.    cld
  960. .if computer-64
  961. .else
  962.    lda bkSelect
  963.    pha
  964. .ife
  965.    irqHandlerInt64 = *
  966.    lda #bkACE
  967.    sta bkSelect
  968. .if computer-64
  969.    lda vic+$19
  970.    bpl +
  971.    and #$01
  972.    beq +
  973.    sta vic+$19
  974.    jmp sixty
  975. .else
  976.    lda $dc0d
  977.    bpl +
  978.    and #$01
  979.    bne sixty
  980. .ife
  981. +  jmp irqExit
  982.  
  983. sixty = *
  984.    inc jiffyCount+0
  985.    bne +
  986.    inc jiffyCount+1
  987.    bne +
  988.    inc jiffyCount+2
  989.    bne +
  990.    inc jiffyCount+3
  991. +  jsr conScreenSave
  992.    jsr vicIrqCursor
  993.    jsr vdcIrqCursor
  994.    jsr conIrqKeyscan
  995.    jmp irqExit
  996.  
  997. .if computer-64
  998. irqExit = $ff33
  999. .else
  1000. irqExit = *
  1001.    pla
  1002.    sta bkSelect
  1003.    pla
  1004.    tay
  1005.    pla
  1006.    tax
  1007.    pla
  1008.    rti
  1009. .ife
  1010.  
  1011. brkHandler = *
  1012.    cld
  1013.    ldx #0
  1014. -  lda $00,x
  1015.    sta $0400,x
  1016.    dex
  1017.    bne -
  1018.    jsr aceShutdown
  1019. .if computer-64
  1020.    lda #0
  1021.    sta $1c00
  1022.    ;jsr $51d6
  1023. .else
  1024.    lda #0
  1025.    sta $800
  1026.    jsr $a642
  1027. .ife
  1028.    jmp kernelBrkHandler
  1029.  
  1030. stopHandler = *
  1031.    lda #$ff
  1032.    rts
  1033.  
  1034. .seq acecall.s
  1035. .seq acemem.s
  1036. .seq acewin.s
  1037. .if computer-64
  1038.    .seq acevdc.s
  1039.    aceVicColorOff .byte $b8
  1040.    .seq acevic.s
  1041. .else
  1042.    .seq acevic80.s
  1043.    aceVicColorOff .byte $d8
  1044.    .seq acevic.s
  1045. .ife
  1046. .seq acecon.s
  1047. .seq acerd.s
  1048. .seq aceswift.s
  1049. .seq acepar.s
  1050.  
  1051. ;*** main()
  1052.  
  1053. bootDevice .buf 1
  1054. titlePtr   .buf 2
  1055. titleLen   .buf 2
  1056. exitScr    .byte 0
  1057.  
  1058. main = *
  1059.    lda 186
  1060.    sta bootDevice
  1061.    lda #147
  1062.    jsr kernelChrout
  1063.    lda #14
  1064.    jsr kernelChrout
  1065.    ldx #0
  1066. -  lda aceStartupMsg,x
  1067.    beq +
  1068.    jsr kernelChrout
  1069.    inx
  1070.    bne -
  1071. +  sei
  1072.    jsr aceBootstrap
  1073.    jsr initMemory
  1074.    jsr aceConfig
  1075.    bcc +
  1076.    jmp configErrMainExit
  1077. +  lda 2
  1078.    ldy 3
  1079.    sta titlePtr+0
  1080.    sty titlePtr+1
  1081.    lda 4
  1082.    ldy 5
  1083.    sta titleLen+0
  1084.    sty titleLen+1
  1085.    jsr aceIrqInit
  1086.    jsr aceStartup
  1087.    jsr initMemoryAlloc
  1088.    sei
  1089.    jsr screenInit
  1090.    jsr conInit
  1091.    lda #$ff
  1092.    sta exitScr
  1093.    jsr devTableInit
  1094.    jsr rdInit
  1095.    jsr parInit
  1096.    jsr slInit
  1097. .if computer-64
  1098.    lda #$01
  1099.    sta vic+$1a     ;enable VIC raster IRQ on C128
  1100. .else
  1101.    bit $dc0d
  1102.    lda #%10000001  ;enable 60-Hz IRQ on C64
  1103.    sta $dc0d
  1104. .ife
  1105.    cli
  1106.    lda titlePtr+0
  1107.    ldx titlePtr+1
  1108.    inx
  1109.    inx
  1110.    sta syswork+0
  1111.    stx syswork+1
  1112.    ldy #5
  1113.    lda (syswork+0),y
  1114.    tay
  1115.    clc
  1116.    lda syswork+0
  1117.    adc #8
  1118.    bcc +
  1119.    inx
  1120. +  sta syswork+0
  1121.    stx syswork+1
  1122.    lda #%11100000
  1123.    cpy #$00
  1124.    beq +
  1125.    ora #%00010000
  1126. +  ldx #$00
  1127.    ldy #40
  1128.    jsr conChrset
  1129.    clc
  1130.    lda syswork+0
  1131.    adc #40
  1132.    sta syswork+0
  1133.    bcc +
  1134.    inc syswork+1
  1135. +  lda #%10001010
  1136.    ldx #$00
  1137.    ldy #0
  1138.    jsr conChrset
  1139.    clc
  1140.    lda syswork+1
  1141.    adc #>2048
  1142.    sta syswork+1
  1143.    lda #%10000110
  1144.    ldx #$00
  1145.    ldy #0
  1146.    jsr conChrset
  1147.  
  1148.    ;** open std files
  1149.    lda #<configBuf+$100
  1150.    ldy #>configBuf+$100
  1151.    sta zp+0
  1152.    sty zp+1
  1153.    lda #$00
  1154.    jsr internDirChange
  1155.    lda #<stdinName
  1156.    ldy #>stdinName
  1157.    sta zp+0
  1158.    sty zp+1
  1159.    lda #"r"
  1160.    jsr internOpen  ;fcb=0
  1161.    lda #<stdoutName
  1162.    ldy #>stdoutName
  1163.    sta zp
  1164.    sty zp+1
  1165.    lda #"w"
  1166.    jsr internOpen   ;fcb=1
  1167.    lda #"w"
  1168.    jsr internOpen   ;fcb=2
  1169.    lda titlePtr+0
  1170.    ldy titlePtr+1
  1171.    sta zp+0
  1172.    sty zp+1
  1173.    lda titleLen+0
  1174.    ldy titleLen+1
  1175.    ldx #stdout
  1176.    jsr internWrite
  1177.    cli
  1178.  
  1179.    ;** call shell
  1180.    lda aceMemTop+0
  1181.    ldy aceMemTop+1
  1182.    sec
  1183.    sbc #13
  1184.    bcs +
  1185.    dey
  1186. +  sta zw+0
  1187.    sty zw+1
  1188.    ldy #12
  1189. -  lda startupArgs,y 
  1190.    sta (zw),y
  1191.    dey
  1192.    bpl -
  1193.    ldy #0
  1194.    clc
  1195.    lda zw+0
  1196.    adc #6
  1197.    sta (zw),y
  1198.    iny
  1199.    lda zw+1
  1200.    adc #0
  1201.    sta (zw),y
  1202.    iny
  1203.    clc
  1204.    lda zw+0
  1205.    adc #9
  1206.    sta (zw),y
  1207.    iny
  1208.    lda zw+1
  1209.    adc #0
  1210.    sta (zw),y
  1211.    lda #<shellName
  1212.    ldy #>shellName
  1213.    sta zp+0
  1214.    sty zp+1
  1215.    lda #2
  1216.    ldy #0
  1217.    jsr internProcExec
  1218.    lda #$00
  1219.    bcc +
  1220.    lda errno
  1221. +  sta 1021
  1222.  
  1223.    ;** exit
  1224.    lda #stdin
  1225.    jsr internClose
  1226.    lda #stdout
  1227.    jsr internClose
  1228.    lda #stderr
  1229.    jsr internClose
  1230.    lda #chrCLS
  1231.    jsr conPutchar
  1232.    configErrMainExit = *
  1233.    lda bootDevice
  1234.    sta 186
  1235.    jsr slShutdown
  1236.    jsr shutdownMemory
  1237.    jmp aceShutdownBasic
  1238.  
  1239. stdoutName .asc "s:"
  1240.            .byte 0
  1241. stdinName  .asc "k:"
  1242.            .byte 0
  1243.  
  1244. startupArgs .byte 0,0,0,0,0,0,"s","h",0,"-","v","i",0
  1245. shellName .byte "s","h",0
  1246.    
  1247. aceStartupMsg = *
  1248. .if computer-64
  1249.    .asc "ACE-128 "
  1250. .else
  1251.    .asc "ACE-64  "
  1252. .ife
  1253.    .asc "Kernel 0.98 - by CSB 17-Dec-95"
  1254.    .byte chrCR,chrCR,0
  1255.  
  1256. ;*** bss: c128=512 bytes, c64=0 bytes
  1257.  
  1258. aceBss = *
  1259. .if computer-64
  1260.    charset4bit  = aceBss+0        ;(0 bytes)
  1261.    basicZpSave  = aceBss+0        ;("maxZpUse" bytes)
  1262.    deviceTable  = basicZpSave+maxZpUse  ;(256 bytes)
  1263.    workbuf      = deviceTable+256 ;(256 bytes)
  1264.    pageC0Save   = workbuf+256     ;(256 bytes)
  1265.    aceBssEnd    = pageC0Save+256
  1266. .else
  1267.    aceBssEnd    = aceBss+0
  1268. .ife
  1269. acecall.s
  1270. 2046
  1271. ;*** ACE Kernel main file/dir/other system calls
  1272.  
  1273. ;====== file calls ======
  1274.  
  1275. ;*** open( zp=filenameZ, .A=mode["r","w","a","W","A"] ) : .A=fcb
  1276.  
  1277. aceOpenOverwrite = *
  1278.    lda #"w"
  1279.    jsr open
  1280.    bcs +
  1281.    rts
  1282. +  ldy errno
  1283.    cpy #aceErrFileExists
  1284.    beq +
  1285.    sec
  1286.    rts
  1287. +  jsr internRemove
  1288.    bcs +
  1289.    lda #"w"
  1290.    jsr open
  1291. +  rts
  1292.  
  1293. aceOpenForceAppend = *
  1294.    lda #"a"
  1295.    jsr open
  1296.    bcs +
  1297.    rts
  1298. +  ldy errno
  1299.    cpy #aceErrFileNotFound
  1300.    beq +
  1301.    sec
  1302.    rts
  1303. +  lda #"w"
  1304.    jsr open
  1305.    rts
  1306.  
  1307. openFcb      = syswork+0
  1308. openNameScan = syswork+1
  1309. openMode     = syswork+2
  1310. openNameLength = syswork+3
  1311. openDevice   = syswork+4
  1312. checkStat .buf 1
  1313.  
  1314. kernFileOpen = *
  1315. internOpen = *
  1316.    sta openMode
  1317.    cmp #"W"
  1318.    bne +
  1319.    jmp aceOpenOverwrite
  1320. +  cmp #"A"
  1321.    bne +
  1322.    jmp aceOpenForceAppend
  1323. +  lda #true
  1324.    sta checkStat
  1325.    jsr getLfAndFcb
  1326.    bcc +
  1327.    rts
  1328. +  sta lftable,x
  1329.    lda #$00
  1330.    sta eoftable,x
  1331.    stx openFcb
  1332.    jsr getDevice
  1333.    sty openNameScan
  1334.    ldx openFcb
  1335.    sta devtable,x
  1336.    sta openDevice
  1337.    tax
  1338.  
  1339.    ;get sa here
  1340.    lda configBuf+0,x
  1341.    cmp #0
  1342.    bne +
  1343.    ldy configBuf+2,x
  1344.    jmp nonDiskSa
  1345. +  ldy #0
  1346.    cmp #1
  1347.    beq openDiskSa
  1348.    ;** check console
  1349.    cmp #2
  1350.    bne +
  1351. -  lda openFcb
  1352.    clc
  1353.    rts
  1354.    ;** check null device
  1355. +  cmp #3
  1356.    beq -
  1357.    ;** check ramdisk device
  1358.    cmp #4
  1359.    bne +
  1360.    jmp rdOpen
  1361.    ;** check parallel port device
  1362. +  cmp #5
  1363.    bne +
  1364.    jmp parOpen
  1365.    ;** check SwiftLink modem device
  1366. +  cmp #6
  1367.    bne +
  1368.    jmp slOpen
  1369.    ;** illegal device
  1370. +  lda #aceErrIllegalDevice
  1371.    sta errno
  1372.    sec
  1373.    rts
  1374.  
  1375.    openDiskSa = *
  1376.    ldy #2
  1377.    diskSaSearch = *
  1378.    ldx #fcbCount-1
  1379. -  lda lftable,x
  1380.    bmi +
  1381.    lda devtable,x
  1382.    cmp openDevice
  1383.    bne +
  1384.    tya
  1385.    cmp satable,x
  1386.    bne +
  1387.    iny
  1388.    bne diskSaSearch
  1389. +  dex
  1390.    bpl -
  1391.  
  1392.    nonDiskSa = *
  1393.    ldx openFcb
  1394.    tya
  1395.    sta satable,x
  1396.  
  1397.    ;set the name
  1398.    ldx #0
  1399.    ldy openNameScan
  1400. -  lda (zp),y
  1401.    sta stringBuffer,x
  1402.    beq +
  1403.    iny
  1404.    inx
  1405.    bne -
  1406. +  ldy openDevice
  1407.    lda configBuf+0,y
  1408.    cmp #1
  1409.    bne nonDiskOpen
  1410.    ;** stick the mode for disk files
  1411.    cpx #0
  1412.    bne +
  1413.    lda #aceErrOpenDirectory
  1414.    sec
  1415.    rts
  1416. +  lda #","
  1417.    sta stringBuffer,x
  1418.    inx
  1419.    lda openMode
  1420.    sta stringBuffer,x
  1421.    inx
  1422.    jmp openGotName
  1423.  
  1424.    ;** get rid of the filename for non-disks
  1425.    nonDiskOpen = *
  1426.    ldx #0
  1427.  
  1428.    openGotName = *
  1429.    ;** dispatch here for non-kernel devices
  1430.    txa
  1431.    ldx #<stringBuffer
  1432.    ldy #>stringBuffer
  1433.    jsr kernelSetnam
  1434.  
  1435.    ;set lfs
  1436.    ldx openFcb
  1437.    lda lftable,x
  1438.    pha
  1439.    lda satable,x
  1440.    tay
  1441.    lda devtable,x
  1442.    tax
  1443.    lda configBuf+1,x
  1444.    tax
  1445.    pla
  1446.    jsr kernelSetlfs
  1447.  
  1448.    ;do the open
  1449.    jsr kernelOpen
  1450.    bcs openError
  1451. +  ldx openDevice
  1452.    lda configBuf+0,x
  1453.    cmp #1
  1454.    bne +
  1455.    lda checkStat
  1456.    beq +
  1457.    txa
  1458.    jsr openDiskStatus
  1459.    bcc +
  1460.  
  1461.    openError = *
  1462.    sta errno
  1463.    ldx openFcb
  1464.    lda lftable,x
  1465.    clc
  1466.    jsr kernelClose
  1467.    ldx openFcb
  1468.    lda #lfnull
  1469.    sta lftable,x
  1470.    sec
  1471.    lda #fcbNull
  1472.    rts
  1473. +  lda openFcb
  1474.    clc
  1475.    rts
  1476.  
  1477. openDiskStatus = *  ;( .A=device ) : errno=.A=errcode, .CS=errflag
  1478.    jsr cmdchOpen
  1479.    bcs +
  1480.    jsr checkDiskStatus
  1481.    php
  1482.    pha
  1483.    jsr cmdchClose
  1484.    pla
  1485.    plp
  1486. +  rts
  1487.  
  1488. cmdchOpen = *  ;( .A=device )
  1489.    pha
  1490.    jsr cmdchClose
  1491.    pla
  1492.    tax
  1493.    lda configBuf+1,x
  1494.    tax
  1495.    ldy #15
  1496.    lda #lfnull
  1497.    jsr kernelSetlfs
  1498.    lda #0
  1499.    jsr kernelSetnam
  1500.    jsr kernelOpen
  1501.    bcc +
  1502.    sta errno
  1503. +  rts
  1504.  
  1505. cmdchSend = *  ;( stringBuffer )
  1506.    ldx #lfnull
  1507.    jsr kernelChkout
  1508.    bcs cmdchErr
  1509.    ldx #0
  1510. -  lda stringBuffer,x
  1511.    beq +
  1512.    jsr kernelChrout
  1513.    bcs cmdchErr
  1514.    inx
  1515.    bne -
  1516. +  jsr kernelClrchn
  1517.    clc
  1518.    rts
  1519.  
  1520.    cmdchErr = *
  1521.    sta errno
  1522.    pha
  1523.    jsr kernelClrchn
  1524.    pla
  1525.    sec
  1526.    rts
  1527.  
  1528. checkDiskStatusCode .buf 1
  1529.  
  1530. checkDiskStatus = *
  1531.    ldx #lfnull
  1532.    jsr kernelChkin
  1533.    bcs cmdchErr
  1534.    jsr kernelChrin
  1535.    bcs cmdchErr
  1536.    and #$0f
  1537.    sta checkDiskStatusCode
  1538.    asl
  1539.    asl
  1540.    adc checkDiskStatusCode
  1541.    asl
  1542.    sta checkDiskStatusCode
  1543.    jsr kernelChrin
  1544.    bcs cmdchErr
  1545.    and #$0f
  1546.    clc
  1547.    adc checkDiskStatusCode
  1548.    sta checkDiskStatusCode
  1549. -  jsr kernelReadst
  1550.    and #$80
  1551.    beq +
  1552.    lda #aceErrDeviceNotPresent
  1553.    sec
  1554.    bcs cmdchErr
  1555. +  jsr kernelChrin
  1556.    bcs cmdchErr
  1557.    cmp #chrCR
  1558.    bne -
  1559.    jsr kernelClrchn
  1560.    lda checkDiskStatusCode
  1561.    cmp #62
  1562.    bne +
  1563.    lda #aceErrFileNotFound
  1564.    sta errno
  1565.    sec
  1566.    rts
  1567. +  cmp #20
  1568.    bcc +
  1569.    sta errno
  1570. +  rts
  1571.  
  1572. cmdchClose = *
  1573.    sec
  1574.    lda #lfnull
  1575.    jsr kernelClose
  1576.    bcc +
  1577.    sta errno
  1578. +  rts
  1579.  
  1580. ;*** close( .A=fcb )
  1581.  
  1582. closeFd .buf 1
  1583.  
  1584. kernFileClose = *
  1585. aceClose = *
  1586. internClose = *
  1587.    tax
  1588.    lda pidtable,x
  1589.    cmp aceProcessID
  1590.    beq +
  1591.    clc
  1592.    rts
  1593. +  ldy devtable,x
  1594.    stx closeFd
  1595.    lda configBuf+0,y
  1596.    cmp #2
  1597.    bne +
  1598.    jmp closeFdEntry
  1599. +  cmp #3
  1600.    bne +
  1601.    jmp closeFdEntry
  1602. +  cmp #4
  1603.    bne +
  1604.    jsr rdClose
  1605.    jmp closeFdEntry
  1606. +  cmp #5
  1607.    bne +
  1608.    jmp parClose
  1609. +  cmp #6
  1610.    bne +
  1611.    jmp slClose
  1612. +  ldx closeFd
  1613.    lda lftable,x
  1614.    jsr kernelClose
  1615.  
  1616.    closeFdEntry = *
  1617.    ldx closeFd
  1618.    lda #lfnull
  1619.    sta lftable,x
  1620.    clc
  1621.    rts
  1622.  
  1623. ;*** read( .X=fcb, (zp)=data, .AY=maxLength ) : .AY=(zw)=length, .Z=eof
  1624.  
  1625. readMaxLen     = syswork+0
  1626. readPtr        = syswork+2
  1627. readLength     = syswork+4
  1628. readFcb        = syswork+6
  1629. readDeviceDisk = syswork+7
  1630.  
  1631. kernFileRead = *
  1632.    sta readMaxLen+0
  1633.    sty readMaxLen+1
  1634.    stx readFcb
  1635.    lda zp+0
  1636.    ldy zp+1
  1637.    sta readPtr+0
  1638.    sty readPtr+1
  1639.    lda #0
  1640.    sta readLength+0
  1641.    sta readLength+1
  1642.    lda eoftable,x
  1643.    beq +
  1644.    jmp readEofExit
  1645. +  ldy #0
  1646.    lda devtable,x
  1647.    tax
  1648.    lda configBuf+0,x
  1649.    cmp #4
  1650.    bne +
  1651.    jmp rdRead
  1652. +  cmp #5
  1653.    bne +
  1654.    jmp parRead
  1655. +  cmp #6
  1656.    bne +
  1657.    jmp slRead
  1658. +  cmp #2
  1659.    bne +
  1660.    lda readMaxLen+0
  1661.    ldy readMaxLen+1
  1662.    ldx readFcb
  1663.    jmp conRead
  1664. +  cmp #3
  1665.    bne +
  1666.    lda #0
  1667.    ldy #0
  1668.    sta zw+0
  1669.    sty zw+1
  1670.    clc
  1671.    rts
  1672. +  cmp #1
  1673.    bne +
  1674.    ldy #$ff
  1675. +  ldx readFcb
  1676.    sty readDeviceDisk
  1677.    lda lftable,x
  1678.    tax
  1679.    jsr kernelChkin
  1680.    bcc readByte
  1681.    sta errno
  1682.    rts
  1683.    
  1684.    readByte = *
  1685.    lda readLength+0
  1686.    cmp readMaxLen+0
  1687.    lda readLength+1
  1688.    sbc readMaxLen+1
  1689.    bcs readExit
  1690.    jsr kernelChrin
  1691.    ldy #0
  1692.    sta (readPtr),y
  1693.    inc readPtr+0
  1694.    bne +
  1695.    inc readPtr+1
  1696. +  inc readLength+0
  1697.    bne +
  1698.    inc readLength+1
  1699. +  bit readDeviceDisk
  1700.    bpl readByte
  1701.    lda st
  1702.    and #$40
  1703.    beq readByte
  1704.    ldx readFcb
  1705.    sta eoftable,x
  1706.  
  1707.    readExit = *
  1708.    jsr kernelClrchn
  1709.    readExitNoclr = *
  1710.    lda readLength+0
  1711.    ldy readLength+1
  1712.    sta zw+0
  1713.    sty zw+1
  1714.    ldx #$ff
  1715.    clc
  1716.    rts
  1717.  
  1718.    readEofExit = *
  1719.    lda #0
  1720.    ldy #0
  1721. +  sta zw+0
  1722.    sty zw+1
  1723.    clc
  1724.    rts
  1725.  
  1726. ;*** write( .X=fcb, (zp)=data, .AY=length )
  1727.  
  1728. writeLength = syswork+0
  1729. writePtr    = syswork+2
  1730.  
  1731. kernFileWrite = *
  1732. internWrite = *
  1733.    sta writeLength+0
  1734.    sty writeLength+1
  1735.    lda zp+0
  1736.    ldy zp+1
  1737.    sta writePtr+0
  1738.    sty writePtr+1
  1739.    stx regsave+1
  1740.    lda devtable,x
  1741.    tax
  1742.    lda configBuf+0,x
  1743.    ;** check ramdisk
  1744.    cmp #4
  1745.    bne +
  1746.    jmp rdWrite
  1747.    ;** check parallel port
  1748. +  cmp #5
  1749.    bne +
  1750.    jmp parWrite
  1751.    ;** check SwiftLink modem
  1752. +  cmp #6
  1753.    bne +
  1754.    jmp slWrite
  1755.    ;** check console
  1756. +  cmp #2
  1757.    bne +
  1758.    lda writeLength+0
  1759.    ldy writeLength+1
  1760.    ldx regsave+1
  1761.    jmp conWrite
  1762.    ;** check null device
  1763. +  cmp #3
  1764.    bne +
  1765.    clc
  1766.    rts
  1767. +  ldx regsave+1
  1768.    lda lftable,x
  1769.    tax
  1770.    jsr kernelChkout
  1771.    bcc writeByte
  1772.    rts
  1773.  
  1774.    writeByte = *
  1775.    lda writeLength+0
  1776.    ora writeLength+1
  1777.    beq writeFinish
  1778.    ldy #0
  1779.    lda (writePtr),y
  1780.    jsr kernelChrout
  1781.    bcc +
  1782.    sta errno
  1783.    jsr kernelClrchn
  1784.    sec
  1785.    rts
  1786. +  inc writePtr+0
  1787.    bne +
  1788.    inc writePtr+1
  1789. +  lda writeLength+0
  1790.    bne +
  1791.    dec writeLength+1
  1792. +  dec writeLength+0
  1793.    jmp writeByte
  1794.    
  1795.    writeFinish = *
  1796.    jsr kernelClrchn
  1797.    clc
  1798.    rts
  1799.  
  1800. ;*** aceFileLseek( ... ) : ...
  1801.  
  1802. kernFileLseek = *
  1803.    lda #aceErrNotImplemented
  1804.    sta errno
  1805.    sec
  1806.    rts
  1807.  
  1808. ;*** aceFileRemove( (zp)=Name )
  1809.  
  1810. removeDevice = syswork
  1811.  
  1812. kernFileRemove = *
  1813. internRemove = *
  1814.    jsr getDiskDevice
  1815.    bcc +
  1816.    rts
  1817. +  sta removeDevice
  1818.    cpx #4
  1819.    bne +
  1820.    jmp rdRemove
  1821. +  lda #"s"
  1822.    sta stringBuffer
  1823.    lda #":"
  1824.    sta stringBuffer+1
  1825.    ldx #1
  1826.    lda (zp),y
  1827.    cmp #"/"
  1828.    beq +
  1829.    ldx #2
  1830. /  lda (zp),y
  1831.    sta stringBuffer,x
  1832.    beq +
  1833.    iny
  1834.    inx
  1835.    bne -
  1836. +  lda #0
  1837.    sta stringBuffer,x
  1838.    lda removeDevice
  1839.    jsr cmdchOpen
  1840.    bcs ++
  1841.    jsr cmdchSend
  1842.    bcs +
  1843.    jsr checkDiskStatus
  1844. +  php
  1845.    jsr cmdchClose
  1846.    plp
  1847. +  rts
  1848.  
  1849. ;*** aceFileRename( (zp)=OldName, (zw)=NewName )
  1850. ;*** don't even think about renaming files outside the current directory
  1851.  
  1852. renameDevice = syswork+0
  1853. renameScan   = syswork+1
  1854.  
  1855. kernFileRename = *
  1856.    jsr getDiskDevice
  1857.    bcc +
  1858.    rts
  1859. +  sta renameDevice
  1860.    cpx #4
  1861.    bne +
  1862.    jmp rdRename
  1863. +  sty renameScan
  1864.    lda #"r"
  1865.    sta stringBuffer+0
  1866.    lda #":"
  1867.    sta stringBuffer+1
  1868.    ;** copy new name
  1869.    ldy #0
  1870.    ldx #2
  1871. -  lda (zw),y
  1872.    sta stringBuffer,x
  1873.    beq +
  1874.    iny
  1875.    inx
  1876.    bne -
  1877. +  lda #"="
  1878.    sta stringBuffer,x
  1879.    inx
  1880.    ;** copy old name
  1881.    ldy renameScan
  1882. -  lda (zp),y
  1883.    sta stringBuffer,x
  1884.    beq +
  1885.    inx
  1886.    iny
  1887.    bne -
  1888. +  lda renameDevice
  1889.    jsr cmdchOpen
  1890.    bcs ++
  1891.    jsr cmdchSend
  1892.    bcs +
  1893.    jsr checkDiskStatus
  1894. +  php
  1895.    jsr cmdchClose
  1896.    plp
  1897. +  rts
  1898.  
  1899. ;*** aceFileBload( (zp)=Name, .AY=Address, (zw)=Limit+1 ) : .AY=End+1
  1900.  
  1901. bloadAddress = syswork
  1902. bloadFilename = syswork+2
  1903. bloadDevice = syswork+4
  1904.  
  1905. kernFileBload = *
  1906. internBload = *
  1907.    sta bloadAddress+0
  1908.    sty bloadAddress+1
  1909.    jsr getDevice
  1910.    sta bloadDevice
  1911.    tax
  1912.    clc
  1913.    tya
  1914.    adc zp+0
  1915.    sta bloadFilename+0
  1916.    lda zp+1
  1917.    adc #0
  1918.    sta bloadFilename+1
  1919.    lda configBuf+0,x
  1920.    cmp #4
  1921.    bne +
  1922.    jmp rdBload
  1923. +  cmp #1
  1924.    beq +
  1925.    lda #aceErrIllegalDevice
  1926.    sta errno
  1927.    sec
  1928.    rts
  1929. +  lda configBuf+1,x
  1930.    tax
  1931.    lda #0
  1932.    ldy #0
  1933.    jsr kernelSetlfs
  1934.    ldy #0
  1935. -  lda (bloadFilename),y
  1936.    beq +
  1937.    iny
  1938.    bne -
  1939. +  tya
  1940.    ldx bloadFilename+0
  1941.    ldy bloadFilename+1
  1942.    jsr kernelSetnam
  1943.    lda #0
  1944.    ldx bloadAddress+0
  1945.    ldy bloadAddress+1
  1946.    jsr kernelLoad
  1947.    stx bloadAddress+0
  1948.    sty bloadAddress+1
  1949.    bcc bloadOk
  1950.    pha
  1951.    cmp #aceErrDeviceNotPresent
  1952.    beq +
  1953.    ldx bloadDevice
  1954.    lda configBuf+0,x
  1955.    cmp #1
  1956.    bne +
  1957.    txa
  1958.    jsr openDiskStatus
  1959. +  pla
  1960. -  sta errno
  1961.    lda #0
  1962.    ldx #0
  1963.    ldy #0
  1964.    sec
  1965.    rts
  1966.  
  1967.    bloadOk = *
  1968.    ldx bloadDevice
  1969.    lda configBuf+0,x
  1970.    cmp #1
  1971.    bne +
  1972.    txa
  1973.    jsr openDiskStatus
  1974.    bcs -
  1975. +  lda bloadAddress+0
  1976.    ldy bloadAddress+1
  1977.    rts
  1978.  
  1979. ;*** aceFileInfo( .X=Fcb ) : .A=DevType(0=con,1=char,2=disk), .X=Cols, .Y=Rows
  1980.  
  1981. kernFileInfo = *
  1982.    lda devtable,x
  1983.    tax
  1984.    lda configBuf+0,x
  1985.    cmp #2
  1986.    bne +
  1987.    jsr kernWinSize
  1988.    tay
  1989.    lda #0
  1990.    rts
  1991.  
  1992. +  ldx #80
  1993.    ldy #66
  1994.    cmp #1
  1995.    beq +
  1996.    cmp #4
  1997.    beq +
  1998.    lda #1
  1999.    rts
  2000. +  lda #2
  2001.    rts
  2002.  
  2003. ;*** aceFileStat( ... ) : ...
  2004.  
  2005. kernFileStat = *
  2006.    lda #aceErrNotImplemented
  2007.    sta errno
  2008.    sec
  2009.    rts
  2010.  
  2011. ;*** aceFileIoctl( ... ) : ...
  2012.  
  2013. kernFileIoctl = *
  2014.    lda #aceErrNotImplemented
  2015.    sta errno
  2016.    sec
  2017.    rts
  2018.  
  2019. ;*** aceFileFdswap( .X=Fcb1, .Y=Fcb2 )
  2020.  
  2021. kernFileFdswap = *
  2022.    lda lftable,x
  2023.    pha
  2024.    lda lftable,y
  2025.    sta lftable,x
  2026.    pla
  2027.    sta lftable,y
  2028.    lda devtable,x
  2029.    pha
  2030.    lda devtable,y
  2031.    sta devtable,x
  2032.    pla
  2033.    sta devtable,y
  2034.    lda satable,x
  2035.    pha
  2036.    lda satable,y
  2037.    sta satable,x
  2038.    pla
  2039.    sta satable,y
  2040.    lda eoftable,x
  2041.    pha
  2042.    lda eoftable,y
  2043.    sta eoftable,x
  2044.    pla
  2045.    sta eoftable,y
  2046.    lda pidtable,x
  2047.    pha
  2048.    lda pidtable,y
  2049.    sta pidtable,x
  2050.    pla
  2051.    sta pidtable,y
  2052.    txa
  2053.    asl
  2054.    asl
  2055.    asl
  2056.    asl
  2057.    tax
  2058.    tya
  2059.    asl
  2060.    asl
  2061.    asl
  2062.    asl
  2063.    tay
  2064.    lda #16
  2065.    sta syswork+15
  2066. -  lda fcbTable1,x
  2067.    pha
  2068.    lda fcbTable1,y
  2069.    sta fcbTable1,x
  2070.    pla
  2071.    sta fcbTable1,y
  2072.    inx
  2073.    iny
  2074.    dec syswork+15
  2075.    bne -
  2076.    clc
  2077.    rts
  2078.  
  2079. ;====== directory calls ======
  2080.  
  2081. ;*** aceDirOpen( (zp)=deviceName ) : .A=fcb
  2082.  
  2083. kernDirOpen = *
  2084.    lda #true
  2085.    sta checkStat
  2086.    jsr getDiskDevice
  2087.    bcc +
  2088.    rts
  2089. +  sta openDevice
  2090.    sty openNameScan
  2091.    jsr getLfAndFcb
  2092.    bcc +
  2093.    rts
  2094. +  sta lftable,x
  2095.    lda openDevice
  2096.    sta devtable,x
  2097.    lda #0
  2098.    sta eoftable,x
  2099.    lda #0
  2100.    sta satable,x
  2101.    stx openFcb
  2102.    ldx openDevice
  2103.    lda configBuf+0,x
  2104.    cmp #4
  2105.    bne +
  2106.    jmp rdDirOpen
  2107. +  lda #"$"
  2108.    sta stringBuffer+0
  2109.    lda #"0"
  2110.    sta stringBuffer+1
  2111.    lda #0
  2112.    sta stringBuffer+2
  2113.    ldx #2
  2114.    jsr dirOpenSetName
  2115.    jsr openGotName
  2116.    bcc +
  2117.    rts
  2118. +  ldx openFcb
  2119.    lda lftable,x
  2120.    tax
  2121.    jsr kernelChkin
  2122.    jsr kernelChrin
  2123.    jsr kernelChrin
  2124.    jsr kernelClrchn
  2125.    lda openFcb
  2126.    clc
  2127.    rts
  2128.  
  2129.    dirOpenSetName = *
  2130.    ldy openDevice
  2131.    lda configBuf+3,y
  2132.    bmi dirNameDate
  2133.    ldy openNameScan
  2134.    lda (zp),y
  2135.    bne +
  2136.    rts
  2137. +  ldx #1
  2138.  
  2139.    dirNameNormal = *
  2140. -  lda (zp),y
  2141.    sta stringBuffer,x
  2142.    beq +
  2143.    iny
  2144.    inx
  2145.    bne -
  2146. +  dex
  2147.    lda #":"
  2148.    cmp stringBuffer,x
  2149.    beq +
  2150.    inx
  2151.    sta stringBuffer,x
  2152. +  inx
  2153.    lda #"*"
  2154.    sta stringBuffer,x
  2155.    inx
  2156.    lda #0
  2157.    sta stringBuffer,x
  2158.    rts
  2159.  
  2160.    dirNameDate = *
  2161.    lda #"="
  2162.    sta stringBuffer+1
  2163.    lda #"t"
  2164.    sta stringBuffer+2
  2165.    ldx #3
  2166.    ldy openNameScan
  2167.    jsr dirNameNormal
  2168.    lda #"="
  2169.    sta stringBuffer,x
  2170.    inx
  2171.    lda #"l"
  2172.    sta stringBuffer,x
  2173.    inx
  2174.    lda #0
  2175.    sta stringBuffer,x
  2176.    rts
  2177.  
  2178. ;*** aceDirClose( ... ) : ...
  2179.  
  2180. kernDirClose = *
  2181.    tax
  2182.    lda pidtable,x
  2183.    cmp aceProcessID
  2184.    beq +
  2185.    clc
  2186.    rts
  2187. +  ldy devtable,x
  2188.    stx closeFd
  2189.    lda configBuf+0,y
  2190.    cmp #4
  2191.    beq +
  2192.    lda closeFd
  2193.    jmp aceClose
  2194. +  jmp rdDirClose
  2195.  
  2196. ;*** aceDirRead( .X=fcb ) : .Z=eof, aceDirentBuffer=data
  2197.  
  2198. dirBlocks = syswork+0
  2199.  
  2200. kernDirRead = *
  2201.    ldy devtable,x
  2202.    lda configBuf+0,y
  2203.    cmp #4
  2204.    bne +
  2205.    jmp rdDirRead
  2206. +  lda lftable,x
  2207.    tax
  2208.    jsr kernelChkin
  2209.    bcc +
  2210.    lda #0
  2211.    rts
  2212.    ;** read the link
  2213. +  jsr kernelChrin
  2214.    sta syswork+4
  2215.    jsr kernelReadst
  2216.    and #$40
  2217.    bne dirreadEofExit
  2218.    jsr kernelChrin
  2219.    ora syswork+4
  2220.    bne +
  2221.  
  2222.    dirreadEofExit = *
  2223.    jsr kernelClrchn
  2224.    ldx #0
  2225.    rts
  2226.    dirreadErrExit = *
  2227.    sta errno
  2228.    jsr kernelClrchn
  2229.    ldx #0
  2230.    sec
  2231.    rts
  2232.  
  2233.    ;** read the block count
  2234. +  jsr kernelChrin
  2235.    sta dirBlocks
  2236.    sta aceDirentBytes+1
  2237.    jsr kernelChrin
  2238.    sta dirBlocks+1
  2239.    sta aceDirentBytes+2
  2240.    asl dirBlocks
  2241.    rol dirBlocks+1
  2242.    lda #0
  2243.    rol
  2244.    sta dirBlocks+2
  2245.    sec
  2246.    lda #0
  2247.    sbc dirBlocks
  2248.    sta aceDirentBytes+0
  2249.    lda aceDirentBytes+1
  2250.    sbc dirBlocks+1
  2251.    sta aceDirentBytes+1
  2252.    lda aceDirentBytes+2
  2253.    sbc dirBlocks+2
  2254.    sta aceDirentBytes+2
  2255.    ;** read the filename
  2256.    lda #0
  2257.    sta aceDirentName
  2258.    sta aceDirentNameLen
  2259. -  jsr kernelChrin
  2260.    bcs dirreadErrExit
  2261.    bit st
  2262.    bvs dirreadErrExit
  2263.    cmp #" "
  2264.    beq -
  2265.    cmp #18
  2266.    beq -
  2267.    cmp #$22
  2268.    bne dirreadExit
  2269.    ldx #0
  2270. -  jsr kernelChrin
  2271.    bcs dirreadErrExit
  2272.    bit st
  2273.    bvs dirreadErrExit
  2274.    cmp #$22
  2275.    beq +
  2276.    sta aceDirentName,x
  2277.    inx
  2278.    bne -
  2279. +  lda #0
  2280.    sta aceDirentName,x
  2281.    stx aceDirentNameLen
  2282. -  jsr kernelChrin
  2283.    cmp #" "
  2284.    beq -
  2285.    ;** read type and flags
  2286.    ldx #%01100000
  2287.    stx aceDirentFlags
  2288.    ldx #%10000000
  2289.    stx aceDirentUsage
  2290.    cmp #"*"
  2291.    bne +
  2292.    lda aceDirentFlags
  2293.    ora #%00001000
  2294.    sta aceDirentFlags
  2295.    jsr kernelChrin
  2296. +  ldx #3
  2297.    ldy #0
  2298.    jmp dirTypeFirst
  2299. -  jsr kernelChrin
  2300.    dirTypeFirst = *
  2301.    sta aceDirentType,y
  2302.    iny
  2303.    dex
  2304.    bne -
  2305.    lda #0
  2306.    sta aceDirentType+3
  2307.    lda aceDirentType
  2308.    cmp #"d"
  2309.    bne +
  2310.    lda aceDirentFlags
  2311.    ora #%10010000
  2312.    sta aceDirentFlags
  2313.    jmp dirreadExit
  2314. +  cmp #"p"
  2315.    bne dirreadExit
  2316.    lda aceDirentFlags
  2317.    ora #%00010000
  2318.    sta aceDirentFlags
  2319.    jmp dirreadExit
  2320.  
  2321.    dirreadExit = *
  2322.    jsr kernelChrin
  2323.    cmp #0
  2324.    bne +
  2325.    jmp dirreadRealExit
  2326. +  cmp #"<"
  2327.    bne +
  2328.    lda aceDirentFlags
  2329.    and #%11011111
  2330.    sta aceDirentFlags
  2331. +  ldx #7
  2332.    lda #0
  2333. -  sta aceDirentDate,x
  2334.    dex
  2335.    bpl -
  2336. -  jsr kernelChrin
  2337.    cmp #0
  2338.    beq dirreadRealExit
  2339.    cmp #"0"
  2340.    bcc -
  2341.    cmp #"9"+1
  2342.    bcs -
  2343.  
  2344.    dirreadDate = *
  2345.    jsr dirGetNumGot
  2346.    bcs dirreadRealExit
  2347.    sta aceDirentDate+2
  2348.    jsr dirGetNum
  2349.    bcs dirreadRealExit
  2350.    sta aceDirentDate+3
  2351.    jsr dirGetNum
  2352.    bcs dirreadRealExit
  2353.    sta aceDirentDate+1
  2354.    ldx #$19
  2355.    cmp #$70
  2356.    bcs +
  2357.    ldx #$20
  2358. +  stx aceDirentDate+0  ;century
  2359.    jsr dirGetNum
  2360.    bcs dirreadRealExit
  2361.    sta aceDirentDate+4
  2362.    jsr dirGetNum
  2363.    bcs dirreadRealExit
  2364.    sta aceDirentDate+5
  2365.    jsr kernelChrin
  2366.    and #$ff
  2367.    beq dirreadRealExit
  2368.    jsr kernelChrin
  2369.    and #$ff
  2370.    beq dirreadRealExit
  2371.    cmp #"a"
  2372.    bne dirreadPM
  2373.  
  2374.    dirreadAM = *
  2375.    lda aceDirentDate+4
  2376.    cmp #$12
  2377.    bne +
  2378.    lda #$00
  2379.    sta aceDirentDate+4
  2380.    jmp +
  2381.  
  2382.    dirreadPM = *
  2383.    lda aceDirentDate+4
  2384.    cmp #$12
  2385.    beq +
  2386.    clc
  2387.    sei
  2388.    sed
  2389.    adc #$12
  2390.    cld
  2391.    cli
  2392.    sta aceDirentDate+4
  2393.  
  2394. /  jsr kernelChrin
  2395.    cmp #0
  2396.    bne -
  2397.  
  2398.    dirreadRealExit = *
  2399.    jsr kernelClrchn
  2400.    ldx #$ff
  2401.    clc
  2402.    rts
  2403.  
  2404.    dirGetNum = *
  2405. -  jsr kernelChrin
  2406.    dirGetNumGot = *
  2407.    cmp #0
  2408.    beq +
  2409.    cmp #"0"
  2410.    bcc -
  2411.    cmp #"9"+1
  2412.    bcs -
  2413.    asl
  2414.    asl
  2415.    asl
  2416.    asl
  2417.    sta syswork+6
  2418.    jsr kernelChrin
  2419.    cmp #0
  2420.    beq +
  2421.    and #$0f
  2422.    ora syswork+6
  2423.    clc
  2424. +  rts
  2425.  
  2426. ;*** aceDirIsdir( (zp)=FilenameZ ) : .A=Dev, .X=isDisk, .Y=isDir
  2427.  
  2428. kernDirIsdir = *
  2429.    jsr getDevice
  2430.    pha
  2431.    tax
  2432.    lda configBuf+0,x
  2433.    cmp #1
  2434.    beq +
  2435.    cmp #4
  2436.    beq +
  2437.    ldx #false
  2438.    ldy #false
  2439.    jmp isDirExit
  2440.    ldx #true
  2441. +  ldy #255
  2442. -  iny
  2443.    lda (zp),y
  2444.    bne -
  2445.    dey
  2446.    lda (zp),y
  2447.    ldy #true
  2448.    cmp #":"
  2449.    beq isDirExit
  2450.    ldy #false
  2451.  
  2452.    isDirExit = *
  2453.    pla
  2454.    rts
  2455.  
  2456. ;*** aceDirChange( (zp)=DirName, .A=flags($80=home) )
  2457.  
  2458. chdirDevice = syswork+0
  2459. chdirScan   = syswork+1
  2460. chdirNameScan = syswork+2
  2461. chdirCharSave = syswork+3
  2462.  
  2463. kernDirChange = *
  2464. internDirChange = *
  2465.    cmp #$80
  2466.    bcc +
  2467.    lda #<configBuf+$100
  2468.    ldy #>configBuf+$100
  2469.    sta zp+0
  2470.    sty zp+1
  2471. +  jsr getDiskDevice
  2472.    bcc +
  2473.    rts
  2474. +  sty chdirNameScan
  2475.    sta chdirDevice
  2476.    cpx #4
  2477.    bne +
  2478.    jmp rdChDir
  2479. +  lda #"c"
  2480.    sta stringBuffer+0
  2481.    lda #"d"
  2482.    sta stringBuffer+1
  2483.    ldx #2
  2484. -  lda (zp),y
  2485.    sta stringBuffer,x
  2486.    beq +
  2487.    cmp #":"
  2488.    beq +
  2489.    iny
  2490.    inx
  2491.    bne -
  2492. +  lda #0
  2493.    sta stringBuffer,x
  2494.    cpx #2
  2495.    beq chdirSetName
  2496.    lda #"/"
  2497.    cmp stringBuffer-1,x
  2498.    beq +
  2499.    sta stringBuffer,x
  2500.    inx
  2501.    lda #0
  2502.    sta stringBuffer,x
  2503. +  lda chdirDevice
  2504.    jsr cmdchOpen
  2505.    bcc +
  2506.    rts
  2507. +  jsr cmdchSend
  2508.    bcs chdirAbort
  2509.    jsr checkDiskStatus
  2510.    bcs chdirAbort
  2511.  
  2512.    lda #"p"
  2513.    sta stringBuffer+1
  2514.    ldx #0
  2515. -  lda stringBuffer+2,x
  2516.    cmp #"0"
  2517.    bcc +
  2518.    cmp #"9"+1
  2519.    bcs +
  2520.    inx
  2521.    bne -
  2522. +  cpx #0
  2523.    beq +
  2524.    cmp #"/"
  2525.    bne +
  2526.    sta chdirCharSave
  2527.    stx chdirNameScan
  2528.    lda #0
  2529.    sta stringBuffer+2,x
  2530.    jsr cmdchSend
  2531.    bcs chdirAbort
  2532.    ldx chdirNameScan
  2533.    lda chdirCharSave
  2534.    sta stringBuffer+2,x
  2535.    jsr checkDiskStatus
  2536.    bcs chdirAbort
  2537. +  jsr cmdchClose
  2538.    lda chdirDevice
  2539.    sta aceCurrentDevice
  2540.  
  2541.    chdirSetName = *
  2542.    lda chdirDevice
  2543.    sta aceCurrentDevice
  2544.    lsr
  2545.    lsr
  2546.    ora #$40
  2547.    sta aceCurDirName+0
  2548.    lda #":"
  2549.    sta aceCurDirName+1
  2550.    ldx #0
  2551. -  lda stringBuffer+2,x
  2552.    sta aceCurDirName+2,x
  2553.    beq +
  2554.    inx
  2555.    bne -
  2556. +  lda aceCurDirName+1,x
  2557.    cmp #":"
  2558.    beq +
  2559.    lda #":"
  2560.    sta aceCurDirName+2,x
  2561.    inx
  2562. +  lda #0
  2563.    sta aceCurDirName+2,x
  2564.    clc
  2565.    rts
  2566.  
  2567.    chdirAbort = *
  2568.    jsr cmdchClose
  2569.    sec
  2570.    rts
  2571.  
  2572. ;*** aceDirMake( (zp)=Name, .AY=minimumEntries )
  2573.  
  2574. mkdirDevice = syswork
  2575.  
  2576. kernDirMake = *
  2577.    jsr getDiskDevice
  2578.    bcc +
  2579.    rts
  2580. +  sta mkdirDevice
  2581.    lda #"m"
  2582.    sta stringBuffer+0
  2583.    lda #"d"
  2584.    sta stringBuffer+1
  2585.    lda #":"
  2586.    sta stringBuffer+2
  2587.    ldx #3
  2588. -  lda (zp),y
  2589.    sta stringBuffer,x
  2590.    beq +
  2591.    iny
  2592.    inx
  2593.    bne -
  2594. +  lda mkdirDevice
  2595.    jsr cmdchOpen
  2596.    bcs ++
  2597.    jsr cmdchSend
  2598.    bcs +
  2599.    jsr checkDiskStatus
  2600. +  php
  2601.    jsr cmdchClose
  2602.    plp
  2603. +  rts
  2604.  
  2605. ;*** aceDirRemove( (zp)=Name )
  2606.  
  2607. rmdirDevice = syswork
  2608.  
  2609. kernDirRemove = *
  2610.    jsr getDiskDevice
  2611.    bcc +
  2612.    rts
  2613. +  sta rmdirDevice
  2614.    lda #"r"
  2615.    sta stringBuffer+0
  2616.    lda #"d"
  2617.    sta stringBuffer+1
  2618.    lda #":"
  2619.    sta stringBuffer+2
  2620.    ldx #3
  2621. -  lda (zp),y
  2622.    sta stringBuffer,x
  2623.    beq +
  2624.    iny
  2625.    inx
  2626.    bne -
  2627. +  lda rmdirDevice
  2628.    jsr cmdchOpen
  2629.    bcs ++
  2630.    jsr cmdchSend
  2631.    bcs +
  2632.    jsr checkDiskStatus
  2633. +  php
  2634.    jsr cmdchClose
  2635.    plp
  2636. +  rts
  2637.  
  2638. ;*** aceDirName( .A=sysdir, (zp)=buf, .Y=assignLen ) : buf, .Y=len
  2639. ;***   .A : 0=curDir, 1=homedir, 2=execSearchPath, 3=configSearchPath, 4=tempDir
  2640. ;***   .A : $80+above: assign directory
  2641.  
  2642. dirnamePath   .buf 1
  2643. dirnameSet    .buf 1
  2644. dirnameSetLen .buf 1
  2645.  
  2646. kernDirName = *
  2647.    ldx #$00
  2648.    cmp #$80
  2649.    bcc +
  2650.    sty dirnameSetLen
  2651.    ldx #$ff
  2652. +  stx dirnameSet
  2653.    and #$07
  2654.    ldx #$ff
  2655.    cmp #2
  2656.    beq +
  2657.    cmp #3
  2658.    beq +
  2659.    ldx #$00
  2660. +  stx dirnamePath
  2661.    ldx #<aceCurDirName
  2662.    ldy #>aceCurDirName
  2663.    cmp #0
  2664.    beq +
  2665.    sec
  2666.    sbc #1
  2667.    lsr
  2668.    ror
  2669.    ror
  2670.    and #$c0
  2671.    ldy #>configBuf
  2672.    iny
  2673.    clc
  2674.    adc #<configBuf
  2675.    tax
  2676.    bcc +
  2677.    iny
  2678. +  stx syswork+0
  2679.    sty syswork+1
  2680.    bit dirnameSet
  2681.    bmi dirnameSetCopy
  2682.    ldy #0
  2683. -  lda (syswork+0),y
  2684.    sta (zp),y
  2685.    beq +
  2686.    iny
  2687.    bne -
  2688. +  bit dirnamePath
  2689.    bpl +
  2690.    iny 
  2691.    lda (syswork+0),y
  2692.    bne -
  2693.    sta (zp),y
  2694. +  rts
  2695.  
  2696.    dirnameSetCopy = *
  2697.    ldy #0
  2698. -  lda (zp),y
  2699.    sta (syswork+0),y
  2700.    iny
  2701.    cpy dirnameSetLen
  2702.    bcc -
  2703.    rts
  2704.  
  2705. ;====== time calls ======
  2706.  
  2707. ;*** aceTimeGetDate( (.AY)=dateString )  fmt:YY:YY:MM:DD:HH:MM:SS:TW
  2708. ;                                             0  1  2  3  4  5  6  7
  2709.  
  2710. prevHour .buf 1
  2711.  
  2712. kernTimeGetDate = *
  2713. internGetDate = *
  2714.    php
  2715.    sei
  2716.    sta syswork+$e
  2717.    sty syswork+$f
  2718.    ldy #3
  2719. -  lda aceDate,y
  2720.    sta (syswork+$e),y
  2721.    dey
  2722.    bpl -
  2723.    ldy #4
  2724.    lda cia1+$b
  2725.    bpl +
  2726.    and #$1f
  2727.    sei
  2728.    sed
  2729.    clc
  2730.    adc #$12
  2731.    cld
  2732.    cli
  2733. +  cmp #$12
  2734.    bne +
  2735.    lda #$00
  2736. +  cmp #$24
  2737.    bne +
  2738.    lda #$12
  2739. +  sta (syswork+$e),y
  2740.    iny
  2741.    lda cia1+$a
  2742.    sta (syswork+$e),y
  2743.    iny
  2744.    lda cia1+$9
  2745.    sta (syswork+$e),y
  2746.    iny
  2747.    lda cia1+$8
  2748.    asl
  2749.    asl
  2750.    asl
  2751.    asl
  2752.    ora aceDOW
  2753.    sta (syswork+$e),y
  2754.    ;** check for increment date
  2755.    ldy #4
  2756.    lda (syswork+$e),y
  2757.    cmp prevHour
  2758.    sta prevHour
  2759.    bcs +
  2760.    ldy #3
  2761.    lda aceDate,y
  2762.    sed
  2763.    clc
  2764.    adc #$01
  2765.    cld
  2766.    sta aceDate,y
  2767.    sta (syswork+$e),y
  2768.    ;** exit
  2769. +  plp
  2770.    clc
  2771.    rts
  2772.  
  2773. ;*** aceTimeSetDate( (.AY)=dateString )
  2774.  
  2775. kernTimeSetDate = *
  2776.    sta syswork+0
  2777.    sty syswork+1
  2778.    ldy #3
  2779. -  lda (syswork),y
  2780.    sta aceDate,y
  2781.    dey
  2782.    bpl -
  2783.    ldy #4
  2784.    lda (syswork),y
  2785.    sta prevHour
  2786.    cmp #$13
  2787.    bcc +
  2788.    sei
  2789.    sed
  2790.    sec
  2791.    sbc #$12
  2792.    cld
  2793.    cli
  2794.    ora #$80
  2795. +  sta cia1+$b
  2796.    iny
  2797.    lda (syswork),y
  2798.    sta cia1+$a
  2799.    iny
  2800.    lda (syswork),y
  2801.    sta cia1+$9
  2802.    iny
  2803.    lda (syswork),y
  2804.    lsr
  2805.    lsr
  2806.    lsr
  2807.    lsr
  2808.    sta cia1+$8
  2809.    lda (syswork),y
  2810.    and #$07
  2811.    sta aceDOW
  2812.    rts
  2813.  
  2814. ;*** aceTimeJif( .X=zpJifBuf ) : [zpJB]=jiffyCount
  2815.  
  2816. kernTimeJif = *
  2817.    php
  2818.    sei
  2819.    ldy #0
  2820. -  lda jiffyCount,y
  2821.    sta 0,x
  2822.    inx
  2823.    iny
  2824.    cpy #4
  2825.    bcc -
  2826.    plp
  2827.    clc
  2828.    rts
  2829.  
  2830. ;====== miscellaneous calls ======
  2831.  
  2832. ;*** aceMiscUtoa( $0+X=value32, (zp)=buf, .A=minLen ) : buf, .Y=len
  2833.  
  2834. utoaBin = syswork+2     ;(4)
  2835. utoaBcd = syswork+6     ;(5)
  2836. utoaFlag = syswork+11   ;(1)
  2837. utoaLen = syswork+12    ;(1)
  2838. utoaPos = syswork+13    ;(1)
  2839. utoaInitOff .buf 1      ;(1)
  2840.  
  2841. kernMiscUtoa = *
  2842.    ldy #0
  2843.    sty utoaInitOff
  2844.    cmp #0
  2845.    bne +
  2846.    lda #1
  2847. +  cmp #11
  2848.    bcc +
  2849.    sec
  2850.    sbc #10
  2851.    sta utoaInitOff
  2852.    ;.y == 0
  2853.    lda #" "
  2854. -  sta (zp),y
  2855.    iny
  2856.    cpy utoaInitOff
  2857.    bcc -
  2858.    lda #10
  2859. +  sta utoaLen
  2860.    sec
  2861.    lda #10
  2862.    sbc utoaLen
  2863.    sta utoaLen
  2864.    ldy #0
  2865. -  lda 0,x
  2866.    sta utoaBin,y
  2867.    inx
  2868.    iny
  2869.    cpy #4
  2870.    bcc - 
  2871.    ldx #4
  2872.    lda #0
  2873. -  sta utoaBcd,x
  2874.    dex
  2875.    bpl -
  2876.    sta utoaFlag
  2877.    ldy #32
  2878.    sei
  2879.    sed
  2880.  
  2881.    utoaNextBit = *
  2882.    asl utoaBin+0
  2883.    rol utoaBin+1
  2884.    rol utoaBin+2
  2885.    rol utoaBin+3
  2886.    ldx #4
  2887. -  lda utoaBcd,x
  2888.    adc utoaBcd,x
  2889.    sta utoaBcd,x
  2890.    dex
  2891.    bpl -
  2892.    dey
  2893.    bne utoaNextBit
  2894.    cld
  2895.    cli
  2896.  
  2897.    lda #10
  2898.    sta utoaPos
  2899.    ldx #0
  2900.    ldy utoaInitOff
  2901. -  lda utoaBcd,x
  2902.    jsr utoaPutHex
  2903.    inx
  2904.    cpx #5
  2905.    bcc -
  2906.    lda #0
  2907.    sta (zp),y
  2908.    rts
  2909.  
  2910.    utoaPutHex = *
  2911.    pha
  2912.    lsr
  2913.    lsr
  2914.    lsr
  2915.    lsr
  2916.    jsr utoaPutDigit
  2917.    pla
  2918.    and #$0f
  2919.  
  2920.    utoaPutDigit = *
  2921.    dec utoaPos
  2922.    beq utoaForceDigit
  2923.    cmp utoaFlag
  2924.    bne utoaForceDigit
  2925.    dec utoaLen
  2926.    bmi +
  2927.    rts
  2928. +  lda #$20
  2929.    bne utoaPoke
  2930.    utoaForceDigit = *
  2931.    ora #$30
  2932.    sta utoaFlag
  2933.    
  2934.    utoaPoke = *
  2935.    sta (zp),y
  2936.    iny
  2937.    rts
  2938.  
  2939. ;*** aceMiscIoPeek( (zw)=ioaddr, .Y=offset ) : .A=data
  2940.  
  2941. kernMiscIoPeek = *
  2942.    lda #bkKernel
  2943.    sta bkSelect
  2944.    lda (zw),y
  2945.    pha
  2946.    lda #bkApp
  2947.    sta bkSelect
  2948.    pla
  2949.    rts
  2950.  
  2951. ;*** aceMiscIoPoke( (zw)=ioaddr, .Y=offset, .A=data )
  2952.  
  2953. kernMiscIoPoke = *
  2954.    pha
  2955.    lda #bkKernel
  2956.    sta bkSelect
  2957.    pla
  2958.    sta (zw),y
  2959.    pha
  2960.    lda #bkApp
  2961.    sta bkSelect
  2962.    pla
  2963.    rts
  2964.  
  2965. ;*** aceMiscCmdOpen( (zp)=DevName ) : .A=Fcb
  2966.  
  2967. kernMiscCmdOpen = *
  2968.    jsr getDiskDevice
  2969.    bcc +
  2970.    rts
  2971. +  sta openDevice
  2972.    jsr getLfAndFcb
  2973.    bcc +
  2974.    rts
  2975. +  sta lftable,x
  2976.    stx openFcb
  2977.    lda openDevice
  2978.    sta devtable,x
  2979.    lda #0
  2980.    sta eoftable,x
  2981.    lda #15
  2982.    sta satable,x
  2983.    stx openFcb
  2984.    lda #0
  2985.    sta stringBuffer
  2986.    lda #false
  2987.    sta checkStat
  2988.    ldx #0
  2989.    jsr openGotName
  2990.    bcc +
  2991.    rts
  2992. +  lda st
  2993.    and #$80
  2994.    beq +
  2995.    lda #aceErrDeviceNotPresent
  2996.    sta errno
  2997.    sec
  2998.    rts
  2999. +  lda openFcb
  3000.    rts
  3001.  
  3002. ;*** aceMiscCmdClose( .A=fcb )
  3003.  
  3004. kernMiscCmdClose = *
  3005.    tax
  3006.    lda lftable,x
  3007.    pha
  3008.    lda #lfnull
  3009.    sta lftable,x
  3010.    pla
  3011.    sec
  3012.    jmp kernelClose
  3013.  
  3014. ;*** aceMiscCmdSend( .X=Fcb, .AY=Cmd )
  3015.  
  3016. kernMiscCmdSend = *
  3017.    sta syswork+0
  3018.    sty syswork+1
  3019.    lda lftable,x
  3020.    tax
  3021.    jsr kernelChkout
  3022.    bcc +
  3023.    sta errno
  3024.    rts
  3025. +  ldy #0
  3026. -  lda (syswork),y
  3027.    beq +
  3028.    jsr kernelChrout
  3029.    bcs ++
  3030.    iny
  3031.    bne -
  3032. +  jsr kernelClrchn
  3033.    clc
  3034.    rts
  3035. +  sta errno
  3036.    jsr kernelClrchn
  3037.    sec
  3038.    rts
  3039.  
  3040. ;*** aceMiscCmdStatus( .X=Fcb, .AY=StatusBuf ) : StatusBuf, .A=statusCode
  3041.  
  3042. kernMiscCmdStatus = *
  3043.    sta syswork+0
  3044.    sty syswork+1
  3045.    lda lftable,x
  3046.    tax
  3047.    jsr kernelChkin
  3048.    bcc +
  3049. -  sta errno
  3050.    jsr kernelClrchn
  3051.    sec
  3052.    rts
  3053. +  ldy #0
  3054. -  jsr kernelChrin
  3055.    bcs --
  3056.    cmp #$0d
  3057.    beq +
  3058.    sta (syswork),y
  3059.    iny
  3060.    jsr kernelReadst
  3061.    and #$40
  3062.    beq -
  3063. +  lda #0
  3064.    sta (syswork),y
  3065.    jsr kernelClrchn
  3066.    ldy #0
  3067.    lda (syswork),y
  3068.    and #$0f
  3069.    asl
  3070.    asl
  3071.    adc (syswork),y
  3072.    asl
  3073.    sta syswork+3
  3074.    iny
  3075.    lda (syswork),y
  3076.    and #$0f
  3077.    adc syswork+3
  3078.    clc
  3079.    rts
  3080.  
  3081. ;====== support functions ======
  3082.  
  3083. ;*** getDevice( zp=filenameZ ) : .A=device, .Y=scanPos
  3084.  
  3085. getDevice = *
  3086.    ldy #0
  3087.    lda (zp),y
  3088.    beq useDefault
  3089.    ldy #1
  3090.    lda (zp),y
  3091.    cmp #":"
  3092.    bne useDefault
  3093.    ldy #0
  3094.    lda (zp),y
  3095.    ldy #2
  3096.    cmp #"."
  3097.    bne +
  3098.    lda aceCurrentDevice
  3099.    jmp gotDev
  3100. +  and #$1f
  3101.    asl
  3102.    asl
  3103.    jmp gotDev
  3104.    
  3105.    useDefault = *
  3106.    lda aceCurrentDevice
  3107.    ldy #0
  3108.  
  3109.    gotDev = *
  3110.    rts
  3111.    
  3112. getLfAndFcb = * ;() : .X=fcb, .A=lf
  3113.    openLfSearch = *
  3114.    inc newlf
  3115.    lda newlf
  3116.    and #$7f
  3117.    ldx #fcbCount-1
  3118. -  cmp lftable,x
  3119.    beq openLfSearch
  3120.    dex
  3121.    bpl -
  3122.    tay
  3123.    ldx #0
  3124. -  lda lftable,x
  3125.    bmi +
  3126.    inx
  3127.    cpx #fcbCount
  3128.    bcc -
  3129.    lda #aceErrTooManyFiles
  3130.    sta errno
  3131.    sec
  3132.    rts
  3133. +  lda aceProcessID
  3134.    sta pidtable,x
  3135.    tya
  3136.    clc
  3137.    rts
  3138.  
  3139. devTableInit = *
  3140.    ldx #0
  3141.    lda #aceMemNull
  3142. -  sta deviceTable,x
  3143.    inx
  3144.    bne -
  3145.    rts
  3146.  
  3147. getDiskDevice = *  ;( (zp)=devname ) : .A=device, .Y=scan, .X=dev_t, .CC=isDisk
  3148.    jsr getDevice
  3149.    pha
  3150.    tax
  3151.    lda configBuf+0,x
  3152.    cmp #1
  3153.    bne +
  3154. -  tax
  3155.    pla
  3156.    clc
  3157.    rts
  3158. +  cmp #4
  3159.    beq -
  3160.    pla
  3161.    lda #aceErrDiskOnlyOperation
  3162.    sta errno
  3163.    sec
  3164.    rts
  3165.    
  3166. ;====== experimental stuff ======
  3167.  
  3168. ;*** aceTest( (zp)=filename ) : .A=dev#(0-31), (zw)=devRelName
  3169.  
  3170. testCurDir .asc "/acedev"
  3171.            .byte 0
  3172. testHomeDir .asc "/csbruce"
  3173.             .byte 0
  3174. fnameScan .buf 1
  3175. fnameSkip = fnameScan
  3176.  
  3177. kernTest = *
  3178. ;;   lda #"/"
  3179. ;;   sta stringBuffer+0
  3180. ;;
  3181. ;;   ;** fetch prefix+name into stringBuffer
  3182. ;;   ldy #0
  3183. ;;   lda (zp),y
  3184. ;;   ldx #1
  3185. ;;   cmp #"/"
  3186. ;;   beq +++
  3187. ;;   cmp #"~"
  3188. ;;   bne +
  3189. ;;   iny
  3190. ;;-  lda testHomeDir,x
  3191. ;;   sta stringBuffer,x
  3192. ;;   beq ++
  3193. ;;   inx
  3194. ;;   bne -
  3195. ;;+  nop
  3196. ;;-  lda testCurDir,x
  3197. ;;   sta stringBuffer,x
  3198. ;;   beq +
  3199. ;;   inx
  3200. ;;   bne -
  3201. ;;+  lda #"/"
  3202. ;;   sta stringBuffer,x
  3203. ;;   inx
  3204. ;;+  nop
  3205. ;;-  lda (zp),y
  3206. ;;   sta stringBuffer,x
  3207. ;;   beq +
  3208. ;;   inx
  3209. ;;   iny
  3210. ;;   bne -
  3211. ;;
  3212. ;;   ;** scan for extra slashes, ".", and ".."
  3213. ;;+  ldx #1
  3214. ;;   ldy #1
  3215. ;;   scanNext = *
  3216. ;;   lda stringBuffer,x
  3217. ;;   cmp #"/"
  3218. ;;   bne scanCont
  3219. ;;   stx fnameScan
  3220. ;;-  inx
  3221. ;;   lda stringBuffer,x
  3222. ;;   cmp #"."
  3223. ;;   beq -
  3224. ;;   cmp #"/"
  3225. ;;   beq +
  3226. ;;   cmp #$00
  3227. ;;   bne ++
  3228. ;;+  clc ;sic
  3229. ;;   txa
  3230. ;;   sbc fnameScan
  3231. ;;   beq +
  3232. ;;   cmp #3
  3233. ;;   bcs +
  3234. ;;   cmp #1
  3235. ;;   beq scanNext
  3236. ;;   cpy #2
  3237. ;;   bcc scanNext
  3238. ;;   dey
  3239. ;;-  dey
  3240. ;;   lda stringBuffer,y
  3241. ;;   cmp #"/"
  3242. ;;   bne -
  3243. ;;   iny
  3244. ;;   jmp scanNext
  3245. ;;+  ldx fnameScan 
  3246. ;;   lda #"/"
  3247. ;;   scanCont = *
  3248. ;;   cmp #"/"
  3249. ;;   bne +
  3250. ;;   cmp stringBuffer-1,y
  3251. ;;   bne +
  3252. ;;   dey
  3253. ;;+  sta stringBuffer,y
  3254. ;;   cmp #$00
  3255. ;;   beq +
  3256. ;;   iny
  3257. ;;   inx
  3258. ;;   bne scanNext
  3259. ;;+  cpy #2
  3260. ;;   bcc +
  3261. ;;   lda stringBuffer-1,y
  3262. ;;   cmp #"/"
  3263. ;;   bne +
  3264. ;;   lda #$00
  3265. ;;   sta stringBuffer-1,y
  3266. ;;
  3267. ;;   ;** search for longest match among the mounted device names
  3268. ;;+  lda #<configBuf+512
  3269. ;;   ldy #>configBuf+512
  3270. ;;   sta syswork+14
  3271. ;;   sty syswork+15
  3272. ;;-  ldy #2
  3273. ;;-  iny
  3274. ;;   lda (syswork+14),y
  3275. ;;   beq +
  3276. ;;   cmp stringBuffer-3,y
  3277. ;;   beq -
  3278. ;;-  clc
  3279. ;;   ldy #0
  3280. ;;   lda (syswork+14),y
  3281. ;;   adc syswork+14
  3282. ;;   sta syswork+14
  3283. ;;   bcc ---
  3284. ;;   inc syswork+15
  3285. ;;   jmp ---
  3286. ;;+  lda stringBuffer-3,y
  3287. ;;   cmp #$00
  3288. ;;   beq +
  3289. ;;   cmp #"/"
  3290. ;;   beq ++
  3291. ;;   cpy #5
  3292. ;;   bcs -
  3293. ;;+  dey
  3294. ;;   lda #"/"
  3295. ;;   sta stringBuffer-3,y
  3296. ;;+  sec
  3297. ;;   tya
  3298. ;;   sbc #3
  3299. ;;   tax
  3300. ;;   ldy #1
  3301. ;;   lda (syswork+14),y
  3302. ;;   ora #$40
  3303. ;;   ;** return
  3304. ;;   pha
  3305. ;;   ldy #0
  3306. ;;-  lda stringBuffer,y
  3307. ;;   sta (zw),y
  3308. ;;   beq +
  3309. ;;   iny
  3310. ;;   bne -
  3311. ;;+  pla
  3312. ;;   clc
  3313. ;;   rts
  3314.  
  3315. ;blank line
  3316.  
  3317. acemem.s
  3318. 1651
  3319. ;ACE-128/64 kernel Dynamic Memory & Process routines, by Craig Bruce.
  3320.  
  3321. ;*** memory routines ***
  3322.  
  3323. .if computer-64
  3324.    comCodeBuffer = $200
  3325. .ife
  3326. temp1 = $93
  3327.  
  3328. bkSelectRam0 = $ff01
  3329. reu = $df00
  3330. rl = $de00
  3331. ;rlRegs = $e0a9  ;old
  3332. ;rlExec = $fe1e  ;old
  3333. rlActivate   = $df7e
  3334. rlDeactivate = $df7f
  3335. rlSram       = $dfc0
  3336. rlPageSelect = $dfa0
  3337. rlPageActivate = $dfc1
  3338. rlPageData   = $de00
  3339.  
  3340. ;***startup
  3341.  
  3342. initMemory = *
  3343. .if computer-64
  3344.    ldx #0
  3345. -  lda comCodeStart,x
  3346.    sta comCodeBuffer,x
  3347.    inx
  3348.    cpx #comCodeEnd-comCodeStart
  3349.    bcc -
  3350. .ife
  3351.    rts
  3352.  
  3353. shutdownMemory = *
  3354. .if computer-64
  3355.    ldx #0
  3356.    lda #0
  3357. -  sta comCodeBuffer,x
  3358.    inx
  3359.    cpx #comCodeEnd-comCodeStart
  3360.    bne -
  3361. .ife
  3362.    rts
  3363.  
  3364. internBankConfigs = *
  3365. .if computer-64
  3366.    .byte $3f,$7f,$bf,$ff,$bf,$ff,$bf,$ff
  3367.    .byte $3f,$7f,$bf,$ff,$bf,$ff,$bf,$00
  3368. .else
  3369.    .byte $70,$70
  3370. .ife
  3371.  
  3372. internBankGroups = *
  3373. .if computer-64
  3374.    .byte $04,$04,$04,$04,$14,$14,$24,$24
  3375.    .byte $04,$04,$04,$04,$14,$14,$24,$04
  3376. .ife
  3377.  
  3378. ;***common code
  3379.  
  3380. comCodeStart = *
  3381. .if computer-64
  3382. .else
  3383.    comCodeBuffer = comCodeStart
  3384. .ife
  3385.  
  3386. comZpLoad = *
  3387.    sty temp1
  3388.    ldy mp+2
  3389. .if computer-64
  3390.    lda internBankGroups,y
  3391.    sta $d506
  3392. .ife
  3393.    lda internBankConfigs,y
  3394.    sta bkSelect
  3395.    ldy #0
  3396. -  lda (mp),y
  3397.    sta 0,x
  3398.    inx
  3399.    iny
  3400.    cpy temp1
  3401.    bcc -
  3402.    lda #bkACE
  3403.    sta bkSelect
  3404.    clc
  3405.    rts
  3406.  
  3407. comZpStore = *
  3408.    sty temp1
  3409.    ldy mp+2
  3410. .if computer-64
  3411.    lda internBankGroups,y
  3412.    sta $d506
  3413. .ife
  3414.    lda internBankConfigs,y
  3415.    sta bkSelect
  3416.    ldy #0
  3417. -  lda 0,x
  3418.    sta (mp),y
  3419.    inx
  3420.    iny
  3421.    cpy temp1
  3422.    bcc -
  3423.    lda #bkACE
  3424.    sta bkSelect
  3425.    clc
  3426.    rts
  3427.  
  3428. comCopyToRam0 = *
  3429.    ldx mp+2
  3430. .if computer-64
  3431.    lda internBankGroups,x
  3432.    sta $d506
  3433.    lda internBankConfigs,x
  3434.    tax
  3435. .else
  3436.    lda internBankConfigs,x
  3437.    sta bkSelect
  3438. .ife
  3439.    dey
  3440.    beq +
  3441. .if computer-64
  3442. -  stx bkSelect
  3443.    lda (mp),y
  3444.    sta bkSelectRam0
  3445. .else
  3446. -  lda (mp),y
  3447. .ife
  3448.    sta (zp),y
  3449.    dey
  3450.    bne -
  3451. .if computer-64
  3452. +  stx bkSelect
  3453.    lda (mp),y
  3454.    sta bkSelectRam0
  3455. .else
  3456. +  lda (mp),y
  3457. .ife
  3458.    sta (zp),y
  3459.    lda #bkACE
  3460.    sta bkSelect
  3461.    clc
  3462.    rts
  3463.  
  3464. comCopyFromRam0 = *
  3465.    ldx mp+2
  3466. .if computer-64
  3467.    lda internBankGroups,x
  3468.    sta $d506
  3469.    lda internBankConfigs,x
  3470.    tax
  3471. .else
  3472.    lda internBankConfigs,x
  3473.    sta bkSelect
  3474. .ife
  3475.    dey
  3476.    beq +
  3477. .if computer-64
  3478. -  sta bkSelectRam0
  3479.    lda (zp),y
  3480.    stx bkSelect
  3481. .else
  3482. -  lda (zp),y
  3483. .ife
  3484.    sta (mp),y
  3485.    dey
  3486.    bne -
  3487. .if computer-64
  3488. +  sta bkSelectRam0
  3489.    lda (zp),y
  3490.    stx bkSelect
  3491. .else
  3492. +  lda (zp),y
  3493. .ife
  3494.    sta (mp),y
  3495.    lda #bkACE
  3496.    sta bkSelect
  3497.    clc
  3498.    rts
  3499. comCodeEnd = *
  3500.  
  3501. ;*** aceMemZpload( [mp]=Source, .X=ZpDest, .Y=Length ) : .CS=err
  3502.  
  3503. kernMemZpload = *
  3504.    lda mp+3
  3505.    beq nullPtrError
  3506.    cmp #aceMemRL
  3507.    bcc +
  3508.    beq zpLoadRL
  3509.    jmp comZpLoad-comCodeStart+comCodeBuffer
  3510. +  tya
  3511.    ldy #$91
  3512.  
  3513. zeroPageReuOp = *
  3514.    bit aceRamlinkAccess
  3515.    bpl +
  3516.    php
  3517.    sei
  3518.    sta rlActivate
  3519. +  sta reu+7
  3520.    lda mp+2
  3521.    sta reu+6
  3522.    stx reu+2
  3523.    lda #0
  3524.    sta reu+3
  3525.    sta reu+8
  3526.    lda mp+0
  3527.    sta reu+4
  3528.    lda mp+1
  3529.    sta reu+5
  3530. .if computer-64
  3531.    lda vic+$30
  3532.    ldx #$00
  3533.    stx vic+$30
  3534. .ife
  3535.    sty reu+1
  3536. .if computer-64
  3537.    sta vic+$30
  3538. .ife
  3539.    bit aceRamlinkAccess
  3540.    bpl +
  3541.    sta rlSram
  3542.    sta rlDeactivate
  3543.    plp
  3544. +  clc
  3545.    rts
  3546.  
  3547. nullPtrError = *
  3548.    lda #aceErrNullPointer
  3549.    sta errno
  3550.    sec
  3551.    rts
  3552.  
  3553. zpLoadRL = *
  3554.    lda #$91
  3555. zeroPageRlOp = *  ;( .A=opcode, .X=zpaddr, .Y=len, [mp]=farPtr )
  3556.    sta ramlinkOpcode
  3557.    lda #0
  3558.    sty ramlinkLength+0
  3559.    sta ramlinkLength+1
  3560.    stx ramlinkNearPtr+0
  3561.    sta ramlinkNearPtr+1
  3562.    jmp ramlinkOp
  3563.  
  3564. ramlinkOpcode .buf 1
  3565. ramlinkLength .buf 2
  3566. ramlinkNearPtr .buf 2
  3567. ramlinkMpSave .buf 3
  3568. ramlinkZpSave .buf 2
  3569.  
  3570. ramlinkOp = *  ;( [mp]=farPtr, ramlinkNearPtr, ramlinkLength, ramlinkOpcode )
  3571.   ;jmp ramlinkOpOld
  3572.    lda mp+0
  3573.    ldy mp+1
  3574.    ldx mp+2
  3575.    sta ramlinkMpSave+0
  3576.    sty ramlinkMpSave+1
  3577.    stx ramlinkMpSave+2
  3578.    lda zp+0
  3579.    ldy zp+1
  3580.    sta ramlinkZpSave+0
  3581.    sty ramlinkZpSave+1
  3582.    lda ramlinkNearPtr+0
  3583.    ldy ramlinkNearPtr+1
  3584.    sta zp+0
  3585.    sty zp+1
  3586.    clc
  3587.    lda mp+1
  3588.    adc aceRamlinkStart+0
  3589.    sta mp+1
  3590.    lda mp+2
  3591.    adc aceRamlinkStart+1
  3592.    sta mp+2
  3593. -  lda ramlinkLength+0
  3594.    ora ramlinkLength+1
  3595.    beq +
  3596.    jsr rlTransferChunk
  3597.    jmp -
  3598. +  lda ramlinkMpSave+0
  3599.    ldy ramlinkMpSave+1
  3600.    ldx ramlinkMpSave+2
  3601.    sta mp+0
  3602.    sty mp+1
  3603.    stx mp+2
  3604.    lda ramlinkZpSave+0
  3605.    ldy ramlinkZpSave+1
  3606.    sta zp+0
  3607.    sty zp+1
  3608.    clc
  3609.    rts
  3610.  
  3611.    rlTrSize .buf 1
  3612.  
  3613.    rlTransferChunk = *  ;( [mp]=rlmem, (zp)=nearmem, rlLength, rlOpcode )
  3614.    ;** figure maximum page operation
  3615.    lda ramlinkLength+1
  3616.    beq +
  3617.    lda #0
  3618.    ldx mp+0
  3619.    beq rlTrDo
  3620.    sec
  3621.    sbc mp+0
  3622.    jmp rlTrDo
  3623. +  lda mp+0
  3624.    beq +
  3625.    lda #0
  3626.    sec
  3627.    sbc mp+0
  3628.    cmp ramlinkLength+0
  3629.    bcc rlTrDo
  3630. +  lda ramlinkLength+0
  3631.  
  3632.    ;** do the transfer
  3633.    rlTrDo = *
  3634.    tay
  3635.    sty rlTrSize
  3636.    jsr rlPageOp
  3637.  
  3638.    ;** update the pointers and remaining length
  3639.    clc
  3640.    lda rlTrSize
  3641.    bne +
  3642.    inc mp+1
  3643.    inc zp+1
  3644.    dec ramlinkLength+1
  3645.    rts
  3646. +  adc mp+0
  3647.    sta mp+0
  3648.    bcc +
  3649.    inc mp+1
  3650. +  clc
  3651.    lda zp+0
  3652.    adc rlTrSize
  3653.    sta zp+0
  3654.    bcc +
  3655.    inc zp+1
  3656. +  sec
  3657.    lda ramlinkLength+0
  3658.    sbc rlTrSize
  3659.    sta ramlinkLength+0
  3660.    bcs +
  3661.    dec ramlinkLength+1
  3662. +  rts
  3663.  
  3664.    rlPageOp = *  ;( [mp]=rlmem, (zp)=nearmem, .Y=bytes, ramlinkOpcode )
  3665.    php
  3666.    sei
  3667.    sta rlActivate
  3668.    lda mp+1
  3669.    sta rlPageSelect+0
  3670.    lda mp+2
  3671.    sta rlPageSelect+1
  3672.    sta rlPageActivate
  3673.    lda aceReuRlSpeedPage+3
  3674.    bne rlPageOpReu  ;xxx dependency on aceMemNull==0
  3675.    rlPageOpNonReu = *
  3676.    tya
  3677.    clc
  3678.    adc mp+0
  3679.    tax
  3680.  
  3681.    lda ramlinkOpcode
  3682.    cmp #$91
  3683.    bne rlPageOpWrite
  3684.    dex
  3685.    dey
  3686.    beq +
  3687. -  lda rlPageData,x
  3688.    sta (zp),y
  3689.    dex
  3690.    dey
  3691.    bne -
  3692. +  lda rlPageData,x
  3693.    sta (zp),y
  3694.    jmp rlPageOpContinue
  3695.  
  3696.    rlPageOpWrite = *
  3697.    dex
  3698.    dey
  3699.    beq +
  3700. -  lda (zp),y
  3701.    sta rlPageData,x
  3702.    dex
  3703.    dey
  3704.    bne -
  3705. +  lda (zp),y
  3706.    sta rlPageData,x
  3707.  
  3708.    rlPageOpContinue = *
  3709.    sta rlSram
  3710.    sta rlDeactivate
  3711.    plp
  3712.    rts
  3713.  
  3714.    rlPageOpReu = * ;( [mp]=rlmem, (zp)=nearmem, .Y=bytes, ramlinkOpcode )
  3715.    ;** ramlink hardware already switched in
  3716.    ldx #1
  3717.    tya
  3718.    beq +
  3719.    ldx #0
  3720.    cmp #0  ;xx cut-off value
  3721.    bcc rlPageOpNonReu
  3722. +  ldy ramlinkOpcode
  3723.    cpy #$90
  3724.    beq +
  3725.    ldy #$90            ;rl->reu->intern
  3726.    jsr rlPageOpReuRl
  3727.    ldy #$91
  3728.    jsr rlPageOpReuIntern
  3729.    jmp ++
  3730. +  ldy #$90            ;intern->reu->rl
  3731.    jsr rlPageOpReuIntern
  3732.    ldy #$91
  3733.    jsr rlPageOpReuRl
  3734. +  sta rlSram
  3735.    sta rlDeactivate
  3736.    plp
  3737.    rts
  3738.  
  3739.    rlPageOpReuIntern = *  ;( .AX=bytes, .Y=op )
  3740.    sta reu+7  ;len
  3741.    stx reu+8
  3742.    sty temp1
  3743.    pha
  3744.    lda zp+0
  3745.    ldy zp+1
  3746.    sta reu+2
  3747.    sty reu+3
  3748.    lda aceReuRlSpeedPage+0
  3749.    ldy aceReuRlSpeedPage+1
  3750.    sta reu+4
  3751.    sty reu+5
  3752.    lda aceReuRlSpeedPage+2
  3753.    sta reu+6
  3754. .if computer-64
  3755.    ldy vic+$30
  3756.    lda #0
  3757.    sta vic+$30
  3758. .ife
  3759.    lda temp1
  3760.    sta reu+1
  3761. .if computer-64
  3762.    sty vic+$30
  3763. .ife
  3764.    pla
  3765.    rts
  3766.  
  3767.    rlPageOpReuRl = *  ;( .AX=bytes, .Y=op )
  3768.    sta reu+7  ;len
  3769.    stx reu+8
  3770.    sty temp1
  3771.    pha
  3772.    lda mp+0
  3773.    ldy #>rlPageData
  3774.    sta reu+2
  3775.    sty reu+3
  3776.    lda aceReuRlSpeedPage+0
  3777.    ldy aceReuRlSpeedPage+1
  3778.    sta reu+4
  3779.    sty reu+5
  3780.    lda aceReuRlSpeedPage+2
  3781.    sta reu+6
  3782. .if computer-64
  3783.    ldy vic+$30
  3784.    lda #0
  3785.    sta vic+$30
  3786. .ife
  3787.    lda temp1
  3788.    sta reu+1
  3789. .if computer-64
  3790.    sty vic+$30
  3791. .ife
  3792.    pla
  3793.    rts
  3794.  
  3795. ;ramlinkOpOld = *  ;( [mp]=farPtr, ramlinkNearPtr, ramlinkLength, ramlinkOpcode)
  3796. ;   jsr rlRegs
  3797. ;   lda ramlinkOpcode
  3798. ;   sta rl+1
  3799. ;   lda ramlinkNearPtr+0
  3800. ;   ldy ramlinkNearPtr+1
  3801. ;   sta rl+2
  3802. ;   sty rl+3
  3803. ;   ldx #0
  3804. ;   lda mp+3
  3805. ;   cmp #aceMemRL
  3806. ;   beq +
  3807. ;   ldx #4
  3808. ;+  lda mp+0
  3809. ;   sta rl+4
  3810. ;   clc
  3811. ;   lda aceRamlinkStart+0,x
  3812. ;   adc mp+1
  3813. ;   sta rl+5
  3814. ;   lda aceRamlinkStart+1,x
  3815. ;   adc mp+2
  3816. ;clc
  3817. ;adc #8
  3818. ;   sta rl+6
  3819. ;   lda ramlinkLength+0
  3820. ;   ldy ramlinkLength+1
  3821. ;   sta rl+7
  3822. ;   sty rl+8
  3823. ;   lda #0
  3824. ;   sta rl+10
  3825. ;   sta rl+16
  3826. ;   jsr rlExec
  3827. ;   clc
  3828. ;   rts
  3829.  
  3830. ;*** aceMemZpstore( .X=ZpSource, [mp]=Dest, .Y=Length ) : .CS=err
  3831.  
  3832. kernMemZpstore = *
  3833. zpstore = *   ;;internally called operation
  3834.    lda mp+3
  3835.    bne +
  3836.    jmp nullPtrError
  3837. +  cmp #aceMemRL
  3838.    bcc +
  3839.    beq zpStoreRL
  3840.    jmp comZpStore-comCodeStart+comCodeBuffer
  3841. +  tya
  3842.    ldy #$90
  3843.    jmp zeroPageReuOp
  3844.  
  3845. zpStoreRL = *
  3846.    lda #$90
  3847.    jmp zeroPageRlOp
  3848.  
  3849. ;*** aceMemFetch( [mp]=FarSource, (zp)=Ram0Dest, .AY=Length )
  3850.  
  3851. fetchLength     .buf 2
  3852. fetchSaveSource .buf 1
  3853. fetchSaveDest   .buf 1
  3854.  
  3855. kernMemFetch = *
  3856. fetch = *    ;;internally called operation
  3857.    ldx mp+3
  3858.    beq fetchNullPtrError
  3859.    cpx #aceMemRL
  3860.    bcs +
  3861.    ldx #$91
  3862.    jmp doReu
  3863. +  beq fetchRL
  3864.    cpy #0
  3865.    bne fetchLong
  3866.    tay
  3867.    bne fetchPage
  3868.    clc
  3869.    rts
  3870.  
  3871.    fetchNullPtrError = *
  3872.    jmp nullPtrError
  3873.  
  3874.    fetchPage = *  ;( [mp]=from, (zp)=to, .Y=len(0=256) )
  3875.    ldx mp+2
  3876.    cpx #0
  3877.    beq +
  3878.    ;xx don't have to worry about the 64 having more than one bank yet
  3879.    jmp comCopyToRam0-comCodeStart+comCodeBuffer
  3880. .if computer-64
  3881. +  stx bkSelectRam0
  3882. .else
  3883. +  ldx #bkRam0
  3884.    stx bkSelect
  3885. .ife
  3886.    dey
  3887.    beq +
  3888. -  lda (mp),y
  3889.    sta (zp),y
  3890.    dey
  3891.    bne -
  3892. +  lda (mp),y
  3893.    sta (zp),y
  3894.    lda #bkACE
  3895.    sta bkSelect
  3896.    clc
  3897.    rts
  3898.  
  3899.    fetchLong = *
  3900.    sta fetchLength
  3901.    sty fetchLength+1
  3902.    lda mp+1
  3903.    sta fetchSaveSource
  3904.    lda zp+1
  3905.    sta fetchSaveDest
  3906.    lda fetchLength+1
  3907.    beq fetchLongExit
  3908. -  ldy #0
  3909.    jsr fetchPage
  3910.    inc mp+1
  3911.    inc zp+1
  3912.    dec fetchLength+1
  3913.    bne -
  3914.  
  3915.    fetchLongExit = *
  3916.    ldy fetchLength
  3917.    beq +
  3918.    jsr fetchPage
  3919. +  lda fetchSaveSource
  3920.    sta mp+1
  3921.    lda fetchSaveDest
  3922.    sta zp+1
  3923.    clc
  3924.    rts
  3925.  
  3926. fetchRL = *
  3927.    ldx #$91
  3928. largeRlOp = *
  3929.    stx ramlinkOpcode
  3930.    sta ramlinkLength+0
  3931.    sty ramlinkLength+1
  3932.    lda zp+0
  3933.    ldy zp+1
  3934.    sta ramlinkNearPtr+0
  3935.    sty ramlinkNearPtr+1
  3936.    jmp ramlinkOp
  3937.  
  3938. ;*** aceMemStash( (zp)=Ram0Source, [mp]=FarDest, .AY=length )
  3939.  
  3940. stashLength     .buf 2
  3941. stashSaveSource .buf 1
  3942. stashSaveDest   .buf 1
  3943.  
  3944. kernMemStash = *
  3945. stash = *        ;;internally called operation
  3946.    ldx mp+3
  3947.    beq stashNullPtrError
  3948.    cpx #aceMemRL
  3949.    bcs +
  3950.    ldx #$90
  3951.    jmp doReu
  3952. +  beq stashRL
  3953.    cpy #0
  3954.    bne stashLong
  3955.    tay
  3956.    bne stashPage
  3957.    clc
  3958.    rts
  3959.  
  3960.    stashNullPtrError = *
  3961.    jmp nullPtrError
  3962.  
  3963.    stashPage = *
  3964.    ldx mp+2
  3965.    cpx #0
  3966.    beq +
  3967.    ;xx don't have to worry about the 64 having more than one bank yet
  3968.    jmp comCopyFromRam0-comCodeStart+comCodeBuffer
  3969. .if computer-64
  3970. +  stx bkSelectRam0
  3971. .else
  3972. +  ldx #bkRam0
  3973.    stx bkSelect
  3974. .ife
  3975.    dey
  3976.    beq +
  3977. -  lda (zp),y
  3978.    sta (mp),y
  3979.    dey
  3980.    bne -
  3981. +  lda (zp),y
  3982.    sta (mp),y
  3983.    lda #bkACE
  3984.    sta bkSelect
  3985.    clc
  3986.    rts
  3987.  
  3988.    stashLong = *
  3989.    sta stashLength
  3990.    sty stashLength+1
  3991.    lda zp+1
  3992.    sta stashSaveSource
  3993.    lda mp+1
  3994.    sta stashSaveDest
  3995.    lda stashLength+1
  3996.    beq stashLongExit
  3997. -  ldy #0
  3998.    jsr stashPage
  3999.    inc mp+1
  4000.    inc zp+1
  4001.    dec stashLength+1
  4002.    bne -
  4003.  
  4004.    stashLongExit = *
  4005.    ldy stashLength
  4006.    beq +
  4007.    ldx mp+2
  4008.    jsr stashPage
  4009. +  lda stashSaveSource
  4010.    sta zp+1
  4011.    lda stashSaveDest
  4012.    sta mp+1
  4013.    clc
  4014.    rts
  4015.  
  4016. stashRL = *
  4017.    ldx #$90
  4018.    jmp largeRlOp
  4019.  
  4020. ;*** ram0 load/store(.X) expansion memory [mp] <- -> (zp) for .AY bytes
  4021.  
  4022. doReu = *
  4023.    bit aceRamlinkAccess
  4024.    bpl +
  4025.    php
  4026.    sei
  4027.    sta rlActivate
  4028. +  sta reu+7
  4029.    sty reu+8
  4030.    lda zp+0
  4031.    ldy zp+1
  4032.    sta reu+2
  4033.    sty reu+3
  4034.    lda mp+0
  4035.    ldy mp+1
  4036.    sta reu+4
  4037.    sty reu+5
  4038.    lda mp+2
  4039.    sta reu+6
  4040. .if computer-64
  4041.    ldy vic+$30
  4042.    lda #0
  4043.    sta vic+$30
  4044. .ife
  4045.    stx reu+1
  4046. .if computer-64
  4047.    sty vic+$30
  4048. .ife
  4049.    bit aceRamlinkAccess
  4050.    bpl +
  4051.    sta rlSram
  4052.    sta rlDeactivate
  4053.    plp
  4054. +  clc
  4055.    rts
  4056.  
  4057. ;*** memory-allocation routines
  4058.  
  4059. freemapBank     .buf 2
  4060. freemapDirty    .buf 1
  4061. freemapPage     .buf 1
  4062. searchMinFail   .buf aceMemTypes
  4063.  
  4064. initMemoryAlloc = *
  4065.    ldx #0
  4066.    ldy #0
  4067.    stx freemapPage
  4068.    stx freemapDirty
  4069. -  lda ram0FreeMap,x
  4070.    sta freemap,x
  4071.    bne +
  4072.    iny
  4073. +  inx
  4074.    bne -
  4075.    lda #0
  4076.    ldy #aceMemInternal
  4077.    sta freemapBank+0
  4078.    sty freemapBank+1
  4079.    lda #$00
  4080.    ldx #0
  4081. -  sta searchMinFail,x
  4082.    inx
  4083.    cpx #aceMemTypes
  4084.    bcc -
  4085.    jsr memReuRlSpeedInit
  4086.    clc
  4087.    rts
  4088.  
  4089. memReuRlSpeedInit = *  ;allocate reu page for ramlink-accessing speedup
  4090.    bit aceReuRlSpeedTry
  4091.    bmi +
  4092.    rts
  4093. +  lda #$ff  ;owned by malloc
  4094.    sta allocProcID
  4095.    lda #1
  4096.    ldx #aceMemREU
  4097.    ldy #aceMemREU
  4098.    jsr kernPageAlloc
  4099.    ldx #3
  4100. -  lda mp,x
  4101.    sta aceReuRlSpeedPage,x
  4102.    dex
  4103.    bpl -
  4104.    rts
  4105.  
  4106. freemapBankSave .buf 2
  4107.  
  4108. getFreemap = *  ;( .AY=bank )
  4109.    cmp freemapBank+0
  4110.    bne +
  4111.    cpy freemapBank+1
  4112.    bne +
  4113.    rts
  4114.  
  4115.    ;** save old freemap
  4116. +  sta freemapBankSave+0
  4117.    sty freemapBankSave+1
  4118.    lda freemapDirty
  4119.    beq +
  4120.    lda freemapBank+0
  4121.    ldy freemapBank+1
  4122.    jsr locateBankFreemap
  4123.    jsr setZpFreemap
  4124.    jsr stash
  4125.  
  4126.    ;** load new freemap
  4127. +  lda freemapBankSave+0
  4128.    ldy freemapBankSave+1
  4129.    sta freemapBank+0
  4130.    sty freemapBank+1
  4131.    jsr locateBankFreemap
  4132.    jsr setZpFreemap
  4133.    jsr fetch
  4134.    lda #0
  4135.    sta freemapDirty
  4136.    sta freemapPage
  4137.    rts
  4138.  
  4139.    setZpFreemap = *  ;() : (zp)=#freemap, .AY=#256
  4140.    lda #<freemap
  4141.    ldy #>freemap
  4142.    sta zp+0
  4143.    sty zp+1
  4144.    lda #<256
  4145.    ldy #>256
  4146.    rts
  4147.  
  4148. locateBankFreemap = *  ;( .AY=bank ) : [mp]
  4149.    sta mp+2
  4150.    sty mp+3
  4151.    lda #<$ff00
  4152.    ldx #>$ff00
  4153.    sta mp+0
  4154.    stx mp+1
  4155.    cpy #aceMemInternal
  4156.    beq +
  4157.    rts
  4158. +  lda mp+2
  4159.    bne +
  4160.    ;** ram0
  4161.    lda aceRam0Freemap+0
  4162.    ldy aceRam0Freemap+1
  4163. -  sta mp+0
  4164.    sty mp+1
  4165.    rts
  4166. +  cmp #1
  4167.    bne +
  4168.    ;** ram1
  4169.    lda #0
  4170.    ldy aceRam1Freemap
  4171.    jmp -
  4172.    ;** exp.int.ram
  4173. +  lda #<$0400
  4174.    ldy #>$0400
  4175.    jmp -
  4176.  
  4177. searchTypeStart .buf 1
  4178. searchTypeStop  .buf 1
  4179. searchSize      .buf 1
  4180. allocProcID     .buf 1
  4181. searchTypeJmp   .word 0,pageAllocREU,pageAllocRL,pageAllocInternal,0,0,0,0
  4182. realMemTypes    .byte aceMemNull,aceMemREU,aceMemRL,aceMemInternal
  4183.                 .byte aceMemREU,aceMemRL,aceMemInternal
  4184.  
  4185. ;kernel procids for pages: $00=free,$01=kernel,$ff=malloc,$fe=tpa,$fd=ramdisk,
  4186. ;                          $fc=devices,$fb=reservedRamdisk
  4187.  
  4188. kernMemAlloc = *  ;( .A=pages, .X=stType, .Y=endType ) : [mp]=farPtr
  4189.    pha
  4190.    lda aceProcessID
  4191.    sta allocProcID
  4192.    pla
  4193. kernPageAlloc = *
  4194.    sta searchSize
  4195.    cmp #0
  4196.    bne +
  4197.    jsr pageAllocFail
  4198.    clc
  4199.    rts
  4200. +  cpx #aceMemREU
  4201.    bcs +
  4202.    ldx #aceMemREU
  4203. +  cpy #aceMemInternal
  4204.    beq +
  4205.    bcc +
  4206.    ldy #aceMemInternal
  4207. +  stx searchTypeStart
  4208.    sty searchTypeStop
  4209. -  lda searchTypeStart
  4210.    cmp searchTypeStop
  4211.    beq +
  4212.    bcs pageAllocFail
  4213. +  ldx searchTypeStart
  4214.    lda searchMinFail,x
  4215.    beq +
  4216.    cmp searchSize
  4217.    beq pageAllocNext
  4218.    bcc pageAllocNext
  4219. +  lda searchTypeStart
  4220.    asl
  4221.    tax
  4222.    lda searchTypeJmp+0,x
  4223.    sta mp+0
  4224.    lda searchTypeJmp+1,x
  4225.    beq pageAllocNext
  4226.    sta mp+1
  4227.    jsr pageAllocDispatch
  4228.    bcc ++
  4229.    ldx searchTypeStart
  4230.    lda searchMinFail,x
  4231.    beq +
  4232.    cmp searchSize
  4233.    bcc pageAllocNext
  4234. +  lda searchSize
  4235.    sta searchMinFail,x
  4236.  
  4237.    pageAllocNext = *
  4238.    inc searchTypeStart
  4239.    jmp -
  4240. +  ldx mp+3
  4241.    lda mp+2
  4242.    cmp minUsedBank,x
  4243.    bcs +
  4244.    sta minUsedBank,x
  4245. +  cmp maxUsedBank,x
  4246.    bcc +
  4247.    sta maxUsedBank,x
  4248. +  clc
  4249.    rts
  4250.  
  4251.    pageAllocDispatch = *
  4252.    jmp (mp)
  4253.  
  4254.    pageAllocFail = *
  4255.    lda #aceErrInsufficientMemory
  4256.    sta errno
  4257.    lda #$00
  4258.    sta mp+0
  4259.    sta mp+1
  4260.    sta mp+2
  4261.    sta mp+3
  4262.    sec
  4263.    rts
  4264.  
  4265. pageAllocREU = *  ;( ) : .X=page, freemapBank, .CC=ok
  4266.    lda #aceMemREU
  4267.    sta mp+3
  4268.    lda aceReuCur
  4269.    ldx aceReuStart
  4270.    ldy aceReuBanks
  4271.    jsr searchType
  4272.    sta aceReuCur
  4273.    rts
  4274.  
  4275. pageAllocInternal = *
  4276.    lda #aceMemInternal
  4277.    sta mp+3
  4278.    lda aceInternalCur
  4279.    ldx #$00
  4280.    ldy aceInternalBanks
  4281.    jsr searchType
  4282.    sta aceInternalCur
  4283.    rts
  4284.  
  4285. pageAllocRL = *
  4286.    lda #aceMemRL
  4287.    sta mp+3
  4288.    lda aceRamlinkCur
  4289.    ldx #$00
  4290.    ldy aceRamlinkBanks
  4291.    jsr searchType
  4292.    sta aceRamlinkCur
  4293.    rts
  4294.  
  4295. searchCurrent .buf 1
  4296. searchStart   .buf 1
  4297. searchStop    .buf 1
  4298.  
  4299. searchType = *  ;( mp+3=type, .A=current, .X=start, .Y=stop ):[mp],.CC,.A=cur,.X
  4300.    sta searchCurrent
  4301.    sta mp+2
  4302.    stx searchStart
  4303.    sty searchStop
  4304.    cpx searchStop
  4305.    bcc +
  4306.    rts
  4307. /  lda mp+2
  4308.    ldy mp+3
  4309.    jsr getFreemap
  4310.    ldy searchSize
  4311.    jsr searchFreemap
  4312.    bcs +
  4313.    lda #0
  4314.    sta mp+0
  4315.    stx mp+1
  4316.    lda mp+2
  4317.    clc
  4318.    rts
  4319. +  inc mp+2
  4320.    lda mp+2
  4321.    cmp searchStop
  4322.    bcc +
  4323.    lda searchStart
  4324.    sta mp+2
  4325. +  lda mp+2
  4326.    cmp searchCurrent
  4327.    bne -
  4328.    sec
  4329.    rts
  4330.  
  4331. searchPages .buf 1
  4332. newmax      .buf 1
  4333.  
  4334. searchFreemap = *  ;( .Y=pages ) : .CC=found, .X=firstPg
  4335.    ;** first free
  4336.    ldx freemapPage
  4337.    lda freemap,x
  4338.    beq +
  4339. -  inx
  4340.    beq freemapFull
  4341.    lda freemap,x
  4342.    bne -
  4343.    stx freemapPage
  4344.    jmp +
  4345.    freemapFull = *
  4346.    sec
  4347.    rts
  4348.  
  4349.    ;** search
  4350. +  sty searchPages
  4351.    cpx #0
  4352.    beq +
  4353.    dex
  4354. -  ldy searchPages
  4355. -  inx
  4356.    beq freemapFull
  4357. +  lda freemap,x
  4358.    bne --
  4359.    dey
  4360.    bne -
  4361.  
  4362.    ;** allocate
  4363.    stx newmax
  4364.    ldy searchPages
  4365.    lda allocProcID
  4366. -  sta freemap,x
  4367.    dex
  4368.    dey
  4369.    bne -
  4370.    inx
  4371.    cpx freemapPage
  4372.    bne +
  4373.    ldy newmax
  4374.    iny
  4375.    sty freemapPage
  4376. +  lda #$ff
  4377.    sta freemapDirty
  4378.    sec
  4379.    lda aceFreeMemory+1
  4380.    sbc searchPages
  4381.    sta aceFreeMemory+1
  4382.    lda aceFreeMemory+2
  4383.    sbc #0
  4384.    sta aceFreeMemory+2
  4385.    bcs +
  4386.    dec aceFreeMemory+3
  4387. +  clc
  4388.    rts
  4389.  
  4390. freePage .buf 1
  4391. freeLen  .buf 1
  4392.  
  4393. kernMemFree = *  ;( [mp]=FarPtr, .A=pages )
  4394.    ldx aceProcessID
  4395.    stx allocProcID
  4396. kernPageFree = *
  4397.    sta freeLen
  4398.    cmp #0
  4399.    bne +
  4400.    jmp pageFreeExit
  4401. +  lda mp+3
  4402.    cmp #aceMemNull
  4403.    bne +
  4404.    lda #aceErrNullPointer
  4405.    jmp pageFreeFail
  4406. +  lda #aceErrInvalidFreeParms
  4407.    ldx mp+0
  4408.    bne pageFreeFail
  4409.    lda mp+1
  4410.    sta freePage
  4411.    clc
  4412.    adc freeLen
  4413.    bcc +
  4414.    lda #aceErrInvalidFreeParms
  4415.    jmp pageFreeFail
  4416. +  lda mp+2
  4417.    ldy mp+3
  4418.    jsr getFreemap
  4419.    lda allocProcID
  4420.    ldx freePage
  4421.    ldy freeLen
  4422. -  cmp freemap,x
  4423.    beq +
  4424.    lda #aceErrFreeNotOwned
  4425.    jmp pageFreeFail
  4426. +  inx
  4427.    dey
  4428.    bne -
  4429.    ldx freePage
  4430.    ldy freeLen
  4431.    lda #$00
  4432. -  sta freemap,x
  4433.    inx
  4434.    dey
  4435.    bne -
  4436.    lda #$ff
  4437.    sta freemapDirty
  4438.    lda freePage
  4439.    cmp freemapPage
  4440.    bcs +
  4441.    sta freemapPage
  4442.    ;** assume 2*(min-1)+len+1 new min
  4443. +  ldx mp+3
  4444.    lda searchMinFail,x
  4445.    beq ++
  4446.    sec
  4447.    sbc #1
  4448.    asl
  4449.    bcs +
  4450.    sec
  4451.    adc freeLen
  4452.    bcc ++
  4453. +  lda #0
  4454. +  sta searchMinFail,x
  4455.  
  4456.    clc
  4457.    lda aceFreeMemory+1
  4458.    adc freeLen
  4459.    sta aceFreeMemory+1
  4460.    bcc pageFreeExit
  4461.    inc aceFreeMemory+2
  4462.    bne pageFreeExit
  4463.    inc aceFreeMemory+3
  4464.  
  4465.    pageFreeExit = *
  4466.    clc
  4467.    rts
  4468.  
  4469.    pageFreeFail = *
  4470.    sta errno
  4471.    sec
  4472.    rts
  4473.  
  4474. kernMemStat = *
  4475.    ldy #0
  4476. -  lda aceFreeMemory,y
  4477.    sta 0,x
  4478.    lda aceTotalMemory,y
  4479.    sta 4,x
  4480.    inx
  4481.    iny
  4482.    cpy #4
  4483.    bcc -
  4484.    lda aceProcessID
  4485.    clc
  4486.    rts
  4487.  
  4488. reclaimMemType .buf 1
  4489.  
  4490. reclaimProcMemory = *
  4491.    ldx #0
  4492. -  lda minUsedBank,x
  4493.    cmp maxUsedBank,x
  4494.    beq +
  4495.    bcs ++
  4496. +  stx reclaimMemType
  4497.    lda minUsedBank,x
  4498.    ldy maxUsedBank,x
  4499.    tax
  4500.    lda reclaimMemType
  4501.    jsr reclaimProcType
  4502.    ldx reclaimMemType
  4503. +  inx
  4504.    cpx #aceMemTypes
  4505.    bcc -
  4506.    rts
  4507.  
  4508. rpBank  .buf 2
  4509. rpEnd   .buf 1
  4510.  
  4511. reclaimProcType = *  ;( .A=type, .X=startBank, .Y=endBank )
  4512.    stx rpBank+0
  4513.    sta rpBank+1
  4514.    sty rpEnd
  4515. -  lda rpBank+0
  4516.    ldy rpBank+1
  4517.    cmp rpEnd
  4518.    beq +
  4519.    bcs ++
  4520. +  jsr getFreemap
  4521.    jsr reclaimProcFreemap
  4522.    inc rpBank+0
  4523.    bne -
  4524. +  rts
  4525.  
  4526. reclaimProcFreemap = *  ;( ) : .Y=pagesRemoved
  4527.    ldy #0
  4528.    ldx #0
  4529.    lda aceProcessID
  4530.    jmp +
  4531. -  inx
  4532.    beq ++
  4533. +  cmp freemap,x
  4534.    bne -
  4535.    lda #0
  4536.    sta freemap,x
  4537.    iny
  4538.    lda aceProcessID
  4539.    jmp -
  4540. +  cpy #0
  4541.    beq +
  4542.    lda #0
  4543.    sta freemapPage
  4544.    ldx freemapBank+1
  4545.    sta searchMinFail,x
  4546.    lda #$ff
  4547.    sta freemapDirty
  4548.    tya
  4549.    clc
  4550.    adc aceFreeMemory+1
  4551.    sta aceFreeMemory+1
  4552.    bcc +
  4553.    inc aceFreeMemory+2
  4554.    bne +
  4555.    inc aceFreeMemory+3
  4556. +  clc
  4557.    rts
  4558.  
  4559. minUsedBank .buf aceMemTypes
  4560. maxUsedBank .buf aceMemTypes  ;plus 1
  4561.  
  4562. clearMemoryInfo = *
  4563.    ldx #aceMemTypes-1
  4564. -  lda #$ff
  4565.    sta minUsedBank,x
  4566.    lda #$00
  4567.    sta maxUsedBank,x
  4568.    dex
  4569.    bpl -
  4570.    rts
  4571.  
  4572. ;*** process primitives
  4573.  
  4574. reclaimSave .buf 1
  4575.  
  4576. reclaimOpenFiles = *
  4577.    jsr kernelClrchn
  4578.    ldx #0
  4579. -  lda lftable,x
  4580.    cmp #lfnull
  4581.    beq +
  4582.    lda pidtable,x
  4583.    cmp aceProcessID
  4584.    bne +
  4585.    stx reclaimSave
  4586.    txa
  4587.    jsr close
  4588.    ldx reclaimSave
  4589. +  inx
  4590.    cpx #fcbCount
  4591.    bcc -
  4592.    rts
  4593.  
  4594. execArgc      .buf 2
  4595. execFrame     .buf 44+4
  4596. execStackNeed .buf 1
  4597. execAddr      .buf 2
  4598. execWork      .buf 2
  4599. execErrExit   .buf 1
  4600. reloadFlag    .buf 1
  4601.  
  4602. kernProcExec = *
  4603. internProcExec = *
  4604.    sta execArgc+0
  4605.    sty execArgc+1
  4606.    ;** load executable
  4607.    lda #<aceAppAddress
  4608.    ldy #>aceAppAddress
  4609.    sta execAddr+0
  4610.    sty execAddr+1
  4611.    jsr execLoadExternal
  4612.    bcc ++
  4613.    lda errno
  4614.    cmp #aceErrFileNotFound
  4615.    beq +
  4616.    pha
  4617.    jsr execReloadProg
  4618.    pla
  4619.    sta errno
  4620. +  sec
  4621.    rts
  4622. +  ldy #$ff
  4623. -  iny
  4624.    lda (zp),y
  4625.    sta stringBuffer,y
  4626.    bne -
  4627.    lda #$80
  4628.    sta reloadFlag
  4629.    jmp execCommon
  4630.  
  4631. kernProcExecSub = *
  4632.    sta execArgc+0
  4633.    sty execArgc+1
  4634.    lda #0  ;null reload name means execsub
  4635.    sta stringBuffer+0
  4636.    lda #10
  4637.    sta execStackNeed
  4638.    lda zp+0
  4639.    ldy zp+1
  4640.    sta execAddr+0
  4641.    sty execAddr+1
  4642.    lda #$00
  4643.    sta reloadFlag
  4644.  
  4645.    execCommon = *
  4646.    ;** put in filename
  4647.    ldx #$ff
  4648. -  inx
  4649.    lda stringBuffer,x
  4650.    bne -
  4651.    inx
  4652.    stx syswork+0
  4653.    sec
  4654.    lda zw+0
  4655.    sbc syswork+0
  4656.    sta syswork+0
  4657.    lda zw+1
  4658.    sbc #0
  4659.    sta syswork+1
  4660.    ldy #0
  4661. -  lda stringBuffer,y
  4662.    sta (syswork),y
  4663.    beq +
  4664.    iny
  4665.    bne -
  4666.  
  4667.    ;** set up new frame info
  4668. +  ldx #1
  4669. -  lda aceFramePtr,x
  4670.    sta execFrame+0,x
  4671.    lda aceArgc,x
  4672.    sta execFrame+2,x
  4673.    lda aceArgv,x
  4674.    sta execFrame+4,x
  4675.    dex
  4676.    bpl -
  4677.    ldx #3
  4678. -  lda mp,x
  4679.    sta execFrame+14,x
  4680.    lda #0
  4681.    sta execFrame+18,x
  4682.    lda #aceMemNull
  4683.    sta execFrame+24,x
  4684.    dex
  4685.    bpl -
  4686.    tsx
  4687.    stx execFrame+22
  4688.    lda reloadFlag
  4689.    sta execFrame+23
  4690.    ldx #7
  4691. -  lda minUsedBank,x
  4692.    sta execFrame+28,x
  4693.    lda maxUsedBank,x
  4694.    sta execFrame+36,x
  4695.    dex
  4696.    bpl -
  4697.  
  4698.    ;** store new frame info
  4699.    sec
  4700.    lda syswork+0
  4701.    sbc #44
  4702.    sta syswork+0
  4703.    bcs +
  4704.    dec syswork+1
  4705. +  ldy #43
  4706. -  lda execFrame,y
  4707.    sta (syswork),y
  4708.    dey
  4709.    bpl -
  4710.  
  4711.    ;** set up globals for new process
  4712.    ldx #1
  4713. -  lda syswork+0,x
  4714.    sta aceFramePtr,x
  4715.    sta aceMemTop,x
  4716.    lda execArgc,x
  4717.    sta aceArgc,x
  4718.    lda zw,x
  4719.    sta aceArgv,x
  4720.    dex
  4721.    bpl -
  4722.    jsr clearMemoryInfo
  4723.  
  4724.    ;** call the new program
  4725.    inc aceProcessID
  4726.    lda execAddr+0
  4727.    ldy execAddr+1
  4728.    sta zp+0
  4729.    sty zp+1
  4730.    lda #0
  4731.    tax
  4732.    tay
  4733.    pha
  4734.    plp
  4735.    jsr aceEnter
  4736.    lda #0
  4737.    ldx #0
  4738.    jmp internExit
  4739.  
  4740.    aceEnter = *
  4741.    jmp (zp)
  4742.  
  4743. exitCodeSave .buf 2
  4744. exitArgc     .buf 2
  4745. exitArgv     .buf 2
  4746.  
  4747. kernProcExit = *
  4748. internExit = *
  4749.    sta exitCodeSave+0
  4750.    stx exitCodeSave+1
  4751.    lda aceFramePtr+0
  4752.    ldy aceFramePtr+1
  4753.    sta syswork+0
  4754.    sty syswork+1
  4755.    ldy #43
  4756. -  lda (syswork),y
  4757.    sta execFrame,y
  4758.    dey
  4759.    bpl -
  4760.    ldx execFrame+22
  4761.    txs
  4762.    ldx #1
  4763. -  lda aceArgc,x
  4764.    sta exitArgc,x
  4765.    lda aceArgv,x
  4766.    sta exitArgv,x
  4767.    lda execFrame+2,x
  4768.    sta aceArgc,x
  4769.    lda execFrame+4,x
  4770.    sta aceArgv,x
  4771.    lda execFrame+0,x
  4772.    sta aceMemTop,x
  4773.    sta aceFramePtr,x
  4774.    dex
  4775.    bpl -
  4776.    lda execFrame+23
  4777.    sta reloadFlag
  4778.  
  4779.    jsr reclaimOpenFiles
  4780.    jsr reclaimProcMemory
  4781.    dec aceProcessID
  4782.    ldx #7
  4783. -  lda execFrame+28,x
  4784.    sta minUsedBank,x
  4785.    lda execFrame+36,x
  4786.    sta maxUsedBank,x
  4787.    dex
  4788.    bpl -
  4789.  
  4790.    ;** reload previous program if necessary
  4791.    ;xx note: currently, a process that was "execsub"ed cannot "exec" another
  4792.    ;xx process or else the "execsub"ed process will not be reloaded, since I
  4793.    ;xx only check the reactivated frame and I don't go all the way back up
  4794.    ;xx looking for a program to reload
  4795.    bit reloadFlag
  4796.    bpl +
  4797.    jsr execReloadProg
  4798. +  nop
  4799.  
  4800.    ;** prepare exit parameters
  4801.    ldx #3
  4802. -  lda execFrame+14,x
  4803.    sta mp,x
  4804.    dex
  4805.    bpl -
  4806.    ldx #1
  4807. -  lda exitArgc,x
  4808.    sta zp,x
  4809.    lda exitArgv,x
  4810.    sta zw,x
  4811.    dex
  4812.    bpl -
  4813.    lda exitCodeSave+0
  4814.    ldx exitCodeSave+1
  4815.    ldy #0
  4816.    clc
  4817.    rts
  4818.  
  4819. execReloadProg = *
  4820.    lda aceFramePtr+0
  4821.    ldy aceFramePtr+1
  4822.    clc
  4823.    adc #44
  4824.    bcc +
  4825.    iny
  4826. +  sta zp+0
  4827.    sty zp+1
  4828.    lda zp+1
  4829.    cmp aceStackTop+1
  4830.    bcs +
  4831.    ldy #0
  4832.    lda (zp),y
  4833.    beq +
  4834.    lda aceFramePtr+0
  4835.    ldy aceFramePtr+1
  4836.    sta zw+0
  4837.    sty zw+1
  4838.    jsr execLoadExternal
  4839.    bcc +
  4840.    lda #<execReloadErrMsg
  4841.    ldy #>execReloadErrMsg
  4842.    sta zp+0
  4843.    sty zp+1
  4844.    lda #<execReloadErrMsgEnd-execReloadErrMsg
  4845.    ldy #>execReloadErrMsgEnd-execReloadErrMsg
  4846.    ldx #stderr
  4847.    jsr write
  4848.    lda #255
  4849.    ldx #0
  4850.    jmp internExit
  4851. +  clc
  4852.    rts
  4853.  
  4854. execReloadErrMsg = *
  4855.    .asc "acekernel: Error attempting to reload program"
  4856.    .byte chrCR
  4857. execReloadErrMsgEnd = *
  4858.  
  4859. ;** load external file into transient program area
  4860. loadPathPos .buf 1
  4861. loadGiveUp  .buf 1
  4862. loadZpSave  .buf 2
  4863.  
  4864. execLoadExternal = * ;( (zp)=given program name, (zw)=high load address ) : (zp)
  4865.    lda #0
  4866.    sta aceAppAddress+3
  4867.    lda #0
  4868.    sta loadPathPos
  4869.    sta loadGiveUp
  4870.    lda zp+0
  4871.    ldy zp+1
  4872.    sta loadZpSave+0
  4873.    sty loadZpSave+1
  4874.  
  4875.    execTryLoadAgain = *
  4876.    ldy loadPathPos
  4877.    lda configBuf+$140,y
  4878.    beq execCmdNotFound
  4879.    lda loadGiveUp
  4880.    bne execCmdNotFound
  4881.    jsr getloadRestoreZp
  4882.    jsr getLoadPathname
  4883.    lda #<aceAppAddress
  4884.    ldy #>aceAppAddress
  4885.    jsr internBload
  4886.    jsr getloadRestoreZp
  4887.    bcs execLoadError
  4888.    lda aceAppAddress+3
  4889.    cmp #aceID1
  4890.    bne execBadProg
  4891.    lda aceAppAddress+4
  4892.    cmp #aceID2
  4893.    bne execBadProg
  4894.    lda aceAppAddress+5
  4895.    cmp #aceID3
  4896.    bne execBadProg
  4897.    clc
  4898.    rts
  4899.  
  4900.    execLoadError = *
  4901.    lda errno
  4902.    cmp #aceErrFileNotFound
  4903.    beq execTryLoadAgain
  4904.    cmp #aceErrDeviceNotPresent
  4905.    beq execTryLoadAgain
  4906.    cmp #aceErrIllegalDevice
  4907.    beq execTryLoadAgain
  4908.    cmp #aceErrDiskOnlyOperation
  4909.    beq execTryLoadAgain
  4910.    sec
  4911.    rts
  4912.  
  4913.    execBadProg = *
  4914.    lda #aceErrBadProgFormat
  4915.    sta errno
  4916.    sec
  4917.    rts
  4918.  
  4919.    execCmdNotFound = *
  4920.    lda #aceErrFileNotFound
  4921.    sta errno
  4922.    sec
  4923.    rts
  4924.  
  4925. getloadRestoreZp = *
  4926.    lda loadZpSave+0
  4927.    ldy loadZpSave+1
  4928.    sta zp+0
  4929.    sty zp+1
  4930.    rts
  4931.  
  4932. getLoadPathname = *  ;( (zp)=filename, aceShellPath, loadPathPos ) : (zp)=lname
  4933.    ldy loadPathPos
  4934.    ldx #0
  4935. -  lda configBuf+$140,y
  4936.    beq +
  4937.    sta stringBuffer,x
  4938.    iny
  4939.    inx
  4940.    bne -
  4941. +  iny
  4942.    sty loadPathPos
  4943.    ldy #1
  4944.    lda (zp),y
  4945.    cmp #":"
  4946.    beq +
  4947.    dey
  4948.    lda (zp),y
  4949.    cmp #"/"
  4950.    bne getPathReally
  4951. +  sta loadGiveUp
  4952.    ldx #0
  4953.  
  4954.    getPathReally = *
  4955.    ldy #0
  4956. -  lda (zp),y
  4957.    sta stringBuffer,x
  4958.    beq +
  4959.    inx
  4960.    iny
  4961.    bne -
  4962. +  lda #<stringBuffer
  4963.    ldy #>stringBuffer
  4964.    sta zp+0
  4965.    sty zp+1
  4966.    rts
  4967.  
  4968. ;blank line at end
  4969.  
  4970. acewin.s
  4971. 103
  4972. ;ACE-128/64 kernel window driver: low-level screen-device operations
  4973.  
  4974. winStart     .buf 2
  4975. winRows      .buf 1
  4976. winCols      .buf 1
  4977. winStartRow  .buf 1
  4978. winStartCol  .buf 1
  4979. winRowInc    .buf 2
  4980. winUnderline .buf 1
  4981.  
  4982. textMode .buf 1
  4983.  
  4984. screenInit = *
  4985.    lda #0
  4986.    sta textMode
  4987. .if computer-64
  4988.    lda #25
  4989.    sta conScrReqRows
  4990.    jsr vdcStartup
  4991.    jsr vicInit
  4992.    ldx #80
  4993.    bit $d7
  4994.    bmi +
  4995.    ldx #40
  4996. +  lda #0
  4997.    jsr kernConScreen
  4998. .else
  4999.    jsr vdcStartup
  5000.    jsr vicInit
  5001.    ldx #40
  5002.    bit configBuf+$c0
  5003.    bvc +
  5004.    ldx #80
  5005. +  lda #0
  5006.    jsr kernConScreen
  5007. .ife
  5008.    rts
  5009.  
  5010. kernWinMax = *
  5011. winmax = *
  5012.    bit textMode
  5013.    bmi +
  5014.    jmp vicWinmax
  5015. +  jmp vdcWinmax
  5016.  
  5017. kernWinCls = *
  5018. wincls = *
  5019.    bit textMode
  5020.    bmi +
  5021.    jmp vicWincls
  5022. +  jmp vdcWincls
  5023.  
  5024. kernWinSet = *
  5025. winset = *
  5026.    bit textMode
  5027.    bmi +
  5028.    jmp vicWinset
  5029. +  jmp vdcWinset
  5030.  
  5031. kernWinSize = *
  5032. winsize = *
  5033.    bit textMode
  5034.    bmi +
  5035.    jmp vicWinsize
  5036. +  jmp vdcWinsize
  5037.  
  5038. kernWinPut = *
  5039. winput = *
  5040.    bit textMode
  5041.    bmi +
  5042.    jmp vicWinput
  5043. +  jmp vdcWinput
  5044.  
  5045. kernWinColor = *
  5046. wincolor = *
  5047.    bit textMode
  5048.    bmi +
  5049.    jmp vicWincolor
  5050. +  jmp vdcWincolor
  5051.  
  5052. kernWinPos = *
  5053. winpos = *
  5054.    bit textMode
  5055.    bmi +
  5056.    jmp vicWinpos
  5057. +  jmp vdcWinpos
  5058.  
  5059. kernWinCursor = *
  5060. wincursor = *
  5061.    bit textMode
  5062.    bmi +
  5063.    jmp vicWincursor
  5064. +  jmp vdcWincursor
  5065.  
  5066. kernWinScroll = *
  5067. winscroll = *
  5068.    bit textMode
  5069.    bmi +
  5070.    jmp vicWinscroll
  5071. +  jmp vdcWinscroll
  5072.  
  5073. ;the end + blank line
  5074.  
  5075. acevdc.s
  5076. 1239
  5077. ;ACE-128/64 kernel VDC 80-column screen driver code
  5078.  
  5079. ;vdc memory layout: $0000=char,$1000=color,$2000=charset,$3000=altcharset
  5080.  
  5081. vdcColorAddr = $1000
  5082. vdcCharsetAddr = $2000
  5083. vdcSelect = $d600
  5084. vdcStatus = $d600
  5085. vdcData = $d601
  5086. vdcRowInc = 80
  5087.  
  5088. vdcWinScrX   .buf 1
  5089. vdcWinScrY   .buf 1
  5090. vdcWinRows   .buf 1
  5091. vdcWinCols   .buf 1
  5092. vdcWinStart  .buf 2
  5093. vdcWinSaveSz .buf 2
  5094. vdcScrRows   .byte 25
  5095. vdcScrCols   .byte 80
  5096. vdcRegNum    .buf 1
  5097. vdcCursorLoc .buf 2
  5098. vdcRegSaves  .buf 5
  5099. vdcRegSave5  .buf 1
  5100. vdcRegSave7  .buf 1
  5101.  
  5102. vdcRegSaveIndex .byte 0,4,8,9,6,5,7
  5103.  
  5104. vdcStartup = *
  5105.    ldy #6
  5106. -  lda vdcRegSaveIndex,y
  5107.    tax
  5108.    jsr vdcRead
  5109.    sta vdcRegSaves,y
  5110.    dey
  5111.    bpl -
  5112. vdcReloadInit = *
  5113.    ;** charset
  5114.    jsr vdcFillMode
  5115.    jsr vdcLoadCharset
  5116.    ;xx fall through
  5117.  
  5118. vdcInit = *
  5119.    jsr vdcFillMode
  5120.    ;** init screen colors
  5121.    nop
  5122.    ;** set attributes address
  5123.    lda #<vdcColorAddr
  5124.    ldy #>vdcColorAddr
  5125.    ldx #$14
  5126.    jsr vdcWrite16
  5127.    ;** cursor height
  5128.    lda #8
  5129.    ldx #$0b
  5130.    jsr vdcWrite
  5131.    ;** screen rows
  5132.    lda conScrReqRows
  5133.    sta vdcScrRows
  5134.    jsr vdcSetRows
  5135.    ;** window parameters
  5136.    jsr vdcWinmax
  5137.    rts
  5138.  
  5139. vdcShutdown = *
  5140.    lda #25
  5141.    sta conScrReqRows
  5142.    jsr vdcInit
  5143.    ;** restore charsets
  5144.    lda #<$d000
  5145.    ldy #>$d000
  5146.    jsr vdcGetRomCharset
  5147.    jsr vdcLoadCharset
  5148.    lda #<$d800
  5149.    ldy #>$d800
  5150.    jsr vdcGetRomCharset
  5151.    lda #<$3000
  5152.    ldy #>$3000
  5153.    jsr vdcLoadSpecCharset
  5154.    ;** restore attributes
  5155.    lda #<$800
  5156.    ldy #>$800
  5157.    ldx #$14
  5158.    jsr vdcWrite16
  5159.    ;** restore cursor height
  5160.    lda #7
  5161.    ldx #$0b
  5162.    jsr vdcWrite
  5163.    rts
  5164.  
  5165. vdcGetRomCharset = *
  5166.    sta syswork+0
  5167.    sty syswork+1
  5168.    lda #<$f000
  5169.    ldy #>$f000
  5170.    sta syswork+2
  5171.    sty syswork+3
  5172.    php
  5173.    sei
  5174.    lda #bkCharset
  5175.    sta bkSelect
  5176.    ldx #8
  5177.    ldy #0
  5178. -  lda (syswork+0),y
  5179.    sta (syswork+2),y
  5180.    iny
  5181.    bne -
  5182.    inc syswork+1
  5183.    inc syswork+3
  5184.    dex
  5185.    bne -
  5186.    lda #bkACE
  5187.    sta bkSelect
  5188.    plp
  5189.    rts
  5190.  
  5191. chsSource = syswork+0
  5192. chsCount  = syswork+2
  5193.  
  5194. vdcLoadCharset = *
  5195.    lda #<vdcCharsetAddr
  5196.    ldy #>vdcCharsetAddr
  5197.    vdcLoadSpecCharset = *
  5198.    jsr vdcAddrWrite16
  5199.    lda #<$f000
  5200.    ldy #>$f000
  5201.    sta chsSource+0
  5202.    sty chsSource+1
  5203.    ldx #0
  5204.    stx chsCount
  5205.    lda #%00111110  ;ram0 + i/o
  5206.    sta bkSelect
  5207.  
  5208.    charLoop = *
  5209.    lda #$1f
  5210.    sta vdcRegNum
  5211.    sta vdcSelect
  5212.    ldy #0
  5213. -  lda (chsSource),y
  5214. -  bit vdcStatus
  5215.    bpl -
  5216.    sta vdcData
  5217.    iny
  5218.    cpy #8
  5219.    bcc --
  5220.    lda #$00
  5221.    jsr vdcRamWrite
  5222.    ldx #$1e
  5223.    lda #7
  5224.    jsr vdcWrite
  5225.    clc
  5226.    lda chsSource+0
  5227.    adc #8
  5228.    sta chsSource+0
  5229.    bcc +
  5230.    inc chsSource+1
  5231. +  inc chsCount
  5232.    bne charLoop
  5233.    lda #bkACE
  5234.    sta bkSelect
  5235.    rts
  5236.  
  5237. vdcFillMode = *  ;( )
  5238.    ldx #$18
  5239.    jsr vdcRead
  5240.    and #$7f
  5241.    jsr vdcWrite
  5242.    rts
  5243.  
  5244. vdcCopyMode = *  ;( )
  5245.    ldx #$18
  5246.    jsr vdcRead
  5247.    ora #$80
  5248.    jsr vdcWrite
  5249.    rts
  5250.    
  5251. vdcRamWrite = *  ;( .A=value )
  5252.    ldx #$1f
  5253.  
  5254. vdcWrite = *  ;( .X=register, .A=value )
  5255.    stx vdcRegNum
  5256.    stx vdcSelect
  5257. -  bit vdcStatus
  5258.    bpl -
  5259.    sta vdcData
  5260.    rts
  5261.  
  5262. vdcAddrWrite16 = *  ;( .AY=value )
  5263.    ldx #$12
  5264.  
  5265. vdcWrite16 = *  ;( .X=hiRegister, .AY=value )
  5266.    stx vdcRegNum
  5267.    stx vdcSelect
  5268. -  bit vdcStatus
  5269.    bpl -
  5270.    sty vdcData
  5271.    inx
  5272.    stx vdcRegNum
  5273.    stx vdcSelect
  5274. -  bit vdcStatus
  5275.    bpl -
  5276.    sta vdcData
  5277.    rts
  5278.  
  5279. vdcRamRead = *  ;( ) : .A=value
  5280.    ldx #$1f
  5281.  
  5282. vdcRead = *  ;( .X=register ) : .A=value
  5283.    stx vdcRegNum
  5284.    stx vdcSelect
  5285. -  bit vdcStatus
  5286.    bpl -
  5287.    lda vdcData
  5288.    rts
  5289.  
  5290. vdcWinmax = *
  5291.    lda #0
  5292.    sta vdcWinScrX
  5293.    sta vdcWinScrY
  5294.    sta vdcWinStart+0
  5295.    sta vdcWinStart+1
  5296.    lda vdcScrRows
  5297.    ldx vdcScrCols
  5298.    sta vdcWinRows
  5299.    stx vdcWinCols
  5300.    jsr conWinChangeCallback
  5301.    clc
  5302.    rts
  5303.  
  5304. vdcClsColor .buf 1
  5305.  
  5306. vdcWincls = *
  5307.    stx vdcFillByte
  5308.    sty vdcClsColor
  5309.    sta syswork+2
  5310.    bit syswork+2
  5311.    bpl +
  5312.    jsr vdcWinclsSetup
  5313.    jsr vdcRowFill
  5314. +  bit syswork+2
  5315.    bvc +
  5316.    jsr vdcWinclsSetup
  5317.    lda vdcClsColor
  5318.    sta vdcFillByte
  5319.    jsr vdcAddColor
  5320.    jsr vdcRowFill
  5321. +  rts
  5322.  
  5323. vdcWinclsSetup = *
  5324.    lda vdcWinStart+0
  5325.    ldy vdcWinStart+1
  5326.    sta syswork+0
  5327.    sty syswork+1
  5328.    lda vdcWinRows
  5329.    sta vdcFillRows
  5330.    rts
  5331.  
  5332. vdcAddColor = *
  5333.    clc
  5334.    lda syswork+1
  5335.    adc #>vdcColorAddr
  5336.    sta syswork+1
  5337.    rts
  5338.  
  5339. vdcFillByte .buf 1
  5340. vdcFillRows .buf 1
  5341. vdcFillCols .buf 1
  5342.  
  5343. vdcRowFill = * ;( (sw+0)=addr++, vdcFillByte, vdcFillRows-- )
  5344.    lda vdcWinCols
  5345.    sta vdcFillCols
  5346.    lda vdcFillRows
  5347.    bne +
  5348.    rts
  5349. /  jsr vdcColFill
  5350.    clc
  5351.    lda syswork+0
  5352.    adc #vdcRowInc
  5353.    sta syswork+0
  5354.    bcc +
  5355.    inc syswork+1
  5356. +  dec vdcFillRows
  5357.    bne -
  5358.    rts
  5359.  
  5360. vdcColFill = * ;( (sw+0)=addr, vdcFillByte, vdcFillCols )
  5361.    lda syswork+0
  5362.    ldy syswork+1
  5363.    jsr vdcAddrWrite16
  5364. vdcColFillGotAddr = *
  5365.    lda vdcFillCols
  5366.    beq +
  5367.    lda vdcFillByte
  5368.    jsr vdcRamWrite
  5369.    ldx vdcFillCols
  5370.    dex
  5371.    beq +
  5372.    txa
  5373.    ldx #$1e
  5374.    jsr vdcWrite
  5375. +  rts
  5376.  
  5377. vdcWinsetRows .buf 1
  5378. vdcWinsetCols .buf 1
  5379.  
  5380. vdcWinset = *
  5381.    sta vdcWinsetRows
  5382.    cmp #0
  5383.    beq vdcWinsetErr
  5384.    stx vdcWinsetCols
  5385.    cpx #0
  5386.    beq vdcWinsetErr
  5387.    clc
  5388.    adc syswork+0
  5389.    cmp vdcScrRows
  5390.    beq +
  5391.    bcc +
  5392.  
  5393.    vdcWinsetErr = *
  5394.    lda #aceErrInvalidWindowParms
  5395.    sta errno
  5396.    sec
  5397.    rts
  5398.  
  5399. +  clc
  5400.    lda vdcWinsetCols
  5401.    adc syswork+1
  5402.    cmp vdcScrCols
  5403.    beq +
  5404.    bcs vdcWinsetErr
  5405. +  lda syswork+0
  5406.    ldx syswork+1
  5407.    sta vdcWinScrY
  5408.    stx vdcWinScrX
  5409.    jsr vdcMult80
  5410.    lda syswork+0
  5411.    ldy syswork+1
  5412.    sta vdcWinStart+0
  5413.    sty vdcWinStart+1
  5414.    lda vdcWinsetRows
  5415.    ldx vdcWinsetCols
  5416.    sta vdcWinRows
  5417.    stx vdcWinCols
  5418.    ;xx vdcWinSaveSz
  5419.    jsr conWinChangeCallback
  5420.    lda vdcWinScrY
  5421.    ldx vdcWinScrX
  5422.    sta syswork+0
  5423.    stx syswork+1
  5424.    clc
  5425.    rts
  5426.  
  5427. vdcWinsize = *
  5428.    lda vdcWinStart+0
  5429.    ldy vdcWinStart+1
  5430.    sta syswork+2
  5431.    sty syswork+3
  5432.    lda #<vdcRowInc
  5433.    ldy #>vdcRowInc
  5434.    sta syswork+4
  5435.    sty syswork+5
  5436.    lda vdcWinScrY
  5437.    ldx vdcWinScrX
  5438.    sta syswork+0
  5439.    stx syswork+1
  5440.    lda vdcWinRows
  5441.    ldx vdcWinCols
  5442.    clc
  5443.    rts
  5444.  
  5445. vdcPutWhich .buf 1
  5446. vdcPutColor .buf 1
  5447. vdcPutLen   .buf 1
  5448.  
  5449. vdcWinput = *
  5450.    sta vdcPutWhich
  5451.    sty vdcFillByte
  5452.    stx vdcPutLen
  5453.    bit vdcPutWhich
  5454.    bpl vdcWinputColor
  5455.    lda syswork+0
  5456.    ldy syswork+1
  5457.    jsr vdcAddrWrite16
  5458.    ldy #0
  5459.    cpy vdcPutLen
  5460.    beq +
  5461.    lda #$1f
  5462.    sta vdcRegNum
  5463.    sta vdcSelect
  5464. -  lda (syswork+2),y 
  5465. -  bit vdcStatus
  5466.    bpl -
  5467.    sta vdcData
  5468.    iny
  5469.    cpy vdcPutLen
  5470.    bcc --
  5471. +  sec
  5472.    lda syswork+5
  5473.    sbc vdcPutLen
  5474.    beq vdcWinputColor
  5475.    tay
  5476.    lda syswork+4
  5477.    jsr vdcRamWrite
  5478.    dey
  5479.    beq vdcWinputColor
  5480.    tya
  5481.    ldx #$1e
  5482.    jsr vdcWrite
  5483.  
  5484.    vdcWinputColor = *
  5485.    bit vdcPutWhich
  5486.    bvs +
  5487.    rts
  5488. +  lda vdcPutWhich
  5489.    and #$20
  5490.    beq +
  5491.    lda vdcFillByte
  5492.    and #$0f
  5493.    sta vdcFillByte
  5494. +  lda vdcPutWhich
  5495.    and #$10
  5496.    beq +
  5497.    lda syswork+6
  5498.    and #$f0
  5499.    ora vdcFillByte
  5500.    sta vdcFillByte
  5501. +  lda syswork+1
  5502.    clc
  5503.    adc #>vdcColorAddr
  5504.    tay
  5505.    lda syswork+0
  5506.    jsr vdcAddrWrite16
  5507.    lda syswork+5
  5508.    sta vdcFillCols
  5509.    jsr vdcColFillGotAddr
  5510.    rts
  5511.  
  5512. vdcWincolor = *
  5513.    php
  5514.    sei
  5515.    bit vdcSsActive
  5516.    bmi vdcWincolorSsActive
  5517.    cmp #128
  5518.    bcc +
  5519.    txa
  5520.    ldx #$1a
  5521.    jsr vdcWrite
  5522. +  and #64
  5523.    beq +
  5524.    tya
  5525.    nop
  5526. +  ldx #$1a
  5527.    jsr vdcRead
  5528.    and #$0f
  5529.    tax
  5530.    tay
  5531.    plp
  5532.    rts
  5533.  
  5534.    vdcWincolorSsActive = *
  5535.    cmp #128
  5536.    bcc +
  5537.    stx vdcSsColor
  5538. +  lda vdcSsColor
  5539.    and #$0f
  5540.    tax
  5541.    tay
  5542.    plp
  5543.    rts
  5544.  
  5545. vdcWinpos = *
  5546.    jsr vdcMult80
  5547.    clc
  5548.    lda syswork+0
  5549.    adc vdcWinStart+0
  5550.    sta syswork+0
  5551.    lda syswork+1
  5552.    adc vdcWinStart+1
  5553.    sta syswork+1
  5554.    rts
  5555.  
  5556. vdcMult80 = *  ;( .A=row:0-255, .X=col ) : (sw+0)=row*80+col, .X:unch
  5557.    sta syswork+0
  5558.    ldy #0
  5559.    sty syswork+1
  5560.    asl
  5561.    rol syswork+1
  5562.    asl
  5563.    rol syswork+1
  5564.    adc syswork+0
  5565.    bcc +
  5566.    inc syswork+1
  5567. +  asl
  5568.    rol syswork+1
  5569.    asl
  5570.    rol syswork+1
  5571.    asl
  5572.    rol syswork+1
  5573.    asl
  5574.    rol syswork+1
  5575.    stx syswork+0
  5576.    clc
  5577.    adc syswork+0
  5578.    bcc +
  5579.    inc syswork+1
  5580. +  sta syswork+0
  5581.    rts
  5582.  
  5583. vdcCursorSave  .buf 1
  5584. vdcCursorColor .buf 1
  5585.  
  5586. vdcWincursor = *
  5587.    cmp #0
  5588.    beq vdcCursorOff
  5589.    sta vdcCursorSave
  5590.    sty vdcCursorColor
  5591.    lda syswork+0
  5592.    ldy syswork+1
  5593.    sta vdcCursorLoc+0
  5594.    sty vdcCursorLoc+1
  5595.    ldx #$0e
  5596.    jsr vdcWrite16
  5597.    ldx #$0a
  5598.    jsr vdcRead
  5599.    and #$1f
  5600.    ldy vdcCursorSave
  5601.    cpy #$fa
  5602.    bne +
  5603.    ora #$40
  5604.    jmp ++
  5605. +  ora #$60
  5606. +  jsr vdcWrite
  5607.    jsr vdcSetColorAddr
  5608.    jsr vdcRamRead
  5609.    sta vdcCursorSave
  5610.    jsr vdcSetColorAddr
  5611.    lda vdcCursorSave
  5612.    and #$f0
  5613.    ora vdcCursorColor
  5614.    jsr vdcRamWrite
  5615.    rts
  5616.  
  5617. vdcCursorOff = *
  5618.    lda vdcCursorLoc+0
  5619.    ldy vdcCursorLoc+1
  5620.    sta syswork+0
  5621.    sty syswork+1
  5622.    ldx #$0a
  5623.    jsr vdcRead
  5624.    and #$1f
  5625.    ora #$20
  5626.    jsr vdcWrite
  5627.    jsr vdcSetColorAddr
  5628.    lda vdcCursorSave
  5629.    jsr vdcRamWrite
  5630.    rts
  5631.  
  5632. vdcSetColorAddr = *  ;( (sw+0)=addr )
  5633.    clc
  5634.    lda syswork+1
  5635.    adc #>vdcColorAddr
  5636.    tay
  5637.    lda syswork+0
  5638.    jmp vdcAddrWrite16
  5639.  
  5640. vdcIrqCursor = *
  5641.    ;** do nothing
  5642.    rts
  5643.  
  5644. vdcScrollDest   = syswork+0
  5645. vdcScrollSource = syswork+2
  5646. vdcScrollRows   .buf 1
  5647. vdcScrollExtra  .buf 1
  5648.  
  5649. vdcWinscroll = *
  5650.    sta syswork+5
  5651.    sty vdcClsColor
  5652.    stx vdcScrollExtra
  5653.    cpx #0
  5654.    bne +
  5655.    rts
  5656. +  cpx vdcWinRows
  5657.    bcc +
  5658.    ldx syswork+4
  5659.    lda syswork+5
  5660.    ldy vdcClsColor
  5661.    jsr vdcWincls
  5662. -  rts
  5663. +  lda syswork+5
  5664.    and #%1000
  5665.    bne +
  5666.    lda syswork+5
  5667.    and #%0100
  5668.    beq -
  5669.    jmp vdcScrollDown
  5670. +  bit syswork+5
  5671.    bpl +
  5672.    jsr vdcScrollUpSetup
  5673.    jsr vdcRowScrollUp
  5674.    lda syswork+4
  5675.    jsr vdcDoScrollExtra
  5676. +  bit syswork+5
  5677.    bvc +
  5678.    jsr vdcScrollUpSetup
  5679.    jsr vdcScrollAddColor
  5680.    jsr vdcRowScrollUp
  5681.    lda vdcClsColor
  5682.    jsr vdcDoScrollExtra
  5683. +  rts
  5684.  
  5685. vdcScrollUpSetup = *
  5686.    lda vdcScrollExtra
  5687.    ldx #0
  5688.    jsr vdcWinpos
  5689.    lda syswork+0
  5690.    ldy syswork+1
  5691.    sta vdcScrollSource+0
  5692.    sty vdcScrollSource+1
  5693.    lda vdcWinStart+0
  5694.    ldy vdcWinStart+1
  5695.    sta vdcScrollDest+0
  5696.    sty vdcScrollDest+1
  5697.    sec
  5698.    lda vdcWinRows
  5699.    sbc vdcScrollExtra
  5700.    sta vdcScrollRows
  5701.    rts
  5702.  
  5703. vdcScrollAddColor = *
  5704.    clc
  5705.    lda syswork+1
  5706.    adc #>vdcColorAddr
  5707.    sta syswork+1
  5708.    lda syswork+3
  5709.    adc #>vdcColorAddr
  5710.    sta syswork+3
  5711.    rts
  5712.  
  5713. vdcDoScrollExtra = *  ;( .A=fillByte, (vdcScrollDest)=addr )
  5714.    sta vdcFillByte
  5715.    lda vdcScrollExtra
  5716.    sta vdcFillRows
  5717.    lda vdcWinCols
  5718.    sta vdcFillCols
  5719.    jsr vdcRowFill
  5720.    rts
  5721.  
  5722. vdcRowScrollUp = * ;( vdcScrollSource++, vdcScrollDest++, vdcScrollRows-- )
  5723.    lda vdcScrollRows
  5724.    bne +
  5725.    rts
  5726. +  jsr vdcCopyMode
  5727. -  jsr vdcColScroll
  5728.    clc
  5729.    lda vdcScrollSource+0
  5730.    adc #vdcRowInc
  5731.    sta vdcScrollSource+0
  5732.    bcc +
  5733.    inc vdcScrollSource+1
  5734. +  clc
  5735.    lda vdcScrollDest+0
  5736.    adc #vdcRowInc
  5737.    sta vdcScrollDest+0
  5738.    bcc +
  5739.    inc vdcScrollDest+1
  5740. +  dec vdcScrollRows
  5741.    bne -
  5742.    jsr vdcFillMode
  5743.    rts
  5744.  
  5745. vdcColScroll = * ;( vdcScrollSource, vdcScrollDest, vdcWinCols )
  5746.    lda vdcScrollDest+0
  5747.    ldy vdcScrollDest+1
  5748.    jsr vdcAddrWrite16
  5749.    lda vdcScrollSource+0
  5750.    ldy vdcScrollSource+1
  5751.    ldx #$20
  5752.    jsr vdcWrite16
  5753.    lda vdcWinCols
  5754.    ldx #$1e
  5755.    jsr vdcWrite
  5756.    rts
  5757.  
  5758. vdcScrollDown = *
  5759.    bit syswork+5
  5760.    bpl +
  5761.    jsr vdcScrollDownSetup
  5762.    jsr vdcRowScrollDown
  5763.    lda syswork+4
  5764.    jsr vdcDoScrollDownExtra
  5765. +  bit syswork+5
  5766.    bvc +
  5767.    jsr vdcScrollDownSetup
  5768.    jsr vdcScrollAddColor
  5769.    jsr vdcRowScrollDown
  5770.    lda vdcClsColor
  5771.    jsr vdcDoScrollDownExtra
  5772. +  rts
  5773.  
  5774. vdcScrollDownSetup = *
  5775.    clc ;sic
  5776.    lda vdcWinRows
  5777.    sbc vdcScrollExtra
  5778.    ldx #0
  5779.    jsr vdcWinpos
  5780.    lda syswork+0
  5781.    ldy syswork+1
  5782.    sta vdcScrollSource+0
  5783.    sty vdcScrollSource+1
  5784.    sec
  5785.    lda vdcWinRows
  5786.    sbc #1
  5787.    ldx #0
  5788.    jsr vdcWinpos
  5789.    lda syswork+0
  5790.    ldy syswork+1
  5791.    sta vdcScrollDest+0
  5792.    sty vdcScrollDest+1
  5793.    sec
  5794.    lda vdcWinRows
  5795.    sbc vdcScrollExtra
  5796.    sta vdcScrollRows
  5797.    rts
  5798.  
  5799. vdcRowScrollDown = * ;( vdcScrollSource--, vdcScrollDest--, vdcScrollRows-- )
  5800.    lda vdcScrollRows
  5801.    bne +
  5802.    rts
  5803. +  jsr vdcCopyMode
  5804. -  jsr vdcColScroll
  5805.    sec
  5806.    lda vdcScrollSource+0
  5807.    sbc #vdcRowInc
  5808.    sta vdcScrollSource+0
  5809.    bcs +
  5810.    dec vdcScrollSource+1
  5811. +  sec
  5812.    lda vdcScrollDest+0
  5813.    sbc #vdcRowInc
  5814.    sta vdcScrollDest+0
  5815.    bcs +
  5816.    dec vdcScrollDest+1
  5817. +  dec vdcScrollRows
  5818.    bne -
  5819.    jsr vdcFillMode
  5820.    rts
  5821.  
  5822. vdcDoScrollDownExtra = *
  5823.    pha
  5824.    clc
  5825.    lda vdcScrollSource+0
  5826.    ldy vdcScrollSource+1
  5827.    adc #vdcRowInc
  5828.    bcc +
  5829.    iny
  5830. +  sta vdcScrollDest+0
  5831.    sty vdcScrollDest+1
  5832.    pla
  5833.    jmp vdcDoScrollExtra 
  5834.  
  5835. ;*** interrupt screen-saver code: **potential vdc-access conflicts**
  5836.  
  5837. vdcSsColor  .buf 1
  5838. vdcSsMode   .buf 1
  5839. vdcSsActive .byte $00
  5840.  
  5841. vdcScreenSave = *
  5842. -  bit vdcStatus
  5843.    bpl -
  5844.    lda vdcRegNum
  5845.    pha
  5846.    ldx #$19
  5847.    jsr vdcRead
  5848.    sta vdcSsMode
  5849.    ldx #$1a
  5850.    jsr vdcRead
  5851.    sta vdcSsColor
  5852.    lda #$ff
  5853.    sta vdcSsActive
  5854.    ldx #$19
  5855.    lda vdcSsMode
  5856.    and #%10111111
  5857.    jsr vdcWrite
  5858.    ldx #$1a
  5859.    lda #$00
  5860.    jsr vdcWrite
  5861.    pla
  5862.    sta vdcRegNum
  5863.    sta vdcSelect
  5864. -  bit vdcStatus
  5865.    bpl -
  5866.    rts
  5867.  
  5868. vdcScreenUnsave = *
  5869. -  bit vdcStatus
  5870.    bpl -
  5871.    lda vdcRegNum
  5872.    pha
  5873.    ldx #$19
  5874.    lda vdcSsMode
  5875.    jsr vdcWrite
  5876.    ldx #$1a
  5877.    lda vdcSsColor
  5878.    jsr vdcWrite
  5879.    lda #$00
  5880.    sta vdcSsActive
  5881.    pla
  5882.    sta vdcRegNum
  5883.    sta vdcSelect
  5884. -  bit vdcStatus
  5885.    bpl -
  5886.    rts
  5887.  
  5888. ;=== hires stuff ===
  5889.  
  5890. ;vdc register values courtesy of Fred Bowen of Commodore
  5891.  
  5892. ;vdc memory: 00000-21359=even frame, 21360-42719=odd frame
  5893.  
  5894. vdcEvenFrame  = 0
  5895. vdcOddFrame   = 21360
  5896. vdcGrMode     .buf 1  ;$00=lores, $ff=hires
  5897. vdcGrColor    .buf 1
  5898.  
  5899. kernGrScreen = *  ; ( .A=grType, .X=borderColor, .Y=BgFgColor )
  5900.    pha           ;               : .A=cols8, (sw+0)=rows, .X=xAspect
  5901.    sty vdcGrColor
  5902.    tya
  5903.    ldx #4
  5904. -  asl
  5905.    lsr vdcGrColor
  5906.    dex
  5907.    bne -
  5908.    ora vdcGrColor
  5909.    sta vdcGrColor
  5910.    ldx #26
  5911.    jsr vdcWrite
  5912.    lda #<640
  5913.    ldy #>640
  5914.    sta conMouseMaxX+0
  5915.    sty conMouseMaxX+1
  5916.    pla
  5917.    cmp #1
  5918.    beq +
  5919.    lda configBuf+$aa
  5920.    cmp #64
  5921.    bcc +
  5922.    jmp aceGrScreenHires
  5923. +  lda #$00      
  5924.    sta vdcGrMode
  5925.    ;** re-select 25 rows
  5926.    lda #25
  5927.    sta conScrReqRows
  5928.    jsr vdcInit
  5929.    ldx #25
  5930.    jsr vdcRead
  5931.    and #%00001111
  5932.    ora #%10000000
  5933.    jsr vdcWrite
  5934.    lda #$00
  5935.    jsr vdcGrFill
  5936.    lda #<200
  5937.    ldy #>200
  5938.    sta syswork+0
  5939.    sty syswork+1
  5940.    sta conMouseMaxY+0
  5941.    sty conMouseMaxY+1
  5942.    jsr conMouseBounds
  5943.    lda #80
  5944.    ldx #2
  5945.    clc
  5946.    rts
  5947.  
  5948.    aceGrScreenHires = *
  5949.    lda #$ff
  5950.    sta vdcGrMode
  5951.    ldy #0
  5952. -  ldx initRegs,y
  5953.    lda initVals,y
  5954.    cpx #25
  5955.    bne +
  5956.    jsr vdcRead
  5957.    and #$0f
  5958.    ora initVals,y
  5959. +  jsr vdcWrite
  5960.    iny
  5961.    cpy #initVals-initRegs
  5962.    bcc -
  5963.    lda #$00
  5964.    jsr vdcGrFill
  5965.    lda #<491
  5966.    ldy #>491
  5967.    sta syswork+0
  5968.    sty syswork+1
  5969.    sta conMouseMaxY+0
  5970.    sty conMouseMaxY+1
  5971.    jsr conMouseBounds
  5972.    lda #80
  5973.    ldx #1
  5974.    clc
  5975.    rts
  5976.  
  5977. initRegs = *
  5978.    .byte 000,001,002,004,005,006,007,008,009,024,025,027,028,020,021
  5979.    .byte 012,013,026,012,013
  5980. initVals = *            
  5981.    .byte $7e,$50,$66,$4c,006,$4c,$47,003,006,000,$80,000,016,166,224
  5982.    .byte 000,000,224,0,0    ;last two = >evenFrame,<evenFrame
  5983.  
  5984. kernGrExit = *  ;( )
  5985.    jsr $e179
  5986.    lda configBuf+$a9
  5987.    sta conScrReqRows
  5988.    jsr vdcReloadInit
  5989.    lda #$e0
  5990.    ldx #$20
  5991.    ldy #$0f
  5992.    jsr vdcWincls
  5993.    jsr conWinInit
  5994.    clc
  5995.    rts
  5996.  
  5997. kernGrFill = *  ;( .A=fillValue )
  5998. vdcGrFill = *
  5999.    pha
  6000.    lda #>vdcEvenFrame
  6001.    ldy #<vdcEvenFrame
  6002.    jsr vdcAddrWrite16
  6003.    ldx #31
  6004.    pla
  6005.    jsr vdcWrite
  6006.    ldy #161
  6007.    bit vdcGrMode
  6008.    bmi +
  6009.    ldy #63
  6010. +  nop
  6011. -  ldx #30
  6012.    lda #$00
  6013.    jsr vdcWrite
  6014.    dey
  6015.    bne -
  6016.    bit vdcGrMode
  6017.    bpl +
  6018.    lda #<vdcOddFrame+19600
  6019.    ldy #>vdcOddFrame+19600
  6020.    jsr vdcAddrWrite16
  6021.    lda #$00
  6022.    jsr vdcRamWrite
  6023.    lda #79
  6024.    ldx #$1e
  6025.    jsr vdcWrite
  6026. +  clc
  6027.    rts
  6028.  
  6029. vdcBmFrame .buf 1
  6030. vdcBmRows  .buf 1
  6031. vdcBmCols  .buf 1
  6032. vdcBmBuffer = stringBuffer
  6033. vdcGrOpFlags = syswork+15
  6034. vdcGrOpFlagsIn .buf 1
  6035.  
  6036. kernGrOp = *  ;( .A=opflags, .X=X, (sw+0)=Y, .Y=cols, (sw+2)=rows, sw+4=interlv,
  6037.    ;**           sw+5=fillval, (sw+6)=sPtr, (sw+8)=dPtr, (sw+10)=mPtr )
  6038.    ;**           <all syswork arguments can change>
  6039.    ;** opflags: $80=get, $40=put, $20=copy, $10=fill,$8=mask,$4=and,$2=xor,$1=or
  6040.    sta vdcGrOpFlags
  6041.    sta vdcGrOpFlagsIn
  6042.    sty vdcBmCols
  6043.    and #$0f
  6044.    beq +
  6045.    bit vdcGrOpFlags
  6046.    bmi +
  6047.    lda #<vdcBmBuffer
  6048.    ldy #>vdcBmBuffer
  6049.    sta syswork+8
  6050.    sty syswork+9
  6051.    lda vdcGrOpFlags
  6052.    ora #$80
  6053.    sta vdcGrOpFlags
  6054. +  clc
  6055.    lda vdcBmCols
  6056.    adc syswork+4
  6057.    sta syswork+4
  6058.    bit vdcGrMode
  6059.    bmi +
  6060.    lda syswork+0
  6061.    ldy syswork+1
  6062.    jsr vdcMult80
  6063.    jmp vdcGrOpLoop
  6064. +  lsr syswork+1
  6065.    lda syswork+0
  6066.    sta vdcBmFrame
  6067.    ror
  6068.    jsr vdcMult80
  6069.    lda vdcBmFrame
  6070.    and #$01
  6071.    beq vdcGrOpLoop
  6072.    clc
  6073.    lda syswork+0
  6074.    adc #<vdcOddFrame
  6075.    sta syswork+0
  6076.    lda syswork+1
  6077.    adc #>vdcOddFrame
  6078.    sta syswork+1
  6079. vdcGrOpLoop = *
  6080.    ldy #0
  6081.    cpy vdcBmCols
  6082.    bne vdcGrOpGet
  6083.    jmp vdcGrOpContinue
  6084. vdcGrOpGet = *
  6085.    bit vdcGrOpFlags
  6086.    bpl vdcGrOpPut
  6087.    lda syswork+0
  6088.    ldy syswork+1
  6089.    jsr vdcAddrWrite16
  6090.    lda #$1f
  6091.    sta vdcRegNum
  6092.    sta vdcSelect
  6093.    ldy #0
  6094. -  bit vdcStatus
  6095.    bpl -
  6096.    lda vdcData
  6097.    sta (syswork+8),y
  6098.    iny
  6099.    cpy vdcBmCols
  6100.    bcc -
  6101. vdcGrOpPut = *
  6102.    bit vdcGrOpFlags
  6103.    bvc vdcGrOpCopy
  6104.    lda syswork+0
  6105.    ldy syswork+1
  6106.    jsr vdcAddrWrite16
  6107.    lda #$1f
  6108.    sta vdcRegNum
  6109.    sta vdcSelect
  6110.    ldy #0
  6111. -  lda vdcGrOpFlags
  6112.    and #$0f
  6113.    bne +
  6114. -  lda (syswork+6),y
  6115.    jmp vdcGrPut
  6116. +  and #$08
  6117.    bne +
  6118.    lda (syswork+8),y
  6119.    jmp ++
  6120. +  lda (syswork+10),y
  6121.    eor #$ff
  6122.    and (syswork+8),y
  6123. +  ldx vdcGrOpFlags
  6124.    stx syswork+14
  6125.    lsr syswork+14
  6126.    bcc +
  6127.    ora (syswork+6),y
  6128.    jmp vdcGrPut
  6129. +  lsr syswork+14
  6130.    bcc +
  6131.    eor (syswork+6),y
  6132.    jmp vdcGrPut
  6133. +  lsr syswork+14
  6134.    bcc -
  6135.    sta syswork+14
  6136.    lda (syswork+6),y
  6137.    eor #$ff
  6138.    and syswork+14
  6139.  
  6140.    vdcGrPut = *
  6141. -  bit vdcStatus
  6142.    bpl -
  6143.    sta vdcData
  6144.    iny
  6145.    cpy vdcBmCols
  6146.    bcc ---
  6147. vdcGrOpCopy = *
  6148.    lda vdcGrOpFlags
  6149.    and #$20
  6150.    beq vdcGrOpFill
  6151.    ldx #$20
  6152.    lda syswork+0
  6153.    ldy syswork+1
  6154.    jsr vdcWrite16
  6155.    lda #$00  ;xx get real address
  6156.    ldy #$00
  6157.    jsr vdcAddrWrite16
  6158.    ldx #$1e
  6159.    lda vdcBmCols
  6160.    jsr vdcWrite
  6161. vdcGrOpFill = *
  6162.    lda vdcGrOpFlags
  6163.    and #$10
  6164.    beq vdcGrOpContinue
  6165.    lda syswork+0
  6166.    ldy syswork+1
  6167.    jsr vdcAddrWrite16
  6168.    lda syswork+5
  6169.    jsr vdcRamWrite
  6170.    ldx vdcBmCols
  6171.    dex
  6172.    beq vdcGrOpContinue
  6173.    txa
  6174.    ldx #$1e
  6175.    jsr vdcWrite
  6176. vdcGrOpContinue = *
  6177.    lda syswork+2+0
  6178.    bne +
  6179.    dec syswork+2+1
  6180. +  dec syswork+2+0
  6181.    lda syswork+2+0
  6182.    ora syswork+2+1
  6183.    bne +
  6184.    clc
  6185.    rts
  6186. +  bit vdcGrOpFlagsIn
  6187.    bmi +
  6188.    clc
  6189.    lda syswork+8+0
  6190.    adc syswork+4
  6191.    sta syswork+8+0
  6192.    bcc +
  6193.    inc syswork+8+1
  6194. +  bit vdcGrOpFlags
  6195.    bvc +
  6196.    clc
  6197.    lda syswork+6+0
  6198.    adc syswork+4
  6199.    sta syswork+6+0
  6200.    bcc +
  6201.    inc syswork+6+1
  6202. +  lda vdcGrOpFlags
  6203.    and #$08
  6204.    beq +
  6205.    clc
  6206.    lda syswork+10+0
  6207.    adc syswork+4
  6208.    sta syswork+10+0
  6209.    bcc +
  6210.    inc syswork+10+1
  6211. +  bit vdcGrMode
  6212.    bmi +
  6213.    lda #<80
  6214.    ldy #>80
  6215.    jmp +++
  6216. +  lda vdcBmFrame
  6217.    inc vdcBmFrame
  6218.    and #$01
  6219.    bne +
  6220.    lda #<vdcOddFrame
  6221.    ldy #>vdcOddFrame
  6222.    jmp ++
  6223.    vdcOddToEvenDiff = 65535-vdcOddFrame+1+80
  6224. +  lda #<vdcOddToEvenDiff
  6225.    ldy #>vdcOddToEvenDiff
  6226. +  clc
  6227.    adc syswork+0
  6228.    sta syswork+0
  6229.    tya
  6230.    adc syswork+1
  6231.    sta syswork+1
  6232.    jmp vdcGrOpLoop
  6233.  
  6234. vdcScreenRvs = *
  6235.    ldx #$18
  6236.    jsr vdcRead
  6237.    ora #%01000000
  6238.    jsr vdcWrite
  6239.    rts
  6240.  
  6241. vdcScreenRvsOff = *
  6242.    ldx #$18
  6243.    jsr vdcRead
  6244.    and #%10111111
  6245.    jsr vdcWrite
  6246.    rts
  6247.  
  6248. vdcSetRows = *  ;( .A=rows )
  6249.    cmp #25+1
  6250.    bcc +
  6251.    cmp configBuf+$cf
  6252.    bcs vdcVerticalCrossover
  6253. +  cmp #30
  6254.    bcc +
  6255.    lda #30
  6256. +  pha
  6257.    ldy #6
  6258. -  lda vdcRegSaveIndex,y
  6259.    tax
  6260.    lda vdcRegSaves,y
  6261.    jsr vdcWrite
  6262.    dey
  6263.    bpl -
  6264.    pla
  6265.    ldx #6
  6266.    jsr vdcWrite
  6267.    cmp #25+1
  6268.    bcc +
  6269.    sec
  6270.    sbc #26
  6271.    tay
  6272.    clc
  6273.    lda vdcRegSave7
  6274.    adc vdcVert7Vals,y
  6275.    ldx #7
  6276.    jsr vdcWrite
  6277.    lda vdcVert5Vals,y
  6278.    ldx #5
  6279.    jsr vdcWrite
  6280. +  rts
  6281.    vdcVert7Vals .byte 1,1,2,2,2
  6282.    vdcVert5Vals .byte 6,4,6,5,1
  6283.  
  6284. vdcVerticalCrossover = *  ;( .A=rows ) : .A=vdcReg5, .Y=vdcReg7
  6285.    cmp #51
  6286.    bcc +
  6287.    lda #51
  6288. +  pha
  6289.    ldy #6
  6290. -  lda vdcRegSaveIndex,y
  6291.    tax
  6292.    lda vdcRegFiftyRows,y
  6293.    jsr vdcWrite
  6294.    dey
  6295.    bpl -
  6296.    pla
  6297.    ldx #6
  6298.    jsr vdcWrite
  6299.    tay
  6300.    clc
  6301.    adc #1
  6302.    lsr
  6303.    and #%11111110
  6304.    clc
  6305.    adc #27
  6306.    cpy #50
  6307.    bcc +
  6308.    lda #53
  6309. +  ldx #7
  6310.    jsr vdcWrite
  6311.    rts
  6312.    vdcRegFiftyRows .byte $80,$38,$ff,$e8,51,$06,$35
  6313.  
  6314. ;the end + blank line
  6315.  
  6316. acevic.s
  6317. 738
  6318. ;ACE-128/64 kernel VIC 40-column screen driver code
  6319.  
  6320. ;aceCharSetPage    = aceStatB+103 ;(1)
  6321. ;aceVic40Page      = aceStatB+104 ;(1)
  6322.  
  6323. vicRowInc = 40
  6324.  
  6325. vicWinScrX   .buf 1
  6326. vicWinScrY   .buf 1
  6327. vicWinRows   .buf 1
  6328. vicWinCols   .buf 1
  6329. vicWinStart  .buf 2
  6330. vicColorOff  .buf 1
  6331.  
  6332. vicInitTemp  .buf 1
  6333.  
  6334. vicInit = *
  6335.    lda vic+$11
  6336.    and #%00011111
  6337.    sta vic+$11
  6338.    lda aceVic40Page
  6339.    asl
  6340.    asl
  6341.    and #%11110000
  6342.    sta vicInitTemp
  6343.    lda aceCharSetPage
  6344.    lsr
  6345.    lsr
  6346.    and #%00001111
  6347.    ora vicInitTemp
  6348.    sta vic+$18
  6349.    lda $dd00
  6350.    and #%11111100
  6351.    sta $dd00
  6352.    ;** window parameters
  6353.    sec
  6354.    lda #$d8
  6355.    sbc aceVic40Page
  6356.    sta vicColorOff
  6357.    jsr vicWinmax
  6358.    rts
  6359.  
  6360. vicShutdown = *
  6361.    lda vic+$11
  6362.    and #%00011111
  6363.    sta vic+$11
  6364.    lda $dd00
  6365.    and #%11111100
  6366.    ora #%00000011
  6367.    sta $dd00
  6368.    lda #$16
  6369.    sta vic+$18
  6370.    rts
  6371.  
  6372. vicWinmax = *
  6373.    lda #0
  6374.    sta vicWinScrX
  6375.    sta vicWinScrY
  6376.    lda #$00
  6377.    ldy aceVic40Page
  6378.    sta vicWinStart+0
  6379.    sty vicWinStart+1
  6380.    lda #25
  6381.    ldx #40
  6382.    sta vicWinRows
  6383.    stx vicWinCols
  6384.    jsr conWinChangeCallback
  6385.    clc
  6386.    rts
  6387.  
  6388. rgbi2vicTab .byte 0,11,6,14,5,13,12,3,2,10,8,4,9,7,15,1
  6389.  
  6390. rgbi2vic = *
  6391.    and #$0f
  6392.    tax
  6393.    lda rgbi2vicTab,x
  6394.    rts
  6395.  
  6396. vic2rgbiTab .byte 0,15,8,7,11,4,2,13,10,12,9,1,6,5,3,14
  6397.  
  6398. vic2rgbi = *
  6399.    and #$0f
  6400.    tax
  6401.    lda vic2rgbiTab,x
  6402.    rts
  6403.  
  6404. vicClsColor .buf 1
  6405.  
  6406. vicWincls = *
  6407.    stx vicFillByte
  6408.    sty vicClsColor
  6409.    sta syswork+2
  6410.    bit syswork+2
  6411.    bpl +
  6412.    jsr vicWinclsSetup
  6413.    jsr vicRowFill
  6414. +  bit syswork+2
  6415.    bvc +
  6416.    jsr vicWinclsSetup
  6417.    lda vicClsColor
  6418.    jsr rgbi2vic
  6419.    sta vicFillByte
  6420.    jsr vicAddColor
  6421.    jsr vicRowFill
  6422. +  rts
  6423.  
  6424. vicWinclsSetup = *
  6425.    lda vicWinStart+0
  6426.    ldy vicWinStart+1
  6427.    sta syswork+0
  6428.    sty syswork+1
  6429.    lda vicWinRows
  6430.    sta vicFillRows
  6431.    rts
  6432.  
  6433. vicAddColor = *
  6434.    clc
  6435.    lda syswork+1
  6436.    adc vicColorOff
  6437.    sta syswork+1
  6438.    rts
  6439.  
  6440. vicFillByte .buf 1
  6441. vicFillRows .buf 1
  6442. vicFillCols .buf 1
  6443.  
  6444. vicRowFill = * ;( (sw+0)=addr++, vicFillByte, vicFillRows-- )
  6445.    lda vicWinCols
  6446.    sta vicFillCols
  6447.    lda vicFillRows
  6448.    bne +
  6449.    rts
  6450. /  jsr vicColFill
  6451.    clc
  6452.    lda syswork+0
  6453.    adc #vicRowInc
  6454.    sta syswork+0
  6455.    bcc +
  6456.    inc syswork+1
  6457. +  dec vicFillRows
  6458.    bne -
  6459.    rts
  6460.  
  6461. vicColFill = * ;( (sw+0)=addr, vicFillByte, vicFillCols )
  6462.    ldy vicFillCols
  6463.    beq +
  6464.    dey
  6465.    lda vicFillByte
  6466. -  sta (syswork),y
  6467.    dey
  6468.    bpl -
  6469. +  rts
  6470.  
  6471. vicWinsetRows .buf 1
  6472. vicWinsetCols .buf 1
  6473.  
  6474. vicWinset = *
  6475.    sta vicWinsetRows
  6476.    cmp #0
  6477.    beq vicWinsetErr
  6478.    stx vicWinsetCols
  6479.    cpx #0
  6480.    beq vicWinsetErr
  6481.    clc
  6482.    adc syswork+0
  6483.    cmp #25
  6484.    beq +
  6485.    bcc +
  6486.  
  6487.    vicWinsetErr = *
  6488.    lda #aceErrInvalidWindowParms
  6489.    sta errno
  6490.    sec
  6491.    rts
  6492.  
  6493. +  clc
  6494.    lda vicWinsetCols
  6495.    adc syswork+1
  6496.    cmp #40
  6497.    beq +
  6498.    bcs vicWinsetErr
  6499. +  lda syswork+0
  6500.    ldx syswork+1
  6501.    sta vicWinScrY
  6502.    stx vicWinScrX
  6503.    jsr vicMult40
  6504.    lda syswork+0
  6505.    sta vicWinStart+0
  6506.    clc
  6507.    lda syswork+1
  6508.    adc aceVic40Page
  6509.    sta vicWinStart+1
  6510.    lda vicWinsetRows
  6511.    ldx vicWinsetCols
  6512.    sta vicWinRows
  6513.    stx vicWinCols
  6514.    jsr conWinChangeCallback
  6515.    lda vicWinScrY
  6516.    ldx vicWinScrX
  6517.    sta syswork+0
  6518.    stx syswork+1
  6519.    clc
  6520.    rts
  6521.  
  6522. vicWinsize = *
  6523.    lda vicWinStart+0
  6524.    ldy vicWinStart+1
  6525.    sta syswork+2
  6526.    sty syswork+3
  6527.    lda #<vicRowInc
  6528.    ldy #>vicRowInc
  6529.    sta syswork+4
  6530.    sty syswork+5
  6531.    lda vicWinScrY
  6532.    ldx vicWinScrX
  6533.    sta syswork+0
  6534.    stx syswork+1
  6535.    lda vicWinRows
  6536.    ldx vicWinCols
  6537.    clc
  6538.    rts
  6539.  
  6540. vicPutWhich .buf 1
  6541. vicPutLen   .buf 1
  6542. vicExtAttr  .buf 1
  6543.  
  6544. vicWinput = *
  6545.    sta vicPutWhich
  6546.    sty vicFillByte
  6547.    stx vicPutLen
  6548.    ldx #$00
  6549.    and #$10
  6550.    beq +
  6551.    ldx syswork+6
  6552. +  stx vicExtAttr
  6553.    bit vicPutWhich
  6554.    bpl vicWinputColor
  6555.    ldy #0
  6556.    cpy vicPutLen
  6557.    beq ++
  6558. -  lda (syswork+2),y
  6559.    bit vicExtAttr
  6560.    bvc +
  6561.    bit conChsetRvsChars
  6562.    bpl +
  6563.    jsr vicReverseChar
  6564. +  sta (syswork+0),y
  6565.    iny
  6566.    cpy vicPutLen
  6567.    bcc -
  6568. +  cpy syswork+5
  6569.    beq vicWinputColor
  6570.    lda syswork+4
  6571.    bit vicExtAttr
  6572.    bvc +
  6573.    bit conChsetRvsChars
  6574.    bpl +
  6575.    jsr vicReverseChar
  6576. +  nop
  6577. -  sta (syswork+0),y
  6578.    iny
  6579.    cpy syswork+5
  6580.    bcc -
  6581.  
  6582.    vicWinputColor = *
  6583.    bit vicPutWhich
  6584.    bvs +
  6585.    rts
  6586. +  clc
  6587.    lda syswork+1
  6588.    adc vicColorOff
  6589.    sta syswork+1
  6590.    lda vicFillByte
  6591.    and #$0f
  6592.    tax
  6593.    ldy aceVicColorOff
  6594.    cmp configBuf+0,y
  6595.    bne vicWinputGotColor
  6596.    lda vicExtAttr
  6597.    and #%01110000
  6598.    beq vicWinputGotColor
  6599.    and #$40
  6600.    beq +
  6601.    bit conChsetRvsChars
  6602.    bmi +
  6603.    ldx configBuf+4,y
  6604.    jmp vicWinputGotColor
  6605. +  lda vicExtAttr
  6606.    and #$20
  6607.    beq +
  6608.    ldx configBuf+2,y
  6609.    jmp vicWinputGotColor
  6610. +  lda vicExtAttr
  6611.    and #$10
  6612.    beq vicWinputGotColor
  6613.    ldx configBuf+1,y
  6614.    jmp vicWinputGotColor
  6615.  
  6616.    vicWinputGotColor = * 
  6617.    txa
  6618.    jsr rgbi2vic
  6619.    ldy syswork+5
  6620.    dey
  6621.    bmi +
  6622. -  sta (syswork),y
  6623.    dey
  6624.    bpl -
  6625. +  sec
  6626.    lda syswork+1
  6627.    sbc vicColorOff
  6628.    sta syswork+1
  6629.    rts
  6630.  
  6631. vicWincolor = *
  6632.    php
  6633.    sei
  6634.    cmp #128
  6635.    bcc +
  6636.    pha
  6637.    txa
  6638.    jsr rgbi2vic
  6639.    sta vic+$21
  6640.    pla
  6641. +  and #64
  6642.    beq vicWincolorExit
  6643.    tya
  6644.    jsr rgbi2vic
  6645.    bit vicSsActive
  6646.    bmi +
  6647.    sta vic+$20
  6648.    jmp vicWincolorExit
  6649. +  sta vicSsColor
  6650.  
  6651.    vicWincolorExit = *
  6652.    bit vicSsActive
  6653.    bmi +
  6654.    lda vic+$20
  6655.    jmp ++
  6656. +  lda vicSsColor
  6657. +  jsr vic2rgbi
  6658.    tay
  6659.    lda vic+$21
  6660.    jsr vic2rgbi
  6661.    tax
  6662.    plp
  6663.    rts
  6664.  
  6665. vicWinpos = *
  6666.    jsr vicMult40
  6667.    clc
  6668.    lda syswork+0
  6669.    adc vicWinStart+0
  6670.    sta syswork+0
  6671.    lda syswork+1
  6672.    adc vicWinStart+1
  6673.    sta syswork+1
  6674.    rts
  6675.  
  6676. vicMult40 = *  ;( .A=row:0-24, .X=col ) : (sw+0)=row*40+col, .X:unch
  6677.    sta syswork+0
  6678.    ldy #0
  6679.    sty syswork+1
  6680.    asl
  6681.    asl
  6682.    adc syswork+0
  6683.    asl
  6684.    rol syswork+1
  6685.    asl
  6686.    rol syswork+1
  6687.    asl
  6688.    rol syswork+1
  6689.    stx syswork+0
  6690.    clc
  6691.    adc syswork+0
  6692.    bcc +
  6693.    inc syswork+1
  6694. +  sta syswork+0
  6695.    rts
  6696.  
  6697. vicCursorChar  .buf 1
  6698. vicCursorColor .buf 1
  6699. vicCursorFlash .byte $00  ;$00=inactive, $ff=active
  6700. vicCursorState .buf 1     ;$00=flashedOff, $ff=flashedOn
  6701. vicCursorCountdown .buf 1
  6702. vicCursorMaxcount  .buf 1
  6703. vicCursorAddr  .buf 2
  6704.  
  6705. vicWincursor = *
  6706.    cmp #0
  6707.    beq vicCursorOff
  6708.    ldx #20
  6709.    cmp #$fa
  6710.    bne +
  6711.    ldx #10
  6712. +  stx vicCursorMaxcount
  6713.    tya
  6714.    jsr rgbi2vic
  6715.    sta vicCursorColor
  6716.    lda syswork+0
  6717.    ldy syswork+1
  6718.    sta vicCursorAddr+0
  6719.    sty vicCursorAddr+1
  6720.    ldx #bkRam0
  6721.    stx bkSelect
  6722.    ldy #0
  6723.    lda (syswork+0),y
  6724.    ldx #bkACE
  6725.    stx bkSelect
  6726.    sta vicCursorChar
  6727.    jsr vicSetColorAddr
  6728.    ldy #0
  6729.    lda (syswork+0),y
  6730.    tax
  6731.    lda vicCursorColor
  6732.    sta (syswork+0),y
  6733.    stx vicCursorColor
  6734.    jsr vicUnsetColorAddr
  6735.    lda #1
  6736.    sta vicCursorCountdown
  6737.    lda #$00
  6738.    sta vicCursorState
  6739.    jsr vicIrqCursorEnter
  6740.    lda #$ff
  6741.    sta vicCursorFlash
  6742.    rts
  6743.  
  6744. vicCursorOff = *
  6745.    lda #$00
  6746.    sta vicCursorFlash
  6747.    lda vicCursorAddr+0
  6748.    ldy vicCursorAddr+1
  6749.    sta syswork+0
  6750.    sty syswork+1
  6751.    ldy #0
  6752.    lda vicCursorChar
  6753.    sta (syswork+0),y
  6754.    jsr vicSetColorAddr
  6755.    lda vicCursorColor
  6756.    sta (syswork+0),y
  6757.    jsr vicUnsetColorAddr
  6758.    rts
  6759.  
  6760. vicIrqWork = $a0
  6761.  
  6762. vicIrqCursor = *
  6763.    bit vicCursorFlash
  6764.    bmi vicIrqCursorEnter
  6765. -  rts
  6766.    vicIrqCursorEnter = *
  6767.    dec vicCursorCountdown
  6768.    bne -
  6769.    lda vicCursorMaxcount
  6770.    sta vicCursorCountdown
  6771.    lda vicCursorState
  6772.    eor #$ff
  6773.    sta vicCursorState
  6774.    lda vicCursorAddr+0
  6775.    ldy vicCursorAddr+1
  6776.    sta vicIrqWork+0
  6777.    sty vicIrqWork+1
  6778.    bit conChsetRvsChars
  6779.    bmi +
  6780.    jmp vicIrqNonRvsCharCursor
  6781. +  ldx #bkRam0
  6782.    stx bkSelect
  6783.    ldy #0
  6784.    lda (vicIrqWork),y
  6785.    ldx #bkACE
  6786.    stx bkSelect
  6787.    jsr vicReverseChar
  6788.    sta (vicIrqWork),y
  6789.    rts
  6790.  
  6791. vicReverseChar = *
  6792.    pha
  6793.    sec
  6794.    sbc #32
  6795.    and #%01000000
  6796.    bne +
  6797.    pla
  6798.    sec
  6799.    sbc #64
  6800.    jmp ++
  6801. +  pla
  6802.    clc
  6803.    adc #64
  6804. +  rts
  6805.  
  6806. vicIrqNonRvsCharCursor = *
  6807.    lda conCharPalette+$1a
  6808.    bit vicCursorState
  6809.    bmi +
  6810.    lda vicCursorChar
  6811. +  ldy #0
  6812.    sta (vicIrqWork),y
  6813.    rts
  6814.  
  6815. vicSetColorAddr = *  ;( (sw+0)=addr ) : (sw+0)=colorAddr
  6816.    clc
  6817.    lda syswork+1
  6818.    adc vicColorOff
  6819.    sta syswork+1
  6820.    rts
  6821.  
  6822. vicUnsetColorAddr = *  ;( (sw+0)=colorAddr ) : (sw+0)=addr
  6823.    sec
  6824.    lda syswork+1
  6825.    sbc vicColorOff
  6826.    sta syswork+1
  6827.    rts
  6828.  
  6829. vicScrollDest   = syswork+0
  6830. vicScrollSource = syswork+2
  6831. vicScrollRows   .buf 1
  6832. vicScrollExtra  .buf 1
  6833.  
  6834. vicWinscroll = *
  6835.    sta syswork+5
  6836.    sty vicClsColor
  6837.    stx vicScrollExtra
  6838.    cpx #0
  6839.    bne +
  6840. -  rts
  6841. +  lda syswork+5
  6842.    and #%1000
  6843.    bne +
  6844.    lda syswork+5
  6845.    and #%0100
  6846.    beq -
  6847.    jmp vicScrollDown
  6848. +  bit syswork+5
  6849.    bpl +
  6850.    cpx vicWinRows
  6851.    bcc +
  6852.    ldx syswork+4
  6853.    lda syswork+5
  6854.    ldy vicClsColor
  6855.    jsr vicWincls
  6856.    rts
  6857. +  bit syswork+5
  6858.    bpl +
  6859.    jsr vicScrollUpSetup
  6860.    jsr vicRowScrollUp
  6861.    lda syswork+4
  6862.    jsr vicDoScrollExtra
  6863. +  bit syswork+5
  6864.    bvc +
  6865.    jsr vicScrollUpSetup
  6866.    jsr vicScrollAddColor
  6867.    jsr vicRowScrollUp
  6868.    lda vicClsColor
  6869.    jsr rgbi2vic
  6870.    jsr vicDoScrollExtra
  6871. +  rts
  6872.  
  6873. vicScrollUpSetup = *
  6874.    lda vicScrollExtra
  6875.    ldx #0
  6876.    jsr vicWinpos
  6877.    lda syswork+0
  6878.    ldy syswork+1
  6879.    sta vicScrollSource+0
  6880.    sty vicScrollSource+1
  6881.    lda vicWinStart+0
  6882.    ldy vicWinStart+1
  6883.    sta vicScrollDest+0
  6884.    sty vicScrollDest+1
  6885.    sec
  6886.    lda vicWinRows
  6887.    sbc vicScrollExtra
  6888.    sta vicScrollRows
  6889.    rts
  6890.  
  6891. vicScrollAddColor = *
  6892.    clc
  6893.    lda syswork+1
  6894.    adc vicColorOff
  6895.    sta syswork+1
  6896.    clc
  6897.    lda syswork+3
  6898.    adc vicColorOff
  6899.    sta syswork+3
  6900.    rts
  6901.  
  6902. vicDoScrollExtra = *  ;( .A=fillByte, (sw+0)=addr )
  6903.    sta vicFillByte
  6904.    lda vicScrollExtra
  6905.    sta vicFillRows
  6906.    lda vicWinCols
  6907.    sta vicFillCols
  6908.    jsr vicRowFill
  6909.    rts
  6910.  
  6911. vicRowScrollUp = * ;( vicScrollSource++, vicScrollDest++, vicScrollRows-- )
  6912.    lda vicScrollRows
  6913.    bne +
  6914.    rts
  6915. +  nop
  6916. -  jsr vicColScroll
  6917.    clc
  6918.    lda vicScrollSource+0
  6919.    adc #vicRowInc
  6920.    sta vicScrollSource+0
  6921.    bcc +
  6922.    inc vicScrollSource+1
  6923. +  clc
  6924.    lda vicScrollDest+0
  6925.    adc #vicRowInc
  6926.    sta vicScrollDest+0
  6927.    bcc +
  6928.    inc vicScrollDest+1
  6929. +  dec vicScrollRows
  6930.    bne -
  6931.    rts
  6932.  
  6933. vicColScroll = * ;( vicScrollSource, vicScrollDest, vicWinCols )
  6934.    lda #bkRam0io
  6935.    sta bkSelect
  6936.    ldy vicWinCols
  6937.    dey
  6938. -  lda (vicScrollSource),y
  6939.    sta (vicScrollDest),y
  6940.    dey
  6941.    bpl -
  6942.    lda #bkACE
  6943.    sta bkSelect
  6944.    rts
  6945.  
  6946. ;========
  6947. vicScrollDown = *
  6948.    bit syswork+5
  6949.    bpl +
  6950.    jsr vicScrollDownSetup
  6951.    jsr vicRowScrollDown
  6952.    lda syswork+4
  6953.    jsr vicDoScrollDownExtra
  6954. +  bit syswork+5
  6955.    bvc +
  6956.    jsr vicScrollDownSetup
  6957.    jsr vicScrollAddColor
  6958.    jsr vicRowScrollDown
  6959.    lda vicClsColor
  6960.    jsr rgbi2vic
  6961.    jsr vicDoScrollDownExtra
  6962. +  rts
  6963.  
  6964. vicScrollDownSetup = *
  6965.    clc ;sic
  6966.    lda vicWinRows
  6967.    sbc vicScrollExtra
  6968.    ldx #0
  6969.    jsr vicWinpos
  6970.    lda syswork+0
  6971.    ldy syswork+1
  6972.    sta vicScrollSource+0
  6973.    sty vicScrollSource+1
  6974.    sec
  6975.    lda vicWinRows
  6976.    sbc #1
  6977.    ldx #0
  6978.    jsr vicWinpos
  6979.    lda syswork+0
  6980.    ldy syswork+1
  6981.    sta vicScrollDest+0
  6982.    sty vicScrollDest+1
  6983.    sec
  6984.    lda vicWinRows
  6985.    sbc vicScrollExtra
  6986.    sta vicScrollRows
  6987.    rts
  6988.  
  6989. vicRowScrollDown = * ;( vicScrollSource--, vicScrollDest--, vicScrollRows-- )
  6990.    lda vicScrollRows
  6991.    bne +
  6992.    rts
  6993. +  nop
  6994. -  jsr vicColScroll
  6995.    sec
  6996.    lda vicScrollSource+0
  6997.    sbc #vicRowInc
  6998.    sta vicScrollSource+0
  6999.    bcs +
  7000.    dec vicScrollSource+1
  7001. +  sec
  7002.    lda vicScrollDest+0
  7003.    sbc #vicRowInc
  7004.    sta vicScrollDest+0
  7005.    bcs +
  7006.    dec vicScrollDest+1
  7007. +  dec vicScrollRows
  7008.    bne -
  7009.    rts
  7010.  
  7011. vicDoScrollDownExtra = *
  7012.    pha
  7013.    clc
  7014.    lda vicScrollSource+0
  7015.    ldy vicScrollSource+1
  7016.    adc #vicRowInc
  7017.    bcc +
  7018.    iny
  7019. +  sta vicScrollDest+0
  7020.    sty vicScrollDest+1
  7021.    pla
  7022.    jmp vicDoScrollExtra 
  7023. ;========
  7024.  
  7025. ;*** interrupt screen-save stuff
  7026.  
  7027. vicSsColor  .buf 1
  7028. vicSsRows   .buf 1
  7029. vicSsActive .byte $00
  7030.  
  7031. vicScreenSave = *
  7032.    lda vic+$11
  7033.    sta vicSsRows
  7034.    lda vic+$20
  7035.    sta vicSsColor
  7036.    lda #$ff
  7037.    sta vicSsActive
  7038.    lda #$00
  7039.    sta vic+$11
  7040.    lda #$00
  7041.    sta vic+$20
  7042.    rts
  7043.  
  7044. vicScreenUnsave = *
  7045.    lda vicSsRows
  7046.    and #%01111111
  7047.    sta vic+$11
  7048.    lda vicSsColor
  7049.    sta vic+$20
  7050.    lda #$00
  7051.    sta vicSsActive
  7052.    rts
  7053.  
  7054. ;the end + blank line
  7055.  
  7056. acevic80.s
  7057. 1499
  7058. ;ACE-64 kernel VIC bitmapped 80-column screen driver code
  7059.  
  7060. ;vic memory layout: $e000=bitmap, $dc00=color, $d800=charset4bit
  7061.  
  7062. vdcCharAddr = $e000
  7063. vdcColorAddr = $cc00
  7064. charset4bit  = $d800
  7065. vdcRowInc = 80
  7066. vdcRowPhysInc = 320
  7067. vdcRowColorInc = 40
  7068.  
  7069. vdcWinScrX   .buf 1   ;maintained in 80x25 style
  7070. vdcWinScrY   .buf 1   ;80x25 style
  7071. vdcWinRows   .buf 1   ;80x25 style
  7072. vdcWinCols   .buf 1   ;80x25 style
  7073. vdcWinStart  .buf 2   ;address from zero based on 80x25 style
  7074. vdcScrRows   .byte 25
  7075. vdcScrCols   .byte 80
  7076. vdcBackColor .buf 1
  7077. vdcChar      .buf 8
  7078.  
  7079. vdcStartup = *
  7080.    lda #aceMemNull
  7081.    sta vdcScrollReuWork+3
  7082.    lda configBuf+$c0
  7083.    and #$20
  7084.    beq +
  7085.    lda #$fc
  7086.    sta allocProcID
  7087.    lda #>8192
  7088.    ldx #aceMemREU
  7089.    ldy #aceMemREU
  7090.    jsr kernPageAlloc
  7091.    bcs ++
  7092.    ldx #3
  7093. -  lda mp,x
  7094.    sta vdcScrollReuWork,x
  7095.    dex
  7096.    bpl -
  7097. +  clc
  7098.    lda mp+1
  7099.    adc #>7680
  7100.    sta mp+1
  7101.    lda #$00
  7102.    ldx #0
  7103. -  sta stringBuffer,x
  7104.    inx
  7105.    bne -
  7106.    lda #<stringBuffer
  7107.    ldy #>stringBuffer
  7108.    sta zp+0
  7109.    sty zp+1
  7110.    lda #<256
  7111.    ldy #>256
  7112.    jsr stash
  7113.    inc mp+1
  7114.    lda #<256
  7115.    ldy #>256
  7116.    jsr stash
  7117. +  rts
  7118.    
  7119. vdcInit = *
  7120.    bit aceSoft80Allocated
  7121.    bmi +
  7122.    sec
  7123.    rts
  7124. +  lda vic+$11
  7125.    and #%01111111
  7126.    ora #%00100000
  7127.    sta vic+$11
  7128.    lda #$38
  7129.    sta vic+$18
  7130.    lda $dd00
  7131.    and #%11111100
  7132.    sta $dd00
  7133.    jsr vdcWinmax
  7134.    lda configBuf+$d7
  7135.    jsr rgbi2vic
  7136.    asl
  7137.    asl
  7138.    asl
  7139.    asl
  7140.    sta vdcBackColor
  7141.    clc
  7142.    rts
  7143.  
  7144. vdcShutdown = *
  7145.    lda vic+$11
  7146.    and #%00011111
  7147.    sta vic+$11
  7148.    lda #$16
  7149.    sta vic+$18
  7150.    lda $dd00
  7151.    and #%11111100
  7152.    ora #%00000011
  7153.    sta $dd00
  7154.    rts
  7155.  
  7156. vicbitWork .buf 1
  7157.  
  7158. rgbi2vicbit = *  ;.A=color, .Y=modPattern
  7159.    pha
  7160.    and #$0f
  7161.    tax
  7162.    lda rgbi2vicTab,x
  7163.    asl
  7164.    asl
  7165.    asl
  7166.    asl
  7167.    sta vicbitWork
  7168.    tya
  7169.    and #$20
  7170.    beq +
  7171.    pla
  7172.    lsr
  7173.    lsr
  7174.    lsr
  7175.    lsr
  7176.    tax
  7177.    lda rgbi2vicTab,x
  7178.    jmp ++
  7179. +  pla
  7180.    lda vdcBackColor
  7181. +  ora vicbitWork
  7182.    rts
  7183.  
  7184. vicbit2rgbi = *
  7185.    brk
  7186.  
  7187. vdcWinmax = *
  7188.    lda #0
  7189.    sta vdcWinStart+0
  7190.    sta vdcWinStart+1
  7191.    sta vdcWinScrX
  7192.    sta vdcWinScrY
  7193.    lda vdcScrRows
  7194.    ldx vdcScrCols
  7195.    sta vdcWinRows
  7196.    stx vdcWinCols
  7197.    jsr conWinChangeCallback
  7198.    clc
  7199.    rts
  7200.  
  7201. vdcClsColor .buf 1
  7202.  
  7203. vdcWincls = *
  7204.    ldx #$00         ;forced fill pattern, for now
  7205.    vdcWinclsPattern = *
  7206.    stx vdcFillByte
  7207.    sta syswork+2
  7208.    tya
  7209.    ldy syswork+2
  7210.    jsr rgbi2vicbit
  7211.    sta vdcClsColor
  7212.    bit syswork+2
  7213.    bpl +
  7214.    jsr vdcWinclsSetup
  7215.    jsr vdcAddChar
  7216.    jsr vdcRowFill
  7217. +  bit syswork+2
  7218.    bvc +
  7219.    lda vdcClsColor
  7220.    sta vdcFillByte
  7221.    jsr vdcWinclsSetup
  7222.    jsr vdcAddColor
  7223.    lda #bkRam0
  7224.    sta bkSelect
  7225.    jsr vdcRowFillColor
  7226.    lda #bkACE
  7227.    sta bkSelect
  7228. +  rts
  7229.  
  7230. vdcWinclsSetup = *
  7231.    lda vdcWinStart+0
  7232.    ldy vdcWinStart+1
  7233.    sta syswork+0
  7234.    sty syswork+1
  7235.    lda vdcWinRows
  7236.    sta vdcFillRows
  7237.    rts
  7238.  
  7239. vdcAddChar = *
  7240.    lda syswork+1
  7241.    asl syswork+0
  7242.    rol
  7243.    asl syswork+0
  7244.    rol
  7245.    clc
  7246.    adc #>vdcCharAddr
  7247.    sta syswork+1
  7248.    rts
  7249.  
  7250. vdcAddColor = *
  7251.    lda syswork+1
  7252.    lsr
  7253.    ror syswork+0
  7254.    clc
  7255.    adc #>vdcColorAddr
  7256.    sta syswork+1
  7257.    rts
  7258.  
  7259. vdcFillByte .buf 1
  7260. vdcFillRows .buf 1
  7261. vdcFillCols .buf 1
  7262.  
  7263. vdcRowFill = * ;( (sw+0)=addr++, vdcFillByte, vdcFillRows-- )
  7264.    lda vdcWinCols
  7265.    sta vdcFillCols
  7266.    lda vdcFillRows
  7267.    bne +
  7268.    rts
  7269. /  jsr vdcColFill
  7270.    clc
  7271.    lda syswork+0
  7272.    adc #<vdcRowPhysInc
  7273.    sta syswork+0
  7274.    lda syswork+1
  7275.    adc #>vdcRowPhysInc
  7276.    sta syswork+1
  7277.    dec vdcFillRows
  7278.    bne -
  7279.    rts
  7280.  
  7281. vdcRowFillColor = * ;( (sw+0)=addr++, vdcFillByte, vdcFillRows-- )
  7282.    lda vdcWinCols
  7283.    sta vdcFillCols
  7284.    lda vdcFillRows
  7285.    bne +
  7286.    rts
  7287. /  jsr vdcColFill
  7288.    clc
  7289.    lda syswork+0
  7290.    adc #<vdcRowColorInc
  7291.    sta syswork+0
  7292.    lda syswork+1
  7293.    adc #>vdcRowColorInc
  7294.    sta syswork+1
  7295.    dec vdcFillRows
  7296.    bne -
  7297.    rts
  7298.  
  7299. vdcColFill = * ;( (sw+0)=addr, vdcFillByte, vdcFillCols )
  7300. vdcColFillGotAddr = *
  7301.    ldy vdcFillCols
  7302.    beq ++
  7303.    lda syswork+1
  7304.    cmp #>vdcCharAddr
  7305.    bcs vdcColFillBitmap
  7306.    lda vdcFillCols
  7307.    clc
  7308.    adc #1 ;round up
  7309.    lsr
  7310.    tay
  7311.    beq ++
  7312.  
  7313.    vdcColf256 = *
  7314.    lda vdcFillByte
  7315.    dey
  7316.    beq +
  7317. -  sta (syswork+0),y
  7318.    dey
  7319.    bne -
  7320. +  sta (syswork+0),y
  7321. +  rts
  7322.  
  7323.    vdcColFillBitmap = *
  7324.    ;xx put in REU-fill option
  7325.    lda vdcFillCols
  7326.    and #%11111110
  7327.    asl
  7328.    asl
  7329.    tay
  7330.    bcc vdcColf256
  7331.    inc syswork+1
  7332.    jsr vdcColf256
  7333.    dec syswork+1
  7334.    ldy #0
  7335.    jmp vdcColf256
  7336.  
  7337. vdcWinsetRows .buf 1
  7338. vdcWinsetCols .buf 1
  7339.  
  7340. vdcWinset = *
  7341.    sta vdcWinsetRows
  7342.    cmp #0
  7343.    beq vdcWinsetErr
  7344.    stx vdcWinsetCols
  7345.    cpx #0
  7346.    beq vdcWinsetErr
  7347.    clc
  7348.    adc syswork+0
  7349.    cmp vdcScrRows
  7350.    beq +
  7351.    bcc +
  7352.  
  7353.    vdcWinsetErr = *
  7354.    lda #aceErrInvalidWindowParms
  7355.    sta errno
  7356.    sec
  7357.    rts
  7358.  
  7359. +  lda syswork+1   ;align left margin
  7360.    and #%11111110
  7361.    sta syswork+1
  7362.    clc
  7363.    lda vdcWinsetCols  ;make even cols
  7364.    adc #1
  7365.    and #%11111110
  7366.    sta vdcWinsetCols
  7367.    adc syswork+1
  7368.    cmp vdcScrCols
  7369.    beq +
  7370.    bcs vdcWinsetErr
  7371. +  lda syswork+0
  7372.    ldx syswork+1
  7373.    sta vdcWinScrY
  7374.    stx vdcWinScrX
  7375.    jsr vdcMult80
  7376.    lda syswork+0
  7377.    ldy syswork+1
  7378.    sta vdcWinStart+0
  7379.    sty vdcWinStart+1
  7380.    lda vdcWinsetRows
  7381.    ldx vdcWinsetCols
  7382.    sta vdcWinRows
  7383.    stx vdcWinCols
  7384.    jsr conWinChangeCallback
  7385.    lda vdcWinScrY
  7386.    ldx vdcWinScrX
  7387.    sta syswork+0
  7388.    stx syswork+1
  7389.    clc
  7390.    rts
  7391.  
  7392. vdcWinsize = *
  7393.    lda vdcWinStart+0
  7394.    ldy vdcWinStart+1
  7395.    sta syswork+2
  7396.    sty syswork+3
  7397.    lda #<vdcRowInc
  7398.    ldy #>vdcRowInc
  7399.    sta syswork+4
  7400.    sty syswork+5
  7401.    lda vdcWinScrY
  7402.    ldx vdcWinScrX
  7403.    sta syswork+0
  7404.    stx syswork+1
  7405.    lda vdcWinRows
  7406.    ldx vdcWinCols
  7407.    clc
  7408.    rts
  7409.  
  7410. vdcPutWhich  .buf 1
  7411. vdcPutColor  .buf 1
  7412. vdcPutLen    .buf 1
  7413. vdcAddr      .buf 2
  7414. vdcPos       .buf 1
  7415. vdcAttrib    .buf 1
  7416. vdcRvsXorLhs .buf 1
  7417. vdcRvsXorRhs .buf 1
  7418.  
  7419. vdcWinput = *
  7420.    sta vdcPutWhich
  7421.    stx vdcPutLen
  7422.    sty vdcPutColor
  7423.    ldx #$00
  7424.    lda vdcPutWhich
  7425.    and #$10
  7426.    beq +
  7427.    ldx syswork+6
  7428. +  stx vdcAttrib
  7429.    lda #$00
  7430.    sta vdcRvsXorLhs
  7431.    sta vdcRvsXorRhs
  7432.    lda vdcAttrib
  7433.    and #$40
  7434.    beq +
  7435.    lda #$f0
  7436.    sta vdcRvsXorLhs
  7437.    lda #$0f
  7438.    sta vdcRvsXorRhs
  7439. +  lda syswork+0
  7440.    ldy syswork+1
  7441.    sta vdcAddr+0
  7442.    sty vdcAddr+1
  7443.    jsr vdcAddChar
  7444.    lda #bkRam0
  7445.    sta bkSelect
  7446.    bit vdcPutWhich
  7447.    bmi +
  7448.    jmp vdcWinputColor
  7449. +  ldy #0
  7450.    sty vdcPos
  7451.  
  7452.    vdcWinputNext = *
  7453.    ldy vdcPos
  7454.    cpy vdcPutLen
  7455.    bcs +
  7456.    lda (syswork+2),y 
  7457.    jmp +++
  7458. +  cpy syswork+5
  7459.    bcc +
  7460.    jmp vdcWinputColor
  7461. +  lda syswork+0
  7462.    and #$07
  7463.    tay
  7464.    lda syswork+4
  7465.    cmp #" "
  7466.    bne +
  7467.    cpy #$00
  7468.    bne +
  7469.    ldy vdcScrollReuWork+3
  7470.    cpy #aceMemNull
  7471.    beq +
  7472.    sec
  7473.    lda syswork+5
  7474.    sbc vdcPos
  7475.    tay
  7476.    lda syswork+4
  7477.    cpy #4
  7478.    bcc +
  7479.    jsr vdcPutQuickFill
  7480.    jmp vdcWinputNext
  7481.  
  7482.    ;** locate character
  7483. +  ldy #0
  7484.    sty syswork+7
  7485.    asl
  7486.    rol syswork+7
  7487.    asl
  7488.    rol syswork+7
  7489.    asl
  7490.    rol syswork+7
  7491.    clc
  7492.    adc #<charset4bit
  7493.    sta syswork+6
  7494.    lda syswork+7
  7495.    adc #>charset4bit
  7496.    sta syswork+7
  7497.  
  7498.    vdcWinputLhs = *
  7499.    lda syswork+0
  7500.    and #$07
  7501.    bne vdcWinputRhs
  7502.    ldy #7
  7503. -  lda (syswork+6),y
  7504.    and #$f0
  7505.    sta vdcChar
  7506.    lda (syswork+0),y
  7507.    and #$0f
  7508.    ora vdcChar
  7509.    eor vdcRvsXorLhs
  7510.    sta (syswork+0),y
  7511.    dey
  7512.    bpl -
  7513.    lda vdcAttrib
  7514.    and #$20
  7515.    beq +
  7516.    ldy #7
  7517.    lda (syswork+0),y
  7518.    ora #$f0
  7519.    sta (syswork+0),y
  7520. +  jmp vdcWinputCont
  7521.  
  7522.    vdcWinputRhs = *
  7523.    lda syswork+0
  7524.    and #%11111000
  7525.    sta syswork+0
  7526.    ldy #7
  7527. -  lda (syswork+6),y
  7528.    and #$0f
  7529.    sta vdcChar
  7530.    lda (syswork+0),y
  7531.    and #$f0
  7532.    ora vdcChar
  7533.    eor vdcRvsXorRhs
  7534.    sta (syswork+0),y
  7535.    dey
  7536.    bpl -
  7537.    lda vdcAttrib
  7538.    and #$20
  7539.    beq +
  7540.    ldy #7
  7541.    lda (syswork+0),y
  7542.    ora #$0f
  7543.    sta (syswork+0),y
  7544. +  lda syswork+0
  7545.    ora #%00000100
  7546.    sta syswork+0
  7547.  
  7548.    vdcWinputCont = *
  7549.    inc vdcPos
  7550.    clc
  7551.    lda syswork+0
  7552.    adc #4
  7553.    sta syswork+0
  7554.    bcc +
  7555.    inc syswork+1
  7556. +  jmp vdcWinputNext
  7557.  
  7558.    vdcWinputColor = *
  7559.    bit vdcPutWhich
  7560.    bvc vdcWinputExit
  7561.    lda vdcAttrib
  7562.    and #$10
  7563.    beq +
  7564.    lda vdcPutColor
  7565.    cmp configBuf+$d0+0
  7566.    beq +
  7567.    lda configBuf+$d0+1
  7568.    sta vdcPutColor
  7569. +  lda vdcPutColor
  7570.    ldy vdcPutWhich
  7571.    jsr rgbi2vicbit
  7572.    sta vdcFillByte
  7573.    lda vdcAddr+0
  7574.    ldy vdcAddr+1
  7575.    sta syswork+0
  7576.    sty syswork+1
  7577.    jsr vdcAddColor
  7578.    lda syswork+5
  7579.    sta vdcFillCols
  7580.    jsr vdcColFill
  7581.  
  7582.    vdcWinputExit = *
  7583.    lda #bkACE
  7584.    sta bkSelect
  7585.    lda vdcAddr+0
  7586.    ldy vdcAddr+1
  7587.    sta syswork+0
  7588.    sty syswork+1
  7589.    rts
  7590.  
  7591. vdcQuickSize  .buf 2
  7592. vdcQuickChars .buf 1
  7593.  
  7594. vdcPutQuickFill = *
  7595.    jsr vdcZpMpSave
  7596.    ldx #3
  7597. -  lda vdcScrollReuWork,x
  7598.    sta mp,x
  7599.    dex
  7600.    bpl -
  7601.    clc
  7602.    lda mp+1
  7603.    adc #>7680
  7604.    sta mp+1
  7605.    lda syswork+0
  7606.    ldy syswork+1
  7607.    sta zp+0
  7608.    sty zp+1
  7609.    sec
  7610.    lda syswork+5
  7611.    sbc vdcPos
  7612.    and #$fe
  7613.    sta vdcQuickChars
  7614.    ldy #0
  7615.    sty vdcQuickSize+1
  7616.    asl
  7617.    rol vdcQuickSize+1
  7618.    asl
  7619.    rol vdcQuickSize+1
  7620.    sta vdcQuickSize+0
  7621.    ldy vdcQuickSize+1
  7622.    ldx #%01110101
  7623.    stx bkSelect
  7624.    jsr fetch
  7625.    lda #bkRam0
  7626.    sta bkSelect
  7627.    clc
  7628.    lda vdcPos
  7629.    adc vdcQuickChars
  7630.    sta vdcPos
  7631.    clc
  7632.    lda syswork+0
  7633.    adc vdcQuickSize+0
  7634.    sta syswork+0
  7635.    lda syswork+1
  7636.    adc vdcQuickSize+1
  7637.    sta syswork+1
  7638.    jsr vdcZpMpRestore
  7639.    rts
  7640.  
  7641. vdcWincolor = *
  7642.    php
  7643.    sei
  7644.    cmp #128
  7645.    bcc +
  7646.    pha
  7647.    txa
  7648.    jsr rgbi2vic
  7649.    sta vic+$21
  7650.    asl
  7651.    asl
  7652.    asl
  7653.    asl
  7654.    sta vdcBackColor
  7655.    pla
  7656. +  and #64
  7657.    beq vdcWincolorExit
  7658.    tya
  7659.    jsr rgbi2vic
  7660.    bit vicSsActive
  7661.    bmi +
  7662.    sta vic+$20
  7663.    jmp vdcWincolorExit
  7664. +  sta vicSsColor
  7665.  
  7666.    vdcWincolorExit = *
  7667.    bit vicSsActive
  7668.    bmi +
  7669.    lda vic+$20
  7670.    jmp ++
  7671. +  lda vicSsColor
  7672. +  jsr vic2rgbi
  7673.    tay
  7674.    lda vic+$21
  7675.    jsr vic2rgbi
  7676.    tax
  7677.    plp
  7678.    rts
  7679.  
  7680. vdcWinpos = *
  7681.    jsr vdcMult80
  7682.    clc
  7683.    lda syswork+0
  7684.    adc vdcWinStart+0
  7685.    sta syswork+0
  7686.    lda syswork+1
  7687.    adc vdcWinStart+1
  7688.    sta syswork+1
  7689.    rts
  7690.  
  7691. vdcPos320 = *
  7692.    jsr vdcMult320
  7693.    clc  ;add four times the 80x25-style start of screen
  7694.    lda vdcWinStart+0
  7695.    ldy vdcWinStart+1
  7696.    sty vdcPos320start+1
  7697.    asl
  7698.    rol vdcPos320start+1
  7699.    asl
  7700.    rol vdcPos320start+1
  7701.    clc
  7702.    adc syswork+0
  7703.    sta syswork+0
  7704.    lda syswork+1
  7705.    adc vdcPos320start+1
  7706.    sta syswork+1
  7707.    vdcPosAdd = *  ;add start addr of bitmap
  7708.    clc
  7709.    lda syswork+0
  7710.    adc #<vdcCharAddr
  7711.    sta syswork+0
  7712.    lda syswork+1
  7713.    adc #>vdcCharAddr
  7714.    sta syswork+1
  7715.    rts
  7716.    vdcPos320start .buf 2
  7717.  
  7718. vdcMult320 = * ;( .A=row:0-50, .X=col ) : (sw+0)=(row*80+col)*4
  7719.    jsr vdcMult80
  7720.    asl syswork+0
  7721.    rol syswork+1
  7722.    asl syswork+0
  7723.    rol syswork+1
  7724.    rts
  7725.  
  7726. vdcMult80 = *  ;( .A=row:0-50, .X=col ) : (sw+0)=row*80+col, .X:unch
  7727.    sta syswork+0
  7728.    ldy #0
  7729.    sty syswork+1
  7730.    asl
  7731.    asl
  7732.    adc syswork+0
  7733.    asl
  7734.    rol syswork+1
  7735.    asl
  7736.    rol syswork+1
  7737.    asl
  7738.    rol syswork+1
  7739.    asl
  7740.    rol syswork+1
  7741.    stx syswork+0
  7742.    clc
  7743.    adc syswork+0
  7744.    bcc +
  7745.    inc syswork+1
  7746. +  sta syswork+0
  7747.    rts
  7748.  
  7749. vdcCursorFlash .byte $00  ;$00=inactive, $ff=active
  7750. vdcCursorState .buf 1     ;$00=flashOff, $ff=flashOn
  7751. vdcCursorCountdown .buf 1
  7752. vdcCursorMaxCntdn  .byte 20
  7753. vdcCursorAddr  .buf 2
  7754.  
  7755. vdcWincursor = *
  7756.    cmp #0
  7757.    beq vdcCursorOff
  7758.    ldx #20
  7759.    cmp #$fa
  7760.    bne +
  7761.    ldx #10
  7762. +  stx vdcCursorMaxCntdn
  7763.    jsr vdcAddChar
  7764.    lda syswork+0
  7765.    ldy syswork+1
  7766.    sta vdcCursorAddr+0
  7767.    sty vdcCursorAddr+1
  7768.    lda #0
  7769.    sta vdcCursorState
  7770.    lda #1
  7771.    sta vdcCursorCountdown
  7772.    jsr vdcIrqCursorEnter
  7773.    lda #$ff
  7774.    sta vdcCursorFlash
  7775.    rts
  7776.  
  7777. vdcCursorOff = *
  7778.    lda #0
  7779.    sta vdcCursorFlash
  7780.    lda vdcCursorAddr+0
  7781.    ldy vdcCursorAddr+1
  7782.    sta syswork+0
  7783.    sty syswork+1
  7784.    lda vdcCursorState
  7785.    beq +
  7786.    lda #1
  7787.    sta vdcCursorCountdown
  7788.    jsr vdcIrqCursorEnter
  7789. +  rts
  7790.  
  7791. vdcIrqWork = $a0
  7792. vdcCursorMask .buf 1
  7793.  
  7794. vdcIrqCursor = *
  7795.    bit vdcCursorFlash
  7796.    bmi vdcIrqCursorEnter
  7797. -  rts
  7798.    vdcIrqCursorEnter = *
  7799.    dec vdcCursorCountdown
  7800.    bne -
  7801.    lda vdcCursorMaxCntdn
  7802.    sta vdcCursorCountdown
  7803.    lda vdcCursorAddr+0
  7804.    ldy vdcCursorAddr+1
  7805.    and #%11111000
  7806.    sta vdcIrqWork+0
  7807.    sty vdcIrqWork+1
  7808.    ldx #$f0
  7809.    lda vdcCursorAddr+0
  7810.    and #%00000111
  7811.    beq +
  7812.    ldx #$0f
  7813. +  stx vdcCursorMask
  7814.    lda #bkRam0
  7815.    sta bkSelect
  7816.    ldy #7
  7817. -  lda (vdcIrqWork),y
  7818.    eor vdcCursorMask
  7819.    sta (vdcIrqWork),y
  7820.    dey
  7821.    bpl -
  7822.    lda #bkACE
  7823.    sta bkSelect
  7824.    lda vdcCursorState
  7825.    eor #$ff
  7826.    sta vdcCursorState
  7827.    rts
  7828.  
  7829. ;*** interrupt screen-saver: work handled by VIC screen driver
  7830.  
  7831. vdcSsColor  .buf 1
  7832. vdcSsMode   .buf 1
  7833. vdcSsActive .byte $00
  7834.  
  7835. vdcScreenSave = *
  7836.    rts
  7837.  
  7838. vdcScreenUnsave = *
  7839.    rts
  7840.  
  7841. ;*** screen-scrolling code ***
  7842.  
  7843. vdcScrollDest   = syswork+0 ;xx dependency
  7844. vdcScrollSource = syswork+2 ;xx dependency
  7845. vdcScrollBytes  = syswork+4
  7846. vdcScrollRows   .buf 1
  7847. vdcScrollExtra  .buf 1
  7848. vdcScrollReuWork .buf 4
  7849. vdcScrollFlags  .buf 1
  7850. vdcScrollFillChar .buf 1
  7851.  
  7852. vdcWinscroll = *
  7853.    sta vdcScrollFlags
  7854.    sty vdcClsColor
  7855.    stx vdcScrollExtra
  7856.    lda syswork+4
  7857.    sta vdcScrollFillChar
  7858.    cpx #0
  7859.    bne +
  7860.    rts
  7861. +  cpx vdcWinRows
  7862.    bcc +
  7863.    ldx vdcScrollFillChar
  7864.    lda vdcScrollFlags
  7865.    ldy vdcClsColor
  7866.    jsr vdcWincls
  7867. -  rts
  7868. +  lda vdcScrollFlags
  7869.    and #$08
  7870.    bne +
  7871.    lda vdcScrollFlags
  7872.    and #$04
  7873.    beq -
  7874.    jmp vdcScrollDown
  7875. +  bit vdcScrollFlags
  7876.    bpl ++
  7877.    ;** scroll characters
  7878.    lda vdcWinCols
  7879.    cmp vdcScrCols
  7880.    bcc +
  7881.    jsr vdcFastScrollUp  ;fast
  7882.    jmp ++
  7883. +  jsr vdcScrollUpSetup ;slow
  7884.    jsr vdcScrollAddChar
  7885.    lda #<vdcRowPhysInc
  7886.    ldy #>vdcRowPhysInc
  7887.    jsr vdcRowScrollUp
  7888.    lda #$00  ;xx vdcScrollFillChar
  7889.    jsr vdcDoScrollExtra
  7890. +  bit vdcScrollFlags
  7891.    bvc +
  7892.    ;** scroll colors
  7893.    jsr vdcScrollUpSetup
  7894.    jsr vdcScrollAddColor
  7895.    lda #<vdcRowColorInc
  7896.    ldy #>vdcRowColorInc
  7897.    jsr vdcRowScrollUp
  7898.    jmp +
  7899.    lda vdcClsColor
  7900.    ldy #$60
  7901.    jsr rgbi2vicbit
  7902.    jsr vdcDoScrollExtra
  7903. +  rts
  7904.  
  7905. vdcFastScrollUp = *  ;if window is entire screen width
  7906.    ;** set length
  7907.    sec
  7908.    lda vdcWinRows
  7909.    sbc vdcScrollExtra
  7910.    ldx #0
  7911.    jsr vdcMult320
  7912.    lda syswork+0
  7913.    ldy syswork+1
  7914.    sta vdcScrollBytes+0
  7915.    sty vdcScrollBytes+1
  7916.    ;** set source
  7917.    lda vdcScrollExtra
  7918.    ldx #0
  7919.    jsr vdcPos320
  7920.    lda syswork+0
  7921.    ldy syswork+1
  7922.    sta vdcScrollSource+0
  7923.    sty vdcScrollSource+1
  7924.    ;** set dest
  7925.    lda #0
  7926.    ldx #0
  7927.    jsr vdcPos320
  7928.    ;** scroll
  7929.    jsr vdcCopyForward
  7930.    ;** blank screen bottom
  7931.    sec
  7932.    lda vdcWinRows
  7933.    sbc vdcScrollExtra
  7934.    ldx #0
  7935.    jsr vdcPos320
  7936.    lda vdcScrollExtra
  7937.    sta vdcFillRows
  7938.    lda #0
  7939.    sta vdcFillByte
  7940.    jsr vdcRowFill
  7941.    rts
  7942.  
  7943. vdcCopyForward = *  ;( vdcScrollSource, vdcScrollDest, vdcScrollBytes )
  7944.    lda vdcScrollReuWork+3
  7945.    cmp #aceMemNull
  7946.    beq +
  7947.    jmp vdcCopyReu
  7948.    ;** set up soft copy
  7949. +  lda #bkRam0
  7950.    sta bkSelect
  7951.    lda vdcScrollSource+0
  7952.    ldy vdcScrollSource+1
  7953.    sta vdcFsFrom+1
  7954.    sty vdcFsFrom+2
  7955.    lda vdcScrollDest+0
  7956.    ldy vdcScrollDest+1
  7957.    sta vdcFsTo+1
  7958.    sty vdcFsTo+2
  7959.    ldy vdcScrollBytes+1
  7960.    ldx #0
  7961.    ;** copy
  7962. vdcFsFrom  lda $ffff,x
  7963. vdcFsTo    sta $ffff,x
  7964.    inx
  7965.    bne vdcFsFrom
  7966.    inc vdcFsFrom+2
  7967.    inc vdcFsTo+2
  7968.    dey
  7969.    bne vdcFsFrom
  7970.    ;** copy last page
  7971.    ldx #5
  7972. -  lda vdcFsFrom,x
  7973.    sta vdcCopyLast,x
  7974.    dex
  7975.    bpl -
  7976.    ldx #0
  7977.    cpx vdcScrollBytes+0
  7978.    beq +
  7979.    vdcCopyLast = *
  7980.    lda $ffff,x
  7981.    sta $ffff,x
  7982.    inx
  7983.    cpx vdcScrollBytes+0
  7984.    bne vdcCopyLast
  7985.    ;** finish
  7986. +  lda #bkACE
  7987.    sta bkSelect
  7988.    rts
  7989.  
  7990. vdcCopyReu = *
  7991.    jsr vdcZpMpSave
  7992.    lda #%01110101
  7993.    sta bkSelect
  7994.    lda vdcScrollSource+0
  7995.    ldy vdcScrollSource+1
  7996.    sta zp+0
  7997.    sty zp+1
  7998.    ldx #3
  7999. -  lda vdcScrollReuWork,x
  8000.    sta mp,x
  8001.    dex
  8002.    bpl -
  8003.    lda vdcScrollBytes+0
  8004.    ldy vdcScrollBytes+1
  8005.    jsr stash
  8006.    lda vdcScrollDest+0
  8007.    ldy vdcScrollDest+1
  8008.    sta zp+0
  8009.    sty zp+1
  8010.    lda vdcScrollBytes+0
  8011.    ldy vdcScrollBytes+1
  8012.    jsr fetch
  8013.    lda #bkACE
  8014.    sta bkSelect
  8015.    jsr vdcZpMpRestore
  8016.    rts
  8017.  
  8018. vdcCopyReuSave .buf 10
  8019.  
  8020. vdcZpMpSave = *
  8021.    ldx #7
  8022. -  lda zp,x
  8023.    sta vdcCopyReuSave+0,x
  8024.    dex
  8025.    bpl -
  8026.    rts
  8027.  
  8028. vdcZpMpRestore = *
  8029.    ldx #7
  8030. -  lda vdcCopyReuSave+0,x
  8031.    sta zp,x
  8032.    dex
  8033.    bpl -
  8034.    rts
  8035.  
  8036. vdcScrollUpSetup = *
  8037.    lda vdcScrollExtra
  8038.    ldx #0
  8039.    jsr vdcWinpos
  8040.    lda syswork+0
  8041.    ldy syswork+1
  8042.    sta vdcScrollSource+0
  8043.    sty vdcScrollSource+1
  8044.    lda vdcWinStart+0
  8045.    ldy vdcWinStart+1
  8046.    sta vdcScrollDest+0
  8047.    sty vdcScrollDest+1
  8048.    sec
  8049.    lda vdcWinRows
  8050.    sbc vdcScrollExtra
  8051.    sta vdcScrollRows
  8052.    rts
  8053.  
  8054. vdcScrollAddChar = *
  8055.    lda syswork+1
  8056.    asl syswork+0
  8057.    rol
  8058.    asl syswork+0
  8059.    rol
  8060.    clc
  8061.    adc #>vdcCharAddr
  8062.    sta syswork+1
  8063.    lda syswork+3
  8064.    asl syswork+2
  8065.    rol
  8066.    asl syswork+2
  8067.    rol
  8068.    clc
  8069.    adc #>vdcCharAddr
  8070.    sta syswork+3
  8071.    rts
  8072.  
  8073. vdcScrollAddColor = *
  8074.    lda syswork+1
  8075.    lsr
  8076.    ror syswork+0
  8077.    clc
  8078.    adc #>vdcColorAddr
  8079.    sta syswork+1
  8080.    lda syswork+3
  8081.    lsr
  8082.    ror syswork+2
  8083.    clc
  8084.    adc #>vdcColorAddr
  8085.    sta syswork+3
  8086.    rts
  8087.  
  8088. vdcDoScrollExtra = *  ;( .A=fillByte, (vdcScrollDest)=addr )
  8089.    sta vdcFillByte
  8090.    lda vdcScrollExtra
  8091.    sta vdcFillRows
  8092.    lda vdcWinCols
  8093.    sta vdcFillCols
  8094.    lda syswork+1
  8095.    cmp #>vdcCharAddr
  8096.    bcc +
  8097.    jmp vdcRowFill
  8098. +  jmp vdcRowFillColor
  8099.  
  8100. vdcRowScupInc .buf 2
  8101.  
  8102. vdcRowScrollUp = * ;(.AY=rowinc, vdcScrollSource, vdcScrollDest, vdcScrollRows)
  8103.    sta vdcRowScupInc+0
  8104.    sty vdcRowScupInc+1
  8105.    lda #bkRam0
  8106.    sta bkSelect
  8107.    lda vdcScrollRows
  8108.    beq +
  8109. -  jsr vdcColScroll
  8110.    clc
  8111.    lda vdcScrollSource+0
  8112.    adc vdcRowScupInc+0
  8113.    sta vdcScrollSource+0
  8114.    lda vdcScrollSource+1
  8115.    adc vdcRowScupInc+1
  8116.    sta vdcScrollSource+1
  8117.    clc
  8118.    lda vdcScrollDest+0
  8119.    adc vdcRowScupInc+0
  8120.    sta vdcScrollDest+0
  8121.    lda vdcScrollDest+1
  8122.    adc vdcRowScupInc+1
  8123.    sta vdcScrollDest+1
  8124.    dec vdcScrollRows
  8125.    bne -
  8126. +  lda #bkACE
  8127.    sta bkSelect
  8128.    rts
  8129.  
  8130. vdcScrollDown = *
  8131.    bit vdcScrollFlags
  8132.    bpl +
  8133.    jsr vdcScrollDownSetup
  8134.    jsr vdcScrollAddChar
  8135.    lda #<vdcRowPhysInc
  8136.    ldy #>vdcRowPhysInc
  8137.    jsr vdcRowScrollDown
  8138.    lda #$00  ;xx vdcScrollFillChar
  8139.    ldx #<vdcRowPhysInc
  8140.    ldy #>vdcRowPhysInc
  8141.    jsr vdcDoScrollDownExtra
  8142. +  bit vdcScrollFlags
  8143.    bvc +
  8144.    jsr vdcScrollDownSetup
  8145.    jsr vdcScrollAddColor
  8146.    lda #<vdcRowColorInc
  8147.    ldy #>vdcRowColorInc
  8148.    jsr vdcRowScrollDown
  8149.    lda vdcClsColor
  8150.    ldy #$60
  8151.    jsr rgbi2vicbit
  8152.    ldx #<vdcRowColorInc
  8153.    ldy #>vdcRowColorInc
  8154.    jsr vdcDoScrollDownExtra
  8155. +  rts
  8156.  
  8157. vdcScrollDownSetup = *
  8158.    clc ;sic
  8159.    lda vdcWinRows
  8160.    sbc vdcScrollExtra
  8161.    ldx #0
  8162.    jsr vdcWinpos
  8163.    lda syswork+0
  8164.    ldy syswork+1
  8165.    sta vdcScrollSource+0
  8166.    sty vdcScrollSource+1
  8167.    sec
  8168.    lda vdcWinRows
  8169.    sbc #1
  8170.    ldx #0
  8171.    jsr vdcWinpos
  8172.    lda syswork+0
  8173.    ldy syswork+1
  8174.    sta vdcScrollDest+0
  8175.    sty vdcScrollDest+1
  8176.    sec
  8177.    lda vdcWinRows
  8178.    sbc vdcScrollExtra
  8179.    sta vdcScrollRows
  8180.    rts
  8181.  
  8182. vdcRowScdnInc .buf 2
  8183.  
  8184. vdcRowScrollDown = * ;( vdcScrollSource--, vdcScrollDest--, vdcScrollRows-- )
  8185.    sta vdcRowScdnInc+0
  8186.    sty vdcRowScdnInc+1
  8187.    lda #bkRam0
  8188.    sta bkSelect
  8189.    lda vdcScrollRows
  8190.    beq +
  8191. -  jsr vdcColScroll
  8192.    sec
  8193.    lda vdcScrollSource+0
  8194.    sbc vdcRowScdnInc+0
  8195.    sta vdcScrollSource+0
  8196.    lda vdcScrollSource+1
  8197.    sbc vdcRowScdnInc+1
  8198.    sta vdcScrollSource+1
  8199.    sec
  8200.    lda vdcScrollDest+0
  8201.    sbc vdcRowScdnInc+0
  8202.    sta vdcScrollDest+0
  8203.    lda vdcScrollDest+1
  8204.    sbc vdcRowScdnInc+1
  8205.    sta vdcScrollDest+1
  8206.    dec vdcScrollRows
  8207.    bne -
  8208. +  lda #bkACE
  8209.    sta bkSelect
  8210.    rts
  8211.  
  8212. vdcScexInc .buf 2
  8213.  
  8214. vdcDoScrollDownExtra = *  ;( .XY=physical bytes between rows, .A=rows to clr )
  8215.    stx vdcScexInc+0
  8216.    sty vdcScexInc+1
  8217.    pha
  8218.    clc
  8219.    lda vdcScrollSource+0
  8220.    adc vdcScexInc+0
  8221.    sta vdcScrollDest+0
  8222.    lda vdcScrollSource+1
  8223.    adc vdcScexInc+1
  8224.    sta vdcScrollDest+1
  8225.    pla
  8226.    jmp vdcDoScrollExtra 
  8227.  
  8228. vdcColScroll = * ;( vdcScrollSource, vdcScrollDest, vdcWinCols )
  8229.    ldy vdcWinCols
  8230.    beq ++
  8231.    lda vdcScrollSource+1
  8232.    cmp #>vdcCharAddr
  8233.    bcs vdcColScrollBitmap
  8234.    lda vdcWinCols
  8235.    clc
  8236.    adc #1 ;round up
  8237.    lsr
  8238.    tay
  8239.    beq ++
  8240.  
  8241.    vdcColSc256 = *
  8242.    dey
  8243.    beq +
  8244. -  lda (vdcScrollSource),y
  8245.    sta (vdcScrollDest),y
  8246.    dey
  8247.    bne -
  8248. +  lda (vdcScrollSource),y
  8249.    sta (vdcScrollDest),y
  8250. +  rts
  8251.  
  8252.    vdcColScrollBitmap = *
  8253.    ;xx put in REU-fill option
  8254.    lda vdcWinCols
  8255.    and #%11111110
  8256.    asl
  8257.    asl
  8258.    tay
  8259.    bcc vdcColSc256
  8260.    inc vdcScrollSource+1
  8261.    inc vdcScrollDest+1
  8262.    jsr vdcColSc256
  8263.    dec vdcScrollSource+1
  8264.    dec vdcScrollDest+1
  8265.    ldy #0
  8266.    jmp vdcColSc256
  8267.  
  8268. ;*** graphics routines ***
  8269.  
  8270. vdcBmColor .buf 1
  8271.  
  8272. kernGrScreen = *
  8273.    sty vdcBmColor
  8274.    lda configBuf+$c0
  8275.    bmi +
  8276.    lda #aceErrNoGraphicsSpace
  8277.    sta errno
  8278.    sec
  8279.    rts
  8280. +  txa
  8281.    jsr rgbi2vic
  8282.    sta vic+$20
  8283.    jsr vdcInit
  8284.    lda #$e0
  8285.    ldx #$00
  8286.    ldy vdcBmColor
  8287.    jsr vdcWinclsPattern
  8288.    lda #<200
  8289.    ldy #>200
  8290.    sta syswork+0
  8291.    sty syswork+1
  8292.    sta conMouseMaxY+0
  8293.    sty conMouseMaxY+1
  8294.    lda #<320
  8295.    ldy #>320
  8296.    sta conMouseMaxX+0
  8297.    sty conMouseMaxX+1
  8298.    jsr conMouseBounds
  8299.    lda #40
  8300.    ldx #1
  8301.    clc
  8302.    rts
  8303.  
  8304. kernGrExit = *
  8305.    ldx #40
  8306.    bit textMode
  8307.    bpl +
  8308.    ldx #80
  8309. +  lda #25
  8310.    jsr conScreen
  8311.    clc
  8312.    rts
  8313.  
  8314. kernGrFill = *
  8315. vdcGrFill = *
  8316.    tax
  8317.    lda #$80
  8318.    jsr vdcWinclsPattern
  8319.    clc
  8320.    rts
  8321.  
  8322. vdcBmRows    .buf 1
  8323. vdcBmCols    .buf 1
  8324. vdcBmCol     .buf 1
  8325. vdcBmRow     .buf 1
  8326. vdcBmBuffer  = stringBuffer
  8327. vdcGrOpFlags = syswork+15
  8328. vdcGrTemp    = syswork+14
  8329. vdcGrSor     = syswork+12
  8330.  
  8331. kernGrOp = *  ;( .A=opflags, .X=X, (sw+0)=Y, .Y=cols, (sw+2)=rows, sw+4=interlv,
  8332.    ;**           sw+5=fillval, (sw+6)=sPtr, (sw+8)=dPtr, (sw+10)=mPtr )
  8333.    ;**           <all syswork arguments can change>
  8334.    ;** opflags: $80=get, $40=put, $20=copy, $10=fill,$8=mask,$4=and,$2=xor,$1=or
  8335.    sta vdcGrOpFlags
  8336.    stx vdcBmCol
  8337.    sty vdcBmCols
  8338.    clc
  8339.    tya
  8340.    adc syswork+4
  8341.    sta syswork+4
  8342.    lda syswork+0
  8343.    sta vdcBmRow
  8344.    lsr
  8345.    lsr
  8346.    lsr
  8347.    ldx #0
  8348.    jsr vdcMult320
  8349.    lda vdcBmRow
  8350.    and #$07
  8351.    clc
  8352.    adc syswork+0
  8353.    sta syswork+0
  8354.    bcc +
  8355.    inc syswork+1
  8356. +  lda vdcBmCol
  8357.    ldy #0
  8358.    sty vdcGrTemp
  8359.    ldx #3
  8360. -  asl
  8361.    rol vdcGrTemp
  8362.    dex
  8363.    bne -
  8364.    clc
  8365.    adc syswork+0
  8366.    sta syswork+0
  8367.    lda syswork+1
  8368.    adc vdcGrTemp
  8369.    sta syswork+1
  8370.    jsr vdcPosAdd
  8371.    ;** at this point, we have the screen position in (sw+0)
  8372.    lda vdcBmCols
  8373.    bne +
  8374.    clc
  8375.    rts
  8376. vdcGrOpLoop = *
  8377. +  lda syswork+0
  8378.    ldy syswork+1
  8379.    sta vdcGrSor+0
  8380.    sty vdcGrSor+1
  8381.    lda #bkRam0
  8382.    sta bkSelect
  8383. vdcGrOpGet = *
  8384.    bit vdcGrOpFlags
  8385.    bpl vdcGrOpPut
  8386.    ldx #0
  8387.    ldy #0
  8388. -  lda (syswork+0,x)
  8389.    sta (syswork+8),y
  8390.    clc
  8391.    lda syswork+0
  8392.    adc #8
  8393.    sta syswork+0
  8394.    bcc +
  8395.    inc syswork+1
  8396. +  iny
  8397.    cpy vdcBmCols
  8398.    bcc -
  8399.    lda vdcGrSor+0
  8400.    ldy vdcGrSor+1
  8401.    sta syswork+0
  8402.    sty syswork+1
  8403. vdcGrOpPut = *
  8404.    bit vdcGrOpFlags
  8405.    bvc vdcGrOpCopy
  8406.    ldx #0
  8407.    ldy #0
  8408.    lda vdcGrOpFlags
  8409.    and #$0f
  8410.    bne vdcGrOpPutComplex
  8411. -  lda (syswork+6),y
  8412.    sta (syswork+0,x)
  8413.    clc
  8414.    lda syswork+0
  8415.    adc #8
  8416.    sta syswork+0
  8417.    bcc +
  8418.    inc syswork+1
  8419. +  iny
  8420.    cpy vdcBmCols
  8421.    bcc -
  8422.    jmp vdcGrOpPutFinish
  8423.  
  8424.    vdcGrOpPutComplex = *
  8425. -  lda vdcGrOpFlags
  8426.    and #$08
  8427.    beq +
  8428.    ;** mask
  8429.    lda (syswork+10),y
  8430.    eor #$ff
  8431.    and (syswork+0,x)
  8432.    sta (syswork+0,x)
  8433.    ;** or
  8434. +  lda vdcGrOpFlags
  8435.    and #$01
  8436.    bne +
  8437.    lda (syswork+6),y
  8438.    ora (syswork+0,x)
  8439.    jmp vdcGrOpPutDo
  8440.    ;** xor
  8441. +  lda vdcGrOpFlags
  8442.    and #$02
  8443.    bne +
  8444.    lda (syswork+6),y
  8445.    eor (syswork+0,x)
  8446.    jmp vdcGrOpPutDo
  8447.    ;** and
  8448. +  lda (syswork+6),y
  8449.    eor #$ff
  8450.    and (syswork+0,x)
  8451.  
  8452.    vdcGrOpPutDo = *
  8453.    sta (syswork+0,x)
  8454.    clc
  8455.    lda syswork+0
  8456.    adc #8
  8457.    sta syswork+0
  8458.    bcc +
  8459.    inc syswork+1
  8460. +  iny
  8461.    cpy vdcBmCols
  8462.    bcc -
  8463.  
  8464.    vdcGrOpPutFinish = *
  8465.    lda vdcGrSor+0
  8466.    ldy vdcGrSor+1
  8467.    sta syswork+0
  8468.    sty syswork+1
  8469. vdcGrOpCopy = *  ;xx not implemented
  8470.    lda vdcGrOpFlags
  8471.    and #$20
  8472.    beq vdcGrOpFill
  8473.    ldx #0
  8474.    ldy #0
  8475.    nop
  8476.    lda vdcGrSor+0
  8477.    ldy vdcGrSor+1
  8478.    sta syswork+0
  8479.    sty syswork+1
  8480. vdcGrOpFill = *
  8481.    lda vdcGrOpFlags
  8482.    and #$10
  8483.    beq vdcGrOpContinue
  8484.    ldx #0
  8485.    ldy #0
  8486. -  lda #$00
  8487.    sta (syswork+0,x)
  8488.    clc
  8489.    lda syswork+0
  8490.    adc #8
  8491.    sta syswork+0
  8492.    bcc +
  8493.    inc syswork+1
  8494. +  iny
  8495.    cpy vdcBmCols
  8496.    bcc -
  8497.    lda vdcGrSor+0
  8498.    ldy vdcGrSor+1
  8499.    sta syswork+0
  8500.    sty syswork+1
  8501. vdcGrOpContinue = *
  8502.    lda #bkACE
  8503.    sta bkSelect
  8504.    lda syswork+2+0
  8505.    bne +
  8506.    dec syswork+2+1
  8507. +  dec syswork+2+0
  8508.    lda syswork+2+0
  8509.    ora syswork+2+1
  8510.    bne +
  8511.    clc
  8512.    rts
  8513. +  bit vdcGrOpFlags
  8514.    bmi +
  8515.    clc
  8516.    lda syswork+8+0
  8517.    adc syswork+4
  8518.    sta syswork+8+0
  8519.    bcc +
  8520.    inc syswork+8+1
  8521. +  bit vdcGrOpFlags
  8522.    bvc +
  8523.    clc
  8524.    lda syswork+6+0
  8525.    adc syswork+4
  8526.    sta syswork+6+0
  8527.    bcc +
  8528.    inc syswork+6+1
  8529. +  lda vdcGrOpFlags
  8530.    and #$08
  8531.    beq +
  8532.    clc
  8533.    lda syswork+10+0
  8534.    adc syswork+4
  8535.    sta syswork+10+0
  8536.    bcc +
  8537.    inc syswork+10+1
  8538. +  inc vdcBmRow
  8539.    lda vdcBmRow
  8540.    and #$07
  8541.    beq +
  8542.    lda #<1
  8543.    ldy #>1
  8544.    jmp ++
  8545. +  lda #<320-7
  8546.    ldy #>320-7
  8547. +  clc
  8548.    adc syswork+0
  8549.    sta syswork+0
  8550.    tya
  8551.    adc syswork+1
  8552.    sta syswork+1
  8553.    jmp vdcGrOpLoop
  8554.  
  8555. ;the end + blank line
  8556.  
  8557. acecon.s
  8558. 2628
  8559. ;ACE-128/64 kernel console driver: high level I/O & keyboard
  8560.  
  8561. conWinStart    .buf 2
  8562. conWinRows     .buf 1
  8563. conWinCols     .buf 1
  8564. conLineAddr    .buf 2
  8565. conCurRow      .buf 1
  8566. conCurCol      .buf 1
  8567. conWinStartRow .buf 1
  8568. conWinStartCol .buf 1
  8569. conWinDataEnd  = *
  8570. conRowInc      .buf 2
  8571.  
  8572. conPutMask     .byte $80  ;$80=char,$40=color,$20=hiattr,$10=extattr
  8573. conCharColor   .byte $0e
  8574. conFillColor   .byte $0e
  8575. conCursorColor .byte $07
  8576. conIgnoreCtrl  .byte $00
  8577. conIgnoreShift .byte $00
  8578. conExtAttr     .byte $00  ;extended attrs:$80=alt,$40=rvs,$20=ul,$10=blink
  8579. conPrescrollOverride .byte $00
  8580. conChsetRvsChars  .byte $ff  ;$ff=rvsChars, $00=nonRvsChars
  8581. conCharPalette .buf 42
  8582.  
  8583. keylineNext  = keylineBuf+0  ;(3)
  8584. keylinePrev  = keylineBuf+3  ;(3)
  8585. keylineLen   = keylineBuf+6  ;(1)
  8586. keylineFlags = keylineBuf+7  ;(1)
  8587. keyline      = keylineBuf+8  ;(248)
  8588. keylineMax   = 248
  8589.  
  8590. keylinePtr   .buf 1
  8591. keylinePos   .buf 1
  8592. keylineCount .buf 1
  8593.  
  8594. .if computer-64
  8595.    shiftValue = $d3
  8596. .else
  8597.    shiftValue = $28d
  8598. .ife
  8599.  
  8600. conInitLineNum .buf 1
  8601. conHistbufScanPtr .buf 4
  8602. conHistbufReplacePtr .buf 4
  8603. conInitPrev = syswork+4
  8604.  
  8605. conInit = *
  8606.    lda #$9a
  8607.    sta conCharPalette+$1a
  8608.  
  8609.    lda configBuf+$86
  8610.    sta conSsMax
  8611.    sta conSsCountdown
  8612.    lda #0
  8613.    sta keylineCount
  8614.    jsr keyscanInit
  8615.    lda #aceMemNull
  8616.    sta conHistbufScanPtr+3
  8617.    sta conHistbufReplacePtr+3
  8618.    sta conInitPrev+3
  8619.    lda #$00
  8620.    sta conInitPrev+0
  8621.    lda configBuf+$cb
  8622.    bne +
  8623.    jmp conWinInit
  8624. +  sta conInitLineNum
  8625.  
  8626.    conInitNext = *
  8627.    lda conInitLineNum
  8628.    bne +
  8629.    jmp conInitCleanHist
  8630. +  lda #1
  8631.    ldx #$00  ;xxx go for the slow
  8632.    ldy #$ff
  8633.    jsr kernPageAlloc
  8634.    bcs conInitCleanHist
  8635.    ;** check first line
  8636.    lda conHistbufReplacePtr+3
  8637.    cmp #aceMemNull
  8638.    bne +
  8639.    ldx #3
  8640. -  lda mp,x
  8641.    sta conHistbufReplacePtr,x
  8642.    dex
  8643.    bpl -
  8644.    ;** initialize line
  8645. +  ldx #2
  8646. -  lda conHistbufReplacePtr+1,x
  8647.    sta keylineNext,x
  8648.    lda conInitPrev+1,x
  8649.    sta keylinePrev,x
  8650.    lda mp+1,x
  8651.    sta conInitPrev+1,x
  8652.    dex
  8653.    bpl -
  8654.    lda #0
  8655.    sta keylineLen
  8656.    sta keylineFlags
  8657.    ;** store new line
  8658.    lda #<keylineBuf
  8659.    ldy #>keylineBuf
  8660.    sta zp+0
  8661.    sty zp+1
  8662.    lda #9
  8663.    ldy #0
  8664.    jsr stash
  8665.    ;** link previous line's next pointer
  8666.    ldx #2
  8667. -  lda keylinePrev,x
  8668.    sta mp+1,x
  8669.    dex
  8670.    bpl -
  8671.    lda #$00
  8672.    sta mp+0
  8673.    ldx #conInitPrev+1
  8674.    ldy #3
  8675.    jsr zpstore
  8676.    ;** go on to next line
  8677.    dec conInitLineNum
  8678.    jmp conInitNext
  8679.  
  8680.    conInitCleanHist = *
  8681.    lda conHistbufReplacePtr+3
  8682.    cmp #aceMemNull
  8683.    beq conWinInit
  8684.    ;** link first line's prev ptr to last line
  8685.    ldx #3
  8686. -  lda conHistbufReplacePtr,x
  8687.    sta mp,x
  8688.    dex
  8689.    bpl -
  8690.    lda #$03
  8691.    sta mp+0
  8692.    ldx #conInitPrev+1
  8693.    ldy #3
  8694.    jsr zpstore
  8695.    ;xx fall through
  8696.  
  8697. conWinInit = *
  8698.    jsr conWinParms
  8699.    jmp conCls
  8700.  
  8701. conWinParms = *
  8702.    jsr winsize
  8703.    sta conWinRows
  8704.    stx conWinCols
  8705.    lda syswork+0
  8706.    ldx syswork+1
  8707.    sta conWinStartRow
  8708.    stx conWinStartCol
  8709.    lda syswork+2
  8710.    ldy syswork+3
  8711.    sta conWinStart+0
  8712.    sty conWinStart+1
  8713.    lda syswork+4
  8714.    ldy syswork+5
  8715.    sta conRowInc+0
  8716.    sty conRowInc+1
  8717.    rts
  8718.  
  8719. conCls = *
  8720.    lda #$e0
  8721.    ldx #" "
  8722.    ldy conFillColor
  8723.    jsr wincls
  8724.    jsr conHome
  8725.    rts
  8726.  
  8727. conShutdown = *
  8728.    rts
  8729.  
  8730. conWinChangeCallback = *
  8731.    jsr conWinParms
  8732.    jmp conHome
  8733.    rts
  8734.  
  8735. conHome = *
  8736.    lda conWinStart+0
  8737.    ldy conWinStart+1
  8738.    sta conLineAddr+0
  8739.    sty conLineAddr+1
  8740.    lda #0
  8741.    sta conCurRow
  8742.    sta conCurCol
  8743.    rts
  8744.  
  8745. conPutSave .buf 1
  8746.  
  8747. kernConPutchar = *
  8748. conPutchar = *  ;( .A=char )
  8749.    cmp #chrCR
  8750.    bne +
  8751.    jmp conNewline
  8752. +  cmp #chrCLS
  8753.    beq conCls
  8754.    cmp #chrTAB
  8755.    bne +
  8756.    jmp conTab
  8757. +  cmp #chrBS
  8758.    bne +
  8759.    jmp conBackspace
  8760. +  cmp #chrBEL
  8761.    bne +
  8762.    jmp conBell
  8763. +  cmp #chrVT
  8764.    bne +
  8765.    jmp conCtrlDown
  8766. +  cmp #chrBOL
  8767.    bne conPutcharLit
  8768.    jmp conReturnOnly
  8769.  
  8770. kernConPutlit = *
  8771.    conPutcharLit = *  ;( .A=char )
  8772.    sta conPutSave
  8773.    lda conCurCol
  8774.    cmp conWinCols
  8775.    bcc +
  8776.    jsr conNewline
  8777. +  clc
  8778.    lda conLineAddr+0
  8779.    adc conCurCol
  8780.    sta syswork+0
  8781.    lda conLineAddr+1
  8782.    adc #0
  8783.    sta syswork+1
  8784.    lda #<conPutSave
  8785.    ldy #>conPutSave
  8786.    sta syswork+2
  8787.    sty syswork+3
  8788.    ldx #1
  8789.    stx syswork+5
  8790.    lda conExtAttr
  8791.    sta syswork+6
  8792.    lda conPutMask
  8793.    ldy conCharColor
  8794.    jsr winput
  8795.    inc conCurCol
  8796.    rts
  8797.  
  8798. conGetCursorAddr = *
  8799.    clc
  8800.    lda conLineAddr+0
  8801.    adc conCurCol
  8802.    sta syswork+0
  8803.    lda conLineAddr+1
  8804.    adc #0
  8805.    sta syswork+1
  8806.    rts
  8807.  
  8808. conSynchCursor = *
  8809.    lda conCurCol
  8810.    cmp conWinCols
  8811.    bcc +
  8812.    jsr conNewline
  8813. +  rts
  8814.  
  8815. conNewline = *
  8816.    lda conIgnoreCtrl
  8817.    bmi +
  8818.    lda conIgnoreShift
  8819.    bmi +
  8820. -  lda shiftValue
  8821.    and #$0f
  8822.    cmp #$04
  8823.    beq -
  8824.    lda scrollFreeze
  8825.    bne -
  8826. +  lda #0
  8827.    sta conCurCol
  8828.    inc conCurRow
  8829.    lda conCurRow
  8830.    cmp conWinRows
  8831.    bcs +
  8832.    clc
  8833.    lda conLineAddr+0
  8834.    adc conRowInc+0
  8835.    sta conLineAddr+0
  8836.    lda conLineAddr+1
  8837.    adc conRowInc+1
  8838.    sta conLineAddr+1
  8839.    clc
  8840.    rts
  8841. +  dec conCurRow
  8842.    jsr conScroll
  8843.    clc
  8844.    rts
  8845.  
  8846. conScroll = *
  8847.    bit conIgnoreCtrl
  8848.    bmi +
  8849.    bit conIgnoreShift
  8850.    bmi +
  8851.    lda #20
  8852.    sta scrollCountdown
  8853. -  lda shiftValue
  8854.    and #%10
  8855.    beq +
  8856.    cli
  8857.    lda scrollCountdown
  8858.    bne -
  8859. +  lda #" "
  8860.    sta syswork+4
  8861.    lda conPutMask
  8862.    ora #$08
  8863.    ldx #1
  8864.    ldy conFillColor
  8865.    jsr winscroll
  8866.    rts
  8867.  
  8868. conTab = *
  8869.    lda conCurCol
  8870.    and #7
  8871.    sta syswork+0
  8872.    sec
  8873.    lda #8
  8874.    sbc syswork+0
  8875.    clc
  8876.    adc conCurCol
  8877.    cmp conWinCols
  8878.    bcc +
  8879.    lda conWinCols
  8880. +  sta conCurCol
  8881.    rts
  8882.  
  8883. conReturnOnly = *
  8884.    lda #0
  8885.    sta conCurCol
  8886.    rts
  8887.  
  8888. conBell = *
  8889.    lda #$15
  8890.    sta $d418
  8891.    ldy #$09
  8892.    ldx #$00
  8893.    sty $d405
  8894.    stx $d406
  8895.    lda #$30
  8896.    sta $d401
  8897.    lda #$20
  8898.    sta $d404
  8899.    lda #$21
  8900.    sta $d404
  8901.    rts
  8902.  
  8903. ;*** aceConWrite( (zp)=buf, .AY=writeLength ) **zw gets modified**
  8904.  
  8905. conWritePtr    = syswork+8
  8906. conWriteLength = syswork+10
  8907. conWriteTemp   = syswork+12
  8908.  
  8909. kernConWrite = *
  8910. conWrite = *
  8911.    sta conWriteLength+0
  8912.    sty conWriteLength+1
  8913.    lda zp+0
  8914.    ldy zp+1
  8915.    sta conWritePtr+0
  8916.    sty conWritePtr+1
  8917.  
  8918.    conWriteNextChunk = *
  8919.    lda #255
  8920.    ldx conWriteLength+1
  8921.    bne +
  8922.    lda conWriteLength+0
  8923.    beq conWriteFinish
  8924. +  jsr conWriteChunk
  8925.    sta conWriteTemp
  8926.    clc
  8927.    adc conWritePtr+0
  8928.    sta conWritePtr+0
  8929.    bcc +
  8930.    inc conWritePtr+1
  8931. +  sec
  8932.    lda conWriteLength+0
  8933.    sbc conWriteTemp
  8934.    sta conWriteLength+0
  8935.    bcs +
  8936.    dec conWriteLength+1
  8937. +  jmp conWriteNextChunk
  8938.    
  8939.    conWriteFinish = *
  8940.    clc
  8941.    rts
  8942.  
  8943. conWrChkMaxLen .buf 1
  8944.  
  8945. conWriteChunk = *  ;( conWritePtr, .A=dataLen ) : .A=dataWritten
  8946.    sta conWrChkMaxLen
  8947. -  sec
  8948.    lda conWinCols
  8949.    sbc conCurCol
  8950.    bne +
  8951.    ldy #0
  8952.    lda (conWritePtr),y
  8953.    cmp #chrBOL
  8954.    beq ++
  8955.    cmp #chrBEL
  8956.    beq ++
  8957.    cmp #chrVT
  8958.    beq ++
  8959.    cmp #chrCLS
  8960.    beq ++
  8961.    cmp #chrBS
  8962.    beq ++
  8963.    jsr conWriteNewline
  8964.    ldy #0
  8965.    lda (conWritePtr),y
  8966.    cmp #chrCR
  8967.    bne -
  8968.    lda #1
  8969.    rts
  8970. +  cmp conWrChkMaxLen
  8971.    bcs +
  8972.    sta conWrChkMaxLen
  8973. +  ldy #0
  8974.  
  8975. -  lda (conWritePtr),y
  8976.    cmp #$14+1
  8977.    bcs ++
  8978. -  cpy #0
  8979.    bne conWrChkFlush
  8980.    cmp #chrCR
  8981.    bne +
  8982.    jsr conWriteNewline
  8983.    lda #1
  8984.    rts
  8985. +  jsr conPutchar
  8986.    lda #1
  8987.    rts
  8988. +  cmp #147
  8989.    beq -
  8990.    iny
  8991.    cpy conWrChkMaxLen
  8992.    bcc --
  8993.  
  8994.    conWrChkFlush = *
  8995.    sty conWrChkMaxLen
  8996.    clc
  8997.    lda conLineAddr+0
  8998.    adc conCurCol
  8999.    sta syswork+0
  9000.    lda conLineAddr+1
  9001.    adc #0
  9002.    sta syswork+1
  9003.    lda conWritePtr+0
  9004.    ldx conWritePtr+1
  9005.    sta syswork+2
  9006.    stx syswork+3
  9007.    sty syswork+5
  9008.    lda conExtAttr
  9009.    sta syswork+6
  9010.    lda conPutMask
  9011.    ldy conCharColor
  9012.    ldx syswork+5
  9013.    jsr winput
  9014.    clc
  9015.    lda conCurCol
  9016.    adc conWrChkMaxLen
  9017.    sta conCurCol
  9018.    lda conWrChkMaxLen
  9019.    rts
  9020.  
  9021. ;*** kernConRead( (zp)=buf, .AY=readMaxLen ) : .AY=(zw)=len, .Z
  9022.  
  9023. kernConRead = *
  9024. conRead = *
  9025.    sta readMaxLen+0
  9026.    sty readMaxLen+1
  9027.    lda #0
  9028.    sta readLength+0
  9029.    sta readLength+1
  9030.    lda zp+0
  9031.    ldy zp+1
  9032.    sta readPtr+0
  9033.    sty readPtr+1
  9034.  
  9035. conReadLoop = *
  9036.    lda readLength+0
  9037.    cmp readMaxLen+0
  9038.    lda readLength+1
  9039.    sbc readMaxLen+1
  9040.    bcs conReadExit
  9041.    jsr keylineGet
  9042.    bcs conReadEofExit
  9043.    ldy #0
  9044.    sta (readPtr),y
  9045.    inc readPtr+0
  9046.    bne +
  9047.    inc readPtr+1
  9048. +  inc readLength+0
  9049.    bne +
  9050.    inc readLength+1
  9051. +  cmp #$0d
  9052.    beq conReadExit
  9053.    jmp conReadLoop
  9054.  
  9055.    conReadExit = *
  9056.    lda readLength+0
  9057.    ldy readLength+1
  9058.    sta zw+0
  9059.    sty zw+1
  9060.    ldx #$ff
  9061.    clc
  9062.    rts
  9063.  
  9064.    conReadEofExit = *
  9065.    lda #0
  9066.    ldy #0
  9067.    sta zw+0
  9068.    sty zw+1
  9069.    clc
  9070.    rts
  9071.  
  9072. keylineGet = *  ;( keylinePtr, keylineCount ) : .A=char, .CS=eof
  9073.    lda keylineCount
  9074.    bne +
  9075.    jsr conInput
  9076.    bcs ++
  9077. +  ldx keylinePtr
  9078.    inc keylinePtr
  9079.    dec keylineCount
  9080.    lda keyline,x
  9081.    clc
  9082. +  rts
  9083.  
  9084. conParmSave .buf 8
  9085. conParmMp   .buf 4
  9086. conParmZp   .buf 2
  9087.  
  9088. conInput = *
  9089.    lda #$00
  9090.    sta conInputMode
  9091.    sta conInputFakeCount
  9092. conInputIn = *
  9093.    ldx #0
  9094.    stx keylinePos
  9095.    stx keylineCount
  9096.    stx keylinePtr
  9097.    ldx #7
  9098. -  lda syswork,x
  9099.    sta conParmSave,x
  9100.    dex
  9101.    bpl -
  9102.    lda #$00
  9103.    sta conHistbufReplacePtr+0
  9104.    ldx #3
  9105. -  lda conHistbufReplacePtr,x
  9106.    sta conHistbufScanPtr,x
  9107.    lda mp,x
  9108.    sta conParmMp,x
  9109.    lda conHistbufReplacePtr,x
  9110.    sta mp,x
  9111.    dex
  9112.    bpl -
  9113.    lda #$06
  9114.    sta mp+0
  9115.    lda #0
  9116.    sta syswork
  9117.    ldx #syswork
  9118.    ldy #1
  9119.    jsr zpstore
  9120.    lda #$00
  9121.    sta mp+0
  9122.    ldx #1
  9123. -  lda zp,x
  9124.    sta conParmZp,x
  9125.    dex
  9126.    bpl -
  9127.  
  9128.    conInNext = *
  9129.    jsr conSynchCursor
  9130.    ldx conInputFakeCount
  9131.    beq +
  9132.    ldx conInputFakePos
  9133.    lda stringBuffer,x
  9134.    inc conInputFakePos
  9135.    dec conInputFakeCount
  9136.    jmp conInRegular
  9137. +  jsr conCursorOn
  9138.    jsr conGetkey
  9139.    jsr conCursorOff
  9140.    cmp #chrCR
  9141.    bne +
  9142.    jmp conInReturn
  9143. +  cmp #chrBS  ;backspace
  9144.    bne +
  9145.    jmp conInBackspace
  9146. +  cmp #$03  ;stop
  9147.    bne +
  9148.    bit conInputMode
  9149.    bpl conInNext
  9150.    jsr conRestoreParms
  9151.    lda #$03
  9152.    ldx keylineCount
  9153.    sta keyline,x
  9154.    inc keylineCount
  9155.    sec
  9156.    rts
  9157. +  cmp #chrCLS  ;clear
  9158.    bne +
  9159.    jmp conInClear
  9160. +  cmp #$e4
  9161.    bne +
  9162.    ldx keylineCount
  9163.    bne +
  9164.    jsr conRestoreParms
  9165.    lda #$e4
  9166.    sec
  9167.    rts
  9168. +  cmp #$f5  ;ct-u
  9169.    bne +
  9170.    jmp conInKill
  9171. +  cmp #29  ;right
  9172.    bne +
  9173.    jmp conInRight
  9174. +  cmp #157 ;left
  9175.    bne +
  9176.    jmp conInLeft
  9177. +  cmp #$10  ;co-left
  9178.    bne +
  9179. -  jmp conInBol
  9180. +  cmp #$ea  ;ct-j
  9181.    beq -
  9182.    cmp #$15  ;co-right
  9183.    bne +
  9184. -  jmp conInEol
  9185. +  cmp #$eb  ;ct-k
  9186.    beq -
  9187.    cmp #$f2  ;ct-r
  9188.    bne +
  9189.    jmp conInRedisplay
  9190. +  cmp #145  ;up
  9191.    bne +
  9192.    jmp conInPrevLine
  9193. +  cmp #17   ;down
  9194.    bne +
  9195.    jmp conInNextLine
  9196. +  cmp #$12  ;rvs
  9197.    bne +
  9198.    jsr conCtrlScreenRvs
  9199.    jmp conInNext
  9200. +  cmp #$92  ;rvs off
  9201.    bne +
  9202.    jsr conCtrlScreenRvsOff
  9203.    jmp conInNext
  9204.  
  9205.    conInRegular = *
  9206. +  ldx keylineCount
  9207.    cpx #keylineMax
  9208.    bcc +
  9209.    jsr conBell
  9210.    jmp conInNext
  9211. +  pha
  9212.    ;** insert space for new char
  9213.    inx
  9214.    stx keylineCount
  9215. -  lda keyline-1,x
  9216.    sta keyline,x
  9217.    dex
  9218.    beq +
  9219.    cpx keylinePos
  9220.    bcs -
  9221.    beq -
  9222. +  pla
  9223.    ldx keylinePos
  9224.    sta keyline,x
  9225.    inc keylinePos
  9226.    jsr conPutcharLit
  9227.    jsr conInSlosh
  9228.    jsr conInBackup
  9229.    jsr conInSaveLine
  9230.    jmp conInNext
  9231.  
  9232. conInReturn = *
  9233.    jsr conInSaveLine
  9234.    jsr conInSlosh
  9235.    lda #chrCR
  9236.    ldx keylineCount
  9237.    sta keyline,x
  9238.    inc keylineCount
  9239.    jsr conPutchar
  9240.    ldx #0
  9241.    stx keylinePtr
  9242.    lda keylineLen
  9243.    beq +
  9244.    ldx #3
  9245. -  lda conHistbufReplacePtr,x
  9246.    sta mp,x
  9247.    dex
  9248.    bpl -
  9249.    lda #<keylineBuf
  9250.    ldy #>keylineBuf
  9251.    sta zp+0
  9252.    sty zp+1
  9253.    lda #3
  9254.    ldy #0
  9255.    jsr fetch
  9256.    ldx #2
  9257. -  lda keylineNext,x
  9258.    sta conHistbufReplacePtr+1,x
  9259.    dex
  9260.    bpl -
  9261. +  jsr conRestoreParms
  9262.    lda #chrCR
  9263.    clc
  9264.    rts
  9265.  
  9266. conInClear = *
  9267.    jsr conPutchar
  9268.    lda #0
  9269.    sta keylinePos
  9270.    sta keylineCount
  9271.    jmp conInNext
  9272.  
  9273. conInBackspace = *
  9274.    ldx keylinePos
  9275.    bne +
  9276.    jmp conInNext
  9277. +  dec keylinePos
  9278.    dec keylineCount
  9279.    ldx keylinePos
  9280.    jmp +
  9281. -  lda keyline+1,x
  9282.    sta keyline,x
  9283.    inx
  9284. +  cpx keylineCount
  9285.    bcc -
  9286.    jsr conBackspace
  9287.    jsr conInSlosh
  9288.    pha
  9289.    lda #" "
  9290.    jsr conPutchar
  9291.    pla
  9292.    clc
  9293.    adc #1
  9294.    jsr conInBackup
  9295.    jsr conInSaveLine
  9296.    jmp conInNext
  9297.  
  9298. conInLeft = *
  9299.    lda keylinePos
  9300.    beq +
  9301.    jsr conBackspace
  9302.    dec keylinePos
  9303. +  jmp conInNext
  9304.  
  9305. conInRight = *
  9306.    ldx keylinePos
  9307.    cpx keylineCount
  9308.    beq +
  9309.    lda keyline,x
  9310.    jsr conPutchar
  9311.    inc keylinePos
  9312. +  jmp conInNext
  9313.  
  9314. conInBol = *
  9315.    lda keylinePos
  9316.    jsr conInBackup
  9317.    lda #0
  9318.    sta keylinePos
  9319.    jmp conInNext
  9320.  
  9321. conInEol = *
  9322.    jsr conInSlosh
  9323.    lda keylineCount
  9324.    sta keylinePos
  9325.    jmp conInNext
  9326.  
  9327. conInRedisplay = *
  9328.    lda keylinePos
  9329.    pha
  9330.    jsr conInBackup
  9331.    lda #0
  9332.    sta keylinePos
  9333.    jsr conInSlosh
  9334.    pla
  9335.    sta keylinePos
  9336.    sec
  9337.    lda keylineCount
  9338.    sbc keylinePos
  9339.    jsr conInBackup
  9340.    jmp conInNext
  9341.  
  9342. conInKill = *
  9343.    jsr conInKillSub
  9344.    jmp conInNext
  9345. conInKillCnt .buf 1
  9346. conInKillSub = *
  9347.    ;** goto beginning of line
  9348.    lda keylinePos
  9349.    jsr conInBackup
  9350.    ;** blank out line
  9351.    lda #$ff
  9352.    sta conIgnoreCtrl
  9353.    lda keylineCount
  9354.    sta conInKillCnt
  9355.    beq +
  9356. -  lda #" "
  9357.    jsr conPutchar
  9358.    dec conInKillCnt
  9359.    bne -
  9360.    ;** backup
  9361. +  lda keylineCount
  9362.    jsr conInBackup
  9363.    lda #$00
  9364.    sta conIgnoreCtrl
  9365.    ;** internal
  9366.    lda #0
  9367.    sta keylinePos
  9368.    sta keylineCount
  9369.    rts
  9370.  
  9371. conSloshPtr .buf 1
  9372.  
  9373. conInSlosh = *  ;( ) : BScount ;slosh out line from keylinePos to keylineCount
  9374.    lda #$ff
  9375.    sta conIgnoreCtrl
  9376.    lda keylinePos
  9377.    sta conSloshPtr
  9378. -  ldx conSloshPtr
  9379.    cpx keylineCount
  9380.    bcs +
  9381.    lda keyline,x
  9382.    jsr conPutcharLit
  9383.    inc conSloshPtr
  9384.    jmp -
  9385. +  lda #$00
  9386.    sta conIgnoreCtrl
  9387.    sec
  9388.    lda keylineCount
  9389.    sbc keylinePos
  9390.    rts
  9391.  
  9392. conBackupCount .buf 1
  9393.  
  9394. conInBackup = *  ;( .A=count ) ;backup the cursor .A spaces
  9395.    sta conBackupCount
  9396.    cmp #0
  9397.    beq +
  9398. -  lda #chrBS
  9399.    jsr conPutchar
  9400.    dec conBackupCount
  9401.    bne -
  9402. +  rts
  9403.  
  9404. conRestoreParms = *
  9405.    ldx #7
  9406. -  lda conParmSave,x
  9407.    sta syswork,x
  9408.    dex
  9409.    bpl -
  9410.    ldx #3
  9411. -  lda conParmMp,x
  9412.    sta mp,x
  9413.    dex
  9414.    bpl -
  9415.    ldx #1
  9416. -  lda conParmZp,x
  9417.    sta zp,x
  9418.    dex
  9419.    bpl -
  9420.    rts
  9421.  
  9422. conInNextLine = *
  9423.    ;** locate next scan line
  9424.    lda conHistbufReplacePtr+3
  9425.    cmp #aceMemNull
  9426.    beq +
  9427.    jsr conInLineFetchHead
  9428.    ldx #2
  9429. -  lda conHistbufScanPtr+1,x
  9430.    cmp conHistbufReplacePtr+1,x
  9431.    bne ++
  9432.    dex
  9433.    bpl -
  9434. +  jmp conInNext
  9435. +  ldx #2
  9436. -  lda keylineNext,x
  9437.    sta conHistbufScanPtr+1,x
  9438.    sta mp+1,x
  9439.    dex
  9440.    bpl -
  9441.    jmp +++
  9442.    
  9443. conInPrevLine = *
  9444.    ;** locate previous scan line
  9445.    lda conHistbufReplacePtr+3
  9446.    cmp #aceMemNull
  9447.    beq +
  9448.    jsr conInLineFetchHead
  9449.    ldx #2
  9450. -  lda keylinePrev,x
  9451.    cmp conHistbufReplacePtr+1,x
  9452.    bne ++
  9453.    dex
  9454.    bpl -
  9455. +  jsr conBell
  9456.    jmp conInNext
  9457. +  ldx #2
  9458. -  lda keylinePrev,x
  9459.    sta conHistbufScanPtr+1,x
  9460.    sta mp+1,x
  9461.    dex
  9462.    bpl -
  9463. +  lda #$00
  9464.    sta mp+0
  9465.    ;** undisplay current line
  9466.    jsr conInKillSub
  9467.    ;** fetch new line
  9468.    lda #<256
  9469.    ldy #>256
  9470.    jsr fetch
  9471.    ;** display new line
  9472.    lda #0
  9473.    sta keylinePos
  9474.    lda keylineLen
  9475.    sta keylineCount
  9476.    jsr conInSlosh
  9477.    lda keylineCount
  9478.    sta keylinePos
  9479.    jmp conInNext
  9480.  
  9481. conInLineFetchHead = *
  9482.    ldx #3
  9483. -  lda conHistbufScanPtr,x
  9484.    sta mp,x
  9485.    dex
  9486.    bpl -
  9487.    lda #<keylineBuf
  9488.    ldy #>keylineBuf
  9489.    sta zp+0
  9490.    sty zp+1
  9491.    lda #6
  9492.    ldy #0
  9493.    jsr fetch
  9494.    rts
  9495.  
  9496. conInSaveLine = *
  9497.    lda conHistbufReplacePtr+3
  9498.    cmp #aceMemNull
  9499.    bne +
  9500.    rts
  9501. +  lda keylineCount
  9502.    sta keylineLen
  9503.    ldx #3
  9504. -  lda conHistbufReplacePtr,x
  9505.    sta mp,x
  9506.    dex
  9507.    bpl -
  9508.    lda #$06
  9509.    sta mp+0
  9510.    lda #<keylineBuf+6
  9511.    ldy #>keylineBuf+6
  9512.    sta zp+0
  9513.    sty zp+1
  9514.    clc
  9515.    lda keylineCount
  9516.    adc #2
  9517.    ldy #0
  9518.    jsr stash
  9519.    lda #$00
  9520.    sta mp+0
  9521.    rts
  9522.  
  9523. conBackspace = *
  9524.    dec conCurCol
  9525.    bpl +
  9526.    ldx conWinCols
  9527.    dex
  9528.    stx conCurCol
  9529.    lda conCurRow
  9530.    beq +
  9531.    dec conCurRow
  9532.    sec
  9533.    lda conLineAddr+0
  9534.    sbc conRowInc+0
  9535.    sta conLineAddr+0
  9536.    lda conLineAddr+1
  9537.    sbc conRowInc+1
  9538.    sta conLineAddr+1
  9539. +  rts
  9540.  
  9541. conCursorOn = *  ;( )
  9542.    jsr conGetCursorAddr
  9543.    ldy conCursorColor
  9544.    lda #$ff
  9545.    jsr wincursor
  9546.    rts
  9547.  
  9548. conCursorOff = *  ;( )  ;.A preserved
  9549.    pha
  9550.    jsr conGetCursorAddr
  9551.    lda #0
  9552.    jsr wincursor
  9553.    pla
  9554.    rts
  9555.  
  9556. kernConColor = *
  9557. conColor = *
  9558.    sta syswork+15
  9559.    and #$80
  9560.    beq ++
  9561.    lda syswork+15
  9562.    and #$40
  9563.    beq +
  9564.    ora #$f0
  9565. +  ora #$80
  9566.    sta conPutMask
  9567. +  lda syswork+15
  9568.    and #$02
  9569.    beq +
  9570.    stx conCharColor
  9571. +  lda syswork+15
  9572.    and #$01
  9573.    beq +
  9574.    sty conCursorColor
  9575. +  lda syswork+15
  9576.    and #$04
  9577.    beq +
  9578.    lda syswork+0
  9579.    sta conFillColor
  9580. +  lda conFillColor
  9581.    sta syswork+0
  9582.    ldx conCharColor
  9583.    ldy conCursorColor
  9584.    lda conPutMask
  9585.    and #%01000000
  9586.    ora #%10110111
  9587.    rts
  9588.  
  9589. kernConPalette = *
  9590. conPalette = *
  9591.    ldx #7
  9592. -  jsr conGetPaletteColor
  9593.    sta syswork+0,x
  9594.    dex
  9595.    bpl -
  9596.    rts
  9597.  
  9598. conGetPaletteColor = *  ;( .X=color ) : .A=color, .X unchanged
  9599.    bit textMode
  9600.    bpl +
  9601.    .if computer-64
  9602.    lda configBuf+$b0,x
  9603.    .else
  9604.    lda configBuf+$d0,x
  9605.    .ife
  9606.    rts
  9607. +  nop
  9608.    .if computer-64
  9609.    lda configBuf+$b8,x
  9610.    .else
  9611.    lda configBuf+$d8,x
  9612.    .ife
  9613.    rts
  9614.  
  9615. conScrMaxRows .buf 1
  9616. conScrDefRows .buf 1
  9617. conScrReqRows .buf 1
  9618.  
  9619. kernConScreen = *
  9620. conScreen = *
  9621.    ;** check special sizes
  9622.    cpx #0
  9623.    bne +
  9624.    ldx #40
  9625.    bit textMode
  9626.    bpl +
  9627.    ldx #80
  9628. +  cpx #255
  9629.    bne +
  9630.    ldx #80
  9631.    .if computer-64
  9632.    .else
  9633.    bit configBuf+$c0
  9634.    bmi conScr6480cont
  9635.    ldx #40
  9636.    conScr6480cont = *
  9637.    .ife
  9638. +  ldy #25
  9639.    sty conScrMaxRows
  9640.    sty conScrDefRows
  9641.    .if computer-64
  9642.    cpx #40+1
  9643.    bcc +
  9644.    ldy configBuf+$ce
  9645.    sty conScrMaxRows
  9646.    ldy configBuf+$a9
  9647.    sty conScrDefRows
  9648.    .ife
  9649. +  cmp #0
  9650.    bne +
  9651.    lda conScrDefRows
  9652. +  cmp #255
  9653.    bne +
  9654.    lda conScrMaxRows
  9655.    ;** check screen limits
  9656. +  sta conScrReqRows
  9657.    cmp conScrMaxRows
  9658.    beq +
  9659.    bcc +
  9660. -  lda #aceErrInvalidConParms
  9661.    sta errno
  9662.    sec
  9663.    rts
  9664. +  cpx #81
  9665.    bcs -
  9666.    ;** set screen
  9667.    ldy #$00
  9668.    cpx #40+1
  9669.    bcc +
  9670.    ldy #$80
  9671. +  sty textMode
  9672. .if computer-64
  9673.    ;** 128-set fast/slow
  9674.    cpy #0
  9675.    beq +
  9676.    lda vic+$11
  9677.    and #%01101111
  9678.    sta vic+$11
  9679.    lda #1
  9680.    sta vic+$30
  9681.    jsr vdcInit
  9682.    jmp ++
  9683. +  lda #0
  9684.    sta vic+$30
  9685.    lda vic+$11
  9686.    and #%01111111
  9687.    ora #%00010000
  9688.    sta vic+$11
  9689. +  nop
  9690. .else
  9691.    ;** 64-initialize screen hardware
  9692.    cpy #$00
  9693.    bne +
  9694.    jsr vicInit
  9695.    jmp ++
  9696. +  jsr vdcInit
  9697.    bcc +
  9698.    lda #$00
  9699.    sta textMode
  9700.    lda #aceErrNoGraphicsSpace
  9701.    sta errno
  9702.    sec
  9703.    rts
  9704. +  nop
  9705. .ife
  9706.    ;** change colors
  9707.    jsr conPalette
  9708.    ldx syswork+0
  9709.    ldy syswork+1
  9710.    lda #%10100111
  9711.    jsr conColor
  9712.    jsr conPalette
  9713.    ldx syswork+7
  9714.    ldy syswork+6
  9715.    lda #$c0
  9716.    jsr wincolor
  9717.    ;** window parms
  9718.    jsr winmax
  9719.    jsr conWinInit
  9720.    lda conWinRows
  9721.    ldx conWinCols
  9722.    ldy #0
  9723.    sta conMouseMaxX+0
  9724.    sty conMouseMaxX+1
  9725.    stx conMouseMaxY+0
  9726.    sty conMouseMaxY+1
  9727.    ldy #3
  9728. -  asl conMouseMaxX+0
  9729.    rol conMouseMaxX+1
  9730.    asl conMouseMaxY+0
  9731.    rol conMouseMaxY+1
  9732.    dey
  9733.    bne -
  9734.    jsr conMouseBounds
  9735.    lda conWinRows
  9736.    ldx conWinCols
  9737.    clc
  9738.    rts
  9739.  
  9740. kernConPos = *
  9741.    cmp conWinRows
  9742.    bcc +
  9743. -  lda #aceErrInvalidConParms
  9744.    sta errno
  9745.    sec
  9746.    rts
  9747. +  cpx conWinCols
  9748.    bcs -
  9749.    sta conCurRow
  9750.    stx conCurCol
  9751.    ldx #0
  9752.    jsr winpos
  9753.    lda syswork+0
  9754.    ldy syswork+1
  9755.    sta conLineAddr+0
  9756.    sty conLineAddr+1
  9757.    clc
  9758.    rts
  9759.  
  9760. kernConGetpos = *
  9761.    lda conCurRow
  9762.    ldx conCurCol
  9763.    clc
  9764.    rts
  9765.  
  9766. ;3-Key Rollover-128 by Craig Bruce 18-Jun-93 from C= Hacking magazine
  9767.  
  9768. .if computer-64
  9769.    scanrows = 11
  9770.    pk = $d02f
  9771.    newpos = $cc
  9772.    keycode = $d4
  9773.    prevKeycode = $d5
  9774.    xsave = $cd
  9775.    mask = $cc
  9776.    scanval = $d2
  9777.    capsPort = $0001
  9778.    keymapPtr = $cc
  9779. .else
  9780.    scanrows = 8
  9781.    newpos = $f5
  9782.    keycode = $cb
  9783.    prevKeycode = $c5
  9784.    xsave = $f6
  9785.    mask = $f5
  9786.    scanval = $d9
  9787.    pk = $da  ;dummy
  9788.    capsPort .byte $40
  9789.    keymapPtr = $f5
  9790. .ife
  9791. stopKeyRow .buf 1
  9792. rollover = 3
  9793. nullKey = $ff
  9794.  
  9795. pa = $dc00
  9796. pb = $dc01
  9797. ddrb = $dc03
  9798.  
  9799. conIrqKeyscan = *
  9800.    jsr conMouseIrq
  9801.    lda scrollCountdown
  9802.    beq +
  9803.    dec scrollCountdown
  9804. +  lda #0
  9805.    sta pa
  9806.    sta pk
  9807. -  lda pb
  9808.    cmp pb
  9809.    bne -
  9810.    cmp #$ff
  9811.    beq noKeyPressed
  9812.  
  9813.    jsr checkJoystick
  9814.    bcc noKeyPressed
  9815.    jsr keyscan
  9816.    jsr checkJoystick
  9817.    bcc noKeyPressed
  9818.    lda scanTable+7
  9819.    sta stopKeyRow
  9820.    jsr selectMouse
  9821.    jsr shiftdecode
  9822.    jsr keydecode
  9823.    jsr conScreenUnsave
  9824.    jsr keyorder
  9825.    bit ignoreKeys
  9826.    bmi +
  9827.    lda prevKeys+0
  9828.    cmp #nullKey
  9829.    beq +
  9830.    sta keycode
  9831.    jmp interpKey
  9832.  
  9833.    noKeyPressed = *
  9834.    jsr selectMouse
  9835.    lda #nullKey
  9836.    ldx #rollover-1
  9837. -  sta prevKeys,x
  9838.    dex
  9839.    bpl -
  9840.    jsr scanCaps
  9841.    lda #0
  9842.    sta ignoreKeys
  9843.    sta stopKeyRow
  9844.  
  9845. +  lda #nullKey
  9846.    sta keycode
  9847.    sta prevKeycode
  9848.    rts
  9849.  
  9850. selectMouse = *
  9851.    lda #$ff
  9852.    sta pk
  9853.    lda #$7f  ;selects paddle/mouse A
  9854.    sta pa
  9855.    rts
  9856.  
  9857. keyscanInit = *
  9858.    lda #nullKey
  9859.    ldx #rollover-1
  9860. -  sta prevKeys,x
  9861.    dex
  9862.    bpl -
  9863.    lda #0
  9864.    sta ignoreKeys
  9865.    rts
  9866.  
  9867. ;the idea for the keyscan routine comes from Marko Makela
  9868.  
  9869. keyscan = *
  9870.    lda #$ff
  9871.    sty pa
  9872.    sty pk
  9873.    sta ddrb
  9874.    lda #$fe
  9875.    sta mask+0
  9876.    lda #$ff
  9877.    sta mask+1
  9878.    ldy #0
  9879.    nextRow = *
  9880.    lda mask+0
  9881.    sta pa
  9882.    lda mask+1
  9883.    sta pk
  9884.    sec
  9885.    rol mask+0
  9886.    rol mask+1
  9887.    lda #$ff
  9888.    sta scanval
  9889.    ldx #8
  9890.    lda #$fe
  9891. -  sta ddrb
  9892.    sta pb
  9893.    sec
  9894.    rol
  9895.    pha
  9896. -  lda pb
  9897.    cmp pb
  9898.    bne -
  9899.    and scanval
  9900.    sta scanval
  9901.    pla
  9902.    dex
  9903.    bne --
  9904.    lda #$ff
  9905.    sta pa
  9906.    sta pk
  9907.    lda scanval
  9908.    eor #$ff
  9909.    sta scanTable,y
  9910.    iny
  9911.    cpy #scanrows
  9912.    bcc nextRow
  9913.    lda #$00
  9914.    sta ddrb
  9915.    rts
  9916.  
  9917. shiftRows .byte $01,$06,$07,$07,$0a
  9918. shiftBits .byte $80,$10,$20,$04,$01
  9919. shiftMask .byte $01,$01,$02,$04,$08
  9920.  
  9921. shiftdecode = *
  9922.    jsr scanCaps
  9923. .if computer-64
  9924.    ldy #4
  9925. .else
  9926.    ldy #3
  9927. .ife
  9928. -  ldx shiftRows,y
  9929.    lda scanTable,x
  9930.    and shiftBits,y
  9931.    beq +
  9932.    lda shiftMask,y
  9933.    ora shiftValue
  9934.    sta shiftValue
  9935.    lda shiftBits,y
  9936.    eor #$ff
  9937.    and scanTable,x
  9938.    sta scanTable,x
  9939. +  dey
  9940.    bpl -
  9941.    rts
  9942.  
  9943. scanCaps = *
  9944. -  lda capsPort
  9945.    cmp capsPort
  9946.    bne -
  9947.    eor #$ff
  9948.    and #$40
  9949.    lsr
  9950.    lsr
  9951.    sta shiftValue
  9952.    rts
  9953.  
  9954. keydecode = *
  9955.    ldx #rollover-1
  9956.    lda #$ff
  9957. -  sta newKeys,x
  9958.    dex
  9959.    bpl -
  9960.    ldy #0
  9961.    sty newpos
  9962.    ldx #0
  9963.    stx keycode
  9964.  
  9965.    decodeNextRow = *
  9966.    lda scanTable,x
  9967.    beq decodeContinue
  9968.  
  9969.    ldy keycode
  9970. -  lsr
  9971.    bcc ++
  9972.    pha
  9973.    stx xsave
  9974.    ldx newpos
  9975.    cpx #rollover
  9976.    bcs +
  9977.    tya
  9978.    sta newKeys,x
  9979.    inc newpos
  9980. +  ldx xsave
  9981.    pla
  9982. +  iny
  9983.    cmp #$00
  9984.    bne -
  9985.  
  9986.    decodeContinue = *
  9987.    clc
  9988.    lda keycode
  9989.    adc #8
  9990.    sta keycode
  9991.    inx
  9992.    cpx #scanrows
  9993.    bcc decodeNextRow
  9994.    rts
  9995.  
  9996. keyorder = *
  9997.    ;** remove old keys no longer held
  9998.    ldy #0
  9999.    nextRemove = *
  10000.    lda prevKeys,y
  10001.    cmp #$ff
  10002.    beq ++
  10003.    ldx #rollover-1
  10004. -  cmp newKeys,x
  10005.    beq +
  10006.    dex
  10007.    bpl -
  10008.    tya
  10009.    tax
  10010. -  lda prevKeys+1,x
  10011.    sta prevKeys+0,x
  10012.    inx
  10013.    cpx #rollover-1
  10014.    bcc -
  10015.    lda #$ff
  10016.    sta prevKeys+rollover-1
  10017.    sta ignoreKeys
  10018. +  iny
  10019.    cpy #rollover
  10020.    bcc nextRemove
  10021.  
  10022.    ;** insert new key at front
  10023. +  ldy #0
  10024.    nextInsert = *
  10025.    lda newKeys,y
  10026.    cmp #$ff
  10027.    beq ++
  10028.    ldx #rollover-1
  10029. -  cmp prevKeys,x
  10030.    beq +
  10031.    dex
  10032.    bpl -
  10033.    pha
  10034.    ldx #rollover-2
  10035. -  lda prevKeys+0,x
  10036.    sta prevKeys+1,x
  10037.    dex
  10038.    bpl -
  10039.    lda #0
  10040.    sta ignoreKeys
  10041.    pla
  10042.    sta prevKeys+0
  10043.    ldy #rollover
  10044. +  iny
  10045.    cpy #rollover
  10046.    bcc nextInsert
  10047. +  rts
  10048.  
  10049. checkJoystick = *
  10050.    lda #$ff
  10051.    sta pa
  10052.    sta pk
  10053. -  lda pb
  10054.    cmp pb
  10055.    bne -
  10056.    cmp #$ff
  10057.    rts
  10058.  
  10059. scanTable  .buf scanrows
  10060. newKeys    .buf rollover
  10061. ignoreKeys .buf 1
  10062. prevKeys   .buf rollover+2
  10063.  
  10064. scrollFreeze    .byte $00
  10065. delayCountdown  .byte $00
  10066. repeatCountdown .byte $00
  10067. scrollCountdown .byte $00
  10068.  
  10069. interpKey = *  ;( keycode )
  10070.    lda keycode
  10071.    ;** noscroll
  10072.    cmp #87      ;noscroll
  10073.    bne interpCaps
  10074.    beq +
  10075.    cmp #63      ;run/stop
  10076.    bne interpCaps
  10077.    lda shiftValue
  10078.    and #%1111
  10079.    cmp #4       ;control
  10080.    bne interpCaps
  10081.    lda keycode
  10082. +  cmp prevKeycode
  10083.    beq +
  10084.    sta prevKeycode
  10085.    lda scrollFreeze
  10086.    eor #$ff
  10087.    sta scrollFreeze
  10088. +  rts
  10089.  
  10090.    interpCaps = *
  10091. .if computer-64
  10092. .else
  10093.    lda keycode
  10094.    cmp #63      ;run/stop
  10095.    bne interpShifts
  10096.    lda shiftValue
  10097.    and #%1111
  10098.    cmp #2       ;commodore
  10099.    bne interpShifts
  10100.    lda keycode
  10101.    cmp prevKeycode
  10102.    beq +
  10103.    sta prevKeycode
  10104.    lda capsPort
  10105.    eor #$40
  10106.    sta capsPort
  10107. +  rts
  10108. .ife
  10109.  
  10110.    interpShifts = *
  10111.    lda shiftValue
  10112.    and #%00011111
  10113.    cmp #%00010000
  10114.    bne +
  10115.    lda #$05
  10116.    jmp handleKey  ;caps
  10117. +  and #%1111
  10118.    tax
  10119.    lda shiftPriVec,x
  10120.    jmp handleKey
  10121.  
  10122. shiftPriVec = *
  10123. ;          0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
  10124.    .byte $00,$01,$02,$06,$03,$03,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04
  10125.  
  10126. handleKey = * ;( keycode, .A=shiftTableNum )
  10127.    asl
  10128.    tax
  10129.    lda keycode
  10130.    cmp prevKeycode
  10131.    beq handleRepeat
  10132.    jmp handleOrigKey
  10133.  
  10134. handleRepeat = *
  10135.    stx xsave
  10136.    lda delayCountdown
  10137.    beq +
  10138.    dec delayCountdown
  10139.    beq ++
  10140.    rts
  10141. +  dec repeatCountdown
  10142.    beq +
  10143. -  rts
  10144. +  lda configBuf+$c9
  10145.    sta repeatCountdown
  10146.    lda keybufCount
  10147.    bne -
  10148.    ldx xsave
  10149.    jmp +
  10150.  
  10151. handleOrigKey = * ;( .X=shiftTabOff )
  10152.    lda configBuf+$c8
  10153.    sta delayCountdown
  10154.    lda #0
  10155.    sta scrollFreeze
  10156. +  lda conKeymapIndirect+0,x
  10157.    sta keymapPtr+0
  10158.    lda conKeymapIndirect+1,x
  10159.    sta keymapPtr+1
  10160.    ldy keycode
  10161.    sty prevKeycode
  10162.    lda (keymapPtr),y
  10163.    bne storeKey
  10164.    rts
  10165.  
  10166. keybufHead  .byte 0
  10167. keybufTail  .byte 0
  10168. keybufCount .byte 0
  10169. keybufSize  = 32  ;power of 2
  10170. keybufData  .buf keybufSize
  10171. keybufShift .buf keybufSize
  10172.  
  10173. storeKey = *  ;( .A=char )
  10174.    ldx keybufCount
  10175.    cpx #keybufSize
  10176.    bcc +
  10177.    ;xx ring bell--intr
  10178.    rts
  10179. +  ldx keybufTail
  10180.    sta keybufData,x
  10181.    lda shiftValue
  10182.    and #$0f
  10183.    cmp #$03
  10184.    bne +
  10185. -  lda shiftValue
  10186.    ora #$20
  10187.    jmp ++
  10188. +  lda keycode
  10189.    cmp #64
  10190.    bcs -
  10191.    lda shiftValue
  10192. +  sta keybufShift,x
  10193.    inc keybufTail
  10194.    lda keybufTail
  10195.    and #keybufSize-1
  10196.    sta keybufTail
  10197.    inc keybufCount
  10198.    rts
  10199.  
  10200. ;*** getkey( ) : .A=keyChar, .X=keyShift
  10201.  
  10202. kernConGetkey = *
  10203. conGetkey = *
  10204.    php
  10205. -  cli
  10206.    lda keybufCount
  10207.    beq -
  10208.    sei
  10209.    ldy keybufHead
  10210.    dec keybufCount
  10211.    inc keybufHead
  10212.    lda keybufHead
  10213.    and #keybufSize-1
  10214.    sta keybufHead
  10215.    lda keybufData,y
  10216.    ldx keybufShift,y
  10217.    plp
  10218.    rts
  10219.  
  10220. ;*** conkeyavail( ) : .CC=.Z=keyIsAvailable, .A=availKey[notRemoved], .X=shift
  10221. kernConKeyAvail = *
  10222. .if computer-64
  10223.    ldy #$80
  10224. .else
  10225.    ldy #$00
  10226. .ife
  10227.    lda keybufCount
  10228.    beq +
  10229.    ldy keybufHead
  10230.    lda keybufData,y
  10231.    ldx keybufShift,y
  10232.    clc
  10233.    rts
  10234. +  lda #$00
  10235.    ldx #$00
  10236.    sec
  10237.    rts
  10238.    
  10239. ;*** stopkey( ) : .CC=notPressed
  10240.  
  10241. kernConStopkey = *
  10242. conStopkey = *
  10243.    lda stopKeyRow
  10244.    cmp #$80
  10245.    beq +
  10246. -  clc
  10247.    rts
  10248. +  lda shiftValue
  10249.    and #$0f
  10250.    bne -
  10251.    lda #0
  10252.    sta keybufCount
  10253.    sta keybufHead
  10254.    sta keybufTail
  10255.    sta scrollFreeze
  10256.    lda #aceErrStopped
  10257.    sta errno
  10258.    sec
  10259.    rts
  10260.  
  10261. conKeymapIndirect = *
  10262.    .word conKeymapNormal,conKeymapShift,conKeymapCommodore,conKeymapControl
  10263.    .word conKeymapAlternate,conKeymapCaps,conKeymapShiftComm
  10264.  
  10265. conKeymapNormal = *
  10266.    .byte $14,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  10267.    .byte $33,$57,$41,$34,$5a,$53,$45,$01  ;row 1
  10268.    .byte $35,$52,$44,$36,$43,$46,$54,$58  ;row 2
  10269.    .byte $37,$59,$47,$38,$42,$48,$55,$56  ;row 3
  10270.    .byte $39,$49,$4a,$30,$4d,$4b,$4f,$4e  ;row 4
  10271.    .byte $2b,$50,$4c,$2d,$2e,$3a,$40,$2c  ;row 5
  10272.    .byte $5c,$2a,$3b,$13,$01,$3d,$5e,$2f  ;row 6
  10273.    .byte $31,$5f,$04,$32,$20,$02,$51,$03  ;row 7
  10274.    .byte $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  10275.    .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  10276.    .byte $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  10277.  
  10278. conKeymapShift = *
  10279.    .byte $94,$8d,$9d,$8c,$89,$8a,$8b,$91  ;row 0
  10280.    .byte $23,$d7,$c1,$24,$da,$d3,$c5,$01  ;row 1
  10281.    .byte $25,$d2,$c4,$26,$c3,$c6,$d4,$d8  ;row 2
  10282.    .byte $27,$d9,$c7,$28,$c2,$c8,$d5,$d6  ;row 3
  10283.    .byte $29,$c9,$ca,$30,$cd,$cb,$cf,$ce  ;row 4
  10284.    .byte $db,$d0,$cc,$dd,$3e,$5b,$ba,$3c  ;row 5
  10285.    .byte $dc,$c0,$5d,$93,$01,$3d,$de,$3f  ;row 6
  10286.    .byte $21,$df,$04,$22,$20,$02,$d1,$83  ;row 7
  10287.    .byte $84,$38,$35,$02,$32,$34,$37,$31  ;row 8
  10288.    .byte $1b,$2b,$2d,$07,$8d,$36,$39,$33  ;row 9
  10289.    .byte $08,$30,$2e,$16,$17,$06,$0b,$00  ;row 10
  10290.  
  10291. conKeymapCommodore = *
  10292.    .byte $08,$0d,$16,$8f,$80,$82,$84,$17  ;row 0
  10293.    .byte $96,$b7,$a1,$97,$ba,$b3,$a5,$01  ;row 1
  10294.    .byte $98,$b2,$a4,$99,$a3,$a6,$b4,$b8  ;row 2
  10295.    .byte $9a,$b9,$a7,$9b,$a2,$a8,$b5,$b6  ;row 3
  10296.    .byte $29,$a9,$aa,$30,$ad,$ab,$af,$ae  ;row 4
  10297.    .byte $2b,$b0,$ac,$2d,$3e,$bb,$a0,$3c  ;row 5
  10298.    .byte $bc,$7f,$bd,$93,$01,$bf,$be,$3f  ;row 6
  10299.    .byte $81,$bf,$04,$95,$5f,$02,$b1,$03  ;row 7
  10300.    .byte $84,$38,$35,$18,$32,$34,$37,$31  ;row 8
  10301.    .byte $1b,$2b,$2d,$07,$8d,$36,$39,$33  ;row 9
  10302.    .byte $08,$30,$2e,$0c,$0f,$10,$15,$00  ;row 10
  10303.  
  10304. conKeymapControl = *
  10305.    .byte $08,$00,$00,$8f,$80,$82,$84,$00  ;row 0
  10306.    .byte $1c,$f7,$e1,$9f,$fa,$f3,$e5,$00  ;row 1
  10307.    .byte $9c,$f2,$e4,$1e,$e3,$e6,$f4,$f8  ;row 2
  10308.    .byte $1f,$f9,$e7,$9e,$e2,$e8,$f5,$f6  ;row 3
  10309.    .byte $12,$e9,$ea,$92,$ed,$eb,$ef,$ee  ;row 4
  10310.    .byte $2b,$f0,$ec,$2d,$00,$fb,$e0,$00  ;row 5
  10311.    .byte $fc,$60,$fd,$00,$00,$ff,$fe,$00  ;row 6
  10312.    .byte $90,$ff,$00,$05,$20,$00,$f1,$00  ;row 7
  10313.    .byte $84,$8c,$87,$18,$89,$8a,$88,$85  ;row 8
  10314.    .byte $1b,$84,$8f,$0a,$00,$8b,$80,$86  ;row 9
  10315.    .byte $08,$82,$2e,$16,$17,$19,$1a,$00  ;row 10
  10316.  
  10317. conKeymapAlternate = *
  10318.    .byte $08,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  10319.    .byte $33,$77,$61,$34,$7a,$73,$65,$00  ;row 1
  10320.    .byte $35,$72,$64,$36,$63,$66,$74,$78  ;row 2
  10321.    .byte $37,$79,$67,$78,$62,$68,$75,$76  ;row 3
  10322.    .byte $39,$69,$6a,$30,$6d,$6b,$6f,$6e  ;row 4
  10323.    .byte $2b,$70,$6c,$2d,$2e,$7b,$ba,$2c  ;row 5
  10324.    .byte $a9,$60,$7d,$13,$00,$7f,$7e,$2f  ;row 6
  10325.    .byte $31,$7f,$04,$32,$20,$02,$71,$03  ;row 7
  10326.    .byte $84,$38,$35,$09,$32,$34,$37,$31  ;row 8
  10327.    .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  10328.    .byte $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  10329.  
  10330. conKeymapCaps = *
  10331.    .byte $14,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  10332.    .byte $33,$d7,$c1,$34,$da,$d3,$c5,$01  ;row 1
  10333.    .byte $35,$d2,$c4,$36,$c3,$c6,$d4,$d8  ;row 2
  10334.    .byte $37,$d9,$c7,$38,$c2,$c8,$d5,$d6  ;row 3
  10335.    .byte $39,$c9,$ca,$30,$cd,$cb,$cf,$ce  ;row 4
  10336.    .byte $2b,$d0,$cc,$2d,$2e,$3a,$40,$2c  ;row 5
  10337.    .byte $5c,$2a,$3b,$13,$01,$3d,$5e,$2f  ;row 6
  10338.    .byte $31,$5f,$04,$32,$20,$02,$d1,$03  ;row 7
  10339.    .byte $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  10340.    .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  10341.    .byte $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  10342.  
  10343. conKeymapShiftComm = *
  10344.    .byte $00,$0d,$16,$00,$00,$00,$00,$17  ;row 0
  10345.    .byte $33,$0c,$10,$34,$0f,$15,$1b,$00  ;row 1
  10346.    .byte $35,$00,$0e,$36,$00,$00,$09,$00  ;row 2
  10347.    .byte $37,$18,$84,$38,$06,$04,$00,$00  ;row 3
  10348.    .byte $39,$16,$19,$30,$17,$1a,$00,$0b  ;row 4
  10349.    .byte $2b,$07,$0a,$2d,$2e,$10,$00,$2c  ;row 5
  10350.    .byte $00,$00,$15,$0c,$00,$00,$00,$04  ;row 6
  10351.    .byte $31,$1b,$00,$32,$00,$00,$00,$00  ;row 7
  10352.    .byte $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  10353.    .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  10354.    .byte $00,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  10355.  
  10356. conSsCountdown .byte 1
  10357. conJifsPerMin = 3600
  10358. conSsMinute .word conJifsPerMin
  10359. conSsMax .byte 1
  10360. conSsActive .byte $00
  10361.  
  10362. conScreenSave = *
  10363.    lda conSsCountdown
  10364.    bne +
  10365. -  rts
  10366. +  lda conSsMinute+0
  10367.    bne +
  10368.    dec conSsMinute+1
  10369. +  dec conSsMinute+0
  10370.    lda conSsMinute+0
  10371.    ora conSsMinute+1
  10372.    bne -
  10373.    lda #<conJifsPerMin
  10374.    ldy #>conJifsPerMin
  10375.    sta conSsMinute+0
  10376.    sty conSsMinute+1
  10377.    dec conSsCountdown
  10378.    bne -
  10379.    jsr vdcScreenSave
  10380.    jsr vicScreenSave
  10381.    lda #$ff
  10382.    sta conSsActive
  10383.    rts
  10384.  
  10385. conScreenUnsave = *
  10386.    lda conSsMax
  10387.    sta conSsCountdown
  10388.    lda #<conJifsPerMin
  10389.    ldy #>conJifsPerMin
  10390.    sta conSsMinute+0
  10391.    sty conSsMinute+1
  10392.    lda conSsActive
  10393.    bne +
  10394.    rts
  10395. +  jsr vdcScreenUnsave
  10396.    jsr vicScreenUnsave
  10397.    lda #$00
  10398.    sta conSsActive
  10399.    rts
  10400.  
  10401. ;This is to be done when we are in the write routine about to scroll the screen
  10402. ;because we have hit the bottom line of the display.  It is also to be done in
  10403. ;the context of the data remaining to be printed at the time.  I've changed
  10404. ;the design a little to quickly go through and count the number of newline
  10405. ;characters in the buffer and then scroll by that amount.
  10406.  
  10407. conLinesToScroll .buf 1
  10408. conBytesToScroll .buf 2
  10409. conScanPtr = syswork+14 ;(2)
  10410. conScanLen .buf 2
  10411. conMaxPrescroll .buf 1
  10412. conSoft80NonReu .buf 1
  10413.  
  10414. ;conWritePtr    = syswork+8
  10415. ;conWriteLength = syswork+10
  10416.  
  10417. conWriteNewline = *
  10418.    bit conIgnoreCtrl
  10419.    bmi +
  10420.    bit conIgnoreShift
  10421.    bmi +
  10422.    lda shiftValue
  10423.    and #$07
  10424.    beq +
  10425. -  jmp conNewline
  10426. +  ldx conCurRow
  10427.    inx
  10428.    cpx conWinRows
  10429.    bcc -
  10430.  
  10431. ;find maximum prescroll amount;
  10432. ;if maximum prescroll amount < 2 then never mind;
  10433.  
  10434.    ldy #$00
  10435. .if computer-64
  10436.    lda configBuf+$ac
  10437.    bit textMode
  10438.    bmi conPrescrollBegin
  10439.    lda configBuf+$ad
  10440. .else
  10441.    lda configBuf+$af
  10442.    bit textMode
  10443.    bpl conPrescrollBegin
  10444.    ldy #$ff
  10445.    lda configBuf+$ae
  10446.    ldx vdcScrollReuWork+3
  10447.    cpx #aceMemNull
  10448.    beq conPrescrollBegin
  10449.    lda configBuf+$ab
  10450.    ldy #$00
  10451. .ife
  10452.    conPrescrollBegin = *
  10453.    sty conSoft80NonReu
  10454.    ldx conPrescrollOverride
  10455.    beq +
  10456.    txa
  10457. +  sta conMaxPrescroll
  10458.    cmp #2
  10459.    bcs +
  10460.    jmp conNewline
  10461. +  cmp conWinRows
  10462.    bcc +
  10463.    lda conWinRows
  10464.    sta conMaxPrescroll
  10465. +  lda #1
  10466.    sta conLinesToScroll
  10467.    lda #0 ;number of bytes to move cursor up
  10468.    ldy #0
  10469.    sta conBytesToScroll+0
  10470.    sty conBytesToScroll+1
  10471.    lda conWritePtr+0
  10472.    ldy conWritePtr+1
  10473.    sta conScanPtr+0
  10474.    sty conScanPtr+1
  10475.    lda conWriteLength+0
  10476.    ldy conWriteLength+1
  10477.    sta conScanLen+0
  10478.    sty conScanLen+1
  10479.  
  10480.    ;** ignore first char of buffer
  10481.    inc conScanPtr+0
  10482.    bne +
  10483.    inc conScanPtr+1
  10484. +  lda conScanLen+0
  10485.    bne +
  10486.    dec conScanLen+1
  10487. +  dec conScanLen+0
  10488.    lda conScanLen+0
  10489.    ora conScanLen+1
  10490.    bne +
  10491.    jmp conPrescrollExit
  10492.  
  10493.    ;** count the CRs
  10494. +  ldy conScanLen+1
  10495.    beq +
  10496. -  ldy #0
  10497.    jsr conCountCrs
  10498.    bcs ++
  10499.    inc conScanPtr+1
  10500.    dec conScanLen+1
  10501.    bne -
  10502. +  ldy conScanLen+0
  10503.    jsr conCountCrs
  10504. +  jmp conPrescrollExit
  10505.  
  10506. conCountCrs = *  ;( (conScanPtr)=ptr, .Y=bytes, conCrCount ) : conCrCount,.CS=f
  10507.    dey
  10508.    beq ++
  10509. -  lda (conScanPtr),y
  10510.    cmp #chrCR
  10511.    bne +
  10512.    jsr conPrescrollLine
  10513.    bcc +
  10514.    rts
  10515. +  dey
  10516.    bne -
  10517. +  lda (conScanPtr),y
  10518.    cmp #chrCR
  10519.    beq +
  10520.    clc
  10521.    rts
  10522. +  jsr conPrescrollLine
  10523. +  rts
  10524.  
  10525. conPrescrollLine = *  ;.CS=maxed
  10526.    inc conLinesToScroll
  10527.    clc
  10528.    lda conBytesToScroll+0
  10529.    adc conRowInc+0
  10530.    sta conBytesToScroll+0
  10531.    bcc +
  10532.    inc conBytesToScroll+1
  10533. +  lda conLinesToScroll
  10534.    cmp conMaxPrescroll
  10535.    rts
  10536.  
  10537. conPrescrollExit = *
  10538.    bit conSoft80NonReu
  10539.    bpl +
  10540.    lda conPrescrollOverride
  10541.    bne +
  10542. -  lda conLinesToScroll
  10543.    cmp configBuf+$a4
  10544.    bcs +
  10545.    jsr conPrescrollLine
  10546.    bcs +
  10547.    jmp -
  10548.  
  10549. +  lda #" "
  10550.    sta syswork+4
  10551.    lda conPutMask
  10552.    ora #$08
  10553.    ldx conLinesToScroll
  10554.    ldy conFillColor
  10555.    jsr winscroll
  10556.    inc conCurRow
  10557.    sec
  10558.    lda conCurRow
  10559.    sbc conLinesToScroll
  10560.    sta conCurRow
  10561.    sec
  10562.    lda conLineAddr+0
  10563.    sbc conBytesToScroll+0
  10564.    sta conLineAddr+0
  10565.    lda conLineAddr+1
  10566.    sbc conBytesToScroll+1
  10567.    sta conLineAddr+1
  10568.    lda #0
  10569.    sta conCurCol
  10570.    rts
  10571.  
  10572. kernConPutctrl = *
  10573. conPutctrl = *
  10574.    stx conPutctrlParm
  10575.    ;** check recognized
  10576.    ldx #conPutctrlDispatch-conPutctrlChars-1
  10577. -  cmp conPutctrlChars,x
  10578.    beq +
  10579.    dex
  10580.    bpl -
  10581.    bmi ++
  10582. +  txa
  10583.    asl
  10584.    tax
  10585.    lda conPutctrlDispatch+0,x
  10586.    sta syswork+0
  10587.    lda conPutctrlDispatch+1,x
  10588.    sta syswork+1
  10589.    ldx conPutctrlParm
  10590.    jmp (syswork+0)
  10591.    ;** check color
  10592. +  nop
  10593.    ;** print regular char
  10594.    jmp conPutchar
  10595.  
  10596.    conPutctrlChars = *
  10597.    .byte chrCR,chrCLS,chrTAB,chrBS,chrBEL,chrBOL,chrVT
  10598.    .byte $13,$91,$11,$9d,$1d
  10599.    .byte $12,$92,$08,$94
  10600.    .byte $fe,$e0
  10601.    .byte $f0,$f1,$f8
  10602.    .byte $e9,$e4,$ec
  10603.    .byte $ed,$e7,$f2,$ee
  10604.    .byte $f5,$ef,$e2
  10605.    conPutctrlDispatch = *
  10606.    .word conNewline,conCls,conTab,conBackspace,conBell,conReturnOnly,conCtrlDown
  10607.    .word conHome,conCtrlUp,conCtrlDown,conCtrlLeft,conCtrlRight
  10608.    .word conCtrlRvs,conCtrlRvsOff,conCtrlRub,conCtrlInsert
  10609.    .word conCtrlScreenEraseBegToCur,conCtrlScreenEraseCurToEnd
  10610.    .word conCtrlLineEraseBegToCur,conCtrlLineEraseCurToEnd,conCtrlLineErase
  10611.    .word conCtrlInsertLine,conCtrlDeleteLine,conCtrlPrescrollOverride
  10612.    .word conCtrlShiftScroll,conCtrlSynch,conCtrlScreenRvs,conCtrlScreenRvsOff
  10613.    .word conCtrlUnderline,conCtrlAttribOff,conCtrlBlink
  10614.    conPutctrlParm .buf 1
  10615.  
  10616. conCtrlUp = * ;$91
  10617.    lda conCurRow
  10618.    beq +
  10619.    dec conCurRow
  10620.    sec
  10621.    lda conLineAddr+0
  10622.    sbc conRowInc+0
  10623.    sta conLineAddr+0
  10624.    lda conLineAddr+1
  10625.    sbc conRowInc+1
  10626.    sta conLineAddr+1
  10627.    clc
  10628.    rts
  10629. +  jsr conScrollDown
  10630.    clc
  10631.    rts
  10632.  
  10633. conScrollDown = *
  10634.    lda #" "
  10635.    sta syswork+4
  10636.    lda conPutMask
  10637.    ora #$04
  10638.    ldx #1
  10639.    ldy conFillColor
  10640.    jsr winscroll
  10641.    rts
  10642.  
  10643. conCtrlDown = * ;$11
  10644.    lda conCurCol
  10645.    pha
  10646.    jsr conNewline
  10647.    pla
  10648.    sta conCurCol
  10649.    rts
  10650.  
  10651. conCtrlLeft = * ;$9d
  10652.    lda conCurRow
  10653.    ora conCurCol
  10654.    beq +
  10655.    jmp conBackspace
  10656. +  jsr conCtrlUp
  10657.    ldx conWinCols
  10658.    dex
  10659.    stx conCurCol
  10660.    rts
  10661.  
  10662. conCtrlRight = * ;$1d
  10663.    inc conCurCol
  10664.    lda conCurCol
  10665.    cmp conWinCols
  10666.    bcc +
  10667.    jmp conNewline
  10668. +  rts
  10669.  
  10670. conCtrlRvs = * ;$12
  10671.    lda conExtAttr
  10672.    ora #$40
  10673.    sta conExtAttr
  10674.    rts
  10675.  
  10676. conCtrlRvsOff = * ;$92
  10677.    lda conExtAttr
  10678.    and #$ff-$40
  10679.    sta conExtAttr
  10680.    rts
  10681.  
  10682. conCtrlLineEraseBegToCur = *  ;$f0 (ESC p)
  10683.    ldx #0
  10684.    ldy conCurCol
  10685.    jmp conCtrlLineEraseWork
  10686.  
  10687. conCtrlLineEraseCurToEnd = *  ;$f1 (ESC q)
  10688.    ldx conCurCol
  10689.    ldy conWinCols
  10690.    dey
  10691.    jmp conCtrlLineEraseWork
  10692.  
  10693. conCtrlLineErase = *  ;$f8 (ESC x)
  10694.    ldx #0
  10695.    ldy conWinCols
  10696.    dey
  10697.  
  10698.    conCtrlLineEraseWork = *  ;(.X=fromOff, .Y=toOffInclusive)
  10699.    stx syswork+0
  10700.    iny
  10701.    tya
  10702.    sec
  10703.    sbc syswork+0
  10704.    sta syswork+5
  10705.    lda conLineAddr+0
  10706.    ldy conLineAddr+1
  10707.    clc
  10708.    adc syswork+0
  10709.    bcc +
  10710.    iny
  10711. +  sta syswork+0
  10712.    sty syswork+1
  10713.    lda #" "
  10714.    sta syswork+4
  10715.    lda #$00
  10716.    sta syswork+6
  10717.    lda conPutMask
  10718.    ldx #0
  10719.    ldy conFillColor
  10720.    jsr winput
  10721.    rts
  10722.  
  10723. conCtrlPrescrollOverride = *  ;$ec (ESC l)
  10724.    stx conPrescrollOverride
  10725.    rts
  10726.  
  10727. conCtrlShiftScroll = *  ;$ed (ESC m)
  10728.    stx conIgnoreShift
  10729.    rts
  10730.  
  10731. conCtrlSynch = *  ;$e7 (ESC g)
  10732.    jsr conSynchCursor
  10733.    rts
  10734.  
  10735. conCtrlInsertLine = *  ;$e9 (ESC i)
  10736.    jsr conCtrlScreenGetBelow
  10737.    clc
  10738.    adc #1
  10739.    dec syswork+0
  10740.    jsr conSubwinSet
  10741.    lda conPutMask
  10742.    ora #$04
  10743.    jmp conCtrlDeleteWork
  10744.  
  10745. conCtrlDeleteLine = *  ;$e4 (ESC d)
  10746.    jsr conCtrlScreenGetBelow
  10747.    clc
  10748.    adc #1
  10749.    dec syswork+0
  10750.    jsr conSubwinSet
  10751.    lda conPutMask
  10752.    ora #$08
  10753.    conCtrlDeleteWork = *
  10754.    ldx #" "
  10755.    stx syswork+4
  10756.    ldx #1
  10757.    ldy conFillColor
  10758.    jsr winscroll
  10759.    jsr conSubwinExit
  10760.    rts
  10761.  
  10762. conCtrlScreenEraseBegToCur = *  ;$ef (ESC o)
  10763.    jsr conCtrlLineEraseBegToCur
  10764.    lda conWinStartRow
  10765.    ldx conWinStartCol
  10766.    sta syswork+0
  10767.    stx syswork+1
  10768.    lda conCurRow
  10769.    ldx conWinCols
  10770.    jmp conCtrlScreenEraseWork
  10771.  
  10772. conCtrlScreenEraseCurToEnd = *  ;$e0 (ESC @)
  10773.    jsr conCtrlLineEraseCurToEnd
  10774.    jsr conCtrlScreenGetBelow
  10775.    conCtrlScreenEraseWork = *
  10776.    jsr conSubwinSet
  10777.    bcs +
  10778.    lda conPutMask
  10779.    ldy conFillColor
  10780.    ldx #" "
  10781.    jsr wincls
  10782.    jsr conSubwinExit
  10783. +  rts
  10784.  
  10785. conCtrlScreenGetBelow = *  ;( ) : (sw+0)=start_row/col, .AX=size_rows/cols
  10786.    sec ;sic
  10787.    lda conWinStartRow
  10788.    adc conCurRow
  10789.    ldx conWinStartCol
  10790.    sta syswork+0
  10791.    stx syswork+1
  10792.    clc ;sic
  10793.    lda conWinRows
  10794.    sbc conCurRow
  10795.    ldx conWinCols
  10796.    rts
  10797.  
  10798. conSubwinSave .buf conWinDataEnd-conWinStart
  10799.  
  10800. conSubwinSet = *  ;( ) : .CS=err
  10801.    pha
  10802.    ldy #conWinDataEnd-conWinStart-1
  10803. -  lda conWinStart,y
  10804.    sta conSubwinSave,y
  10805.    dey
  10806.    bpl -
  10807.    pla
  10808.    jmp winset
  10809.  
  10810. conSubwinExit = *  ;( )
  10811.    lda conWinStartRow-conWinStart+conSubwinSave  ;use saved value
  10812.    ldx conWinStartCol-conWinStart+conSubwinSave
  10813.    sta syswork+0
  10814.    stx syswork+1
  10815.    lda conWinRows-conWinStart+conSubwinSave
  10816.    ldx conWinCols-conWinStart+conSubwinSave
  10817.    jsr winset
  10818.    ldx #conWinDataEnd-conWinStart-1
  10819. -  lda conSubwinSave,x
  10820.    sta conWinStart,x
  10821.    dex
  10822.    bpl -
  10823.    rts
  10824.  
  10825. conCtrlScreenRvs = *
  10826.    .if computer-64
  10827.    bit textMode
  10828.    bpl +
  10829.    jsr vdcScreenRvs
  10830. +  nop
  10831.    .ife
  10832.    rts
  10833.  
  10834. conCtrlScreenRvsOff = *
  10835.    .if computer-64
  10836.    bit textMode
  10837.    bpl +
  10838.    jsr vdcScreenRvsOff
  10839. +  nop
  10840.    .ife
  10841.    rts
  10842.  
  10843. conCtrlUnderline = *  ;$f5 (ESC U)
  10844.    lda conExtAttr
  10845.    ora #$20
  10846.    sta conExtAttr
  10847.    rts
  10848.  
  10849. conCtrlBlink = *  ;$e2 (ESC B)
  10850.    lda conExtAttr
  10851.    ora #$10
  10852.    sta conExtAttr
  10853.    rts
  10854.  
  10855. conCtrlAttribOff = *  ;$ef (ESC O)
  10856.    lda conExtAttr
  10857.    and #$80
  10858.    sta conExtAttr
  10859.    rts
  10860.  
  10861. conCtrlRub = * ;$08
  10862.    rts
  10863.  
  10864. conCtrlInsert = * ;$94
  10865.    rts
  10866.  
  10867. kernConKeyMat = *
  10868.    lda zp+0
  10869.    ldy zp+1
  10870.    sta syswork+0
  10871.    sty syswork+1
  10872.    ldy #0
  10873. -  lda (syswork+0),y
  10874.    sta conKeymapNormal+0,y
  10875.    iny
  10876.    bne -
  10877.    inc syswork+1
  10878. -  lda (syswork+0),y
  10879.    sta conKeymapNormal+256,y
  10880.    iny
  10881.    bne -
  10882.    inc syswork+1
  10883. -  lda (syswork+0),y
  10884.    sta conKeymapNormal+512,y
  10885.    iny
  10886.    cpy #104
  10887.    bcc -
  10888.    clc
  10889.    rts
  10890.  
  10891. conInputMode      .buf 1
  10892. conInputFakeCount .buf 1
  10893. conInputFakePos   .buf 1
  10894.  
  10895. kernConInput = * ;( (zp)=buf/initstr, .Y=initStrLen ):.Y=len,.CS=excp,.A=fchar
  10896.    lda #$ff
  10897.    sta conInputMode
  10898.    sty conInputFakeCount
  10899.    ldy #0
  10900.    sty conInputFakePos
  10901. -  lda (zp),y
  10902.    sta stringBuffer,y
  10903.    iny
  10904.    cpy conInputFakeCount
  10905.    bcc -
  10906.    jsr conInputIn
  10907.    php
  10908.    pha
  10909.    dec keylineCount
  10910.    ldy #0
  10911.    cpy keylineCount
  10912.    beq +
  10913. -  lda keyline,y
  10914.    sta (zp),y
  10915.    iny
  10916.    cpy keylineCount
  10917.    bcc -
  10918. +  lda #$00
  10919.    sta (zp),y
  10920.    sta keylinePos
  10921.    sta keylineCount
  10922.    sta keylinePtr
  10923.    pla
  10924.    plp
  10925.    rts
  10926.  
  10927. conMousePotx    = sid+$19
  10928. conMousePoty    = sid+$1a
  10929. conMouseOpotx    .buf 1
  10930. conMouseOpoty    .buf 1
  10931. conMouseNewValue .buf 1
  10932. conMouseOldValue .buf 1
  10933. conMouseX        .buf 2
  10934. conMouseY        .buf 2
  10935. conMouseButtons  .buf 1
  10936. conMouseMaxX     .word 640
  10937. conMouseMaxY     .word 491
  10938. conMouseScaleX   .byte 8
  10939. conMouseScaleY   .byte 8
  10940.  
  10941. kernConMouse = *  ;( ) : .A=buttons:l/r:128/64,(sw+0)=pX,(sw+2)=pY,sw+4=cX,sw+5Y
  10942.    php
  10943.    sei
  10944.    jsr conMouseBounds
  10945.    lda conMouseX+0
  10946.    ldy conMouseX+1
  10947.    sta syswork+0
  10948.    sty syswork+1
  10949.    lda conMouseY+0
  10950.    ldy conMouseY+1
  10951.    sta syswork+2
  10952.    sty syswork+3
  10953.    lda conMouseButtons
  10954.    plp
  10955.    clc
  10956.    rts
  10957.  
  10958. conMouseIrq = *
  10959.    lda conMousePotx
  10960.    ldy conMouseOpotx
  10961.    jsr conMouseMoveCheck
  10962.    sty conMouseOpotx
  10963.    clc
  10964.    adc conMouseX+0
  10965.    sta conMouseX+0
  10966.    txa
  10967.    adc conMouseX+1
  10968.    sta conMouseX+1
  10969.    lda conMousePoty
  10970.    ldy conMouseOpoty
  10971.    jsr conMouseMoveCheck
  10972.    sty conMouseOpoty
  10973.    sec
  10974.    eor #$ff
  10975.    adc conMouseY+0
  10976.    sta conMouseY+0
  10977.    txa
  10978.    eor #$ff
  10979.    adc conMouseY+1
  10980.    sta conMouseY+1
  10981.    lda #$00
  10982.    sta conMouseButtons
  10983.    rts
  10984.  
  10985. conMouseMoveCheck = *
  10986.    sty conMouseOldValue
  10987.    sta conMouseNewValue
  10988.    ldx #0
  10989.    sec
  10990.    sbc conMouseOldValue
  10991.    and #%01111111
  10992.    cmp #%01000000
  10993.    bcs +
  10994.    lsr
  10995.    beq ++
  10996.    ldy conMouseNewValue
  10997.    rts
  10998. +  ora #%11000000
  10999.    cmp #$ff
  11000.    beq +
  11001.    sec
  11002.    ror
  11003.    ldx #$ff
  11004.    ldy conMouseNewValue
  11005.    rts
  11006. +  lda #0
  11007.    rts
  11008.  
  11009. conMouseBounds = *
  11010.    ldx #0
  11011.    jsr +
  11012.    ldx #2
  11013. +  lda conMouseX+1,x
  11014.    bpl +
  11015.    lda #$00
  11016.    sta conMouseX+0,x
  11017.    sta conMouseX+1,x
  11018. +  lda conMouseX+0,x
  11019.    cmp conMouseMaxX+0,x
  11020.    lda conMouseX+1,x
  11021.    sbc conMouseMaxX+1,x
  11022.    bcc +
  11023.    lda conMouseMaxX+0,x
  11024.    sbc #1
  11025.    sta conMouseX+0,x
  11026.    lda conMouseMaxX+1,x
  11027.    sbc #0
  11028.    sta conMouseX+1,x
  11029. +  rts
  11030.  
  11031. kernConJoystick = *
  11032.    lda #$00
  11033.    ldx #$00
  11034.    clc
  11035.    rts
  11036.  
  11037. kernConChrset = *  ;( .A=flags, (sw+0)=dataAddr, .X=start, .Y=len ) : .A=flags
  11038. conChrset = *
  11039.    ;** flags: $80=put, $40=get, $20=0:chr/1:palette, $10=0:full/1:rvs
  11040.    ;**        $08=8-bit, $04=4-bit, $02=main, $01=alternate
  11041.    ;** out flags tells what exists, both put&get means ignore full/rvs
  11042.    ;** initialize
  11043.    sta syswork+4  ;sw+4 = flags
  11044.    sty syswork+5  ;sw+5 = len
  11045.    lda syswork+0
  11046.    ldy syswork+1
  11047.    sta syswork+6  ;(sw+6) = dataAddr
  11048.    sty syswork+7
  11049.    ;** set up return code
  11050.    .if computer-64
  11051.    lda #%00001010
  11052.    .else
  11053.    lda #%00001010
  11054.    bit configBuf+$c0
  11055.    bpl +
  11056.    ora #%10000100
  11057. +  nop
  11058.    .ife
  11059.    sta syswork+8  ;sw+8 = exitFlags
  11060.    lda syswork+4
  11061.    and #$20
  11062.    beq +
  11063.    jmp conChrsetPalette
  11064.    ;** handle regular character definitions
  11065. +  txa
  11066.    ;** set start-character address
  11067.    ldy #0
  11068.    sty syswork+3  ;(syswork+2)=chrAddr
  11069.    ldx #3
  11070. -  asl
  11071.    rol syswork+3
  11072.    dex
  11073.    bne -
  11074.    sta syswork+2
  11075.    lda syswork+4
  11076.    ldx #$80
  11077.    and #$0c
  11078.    cmp #$04
  11079.    bne +
  11080.    lda #$d8
  11081.    bit syswork+8
  11082.    bmi ++
  11083.    jmp conChrsetExit
  11084. +  ldx #$00
  11085.    lda #$f0
  11086.    bit syswork+8
  11087.    bpl +
  11088.    lda #$d0
  11089. +  stx syswork+9  ;sw+9 = 4-bit flag
  11090.    clc
  11091.    adc syswork+3
  11092.    sta syswork+3
  11093.    ;** copy
  11094.    lda #bkRam0
  11095.    sta bkSelect
  11096. -  ldy #7
  11097. -  bit syswork+4
  11098.    bpl ++
  11099.    lda (syswork+6),y  ;source
  11100.    bit syswork+9
  11101.    bpl +
  11102.    and #$f0
  11103.    sta syswork+10
  11104.    lsr
  11105.    lsr
  11106.    lsr
  11107.    lsr
  11108.    ora syswork+10
  11109. +  sta (syswork+2),y  ;char
  11110. +  bit syswork+4
  11111.    bvc +
  11112.    lda (syswork+2),y  ;char
  11113.    sta (syswork+6),y  ;source
  11114. +  dey
  11115.    bpl -
  11116.    clc
  11117.    lda syswork+2
  11118.    adc #8
  11119.    sta syswork+2
  11120.    bcc +
  11121.    inc syswork+3
  11122. +  clc
  11123.    lda syswork+6
  11124.    adc #8
  11125.    sta syswork+6
  11126.    bcc +
  11127.    inc syswork+7
  11128. +  dec syswork+5
  11129.    bne --
  11130.    lda #bkACE
  11131.    sta bkSelect
  11132.    ;** load 80-col if necessary
  11133.    .if computer-64
  11134.    bit syswork+4
  11135.    bpl conChrsetExit
  11136.    lda syswork+0
  11137.    pha
  11138.    lda syswork+1
  11139.    pha
  11140.    jsr vdcLoadCharset
  11141.    pla
  11142.    sta syswork+1
  11143.    pla
  11144.    sta syswork+0
  11145.    .ife
  11146.  
  11147.    conChrsetExit = *
  11148.    ;** set full/rvs flag, exit
  11149.    lda syswork+4
  11150.    and #$c0
  11151.    cmp #$c0
  11152.    bne ++
  11153.    ldx #$00
  11154.    lda syswork+4
  11155.    and #$10
  11156.    beq +
  11157.    ldx #$ff
  11158. +  stx conChsetRvsChars
  11159. +  lda syswork+8
  11160.    and #$7f
  11161.    bit conChsetRvsChars
  11162.    bpl +
  11163.    ora #$10
  11164. +  clc
  11165.    rts
  11166.  
  11167. conChrsetPalette = *  ;( sw+4=flags, .X=startChar, sw+5=len, (sw+6)=dataAddr )
  11168.    ldy #0
  11169.    cpy syswork+5
  11170.    beq conChrsetExit
  11171. -  bit syswork+4
  11172.    bpl +
  11173.    lda (syswork+6),y
  11174.    sta conCharPalette,x
  11175. +  bit syswork+4
  11176.    bvc +
  11177.    lda conCharPalette,x
  11178.    sta (syswork+6),y
  11179. +  inx
  11180.    iny
  11181.    dec syswork+5
  11182.    bne -
  11183.    jmp conChrsetExit
  11184.    
  11185. ;the end + blank line
  11186.  
  11187. acerd.s
  11188. 1665
  11189. ;ACE-128/64 kernel ramdisk driver, started 18-Apr-1994.
  11190.  
  11191. rdDirentLength  = 48
  11192. rdDirentBuf     .buf rdDirentLength
  11193. rdDirentBytes   = aceDirentBytes-aceDirentBuffer+rdDirentBuf
  11194. rdDirentDate    = aceDirentDate-aceDirentBuffer+rdDirentBuf
  11195. rdDirentType    = aceDirentType-aceDirentBuffer+rdDirentBuf
  11196. rdDirentFlags   = aceDirentFlags-aceDirentBuffer+rdDirentBuf
  11197. rdDirentUsage   = aceDirentUsage-aceDirentBuffer+rdDirentBuf
  11198. rdDirentNameLen = aceDirentNameLen-aceDirentBuffer+rdDirentBuf
  11199. rdDirentName    = aceDirentName-aceDirentBuffer+rdDirentBuf
  11200. rdDirentHeadPtr = rdDirentBuf+$24
  11201. rdDirentTailPtr = rdDirentBuf+$28
  11202. rdDirentReserved = rdDirentBuf+$2c
  11203. rdDcbOpenMode   = fcbTable1+0  ;(1)
  11204. rdDcbStatus     = fcbTable1+1  ;(1)
  11205. rdDcbNextDirent = fcbTable1+2  ;(4)
  11206. rdFcbrOpenMode  = fcbTable1+0  ;(1)
  11207. rdFcbrNextBlk   = fcbTable1+1  ;(3)
  11208. rdFcbrFilePtr   = fcbTable1+4  ;(4)
  11209. rdFcbrBlkBytes  = fcbTable1+8  ;(2)
  11210.  
  11211. rdFcbwOpenMode  = fcbTable1+0  ;(1)
  11212. rdFcbwBlkPage   = fcbTable1+1  ;(1)
  11213. rdFcbwRemBytes  = fcbTable1+2  ;(2)
  11214. rdFcbwFilePtr   = fcbTable1+4  ;(4)
  11215. rdFcbwFileSize  = fcbTable1+8  ;(4)
  11216. rdFcbwDirent    = fcbTable1+$c ;(4)
  11217.  
  11218. rdFcbwBuf .buf 18
  11219. rdFcbwBufOpenMode = rdFcbwOpenMode-rdFcbwOpenMode+rdFcbwBuf
  11220. rdFcbwBufBlkPage  = rdFcbwBlkPage-rdFcbwOpenMode+rdFcbwBuf
  11221. rdFcbwBufRemBytes = rdFcbwRemBytes-rdFcbwOpenMode+rdFcbwBuf
  11222. rdFcbwBufFilePtr  = rdFcbwFilePtr-rdFcbwOpenMode+rdFcbwBuf
  11223. rdFcbwBufFileSize = rdFcbwFileSize-rdFcbwOpenMode+rdFcbwBuf
  11224. rdFcbwBufDirent   = rdFcbwDirent-rdFcbwOpenMode+rdFcbwBuf
  11225. rdInitIndex .buf 1
  11226.  
  11227. rdInit = *
  11228.    ldx #0
  11229.    stx rdInitIndex
  11230. -  ldx rdInitIndex
  11231.    lda configBuf+0,x
  11232.    cmp #4
  11233.    bne +
  11234.    jsr rdInitDrive
  11235. +  clc
  11236.    lda rdInitIndex
  11237.    adc #4
  11238.    sta rdInitIndex
  11239.    cmp #$80
  11240.    bcc -
  11241.    rts
  11242.  
  11243. rdMallocFlags .buf 1  ;xx not used yet
  11244.  
  11245. rdVarMalloc = *  ;( .A=pagesRequested ) : .CS=err, [mp]=mem, .A=pagesGotten
  11246.    jsr rdMalloc
  11247.    bcc +
  11248.    lda errno
  11249.    cmp #aceErrInsufficientMemory
  11250.    beq ++
  11251.    sec
  11252. +  rts
  11253. +  lda #1
  11254.    ;xx fall through
  11255.  
  11256. rdMalloc = *  ;( .A=pagesRequired ) : .CS=err, [mp]=mem, .A=pagesGotten
  11257.    pha
  11258.    pha
  11259.    lda #$fd
  11260.    sta allocProcID
  11261.    pla
  11262.    ldx #$00
  11263.    ldy #$ff
  11264.    jsr kernPageAlloc
  11265.    pla
  11266.    rts
  11267.  
  11268. rdFree = *  ;( [mp]=memPtr, .A=pages ) : .CS=err
  11269.    pha
  11270.    lda #$fd
  11271.    sta allocProcID
  11272.    pla
  11273.    jsr kernPageFree
  11274.    rts
  11275.  
  11276. rdInitDrive = *  ;( rdInitIndex )
  11277.    ;** alloc root dirent, root dir contents
  11278.    lda #2
  11279.    jsr rdMalloc
  11280.    bcc +
  11281.    rts
  11282.  
  11283.    ;** init device table entry: root dir, current dir
  11284. +  lda rdInitIndex
  11285.    asl
  11286.    tay
  11287.    lda rdDirentOffsetTab+0
  11288.    sta deviceTable+0,y
  11289.    sta deviceTable+4,y
  11290.    iny
  11291.    ldx #1
  11292. -  lda mp,x
  11293.    sta deviceTable+0,y
  11294.    sta deviceTable+4,y
  11295.    iny
  11296.    inx
  11297.    cpx #4
  11298.    bcc -
  11299.  
  11300.    ;** init root dirent
  11301.    jsr rdInitDirBlockStrbuf
  11302.    ldx #rdDirentLength-1
  11303.    lda #0
  11304. -  sta rdDirentBuf,x
  11305.    dex
  11306.    bpl -
  11307.    lda #1
  11308.    sta rdDirentBytes+1
  11309.    lda #<rdDirentDate
  11310.    ldy #>rdDirentDate
  11311.    jsr internGetDate
  11312.    ldx #3
  11313. -  lda rdRootType,x
  11314.    sta rdDirentType,x
  11315.    dex
  11316.    bpl -
  11317.    lda #%11110100
  11318.    sta rdDirentFlags
  11319.    lda #13
  11320.    sta rdDirentNameLen
  11321.    ldx #16
  11322. -  lda rdRootName,x
  11323.    sta rdDirentName,x
  11324.    dex
  11325.    bpl -
  11326.    lda rdInitIndex
  11327.    lsr
  11328.    lsr
  11329.    clc
  11330.    adc #"@"
  11331.    sta rdDirentName+12
  11332.    lda #%10000000
  11333.    sta rdDirentUsage
  11334.    ldx #3
  11335. -  lda mp,x
  11336.    sta rdDirentHeadPtr,x
  11337.    sta rdDirentTailPtr,x
  11338.    dex
  11339.    bpl -
  11340.    inc rdDirentHeadPtr+1
  11341.    inc rdDirentTailPtr+1
  11342.    ldx #rdDirentLength-1
  11343. -  lda rdDirentBuf,x
  11344.    sta workbuf+$10,x
  11345.    dex
  11346.    bpl -
  11347.    lda #<workbuf
  11348.    ldy #>workbuf
  11349.    sta zp+0
  11350.    sty zp+1
  11351.    lda #<256
  11352.    ldy #>256
  11353.    jsr stash
  11354.  
  11355.    ;** init root dir contents
  11356.    ;** "." entry
  11357.    lda #0
  11358.    sta rdDirentBytes+1
  11359.    lda #%01100100
  11360.    sta rdDirentFlags
  11361.    ldx #3
  11362. -  lda rdDotType,x
  11363.    sta rdDirentType,x
  11364.    dex
  11365.    bpl -
  11366.    lda #1
  11367.    sta rdDirentNameLen
  11368.    ldx #16
  11369.    lda #0
  11370. -  sta rdDirentName,x
  11371.    dex
  11372.    bpl -
  11373.    lda #"."
  11374.    sta rdDirentName+0
  11375.    lda #%11010000
  11376.    sta rdDirentUsage
  11377.    lda #$10
  11378.    sta rdDirentHeadPtr+0
  11379.    dec rdDirentHeadPtr+1
  11380.    ldx #rdDirentLength-1
  11381. -  lda rdDirentBuf,x
  11382.    sta workbuf+$10,x
  11383.    dex
  11384.    bpl -
  11385.    ;** ".." entry
  11386.    lda #2
  11387.    sta rdDirentNameLen
  11388.    lda #"."
  11389.    sta rdDirentName+1
  11390.    ldx #rdDirentLength-1
  11391. -  lda rdDirentBuf,x
  11392.    sta workbuf+$40,x
  11393.    dex
  11394.    bpl -
  11395.    ;** store dir block
  11396.    inc mp+1
  11397.    lda #<256
  11398.    ldy #>256
  11399.    jsr stash
  11400.    rts
  11401.  
  11402. rdRootName = *
  11403.    .asc "ace-ramdisk-a"
  11404.    .byte 0,0,0,0
  11405. rdRootType = *
  11406.    .asc "dir"
  11407.    .byte 0
  11408. rdDotType = *
  11409.    .asc "hln"
  11410.    .byte 0
  11411. rdDirentOffsetTab = *
  11412.    .byte $10,$40,$70,$a0,$d0
  11413.  
  11414. rdInitDirBlockStrbuf = *
  11415.    ldx #0
  11416.    lda #0
  11417. -  sta workbuf,x
  11418.    inx
  11419.    bne -
  11420.    lda #1
  11421.    sta workbuf+$00
  11422.    sta workbuf+$05
  11423.    lda #aceMemNull
  11424.    sta workbuf+$03
  11425.    rts
  11426.  
  11427. rdDcbOffset .buf 1
  11428. rdFcbOffset = rdDcbOffset
  11429. rdDevOffset .buf 1
  11430. rdMpSave .buf 4
  11431. rdZpSave .buf 2
  11432. rdCount .buf 1
  11433. rdRegSave .buf 3
  11434.  
  11435. rdSaveMpZp = *
  11436.    ldx #3
  11437. -  lda mp,x
  11438.    sta rdMpSave,x
  11439.    dex
  11440.    bpl -
  11441.    lda zp+0
  11442.    ldy zp+1
  11443.    sta rdZpSave+0
  11444.    sty rdZpSave+1
  11445.    rts
  11446.  
  11447. rdRestoreMpZp = *
  11448.    ldx #3
  11449. -  lda rdMpSave,x
  11450.    sta mp,x
  11451.    dex
  11452.    bpl -
  11453.    lda rdZpSave+0
  11454.    ldy rdZpSave+1
  11455.    sta zp+0
  11456.    sty zp+1
  11457.    rts
  11458.  
  11459. rdDirOpen = *
  11460. rdOpenPreamble = *
  11461.    lda openDevice
  11462.    asl
  11463.    sta rdDevOffset
  11464.    lda openFcb
  11465.    asl
  11466.    asl
  11467.    asl
  11468.    asl
  11469.    sta rdDcbOffset
  11470.    tax
  11471.    lda #"d"
  11472.    sta rdDcbOpenMode,x
  11473.    inx
  11474.    ldy #15
  11475.    lda #0
  11476. -  sta rdDcbOpenMode,x
  11477.    inx
  11478.    dey
  11479.    bne -
  11480.    ldx rdDcbOffset
  11481.    lda #$00
  11482.    sta rdDcbStatus,x
  11483.    ldy rdDevOffset
  11484.    iny
  11485.    iny
  11486.    iny
  11487.    iny
  11488.    lda #0
  11489.    sta rdCount
  11490.    ldx rdDcbOffset
  11491. -  lda deviceTable,y
  11492.    sta rdDcbNextDirent,x
  11493.    stx rdRegSave+1
  11494.    ldx rdCount
  11495.    sta rdWorkDir,x
  11496.    ldx rdRegSave+1
  11497.    inx
  11498.    iny
  11499.    inc rdCount
  11500.    lda rdCount
  11501.    cmp #4
  11502.    bcc -
  11503.    lda openFcb
  11504.    clc
  11505.    rts
  11506.  
  11507. rdDirClose = *
  11508.    jmp closeFdEntry
  11509.  
  11510. ;*** dirread( .X=dcb, .Y=devCfgOff ) : .Z=eof, aceDirentBuffer=data
  11511.  
  11512. rdDcbNum .buf 1
  11513.  
  11514. rdDirRead = *
  11515.    stx rdDcbNum
  11516.    tya
  11517.    asl
  11518.    sta rdDevOffset
  11519.    lda rdDcbNum
  11520.    asl
  11521.    asl
  11522.    asl
  11523.    asl
  11524.    sta rdDcbOffset
  11525.    jsr rdSaveMpZp
  11526.    ldx rdDcbOffset
  11527.    lda rdDcbOpenMode,x
  11528.    cmp #"d"
  11529.    beq +
  11530.    lda #aceErrFileNotInput
  11531.    jmp rdDirReadError
  11532. +  lda rdDcbStatus,x
  11533.    cmp #$00
  11534.    beq rdDirReadTitle
  11535.    cmp #$01
  11536.    bne +
  11537.    jmp rdDirReadDirent
  11538. +  lda #0
  11539.    sta aceDirentNameLen
  11540.    sta aceDirentName+0
  11541.    clc
  11542.    ;** fall through
  11543. rdDirReadExit = *
  11544.    php
  11545.    jsr rdRestoreMpZp
  11546.    plp
  11547.    rts
  11548. rdDirReadError = *
  11549.    sta errno
  11550.    sec
  11551.    lda #0
  11552.    jmp rdDirReadExit
  11553.  
  11554. rdDirReadTitle = *
  11555.    ldx rdDcbOffset
  11556.    lda #$01
  11557.    sta rdDcbStatus,x
  11558.    ldy #0
  11559. -  lda rdDcbNextDirent,x
  11560.    sta mp,y
  11561.    inx
  11562.    iny
  11563.    cpy #4
  11564.    bcc -
  11565.    lda #<rdDirentBuf
  11566.    ldy #>rdDirentBuf
  11567.    sta zp+0
  11568.    sty zp+1
  11569.    lda #rdDirentLength
  11570.    ldy #0
  11571.    jsr fetch
  11572.    ldx #aceDirentLength-1
  11573. -  lda rdDirentBuf,x
  11574.    sta aceDirentBuffer,x
  11575.    dex
  11576.    bpl -
  11577.    ldx rdDcbOffset
  11578.    ldy #0
  11579. -  lda rdDirentHeadPtr,y
  11580.    sta rdDcbNextDirent,x
  11581.    inx
  11582.    iny
  11583.    cpy #4
  11584.    bcc -
  11585.    ldx rdDcbOffset
  11586.    lda #$10
  11587.    sta rdDcbNextDirent+0,x
  11588.    lda #$ff
  11589.    clc
  11590.    jmp rdDirReadExit
  11591.  
  11592. rdDirReadDirent = *
  11593.    ldx rdDcbOffset
  11594.    ldy #0
  11595. -  lda rdDcbNextDirent,x
  11596.    sta mp,y
  11597.    inx
  11598.    iny
  11599.    cpy #4
  11600.    bcc -
  11601.    lda mp+0
  11602.    cmp #$ff
  11603.    beq rdDirReadNextBlock
  11604.    ldx rdDcbOffset
  11605.    clc
  11606.    adc #rdDirentLength
  11607.    bcc +
  11608.    lda #$ff
  11609. +  sta rdDcbNextDirent+0,x
  11610.    lda #<rdDirentBuf
  11611.    ldy #>rdDirentBuf
  11612.    sta zp+0
  11613.    sty zp+1
  11614.    lda #rdDirentLength
  11615.    ldy #0
  11616.    jsr fetch
  11617.    lda rdDirentUsage
  11618.    bpl rdDirReadDirent
  11619.    ldx #aceDirentLength-1
  11620. -  lda rdDirentBuf,x
  11621.    sta aceDirentBuffer,x
  11622.    dex
  11623.    bpl -
  11624.    lda #$ff
  11625.    clc
  11626.    jmp rdDirReadExit
  11627.  
  11628. rdBlockHead .buf 6
  11629. rdBhPages   = rdBlockHead+0
  11630. rdBhNextPg  = rdBlockHead+1
  11631. rdBhBytes   = rdBlockHead+4
  11632.  
  11633.    rdDirReadNextBlock = *
  11634.    lda #$00
  11635.    sta mp+0
  11636.    lda #<rdBlockHead
  11637.    ldy #>rdBlockHead
  11638.    sta zp+0
  11639.    sty zp+1
  11640.    lda #6
  11641.    ldy #0
  11642.    jsr fetch
  11643.    lda rdBhNextPg+2
  11644.    cmp #aceMemNull
  11645.    beq rdDirReadFree
  11646.    ldx rdDcbOffset
  11647.    lda #$10
  11648.    sta rdDcbNextDirent+0,x
  11649.    inx
  11650.    ldy #0
  11651. -  lda rdBhNextPg,y
  11652.    sta rdDcbNextDirent,x
  11653.    inx
  11654.    iny
  11655.    cpy #3
  11656.    bcc -
  11657.    jmp rdDirReadDirent
  11658.  
  11659. rdDirReadFree = *
  11660.    ldx rdDcbOffset
  11661.    lda #$ff
  11662.    sta rdDcbStatus,x
  11663.    lda #0
  11664.    ldx #aceDirentLength-1
  11665. -  sta aceDirentBuffer,x
  11666.    dex
  11667.    bpl -
  11668.    ldx #3
  11669. -  lda aceFreeMemory,x
  11670.    sta aceDirentBytes,x
  11671.    dex
  11672.    bpl -
  11673.    lda #%01000100
  11674.    sta aceDirentFlags
  11675.    lda #%00000000
  11676.    sta aceDirentUsage
  11677.    jsr rdRestoreMpZp
  11678.    lda #$ff
  11679.    clc
  11680.    rts
  11681.  
  11682. rdChDir = *
  11683.    lda #0
  11684.    sta stringBuffer+2
  11685.    jmp chdirSetName
  11686.  
  11687. rdFileType .buf 1
  11688.  
  11689. rdOpen = *
  11690.    jsr rdOpenPreamble
  11691.    jsr rdSaveMpZp
  11692.    ldy openNameScan
  11693.    ldx #0
  11694. -  lda (zp),y
  11695.    sta stringBuffer,x
  11696.    beq +
  11697.    inx
  11698.    iny
  11699.    bne -
  11700. +  lda #"s"
  11701.    sta rdFileType
  11702.    lda stringBuffer-2,x
  11703.    cmp #","
  11704.    bne +
  11705.    lda stringBuffer-1,x
  11706.    sta rdFileType
  11707.    lda #0
  11708.    sta stringBuffer-2,x
  11709. +  ldx rdFcbOffset
  11710.    lda openMode
  11711.    sta rdFcbrOpenMode,x
  11712.    cmp #"r"
  11713.    beq +
  11714.    jmp rdOpenWrite
  11715.  
  11716.    ;** open for read
  11717. +  jsr rdScanDir
  11718.    bcc +
  11719.    lda errno
  11720.    jmp rdOpenError
  11721. +  ldx rdFcbOffset
  11722.    lda #0
  11723.    sta rdFcbrBlkBytes+0,x
  11724.    sta rdFcbrBlkBytes+1,x
  11725.    ldy #0
  11726. -  lda rdDirentHeadPtr+1,y
  11727.    sta rdFcbrNextBlk,x
  11728.    inx
  11729.    iny
  11730.    cpy #3
  11731.    bcc -
  11732.    jsr rdRestoreMpZp
  11733.    lda openFcb
  11734.    clc
  11735.    rts
  11736.  
  11737.    rdOpenWrite = *
  11738.    cmp #"w"
  11739.    beq +
  11740.    jmp rdOpenAppend
  11741. +  jsr rdScanDir
  11742.    bcs +
  11743.    lda #aceErrFileExists
  11744.    rdOpenError = *
  11745.    pha
  11746.    jsr rdRestoreMpZp
  11747.    pla
  11748.    sta errno
  11749.    ldx openFcb
  11750.    lda #lfnull
  11751.    sta lftable,x
  11752.    sec
  11753.    lda #fcbNull
  11754.    rts
  11755. +  lda rdFreeDirent+3
  11756.    cmp #aceMemNull
  11757.    bne +
  11758.    jsr rdAddDirBlock
  11759.    bcc +
  11760.    lda #aceErrDiskFull
  11761.    jmp rdOpenError
  11762.    ;** initialize directory entry
  11763. +  ldx #rdDirentLength-1
  11764.    lda #0
  11765. -  sta rdDirentBuf,x
  11766.    dex
  11767.    bpl -
  11768.    lda #$00
  11769.    sta stringBuffer+16
  11770.    ldx #$ff
  11771. -  inx
  11772.    lda stringBuffer,x
  11773.    sta rdDirentName,x
  11774.    bne -
  11775.    stx rdDirentNameLen
  11776.    lda #<rdDirentDate
  11777.    ldy #>rdDirentDate
  11778.    jsr internGetDate
  11779.    ldy #0
  11780.    lda rdFileType
  11781.    cmp #"p"
  11782.    bne +
  11783.    ldy #4
  11784. +  ldx #0
  11785. -  lda rdOpenWriteTypes,y
  11786.    sta rdDirentType,x
  11787.    iny
  11788.    inx
  11789.    cpx #4
  11790.    bcc -
  11791.    lda #%01101100
  11792.    sta rdDirentFlags
  11793.    lda #%10000000
  11794.    sta rdDirentUsage
  11795.    ldx #3
  11796. -  lda #aceMemNull
  11797.    sta rdDirentHeadPtr,x
  11798.    sta rdDirentTailPtr,x
  11799.    dex
  11800.    bpl -
  11801.    ;** initialize fcb buffer
  11802.    ldx #15
  11803.    lda #$00  ;xx assume null=$00
  11804. -  sta rdFcbwBufOpenMode,x
  11805.    dex
  11806.    bpl -
  11807.    lda #"w"
  11808.    sta rdFcbwBufOpenMode
  11809.    ldx #3
  11810. -  lda rdFreeDirent,x
  11811.    sta rdFcbwBufDirent,x
  11812.    sta mp,x
  11813.    dex
  11814.    bpl -
  11815.    ;** write directory entry
  11816.    rdOpenWriteFlush = *
  11817.    lda #<rdDirentBuf
  11818.    ldy #>rdDirentBuf
  11819.    sta zp+0
  11820.    sty zp+1
  11821.    lda #rdDirentLength
  11822.    ldy #0
  11823.    jsr stash
  11824.    ;** write fcb entry
  11825.    ldx #0
  11826.    ldy rdFcbOffset
  11827. -  lda rdFcbwBufOpenMode,x
  11828.    sta rdFcbwOpenMode,y
  11829.    iny
  11830.    inx
  11831.    cpx #16
  11832.    bcc -
  11833.    jsr rdRestoreMpZp
  11834.    lda openFcb
  11835.    clc
  11836.    rts
  11837.  
  11838. rdOpenWriteTypes = *
  11839.    .asc "seq"
  11840.    .byte $00
  11841.    .asc "prg"
  11842.    .byte $00
  11843.  
  11844.    rdOpenAppend = *
  11845.    cmp #"a"
  11846.    beq +
  11847.    lda #aceErrInvalidFileMode
  11848.    jmp rdOpenError
  11849. +  jsr rdScanDir
  11850.    bcc +
  11851.    lda errno
  11852.    jmp rdOpenError
  11853. +  lda rdDirentFlags
  11854.    bpl +
  11855.    lda #aceErrOpenDirectory
  11856.    jmp rdOpenError
  11857. +  and #%00100000
  11858.    bne +
  11859.    lda #aceErrPermissionDenied
  11860.    jmp rdOpenError
  11861. +  lda rdDirentFlags
  11862.    ora #%00001000
  11863.    sta rdDirentFlags
  11864.    lda #<rdDirentDate
  11865.    ldy #>rdDirentDate
  11866.    jsr internGetDate
  11867.    lda #"w"
  11868.    sta rdFcbwBufOpenMode
  11869.    ldx #3
  11870. -  lda rdDirentTailPtr,x
  11871.    sta rdFcbwBufFilePtr,x
  11872.    sta mp,x
  11873.    lda rdDirentBytes,x
  11874.    sta rdFcbwBufFileSize,x
  11875.    lda rdDirentPtr,x
  11876.    sta rdFcbwBufDirent,x
  11877.    dex
  11878.    bpl -
  11879.    lda #$06
  11880.    sta rdFcbwBufFilePtr+0
  11881.    lda rdFcbwBufFilePtr+1
  11882.    sta rdFcbwBufBlkPage   ;%%%
  11883.    lda #<rdOpenBlkHdr
  11884.    ldy #>rdOpenBlkHdr
  11885.    sta zp+0
  11886.    sty zp+1
  11887.    lda #6
  11888.    ldy #0
  11889.    jsr fetch
  11890.    clc
  11891.    lda rdFcbwBufFilePtr+0
  11892.    adc rdOpenBlkHdr+4
  11893.    sta rdFcbwBufFilePtr+0
  11894.    lda rdFcbwBufFilePtr+1
  11895.    adc rdOpenBlkHdr+5
  11896.    sta rdFcbwBufFilePtr+1
  11897.    sec
  11898.    lda #250
  11899.    sbc rdOpenBlkHdr+4
  11900.    sta rdFcbwBufRemBytes+0
  11901.    ldx rdOpenBlkHdr+0
  11902.    dex
  11903.    txa
  11904.    sbc rdOpenBlkHdr+5
  11905.    sta rdFcbwBufRemBytes+1
  11906.    ldx #3
  11907. -  lda rdDirentPtr,x
  11908.    sta mp,x
  11909.    dex
  11910.    bpl -
  11911.    jmp rdOpenWriteFlush
  11912.  
  11913. rdOpenBlkHdr .buf 6
  11914.  
  11915. rdWorkDir       .buf 4
  11916. rdDirentPtr     .buf 4
  11917. rdFreeDirent    .buf 4
  11918. rdScanDirOffset .buf 1
  11919.  
  11920. rdScanDir = *  ;( stringBuffer=filename, [rdWorkDir] ) : [rdDirentPtr]=dirent
  11921.    ldx #3
  11922. -  lda rdWorkDir,x
  11923.    sta mp,x
  11924.    lda #aceMemNull
  11925.    sta rdFreeDirent,x
  11926.    dex
  11927.    bpl -
  11928.    lda #<rdDirentBuf
  11929.    ldy #>rdDirentBuf
  11930.    sta zp+0
  11931.    sty zp+1
  11932.    lda #rdDirentLength
  11933.    ldy #0
  11934.    jsr fetch
  11935.    ldx #3
  11936. -  lda rdDirentHeadPtr,x
  11937.    sta mp,x
  11938.    dex
  11939.    bpl -
  11940.    lda #<workbuf
  11941.    ldy #>workbuf
  11942.    sta zp+0
  11943.    sty zp+1
  11944.  
  11945.    rdScanDirNextBlock = *
  11946.    lda mp+3
  11947.    cmp #aceMemNull
  11948.    bne +
  11949.    lda #aceErrFileNotFound
  11950.    sta errno
  11951.    sec
  11952.    rts
  11953. +  lda #<256
  11954.    ldy #>256
  11955.    jsr fetch
  11956.    lda #$10
  11957.    sta rdScanDirOffset
  11958.  
  11959.    rdScanDirNextDirent = *
  11960.    ldx rdScanDirOffset
  11961.    lda rdDirentUsage-rdDirentBuf+workbuf,x
  11962.    bmi +
  11963.    lda rdFreeDirent+3
  11964.    cmp #aceMemNull
  11965.    bne rdScanDirContinue
  11966.    ldx #3
  11967. -  lda mp,x
  11968.    sta rdFreeDirent,x
  11969.    dex
  11970.    bpl -
  11971.    lda rdScanDirOffset
  11972.    sta rdFreeDirent+0
  11973.    jmp rdScanDirContinue
  11974. +  ldy #0
  11975. -  lda rdDirentName-rdDirentBuf+workbuf,x
  11976.    cmp stringBuffer,y
  11977.    bne rdScanDirContinue
  11978.    inx
  11979.    iny
  11980.    cmp #0
  11981.    bne -
  11982.    lda rdScanDirOffset
  11983.    sta mp+0
  11984.    ldx #3
  11985. -  lda mp,x
  11986.    sta rdDirentPtr,x
  11987.    dex
  11988.    bpl -
  11989.    ldx rdScanDirOffset
  11990.    ldy #0
  11991. -  lda workbuf,x
  11992.    sta rdDirentBuf,y
  11993.    inx
  11994.    iny
  11995.    cpy #rdDirentLength
  11996.    bcc -
  11997.    clc
  11998.    rts
  11999.  
  12000.    rdScanDirContinue = *
  12001.    clc
  12002.    lda rdScanDirOffset
  12003.    adc #rdDirentLength
  12004.    sta rdScanDirOffset
  12005.    bcc rdScanDirNextDirent
  12006.    ldx #3
  12007. -  lda workbuf,x
  12008.    sta mp,x
  12009.    dex
  12010.    bpl -
  12011.    lda #$00
  12012.    sta mp+0
  12013.    jmp rdScanDirNextBlock
  12014.  
  12015. rdAddDirBlock = *  ;( [rdWorkDir] ) : [rdFreeDirent], .CS=err
  12016.    ;** alloc new block
  12017.    lda #$00 ;xx
  12018.    sta rdMallocFlags
  12019.    lda #1
  12020.    jsr rdMalloc
  12021.    bcc +
  12022.    lda #aceErrDiskFull
  12023.    sta errno
  12024.    sec
  12025.    rts
  12026.    ;** init new block
  12027. +  jsr rdInitDirBlockStrbuf
  12028.    lda #<workbuf
  12029.    ldy #>workbuf
  12030.    sta zp+0
  12031.    sty zp+1
  12032.    lda #<256
  12033.    ldy #>256
  12034.    jsr stash
  12035.    ldx #3
  12036. -  lda mp,x
  12037.    sta rdFreeDirent,x
  12038.    dex
  12039.    bpl -
  12040.  
  12041.    ;** modify working directory dirent
  12042.    ldx #3
  12043. -  lda rdWorkDir,x
  12044.    sta mp,x
  12045.    dex
  12046.    bpl -
  12047.    lda #<rdDirentBuf
  12048.    ldy #>rdDirentBuf
  12049.    sta zp+0
  12050.    sty zp+1
  12051.    lda #rdDirentLength
  12052.    ldy #0
  12053.    jsr fetch
  12054.    ldx #3
  12055. -  lda rdDirentTailPtr,x
  12056.    sta rdPrevBlkPtr,x
  12057.    lda rdFreeDirent,x
  12058.    sta rdDirentTailPtr,x
  12059.    dex
  12060.    bpl -
  12061.    lda #rdDirentLength
  12062.    ldy #0
  12063.    jsr stash
  12064.    ;** link previous dir block
  12065.    ldx #3
  12066. -  lda rdPrevBlkPtr,x
  12067.    sta mp,x
  12068.    dex
  12069.    bpl -
  12070.    lda #$01
  12071.    sta mp+0
  12072.    lda #<rdDirentTailPtr+1
  12073.    ldy #>rdDirentTailPtr+1
  12074.    sta zp+0
  12075.    sty zp+1
  12076.    lda #3
  12077.    ldy #0
  12078.    jsr stash
  12079.    ;** clean up
  12080.    lda #$10
  12081.    sta rdFreeDirent+0
  12082.    clc
  12083.    rts
  12084.  
  12085. rdPrevBlkPtr .buf 4
  12086.  
  12087. rdReadChunk = syswork+8
  12088. rdFcbrBuf .buf 12
  12089. rdFcbrBufOpenMode = rdFcbrOpenMode-rdFcbrOpenMode+rdFcbrBuf
  12090. rdFcbrBufNextBlk  = rdFcbrNextBlk-rdFcbrOpenMode+rdFcbrBuf
  12091. rdFcbrBufFilePtr  = rdFcbrFilePtr-rdFcbrOpenMode+rdFcbrBuf
  12092. rdFcbrBufBlkBytes = rdFcbrBlkBytes-rdFcbrOpenMode+rdFcbrBuf
  12093.  
  12094. rdRead = *  ;( ) :.AY=(zw)=len,.Z=eof
  12095.    lda readFcb
  12096.    asl
  12097.    asl
  12098.    asl
  12099.    asl
  12100.    sta rdFcbOffset
  12101.    jsr rdSaveMpZp
  12102.    ldx rdFcbOffset
  12103.    ldy #0
  12104. -  lda rdFcbrOpenMode,x
  12105.    sta rdFcbrBuf,y
  12106.    inx
  12107.    iny
  12108.    cpy #10
  12109.    bcc -
  12110.    lda rdFcbrBufOpenMode
  12111.    cmp #"r"
  12112.    beq rdReadMore
  12113.    lda #aceErrFileNotInput
  12114.  
  12115.    rdReadError = *
  12116.    sta errno
  12117.    lda #0
  12118.    ldy #0
  12119.    sec
  12120.    rdReadExit = *
  12121.    php
  12122.    sta zw+0
  12123.    sty zw+1
  12124.    ldy #0
  12125.    ldx rdFcbOffset
  12126. -  lda rdFcbrBuf,y
  12127.    sta rdFcbrOpenMode,x
  12128.    inx
  12129.    iny
  12130.    cpy #10
  12131.    bcc -
  12132.    jsr rdRestoreMpZp
  12133.    lda zw+0
  12134.    ldy zw+1
  12135.    plp
  12136.    rts
  12137.  
  12138.    rdReadMore = *
  12139.    lda readMaxLen+0
  12140.    ora readMaxLen+1
  12141.    bne +
  12142. -  lda readLength+0
  12143.    ora readLength+1
  12144.    php
  12145.    lda readLength+0
  12146.    ldy readLength+1
  12147.    plp
  12148.    clc
  12149.    jmp rdReadExit
  12150. +  lda rdFcbrBufBlkBytes+0
  12151.    ldy rdFcbrBufBlkBytes+1
  12152.    sta rdReadChunk+0
  12153.    sty rdReadChunk+1
  12154.    ora rdReadChunk+1
  12155.    bne +
  12156.    lda #$06
  12157.    sta rdFcbrBufFilePtr+0
  12158.    lda #$00
  12159.    sta mp+0
  12160.    ldx #2
  12161. -  lda rdFcbrBufNextBlk,x
  12162.    sta rdFcbrBufFilePtr+1,x
  12163.    sta mp+1,x
  12164.    dex
  12165.    bpl -
  12166.    lda mp+3
  12167.    cmp #aceMemNull
  12168.    beq --
  12169.    lda #<workbuf
  12170.    ldy #>workbuf
  12171.    sta zp+0
  12172.    sty zp+1
  12173.    lda #6
  12174.    ldy #0
  12175.    jsr fetch
  12176.    lda workbuf+$04
  12177.    ldy workbuf+$05
  12178.    sta rdFcbrBufBlkBytes+0
  12179.    sty rdFcbrBufBlkBytes+1
  12180.    ldx #2
  12181. -  lda workbuf+$01,x
  12182.    sta rdFcbrBufNextBlk,x
  12183.    dex
  12184.    bpl -
  12185.    jmp rdReadMore
  12186.  
  12187. +  lda rdReadChunk+0
  12188.    cmp readMaxLen+0
  12189.    lda rdReadChunk+1
  12190.    sbc readMaxLen+1
  12191.    bcc +
  12192.    lda readMaxLen+0
  12193.    ldy readMaxLen+1
  12194.    sta rdReadChunk+0
  12195.    sty rdReadChunk+1
  12196. +  ldx #3
  12197. -  lda rdFcbrBufFilePtr,x
  12198.    sta mp,x
  12199.    dex
  12200.    bpl -
  12201.    lda readPtr+0
  12202.    ldy readPtr+1
  12203.    sta zp+0
  12204.    sty zp+1
  12205.    lda rdReadChunk+0
  12206.    ldy rdReadChunk+1
  12207.    jsr fetch
  12208.  
  12209.    clc
  12210.    lda readPtr+0
  12211.    adc rdReadChunk+0
  12212.    sta readPtr+0
  12213.    lda readPtr+1
  12214.    adc rdReadChunk+1
  12215.    sta readPtr+1
  12216.    clc
  12217.    lda readLength+0
  12218.    adc rdReadChunk+0
  12219.    sta readLength+0
  12220.    lda readLength+1
  12221.    adc rdReadChunk+1
  12222.    sta readLength+1
  12223.    clc
  12224.    lda rdFcbrBufFilePtr+0
  12225.    adc rdReadChunk+0
  12226.    sta rdFcbrBufFilePtr+0
  12227.    lda rdFcbrBufFilePtr+1
  12228.    adc rdReadChunk+1
  12229.    sta rdFcbrBufFilePtr+1
  12230.    sec
  12231.    lda readMaxLen+0
  12232.    sbc rdReadChunk+0
  12233.    sta readMaxLen+0
  12234.    lda readMaxLen+1
  12235.    sbc rdReadChunk+1
  12236.    sta readMaxLen+1
  12237.    sec
  12238.    lda rdFcbrBufBlkBytes+0
  12239.    sbc rdReadChunk+0
  12240.    sta rdFcbrBufBlkBytes+0
  12241.    lda rdFcbrBufBlkBytes+1
  12242.    sbc rdReadChunk+1
  12243.    sta rdFcbrBufBlkBytes+1
  12244.    jmp rdReadMore
  12245.  
  12246. rdCfgOffset .buf 1
  12247. rdWriteChunk = syswork+4
  12248.  
  12249. rdWrite = *  ;( writeLength, writePtr ) : (zp)=dataStart
  12250.    stx rdCfgOffset
  12251.    lda configBuf+$03,x
  12252.    sta rdMallocFlags
  12253.    lda regsave+1  ;fd
  12254.    asl
  12255.    asl
  12256.    asl
  12257.    asl
  12258.    sta rdFcbOffset
  12259.    jsr rdSaveMpZp
  12260.    ldx rdFcbOffset
  12261.    ldy #0
  12262. -  lda rdFcbwOpenMode,x
  12263.    sta rdFcbwBuf,y
  12264.    inx
  12265.    iny
  12266.    cpy #16
  12267.    bcc -
  12268.    lda rdFcbwBufOpenMode
  12269.    cmp #"w"
  12270.    beq rdWriteMore
  12271.    lda #aceErrFileNotOutput
  12272.  
  12273.    rdWriteError = *
  12274.    sta errno
  12275.    lda #0
  12276.    ldy #0
  12277.    sec
  12278.    rdWriteExit = *
  12279.    php
  12280.    ldy #0
  12281.    ldx rdFcbOffset
  12282. -  lda rdFcbwBuf,y
  12283.    sta rdFcbwOpenMode,x
  12284.    inx
  12285.    iny
  12286.    cpy #16
  12287.    bcc -
  12288.    jsr rdRestoreMpZp
  12289.    plp
  12290.    rts
  12291.  
  12292.    rdWriteMore = *
  12293.    lda writeLength+0
  12294.    ora writeLength+1
  12295.    bne +
  12296.    clc
  12297.    jmp rdWriteExit
  12298.    ;** get new block if old one full
  12299. +  lda rdFcbwBufRemBytes+0
  12300.    ora rdFcbwBufRemBytes+1
  12301.    beq +
  12302.    jmp rdWriteCopy
  12303.    ;** get new block
  12304. +  ldx writeLength+1
  12305.    lda writeLength+0
  12306.    beq +
  12307.    inx
  12308. +  txa
  12309.    jsr rdVarMalloc
  12310.    bcc +
  12311.    lda #aceErrDiskFull
  12312.    jmp rdWriteError
  12313. +  tax
  12314.    lda #0
  12315.    sec
  12316.    sbc #6
  12317.    sta rdFcbwBufRemBytes+0
  12318.    txa
  12319.    sbc #0
  12320.    sta rdFcbwBufRemBytes+1
  12321.    ;** initialize new block
  12322.    stx rdNewBlkData+0
  12323.    lda #<rdNewBlkData
  12324.    ldy #>rdNewBlkData
  12325.    sta zp+0
  12326.    sty zp+1
  12327.    lda #6
  12328.    ldy #0
  12329.    jsr stash  ;necessary?
  12330.    ;** link in block, init fcb
  12331.    sec
  12332.    lda rdFcbwBufFilePtr+1
  12333.    sbc rdFcbwBufBlkPage
  12334.    sec
  12335.    sbc #1
  12336.    sta rdOldBlkData+5
  12337.    lda #250
  12338.    sta rdOldBlkData+4
  12339.    ldx #3
  12340. -  lda mp,x
  12341.    ldy rdFcbwBufFilePtr,x
  12342.    sta rdFcbwBufFilePtr,x
  12343.    sta rdOldBlkData,x
  12344.    sty mp,x
  12345.    dex
  12346.    bpl -
  12347.    lda rdFcbwBufBlkPage
  12348.    sta mp+1
  12349.    lda #$01
  12350.    sta mp+0
  12351.    lda rdFcbwBufFilePtr+1
  12352.    sta rdFcbwBufBlkPage
  12353.    lda #<rdOldBlkData+1
  12354.    ldy #>rdOldBlkData+1
  12355.    sta zp+0
  12356.    sty zp+1
  12357.    lda #5
  12358.    ldx mp+3
  12359.    cpx #aceMemNull
  12360.    bne +
  12361.    ldx #3
  12362. -  lda rdFcbwBufDirent,x
  12363.    sta mp,x
  12364.    dex
  12365.    bpl -
  12366.    clc
  12367.    lda mp+0
  12368.    adc #rdDirentHeadPtr-rdDirentBuf+1
  12369.    sta mp+0
  12370.    lda #3
  12371. +  ldy #0
  12372.    jsr stash
  12373.    lda #$06
  12374.    sta rdFcbwBufFilePtr+0
  12375.  
  12376.    ;** copy data into block
  12377.    rdWriteCopy = *
  12378.    ldx writeLength+0
  12379.    ldy writeLength+1
  12380.    cpx rdFcbwBufRemBytes+0
  12381.    tya
  12382.    sbc rdFcbwBufRemBytes+1
  12383.    bcc +
  12384.    ldx rdFcbwBufRemBytes+0
  12385.    ldy rdFcbwBufRemBytes+1
  12386. +  stx rdWriteChunk+0
  12387.    sty rdWriteChunk+1
  12388.    ldx #3
  12389. -  lda rdFcbwBufFilePtr,x
  12390.    sta mp,x
  12391.    dex
  12392.    bpl -
  12393.    lda writePtr+0
  12394.    ldy writePtr+1
  12395.    sta zp+0
  12396.    sty zp+1
  12397.    lda rdWriteChunk+0
  12398.    ldy rdWriteChunk+1
  12399.    jsr stash
  12400.  
  12401.    ;** update control variables
  12402.    clc
  12403.    lda rdFcbwBufFilePtr+0
  12404.    adc rdWriteChunk+0
  12405.    sta rdFcbwBufFilePtr+0
  12406.    lda rdFcbwBufFilePtr+1
  12407.    adc rdWriteChunk+1
  12408.    sta rdFcbwBufFilePtr+1
  12409.    sec
  12410.    lda rdFcbwBufRemBytes+0
  12411.    sbc rdWriteChunk+0
  12412.    sta rdFcbwBufRemBytes+0
  12413.    lda rdFcbwBufRemBytes+1
  12414.    sbc rdWriteChunk+1
  12415.    sta rdFcbwBufRemBytes+1
  12416.    clc
  12417.    lda writePtr+0
  12418.    adc rdWriteChunk+0
  12419.    sta writePtr+0
  12420.    lda writePtr+1
  12421.    adc rdWriteChunk+1
  12422.    sta writePtr+1
  12423.    sec
  12424.    lda writeLength+0
  12425.    sbc rdWriteChunk+0
  12426.    sta writeLength+0
  12427.    lda writeLength+1
  12428.    sbc rdWriteChunk+1
  12429.    sta writeLength+1
  12430.    clc
  12431.    lda rdFcbwBufFileSize+0
  12432.    adc rdWriteChunk+0
  12433.    sta rdFcbwBufFileSize+0
  12434.    lda rdFcbwBufFileSize+1
  12435.    adc rdWriteChunk+1
  12436.    sta rdFcbwBufFileSize+1
  12437.    bcc +
  12438.    inc rdFcbwBufFileSize+2
  12439.    bne +
  12440.    inc rdFcbwBufFileSize+3
  12441. +  jmp rdWriteMore
  12442.  
  12443. rdNewBlkData = * ;gets modified
  12444.    .byte $00
  12445.    .byte aceMemNull,aceMemNull,aceMemNull
  12446.    .byte $00,$00
  12447. rdOldBlkData = * ;gets modified
  12448.    .byte $00
  12449.    .byte aceMemNull,aceMemNull,aceMemNull
  12450.    .byte 250,$00
  12451.  
  12452. rdClose = *  ;( closeFd )
  12453.    lda closeFd
  12454.    asl
  12455.    asl
  12456.    asl
  12457.    asl
  12458.    sta rdFcbOffset
  12459.    tax
  12460.    lda rdFcbrOpenMode,x
  12461.    cmp #"w"
  12462.    beq +
  12463.    rts
  12464. +  ldy #0
  12465. -  lda rdFcbwOpenMode,x
  12466.    sta rdFcbwBuf,y
  12467.    inx
  12468.    iny
  12469.    cpy #16
  12470.    bcc -
  12471.    jsr rdSaveMpZp
  12472.    ;** tidy up last block control info
  12473.    ldx #3
  12474. -  lda rdFcbwBufFilePtr,x
  12475.    sta mp,x
  12476.    dex
  12477.    bpl -
  12478.    lda rdFcbwBufBlkPage
  12479.    sta mp+1
  12480.    lda #$01
  12481.    sta mp+0
  12482.    sec
  12483.    lda rdFcbwBufFilePtr+0
  12484.    sbc #$06
  12485.    sta rdOldBlkData+4
  12486.    lda rdFcbwBufFilePtr+1
  12487.    sbc rdFcbwBufBlkPage
  12488.    sta rdOldBlkData+5
  12489.    lda #aceMemNull
  12490.    sta rdOldBlkData+1
  12491.    sta rdOldBlkData+2
  12492.    sta rdOldBlkData+3
  12493.    lda #<rdOldBlkData+1
  12494.    ldy #>rdOldBlkData+1
  12495.    sta zp+0
  12496.    sty zp+1
  12497.    lda #5
  12498.    ldy #0
  12499.    jsr stash
  12500.    ;** tidy up directory entry
  12501.    ldx #3
  12502. -  lda mp,x
  12503.    sta rdFcbwBufFilePtr,x
  12504.    lda rdFcbwBufDirent,x
  12505.    sta mp,x
  12506.    dex
  12507.    bpl -
  12508.    lda #$00
  12509.    sta rdFcbwBufFilePtr+0
  12510.    lda #<rdDirentBuf
  12511.    ldy #>rdDirentBuf
  12512.    sta zp+0
  12513.    sty zp+1
  12514.    lda #rdDirentLength
  12515.    ldy #0
  12516.    jsr fetch
  12517.    lda rdDirentFlags
  12518.    and #%11110111
  12519.    sta rdDirentFlags
  12520.    ldx #3
  12521. -  lda rdFcbwBufFilePtr,x
  12522.    sta rdDirentTailPtr,x
  12523.    lda rdFcbwBufFileSize,x
  12524.    sta rdDirentBytes,x
  12525.    dex
  12526.    bpl -
  12527.    lda #rdDirentLength
  12528.    ldy #0
  12529.    jsr stash
  12530.    jsr rdRestoreMpZp
  12531.    rts
  12532.  
  12533. rdBloadAddr  .buf 2
  12534. rdBloadTop   .buf 2
  12535. rdBloadLen   .buf 2
  12536. rdBloadFd    .buf 1
  12537. rdBloadBytes .buf 2
  12538. rdBloadName  .buf 2
  12539. rdBloadEnd   .buf 2
  12540.  
  12541. rdBload = *
  12542.    ;** binary-load a file
  12543.    ;** this routine is fairly high-level and calls the regular file system
  12544.    ;** calls; make sure one fcb is free
  12545.    ldx #1
  12546. -  lda bloadAddress,x
  12547.    sta rdBloadAddr,x
  12548.    lda zp,x
  12549.    sta rdBloadName,x
  12550.    dex
  12551.    bpl -
  12552.    sec
  12553.    lda zw+0
  12554.    sta rdBloadTop+0
  12555.    sbc bloadAddress+0
  12556.    sta rdBloadLen+0
  12557.    lda zw+1
  12558.    sta rdBloadTop+1
  12559.    sbc bloadAddress+1
  12560.    sta rdBloadLen+1
  12561.    ;** (zp) already contains filename
  12562.    lda #"r"
  12563.    jsr open
  12564.    sta rdBloadFd
  12565.    bcc +
  12566.    rts
  12567. +  lda #<rdBloadBytes
  12568.    ldy #>rdBloadBytes
  12569.    sta zp+0
  12570.    sty zp+1
  12571.    lda #2
  12572.    ldy #0
  12573.    ldx rdBloadFd
  12574.    jsr read
  12575.    bcs rdBloadErrClose
  12576.    lda rdBloadAddr+0
  12577.    ldy rdBloadAddr+1
  12578.    sta zp+0
  12579.    sty zp+1
  12580.    lda rdBloadLen+0
  12581.    ldy rdBloadLen+1
  12582.    ldx rdBloadFd
  12583.    jsr read
  12584.    bcc +
  12585.    rdBloadErrClose = *
  12586.    lda errno
  12587.    pha
  12588.    lda rdBloadFd
  12589.    jsr close
  12590.    pla
  12591.    sta errno
  12592.    jsr rdBloadCleanup
  12593.    sec
  12594.    rts
  12595.  
  12596. +  clc
  12597.    adc rdBloadAddr+0
  12598.    sta rdBloadEnd+0
  12599.    tya
  12600.    adc rdBloadAddr+1
  12601.    sta rdBloadEnd+1
  12602.    lda #<rdBloadBytes
  12603.    ldy #>rdBloadBytes
  12604.    sta zp+0
  12605.    sty zp+1
  12606.    lda #1
  12607.    ldy #0
  12608.    ldx rdBloadFd
  12609.    jsr read
  12610.    beq +
  12611.  
  12612.    lda #aceErrBloadTruncated
  12613.    sta errno
  12614.    jmp rdBloadErrClose
  12615.  
  12616. +  lda rdBloadFd
  12617.    jsr close
  12618.    rdBloadCleanup = *
  12619.    ldx #1
  12620. -  lda rdBloadName,x
  12621.    sta zp,x
  12622.    lda rdBloadTop,x
  12623.    sta zw,x
  12624.    dex
  12625.    bpl -
  12626.    lda rdBloadEnd+0
  12627.    ldy rdBloadEnd+1
  12628.    clc
  12629.    rts
  12630.  
  12631. rdExtractFiletype = *  ;( stringBuffer, .X=strlen ) : .A=filetype, strBuf
  12632.    lda #"s"
  12633.    cpx #2
  12634.    bcs +
  12635. -  lda #"s"
  12636.    sec
  12637.    rts
  12638. +  lda stringBuffer-2,x
  12639.    cmp #","
  12640.    bne -
  12641.    lda #0
  12642.    sta stringBuffer-2,x
  12643.    lda stringBuffer-1,x
  12644.    clc
  12645.    rts
  12646.  
  12647. rdRemoveDevice .buf 1
  12648. rdRemoveBlkHdr .buf 7
  12649. rdummy .buf 1
  12650.  
  12651. rdRemove = *  ;( .A=device, .Y=scanPos ) : .CC=ok
  12652.    sta rdRemoveDevice
  12653.    ;** fetch filename string for dir-scan
  12654.    ldx #0
  12655. -  lda (zp),y
  12656.    sta stringBuffer,x
  12657.    beq +
  12658.    inx
  12659.    iny
  12660.    bne -
  12661. +  jsr rdExtractFiletype
  12662.    jsr rdSaveMpZp
  12663.    ;** get working directory for dir-scan
  12664.    lda rdRemoveDevice
  12665.    asl
  12666.    tay
  12667.    iny
  12668.    iny
  12669.    iny
  12670.    iny
  12671.    ldx #0
  12672. -  lda deviceTable,y
  12673.    sta rdWorkDir,x
  12674.    iny
  12675.    inx
  12676.    cpx #4
  12677.    bcc -
  12678.    ;** scan directory, get file entry
  12679.    jsr rdScanDir
  12680.    bcc +
  12681.    jsr rdRestoreMpZp
  12682.    sec
  12683.    rts
  12684.    ;** remove all blocks of file
  12685. +  ldx #3
  12686. -  lda rdDirentHeadPtr,x
  12687.    sta mp,x
  12688.    dex
  12689.    bpl -
  12690.    rdRemoveNextBlock = *
  12691.    lda mp+3
  12692.    cmp #aceMemNull
  12693.    beq rdRemoveDirent
  12694.    ;*** fetch block header
  12695.    lda #<rdRemoveBlkHdr
  12696.    ldy #>rdRemoveBlkHdr
  12697.    sta zp+0
  12698.    sty zp+1
  12699.    lda #6
  12700.    ldy #0
  12701.    jsr fetch
  12702.    ;*** free block
  12703.    lda rdRemoveBlkHdr+0
  12704.    jsr rdFree
  12705.    ;*** go to next block
  12706.    ldx #2
  12707. -  lda rdRemoveBlkHdr+1,x
  12708.    sta mp+1,x
  12709.    dex
  12710.    bpl -
  12711.    lda #0
  12712.    sta mp+0
  12713.    jmp rdRemoveNextBlock
  12714.    
  12715.    ;** mark directory entry deleted
  12716.    rdRemoveDirent = *
  12717.    lda rdDirentUsage
  12718.    and #%01111111
  12719.    sta rdDirentUsage
  12720.    ;** write out updated directory entry
  12721.    ldx #3
  12722. -  lda rdDirentPtr,x
  12723.    sta mp,x
  12724.    dex
  12725.    bpl -
  12726.    lda #<rdDirentBuf
  12727.    ldy #>rdDirentBuf
  12728.    sta zp+0
  12729.    sty zp+1
  12730.    lda #rdDirentLength
  12731.    ldy #0
  12732.    jsr stash
  12733.    ;** tidy up and exit
  12734.    jsr rdRestoreMpZp
  12735.    clc
  12736.    rts
  12737.  
  12738. rdRenameDevice .buf 1
  12739. rdRenameScan   .buf 1
  12740. rdRenameType   .buf 1
  12741. rdRenameNewName .buf 17
  12742.  
  12743. rdRename = *  ;( .A=device, .Y=scanPos ) : .CC=ok
  12744.    sta rdRenameDevice
  12745.    sty rdRenameScan
  12746.    ;** scan for new name (should not exist)
  12747.    ldy #0
  12748.    ldx #0
  12749. -  lda (zw),y
  12750.    sta stringBuffer,x
  12751.    beq +
  12752.    inx
  12753.    iny
  12754.    bne -
  12755. +  jsr rdExtractFiletype
  12756.    bcc +
  12757.    lda #0
  12758. +  sta rdRenameType
  12759.    lda #0
  12760.    sta stringBuffer+16
  12761.    ldx #16
  12762. -  lda stringBuffer,x
  12763.    sta rdRenameNewName,x
  12764.    dex
  12765.    bpl -
  12766.    jsr rdSaveMpZp
  12767.    ;** get working directory for new-name-dir-scan
  12768.    lda rdRenameDevice
  12769.    asl
  12770.    tay
  12771.    iny
  12772.    iny
  12773.    iny
  12774.    iny
  12775.    ldx #0
  12776. -  lda deviceTable,y
  12777.    sta rdWorkDir,x
  12778.    iny
  12779.    inx
  12780.    cpx #4
  12781.    bcc -
  12782.    ;** scan directory, get file entry
  12783.    jsr rdScanDir
  12784.    bcs +
  12785.    jsr rdRestoreMpZp
  12786.    lda #aceErrFileExists
  12787.    sta errno
  12788.    sec
  12789.    rts
  12790.    ;** scan for dirent to modify
  12791. +  lda rdZpSave+0
  12792.    ldy rdZpSave+1
  12793.    sta zp+0
  12794.    sty zp+1
  12795.    ldy rdRenameScan
  12796.    ldx #0
  12797. -  lda (zp),y
  12798.    sta stringBuffer,x
  12799.    beq +
  12800.    inx
  12801.    iny
  12802.    bne -
  12803. +  jsr rdExtractFiletype
  12804.    jsr rdSaveMpZp
  12805.    ;** scan directory, get file entry
  12806.    jsr rdScanDir
  12807.    bcc +
  12808.    jsr rdRestoreMpZp
  12809.    sec
  12810.    rts
  12811. +  ldx #0
  12812. -  lda rdRenameNewName,x
  12813.    sta rdDirentName,x
  12814.    beq +
  12815.    inx
  12816.    bne -
  12817. +  stx rdDirentNameLen
  12818.    ldx #2
  12819. -  lda rdRenameKnownTypes1,x
  12820.    cmp rdRenameType
  12821.    beq +
  12822.    dex
  12823.    bpl -
  12824.    jmp ++
  12825. +  sta rdDirentType+0
  12826.    lda rdRenameKnownTypes2,x
  12827.    sta rdDirentType+1
  12828.    lda rdRenameKnownTypes3,x
  12829.    sta rdDirentType+2
  12830.    ;** write out updated directory entry
  12831. +  ldx #3
  12832. -  lda rdDirentPtr,x
  12833.    sta mp,x
  12834.    dex
  12835.    bpl -
  12836.    lda #<rdDirentBuf
  12837.    ldy #>rdDirentBuf
  12838.    sta zp+0
  12839.    sty zp+1
  12840.    lda #rdDirentLength
  12841.    ldy #0
  12842.    jsr stash
  12843.    ;** tidy up and exit
  12844.    jsr rdRestoreMpZp
  12845.    clc
  12846.    rts
  12847.  
  12848. rdRenameKnownTypes1 .asc "spu"
  12849. rdRenameKnownTypes2 .asc "ers"
  12850. rdRenameKnownTypes3 .asc "qgr"
  12851.  
  12852. ;the end + blank line
  12853.  
  12854. aceswift.s
  12855. 802
  12856. ;ACE-128/64 kernel SwiftLink serial device driver, started 03-Mar-1995.
  12857.  
  12858. ;This device driver uses the SwiftLink RS-232 Serial Cartridge, available from
  12859. ;Creative Micro Designs, Inc.  The device is based on the 6551 ACIA chip.
  12860.  
  12861. ; baud rates:           baud rates:          format:          crystal:
  12862. ; -----------           -----------          -------          ------------
  12863. ; $00=reserved          $08=2400             $00=8N1          $00=2x(norm)
  12864. ; $01=50                $09=4800             $80=7E1          $40=1x
  12865. ; $02=110               $0a=7200
  12866. ; $03=134.5             $0b=9600
  12867. ; $04=300               $0c=19200
  12868. ; $05=600               $0d=38400
  12869. ; $06=1200              $0e=57600
  12870. ; $07=1800              $0f=115200
  12871.  
  12872. ;Note: this device driver is organized so that it will not "touch" the SL
  12873. ;registers until the first Open call is executed.  This is to prevent bad
  12874. ;things from happening if the cartridge is "not present" when ACE
  12875. ;initializes.  Then, the device will be active until ACE shuts down,
  12876. ;regardless of Open and Close calls.
  12877.  
  12878. ;Note also: this device driver is rather complicated because of all kinds of
  12879. ;race conditions and funky hardware mis-features.  Interrupts are used for
  12880. ;receive interrupts, with a user-defined maximum buffer size, and there are
  12881. ;no transmit interrups, as data transmission is done with polling.  The
  12882. ;device driver also implements hardware flow control.  Since the 6551 requires
  12883. ;that the transmitter be disabled in order to drop the RTS signal (ready to
  12884. ;accept data from modem), data to be transmitted when the transmitter is off
  12885. ;is buffered until flow can be restore.  The transmit buffer has a maximum
  12886. ;capacity of 255 bytes, and if this is exceeded, transmit bytes are
  12887. ;unceremoneously dropped on the floor.
  12888.  
  12889. ;;slData       = $de00  ;fixed for now
  12890. ;;slStatus     = $de01
  12891. ;;slCommand    = $de02
  12892. ;;slControl    = $de03
  12893. slDataOff    = 0
  12894. slStatusOff  = 1
  12895. slCommandOff = 2
  12896. slControlOff = 3
  12897. slReady            .buf 1  ;$00=not initialized, $ff=ready
  12898. slOpened           .buf 1
  12899. slRecvFlowStopped  .buf 1  ;$00=normal, $ff=RTS flow signal asserted (no Tx)
  12900. slSendHead         .buf 1
  12901. slSendTail         .buf 1
  12902. slSendCount        .buf 1
  12903. slRecvFullCount    .buf 1
  12904. slOverrunBytes     .buf 4
  12905. slBufOverflowBytes .buf 4
  12906. slSentBytes        .buf 4
  12907. slReceivedBytes    .buf 4
  12908. slLeanFlag         .buf 1  ;flag: use lean or regular interrupt handler
  12909.  
  12910. ;;The following variables are imported from the rest of the kernel
  12911. ;;aceModemSendPage  = aceStatB+105 ;(1)   ;page of send buffer
  12912. ;;aceModemRecvPage  = aceStatB+106 ;(1)   ;start page of recevie buffer
  12913. ;;aceModemRecvHigh  = aceStatB+107 ;(1)   ;high page + 1
  12914. ;;aceModemType      = aceStatB+108 ;(1)   ;$ff=swifty,$40=user-port,$00=none
  12915. ;;aceModemIoPage    = aceStatB+109 ;(1)   ;page for SwiftLink registers
  12916. ;;aceModemConfig    = aceStatB+116 ;(1)   ;$0x=baudrate, $80=0:8N1/1:7E1,
  12917.                                           ;$40=0:doubleCrystal/1:singleCrystal
  12918. .if computer-64
  12919.    slSendPage  = $c8
  12920.    slRecvHead  = $ca
  12921.    slRecvTail  = $b4
  12922.    slRecvFree  = $ce
  12923.    slIoPage    = $b2
  12924. .else
  12925.    slSendPage  = $a8
  12926.    slRecvHead  = $aa
  12927.    slRecvTail  = $b4
  12928.    slRecvFree  = $ac
  12929.    slIoPage    = $b2
  12930. .ife
  12931.  
  12932. slInit = *
  12933.    lda #$00
  12934.    sta slReady
  12935.    sta slOpened
  12936.    lda aceModemType
  12937.    cmp #$ff
  12938.    bne +
  12939.    lda #$00
  12940.    ldy aceModemSendPage
  12941.    sta slSendPage+0
  12942.    sty slSendPage+1
  12943.    sta slSendHead
  12944.    sta slSendTail
  12945.    sta slSendCount
  12946.    jsr slInitRegularRecv
  12947.    ldx #3
  12948.    lda #0
  12949. -  sta slOverrunBytes,x
  12950.    sta slBufOverflowBytes,x
  12951.    sta slSentBytes,x
  12952.    sta slReceivedBytes,x
  12953.    dex
  12954.    bpl -
  12955.    lda #$00
  12956.    ldy aceModemIoPage
  12957.    sta slIoPage+0
  12958.    sty slIoPage+1
  12959. +  clc
  12960.    rts
  12961.  
  12962. slInitRegularRecv = *
  12963.    lda #$00
  12964.    sta slLeanFlag
  12965.    ldy aceModemRecvPage
  12966.    sta slRecvHead+0
  12967.    sty slRecvHead+1
  12968.    sta slRecvTail+0
  12969.    sty slRecvTail+1
  12970.    sta slRxCriticalSection
  12971.    sta slRecvFree+0
  12972.    sta slRecvFlowStopped
  12973.    sec
  12974.    lda aceModemRecvHigh
  12975.    sbc aceModemRecvPage
  12976.    sta slRecvFullCount
  12977.    sta slRecvFree+1
  12978.    lda #<nmiHandler   ;bit of a hack
  12979.    ldy #>nmiHandler
  12980.    sta $318
  12981.    sty $319
  12982. slInitFlow = *
  12983.    ldy #slCommandOff
  12984.    lda (slIoPage),y
  12985.    and #%11110011
  12986.    ora #%00001000
  12987.    sta (slIoPage),y
  12988.    rts
  12989.  
  12990. slInitLeanRecv = *
  12991.    lda #$ff
  12992.    sta slLeanFlag
  12993.    sta leanFreeCnt
  12994.    lda #$00
  12995.    sta leanHead
  12996.    sta leanTail
  12997.    sta leanStopped
  12998.    lda #%00000001
  12999.    bit aceModemConfig
  13000.    bpl +
  13001.    lda #%01100001
  13002. +  sta leanRtsOff
  13003.    lda #<nmiSwiftlinkLeanInterrupt  ;bit of a hack
  13004.    ldy #>nmiSwiftlinkLeanInterrupt
  13005.    sta $318
  13006.    sty $319
  13007.    jmp slInitFlow
  13008.  
  13009. slTestLean = *  ;( ) : .CC=useLean
  13010.    ;** must have: single-speed crystal, C128, Fast mode, 115200 baudrate, $de00
  13011.    bit aceModemConfig
  13012.    bvc +
  13013. .if computer-64
  13014.    clc
  13015. .else
  13016.    sec
  13017. .ife
  13018.    bcs +
  13019.    lda $d030
  13020.    and #1
  13021.    beq +
  13022.    lda aceModemConfig
  13023.    and #$0f
  13024.    cmp #$0f
  13025.    bne +
  13026.    lda aceModemIoPage
  13027.    cmp #$de
  13028.    bne +
  13029.    clc
  13030.    rts
  13031. +  sec
  13032.    rts
  13033.  
  13034. slShutdown = *
  13035.    ;** make sure that interrupts are turned off before exiting from ACE
  13036.    lda slReady
  13037.    bpl +
  13038.    lda #%00000010
  13039.    ldy #slCommandOff
  13040.    sta (slIoPage),y
  13041.    lda #%00011100
  13042.    ldy #slControlOff
  13043.    sta (slIoPage),y
  13044.    lda #$00
  13045.    sta slReady
  13046. +  clc
  13047.    rts
  13048.  
  13049. slParmsTemp .buf 1
  13050.  
  13051. kernModemParms = * ;( .A=baudrate|crystal|format, .X=change ) : .A=baud|c|format
  13052.    cpx #$00
  13053.    beq +
  13054.    ldy aceModemConfig
  13055.    sty slParmsTemp
  13056.    sta aceModemConfig
  13057.    bit slReady
  13058.    clc
  13059.    bpl +
  13060.    jsr slSetParms
  13061.    bcc +
  13062.    ldy slParmsTemp
  13063.    sty aceModemConfig
  13064. +  lda aceModemConfig
  13065.    rts
  13066.  
  13067. slInitHardware = *
  13068.    lda #$00
  13069.    ldy #slStatusOff
  13070.    sta (slIoPage),y
  13071.    lda #%00001001
  13072.    ldy #slCommandOff
  13073.    sta (slIoPage),y
  13074.    lda #%00011100
  13075.    ldy #slControlOff
  13076.    sta (slIoPage),y
  13077.    ldy #slDataOff
  13078.    lda (slIoPage),y
  13079.    ;xx fall through
  13080.  
  13081. slSetParms = * ;( aceModemConfig ) : .CS=error
  13082.    ;** control: baud + wordlen
  13083.    lda aceModemConfig
  13084.    and #$0f
  13085.    tax
  13086.    lda slBaudLookup,x
  13087.    bit aceModemConfig
  13088.    bvs +
  13089.    and #$0f
  13090.    jmp ++
  13091. +  lsr
  13092.    lsr
  13093.    lsr
  13094.    lsr
  13095. +  cmp #$00
  13096.    bne ++
  13097.    jsr slTestLean
  13098.    bcs +
  13099.    lda #$00
  13100.    jmp ++
  13101. +  sec
  13102.    rts
  13103. +  ora #%00010000
  13104.    bit aceModemConfig
  13105.    bpl +
  13106.    ora #%00100000
  13107. +  ldy #slControlOff
  13108.    sta (slIoPage),y
  13109.  
  13110.    ;** command: parity
  13111.    ldy #slCommandOff
  13112.    lda (slIoPage),y
  13113.    and #%00011111
  13114.    bit aceModemConfig
  13115.    bpl +
  13116.    ora #%01100000
  13117. +  sta (slIoPage),y
  13118.  
  13119.    ;** switch lean <--> normal receive
  13120.    jsr slTestLean
  13121.    bcs ++
  13122.    bit slLeanFlag
  13123.    bmi +
  13124.    jsr slInitLeanRecv
  13125. +  clc
  13126.    rts
  13127. +  bit slLeanFlag
  13128.    bpl +
  13129.    jsr slInitRegularRecv
  13130. +  clc
  13131.    rts
  13132.  
  13133. slTemp .buf 1
  13134. slBaudLookup = *
  13135.    .byte $00,$10,$30,$40,$65,$76,$87,$90,$a8,$ca,$db,$ec,$fe,$0f,$00,$00
  13136. ;          0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f
  13137.  
  13138.  
  13139. kernModemCheck = * ;( ) : .X=outstSendBytes, .A=sendBytesFree,
  13140.                         ; .Y=sendFlowStoppedFlag, .Z=oRecvB==0
  13141.    ldx slSendCount
  13142.    stx slTemp
  13143.    sec
  13144.    lda #0
  13145.    sbc slTemp
  13146.    sta slTemp
  13147.    bit slLeanFlag
  13148.    bmi +
  13149.    lda slRecvFree+1
  13150.    cmp slRecvFullCount
  13151.    php
  13152.    lda slTemp
  13153.    ldy slRecvFlowStopped
  13154.    plp
  13155.    clc
  13156.    rts
  13157. +  lda leanFreeCnt
  13158.    cmp #$ff
  13159.    php
  13160.    lda slTemp
  13161.    ldy leanStopped
  13162.    beq +
  13163.    ldy #$ff
  13164. +  plp
  13165.    clc
  13166.    rts
  13167.  
  13168. kernModemStat = * ;( .X=zpStatBuf):.A=slStatus,[zSB+0]=ovrChrs,[zSB+4]=bovfChrs,
  13169.                                   ;[zSB+8]=receivedBytes, [zSB+12]=sentBytes
  13170.    ldy #0
  13171. -  lda slOverrunBytes,y
  13172.    sta 0,x
  13173.    lda slBufOverflowBytes,y
  13174.    sta 4,x
  13175.    lda slReceivedBytes,y
  13176.    sta 8,x
  13177.    lda slSentBytes,y
  13178.    sta 12,x
  13179.    inx
  13180.    iny
  13181.    cpy #4
  13182.    bcc -
  13183.    ldy #slStatusOff
  13184.    lda (slIoPage),y
  13185.    pha
  13186.    ldy #slDataOff
  13187.    lda (slIoPage),y  ;bug-recovery hack
  13188.    tax
  13189.    pla
  13190.    clc
  13191.    rts
  13192.  
  13193. slVic80ReuScrollSave .buf 1  ;xx horrible hack!
  13194.  
  13195. slOpen = *
  13196.    bit slReady
  13197.    bmi +
  13198.    jsr slInitHardware
  13199.    lda #$ff
  13200.    sta slReady
  13201. +  lda slOpened
  13202.    bne +
  13203. .if computer-64
  13204. .else
  13205.    lda vdcScrollReuWork+3
  13206.    sta slVic80ReuScrollSave
  13207.    lda #aceMemNull
  13208.    sta vdcScrollReuWork+3
  13209. .ife
  13210. +  php
  13211.    sei
  13212.    jsr slPollReceive  ;get character received slightly before flow stopped
  13213.    inc slOpened
  13214.    ldy #slCommandOff
  13215.    lda (slIoPage),y
  13216.    and #%11110001
  13217.    ora #%00001000
  13218.    bit slRecvFlowStopped
  13219.    bpl +
  13220.    and #%11110011
  13221. +  sta (slIoPage),y
  13222.    jsr slPollReceive ;make sure we don't receive a char in race condition
  13223.    plp
  13224.    lda openFcb
  13225.    clc
  13226.    rts
  13227.  
  13228. slPollReceive = *
  13229.    bit slLeanFlag
  13230.    bmi +
  13231.    jmp slIntConfirm
  13232. +  ldy #slStatusOff
  13233.    lda #$08
  13234.    and (slIoPage),y
  13235.    beq +
  13236.    and (slIoPage),y
  13237.    beq +
  13238.    ldy #slDataOff
  13239.    lda (slIoPage),y
  13240.    ldx leanFreeCnt
  13241.    beq +
  13242.    dec leanFreeCnt
  13243.    ldx leanTail
  13244.    sta leanBuffer,x
  13245.    inc leanTail
  13246. +  rts
  13247.  
  13248. slCloseWait .buf 1
  13249.  
  13250. slClose = *
  13251.    lda slOpened
  13252.    beq +
  13253.    dec slOpened
  13254.    bne +
  13255.    php
  13256.    sei
  13257.    ldy #slCommandOff
  13258.    lda (slIoPage),y
  13259.    and #%11110001
  13260.    sta (slIoPage),y
  13261.    pha
  13262.    ldx #20    ;wait for edge conditions after
  13263. -  dex        ;dropping RTS, before disabling receive interrupts
  13264.    bne -
  13265.    pla
  13266.    ora #%00000010
  13267.    sta (slIoPage),y
  13268.    ;here, we are waiting for the modem to believe the RTS drop.
  13269.    ;  The value used is a fudge factor that may have to change
  13270.    ;  for different modems.
  13271.    lda configBuf+$87
  13272.    sta slCloseWait
  13273. -  jsr slPollReceive  ;try receiving polled char
  13274.    dec slCloseWait
  13275.    bne -
  13276.    plp
  13277. .if computer-64
  13278. .else
  13279.    lda slVic80ReuScrollSave
  13280.    sta vdcScrollReuWork+3
  13281. .ife
  13282. +  clc
  13283.    jmp closeFdEntry
  13284.  
  13285. slReadBytesLeft .buf 2
  13286. slReadChunkLen  .buf 1
  13287.  
  13288. slRead = *
  13289.    slReadNext = *
  13290.    sec
  13291.    lda readMaxLen+0
  13292.    sbc readLength+0
  13293.    sta slReadBytesLeft+0
  13294.    lda readMaxLen+1
  13295.    sbc readLength+1
  13296.    sta slReadBytesLeft+1
  13297.    ora slReadBytesLeft+0
  13298.    beq slReadEnd
  13299.    bcs ++
  13300.    slReadEnd = *
  13301.    lda slSendCount
  13302.    beq +
  13303.    jsr slTryToSend
  13304. +  lda readLength+0
  13305.    ldy readLength+1
  13306.    sta zw+0
  13307.    sty zw+1
  13308.    clc
  13309.    ldx #$ff
  13310.    rts
  13311. +  lda #128
  13312.    ldx slReadBytesLeft+1
  13313.    bne +
  13314.    ldx slReadBytesLeft+0
  13315.    cpx #128
  13316.    bcs +
  13317.    txa
  13318. +  jsr slReadBytes
  13319.    bcc +
  13320.    lda readLength+0
  13321.    ora readLength+1
  13322.    beq slReadNext    ;** don't return on zero bytes read
  13323.    jmp slReadEnd
  13324. +  sty slReadChunkLen
  13325.    clc
  13326.    tya
  13327.    adc readPtr+0
  13328.    sta readPtr+0
  13329.    bcc +
  13330.    inc readPtr+1
  13331. +  clc
  13332.    lda readLength+0
  13333.    adc slReadChunkLen
  13334.    sta readLength+0
  13335.    bcc +
  13336.    inc readLength+1
  13337. +  clc
  13338.    lda slReceivedBytes+0
  13339.    adc slReadChunkLen
  13340.    sta slReceivedBytes+0
  13341.    bcc +
  13342.    inc slReceivedBytes+1
  13343.    bne +
  13344.    inc slReceivedBytes+2
  13345.    bne +
  13346.    inc slReceivedBytes+3
  13347. +  jmp slReadNext
  13348.  
  13349. slReadLean = *  ;( .A=maxBytes, readPtr ) : .Y=actualBytes, .CS=empty
  13350.    sta slReadChunkLen
  13351.    lda leanFreeCnt
  13352.    cmp #$ff
  13353.    bne +
  13354.    sec
  13355.    rts
  13356. +  php
  13357.    sei
  13358.    sec
  13359.    lda #$ff
  13360.    sbc leanFreeCnt
  13361.    cmp slReadChunkLen
  13362.    bcs +
  13363.    sta slReadChunkLen
  13364. +  ldy #0
  13365.    ldx leanHead
  13366. -  lda leanBuffer,x
  13367.    sta (readPtr),y
  13368.    inx
  13369.    iny
  13370.    inc leanFreeCnt
  13371.    cpy slReadChunkLen
  13372.    bcc -
  13373. +  stx leanHead
  13374.    ldx leanStopped
  13375.    beq +
  13376.    ldx leanFreeCnt
  13377.    cpx #64
  13378.    bcc +
  13379.    sty slReadChunkLen
  13380.    ldy #slCommandOff
  13381.    ldx #$00
  13382.    lda (slIoPage),y
  13383.    and #%11110011
  13384.    ora #%00001000
  13385.    stx leanStopped
  13386.    sta (slIoPage),y
  13387.    ldy slReadChunkLen
  13388. +  plp
  13389.    clc
  13390.    rts
  13391.  
  13392. slRxCriticalSection .buf 1
  13393.  
  13394. slReadBytes = *  ;( .A=maxBytes, readPtr ) : .Y=actualBytes, .CS=empty
  13395.    bit slLeanFlag
  13396.    bmi slReadLean
  13397.    lda slRecvFree+1
  13398.    cmp slRecvFullCount
  13399.    bcc +
  13400.    sec
  13401.    rts
  13402. +  php
  13403.    sei
  13404.    lda #bkRam0
  13405.    sta bkSelect
  13406.    ldy #0
  13407.    lda (slRecvHead),y
  13408.    pha
  13409.    lda #bkACE
  13410.    sta bkSelect
  13411.    inc slRecvHead+0
  13412.    bne +
  13413.    inc slRecvHead+1
  13414.    lda slRecvHead+1
  13415.    cmp aceModemRecvHigh
  13416.    bcc +
  13417.    lda aceModemRecvPage
  13418.    sta slRecvHead+1
  13419.    ;** we should disable receive interrupts while decrementing count, since
  13420.    ;** it is shared between this routine and the interrupt handler, and 
  13421.    ;** updates are non-atomic.  However, there seems to be a problem with
  13422.    ;** missing interrupts altogether if interrupts are disabled when a
  13423.    ;** character is received.
  13424. +  lda #$ff
  13425.    sta slRxCriticalSection
  13426.    inc slRecvFree+0
  13427.    bne +
  13428.    inc slRecvFree+1
  13429. +  lda #$00
  13430.    sta slRxCriticalSection
  13431.    lda slRecvFlowStopped
  13432.    bpl ++
  13433.    lda slRecvFree+1  ;flow stopped; re-enable it if >= 16 bytes free
  13434.    bne +
  13435.    lda slRecvFree+0  ;this dual access is not critical
  13436.    and #$f0
  13437.    beq ++
  13438. +  ldx #$00
  13439.    ldy #slCommandOff
  13440.    lda (slIoPage),y
  13441.    ora #%00001000
  13442.    stx slRecvFlowStopped
  13443.    sta (slIoPage),y
  13444. +  pla
  13445.    plp
  13446.    ldy #0
  13447.    sta (readPtr),y
  13448.    iny
  13449.    clc
  13450.    rts
  13451.  
  13452. slTryToSend = *
  13453.    ;** send as many buffered transmit bytes as possible, until either the
  13454.    ;** send buffer is empty or flow control is re-asserted
  13455.    lda slSendCount
  13456.    bne +
  13457. -  rts
  13458. +  ldy #slStatusOff
  13459. -  bit slLeanFlag
  13460.    bpl +
  13461.    lda leanStopped
  13462.    bne --
  13463.    jmp ++
  13464. +  bit slRecvFlowStopped
  13465.    bmi --
  13466. +  lda #%00010000
  13467.    and (slIoPage),y
  13468.    beq -
  13469.    ldy slSendHead
  13470.    ldx #bkRam0
  13471.    stx bkSelect
  13472.    lda (slSendPage),y
  13473.    ldx #bkACE
  13474.    stx bkSelect
  13475.    ;** because the 6551 works semi-intelligently, the race condition here
  13476.    ;** between detecting that it is okay to send and the possibility of
  13477.    ;** flow stoppage being re-asserted in the meantime, is non-critical:
  13478.    ;** the 6551 will automatically send the byte when data flow is reactivated
  13479.    ldy #slDataOff
  13480.    sta (slIoPage),y
  13481.    inc slSendHead
  13482.    dec slSendCount
  13483.    jmp slTryToSend
  13484.  
  13485. slWrite = *
  13486.    slWriteNext = *
  13487.    lda writeLength+0
  13488.    ora writeLength+1
  13489.    bne +
  13490.    clc
  13491.    rts
  13492. +  ldy #0
  13493.    lda (writePtr),y
  13494.    jsr slWriteByte
  13495.    inc writePtr+0
  13496.    bne +
  13497.    inc writePtr+1
  13498. +  lda writeLength+0
  13499.    bne +
  13500.    dec writeLength+1
  13501. +  dec writeLength+0
  13502.    jmp slWriteNext
  13503.  
  13504. slWriteByte = *  ;( .A=byte ) : .CS=couldn't do(flow stopped), .A=char
  13505.    tax
  13506.    ldy #slStatusOff
  13507. -  bit slLeanFlag
  13508.    bpl +
  13509.    lda leanStopped
  13510.    bne slWriteStopped
  13511.    jmp ++
  13512. +  bit slRecvFlowStopped
  13513.    bmi slWriteStopped
  13514. +  lda #%00010000
  13515.    and (slIoPage),y
  13516.    beq -
  13517.    txa
  13518.    ldy #slDataOff
  13519.    sta (slIoPage),y
  13520.    inc slSentBytes+0
  13521.    bne +
  13522.    inc slSentBytes+1
  13523.    bne +
  13524.    inc slSentBytes+2
  13525.    bne +
  13526.    inc slSentBytes+3
  13527. +  clc
  13528.    rts
  13529.  
  13530.    slWriteStopped = *
  13531.    txa
  13532.    ;** send flow is disabled--put the char into the send buffer
  13533.    ;** note that if flow is disabled, it will not be re-enabled until after
  13534.    ;** the next "read" call
  13535.    ldy slSendCount
  13536.    cpy #255
  13537.    bcc + 
  13538.    ;** send buffer is full--return with error
  13539.    sec
  13540.    rts
  13541. +  ldy slSendTail
  13542.    ldx #bkRam0
  13543.    stx bkSelect
  13544.    sta (slSendPage),y
  13545.    ldx #bkACE
  13546.    stx bkSelect
  13547.    inc slSendTail
  13548.    inc slSendCount
  13549.    clc
  13550.    rts
  13551.  
  13552. ;** This interrupt is negative-edge triggered.  This means that we can disable
  13553. ;** further interrupts as long as we don't clear the current one.  However,
  13554. ;** we also must make sure that ALL interrupts are serviced and cleared before
  13555. ;** we return.
  13556.  
  13557. slInterrupt = *  ;( ) : .CS=notSlInt
  13558.    bit slReady
  13559.    bmi +
  13560. -  sec
  13561.    rts
  13562. +  ldy #slStatusOff
  13563.    lda (slIoPage),y
  13564.    and #%00001000
  13565.    beq -
  13566.    bne +
  13567.  
  13568.    slIntAgain = *
  13569.    ldy #slStatusOff
  13570.    lda (slIoPage),y
  13571.    and #%00001000
  13572.    bne +
  13573.    clc
  13574.    rts
  13575.    ;** receive interrupt
  13576. +  lda (slIoPage),y  ;slStatusOff
  13577.    and #%00000100
  13578.    beq +
  13579.    inc slOverrunBytes+0
  13580.    bne +
  13581.    inc slOverrunBytes+1
  13582.    bne +
  13583.    inc slOverrunBytes+2
  13584.    bne +
  13585.    inc slOverrunBytes+3
  13586. +  lda slRecvFree+0
  13587.    ora slRecvFree+1
  13588.    bne ++
  13589.    ;** The following condition checks for the case that we have interrupted
  13590.    ;** a receive-free count incrementing between $0ff -> $100.  The increment
  13591.    ;** goes through $0ff -> $000 -> $100, so we could get a false zero
  13592.    ;** reading.  If have interrupted that critical section of the increment
  13593.    ;** in the read-byte routine, then it is okay to proceed, since the
  13594.    ;** final count cannot be actually zero but must be $100.  After we have
  13595.    ;** finished processing, the count will be $ffff, which will be incremented
  13596.    ;** to the correct result of $00ff when the interrupted code resumes.  This
  13597.    ;** measure will also work even if the critical section is interrupted
  13598.    ;** again before it completes, provided that this doesn't happen more than
  13599.    ;** 256 times in a row (not very likely, in fact, impossible at 38.4 kbaud).
  13600.    lda slRxCriticalSection
  13601.    bmi ++
  13602.    ;** otherwise, the buffer really is full, so we drop the new character
  13603.    inc slBufOverflowBytes+0
  13604.    bne +
  13605.    inc slBufOverflowBytes+1
  13606.    bne +
  13607.    inc slBufOverflowBytes+2
  13608.    bne +
  13609.    inc slBufOverflowBytes+3
  13610. +  ldy #slDataOff
  13611.    lda (slIoPage),y
  13612.    nop ;drop the character on the floor
  13613.    jmp slIntConfirm
  13614. +  ldy #slDataOff
  13615.    lda (slIoPage),y
  13616.    ldy #bkRam0
  13617.    sty bkSelect
  13618.    ldy #0
  13619.    sta (slRecvTail),y
  13620.    lda #bkACE
  13621.    sta bkSelect
  13622.    inc slRecvTail+0
  13623.    bne +
  13624.    inc slRecvTail+1
  13625.    lda slRecvTail+1
  13626.    cmp aceModemRecvHigh
  13627.    bcc +
  13628.    lda aceModemRecvPage
  13629.    sta slRecvTail+1
  13630. +  lda slRecvFree+0
  13631.    bne +
  13632.    dec slRecvFree+1
  13633. +  dec slRecvFree+0
  13634.    ;nop  ;we should be pulling the data out here.
  13635.    lda slRecvFree+1 ;if fewer than 8 bytes free, engage flow control
  13636.    bne slIntConfirm
  13637.    lda slRecvFree+0
  13638.    and #$f8
  13639.    bne slIntConfirm
  13640.    ldy #slCommandOff
  13641.    lda (slIoPage),y
  13642.    and #%11110011 ;drop RTS, disable Tx
  13643.    sta (slIoPage),y
  13644.    lda #$ff
  13645.    sta slRecvFlowStopped
  13646.  
  13647.    slIntConfirm = *   ;confirm that all interrupts are clear
  13648.    ldy #slStatusOff
  13649.    lda (slIoPage),y
  13650.    and #%00001000
  13651.    beq +
  13652.    jmp slIntAgain
  13653. +  clc
  13654.    rts
  13655.  
  13656. ;the end + blank line
  13657.  
  13658. acepar.s
  13659. 260
  13660. ;ACE-128/64 kernel parallel port driver, started 18-Sep-1994.
  13661.  
  13662. ;This device driver uses the parallel port network cable described in Issue #8
  13663. ;of C= Hacking net magazine.  If you don't have such a cable, then don't
  13664. ;include this device in your device configuration.  This device driver has
  13665. ;also been extended to work with the geoCable parallel printer cable.
  13666.  
  13667. parPA         = $dd00
  13668. parData       = $dd01
  13669. parDDR        = $dd03
  13670. parFlag       = $dd0d
  13671. parFlagVal    = $10
  13672. parLastOp     .buf 1  ;$00=read, $01=write, $ff=no last op
  13673. parReady      .buf 1
  13674. parReadCount  .buf 2
  13675. parProtocol   .buf 1  ;$00=raw-PC, $40=use-PA2, $80=packet-oriented, $c0=packPA2
  13676. parPa2Neutral .buf 1
  13677. parPa2Assert  .buf 1
  13678.  
  13679. parInit = *
  13680.    lda #$00
  13681.    sta parReady
  13682.    ldx #0
  13683. -  lda configBuf+0,x
  13684.    cmp #5
  13685.    beq +
  13686.    txa
  13687.    clc
  13688.    adc #4
  13689.    tax
  13690.    cpx #$80
  13691.    bcc -
  13692.    clc
  13693.    rts
  13694.    ;** got a live one!
  13695. +  lda configBuf+3,x
  13696.    sta parProtocol
  13697.    lda #$00
  13698.    sta parDDR
  13699.    lda parDDR-1
  13700.    ora #$04
  13701.    sta parDDR-1
  13702.    sta parReadCount+0
  13703.    sta parReadCount+1
  13704.    lda #$ff
  13705.    sta parLastOp
  13706.    sta parReady
  13707.    lda parPA
  13708.    ora #$04
  13709.    sta parPA
  13710.    clc
  13711.    rts
  13712.  
  13713. parGetPa2Parms = *
  13714.    lda parPA
  13715.    ora #$04
  13716.    sta parPa2Neutral
  13717.    eor #$04
  13718.    sta parPa2Assert
  13719.    rts
  13720.  
  13721. parOpen = *
  13722.    lda openFcb
  13723.    clc
  13724.    rts
  13725.  
  13726. parClose = *
  13727.    jsr parGetPa2Parms
  13728.    lda parLastOp
  13729.    cmp #$01
  13730.    bne +
  13731.    bit parProtocol
  13732.    bpl +
  13733.    lda #$e6          ;write EOF packet if we were last writer
  13734.    jsr parWriteByte
  13735.    lda #$00
  13736.    jsr parWriteByte
  13737.    lda #$00
  13738.    jsr parWriteByte
  13739. +  clc
  13740.    jmp closeFdEntry
  13741.  
  13742. parRead = *
  13743.    jsr parGetPa2Parms
  13744.    lda parLastOp
  13745.    cmp #$01
  13746.    bne +
  13747.    lda #$00
  13748.    sta parDDR
  13749.    lda parData
  13750.    bit parProtocol
  13751.    bvc +
  13752.    ldx parPa2Assert
  13753.    stx parPA
  13754.    ldx parPa2Neutral
  13755.    stx parPA
  13756. +  lda #$00
  13757.    sta parLastOp
  13758.  
  13759.    parReadHeader = *
  13760.    lda parReadCount+0
  13761.    ora parReadCount+1
  13762.    bne ++
  13763.    bit parProtocol
  13764.    bmi +
  13765.    lda readMaxLen+0
  13766.    ldy readMaxLen+1
  13767.    sta parReadCount+0
  13768.    sty parReadCount+1
  13769.    jmp ++
  13770. +  jsr parReadByte
  13771.    cmp #$e6
  13772.    ;xx should check it here
  13773.    jsr parReadByte
  13774.    sta parReadCount+0
  13775.    jsr parReadByte
  13776.    sta parReadCount+1
  13777.    ora parReadCount+0
  13778.    bne +
  13779.    jsr parReadEnd  ;eof
  13780.    ldx #$00
  13781.    rts
  13782. +  lda parReadCount+0
  13783.    cmp readMaxLen+0
  13784.    lda parReadCount+1
  13785.    sbc readMaxLen+1
  13786.    bcs +
  13787.    lda parReadCount+0
  13788.    ldy parReadCount+1
  13789.    sta readMaxLen+0
  13790.    sty readMaxLen+1
  13791. +  sec
  13792.    lda parReadCount+0  ;set count for next time
  13793.    sbc readMaxLen+0
  13794.    sta parReadCount+0
  13795.    lda parReadCount+1
  13796.    sbc readMaxLen+1
  13797.    sta parReadCount+1
  13798.  
  13799.    parReadNext = *
  13800.    lda readLength+0
  13801.    cmp readMaxLen+0
  13802.    lda readLength+1
  13803.    sbc readMaxLen+1
  13804.    bcc +
  13805.    parReadEnd = *
  13806.    lda readLength+0
  13807.    ldy readLength+1
  13808.    sta zw+0
  13809.    sty zw+1
  13810.    clc
  13811.    ldx #$ff
  13812.    rts
  13813. +  ldy #0
  13814.    lda #parFlagVal
  13815. -  bit parFlag
  13816.    beq -
  13817.    lda parData
  13818.    bit parProtocol
  13819.    bvc +
  13820.    ldx parPa2Assert
  13821.    stx parPA
  13822.    ldx parPa2Neutral
  13823.    stx parPA
  13824. +  sta (readPtr),y
  13825.    inc readPtr+0
  13826.    bne +
  13827.    inc readPtr+1
  13828. +  inc readLength+0
  13829.    bne +
  13830.    inc readLength+1
  13831. +  jmp parReadNext
  13832.  
  13833. parReadByte = *
  13834.    lda #parFlagVal
  13835. -  bit parFlag
  13836.    beq -
  13837.    lda parData
  13838.    bit parProtocol
  13839.    bvc +
  13840.    ldx parPa2Assert
  13841.    stx parPA
  13842.    ldx parPa2Neutral
  13843.    stx parPA
  13844. +  rts
  13845.  
  13846. parWrite = *
  13847.    jsr parGetPa2Parms
  13848.    lda parLastOp
  13849.    cmp #$01
  13850.    beq parWriteHeader
  13851.    ldx #$ff
  13852.    stx parDDR
  13853.    cmp #$00
  13854.    bne +
  13855.    lda #parFlagVal
  13856. -  bit parFlag
  13857.    beq -
  13858. +  lda #$01
  13859.    sta parLastOp
  13860.  
  13861.    parWriteHeader = *
  13862.    lda writeLength+0
  13863.    ora writeLength+1
  13864.    bne +
  13865.    clc
  13866.    rts
  13867. +  bit parProtocol
  13868.    bpl parWriteNext
  13869.    lda #$e6
  13870.    jsr parWriteByte
  13871.    lda writeLength+0
  13872.    jsr parWriteByte
  13873.    lda writeLength+1
  13874.    jsr parWriteByte
  13875.  
  13876.    parWriteNext = *
  13877.    lda writeLength+0
  13878.    ora writeLength+1
  13879.    bne +
  13880.    clc
  13881.    rts
  13882. +  ldy #0
  13883.    lda (writePtr),y
  13884.    bit parFlag   ;** preventative
  13885.    sta parData
  13886.    bit parProtocol
  13887.    bvc +
  13888.    ldx parPa2Assert
  13889.    stx parPA
  13890.    ldx parPa2Neutral
  13891.    stx parPA
  13892. +  inc writePtr+0
  13893.    bne +
  13894.    inc writePtr+1
  13895. +  lda writeLength+0
  13896.    bne +
  13897.    dec writeLength+1
  13898. +  dec writeLength+0
  13899.    lda #parFlagVal
  13900. -  bit parFlag
  13901.    beq -
  13902.    jmp parWriteNext
  13903.  
  13904. parWriteByte = *
  13905.    bit parFlag   ;** preventative
  13906.    sta parData
  13907.    bit parProtocol
  13908.    bvc +
  13909.    ldx parPa2Assert
  13910.    stx parPA
  13911.    ldx parPa2Neutral
  13912.    stx parPA
  13913. +  lda #parFlagVal
  13914. -  bit parFlag
  13915.    beq -
  13916.    rts
  13917.  
  13918. ;the end + blank line
  13919.  
  13920. acekey-qwerty.s
  13921. 130
  13922. ;ACE-128/64 Dvorak keymatrix, by Craig Bruce - 07-June-1995
  13923. ;
  13924. ;this file is in ACE-assembler format.
  13925.  
  13926. .org $2000
  13927.  
  13928. ;The mapping of keyscan matrix positions to keys is as follows:
  13929. ;
  13930. ;    \                           COLUMNS:
  13931. ;ROWS:\
  13932. ;      \    0       1       2       3       4       5       6       7
  13933. ;       +-------+-------+-------+-------+-------+-------+-------+-------+ code
  13934. ;   0   | DELETE| RETURN| RIGHT |  F7   |  F1   |  F3   |  F5   | DOWN  | (0)
  13935. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13936. ;   1   |   3   |   W   |   A   |   4   |   Z   |   S   |   E   |L-SHIFT| (8)
  13937. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13938. ;   2   |   5   |   R   |   D   |   6   |   C   |   F   |   T   |   X   | (16)
  13939. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13940. ;   3   |   7   |   Y   |   G   |   8   |   B   |   H   |   U   |   V   | (24)
  13941. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13942. ;   4   |   9   |   I   |   J   |   0   |   M   |   K   |   O   |   N   | (32)
  13943. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13944. ;   5   |   +   |   P   |   L   |   -   |   .   |   :   |   @   |   ,   | (40)
  13945. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13946. ;   6   |   \   |   *   |   ;   | HOME  |R-SHIFT|   =   |   ^   |   /   | (48)
  13947. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13948. ;   7   |   1   |   _   |CONTROL|   2   | SPACE |COMMODR|   Q   | STOP  | (56)
  13949. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13950. ;   8   | HELP  |   8   |   5   |  TAB  |   2   |   4   |   7   |   1   | (64)
  13951. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13952. ;   9   |  ESC  |   +   |   -   |  LF   | ENTER |   6   |   9   |   3   | (72)
  13953. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13954. ;  10   |  ALT  |   0   |   .   |  UP   | DOWN  | LEFT  | RIGHT |NO-SCRL| (80)
  13955. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  13956.  
  13957. ;Note that the C128's keyboard has all eleven rows (0-10) whereas the C64's
  13958. ;keyboard only has the first eight (0-7).  The entires with $00 mean that
  13959. ;pressing the associated key does nothing.  There are multiple key matrices
  13960. ;to produce the codes for use with various "shift" keys.
  13961.  
  13962. conKeymapNormal = *
  13963.    .byte $14,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  13964.    .byte $33,$57,$41,$34,$5a,$53,$45,$01  ;row 1
  13965.    .byte $35,$52,$44,$36,$43,$46,$54,$58  ;row 2
  13966.    .byte $37,$59,$47,$38,$42,$48,$55,$56  ;row 3
  13967.    .byte $39,$49,$4a,$30,$4d,$4b,$4f,$4e  ;row 4
  13968.    .byte $2b,$50,$4c,$2d,$2e,$3a,$40,$2c  ;row 5
  13969.    .byte $5c,$2a,$3b,$13,$01,$3d,$5e,$2f  ;row 6
  13970.    .byte $31,$5f,$04,$32,$20,$02,$51,$03  ;row 7
  13971.    .byte $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  13972.    .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  13973.    .byte $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  13974.  
  13975. conKeymapShift = *
  13976.    .byte $94,$8d,$9d,$8c,$89,$8a,$8b,$91  ;row 0
  13977.    .byte $23,$d7,$c1,$24,$da,$d3,$c5,$01  ;row 1
  13978.    .byte $25,$d2,$c4,$26,$c3,$c6,$d4,$d8  ;row 2
  13979.    .byte $27,$d9,$c7,$28,$c2,$c8,$d5,$d6  ;row 3
  13980.    .byte $29,$c9,$ca,$30,$cd,$cb,$cf,$ce  ;row 4
  13981.    .byte $db,$d0,$cc,$dd,$3e,$5b,$ba,$3c  ;row 5
  13982.    .byte $dc,$c0,$5d,$93,$01,$3d,$de,$3f  ;row 6
  13983.    .byte $21,$df,$04,$22,$20,$02,$d1,$83  ;row 7
  13984.    .byte $84,$38,$35,$02,$32,$34,$37,$31  ;row 8
  13985.    .byte $1b,$2b,$2d,$07,$8d,$36,$39,$33  ;row 9
  13986.    .byte $08,$30,$2e,$16,$17,$06,$0b,$00  ;row 10
  13987.  
  13988. conKeymapCommodore = *
  13989.    .byte $08,$0d,$16,$8f,$80,$82,$84,$17  ;row 0
  13990.    .byte $96,$b7,$a1,$97,$ba,$b3,$a5,$01  ;row 1
  13991.    .byte $98,$b2,$a4,$99,$a3,$a6,$b4,$b8  ;row 2
  13992.    .byte $9a,$b9,$a7,$9b,$a2,$a8,$b5,$b6  ;row 3
  13993.    .byte $29,$a9,$aa,$30,$ad,$ab,$af,$ae  ;row 4
  13994.    .byte $2b,$b0,$ac,$2d,$3e,$bb,$a0,$3c  ;row 5
  13995.    .byte $bc,$7f,$bd,$93,$01,$bf,$be,$3f  ;row 6
  13996.    .byte $81,$bf,$04,$95,$5f,$02,$b1,$03  ;row 7
  13997.    .byte $84,$38,$35,$18,$32,$34,$37,$31  ;row 8
  13998.    .byte $1b,$2b,$2d,$07,$8d,$36,$39,$33  ;row 9
  13999.    .byte $08,$30,$2e,$0c,$0f,$10,$15,$00  ;row 10
  14000.  
  14001. conKeymapControl = *
  14002.    .byte $08,$00,$00,$8f,$80,$82,$84,$00  ;row 0
  14003.    .byte $1c,$f7,$e1,$9f,$fa,$f3,$e5,$00  ;row 1
  14004.    .byte $9c,$f2,$e4,$1e,$e3,$e6,$f4,$f8  ;row 2
  14005.    .byte $1f,$f9,$e7,$9e,$e2,$e8,$f5,$f6  ;row 3
  14006.    .byte $12,$e9,$ea,$92,$ed,$eb,$ef,$ee  ;row 4
  14007.    .byte $2b,$f0,$ec,$2d,$00,$fb,$e0,$00  ;row 5
  14008.    .byte $fc,$60,$fd,$00,$00,$ff,$fe,$00  ;row 6
  14009.    .byte $90,$ff,$00,$05,$20,$00,$f1,$00  ;row 7
  14010.    .byte $84,$8c,$87,$18,$89,$8a,$88,$85  ;row 8
  14011.    .byte $1b,$84,$8f,$0a,$00,$8b,$80,$86  ;row 9
  14012.    .byte $08,$82,$2e,$16,$17,$19,$1a,$00  ;row 10
  14013.  
  14014. conKeymapAlternate = *
  14015.    .byte $08,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  14016.    .byte $33,$77,$61,$34,$7a,$73,$65,$00  ;row 1
  14017.    .byte $35,$72,$64,$36,$63,$66,$74,$78  ;row 2
  14018.    .byte $37,$79,$67,$78,$62,$68,$75,$76  ;row 3
  14019.    .byte $39,$69,$6a,$30,$6d,$6b,$6f,$6e  ;row 4
  14020.    .byte $2b,$70,$6c,$2d,$2e,$7b,$ba,$2c  ;row 5
  14021.    .byte $a9,$60,$7d,$13,$00,$7f,$7e,$2f  ;row 6
  14022.    .byte $31,$7f,$04,$32,$20,$02,$71,$03  ;row 7
  14023.    .byte $84,$38,$35,$09,$32,$34,$37,$31  ;row 8
  14024.    .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  14025.    .byte $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  14026.  
  14027. conKeymapCaps = *
  14028.    .byte $14,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  14029.    .byte $33,$d7,$c1,$34,$da,$d3,$c5,$01  ;row 1
  14030.    .byte $35,$d2,$c4,$36,$c3,$c6,$d4,$d8  ;row 2
  14031.    .byte $37,$d9,$c7,$38,$c2,$c8,$d5,$d6  ;row 3
  14032.    .byte $39,$c9,$ca,$30,$cd,$cb,$cf,$ce  ;row 4
  14033.    .byte $2b,$d0,$cc,$2d,$2e,$3a,$40,$2c  ;row 5
  14034.    .byte $5c,$2a,$3b,$13,$01,$3d,$5e,$2f  ;row 6
  14035.    .byte $31,$5f,$04,$32,$20,$02,$d1,$03  ;row 7
  14036.    .byte $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  14037.    .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  14038.    .byte $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  14039.  
  14040. conKeymapShiftComm = *
  14041.    .byte $00,$0d,$16,$00,$00,$00,$00,$17  ;row 0
  14042.    .byte $33,$0c,$10,$34,$0f,$15,$1b,$00  ;row 1
  14043.    .byte $35,$00,$0e,$36,$00,$00,$09,$00  ;row 2
  14044.    .byte $37,$18,$84,$38,$06,$04,$00,$00  ;row 3
  14045.    .byte $39,$16,$19,$30,$17,$1a,$00,$0b  ;row 4
  14046.    .byte $2b,$07,$0a,$2d,$2e,$10,$00,$2c  ;row 5
  14047.    .byte $00,$00,$15,$0c,$00,$00,$00,$04  ;row 6
  14048.    .byte $31,$1b,$00,$32,$00,$00,$00,$00  ;row 7
  14049.    .byte $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  14050.    .byte $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  14051.    .byte $00,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  14052. acekey-dvorak.s
  14053. 211
  14054. ;ACE-128/64 Dvorak keymatrix, by Craig Bruce - 07-June-1995
  14055. ;
  14056. ;this file is in ACE-assembler format.
  14057.  
  14058. org $2000
  14059.  
  14060. ;The mapping of keyscan matrix positions to keys is as follows (for the 
  14061. ;QWERTY layout):
  14062. ;
  14063. ;    \                           COLUMNS:
  14064. ;ROWS:\
  14065. ;      \    0       1       2       3       4       5       6       7
  14066. ;       +-------+-------+-------+-------+-------+-------+-------+-------+ code
  14067. ;   0   | DELETE| RETURN| RIGHT |  F7   |  F1   |  F3   |  F5   | DOWN  | (0)
  14068. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14069. ;   1   |   3   |   W   |   A   |   4   |   Z   |   S   |   E   |L-SHIFT| (8)
  14070. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14071. ;   2   |   5   |   R   |   D   |   6   |   C   |   F   |   T   |   X   | (16)
  14072. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14073. ;   3   |   7   |   Y   |   G   |   8   |   B   |   H   |   U   |   V   | (24)
  14074. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14075. ;   4   |   9   |   I   |   J   |   0   |   M   |   K   |   O   |   N   | (32)
  14076. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14077. ;   5   |   +   |   P   |   L   |   -   |   .   |   :   |   @   |   ,   | (40)
  14078. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14079. ;   6   |   \   |   *   |   ;   | HOME  |R-SHIFT|   =   |   ^   |   /   | (48)
  14080. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14081. ;   7   |   1   |   _   |CONTROL|   2   | SPACE |COMMODR|   Q   | STOP  | (56)
  14082. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14083. ;   8   | HELP  |   8   |   5   |  TAB  |   2   |   4   |   7   |   1   | (64)
  14084. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14085. ;   9   |  ESC  |   +   |   -   |  LF   | ENTER |   6   |   9   |   3   | (72)
  14086. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14087. ;  10   |  ALT  |   0   |   .   |  UP   | DOWN  | LEFT  | RIGHT |NO-SCRL| (80)
  14088. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14089.  
  14090. ;Note that the C128's keyboard has all eleven rows (0-10) whereas the C64's
  14091. ;keyboard only has the first eight (0-7).  The entires with $00 mean that
  14092. ;pressing the associated key does nothing.  There are multiple key matrices
  14093. ;to produce the codes for use with various "shift" keys.
  14094.  
  14095. ;The layout of the standard C128/64 QWERTY keyboard is as follows:
  14096. ;
  14097. ;    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  14098. ;    | _ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + | - | \ |hom|del|
  14099. ;    +---------------------------------------------------------------+
  14100. ;    |ctrl | Q | W | E | R | T | Y | U | I | O | P | @ | * | ^ |restr|
  14101. ;    +---------------------------------------------------------------+
  14102. ;    |stp|shl| A | S | D | F | G | H | J | K | L | : | ; | = | return|
  14103. ;    +---------------------------------------------------------------+
  14104. ;    | C=|shift| Z | X | C | V | B | N | M | , | . | / |shift| v |-> |
  14105. ;    +---+-----+---+---+---+---+---+---+---+---+---+---+-----+---+---+
  14106. ;
  14107. ;This is translated into the following Dvorak layout in this keymatrix:
  14108. ;
  14109. ;    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
  14110. ;    | _ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + | - | \ |hom|del|
  14111. ;    +---------------------------------------------------------------+
  14112. ;    |ctrl | @ | , | . | P | Y | F | G | C | R | L | / | * | ^ |restr|
  14113. ;    +---------------------------------------------------------------+
  14114. ;    |stp|shl| A | O | E | U | I | D | H | T | N | S | ; | = | return|
  14115. ;    +---------------------------------------------------------------+
  14116. ;    | C=|shift| : | Q | J | K | X | B | M | W | V | Z |shift| v |-> |
  14117. ;    +---+-----+---+---+---+---+---+---+---+---+---+---+-----+---+---+
  14118. ;
  14119. ;A couple of keys are different from the standard Dvorak layout:
  14120. ;
  14121. ; the (2) key above should be (2) normally and (@) when shifted
  14122. ; the (6) key above should be (6) normally and (^) when shifted
  14123. ; the (8) key above should be (8) normally and (*) when shifted
  14124. ; the (9) key above should be (9) normally and (() when shifted
  14125. ; the (0) key above should be (0) normally and ()) when shifted
  14126. ; the (+) key above should be ([) normally and ({) when shifted
  14127. ; the (-) key above should be (=) normally and (+) when shifted
  14128. ; the (@) key above should be (') normally and (") when shifted
  14129. ; the (*) key above should be (]) normally and (}) when shifted
  14130. ; the (;) key above should be (-) normally and (_) when shifted
  14131. ; the (:) key above should be (;) normally and (:) when shifted
  14132. ;
  14133. ;In other words, the Dvorak layout should be:
  14134. ;
  14135. ;      ! @ # $ % ^ & * ( ) { +         Layout differs from the
  14136. ;      1 2 3 4 5 6 7 8 9 0 [ =         ANSI standard because
  14137. ;       " < > P Y F G C R L ? }        the following substitution
  14138. ;       ' , . p y f g c r l / ]        was made:
  14139. ;        A O E U I D H T N S _
  14140. ;        a o e u i d h t n s -                 [  =>  {
  14141. ;         : Q J K X B M W V Z                  ]  =>  [
  14142. ;         ; q j k x b m w v z
  14143. ;
  14144. ;Here is the standard lawyershit that applies exclusively the keyboard
  14145. ;diagram included immediately above:
  14146. ;
  14147. ;   Copyright 1991 by The MITRE Corporation.
  14148. ;   Permission to use, copy, modify, and distribute this
  14149. ;   software and its documentation for any purpose and without
  14150. ;   fee is hereby granted, provided that the above copyright
  14151. ;   notice appear in all copies.  The MITRE Corporation
  14152. ;   makes no representations about the suitability of this
  14153. ;   software for any purpose.  It is provided "as is" without
  14154. ;   express or implied warranty.
  14155. ;
  14156. ;Anyhow, the key translation martix for the Dvorak keyboard becomes:
  14157. ;
  14158. ;    \                           COLUMNS:
  14159. ;ROWS:\
  14160. ;      \    0       1       2       3       4       5       6       7
  14161. ;       +-------+-------+-------+-------+-------+-------+-------+-------+ code
  14162. ;   0   | DELETE| RETURN| RIGHT |  F7   |  F1   |  F3   |  F5   | DOWN  | (0)
  14163. ;   1   |   3   |   ,   |   A   |   4   |   :   |   O   |   .   |L-SHIFT| (8)
  14164. ;   2   |   5   |   P   |   E   |   6   |   J   |   U   |   Y   |   Q   | (16)
  14165. ;   3   |   7   |   F   |   I   |   8   |   X   |   D   |   G   |   K   | (24)
  14166. ;   4   |   9   |   C   |   H   |   0   |   M   |   T   |   R   |   B   | (32)
  14167. ;   5   |   +   |   L   |   N   |   -   |   V   |   S   |   /   |   W   | (40)
  14168. ;   6   |   \   |   *   |   ;   | HOME  |R-SHIFT|   =   |   ^   |   Z   | (48)
  14169. ;   7   |   1   |   _   |CONTROL|   2   | SPACE |COMMODR|   @   | STOP  | (56)
  14170. ;   8   | HELP  |   8   |   5   |  TAB  |   2   |   4   |   7   |   1   | (64)
  14171. ;   9   |  ESC  |   +   |   -   |  LF   | ENTER |   6   |   9   |   3   | (72)
  14172. ;  10   |  ALT  |   0   |   .   |  UP   | DOWN  | LEFT  | RIGHT |NO-SCRL| (80)
  14173. ;       +-------+-------+-------+-------+-------+-------+-------+-------+
  14174.  
  14175. keymapNormal = *
  14176.    db $14,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  14177.    db $33,$2c,$41,$34,$3a,$4f,$2e,$01  ;row 1
  14178.    db $35,$50,$45,$36,$4a,$55,$59,$51  ;row 2
  14179.    db $37,$46,$49,$38,$58,$44,$47,$4b  ;row 3
  14180.    db $39,$43,$48,$30,$4d,$54,$52,$42  ;row 4
  14181.    db $2b,$4c,$4e,$2d,$56,$53,$2f,$57  ;row 5
  14182.    db $5c,$2a,$3b,$13,$01,$3d,$5e,$5a  ;row 6
  14183.    db $31,$5f,$04,$32,$20,$02,$40,$03  ;row 7
  14184.    db $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  14185.    db $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  14186.    db $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  14187.  
  14188. keymapShift = *
  14189.    db $94,$8d,$9d,$8c,$89,$8a,$8b,$91  ;row 0
  14190.    db $23,$3c,$c1,$24,$5b,$cf,$3e,$01  ;row 1
  14191.    db $25,$d0,$c5,$26,$ca,$d5,$d9,$d1  ;row 2
  14192.    db $27,$c6,$c9,$28,$d8,$c4,$c7,$cb  ;row 3
  14193.    db $29,$c3,$c8,$30,$cd,$d4,$d2,$c2  ;row 4
  14194.    db $db,$cc,$ce,$dd,$d6,$d3,$3f,$d7  ;row 5
  14195.    db $dc,$c0,$5d,$93,$01,$3d,$de,$da  ;row 6
  14196.    db $21,$df,$04,$22,$20,$02,$40,$83  ;row 7
  14197.    db $84,$38,$35,$02,$32,$34,$37,$31  ;row 8
  14198.    db $0e,$2b,$2d,$07,$8d,$36,$39,$33  ;row 9
  14199.    db $08,$30,$2e,$16,$17,$06,$0b,$00  ;row 10
  14200.  
  14201. keymapCommodore = *
  14202.    db $08,$0d,$15,$8f,$80,$82,$8e,$0f  ;row 0
  14203.    db $96,$3c,$a1,$97,$bb,$af,$3e,$01  ;row 1
  14204.    db $98,$b0,$a5,$99,$aa,$b5,$b9,$b1  ;row 2
  14205.    db $9a,$a6,$a9,$9b,$b8,$a4,$a7,$ab  ;row 3
  14206.    db $29,$a3,$a8,$30,$ad,$b4,$b2,$a2  ;row 4
  14207.    db $2b,$ac,$ae,$2d,$b6,$b3,$3f,$b7  ;row 5
  14208.    db $bc,$2a,$bd,$93,$01,$3d,$be,$ba  ;row 6
  14209.    db $81,$bf,$04,$95,$5f,$02,$a0,$83  ;row 7
  14210.    db $84,$38,$35,$18,$32,$34,$37,$31  ;row 8
  14211.    db $1b,$2b,$2d,$07,$8d,$36,$39,$33  ;row 9
  14212.    db $08,$30,$2e,$0c,$0f,$10,$15,$00  ;row 10
  14213.  
  14214. keymapControl = *
  14215.    db $08,$01,$1a,$8f,$80,$82,$8e,$17  ;row 0
  14216.    db $1c,$2c,$e1,$9f,$fb,$ef,$2e,$01  ;row 1
  14217.    db $9c,$f0,$e5,$1e,$ea,$f5,$f9,$f1  ;row 2
  14218.    db $1f,$e6,$e9,$9e,$f8,$e4,$e7,$eb  ;row 3
  14219.    db $12,$e3,$e8,$92,$ed,$f4,$f2,$e2  ;row 4
  14220.    db $2b,$ec,$ee,$2d,$f6,$f3,$2f,$f7  ;row 5
  14221.    db $fc,$2a,$fd,$13,$01,$3d,$fe,$fa  ;row 6
  14222.    db $90,$ff,$04,$05,$20,$02,$e0,$03  ;row 7
  14223.    db $04,$8c,$87,$18,$89,$8a,$88,$85  ;row 8
  14224.    db $1b,$84,$8f,$0a,$00,$8b,$80,$86  ;row 9
  14225.    db $08,$82,$2e,$16,$17,$19,$1a,$00  ;row 10
  14226.  
  14227. keymapAlternate = *
  14228.    db $14,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  14229.    db $33,$2c,$61,$34,$7b,$6f,$2e,$01  ;row 1
  14230.    db $35,$70,$65,$36,$6a,$75,$79,$71  ;row 2
  14231.    db $37,$66,$69,$38,$78,$64,$67,$6b  ;row 3
  14232.    db $39,$63,$68,$30,$6d,$74,$72,$62  ;row 4
  14233.    db $2b,$6c,$6e,$2d,$76,$73,$2f,$77  ;row 5
  14234.    db $7c,$2a,$7d,$13,$01,$3d,$7e,$7a  ;row 6
  14235.    db $31,$7f,$04,$32,$20,$02,$60,$03  ;row 7
  14236.    db $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  14237.    db $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  14238.    db $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  14239.  
  14240. keymapCaps = *
  14241.    db $14,$0d,$1d,$88,$85,$86,$87,$11  ;row 0
  14242.    db $33,$2c,$c1,$34,$3a,$cf,$2e,$01  ;row 1
  14243.    db $35,$d0,$c5,$36,$ca,$d5,$d9,$d1  ;row 2
  14244.    db $37,$c6,$c9,$38,$d8,$c4,$c7,$cb  ;row 3
  14245.    db $39,$c3,$c8,$30,$cd,$d4,$d2,$c2  ;row 4
  14246.    db $2b,$cc,$ce,$2d,$d6,$d3,$2f,$d7  ;row 5
  14247.    db $5c,$2a,$3b,$13,$01,$3d,$5e,$da  ;row 6
  14248.    db $31,$5f,$04,$32,$20,$02,$40,$03  ;row 7
  14249.    db $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  14250.    db $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  14251.    db $08,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  14252.  
  14253. keymapShiftComm = *
  14254.    db $00,$00,$16,$00,$00,$00,$00,$17  ;row 0
  14255.    db $00,$00,$02,$00,$10,$00,$0b,$01  ;row 1
  14256.    db $00,$07,$1b,$00,$19,$00,$18,$00  ;row 2
  14257.    db $00,$00,$16,$00,$00,$0e,$00,$1a  ;row 3
  14258.    db $00,$00,$04,$00,$17,$09,$02,$06  ;row 4
  14259.    db $17,$0a,$0b,$16,$00,$15,$00,$0c  ;row 5
  14260.    db $00,$00,$15,$00,$01,$00,$00,$0f  ;row 6
  14261.    db $00,$1b,$04,$00,$00,$00,$00,$00  ;row 7
  14262.    db $04,$38,$35,$09,$32,$34,$37,$31  ;row 8
  14263.    db $1b,$2b,$2d,$0a,$0d,$36,$39,$33  ;row 9
  14264.    db $00,$30,$2e,$91,$11,$9d,$1d,$00  ;row 10
  14265. config.s
  14266. 1680
  14267. ;*** Configuration Program ***
  14268.  
  14269. .seq acehead.s
  14270. .seq kernhead.s
  14271. .org aceAppAddress
  14272. .obj "@0:config"
  14273.  
  14274. jmp main
  14275. .byte "c","F",aceID3
  14276. .byte 64,0
  14277.  
  14278. kernelSetlfs  = $ffba
  14279. kernelSetnam  = $ffbd
  14280. kernelOpen    = $ffc0
  14281. kernelClose   = $ffc3
  14282. kernelChkin   = $ffc6
  14283. kernelChkout  = $ffc9
  14284. kernelClrchn  = $ffcc
  14285. kernelChrin   = $ffcf
  14286. kernelLoad    = $ffd5
  14287. kernelSwapper = $ff5f
  14288. st = $90
  14289. totalBanks .buf 2
  14290. chrQuote = 34
  14291.  
  14292. configBuf    = 2   ;(2)
  14293. sysName      = 4   ;(2)
  14294. ram0FreeMap  = 6   ;(2)
  14295. aceEndPage   = 8   ;(1)
  14296. sysType      = 9   ;(1)
  14297. charset4bitP = 10  ;(2)
  14298. keymapAddr   = 12  ;(2)
  14299. memRead      = 16  ;(2)
  14300. memWrite     = 18  ;(2)
  14301. banks        = 20  ;(1)
  14302. bankLimit    = 21  ;(1)
  14303. save0        = 22  ;(2)
  14304. save2        = 24  ;(2)
  14305. saveN        = 26  ;(2)
  14306. cpfrom       = $60 ;(2)
  14307. cpto         = $62 ;(2)
  14308. indirectReuBanks = $64 ;(1)
  14309. loadCharsetNameP = $66 ;(2)
  14310. work             = $68 ;(8)
  14311. titlePtr     = $70 ;(2)
  14312. keymapName   = $72 ;(2)
  14313.  
  14314. main = *
  14315.    lda #0
  14316.    sta aceTotalMemory+0
  14317.    sta aceTotalMemory+1
  14318.    sta totalBanks+0
  14319.    sta totalBanks+1
  14320.    sta aceReuRlSpeedTry
  14321.    lda #aceMemNull
  14322.    sta aceReuRlSpeedPage+3
  14323.    lda #<title
  14324.    ldy #>title
  14325.    sta titlePtr+0
  14326.    sty titlePtr+1
  14327.    jsr loadConfig
  14328.    bcs +
  14329.    jsr loadCharset
  14330.    bcs +
  14331.    jsr loadKeymap
  14332.    bcs +
  14333.    jsr screenInit
  14334.    jsr setDate
  14335.    jsr displayDate
  14336.    jsr getRamlinkParms
  14337.    jsr internalMemory
  14338.    jsr reuMemory
  14339.    jsr rlMemory
  14340.    lda totalBanks+0
  14341.    ldy totalBanks+1
  14342.    sta aceTotalMemory+2
  14343.    sty aceTotalMemory+3
  14344.    jsr totalMemory
  14345.    ldx #3
  14346. -  lda aceFreeMemory,x
  14347.    sta aceTotalMemory,x
  14348.    dex
  14349.    bpl -
  14350.    clc
  14351.    lda #<title
  14352.    ldy #>title
  14353.    sta 2
  14354.    sty 3
  14355.    sec
  14356.    lda titlePtr+0
  14357.    sbc #<title
  14358.    sta 4
  14359.    lda titlePtr+1
  14360.    sbc #>title
  14361.    sta 5
  14362.    clc
  14363. +  rts
  14364.  
  14365. testMemoryType = *  ;( .A=type, .X=bankLimit ) : .A=bankCount
  14366.    sta mp+3
  14367.    stx bankLimit
  14368.    lda #$00
  14369.    ldy #$80  ;** page to use for testing ram
  14370.    ldx #$00
  14371.    sta mp+0
  14372.    sty mp+1
  14373.    stx mp+2
  14374.    lda #0
  14375.    sta banks
  14376.  
  14377.    nextBank = *
  14378.    lda banks
  14379.    sta mp+2
  14380.    jsr saveBank
  14381.    lda #$ff-$cb
  14382.    sta memWrite
  14383.    lda mp+2
  14384.    sta memWrite+1
  14385.    ldx #memWrite
  14386.    ldy #2
  14387.    jsr aceMemZpstore
  14388.    lda #$ff-$cb
  14389.    ldx mp+2
  14390.    jsr testBank
  14391.    bcs bankFail
  14392.    lda #$cb
  14393.    sta memWrite
  14394.    ldx #memWrite
  14395.    ldy #2
  14396.    jsr aceMemZpstore
  14397.    lda #$cb
  14398.    ldx mp+2
  14399.    jsr testBank
  14400.    bcs bankFail
  14401.    lda #$cb
  14402.    ldx #0
  14403.    jsr testBank
  14404.    bcs bankFail
  14405.    lda mp+2
  14406.    cmp #2
  14407.    bcc +
  14408.    lda #$cb
  14409.    ldx #2
  14410.    jsr testBank
  14411.    bcs bankFail
  14412. +  jsr restoreBank
  14413.    inc banks
  14414.    lda banks
  14415.    cmp bankLimit
  14416.    bcc nextBank
  14417.  
  14418.    bankFail = *
  14419.    jsr restoreWrapBanks
  14420.    lda banks
  14421.    rts
  14422.  
  14423. saveBank = *  ;()
  14424.    ldx #saveN
  14425.    ldy #2
  14426.    lda mp+2
  14427.    cmp #0
  14428.    bne +
  14429.    ldx #save0
  14430. +  cmp #2
  14431.    bne +
  14432.    ldx #save2
  14433. +  jsr aceMemZpload
  14434.    rts
  14435.  
  14436. restoreBank = *  ;()
  14437.    lda mp+2
  14438.    cmp #0
  14439.    beq +
  14440.    cmp #2
  14441.    beq +
  14442.    ldx #saveN
  14443.    ldy #2
  14444.    jsr aceMemZpstore
  14445. +  rts
  14446.  
  14447. restoreWrapBanks = *  ;()
  14448.    lda banks
  14449.    cmp #3
  14450.    bcc +
  14451. +  lda #2
  14452.    sta mp+2
  14453.    ldx #save2
  14454.    ldy #2
  14455.    jsr aceMemZpstore
  14456.    lda banks
  14457.    cmp #1
  14458.    bcc +
  14459.    lda #0
  14460.    sta mp+2
  14461.    ldx #save0
  14462.    ldy #2
  14463.    jsr aceMemZpstore
  14464. +  rts
  14465.  
  14466. rdVal  = 10  ;(1)
  14467. rdBank = 11  ;(1)
  14468.  
  14469. testBank = *  ;( .A=data, .X=bank ) : .CS=err
  14470.    sta rdVal
  14471.    lda mp+2
  14472.    sta rdBank
  14473.    stx mp+2
  14474.    lda #$ff
  14475.    sta memRead
  14476.    sta memRead+1
  14477.    ldx #memRead
  14478.    ldy #2
  14479.    jsr aceMemZpload
  14480.    lda memRead
  14481.    cmp rdVal
  14482.    bne +
  14483.    lda memRead+1
  14484.    cmp mp+2
  14485.    bne +
  14486.    lda rdBank
  14487.    sta mp+2
  14488.    clc 
  14489.    rts
  14490. +  lda rdBank
  14491.    sta mp+2
  14492.    sec
  14493.    rts
  14494.  
  14495. puts = *
  14496.    sta $40
  14497.    sty $41
  14498.    ldy #0
  14499. -  lda ($40),y
  14500.    beq +
  14501.    jsr chrout
  14502.    iny
  14503.    bne -
  14504.    inc $41
  14505.    bne -
  14506. +  rts
  14507.  
  14508. loadConfig = *
  14509.    lda #0
  14510.    ldx 186
  14511.    ldy #0
  14512.    jsr kernelSetlfs
  14513.    lda 1023
  14514.    cmp #1
  14515.    beq +
  14516.    ora #$30
  14517.    sta loadConfigName+6
  14518.    lda #7
  14519.    jmp ++
  14520. +  lda #6
  14521. +  ldx #<loadConfigName
  14522.    ldy #>loadConfigName
  14523.    jsr kernelSetnam
  14524.    lda #0
  14525.    ldx configBuf+0
  14526.    ldy configBuf+1
  14527.    jsr kernelLoad
  14528.    bcs +
  14529.    clc
  14530.    rts
  14531. +  lda #<badConfig
  14532.    ldy #>badConfig
  14533.    jsr puts
  14534.    sec
  14535.    rts
  14536.  
  14537.    loadConfigName = *
  14538.    .asc ".acerc0"
  14539.    badConfig = *
  14540.    .asc "Error attempting to b-load "
  14541.    .byte chrQuote
  14542.    .asc ".acerc"
  14543.    .byte chrQuote
  14544.    .asc ", aborting."
  14545.    .byte chrCR,0
  14546.  
  14547. loadCharset = *
  14548.    lda configBuf+0
  14549.    ldy configBuf+1
  14550.    iny
  14551.    clc
  14552.    adc #$e0
  14553.    bcc +
  14554.    iny
  14555. +  sta loadCharsetNameP+0
  14556.    sty loadCharsetNameP+1
  14557.    lda #0
  14558.    ldx 186
  14559.    ldy #0
  14560.    jsr kernelSetlfs
  14561.    ldy #$ff
  14562. -  iny
  14563.    lda (loadCharsetNameP),y
  14564.    bne -
  14565.    tya
  14566.    ldx loadCharsetNameP+0
  14567.    ldy loadCharsetNameP+1
  14568.    jsr kernelSetnam
  14569.    lda #0
  14570.    ldx #<charsetBuf
  14571.    ldy #>charsetBuf
  14572.    jsr kernelLoad
  14573.    bcc +
  14574.    lda #<badCharset
  14575.    ldy #>badCharset
  14576.    jsr puts
  14577.    lda loadCharsetNameP+0
  14578.    ldy loadCharsetNameP+1
  14579.    jsr puts
  14580.    lda #<badCharset2
  14581.    ldy #>badCharset2
  14582.    jsr puts
  14583.    sec
  14584. +  rts
  14585.  
  14586.    loadCharsetName = *
  14587.    .asc "acechr-commodore"
  14588.    .byte 0
  14589.    badCharset = *
  14590.    .asc "Error attempting to b-load "
  14591.    .byte chrQuote,0
  14592.    badCharset2 = *
  14593.    .byte chrQuote
  14594.    .asc ", aborting."
  14595.    .byte chrCR,0
  14596.  
  14597. loadKeymap = *
  14598.    lda #0
  14599.    ldx 186
  14600.    ldy #0
  14601.    jsr kernelSetlfs
  14602.    lda configBuf+0
  14603.    ldy configBuf+1
  14604.    iny
  14605.    clc
  14606.    adc #$20
  14607.    bcc +
  14608.    iny
  14609. +  sta keymapName+0
  14610.    sty keymapName+1
  14611.    ldy #$ff
  14612. -  iny
  14613.    lda (keymapName),y
  14614.    bne -
  14615.    tya
  14616.    bne +
  14617.    rts
  14618. +  ldx keymapName+0
  14619.    ldy keymapName+1
  14620.    jsr kernelSetnam
  14621.    lda #0
  14622.    ldx keymapAddr+0
  14623.    ldy keymapAddr+1
  14624.    jsr kernelLoad
  14625.    bcs +
  14626.    clc
  14627.    rts
  14628. +  lda #<badKeymap
  14629.    ldy #>badKeymap
  14630.    jsr puts
  14631.    sec
  14632.    rts
  14633.  
  14634.    badKeymap = *
  14635.    .asc "Error attempting to b-load keymap file"
  14636.    .asc ", aborting."
  14637.    .byte chrCR,0
  14638.  
  14639. screenInit = *
  14640.    lda #147
  14641.    jsr $ffd2
  14642.    lda sysName+0
  14643.    ldy sysName+1
  14644.    jsr puts
  14645.    rts
  14646.  
  14647. displayDate = *
  14648.    lda #<dateBuf
  14649.    ldy #>dateBuf
  14650.    jsr aceTimeGetDate
  14651.    ;** year
  14652.    lda dateBuf+0
  14653.    ldx #11
  14654.    jsr putDigits
  14655.    lda dateBuf+1
  14656.    ldx #13
  14657.    jsr putDigits
  14658.    ;** month
  14659.    lda dateBuf+2
  14660.    cmp #$10
  14661.    bcc +
  14662.    sec
  14663.    sbc #$10-10
  14664. +  tax
  14665.    lda monthStr+0,x
  14666.    sta dateStr+7
  14667.    lda monthStr+13,x
  14668.    sta dateStr+8
  14669.    lda monthStr+26,x
  14670.    sta dateStr+9
  14671.    ;** day
  14672.    lda dateBuf+3
  14673.    ldx #4
  14674.    jsr putDigits
  14675.    ;** hour
  14676.    lda dateBuf+4
  14677.    ldx #"a"
  14678.    cmp #$00
  14679.    bne +
  14680.    lda #$12
  14681.    jmp putHour
  14682. +  cmp #$12
  14683.    bcc putHour
  14684.    ldx #"p"
  14685.    cmp #$12
  14686.    beq putHour
  14687.    sei
  14688.    sed
  14689.    sec
  14690.    sbc #$12
  14691.    cld
  14692.    cli
  14693.    putHour = *
  14694.    stx dateStr+26
  14695.    ldx #17
  14696.    jsr putDigits
  14697.    ;** minute
  14698.    lda dateBuf+5
  14699.    ldx #20
  14700.    jsr putDigits
  14701.    ;** second
  14702.    lda dateBuf+6
  14703.    ldx #23
  14704.    jsr putDigits
  14705.    ;** day of week
  14706.    lda dateBuf+7
  14707.    and #$07
  14708.    tax
  14709.    lda dowStr+0,x
  14710.    sta dateStr+0
  14711.    lda dowStr+8,x
  14712.    sta dateStr+1
  14713.    lda dowStr+16,x
  14714.    sta dateStr+2
  14715.    lda #<dateStr
  14716.    ldy #>dateStr
  14717.    jsr puts
  14718.    rts
  14719.  
  14720.    putDigits = *  ;( .A=num, .X=offset )
  14721.    pha
  14722.    lsr
  14723.    lsr
  14724.    lsr
  14725.    lsr
  14726.    ora #$30
  14727.    sta dateStr,x
  14728.    pla
  14729.    and #$0f
  14730.    ora #$30
  14731.    sta dateStr+1,x
  14732.    rts
  14733.  
  14734.    dateStr = *
  14735.         ;0123456789012345678901234567
  14736.    .asc "Tue-05-May-1993  11:34:12 pm"
  14737.    .byte 13,13,0
  14738.    dateBuf .buf 16
  14739.    dowStr = *
  14740.    .asc "SMTWTFSX"
  14741.    .asc "uouehrax"
  14742.    .asc "nneduitx"
  14743.    monthStr = *
  14744.    .asc "XJFMAMJJASOND"
  14745.    .asc "xaeapauuuecoe"
  14746.    .asc "xnbrrynlgptvc"
  14747.  
  14748. tryDate = 10
  14749.  
  14750. setDate = *
  14751.    ldy #$82
  14752. -  sty tryDate
  14753.    lda (configBuf),y
  14754.    cmp #$ff
  14755.    beq dateQueryNext
  14756.    cmp #$fe
  14757.    bne +
  14758.    jmp dateTrySmartWatch
  14759. +  jsr cmdOpen
  14760.    bcs dateQueryNext
  14761.    lda #<queryDateStr
  14762.    ldy #>queryDateStr
  14763.    jsr cmdSend
  14764.    bcs queryError
  14765.    lda #<dateBuf
  14766.    ldy #>dateBuf
  14767.    ldx #9
  14768.    jsr cmdData
  14769.    bcs queryError
  14770.    jsr cmdClose
  14771.    jmp convertCmdDate
  14772.  
  14773.    queryError = *
  14774.    jsr cmdClose
  14775.    dateQueryNext = *
  14776.    inc tryDate
  14777.    ldy tryDate
  14778.    cpy #$86
  14779.    bcc -
  14780.    jmp setDefaultDate
  14781.  
  14782.    queryDateStr = *
  14783.    .asc "t-rb"
  14784.    .byte 13,0
  14785.  
  14786. convertCmdDate = *
  14787.    lda dateBuf+4
  14788.    ldx dateBuf+7
  14789.    beq +
  14790.    sei
  14791.    sed
  14792.    clc
  14793.    adc #$12
  14794.    cld
  14795.    cli
  14796. +  cmp #$12
  14797.    bne +
  14798.    lda #$00
  14799. +  cmp #$24
  14800.    bne +
  14801.    lda #$12
  14802. +  sta dateBuf+4
  14803.    clc
  14804.    lda dateBuf+0
  14805.    adc #$50
  14806.    sta dateBuf+7
  14807.    ldx #$19
  14808.    lda dateBuf+1
  14809.    cmp #$70
  14810.    bcs +
  14811.    ldx #$20
  14812. +  stx dateBuf+0
  14813.    lda #<dateBuf
  14814.    ldy #>dateBuf
  14815.    jsr aceTimeSetDate
  14816.    rts
  14817.  
  14818. setDefaultDate = *
  14819.    ldy #$90
  14820.    ldx #0
  14821. -  lda (configBuf),y
  14822.    sta dateBuf,x
  14823.    inx
  14824.    iny
  14825.    cpy #$9c
  14826.    bcc -
  14827.    lda dateBuf+7
  14828.    and #$f0
  14829.    sta dateBuf+7
  14830.    lda dateBuf+8
  14831.    and #$0f
  14832.    ora dateBuf+7
  14833.    sta dateBuf+7
  14834.    lda #<dateBuf
  14835.    ldy #>dateBuf
  14836.    jmp aceTimeSetDate
  14837.  
  14838. cmdOpen = *  ;( .A=device ) : .CS=err
  14839.    tax
  14840.    lda #6
  14841.    ldy #15
  14842.    jsr kernelSetlfs
  14843.    lda #0
  14844.    jsr kernelSetnam
  14845.    jsr kernelOpen
  14846.    rts
  14847.  
  14848. cmdClose = *  ;()
  14849.    clc
  14850.    lda #6
  14851.    jsr kernelClose
  14852.    rts
  14853.  
  14854. cmdSend = *  ;( (.AY)=cmdStrZ ) : .CS=err
  14855.    sta $40
  14856.    sty $41
  14857.    ldx #6
  14858.    jsr kernelChkout
  14859.    bcc +
  14860.    rts
  14861. +  ldy #0
  14862. -  lda ($40),y
  14863.    beq +
  14864.    jsr $ffd2
  14865.    iny
  14866.    bne -
  14867. +  jsr kernelClrchn
  14868.    clc
  14869.    rts
  14870.  
  14871. cmdData = *  ;( (.AY)=cmdBuf, .X=len ) : .CS=err
  14872.    sta $40
  14873.    sty $41
  14874.    stx $42
  14875.    ldx #6
  14876.    jsr kernelChkin
  14877.    bcc +
  14878.    rts
  14879. +  ldx #0
  14880.    jsr kernelChrin
  14881.    cmp #"0"
  14882.    bcc ++
  14883.    cmp #"9"+1
  14884.    bcs ++
  14885.    badData = *
  14886. -  jsr kernelChrin
  14887.    bcs +
  14888.    bit st
  14889.    bvs +
  14890.    cmp #13
  14891.    bne -
  14892. +  jsr kernelClrchn
  14893.    sec
  14894.    rts
  14895. +  ldy #0
  14896.    sta ($40),y
  14897.    iny
  14898. -  jsr kernelChrin
  14899.    sta ($40),y 
  14900.    iny
  14901.    cpy $42
  14902.    bcc -
  14903.    cmp #13
  14904.    bne badData
  14905.    jsr kernelClrchn
  14906.    clc
  14907.    rts
  14908.  
  14909. getRlParmReuBanks  .buf 1
  14910.  
  14911. getRamlinkParms = *
  14912.    ldy #$80
  14913.    lda (configBuf),y
  14914.    jsr cmdOpen
  14915.    bcs rlParmsError
  14916.  
  14917.    ;** ramlink ram access
  14918.    lda #<partRlCmd
  14919.    ldy #>partRlCmd
  14920.    jsr cmdSend
  14921.    bcs rlParmsError
  14922.    lda #<rlIdent
  14923.    ldy #>rlIdent
  14924.    jsr checkPartition
  14925.    bcs +
  14926.    sta aceRamlinkStart+0
  14927.    sty aceRamlinkStart+1
  14928.    stx aceRamlinkBanks
  14929.    jsr rlReuPhysSize  ;returns .A=reu banks in ram-port
  14930.    sta aceReuRlSpeedTry
  14931.    cmp #0
  14932.    beq +
  14933.    sta getRlParmReuBanks
  14934.    sec
  14935.    lda aceRamlinkStart+1
  14936.    sbc getRlParmReuBanks
  14937.    sta aceRamlinkStart+1
  14938.    lda #$ff
  14939.    sta aceReuRlSpeedTry
  14940.  
  14941.    ;** indirect reu access
  14942. +  lda #<partRlreuCmd
  14943.    ldy #>partRlreuCmd
  14944.    jsr cmdSend
  14945.    bcs rlParmsError
  14946.    lda #<rlreuIdent
  14947.    ldy #>rlreuIdent
  14948.    jsr checkPartition
  14949.    bcs rlParmsError
  14950.    stx indirectReuBanks
  14951.  
  14952.    rlParmsError = *
  14953.    jsr cmdClose
  14954.    rts
  14955.  
  14956. checkPartition = *  ;( (.AY)=name ) : .CS=err, .AY=start, .X=banks
  14957.    sta $44
  14958.    sty $45
  14959.    lda #<partitionBuf
  14960.    ldy #>partitionBuf
  14961.    ldx #31
  14962.    jsr cmdData
  14963.    bcs checkErrExit
  14964.    lda partitionBuf+0
  14965.    cmp #7
  14966.    bne checkErrExit
  14967.    ldy #0
  14968. -  lda ($44),y
  14969.    beq +
  14970.    cmp partitionBuf+3,y
  14971.    bne checkErrExit
  14972.    iny
  14973.    bne -
  14974. +  lda partitionBuf+21
  14975.    ldy partitionBuf+20
  14976.    ldx partitionBuf+28
  14977.    clc
  14978.    rts
  14979.  
  14980.    checkErrExit = *
  14981.    sec
  14982.    rts
  14983.  
  14984. partRlCmd = *
  14985.    .asc "g-p"
  14986.    .byte 31,0
  14987. rlIdent = *
  14988.    .asc "rl-ram"
  14989.    .byte $a0,0
  14990. partRlreuCmd = *
  14991.    .asc "g-p"
  14992.    .byte 30,0
  14993. rlreuIdent = *
  14994.    .asc "indirect-reu"
  14995.    .byte $a0,0
  14996. partitionBuf .buf 35
  14997.  
  14998. putnum = *  ;( [$44]=num, .A=width )
  14999.    pha
  15000.    lda #<outchar
  15001.    ldy #>outchar
  15002.    sta zp+0
  15003.    sty zp+1
  15004.    ldx #$44
  15005.    pla
  15006.    jsr aceMiscUtoa
  15007.    jsr putcomma
  15008.    ldx #0
  15009. -  lda outchar,x
  15010.    beq +
  15011.    jsr chrout
  15012.    inx
  15013.    bne -
  15014. +  rts
  15015.    outchar .buf 16
  15016.  
  15017. putcomma = *  ;( outchar )
  15018.    ldx #$ff
  15019. -  inx
  15020.    lda outchar,x
  15021.    bne -
  15022. -  dex
  15023.    dex
  15024.    dex
  15025.    dex
  15026.    cpx #$80
  15027.    bcc +
  15028.    rts
  15029. +  cpx #0
  15030.    bcs +
  15031.    rts
  15032. +  lda outchar,x
  15033.    cmp #" "
  15034.    bne +
  15035.    rts
  15036. +  stx $44
  15037.    ldy #0
  15038. -  lda outchar+1,y
  15039.    sta outchar,y
  15040.    iny
  15041.    cpy $44
  15042.    bcc -
  15043.    lda #"_"
  15044.    sta outchar,y
  15045.    jmp --
  15046.    rts
  15047.  
  15048. displayAvail = *  ;( (.AY)=name, (.X,$45)=banks )
  15049.    sta $40
  15050.    sty $41
  15051.    stx $44
  15052.    ldy #0
  15053. -  lda ($40),y
  15054.    jsr chrout
  15055.    iny
  15056.    cpy #6
  15057.    bcc -
  15058.    lda #":"
  15059.    jsr chrout
  15060.    txa
  15061.    clc
  15062.    adc totalBanks
  15063.    sta totalBanks
  15064.    lda $45
  15065.    adc totalBanks+1
  15066.    sta totalBanks+1
  15067.    lda #0
  15068.    sta $46
  15069.    sta $47
  15070.    ldx #6
  15071. -  asl $44
  15072.    rol $45
  15073.    rol $46
  15074.    rol $47
  15075.    dex
  15076.    bne -
  15077.    lda #7
  15078.    jsr putnum
  15079.    lda #"K"
  15080.    jsr chrout
  15081.    rts
  15082.  
  15083. addToFree = *  ;( [$44]=bytes )
  15084.    clc
  15085.    lda $44
  15086.    adc aceFreeMemory+0
  15087.    sta aceFreeMemory+0
  15088.    lda $45
  15089.    adc aceFreeMemory+1
  15090.    sta aceFreeMemory+1
  15091.    lda $46
  15092.    adc aceFreeMemory+2
  15093.    sta aceFreeMemory+2
  15094.    bcc +
  15095.    inc aceFreeMemory+3
  15096. +  rts
  15097.  
  15098. displayFree = *  ;( [$44]=bytes )
  15099.    lda #<freeMsg
  15100.    ldy #>freeMsg
  15101.    jsr puts
  15102.    lda #11
  15103.    jsr putnum
  15104.    lda #13
  15105.    jsr chrout
  15106.    rts
  15107.    freeMsg = *
  15108.    .asc "   free:"
  15109.    .byte 0
  15110.  
  15111. resetFree = *
  15112.    lda #0
  15113.    ldx #3
  15114. -  sta $44,x
  15115.    dex
  15116.    bpl -
  15117.    rts
  15118.  
  15119. internalMemory = *
  15120.    lda #aceMemInternal
  15121.    ldx #255
  15122.    sei
  15123.    jsr testMemoryType
  15124.    cli
  15125.    sta aceInternalBanks
  15126.    pha
  15127.    jsr installInternVectors
  15128.    pla
  15129.    tax
  15130.    lda #0
  15131.    sta $45
  15132.    lda #<internalName
  15133.    ldy #>internalName
  15134.    jsr displayAvail
  15135.    jsr resetFree
  15136.  
  15137.    ;** ram0
  15138.    lda #aceMemInternal
  15139.    sta mp+3
  15140.    lda #0
  15141.    sta aceInternalCur
  15142.    lda ram0FreeMap+0
  15143.    ldy ram0FreeMap+1
  15144.    sta aceRam0Freemap+0
  15145.    sty aceRam0Freemap+1
  15146.    ldx #0
  15147.    sta mp+0
  15148.    sty mp+1
  15149.    stx mp+2
  15150.    ldy #$a3
  15151.    bit sysType
  15152.    bmi +
  15153.    ldy #$c1
  15154. +  lda (configBuf),y
  15155.    tay
  15156.    lda #1
  15157.    ldx #>aceAppAddress
  15158.    jsr initBanks
  15159.    jsr freeRam0AfterKernel
  15160.  
  15161.    ;** ram1
  15162.    bit sysType
  15163.    bpl expInternal64
  15164.    lda #$00
  15165.    sta mp+0
  15166.    ldy #$a0
  15167.    lda (configBuf),y
  15168.    sta mp+1
  15169.    sta aceRam1Freemap
  15170.    lda #1
  15171.    sta mp+2
  15172.    ldy #$a1
  15173.    lda (configBuf),y
  15174.    tay
  15175.    lda #2
  15176.    ldx mp+1
  15177.    inx
  15178.    jsr initBanks
  15179.  
  15180.    ;** ram2-7 c128
  15181.    expInternal128 = *
  15182.    lda #2
  15183.    sta mp+2
  15184.    lda #$00
  15185.    ldy #$04
  15186.    sta mp+0
  15187.    sty mp+1
  15188.    ldy #$a5
  15189.    lda (configBuf),y
  15190.    ldx aceInternalBanks
  15191.    jsr min
  15192.    sta aceInternalBanks
  15193.    ldx #$05
  15194.    ldy #$ff
  15195.    jsr initBanks
  15196.    jsr addToFree
  15197.    jsr displayFree
  15198.    rts
  15199.  
  15200.    ;** ram1-3 c64
  15201.    expInternal64 = *
  15202.    lda #1
  15203.    sta aceInternalBanks
  15204.    jsr addToFree
  15205.    jsr displayFree
  15206.    rts
  15207.  
  15208.    internalName = *
  15209.    .asc "intern"
  15210.  
  15211. freeRam0AfterKernel = *
  15212.    ;** free end.kernel->st.app
  15213.    ldy aceEndPage
  15214.    cpy #>aceAppAddress
  15215.    bcs +
  15216.    lda #$00
  15217. -  sta (ram0FreeMap),y
  15218.    iny
  15219.    cpy #>aceAppAddress
  15220.    bcc -
  15221. +  sec
  15222.    lda #>aceAppAddress
  15223.    sbc aceEndPage
  15224.    sta $40
  15225.    clc
  15226.    lda $45
  15227.    adc $40
  15228.    sta $45
  15229.    bcc +
  15230.    inc $46
  15231.    bne +
  15232.    inc $47
  15233. +  rts
  15234.  
  15235. installInternVectors = *
  15236.    bit sysType
  15237.    bpl installVectors64
  15238.    lda aceInternalBanks
  15239.    cmp #2
  15240.    bcs +
  15241.    rts
  15242. +  sei
  15243.    lda #2
  15244.    ldy #aceMemInternal
  15245.    sta mp+2
  15246.    sty mp+3
  15247. -  lda #$05
  15248.    ldy #$ff
  15249.    sta mp+0
  15250.    sty mp+1
  15251.    sta zp+0
  15252.    sty zp+1
  15253.    lda #<251
  15254.    ldy #>251
  15255.    jsr aceMemStash
  15256.    inc mp+2
  15257.    lda mp+2
  15258.    cmp aceInternalBanks
  15259.    bcc -
  15260.    cli
  15261.    rts
  15262.  
  15263. installVectors64 = *
  15264.    ;xx copy to exp banks
  15265.    rts
  15266.  
  15267. ram0HiMemPtr .buf 1
  15268.  
  15269. reserveRam0HiMem = *
  15270.    lda #$ff
  15271.    sta ram0HiMemPtr
  15272.    jsr reserveVic80
  15273.    lda ram0HiMemPtr
  15274.    cmp #$ff
  15275.    beq +
  15276.    jsr reserveCharSet
  15277.    jsr reserveVic40
  15278.    jsr reserveModem
  15279.    jmp ++
  15280. +  jsr reserveDymem
  15281.    jsr reserveVic40
  15282.    jsr reserveCharSet
  15283.    jsr reserveModem
  15284. +  nop
  15285.    rts
  15286.  
  15287. reserveVic80 = *
  15288.    lda #$00
  15289.    sta aceSoft80Allocated
  15290.    bit sysType
  15291.    bvs +
  15292. -  rts
  15293. +  ldy #$c0
  15294.    lda (configBuf),y
  15295.    bpl -
  15296.    lda #$fc
  15297.    ldy #$d8
  15298. -  sta (ram0FreeMap),y
  15299.    iny
  15300.    cpy #$ff
  15301.    bcc -
  15302.    sec
  15303.    lda aceFreeMemory+1
  15304.    sbc #$ff-$d8
  15305.    sta aceFreeMemory+1
  15306.    lda aceFreeMemory+2
  15307.    sbc #0
  15308.    sta aceFreeMemory+2
  15309.    lda aceFreeMemory+3
  15310.    sbc #0
  15311.    sta aceFreeMemory+3
  15312.    lda #$d8
  15313.    sta ram0HiMemPtr
  15314.    lda #$ff
  15315.    sta aceSoft80Allocated
  15316.    rts
  15317.  
  15318. reserveCharSet = *
  15319.    sec
  15320.    lda ram0HiMemPtr
  15321.    sbc #>2048
  15322.    tax
  15323.    tay
  15324.    sta aceCharSetPage
  15325.    lda #$fc
  15326. -  sta (ram0FreeMap),y
  15327.    iny
  15328.    cpy ram0HiMemPtr
  15329.    bcc -
  15330.    stx ram0HiMemPtr
  15331.    sec
  15332.    lda aceFreeMemory+1
  15333.    sbc #>2048
  15334.    sta aceFreeMemory+1
  15335.    lda aceFreeMemory+2
  15336.    sbc #0
  15337.    sta aceFreeMemory+2
  15338.    lda aceFreeMemory+3
  15339.    sbc #0
  15340.    sta aceFreeMemory+3
  15341.    rts
  15342.  
  15343. reserveVic40 = *
  15344.    sec
  15345.    lda ram0HiMemPtr
  15346.    sbc #>1024
  15347.    tax
  15348.    tay
  15349.    sta aceVic40Page
  15350.    lda #$fc
  15351. -  sta (ram0FreeMap),y
  15352.    iny
  15353.    cpy ram0HiMemPtr
  15354.    bcc -
  15355.    stx ram0HiMemPtr
  15356.    sec
  15357.    lda aceFreeMemory+1
  15358.    sbc #>1024
  15359.    sta aceFreeMemory+1
  15360.    lda aceFreeMemory+2
  15361.    sbc #0
  15362.    sta aceFreeMemory+2
  15363.    lda aceFreeMemory+3
  15364.    sbc #0
  15365.    sta aceFreeMemory+3
  15366.    rts
  15367.  
  15368. reserveModem = *
  15369.    ;aceModemSendPage  = aceStatB+105 ;(1)
  15370.    ;aceModemRecvPage  = aceStatB+106 ;(1)
  15371.    ;aceModemRecvHigh  = aceStatB+107 ;(1)
  15372.    ;aceModemType      = aceStatB+108 ;(1)  ;$ff=swifty,$40=user-port,$00=none
  15373.    ;aceModemIoPage    = aceStatB+109 ;(1)
  15374.    ;aceModemConfig    = aceStatB+113 ;(1)
  15375.    lda #$00
  15376.    sta aceModemType
  15377.    ldy #0
  15378. -  lda (configBuf),y
  15379.    cmp #6
  15380.    beq +
  15381.    tya
  15382.    clc
  15383.    adc #4
  15384.    tay
  15385.    cpy #$80
  15386.    bcc -
  15387.    rts
  15388. +  lda #$ff
  15389.    sta aceModemType
  15390.    iny
  15391.    lda (configBuf),y
  15392.    sta aceModemIoPage
  15393.    iny
  15394.    iny
  15395.    lda (configBuf),y
  15396.    sta aceModemConfig
  15397.    dec ram0HiMemPtr
  15398.    lda ram0HiMemPtr
  15399.    sta aceModemSendPage
  15400.    sta aceModemRecvHigh
  15401.    inc ram0HiMemPtr
  15402.    dey
  15403.    lda (configBuf),y
  15404.    sta modemPagesM1
  15405.    clc ;minus extra 1
  15406.    lda ram0HiMemPtr
  15407.    sbc (configBuf),y
  15408.    tax
  15409.    tay
  15410.    sta aceModemRecvPage
  15411.    lda #$fc
  15412. -  sta (ram0FreeMap),y
  15413.    iny
  15414.    cpy ram0HiMemPtr
  15415.    bcc -
  15416.    stx ram0HiMemPtr
  15417.    clc
  15418.    lda aceFreeMemory+1
  15419.    sbc modemPagesM1
  15420.    sta aceFreeMemory+1
  15421.    lda aceFreeMemory+2
  15422.    sbc #0
  15423.    sta aceFreeMemory+2
  15424.    lda aceFreeMemory+3
  15425.    sbc #0
  15426.    sta aceFreeMemory+3
  15427.    rts
  15428.  
  15429.    modemPagesM1 .buf 1
  15430.  
  15431. reserveDymem = *
  15432.    sec
  15433.    lda ram0HiMemPtr
  15434.    sbc #>768
  15435.    sta ram0HiMemPtr
  15436.    rts
  15437.  
  15438. reserveTPA = *
  15439.    ldy #$a8
  15440.    ldx #$c0
  15441.    bit sysType
  15442.    bmi +
  15443.    ldy #$c6
  15444.    ldx #$d0
  15445. +  lda (configBuf),y
  15446.    cmp ram0HiMemPtr
  15447.    bcc +
  15448.    lda ram0HiMemPtr
  15449. +  stx $40
  15450.    cmp $40
  15451.    bcc +
  15452.    lda $40
  15453. +  sta $40
  15454.    sta aceTpaLimit
  15455.    ldy #>aceAppAddress
  15456.    lda #$fe
  15457.    cpy $40
  15458.    bcs +
  15459. -  sta (ram0FreeMap),y
  15460.    iny
  15461.    cpy $40
  15462.    bcc -
  15463. +  sec
  15464.    lda $40
  15465.    sbc #>aceAppAddress
  15466.    sta $40
  15467.    sec
  15468.    lda aceFreeMemory+1
  15469.    sbc $40
  15470.    sta aceFreeMemory+1
  15471.    lda aceFreeMemory+2
  15472.    sbc #0
  15473.    sta aceFreeMemory+2
  15474.    lda aceFreeMemory+3
  15475.    sbc #0
  15476.    sta aceFreeMemory+3
  15477.    rts
  15478.  
  15479. reuBleedSaveBuf .buf 16
  15480.  
  15481. reuBleedSave = *
  15482.    bit sysType
  15483.    bpl +
  15484.    lda #$3f
  15485.    sta $ff00
  15486.    jmp ++
  15487. +  lda #$30
  15488.    sta $01
  15489. +  nop
  15490.    ldx #15
  15491. -  lda $df00,x
  15492.    sta reuBleedSaveBuf,x
  15493.    dex
  15494.    bpl -
  15495.    bit sysType
  15496.    bpl +
  15497.    lda #$0e
  15498.    sta $ff00
  15499.    jmp ++
  15500. +  lda #$36
  15501.    sta $01
  15502. +  nop
  15503.    rts
  15504.  
  15505. reuBleedRestore = *
  15506.    bit sysType
  15507.    bpl +
  15508.    lda #$3f
  15509.    sta $ff00
  15510.    jmp ++
  15511. +  lda #$30
  15512.    sta $01
  15513. +  ldx #15
  15514. -  lda reuBleedSaveBuf,x
  15515.    sta $df00,x
  15516.    dex
  15517.    bpl -
  15518.    bit sysType
  15519.    bpl +
  15520.    lda #$0e
  15521.    sta $ff00
  15522.    jmp ++
  15523. +  lda #$36
  15524.    sta $01
  15525. +  nop
  15526.    rts
  15527.  
  15528. reuMemory = *
  15529.    lda #$00
  15530.    sta aceRamlinkAccess
  15531.    jsr reuBleedSave
  15532.    lda #aceMemREU
  15533.    ldx #255
  15534.    jsr testMemoryType
  15535.    pha
  15536.    jsr reuBleedRestore
  15537.    lda #0
  15538.    sta $45
  15539.    pla
  15540.    sta aceReuBanks
  15541.    tax
  15542.    bne +
  15543.    lda indirectReuBanks
  15544.    beq +
  15545.    sta aceReuBanks
  15546.    tax
  15547.    lda #$ff
  15548.    sta aceRamlinkAccess
  15549.    lda #<rlreuName
  15550.    ldy #>rlreuName
  15551.    jmp ++
  15552. +  lda #<reuName
  15553.    ldy #>reuName
  15554. +  jsr displayAvail
  15555.    jsr resetFree
  15556.    lda #aceMemREU
  15557.    sta mp+3
  15558.    ldy #$a6
  15559.    bit sysType
  15560.    bmi +
  15561.    ldy #$c2
  15562. +  lda (configBuf),y
  15563.    sta aceReuStart
  15564.    sta aceReuCur
  15565.    ldy #$a7
  15566.    bit sysType
  15567.    bmi +
  15568.    ldy #$c3
  15569. +  lda (configBuf),y
  15570.    ldx aceReuBanks
  15571.    jsr min
  15572.    sta aceReuBanks
  15573.    lda #$00
  15574.    ldy #$ff
  15575.    ldx aceReuStart
  15576.    sta mp+0
  15577.    sty mp+1
  15578.    stx mp+2
  15579.    lda aceReuBanks
  15580.    ldx #$00
  15581.    ldy #$ff
  15582.    jsr initBanks
  15583.    jsr addToFree
  15584.    jsr displayFree
  15585.    rts
  15586.    reuName = *
  15587.    .asc "reu   "
  15588.    rlreuName = *
  15589.    .asc "rl-reu"
  15590.  
  15591. rlMemory = *
  15592.    ldx aceRamlinkBanks
  15593.    lda #0
  15594.    sta $45
  15595.    lda #<rlName
  15596.    ldy #>rlName
  15597.    jsr displayAvail
  15598.    jsr resetFree
  15599.    ldy #$81
  15600.    lda (configBuf),y
  15601.    ldx aceRamlinkBanks
  15602.    jsr min
  15603.    sta aceRamlinkBanks
  15604.    lda #aceMemRL
  15605.    sta mp+3
  15606.    lda #$00
  15607.    ldy #$ff
  15608.    ldx #0
  15609.    stx aceRamlinkCur
  15610.    sta mp+0
  15611.    sty mp+1
  15612.    stx mp+2
  15613.    lda aceRamlinkBanks
  15614.    ldx #$00
  15615.    ldy #$ff
  15616.    jsr initBanks
  15617.    jsr addToFree
  15618.    jsr displayFree
  15619.    rts
  15620.    rlName = *
  15621.    .asc "rl-ram"
  15622.  
  15623. totalMemory = *
  15624.    ldx totalBanks
  15625.    lda totalBanks+1
  15626.    sta $45
  15627.    lda #<totalName
  15628.    ldy #>totalName
  15629.    jsr displayAvail
  15630.    ldx #3
  15631. -  lda aceFreeMemory,x
  15632.    sta $44,x
  15633.    dex
  15634.    bpl -
  15635.    jsr displayFree
  15636.    lda #13
  15637.    jsr chrout
  15638.    jsr reserveRam0HiMem
  15639.    jsr reserveTPA
  15640.    rts
  15641.    totalName = *
  15642.    .asc "total "
  15643.    rts
  15644.  
  15645. endBank   = 10  ;(1)
  15646. startFree = 11  ;(1)
  15647. endFree   = 12  ;(1)
  15648.  
  15649. initBanks = *  ;( [mp]=firstFreemap, .A=endBank+1, .X=startFree, .Y=endFree+1 )
  15650.    sta endBank
  15651.    stx startFree
  15652.    sty endFree
  15653.    lda #<freemap
  15654.    ldy #>freemap
  15655.    sta zp+0
  15656.    sty zp+1
  15657.    ldx #0
  15658.    lda #$ff
  15659. -  sta freemap,x
  15660.    inx
  15661.    bne -
  15662.    ldx startFree
  15663.    cpx endFree
  15664.    bcs freeNextBank
  15665.    lda #$00
  15666. -  sta freemap,x
  15667.    inx
  15668.    cpx endFree
  15669.    bcc -
  15670.  
  15671.    freeNextBank = *
  15672.    lda mp+2
  15673.    cmp endBank
  15674.    bcs +
  15675.    lda #<256
  15676.    ldy #>256
  15677.    jsr aceMemStash
  15678.    inc mp+2
  15679.    sec
  15680.    lda endFree
  15681.    sbc startFree
  15682.    clc
  15683.    adc $45
  15684.    sta $45
  15685.    bcc freeNextBank
  15686.    inc $46
  15687.    bne freeNextBank
  15688.    inc $47
  15689.    jmp freeNextBank
  15690. +  rts
  15691.  
  15692. min = *  ;( .A=num1, .X=num2 ) : .A=min
  15693.    stx $40
  15694.    cmp $40
  15695.    bcc +
  15696.    lda $40
  15697. +  rts
  15698.  
  15699. chroutSave .buf 1
  15700.  
  15701. chrout = *
  15702.    jsr $ffd2
  15703.    sty chroutSave
  15704.    ldy #0
  15705.    sta (titlePtr),y
  15706.    inc titlePtr+0
  15707.    bne +
  15708.    inc titlePtr+1
  15709. +  ldy chroutSave
  15710.    clc
  15711.    rts
  15712.  
  15713. rlReuPhysSize = *  ;( ) : .A=reu banks in ram-port
  15714.    sei
  15715.    lda #$ff
  15716.    sta aceRamlinkAccess
  15717.    jsr reuBleedSave
  15718.    lda #aceMemREU
  15719.    ldx #255
  15720.    jsr testMemoryType
  15721.    pha
  15722.    jsr reuBleedRestore
  15723.    pla
  15724.    sta 1022
  15725.    ldx #$00
  15726.    stx aceRamlinkAccess
  15727.    cli
  15728.    rts
  15729.  
  15730. ;=== smart-watch stuff ===
  15731.  
  15732. ;*** adapted from:
  15733. ;***
  15734. ;*** swread v1.00: SmartWatch reader
  15735. ;*** by Randy Weems  -  20-Mar-1995
  15736. ;*** 
  15737. ;*** Read SmartWatch connected to joystick port 1
  15738. ;*** and set system date/time.
  15739.  
  15740. dateTrySmartWatch = *
  15741.    jsr swMain
  15742.    bcs +
  15743.    rts
  15744. +  jmp dateQueryNext
  15745.  
  15746. swByte        = work+0 ;(1)  ;swap byte during read/write
  15747. swPRASave     = work+1 ;(1)  ;save for port A
  15748. swDDRASave    = work+2 ;(1)  ;save for port A DDR
  15749.  
  15750. swCIA1PRA     = $dc00  ;(1)  ;CIA 1 port A
  15751. swCIA1DDRA    = $dc02  ;(1)  ;CIA 1 Data Direction Register port A
  15752.  
  15753. ;*** sw main routine ***
  15754. swMain = *
  15755.    php
  15756.    sei
  15757.    ;** save CIA 1's registers
  15758.    lda swCIA1PRA
  15759.    sta swPRASave
  15760.    lda swCIA1DDRA
  15761.    sta swDDRASave
  15762.  
  15763.    ;** setup CIA 1 port A
  15764.    lda #%00001111
  15765.    sta swCIA1DDRA
  15766.    sta swCIA1PRA
  15767.  
  15768.    ;** start SmartWatch read sequence and get date/time
  15769.    jsr swInitRead
  15770.    ldx #7
  15771. -  jsr swReadByte
  15772.    sta vbDTBuffer,x
  15773.    dex
  15774.    bpl -
  15775.  
  15776.    ;** restore CIA1's ports
  15777.    lda swDDRASave
  15778.    sta swCIA1DDRA
  15779.    lda swPRASave
  15780.    sta swCIA1PRA
  15781.  
  15782.    ;** rearrange results from smartwatch to
  15783.    ;** to match setdate's format
  15784.  
  15785.    ;only need lower 6 bits of hour
  15786.    lda vbDTBuffer+4
  15787.    and #%00111111
  15788.    sta vbDTBuffer+4
  15789.   
  15790.    ;upper nibble is tenths of second, and 
  15791.    ;lower nibble is day of week
  15792.    lda vbDTBuffer+7
  15793.    asl
  15794.    asl
  15795.    asl
  15796.    asl
  15797.    sta vbDTBuffer+7
  15798.    lda vbDTBuffer+3
  15799.    and #$0f
  15800.    ;smartwatch returns 0-6 for Sun-Sat, ACE uses same (now)
  15801.    ora vbDTBuffer+7
  15802.    sta vbDTBuffer+7
  15803.  
  15804.    ;shift year, month, and day up by one byte
  15805.    ldx #2
  15806.  - lda vbDTBuffer+0,x
  15807.    sta vbDTBuffer+1,x
  15808.    jsr swIsValidBCD
  15809.    bcs swBadRead
  15810.    dex
  15811.    bpl -
  15812.  
  15813.    ; ** determine century
  15814.    ;lda vbDTBuffer+1    ;not necessary, left over from above
  15815.    cmp #$80             ;if the year's < '80 assume it's 20xx
  15816.    lda #$19
  15817.    bcs +
  15818.    lda #$20
  15819. +  sta vbDTBuffer+0
  15820.  
  15821.    ;**display buffer in hex; for debugging only
  15822. ;   ldy #0
  15823. ;-  sty swByte
  15824. ;   lda vbDTBuffer,y
  15825. ;   jsr puthex
  15826. ;   lda #' '
  15827. ;   jsr chrout
  15828. ;   ldy swByte
  15829. ;   iny
  15830. ;   cpy #8
  15831. ;   bne -
  15832. ;   lda #chrCR
  15833. ;   jsr chrout
  15834.  
  15835.    lda #<vbDTBuffer
  15836.    ldy #>vbDTBuffer
  15837.    jsr aceTimeSetDate 
  15838.  
  15839. swExit = *
  15840.    plp
  15841.    clc
  15842.    rts
  15843.  
  15844. swBadRead = *
  15845.    plp
  15846.    sec
  15847.    rts
  15848.  
  15849. swInitRead = *
  15850.    lda #%00001111
  15851.    sta swCIA1DDRA
  15852.  
  15853.    lda #%00001110
  15854.    ldx #%00000010
  15855.    sta swCIA1PRA
  15856.    stx swCIA1PRA
  15857.    sta swCIA1PRA
  15858.  
  15859.    ldx #7
  15860. -  lda swReadSeq,x
  15861.    jsr swSendByte
  15862.    dex
  15863.    bpl -
  15864.    rts
  15865.  
  15866. swReadSeq = *
  15867.    .byte $5c,$a3,$3a,$c5,$5c,$a3,$3a,$c5
  15868.  
  15869. swSendByte = *
  15870.    sta swByte
  15871.    lda #%00001111
  15872.    sta swCIA1DDRA
  15873.  
  15874.    ldy #8
  15875.    lda #%00001100
  15876.    sta swCIA1PRA
  15877. -  lda swByte
  15878.    and #%00000001
  15879.    sta swCIA1PRA
  15880.    ora #%00001100
  15881.    sta swCIA1PRA
  15882.    lsr swByte
  15883.    dey
  15884.    bne -
  15885.    rts
  15886.  
  15887. swReadByte = *
  15888.    lda #%00001110
  15889.    sta swCIA1DDRA
  15890.  
  15891.    ldy #8
  15892.  - lda #%00001110
  15893.    sta swCIA1PRA
  15894.    lda #%00000010
  15895.    sta swCIA1PRA
  15896.    lda swCIA1PRA
  15897.    lsr
  15898.    ror swByte
  15899.    dey
  15900.    bne -
  15901.    lda swByte
  15902.    rts
  15903.  
  15904. ;*** end of sw program ***
  15905.  
  15906. ;*** sw utility routines ***
  15907.  
  15908. swIsValidBCD = *
  15909. ; test upper and lower nibble of .A for valid BCD digits
  15910. ; returns with carry flag clear for valid packed BCD, set otherwise
  15911.    pha
  15912.    and #%00001111
  15913.    cmp #$0a
  15914.    pla
  15915.    bcs +
  15916.    cmp #$a0
  15917.  + rts
  15918.  
  15919. ;puthex = *  ;( .A=value )
  15920. ;   pha
  15921. ;   lsr
  15922. ;   lsr
  15923. ;   lsr
  15924. ;   lsr
  15925. ;   tax
  15926. ;   lda puthexChars,x
  15927. ;   jsr chrout
  15928. ;   pla
  15929. ;   and #$0f
  15930. ;   tax
  15931. ;   lda puthexChars,x
  15932. ;   jsr chrout
  15933. ;   rts
  15934. ;   puthexChars = *
  15935. ;   .byte "0123456789abcdef"
  15936.  
  15937. ;** uninitialzed data
  15938. vbDTBuffer .buf 8  ;(8)   ;buffer for date/time - vector of bytes
  15939.  
  15940. ;=== bss ===
  15941.  
  15942. bss = *
  15943. freemap = bss+0
  15944. title = freemap+256
  15945. charsetBuf = title+512
  15946. bssEnd = charsetBuf+4300
  15947. sh.s
  15948. 2112
  15949. ;ACE command shell by Craig Bruce -- now an external program
  15950.  
  15951. .seq "acehead.s"
  15952. .org aceAppAddress
  15953. .obj "@0:sh"
  15954.  
  15955. jmp main
  15956. .byte aceID1,aceID2,aceID3
  15957. .byte 64,0 ;*stack,reserved
  15958.  
  15959. libwork = $60
  15960. chrQuote = 34
  15961. true = $ff
  15962. false = $00
  15963.  
  15964. ;** these five fields need to be saved and
  15965. ;** restored between exec calls, into mp
  15966. shellRedirectStdin  .buf 1
  15967. shellRedirectStdout .buf 1
  15968. shellRedirectStderr .buf 1
  15969. inputFd             .buf 1
  15970. suppressPromptFlag  .buf 1
  15971.  
  15972. stackPtr = $60
  15973. name     = $62
  15974. parseArgc .buf 2
  15975. parseArgv .buf 2
  15976. shellExitFlag .buf 1
  15977. shellPromptFlag .buf 1
  15978. checkPromptFlag .buf 1
  15979. abortCommandFlag .buf 1
  15980. regsave .buf 3
  15981.  
  15982. ;******** shell ********
  15983.  
  15984. main = *
  15985.    lda #stdin
  15986.    sta inputFd
  15987.    lda #1
  15988.    ldy #0
  15989.    jsr getarg
  15990.    bne +
  15991.    jmp shell
  15992.    ;** check for flags
  15993. +  ldy #0
  15994.    lda (zp),y
  15995.    cmp #"-"
  15996.    beq +
  15997.    lda #1
  15998.    ldy #0
  15999.    jmp mainCont
  16000.    ;** check for "-v" flag
  16001. +  ldy #0
  16002. -  iny
  16003.    lda (zp),y
  16004.    cmp #"v"
  16005.    bne +
  16006.    tya
  16007.    pha
  16008.    lda #<shellTitle
  16009.    ldy #>shellTitle
  16010.    jsr eputs
  16011.    lda #1
  16012.    ldy #0
  16013.    jsr getarg
  16014.    pla
  16015.    tay
  16016.    jmp -
  16017.    ;** check for "-i" flag
  16018. +  cmp #"i"
  16019.    bne +
  16020.    tya
  16021.    pha
  16022.    jsr ashrc
  16023.    lda #1
  16024.    ldy #0
  16025.    jsr getarg
  16026.    pla
  16027.    tay
  16028.    jmp -
  16029. +  lda #2
  16030.    ldy #0
  16031.    ;xx shift the arguments when you get that far
  16032.    ;** try to get filename to execute
  16033.    mainCont = *
  16034.    ldx #stdin
  16035.    stx inputFd
  16036.    jsr getarg
  16037.    bne +
  16038.    jmp shell
  16039. +  lda #"r"
  16040.    jsr open
  16041.    bcs +
  16042.    sta inputFd
  16043.    ;xx shift the arguments when you get that far
  16044.    ;** file will close when shell exits
  16045.    jmp shell
  16046.    ;** error opening shell script--abort
  16047. +  ldx #stderr
  16048.    jsr zpputs
  16049.    lda #<scriptOpenError
  16050.    ldy #>scriptOpenError
  16051.    jsr eputs
  16052.    lda #1
  16053.    ldx #0
  16054.    jmp aceProcExit
  16055.  
  16056. shellTitle .byte "ACE Shell vers 0.92 - by CSB 17-Dec-95",chrCR,chrCR,0
  16057. scriptOpenError .byte ": cannot open shell script for execution",chrCR,0
  16058.  
  16059. ashrc = *
  16060.    ;xx get home-directory name
  16061.    lda #<cmdBuffer
  16062.    ldy #>cmdBuffer
  16063.    sta zp+0
  16064.    sty zp+1
  16065.    nop ;jsr gethomedir
  16066.    ldy #0 ;xx
  16067.    ;** append ".ashrc" filename
  16068.    ldx #0
  16069. -  lda ashrcName,x
  16070.    sta cmdBuffer,y
  16071.    beq +
  16072.    iny
  16073.    inx
  16074.    bne -
  16075.    ;** open file
  16076. +  lda #"r"
  16077.    jsr open
  16078.    bcs +
  16079.    sta inputFd
  16080.    ;** execute shell as same process
  16081.    jsr shell
  16082.    ;** close and return
  16083.    lda inputFd
  16084.    jmp close
  16085.    ;** handle error
  16086. +  ldx #stderr
  16087.    jsr zpputs
  16088.    lda #<scriptOpenError
  16089.    ldy #>scriptOpenError
  16090.    jmp eputs
  16091.  
  16092.    ashrcName .asc ".ashrc"
  16093.              .byte 0
  16094.    ashrcOpenError .asc ": cannot open "
  16095.              .byte chrQuote
  16096.              .asc ".ashrc"
  16097.              .byte chrQuote
  16098.              .asc "script for execution"
  16099.              .byte chrCR,0
  16100.  
  16101. shell = *
  16102.    lda #$ff
  16103.    sta checkPromptFlag
  16104.    sta shellRedirectStdin
  16105.    sta shellRedirectStdout
  16106.    sta shellRedirectStderr
  16107.    lda #0
  16108.    sta suppressPromptFlag
  16109.  
  16110.    getCommand = *
  16111.    lda #0
  16112.    sta abortCommandFlag
  16113.    lda checkPromptFlag
  16114.    beq +
  16115.    jsr shellCheckPromptability
  16116. +  lda shellPromptFlag
  16117.    beq +
  16118.    lda suppressPromptFlag
  16119.    bne +
  16120.    lda #<argBuffer
  16121.    ldy #>argBuffer
  16122.    sta zp+0
  16123.    sty zp+1
  16124.    lda #0
  16125.    jsr aceDirName
  16126.    lda #"["
  16127.    ldx #stderr
  16128.    jsr putc
  16129.    lda #<argBuffer
  16130.    ldy #>argBuffer
  16131.    jsr eputs
  16132.    lda #<shellReady2
  16133.    ldy #>shellReady2
  16134.    jsr eputs
  16135. +  lda #0
  16136.    sta suppressPromptFlag
  16137.    sta shellExitFlag
  16138.    lda aceMemTop+0
  16139.    ldy aceMemTop+1
  16140.    sta stackPtr+0
  16141.    sty stackPtr+1
  16142.    jsr shellGetArgs
  16143.    bcs shellFinish
  16144.    lda parseArgc+0
  16145.    ora parseArgc+1
  16146.    beq +
  16147.    lda abortCommandFlag
  16148.    bne +
  16149.    jsr setupRedirects
  16150.    jsr shellConstructFrame
  16151.    jsr shellExecCommand
  16152.    lda #$ff
  16153.    sta checkPromptFlag
  16154.    jsr shellRemoveFrame
  16155.    jsr unsetRedirects
  16156. +  jsr closeRedirects
  16157.    bit shellExitFlag
  16158.    bmi shellFinish
  16159.    jmp getCommand
  16160.  
  16161.    shellFinish = *
  16162.    rts
  16163.  
  16164. shellReady2 .asc "] "
  16165.             .byte 0
  16166.  
  16167. shellCheckPromptability = *
  16168.    ldx inputFd
  16169.    jsr aceFileInfo
  16170.    ldx #$ff
  16171.    cmp #0
  16172.    beq +
  16173.    ldx #0
  16174. +  stx shellPromptFlag
  16175.    lda #0
  16176.    sta checkPromptFlag
  16177.    rts
  16178.  
  16179. ;=== command parsing ===
  16180.  
  16181. argPtr = $02
  16182. argQuote = $03
  16183. argWasQuoted = $04
  16184.  
  16185. shellGetArgChar = *
  16186.    ldx inputFd
  16187.    jmp getc
  16188.  
  16189. shellGetArgs = *
  16190.    lda #0
  16191.    sta parseArgc+0
  16192.    sta parseArgc+1
  16193.  
  16194.    newarg = *
  16195.    jsr shellGetArgChar
  16196.    bcc +
  16197.    jmp argEof
  16198. +  cmp #" "
  16199.    beq newarg
  16200.    cmp #chrTAB
  16201.    beq newarg
  16202.    cmp #chrCR
  16203.    bne +
  16204.    jmp argEndOfLine
  16205. +  cmp #";"
  16206.    bne +
  16207.    lda #$ff
  16208.    sta suppressPromptFlag
  16209.    jmp argEndOfLine
  16210. +  cmp #"#"
  16211.    bne ++
  16212. -  jsr shellGetArgChar
  16213.    bcc +
  16214.    jmp argEof
  16215. +  cmp #chrCR
  16216.    bne -
  16217.    jmp argEndOfLine
  16218.  
  16219. +  ldx #0
  16220.    stx argPtr
  16221.    stx argWasQuoted
  16222. +  cmp #"\"
  16223.    bne ++
  16224.    jsr shellGetArgChar
  16225.    bcc +
  16226.    jmp argEof
  16227. +  cmp #chrCR
  16228.    beq newarg
  16229.    jmp ++
  16230.  
  16231. +  nop
  16232.  
  16233.    argNewQuote = *
  16234.    ldx #0
  16235.    stx argQuote
  16236.    cmp #$22
  16237.    beq argStartQuote
  16238.    cmp #"'"
  16239.    bne +
  16240.    argStartQuote = *
  16241.    sta argQuote
  16242.    sta argWasQuoted
  16243.    jmp argNextChar
  16244.  
  16245. +  ldx argPtr
  16246.    sta argBuffer,x
  16247.    inc argPtr
  16248.  
  16249.    argNextChar = *
  16250.    jsr shellGetArgChar
  16251.    bcs argEof
  16252.    ldx argQuote
  16253.    bne argQuoteMode
  16254.    cmp #" "
  16255.    beq argProcess
  16256.    cmp #chrTAB
  16257.    beq argProcess
  16258. -  cmp #";"
  16259.    bne +
  16260.    ldx argWasQuoted
  16261.    bne +
  16262.    lda #$ff
  16263.    sta suppressPromptFlag
  16264.    lda #chrCR
  16265. +  cmp #chrCR
  16266.    beq argProcess
  16267.    ldx argPtr
  16268.    sta argBuffer,x
  16269.    inc argPtr
  16270.    jmp argNextChar
  16271.  
  16272.    argQuoteMode = *
  16273.    cmp #0
  16274.    beq -
  16275.    cmp argQuote
  16276.    bne -
  16277.    jsr shellGetArgChar
  16278.    bcs argEof
  16279.    cmp #" "
  16280.    beq argProcess
  16281.    cmp #chrTAB
  16282.    beq argProcess
  16283.    cmp #chrCR
  16284.    beq argProcess
  16285.    jmp argNewQuote
  16286.  
  16287.    argProcess = *
  16288.    pha
  16289.    ldx argPtr
  16290.    lda #0
  16291.    sta argBuffer,x
  16292.    jsr shellHandleArg
  16293.    pla
  16294.    cmp #chrCR
  16295.    beq argEndOfLine
  16296.    jmp newarg
  16297.    argEndOfLine = *
  16298.    clc
  16299.    argEof = *
  16300.    rts
  16301.  
  16302. shellHandleArg = *
  16303.    lda abortCommandFlag
  16304.    beq +
  16305.    rts
  16306. +  lda argWasQuoted
  16307.    bne +
  16308.    ldx #stdin
  16309.    ldy #"r"
  16310.    lda argBuffer
  16311.    cmp #"<"
  16312.    beq shellHandleRedirect
  16313.    ldx #stdout
  16314.    ldy #"W"
  16315.    cmp #">"
  16316.    beq shellHandleRedirect
  16317.    jsr checkWildcards
  16318.    bcc +
  16319.    rts
  16320. +  jsr shellStoreArg
  16321.    rts
  16322.  
  16323. shellStoreArg = *
  16324.    lda stackPtr+0
  16325.    ldy stackPtr+1
  16326.    clc
  16327.    sbc argPtr
  16328.    bcs +
  16329.    dey
  16330. +  sta stackPtr+0
  16331.    sty stackPtr+1
  16332.    sta zp+0
  16333.    sty zp+1
  16334.    ldy #0
  16335. -  lda argBuffer,y
  16336.    sta (zp),y
  16337.    beq +
  16338.    iny
  16339.    bne -
  16340. +  lda parseArgc+1
  16341.    sta zp+1
  16342.    lda parseArgc+0
  16343.    asl
  16344.    rol zp+1
  16345.    clc
  16346.    adc #<argArgvBuffer
  16347.    sta zp+0
  16348.    lda zp+1
  16349.    adc #>argArgvBuffer
  16350.    sta zp+1
  16351.    ldy #0
  16352.    lda stackPtr+0
  16353.    sta (zp),y
  16354.    iny
  16355.    lda stackPtr+1
  16356.    sta (zp),y
  16357.    inc parseArgc+0
  16358.    bne +
  16359.    inc parseArgc+1
  16360. +  rts
  16361.  
  16362. shellHandleRedirect = *   ;( .X=fd, .Y=mode )
  16363.    lda #<argBuffer+1
  16364.    sta zp+0
  16365.    lda #>argBuffer+1
  16366.    sta zp+1
  16367.    lda argBuffer+1
  16368.    cmp #">"
  16369.    bne +
  16370.    jsr shellRedirInc
  16371.    ldy #"A"
  16372.    lda argBuffer+2
  16373. +  cmp #"!"
  16374.    bne +
  16375. -  ldx #stderr
  16376.    jsr shellRedirInc
  16377.    lda #0
  16378. +  cmp #"&"
  16379.    beq -
  16380.    lda shellRedirectStdin,x
  16381.    cmp #255
  16382.    bne redirectMultiError
  16383.    tya
  16384.    stx cmdBuffer
  16385.    sta regsave
  16386.    jsr open
  16387.    bcs redirectError
  16388.    ldx cmdBuffer
  16389.    sta shellRedirectStdin,x
  16390.    rts
  16391.  
  16392. redirectError = *
  16393.    lda #<redirectErrorMsg
  16394.    ldy #>redirectErrorMsg
  16395. redirectErrorWmsg = *
  16396.    pha
  16397.    tya
  16398.    pha
  16399.    lda #$ff
  16400.    sta abortCommandFlag
  16401.    lda zp+0
  16402.    ldy zp+1
  16403.    jsr eputs
  16404.    pla
  16405.    tay
  16406.    pla
  16407.    jsr eputs
  16408.    rts
  16409.  
  16410.    redirectErrorMsg = *
  16411.    .asc ": Error opening redirection file."
  16412.    .byte chrCR,0
  16413.  
  16414. redirectMultiError = *
  16415.    lda #<redirectMultiErrorMsg
  16416.    ldy #>redirectMultiErrorMsg
  16417.    jmp redirectErrorWmsg
  16418.  
  16419.    redirectMultiErrorMsg = *
  16420.    .asc ": Error - Multiple redirections of same stream."
  16421.    .byte chrCR,0
  16422.  
  16423. shellRedirInc = *
  16424.    inc zp+0
  16425.    bne +
  16426.    inc zp+1
  16427. +  rts
  16428.  
  16429. shellSetupRed = 2
  16430.  
  16431. setupRedirects = *
  16432. unsetRedirects = *
  16433.    ldx #0
  16434.    stx shellSetupRed
  16435. -  lda shellRedirectStdin,x
  16436.    cmp #255
  16437.    beq +
  16438.    tay
  16439.    jsr aceFileFdswap
  16440. +  inc shellSetupRed
  16441.    ldx shellSetupRed
  16442.    cpx #3
  16443.    bcc -
  16444.    rts
  16445.  
  16446. shellCloseRed = 2
  16447.  
  16448. closeRedirects = *
  16449.    ldx #0
  16450.    stx shellCloseRed
  16451. -  lda shellRedirectStdin,x
  16452.    cmp #$ff
  16453.    beq +
  16454.    jsr close
  16455.    ldx shellCloseRed
  16456.    lda #$ff
  16457.    sta shellRedirectStdin,x
  16458. +  inc shellCloseRed
  16459.    ldx shellCloseRed
  16460.    cpx #3
  16461.    bcc -
  16462.    rts
  16463.  
  16464. wildPrefix = 10
  16465. wildSuffix = 11
  16466.  
  16467. checkWildcards = *
  16468.    lda #255
  16469.    sta wildPrefix
  16470.    sta wildSuffix
  16471.    ldx argPtr
  16472. -  dex
  16473.    cpx #255
  16474.    beq +
  16475.    lda argBuffer,x
  16476.    cmp #":"
  16477.    beq +
  16478.    cmp #"*"
  16479.    bne -
  16480.    ldy wildSuffix
  16481.    cpy #255
  16482.    bne -
  16483.    stx wildSuffix
  16484.    inc wildSuffix
  16485.    jmp -
  16486. +  inx
  16487.    stx wildPrefix
  16488.    lda wildSuffix
  16489.    cmp #255
  16490.    bne +
  16491.    clc
  16492.    rts
  16493. +  jsr handleWildcards
  16494.    sec
  16495.    rts
  16496.  
  16497. wildLength = 12
  16498. wildSuffixLength = 13
  16499. wildFcb = 14
  16500. wildMatch = 15
  16501.  
  16502. handleWildcards = *
  16503.    lda #0
  16504.    sta wildMatch
  16505.    ldx argPtr
  16506.    inx
  16507. -  dex
  16508.    lda argBuffer,x
  16509.    sta cmdBuffer+1,x
  16510.    cpx wildPrefix
  16511.    bne -
  16512.    lda #0
  16513.    sta cmdBuffer,x
  16514.    sta argBuffer,x
  16515.    ldx wildSuffix
  16516.    sta cmdBuffer,x
  16517.    inc wildPrefix
  16518.    inc wildSuffix
  16519.    ldx #0
  16520. -  lda argBuffer,x
  16521.    beq +
  16522.    sta cmdBuffer,x
  16523.    inx
  16524.    bne -
  16525. +  sec
  16526.    lda argPtr
  16527.    sbc wildSuffix
  16528.    sta wildSuffixLength
  16529.    inc wildSuffixLength
  16530.    sec
  16531.    lda argPtr
  16532.    sbc wildPrefix
  16533.    sta wildLength
  16534.  
  16535.    lda #<cmdBuffer
  16536.    ldy #>cmdBuffer
  16537.    sta zp+0
  16538.    sty zp+1
  16539.    jsr aceDirOpen
  16540.    bcs noMatch
  16541.    sta wildFcb
  16542.    ldx wildFcb
  16543.    jsr aceDirRead
  16544.    bcs +
  16545.    beq +
  16546.    jsr scanWildcard
  16547. +  lda wildFcb
  16548.    jsr aceDirClose
  16549.    lda wildMatch
  16550.    bne +
  16551.    noMatch = *
  16552.    lda #$ff
  16553.    sta abortCommandFlag
  16554.    lda #<noMatchMsg
  16555.    ldy #>noMatchMsg
  16556.    jsr eputs
  16557. +  rts
  16558.  
  16559. noMatchMsg = *
  16560.    .asc "No match for wildcard"
  16561.    .byte chrCR,0
  16562.  
  16563. scanWildcard = *
  16564.    ldx wildFcb
  16565.    jsr aceDirRead
  16566.    bcs +
  16567.    bne ++
  16568. +  rts
  16569. +  lda aceDirentName
  16570.    bne +
  16571.    rts
  16572. +  lda aceDirentUsage
  16573.    and #%00010000
  16574.    bne scanWildcard
  16575.    lda aceDirentNameLen
  16576.    cmp wildLength
  16577.    bcc scanWildcard
  16578.    ldx wildPrefix
  16579.    ldy #0
  16580.    jsr substrCmp
  16581.    bcs scanWildcard
  16582.    ldx wildSuffix
  16583.    sec
  16584.    lda aceDirentNameLen
  16585.    sbc wildSuffixLength
  16586.    tay
  16587.    jsr substrCmp
  16588.    bcs scanWildcard
  16589.  
  16590.    ldx #0
  16591. -  lda cmdBuffer,x
  16592.    beq +
  16593.    sta argBuffer,x
  16594.    inx
  16595.    bne -
  16596. +  ldy #0
  16597. -  lda aceDirentName,y
  16598.    sta argBuffer,x
  16599.    beq +
  16600.    inx
  16601.    iny
  16602.    bne -
  16603. +  lda aceDirentType
  16604.    cmp #"s"
  16605.    beq +
  16606.    sta argBuffer+1,x
  16607.    lda #","
  16608.    sta argBuffer,x
  16609.    inx
  16610.    inx
  16611.    lda #0
  16612.    sta argBuffer,x
  16613. +  stx argPtr
  16614.    jsr shellStoreArg
  16615.    lda #$ff
  16616.    sta wildMatch
  16617.    jmp scanWildcard
  16618.  
  16619. substrCmp = *  ;( .X=cmdbufOff, .Y=direntNameOff ) : .CC=match
  16620. -  lda cmdBuffer,x
  16621.    bne +
  16622.    clc
  16623.    rts
  16624. +  cmp aceDirentName,y
  16625.    bne +
  16626.    iny
  16627.    inx
  16628.    bne -
  16629. +  sec
  16630.    rts
  16631.  
  16632. ;=== stack management ===
  16633.  
  16634. frameArgvSource = $02
  16635. frameArgvDest = $04
  16636. frameArgvBytes = $06
  16637.  
  16638. shellConstructFrame = *
  16639.    ;** push the ZERO trailer argv
  16640.    sec
  16641.    lda stackPtr+0
  16642.    sbc #2
  16643.    sta stackPtr+0
  16644.    bcs +
  16645.    dec stackPtr+1
  16646. +  ldy #0
  16647.    lda #0
  16648.    sta (stackPtr),y
  16649.    iny
  16650.    sta (stackPtr),y
  16651.  
  16652.    ;** push argv[] array here
  16653.    lda parseArgc+0
  16654.    ldy parseArgc+1
  16655.    sty frameArgvBytes+1
  16656.    asl
  16657.    sta frameArgvBytes+0
  16658.    rol frameArgvBytes+1
  16659.    sec
  16660.    lda stackPtr+0
  16661.    sbc frameArgvBytes+0
  16662.    sta stackPtr+0
  16663.    sta frameArgvDest+0
  16664.    lda stackPtr+1
  16665.    sbc frameArgvBytes+1
  16666.    sta stackPtr+1
  16667.    sta frameArgvDest+1
  16668.    lda #<argArgvBuffer
  16669.    ldy #>argArgvBuffer
  16670.    sta frameArgvSource+0
  16671.    sty frameArgvSource+1
  16672. -  lda frameArgvBytes+0
  16673.    ora frameArgvBytes+1
  16674.    beq frameSetArgvPtr
  16675.    ldy #0
  16676.    lda (frameArgvSource),y
  16677.    sta (frameArgvDest),y
  16678.    inc frameArgvSource+0
  16679.    bne +
  16680.    inc frameArgvSource+1
  16681. +  inc frameArgvDest+0
  16682.    bne +
  16683.    inc frameArgvDest+1
  16684. +  lda frameArgvBytes+0
  16685.    bne +
  16686.    dec frameArgvBytes+1
  16687. +  dec frameArgvBytes+0
  16688.    jmp -
  16689.  
  16690.    ;** set argv pointer
  16691.    frameSetArgvPtr = *
  16692.    lda stackPtr+0
  16693.    ldy stackPtr+1
  16694.    sta parseArgv+0
  16695.    sty parseArgv+1
  16696.    ;** put un-redirection info into [mp]
  16697.    lda shellRedirectStdin
  16698.    ldx shellRedirectStdout
  16699.    ldy shellRedirectStderr
  16700.    sta mp+0
  16701.    stx mp+1
  16702.    sty mp+2
  16703.    lda inputFd
  16704.    sta mp+3
  16705.    rts
  16706.  
  16707. shellRemoveFrame = *
  16708.    ;** recover un-redirection info from [mp]
  16709.    lda mp+0
  16710.    ldx mp+1
  16711.    ldy mp+2
  16712.    sta shellRedirectStdin
  16713.    stx shellRedirectStdout
  16714.    sty shellRedirectStderr
  16715.    lda mp+3
  16716.    sta inputFd
  16717.    rts
  16718.  
  16719. ;=== dispatch ===
  16720.  
  16721. dispArgv = $02
  16722. dispArgPtr = $04
  16723. dispVector = $02
  16724.  
  16725. shellExecCommand = *
  16726.    ;** fetch the command name
  16727.    lda parseArgv+0
  16728.    ldy parseArgv+1
  16729.    sta dispArgv+0
  16730.    sty dispArgv+1
  16731.    ldy #1
  16732. -  lda (dispArgv),y
  16733.    sta dispArgPtr,y
  16734.    sta name,y
  16735.    dey
  16736.    bpl -
  16737.    ldy #0
  16738. -  lda (dispArgPtr),y
  16739.    sta argBuffer,y
  16740.    beq +
  16741.    iny
  16742.    bne -
  16743.  
  16744.    ;** search internal dispatch table for name
  16745. +  ldy #0
  16746.    dispCmpCommand = *
  16747.    lda dispTable,y
  16748.    beq shellLoadExternal
  16749.    ldx #0
  16750. -  lda argBuffer,x
  16751.    cmp dispTable,y
  16752.    bne +
  16753.    cmp #0
  16754.    beq dispMatch
  16755.    inx
  16756.    iny
  16757.    bne -
  16758.    brk
  16759. +  dey
  16760. -  iny
  16761.    lda dispTable,y
  16762.    bne -
  16763.    iny
  16764.    iny
  16765.    iny
  16766.    jmp dispCmpCommand
  16767.  
  16768.    dispMatch = *
  16769.    lda suppressPromptFlag
  16770.    pha
  16771.    lda dispTable+1,y
  16772.    pha
  16773.    lda dispTable+2,y
  16774.    tay
  16775.    pla
  16776.    jsr dispSetup
  16777.    jsr aceProcExecSub
  16778.    pla
  16779.    sta suppressPromptFlag
  16780.    rts
  16781.  
  16782.    dispSetup = *  ;( (.AY)=zp contents ) : zp, zw, .AY=argc
  16783.    sta zp+0
  16784.    sty zp+1
  16785.    lda parseArgv+0
  16786.    ldy parseArgv+1
  16787.    sta zw+0
  16788.    sty zw+1
  16789.    lda parseArgc+0
  16790.    ldy parseArgc+1
  16791.    rts
  16792.  
  16793. ;** load external file into transient program area
  16794. loadPath = 2
  16795. loadPathPos = 4
  16796. loadGiveUp = 7
  16797.  
  16798. shellLoadExternal = *
  16799.    lda suppressPromptFlag
  16800.    pha
  16801.    lda name+0
  16802.    ldy name+1
  16803.    jsr dispSetup
  16804.    jsr aceProcExec
  16805.    bcs +
  16806.    pla
  16807.    sta suppressPromptFlag
  16808.    rts
  16809. +  pla
  16810.    sta suppressPromptFlag
  16811.    lda errno
  16812.    pha
  16813.    lda name+0
  16814.    ldy name+1
  16815.    jsr eputs
  16816.    pla
  16817.    cmp #aceErrFileNotFound
  16818.    beq dispCmdNotFound
  16819.    cmp #aceErrBadProgFormat
  16820.    beq dispBadProg
  16821.    lda #<dispLoadErrorMsg1
  16822.    ldy #>dispLoadErrorMsg1
  16823.    jmp eputs
  16824.  
  16825.    dispBadProg = *
  16826.    lda #<dispBadProgMsg
  16827.    ldy #>dispBadProgMsg
  16828.    jmp eputs
  16829.  
  16830.    dispCmdNotFound = *
  16831.    lda #<dispLoadErrorMsg2
  16832.    ldy #>dispLoadErrorMsg2
  16833.    jmp eputs
  16834.    dispLoadErrorMsg1 = *
  16835.    .asc ": External-program load error"
  16836.    .byte chrCR,0
  16837.    dispLoadErrorMsg2 = *
  16838.    .asc ": Command not found"
  16839.    .byte chrCR,0
  16840.    dispBadProgMsg = *
  16841.    .asc ": Bad external-program format"
  16842.    .byte chrCR,0
  16843.  
  16844. ;===internal command name and dispatch table===
  16845.  
  16846. dispTable = *
  16847. .asc "echo"
  16848. .byte 0
  16849. .word echo
  16850. ;xx .asc "sh"
  16851. ;xx .byte 0
  16852. ;xx .word shellCmd  ;this must be an external call for the time being
  16853. .asc "cd"
  16854. .byte 0
  16855. .word cd
  16856. .asc "cat"
  16857. .byte 0
  16858. .word cat
  16859. .asc "cls"
  16860. .byte 0
  16861. .word cls
  16862. .asc "clear"
  16863. .byte 0
  16864. .word cls
  16865. .asc "exit"
  16866. .byte 0
  16867. .word shellExit
  16868. .asc "x"
  16869. .byte 0
  16870. .word shellExit
  16871. .asc "@"
  16872. .byte 0
  16873. .word dos
  16874. .asc "dos"
  16875. .byte 0
  16876. .word dos
  16877. .asc "path"
  16878. .byte 0
  16879. .word path
  16880. .asc "ls"
  16881. .byte 0
  16882. .word dirMain
  16883. .asc "clsl"
  16884. .byte 0
  16885. .word dirCmdClsl
  16886. .asc "dir"
  16887. .byte 0
  16888. .word dirCmdDir
  16889. .asc "d"
  16890. .byte 0
  16891. .word dirCmdD
  16892.  
  16893. .byte 0
  16894.  
  16895. ;===echo===
  16896.  
  16897. echoArgv = $02
  16898. echoSpace = $04
  16899. echoTemp = $06
  16900.  
  16901. echo = *
  16902.    lda #0
  16903.    sta echoSpace
  16904.    lda aceArgv+0
  16905.    ldy aceArgv+1
  16906.  
  16907.    echoNewArg = *
  16908.    clc
  16909.    adc #2
  16910.    bcc +
  16911.    iny
  16912. +  sta echoArgv+0
  16913.    sty echoArgv+1
  16914.    ldy #0
  16915.    lda (echoArgv),y
  16916.    sta echoTemp+0
  16917.    iny
  16918.    lda (echoArgv),y
  16919.    sta echoTemp+1
  16920.    ora echoTemp+0
  16921.    beq echoExit
  16922.    lda #" "
  16923.    cmp echoSpace
  16924.    bne +
  16925.    jsr putchar
  16926. +  lda #" "
  16927.    sta echoSpace
  16928.    lda echoTemp+0
  16929.    ldy echoTemp+1
  16930.    jsr puts
  16931.    lda echoArgv+0
  16932.    ldy echoArgv+1
  16933.    jmp echoNewArg
  16934.    
  16935.    echoExit = *
  16936.    lda #chrCR
  16937.    jsr putchar
  16938.    rts
  16939.  
  16940. ;===copy parameters===
  16941.  
  16942. copyBufferPtr = $02
  16943. copyBufferLength = $04
  16944.  
  16945. getBufferParms = *
  16946.    lda #<copyBuffer
  16947.    ldy #>copyBuffer
  16948.    sta copyBufferPtr+0
  16949.    sty copyBufferPtr+1
  16950.    sec
  16951.    lda aceMemTop+0
  16952.    sbc copyBufferPtr+0
  16953.    sta copyBufferLength+0
  16954.    lda aceMemTop+1
  16955.    sbc copyBufferPtr+1
  16956.    sta copyBufferLength+1
  16957.    rts
  16958.  
  16959. ;===cd===
  16960.  
  16961. cdScanSave .buf 1
  16962.  
  16963. cd = *
  16964.    lda aceArgc+0
  16965.    cmp #2
  16966.    lda aceArgc+1
  16967.    sbc #0
  16968.    bcs +
  16969.    lda #$80
  16970.    jsr aceDirChange
  16971.    rts
  16972. +  lda #1
  16973.    ldy #0
  16974.    jsr getarg
  16975.  
  16976.    cdSetDevice = *
  16977.    ldx #2
  16978.    ldy #0
  16979.    lda (zp),y
  16980.    sta argBuffer+0
  16981.    iny
  16982.    lda (zp),y
  16983.    sta argBuffer+1
  16984.    iny
  16985.    cmp #":"
  16986.    bne +
  16987.    lda argBuffer+0
  16988.    cmp #$40
  16989.    bcc +
  16990.    cmp #$60
  16991.    bcc cdCheckPath
  16992. +  ldx #0
  16993.    ldy #0
  16994.  
  16995.    cdCheckPath = *
  16996.    sty cdScanSave
  16997. -  lda (zp),y
  16998.    cmp #"0"
  16999.    bcc +
  17000.    cmp #"9"+1
  17001.    bcs +
  17002.    iny
  17003.    bne -
  17004. +  sta argBuffer,x
  17005.    cmp #0
  17006.    bne +
  17007.    cpy cdScanSave
  17008.    beq cdOkay
  17009. +  ldy cdScanSave
  17010.    cmp #"/"
  17011.    beq cdPathOkay
  17012.    cmp #":"
  17013.    beq cdPathOkay
  17014. +  lda #"/"
  17015.    sta argBuffer,x
  17016.    inx
  17017.  
  17018.    cdPathOkay = *
  17019. -  lda (zp),y
  17020.    sta argBuffer,x
  17021.    beq cdCheckEnd
  17022.    inx
  17023.    iny
  17024.    bne -
  17025.  
  17026.    cdCheckEnd = *
  17027.    dex
  17028.    lda argBuffer,x
  17029.    cmp #":"
  17030.    beq +
  17031.    inx
  17032.    lda #":"
  17033.    sta argBuffer,x
  17034.    lda #0
  17035.    sta argBuffer+1,x
  17036. +  dex
  17037.    lda argBuffer,x
  17038.    cmp #"/"
  17039.    beq cdOkay
  17040.    lda #"/"
  17041.    sta argBuffer+1,x
  17042.    lda #":"
  17043.    sta argBuffer+2,x
  17044.    lda #0
  17045.    sta argBuffer+3,x
  17046.  
  17047.    cdOkay = *
  17048.    lda #<argBuffer
  17049.    ldy #>argBuffer
  17050.    sta zp+0
  17051.    sty zp+1
  17052.    lda #$00
  17053.    jsr aceDirChange
  17054.    bcs +
  17055.    rts
  17056. +  lda #<cdErrMsg
  17057.    ldy #>cdErrMsg
  17058.    jmp eputs
  17059.  
  17060. cdErrMsg = *
  17061.    .asc "Error changing directory"
  17062.    .byte chrCR,0
  17063.  
  17064. ;===cat===
  17065.  
  17066. catBufferPtr = $02
  17067. catBufferLength = $04
  17068. catArg = $06
  17069. catFcb = $08
  17070. catAbort = 10
  17071.  
  17072. cat = *
  17073.    lda #0
  17074.    sta catAbort
  17075.    jsr getBufferParms
  17076.    ldx #stdout
  17077.    jsr aceFileInfo
  17078.    cmp #0
  17079.    bne +
  17080.    lda catBufferLength+1
  17081.    beq +
  17082.    lda #<254
  17083.    ldy #>254
  17084.    sta catBufferLength+0
  17085.    sty catBufferLength+1
  17086. +  lda #1
  17087.    ldy #0
  17088.    sta catArg+0
  17089.    sty catArg+1
  17090.    lda aceArgc+0
  17091.    cmp #2
  17092.    lda aceArgc+1
  17093.    sbc #0
  17094.    bcs catFiles
  17095.    lda #0
  17096.    sta catFcb
  17097.    jmp catFile
  17098.  
  17099.    catFiles = *
  17100.    lda catArg+0
  17101.    ldy catArg+1
  17102.    jsr getarg
  17103.    lda #"r"
  17104.    jsr open
  17105.    bcc +
  17106.    lda zp+0
  17107.    ldy zp+1
  17108.    jsr eputs
  17109.    lda #<catErrMsg
  17110.    ldy #>catErrMsg
  17111.    jsr eputs
  17112.    jmp ++
  17113. +  sta catFcb
  17114.    jsr catFile
  17115.    lda catFcb
  17116.    jsr close
  17117. +  inc catArg
  17118.    bne +
  17119.    inc catArg+1
  17120. +  lda catAbort
  17121.    bne +
  17122.    lda catArg
  17123.    cmp aceArgc
  17124.    lda catArg+1
  17125.    sbc aceArgc+1
  17126.    bcc catFiles
  17127. +  rts
  17128.  
  17129. catErrMsg = *
  17130.    .asc ": cannot open"
  17131.    .byte chrCR,0
  17132.  
  17133. catFile = *
  17134.    lda catBufferPtr
  17135.    ldy catBufferPtr+1
  17136.    sta zp
  17137.    sty zp+1
  17138. -  lda catBufferLength
  17139.    ldy catBufferLength+1
  17140.    ldx catFcb
  17141.    jsr read
  17142.    beq +
  17143.    bcs +
  17144.    ldx #1
  17145.    jsr write
  17146.    bcs +
  17147.    jsr aceConStopkey
  17148.    bcs printStoppedMsg
  17149.    jmp -
  17150. +  rts
  17151.  
  17152. printStoppedMsg = *
  17153.    lda #$ff
  17154.    sta catAbort
  17155.    lda #<stoppedMsg
  17156.    ldy #>stoppedMsg
  17157.    jmp eputs
  17158.    stoppedMsg = *
  17159.    .asc "<Stopped>"
  17160.    .byte chrCR,0
  17161.  
  17162. ;===exit===
  17163.  
  17164. shellExit = *
  17165.    lda #$ff
  17166.    sta shellExitFlag
  17167.    rts
  17168.  
  17169. ;===dos===
  17170.  
  17171. dosFcb = $02
  17172.  
  17173. dos = *
  17174.    ;** open command channel
  17175.    lda #<dosCurDevice
  17176.    ldy #>dosCurDevice
  17177.    sta zp
  17178.    sty zp+1
  17179.    jsr aceMiscCmdOpen
  17180.    bcc +
  17181.    rts
  17182. +  sta dosFcb
  17183.  
  17184.    ;** send command
  17185.    lda #1
  17186.    ldy #0
  17187.    jsr getarg
  17188.    lda zp
  17189.    ora zp+1
  17190.    beq dosStatusOnly
  17191.    lda zp
  17192.    ldy zp+1
  17193.    ldx dosFcb
  17194.    jsr aceMiscCmdSend
  17195.    bcs +
  17196.  
  17197.    ;** read status
  17198.    dosStatusOnly = *
  17199.    lda #<cmdBuffer
  17200.    ldy #>cmdBuffer
  17201.    ldx dosFcb
  17202.    jsr aceMiscCmdStatus
  17203.    bcs +
  17204.    lda #<cmdBuffer
  17205.    ldy #>cmdBuffer
  17206.    jsr puts
  17207.    lda #chrCR
  17208.    jsr putchar
  17209.  
  17210.    ;** close command channel
  17211. +  lda dosFcb
  17212.    jmp aceMiscCmdClose
  17213.    
  17214. dosCurDevice .asc ".:"
  17215.              .byte 0
  17216.  
  17217. ;===shell===
  17218.  
  17219. shellCmd = *
  17220.    jsr main
  17221.    lda #0
  17222.    sta shellExitFlag
  17223.    lda #255
  17224.    sta checkPromptFlag
  17225.    rts
  17226.  
  17227. ;===path===
  17228.  
  17229. pathPos = 4
  17230. pathArg = 6
  17231. pathSourcePos = 7
  17232.  
  17233. path = *
  17234.    lda #0
  17235.    sta pathPos
  17236.    lda aceArgc+1
  17237.    beq +
  17238.    rts
  17239. +  lda aceArgc
  17240.    cmp #2
  17241.    bcs pathSet
  17242.    lda #<pathMsg
  17243.    ldy #>pathMsg
  17244.    jsr puts
  17245.    lda #$00
  17246.    sta argBuffer+0
  17247.    sta argBuffer+1
  17248.    lda #<argBuffer
  17249.    ldy #>argBuffer
  17250.    sta zp+0
  17251.    sty zp+1
  17252.    lda #2
  17253.    jsr aceDirName
  17254.    
  17255.    displayPath = *
  17256.    ldy pathPos
  17257.    lda argBuffer,y
  17258.    bne +
  17259.    lda #chrCR
  17260.    jsr putchar
  17261.    rts
  17262. +  lda #chrQuote
  17263.    sta cmdBuffer
  17264.    ldx #1
  17265. -  lda argBuffer,y
  17266.    sta cmdBuffer,x
  17267.    beq +
  17268.    iny
  17269.    inx
  17270.    bne -
  17271. +  iny
  17272.    sty pathPos
  17273.    lda #chrQuote
  17274.    sta cmdBuffer,x
  17275.    inx
  17276.    lda #" "
  17277.    sta cmdBuffer,x
  17278.    inx
  17279.    lda #<cmdBuffer
  17280.    ldy #>cmdBuffer
  17281.    sta zp
  17282.    sty zp+1
  17283.    txa
  17284.    ldy #0
  17285.    ldx #1
  17286.    jsr write
  17287.    jmp displayPath
  17288.  
  17289.    pathMsg = *
  17290.    .asc "path "
  17291.    .byte 0
  17292.  
  17293. pathSet = *
  17294.    ldy #0
  17295.    sty pathPos
  17296.    lda #1
  17297.    sta pathArg
  17298.  
  17299.    pathNextArg = *
  17300.    lda pathArg
  17301.    ldy #0
  17302.    jsr getarg
  17303.    lda zp
  17304.    ora zp+1
  17305.    bne +
  17306.    lda #0
  17307.    ldy pathPos
  17308.    sta argBuffer,y
  17309.    iny
  17310.    lda #<argBuffer
  17311.    ldx #>argBuffer
  17312.    sta zp+0
  17313.    stx zp+1
  17314.    lda #$82
  17315.    jsr aceDirName
  17316.    rts
  17317. +  ldy #0
  17318.    ldx pathPos
  17319. -  lda (zp),y
  17320.    sta argBuffer,x
  17321.    beq +
  17322.    inx
  17323.    iny
  17324.    bne -
  17325. +  inx
  17326.    stx pathPos
  17327.    inc pathArg
  17328.    jmp pathNextArg
  17329.  
  17330. ;===dir===
  17331.  
  17332. ;*** ls 1.10: directory-lister program - by Craig Bruce
  17333.  
  17334. ; This file is in the BUDDY-assembler format
  17335.  
  17336. ; ls [-lcf] [[directory_name] [filename] ...]
  17337. ;
  17338. ; -l : long-form directory listing
  17339. ; -c : clear screen
  17340. ; -f : give number of files, bytes used, and bytes free at end of listing
  17341. ; -help : give usage information
  17342.  
  17343. ;*** global declarations
  17344.  
  17345. dirArg     = 2
  17346. dirName    = 4
  17347. dirString  = 8
  17348. dirFcb     = 16
  17349. dirColumns = 17
  17350. dirCurCol  = 18
  17351. dirLong    = 19
  17352. dirSpaces  = 20
  17353. dirlineLen = 21
  17354. dirChCols  = 22
  17355. dirPaged   = 23
  17356. dirShown   = 24
  17357. dirCls     = 25
  17358. dirFiles   = 32
  17359. dirBytes   = 36
  17360. dirFree    = 40
  17361. dirFileSum = 44
  17362. dirCheckFi = 45
  17363. dirWork    = 64
  17364.  
  17365. dirCmdDir = *
  17366.    lda #true
  17367.    sta dirCls
  17368.    sta dirLong
  17369.    lda #false
  17370.    sta dirFileSum
  17371.    jmp dirMainEntry
  17372.  
  17373. dirCmdD = *
  17374.    lda #false
  17375.    sta dirCls
  17376.    lda #true
  17377.    sta dirLong
  17378.    sta dirFileSum
  17379.    jmp dirMainEntry
  17380.  
  17381. dirCmdClsl = *
  17382.    lda #true
  17383.    sta dirCls
  17384.    lda #false
  17385.    sta dirLong
  17386.    sta dirFileSum
  17387.    jmp dirMainEntry
  17388.  
  17389. dirMain = *
  17390.    lda #false
  17391.    sta dirLong
  17392.    sta dirCls
  17393.    sta dirFileSum
  17394.    dirMainEntry = *
  17395.    lda #false
  17396.    sta dirPaged
  17397.    sta dirShown
  17398.    lda #true
  17399.    sta dirCheckFi
  17400.  
  17401.    lda #0
  17402.    ldy #0
  17403.    sta dirArg+0
  17404.    sty dirArg+1
  17405.  
  17406.    dirNextArg = *
  17407.    jsr aceConStopkey
  17408.    bcc +
  17409.    jmp dirStopped
  17410. +  inc dirArg+0
  17411.    bne +
  17412.    inc dirArg+1
  17413. +  lda dirArg+0
  17414.    ldy dirArg+1
  17415.    jsr getarg
  17416.    lda zp+0
  17417.    ora zp+1
  17418.    beq dirMainExit
  17419.    ldy #0
  17420.    lda (zp),y
  17421.    cmp #"-"
  17422.    bne dirNameArg
  17423.    jsr dirHandleOption
  17424.    jmp dirNextArg
  17425.  
  17426.    dirNameArg = *
  17427.    lda zp+0
  17428.    ldy zp+1
  17429.    sta dirName+0
  17430.    sty dirName+1
  17431.    jsr dir
  17432.    lda #true
  17433.    sta dirShown
  17434.    jmp dirNextArg
  17435.  
  17436. dirMainExit = *
  17437.    lda dirShown
  17438.    bne +
  17439.    lda #false
  17440.    sta dirCheckFi
  17441.    lda #<dirDefaultDir
  17442.    ldy #>dirDefaultDir
  17443.    sta dirName+0
  17444.    sty dirName+1
  17445.    jsr dir
  17446. +  rts
  17447.  
  17448.    dirDefaultDir = *
  17449.    .byte ".",":",0
  17450.  
  17451. dirHandleOption = *
  17452.    ldy #0
  17453.    sty dirWork+2
  17454.    lda zp+0
  17455.    ldy zp+1
  17456.    sta dirWork+0
  17457.    sty dirWork+1
  17458.  
  17459.    dirNextOption = *
  17460.    inc dirWork+2
  17461.    ldy dirWork+2
  17462.    lda (dirWork),y
  17463.    bne +
  17464.    rts
  17465. +  cmp #"f"
  17466.    bne +
  17467.    lda #true
  17468.    sta dirFileSum
  17469.    jmp dirNextOption
  17470. +  cmp #"l"
  17471.    bne +
  17472.    lda #true
  17473.    sta dirLong
  17474.    jmp dirNextOption
  17475. +  cmp #"c"
  17476.    bne +
  17477.    lda #true
  17478.    sta dirCls
  17479.    jmp dirNextOption
  17480. +  lda #<dirUsageMsg
  17481.    ldy #>dirUsageMsg
  17482.    jsr eputs
  17483.    lda #0
  17484.    ldx #0
  17485.    jmp aceProcExit
  17486.  
  17487. dirUsageMsg = *
  17488.    .asc  "ls [-lcf] [[directory_name] [filename] ...]"
  17489.    .byte chrCR,chrCR
  17490.    .asc  "    -l : long-form directory listing"
  17491.    .byte chrCR
  17492.    .asc  "    -c : clear screen before listing"
  17493.    .byte chrCR
  17494.    .asc  "    -f : give number of files, bytes used, and bytes free at "
  17495.    .asc  "end of listing"
  17496.    .byte chrCR
  17497.    .asc  " -help : give this help information"
  17498.    .byte chrCR,0
  17499.  
  17500. dirStopped = *
  17501.    lda #<dirStoppedMsg
  17502.    ldy #>dirStoppedMsg
  17503.    jsr eputs
  17504.    lda #1
  17505.    ldx #0
  17506.    jmp aceProcExit
  17507.    dirStoppedMsg = *
  17508.    .asc "<Stopped>"
  17509.    .byte chrCR,0
  17510.  
  17511. dirError = *
  17512.    lda #<dirErrorMsg1
  17513.    ldy #>dirErrorMsg1
  17514.    jsr eputs
  17515.    lda dirName+0
  17516.    ldy dirName+1
  17517.    jsr eputs
  17518.    lda #<dirErrorMsg2
  17519.    ldy #>dirErrorMsg2
  17520.    jmp eputs
  17521.  
  17522.    dirErrorMsg1 = *
  17523.    .asc "Error reading file/directory "
  17524.    .byte chrQuote,0
  17525.    dirErrorMsg2 = *
  17526.    .byte chrQuote,chrCR,0
  17527.  
  17528. dir = *
  17529.    bit dirCheckFi
  17530.    bpl +
  17531.    lda #<dirName
  17532.    ldy #>dirName
  17533.    jsr aceDirIsdir
  17534.    cpy #0
  17535.    bne +
  17536.    jmp dirFile
  17537. +  lda dirCls
  17538.    beq +
  17539.    lda #chrCLS
  17540.    jsr putchar
  17541. +  lda dirLong
  17542.    bne dirLsLong
  17543.  
  17544. dirLsShort = *
  17545.    ldx #1
  17546.    jsr aceFileInfo
  17547.    stx dirChCols
  17548.    cmp #0
  17549.    bne +
  17550.    txa
  17551.    ldx #$ff
  17552. -  inx
  17553.    sbc #20
  17554.    bcs -
  17555.    txa
  17556.    bne ++
  17557. +  lda #1
  17558. +  sta dirColumns
  17559.    jmp dirCommon
  17560.  
  17561. dirLsLong = *
  17562.    ldx #1
  17563.    jsr aceFileInfo
  17564.    stx dirChCols
  17565.    lda #1
  17566.    sta dirColumns
  17567.  
  17568. dirCommon = *
  17569.    lda #0
  17570.    sta dirCurCol
  17571.    ldx #3
  17572. -  sta dirBytes,x
  17573.    sta dirFiles,x
  17574.    dex
  17575.    bpl -
  17576.  
  17577.    dirGotName = *
  17578.    lda dirName+0
  17579.    ldy dirName+1
  17580.    sta zp+0
  17581.    sty zp+1
  17582.    jsr aceDirOpen
  17583.    bcc +
  17584.    jmp dirError
  17585. +  sta dirFcb
  17586.    ldx dirFcb
  17587.    jsr aceDirRead
  17588.    bcs dirExit
  17589.    beq dirExit
  17590.    jsr aceConStopkey
  17591.    bcc +
  17592.    jmp dirStopped
  17593. +  lda dirLong
  17594.    bpl dirNext
  17595.    jsr dirDisplayHeading
  17596.  
  17597.    dirNext = *
  17598.    ldx dirFcb 
  17599.    jsr aceDirRead
  17600.    bcs dirExit
  17601.    beq dirExit
  17602.    jsr aceConStopkey
  17603.    bcc +
  17604.    jsr dirExit
  17605.    jmp dirStopped
  17606. +  lda aceDirentName+0
  17607.    beq dirTrailerExit
  17608.    lda aceDirentUsage
  17609.    and #%00010000
  17610.    bne dirNext
  17611.    jsr dirDisplay
  17612.    jmp dirNext
  17613.  
  17614.    dirTrailerExit = *
  17615.    lda dirLong
  17616.    bpl dirExit
  17617.    jsr dirDisplayTrailer
  17618.    jmp dirExit
  17619.  
  17620.    dirExit = *
  17621.    lda dirCurCol
  17622.    beq +
  17623.    lda #chrCR
  17624.    jsr putchar
  17625. +  lda dirFcb
  17626.    jmp aceDirClose
  17627.  
  17628. dirDisplay = *
  17629.    bit aceDirentFlags
  17630.    bmi ++
  17631.    inc dirFiles+0
  17632.    bne +
  17633.    inc dirFiles+1
  17634.    bne +
  17635.    inc dirFiles+2
  17636.    bne +
  17637.    inc dirFiles+3
  17638. +  ldx #0
  17639.    ldy #4
  17640.    clc
  17641. -  lda dirBytes,x
  17642.    adc aceDirentBytes,x
  17643.    sta dirBytes,x
  17644.    inx
  17645.    dey
  17646.    bne -
  17647. +  bit dirLong
  17648.    bmi +
  17649.    jmp dirDisplayShort
  17650. +  jsr dirSetupDirline
  17651.    lda #<dirline
  17652.    ldy #>dirline
  17653.    sta zp+0
  17654.    sty zp+1
  17655.    lda dirlineLen
  17656.    ldy #0
  17657.    ldx #stdout
  17658.    jmp write
  17659.  
  17660. ;*            000000000011111111112222222222333333333344444444445555555555
  17661. ;*       pos: 012345678901234567890123456789012345678901234567890123456789
  17662. dirline .asc "drwx*e-t  00-Xxx-00  12:00a 12345678 *SEQ  1234567890123456\n"
  17663.         .byte 0
  17664. dirFlagNames .asc "drwx*e-t"
  17665. dirDateStr   .asc "  00-Xxx-00  12:00a "
  17666. dirDateEnd = *
  17667.  
  17668. dirSetupDirline = *
  17669.    ;** flags
  17670.    ldx #0
  17671.    lda aceDirentFlags
  17672. -  asl
  17673.    pha
  17674.    lda #"-"
  17675.    bcc +
  17676.    lda dirFlagNames,x
  17677. +  sta dirline+0,x
  17678.    pla
  17679.    inx
  17680.    cpx #8
  17681.    bcc -
  17682.  
  17683.    ;** date
  17684.    jsr dirPutInDate
  17685.    ldx #dirDateEnd-dirDateStr-1
  17686. -  lda dirDateStr,x
  17687.    sta dirline+8,x
  17688.    dex
  17689.    bpl -
  17690.  
  17691.    ;** bytes
  17692.    ldx #3
  17693. -  lda aceDirentBytes,x
  17694.    sta dirFree,x
  17695.    dex
  17696.    bpl -
  17697.    lda #<dirUtoaNumber
  17698.    ldy #>dirUtoaNumber
  17699.    sta zp+0
  17700.    sty zp+1
  17701.    lda #8
  17702.    ldx #dirFree
  17703.    jsr aceMiscUtoa
  17704.    ldy #28
  17705.    lda dirChCols
  17706.    cmp #60
  17707.    bcs +
  17708.    ldy #8
  17709. +  ldx #0
  17710. -  lda dirUtoaNumber,x
  17711.    sta dirline,y
  17712.    iny
  17713.    inx
  17714.    cpx #8
  17715.    bcc -
  17716.    lda #" "
  17717.    sta dirline,y
  17718.    iny
  17719.  
  17720.    ;** unclosed flag
  17721.    lda dirline+4
  17722.    cmp #"-"
  17723.    bne +
  17724.    lda #" "
  17725. +  sta dirline,y
  17726.    iny
  17727.  
  17728.    ;** filetype
  17729.    ldx #0
  17730. -  lda aceDirentType,x
  17731.    ora #$80
  17732.    sta dirline,y
  17733.    iny
  17734.    inx
  17735.    cpx #3
  17736.    bcc -
  17737.    lda #" "
  17738.    sta dirline,y
  17739.    iny
  17740.    sta dirline,y
  17741.    iny
  17742.  
  17743.    ;** filename
  17744.    ldx #0
  17745. -  lda aceDirentName,x
  17746.    beq +
  17747.    sta dirline,y
  17748.    iny
  17749.    inx
  17750.    bne -
  17751. +  lda #chrCR
  17752.    sta dirline,y
  17753.    iny
  17754.    lda #0
  17755.    sta dirline,y
  17756.    sty dirlineLen
  17757.    rts
  17758.  
  17759. dirDisplayShort = *
  17760.    lda #<aceDirentName
  17761.    ldy #>aceDirentName
  17762.    jsr puts
  17763.    inc dirCurCol
  17764.    lda dirCurCol
  17765.    cmp dirColumns
  17766.    bcc +
  17767.    lda #0
  17768.    sta dirCurCol
  17769.    lda #chrCR
  17770.    jmp putchar
  17771. +  ldy #$ff
  17772. -  iny
  17773.    lda aceDirentName,y
  17774.    bne -
  17775.    sty dirSpaces
  17776.    lda #20
  17777.    sbc dirSpaces
  17778.    sta dirSpaces
  17779. -  lda #" "
  17780.    jsr putchar
  17781.    dec dirSpaces
  17782.    bne -
  17783.    rts
  17784.  
  17785. dirDisplayHeading = *
  17786.    lda #<dirHeadingMsg
  17787.    ldy #>dirHeadingMsg
  17788.    jsr puts
  17789.    lda #<aceDirentName
  17790.    ldy #>aceDirentName
  17791.    jsr puts
  17792.    lda #chrCR
  17793.    jsr putchar
  17794.    rts
  17795.  
  17796.    dirHeadingMsg = *
  17797.    .asc "Dir: "
  17798.    .byte 0
  17799.  
  17800. dirDisplayTrailer = *
  17801.    ldx #3
  17802. -  lda aceDirentBytes,x
  17803.    sta dirFree,x
  17804.    dex
  17805.    bpl -
  17806.    ldx dirFileSum
  17807.    beq dirDisplayShortTrailer
  17808.    ldx #0
  17809.    ldy #0
  17810. -  lda dirTrailingMsg,x
  17811.    beq +
  17812.    cmp #4
  17813.    bcc dirStoreNum
  17814.    sta dirTrailBuf,y
  17815.    inx
  17816.    iny
  17817.    bne -
  17818. +  lda #<dirTrailBuf
  17819.    ldx #>dirTrailBuf
  17820.    sta zp+0
  17821.    stx zp+1
  17822.    tya
  17823.    ldy #0
  17824.    ldx #stdout
  17825.    jmp write
  17826.  
  17827.    dirDisplayShortTrailer = *
  17828.    lda #<dirUtoaNumber
  17829.    ldy #>dirUtoaNumber
  17830.    sta zp+0
  17831.    sty zp+1
  17832.    ldx #dirFree
  17833.    lda #0
  17834.    jsr aceMiscUtoa
  17835.    lda #<dirUtoaNumber
  17836.    ldy #>dirUtoaNumber
  17837.    jsr puts
  17838.    lda #<dirTrailShMsg
  17839.    ldy #>dirTrailShMsg
  17840.    jmp puts
  17841.  
  17842.    dirTrailShMsg = *
  17843.    .asc " bytes free"
  17844.    .byte chrCR,0
  17845.  
  17846.    dirStoreNum = *
  17847.    stx dirWork+0
  17848.    sty dirWork+1
  17849.    sec
  17850.    sbc #1
  17851.    asl
  17852.    asl
  17853.    adc #dirFiles
  17854.    tax
  17855.    lda #<dirUtoaNumber
  17856.    ldy #>dirUtoaNumber
  17857.    sta zp+0
  17858.    sty zp+1
  17859.    lda #1
  17860.    jsr aceMiscUtoa
  17861.    ldx #0
  17862.    ldy dirWork+1
  17863. -  lda dirUtoaNumber,x
  17864.    beq +
  17865.    sta dirTrailBuf,y
  17866.    inx
  17867.    iny
  17868.    bne -
  17869. +  ldx dirWork+0
  17870.    inx
  17871.    jmp --
  17872.  
  17873.    dirTrailingMsg = *
  17874.    .asc "files="
  17875.    .byte 1
  17876.    .asc "  bytes="
  17877.    .byte 2
  17878.    .asc "  free="
  17879.    .byte 3,chrCR,0
  17880.  
  17881.    dirTrailBuf .buf 64
  17882.  
  17883. dirPutInDate = *
  17884.    ;** year
  17885.    lda aceDirentDate+1
  17886.    ldx #9
  17887.    jsr dirPutDigits
  17888.    ;** month
  17889.    lda aceDirentDate+2
  17890.    cmp #$10
  17891.    bcc +
  17892.    sec
  17893.    sbc #$10-10
  17894. +  tax
  17895.    lda dirMonthStr+0,x
  17896.    sta dirDateStr+5
  17897.    lda dirMonthStr+13,x
  17898.    sta dirDateStr+6
  17899.    lda dirMonthStr+26,x
  17900.    sta dirDateStr+7
  17901.    ;** day
  17902.    lda aceDirentDate+3
  17903.    ldx #2
  17904.    jsr dirPutDigits
  17905.    ;** hour
  17906.    lda aceDirentDate+4
  17907.    ldx #"a"
  17908.    cmp #$00
  17909.    bne +
  17910.    lda #$12
  17911.    jmp dirPutHour
  17912. +  cmp #$12
  17913.    bcc dirPutHour
  17914.    ldx #"p"
  17915.    cmp #$12
  17916.    beq dirPutHour
  17917.    sei
  17918.    sed
  17919.    sec
  17920.    sbc #$12
  17921.    cld
  17922.    cli
  17923.    dirPutHour = *
  17924.    stx dirDateStr+18
  17925.    ldx #13
  17926.    jsr dirPutDigits
  17927.    ;** minute
  17928.    lda aceDirentDate+5
  17929.    ldx #16
  17930.    jsr dirPutDigits
  17931.    rts
  17932.  
  17933.    dirPutDigits = *  ;( .A=num, .X=offset )
  17934.    pha
  17935.    lsr
  17936.    lsr
  17937.    lsr
  17938.    lsr
  17939.    ora #$30
  17940.    sta dirDateStr,x
  17941.    pla
  17942.    and #$0f
  17943.    ora #$30
  17944.    sta dirDateStr+1,x
  17945.    rts
  17946.  
  17947.    dirMonthStr = *
  17948.    .asc "XJFMAMJJASOND"
  17949.    .asc "xaeapauuuecoe"
  17950.    .asc "xnbrrynlgptvc"
  17951.  
  17952. dirUtoaNumber .buf 11
  17953.  
  17954. dirFile = *
  17955.    ldx #stdout
  17956.    jsr aceFileInfo
  17957.    cpx #60
  17958.    bcc +
  17959.    lda #<dirFileLongMsg
  17960.    ldy #>dirFileLongMsg
  17961.    jmp ++
  17962. +  lda #<dirFileShortMsg
  17963.    ldy #>dirFileShortMsg
  17964. +  jsr puts
  17965.    lda dirName+0
  17966.    ldy dirName+1
  17967.    jsr puts
  17968.    lda #chrCR
  17969.    jsr putchar
  17970.    rts
  17971.  
  17972.    dirFileLongMsg = *
  17973.    .asc "*argument is a file--option not supported: "
  17974.    .byte 0
  17975.    dirFileShortMsg = *
  17976.    .asc "*argument is a file-n: "
  17977.    .byte 0
  17978.  
  17979. ;******** standard library ********
  17980.  
  17981. eputs = *
  17982.    ldx #stderr
  17983.    jmp fputs
  17984. puts = *
  17985.    ldx #stdout
  17986. fputs = *
  17987.    sta zp+0
  17988.    sty zp+1
  17989. zpputs = *
  17990.    ldy #$ff
  17991. -  iny
  17992.    lda (zp),y
  17993.    bne -
  17994.    tya
  17995.    ldy #0
  17996.    jmp write
  17997.  
  17998. putchar = *
  17999.    ldx #stdout
  18000. putc = *
  18001.    sta putcBuffer
  18002.    lda #<putcBuffer
  18003.    ldy #>putcBuffer
  18004.    sta zp+0
  18005.    sty zp+1
  18006.    lda #1
  18007.    ldy #0
  18008.    jmp write
  18009.    putcBuffer .buf 1
  18010.  
  18011. getchar = *
  18012.    ldx #stdin
  18013. getc = *
  18014.    lda #<getcBuffer
  18015.    ldy #>getcBuffer
  18016.    sta zp+0
  18017.    sty zp+1
  18018.    lda #1
  18019.    ldy #0
  18020.    jsr read
  18021.    beq +
  18022.    lda getcBuffer
  18023.    rts
  18024. +  sec
  18025.    rts
  18026.    getcBuffer .buf 1
  18027.  
  18028. cls = *
  18029.    lda #chrCLS
  18030.    jmp putchar
  18031.  
  18032. getarg = *
  18033.    sty zp+1
  18034.    asl
  18035.    sta zp+0
  18036.    rol zp+1
  18037.    clc
  18038.    lda aceArgv+0
  18039.    adc zp+0
  18040.    sta zp+0
  18041.    lda aceArgv+1
  18042.    adc zp+1
  18043.    sta zp+1
  18044.    ldy #0
  18045.    lda (zp),y
  18046.    tax
  18047.    iny
  18048.    lda (zp),y
  18049.    stx zp+0
  18050.    sta zp+1
  18051.    ora zp+0
  18052.    rts
  18053.  
  18054. ;===bss===
  18055.  
  18056. bss           = *
  18057. cmdBuffer     = bss+0
  18058. copyBuffer    = bss+0
  18059. argBuffer     = cmdBuffer+256
  18060. argArgvBuffer = argBuffer+256
  18061.