home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / compsrcs / apple2 / 26 < prev    next >
Encoding:
Internet Message Format  |  1990-11-26  |  29.5 KB

  1. Path: wuarchive!zaphod.mps.ohio-state.edu!mips!dimacs.rutgers.edu!aramis.rutgers.edu!remus.rutgers.edu!paul.rutgers.edu!jac
  2. From: jac@paul.rutgers.edu (Jonathan A. Chandross)
  3. Newsgroups: comp.sources.apple2
  4. Subject: v001SRC006:  Apple ][ Simulator Part 3/3 (Koning Version)
  5. Message-ID: <Nov.18.20.59.54.1990.26281@paul.rutgers.edu>
  6. Date: 19 Nov 90 01:59:57 GMT
  7. Organization: Rutgers Univ., New Brunswick, N.J.
  8. Lines: 1224
  9. Approved: jac@paul.rutgers.edu
  10.  
  11.  
  12. Submitted-by: None
  13. Posting-number: Volume 1, Source:6
  14. Archive-name: unix/simulator/koning/part03
  15. Architecture: UNIX
  16. Version-number: 1.00
  17.  
  18.  
  19. =debug.c
  20. -#include "apple.h"
  21. -#include <curses.h>
  22. -
  23. -int DebugSingle;
  24. -int DebugTrace;
  25. -ADDR DebugBreak;
  26. -FILE *DebugFile;
  27. -
  28. -void htob (out, byte)
  29. -FILE *out;
  30. -BYTE byte;
  31. -{
  32. -  register int i;
  33. -  
  34. -  for (i = 7; i >= 0; i--)
  35. -    (void)fputc (byte & (1 << i) ? '1' : '0', out);
  36. -}
  37. -    
  38. -void DebugDisasm (out)
  39. -FILE *out;
  40. -{
  41. -  int opcode = MegaGetMem (PPC);
  42. -  int n;
  43. -  char * mne;
  44. -
  45. -  switch (opcode)
  46. -  {
  47. -  case 0x69:    /* ADC #dd */
  48. -    mne = "ADC #$%2X"; n = 1; 
  49. -    break;
  50. -  case 0x65:    /* ADC aa */
  51. -    mne = "ADC  $%2X"; n = 1; 
  52. -    break;
  53. -  case 0x75:    /* ADC aa,X */
  54. -    mne = "ADC  $%2X,X"; n = 1; 
  55. -    break;
  56. -  case 0x6d:    /* ADC aaaa */
  57. -    mne = "ADC  $%4X"; n = 2; 
  58. -    break;
  59. -  case 0x7d:    /* ADC aaaa,X */
  60. -    mne = "ADC  $%4X,X"; n = 2; 
  61. -    break;
  62. -  case 0x79:    /* ADC aaaa,Y */
  63. -    mne = "ADC  $%4X,Y"; n = 2; 
  64. -    break;
  65. -  case 0x61:    /* ADC (aa,X) */
  66. -    mne = "ADC  $(%2X,X)"; n = 1; 
  67. -    break;
  68. -  case 0x71:    /* ADC (aa),Y */
  69. -    mne = "ADC  $(%2X),Y"; n = 1; 
  70. -    break;
  71. -  case 0x29:    /* AND #dd */
  72. -    mne = "AND #$%2X"; n = 1; 
  73. -    break;
  74. -  case 0x25:    /* AND aa */
  75. -    mne = "AND  $%2X"; n = 1; 
  76. -    break;
  77. -  case 0x35:    /* AND aa,X */
  78. -    mne = "AND  $%2X,X"; n = 1; 
  79. -    break;
  80. -  case 0x2d:    /* AND aaaa */
  81. -    mne = "AND  $%4X"; n = 2; 
  82. -    break;
  83. -  case 0x3d:    /* AND aaaa,X */
  84. -    mne = "AND  $%4X,X"; n = 2; 
  85. -    break;
  86. -  case 0x39:    /* AND aaaa,Y */
  87. -    mne = "AND  $%4X,Y"; n = 2; 
  88. -    break;
  89. -  case 0x21:    /* AND (aa,X) */
  90. -    mne = "AND  $(%2X,X)"; n = 1; 
  91. -    break;
  92. -  case 0x31:    /* AND (aa),Y */
  93. -    mne = "AND  ($%2X),Y"; n = 1; 
  94. -    break;
  95. -  case 0x0a:    /* ASL A */
  96. -    mne = "ASL  A"; n = 0; 
  97. -    break;
  98. -  case 0x06:    /* ASL aa */
  99. -    mne = "ASL  $%2X"; n = 1; 
  100. -    break;
  101. -  case 0x16:    /* ASL aa,X */
  102. -    mne = "ASL  $%2X,X"; n = 1; 
  103. -    break;
  104. -  case 0x0e:    /* ASL aaaa */
  105. -    mne = "ASL  $%4X"; n = 2; 
  106. -    break;
  107. -  case 0x1e:    /* ASL aaaa,X */
  108. -    mne = "ASL  $%4X,X"; n = 2; 
  109. -    break;
  110. -  case 0x90:    /* BCC rr */
  111. -    mne = "BCC  $%2X"; n = -1; 
  112. -    break;
  113. -  case 0xb0:    /* BCS rr */
  114. -    mne = "BCS  $%2X"; n = -1; 
  115. -    break;
  116. -  case 0xf0:    /* BEQ rr */
  117. -    mne = "BEQ  $%2X"; n = -1; 
  118. -    break;
  119. -  case 0x24:    /* BIT aa */
  120. -    mne = "BIT  $%2X"; n = 1; 
  121. -    break;
  122. -  case 0x2c:    /* BIT aaaa */
  123. -    mne = "BIT  $%4X"; n = 2; 
  124. -    break;
  125. -  case 0x30:    /* BMI rr */
  126. -    mne = "BMI  $%2X"; n = -1; 
  127. -    break;
  128. -  case 0xd0:    /* BNE rr */
  129. -    mne = "BNE  $%2X"; n = -1; 
  130. -    break;
  131. -  case 0x10:    /* BPL rr */
  132. -    mne = "BPL  $%2X"; n = -1; 
  133. -    break;
  134. -  case 0x00:     /* BRK */
  135. -    mne = "BRK"; n = 0; 
  136. -    break;
  137. -  case 0x50:    /* BVC rr */
  138. -    mne = "BVC  $%2X"; n = -1; 
  139. -    break;
  140. -  case 0x70:    /* BVS rr */
  141. -    mne = "BVS  $%2X"; n = -1; 
  142. -    break;
  143. -  case 0x18:    /* CLC */
  144. -    mne = "CLC"; n = 0; 
  145. -    break;
  146. -  case 0xd8:    /* CLD */
  147. -    mne = "CLD"; n = 0; 
  148. -    break;
  149. -  case 0x58:    /* CLI */
  150. -    mne = "CLI"; n = 0; 
  151. -    break;
  152. -  case 0xb8:    /* CLV */
  153. -    mne = "CLV"; n = 0; 
  154. -    break;
  155. -  case 0xc9:    /* CMP #dd */
  156. -    mne = "CMP #$%2X"; n = 1; 
  157. -    break;
  158. -  case 0xc5:    /* CMP aa */
  159. -    mne = "CMP  $%2X"; n = 1; 
  160. -    break;
  161. -  case 0xd5:    /* CMP aa,X */
  162. -    mne = "CMP  $%2X,X"; n = 1; 
  163. -    break;
  164. -  case 0xcd:    /* CMP aaaa */
  165. -    mne = "CMP  $%4X"; n = 2; 
  166. -    break;
  167. -  case 0xdd:    /* CMP aaaa,X */
  168. -    mne = "CMP  $%4X,X"; n = 2; 
  169. -    break;
  170. -  case 0xd9:    /* CMP aaaa,Y */
  171. -    mne = "CMP  $%4X,Y"; n = 2; 
  172. -    break;
  173. -  case 0xc1:    /* CMP (aa,X) */
  174. -    mne = "CMP  $(%2X,X)"; n = 1; 
  175. -    break;
  176. -  case 0xd1:    /* CMP (aa),y */
  177. -    mne = "CMP  $(%2X),y"; n = 1; 
  178. -    break;
  179. -  case 0xe0:    /* CPX #dd */
  180. -    mne = "CPX #$%2X"; n = 1; 
  181. -    break;
  182. -  case 0xe4:    /* CPX aa */
  183. -    mne = "CPX  $%2X"; n = 1; 
  184. -    break;
  185. -  case 0xec:    /* CPX aaaa */
  186. -    mne = "CPX  $%4X"; n = 2; 
  187. -    break;
  188. -  case 0xc0:    /* CPY #dd */
  189. -    mne = "CPY #$%2X"; n = 1; 
  190. -    break;
  191. -  case 0xc4:    /* CPY aa */
  192. -    mne = "CPY  $%2X"; n = 1; 
  193. -    break;
  194. -  case 0xcc:    /* CPY aaaa */
  195. -    mne = "CPY  $%4X"; n = 2; 
  196. -    break;
  197. -  case 0xc6:    /* DEC aa */
  198. -    mne = "DEC  $%2X"; n = 1; 
  199. -    break;
  200. -  case 0xd6:    /* DEC aa,X */
  201. -    mne = "DEC  $%2X,X"; n = 1; 
  202. -    break;
  203. -  case 0xce:    /* DEC aaaa */
  204. -    mne = "DEC  $%4X"; n = 2; 
  205. -    break;
  206. -  case 0xde:    /* DEC aaaa,X */
  207. -    mne = "DEC  $%4X,X"; n = 2; 
  208. -    break;
  209. -  case 0xca:    /* DEX */
  210. -    mne = "DEX"; n = 0; 
  211. -    break;
  212. -  case 0x88:    /* DEY */
  213. -    mne = "DEY"; n = 0; 
  214. -    break;
  215. -  case 0x49:    /* EOR #dd */
  216. -    mne = "EOR #$%2X"; n = 1; 
  217. -    break;
  218. -  case 0x45:    /* EOR aa */
  219. -    mne = "EOR  $%2X"; n = 1; 
  220. -    break;
  221. -  case 0x55:    /* EOR aa,X */
  222. -    mne = "EOR  $%2X,X"; n = 1; 
  223. -    break;
  224. -  case 0x4d:    /* EOR aaaa */
  225. -    mne = "EOR  $%4X"; n = 2; 
  226. -    break;
  227. -  case 0x5d:    /* EOR aaaa,X */
  228. -    mne = "EOR  $%4X,X"; n = 2; 
  229. -    break;
  230. -  case 0x59:    /* EOR aaaa,Y */
  231. -    mne = "EOR  $%4X,Y"; n = 2; 
  232. -    break;
  233. -  case 0x41:    /* EOR (aa,X) */
  234. -    mne = "EOR  ($%2X,X)"; n = 1; 
  235. -    break;
  236. -  case 0x51:    /* EOR (aa),Y */
  237. -    mne = "EOR  ($%2X),Y"; n = 1; 
  238. -    break;
  239. -  case 0xe6:    /* INC aa */
  240. -    mne = "INC  $%2X"; n = 1; 
  241. -    break;
  242. -  case 0xf6:    /* INC aa,X */
  243. -    mne = "INC  $%2X,X"; n = 1; 
  244. -    break;
  245. -  case 0xee:    /* INC aaaa */
  246. -    mne = "INC  $%4X"; n = 2; 
  247. -    break;
  248. -  case 0xfe:    /* INC aaaa,X */
  249. -    mne = "INC  $%4X,X"; n = 2; 
  250. -    break;
  251. -  case 0xe8:    /* INX */
  252. -    mne = "INX"; n = 0; 
  253. -    break;
  254. -  case 0xc8:    /* INY */
  255. -    mne = "INY"; n = 0; 
  256. -    break;
  257. -  case 0x4c:    /* JMP aaaa */
  258. -    mne = "JMP  $%4X"; n = 2; 
  259. -    break;
  260. -  case 0x6c:    /* JMP (aaaa) */
  261. -    mne = "JMP  ($%4X)"; n = 2; 
  262. -    break;
  263. -  case 0x20:    /* JSR aaaa */
  264. -    mne = "JSR  $%4X"; n = 2; 
  265. -    break;
  266. -  case 0xa9:    /* LDA #dd */
  267. -    mne = "LDA #$%2X"; n = 1; 
  268. -    break;
  269. -  case 0xa5:    /* LDA aa */
  270. -    mne = "LDA  $%2X"; n = 1; 
  271. -    break;
  272. -  case 0xb5:    /* LDA aa,X */
  273. -    mne = "LDA  $%2X,X"; n = 1; 
  274. -    break;
  275. -  case 0xad:    /* LDA aaaa */
  276. -    mne = "LDA  $%4X"; n = 2; 
  277. -    break;
  278. -  case 0xbd:    /* LDA aaaa,X */
  279. -    mne = "LDA  $%4X,X"; n = 2; 
  280. -    break;
  281. -  case 0xb9:    /* LDA aaaa,Y */
  282. -    mne = "LDA  $%4X,Y"; n = 2; 
  283. -    break;
  284. -  case 0xa1:    /* LDA (aa,X) */
  285. -    mne = "LDA  ($%2X,X)"; n = 1; 
  286. -    break;
  287. -  case 0xb1:    /* LDA (aa),Y */
  288. -    mne = "LDA  ($%2X),Y"; n = 1; 
  289. -    break;
  290. -  case 0xa2:    /* LDX #dd */
  291. -    mne = "LDX #$%2X"; n = 1; 
  292. -    break;
  293. -  case 0xa6:    /* LDX aa */
  294. -    mne = "LDX  $%2X"; n = 1; 
  295. -    break;
  296. -  case 0xb6:    /* LDX aa,Y */
  297. -    mne = "LDX  $%2X,Y"; n = 1; 
  298. -    break;
  299. -  case 0xae:    /* LDX aaaa */
  300. -    mne = "LDX  $%4X"; n = 2; 
  301. -    break;
  302. -  case 0xbe:    /* LDX aaaa,Y */
  303. -    mne = "LDX  $%4X,Y"; n = 2; 
  304. -    break;
  305. -  case 0xa0:    /* LDY #dd */
  306. -    mne = "LDY #$%2X"; n = 1; 
  307. -    break;
  308. -  case 0xa4:    /* LDY aa */
  309. -    mne = "LDY  $%2X"; n = 1; 
  310. -    break;
  311. -  case 0xb4:    /* LDY aa,X */
  312. -    mne = "LDY  $%2X,X"; n = 1; 
  313. -    break;
  314. -  case 0xac:    /* LDY aaaa */
  315. -    mne = "LDY  $%4X"; n = 2; 
  316. -    break;
  317. -  case 0xbc:    /* LDY aaaa,X */
  318. -    mne = "LDY  $%4X,X"; n = 2; 
  319. -    break;
  320. -  case 0x4a:    /* LSR A */
  321. -    mne = "LSR"; n = 0; 
  322. -    break;
  323. -  case 0x46:    /* LSR aa */
  324. -    mne = "LSR  $%2X"; n = 1; 
  325. -    break;
  326. -  case 0x56:    /* LSR aa,X */
  327. -    mne = "LSR  $%2X,X"; n = 1; 
  328. -    break;
  329. -  case 0x4e:    /* LSR aaaa */
  330. -    mne = "LSR  $%4X"; n = 2; 
  331. -    break;
  332. -  case 0x5e:    /* LSR aaaa,X */
  333. -    mne = "LSR  $%4X,X"; n = 2; 
  334. -    break;
  335. -  case 0xea:    /* NOP */
  336. -    mne = "NOP"; n = 0; 
  337. -    break;
  338. -  case 0x09:    /* ORA #dd */
  339. -    mne = "ORA #$%2X"; n = 1; 
  340. -    break;
  341. -  case 0x05:    /* ORA aa */
  342. -    mne = "ORA  $%2X"; n = 1; 
  343. -    break;
  344. -  case 0x15:    /* ORA aa,X */
  345. -    mne = "ORA  $%2X,X"; n = 1; 
  346. -    break;
  347. -  case 0x0d:    /* ORA aaaa */
  348. -    mne = "ORA  $%4X"; n = 2; 
  349. -    break;
  350. -  case 0x1d:    /* ORA aaaa,X */
  351. -    mne = "ORA  $%4X,X"; n = 2; 
  352. -    break;
  353. -  case 0x19:    /* ORA aaaa,Y */
  354. -    mne = "ORA  $%4X,Y"; n = 2; 
  355. -    break;
  356. -  case 0x01:    /* ORA (aa,X) */
  357. -    mne = "ORA  ($%2X,X)"; n = 1; 
  358. -    break;
  359. -  case 0x11:    /* ORA (aa),Y */
  360. -    mne = "ORA  ($%2X),Y"; n = 1; 
  361. -    break;
  362. -  case 0x48:    /* PHA */
  363. -    mne = "PHA"; n = 0; 
  364. -    break;
  365. -  case 0x08:    /* PHP */
  366. -    mne = "PHP"; n = 0; 
  367. -    break;
  368. -  case 0x68:    /* PLA */
  369. -    mne = "PLA"; n = 0; 
  370. -    break;
  371. -  case 0x28:    /* PLP */
  372. -    mne = "PLP"; n = 0; 
  373. -    break;
  374. -  case 0x2a:    /* ROL A */
  375. -    mne = "ROL  A"; n = 0; 
  376. -    break;
  377. -  case 0x26:    /* ROL aa */
  378. -    mne = "ROL  $%2X"; n = 1; 
  379. -    break;
  380. -  case 0x36:    /* ROL aa,X */
  381. -    mne = "ROL  $%2X,X"; n = 1; 
  382. -    break;
  383. -  case 0x2e:    /* ROL aaaa */
  384. -    mne = "ROL  $%4X"; n = 2; 
  385. -    break;
  386. -  case 0x3e:    /* ROL aaaa,X */
  387. -    mne = "ROL  $%4X,X"; n = 2; 
  388. -    break;
  389. -  case 0x6a:    /* ROR A */
  390. -    mne = "ROR  A"; n = 0; 
  391. -    break;
  392. -  case 0x66:    /* ROR aa */
  393. -    mne = "ROR  $%2X"; n = 1; 
  394. -    break;
  395. -  case 0x76:    /* ROR aa,X */
  396. -    mne = "ROR  $%2X,X"; n = 1; 
  397. -    break;
  398. -  case 0x6e:    /* ROR aaaa */
  399. -    mne = "ROR  $%4X"; n = 2; 
  400. -    break;
  401. -  case 0x7e:    /* ROR aaaa,X */
  402. -    mne = "ROR  $%4X,X"; n = 2; 
  403. -    break;
  404. -  case 0x40:    /* RTI */
  405. -    mne = "RTI"; n = 0; 
  406. -    break;
  407. -  case 0x60:    /* RTS */
  408. -    mne = "RTS"; n = 0; 
  409. -    break;
  410. -  case 0xe9:    /* SBC #dd */
  411. -    mne = "SBC #$%2X"; n = 1; 
  412. -    break;
  413. -  case 0xe5:    /* SBC aa */
  414. -    mne = "SBC  $%2X"; n = 1; 
  415. -    break;
  416. -  case 0xf5:    /* SBC aa,x */
  417. -    mne = "SBC  $%2X,X"; n = 1; 
  418. -    break;
  419. -  case 0xed:    /* SBC aaaa */
  420. -    mne = "SBC  $%4X"; n = 2; 
  421. -    break;
  422. -  case 0xfd:    /* SBC aaaa,X */
  423. -    mne = "SBC  $%4X,X"; n = 2; 
  424. -    break;
  425. -  case 0xf9:    /* SBC aaaa,Y */
  426. -    mne = "SBC  $%4X,Y"; n = 2; 
  427. -    break;
  428. -  case 0xe1:    /* SBC (aa,X) */
  429. -    mne = "SBC  ($%2X,X)"; n = 1; 
  430. -    break;
  431. -  case 0xf1:    /* SBC (aa),Y */
  432. -    mne = "SBC  ($%2X),Y"; n = 1; 
  433. -    break;
  434. -  case 0x38:     /* SEC */
  435. -    mne = "SEC"; n = 0; 
  436. -    break;
  437. -  case 0xf8:     /* SED */
  438. -    mne = "SED"; n = 0; 
  439. -    break;
  440. -  case 0x78:     /* SEI */
  441. -    mne = "SEI"; n = 0; 
  442. -    break;
  443. -  case 0x85:     /* STA aa */
  444. -    mne = "STA  $%2X"; n = 1; 
  445. -    break;
  446. -  case 0x95:     /* STA aa,X */
  447. -    mne = "STA  $%2X,X"; n = 1; 
  448. -    break;
  449. -  case 0x8d:     /* STA aaaa */
  450. -    mne = "STA  $%4X"; n = 2; 
  451. -    break;
  452. -  case 0x9d:     /* STA aaaa,X */
  453. -    mne = "STA  $%4X,X"; n = 2; 
  454. -    break;
  455. -  case 0x99:     /* STA aaaa,Y */
  456. -    mne = "STA  $%4X,Y"; n = 2; 
  457. -    break;
  458. -  case 0x81:     /* STA (aa,X) */
  459. -    mne = "STA  ($%2X,X)"; n = 1; 
  460. -    break;
  461. -  case 0x91:     /* STA (aa),Y */
  462. -    mne = "STA  ($%2X),Y"; n = 1; 
  463. -    break;
  464. -  case 0x86:     /* STX aa */
  465. -    mne = "STX  $%2X"; n = 1; 
  466. -    break;
  467. -  case 0x96:     /* STX aa,Y */
  468. -    mne = "STX  $%2X,Y"; n = 1; 
  469. -    break;
  470. -  case 0x8e:     /* STX aaaa */
  471. -    mne = "STX  $%4X"; n = 2; 
  472. -    break;
  473. -  case 0x84:     /* STY aa */
  474. -    mne = "STY  $%2X"; n = 1; 
  475. -    break;
  476. -  case 0x94:     /* STY aa,X */
  477. -    mne = "STY  $%2X,X"; n = 1; 
  478. -    break;
  479. -  case 0x8c:     /* STY aaaa */
  480. -    mne = "STY  $%4X"; n = 2; 
  481. -    break;
  482. -  case 0xaa:     /* TAX */
  483. -    mne = "TAX"; n = 0; 
  484. -    break;
  485. -  case 0xa8:     /* TAY */
  486. -    mne = "TAY"; n = 0; 
  487. -    break;
  488. -  case 0xba:     /* TSX */
  489. -    mne = "TSX"; n = 0; 
  490. -    break;
  491. -  case 0x8a:     /* TXA */
  492. -    mne = "TXA"; n = 0; 
  493. -    break;
  494. -  case 0x9a:     /* TXS */
  495. -    mne = "TXS"; n = 0; 
  496. -    break;
  497. -  case 0x98:     /* TYA */
  498. -    mne = "TYA"; n = 0; 
  499. -    break;
  500. -  default:     /* Undefined opcode */
  501. -    mne = "UNDEFINED"; n = 0; 
  502. -    break;
  503. -  }
  504. -  (void)fprintf (out, "%4X: ", PPC);
  505. -  switch (n)
  506. -  {
  507. -  case -1:
  508. -    (void)fprintf (out, mne, PPC + (char)MegaGetMem (PPC + 1) + 2);
  509. -    break;
  510. -  case 0:
  511. -    (void)fprintf (out, mne);
  512. -    break;
  513. -  case 1:
  514. -    (void)fprintf (out, mne, MegaGetMem (PPC + 1));
  515. -    break;
  516. -  case 2:
  517. -    (void)fprintf (out, mne, MegaGetMem (PPC + 1) + 256 * MegaGetMem (PPC + 2));
  518. -    break;
  519. -  }
  520. -  (void)fputc ('\n', out);
  521. -}
  522. -
  523. -
  524. -
  525. -
  526. -void Debugger()
  527. -{
  528. -  int   done = 0;
  529. -  FILE *out  = stdout;
  530. -  char  buffer[255];
  531. -
  532. -  echo();
  533. -  noraw();
  534. -  standend();
  535. -  refresh();
  536. -
  537. -  if (DebugTrace)
  538. -    out = DebugFile;
  539. -
  540. -  (void)fprintf (out, "     A=%2X, Y=%2X, X=%2X, S=%2X, P=%%",A,Y,X,S);
  541. -  htob (out, (BYTE)P);
  542. -  (void)fprintf (out, "   |  ");
  543. -  DebugDisasm (out);
  544. -  if (!DebugTrace && !DebugSingle)
  545. -  {
  546. -    (void)printf ("\nApple ][+ Emulator Debugger\n");
  547. -  }
  548. -
  549. -  if (DebugTrace) goto traceout;
  550. -
  551. -  while (!done)
  552. -  {
  553. -    (void)printf ("DBG> "); 
  554. -    (void)fflush (stdout);
  555. -    (void)gets (buffer);
  556. -
  557. -    switch (buffer[0])
  558. -    {
  559. -    case 'q': 
  560. -      DebugSingle    = 0; 
  561. -      DebugTrace     = 0;
  562. -      MegaQuitDetect = 1;
  563. -      done           = 1;
  564. -      break;
  565. -    case 'l':               /* load */
  566. -    {
  567. -      ADDR addr = 0x2000;
  568. -      FILE *fp;
  569. -      int  ch;
  570. -
  571. -      (void)printf ("Filename: "); 
  572. -      (void)fflush (stdout);
  573. -      (void)gets (buffer);
  574. -      fp = fopen (buffer, "r");
  575. -      while ((ch = fgetc (fp)) != EOF)
  576. -        MegaPutMem (addr++, (BYTE)ch);
  577. -
  578. -      (void)printf ("%s: loaded at ,a$2000, l$%x\n", buffer, addr - 0x2000 - 1);
  579. -      MegaQuitDetect = 0;
  580. -      done           = 0;
  581. -      break;
  582. -    }
  583. -    case 't': 
  584. -      (void)printf ("Filename: "); 
  585. -      (void)fflush (stdout);
  586. -      (void)gets (buffer);
  587. -      DebugFile      = fopen (buffer, "w");
  588. -      DebugTrace     = 1;
  589. -      MegaQuitDetect = 0;
  590. -      done           = 0;
  591. -      break;
  592. -    case 'c': 
  593. -      DebugSingle    = 0;
  594. -      MegaQuitDetect = 0;
  595. -      done           = 1;
  596. -      break;
  597. -    case 's': 
  598. -    case '\0':
  599. -      DebugSingle    = 1;
  600. -      DebugTrace     = 0;
  601. -      MegaQuitDetect = 0;
  602. -      done           = 1;
  603. -      break;
  604. -    default:
  605. -      MegaQuitDetect = 0;
  606. -    }
  607. -  }
  608. -traceout:
  609. -  raw();
  610. -  noecho();
  611. -}
  612. -
  613. -
  614. =main.c
  615. -
  616. -/*
  617. - *main.c -- Globals and emulation setup for Apple ][ Emulator
  618. - *(C) 1989 Ben Koning [556498717 408/738-1763 ben@apple.com]
  619. - */
  620. -
  621. -#include "apple.h"
  622. -#include <curses.h>
  623. -#define REF_DELAY 2000
  624. -
  625. -main (argc,argv)
  626. -
  627. -int    argc;
  628. -char    *argv [];
  629. -
  630. -{
  631. -  short int byte;
  632. -  int i, addr;                  /* Loop iterators */
  633. -  int refdelay = REF_DELAY;
  634. -  FILE *fp;
  635. -  char *D0FILE = "APPLESOFT.ROM",
  636. -       *F8FILE = "AUTOSTART.ROM" ;
  637. -  
  638. -  /* Interpret args: 'invokename [-t] [-m] [-i]' */
  639. -  for (i = 1;   i <= argc-1;   i++)
  640. -  {
  641. -    if (!strcmp (argv [i],"-t"))
  642. -      DebugSingle = 1;
  643. -    else
  644. -      if (!strcmp (argv [i],"-m"))
  645. -        F8FILE = "MONITOR.ROM";
  646. -      else
  647. -    if (!strcmp (argv [i],"-i"))
  648. -          D0FILE = "INTEGER.ROM";
  649. -    else
  650. -    {
  651. -      (void)fprintf (stderr,"Usage: %s [-t] [-m] [-i]\n",
  652. -           argv [0]);
  653. -      exit (1);
  654. -    }
  655. -  }
  656. -  
  657. -  /* Print banner message: */
  658. -  (void)fprintf (stderr,"%s: Apple ][ Emulation - Ben Koning - v1.0\n",
  659. -       argv [0]);
  660. -  
  661. -  (void)initscr();
  662. -
  663. -  /*--------------------------------------------------*\
  664. -    Load the 'ROM' with the appropriate 6502 code:
  665. -  \*--------------------------------------------------*/ 
  666. -  fp = fopen (D0FILE, "r");
  667. -  for (addr = 0xd000;   addr <= 0xf7ff;   addr++)
  668. -    Rom [addr - 0xd000] = fgetc (fp);
  669. -  (void)fclose (fp);
  670. -
  671. -  fp = fopen (F8FILE, "r");
  672. -  for (addr = 0xf800;   addr <= 0xffff;   addr++)
  673. -    Rom [addr - 0xd000] = fgetc (fp);
  674. -  (void)fclose (fp);
  675. -
  676. -  /*--------------------------------------------------*\
  677. -    load prodos as $2000
  678. -  \*--------------------------------------------------*/
  679. -  fp = fopen ("PRODOS", "r");
  680. -  addr = 0x2000;
  681. -  while ((byte = fgetc (fp)) != EOF)
  682. -    MMemory [addr++] = byte;
  683. -  (void)fclose (fp);
  684. -  
  685. -  /* Make sure banner message is seen: */
  686. -  sleep (2);
  687. -  
  688. -  /* Initialize the emulation: */
  689. -  MegaStartUp ();
  690. -  CPUReset ();
  691. -  
  692. -  /*--------------------------------------------------*\
  693. -    Run it until user wants to quit:
  694. -  \*--------------------------------------------------*/
  695. -  while (!MegaQuitDetect)
  696. -  {
  697. -    CPUExecute ();
  698. -    if (!(--refdelay))
  699. -    {
  700. -      refresh();
  701. -      refdelay = REF_DELAY;
  702. -    }
  703. -    if (MegaQuitDetect || DebugSingle || DebugTrace)
  704. -      Debugger();
  705. -  }
  706. -  
  707. -  /* Exit cleanly: */
  708. -  MegaShutDown ();
  709. -  exit (0);
  710. -}
  711. -
  712. -
  713. -
  714. =mega2.c
  715. -/*
  716. - *mega2.c -- Apple ][ soft switches->UNIX emulation for Apple ][ Emulator
  717. - *(C) 1989 Ben Koning [556498717 408/738-1763 ben@apple.com]
  718. - */
  719. -
  720. -#include "apple.h"
  721. -#include <curses.h>
  722. -
  723. -
  724. -/*
  725. - * Termcap globals: 
  726. - */
  727. -
  728. -
  729. -/*
  730. - * Emulation globals:
  731. - */
  732. -
  733. -BYTE MMemory [49152];     /* Main memory                         */
  734. -BYTE Rom [12288];         /* 12K ROM bank of Main memory         */
  735. -BYTE MRam [12288];        /* 12K RAM bank of Main memory         */
  736. -BYTE MRam1 [4096];        /* Main bank 1 $D000-$DFFF             */
  737. -BYTE MRam2 [4096];        /* Main bank 2 $D000-$DFFF             */
  738. -BYTE RamRead     = 0;     /* set if 16K RAM readable             */
  739. -BYTE RamWrite    = 0;     /* set if 16K RAM writeable            */
  740. -BYTE Bank2Enable = 0;     /* set if bank 2 Ram enabled           */
  741. -
  742. -BYTE MegaRand    = 0;     /* Always contains 8-bit random number */
  743. -BYTE MegaLastKey = 0;     /* $C00X keyboard latch value          */
  744. -BYTE MegaQuitDetect = 0;  /* Set if user requests to quit        */
  745. -
  746. -void PutC010();
  747. -void Put0400();
  748. -void GetC080();
  749. -BYTE GetC000();
  750. -BYTE GetC010();
  751. -BYTE GetC030();
  752. -
  753. -void ProInit();
  754. -void ProFormat();
  755. -void ProRead();
  756. -void ProWrite();
  757. -void ProStatus();
  758. -
  759. -/*
  760. - * Base address table for 24 lines of text/lores page 1 ($400..$7F8);
  761. - * 40 bytes for each line. Note that screen "holes" exist:
  762. - */
  763. -
  764. -int LBasCalc [24] = 
  765. -
  766. -{
  767. -1024,
  768. -1152,
  769. -1280,
  770. -1408,
  771. -1536,
  772. -1664,
  773. -1792,
  774. -1920,
  775. -1064,
  776. -1192,
  777. -1320,
  778. -1448,
  779. -1576,
  780. -1704,
  781. -1832,
  782. -1960,
  783. -1104,
  784. -1232,
  785. -1360,
  786. -1488,
  787. -1616,
  788. -1744,
  789. -1872,
  790. -2000
  791. -};
  792. -
  793. -#define MegaPutChar(c) addch(c)
  794. -
  795. -/**************************************************************************/
  796. -/* Dispatch routines: The MegaPutMem and MegaGetMem, below, have default  */
  797. -/* behavior for I/O space.  They may also contain calls to other routines */
  798. -/* in this file which handle Apple II behavior.  If these latter routines */
  799. -/* need initialization/shutdown, that code should be placed in the two    */
  800. -/* MegaStartUp and MegaShutDown routines, below.                          */
  801. -/**************************************************************************/
  802. -
  803. -#ifdef NEVER
  804. -void MegaPutChar (c)
  805. -char c;   /* This makes a function out of the "putchar" macro */
  806. -
  807. -{
  808. -  addch (c);
  809. -}
  810. -#endif
  811. -
  812. -/* This routine is called at emulation startup time.  All initialization
  813. -   stuff, like setting terminal modes, opening files, etc. goes here. */
  814. -void MegaStartUp ()
  815. -{
  816. -  register int i;  /* Iterator */
  817. -
  818. -  /* init the pseudo disk */
  819. -  ProInit();
  820. -
  821. -  /* Set input modes on terminal: */
  822. -  noecho();
  823. -  raw();
  824. -
  825. -  /* Fill 40-column screen with simulated initial memory pattern: */
  826. -  clear();
  827. -  for (i = 0;   i <= 23;   i++)
  828. -    mvaddstr (i, 0, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
  829. -
  830. -  refresh();
  831. -
  832. -  /* Initialize some variables: */
  833. -  MegaQuitDetect = 0;
  834. -  MegaLastKey    = 0;
  835. -  MegaRand       = 0;
  836. -}
  837. -
  838. -
  839. -
  840. -/* This routine is called at emulation shutdown time.  All things
  841. -   started in MegaStartUp, above, should be cleaned up here. */
  842. -void MegaShutDown ()
  843. -{
  844. -  /* Clear screen: */
  845. -  clear();
  846. -  refresh();
  847. -
  848. -  /* Reset sane modes on terminal: */
  849. -  echo();
  850. -  noraw();
  851. -  endwin();
  852. -}
  853. -
  854. -/* This routine handles ALL stores to the 64K address space, in order to
  855. -   faciliate special Apple ][ - specific effects.  Not all behaviors may
  856. -   be implemented; to install a new one, install the call in this routine.
  857. -   Returns: Nothing. */
  858. -void MegaPutMem (addr, byte)
  859. -register ADDR addr;
  860. -register BYTE byte;
  861. -{
  862. -  /* Make sure these are in range: */
  863. -  addr &= 0xffff;
  864. -  byte &= 0xff;
  865. -
  866. -  /* Do random number generation: */
  867. -  MegaRand = (MegaRand + addr + byte) & 0xff;
  868. -
  869. -  /* If in ROM, we are done here: */
  870. -  if (addr >= 0xd000 && !RamWrite)
  871. -  {
  872. -/*    Rom[addr - 0xd000] = byte; */
  873. -    return;
  874. -  }
  875. -
  876. -  if (addr < 0xc000)                               /* Main memory   */
  877. -    MMemory [addr] = byte;
  878. -  else if (addr >= 0xd000 && addr < 0xe000)        /* 4K RAM Banks  */
  879. -  {
  880. -    BYTE *bank = Bank2Enable ? MRam2 : MRam1;
  881. -
  882. -    bank [addr - 0xd000] = byte;
  883. -  } 
  884. -  else if (addr >= 0xe000)                         /* 8K RAM Bank   */
  885. -    MRam [addr - 0xe000] = byte;
  886. -  else if ((addr >= 0xc010) && (addr <= 0xc01f))   /* soft switches */
  887. -    PutC010 (0);
  888. -  else if (addr >= 0xc080 && addr < 0xc090)
  889. -    GetC080 (addr);
  890. -
  891. -  /* Now do the appropriate memory-mapped OUTPUT functions, if any: */
  892. -  if ((addr >= 0x0400) && (addr < 0x0800))
  893. -    Put0400 (addr, byte);
  894. -}
  895. -
  896. -
  897. -/* This routine handles ALL fetches from the 64K address space, in order to
  898. -   facilitate special Apple ][ - specific effects.  Not all behaviors may
  899. -   be implemented; to install a new one, install the call in this routine.
  900. -   Returns: Value at location (could be random if I/O, etc.). */
  901. -BYTE MegaGetMem (addr)
  902. -register ADDR addr;
  903. -{
  904. -  register BYTE data;   /* Data from memory space to be returned */
  905. -
  906. -  /* Make sure we're in range: */
  907. -  addr &= 0xffff;
  908. -
  909. -  /* If we're just in ROM or RAM, it's easy: */
  910. -  if (addr < 0xc000) 
  911. -    return (MMemory [addr]);
  912. -  else if (addr >= 0xd000 && !RamRead)             /* rom read enabled */
  913. -    return (Rom[addr - 0xd000]);
  914. -  else if (addr >= 0xe000)                         /* 8K RAM read      */
  915. -    return (MRam[addr - 0xe000]);
  916. -  else if (addr >= 0xd000 && addr < 0xe000)        /* 4K Bank RAM      */
  917. -    return (Bank2Enable ? MRam2[addr - 0xd000] : MRam1[addr - 0xd000]);
  918. -
  919. -
  920. -  /* We must be in C000 space.  Default to random value: */
  921. -  data = MegaRand & 0xff;
  922. -  MegaRand = (MegaRand + addr * 25 + data) & 0xff;
  923. -  
  924. -  /* Now do the appropriate memory-mapped INPUT functions, if any: */
  925. -  if ((addr >= 0xc000) && (addr <= 0xc00f))
  926. -    data = GetC000 ();
  927. -  else if ((addr >= 0xc010) && (addr <= 0xc01f))
  928. -    data = GetC010 ();
  929. -  else if ((addr >= 0xc030) && (addr <= 0xc03f))
  930. -    data = GetC030 ();
  931. -  else if ((addr >= 0xc080) && (addr <= 0xc08f))
  932. -    GetC080 (addr);
  933. -  else if (addr == 0xc011)
  934. -    data = 0xFF * Bank2Enable;
  935. -  else if (addr == 0xc012)
  936. -    data = 0xFF * RamRead;
  937. -  else if (addr == 0xc701)
  938. -    data = 0x20;
  939. -  else if (addr == 0xc703)
  940. -    data = 0x00;
  941. -  else if (addr == 0xc705)
  942. -    data = 0x03;
  943. -  else if (addr == 0xc7ff)
  944. -    data = 0x80;
  945. -  else if (addr == 0xc7fe)
  946. -    data = 0x1f;
  947. -  else if (addr == 0xc7fc)
  948. -    data = 0x00;
  949. -  else if (addr == 0xc7fd)
  950. -    data = 0x00;
  951. -  else if (addr == 0xc780)
  952. -    data = 0x60;
  953. -  
  954. -  /* Return the data we came up with to the user: */
  955. -  return (BYTE) (data & 0xff);
  956. -}
  957. -
  958. -
  959. -
  960. -
  961. -
  962. -/**************************************************************************/
  963. -/* Memory-Mapped I/O routines: These routines actually perform the spe-   */
  964. -/* cific UNIX operations for get/put to certain addresses.  Not all Get   */
  965. -/* or Put routines must necessarily have a companion Put or Get routine:  */
  966. -/*                                                                        */
  967. -/*     * GetXXXXXX: Return a byte of data from an I/O address             */
  968. -/*     * PutXXXXXX: Receive a byte of data for an I/O address             */
  969. -/*                                                                        */
  970. -/**************************************************************************/
  971. -
  972. -
  973. -
  974. -
  975. -
  976. -/* Get keyboard data in low 7 bits. Msb indicates if hit since last C010: */
  977. -BYTE GetC000 ()
  978. -{
  979. -  register int fflags;
  980. -  char     data = '*';
  981. -  
  982. -  /* Set nonblocking input: */
  983. -  fflags = fcntl (0, F_GETFL, 0);
  984. -  (void)fcntl (0, F_SETFL, fflags | O_NDELAY);
  985. -  
  986. -  /* See if a key was pressed.  If yes, update and set hi bit; */
  987. -  /* else, leave keyboard latch with last value: */
  988. -  if (read (0, &data, 1) > 0)
  989. -    MegaLastKey = (int) data | 0x80;
  990. -  
  991. -  /* Reset nonblocking input: */
  992. -  (void)fcntl (0, F_SETFL, fflags);
  993. -  
  994. -  /* See if user wants to quit: */
  995. -  MegaQuitDetect = (data == MEGAQUITKEY);
  996. -  
  997. -  return (BYTE)MegaLastKey;
  998. -}
  999. -
  1000. -
  1001. -
  1002. -
  1003. -
  1004. -/* Clear keyboard strobe for C000 msb: */
  1005. -BYTE GetC010 ()
  1006. -{
  1007. -  MegaLastKey &= 0x7f;            /* Clear strobe bit */
  1008. -  return (BYTE)(MegaRand & 0xff);
  1009. -}
  1010. -
  1011. -void GetC080 (addr)
  1012. -ADDR addr;
  1013. -{
  1014. -  switch (addr & 0x000F)
  1015. -  {
  1016. -  case 0x00: 
  1017. -    RamRead  = 1;
  1018. -    RamWrite = 0;
  1019. -    Bank2Enable = 1;
  1020. -    break;
  1021. -  case 0x01:
  1022. -    RamRead  = 0;
  1023. -    RamWrite = 1;
  1024. -    Bank2Enable = 1;
  1025. -    break;
  1026. -  case 0x02:
  1027. -    RamRead  = 0;
  1028. -    RamWrite = 0;
  1029. -    Bank2Enable = 1;
  1030. -    break;
  1031. -  case 0x03:
  1032. -    RamRead  = 1;
  1033. -    RamWrite = 1;
  1034. -    Bank2Enable = 1;
  1035. -    break;
  1036. -  case 0x08: 
  1037. -    RamRead  = 1;
  1038. -    RamWrite = 0;
  1039. -    Bank2Enable = 0;
  1040. -    break;
  1041. -  case 0x09:
  1042. -    RamRead  = 0;
  1043. -    RamWrite = 1;
  1044. -    Bank2Enable = 0;
  1045. -    break;
  1046. -  case 0x0a:
  1047. -    RamRead  = 0;
  1048. -    RamWrite = 0;
  1049. -    Bank2Enable = 0;
  1050. -    break;
  1051. -  case 0x0b:
  1052. -    RamRead  = 1;
  1053. -    RamWrite = 1;
  1054. -    Bank2Enable = 0;
  1055. -    break;
  1056. -  }
  1057. -}
  1058. -
  1059. -/*ARGSUSED*/
  1060. -void PutC010 (data)
  1061. -BYTE data;
  1062. -{
  1063. -  (void)GetC010 (); /* Same thing; either one works */
  1064. -}
  1065. -
  1066. -
  1067. -
  1068. -/* Beeps speaker if accessed a lot: */
  1069. -BYTE GetC030 ()
  1070. -{
  1071. -  static int count = 0;
  1072. -  
  1073. -  if (count++ >= 100)
  1074. -  {
  1075. -    count = 0;
  1076. -    /* tputs (TcapBeep,1,MegaPutChar); */
  1077. -    /*        putchar (7); */
  1078. -    /*        fflush (stdout); */
  1079. -  }
  1080. -  return (BYTE)(MegaRand & 0xff);
  1081. -}
  1082. -
  1083. -
  1084. -/* Handles stores to text/lowres page 1 memory */
  1085. -void Put0400 (addr,data)
  1086. -register ADDR addr;
  1087. -         BYTE data;
  1088. -{
  1089. -  register int linenum;          /* Searching for Y-coordinate */
  1090. -  register int columnnum;        /* Searching for X-coordinate */
  1091. -           int screenhole = 1;   /* Are we in screen hole?     */
  1092. -
  1093. -  /* Find which line the given address is in: */
  1094. -  for (linenum = 0; linenum <= 23; linenum++)
  1095. -    if ( (addr >= LBasCalc [linenum]) && 
  1096. -    (addr <= (LBasCalc [linenum] + 39)) )
  1097. -    {
  1098. -      columnnum = addr - LBasCalc [linenum];
  1099. -      screenhole = 0;
  1100. -      break;
  1101. -    }
  1102. -    
  1103. -  /* If not on screen, don't draw anything: */
  1104. -  if (screenhole)
  1105. -    return;
  1106. -
  1107. -  /* Put the terminal cursor at the right location on the screen: */
  1108. -  /* We assume 80x24 terminal; no need to avoid drawing on last char. */
  1109. -  move (linenum, columnnum);
  1110. -
  1111. -  /*
  1112. -    Set terminal into appropriate output mode and do it:
  1113. -    tputs (TcapInverse,1,MegaPutChar);
  1114. -   */
  1115. -  if (data < 64)
  1116. -  {
  1117. -    /* attron (A_STANDOUT); */
  1118. -    standout();
  1119. -    if (data < 32)
  1120. -      data += 64;
  1121. -  }
  1122. -  else if ((data < 128) && (data > 63))
  1123. -  {
  1124. -    standout();
  1125. -    if (data > 95)
  1126. -      data -= 64;
  1127. -  }
  1128. -  else
  1129. -    data = data & 127;
  1130. -  if (!iscntrl ((char) data))
  1131. -    MegaPutChar ((char) data);
  1132. -  else
  1133. -    MegaPutChar ((char) (data - 64));
  1134. -  standend();
  1135. -}
  1136. -
  1137. -#define _setN_(b)      if ((b)!=0) P |= 128; else P &= 0x7f
  1138. -#define _setV_(b)      if ((b)!=0) P |= 64;  else P &= 0xbf
  1139. -  /* This bit not implemented */
  1140. -#define _setB_(b)      if ((b)!=0) P |= 16;  else P &= 0xef
  1141. -#define _setD_(b)      if ((b)!=0) P |= 8;   else P &= 0xf7
  1142. -#define _setI_(b)      if ((b)!=0) P |= 4;   else P &= 0xfb
  1143. -#define _setZ_(b)      if ((b)!=0) P |= 2;   else P &= 0xfd
  1144. -#define _setC_(b)      if ((b)!=0) P |= 1;   else P &= 0xfe
  1145. -
  1146. -static unsigned char buffer[512];
  1147. -FILE *disk1,     /* slot 7, drive 1 280 block 5.25 floppy   */
  1148. -     *disk2;     /* slot 7, drive 2 1024 blocks "hard disk" */
  1149. -
  1150. -#define NBLOCKSD1 280
  1151. -#define NBLOCKSD2 1024
  1152. -
  1153. -void ProInit ()
  1154. -{
  1155. -  MegaPutMem (0x0043, (BYTE)0x70);              /* boot disk */
  1156. -  disk1 = fopen ("PRODOS.IMAGE.D1", "r+");
  1157. -  disk2 = fopen ("PRODOS.IMAGE.D2", "r+");
  1158. -}
  1159. -
  1160. -void ProFormat (drive)
  1161. -int drive;
  1162. -{
  1163. -  int   numblocks = drive ? NBLOCKSD2 : NBLOCKSD1;
  1164. -  FILE *disk      = drive ? disk2     : disk1;
  1165. -  
  1166. -  (void)fseek (disk, (long)(512 * numblocks), 0);
  1167. -  (void)fwrite (" ", 1, 1, disk);
  1168. -}
  1169. -
  1170. -void ProRead (drive)
  1171. -int drive;
  1172. -{
  1173. -  register int   i;
  1174. -           int   block  = MegaGetMem (0x46) + MegaGetMem (0x47) * 0x0100;
  1175. -           int   buf    = MegaGetMem (0x44) + MegaGetMem (0x45) * 0x0100;
  1176. -           FILE *disk = drive ? disk2 : disk1;
  1177. -
  1178. -  (void)fseek (disk, (long)(block * 512), 0);
  1179. -  
  1180. -  (void)fread ((char *)buffer, 1, 512, disk);
  1181. -  for (i = 0; i < 512; i++)
  1182. -    MegaPutMem (buf + i, (BYTE)buffer[i]);
  1183. -  _setC_(0);      /* CLC */
  1184. -  A = 0;
  1185. -}
  1186. -
  1187. -void ProWrite (drive)
  1188. -int drive;
  1189. -{
  1190. -  register int   i;
  1191. -           int   block  = MegaGetMem (0x46) + MegaGetMem (0x47) * 0x0100;
  1192. -           int   buf    = MegaGetMem (0x44) + MegaGetMem (0x45) * 0x0100;
  1193. -           FILE *disk = drive ? disk2 : disk1;
  1194. -  
  1195. -  (void)fseek (disk, (long)(block * 512), 0);
  1196. -  
  1197. -  for (i = 0; i < 512; i++)
  1198. -    buffer[i] = MegaGetMem (buf + i);
  1199. -
  1200. -  (void)fwrite ((char *)buffer, 1, 512, disk);
  1201. -  _setC_(0);       /* CLC */
  1202. -  A = 0;
  1203. -}
  1204. -
  1205. -void ProStatus (drive)
  1206. -int drive;
  1207. -{
  1208. -  int   numblocks = drive ? NBLOCKSD2 : NBLOCKSD1;
  1209. -
  1210. -  _setC_(0);     /* CLC */
  1211. -  A = 0;         /* LDA #0 */
  1212. -  Y = numblocks / 256;
  1213. -  X = numblocks % 256;
  1214. -}
  1215. -
  1216. -void prodos()
  1217. -{
  1218. -  int drive = ((MegaGetMem (0x43) >= 128) ? 1 : 0);
  1219. -
  1220. -  switch (MegaGetMem (0x42))
  1221. -  {
  1222. -  case 0: 
  1223. -    ProStatus (drive); break;
  1224. -  case 1: 
  1225. -    ProRead   (drive); break;
  1226. -  case 2: 
  1227. -    ProWrite  (drive); break;
  1228. -  case 3: 
  1229. -    ProFormat (drive); break;
  1230. -  }    
  1231. -}
  1232. -
  1233. -
  1234. + END OF ARCHIVE
  1235.