Home

Disk Basic Unravelled II

image

Contents

1. 12 14 16 19 1 CA1D 20 22 25 27 29 2 2 CA33 CA36 CA39 CA3A CA3C CASE 40 44 46 48 CA4A CA4E CA4F CA50 CA53 CA56 CA58 CA5A CA5C CA5F CA61 CA64 CA67 86 A7 8C 26 5A 27 A6 81 27 8C 27 8D 20 A7 27 81 27 81 27 4C 27 39 81 10 8D 9E BF 9D 27 BD C6 BD 26 73 8D 4F 7E 86 8C 86 F6 5C D7 7E 8D 86 BD DC 93 BD 16 BD 9E A6 BD 9 26 7 8E 7E 4F c6 20 81 18 86 20 81 10 4F 5F B7 F7 8D 9D 27 BD C6 BD BD 86 20 82 09 F9 DA CD 09 02 80 4 2 2 9 99 40 27 48 8A 09 5 21 2 41 2 4 09 04 B7 4F 49 09 6F C4 F FF CC 18 19 CC 98 CC 19 80 CC 18 F7 M C2 C9 FF 12 22 26 02 07 40 27 09 09 DB A5 18 B2 52 B2 A5 03 54 57 05 57 60 6F 58 64 5B 8D 24 24 24 24 2D A6 38 B8 05 59 60 6F C7 82 58 73 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 LDA 5 LC9B7 STA X CMPX DEXTBF BNE LC9B7 LC9BE DECB BEQ LC998 LDA CMPA BEQ LC994 CMPX DFLTYP BEQ LC978 BSR LC900 BRA 1 9 INSERT CHARACTER INTO FILENAME OR EXTENSION LC9D STA X BEQ LC978 CMPA BEQ LC978 CMPA BEQ LC978 INCA BEQ LC978 LC9DF RIS
2. R PAL VERSION IGNORE TABLE FOR COMPOSITE SAM CONTROL REGISTERS CLEAR COCO GRAPHICS MODE V SET COCO GRAPHICS MODE CLEAR COCO GRAPHICS MODE V1 SET COCO GRAPHICS MODE V1 CLEAR COCO GRAPHICS MODE V2 A14 DISK BASIC UNRAVELLED II FFC5 FFC6 FFC7 FFC8 FFC9 FFCA FFCB FFCC FFCD FFCE FFCF FFD FFD1 FFD2 FFD3 FFD4 FFD8 FFD9 FFDA FFDE FFDF FFEQ FFF2 FFFA FFF6 FFF8 FFFA FFFC FFFE V2SET FOCLR FOSET FICLR FISET F2CLR F2SET F3CLR F3SET FACLR FASET F5CLR F5SET F6CLR F6SET 15 ROMCLR ROMSET SWI3 SWI2 FIRQ IRQ SWI NMI RESETV RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB RMB 8 INTERRUPT VECTORS ho APPENDIX SET C0C0 GRAPHICS MODE V2 CLEAR COCO GRAPHICS OFFSET F SET COCO GRAPHICS OFFSET F CLEAR COCO GRAPHICS OFFSET F1 SET COCO GRAPHICS OFFSET F1 CLEAR COCO GRAPHICS OFFSET F2 SET COCO GRAPHICS OFFSET F2 CLEAR COCO GRAPHICS OFFSET F3 SET COCO GRAPHICS OFFSET CLEAR COCO GRAPHICS OFFSET F4 SET COCO GRAPHICS OFFSET F4 CLEAR COCO GRAPHICS OFFSET F5 SET COCO GRAPHICS OFFSET F5 CLEAR COCO GRAPHICS OFFSET F6 SET COCO GRAPHICS OFFSET F6 RESERVED CLEAR CPU RATE 0 89 MHz SET CPU RATE 1 78 MHz RESERVED ROM DISABLED ROM ENABLED
3. BLOCK7 0 EQU 38 BLOCK7 1 EQU 539 BLOCK7 2 EQU 3A BLOCK7 3 EQU 3B BLOCK7 4 EQU 53 BLOCK7 5 EQU 3D BLOCK7 6 EQU 3E BLOCK7 7 EQU 3F PSEUDO PSEUDO OPS SKP1 EQU 21 SKP2 EQU 8 SKP1LD EQU 586 ORG 0 SETDP ENDFLG RMB CHARAC RMB ENDCUR RMB TMPLOC RMB IFCTR RMB DIMFLG RMB VALTYP RMB GARBFL RMB ARYDIS RMB INPFLG RMB RELFLG RMB TEMPPT RMB 2 LASTPT RMB 2 TEMPTR RMB 2 TMPTR1 RMB 2 FLOATING POINT ACCUMULATOR 2 FPA2 RMB 4 BOTSTK RMB 2 TXTTAB RMB 2 VARTAB RMB 2 ARYTAB RMB 2 ARYEND RMB 2 FRETOP RMB 2 STRTAB RMB 2 FRESPC RMB 2 MEMSIZ RMB 2 OLDTXT RMB 2 BINVAL RMB 2 OLDPTR RMB 2 TINPTR RMB 2 DATTXT RMB 2 DATPTR RMB 2 DATTMP RMB 2 VARNAM RMB 2 VARPTR RMB 2 VARDES RMB 2 RELPTR RMB 2 TRELFL RMB 1 OP CODE OF BRN SKIP ONE BYTE OP CODE OF CMPX SKIP TWO BYTES OP CODE OF LDA SKIP THE NEXT BYTE AND LOAD THE VALUE OF THAT BYTE INTO THIS IS USUALLY USED TO LOAD ACCA WITH A NON ZERO VALUE STOP END FLAG POSITIVE STOP NEG END TERMINATOR FLAG 1 TERMINATOR FLAG 2 SCRATCH VARIABLE IF COUNTER HOW MANY IF STATEMENTS IN A LINE DV ARRAY FLAG Q EVALUATE 1 DIMENSIONING DV PV TYPE FLAG NUMERIC FF STRING TV STRING SPACE HOUSEKEEPING FLAG DISABLE ARRAY SEARCH ALLOW SEARCH TV INPUT FLAG READ 0 lt gt 0 TV RELATIONAL OPERATOR FLAG PV TEMPORARY STRING STACK POINTER PV ADDR OF LAST USED STRING STACK ADDRESS TEMPORARY POINTER TEM
4. LC139 BNE 1 03 LDX 0 22 STX RVEC22 1 LDX DVEC20 STX RVEC20 1 INITIALIZE DISK BASIC S USR VECTORS LDX DUSRVC STX USRADR LDU LB44A LDB 0 LC061 STU X DECB BNE 1 061 LDX DNMISV STX NMIVEC 1 LDA 7 STA NMIVEC LDX DIRQSV STX IRQVEC 1 LDA 13 STA WFATVL CLR FATBL CLR FATBL1 CLR FATBL2 CLR LDX DFLBUF STX RNBFAD LEAX 0100 X STX FCBADR LEAX 01 X STX FCBVl CLR FCBTYP X LEAX FCBLEN X STX 1 2 CLR LEAX FCBLEN X STX 1 4 CLR FCBTYP X LDA 02 STA FCBACT LEAX FCBLEN X TFR X D TSTB BEQ LC BD INCA LC BD 01 BEQ 1 0 2 LCOC2 ADDB 18 B2 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DIRECTORY ENTRY NUMBER 0 71 NUMBER OF BYTES IN LAST SECTOR OF FILE UNUSED INPUT FILE ONLY DATA LEFT FLAG DATA LEFT FF NO DATA EMPTY NUMBER OF CHARACTERS LEFT IN BUFFER INPUT FILE NUMBER OF CHARS STORED IN BUFFER OUTPUT FILE OFFSET TO FCB DATA BUFFER 256 BYTES DSKCON POINTER ADDRESS OF DSKCON VARIABLES DISK INITIALIZATION VECTOR DOS COMMAND VECTOR POINT X TO START OF DISK RAM CLEAR A BYTE END OF DISK S RAM NO KEEP CLEARING POINT X TO ROM IMAGE OF COMMAND INTERPRETATION TABLE POINT U TO RAM ADDRESS OF SAME 10 BYTES PER TABLE MOVE B BYTES FROM X TO U SYNTAX ERROR ADDRESS SET JUMP TABLE ADDRESSES OF THE USER COMMAND INTERPRETATION TABLE
5. END OF RANDOM FILE BUFFER X START OF RANDOM FILE BUFFER ACCD RECORD LENGTH PROBABLY BE THE MOST CONVENIENT PLACE TO FIX THE BUG WHICH SYSTEM TO HANG IF AN ERROR IS ENCOUNTERED DURING COPY FCBADR LCBB4 DFLBUF LCBCO IS THE END OF THIS FCB S BUFFER ABOVE THE END OF THE START OF THE FCB AREA NO FREE UP THE SPACE USED BY THIS FILE IN RANDOM BUFFER YES DOING A COPY RESET START OF RANDOM BUFFER REMOVE RESERVED SPACE FOR CLOSED FILE FROM RANDOM FILE BUFFER SPACE LCBB4 CMPU BEQ LDA STA RNBFAD LCBCO U X AT THE BOTTOM OF FREE RANDOM BUFFER AREA BRANCH IF THERE GRAB A SOURCE BYTE AND MOVE IT TO DESTINATION B17 DISK BASIC UNRAVELLED 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 CBC CBC3 CBC6 CBC8 CBCA CBCC CBCF CBD1 CBD3 CBD5 CBD7 CBD9 CBDB CBDD CBDF CBE2 5 CBE7 CBE9 CBEC CBEE CBF1 CBF3 CBF5 CBF6 CBF9 CBFB CBFD CC00 CC01 02
6. F D7 EA 88 46 87 0g 88 DC 10 87 85 AA 86 86 4B 01 01 A2 LD5FF 10608 LD60E LD616 LD618 LD61B LD644 LD64F LD650 VERIFY VERIFY LD667 DSKCON DSKCON LD672 LD68B LD69F APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 1 1 FCB 1 F7 FCB 22 4E FCB 12 0 FCB 3 F5 FCB 1 FB FCB FF FCB 1 F7 FCB 24 4E PSHS B LDB 4 05 STB ATTCTR PULS B BSR DSKCON TST 0 5 BEQ LD61B LDA DCSTA LDB 2 3 4 40 BNE 10618 LDB 2 20 JMP LAC46 PSHS A LDA DCOPC CMPA 4503 PULS A BNE LD64F TST DVERVL BEQ 1064 PSHS U X B A LDA 4 02 STA DCOPC LDU DCBPT LDX DBUF1 STX BSR DSKCON STU LDA 4 03 STA DCOPC LDA BNE 10650 CLRB LDA X CMPA U BNE 10650 DECB BNE 10644 PULS A B X U RTS PULS A B X U DEC ATTCTR BNE 10608 LDB 42 336 BRA 10618 COMMAND CLRB CMPA AA BEQ 10667 COMB CMPA 88 LBNE LB277 STB DVERVL JMP GETNCH ROUTINE PSHS U Y X B A LDA 4 05 PSHS A CLR RDYTMR LDB DCDRV LDX LD7AA LDA ANDA 8 ORA B X ORA 20 LDB DCTRK CMPB 422 BLO LD68B ORA 10 TFR A B ORA 08 STA DRG RAM STA DSKREG BITB 08 BNE LD69F JSR 1 701 JSR 1 701 BSR LD6DE BNE LD6AD CLR DCSTA LDX LD7A2 LDB DCOPC ASLB C32 SECTOR SIZE 256 BYTE SECTORS CRC REQUEST GAP II POST ID GAP SYNC FIELD DATA ADDRESS MARK AM2 DATA FIELD 256 BYTES
7. 02 CMPD DFLBUF BLO LC 07 SUBD FCBADR LBCS LAFB1 LCF 7 JMP LAFA4 MODIFIER FOR EXBAS COMMAND INTERPRETATION HANDLER DXCVEC CA BEQ LCF2A CMPA C8 LBNE L813C DISK BASIC MODIFIER FOR PMODE ALLOWS FOR THE RAM THE DOS USES JSR CMPA LBEQ 19650 JSR EVALEXPB CMPB 04 LBHI LB44A LDA GRPRAM UMP L962E DISK BASIC DLOAD MODIFIER LCF2A JSR 14429 JSR JMP 18 1 DXIVEC 9 580 2 LBNE L8168 JSR 18262 LDA DEVNUM PSHS A JSR 1 JSR LA406 TST DEVNUM BLE LCF5C JSR LC744 LDB FCBTYP X CMPB RANFIL BNE LCF5C PULS A STA DEVNUM LDD FCBPUT X JMP GIVABF LCF5C JSR LA35F PULS A STA DEVNUM LDB DEVPOS B22 GET PRINT POSITION AND ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 CF65 CF68 CF6A CF6C CF6F CF72 CF74 CF78 CF7B CF7E CF81 CF84
8. D1 0294 CIFF CA 0295 C201 00 0296 C203 D1 0297 C205 9 0298 C207 D 0299 C209 D7 0300 20 D2 0301 C200 D5 0302 C20L D2 0303 C211 D3 0304 C213 D4 0305 C215 D5 0306 C217 D6 0307 0308 0309 0310 0311 C219 43 0312 C21C 46 0313 C220 4 0314 C223 4C 0315 C226 40 0316 22 41 0317 0318 0319 0320 0321 C22C CD 0322 22 0323 C230 0324 C232 0325 C234 CE 0326 C236 B2 0327 0328 0329 238 81 0330 2 22 0331 C23C 8E 0332 C23L 80 0333 C241 7E 0334 C244 81 0335 C246 10 0336 2 6E 0337 0338 2 C1 0339 C258 23 0340 C252 6E 0341 C256 C 0342 C258 34 0343 C25A BD 0344 C25D 35 0345 C25F 8E 0346 262 7 0347 0348 0349 C265 35 0350 C267 BD 0351 C26A BD 0352 C26D 34 0353 C26F BD 0354 C272 35 0355 C274 C1 0356 C276 10 0357 27 32 0358 27 BD 0359 C27F BD 0360 C282 OF 0361 C284 BD 0362 C287 BD 0363 C28A 8E 0364 C28D 7E 0365 0366 0367 C290 42 0368 C292 44 0369 C294 4 0370 C296 57 0371 C298 46 0372 29 46 0373 C29C 41 0374 29 46 0375 C2AQ 53 0376 2 2 56 0377 2 4 45 0378 0379 0380 2 6 42 0381 2 9 20 0382 2 44 0383 2 42 0384 BC 5C EF 48 02 39 1 01 EQ 66 33 99 62 B9 ED 62 EC 56 52 4F 4F 4B D3 F4 9C 10 37 02 77 1 08 C1 CE AD El 23 OF 4E 94 9F 44 94 B2 94 c2 B2 20 AD D2 24 CA 04 36 25 62 7 9 6F B9 B9 C2 AC 52 46 42 50
9. 3B3B SWI2 VECTOR 0301 0106 SWIVEC RMB 3 XXXX XXXX SWI VECTOR 0302 0109 NMIVEC RMB 3 XXXX D7AE NMI VECTOR 0303 010 IRQVEC RMB 3 A9B3 894C D7BC IRQ VECTOR 0304 010 FRQVEC RMB 3 ABF6 6 ABFE FIRQ VECTOR 0305 0306 0112 TIMVAL 0307 0112 USRJMP RMB 3 JUMP ADDRESS FOR BASIC S USR FUNCTION 0308 RMB 2 TIMER VALUE FOR EXBAS 0309 RMB 1 UNUSED BY EXBAS OR DISK BASIC 0310 0115 RVSEED RMB 1 FLOATING POINT RANDOM NUMBER SEED EXPONENT 0311 0116 RMB 4 MANTISSA INITIALLY SET TO 804 75259 0312 011A CASFLG RMB 1 UPPER CASE LOWER CASE FLAG FF UPPER O LOWER 0313 011 DEBVAL RMB 2 KEYBOARD DEBOUNCE DELAY SET TO 45E 0314 0110 EXPJMP RMB 3 JUMP ADDRESS FOR EXPONENTIATION 0315 INITIALLY SET TO ERROR FOR BASIC 8489 FOR EX BASIC 0316 0317 TER COMMAND INTERPRETATION VECTOR TABLE 0318 0319 FOUR SETS OF 10 BYTE TABLES 0320 0321 0322 THE LAST USED TABLE MUST BE FOLLOWED BY ZERO BYTE 0323 THE JUMP TABLE VECTORS 3 4 AND 8 9 POINT TO THE JUMP TABLE FOR 0324 THE FIRST TABLE FOR ALL OTHER TABLES THESE VECTORS POINT TO A 0325 ROUTINE WHICH WILL VECTOR YOU TO THE CORRECT JUMP TABLE 0326 SUPER ENHANCED BASIC HAS MODIFIED THIS SCHEME SO THAT THE USER 0327 TABLE MAY NOT ACCESSED ADDITIONAL TABLES WILL HAVE TO BE 0328 ACCESSED FROM A NEW COMMAND HANDLER 0329 0330 BYTE DESCRIPTION 0331 NUMBER OF RESERVED WORDS 0332 1 2 LOOKUP TABLE OF RESERVED WORDS 0333 3 3 4
10. BEQ LC980 CMPA BEQ LC994 CMPX DEXTBF BEQ LC978 BSR LC900 BRA 1 96 LC994 BSR LC973 BSR LC99D TSTB BNE LC978 LC99B PULS A PC GRAB DRIVE NUMBER LC99D 02 5 BEQ LC978 LDA SUBB 02 SUBA 0 BLO LC978 CMPA 03 BHI 10978 STA DCDRV RTS GRAB EXTENSION LC9B9 BSR LC973 LDX DFLTYP 14 POINT TO BLANK DEFAULT EXTENSION CLEAR A BYTE ON STACK FOR USE AS A DRIVES FLAG GET DEFAULT DISK NUMBER STORE IN DSKCON PARAMETER DISK FILENAME BUFFER STORE 8 BLANKS IN RAM DEFAULT FILE NAME STORE A BLANK IN FILE NAME DECREMENT COUNTER BRANCH IF NOT DONE 3 BYTES IN EXTENSION MOVE B BYTES FROM X TO U EVALUATE A STRING EXPRESSION POINT U TO START OF STRING CHECK LENGTH OF STRING AND BRANCH IF lt 2 GET 2ND CHARACTER IN STRING AND CHECK FOR COLON BRANCH IF NO DRIVE NUMBER GET 1ST CHARACTER IN STRING AND CHECK TO SEE IF IT IS IN THE RANGE 0 3 GET DRIVE NUMBER POINT X TO FILE NAME BUFFER COMPENSATE FOR DECB BELOW DECREMENT STRING LENGTH BRANCH IF MORE CHARACTERS IN STRING CLEAN UP STACK REMOVE DRIVE FLAG POINTER STILL AT START OF BUFFER RETURN IF NOT BAD FILENAME ERROR IF NULL FILENAME ERROR HANDLER GET A CHARACTER FROM STRING LOOK FOR PERIOD YES SLASH YES COLON YES COMPARE POINTER TO END OF FILENAME BUFFER BAD FILENAME ERROR FILENAME TOO LONG PUT A CHARACTER IN FILENAME GET ANOTHER CHARACTER FROM STRING BAD FILENAME E
11. 29 0374 0375 m 25 EX BASIC TABLE 0376 1 2 58183 0377 3 4 813C 2 CF A 2 1 0378 5 14 0379 m 6 7 821E 0380 8 9 8168 CE56 CF32 2 1 0381 0382 0 19 20 2 1 DISK BASIC TABLE 0383 3 1 2 C17F 0384 3 4 2 0 0385 5 6 0386 6 7 C201 0387 8 9 C236 0388 0389 0390 0152 KEYBUF RMB 8 KEYBOARD MEMORY BUFFER 0391 015A POTVAL RMB 1 LEFT VERTICAL JOYSTICK DATA 0392 015 RMB 1 LEFT HORIZONTAL JOYSTICK DATA 0393 015 RMB 1 RIGHT VERTICAL JOYSTICK DATA 0394 0150 RMB 1 RIGHT HORIZONTAL JOYSTICK DATA 0395 0396 BASIC S RAM VECTORS INITIALIZED TO RTS BY COLOR BASIC 0397 25 SETS OF 3 BYTE INSTRUCTIONS WHICH ARE CALLED BY COLOR BASIC 0398 EXTENDED AND DISK BASIC THEIR PURPOSE IS TO ALLOW ENHANCEMENTS SUCH 0399 AS BASIC AND DOS BASIC AS MORE ROMS ARE ADDED TO THE 0400 SYSTEM BY EFFECTIVELY ALLOWING MORE CODE TO BE ADDED TO THE 0401 ROUTINES IN EARLIER ROMS THIS NEW CODE IS LOCATED IN THE NEW ROMS 0402 AND THE ADDRESS TO GET TO THE NEW CODE IS IN BYTES 1 amp 2 OF THE 0403 RAM VECTOR BYTE WILL CONTAIN 7E WHICH IS THE FIRST BYTE OF 0404 THE JMP INSTRUCTION 0405 THE FIRST ADDRESS IN THIS TABLE IS THE ADDRESS BASIC WHICH 0406 CALLS THE RAM VECTOR THE SECOND ADDRESS IS THE VALUE WHICH 0407 EX BASIC PUTS IN THE RAM VECTOR IF ANY AND THE THIRD ADDRESS 0408 IS THE VALUE WHICH DISK BASIC PUTS THERE IF ANY 0409 0410 0411 2 0 2 1 1 0 1 1 0412 015E RM
12. 36 40 02 28 02 EA 03 02 2 09 25 56 02 EE 07 33 03 00 80 06 F7 56 56 09 1 48 BD AA 07 88 26 09 9F 76 05 02 09 CB BA 88 46 87 00 88 DB 1D 87 85 LD6C8 5 5 B LDD BSR 106 2 PULS B DECB BNE 106 8 RTS DATA USED TO FORMAT A SECTOR ON THE DISK APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 SAVE THE COUNTER ON THE STACK GET TWO BYTES OF DATA FROM THE TABLE WRITE ACCA BYTES OF ACCB INTO THE BUFFER GET THE COUNTER BACK DECREMENT IT AND BRANCH IF ALL DATA BLOCKS NOT DONE SYNC FIELD ID ADDRESS MARK M1 SECTOR SIZE 256 BYTE SECTORS CRC REQUEST GAP II POST ID GAP SYNC FIELD DATA ADDRESS MARK AM2 DATA FIELD 256 BYTES CRC REQUEST GAP III POST DATA GAP RETURN IF ARGUMENT GIVEN JUMP TO THE DOS COMMAND SAVE ACCB 5 RETRIES SAVE RETRY COUNT RESTORE ACCB GO EXECUTE COMMAND CHECK STATUS BRANCH IF NO ERRORS GET DSKCON ERROR STATUS WRITE PROTECTED ERROR CHECK BIT 6 OF STATUS BRANCH IF WRITE PROTECT ERROR 1 0 ERROR JUMP TO ERROR DRIVER SAVE ACCA GET OPERATION CODE CHECK FOR WRITE SECTOR COMMAND RESTORE ACCA RETURN IF NOT WRITE SECTOR CHECK VERIFY FLAG RETURN IF NO VERIFY SAVE REGISTERS READ OPERATION CODE STORE TO DSKCON PARAMETER POINT U TO WRITE BUFFER ADDRESS ADDRESS OF VERIFY BUFFER TO DSKCON VARIABLE GO READ SECTOR RESTORE WRITE B
13. H ONERR RMB 2 ON ERR GOTO LINE NUMBER 0543 10 H ERROR RMB ERROR NUMBER ENCOUNTERED OR FF NO ERROR 0544 11 H ONERRS RMB 2 ON ERR SOURCE LINE NUMBER 0545 FE13 H ERLINE RMB 2 LINE NUMBER WHERE ERROR OCCURRED 0546 FE15 H ONBRKS RMB 2 ON BRK SOURCE LINE NUMBER 0547 FE17 H ERRBRK RMB STILL UNKNOWN HAS TO DO WITH ERR BRK 0548 FE18 H PCOUNT RMB PRINT COUNT CHARACTERS TO BE HPRINTED 0549 19 H PBUF RMB 80 PRINT BUFFER HPRINT CHARS STORED HERE 0550 69 RMB 32 UNUSED 0551 FEED INT FLAG RMB INTERRUPT VALID FLAG NOT VALID 55 VALID 0552 TABLE OF JUMP VECTORS TO INTERRUPT SERVICING ROUTINES 0553 FEEE INT JUMP 0554 FEEE INT SWI3 RMB 3 0555 FEF1 INT SWI2 RMB 3 0556 FEF4 INT FIRQ RMB 3 0557 FEF7 INT IRQ RMB 3 0558 FEFA INT SWI RMB 3 0559 FEFD INT NMI RMB 3 0560 0561 1 0 AREA 0562 0563 FF00 EQU PERIPHERAL INTERFACE ADAPTER ONE 0564 0565 FF00 BIT KEYBOARD ROW 1 AND RIGHT JOYSTICK SWITCH 1 0566 KEYBOARD ROW 2 AND LEFT JOYSTICK SWITCH 1 0567 2 KEYBOARD ROW 3 AND RIGHT JOYSTICK SWITCH 2 0568 BIT3 KEYBOARD ROW 4 AND LEFT JOYSTICK SWITCH 2 0569 4 KEYBOARD ROW 5 0570 5 KEYBOARD ROW 6 0571 BIT6 KEYBOARD ROW 7 9572 BIT7 JOTSTICK COMPARISON IINPUT 0573 0574 FF01 CONTROL OF HSYNC 63 5ps IRQ TO CPU DISABLED 9575 INTERRUPT 1 IRQ TO CPU ENABLED 0576 CONTROL INTERRUPT FLAG SET ON FALLING EDGE OF HS 9577 POLARITY 1 FLAG SET ON RISING EDGE OF HS 0578 BIT2
14. RESERVED FOR FUTURE MPU ENHANCEMENTS A15 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK 0001 00 DHITOK EQU 1 HIGHEST 1 1 DISK TOKEN 0002 00 32 CYEAR EQU 2 0003 0004 0005 0006 0007 FILE ALLOCATION TABLE FORMAT 0008 0009 0010 THE FILE ALLOCATION TABLE FAT CONTAINS THE STATUS OF THE GRANULES ON A DISKETTE 0011 THE CONTAINS 6 CONTROL BYTES FOLLOWED BY 68 DATA BYTES ONE PER GRANULE ONLY THE 0012 FIRST TWO OF THE SIX CONTROL BYTES ARE USED A VALUE OF FF IS SAVED IN UNALLOCATED 0013 GRANULES IF BITS 6 amp 7 OF THE DATA BYTE ARE SET THE GRANULE IS THE LAST GRANULE 0014 IN A FILE AND BITS 0 5 ARE THE NUMBER OF USED SECTORS IN THAT GRANULE IF BITS 6 amp 7 0015 ARE NOT SET THE DATA BYTE CONTAINS THE NUMBER OF THE NEXT GRANULE IN THE FILE 0016 0017 OFFSETS TO FAT CONTROL BYTES 0018 00 00 FATO EQU 0 ACTIVE FILE COUNTER DISK TO RAM FAT IMAGE DISABLE 0019 00 01 1 EQU 1 VALID DATA FLAG DISK DATA VALID lt gt NEW FAT 0020 DATA DISK DATA INVALID 0021 2 TO 5 NOT USED 0022 00 06 FATCON EQU 6 OFFSET TO START OF FAT DATA 68 BYTES 0023 0024 0025 DIRECTORY ENTRY FORMAT 0026 0027 0028 THE DIRECTORY IS USED TO KEEP TRACK OF HOW MANY FILES ARE STORED ON A DISKETTE 0029 AND WHERE THE FILE IS STORED ON THE
15. 6 LCABD LDX VARTAB LCABF STX VARTAB CLR Xt DECB BPL LCAC6 JSR LA42D JSR LAD21 JSR 8 JSR LACEF ASR BLO LCADA JSR LA426 LCADA ASR LBCS LAD9E JMP LAC73 DVECI3 TST DEVNUM BGT LCAC6 RTS CLOSE ALL FILE BUFFERS RAM VECTOR DVEC7 LDB INCB LCAED PSHS B STB DEVNUM BSR 1 01 PULS B DECB BNE LCAED LCAF8 RIS CLOSE FILE RAM HOOK DVEC8 TST DEVNUM LBLE XVEC8 LEAS 902 5 LCB 1 258 LC744 CLR DEVNUM 10806 STX LDA BEQ LCAF8 PSHS A CLR FCBTYP X LDB FCBDRV X STB DCDRV CMPA 0UTFIL BNE LCB31 CLOSE A SEQUENTIAL OUTPUT FILE LDB FCBLFT X LDA 4580 ORA FCBCPT X STD FCBLST X INC FCBSEC X LDB FCBCGR X JSR LC755 STA FAT1 X B16 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK BEFORE THE FILE IS RUN GRAB FCB FOR INPUT FILE CHECK ASCII FLAG AND BRANCH IF CRUNCHED BASIC FILE IS THIS A MERGE BRANCH IF MERGE DO A NEW ERASE VARIABLES RESET VARIABLES GO TO BASIC S MAIN LOOP IT WILL LOAD PROGRAM CHECK FILE TYPE MUST BE 0 amp CHECK MERGE FLAG MUST BE NO MERGE 0 BAD FILE MODE ERROR IF MERGE OR NON BASIC DO A NEW RESET POINTERS ERASE VARIABLES SET THE LOAD FLAG TO FF THIS WILL CAUSE A NEW TO OCCUR IF AN ERROR OCCURS WHILE THE PROGRAM IS BEING LOADED GET CHAR FROM BUFFER SHOULD BE FF GET ANOTHER MS BYTE OF LENGTH SAVE MS BYTE ON STACK LS BYTE OF LEN
16. 8D 8D 34 8D 34 C6 BD CE 35 8D CE 35 34 C6 BD 33 35 E7 EF 35 7E BD 86 8D 7E BD C1 22 34 BD C1 22 34 BD D7 5A C1 22 35 97 D7 39 7E BD 86 06 DE 34 AD 35 D7 DF F1 01 88 66 29 08 67 09 62 66 00 C2 1 64 97 66 16 44 F1 C2 61 44 1 09 B D8 67 09 67 6A 80 88 CA 38 2B 18 27 18 02 04 06 10 05 06 10 50 80 5 84 10 84 02 10 5 B2 B3 2F Bl B7 03 1C 04 B7 22 13 04 B7 ED 11 07 06 B4 B2 B1 EB EC 44 84 44 EB EC 0g 13 LC 00 89 13 58 1 80 00 OF 9A 6D 57 46 B 38 38 4A 6D 56 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 LDX FCBTMP LDD SECLEN STD FCBLST X LDB 506 5 BEQ LD3E6 LDB VD8 ANDB 507 5 BEQ LD3CC LDD 502 5 ADDB 06 S ADCA 00 JSR LC2CC LD3CC LDX FCBTMP LDU 504 5 STU FCBREC X LDB 506 5 LDU ARYEND 10306 PSHS U B LDX STU FCBBUF X JSR LC2D8 01 S PULS B U DECB BNE 10306 LD3EG LDX FCBTMP LDU DFLBUF STU FCBBUF X LDB VD8 ANDB 507 5 BEQ LD3FC CLR 07 5 LDD 10 5 ORA 80 STD FCBLST X LD3FC JMP LCA58 DSKI COMMAND DSKI 10439 BSR LD42E PSHS X BSR LD42E PSHS X LDB 4 02 JSR LD4A1 LDU DBUFG 128 PULS X BSR L041 LDU DBUF PULS X LD41A PSHS U X LDB 128 JSR LB5OF LEAU X PULS X STB X STU 02 X PULS X LD42B JMP LA59A LD42E JSR SYNCOMMA LDX L835
17. 9 CBAD COAF COBB COB2 C0 3 C085 C0 7 C089 C BC C BE coco 2 C0C4 00 00 00 00 00 44 20 06 00 8E 6F 8C 26 8E CE C6 BD ED 6F 6F FD FD CE 86 B7 A7 EC ED 8C 26 8E BF 8E OF CE C6 EF 5A 26 8E BF 86 B7 8E BF 86 B7 7F 7F 7F 7F 8E BF 30 BF 30 BF 6F 30 BF 6F 30 BF 6F 86 B7 30 16 50 27 4C 16 CB D7 BD 96 8B 97 8D 1C 12 13 17 18 48 94 6 06 80 09 F9 01 BA A5 B2 43 48 C4 45 CE 01 01 01 7 01 81 C1 C1 C2 01 09 B B4 BA 81 FB D7 01 7 01 07 01 13 09 08 08 08 08 09 09 89 09 01 09 00 89 09 00 89 09 00 02 09 89 10 01 89 18 19 96 06 B7 19 AF 0g 89 F6 34 9A 77 2E 2D 56 32 5E 26 9A 1 5F 4A AE BA 09 BC 00 7 00 4 94 DE 89 48 01 4 28 01 2 01 2C 5B 01 00 19 19 19 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 FCBDIR 18 FCBLST EQU 19 21 22 FCBDFL EQU 23 FCBLFT EQU 24 FCBCON EQU 25 ORG DOSBAS FCC DK 1 000 BRA 1 8 DCNVEC FDB DSKCON DSKVAR FDB 0UEA ZERO OUT THE RAM USED BY DISK BASIC 1 0068 LDX DBUF LC B CLR X CMPX DFLBUF BNE LC B LDX LCOF6 LDU 20 LDB 10 JSR 1 59 LDD L8277 STD 03 0 STD 08 0 CLR CLR 05 U LDD
18. FC ERROR IF lt gt 5 BYTES 1827 CD23 OF 06 CLR VALTYP SET VARIABLE TYPE TO NUMERIC 1828 CD25 7E BC 14 JMP LBC14 COPY A PACKED FP NUMBER FROM X TO 1829 1830 MKN COMMAND 1831 CD28 BD B1 43 MKN JSR 18143 ERROR IF VALTYP STRING 1832 CD2B C6 05 LDB 05 FIVE BYTES IN A FLOATING POINT NUMBER 1833 CD2D BD B5 OF JSR LB5OF RESERVE FIVE BYTES IN STRING SPACE 1834 030 BD BC 35 JSR LBC35 PACK AND STORE IT IN STRING SPACE 1835 CD33 7E B6 9B JMP LB69B SAVE STRING DESCRIPTOR ON STRING STACK 1836 1837 LOC COMMAND 1838 CD36 8D 05 Loc BSR LCD3D POINT X TO FILE BUFFER 1839 CD38 EC 07 LDD FCBREC X GET RECORD NUMBER RANDOM FILE OR SECTOR CTR SEQUENTIAL 1840 7 4 4 JMP GIVABF PUT ACCD IN 1841 1842 STRIP A DEVICE NUMBER FROM A BASIC STATEMENT SET PRINT 1843 PARAMETERS ACCORDING TO IT ERROR IF FILE NOT 1844 OPEN RETURN WITH X POINTING TO THAT FILE S FCB 1845 CD3D 96 6F LCD3D LDA DEVNUM GET CURRENT DEVICE NUMBER AND 1846 CD3F 34 92 PSHS A SAVE IT ON THE STACK 1847 CD41 BD B1 43 JSR LB143 ERROR IF VALTYP STRING 1848 CD44 BD 5 AE JSR LASAE CHECK FOR VALID DEVICE NUMBER SET PRINT PARAMETERS 1849 CD47 8D 6F TST DEVNUM CHECK DEVICE NUMBER 1850 CD49 10 2F E6 FD LBLE LB44A BRANCH IF NOT DISK FILE ILLEGAL FUNCTION CALL 1851 CD4D BD C7 14 JSR LC714 POINT X TO FILE BUFFER 1852 C050 35 92 PULS A GET OLD DEVICE NUMBER OFF OF THE STACK AND 1853 CD52 97 6F STA DEVNUM
19. LDA DEVNUM PSHS A JSR LASAE JSR TST DEVNUM LBLE LA5DA JSR LC744 LDB FCBTYP X CMPB RANFIL APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 GET NEXT CHARACTER FROM BASIC SAVE STATUS REGISTER IN ACCB CSAVE TOKEN NO GO CHECK FOR CSAVEM CLOAD TOKEN NO JUMP TO EXBAS CLOAD ROUTINE RESTORE STATUS REGISTER LOOP THROUGH BASIC S MAIN INTERPRETATION LOOP PURGE RETURN ADDRESS OFF OF THE STACK GET DEVICE NUMBER AND SAVE IT ON THE STACK STRIP DEVICE NUMBER OFF OF INPUT LINE VERIFY THAT THE FILE TYPE WAS INPUT CHECK DEVICE NUMBER AND BRANCH BACK TO BASIC S EOF IF NOT DISK FILE POINT X TO FCB GET FILE TYPE RANDOM FILE FM BAD FILE MODE ERROR IF RANDOM FILE NOT EMPTY FLAG SET TO NOT EMPTY CHECK THE CACHE FLAG BRANCH IF THERE IS A CHARACTER WHICH HAS BEEN CACHED GET SEQUENTIAL INPUT FILE STATUS LINK BACK TO BASIC S EOF STATEMENT GET FILENAME EXTENSION DRIVE NUMBER FROM BASIC LBEQ LA616 CLRB LDA FCBCFL X BNE LC932 LDB FCBDFL X LC932 LA5E4 LC935 LDX DEFEXT CLR 5 LDA DEFDRV STA DCDRV LDU DNAMBF LDD 2008 LC945 STA U DECB BNE 10945 LDB 4 03 JSR LA59A JSR 18748 LEAU X CMPB 02 BLO LC96 LDA 01 U CMPA BNE LC96A LDA U CMPA BLO LC96A CMPA 3 BHI LC96A BSR LC99D LC96A LDX DNAMBF INCB LC96E BNE LC97D LEAS 901 5 LC973 4DNAMBF BNE LCODF LC978 LDB 2X31 JMP LAC46 LC97D LDA CMPA BEQ LC980 CMPA
20. 0 x x 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 COLOR BIT PALETTE COLOR BIT PALETTE COLOR BIT PALETTE COLOR BIT PALETTE COLOR BIT PALETTE COLOR BIT PALETTE ARE UNDERLINED ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK G UG SG lt ADDR ADDR ADDR ADDR ADDR ADDR BLINK AT 1 2 SEC RATE ATTRIBUTES NOT AVAILABLE WHEN COCO 1 CSS CSS CSS CSS CSS CSS CSS CSS CSS CSS DISK BASIC UNRAVELLED II FF9A FF9A FF9B FF9C FF9C FF9D FF9D FF9E FF9E 4 5 6 BIT7 PALETTE ADDRESSES V BORDER BITE 2 BIT3 4 5 6 BIT7 V SCROLL BITE 2 BIT3 4 5 BIT6 BIT7 IN COCO MODE THE VSC S MUST BE INITIALIZED TO 9F V OFSETI BITE 2 BIT3 4 5 6 BIT7 V OFSETO BITE 2 BIT3 4 5 6 BIT7 RMB BLUE GRN REDE BLUI GRN1 REDI RMB RMB VSCO VSC1 VSC2 VSC3 RMB V11 V12 V13 V14 V15 V16 V17 V18 MM8 10 ADDRESS 1 2 FFB3 FFB4 FFB5 FFB6 FFB7 FFB8 FFB9 FFBA FFBB FFBC FFBD FFBE FFBF 1 1 APPENDIX A MEMORY MAP FORTH PIXEL PA THIRD PIXEL SECOND PIXEL PA FIRST PIXEL P 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 BO
21. 13 00 5A 57 55 13 El FF 01 00 13 19 56 00 APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK READ WRITE A TRACK OR SECTOR PUT DATA INTO A GRANULE NOT PRESENTLY INCLUDED IN THIS FILE LC366 LC37B LC3AC LC3AD LC3B2 LC3C5 LC3C8 LC3CF JMP LD6F2 PSHS X A JSR LC7BF TFR A B PULS A U STB DECA BNE LC366 PSHS X B JSR 1 71 PULS B X WHEN CORRECT GRANULE IS FOUND FIND THE RIGHT LEAS 901 5 LDU FCBTMP STB FCBCGR U LDA FF STA FCBSOF U LDA X CMPA BLO LC382 ANDA 3F CMPA FCBSEC U BHS LC382 LDA 08 BEQ LC352 LDA FCBSEC U ORA 0 STA X JSR 1 5 9 LDX FCBRLN U CMPX SECLEN BNE CMPX FCBLST U BEQ LC382 LDA 4 81 BRN C3FD CLRA CLRB STD FCBLST U LDB 4 02 LDX FCBRLN U CMPX SECLEN BNE LC3C8 LEAS 907 5 LDX FCBBUF U LDA 08 BEQ LC3C5 LDB 4 03 JMP LC35 JSR LC357 PULS B X STX FCBSOF U PSHS B JSR 16755 LEAX FATCON X LDB FCBCGR U ABX LDA X CMPA BLO LCABA ANDA 3F CMPA FCBSEC U BNE LC40 LDD FCBLST U ANDA 7F PSHS B A CLRA LDB 902 5 ADDD 503 5 CMPD 5 BLS LCABA TST 08 LBEQ 1352 SAVE GRANULE COUNTER AND POINTER TO LAST USED GRANULE FIND FIRST FREE GRANULE IN FAT SAVE FREE GRANULE NUMBER IN ACCB PULL LAST GRANULE POINTER AND COUNTER OFF OF STACK SAVE NEWLY FOUND GRANULE NUMBER IN ADDRESS OF LAST GRANULE DECREMENT GRANULE COUNTER GET
22. 1488 6 33 CB LEAU D U POINT U TO START OF THIS ARRAY S VARIABLES 1489 CAB8 11 A3 E4 LCAB8 CMPU 5 AT END OF THIS ARRAY 1490 27 2 BEQ LCA9F YES 1491 CABD 8D 04 BSR LCAC3 ADJUST STRING VARIABLE IF IN RANDOM FILE BUFFER 1492 CABF 33 45 LEAU 05 U MOVE POINTER TO NEXT DESCRIPTOR 1493 CAC1 20 F5 BRA LCAB8 CHECK NEXT VARIABLE 1494 1495 CHECK TO SEE IF A STRING IS LOCATED IN THE RANDOM FILE BUFFER AREA IF IT IS 1496 THE RANDOM FILE BUFFER IN QUESTION IT WILL BE DELETED IF IT IS HIGHER IN THE RANDOM 1497 FILE BUFFER SPACE THAN THE BUFFER IN QUESTION THE LENGTH OF THE CURRENT 1498 BUFFER WILL BE SUBTRACTED FROM THE ADDRESS OF THE STRING BECAUSE THE CURRENT 1499 BUFFER IS BEING DELETED CLOSED 1500 AE 42 LCAC3 LDX 02 0 POINT X TO START OF STRING 1501 5 BC 09 48 CMPX RNBFAD COMPARE TO START OF FREE RANDOM FILE BUFFER AREA 1502 CAC8 24 BE BHS LCAD8 RETURN IF gt START OF FREE RANDOM FILE BUFFER AREA 1503 CACA AC 64 04 S COMPARE TO START OF THIS FILE S RANDOM BUFFER 1504 CACC 25 B BLO LCAD9 BRANCH IF START OF THIS FILE S RANDOM BUFFER 1505 BUG THIS SHOULD BE A BRANCH TO A RETURN 1506 CACE AC 66 06 S COMPARE TO END OF THIS FILE S RANDOM BUFFER 1507 CADO 25 07 BLO LCAD9 BRANCH IF END OF THIS FILE S RANDOM BUFFER 1508 CAD2 1F 10 X D SAVE POINTER IN ACCD 1509 CAD4 62 SUBD 02 5 SUBTRACT RECORD LENGTH FROM START OF STRING ADDRESS 1510 CAD6 ED 42 STD
23. 6 26 26 5F 63 E7 39 EE 33 EF 85 84 40 16 88 20 00 88 OB 8B 1F 94 88 08 88 88 94 88 04 70 94 05 05 88 06 88 94 60 88 C8 02 05 01 04 62 94 94 02 09 01 04 03 84 C7 06 C4 BA 02 BA 15 03 DC 3F 09 05 40 EQ 21 98 02 23 02 C7 88 EE D5 88 EQ 0 88 04 88 88 07 41 07 15 09 01 15 10 11 10 17 18 19 19 25 46 33 19 FF 18 13 17 18 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 NOW X POINTS TO FILE BUFFER GET FILE TYPE IS THIS A RANDOM DIRECT FILE BRANCH IF NOT GET A BYTE FROM A RANDOM FILE RETURN CHAR IN ACCA FCB DATA BUFFER RETURN GET THE RECORD COUNTER COMPARE TO RECORD LENGTH AND BRANCH TO BUFFER EMPTY IF gt RECORD LENGTH ADD ONE TO RECORD POINTER AND SAVE IT IN FCB POINT X TO START OF RANDOM FILE BUFFER AND ADD THE RECORD COUNTER TO IT GET A CHARACTER FROM THE BUFFER RESTORE REGISTERS AND RETURN II TEST THE CACHE FLAG AND BRANCH IF AN EXTRA CHARACTER HAS NOT BEEN READ FROM FILE GET THE CACHE CHARACTER CLEAR THE CACHE FLAG RESTORE REGISTERS AND RETURN IS ANY DATA LEFT BRANCH IF SO SET FLAG TO BUFFER EMPTY GET CHARACTER POINTER ADD ONE TO CHARACTER POINTER DECREMENT NUMBER OF CHARACTERS LEFT IN FILE BUFFER IF LAST CHARACTER GO GET SOME MORE ADD CHARACTER COUNTER TO X GET DATA CHARACTER SKIP PAST 25 FCB CO
24. BRANCH IF NO KEY DOWN GO DO A BREAK CHECK IF A KEY IS DOWN GET INPUT POINTER INTO X TEMP SAVE IT SEARCH FOR THE END OF CURRENT LINE BRANCH IF END OF LINE CHECK FOR END OF SUB LINE TOO BRANCH IF END OF SUB LINE SYNTAX ERROR IF NOT END OF LINE GET MS BYTE OF ADDRESS OF NEXT BASIC LINE AND SAVE IT IN CURLIN BRANCH IF NOT END OF PROGRAM GO STOP THE SYSTEM GET LINE NUMBER OF THIS LINE AND SAVE IT IN CURLIN RESET BASIC S INPUT POINTER CHECK THE TRACE FLAG AND BRANCH IF TRACE OFF LEFT DELIMITER OF TRON SEND CHARACTER TO CONSOLE OUT GET NUMBER OF CURRENT LINE NUMBER CONVERT ACCD TO DECIMAL amp PRINT IT ON SCREEN gt RIGHT DELIMITER OF TRON SEND A CHARACTER TO CONSOLE OUT ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 C8F3 C8F5 C8F7 C8F9 C8FB C8FE C900 C992 C905 C997 C90A COBE C918 C912 C91
25. DISK BASIC UNRAVELLED II 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 CF5E CF61 CF63 CF66 CF69 CF6B CF6E CF78 CF72 CF75 CF77 CF7A CF7D CF80 CF82 CF85 CF89 CF8A CF8E CF90 CF92 CF93 CF95 CF97 CF9A CF9D CF9F CFA3 CFA6 CFA9 CFAB CFAD CFB CFB3 CFB6 CFB8 CFBC CFBE CFC3 CFC5 CFC7 CFC9 CFCB CFCD CFDS CFD2 CFD4 CFD7 CFD9 CFDB CFDD CFE CFE3 CFE4 CFES CFE7 CFE9 CFEB CFED CC CFF2 CFF3 CFF5 CFF7 CFF9 CFFC CFFE 0000 0003 0005 0007 0009 0008 0000 DOOF 0012 0014 0017 001 BD 8D 86 C6 BD C6 D7 7E C6 BD 7E BD C6 7D 18 39 18 8D OF 39 81 26 BD BD 9D 18 BD BD 96 26 BD BD BD 9D 18 86 BD 00 27 86 80 20 80 BD 8D 20 BD 00 26 86 7 BD 4F 5F 34 9D 26 35 BD 34 4F E3 25 AE 10 23 C6 7E EE ED EC 33 EF C6 BD C6 BD BD BD C6 12 09 09 OB A5 93 EA D5 A5 B2 c8 C6
26. DV PV VERT COORD START POINT PV SCREEN S COLOR SET ARGUMENT PV PRESET PSET FLAG PRESET 1 PSET DV PV HORIZ COORD ENDING POINT DV PV VERT COORD ENDING POINT PV HORIZ COORD DEFAULT COORD PV VERT COORD DEFAULT COORD 1 3 lt lt lt lt lt lt Y lt lt lt lt X X X X X X X X X X X X X X X X X X BASIC SCRATCH PAD VARIABLES TV FLAG TO INDICATE IF GRAPHIC DATA HAS BEEN CHANGED TV STACK POINTER STORAGE DURING PAINT PV OCTAVE VALUE PLAY DV PV VOLUME HIGH VALUE PLAY DV PV VOLUME LOW VALUE PLAY PV NOTE LENGTH PLAY PV TEMPO VALUE PLAY TV TIMER FOR THE PLAY COMMAND TV DOTTED NOTE TIMER SCALE FACTOR UPER EXTENDED BASIC HI RES MODE PV DLOAD BAUD RATE CONSTANT 0 300 52 1200 UPER EXTENDED BASIC HI RES TEXT MODE DV PV DLOAD TIMEOUT CONSTANT DV PV ANGLE VALUE DRAW DV PV SCALE VALUE DRAW XC X Xx X X X co PV DSKCON OPERATION CODE 0 3 PV DSKCON DRIVE NUMBER 0 3 PV DSKCON TRACK NUMBER 0 34 PV DSKCON SECTOR NUMBER 1 18 PV DSKCON DATA POINTER PV DSKCON STATUS BYTE ok X oko 4 EMPORARY FCB POINTER SPARE UNUSED VARIABLES 4 DISK BASIC UNRAVELLED II APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK 0296 0297 BASIC EXBASICDOSBASIC 0298 0299 0100 SW3VEC RMB 3 XXXX 3B3B SWI3 VECTOR 0300 0103 SW2VEC RMB 3 XXXX
27. GET RAM IMAGE OF DIRECTORY AND ZERO FIRST BYTE KILL FILE WRITE OPERATION CODE SAVE IN DSKCON VARIABLE WRITE A SECTOR GET NUMBER OF FIRST GRANULE IN FILE POINT X TO PROPER FILE ALLOCATION TABLE SKIP 6 CONTROL BYTES ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK 0961 713 POINT TO CORRECT ENTRY 0962 C714 E6 84 LDB X GET NEXT GRANULE 0963 716 86 LDA FF GET FREE GRANULE FLAG AND 0964 C718 A7 84 STA X MARK GRANULE AS FREE 0965 C71A C1 CB CMPB 0 WAS THIS THE LAST GRANULE 0966 C71C 25 F1 BLO LC7 F KEEP FREEING GRANULES IF NOT LAST ONE 0967 WRITE FILE ALLOCATION SECTOR TO DIRECTORY DO NOT WRITE 0968 THE SIX CONTROL BYTES AT THE START OF THE FAT TO THE DISK 0969 C71E CE 06 00 LC71E LDU DBUF 0 U TO DISK BUFFER AND 0970 C721 DF EE STU SAVE IT AS DSKCON VARIABLE 0971 C723 11 03 LDD 451103 WRITE DIRECTORY TRACK SAVE 0972 C726 97 STA DCTRK TRACK AND WRITE OPERATION CODE IN 0973 C728 D7 EA STB DCOPC DSKCON VARIABLES 0974 72 6 02 LDB 2 GET FILE ALLOCATION SECTOR AND 0975 C72C D7 ED STB DSEC SAVE IN DSKCON VARIABLE 0976 72 8D 25 BSR LC755 POINT X TO PROPER FILE ALLOCATION TABLE 0977 C730 6 01 CLR FAT1 X RESET FLAG INDICATING VALID FAT DATA HAS BEEN STORED ON DISK 0978 C732 30 06 LEAX FATCON X MO
28. GET THE DESCRIPTOR OF STRING 2 GET LENGTH AND ADDRESS OF STRING 2 AND SAVE THEM ON THE STACK SET CLEAR COUNTER TO 256 FULL SECTOR BUFFER USE DBUF AS THE DSKO 1 0 BUFFER CLEAR A BYTE IN 1 0 BUFFER DECREMENT CLEAR COUNTER BRANCH IF ALL 256 BYTES NOT CLEARED GET THE LENGTH AND ADDRESS OF STRING 2 POINT X TO STRING 2 DESTINATION MOVE STRING 2 DATA INTO DBUF POINT X TO STRING 1 DESCRIPTOR GET THE LENGTH AND ADDRESS OF STRING 1 POINT U TO STRING 1 DESTINATION MOVE STRING 1 DATA INTO DBUF DSKCON WRITE OP CODE POINT X TO 1 0 BUFFER DBUF SAVE NEW DSKCON BUFFER POINTER AND OP CODE VARIABLES GO WRITE OUT A SECTOR BRANCH TO DN ERROR IF NO DRIVE NUMBER SPECIFIED CALCULATE DRIVE NUMBER SKIP FACTOR DEFAULT VALUE GET CURRENT INPUT CHAR FROM BASiC BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA AND EVALUATE EXPRESSION MAX VALUE OF SKIP FACTOR 16 ILLEGAL FUNCTION CALL IF BAD SKIP FACTOR SYNTAX ERROR IF MORE CHARACTERS ON THE LINE SAVE SKIP FACTOR ON THE STACK POINT TO END OF LOGICAL SECTOR NUMBER STORAGE AREA 18 SECTORS PER TRACK CLEAR A BYTE IN THE BUFFER CLEARED ALL 18 KEEP GOING IF NOT RESET PHYSICAL SECTOR COUNTER START WITH FIRST PHYSICAL SECTOR 1 ADD SKIP FACTOR TO LOGICAL SECTOR COUNTER ADD ONE TO LOGICAL SECTOR COUNTER SUBTRACT MAX NUMBER OF SECTORS BRANCH UNTIL 0 gt ACCB gt 18 ADD 18 NOW ACCB IS 0 17 IS ANYTHING STORED HERE ALREADY YES GET ANOTHER SECTOR INCREMENT PHY
29. LD B9 LD C3 LD0C9 LD DA LD DF LD119 LD11E LD132 LD143 LD157 LD15A LD181 LD189 LD199 LD1A8 LDIAF LDIEF LD1F8 10208 LD20B LD212 LD21B LD222 LD236 LD249 LD24F LD256 LD25F LD27B LD28C LD2A4 LD2A5 LD2AE LD2CD LD2D2 LD2DD LD2EF LD2FA LD2FC LD2FF LD3OE 10310 10322 10326 10344 0013 0015 0051 0056 0059 D06E D06F D07F D082 D092 D A3 D A7 D B D0B9 D0C3 D0C9 D DA D DF D119 D11E D132 D143 D157 D15A D181 D189 D199 D1A8 D1AF D1EF D1F8 0208 D20B D212 D21B D222 D236 D249 D24F D256 D25F D27B D28C D2A4 D2A5 D2AE D2CD D2D2 D2DD D2EF D2FA D2FC D2FF D30E D310 D322 D326 D344 DISK BASIC UNRAVELLED II LD357 LD35E LD35F LD36C LD37E LD399 LD3AG LD3AD LD3CE LD3DC LD41E LD423 LD42C LD44E LD455 LD45D LD45F LD472 LD476 LD47C LD482 LD486 LD4BA LD4C4 LD4D4 LD4EA 10508 10519 L051C LD524 LD527 LD54A LD54D LD553 LD577 LD58F LD5B2 LD5B9 LD5C1 LD5C3 LD5C4 LD5CE 10606 10612 10620 10649 LD64F LD66F LD672 LD688 LD691 LD69A LD6C2 LD6C8 LD6D4 LD6F2 LD6FB 701 D357 D35E D35F D36C D37E D399 D3A0 D3AD D3CE D3DC D41E D423 D42C D44E D455 D45D D45F D472 D476 D47C D482 D486 D4BA D4C4 D4D4 D4EA D508 D519 D51C D524 D527 D54A D54D D553 D577 D58F D5B2 D5B9 D5C1 D5C3 D5C4 D5CE D606 D612 0620 0649 D64F D66F D672 D688 D691 D69A D6C2 D6C8 D6D4 D6F2 D6FB 0701 10709 LD70B 07 10737 1074
30. OCCUR IF AN ERROR OCCURS WHILE THE PROGRAM IS BEING LOADED GET CHAR FROM BUFFER SHOULD BE FF GET ANOTHER MS BYTE OF LENGTH SAVE MS BYTE ON STACK LS BYTE OF LENGTH OF PROGRAM PUT LS BYTE INTO ACCB NOW ACCD CONTAINS LENGTH OF PROGRAM ADD BEGINNING OF BASIC SEE OF ENOUGH ROOM IN RAM FOR THIS FILE GET START OF BASIC READ A CHAR FROM CONSOLE IN BUFFER EMPTY BRANCH IF SO STORE CHAR GET ANOTHER CHARACTER CLEAR LOAD FLAG LOAD WAS ERROR FREE SAVE NEW START OF VARIABLES CHECK THREE BYTES CHECK A BYTE BRANCH IF NON ZERO DECREMENT COUNTER KEEP CHECKING IF NOT DONE GET START OF VARIABLES SAVE START OF VARIABLES CLEAR A BYTE DECREMRNT COUNTER KEEP CLEARING BYTES IF NOT DONE CLOSE SELECTED FILE DO PART OF NEW ERASE VARIABLES RESET INPUT PTR INITIALIZE EXBAS GRAPHICS VARIABLES RELOCATE ALL THE BASIC NEXT LINE POINTERS CHECK LSB OF RUN FLAG BRANCH IF DON T CLOSE ALL FILES CLOSE ALL FILES TEST BIT 1 OF RUN FLAG BRANCH TO COMM INTERPRETATION LOOP IF BIT 1 SET RETURN TO DIRECT MODE CHECK DEVICE NUMBER AND TRY TO RUN FILE IF IT IS A DISK FILE GET THE NUMBER OF RESERVED FILE BUFFERS ADD ONE SAVE IT STORE IT IN DEVICE NUMBER CLOSE FILE GET BACK NUMBER OF FILE BUFFERS DECREMENT FILE BUFFER COUNTER BRANCH IF ALL FILES NOT CLOSED CHECK DEVICE NUMBER AND RETURN IF NOT A DISK FILE PURGE RETURN ADDRESS OFF OF THE STACK POINT X TO CORRECT FCB SET DEVICE NUMBER TO SCREEN SAVE FILE BUFF
31. 0696 0697 0698 0699 0700 0701 0702 0703 0704 0705 0706 0707 0708 0709 0710 0711 0712 0713 0714 0715 0716 0717 0718 0719 0720 0721 0722 0723 0724 0725 0726 0727 0728 0729 0730 0731 0732 0733 0734 0735 0736 0737 0738 0739 0740 0741 0742 0743 0744 0745 0746 0747 0748 0749 0750 0751 0752 0753 0754 0755 0756 0757 0758 0759 0760 0761 0762 0763 0764 0765 0766 0767 0768 C4DE 4 0 C4E3 C4E5 C4E8 C4EA C4EC C4EE C4F0 C4F2 C4F4 C4F7 C4F9 C4FC C4FE C500 C592 C585 C587 C50A 50 C50D C50F C511 C512 C514 C516 C518 C51A C51D C51F C521 C524 C526 C527 C528 C529 C52B C52E C531 C533 C534 C536 C539 C53A C53C C53F C543 C546 C548 C54A C54C C54F C552 C555 C557 C559 C55B C55C C55E C561 C563 C566 C569 C56B C56D C578 C573 C575 C577 C579 C57C C57E C581 C583 C585 C588 C58A C58D C58F C591 C595 C597 C599 C59B C59E C5AQ C6 7E 34 7D 26 8D 8D 63 6 35 FD EF FE EF 20 8D FE EE 39 9 C6 6F 5A 26 9E 96 A7 B6 A7 A7 F6 Cg 58 58 58 34 FC 83 86 3D AB A7 39 C6 B6 18 B7 97 C6 D7 BD BE BF 33 C6 6F 5A 26 8E C6 BD FC ED C6 BD B7 A7 C6 D7 BD 34 BD 6 A6 Bl 25 BD 35 96 10 32 34 OF 8E 06 58 3A AC 06 09 02 4 12 00 08 46 09 OB 09 09 96 09 09 4 88 1 19 80 FB F1 EB 01 09 02 03 09 03 04 09 06 0
32. 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 C CBB3 CBB4 CBB6 CBB8 CBBA CBBC CBBE CBC1 CBC3 CBC4 CBC6 CBC8 CBCB CBCD CBCF CBD2 CBD5 CBD8 CBDB CBDD CBDF 1 CBE6 CBE8 CBEB CBED CBF2 CBF4 CBF6 CBF7 CBF9 CBFB CBFD CC00 02 04 CC07 CC09 CCOB CCOD CCOF 11 12 CC15 CC17 CC19 CC1D CCIF CC21 CC23 CC25 CC26 CC29 CC2C CC2E CC31 CC34 CC36 CC38 CC39 CC3B CC3D CC3E CC41 CC44 CC47 CC49 CC4A CC4B cc4D CC51 CC53 CC54 CC56 CC58 CC5A CC5B CC5D CC5F CC62 BD 3A 33 A6 81 25 6F BD A7 8C 8A A7 BD 35 35 BD BD BD 97 07 C6 D7 BE 9F BD 35 BD 34 A6 27 43 27 34 C6 BD 8D C6 BD 8D E6 24 80 4F BD 8D AE 86 AB 8D E6 8D 1F 4F BD BD 35 30 8C 25 6 5C 23 39 BD 7E BD 33 4F 4C 81 10 30 3A E6 25 39 00 2 8E AF C7 06 24 09 08 24 C7 23 8A Cg C4 C5 60 96
33. 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 C032 C034 C035 C037 C039 CD3C CD3E CD41 CD43 CD45 CD47 CD49 C048 CD4D CD4F CD51 CD53 CD55 CD57 CD59 CD5B CD5D CD5F CD61 CD63 CD65 CD67 CD6A CD6C CD6E C070 C072 C074 C075 C077 C079 CD7B CD7D CD7F CD81 CD83 CD86 CD88 CD8A CD8C CD8E CD98 C092 C094 C097 C098 CD9A CD9C CD9E CDA CDA2 CDA4 CDA6 CDA8 CDAA CDAC CDAE CDB CDB2 CDB4 CDB6 CDB8 CDBA CDBC CDBE CDCO CDC3 CDC5 CDC7 CDCB CDCD CDD9 CDD3 CDD5 CDD6 CDD8 CDDB CDDD CDDF CDE1 CDE4 25 39 00 2 86 AF 86 C6 07 96 26 C6 8D 81 27 81 26 C1 26 16 07 20 C1 27 81 26 8C 27 A6 81 26 86 4D 27 91 27 34 1 27 7 8C 26 8D 26 20 8D 27 6F 8E 39 81 27 81 26 8D 26 81 27 81 27 81 26 8D 26 81 27 8D 20 8D 27 BD E6 C1 18 C6 7E BD 00 39 34 BD E6 C1 26 EC 83 6F 5E E4 02 2C 01 06 02 20 6F 20 FA 22 BA 2c 06 89 01 22 22 11 00 gD 92 44 16 36 gD 17 01 1D 04 EQ 17 80 03 06 46 06 1 40 CD 84 02 22 04 20 F2 2E EE 20 F8 2C E6 00 08 1 DE BA DA 1c 06 12 15 C7 00 40 26 4 1 70 14 C7 00 40 OB 88 0g 69 DD DD D6 DC 44 F5 46 76 44 15 01 87 10 RTS APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 LCD24 INPUT RAM HOOK
34. 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 0547 D54A D54C D54F D551 D554 D557 D559 D55C D55E 0560 0562 0565 0567 0569 0568 0560 D56F D571 D573 D575 D577 D579 D57C D57E D581 D582 D584 D585 D587 D589 D58C D58D D58F D591 D593 D594 D596 D598 D59B D59E D5A1 D5A4 D5A7 D5AA D5AC D5AD D5AF D5B2 D5B4 D5B6 D5B9 D5BB D5BD D5BF D5C1 D5C3 D5C5 D5C7 D5C9 D5CB D5CD D5CE 0500 0502 0505 0507 0508 D5DA D5DB D5DD D5DF 0561 0563 0564 0566 B6 86 B7 C6 F7 B6 8A B7 E6 E7 20 B6 1C 84 97 26 0 96 81 26 86 97 9F CE 4F 97 5F A6 97 BD 5C 25 96 4C 81 25 7E 7F 7F 7E 86 80 5F 34 CE E6 D7 CE C6 8D 96 A7 6F 96 A7 C6 8D 35 5C C1 25 E7 4A 26 39 34 EC 8D 35 5A 26 39 FF FF 09 F4 FF 09 80 FF 80 M FA FF AF 44 FO 26 EC EC 23 A4 02 06 07 C5 ED D5 12 F4 EC 23 EA 01 09 FF D6 09 20 29 04 07 C5 ED D5 03 1 80 80 80 09 10 04 12 c8 80 FB 94 F4 04 F5 0567 08 00 0569 03 F5 D5EB 01 FE
35. 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 D53C D53E D53F D541 D543 D545 D547 D549 D54A D54D 0550 0553 0555 0557 0559 0558 0550 D55F D561 D562 D564 D566 D568 D56A D56C D56E D571 D573 D574 D577 D579 D57A D57C D57E D581 D583 D585 D588 D58B D58D D58F D592 D594 D596 D599 D59D 05 0 D5A2 D5A4 D5A6 D5A9 D5AB D5AF D5B2 D5B4 D5B7 D5B9 D5BB D5BC D5BE D5BF D5C1 D5C3 D5C4 D5C6 D5C8 D5CA D5CC D5CE D5CF D5D1 D5D3 D5D5 D5D7 D5DA D5DC 0560 0563 0566 D5EA D5ED D5EF D5F1 D5F3 D5F6 D5F9 D5FB D5FE 0601 07 5A C1 22 35 97 D7 39 7E BD 8E D6 DE 34 AD 35 D7 DF 39 8D 8D 8D 9E 34 8D BD 34 5F 8E 6F 5A 26 35 CE 8D 35 BD CE 8D C6 8E 9F D7 7E 10 BD C6 9D 27 BD cl 10 BD 34 8E C6 6F 5A 26 4F 20 EB 5C 24 CB 6D 26 4C A7 81 25 32 8E 9 10 BD 73 10 BD 86 97 OF BD 7 86 B7 BD 27 ED 11 07 06 84 B2 B1 EB EC 44 84 44 EB EC C3 E7 BC 52 18 DF B6 14 06 80 FB 14 06 96 10 6 06 8C 03 06 06 27 02 04 5 0 7 11 24 5 04 07 12 82 FB 00 4 12 FC 12 85 F5 85 12 EC 61 22 27 22 CA 09 95 00 EA EC D6 09 co FF 07 10 4 60
36. 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 0603 0606 0608 060 0600 060L 0612 0614 0617 0619 0618 0616 0620 0623 0625 0629 0628 D62E D631 D634 D637 D639 D63C D63E D641 D644 D646 D649 D64B D64D D64F D652 D654 D656 D658 D65A D65C D65E 0660 0662 0664 0666 0669 0668 0666 066L 0671 0672 0674 0676 0679 D67A D67C D67E 0680 0681 0683 0685 0688 0688 0686 0691 0694 0697 0699 D69A D69C D69F D6A1 D6A3 D6A6 D6A8 D6AA D6AC D6AE 06 0 0682 0684 06 6 06 8 D6BA D6BB D6BD D6BF D6C2 D6C4 D6C5 D6C7 7E 81 25 B6 8A B7 86 B7 1E 1E BD 26 BD 8D 18 1A 8E BF 8E B6 86 B7 C6 F7 B6 8A B7 E6 E7 20 B6 1C 84 97 26 0 96 81 26 86 97 8E 9F CE 4F 97 5F A6 97 BD 5C 25 96 4C 81 25 7E 7F 7F 7E 8E cc 8D 5F 34 CE E6 D7 CE C6 8D 96 A7 6F 96 A7 C6 8D 35 5C Cl 25 cc E7 26 39 06 16 08 09 10 FF 53 FF 88 88 07 68 07 6 50 06 09 09 FF
37. 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 0560 D5EF D5F1 D5F3 D5F5 D5F7 D5F9 D5FB D5FD D5FF 0601 0603 0606 0608 060 060 060 0610 0612 0614 0616 0618 0618 0610 061L 0621 0623 0625 0628 D62A D62C D62E 0630 0632 0635 0637 0639 0638 0630 D63F D641 D643 D644 D646 D648 D64A D64B D64D D64F 0650 0652 0655 0657 0659 0658 065C 0656 0660 0661 0663 0667 066 066C 0666 0670 0672 0675 0677 D67A D67D D67F D681 D683 D685 D687 D689 D68B D68D D68F D692 D695 D697 D699 D69C D69F D6A1 D6A3 D6A5 D6A8 D6AA 01 01 16 0 03 01 00 01 18 34 C6 F7 35 8D 00 27 96 C6 85 26 C6 7E 34 96 81 35 26 7D 27 34 86 97 DE 8E 9F 8D DF 86 97 96 26 5F A6 1 26 5A 26 35 39 35 7A 26 C6 20 5F 81 27 53 81 18 F7 BE 34 86 34 TE 06 8E B6 84 AA 8A D6 C1 25 8A 1F 8A B7 B7 C5 26 BD BD 8D 26 OF 8E 06 58 01 F7 00 F5 FB FF F7 04 05 09 04 62 00 36 40 02 28 02 03 02 2 09 25 56 02 EE 07 33 03 EA 00 80 06 F7 56 56 09 1 48 BD AA 07 88 26 09 9F 76 05 02 09 07 09 8 85 20 EC 16 02 10 89 08 09 FF 08 06 7 7
38. 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 D6C8 D6CA D6CC D6CE 0600 0601 0603 0604 0606 0608 D6DA D6DC D6DE 0660 0662 0664 0666 0668 D6EA D6EC D6EE D6F2 D6F4 D6F6 D6F9 D6FB D6FD D6FF 0701 0703 0705 0707 0709 0708 0706 0710 0712 0714 0716 0718 0718 0710 D71F D721 D723 D725 D728 D72A D72C D72E 0730 0732 0734 0736 0737 0739 0738 D73D D73E 0740 0742 0743 0745 0748 D74A D74C D74E D74F D751 D753 D754 D756 D75A D75D D75F D761 D763 D765 D768 34 EC 8D 35 5A 26 39 08 03 01 01 01 16 0 03 01 00 01 18 26 6E 34 C6 F7 35 8D 00 27 96 C6 85 26 C6 7E 34 96 81 35 26 7D 27 34 86 97 DE 8E 9F 8D DF 86 97 96 26 5F A6 1 26 5A 26 35 39 35 7A 26 C6 20 5F 81 27 53 81 10 F7 BE 34 86 34 7 06 94 F4 94 F5 00 F5 FE 01 F7 46 00 F5 FB FF F7 46 54 9F 04 05 09 04 62 00
39. 40 CL OF BA C7 88 EE 2C 88 BC 88 07 20 06 88 03 ED 11 EC 09 88 7 2 03 05 6F 2F 62 16 09 6F 85 84 18 36 00 02 06 20 02 06 40 1 88 00 22 88 B 8B 02 1F 94 88 88 06 88 96 60 89 C6 01 04 84 03 25 F1 33 19 0g 02 FF B7 26 17 01 09 01 17 18 18 01 58 00 23 72 18 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 LCAFl JSR LC725 DEC FAT X TST 1 BEQ LCAFD JSR LC6F1 LCAFD LDX FCBTMP PULS A CMPA 0UTFIL BEQ LCB D CMPA RANFIL BNE LC 08 LDA FCBFLG X BEQ LCB17 WRITE CONTENTS OF FILE BUFFER TO DISK LCB D JSR LC733 LEAU FCBCON X STU BSR LC843 LCB17 LDA FCBLST X BPL LC 08 LDB FCBDIR X ANDB 4507 LDA DIRLEN MUL LDU DBUF STU LEAY D U LDB FCBDIR X LSRB LSRB LSRB ADDB 4503 STB DSEC LDD 4 1102 STA DCTRK BSR LC845 LDD ANDA 7F STD DIRLST Y LCB43 LDB 4503 LCB45 STB DCOPC JMP LD5FF CONSOLE OUT RAM HOOK DVEC3 TST DEVNUM LBLE XVEC3 LEAS 902 5 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK POINT X TO PROPER FILE ALLOCATION TABLE REMOVE ONE ACTIVE FILE NEW DATA IN FAT RAM IMAGE NO WRITE OUT FILE ALLOCATION TABLE TO DISK GET FILE BUFFER POINTER GET FILE TYPE IS IT A SEQUENTIAL OUTPUT FILE YES IS IT A RANDOM FILE RETURN IF NOT A RANDOM FILE SEQUENTIAL INPUT TEST THE GET PUT FLAG AN
40. 42 4 ac D3 61 03 61 07 03 40 09 16 09 91 09 8 19 1F AD 09 09 06 09 AD C4 02 03 63 EC 09 5B 5A B D3 D3 B9 AC 56 FF 6F 56 06 FF C7 E9 88 12 D9 A8 5C 22 22 73 5C 28 5B 19 5C 5D 5D 19 89 APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK CHECKED ALL FILES NO DRIVE IF NONE GIVEN GET DEFAULT DRIVE NUMBER GET NEXT INPUT CHAR USE DEFAULT DRIVE NUMBER IF NONE GIVEN EVALUATE EXPRESSION 4 DRIVES MAX DEVICE NUMBER ERROR IF gt 3 STORE IN DSKCON VARIABLE DEVICE NUMBER ERROR IF NO DRIVE NUMBERS GIVEN RESET SAM DISPLAY PAGE AND VOG MODE GET SOURCE DRIVE NUMBER AND SAVE IT AT TOP OF DBUF TOP OF NEW STACK GET A CHARACTER FROM BASIC BRANCH IF END OF LINE TOKEN FOR TO SYNTAX CHECK FOR TO GET DESTINATION DRIVE NUMBER PUT STACK AT TOP OF DBUF SAVE DESTINATION DRIVE NUMBER ON STACK SYNTAX ERROR IF NOT END OF LINE CLOSE ALL FILES CLEAR A TRACK COUNTER ON STACK POINT X TO TOP OF DISK RAM VARIABLES INCREMENT TRACK COUNTER INCREMENT X BY ONE TRACK COMPARE TO TOP OF NON RESERVED RAN KEEP GOING IF MORE FREE RAM LEFT DECREMENT TRACK COUNTER OM ERROR IF 1 TRACK OF FREE RAM GET MAXIMUM NUMBER OF TRACKS INITIALIZE REMAINING TRACKS CTR INITIALIZE TRACKS WRITTEN COUNTER TO ZERO SAVE TRACKS WRITTEN AND REMAINING COUNT
41. BNE LC6B3 BRANCH IF NOT DONE CHECKING FILENAME STB 973 SAVE SECTOR NUMBER IN DSKCON VARIABLE LDA FCBFGR U GET NUMBER OF FIRST GRANULE IN FILE STA V976 AND SAVE IT IN V976 RTS LC6C7 LEAU DIRLEN Y GET NEXT DIRECTORY ENTRY DIRLEN BYTES PER ENTRY CMPU DBUFO SECLEN AT END OF BUFFER BNE LC6A5 CHECK NEXT ENTRY IF NOT AT END INCB NEXT SECTOR CMPB 11 11 SECTORS MAX IN DIRECTORY BLS LC69B BRANCH IF MORE SECTORS RTS LC6D6 COMA COMPLEMENT FIRST BYTE IN DIRECTORY EMTRY BNE LC6B9 BRANCH IF FILE IS ACTIVE FALL THRU IF NOT USED SET POINTERS FOR FIRST UNUSED DIRECTORY ENTRY LC6D9 LDA V977 BNE DVEC12 STB V977 STU V978 DVEC12 RTS LC6E4 LDB 2 26 TST V973 BNE DVEC12 JMP L C46 KILL COMMAND KILL JSR LC935 JSR LA5C7 JSR 16790 BSR LC68C BSR LC6E5 LC6FC LDA FF JSR LC807 LDX V974 CLR DIRNAM X LDB 03 STB DCOPC JSR LD6F2 LDB DIRGRN X LC7 F BSR LC755 LEAX FATCON X B10 UNUSED ENTRY ALREADY FOUND RETURN IF UNUSED ENTRY ALREADY FOUND SECTOR CONTAINING THIS DIRECTORY ENTRY POINTS TO RAM AREA WHERE DIRECTORY DATA IS STORED NE ERROR WAS A DIRECTORY MATCH FOUND RETURN IF FOUND JUMP TO ERROR HANDLER IF NOT FOUND GET FILENAME EXT FROM BASIC SYNTAX ERROR IF MORE CHARACTERS ON LINE GET VALID FAT DATA TEST FOR FILE NAME MATCH IN DIRECTORY MAKE SURE THE FILE EXISTED MATCH FILE TYPE FF THIS WILL CAUSE AN AO ERROR TO BE GENERATED IF ANY FILE TYPE IS OPEN CHECK TO MAKE SURE FILE IS NOT OPEN
42. C961 C964 C966 C968 C96B C96D C96F C972 C974 C977 C979 C97B C97E C980 C982 C985 C988 C98B C98C C98E C998 C992 C996 C998 63 27 A6 Cg 80 25 81 22 97 39 8D 8E 86 A7 8C 26 5A 27 A6 81 27 8C 27 8D 20 A7 27 81 27 81 27 4C 27 39 81 10 80 96 90 27 BD C6 BD 26 73 8D 4F 7E 86 8C 86 F6 5C D7 7E 8D 86 BD DC 93 BD 1F BD 9E A6 BD 96 26 7E 8E 7E 4F c6 20 81 18 86 20 62 D7 C1 02 30 CL 03 CB EB C1 09 20 82 09 F9 DA Cg 3A CD 09 02 80 4 2 2 9L 99 4D 27 4B 8A 09 5 21 2 41 2 E4 09 04 B7 4 86 49 09 6F C4 F FF 68 18 19 68 98 CB 19 80 cB 1B F7 M C2 C8 FF 12 22 26 02 07 57 54 57 05 54 57 60 6F 58 64 49 5B 68 52 52 52 52 2D 8E 8A B9 06 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 GRAB DRIVE NUMBER LCBEF 02 5 BEQ 1 8 LDA SUBB 02 SUBA 0 BLO LC8CA CMPA 03 BHI LC8CA STA DCDRV RTS GRAB EXTENSION LC902 BSR 1 8 5 LDX DNAMBF 11 LDA 5 LC909 STA X CMPX DEXTBF BNE 1909 LC910 DECB BEQ LC8ED LDA CMPA BEQ LC8E6 CMPX DNAMBF 11 BEQ LC8CA BSR LC922 BRA LC910 INSERT CHARACTER INTO FILENAME OR EXTENSION LC922 STA BEQ 1 8 CMPA BEQ LC8CA CMPA BEQ LC8CA INCA BEQ LC8CA LC931 RTS SAVE COMM
43. CCB5 CCB7 CCB9 CCBB CCBD CCCO 2 CCC5 CCC7 CCCA CCDS CCD1 CCD3 CCD5 CCD7 CCDA CCDC CCDE 1 5 CCE7 CCE9 CCEB CCEC CCEF CCF1 CCF3 CCF5 CCF7 CCF9 CCFB CCFD CCFF CD0O CD93 CD96 CD88 CDOB CDBE CD18 C012 C013 C015 C017 C018 CD1B CD1E CD21 CD23 CD24 CD25 CD27 CD2B CD2D CD2E C030 E6 BD 3A 33 A6 81 25 6A 6 BD 6F 6F A7 8C 8A A7 30 BD BD 35 35 BD BD BD 97 07 C6 D7 86 9F BD 35 BD 34 A6 27 43 27 34 C6 BD 8D C6 BD 8D E6 24 80 4F BD 8D AE 86 AB 8D E6 8D 16 4F BD BD 35 30 8C 25 6 5C 23 39 BD 7E BD 33 4F 4c 81 10 30 6 cl 03 C7 06 24 09 BE 24 25 C7 24 25 23 8A C4 A4 C6 C5 60 96 02 C7 B9 11 EC EA 03 06 06 40 5 40 84 38 44 10 08 B9 93 B9 38 00 02 30 BD 2A 4 42 0 1 00 21 89 BD B9 18 88 07 5 12 4 2 9 C7 06 44 22 C4 84 55 85 9 4F 9D 58 92 00 F2 49 A2 A2 58 20 00 82 55 9 28 LDB JSR ABX LEAU LDA CMPA BLO DEC INC JSR CLR CLR STA CMPX ORA STA LEAX JSR JSR PULS PULS LCC99 DIR COMMAND DIR JSR JSR JSR LDD STA STB LDB READ A DIRE LCCBB STB LDX STX JSR SEND DIRECT LCCC5 PULS JSR P
44. CDEE CDF2 CDF5 CDF6 CDF8 CDFA CDFC CDFF 1 6 CE08 CEOB CE D 10 12 CE13 CE16 CE1A CE1C CELE CE22 CE24 CE27 CE2B CE2E 2 CE34 CE38 CE3A 40 43 45 49 4 CE4E CE51 CE53 CE56 CE58 5 CESF CE61 CE63 CE66 CE69 CE6B CE6D CE78 CE72 CE74 CE76 CE78 CE7A CE7D CE83 CE85 CE87 CE89 90 CE93 CE96 CE98 6F C6 A6 43 26 6 26 35 7 BD C1 18 F7 39 A6 26 AE 8C 26 AE 8C 26 8E AF 7E 35 46 BD 18 9E EC 18 25 B3 18 7E 81 27 81 18 9D 81 18 BD C1 18 96 7E BD 9D 7E C1 18 BD 96 34 BD BD 00 2 BD E6 C1 26 35 97 EC 7E BD 35 97 D6 7E 9D 8D BD BD AC 18 E2 44 80 92 4 F6 94 B4 B7 03 22 09 64 13 65 0 62 Bl 05 65 88 02 1 27 52 02 83 07 09 25 1C c8 26 9F 2C 27 B7 04 22 BC 96 A4 9F 8C 34 26 B2 6F 02 5 4 6F 13 C7 0g 4g BA 02 6F 88 B4 A3 02 6F 6 84 9F 4 83 83 62 25 B D8 5A 9A 66 18 46 48 EE 09 4 1 4 B3 C8 B E6 2E 29 1B B3 62 AE 06 14 17 F4 5F F3 6 6 5 20 19 89 86 94 18 01 0 CLR 5 LDB 6 LCDDA LDA X DISASSEM
45. CF87 CF88 CF8A CF8C CF8E CF91 CF93 CF95 CF97 CF99 CF9B CF9D CFAQ CFA2 4 CFA6 CFA8 CFA9 CFAA CFAC CFAE CFB3 5 CFB8 CFBA CFBB CFBE CFC3 CFC5 CFC8 CFCB CFCE CFD2 CFD4 CFD6 CFD8 CFDB CFDE CFE CFE3 CFE6 CFE8 CFEA CFEC CFEE CC CFF2 CFF4 CFF6 CFFA CFFD CFFF 0001 0004 0006 0008 00 0000 DOOF 0011 0013 0015 0018 001 0018 0010 D01F D021 D023 7E 9D 8D BD BD AC 10 BD BD cc FD BD 4F 8D EC A3 c3 1F 8D EC 8D AE A6 BD 31 26 86 8D 4F 5F 8D 35 8D 7E 8D BD 1E 39 8E 7E 9D 8D BD FC 83 10 9 90 27 BD BD 9F BD BD 34 8D 1F 8D D3 DD 1F A6 18 BD D6 27 7E A7 1 27 7 31 26 20 80 BD 1E 39 9E 34 8D 96 34 B4 9F 4 83 83 62 25 83 5 02 09 28 62 64 00 02 16 64 1A 64 80 CC 3F F7 FF 00 07 36 03 4 00 89 C2 C9 9F F6 CA 09 02 26 8A A5 06 2 B7 D3 A5 CD 02 29 02 25 03 90 01 EQ 26 C5 70 03 C3 84 80 03 07 3F E9 00 00 CD 89 A6 18 35 EB 02 6C 6C 4 6 C7 00 57 04 01 24 20 24 38 07 57 00 06 60 30 C7 BC 4 C4 52 9 BC D2 44 33 SAVEM COMMAND LCF568 LCF9B WRITE ACCD TO THE BUFFER LCFB3 LCFB5 LCFBB LOADM COMMAND LCFDE LCFE3 GET RECORD LCFFA 10004
46. DSEC DSKCON DSKI DSKINI DSKO DSKREG DSKVAR DUSRVC DVEC DVEC1 DVEC1 DVEC11 DVEC12 DVEC13 DVEC14 DVEC15 DVEC17 DVEC18 DVEC2 DVEC22 DVEC3 DVEC4 DVEC5 DVEC6 DVEC7 DVEC8 DVERFL DISK BASIC 1 0 SYMBOL TABLE OBEC 0118 995A C291 906A 006 006 006 0060 0954 097 0989 0957 0005 D7BC 004 00 6 0950 095 094 D7AE APPENDIX E DXCVEC DXIVEC ENDCHR ENDFLG ENDGRP EVALEXPB EXECJP EXPJMP FATBL FATBL1 FATBL2 FATBL3 FCBACT FCBADR FCBTMP FCBV1 FDCREG FIELD FILES FILSTA FIRQ FORCOL FP SGN FPIEXP FP1SGN FPAG 1 2 FPCARY FPSBYT FREE FRESPC FRETOP FRQVEC GARBFL GETCCH GETNCH GIVABF GRBLOK GRPRAM HORBEG HORBYT HORDEF HOREND IFCTR IKEYIM INPFLG INT IRQ IRQVEC KEYBUF KILL L813C L8168 L8311 L8316 L836C El CE2E CE56 0002 0000 0087 B70B 0090 0110 0800 084A 0894 O8DE 0958 094A 00 1 0928 48 0080 0078 FFF6 0082 004 0054 005 0061 0050 18748 1880 18955 L8C1B L95AC L962E 19650 L96CB L96EC L975F L9FB5 LABE2 LA171 LA176 LA282 LA35F LA37C LA3ED LA3FB LA406 LA426 LA429 LA42D LA549 LA59A LA5A2 LA5A5 LASAE LA5C7 LA5DA LA5E4 LA603 LA616 LA61C LA61F LA7D1 LA7E9 LA928 LA951 LA974 LAC37 LAC44 LAC46 60 LAC73 LAC7C LACEF LAD19 LAD21 LAD33 LAD9E LADC6 LADD4 LADEB LAE15 LAF9A LAFA4 LAFB1 8748 880L A928 A951 44 46 60 AC73 A
47. DXCVEC STD COMVEC 13 LDD DXIVEC STD COMVEC 18 MOVE THE NEW RAM VECTORS FROM ROM TO RAM LDU RVECO LC 37 10 7E STA V C22 STA LDD X STD U LC126 BNE 1 037 LDX DVEC22 STX RVEC22 1 XXXX INITIALIZE DISK BASIC S USR VECTORS LDX DUSRVC STX USRADR LDU L844 LDB 10 10057 STU X DECB BNE LC057 LDX DNMISV STX NMIVEC 1 LDA 7 STA NMIVEC LDX DIRQSV STX IRQVEC 1 LDA 19 STA WFATVL CLR FATBLO CLR FATBL1 CLR FATBL2 CLR FATBL3 LDX DFLBUF STX RNBFAD LEAX 256 X STX FCBADR LEAX 01 X STX FCBV1 CLR FCBTYP X LEAX FCBLEN X STX FCBV1 2 CLR LEAX FCBLEN X STX 1 4 CLR FCBTYP X LDA 02 STA FCBACT LEAX FCBLEN X TFR X D TSTB BEQ LC B3 INCA LC B3 TFR A B ADDB 24 STB JSR L96EC LDA BEGGRP ADDA 4506 STA ENDGRP BSR LC DD ANDCC AF c2 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DIRECTORY ENTRY NUMBER 0 71 NUMBER OF BYTES IN LAST SECTOR OF FILE UNUSED INPUT FILE ONLY DATA LEFT FLAG DATA LEFT FF NO DATA EMPTY NUMBER OF CHARACTERS LEFT IN BUFFER INPUT FILE NUMBER OF CHARS STORED IN BUFFER OUTPUT FILE OFFSET TO FCB DATA BUFFER 256 BYTES DSKCON POINTER ADDRESS OF DSKCON VARIABLES POINT X TO START OF DISK RAM CLEAR A BYTE END OF DISK S RAM NO KEEP CLEARING POINT X TO ROM IMAGE OF COMMAND INTERPRETATION TABLE POINT U TO RAM ADDRESS OF SAME 10 BYTES PER TABLE MOVE B
48. F DECB BNE 1 08 LCA F LDX VARTAB LCAll STX VARTAB CLR Xt DECB BPL LC 11 LCA18 JSR LA42D JSR LAD21 JSR 8 JSR LACEF ASR DRUNFL BLO LCA2C JSR 1 426 LCA2C ASR DRUNFL LBCS LAD9E JMP LAC73 DVECI3 TST DEVNUM BGT LCA18 RTS CLOSE ALL FILE BUFFERS RAM VECTOR DVEC7 LDB INCB LCA3F PSHS B STB DEVNUM BSR LC 53 PULS B DECB BNE LCA3F LCA4A RTS CLOSE FILE RAM HOOK DVEC8 TST DEVNUM LBLE XVEC8 LEAS 902 5 LCA53 JSR LC714 CLR DEVNUM LCA58 STX LDA FCBTYP X BEQ PSHS A CLR FCBTYP X C15 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK BRANCH IF LOADM RUN FLAG ZERO DON T RUN CLEAR MERGE FLAG RUN FLAG DON T RUN 2 RUN MERGE FLAG 0 NO MERGE FF MERGE GO GET FILENAME ETC FROM BASIC GET CURRENT INPUT CHAR BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA IS NEXT CHAR R RUN AFTER LOAD SYNTAX ERROR IF ANY MORE CHARS ON LINE SET FLAGS TO RUN AND CLOSE ALL FILES BEFORE THE FILE IS RUN GRAB FCB FOR INPUT FILE CHECK ASCII FLAG AND BRANCH IF CRUNCHED BASIC FILE IS THIS A MERGE BRANCH IF MERGE DO A NEW ERASE VARIABLES RESET VARIABLES GO TO BASIC S MAIN LOOP IT WILL LOAD PROGRAM CHECK FILE TYPE MUST BE 0 8 CHECK MERGE FLAG MUST BE NO MERGE 0 BAD FILE MODE ERROR IF MERGE OR NON BASIC DO A NEW RESET POINTERS ERASE VARIABLES SET THE LOAD FLAG TO FF THIS WILL CAUSE A NEW TO
49. FF 09 F4 FF 09 80 FF 80 M FA FF AF 44 2 23 A4 02 06 07 C5 ED D6 12 F4 EC 23 EA D2 09 FF 07 09 20 29 04 07 C5 ED D6 03 1 80 80 80 09 10 04 12 08 C8 80 FB 88 86 4B 48 01 F FF 4F 83 89 48 82 48 86 40 48 00 00 F2 CD 86 40 01 89 4 00 04 4E 4B APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 JMP 10688 10606 22 BLO 10612 LDA ORA 10 STA DSKREG LD612 10 53 STA FDCREG EXG A A EXG A A JSR 10701 BNE 10688 LD620 JSR LD7F0 10691 LDY FDCREG 3 ORCC 50 LDX LD64F STX DNMIVC LDX DFLBUF LDA FDCREG LDA FF STA MMIFLG LDB F4 STB FDCREG LDA DRGRAM ORA 80 STA DSKREG LD649 LDB X STB V BRA 10649 LD64F 10 FDCREG ANDCC AF ANDA 44 STA DCSTA BNE 10688 INC DCTRK LDA DCTRK TRKMAX BNE 10606 VERIFY THAT ALL SECTORS ARE READABLE LDA 4 02 STA DCOPC LDX DBUFO STX LDU DBUF1 CLRA LD66F STA DCTRK CLRB LD672 LDA B U STA DSEC JSR LD6F2 INCB CMPB SECMAX BLO 10672 LDA DCTRK INCA CMPA TRKMAX BLO LD66F JMP LD2CD LD688 DRGRAM CLR DSKREG JMP 10701 ERROR IF DRIVES NOT READY CHECK FOR TRACK 22 PRECOMPENSATION AND BRANCH IF TRACK 22 NO PRECOMP GET THE RAM IMAGE OF DSKREG IN THE PRECOMPENSATION FLAG AND SEND IT TO DSKREG GET S
50. LCFFE 0003 1003 10042 10056 10067 CC84 CC88 CCBD CCBE CCC6 CCD2 CCD6 CCDE CCE2 CCF1 CCF6 CCFB CCFC CD12 CD3A CD3D CD8C CD96 CDDA CDE1 CEOD 10 CE2B CE4E CE80 CE8C CEBF CED7 CED9 CEDF CEE5 CF02 CF07 CF1E CF28 CF31 CF37 CF39 CF75 CF7A CF7D CF92 CF93 CFA3 CFA6 CFB6 CFC7 CFCB CFD4 CFDD CFE7 CFED CFFE 0003 0030 0042 0056 0067 ORIGIN SPECTRAL 550C REVISED 12 26 1999 WALTER ZYDHEK LD07B LD 7E LD A5 LD B LD C LD CF 10102 LD10B LD11B LD11E LD125 LD12E LD135 LD149 LD15C LD162 LD169 LD172 LD18E LD19F LD1B7 LD1B8 LD1C1 LD1E LD1E5 LD1F 10202 1020 10211 10212 10221 10223 10235 10239 LD257 LD26A LD271 LD272 LD27F LD291 LD2AC LD2B3 LD2C LD2E1 LD2EE 10330 10335 LD33E LD369 LD367 LD36F LD371 LD384 LD388 LD38E LD394 LD398 LD3CC 007 D07E D A5 D0BO DOCE DOCF 0102 D10B D11B D11E D125 D12E D135 D149 D15C D162 D169 D172 D18E D19F D1B7 D1B8 1 1 1 1 5 D1F0 D282 0200 0211 0212 0221 223 D235 D239 D257 D26A D271 D272 D27F D291 D2AC D2B3 2 0 D2E1 D2EE 0330 0335 D33E 0360 0367 D36F D371 D384 D388 D38E D394 D398 D3CC DISK BASIC UNRAVELLED II LD3D6 LD3E6 LD3FC LD41A LD42B LD42E LD436 LD439 LD45C LD45F LD465 LD489 L04 1 L04C4 L04C8 LD4D3 LD4D5 LD4D6 LD4E LD519 LD525 LD533 L055C LD562 LD582 LD585 LD59B LD5AD LD5D5 LD5DB LD5FF 10608 LD60E LD6
51. LDB 5 LCC71 BSR LCCE2 CMPA SPACE BEQ LCC71 CMPA BNE LCC85 CMPB BNE LCC85 TFR A B STB CHARAC BRA LCCA7 LCC85 BEQ LCC9A CMPA CR BNE LCC9A LINBUF 1 BEQ LCCD6 LDA 1 X CMPA LF BNE LCCD6 LDA CR LCC9A TSTA BEQ LCCB4 CMPA CHARAC BEQ LCCBE PSHS B CMPA 5 BEQ LCCBE LCCA7 STA X CMPX LINBUF LBUFMX BNE LCCB4 BSR LCCF6 BNE LCCB8 BRA LCCD2 LCCB4 BSR LCCF6 BEQ LCC85 LCCBB CLR X LDX 4LINBUF LCCBD RTS CHECK FOR ITEM SEPARATOR OR TERMINATOR AND EXIT THE INPUT ROUTINE LCCBE CMPA BEQ LCCC6 CMPA SPACE BNE LCC88 LCCC6 BSR LCCF6 BNE LCC88 CMPA SPACE BEQ LCCC6 CMPA BEQ LCCB8 LCCD2 CR BNE LCCDE LCCD6 BSR LCCF6 BNE LCC88 CMPA LF BEQ LCCB8 LCCDE BSR LCCFC BRA 1 8 LCCE2 BSR LCCF6 BEQ LCCFB JSR 16714 LDB RANFIL LBNE LC334 LCCFl LDB 2 37 JMP LAC46 LCCF6 JSR LA176 TST CINBFL LCCFB RTS MOVE THE INPUT POINTER BACK ONE DISK FILE LCCFC 5 5 X B JSR 16714 LDB CMPB RANFIL BNE LCD12 LDD FCBGET X SUBD 890001 STD PULS B X PC LCD12 STA FCBCDT X COM FCBCFL X PULS B X PC CVN COMMAND CVN JSR LB654 C19 GET LENGTH AND ADDRESS OF STRING DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 1825 CD1D C1 05 CMPB 05 FIVE BYTES IN A FLOATING POINT NUMBER 1826 CD1F 10 25 E7 27 LBCS 1 44
52. PULS B X PC WRITE A BYTE TO SEQUENTIAL OUTPUT FILE LCBBC INC FCBLFT X LDB FCBLFT X BEQ LCB9A ABX STA FCBCON 1 X LCB98 PULS A B X PC WRITE OUT A FULL BUFFER AND RESET BUFFER LCB9A PSHS U Y STA SECLEN FCBCON 1 X JSR LC658 LDB FCBDRV X STB DCDRV INC FCBSEC X JSR LCB0D LEAY X LDB FCBCGR X C17 SAVE REGISTERS POINT X TO TABLE OF FILE NUMBER VECTORS GET CURRENT FILE NUMBER 2 BYTES PER FCB ADDRESS POINT X TO PROPER FCB GET FILE TYPE IS IT AN INPUT FILE RETURN IF SO CARRIAGE RETURN ENTER NO CLEAR PRINT POSITION IF CARRIAGE RETURN BRANCH IF CONTROL CHAR INCREMENT PRINT POSITION IS IT RANDOM FILE BRANCH IF NOT RANDOM GET PUT BYTE COUNTER ADD ONE COMPARE TO RECORD LENGTH FR ERROR IF PUT BYTE COUNTER gt RECORD LENGTH SAVE NEW PUT BYTE COUNTER POINT TO RANDOM FILE BUFFER POINTER POINT TO ONE PAST END OF CURRENT RECORD DATA PULL DATA FROM STACK STORE IN DATA BUFFER RESTORE REGISTERS AND RETURN INCREMENT CHARACTER COUNT GET CHARACTER COUNT AND BRANCH IF THE BUFFER IS FULL ADD CHARACTER COUNT TO FCB ADDRESS STORE NEW CHARACTER SKIP PAST 25 CONTROL BYTES AT FCB START SAVE REGISTERS STORE LAST CHARACTER IN BUFFER INCREMENT RECORD NUMBER GET DRIVE NUMBER AND SAVE IT IN DSKCON CONTROL TABLE INCREMENT SECTOR NUMBER WRITE THE FILE BUFFER TO DISK SAVE FCB POINTER IN Y GET GRANULE NUMBER DISK BASIC UNRAVELLED II 1633 1634 1635 1636 1637 1638 1639 1640
53. RSE 80 T SAV 80 E WRIT 80 E VERIF 80 Y UNLOA 80 D DSKIN 80 I BACKU 80 P COP 80 Y DSKI 80 DSKO 80 DO 80 S COMMAND JUMP TABLE DIR DRIVE B3 SAVE NEW START OF BASIC ADDRESS INITIALIZE EXBAS VARIABLES amp DO A NEW GET THE START OF CURRENT GRAPHICS PAGE ADD 1 5K 6 X 256 ONE GRAPHICS PAGE SAVE NEW END OF GRAPHICS PAGE INITIALIZE SWI2 3 JUMP ADDRESSES GO INITIALIZE THE FLOPPY DISK CONTROLLER TURN ON IRQ AND FIRQ POINT X TO DISK BASIC COPYRIGHT MESSAGE PRINT COPYRIGHT MESSAGE TO SCREEN GET DISK BASIC WARM START ADDRESS SAVE IT IN RESET VECTOR JUMP BACK TO BASIC WARM START INDICATOR INITIALIZE THE FLOPPY DISK CONTROLLER CLOSE FILES AND DO MORE INITIALIZATION JUMP TO EXBAS WARM START RESET NMI FLAG RESET DRIVE NOT READY TIMER RESET RAM IMAGE OF DSKREG MOTORS OFF RESET DISK CONTROL REGISTER FORCE INTERRUPT COMMAND OF 1793 SEND IT TO 1793 DELAY DELAY SOME MORE GET 1793 STATUS CLEAR REGISTER 20 DISK BASIC 1 1 COMMANDS DISK BASIC S COMMAND DICTIONARY COMMAND JUMP TABLE 6 DISK BASIC SECONDARY FUNCTIONS SECONDARY FUNCTION TABLE SECONDARY FUNCTION JUMP TABLE TOKEN CE CF 00 1 02 03 04 05 06 07 08 09 DA DB DC DD DE DF EQ El COMMAND TOKEN DIR CE DRIVE CF ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 0289 C1F5 D 0290 D1 0291 C1F9 C6 0292 C1FB CA 0293
54. 0137 0139 0130 0136 0141 0143 0146 0148 0149 D14A D14D D14F D151 D153 D155 D157 D15A D15C D15F D161 D162 D165 D167 D169 D16C D16E D172 D174 D175 D179 D17C 17 0182 27 4C 27 A7 DC 90 25 1F 4C 27 18 24 4A 93 D3 16 A6 90 1 9B 97 DB D7 35 97 F7 FF DE 9F 11 22 A6 A7 11 26 18 6F 20 7E DE 18 6F A6 A7 18 26 CE BE 5F AF 6F 30 5C 1 23 7E 8D 5F 5C BD 27 A6 91 26 34 BD 35 F1 23 39 F6 9D 27 BD C1 18 D7 39 18 BD BD F7 9D 03 4C E4 1B BC E4 42 01 30 93 38 1 19 02 E4 BC 89 BA BA B7 B7 46 BC 09 09 1 1 93 13 C2 82 93 F7 9F 3F 13 AC 19 9F 3F 9C F7 09 09 C1 00 89 09 F2 96 1A C7 00 01 07 04 04 09 E8 09 5 09 B7 03 22 27 95 01 06 5 21 5B 4A 1B 19 44 1B 28 4 01 5B CB 19 5B 5A B D4 D4 AC 69 FF 19 AD A6 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK YES NO ADD 256 00 OF MEMORY ERROR IF PAST FFFF SAVE MS BYTE OF NEW GRAPHIC RAM START GET START OF VARIABLES SUBTRACT THE OLD GRAPHIC RAM START ACCD CONTAINS LENGTH OF PROGRAM PLUS RESERVED GRAPHIC RAM ADD IN THE AMOUNT OF RAM CALCULATED ABOVE OUT OF MEMORY ERROR IF gt FFFF SAVE NEW VARTAB IN X ADD 256 TO GU
55. 02 0 SAVE NEW START OF STRING ADDRESS 1511 CAD8 39 LCAD8 RTS 1512 CAD9 6F C4 LCAD9 CLR CLEAR THE LENGTH OF THE STRING 1513 CADB 6F 42 CLR 02 0 CLEAR THE ADDRESS 1514 CADD 6F 43 CLR 03 0 OF THE STRING 1515 CADF 39 RTS 1516 REMOVE RESERVED SPACE IN RANDOM FILE BUFFER FOR A CLOSED RANDOM FILE 1517 CAEQ 35 56 LCAEQ PULS A B X U U END OF RANDOM FILE BUFFER X START OF RANDOM 1518 FILE BUFFER ACCD RECORD LENGTH 1519 1520 THIS WOULD PROBABLY BE THE MOST CONVENIENT PLACE TO FIX THE BUG WHICH 1521 CAUSES THE SYSTEM TO HANG IF AN ERROR IS ENCOUNTERED DURING COPY 1522 1523 CMPU FCBADR IS THE END OF THIS FCB S BUFFER ABOVE THE END 1524 OF THE START OF THE AREA 1525 BLO LCAE2 NO FREE UP THE SPACE USED BY THIS FILE IN RANDOM BUFFER 1526 LDX DFLBUF YES DOING A COPY RESET START OF RANDOM BUFFER 1527 LCAEE 1528 RANDOM FILE BUFFER AREA 1529 1530 REMOVE RESERVED SPACE FOR CLOSED FILE FROM RANDOM FILE BUFFER SPACE 1531 CAE2 11 B3 09 48 LCAE2 CMPU RNBFAD AT THE BOTTOM OF FREE RANDOM BUFFER AREA 1532 6 27 06 BEQ BRANCH IF THERE 1533 A6 0 LDA GRAB A SOURCE BYTE AND 1534 A7 80 STA X MOVE IT TO DESTINATION 1535 CAEC 20 F4 LCAE2 M0VIM6 5 1536 09 48 LCAEE STX RNBFAD SAVE NEW START OF FREE RANDOM BUFFER AREA C16 DISK BASIC UNRAVELLED II 1537 1538 1539 1540 1541 1542 15
56. 03 X 3550200 X 34 502 504 01 DCNVEC 06 X LDF 9 A B 2X20 LAC46 A B DOSBUF 0S DOSBUF 2 DOSBUF DOSBUF 1 BAWMST 3B3B SW3VEC SW3VEC 2 SW2VEC 1 APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK DO A SOFTWARE INTERRUPT 3 RESET SECTOR COUNTER RAM LOAD ADDRESS FOR SECTOR DATA SAVE RAM LOAD ADDRESS POINT X TO DSKCON VARIABLES INCREMENT SECTOR COUNTER GET THE SECTOR COUNTER LOADED IN 18 SECTORS ONE TRACK YES EXIT NO SAVE SECTOR NUMBER IN DSEC GET FDC OP CODE READ AND DRIVE NUMBER 0 SAVE THEM IN DSKCON VARIABLES BUG SHOULD BE STD X GET TRACK NUMBER 34 SAVE IT IN DSKCON VARIABLES TOO GET RAM LOAD ADDRESS AND SAVE IT IN THE DSKCON VARIABLES ADD 256 ONE SECTOR TO RAM LOAD ADDRESS SHOULD BE INCA SAVE NEW RAM LOAD ADDRESS GO READ A SECTOR CHECK FOR ERRORS KEEP READING IF NONE PULL LOAD ADDRESS OFF OF THE STACK 10 ERROR JUMP TO ERROR SERVICING ROUTINE PULL RAM LOAD ADDRESS OFF OF THE STACK GET FIRST TWO BYTES OF RAM DATA LOOK FOR 05 059 AT START OF BUFFER IF 05 THEN BRANCH TO DATA LOADED IN RAM OTHERWISE CLEAR THE FIRST TWO BYTES OF RAM DATA JUMP TO BASIC S WARM START TWO RTI INSTRUCTIONS LOAD THE SWI2 AND SWI3 JUMP VECTORS WITH RTIS END OF THE DOS AND DOSINI COMMANDS THE REST OF THE CODE TO THE END OF THE DISK ROM DFFF IS GARBAGE DOSBAS 1 1 167
57. 0703 FF6A RMB COMMAND REGISTER 0704 FF6B RMB CONTROL REGISTER 0705 FF6C RMB 4 0706 FF70 RMB 3 0707 FF7D RMB SOUND SPEECH CARTRIDGE RESET 0708 FF7E RMB SOUND SPEECH CARTRIDGE READ WRITE 0709 FF7F RMB MULTI PAK PROGRAMMING REGISTER 0710 0711 FF80 RMB 64 RESERVED FOR FUTURE EXPANSION 0712 0713 VIDEO CONTROL REGISTERS 0714 90 RMB 1 INITIALIZATION REGISTER 0 0715 0716 90 BITE MCB ROM MAP CONTROL SEE TABLE BELOW 0717 MC1 ROM MAP CONTROL SEE TABLE BELOW 0718 BIT2 MC2 STANDARD SCS 0719 BIT3 MC3 1 DRAM AT IS CONSTANT 0720 4 1 CHIP FIRQ OUTPUT ENABLED 0721 5 1 CHIP IRQ OUTPUT ENABLED 0722 6 M P 1 MMU ENABLED 0723 BIT7 C0C0 1 C0C0 1 8 2 COMPATIBLE 0724 0725 MC1 MC ROM MAPPING 0726 X 16K INTERNAL 16K EXTERNAL 0727 1 0 32K INTERNAL 0728 1 1 32L EXTERNAL EXCEPT FOR VECTORS 0729 0730 FF91 RMB 1 INITIALIZATION REGISTER 1 0731 0732 FF91 BIT TR MMU TASK REGISTER SELECT 0733 0734 2 0735 BIT3 0736 4 0737 5 TINS TIMER INPUT SELECT 1 70 5 8 63ns 0738 BIT6 0739 BIT7 10 DISK BASIC UNRAVELLED II APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK 0740 0741 0742 FF92 IRQENR 1 IRQ INTERRUPT ENABLE REGISTER 0743 0744 FF92 BIT EIg CARTRIDGE IRQ ENABLED 0745 EIl KEYBOARD IRQ ENABLED 0746 BIT2 EI2 SERIAL DATA IRQ ENABLED 0747 BIT3 VBORD VERTICAL BORDER IRQ EN
58. 0704 0707 D7DA E5 26 31 26 7F 1C 7E E6 F7 B7 20 C6 E5 26 31 26 20 F6 E7 B7 20 1C B6 84 97 39 D6 D6 D7 D7 01 02 04 40 6 27 7 3B B6 2A B6 B6 27 4A B7 26 B6 84 B7 B7 7E C4 0 8 09 06 80 FF FF F6 02 C4 06 3F F8 E2 FF 80 FF F6 AF FF 7C F C5 DD 05 08 09 08 09 6A 09 FF FA FF 09 11 09 B 09 09 FF 89 82 EC 48 4B 4B 4B 48 82 83 82 03 02 85 85 86 86 40 55 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 IS 1793 READY FOR A BYTE DRQ SET IN STATUS BYTE BRANCH IF SO DECREMENT WAIT TIMER KEEP WAITING FOR THE 1793 DRQ RESET NMI FLAG ENABLE FIRQ IRQ FORCE INTERRUPT SET DRIVE NOT READY ERROR GET A BYTE FROM RAM SEND IT TO 1793 DATA REGISTER REPROGRAM FDC CONTROL REGISTER SEND MORE DATA WAIT FOR THE 17933 TO ACKNOWLEDGE READY TO READ DATA 10768 U BNE 10778 LEAY 1 Y BNE 10768 LD778 CLR NMIFLG ANDCC JMP LD6EC WRITE A SECTOR LD778 LDB X STB FDCREG 3 STA DSKREG BRA 10778 LD782 108 2 10784 BNE LD78E LEAY 1 Y BNE 10784 BRA 10770 READ A SECTOR LD78E LDB FDCREG 3 STB Xt STA DSKREG BRA 1078 BRANCH 10798 ANDCC AF LDA FDCREG ANDA 7C STA 5 RTS DSKCON LD7A2 FDB LD6C5 FDB 10600 FDB 10705 FDB D708 DSKREG LD7AA FCB 1 FDB 2 FDB 4 FCB 540
59. 0993 C738 1 11 17 TRACK 17 DIRECTORY TRACK 0994 C73A 25 92 BLO LC73E BRANCH IF lt DIRECTORY TRACK 0995 C73C 0 EC INC DCTRK INCR TRACK NUMBER IF gt DIRECTORY TRACK 0996 C73E 58 LC73E ASLB MULTIPLY TRACK NUMBER BY 2 0997 C73F 50 NEGB NEGATE GRANULE NUMBER 0998 C740 EB 03 ADDB FCBCGR X 0 IF EVEN GRANULE 1 IF ODD 0999 C742 8D 05 BSR LC749 RETURN 8 0 FOR EVEN GRANULE NUMBER 8 9 FOR ODD GRANULE NUMBER 1000 C744 04 ADDB FCBSEC X ADD SECTOR NUMBER 1001 C746 D7 ED STB DSEC SAVE SECTOR NUMBER 1002 C748 39 RTS 1003 MULTIPLY ACCD BY 9 1004 C749 34 06 LC749 PSHS B A TEMP STORE ACCD ON STACK 1005 C74B 58 ASLB 1006 C74C 49 ROLA MULTIPLY BY 2 1007 C74D 58 ASLB 1008 C74E 49 ROLA MULTIPLY BY FOUR 1009 C74F 58 ASLB 1010 C750 49 ROLA MULTIPLY BY EIGHT 1011 C751 El ADDD 5 ADD ONE MULTIPLY BY NINE 1012 C753 39 RTS 1013 1014 CONVERT ACCD INTO A GRANULE NUMBER RETURN RESULT IN ACCB 1015 ENTER WITH ACCD CONTAINING A NUMBER OF SECTORS RETURN IN ACCB 1016 THE NUMBER 8 67 CORRESPONDING TO THE NUMBER OF COMPLETE 1017 GRANULES CONTAINED IN THAT MANY SECTORS 1018 DIVIDE BY 90 MULTIPLY BY 10 IS FASTER THAN DIVIDE BY 9 1019 C754 6F E2 LC754 CLR 5 CLEAR A TEMPORARY SLOT ON THE STACK 1020 C756 6C E4 LC756 INC 5 DIVIDE ACCD BY 90 SAVE THE 1021 C758 83 00 5A SUBD 9 18 QUOTIENT 1 ON THE STACK REMAINDER 1022 C75B 2A F9 BPL LC756 IN ACCB 1023 C75D A6 E4 LDA 5 PUT THE QUOTIENT 1 IN ACCA AND 10
60. 10000 APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK CONVERT TO FLOATING POINT NUMBER IN GET NEXT INPUT CHARACTER GET FILENAME ETC EVALUATE EXPRESSION PUT II 2 BYTES ON STACK DITTO COMPARE END ADDRESS TO START ADDRESS IF START END THEN ILLEGAL FUNCTION CALL EVAL EXPRESSION TRANSFER ADDRESS PUT ON STACK SYNTAX ERROR IF ANY MORE CHARS ON THIS LINE FILE TYPE 2 ASCII FLAG CRUNCHED 9 GET NEXT UNOPEN FILE AND INITIALIZE FCB ZERO FLAG FIRST BYTE OF PREAMBLE WRITE A BYTE TO BUFFER GET END ADDRESS SUBTRACT THE START ADDRESS THE SAVED DATA BLOCK WILL INCLUDE BOTH THE FIRST AND LAST BYTES SAVE LENGTH IN Y WRITE FILE LENGTH TO BUFFER FIRST ARGUMENT OF PREAMBLE GET THE START ADDRESS WRITE OUT THE START ADDRESS SECOND PREAMBLE ARGUMENT GET START ADDRESS GRAB A BYTE WRITE IT OUT DECREMENT BYTE COUNTER BRANCH IF ALL BYTES NOT DONE FIRST BYTE OF POSTAMBLE WRITE IT OUT EOF RECORD FIRST ARGUMENT OF POSTAMBLE IS A DUMMY ZERO VALUE WRITE OUT POSTAMBLE FIRST ARGUMENT GET CONTROL ADDRESSES FROM THE STACK WRITE OUT THE TRANSFER ADDRESS 2ND ARGUMENT GO CLOSE ALL FILES WRITE ACCA TO BUFFER THEN SWAP ACCA ACCB WRITE ACCA TO BUFFER SWAP ACCA ACCB POINT TO BIN EXTENSION GET FILENAME ETC GET NEXT INPUT CHARACTER GET FILENAME ETC OPEN NEXT AVAILABLE FILE FOR INPUT GET FILE TYPE AND ASCII FLAG FOR LOADM
61. 10742 PSHS U X B A LDA 4 02 STA DCOPC LDU DCBPT LDX DBUF1 STX BSR DSKCON STU DCBPT LDA 03 STA DCOPC LDA BNE 10743 CLRB LD737 LDA X CMPA U BNE 10743 DECB BNE 10737 PULS A B X U 10742 RIS 10743 PULS A B X U DEC ATTCTR BNE LD6FB LDB 42 36 BRA LD7OB VERIFY COMMAND VERIFY CLRB CMPA AA BEQ 1075 COMB CMPA 88 LBNE LB277 LD75A STB DVERFL JMP GETNCH DSKCON ROUTINE DSKCON PSHS U Y X B A LDA 4 05 PSHS A 10765 RDYTMR LDB DCDRV B33 GET DRIVE NUMBER ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED 3169 3178 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 D76A D76D 0770 0772 0774 0776 0778 D77A D77C D77E 0780 0782 0785 0788 D78A D78C D78F D792 D794 D796 D798 D79B D79D D79E 07 0 07 2 D7A4 D7A6 D7A7 D7A9 D7AB D7AD D7AF D7B1 D7B3 D7B6 D7B8 D7BB D7BD D7BF 07 1 07 4 07 6 D7C8
62. 20 FA 22 BA 2c 06 89 01 22 22 11 gD gD 02 DD 44 16 36 gD 17 01 1D 04 EQ 17 80 03 D6 06 46 06 1 40 CD 84 92 DC 22 04 20 F2 2E EE 20 F8 2C E6 00 08 1 DE BA DA 1C D6 12 15 C7 14 4B 26 F6 4 AC 46 1 76 70 14 C7 14 00 40 OB 88 15 00 01 88 15 94 88 11 88 10 94 B6 54 43 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 LDX LINBUF 1 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK POINT X TO THE LINE INPUT BUFFER C0MM IS READ ITEM SEPARATOR TEMPORARY STRING SEARCH FLAG GET VARIABLE TYPE AND BRANCH IF IT IS A STRING SPACE NUMERIC SEARCH DELIMITER GET AN INPUT CHARACTER SPACE YES GET ANOTHER CHARACTER QUOTE NO SEARCH CHARACTER COMMA NO NUMERIC SEARCH SAVE DOUBLE QUOTE AS THE SEARCH FLAG SAVE DOUBLE QUOTES AS FIRST ITEM IN BUFFER BRANCH IF INPUTTING A STRING VARIABLE IS THE INPUT CHARACTER A CARRIAGE RETURN NO IF AT THE START OF INPUTBUFFER CHECK FOR A FOLLOWING LINE FEED AND EXIT ROUTINE IF THE INPUT CHARACTER PRECEEDING THE CR WAS A LINE FEED INSERT THE CR IN THE INPUT STRING OTHERWISE FOR A FOLLOWING LINE FEED AND EXIT THE ROUTINE RESTORE CARRIAGE RETURN AS THE INPUT CHARACTER CHECK FOR A NULL ZERO INPUT CHARACTER AND IGNORE IT IF 1T IS A NULL TO SEE IF THE INPUT CHARACTER MATCHES EITHER ACCB OR CHARAC AND IF IT DOES THEN BRANCH TO CHE
63. 26 F9 BNE LD2B3 KEEP LOOPING UNTIL DONE 2541 D2BA 96 EB LDA DCDRV GET DRIVE NUMBER AND PUSH 2542 D2BC 34 02 PSHS A IT ONTO THE STACK 2543 D2BE 6E 4 JMP V PSEUDO RETURN TO CALLING ROUTINE 2544 2545 PULL FILENAME EXT AND DRIVE NUMBER FROM X TO RAM 2546 02 0 A6 80 102 0 LDA X GET DRIVE NUMBER AND SAVE 2547 D2C2 97 EB STA DCDRV IT IN DSKCON VARIABLE 2548 D2C4 C6 B LDB 11 11 BYTES IN FILENAME AND EXTENSION 2549 D2C6 CE 09 4C LDU DNAMBF POINT U TO DISK NAME BUFFER 2550 D2C9 7E A5 9A JMP LA59A MOVE FILENANE EXT FROM X TO DNAMBF 2551 2552 COPY 2553 THE COPY PROCESS IS PERFORMED BY COPYING DATA FROM THE SOURCE FILE 2554 TO RAM AND THEN COPYING IT TO THE DESTINATION FILE THE SOURCE AND 2555 DESTINATION FILES ARE OPENED AS RANDOM FILES AND BOTH USE THE SYSTEM 2556 FCB ABOVE THE RESERVED FCBS ALL OF AVAILABLE FREE RAM ABOVE THE 2557 VARIABLES IS USED AS A COPY BUFFER WHICH SPEEDS UP THE COPYING PROCESS 2558 BUT UNFORTUNATELY THE METHOD USED WILL ALLOW AN ERROR ENCOUNTERED DURING 2559 THE COPY PROCESS TO HANG THE SYSTEM THIS IS CAUSED BY POINTING THE FCB S 2560 RANDOM FILE BUFFER POINTER FCBBUF X TO THE FREE RAM BUFFER AN ERROR 2561 WILL THEN CAUSE THE OPEN FILE TO BE CLOSED WITH FCBBUF X POINTING TO AN 2562 AREA IN RAM WHERE THE RANDOM FILE BUFFER CLOSE ROUTINE LCAE2 WILL NEVER 2563 LOOK FOR IT 2564 D2CC BD C8 87 COPY JSR LC887 GET SOURCE FILENAME EXT amp DRIVE NUMBER
64. 27 A7 AF AE 30 5F EE 18 35 32 BD BD 34 BD 5D 18 35 34 OF BD 8E BD cc FD 8E 9D 27 BD BD 9E BF 18 BD 35 34 BD 10 9F BD BD 35 86 34 C1 26 BD BD BE EC FD 8D BD BD 6 9 35 7 39 68 C1 26 7D 27 BD B6 61 94 08 62 61 62 61 08 02 13 5 62 1 08 04 4 62 40 01 E4 26 96 62 B1 B6 04 5 2 02 06 6F B2 C2 C9 01 09 01 5 08 2 B3 52 09 27 5 06 02 C7 26 F1 C7 C6 04 10 02 49 1F C6 C8 09 OB 09 75 C6 C7 0g F1 02 00 4 4F 1B 09 OF C6 09 9 56 4 2 LI 6D AC 38 FF 57 00 60 E6 7C EF C7 49 El 9D 8C E5 07 74 57 27 55 73 73 BD A6 C2 86 STD PULS NEGB BRA BRANCH HERE WHAT S LEFT LC421 LDB CLR CLR LEAS LC429 LDA BEQ EXG LC42F JSR STU DISASSEMBLY OF DISK BASIC 1 1 01 5 LC429 APPENDIX B SAVE NEW TEMPORARY RECORD LENGTH COUNTER RESTORE BYTE COUNTER NEGATE IT ACCB THE NUMBER OF BYTES AVAILABLE TO A RECORD IN THIS SECTOR MOVE THE DATA IF REMAINING RECORD LENGTH WILL FIT IN OF THE CURRENTLY SELECTED SECTOR 502 5 501 5 502 5 501 5 V08 LCA2F X U LA59A 502 5 GET REMAINING RECORD LENGTH CLEAR THE TEMPORARY RECORD LENGTH COUNTER ON THE STACK PURGE BYTE OFFSET FROM STACK CHECK GET PUT FLAG AND BRANCH IF GET SWAP SOURCE AND DESTINATION POINTERS TRANSF
65. 2880 0473 0474 0476 0478 047 047 047 0480 0483 0485 0486 0489 0488 048C 0486 0490 0493 0495 0497 D49A D49D D49F 04 1 04 4 04 6 04 8 D4AB D4AF D4B2 D4B4 D4B6 D4B8 D4BB D4BD 04C1 04C4 04C6 04C9 DACB 04 0 DACE 0400 0401 0403 0405 0406 0408 D4DA D4DC D4DE 0460 0461 0463 0465 0467 0469 04 0466 0462 04 5 D4F8 D4FC D4FF 0501 0503 0506 0509 0508 0506 0511 0515 0517 0519 0518 0510 0520 0522 0525 0527 D52A D52C D52E D531 D533 D536 D538 D53C D53E D541 D544 39 8D 8D 8D 9E 34 8D BD 34 5F 86 6F 5A 26 35 CE 8D 35 BD CE 8D C6 8E OF D7 10 BD C6 9D 27 BD 10 BD 34 8E C6 6F 5A 26 4F 20 EB 5C Cg 24 CB 6D 26 4C A7 81 25 32 8E 9 10 BD 73 18 BD 86 97 BD 7F 86 B7 BD 18 OF 20 81 25 B6 8A B7 86 B7 1E 1E BD 26 BD 8D 18 1A 8E BF 8E C3 E7 BC 52 18 DF B6 14 06 80 14 06 96 10 6 06 8C 03 06 05 27 01 04 5 0 7 11 24 5 04 07 12 82 FB 00 E4 12 FC 12 85 F5 85 12 EC 61 22 27 22 CA 09 95 00 EA D5 09 co FF 06 26 1 16 08 09 10 FF 53 FF 88 88 D6 68 D6 6 50 05 09 09 54 00 80 59 00 00 FF 01 70 69 38 DF 89 C7 12 OF D7 52 3B 5C 08 00 AC FF 85 48 DE 00 86 86 40 48 DE FD FF 4B 62
66. 3 975C C29A C2B2 EXBAS GET PUT 0438 01 RVEC23 RMB 3 B821 8304 CRUNCH BASIC LINE 0439 01 6 RVEC24 RMB 3 B7C2 UNCRUNCH BASIC LINE 0440 0441 0149 STRSTK RMB 8 5 STRING DESCRIPTOR STACK 0442 0101 CFNBUF RMB 9 CASSETTE FILE NAME BUFFER 0443 1DA CASBUF RMB 256 CASSETTE FILE DATA BUFFER A6 DISK BASIC UNRAVELLED II APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK 0444 2DA LINHDR RMB 2 LINE INPUT BUFFER HEADER 0445 020 LINBUF RMB LBUFMX 1 BASIC LINE INPUT BUFFER 0446 0307 STRBUF RMB 41 STRING BUFFER 0447 0448 0400 VIDRAM RMB 200 VIDEO DISPLAY AREA 0449 0450 START ADDITIONAL RAM VARIABLE STORAGE DISK BASIC ONLY 0451 0600 DBUF RMB SECLEN 1 0 BUFFER 8 0452 0700 DBUF1 RMB SECLEN 1 0 BUFFER 1 0453 0800 FATBLO RMB FATLEN FILE ALLOCATION TABLE DRIVE 0 0454 084A FATBL1 RMB FATLEN FILE ALLOCATION TABLE DRIVE 1 0455 0894 FATBL2 RMB FATLEN FILE ALLOCATION TABLE DRIVE 2 0456 08 FATBL3 RMB FATLEN FILE ALLOCATION TABLE DRIVE 3 0457 0928 FCBV1 RMB 16 2 FILE BUFFER VECTORS 15 USER 1 SYSTEM 0458 0948 RNBFAD RMB 2 START OF FREE RANDOM FILE BUFFER AREA 0459 094A FCBADR RMB 2 START OF FILE CONTROL BLOCKS 0460 094 DNAMBF RMB 8 DISK FILE NAME BUFFER 0461 0954 DEXTBF RMB 3 DISK FILE EXTENSION NAME BUFFER 0462 0957 DFLTYP RMB DV DISK FILE TYPE BASIC 1 DATA 2 MACHINE 0463 LANGUAGE 3 TEXT EDITOR SOURCE FILE 0464 0958 DASCFL RMB DV ASCII FLAG CRUNCHED OR BI
67. 4 53 45 4F 45 46 52 41 20 41 49 CE 45 C3 C6 1 04 01 01 62 2C CE 33 D2 E9 C6 E9 74 5C AF 5A 60 53 20 54 C5 A4 2D 41 46 76 FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 FIELD FILES KILL LOAD LSET MERGE RENAME RSET SAVE WRITE VERIFY UNLOAD DSKINI BACKUP COPY DSKI DSKO DOS SECONDARY FUNCTION DICTIONARY TABLE LC219 FCC FCC FCC FCC FCC FCC DISK BASIC CV 80 N 80 E L0 80 C LO 80 F 80 80 S SECONDARY FUNCTION JUMP TABLE LC22C CVN FREE FDB LOC FDB LOF FDB MKN FDB AS DISK BASIC COMMAND INTERPRETATION HANDLER LC238 CMPA DHITOK BHI LC244 LDX LC1F1 SUBA CE JMP L 004 LC244 CMPA DHITOK LBLS LB277 JMP COMVEC 33 FIELD D FILES D1 KILL D2 LOAD D3 LSET D4 MERGE 05 RENAME 06 RSET D7 SAVE D8 WRITE D9 VERIFY DA UNLOAD DB DSKINI DC BACKUP DD COPY DE DSKI DF DSKO EQ DOS El TOKEN A2 A3 A4 A5 A6 A7 FUNCTION TOKEN CVN A2 FREE A3 LOC A4 LOF A5 MKN A6 AS A7 COMPARE TO HIGHEST DISK BASIC TOKEN AND BRANCH IF HIGHER POINT X TO DISK BASIC COMMAND JUMP TABLE SUBTRACT OUT LOWEST DISK BASIC COMMAND TOKEN JUMP TO BASIC S COMMAND HANDLER COMPARE TO HIGHEST DISK BASIC T
68. 4 CURRENT SECTOR BEING USED 1 9 0064 5 UNUSED 0065 00 06 FCBPOS EQU 6 CURRENT PRINT POSITION ALWAYS ZERO IN RANDOM FILES 0066 00 07 FCBREC EQU 7 CURRENT RECORD NUMBER 0067 00 09 FCBRLN EQU 9 RANDOM FILE RECORD LENGTH 0068 00 OB FCBBUF EQU 11 POINTER TO START OF THIS FILE S RANDOM ACCESS BUFFER 0069 00 00 FCBSOF EQU 13 SECTOR OFFSET TO CURRENT POSITION IN RECORD 0070 00 OF FCBFLG EQU 15 GET PUT FLAG Q PUT 1 PUT 0071 16 17 NOT USED 0072 00 12 FCBDIR EQU 18 DIRECTORY ENTRY NUMBER 0 71 0073 00 13 FCBLST EQU 19 NUMBER OF BYTES IN LAST SECTOR OF FILE 0074 00 15 FCBGET EQU 21 GET RECORD COUNTER HOW MANY CHARACTERS HAVE BEEN 0075 PULLED OUT OF THE CURRENT RECORD 0076 00 17 FCBPUT EQU 23 PUT RECORD COUNTER POINTER TO WHERE IN THE RECORD THE NEXT 0077 BYTE WILL BE PUT 0078 00 19 FCBCON EQU 25 OFFSET TO START OF FCB DATA BUFFER 256 BYTES 0079 0080 SEQUENTIAL FILE 0081 BYTE DESCRIPTION 0082 00 00 FCBTYP EQU 0 FILE TYPE 10 INPUT 2 OUTPUT CLOSED 0083 00 01 FCBDRV EQU 1 DRIVE NUMBER 0084 00 02 FCBFGR EQU 2 FIRST GRANULE IN FILE 0085 00 03 FCBCGR EQU 3 CURRENT GRANULE BEING USED 0086 00 04 FCBSEC EQU 4 CURRENT SECTOR BEING USED 1 9 0087 FCBCPT EQU 5 INPUT FILE CHARACTER POINTER POINTS TO NEXT CHARACTER IN 0088 FILE TO BE PROCESSED 0089 OUTPUT FILE FULL SECTOR FLAG IF IT IS 1 WHEN THE FILE IS 0090 CLOSED IT MEANS 256 BYTES OF THE LAST SECTOR HAVE BEEN USED 0091 00 06 FCBPOS EQU 6 CURRENT PRINT POSITION 0
69. 42 09 26 27 03 6F 23 OF A5 A4 A5 27 B2 Bl 06 1 BD B5 B9 A5 27 2C A3 6E 02 00 14 08 07 9 02 E2 A3 6E B7 22 A2 C7 16 A5 02 96 B7 14 63 97 65 A3 05 44 63 63 B CB 61 FF B2 7 B2 B3 B1 B8 4C 74 9A FF 6F 87 5F 73 DC E9 A5 06 9 60 56 09 16 9F E9 5F 9F 5F 82 FE 38 09 46 6F 6F 57 46 BD CA B5 9 DISASSEMBLY OF DISK BASIC 1 0 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK NE ERROR IF NOT FOUND SYNTAX CHECK FOR TO AND GET NEW FILENAME POINT X TO FILENAME POINT U TO DIRECTORY ENTRY OF SOURCE FILE 11 CHARACTERS IN FILENAME AND EXTENSION COPY NEW FILENAME TO SOURCE FILE DIRECTORY RAM IMAGE GET WRITE OP CODE AND SAVE IN DSKCON VARIABLE WRITE NEW DIRECTORY SECTOR TO TOKEN SYNTAX CHECK FOR TO GET FILENAME FROM BASIC SCAN DIRECTORY FOR FILENAME FILE ALREADY EXISTS ERROR CHECK FOR A MATCH AE ERROR IF FILE IN DIRECTORY PRINT CARRIAGE RETURN TO CONSOLE OUT IF END OF LINE GO WRITE AN ITEM LIST SET DEVICE NUMBER TO SCREEN CHECK FOR DEVICE NUMBER FLAG DEFAULT TO CURRENT DEVICE NUMBER IF NONE GIVEN SET DEVICE NUMBER CHECK VALIDITY MAKE SURE SELECTED FILE IS AN OUTPUT FILE GET CURRENT INPUT CHARACTER PRINT CR TO CONSOLE OUT IF END OF LINE SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION GET VARIABLE TYPE BRANCH IF STRING
70. 44 4C 53 31 52 28 38 54 52 4E 4F 52 C5 C4 D3 C5 4D C5 46 41 55 A4 4 93 48 F9 A9 0 45 45 4F 49 49 43 41 20 53 4D 4F C5 D9 C4 C9 00 STB JSR 196 LDA BEGGRP ADDA 06 STA ENDGRP JSR DSINIT BSR LC F ANDCC LDX LC139 1 JSR STRINOUT LDX 4DKWMST STX RSTVEC JMP LABE2 DKWMST NOP BSR LCOFS JSR 10202 JMP XBWMST LC F NMIFLG CLR RDYTMR CLR DRGRAM CLR DSKREG LDA 8500 STA FDCREG EXG A A EXG A A LDA FDCREG RTS DISK BASIC COMMAND INTERP TABLES LC1 FCB 20 FDB LC192 FDB LC238 FCB 06 FDB LC219 FDB 1 24 RAM HOOKS FOR DISK BASIC LC113 FDB FDB FDB FDB FDB FDB FDB DISK BASIC LC139 FCC FCB FDB FCB FCC FCB FCC FDB DISK BASIC LC192 FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC DISK BASIC LCIF1 FDB FDB DVEC DVEC1 DVEC2 DVEC3 DVECA4 DVEC5 DVEC6 DVEC7 DVEC8 XVEC9 DVEC19 DVEC11 DVEC12 DVEC13 DVEC14 DVEC15 DVEC12 DVEC17 DVEC18 COPYRIGHT MESSAGE APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 DISK EXTENDED COLOR BASIC 1 1 CR COPYRIGHT C 198 CYEAR BY TANDY CR UNDER LICENSE FROM MICROSOFT 0 COMMAND DICTIONARY TABLE DI 80 R DRIV 80 E FIEL 80 D FILE 80 S KIL 80 L L0A 80 D LSE 80 T MERG 80 E RENAM 80 E
71. 48 82 48 86 40 48 00 00 FF EQ 86 40 BE 89 46 0g E7 4E LDA LDA STA LDB STB LDA ORA STA LD55C LDB STB BRA LD562 LDA ANDCC ANDA STA BNE INC LDA CMPA BNE VERIFY THAT LDA STA LDX STX LDU CLRA LD582 STA CLRB LD585 LDA STA JSR INCB CMPB BLO LDA INCA CMPA BLO JMP LD59B CLR CLR JMP FDCREG FF NMIFLG F4 FDCREG DRGRAM 80 DSKREG X Y LD55C FDCREG SAF 44 DCSTA LD59B DCTRK DCTRK TRKMAX LD519 ALL SECTORS ARE READABLE 02 DCOPC DBUFO DCBPT DBUF1 DCTRK B U DSEC LD5FF SECMAX LD585 DCTRK TRKMAX LD582 LD1E 0 DRGRAM DSKREG LD60E APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 RESET STATUS OF THE 1793 ENABLE THE NMI FLAG TO VECTOR OUT OF AN I 0 LOOP UPON AN NMI INTERRUPT GET WRITE TRACK COMMAND AND SEND TO 1793 GET THE DSKREG RAM IMAGE AND OR IN THE FLAG WHICH WILL ENABLE THE 1793 TO HALT THE 6809 SEND RESULT TO DSKREG GET A BYTE FROM THE FORMATTED TRACK RAM IMAGE SEND IT TO THE 1793 AND LOOP BACK TO GET ANOTHER BYTE ll GET STATUS ENABLE INTERRUPTS KEEP ONLY WRITE PROTECT amp LOST DATA AND SAVE IT IN THE DSKCON STATUS BYTE BRANCH IF ERROR SKIP TO THE NEXT TRACK GET THE TRACK NUMBER WAS IT THE LAST TRACK NO KEEP GOING GET THE DSKCON READ OP CODE AND SAVE IT IN THE DSKCON VARIABLE POINT THE DSKCON BUFFER POINTER TO DBUF POINT U TO THE LOGICAL SECTOR NUMBERS
72. 52 46 42 50 4 53 45 4F 45 46 52 41 20 41 49 11 63 97 04 23 02 91 65 C7 1 88 88 CE 45 C3 C6 DB 04 01 01 62 14 33 E5 3B C6 E9 74 5C AF 42 60 53 20 54 5F FE 15 16 C5 A4 45 41 46 8E APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 FDB UNLOAD FDB DSKINI FDB BACKUP FDB COPY FDB DSKI FDB DSKO SECONDARY FUNCTION DICTIONARY TABLE LC201 CV 80 M FRE 80 E FCC L0 80 C FCC LO 80 F MMM 80 FCC 80 5 DISK BASIC SECONDARY FUNCTION JUMP TABLE LC214 FDB CVN FDB FREE FDB LOC FDB LOF FDB MKN FDB AS LC220 CMPA DHITOK BHI LC22C LDX LC1DB SUBA CE JMP L 004 LC22C CMPA DHITOK LBLS LB277 JMP COMVEC 33 UNLOAD DB DSKINI DC BACKUP DD COPY DE DSKI DF DSKO EQ TOKEN A2 A3 A4 A5 A6 A7 FUNCTION TOKEN CVN A2 FREE A3 LOC A4 LOF A5 MKN A6 AS A7 COMPARE TO HIGHEST DISK BASIC TOKEN AND BRANCH IF HIGHER POINT X TO DISK BASIC COMMAND JUMP TABLE SUBTRACT OUT LOWEST DISK BASIC COMMAND TOKEN JUMP TO BASIC S COMMAND HANDLER COMPARE TO HIGHEST DISK BASIC TOKEN ERROR IF lt DISK BASIC COMMAND TOKEN PROCESS A USER COMMAND TOKEN DISK BASIC SECONDARY COMMAND INTERPRETATION HANDLER LC236 A7 80 2 BLS 1 23 JMP COMVEC 38 LC23E 5088 A2 80 2 PSHS
73. 56 54 0g 80 59 00 00 F2 00 56 38 DE C7 12 OF 06 E9 5C 08 F2 85 48 D1 82 9B 64 00 STB DSEC DECB CMPB SECMAX 1 BHI LD54A PULS A B STA DCTRK STB DCDRV RTS LD54A JMP L844 LD54D JSR SYNCOMMA LDX L8156 LD553 LDB DCDRV LDU DCTRK PSHS 5 8 JSR X PULS B S STB DCDRV STU DCTRK RTS DSKO COMMAND DSKO 10527 BSR 10540 10524 LDX 2 PSHS X 10540 JSR 18654 PSHS X B CLRB LDX DBUFO 10577 CLR X DECB BNE 10577 PULS B X LDU DBUF0 128 10519 PULS X JSR 18659 LDU DBUFO 10519 LDB 4 03 LDX DBUFO STX STB DCOPC JMP LD6F2 DSKINI COMMAND DSKINI LBEQ LA61F JSR 10256 LDB 4504 JSR GETCCH BEQ LD5B2 JSR LB738 CMPB 17 LBHS LB44A JSR L 5C7 LD5B2 PSHS B LDX DBUF1 SECMAX LDB SECMAX LD5B9 CLR X DECB BNE LD5B9 CLRA BRA LD5CE CALCULATE LOGICAL SECTOR NUMBERS LD5Cl ADDB 5 LD5C3 10564 SUBB SECMAX BHS 105 4 ADDB SECMAX TST BNE LD5C3 LD5CE INCA STA CMPA SECMAX BLO LD5C1 LEAS 901 5 LDX DFLBUF 1888 2 CMPX MEMSIZ LBHI LAC44 JSR DVEC7 COM DRESFL LDS DBUF1 SECLEN JSR L95AC LDA 00 STA DCOPC CLR DCTRK JSR LD6F2 CLR RDYTMR LDA STA FDCREG JSR 10701 BEQ 10620 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK SAVE SECTOR NUMBER IN DSKCON VARIABLE USELESS INSTRUCTI
74. 9E C6 6F 5A 26 9E 96 A7 B6 A7 A7 F6 Cg 58 58 58 34 FC 83 86 3D AB A7 39 C6 B6 18 B7 97 C6 D7 BD BE BF 33 C6 6F 5A 26 8E C6 BD FC ED C6 BD 09 09 09 C5 52 D3 52 06 44 26 4 09 06 09 06 83 05 06 09 04 55 05 FF C8 12 00 08 46 09 OB 09 09 86 9 9 88 1 19 80 FB F1 EB 01 09 02 03 09 03 04 09 06 08 EQ 88 38 09 27 09 02 EA D6 09 09 84 20 80 09 OB 5 09 40 21 C7 77 74 78 67 El 48 7C 09 46 73 07 48 7 74 13 76 73 74 00 12 77 E6 73 F2 78 74 4C 9A 57 BF 24 4A D6 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 STA V977 LDX V974 STX V978 LC4E1 JSR LC567 BSR LC538 BRA LC4BB LCAEB CMPB R BEQ LC4F2 CMPB D LBNE LA616 OPEN A RANDOM DIRECT FILE LCAF2 ASL 5 LDD RNBFAD PSHS B A ADDD DFFLEN BLO LC504 CMPD FCBADR BLS LC589 LC504 LDB 2 29 JMP LAC46 10500 PSHS B A TST V973 BNE LC514 BSR 10567 BRA LC519 LC514 10 JSR LC807 LC519 BSR LC52D COM FCBSOF X INC FCBREC 1 X PULS A B U STD RNBFAD STU FCBBUF X LDU DFFLEN STU FCBRLN X BRA LC4BB INITIALIZE FCB DATA FOR INPUT LC52D BSR LC538 LDU V974 LDU DIRLIST U STU FCBLST X RTS INITIALIZE FILE CONTROL BLOCK LC538 LDX LDB FCBCON LC53C CLR X DECB BNE LC53C LDX LDA DCDRV STA FCBDR
75. ADDB 04 5 GET THE CURRENT RECORD COUNTER ADD 2660 0378 89 00 500 THE NUMBER OF SECTORS RECORDS MOVED 2661 D37D ED 62 STD 02 5 AND SAVE THE NEW RECORD COUNTER 2662 D37F 4F CLRA SET SOURCE DESTINATION FLAG TO SOURCE 2663 0380 8D 06 BSR 10388 PRINT PROMPT MESSAGE IF REQUIRED 2664 D382 20 AC BRA 10330 KEEP COPYING SECTORS 2665 2666 D384 32 E8 24 LD384 LEAS 36 5 REMOVE TEMPORARY STORAGE VARIABLES FROM STACK 2667 D387 39 RTS COPY DONE 2668 2669 D388 6D E8 19 LD388 TST 25 5 CHECK SINGLE DISK COPY FLAG IF ZERO THEN DON T 2670 PRINT THE PROMPT MESSAGE 2671 D38B 7E D2 39 JMP 10239 PRINT THE PROMPT MESSAGE IF REQUIRED 2672 D38E 86 FF LD38E LDA FF 2673 2674 PUT GET DATA FROM THE DESTINATION SOURCE F PUT FLAG 2675 D398 30 6D LEAX 13 5 POINT X TO DESTINATION FILENAME DATA 2676 0392 20 04 10398 GO PUT SOME DATA 2677 D394 4F LD394 CLRA ZERO IS THE GET FLAG 2678 0395 30 1A LEAX 26 5 POINT X TO THE SOURCE FILENAME DATA 2679 D398 97 D8 LD398 STA VD8 SAVE THE GET PUT FLAG 2680 D39A BD 02 CQ JSR 102 0 GET FILENAME AND DRIVE DATA FROM THE STACK 2681 D39D AE 68 8 5 GET ASCII FLAG AND FILE AND SAVE 2682 039L BF 09 57 SIX DFLTYP THEM IN THE DISK RAM VARIABLES 2683 D3A2 8E 01 00 LDX 5 SAVE ONE SECTOR LENGTH IN 2684 D3A5 BF 09 7C STX DFFLEN RAM RECORD LENGTH VARIABLE 2685 D3A8 86 52 LDA R RANDOM FILE TYPE FLAG 2686 D3AA 6 09 5B LDB GET THE HI
76. AND BUFFER POINER DECREMENT SECTOR COUNTER BRANCH IF ALL SECTORS NOT DONE POINT X TO SYSTEM FCB RESET THE RANDOM FILE BUFFER POINTER FOR THE SYSTEM FCB TO THE BOTTOM OF RANDOM FILE BUFFER AREA GRAB THE GET PUT FLAG AND IT WITH THE GRAN TEST FLAG CLOSE THE FILE IF GET ING DATA AND THIS IS NOT THE FIRST TIME THROUGH THE LOOP RESET THE GRAN TEST FLAG IF FIRST TIME THROUGH 100 GET THE NUMBER OF BYTES IN THE LAST SECTOR OR IN THE PRE SAVED FLAG AND SAVE THE NUMBER OF BYTES IN THE LAST SECTOR IN THE FCB CLOSE THE FILE GET THE DRIVE TRACK AND SECTOR NUMBERS EVALUATE STRING VARIABLE 1 AND SAVE THE DESCRIPTOR ADDRESS ON THE STACK EVALUATE STRING VARIABLE 2 AND SAVE THE DESCRiPTOR ADDRESS ON THE STACK DSKCON READ OP CODE REAO A SECTOR INTO DBUF POINT U TO GET STRING PUT STRING POINT U TO GET STRING PUT STRING TOP HALF OF DBUF 2 DESCRIPTOR ADDRESS 2 INTO STRING SPACE BOTTOM HALF OF DBUF 1 DESCRIPTOR ADDRESS DESCRIPTOR amp SOURCE POINTER ON THE STACK RESERVE 128 BYTES IN STRING SPACE POINT U TO RESERVED STRING SPACE GET STRING DESCRIPTOR ADDRESS SAVE DESCRIPTOR DATA LENGTH AND ADDRESS OF THE NEW STRING GET THE SOURCE DBUF POINTER MOVE SECTOR DATA FROM DBUF TO STRING SPACE SYNTAX CHECK FOR A COMMA POINT X TO EVALUATE VARIABLE ROUTINE EVALUATE A VARIABLE TM ERROR IF NUMERIC VARIABLE EVALUATE EXPRESSION RETURN VALUE IN ACCB COMPARE TO 3 HIGHEST DRI
77. AND ISSUE DRIVE NOT READY LD6DE LDX ZERO LD6EQ LEAX 1 BEQ 106 LDA FDCREG BITA 01 BNE LD6EO RTS LD6EC 10 00 STA FDCREG EXG A A EXG A A LDA FDCREG LDA 4 80 STA DCSTA RTS MEDIUM DELAY LD6FD LDX 8750 10700 LEAX 1 10700 RTS READ ONE SECTOR 10705 10 580 10707 86 0 WRITE ONE SECTOR 10708 10 5 0 PSHS A LDX DROTRK LDB DCDRV ABX LDB X STB FDCREG 1 CMPB DCTRK BEQ 10739 LDA DCTRK STA FDCREG 3 STA X 17 STA FDCREG EXG A A EXG A A BSR LD6DE BNE 10737 BSR 106 0 ANDA 4518 BEQ 10739 STA DCSTA LD737 PULS A PC HEAD POSITIONED ON CORRECT TRACK LD739 LDA DSEC STA FDCREG 2 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK GO DO IT GET RETRY COUNT GET STATUS BRANCH IF NO ERRORS DECREMENT RETRIES COUNTER BRANCH IF NO RETRIES LEFT SAVE RETRY COUNT ON STACK RESTORE HEAD TO TRACK 0 BRANCH IF SEEK ERROR GO TRY COMMAND AGAIN IF NO ERROR 120 1 60 2 SECONDS 1 60 SECOND FOR EACH IRQ INTERRUPT WAIT 2 SECONDS BEFORE TURNING OFF MOTOR RESTORE REGISTERS EXIT DSKCON POINT TO TRACK TABLE GET DRIVE NUMBER ZERO TRACK NUMBER RESTORE HEAD TO TRACK 0 UNLOAD THE HEAD AT START 30 MS STEPPING RATE WAIT FOR 1793 TO RESPOND TO COMMAND WAIT TILL DRIVE NOT BUSY WAIT SOME MORE 1793 STATUS KEEP ONLY SEEK ERROR SAVE IN DSKCON STATUS IF IT DOES NOT BECOME UNBUSY 1793 ERR
78. AND LAST BYTES 2027 5 1L 02 D Y SAVE LENGTH IN Y 2028 CEB7 8D 1E BSR LCED7 WRITE FILE LENGTH TO BUFFER FIRST ARGUMENT OF PREAMBLE 2029 CEB9 EC 64 LDD 04 5 GET THE START ADDRESS 2030 CEBB 8D 1A BSR LCED7 WRITE OUT THE START ADDRESS SECOND PREAMBLE ARGUMENT 2031 CEBD AE 64 LDX 04 5 GET START ADDRESS 2032 CEBF A6 80 LCEBF LDA X GRAB A BYTE 2033 BD CB 52 JSR LCB52 WRITE IT OUT 2034 4 31 3F LEAY 1 Y DECREMENT BYTE COUNTER 2035 6 26 F7 BNE LCEBF BRANCH IF ALL BYTES NOT DONE 2036 CEC8 86 FF LDA FF FIRST BYTE OF POSTAMBLE 2037 CECA 8D 00 BSR LCED9 WRITE IT OUT EOF RECORD 2038 CECC 4 CLRA FIRST ARGUMENT OF POSTAMBLE IS 2039 CECD 5F CLRB A DUMMY ZERO VALUE 2040 CECE 8D 97 BSR LCED7 WRITE OUT POSTAMBLE FIRST ARGUMENT 2041 CED 35 36 PULS A B X Y GET CONTROL ADDRESSES FROM THE STACK 2042 CED2 8D 03 BSR LCED7 WRITE OUT THE TRANSFER ADDRESS 2ND ARGUMENT 2043 CED4 7E 4 2D JMP LA42D GO CLOSE ALL FILES 2044 2045 WRITE ACCD TO THE BUFFER 2046 CED7 8D 00 LCED7 BSR LCED9 WRITE ACCA TO BUFFER THEN SWAP ACCA ACCB 2047 CED9 BD CB 52 LCED9 JSR LCB52 WRITE ACCA TO BUFFER 2048 CEDC 1E 89 EXG SWAP ACCA ACCB 2049 CEDE 39 RTS 2050 CEDF 8E C2 97 LCEDF LDX BINEXT POINT TO BIN EXTENSION 2051 CEE2 7E C8 8A JMP LC88A GET FILENAME ETC 2052 2053 LOADM COMMAND 2054 CEES 9D SF LCEES JSR GETNCH GET NEXT INPUT CHARACTER 2055 CEE7 8D F6 BSR LCEDF GET FILENAME ETC 2056 CEE9 BD C9 59 JSR 10959 OPEN N
79. AND STORE IT IN THE RAM BUFFER CLEAR A BYTE SIDE NUMBER IN BUFFER GET SECTOR NUMBER AND STORE IT IN THE BUFFER GET THE LAST NINE DATA BLOCKS AND WRITE THEM TO THE BUFFER GET SECTOR COUNTER NEXT SECTOR 18 SECTORS PER TRACK BRANCH IF ALL SECTORS NOT DONE WRITE 200 BYTES OF 4bE AT END OF TRACK STORE A BYTE IN THE BUFFER DECREMENT COUNTER BRANCH IF ALL BYTES NOT MOVED SAVE THE COUNTER ON THE STACK GET TWO BYTES OF DATA FROM THE TABLE WRITE ACCA BYTES OF ACCB INTO THE BUFFER GET THE COUNTER BACK DECREMENT IT AND BRANCH IF ALL DATA BLOCKS NOT DONE THESE DATA ARE CLOSE TO THE IBM SYSTEM 34 FORMAT FOR 256 BYTE SECTORS DOUBLE DENSITY THE FORMAT GENERALLY CONFORMS TO THAT SPECIFIED ON THE 1793 DATA SHEET THE GAP SIZES HAVE BEEN REDUCED TO THE MINIMUM ALLOWABLE THE FORMAT USES 40 AS THE FILL CHARACTER FOR THE DATA BLOCKS WHILE COLOR DOS USES AN FF AS THE FILL CHARACTER SYNC FIELD ID ADDRESS MARK 1 TRACK SIDE AND SECTOR NUMBERS ARE INSERTED HERE ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037
80. B PC RESTORE ACCD 1010 1011 CONVERT GRANULE NUMBER TO TRACK amp SECTOR NUMBER X MUST POINTING TO CORRECT 1012 FCB THE TRACK AND SECTOR NUMBER WILL BE STORED IN DSKCON REGISTERS 1013 C763 E6 03 LC763 LDB FCBCGR X GET GRANULE NUMBER 1014 C765 54 LSRB DIVIDE BY 2 2 GRANULES TRACK 1015 C766 D7 EC STB TRACK NUMBER 1016 C768 C1 11 CMPB 17 TRACK 17 DIRECTORY TRACK 1017 C76A 25 92 BLO LC76E BRANCH IF lt DIRECTORY TRACK 1018 C76C 8C EC INC DCTRK INCR TRACK NUMBER IF gt DIRECTORY TRACK 1019 C76E 58 LC76E ASLB MULTIPLY TRACK NUMBER BY 2 1020 C76F 50 NEGB NEGATE GRANULE NUMBER 1021 C770 EB 03 ADDB FCBCGR X B IF EVEN GRANULE 1 IF ODD 1022 C772 8D 05 BSR LC779 RETURN 8 0 FOR EVEN GRANULE NUMBER 8 9 FOR ODD GRANULE NUMBER 1023 C774 04 ADDB FCBSEC X ADD SECTOR NUMBER 1024 C776 D7 ED STB DSEC SAVE SECTOR NUMBER 1025 778 39 RTS 1026 MULTIPLY ACCD BY 9 1027 C779 34 06 LC778 PSHS B A TEMP STORE ACCD ON STACK 1028 C77B 58 ASLB 1029 C77C 49 ROLA MULTIPLY BY 2 1030 C77D 58 ASLB 1031 C77E 49 ROLA MULTIPLY BY FOUR 1032 C77F 58 ASLB 1033 C780 49 ROLA MULTIPLY BY EIGHT 1034 C781 El ADDD S ADD ONE MULTIPLY BY NINE 1035 C783 39 RTS 1036 1037 CONVERT ACCD INTO A GRANULE NUMBER RETURN RESULT IN ACCB 1038 ENTER WITH ACCD CONTAINING A NUMBER OF SECTORS RETURN IN ACCB 1039 THE NUMBER 8 67 CORRESPONDING TO THE NUMBER OF COMPLETE 1040 GRANULES CONTAINED IN THAT MANY SECTORS 1041 DIVIDE B
81. BUFFER JMP L 59 MOVE FILENANE EXT FROM X TO DNAMBF COPY THE COPY PROCESS IS PERFORMED BY COPYING DATA FROM THE SOURCE FILE TO RAM AND THEN COPYING IT TO THE DESTINATION FILE THE SOURCE AND DESTINATION FILES ARE OPENED AS RANDOM FILES AND BOTH USE THE SYSTEM FCB ABOVE THE RESERVED FCBS ALL OF AVAILABLE FREE RAM ABOVE THE VARIABLES IS USED AS A COPY BUFFER WHICH SPEEDS UP THE COPYING PROCESS BUT UNFORTUNATELY THE METHOD USED WILL ALLOW AN ERROR ENCOUNTERED DURING THE COPY PROCESS TO HANG THE SYSTEM THIS IS CAUSED BY POINTING THE FCB S RANDOM FILE BUFFER POINTER FCBBUF X TO THE FREE RAM BUFFER AN ERROR WILL THEN CAUSE THE OPEN FILE TO BE CLOSED WITH FCBBUF X POINTING TO AN AREA IN RAM WHERE THE RANDOM FILE BUFFER CLOSE ROUTINE LCAE2 WILL NEVER LOOK FOR IT COPY JSR LC935 X X X X X X XXX GET SOURCE FILENAME EXT amp DRIVE NUMBER FROM BASIC BSR 10399 AND SAVE THEM ON THE STACK CLR 5 CLEAR A BYTE ON STACK SINGLE DISK COPY SDC FLAG JSR GETCCH GET CURRENT INPUT CHARACTER BEQ LD3CE BRANCH IF END OF LINE SINGLE DISK COPY COM 5 SET SOC FLAG TO FF NO SINGLE DISK COPY LDB A5 TOKEN FOR TO JSR LB26F SYNTAX CHECK FOR TO JSR 10935 GET DESTINATION FILENAME EXT AND DRIVE NUMBER LD3CE BSR 10399 SAVE DESTINATION FILENAME EXT amp DRIVE NUMBER ON STACK B28 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2
82. BUFFER LDX DBUF BUFFER FOR DISK TRANSFER STX DCBPT PUT IN DSKCON PARAMETER LDD 1102 DIRECTORY TRACK READ SECTOR STA DCTRK STORE IN DSKCON TRACK NUMBER STB DCOPC STORE IN DSKCON OP CODE LDB 02 GET SECTOR NUMBER 2 FILE ALLOCATION TABLE STB DSEC STORE IN DSKCON PARAMETER JSR LD6F2 GO READ SECTOR LDB GRANMX TRANSFER FILE ALLOCATION TABLE TO FILE ALLOC TABLE BUFFER JMP L 59 MOVE B BYTES FROM X TO U FIND FIRST FREE GRANULE ENTER WITH ACCB CONTAINING GRANULE FROM WHICH TO START SEARCHING THE FOUND GRANULE IS MARKED BY STORING A C IN THE GRANULE S DATA BYTE TO INDICATE THAT IT IS THE LAST GRANULE IN THE FILE RETURN WITH FIRST FREE GRANULE FOUND IN ACCA LC7BF BSR LC755 POINT X TO FILE ALLOC TABLE LEAX FATCON X SKIP CONTROL BYTES CLRA USE ACCA AS GRANULE COUNTER ANDB FE MASK OFF BIT ZERO OF SEARCH GRANULE CER 5 INITIALIZE AND SAVE A BYTE ON STACK DIRECTION FLAG LC7C8 COM B X IS THIS GRANULE FREE FF FREE BEQ LC7FD BRANCH IF IT IS COM B X RESTORE GRANULE DATA INCA ADD ONE TO GRANULE COUNTER CMPA GRANMX GRANMX GEANULES PER DISK BHS LC7F8 BRANCH IF ALL GRANULES CHECKED DISK FULL INCB INCR TO NEXT GRANULE BITB 01 IS BIT 0 SET BNE LC7C8 BRANCH IF ODD GRANULE NUMBER SAME TRACK PSHS B A SAVE GRANULE COUNTER AND CURRENT GRANULE NUMBER SUBB 02 SUBTRACT ONE TRACK 2 GRANULES COM 02 S COMPLEMENT DIRECTION FLAG BNE BRANCH EVERY OTHER TIME SUBB 5 SUBTRACT THE GRANULE COUNTER FROM THE CURR
83. BYTES FROM X TO U SYNTAX ERROR ADDRESS SET JUMP TABLE ADDRESSES OF THE USER COMMAND INTERPRETATION TABLE TO POINT TO SYNTAX ERROR CLEAR BYTE 0 OF USER TABLE DOESN T EXIST FLAG SET NUMBER OF SECONDARY USER TOKENS TO ZERO SAVE NEW POINTERS TO EXBAS COMMAND AND SECONDARY COMMAND INTERPRETATION ROUTINES POINT U TO 15 RAM VECTOR OP CODE OF JMP INSTRUCTION SET 1ST BYTE OF GET PUT RAM VECTOR TO JMP SET 1ST BYTE OF RAM VECTOR TO JMP GET RAM VECTOR FROM ROM STORE IT IN RAM COMPARE TO END OF ROM VALUES BRANCH IF NOT ALL VECTORS MOVED GET ROM VALUE OF GET PUT RAM VECTOR SAVE IT IN RAM POINT X TO START OF DISK BASIC USR VECTORS SAVE START ADDRESS IN USRADR POINT U TO ADDRESS OF FUNCTION CALL ERROR 10 USER VECTORS TO INITIALIZE SET USR VECTOR TO FC ERROR DECREMENT USR VECTOR COUNTER BRANCH IN NOT DONE WITH ALL 10 VECTORS GET ADDRESS OF NMI SERVICING ROUTINE SAVE IT IN NMI VECTOR OP CODE OF JMP MAKE THE NMI VECTOR A JMP GET ADDRESS OF DISK BASIC IRQ SERVICING ROUTINE SAVE IT IN IRQVEC INITIALIZE WRITE FAT TO DISK TRIGGER VALUE INITIALIZE THE ACTIVE FILE COUNTER OF EACH FAT TO ZERO THIS WILL CAUSE THE FATS TO THINK THERE ARE NO ACTIVE FILES GET THE STARTING ADDRESS OF THE RANDOM FILE BUFFER FREE AREA AND DAVE IT AS THE START ADDRESS OF FREE RAM FOR RANDOM FILE BUFFERS SAVE 256 BYTES FOR RANDOM FILE BUFFERS INITIALLY SAVE START ADDRESS OF FCBS ADD ONE AND SAVE THE STAR
84. C392 C304 C386 C399 C30B C30D C310 6312 C314 6318 C31A C31C C31E C320 C322 C324 C326 C329 C32B C32E C32F C331 C332 C334 C336 C339 C33B C33D C33E C340 C341 C342 C344 C346 C348 C34A C34C C34E C358 C352 C354 C357 C35A C35C C35E C368 34 AE 8C 26 81 27 35 32 BD 9F 6F 6F 6F 6F 6F A6 97 9D 27 BD BD 1F 9E ED EC 27 BD EC AE 34 30 BD 34 A6 26 35 35 8C 25 C6 7E DE AC 18 34 A6 27 6F C6 8D EC BD 34 BD 50 5C E7 E6 BD 33 A6 4C 30 4 27 E7 E6 C1 25 E6 00 26 C6 7E 30 07 9F 30 BD 11 63 97 04 23 02 91 65 C8 1 88 88 88 88 06 01 5 0 2 7 10 1 07 07 10 C6 9 OB 16 5E 9F 60 EQ 09 10 04 02 05 36 1 4D 27 14 4 06 4 03 33 61 C7 04 C7 63 44 42 C7 06 E4 C4 37 4 84 2 E4 D8 14 2E AC C8 EA EE C4 C7 5F 2E 15 16 17 18 6D 3D 85 B5 64 46 00 B7 84 79 55 46 19 63 CLS RAM VECTOR APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK SAVE X REG AND STATUS LOAD X WITH CALLING ADDRESS COMING FROM EXBAS GET PUT NO NUMBER SIGN GET PUT BRANCH IF GET OR PUT TO RANDOM FILE RESTORE X REG STATUS AND RETURN PURGE RETURN ADDRESS AND REGISTERS OFF OF THE STACK EVALUATE DEVICE NUMBER amp SET FCB POINT
85. C7 00 01 07 04 04 19 21 5B 18 19 19 44 19 18 28 4 01 5B CB 49 06 19 APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK FCBLEN REQUIRED FOR EACH BUFFER OUT OF MEMORY ERROR IF gt FFFF DECREMENT BUFFER COUNTER BRANCH IF NOT DONE THE BPL WILL SET UP ONE MORE BUFFER THAN THE NUMBER REQUESTED THIS EXTRA BUFFER IS THE SYSTEM BUFFER AND IS LOCATED AT THE END OF THE NORMAL FCBS ONLY SYSTEM ROUTINES COPY BACKUP MERGE ETC MAY ACCESS THIS BUFFER AT AN EXACT 256 BYTE BOUNDARY YES NO ADD 256 OUT OF MEMORY ERROR IF PAST FFFF ON A 512 BYTE BOUNDARY YES NO ADD 256 OM ERROR IF PAST FFFF SAVE MS BYTE OF NEW GRAPHIC RAM START GET START OF VARIABLES SUBTRACT THE OLD GRAPHIC RAM START ACCD CONTAINS LENGTH OF PROGRAM PLUS RESERVED GRAPHIC RAM ADD IN THE AMOUNT OF RAM CALCULATED ABOVE OUT OF MEMORY ERROR IF gt FFFF SAVE NEW VARTAB IN X ADD 256 TO GUARANTEE ENOUGH ROOM SINCE ALL CALCULATIONS USE ONLY THE MSB OF THE ADDRESS OUT OF MEMORY ERROR IF PAST FFFF IS IT GREATER THAN THE START OF STRING SPACE OUT OF MEMORY IF gt START OF STRING SPACE SUBTRACT 256 COMPENSATE FOR INCA ABOVE SUBTRACT START OF VARIABLES ADD START OF BASIC Y HAS NEW START OF BASIC GET THE GRAPHIC RAM START SUBTRACT THE OLD GRAPHIC RAN START AND SAVE THE DIFFERENCE IN ACCA AND ACCB ADD THE
86. CONVERT FP NUMBER TO ASCII STRING PUT ON TEMPORARY STRING STACK PRINT STRING TO CONSOLE OUT GET CURRENT CHARACTER PUT CR TO CONSOLE OUT IF END OF LINE COMMA NON CASSETTE SEPARATOR SET PRINT PARAMETERS GET CONSOLE PRINT DEVICE AND BRANCH IF NOT CASSETTE GET CARRIAGE RETURN CASSETTE ITEM SEPARATOR SEND SEPARATOR TO CONSOLE OUT GET NEXT ITEM PRINT LEADING STRING DELIMITER PRINT STRING TO CONSOLE OUT PRINT ENDING STRING DELIMITER GO PRINT SEPARATOR SET PRINT PARAMETERS GET CONSOLE PRINT DEVICE AND RETURN IF CASSETTE QUOTE NON CASSETTE STRING DELIMITER SEND TO CONSOLE OUT EVALUATE DEVICE NUMBER amp VERIFY RANDOM FILE OPEN CLEAR TOTAL FIELD LENGTH COUNTER SAVE FCB POINTER amp INITIALIZE TOTAL FIELD LENGTH TO ZERO GET CURRENT INPUT CHARACTER BRANCH IF NOT END OF LINE CLEAN UP STACK AND RETURN SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION SAVE FIELD LENGTH ACCB ON STACK X IS A DUMMY WHICH WILL RESERVE 2 BYTES FOR THE ADDRESS WHICH WILL BE CALCULATED BELOW CLEAR MS BYTE ADD FIELD LENGTH TO TOTAL FIELD LENGTH COUNTER FO ERROR IF SUM gt FFFF POINT X TO FCB COMPARE TO RECORD LENGTH amp BRANCH IF TOTAL FIELD LENGTH lt RECORD LENGTH FIELD OVERFLOW ERROR JUMP TO ERROR DRIVER LOAD U WITH OLD TOTAL LENGTH OF ALL FIELDS SAVE NEW TOTAL FIELD LENGTH POINT ACCD TO START OF RANDOM FILE BUFFER POINT U TO THIS FIELD S SLOT IN THE RANDOM FILE BUFFER AND SAVE IT ON THE STACK
87. CPU S MEMORY SPACE BASIC TOKEN NUMBER BASIC FUNCTION TOKEN NUMBER BUG SHOULD BE 28 HI RES CURSOR CHARACTER EQUATES ADDRESS OF THE NUMBER OF THIS NEXT BUFFER 2 BYTES BUFFER 1 BYTES NUMBER OF BYTES IN THE BUFFER 2 BYTES NUMBER OF BYTES IN THIS HEADER I H m II II TIMER Color Computer compatible MMU enabled GIME chip IRQ output enabled GIME chip FIRQ output enabled RAM at XFEXX is constant standard SCS ROM map control ROM map control HORIZONTAL BORDER VERTICAL BORDER SERIAL DATA KEYBOARD CARTRIDGE BLOCKS 30 33 ARE THE HI RES GRAPHICS SCREEN HI RES GRAPHICS SCREEN HI RES GRAPHICS SCREEN HI RES GRAPHICS SCREEN GET PUT BUFFER STACK AREA FOR HI RES GRAPHICS COMMAND CHARACTER POINTERS UNUSED BY BASIC 1 DISK BASIC UNRAVELLED II 0000 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000 000 0000 GOOF 0011 0013 0017 0019 001 0010 00 0021 0023 0025 0027 0029 002 0020 002 0031 0033 0035 0037 0039 003 0030 003 0040 0041 0042 0043 0044 0045 0046 0047 0048 0038 0039 003A 003 003 0030 003 003 0021 008 0086 0000 APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK BLOCKS 48 4F ARE USED FOR THE BASIC OPERATING SYSTEM
88. DATA 105 DATA DRO DRO DRO DRO DRO BUSY BUSY BUSY BUSY BUSY STATUS FOR TYPE I COMMANDS S7 NOT READY This bit when set indicates the drive is not ready When reset it indicates that the drive is ready This bit is an inverted copy of the Ready input and logically or d with MR When set indicates Write Protect is activated This bit is an inverted copy at WRPT input This bit is a logical and of HLD and HLT signals 54 SEEK ERROR When set the desired track was not verified This bit is reset to 0 when updated S2 TRACK 00 When set indicates Read Write head is positioned to Track This bit is an inverted copy of the TRO input When set indicates index mark detected from drive This bit is an inverted copy of the IP input When set command is in progress When reset no command is in progress 15 DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK STATUS FOR TYPE II AND III COMMANDS BIT NAME MEANING S7 NOT READY This bit when set indicates the drive is not ready When reset it indicates that the drive is ready This bit is an inverted copy of the Ready input and or d with MR The Type II and III Commands will not execute unless the drive is ready S6 WRITE On Read Record Not Used On Read Track Not Used On PROTECT any Write It indicates a Write Protect This bit is reset when updated S5 RECORD Read Record It indicates the record type code fro
89. DIRECTORY DATA IS STORED 0913 6 7 39 DVEC12 RTS 0914 0915 C6B8 C6 34 LC6B8 LDB 2 26 NE ERROR 0916 C6BA 70 09 73 TST V973 WAS A DIRECTORY MATCH FOUND 0917 C6BD 26 F8 BNE DVEC12 RETURN IF FOUND 0918 C6BF 7E AC 46 JMP LAC46 JUMP TO ERROR HANDLER IF NOT FOUND 0919 0920 KILL COMMAND 0921 C6C2 BD C8 87 KILL JSR LC887 GET FILENAME EXT FROM BASIC 0922 C6C5 BD 5 C7 JSR L 5C7 SYNTAX ERROR IF MORE CHARACTERS ON LINE 0923 C6C8 BD C7 60 JSR LC76D GET VALID FAT DATA 0924 C6CB 8D 92 BSR LC65F TEST FOR FILE NAME MATCH IN DIRECTORY 0925 C6CD 8D E9 BSR LC6B8 MAKE SURE THE FILE EXISTED 0926 C6CL 86 FF LC6CF LDA FF MATCH FILE TYPE FF THIS WILL CAUSE AN AO 0927 ERROR TO BE GENERATED IF ANY FILE TYPE IS OPEN 0928 C6D1 BD C7 D7 JSR LC7D7 CHECK TO MAKE SURE FILE IS NOT OPEN 0929 C6D4 BE 99 74 LDX V974 GET RAM IMAGE OF DIRECTORY 0930 C6D7 6 84 CLR DIRNAM X AND ZERO FIRST BYTE KILL FILE 0931 C6D9 C6 03 LDB 03 WRITE OPERATION CODE SAVE 0932 C6DB D7 EA STB DCOPC IN DSKCON VARIABLE 0933 C6DD BD D5 FF JSR LDSFF WRITE A SECTOR 0934 6 E6 BD LDB DIRGRN X GET NUMBER OF FIRST GRANULE IN FILE 0935 6 2 80 41 LC6E2 BSR LC725 POINT X TO PROPER FILE ALLOCATION TABLE 0936 6 4 30 06 LEAX SKIP 6 CONTROL BYTES 0937 C6E6 3A ABX POINT TO CORRECT ENTRY 0938 C6E7 E6 84 LDB X GET NEXT GRANULE 0939 6 9 86 LDA FF GET FREE GRANULE FLAG AND 0940 6 7 84 STA MARK GRANULE AS F
90. DISK THE FIRST GRANULE USED BY THE FILE WILL 0030 ALLOW THE FAT TO TRACK DOWN ALL OF THE GRANULES USED BY THE FILE IF THE FIRST 0031 BYTE THE DIRECTORY ENTRY IS ZERO THE FILE HAS BEEN KILLED 0032 IF THE FIRST BYTE IS FF THEN THE DIRECTORY ENTRY HAS NEVER BEEN USED 0033 0034 DESCRIPTION 0035 0036 00 00 DIRNAM EQU 0 FILE NAME 0037 00 08 DIREXT EQU 8 FILE EXTENSION 0038 00 OB DIRTYP EQU 11 FILE TYPE 0039 00 C DIRASC EQU 12 ASCII FLAG 0040 00 00 DIRGRN EQU 13 FIRST GRANULE IN FILE 0041 00 OE DIRLST EQU 14 NUMBER OF BYTES IN LAST SECTOR 0042 16 TO 31 UNUSED 0043 0044 0045 FILE CONTROL BLOCK FORMAT 0046 0047 0048 THE FILE STRUCTURE OF COLOR TRS DOS IS CONTROLLED BY A FILE CONTROL BLOCK FCB 0049 THE FCB CONTAINS 25 CONTROL BYTES AND SECTOR LONG 256 BYTES DATA BUFFER 0050 THE CONTROL BYTES CONTROL THE ORDERLY FLOW OF DATA FROM THE COMPUTER S RAM TO 0051 THE DISKETTE AND VICE VERSA THE OPEN COMMAND INITIALIZES THE FCB THE INPUT 0052 OUTPUT WRITE PRINT GET AND PUT COMMANDS TRANSFER DATA THROUGH THE FCB AND 0053 THE CLOSE COMMAND TURNS OFF THE FCB 0054 0055 TABLES OF OFFSETS TO FCB CONTROL BYTES 0056 0057 RANDOM FILE 0058 DESCRIPTION 0059 00 00 FCBTYP EQU 0 FILE TYPE 40 RANDOM DIRECT Q CLOSED 0060 00 01 FCBDRV EQU 1 DRIVE NUMBER 0061 00 02 FCBFGR EQU 2 FIRST GRANULE IN FILE 0062 900 03 FCBCGR EQU 3 CURRENT GRANULE BEING USED 0063 00 04 FCBSEC EQU
91. DISK BASIC UNRAVELLED II 0577 0578 0579 0580 0581 0582 0583 0584 0585 0586 0587 0588 0589 0590 0591 0592 0593 0594 0595 0596 0597 0598 0599 0600 0601 0602 0603 0604 0605 0606 0607 0608 0609 0610 0611 0612 0613 0614 0615 0616 0617 0618 0619 0620 0621 0622 0623 0624 0625 0626 0627 0628 0629 0630 0631 0632 0633 0634 0635 0636 0637 0638 0639 0640 0641 0642 0643 0644 0645 0646 0647 0648 0649 0650 0651 0652 0653 0654 0655 0656 0657 0658 0659 0660 0661 0662 0663 0664 0665 0666 0667 0668 0669 0670 0671 0672 C40L C411 C413 C415 C417 C419 C418 C41D 41 C420 C424 C426 C428 C428 42 C430 C433 C434 C438 C43A C43C C43E C441 C444 C447 C44A C44D C458 C452 C454 C457 C45A C45C C45F C463 C466 C468 C46A C46D C471 C473 C476 C479 C47B C47D 47 C481 C483 C486 C489 C48C C48E C491 C493 C496 C499 C49B C49D C49F 4 1 4 2 4 4 C4A6 C4A8 C4AB C4AD C4B0 C4B3 C4B6 C4B9 C4BC C4BE C4C0 C4C2 C4C4 C4C6 C4C8 C4CC CACE C4D1 C4D3 C4D6 C4D8 C4DC DE 96 27 A7 AF AE 30 5F EE 18 35 32 BD BD 34 BD 5D 18 35 34 OF BD 8E BD cc FD 8E 9D 27 BD BD 9E BF 18 BD 35 34 BD 10 9F BD BD 35 86 34 C1 26 BD BD BE EC FD 8D BD BD 6 9 35 7 39 68 C1 26 7D 27 BD B6 B7 BE BF 8D 8D 20 C1 27 C1 18 68 FC 34 F3 25 10 23 1 08
92. EQU There is an additional group of EQUates at the beginning of the Disk Basic disassembly listing Appendices B amp C The symbol will occasionally appear to the left of the address of an instruction This symbol is used to indicate that a JMP JSR or LBxx instruction is being used when a BRA BSR or Bxx instruction would suffice These instructions may be replaced by their short versions in order to save a few bytes if necessary There are several places in the original object code where an instruction of the form LDA R where R X Y U S has been used These have been replaced by instructions of the form LDA R which are more efficient in terms of processor time one cycle shorter The different versions of the ROMs provided in this book are kept in one large disk file with conditional assembly flags which allow the assembly of whichever version is desired by merely changing a single flag in the source listing This is a convenient method of keeping track of the different versions of the ROMs but it can cause havoc with the line numbers at the extreme left of the disassembly listing The line numbers keep track of EVERY line in the source listing regardless of whether or not that particular line is assembled If when using the disassembly listings you notice a gap in the line numbers it means that the missing line numbers correspond to a section of code which was skipped during the assembly of that particular listing This invariably
93. F4 EC ED 65 66 36 09 FF 09 02 9 D3 00 05 D3 12 89 D3 1B B9 64 8 9 1 00 F9 53 4E 44 41 44 54 52 45 20 OB 09 82 02 F9 EB 02 4 80 OB 09 5 C9 DB E2 A5 BA 4 5 2 C9 C9 F2 85 40 86 28 5F 6c A2 7E A2 05 51 71 53 4F 53 45 54 49 45 45 4E 57 4C 9A 35 6F 35 45 55 45 53 49 53 20 53 54 52 52 52 54 4F 48 41 53 45 54 43 54 49 45 20 52 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 LDA TMPLOC GET NUMBER OF TRACKS TO MOVE 030 LDB 01 INITIALIZE SECTOR COUNTER TO ONE 10310 5 DSEC SAVE DSKCON SECTOR VARIABLE JSR LD6F2 READ WRITE A SECTOR INC MOVE BUFFER POINTER UP ONE SECTOR 256 BYTES INCB INCREMENT SECTOR COUNTER CMPB SECMAX COMPARE TO MAXIMUM NUMBER OF SECTORS PER TRACK BLS 10310 BRANCH IF ANY SECTORS LEFT INC DCTRK INCREMENT TRACK COUNTER VARIABLE TO NEXT TRACK DECA DECREMENT TRACKS TO MOVE COUNTER BNE LD3 E READ MORE TRACKS IF ANY LEFT RTS LD322 LDB 05 5 GET THE DESTINATION DRIVE NUMBER AND 06 S COMPARE IT TO THE SOURCE DRIVE NUMBER PRINT SOURCE DESTINATION DISK SWITCH PROMPT MESSAGE LD326 BNE LD35E RETURN IF DRIVE NUMBERS NOT EQUAL CLR RDYTMR RESET THE READY TIMER CLR DSKREG CLEAR DSKREG TURN OFF ALL DISK MOTORS CLR DRGRAM CLEAR DSKREG RAM IMAGE PSHS A SAVE SOURCE DESTINATION FLAG ON STACK JSR L
94. FDB FDB FDB DISK BASIC LC126 FCC FCB FDB FCB FCC FCB FCC FDB DISK BASIC LC17F FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC FCC DISK BASIC LCIDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB DVEC DVEC1 DVEC2 DVEC3 DVEC4 DVEC5 DVEC6 DVEC7 DVEC8 XVEC9 DVEC1 DVEC11 DVEC12 DVEC13 DVEC14 DVEC15 DVEC12 DVEC17 DVEC18 COPYRIGHT MESSAGE DISK EXTENDED COLOR BASIC 1 0 CR COPYRIGHT C 198 CYEAR BY TANDY CR UNDER LICENSE FROM MICROSOFT CR CR O COMMAND DICTIONARY TABLE TOKEN DI 807 R CE DRIV 80 E CF FIEL 80 D Dg FILE 80 S 1 KIL 80 L D2 LOA 80 D D3 LSE 80 T 4 MERG 80 D5 RENAM 80 E D6 RSE 80 T 07 SAV 80 E 8 WRIT 80 E 09 VERIF 80 Y DA UNLOA 80 D DB DSKIN 80 I DC BACKU 80 P DD COP 80 Y DE DSKI 80 DF DSKO 80 COMMAND JUMP TABLE COMMAND TOKEN DIR DIR CE DRIVE DRIVE CF FIELD FIELD 00 FILES FILES D1 KILL KILL D2 LOAD LOAD D3 LSET LSET D4 MERGE MERGE D5 RENAME RENAME D6 RSET RSET D7 SAVE SAVE D8 WRITE WRITE D9 VERIFY VERIFY DA C3 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 0289 0290 0291 0292 0293 0294 0295 0296 0297 0298 0299 0300 0301 0302 0303 0304 0305 0306 0307 0308 0309 03
95. FILE TYPE 2 ASCII FLAG 0 BAD FILE MODE ERROR ZERO OUT X REG DEFAULT VALUE OF OFFSET GET CURRENT CHARACTER FROM BASIC BRANCH IF END OF LINE NO OFFSET SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION STORE OFFSET IN VD3 SYNTAX ERROR IF OTHER CHARACTERS ON LINE GET FIRST BYTE SAVE IT ON THE STACK GET FIRST ARGUMENT SAVE IT IN Y GET THE SECOND ARGUMENT ADD IT TO THE OFFSET STORE IT IN THE JUMP ADDRESS OF THE EXEC COMMAND SAVE IT IN X GET THE FIRST BYTE OFF OF THE STACK CLOSE FILE IF POSTAMBLE EOF GET BYTE FROM BUFFER GET STATUS OF CONSOLE IN BUFFER BRANCH IF BUFFER NOT EMPTY INPUT PAST END OF FILE ERROR STORE BYTE IN MEMORY TEST TO SEE IF IT STORED PROPERLY AND BRANCH IF PROPER STORE NOT IN ROM OR BAD RAM I 0 ERROR IF BAD STORE DECREMENT BYTE COUNT GET NEXT BYTE IF NOT DONE READ ANOTHER PRE POST AMBLE READ TWO BYTES FROM BUFFER RETURN THEM IN ACCD 10013 10015 RENAME COMMAND RENAME JMP LB4F3 JSR BSR LCFBB JSR 1836 JSR 1836 CMPX 02 5 LBCS LB44A JSR 1836 JSR LA5C7 LDD 850200 STD DFLTYP JSR LCA04 CLRA BSR LCFB5 502 5 SUBD 04 S ADDD 0001 TFR D Y BSR LCFB3 LDD 504 5 BSR LCFB3 LDX 504 5 LDA X JSR LCC24 LEAY 1 Y BNE LCF9B LDA FF BSR LCFB5 CLRA CLRB BSR LCFB3 PULS A B X Y BSR LCFB3 JMP LA42D BSR LCFB5 JSR LCC24 EXG A B RTS LDX BINEXT JMP LC938 JSR BSR LCFBB JSR LCA07 LDD DFLTYP SUBD 0200 LBNE LA616 LDX
96. FILE TYPE IS THIS A RANDOM DIRECT FILE BRANCH IF NOT GET A BYTE FROM A RANDOM FILE RETURN CHAR IN ACCA FCB DATA BUFFER RETURN GET THE RECORD COUNTER COMPARE TO RECORD LENGTH AND BRANCH TO BUFFER EMPTY IF gt RECORD LENGTH ADD ONE TO RECORD POINTER AND SAVE IT IN FCB POINT X TO START OF RANDOM FILE BUFFER AND ADD THE RECORD COUNTER TO IT GET A CHARACTER FROM THE BUFFER RESTORE REGISTERS AND RETURN II TEST THE CACHE FLAG AND BRANCH IF AN EXTRA CHARACTER HAS NOT BEEN READ FROM FILE GET THE CACHE CHARACTER CLEAR THE CACHE FLAG RESTORE REGISTERS AND RETURN IS ANY DATA LEFT BRANCH IF SO SET FLAG TO BUFFER EMPTY RESTORE REGISTERS AND RETURN GET CHARACTER POINTER ADD ONE TO CHARACTER POINTER DECREMENT NUMBER OF CHARACTERS LEFT IN FILE BUFFER IF LAST CHARACTER GO GET SOME MORE ADD CHARACTER COUNTER TO X GET DATA CHARACTER SKIP PAST 25 FCB CONTROL BYTES CHAR IN ACCA SAVE REGISTERS POINT U TO CORRECT CHARACTER GET DATA CHAR SKIP PAST 25 CONTROL BYTES AND SAVE DATA CHARACTER ON STACK RESET CHAR POINTER TO START OF BUFFER GET DRIVE NUMBER AND SAVE IT IN DSKCON VARIABLE GO READ A SECTOR FILL THE BUFFER RESTORE REGISTERS AND DATA CHARACTER RESTORE REGISTERS AND RETURN DATA BUFFER FOR SEQUENTIAL FILES STA V976 STA 02 U LDB 4 03 STB DCOPC JSR LD6F2 LC5A9 5 5 U X B A JSR LC755 INC FAT1 X LDA FAT1 X CMPA WFATVL BLO 1 5 JSR 1 71 LC5BA PULS A B X U
97. GET A CHARACTER FROM CONSOLE IN EXIT ROUTINE IF BUFFER EMPTY SPACE YES GET ANOTHER CHARACTER COMMA ITEM SEPARATOR YES EXIT ROUTINE CARRIAGE RETURN NO GET A CHARACTER FROM CONSOLE IN EXIT ROUTINE IF BUFFER EMPTY LINE FEED TREAT CR LF AS A CR YES EXIT ROUTINE BACK UP PTR INPUT POINTER ONE EXIT ROUTINE GET A CHAR FROM INPUT BUFFER RETURN IN ACCA RETURN IF BUFFER NOT EMPTY POINT X TO START OF FILE BUFFER GET FILE TYPE IS IT RANDOM FILE TYPE INPUT PAST END OF FILE ERROR IF NOT RANDOM WRITE INPUT PAST END OF RECORD ERROR IF RANDOM JUMP TO THE ERROR HANDLER GET A CHAR FROM INPUT BUFFER SET FLAGS ACCORDING TO CONSOLE INPUT FLAG SAVE REGISTERS ON STACK POINT X TO PROPER FCB GET FILE TYPE OF THIS FCB IS IT A RANDOM FILE BRANCH IF NOT A RANDOM FILE GRAB THE RANDOM FILE GET POINTER MOVE IT BACK ONE AND RESTORE IT DISK BASIC UNRAVELLED II 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 CDE
98. GET FIRST GRANULE IN FILE COUNT GRANULES SAVE COUNT IN ACCB CLEAR MS BYTE OF ACCD PRINT ACCD IN DECIMAL TO CONSOLE OUT SEND CARRIAGE RETURN TO CONSOLE OUT PULL DIRECTORY POINTER OFF OF THE STACK MOVE X TO NEXT DIRECTORY ENTRY END OF I 0 BUFFER BRANCH IF MORE DIRECTORY ENTRIES IN BUFFER GET CURRENT SECTOR BUMP COUNT SECMAX SECTORS IN DIRECTORY TRACK GET NEXT SECTOR FINISHED SEND CHARACTER TO CONSOLE OUT SEND BLANK TO CONSOLE OUT ENTER WITH ACCB POINTING TO FIRST GRANULE IN A FILE RETURN THE NUMBER OF THE FILE IN ACCA THE GRANULE DATA FOR THE LAST SECTOR IN ACCB GRANULES IN LCC44 JSR LEAU CLRA INCA CMPA LBHI LEAX ABX LDB CMPB BLO RTS LCC4A LC725 GRANMX LC626 U 0 LCC4A INPUT RAM HOOK DVEC10 TST BLE LDX STX DEVNUM LCCBD 18069 5 C18 POINT X TO FILE ALLOCATION BUFFER POINT U TO START OF GRANULE DATA RESET GRANULE COUNTER INCREMENT GRANULE COUNTER CHECKED ALL 68 GRANULES YES BAD FILE STRUCTURE ERROR POINT U TO START OF GRANULE DATA ADD POINTER TO FIRST GRANULE GET THIS GRANULE S CONTROL BYTE IS THIS THE LAST GRANULE IN FILE NO KEEP GOING CHECK DEVICE NUMBER AND RETURN IF NOT A DISK FILE CHANGE THE RETURN ADDRESS ON THE STACK TO RE ENTER BASIC S INPUT ROUTINE AT A DIFFERENT PLACE THAN THE CALLING ROUTINE ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 1729 1730 1731 1732
99. HGET HPUT BUFFER HEADER HB ADDR EQU HB NUM EQU 2 HB SIZE EQU 3 HB LEN EQU 5 VIDEO REGISTER EQUATES INIT BIT EQUATES coco EQU 89 MMUEN EQU 540 IEN EQU 28 FEN EQU 10 MC3 EQU 8 MC2 EQU 4 MC1 EQU 2 MCB EQU 1 INTERRUPT REQUEST ENABLED TMR EQU 28 HBORD EQU 10 VBORD EQU 8 EI2 EQU 4 EIl EQU 2 EI EQU 1 EXPANDED MEMORY DEFINITIONS BLOCK 6 0 EQU 30 BLOCK 6 1 EQU 31 BLOCK 6 2 EQU 32 BLOCK 6 3 EQU 33 BLOCK 6 4 EQU 34 BLOCK 6 5 EQU 35 BLOCK 6 6 EQU 36 BLOCK 6 7 EQU 37 APPENDIX A MEMORY MAP BACKSPACE ENTER KEY ESCAPE CODE LINE FEED FORM FEED SPACE BLANK ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK STACK BUFFER ROOM DEBOUNCE DELAY MAX NUMBER OF CHARS IN A BASIC LINE MAXIMUM MS BYTE OF LINE NUMBER RAM LOAD LOCATION FOR THE DOS COMMAND NUMBER OF CONTROL BYTES BEFORE FAT NUMBER OF CONTROL BYTES BEFORE FCB NUMBER OF BYTES IN DIRECTORY ENTRY LENGTH OF SECTOR IN BYTES MAXIMUM NUMBER OF SECTORS PER TRACK LENGTH OF TRACK IN BYTES MAX NUMBER OF TRACKS FILE ALLOCATION TABLE LENGTH MAXIMUM NUMBER OF GRANULES FILE CONTROL BLOCK LENGTH INPUT FILE TYPE OUTPUT FILE TYPE RANDOM DIRECT FILE TYPE MAXIMUM NUMBER DUMMY RAM LINK ADDRESS OF THE ADDRESS OF THE ADDRESS OF THE FIRST ENHANCED FIRST ENHANCED OF ROWS IN HI RES PRINT MODE VECTOR HI RES SCREEN IN THE CPU S MEMORY SPACE GET PUT BUFFERS IN THE CPU S MEMORY SPACE HI RES GRAPHICS STACK IN THE
100. IF lt gt 0 PULL TEMPORARY RECORD LENGTH AND BUFFER ADDRESS OFF STACK AND RETURN PULL RETURN ADDRESS OFF OF THE STACK EVALUATE AN EXPRESSION GET MODE I O R FIRST BYTE OF STRING EXPRESSION AND SAVE IT ON STACK GET DEVICE NUMBER SET FLAGS BRANCH IF NOT A DISK FILE GET MODE SAVE MODE AND DEVICE NUMBER FILE NUMBER SET DEVICE NUMBER TO SCREEN SYNTAX CHECK FOR COMMA POINT TO DAT FOR EXTENSION GET FILENAME FROM BASIC DEFAULT DISK FILE TYPE AND ASCII FLAG SAVE DEFAULT VALUES DATA ASCII DEFAULT RECORD LENGTH 1 PAGE GET CHAR FROM BASIC BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION GET EVALUATED EXPRESSION RECORD LENGTH IF 0 THEN ILLEGAL FUNCTION CALL ERROR IF ANY FURTHER CHARACTERS ON LINE GET MODE AND FILE NUMBER SAVE MODE ON STACK POINT X TO FCB FOR THIS FILE FILE ALREADY OPEN ERROR IF FILE OPEN SAVE FILE BUFFER POINTER MAKE SURE FILE ALLOC TABLE IS VALID SCAN DIRECTORY FOR FILENAME EXT GET MODE INPUT TYPE FILE SAVE FILE TYPE ON STACK INPUT MODE BRANCH IF NOT CHECK TO SEE IF DIRECTORY MATCH IS FOUND CHECK TO SEE IF FILE ALREADY OPEN GET RAM DIRECTORY BUFFER GET FILE TYPE AND ASCII FLAG SAVE IN RAM IMAGE INITIALIZE FILE BUFFER CONTROL BLOCK GO FILL DATA BUFFER POINT X TO PROPER FILE ALLOCATION TABLE ADD ONE TO FAT ACTIVE FILE COUNTER GET FILE BUFFER POINTER GET FILE TYPE SAVE IT IN FCB SET FILE TYPE TO OUTPUT FILE MODE OUTPUT BRANCH I
101. IN DIRECTORY PRINT CARRIAGE RETURN TO CONSOLE OUT IF END OF LINE GO WRITE AN ITEM LIST SET DEVICE NUMBER TO SCREEN CHECK FOR DEVICE NUMBER FLAG DEFAULT TO CURRENT DEVICE NUMBER IF NONE GIVEN SET DEVICE NUMBER CHECK VALIDITY MAKE SURE SELECTED FILE IS AN OUTPUT FILE GET CURRENT INPUT CHARACTER PRINT CR TO CONSOLE OUT IF END OF LINE SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION GET VARIABLE TYPE BRANCH IF STRING CONVERT FP NUMBER TO ASCII STRING PUT ON TEMPORARY STRING STACK PRINT STRING TO CONSOLE OUT GET CURRENT CHARACTER PUT CR TO CONSOLE OUT IF END OF LINE COMMA NON CASSETTE SEPARATOR SET PRINT PARAMETERS GET CONSOLE PRINT DEVICE AND BRANCH IF NOT CASSETTE GET CARRIAGE RETURN CASSETTE ITEM SEPARATOR SEND SEPARATOR TO CONSOLE OUT GET NEXT ITEM PRINT LEADING STRING DELIMITER PRINT STRING TO CONSOLE OUT PRINT ENDING STRING DELIMITER GO PRINT SEPARATOR SET PRINT PARAMETERS GET CONSOLE PRINT DEVICE AND RETURN IF CASSETTE QUOTE NON CASSETTE STRING DELIMITER SEND TO CONSOLE OUT EVALUATE DEVICE NUMBER amp VERIFY RANDOM FILE OPEN CLEAR TOTAL FIELD LENGTH COUNTER SAVE FCB POINTER amp INITIALIZE TOTAL FIELD LENGTH TO ZERO GET CURRENT INPUT CHARACTER BRANCH IF NOT END OF LINE CLEAN UP STACK AND RETURN SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION SAVE FIELD LENGTH ACCB ON STACK X IS A DUMMY WHICH WILL RESERVE 2 BYTES FOR THE ADDRESS WHICH WILL BE CALCULATED BELOW CLEAR MS B
102. JSR LC763 LEAU FCBCON X STU BSR LCC15 LCBE9 10 FCBLST X BPL LCB8B LDB FCBDIR X ANDB 4507 LDA DIRLEN MUL LDU DBUF STU LEAY D U LDB FCBDIR X LSRB LSRB LSRB ADDB 03 STB DSEC LDD 1102 STA DCTRK BSR LCC17 LDD ANDA 7F STD DIRLIST Y LCC15 108 4503 LCC17 STB DCOPC JMP LD6F2 CONSOLE OUT RAM HOOK DVEC3 TST DEVNUM LBLE XVEC3 LEAS 902 5 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK KEEP MOVING BYTES SAVE NEW START OF FREE RANDOM BUFFER AREA POINT X TO PROPER FILE ALLOCATION TABLE REMOVE ONE ACTIVE FILE NEW DATA IN FAT RAM IMAGE NO WRITE OUT FILE ALLOCATION TABLE TO DISK GET FILE BUFFER POINTER GET FILE TYPE IS IT A SEQUENTIAL OUTPUT FILE YES IS IT A RANDOM FILE RETURN IF NOT A RANDOM FILE SEQUENTIAL INPUT TEST THE GET PUT FLAG AND BRANCH IF GET GET PROPER TRACK amp SECTOR NUMBERS POINT U TO START OF FCB DATA SET UP FILE BUFFER POINTER FOR DSKCON GO WRITE A SECTOR CHECK THE PRE SAVED FLAG RETURN IF RECORD HAS ALREADY BEEN SAVED ON DISK GET DIRECTORY NUMBER OF THIS FILE 8 ENTRIES PER SECTOR DIRLEN BYTES PER DIRECTORY ENTRY GET SECTOR OFFSET FOR THIS ENTRY GET READ WRITE BUFFER 0 AND SAVE IT IN DSKCON REGISTER Y POINTS TO CORRECT DIRECTORY ENTRY GET DIRECTORY ENTRY NUMBER DIVIDE BY 8 EIGHT DIRECTORY ENTRIES PER SECTOR ADD BIAS FIRST 3 SECTORS NOT DIRECTORY STORE SECTOR NUMBER DIRECTORY TRACK READ
103. JUMP BACK TO RETURN ADDRESS SAVED IN U ABOVE READ CODE SKIP TWO BYTES WRITE OP CODE SAVE IN DSKCON VARIABLE GET THE NUMBER OF THE TRACK BEING CURRENTLY WRITTEN AND SAVE IT IN DSKCON VARIABLE TRACK BUFFER STARTS AT DFLBUF 10249 FCBACT BLS 10236 RTS GET DRIVE NUMBER FROM BASIC USE THE DEFAULT LD24F LDB DEFDRV JSR GETCCH BEQ 1025 LD256 JSR EVALEXPB CMPB 03 LBHI LA61F LD25F STB DCDRV RTS BACKUP COMMAND BACKUP LBEQ LA61F JSR L95M JSR 10256 STB DBUF0 255 JSR BEQ 10278 LDB A5 JSR LB26F JSR 10256 10278 105 DBUF 255 5 5 JSR LA5C7 JSR DVEC7 CLR 5 LDX DFLBUF 1 LD28C INC 5 LEAX SECMAX SECLEN X CMPX MEMSIZ BLS 1028 DEC 5 LBEQ LAC44 LDA 4TRKMAX CLRB PSHS B A AT THIS POINT THE STACK HAS THE FOLLOWING DATA ON IT S TRACKS REMAINING COUNTER 1 5 TRACKS WRITTEN COUNTER 2 5 4 5 SOURCE DRIVE NUMBER COM DRESFL LD2A4 CLRB LD2A5 INCB DEC 5 BEQ LD2AE CMPB 02 5 BNE LD2A5 LD2AE STB TMPLOC LDB 504 5 BSR LD2FC LDA FF JSR 10322 LDB 503 5 BSR LD2FF TST 5 BEQ 102 0 CLRA JSR 10322 LDB 901 5 ADDB TMPLOC STB 01 5 BRA L02 4 LD2CD BSR 10202 JMP LAC73 10202 PULS U LDA DRESFL BEQ LD2EF LDX FCBV1 CLRA LD2DD CLR X INCA CMPA FCBACT BLS 10200 LDX TXTTAB CLR 1 X JSR LAD19 CLR DRESFL LD2EF LDA DLODFL BEQ LD2FA CLR DLODFL JSR 1 019 LD2FA JMP LD2FC LDA 4502 CMPX 4 8603 LD2FF LDA 03 STD DCOPC LDA 503 5 ST
104. JUMP TABLE FOR COMMANDS FIRST TABLE 0334 VECTOR TO EXPANSION COMMAND HANDLERS ALL BUT FIRST TABLE 0335 5 NUMBER OF SECONDARY FUNCTIONS 0336 6 7 LOOKUP TABLE SECONDARY FUNCTIONS FIRST TABLE 0337 m VECTOR TO EXPANSION SECONDARY COMMAND HANDLERS ALL BUT 0338 FIRST TABLE 0339 8 9 JUMP TABLE FOR SECONDARY FUNCTIONS 0340 d 18 BYTE END OF TABLE FLAG LAST TABLE ONLY 0341 0342 0120 RMB 10 BASIC S TABLE 0343 012A RMB 10 EX BASIC S TABLE 0344 0134 RMB 10 DISC BASIC S TABLE UNUSED BY BASIC 0345 0346 USR FUNCTION VECTOR ADDRESSES BASIC ONLY 0347 013 RMB 2 USR 0 VECTOR 0348 0140 RMB 2 USR 1 0349 0142 RMB 2 USR 2 0350 0144 RMB 2 USR 3 0351 0146 RMB 2 USR 4 0352 0148 RMB 2 USR 5 0353 014A RMB 2 USR 6 0354 014 RMB 2 USR 7 0355 014 RMB 2 USR 8 0356 0150 RMB 2 USR 9 0357 0358 XXX THE ABOVE 20 BYTE USR ADDR VECTOR TABLE IS MOVED TO 0359 XXX 95F 972 BY DISC BASIC THE 20 BYTES FROM 13E 151 0360 ARE REDEFINED AS FOLLOWS 0361 0362 RMB 10 USER SPARE COMMAND INTERPRETATION TABLE SPACE 0363 FCB 0 END OF COMM INTERP TABLE FLAG 0364 RMB 9 UNUSED BY DISK BASIC 0365 0366 COMMAND INTERPRETATION TABLE VALUES 0367 BYTE BASIC EX BASIDISK BASIC 0368 0 53 BASIC TABLE 0369 1 2 AA66 A5 DISK BASIC UNRAVELLED II APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK 0370 3 4 AB67 0371 x 5 20 0372 6 7 AB1A 0373 8 9
105. LCAC6 LCADA LCAED LCAF8 LCB 1 LC806 LCB2E LCB31 LCB41 LCB4E LCB52 LCB54 LCB6B LCB76 LCB8B LCB8C LCB93 LCB97 LCBAD LCBB4 LC8C0 LC8C3 LC8CL LCBDF LCBE9 D2 C905 C932 C935 C938 C945 96 96 C973 C978 C97D C994 C99B C99D COBO C9B7 C9BE 90 C9DF CA04 CA07 CA12 CA27 CA33 CA4F CA50 CA6C CA7B CA7E 4 6 CABD CABF 6 CAED CAF8 C801 C806 CB2E CB31 CB41 CB4E CB52 CB54 CB6B CB76 CB8B CB8C CB93 CB97 CBAD C884 CBCO CBC3 CBCF CBDF CBE9 LCC15 LCC17 LCC24 LCC3A LCC40 LCC6A LCC6C LCC99 LCCBB LCCC5 LCCEB LCD08 LCD17 LCD18 LCD1B LCD24 LCD4B LCD5F LCD74 LCD81 LCD8E LCD92 LCD97 LCD98 LCDAG LCDAC LCDB LCDB8 LCDBC LCDCB LCDD LCDD5 LCDD6 LCDEC LCE14 LCE19 LCE68 LCE72 LCEB6 LCEBD LCEE9 LCEEC LCF07 LCF2A LCF5C LCF68 LCF9B LCFB3 LCFB5 LCFBB LCFDE LCFE3 LCFFA 10004 1000 CC15 CC17 CC24 CC3A CC48 CC6A CC6C CC99 CCBB CCC5 CCEB CD08 CD17 CD18 CD1B CD1E CD24 CD4B CD5F CD74 CD81 CD8E CD92 CD97 CD98 CDBS CDB8 CDBC CDCB CDDS CDD5 CDD6 CDEC CE14 CE19 CE68 CE72 CEB6 CEBD CEE9 CEEC CF07 CF2A CF5C CF68 CF9B CFB3 CFB5 CFBB CFDE CFE3 CFFA 0004 0000 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK 10013 10015 0051 10056 10059 LD 6E LD 6F LD 7F 10082 10092 LD A3 LD A7 LD B
106. LPTLCF RMB 12 PV LAST TAB ZONE LPTWID RMB 32 PV PRINTER WIDTH LPTPOS RMB PV LINE PRINTER POSITION EXECJP RMB 2 LB4AA PV JUMP ADDRESS FOR EXEC COMMAND THIS ROUTINE PICKS UP THE NEXT INPUT CHARACTER FROM BASIC THE ADDRESS OF THE NEXT BASIC BYTE TO BE INTERPRETED IS STORED AT CHARAD GETNCH INC lt CHARAD 1 PV INCREMENT LS BYTE OF INPUT POINTER BNE GETCCH PV BRANCH IF NOT ZERO NO CARRY INC lt CHARAD PV INCREMENT MS BYTE OF INPUT POINTER A3 DISK BASIC UNRAVELLED II 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240 0241 0242 0243 0244 0245 0246 0247 0248 0249 0250 0251 0252 0253 0254 0255 0256 0257 0258 0259 0260 0261 0262 0263 0264 0265 0266 0267 0268 0269 0270 0271 0272 0273 0274 0275 0276 0277 0278 0279 0280 0281 0282 0283 0284 0285 0286 0287 0288 0289 0290 0291 0292 0293 0294 0295 0 5 00 6 00 8 0 BBAC QUAD 0 00 0 00 2 0083 00 4 00 5 00 6 00 7 00 9 00 00 0 00 00 1 00 2 00 3 00 5 00 7 00 9 00 00CD 00 0001 0003 0004 0005 0006 0007 0008 0009 DA GDB 000 0 DF 00 00 1 00 2 00 5 00 6 00 6 00 7 00 7 00 8 00 9 00 00 00 DOFO 00 1 00 3 6 7E AA 1A GETCCH FCB B6 CHARAD 2 JMP VAB RMB
107. NAME FS 32 LC653 LC626 C653 C626 BAD FILE STRUCTURE F0 34 LD DA LCFFE D DA CFFE FIELD OVERFLOW SE 35 10119 10030 0119 0030 SET TO NON FIELDED STRING VF 36 1074 10657 D 4A D657 VERIFICATION ERROR ER 37 LCDCB LCFF1 CDCB WRITE OR INPUT PAST END OF RECORD There are no unconditional jump entry points for error 30 WP Write Proctected or error 33 AE file Already Exists These errors may be generated by loading a value equal to 2 error number into ACCB and then JMPing to AC46 H1 DISK BASIC UNRAVELLED II APPENDIX I ORIGIN SPECTRAL ASSOC ASCII CHART 5 03 14 99 WALTER ZYDHEK DISPLAY CHARACTER SET Inverted Inverted Inverted Inverted Inverted Inverted 00 40 18 58 30 40 ON lt gt x gt Q rS 6 B C D E F G H I M L M M 0 P Q R 5 V W 11
108. OLD GRAPHIC PAGE START AND STORE THE NEW START OF GRAPHICS RAM ADD THE OLD GRAPHIC RAM END ADDRESS AND STORE THE NEW END OF GRAPHICS RAM ACCA MSB OF START OF GRAPHIC RAM ACCB NUMBER OF FILE BUFFERS U START OF FILE BUFFERS SAVE NEW START OF GRAPHIC RAM NUMBER OF FILE BUFFERS START OF FILE BUFFERS GET CURRENT LINE NUMBER ARE WE IN DIRECT MODE YES MOVE BASIC PROGRAM MOVE NEW START OF BASIC TO ACCD SUBTRACT OLD START OF BASIC ADD OLD INPUT POINTER SAVE NEW INPUT POINTER POINT U TO OLD START OF VARIABLES SAVE NEW START OF VARIBLES COMPARE OLD START OF VARIABLES TO NEW START OF VARIABLES amp BRANCH IF OLD gt NEW I H PROGRAM IF OLD START ADDRESS lt NEW START ADDRESS PROGRAM IF OLD START ADDRESS gt NEW LD199 00 FCBLEN BLO 10208 DEC 5 BPL 10199 TSTB BEQ L01 8 INCA BEQ 10208 LDIAS BITA 01 BEQ LDIAF INCA BEQ 10208 LDIAF STA 5 LDD VARTAB SUBA GRPRAM ADDA S BLO 10208 TFR D X INCA BEQ 10208 CMPD FRETOP 5 10208 DECA SUBD VARTAB ADDD TXTTAB TFR D Y LDA 5 SUBA GRPRAM TFR A B ADDA BEGGRP STA BEGGRP ADDB ENDGRP STB ENDGRP PULS A B U STA GRPRAM STB STU FCBADR LDA CURLIN INCA BEQ LDIEF TFR Y D SUBD TXTTAB ADDD CHARAD STD CHARAD LDIEF LDU VARTAB STX VARTAB CMPU VARTAB BHI LD20B MOVE BASIC LDIFB LDA U STA X CMPU TXTTAB BNE LD1F8 STY TXTTAB CLR 1 V BRA 10218 LD208 JMP LAC44 MOVE BASIC LD20B 1
109. SAVE IT AS DEVICE NUMBER 1854 CD54 6D 00 TST FCBTYP X IS FILE OPEN 1855 CD56 10 27 D6 A1 LBEQ LA3FB FILE NOT OPEN ERROR IF NOT OPEN 1856 CD5A 39 RTS 1857 1858 LOF COMMAND 1859 CD5B 8D LOF BSR LCD3D POINT X TO FILE BUFFER 1860 C050 6 01 LDA FCBDRV X GET DRIVE NUMBER AND SAVE IT 1861 CD5F 97 EB STA DCDRV IN DSKCON VARIABLE 1862 CD61 E6 92 LDB FCBFGR X GET FIRST GRANULE OF FILE 1863 CD63 34 10 PSHS X SAVE FCB POINTER ON STACK 1864 CD65 BD CC 44 JSR LCC44 FIND TOTAL NUMBER OF GRANULES IN THIS FILE 1865 CD68 4A DECA SUBTRACT THE LAST GRANULE IN THE FILE 1866 CD69 C4 3F ANDB 3F GET NUMBER OF SECTORS USED IN LAST GRANULE 1867 CD6B 34 04 PSHS B SAVE NUMBER OF SECTORS IN LAST GRANULE ON STACK 1868 CD6D 1F 89 CONVERT TO POSITIVE 1869 CD6F 4 CLRA 2 BYTE VALUE IN ACCD 1870 070 BD C7 49 JSR LC749 MULT NUMBER OF FULL GRANULES BY 9 1871 CD73 EB ADDB 5 ADD NUMBER SECTORS IN LAST TRACK 1872 CD75 89 00 00 PROPAGATE CARRY TO MS BYTE OF ACCD 1873 CD77 35 10 PULS X GET FCB POINTER BACK 1874 CD79 34 92 PSHS A SAVE ACCA ON STACK 1875 CD7B A6 00 LDA FCBTYP X GET FILE TYPE OF THIS FCB AND 1876 CD7D 81 40 CMPA RANFIL CHECK TO SEE IF IT S A RANDOM FILE 1877 CD7F 35 92 PULS A RESTORE ACCA 1878 CD81 26 B7 BNE LCD3A IF NOT A RANDOM FILE THEN THE TOTAL NUMBER OF SECTORS IN THE FILE 1879 IS THE LENGTH OF THE FILE 1880 1881 CALCULATE LOF FOR A RANDOM FILE THE LENGTH OF A RANDOM FILE IS THE 188
110. SECONDARY TOKEN SYNTAX CHECK FOR SECONDARY TOKEN 5 TOKEN SYNTAX CHECK FOR AS TOKEN EVALUATE VARIABLE JSR LC6B8 BSR LCF75 LDX 4DNAMBF LDU V974 LDB 11 JSR LA59A LDB 4 03 STB DCOPC JMP LD5FF DO A SYNTAX CHECK FOR TO AND STRIP A FILENAME FROM BASIC LCF75 LDB 5 JSR LB26F LCF7A JMP LC887 LCF7D JSR 1 65 LDB 433 2 TST V973 LBNE LAC46 RTS WRITE COMMAND WRITE LBEQ 18958 BSR LCF93 CLR DEVNUM LCF92 RTS LCF93 BNE LCFA6 JSR LA5A5 JSR 1 406 JSR LBEQ LB958 LCFA3 JSR SYNCOMMA LCFA6 JSR 18156 LDA VALTYP BNE LCFCB JSR 18009 JSR 18516 JSR LB99F PRINT ITEM SEPARATOR TO CONSOLE OUT LCFB6 JSR LBEQ 18958 JSR LA35F TST PRTDEV BEQ LCFC7 LDA LCFC7 BSR LCFDD BRA LCFA3 PRINT A STRING TO CONSOLE OUT LCFCB BSR LCFD4 JSR LB99F BSR LCFD4 BRA LCFB6 PRINT STRING DELIMITER TO CONSOLE OUT LCFD4 JSR LA35F TST PRTDEV BNE LCF92 LCFDD JMP LA282 FIELD COMMAND FIELD JSR LC7FE CLRA CLRB PSHS X B A LCFE7 JSR BNE PULS A B X PC LCFED JSR 18738 PSHS X B AT THIS POINT THE STACK WILL HAVE THE FOLLOWING INFORMATION ON IT S FIELD LENGTH 1 2 5 RANDOM FILE BUFFER ADDRESS 3 4 5 TOTAL FIELD LENGTH 5 6 5 FCD POINTER CLRA ADDD 03 5 BLO LCFFE LDX 505 5 CMPD FCBRLN X BLS 10003 LCFFE LDB 34 2 JMP LAC46 10003 100 503 5 STD 03 5 LDD FCBBUF X LEAU 0 0 STU
111. SKIP TWO BYTES IS WRITE FLAG 1793 WRITE SECTOR SAVE READ WRITE FLAG ON STACK POINT X TO TRACK NUMBER TABLE IN RAM GET DRIVE NUMBER POINT X TO CORRECT DRIVE S TRACK BYTE GET TRACK NUMBER OF CURRENT HEAD POSITION SEND TO 1793 TRACK REGISTER COMPARE TO DESIRED TRACK BRANCH IF ON CORRECT TRACK GET TRACK DESIRED SEND TO 1793 DATA REGiSTER SAVE IN RAM TRACK IMAGE SEEK COMMAND FOR 1793 DO NOT LOAD THE HEAD AT START VERIFY DESTINATION TRACK 30 MS STEPPING RATE WAIT FOR VALID STATUS FROM 1793 WAIT TILL NOT BUSY RETURN IF TIMED OUT WAIT SOME MORE KEEP ONLY SEEK ERROR OR CRC ERROR IN ID FIELD BRANCH IF NO ERRORS HEAD ON CORRECT TRACK DISK BASIC UNRAVELLED 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 0828 D82A D82C D82E D831 D834 D837 D839 D83C D83F D841 D843 D846 D849 D84C D84E D851 D853 D855 D857 D859 D85B D85D D85F D861 D863 D866 D868 D86B D86D 0870 0873
112. SYNCOMMA TEMPO TEMPPT TEMPTR TIMOUT TIMVAL TINPTR TMPLOC TMPSTK TMPTR1 TOPRAM TRCFLG TRELFL TXTTAB UNLOAD USRADR USRJMP v40 V41 V42 V43 V44 V45 V46 V47 V48 V4A V4B 4 973 974 976 977 978 VAC VAD VAE VALTMP VARDES VARNAM VARPTR VARTAB VCB VCD VCF VD1 VD3 4 VD5 VD6 VD7 0100 FFFA FFF4 FFF2 0106 0092 B26D 00 2 0008 000F 00 7 0112 00 00 0003 0004 0005 0006 0007 ORIGIN SPECTRAL 550 REVISED 12 26 1999 WALTER ZYDHEK VD8 VD9 VDA VERBEG VERDEF VEREND VERIFY VIDRAM VOLHI VOLLOW WCOLOR WFATVL WRITE XBWMST XVEC15 XVEC17 XVEC18 XVEC3 XVEC4 XVEC8 XVEC9 ZERO 0008 0009 0 00 00 9 00 5 D74E 0400 OODF 00 0084 DISK BASIC UNRAVELLED II ALLCOL ANGLE ARYDIS ARYEND ARYTAB ATTCTR BACKUP BAKCOL BASEXT BAWMST BEGGRP BINEXT BINVAL BLKCNT BLKLEN BLKTYP BOTSTK BROMHK CASBUF CASFLG CBTPHA CBUFAD CCKSUM CFNBUF CHARAC CHARAD CHGFLG CINBFL CINCTR CINPTR CLSTSN CMP CMP1 CMPMID COEFCT COEFPT COMVEC COPY CPERTM CPULWD CSRERR CSSVAL CURLIN CURPOS CVN DA DASCFL DATEXT DATPTR DATTMP DATTXT DBUF DBUF1 DCBPT DCDRV DCNVEC DCOPC DCSTA 0085 DCTRK DEBVAL DEFDRV DEFEXT DEVCFW DEVLCF DEVNUM DEVPOS DEVWID DEXTBF DFFLEN DFLBUF DFLTYP DIMFLG DIR DIRQSV DKWMST DLBAUD DLODFL DMRGFL DNAMBF DNMISV DNMIVC DOSBAS DOSBUF DOTVAL DROTRK DRESFL DRGRAM DRIVE DRUNFL
113. Shack has not provided a SAVEM function which will allow the saving of non contiguous blocks of memory into one disk file This minor problem can be gotten around with the help of a neat utility called JOIN which is included in the Spec tral Associates Color Computer Editor Assembler ULTRA 80CC This utility will allow the concatenation of as many machine language files as the user requires into one large file LOADM will then load all of the segments into memory and the segments may overlay one another Binary data is stored on the disk as one large block proceeded by a five byte preamble The data block is followed by five more bytes which are another preamble if there is another block of data following or the five bytes are a post amble if there are no further data blocks The format for the preamble and the post amble are given below BYTE PREAMBLE POSTAMBLE g 00 Preamble flag FF Post amble flag 1 2 Length of data block Two zero bytes 3 4 Load address EXEC address 17 DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK DISK BASIC RAM VARIABLES BUFFERS Disk Basic requires a substantial amount of RAM for variables and buffer space There is not enough room in the direct page for all of the variables so Disk Basic grabs a chunk of RAM immediately above the video display RAM starting at 600 for its own use It also uses nine bytes in the direct page which leaves a total of 1
114. TO BE PROCESSED OUTPUT FILE FULL SECTOR FLAG IF IT IS 1 WHEN THE FILE IS CLOSED IT MEANS 256 BYTES OF THE LAST SECTOR HAVE BEEN USED FCBPOS EQU 6 CURRENT PRINT POSITION FCBREC EQU 7 CURRENT RECORD NUMBER HOW MANY WHOLE SECTORS HAVE BEEN INPUT OR OUTPUT TO A FILE 9 TO 15 UNUSED FCBRLN EQU 16 CACHE FLAG 00 EMPTY FF CACHE FULL FCBCDT EQU 17 CACHE DATA BYTE ORIGIN SPECTRAL ASSOC 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 0097 0098 0099 0100 0101 0102 0103 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0181 0182 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 COBB C002 C004 C006 C008 COBB 000 C010 C012 C015 C018 C01 C01D 020 022 024 026 028 02 2 C031 C034 C037 C939 C03C CO3E C040 C042 C045 C047 C04D C050 052 055 057 059 CO5A C 5C CO5F C062 C064 C067 C06 C06D CO6F C072 C075 C078 07 7 C081 C084 C088 C088 Cg8D C090 C992 C896 099 C098 C09L 2 4 COAG
115. TO POINT TO SYNTAX ERROR CLEAR BYTE 0 OF USER TABLE DOESN T EXIST FLAG SET NUMBER OF SECONDARY USER TOKENS TO ZERO SAVE NEW POINTERS TO EXBAS COMMAND AND SECONDARY COMMAND INTERPRETATION ROUTINES POINT U TO 1ST RAM VECTOR OP CODE OF JMP INSTRUCTION SET 1ST BYTE OF GET PUT RAM VECTOR TO JMP SET 1ST BYTE OF RAM VECTOR TO JMP GET RAM VECTOR FROM ROM STORE IT IN RAM COMPARE TO END OF ROM VALUES BRANCH IF NOT ALL VECTORS MOVED GET ROM VALUE OF GET PUT RAM VECTOR SAVE IT IN RAM GET DISK COMMAND INTERPRETATION LOOP RAM VECTOR SAVE IN RAM VECTOR TABLE POINT X TO START OF DISK BASIC USR VECTORS SAVE START ADDRESS IN USRADR POINT U TO ADDRESS OF FUNCTION CALL ERROR 10 USER VECTORS TO INITIALIZE SET USR VECTOR TO FC ERROR DECREMENT USR VECTOR COUNTER BRANCH IN NOT DONE WITH ALL 10 VECTORS GET ADDRESS OF NMI SERVICING ROUTINE SAVE IT IN NMI VECTOR OP CODE OF JMP MAKE THE NMI VECTOR A JMP GET ADDRESS OF DISK BASIC IRQ SERVICING ROUTINE SAVE IT IN IRQVEC INITIALIZE WRITE FAT TO DISK TRIGGER VALUE INITIALIZE THE ACTIVE FILE COUNTER OF EACH FAT TO ZERO THIS WILL CAUSE THE FATS TO THINK THERE ARE NO ACTIVE FILES GET THE STARTING ADDRESS OF THE RANDOM FILE BUFFER FREE AREA AND DAVE IT AS THE START ADDRESS OF FREE RAM FOR RANDOM FILE BUFFERS SAVE 256 BYTES FOR RANDOM FILE BUFFERS INITIALLY SAVE START ADDRESS OF FCBS ADD ONE AND SAVE THE STARTING ADDRESS OF FCB1 CLEAR THE FIRST B
116. TO RETRIEVE OR WRITE DATA 0494 BEFORE IT GIVES UP AND ISSUES ERROR 0495 0496 0989 DFLBUF RMB SECLEN INITIALIZED TO SECLEN BY DISKBAS 0497 0498 RANDOM FILE RESERVED AREA 0499 0500 CONTROL BLOCKS AND BUFFERS 0501 0502 GRAPHIC PAGE RESERVED AREA 0503 0504 BASIC PROGRAM 0505 0506 VARIABLE STORAGE AREA 0507 0508 ARRAY STORAGE AREA 0509 0510 0511 FREE MEMORY 0512 0513 0514 STACK 0515 0516 STRING SPACE 0517 A7 DISK BASIC UNRAVELLED II APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK 0518 USER PROGRAM RESERVED AREA 0519 0520 END OF RAM 0521 0522 8000 ORG 8000 0523 0524 8000 RMB 2000 EXTENDED BASIC ROM 0525 000 RMB 52000 COLOR BASIC ROM 0526 COBB ROMPAK EQU 0527 COBB DOSBAS RMB 2000 DISK BASIC ROM ENHANCED BASIC INIT CODE 0528 E000 RMB 1F00 ENHANCED BASIC 0529 0530 START OF ADDITIONAL VARIABLES USED BY SUPER EXTENDED BASIC 0531 FE00 H CRSLOC RMB 2 CURRENT LOCATION OF CURSOR 0532 FE02 H CURSX RMB X POSITION OF CURSOR 0533 H CURSY RMB Y POSITION OF CURSOR 0534 FE04 H COLUMN RMB COLUMNS ON HI RES ALPHA SCREEN 0535 5 ROW RMB ROWS ON HI RES ALPHA SCREEN 0536 FE06 H DISPEN RMB 2 END OF HI RES DISPLAY SCREEN 0537 8 H CRSATT CURRENT CURSOR S ATTRIBUTES 0538 FE09 RMB UNUSED 0539 H FCOLOR RMB FOREGROUND COLOR 0540 FEOB H BCOLOR RMB BACKGROUND COLOR 0541 FEOC H ONBRK RMB 2 ON BRK GOTO LINE NUMBER 0542
117. TST FCBTYP X IS FILE OPEN LBEQ LA3FB FILE NOT OPEN ERROR IF NOT OPEN RTS LOF LOF BSR LCE19 POINT X TO FILE BUFFER LDA FCBDRV X GET DRIVE NUMBER AND SAVE IT STA DCDRV IN DSKCON VARIABLE LDB FCBFGR X GET FIRST GRANULE OF FILE PSHS X SAVE FCB POINTER ON STACK JSR LCDIE FIND TOTAL NUMBER OF GRANULES IN THIS FILE DECA SUBTRACT THE LAST GRANULE IN THE FILE ANDB 3F GET NUMBER OF SECTORS USED IN LAST GRANULE PSHS B SAVE NUMBER OF SECTORS IN LAST GRANULE ON STACK CONVERT TO POSITIVE CLRA 2 BYTE VALUE IN ACCD JSR 16779 MULT NUMBER OF FULL GRANULES BY 9 ADDB 5 ADD NUMBER SECTORS IN LAST TRACK 00 PROPAGATE CARRY TO MS BYTE OF ACCD PULS X GET FCB POINTER BACK PSHS A SAVE ACCA ON STACK LDA FCBTYP X GET FILE TYPE OF THIS FCB AND CMPA RANFIL CHECK TO SEE IF IT S A RANDOM FILE PULS A RESTORE ACCA BNE LCE14 IF NOT A RANDOM FILE THEN THE TOTAL NUMBER OF SECTORS IN THE FILE IS THE LENGTH OF THE FILE CALCULATE LOF FOR A RANDOM FILE THE LENGTH OF A RANDOM FILE IS THE NUMBER OF RECORDS IN THE FILE PSHS X SAVE FCB POINTER ON STACK SUBD ZERO SUBTRACT ZERO FROM ACCD NUMBER OF SECTORS BEQ LCE68 BRANCH IF ZERO SECTORS SUBD 450001 SUBTRACT ONE SECTOR THE LAST SECTOR MAY NOT BE 1007 USED LCE68 BSR 14 PUT ACCD INTO LDB FPQEXP GET EXPONENT BEQ LCE72 BRANCH IF FPAQ 0 ADDB 4508 ADD 8 TO EXPONENT MULTIPLY FPAQ BY STB FPOEXP 256 BYTES SECTOR AND SAV
118. VAC RMB VAD RMB VAE RMB EXTENDED BASIC VARIABLES TRCFLG RMB USRADR RMB 2 FORCOL RMB BAKCOL RMB WCOLOR RMB ALLCOL RMB PMODE RMB ENDGRP RMB 2 HORBYT RMB BEGGRP RMB 2 GRPRAM RMB HORBEG RMB 2 VERBEG RMB 2 CSSYAL RMB SETFLG RMB HOREND RMB 2 VEREND RMB 2 HORDEF RMB 2 VERDEF RMB 2 EXTENDED VCB RMB 2 VCD RMB 2 VCF RMB 2 VD1 RMB 2 VD3 RMB 4 RMB VD5 RMB VD6 RMB VD7 RMB VD8 RMB VD9 RMB VDA RMB CHGFLG RMB TMPSTK RMB 2 OCTAVE RMB VOLHI RMB VOLLOW RMB NOTELN RMB TEMPO RMB PLYTMR RMB 2 DOTYAL RMB HRMODE EQU DLBAUD RMB HRWIDTH EQU TIMOUT RMB ANGLE RMB SCALE RMB DSKCON VARIABLES DCOPC RMB DCDRV RMB DCTRK RMB DSEC RMB DCBPT RMB 2 DCSTA RMB FCBTMP RMB 2 RMB 3 APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK PV OP CODE OF LDA EXTENDED PV THESE 2 BYTES CONTAIN ADDRESS OF THE CURRENT CHARACTER WHICH THE BASIC INTERPRETER IS PROCESSING JUMP BACK INTO THE BASIC RUM LOW ORDER FOUR BYTES OF THE PRODUCT OF A FLOATING POINT MULTIPLICATION THESE BYTES ARE USE AS RANDOM DATA BY THE RND STATEMENT TRACE FLAG 0FF ELSE ON ADDRESS OF THE START OF USR VECTORS FOREGROUND COLOR BACKGROUND COLOR WORKING COLOR BEING USED BY EX BASIC ALL PIXELS IN THIS BYTE SET TO COLOR OF VB3 PMODE S MODE ARGUMENT END OF CURRENT GRAPHIC PAGE NUMBER OF BYTES HORIZONTAL GRAPHIC LINE START OF CURRENT GRAPHIC PAGE PV START OF GRAPHIC RAM MS BYTE DV PV HORIZ COORD START POINT
119. VD8 JSR LD3AD LDX 508 5 STX DFLTYP LDX SECLEN STX DFFLEN LDA R LDB FCBACT INCB JSR LC48D LDX FCBTMP LDD SECLEN STD FCBLST X LDB 6 5 BEQ 10404 LDB VD8 ANDB 507 5 BEQ LD4BA LDD 502 5 ADDB 506 5 ADCA 00 JSR LC2E6 LDABA LDX FCBTMP LDU 504 5 STU FCBREC X LDB 506 5 LDU ARYEND 10464 PSHS U B LDX STU FCBBUF X JSR LC2EA INC 901 5 PULS B U DECB BNE LD4C4 LD4D4 LDX FCBTMP LDU DFLBUF STU FCBBUF X LDB VD8 ANDB 507 5 BEQ LD4EA CLR 07 5 LDD 10 5 ORA 80 STD FCBLST X LD4EA JMP 1 6 DSKI COMMAND DSKI 10527 BSR 1051 PSHS X BSR 1051 PSHS X LDB 4 02 JSR LD58F LDU DBUFG 128 PULS X 10508 LDU DBUFO PULS X 10508 PSHS U X LDB 128 JSR LB50F LEAU X PULS X STB X STU 02 X PULS X 10519 JMP 1 59 10510 JSR SYNCOMMA LDX L8357 10553 10524 JMP LB146 EVALUATE DRIVE TRACK AND SECTOR NUMBERS 10527 JSR EVALEXPB CMPB 03 BHI LD54A PSHS B JSR 18738 CMPB TRKMAX 1 BHI LD54A PSHS B JSR 18738 B30 SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION SECTOR NUMBER DISK BASIC UNRAVELLED II 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941
120. WASTED BYTES B36 DISK BASIC UNRAVELLED II 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0092 0093 0094 0095 0096 0g 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1 32 00 01 06 00 08 OB 0 00 BE 00 01 02 03 04 06 07 09 OB 00 OF 12 13 15 17 19 00 01 02 03 04 06 07 10 11 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 DHITOK EQU 0 HIGHEST 1 0 DISK TOKEN CYEAR EQU 2 FILE ALLOCATION TABLE FORMAT THE FILE ALLOCATION TABLE FAT CONTAINS THE STATUS OF THE GRANULES ON A DISKETTE THE FAT CONTAINS 6 CONTROL BYTES FOLLOWED BY 68 DATA BYTES ONE PER GRANULE ONLY THE FIRST TWO OF THE SIX CONTROL BYTES ARE USED A VALUE OF FF IS SAVED IN UNALLOCATED GRANULES IF BITS 6 amp 7 OF THE DATA BYTE ARE SET THE GRANULE IS THE LAST GRANULE IN A FIL
121. X GET RECORD LENGTH 1464 86 AE BB LDX FCBBUF X POINT X TO RANDOM FILE BUFFER 1465 CA88 31 8B LEAY D X POINT Y TO END OF RANDOM FILE BUFFER 1466 34 36 PSHS Y X B A SAVE POINTERS ON STACK 1467 CA8C DE 1B LDU VARTAB GET START OF VARIABLES 1468 11 93 10 LCA8E CMPU ARYTAB COMPARE TO START OF ARRAYS 1469 CA91 27 BE BEQ LC 1 BRANCH IF ALL VARIABLES CHECKED 1470 93 A6 41 LDA 01 U GET 2ND BYTE OF VARIABLE NAME 1471 CA95 33 42 LEAU 502 0 MOVE POINTER TO START OF DESCRIPTOR 1472 CA97 2A 02 BPL LCA9B BRANCH IF VARIABLE NUMERIC 1473 CA99 8D 28 BSR LCAC3 ADJUST STRING VARIABLE IF IN RANDOM FILE BUFFER 1474 CA9B 33 45 LCA9B LEAU 05 U MOVE POINTER TO NEXT VARIABLE 1475 CA9D 20 EF BRA LCA8E PROCESS ANOTHER VARIABLE 1476 CA9F 35 40 LCA9F PULS U GET ADDRESS OF NEXT ARRAY TO U 1477 1 11 93 1F LCAA1 CMPU ARYEND COMPARE TO END OF ARRAYS 1478 27 BEQ LCAEQ BRANCH IF END OF ARRAYS 1479 CAA6 30 0 0 SAVE ARRAY START ACCD ADD OFFSET 1480 CAA8 42 ADDD 502 0 TO NEXT ARRAY AND SAVE ADDRESS OF 1481 CAAA 34 06 PSHS B A NEXT ARRAY ON THE STACK 1482 CAAC A6 41 LDA 01 0 GET 2ND LETTER OF VARIABLE NAME 1483 CAAE 2A EF BPL LCA9F BRANCH IF NUMERIC 1484 CABO E6 44 LDB 04 U GET THE NUMBER OF DIMENSIONS 1485 CAB2 58 ASLB X2 2 BYTES PER DIMENSION 1486 CAB3 CB 05 ADDB 05 5 BYTES CONSTANT PER ARRAY DESCRIPTOR 1487 5 4 CLRA CLEAR MSB OF OFFSET ONLY 125 DIMENSIONS ALLOWED
122. ZERO JSR BEQ LCFDE JSR JSR 18730 STX VD3 JSR LA5C7 GET PREAMBLE POSTAMBLE JSR LCDBC PSHS A BSR 10013 TFR D Y BSR 10013 ADDD VD3 STD TFR D X 5 1 4420 5 JSR 16564 LDB CINBFL BEQ 10004 JMP LC352 STA X CMPA X BEQ 10000 JMP 10709 LEAY 1 Y BNE BRA BSR 10015 JSR LCDBC EXG A B RTS LDX CHARAD PSHS X 10056 LDA DCDRV PSHS A B23 READ A BYTE SAVE IT IN ACCB GET A CHARACTER FROM INPUT BUFFER RETURN IT IN ACCA SWAP SAVE CURRENT INPUT POINTER ON THE STACK GET FILENAME OF SOURCE FILE SAVE DRIVE NUMBER ON THE STACK DISK BASIC UNRAVELLED II 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 0025 0027 0029 002 D 2F 0031 0033 0035 0037 D 3A D 3D D03F 0042 0045 0047 004 004 0051 0053 0056 0059 005 0056 0061 0065 0066 006 006 006 DO
123. is the last granule in a file s granule chain The low order four bits will contain the number of sectors in the last granule which the file uses Even though a file may not use all of the sectors in the last granule in the chain no other file may use the sectors Disk space is not allocated on a sector basis it is allocated on a granule basis and the granule may not be broken down The smallest one byte file DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK will still require a full granule to be allocated in order to store the file Granules are allocated in such a manner that will cause them to be relatively uniformly spread around the disk This will lessen wear on the disk by not always allocating certain granules so that the disk drive head will not pass over certain sections of the disk too often This is a common method used by a DOS in order to increase the life of a disk by spreading out the wear over as large a surface as possible which could not be done if the granules were allocated on a strictly next in line numerical basis 10 DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK THE DIRECTORY The directory is used by the DOS to keep track of how many files are stored on a disk Track 17 is reserved for the directory and the file allocation table FAT The FAT resides on sector 2 and the directory occupies s
124. loaded with the number of bytes in the last sector of the file A B X U C538 C50B INITITALIZE FCB this is the same as initialize FCB for input except that the number of bytes in the last sector is not written into the directory A B X U C567 C53A SET UP DIRECTORY ENTRY scan the directory for the first unused entry and open a file for the infor mation contained in DNAMBF DFLTYP and DASCFL The first unused directory entry will be allocated to the file as will the first unused granule A C5C4 C597 DISK CONSOLE IM get a byte from the already OPENed disk file specified by DEVNUM Return the byte in ACCA ALL C68C C65F SEARCH DIRECTORY search the directory for the filename and extension located in DNAMBF Set the variables V973 V978 accordingly ALL C6F5 C6C8 KILL FILE kill the file whose name is in DNAMBF A B X U 7 2 FREE FILE GRANULES enter with the number of the first granule in a file in ACCB Free set to FF all of the granules in that file and save the new FAT on the disk X C744 C714 SET X TO FILE BUFFER enter with ACCB containing the file number Return with X pointing to the correct FCB and the flags set according to the file type X C755 C725 SET X TO FAT point X to the FAT RAM image for thE drive number stored in DCDRV A B C763 C733 CONVERT GRANULE TO TRACK amp SECTOR enter with X pointing to an FCB The current granule number FCBCGR will be converted to the equivalent track and s
125. loop of grab a byte from RAM give it to the FDC and loop back to get another byte The analogous loop for getting data will also work The only problem is how to get out of this loop This problem is solved with software when an FDC command such as WRITE SECTOR or READ SECTOR is completed an interrupt INTRQ is generated by the FDC The Color Computer connects this INTFQ signal to the Non Maskable Interrupt NMI pin of the 6809 This means that whenever FDC command except the 00 FORCE INTERRUPT is completed an NMI will be generated The computer will now be able to tell that an FDC command is over all that is left is for the computer to know where to go when the command is finished This is accomplished by storing a jump vector DNMIVC in the disk RAM prior to entering the FDC data transfer loop Another byte in disk RAM is used as a flag NMIFLG to indicate that the NMI jump vector should be used If the NMIFLG is not equal to zero and an NMI is received by the 6809 Disk Basic will cause the NMIFLG to be reset and control will be transferred to the address in DNMIVC It is exactly this method which is used to exit from the FDC data transfer routines The FDC has four registers which are used to communicate with the computer Their functions are described below ADDRESS READ WRITE FF48 STATUS REGISTER COMMAND REGISTER FF49 TRACK REGISTER TRACK REGISTER FFAA SECTOR REGISTER SECTOR REGISTER FFAB DATA REGISTER DATA REGISTER
126. means that there is a difference in the ROMs at that particular point DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK DESCRIPTION OF DISK BASIC Disk Basic will allow the Color Computer to communicate with a floppy disk drive in order to rapidly store large amounts of data on a non volatile medium Disk Basic is different from Extended Basic in the manner that Extended Basic provided the user with a package of graphics commands AND several useful non graphics commands whereas Disk Basic provides ONLY disk oriented commands with no additional commands there is approximately 1 5K of wasted space where something else could have been provided Accordingly any discussion of Disk Basic will center around only the TRS 80 Color Computer s DOS Disk Operating System As computers have evolved over the years one of the biggest problems faced was the storage of the large amounts of data and programs which the computer must have access to The amount of random access storage available to the user was relatively small compared to the total amount of storage required Random access memory is very fast fairly expensive and volatile it is lost when the power is turned off The first method of mass storage used was magnetic tape which was non volatile and cheap but slow Then came the floppy disk which was non volatile not quite so cheap and faster than magnetic tape Presently the floppy di
127. off 1 motors on Write pre compensation flag no pre comp 1 Density flag single density 1 double density Drive select 3 Halt flag halt disabled 1 halt enabled NOOB SFF40 Control Functions The drive select flags directly control which drive will communicate with the computer and the motor enable flag will enable or disable the motors of all of the drives The density flag indicates to the FDC whether the data will be stored onto the diskette in single or double density Write pre compensation is used to correct the problem on a double density formatted disk of certain bit patterns causing a bit to shift from its nominal write position and appear at the read data separator early or late Write pre compensation rectifies this problem during disk writes by shifting such a bit from its nominal position in the opposite direction to its known read shift Write precomp is usually necessary only for data written on the tracks on the inner half of the disk The tracks on which write pre compensation should be enabled vary from manufacturer and the number of the track at which write precomp is enabled in the Tandy disk is 22 Write precomp is on for tracks with a number greater than 22 The halt flag is used to enable the FDC board to halt the 6809 This is used to enable the Color Computer to operate the disk drives in double density mode at the low 89 MHz clock speed at which the Color Computer 13 DI
128. presented here If further detailed information concerning the operation of the FDC is required the reader is referred to the 1793 data sheet published by the Western Digital Corp Only those functions of the 1793 which may be accessed by software the Color Computer will be discussed The FDC is responsible for controlling the transference of data between the computer and the disk drive There are many different disk drives manufactured by different companies and each drive has its own peculiarities which require the FDC to be set up or used in a slightly different manner The Color Computer Disk Controller board which you plug into the cartridge slot provides most of the support and set up functions which the FDC requires and an eight bit latch is used to store the FDC functions which are software programmable and those disk drive functions which must be controlled directly by the computer This control latch is located at FF48 and is a write only latch which means that data may only be written into the latch no provision has been given to read the contents of the latch For this reason the DOS has reserved a byte in the Disk RAM DRGRAM which is an image of the contents of so that the system software will know the status of the control latch at any time Listed below are the functions which may be controlled by DSKREG FF4 bit Description Drive select 0 Drive select 1 Drive select 2 Drive motor enable motors
129. the CoCo world was just a memory In the last 2 Years my love for the CoCo has re kindled I have been partially content to use a CoCo Emulator for my PC I tried the CoCo 2 Emulator by Jeff Vavasour This was OK but a lot was left out I then purchased the CoCo 3 Emulator Much better but would not use Double Sided Disks Although it did have a Virtual Hard Drive for use in 05 9 I then wanted to better the CoCo Emulator add use of PC hardware Add Double Sided Disk functionality and even make it Windows Native instead of a Dos Box Unfortunately I could not get the source code for the CoCo 3 Emulator I then turned to Paul Burgin s Dragon 2 Coco 2 Emulator This had source code available and with a small 20 00 donation was able to get the source code to additional portions of his program I have tinkered with it but came to understand that I needed more info on the CoCo I have looked all over the net and found quite a lot of useful information but what I really needed was the Unravelled Series I was able to find someone that had Extended Basic Unravelled and Disk Basic Unravelled He sent them to me for free And a friend of mine had Super Extended Basic Unravelled A copy I gave him years ago Unfortunately the books are not in the best of shape and the type is hard to read and with so many people looking for the books I decided to re do them in Electronic format I ask everyone that obtains copies of this electronic docume
130. this free ROM space be permanently allocated by any user since the Disk Basic ROMs in the Dragon computer a British clone of the Color Com puter use the entire 8K ROM space and have added several new disk BASIC commands This means that the commands are also probably available to Radio Shack and version 1 2 of the BASIC ROM which may contain some of these commands will be coming along sometime The new revisions of the Color Basic and Extended Basic ROMs kept the majority of the code in the same position in the ROM In the case of the Disk Basic revisions however no effort was made to keep the code in the same position There are two reasons for this the first is that there were so many changes that it would have been very difficult to maintain the position and secondly there was 2K of additional ROM space available so why try to maintain the position The total positional difference between the two versions makes it very difficult to have one assembly listing which owners of either Disk Basic ROM may use To solve this problem an assembly listing of both versions is contained in the book The 1 1 version will be the most useful since it has had most of the bugs which were in the 1 0 version corrected The complete memory map will not be given for the 1 0 version since the memory maps for both versions of the ROM are identical DISK BASIC UNRAVELLED II HOW TO USE THIS BOOK ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK HOW TO U
131. 0 65 25 6B D3 00 C7 C7 06 65 44 84 93 98 80 F4 C7 84 18 E4 gD 62 64 62 06 E8 E8 C7 E9 FF 00 FF 00 D8 58 8C 5 74 90 76 1 79 01 AD 59 9D 55 F8 24 19 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 JSR JSR LA5C7 DVEC7 COUNT THE NUMBER OF SECTORS WORTH OF FREE RAM SYNTAX ERROR IF MORE CHARACTERS ON LINE CLOSE ALL FILES AVAILABLE POINT X ONE SECTOR LENGTH DOWN FROM THE TOP OF STACK OM ERROR IF NOT AT LEAST ONE FULL SECTOR OF FREE RAM PUT SOURCE DATA INTO DNAMBF AND DSKCON POINT X TO DIRECTORY RAM IMAGE OF FOUND FILE GET NUMBER OF BYTES IN LAST SECTOR AND MASK OFF LAST GRANULE FLAG BITS AND SAVE THE NUMBER OF SECTORS IN LAST GRANULE ON STACK ADD THE NUMBER OF SECTORS IN THE LAST INITIALIZE SECTOR AND RECORD COUNTERS ON THE STACK CLR 5 CLEAR A SECTOR COUNTER ON THE STACK LEAX SECLEN S LD3DC INC 5 INCREMENT SECTOR COUNTER LEAX SECLEN X DECREMENT X BY ONE SECTOR CMPX ARYEND COMPARE TO TOP OF ARRAYS BHS LD3DC BRANCH IF NOT AT BOTTOM OF FREE RAM DEC 5 DECREMENT SECTOR COUNTER LBEQ LAC44 LEAX 14 S POINT X TO START OF SOURCE DATA BSR LD3AD JSR LC68C SCAN DIRECTORY FOR A MATCH JSR LC6E5 NE ERROR IF MATCH NOT FOUND LDX V974 LDU DIRLST X LDX DIRTYP X SOURCE FILE TYPE AND ASCII FLAG PSHS U X AND SAVE THEM ON THE STACK JSR 1679 GET VALID FAT DATA LDB V976 GET NUMBER OF FIRST GRANULE IN FILE JSR LCD1E GET
132. 00 TXTTAB STY TXTTAB CLR 1 V LD212 10 U STA Y CMPY VARTAB BNE 10212 CLOSE ALL FCBS AND LD21B 100 FCBV1 LDX FCBADR CLRB 10222 STX CLR FCBTYP X LEAX FCBLEN X INCB CMPB FCBACT BLS 10222 JMP L96CB UNLOAD COMMAND UNLOAD BSR LD24F CLRB 10236 JSR LC749 BEQ 10249 LDA FCBDRV X CMPA DCDRV BNE 10249 PSHS B JSR 1 06 PULS B B26 GET A BYTE MOVE 1T AT START OF BASIC PROGRAM NO STORE NEW START OF BASIC PROGRAM RESET START OF PROGRAM FLAG CLOSE ALL FILES OUT OF MEMORY ERROR START ADDRESS POINT U TO OLD START OF BASIC SAVE NEW START OF BASIC RESET START OF BASIC FLAG GET A BYTE MOVE IT AT START OF VARIABLES NO MOVE ANOTHER BYTE RECALCULATE FCB START ADDRESSES POINT U TO FILE BUFFER POINTERS POINT X TO START OF BUFFERS RESET FILE COUNTER STORE FILE ADDRESS IN VECTOR TABLE RESET FILE TYPE TO CLOSED GO TO NEXT FCB INCREMENT FILE COUNTER CLOSE ALL ACTIVE BUFFERS AND SYSTEM FCB BRANCH IF NOT DONE READJUST LINE NUMBERS ETC GET DRIVE NUMBER CLEAR FILE COUNTER INCREMENT FILE COUNTER POINT X TO FCB BRANCH IF FILE NOT OPEN CHECK DRIVE NUMBER DOES IT MATCH THE UNLOAD DRIVE NUMBER NO MATCH DO NOT CLOSE THE FILE SAVE FILE COUNTER ON THE STACK CLOSE FCB RESTORE FILE COUNTER DISK BASIC UNRAVELLED II 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 25
133. 01 C7 B9 11 EC EA 03 06 05 40 5 40 84 38 44 10 08 B9 03 B9 38 00 92 38 BD 2A E4 42 c 1F gD 21 89 BD B9 18 88 07 5 ED 12 A4 A2 B9 C7 06 44 22 C4 84 6F 5E E4 25 8F Cg 7C 62 6D 58 02 00 FF 49 A2 A2 58 20 00 82 25 9 05 69 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 JSR 16725 ABX LEAU FATCON X LDA CMPA 09 BLO LCBC4 CLR FCBSEC Y JSR 1 78 STA FCBCGR Y LCBC3 8AC LCBCA 0 STA JSR LC57C PULS Y U PULS A B X PC DIR COMMAND DIR JSR 10162 JSR 1676 JSR 18958 LDD 4 1102 STA DCTRK STB DCOPC LDB 4 03 READ A DIRECTORY SECTOR INTO THE 1 0 BUFFER LCBE STB 5 LDX DBUFG STX JSR LD5FF SEND DIRECTORY INFORMATION TO CONSOLE OUT LCBEB PULS JSR LA549 PSHS U LDA DIRNAM X BEQ LCC2E COMA BEQ LCC3D PSHS X LDB 4 08 JSR LB9A2 BSR LCC41 LDB 4 03 JSR 1 9 2 BSR LCC41 LDB CMPB 10 BHS LCC11 BSR LCC41 LCC11 CLRA JSR LBDCC BSR LCC41 LDX 5 1 ADDA DIRASC X BSR LCC3E LDB DIRGRN X BSR LCC44 TFR A B CLRA JSR LBDCC JSR 18958 PULS X LCC2E LEAX DIRLEN X CMPX DBUFO SECLEN BLO LCBEB LDB DSEC INCB CMPB SECMAX BLS LCBEI LCC3D RTS JSR LA282 JMP L89M POINT X TO PROPER ALLOCATION TABLE ADD THE GRANULE NUMBER TO FAT PO
134. 01 5 LDB FF JSR LB26F LDB 7 JSR LB26F JSR 18357 JSR 18146 C23 TM ERROR IF NUMERIC VARIABLE DISK BASIC UNRAVELLED II 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 0010 D01F 0021 0023 0025 0026 0027 0029 002 02 0031 0033 0036 0038 0038 0030 0042 0044 0047 004 004 004 0050 0052 0054 0056 0058 0059 0058 0050 05 0061 0063 0065 0067 0069 0068 0060 006 0070 0071 0073 0075 0077 0079 0078 007 0080 0083 0086 0089 0088 0086 0090 0092 0094 0096 0099 0098 009 00 1 D9A3 0 5 D A8 D AB D AE 00 0 0083 0085 0087 DOBA D BC D BE DOCO D C3 D0C5 00 7 00 9 35 E7 EF 20 86 4F 34 BD BD 34 AE 8C 25 BC 25 C6 7E C6 BD BD 35 A6 27 34 C6 EE E7 4A 26 E6 27 1 25 E6 6F EE 6D 27 34 4F 50 82 89 33 35 7E 35 BD FC 83 34 F6 34 9D 81 27 BD C1 18
135. 0244 C15F 0245 C168 0246 166 0247 C16C 0248 C172 0249 C178 0250 17 0251 0252 0253 0254 17 0255 C182 0256 187 0257 C18C 0258 C191 0259 C195 0260 C199 0261 C19D 0262 1 2 0263 C1A8 0264 1 0265 1 0 0266 1 5 0267 0268 C1C1 0269 C1C7 0270 C1C 0271 C101 0272 C106 0273 0274 0275 0276 C1DB 0277 C1DD 0278 CIDF 9279 0280 C1E3 0281 1 5 0282 1 7 0283 1 9 0284 0285 1 0286 C1EF 0287 0288 8E BD 8E 9F 7E 12 8D BD 7E 7F 7F 7F 7F 86 B7 1E 1E B6 39 13 C1 2 06 C2 C2 C4 CB C8 8E C6 CD C9 44 58 44 52 43 gD 43 47 29 32 20 4E gD 55 4c 45 20 53 gD 44 44 46 46 4B 4c 4c 4D 52 52 53 57 56 55 44 42 43 44 44 cc CE Dg 01 C6 CA 01 CA 00 01 C9 00 07 C1 B9 72 06 01 80 09 09 09 FF 00 FF 88 88 FF 7F 20 01 36 26 4 1 90 B7 F6 90 49 54 20 20 20 4F 48 20 42 44 4E 49 20 4D 4F gD 49 52 49 49 49 4F 53 45 45 53 41 52 45 4E 53 41 4F 53 53 A9 C5 BC 5C EF 48 02 39 1 01 EQ 66 25 9C 4 E2 E5 82 85 86 40 48 48 C8 C5 CA C6 53 45 43 42 31 50 54 31 59 59 44 43 46 49 46 02 49 45 4 4 41 45 52 45 56 49 52 4C 4B 43 50 48 48 38 8 38 5B 36 B7 48 4E 4F 41
136. 04 4 62 40 01 4 26 96 62 Bl B6 04 5 2 02 06 6F B2 C2 C8 01 09 01 5 08 B2 B3 52 09 27 5 06 02 C7 26 1 C7 C6 04 10 02 49 1F C6 C7 09 OB 09 60 C5 C7 00 1 02 00 4 4F 1A 09 OF C6 9 09 09 09 7C 48 4 52 06 44 26 E4 09 06 09 06 B3 05 C4 56 4 2 1 60 94 FF 57 00 60 E6 7C EF E7 C7 19 1 AB 6D 5F B8 D7 74 57 FA 25 73 CF 73 77 74 78 El 4A 48 7C 09 LDU FCBTMP LDA 08 BEQ LC419 STA FCBFLG U STX 2 5 LC419 LDX FCBSOF U LEAX 01 X CLRB LDU 5 LBNE LC2E8 PULS A B X PC OPEN RAM HOOK DVEC LEAS 02 S JSR 18156 JSR LB6A4 PSHS B JSR LA5A2 TSTB LBLE LA603 PULS A PSHS B A CLR DEVNUM JSR LDX 4DATEXT JSR 1 88 LDD 1FF STD DFLTYP LDX SECLEN JSR BEQ LC45C JSR SYNCOMMA JSR LB3E6 LDX 2 LC45C STX DFFLEN LBEQ LB44A JSR LA5C7 PULS A B OPEN DISK FILE FOR READ OR WRITE LC468 PSHS A JSR LC719 LBNE LA61C STX FCBTMP JSR LC76D JSR LC65L PULS B LDA INPFIL PSHS A CMPB I BNE LC4 2 OPEN A SEQUENTIAL FILE FOR INPUT JSR LC6 8 JSR LC7D7 LDX V974 LDD DIRTYP X STD DFLTYP BSR LC500 JSR LC5FA LC496 JSR LC725 FAT0 X LDX FCBTMP PULS A STA FCBTYP X RTS LC4A2 ASL 5 CMPB 0 BNE 1 4 2 OPEN A SEQUENTIAL FILE FOR OUTPUT TST 973 BEQ LC48C J
137. 0543 0544 0545 0546 0547 0548 0549 0550 0551 0552 0553 0554 0555 0556 0557 0558 0559 0560 0561 0562 0563 0564 0565 0566 0567 0568 0569 0570 0571 0572 0573 0574 0575 0576 C363 C366 C368 C36B C36D C36F C371 C372 C374 C376 C379 C37B C37D C37F C381 C383 C385 C387 C389 C38B C38D C38F C391 C393 C395 C397 C399 C39B C39E 5 C3A8 C3AA C3AC C3AD C3AE C3AF C3B2 C3B4 C3B6 C3B9 C3BB C3BD C3BF C3C1 C3C3 C3C5 C3C8 C3CB C3CD C3CF C3D1 C3D4 C3D6 C3D8 C3D9 C3DB C3DD C3DF CIEL C3E3 C3E5 C3E8 C3EA C3EC C3ED C3EF C3F1 C3F4 C3F6 C3F8 C3FC C400 C402 C405 C407 4 C40C C40L C410 C412 C414 C416 C418 7E 34 BD 1F 35 E7 4A 26 34 BD 35 32 DE E7 86 7 6 81 25 84 Al 24 96 27 6 8A 7 BD AE 8C 26 AC 27 86 21 4F 5F ED C6 AE 8C 26 32 AE 96 27 C6 7E BD 35 AF 34 BD 30 6 A6 81 25 84 Al 26 EC 84 34 4F 6 10 23 00 10 10 23 8A ED 35 38 3A EE 34 86 E3 24 D6 12 C7 89 42 C4 F2 14 C7 14 61 F1 43 FF 4D 84 27 44 21 D8 BD 44 84 C5 49 01 08 c8 08 81 4F C8 02 49 01 00 67 48 08 02 03 C3 C3 14 4D 04 C7 06 43 84 28 44 25 7 06 62 63 14 08 27 83 03 01 80 C8 04 62 04 FF 61 07 F2 BF 1E A9 00 13
138. 0781 DECA BEQ L0781 PSHS A BSR L0788 BNE 107 0 BRA 10765 LD7B1 LDA 120 STA RDYTMR PULS A B X Y U PC RESTORE HEAD TO TRACK 0 10788 LDX DROTRK LDB DCDRV CLR B X LDA 4 03 STA FDCREG EXG A A EXG A A BSR 10701 BSR 107 0 ANDA 4510 STA DCSTA 10700 RTS WAIT FOR THE 1793 TO BECOME UNBUSY FORCE AN INTERRUPT AND ISSUE DRIVE NOT READY 10701 LDX ZERO 10703 LEAX 1 BEQ LD7DF LDA FDCREG BITA 501 BNE 10703 RTS LD7DF 10 D8 STA FDCREG EXG A A EXG A A LDA FDCREG LDA 4 80 STA 5 RTS MEDIUM DELAY LD7F LDX 8750 LD7F3 LEAX 1 X BNE LD7F3 RTS READ ONE SECTOR LD7F8 10 80 LD7FA CMPX 86 0 WRITE ONE SECTOR LD7FB 10 0 PSHS A LDX DROTRK LDB DCDRV ABX LDB X STB FDCREG 1 CMPB DCTRK BEQ 1082 LDA DCTRK STA FDCREG 3 STA X 17 STA FDCREG EXG A A EXG A A BSR 10701 BNE LD82A BSR 107 0 ANDA 4518 BEQ LD82C B34 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK POINT X TO DRIVE ENABLE MASKS GET DSKREG IMAGE KEEP MOTOR STATUS DOUBLE DENSITY HALT ENABLE OR IN DRIVE SELECT DATA OR IN DOUBLE DENSITY GET TRACK NUMBER PRECOMPENSATION STARTS AT TRACK 22 BRANCH IF LESS THAN 22 TURN ON WRITE PRECOMPENSATION IF 22 SAVE PARTIAL IMAGE IN ACCB OR IN MOTOR ON CONTROL BIT SAVE IMAGE IN RAM PROGRAM THE 1793 CONTROL REGISTER WERE MOTORS ALREADY ON DON T WAIT FOR IT TO COME UP TO SPEED IF ALREADY ON WAIT A WHILE WAIT SO
139. 08 C199 1 C10C C1BE C1OF C111 C113 C119 GILF C125 C12B C131 C135 C139 C13F C145 C14B C151 C156 C157 C15D C163 C168 C169 C16F C172 C173 C179 C17L C185 C188 C18L C192 C195 C19A C19F C1A4 C148 C1AC 1 0 1 5 C1BB C1BF C1C3 C1C8 104 C1DA C1EQ C164 1 9 C1F3 D7 BD 96 8B 97 AD 8D 1c 8E BD 8E OF 7E 12 8D BD 7E 7F 7F 7F 7F 86 B7 1E 1E B6 39 14 C1 C2 06 C2 C2 C4 CC C8 86 C6 CE C2 44 58 44 52 43 00 43 47 29 32 20 4 gD 55 4c 45 20 53 44 44 46 46 48 4C 4C 40 52 52 53 57 56 55 44 42 43 44 44 44 19 96 06 B7 9F 19 AF C1 B9 72 06 D2 80 09 09 09 FF 00 FF 88 88 FF 92 38 19 4E 4B 1C 4B 90 E4 D2 65 49 54 20 20 20 4F 48 20 42 44 4E 49 20 4D 4 00 49 52 49 49 49 4F 53 45 45 53 41 52 45 4E 53 41 4F 53 53 4F A9 c5 EC Cg 38 9 7 2 02 Cg 82 85 86 40 48 48 C8 C5 CA CD CA C6 CA 53 45 43 42 31 50 54 31 59 59 44 43 46 49 46 00 02 49 45 4C 4C 41 45 52 45 56 49 52 4C 4B 43 50 48 48 03 08 88 BC E9 35 4 4 4B 46 AF 41 2E 59 20 39 20 45 45 52 43 54 56 4C 45 cc C4 4 47 41 4 C5 54 49 4F 49 4B D9 49 4F c8 C8 CA C8 C9 20
140. 0875 0877 0879 0878 0870 D87F D881 D884 D886 D889 D88B D88D 0890 0892 0894 0895 0897 0899 0898 D89D D89E D89F D8AQ D8A1 D8A4 D8A6 D8A9 D8AB D8AE D8AF D8B2 0884 0887 D8BA D8BC D8BD 08C0 08C2 08C5 08C7 D8CA D8CD 97 35 96 B7 86 BF 9E B6 B6 8A 35 10 73 1 F7 1E 1E Cl 27 C6 65 26 31 26 TE 1c 7E E6 F7 B7 20 C6 E5 26 31 26 20 F6 E7 B7 20 1C B6 84 97 39 D7 D7 D7 D7 01 02 04 40 6 27 3 6 2 6 6 27 4 B7 26 B6 84 B7 B7 7E 82 ED FF D8 09 FF 09 80 04 9E FF 09 50 FF 88 88 80 1C 02 C4 0 8 09 07 80 FF FF F6 02 C4 06 3F F8 E2 FF 80 FF F6 AF FF 7C F B8 00 8 8 09 08 09 6A 09 FF FA FF 09 11 09 B 09 09 FF 89 88 83 48 86 8A 48 82 48 82 DF 4B 40 48 4B 48 82 83 82 03 02 85 85 86 86 4B 55 APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 STA DCSTA LD82A PULS A PC HEAD POSITIONED ON CORRECT TRACK LD82C LDA DSEC STA FDCREG 2 REVISED 12 26 1999 WALTER K ZYDHEK SAVE IN DSKCON STATUS GET SECTOR NUMBER DESIRED SEND TO 1793 SECTOR REGISTER POINT X TO ROUTINE TO BE VECTORED TO BY NMI UPON COMPLETION OF DISK 1 0 AND SAVE VECTOR POINT X TO 1 0 BUFFER RESET INTRQ FDC INTERRUPT R
141. 092 00 07 FCBREC EQU 7 CURRENT RECORD NUMBER HOW MANY WHOLE SECTORS HAVE BEEN 0093 INPUT OR OUTPUT TO A FILE 0094 9 TO 15 UNUSED 0095 00 10 FCBRLN EQU 16 CACHE FLAG 00 EMPTY FF CACHE FULL 0096 00 11 FCBCDT EQU 17 CACHE DATA BYTE B1 DISK BASIC UNRAVELLED II 0097 0098 0099 0100 0101 0102 0103 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0181 0182 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 COBB C002 C004 C006 C008 COBA CBBC COBF C011 C014 C016 C019 C01C CO1E C021 C024 C026 C028 2 C02C C02F C032 035 C038 C03B C03D C040 C042 C044 C046 C049 C04B CO4E C051 C054 C057 5 C05C C05L 061 C063 C064 66 069 C06C C06C 071 074 077 079 C07C CO7F C082 C085 C088 C088 C08C C992 095 097 9 Cg9c COA CA3 CA5 9 CBAC COAE COBB COB3 0 7 C089 COBC C BD COBF 0 1 0 2 C0C4 00 00 00 00 00 44 20 07 00 DF DF 8E 6F 8C 26 8E CE C6 BD CC ED ED 6F 6F
142. 1 0062 0063 0064 0066 0068 006 006 006 0060 006 006 0070 0071 0072 0074 0076 0078 0079 007 007 0070 007 0080 0081 0082 0083 0084 0085 0086 0087 0088 008 008 0080 008 0090 0091 0092 0094 0095 0097 0099 009 009 009 0090 009 BC 7 00 1 26 02 0 BC 6 APPENDIX ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK V4A RMB V4B RMB 2 V4D RMB 2 FLOATING POINT ACCUMULATOR 0 FPOEXP RMB PV FLOATING POINT ACCUMULATOR 0 EXPONENT FPAS RMB 4 PV FLOATING POINT ACCUMULATOR 0 MANTISSA FP SGN RMB PV FLOATING POINT ACCUMULATOR 0 SIGN COEFCT RMB POLYNOMIAL COEFFICIENT COUNTER STRDES RMB 5 TEMPORARY STRING DESCRIPTOR FPCARY RMB FLOATING POINT CARRY BYTE FLOATING POINT ACCUMULATOR 1 FPIEXP RMB PV FLOATING POINT ACCUMULATOR 1 EXPONENT 1 RMB 4 PV FLOATING POINT ACCUMULATOR 1 MANTISSA FP1SGN RMB PV FLOATING POINT ACCUMULATOR 1 SIGN RESSGN RMB SIGN OF RESULT OF FLOATING POINT OPERATION FPSBYT RMB FLOATING POINT SUB BYTE FIFTH BYTE COEFPT RMB 2 POLYNOMIAL COEFFICIENT POINTER LSTTXT RMB 2 CURRENT LINE POINTER DURING LIST CURLIN RMB 2 PV CURRENT LINE OF BASIC PROGRAM FFFF DIRECT DEVCFW RMB TV TAB FIELD WIDTH DEVLCF RMB TV TAB ZONE DEVPOS RMB TV PRINT POSITION DEVWID RMB TV PRINT WIDTH PRTDEV RMB TV PRINT DEVICE 0 M0I CASSETTE 1 CASSETTE DEVNUM RMB PV DEVICE NUMBER 3 DLOAD 2 PRINTER 1 CASSET
143. 10 0311 0312 0313 0314 0315 0316 0317 0318 0319 0320 0321 0322 0323 0324 0325 0326 0327 0328 0329 0330 0331 0332 0333 0334 0335 0336 0337 0338 0339 0340 0341 0342 0343 0344 0345 0346 0347 0348 0349 0350 0351 0352 0353 0354 0355 0356 0357 0358 0359 0360 0361 0362 0363 0364 0365 0366 0367 0368 0369 0370 0371 0372 0373 0374 0375 0376 0377 0378 0379 0380 0381 0382 0383 0384 C1F5 C1F7 1 9 C1FB C1FD CIFF C201 C204 C208 C208 20 C212 C214 C216 C218 C21A C21C C21E C220 C222 C224 C227 C229 C22C C22E C232 C236 C238 C23A C23E C240 C242 C245 C247 C24A C24D C24F C252 C255 C257 C25A C25C C25E C262 C264 C267 C26A C26C C26F C272 C275 C278 C27A C27C C27E C280 C282 C284 C286 C288 C28A C28C C28E C291 C294 C297 C29A C29C C29E C2A1 C2A3 2 5 2 7 2 9 C2AB C2AE 2 0 C2B3 D2 D5 D2 D3 D4 D5 43 46 4C 4C 4D 41 CD CE CE CE CE B2 81 22 86 80 7E 81 18 6E C1 23 6E Cg 34 BD 35 86 7E 35 BD BD 34 BD 35 Cl 18 32 BD BD OF BD BD 8E 7E 42 44 4F 57 46 46 41 46 53 56 45 42 20 44 42 34 AE 8C 26 81 27 35 32 BD 9F 6F 6F 33 99 62 B9 ED 62 56 52 4 4 48 03 F4 9C 10 37 02 7 EQ 08 C1 CE AD EQ 23 9F 4E 94 9F 44 94 B2 94 c2 B2 20 AD 01 24 CA 04 36 25 62 7 9 6F B9 B9 C2 AC
144. 1209 C89E BD A5 9A JSR LA59A MOVE B BYTES FROM X TO U 1210 C8A1 BD 87 48 JSR 18748 EVALUATE A STRING EXPRESSION 1211 C8A4 33 84 LEAU X POINT U TO START OF STRING 1212 C8A6 C1 02 CMPB 02 CHECK LENGTH OF STRING AND 1213 C8A8 25 12 BLO LC8BC BRANCH IF lt 2 1214 C8AA A6 41 LDA 1 U GET 2ND CHARACTER IN STRING AND 1215 C8AC 81 3A CMPA CHECK FOR COLON 1216 C8AE 26 BC BNE LC88C BRANCH IF NO DRIVE NUMBER 1217 C8B A6 C4 LDA GET 1ST CHARACTER 1218 C8B2 81 30 CMPA 0 IN STRING AND 1219 C884 25 06 BLO LC88C CHECK TO SEE 1220 C8B6 81 33 CMPA 3 IF IT IS IN 1221 C8B8 22 02 BHI LC8BC THE RANGE 9 3 1222 C8BA 8D 33 BSR LC8EF GET DRIVE NUMBER 1223 C8BC 8E 09 4C LC8BC LDX DNAMBF POINT X TO FILE NAME BUFFER 1224 C8BF 5C INCB COMPENSATE FOR DECB BELOW 1225 C8C0 5A LC8C0 DECB DECREMENT STRING LENGTH 1226 C8C1 26 BC BNE LC8CF BRANCH IF MORE CHARACTERS IN STRING 1227 C8C3 32 61 LEAS 01 S CLEAN UP STACK REMOVE DRIVE FLAG 1228 C8C5 8C 09 4C CMPX DNAMBF POINTER STILL AT START OF BUFFER 1229 C8C8 26 67 BNE LC931 RETURN IF NOT 1238 C8CA C6 3E LC8CA LDB 2 31 BAD FILENAME ERROR IF NULL FILENAME 1231 C8CC 7E AC 46 JMP LAC46 ERROR HANDLER 1232 C8CF A6 CB LC8CF LDA U GET A CHARACTER FROM STRING 1233 C8D1 81 2E CMPA LOOK FOR PERIOD 1234 C8D3 27 2D BEQ 1 902 YES 1235 C8D5 81 2F CMPA SLASH 1236 C8D7 27 29 BEQ LC992 YES 1237 C8D9 81 3A CMPA COLON 1238 C8DB 27 09 BEQ LC8E6 YES 1239 C8DD 8C 09 54 CMPX DE
145. 14 16 CB18 CB1D CB1F CB22 CB24 CB26 CB29 B7 8D B6 27 7D 26 BD 7E B6 BA 18 BD 73 BD BD 34 BD 1F 35 D3 BD 9E BD 06 26 A7 20 7F 9F C6 A6 26 5A 26 9E 9F 6F 5A 2A BD BD BD BD 77 25 BD 77 18 7E 00 2 39 6 5C 34 D7 8D 35 5A 26 39 00 10 32 BD OF 9F A6 27 34 6F E6 D7 81 26 E6 86 AA ED 6 E6 BD A7 09 99 09 OB 09 03 AD AC 09 09 26 AD 09 CD CD 02 CD 89 02 19 19 C5 70 04 80 F5 09 1 03 82 03 F9 1B 1B 80 F9 A4 AD 82 AC 09 03 4 09 25 6F DE 09 04 6F BE 04 5 6F 2F 62 C7 6F F1 00 02 00 01 20 19 88 80 05 88 04 03 C7 01 59 58 19 7 57 DB 8E 19 5D BC BC BC 37 C4 5D 2D 21 9 EF 59 26 59 E2 BD 73 5B B7 87 44 18 13 55 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 STA DRUNFL LCA6C BSR LCA07 LDA DASCFL BEQ LCA7E TST DMRGFL BNE LCA7B JSR LADI9 LCA7B JMP LAC7C LOAD IN A CRUNCHED BASIC FILE LCA7E 10 DFLTYP ORA DMRGFL LBNE LA616 JSR 1 019 COM DLODFL JSR LCDBC JSR LCDBC PSHS A JSR LCDBC TFR A B PULS A ADDD TXTTAB JSR LAC37 LDX IXII 8 LCAA4 JSR LC5C4 LDB CINBFL BNE LCAAF STA X BRA LCAA4 LCAAF CLR DLODFL STX VARTAB MAKE SURE LAST THREE BYTES LOADED WERE ZERO LDB 4 03 LCAB6 LDA X BNE DECB BNE 1
146. 16 LD618 LD61B LD644 LD64F LD650 LD667 LD672 LD68B LD69F LD6AD LD6BE LD6C5 LD6D4 LD6DD LD6DE LD6E0 LD6EC LD6FD LD700 L0705 10707 10708 10737 10739 0306 D3E6 D3FC D41A D42B D42E D436 D439 D45C D45F D465 D489 D4Al 4 4 D4CB D4D3 D4D5 D4D6 DAE D519 D525 D533 D55C D562 D582 D585 D59B D5AD D5D5 D5DB D5FF 0608 D6BE D616 D618 D61B D644 D64F 0650 0667 0672 D68B D69F D6AD D6BE D6C5 D6D4 D6DD D6DE D6E0 D6EC D6FD D700 0705 0707 0708 0737 0739 10768 10770 10778 10782 10784 LD78E LD798 LD7A2 LD7AA LD7BB LD7DA LINBUF LINHDR LIST LOAD LOC LOF LPTBTD LPTCFW LPTLCF LPTLND LPTPOS LPTWID LSET LSTTXT MEMSIZ MERGE MKN NMI NMIFLG NMIVEC NOTELN OCTAVE OLDPTR OLDTXT 1 2 PLYTMR PMODE POTVAL PRTDEV RDYTMR RELFLG RELPTR RENAME RESETV RESSGN RNBFAD ROMPAK RSET RSTFLG RSTVEC RVEC RVECI RVEC11 RVEC12 DISK BASIC 1 0 SYMBOL TABLE D768 0770 0778 0782 0784 D78E D798 D7A2 D7AA D7BB D7DA 020 O2DA B764 C99A APPENDIX E RVEC13 RVEC14 RVEC15 RVEC16 RVEC17 RVEC18 RVEC19 RVEC2 RVEC28 RVEC21 RVEC22 RVEC23 RVEC24 RVEC3 RVEC4 RVEC5 RVEC6 RVEC7 RVEC8 RVEC9 RVSEED SAMREG SAVE SCALE SETFLG SNDDUR SNDTON STRBUF STRDES STRINOUT STRSTK STRTAB SW2VEC SW3VEC SWI SWI2 SWI3 SWIVEC SYNCLN SYNCOMMA TEMPO TEMPPT TEMPTR TIMOUT TIMVAL TINPTR TMPLOC TMPSTK TMPTR1 TOPRAM TRCFLG TR
147. 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 CC64 CC67 CC69 CC68 CC6D CC6F CC71 CC73 CC75 CC77 CC79 CC7B CC7D CC7F CC81 CC83 CC85 CC87 CC89 CC8B CC8D CC90 CC92 CC94 CC96 CC98 CC9A CC9B CC9D CC9F 1 CCAS CCA7 CCA9 CCAC CCAE CCBO CCB2 CCB4 CCB6 CCB8 CCBA CCBD CCBE CCCO 2 4 CCC6 CCC8 CCCA CCDS CCD2 CC04 CCD6 CCD8 CCDA CCDC CCDE CCE CCE2 CCE4 CCE6 CCE9 CCEB CCED CCF1 CCF3 CCF6 CCF9 CCFB CCFC CCFE C001 CD93 005 007 CDBA CDOD C010 C012 C015 C018 CD1A 8E C6 07 96 26 C6 8D 81 27 81 26 C1 26 1F D7 20 C1 27 81 26 8C 27 A6 81 26 86 4D 27 91 27 34 1 27 7 8C 26 8D 26 20 8D 27 6F 8E 39 81 27 81 26 8D 26 81 27 81 27 81 26 8D 26 81 27 8D 20 8D 27 BD E6 C1 18 C6 7E BD 00 39 34 BD E6 C1 26 EC 83 ED 35 A7 63 35 BD 02 DD 2C 01 06 02 20 6F
148. 2 NUMBER OF RECORDS IN THE FILE 1883 CD83 34 10 PSHS X SAVE FCB POINTER ON STACK 1884 CD85 93 8A SUBD ZERO SUBTRACT ZERO FROM ACCD NUMBER OF SECTORS 1885 CD87 27 03 BEQ LCD8C BRANCH IF ZERO SECTORS 1886 CD89 83 00 01 SUBD 450001 SUBTRACT ONE SECTOR THE LAST SECTOR MAY NOT 1007 USED 1887 CD8C 8D AC LCD8C BSR LCD3A PUT ACCD INTO 1888 CD8E D6 4F LDB FPQEXP GET EXPONENT 1889 CD99 27 04 BEQ LCD96 BRANCH IF FPAQ 0 1890 C092 08 ADDB 4508 ADD 8 TO EXPONENT MULTIPLY FPAQ BY 1891 CD94 D7 4F STB FPOEXP 256 BYTES SECTOR AND SAVE NEW EXPONENT 1892 CD96 BD BC 5F LCD96 JSR LBC5F SAVE NUMBER OF BYTES IN FULL SECTORS IN FPA1 1893 CD99 AE E4 LDX S POINT X TO FCB 1894 CD9B EC 88 13 LDD FCBLST X GET NUMBER OF BYTES IN LAST SECTOR 1895 CD9E 84 7F ANDA 7F MASK OFF THE PRE SAVED BYTE 1896 CDAQ 8D 98 BSR LCD3A PUT NUMBER BYTES IN LAST SECTOR INTO 1897 CDA2 F 62 CLR RESSGN FORCE SUM SIGN POSITIVE 1898 CDA4 96 5C LDA FPIEXP GET EXPONENTS OF FPA AND 1899 CDA6 D6 4F LDB FPQEXP FPA1 PRIOR TO ADDITION 1900 CDA8 BD B9 C5 JSR LB9C5 ADD NUMBER BYTES IN LAST SECTOR TO NUMBER OF 1901 BYTES IN FULL SECTORS 1902 CDAB BD BC 5F JSR LBC5F SAVE TOTAL NUMBER OF BYTES IN 1 1903 CDAE 35 10 PULS X POINT X TO FCB 1904 CDB 09 LDD FCBRLN X GET RECORD LENGTH 1905 CDB2 8D 86 BSR LCD3A PUT IT INTO 1906 CDB4 F 62 CLR RESSGN FORCE QUOTIENT SIGN POSITIVE 1907 CDB6 96 5C LDA
149. 2 10743 LD75A LD765 LD77E LD792 LD7A8 LD7B1 LD7B8 LD7D LD7D1 LD7D3 LD7DF LD7F LD7F3 LD7F8 LD7FB LD82A LD82C LD85B LD863 LD86B LD875 LD877 LD881 LD88B LD895 LD89D LD8AE LD8CD LDF 9 LDF36 LINBUF LINHDR LIST LOAD LOC LOF LPTBTD LPTCFW LPTLCF LPTLND LPTPOS LPTWID LSET LSTTXT MEMSIZ MERGE MKN NMI NMIFLG NMIVEC NOTELN OCTAVE DISK BASIC 1 1 SYMBOL TABLE 0709 070 070 0737 0742 0743 D75A D765 D77E D792 D7AG D7B1 D7B8 D7D0 D7D1 D7D3 D7DF D7F0 D7F3 D7F8 D7FB D82A D82C D85B D863 D86B D875 D877 D881 D88B D895 D89D D8AE D8CD DF09 DF36 020 O2DA B764 CA48 10 CE37 0095 APPENDIX D OLDPTR OLDTXT PIAG PIAL PIA2 PLYTMR PMODE POTVAL PRTDEV RDYTMR RELFLG RELPTR RENAME RESETV RESSGN RNBFAD ROMPAK RSET RSTFLG RSTVEC RVECE RVECI RVEC11 RVEC12 RVEC13 RVEC14 RVEC15 RVEC16 RVEC17 RVEC18 RVEC19 RVEC2 RVEC28 RVEC21 RVEC22 RVEC23 RVEC24 RVEC3 RVEC4 RVEC5 RVEC6 RVEC7 RVEC8 RVEC9 RVSEED SAMREG SAVE SCALE SETFLG SNDDUR SNDTON STRBUF STRDES STRINOUT STRSTK STRTAB SW2VEC D3 0020 0029 FFOO 20 40 00E3 00 6 015A 006 0985 000 0030 D01B FFFE 0062 0948 000 0101 0071 0072 g15E 0161 017C g17F 0182 0185 0188 0188 g18E 0191 0194 0197 0164 019A 0190 01 0 01 3 01 6 0167 016A 0160 0170 0173 0176 0179 0115 FFCO 9 0103 SW3VEC SWI SWI2 SWI3 SWIVEC SYNCLN
150. 22 BRANCH IF LESS THAN 22 TURN ON WRITE PRECOMPENSATION IF 22 SAVE PARTIAL IMAGE IN ACCB OR IN MOTOR ON CONTROL BIT SAVE IMAGE IN RAM PROGRAM THE 1793 CONTROL REGISTER WERE MOTORS ALREADY ON II WAIT A WHILE WAIT SOME MORE FOR MOTOR TO COME UP TO SPEED WAIT UNTIL NOT BUSY OR TIME OUT ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DON T WAIT FOR IT TO COME UP TO SPEED IF ALREADY ON BRANCH IF TIMED OUT DOOR OPEN NO DISK NO POWER ETC CLEAR STATUS REGISTER POINT TO COMMAND JUMP VECTORS GET COMMAND 2 BYTES PER COMMAND JUMP ADDRESS DISK BASIC UNRAVELLED II 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 D6AB D6AD D6AF D6B1 D6B3 D6B4 D6B6 D6B8 D6BA D6BC D6BE 06C0 06C3 06C5 06C8 D6CA D6CC D6CE D6D1 D6D3 D6D5 D6D7 D6D9 D6DB D6DD D6DE 0660 0662 0664 0667 0669 0668 D6EC D6EE D6F1 D6F3 D6F5 D6F8 D6FA D6FC D6FD 0700 0702 0704 0705 0707 070
151. 23 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 0249 024 024 D24F D252 D254 D256 D259 D25B D25F D261 D262 D266 D269 D26C D26F D271 D273 D275 D278 D27B D27F D281 D284 D287 D289 D28C D28E D292 D294 D296 D298 D29C D29E D29F D2A1 D2A4 D2A5 D2A6 D2A8 D2AA D2AC D2AE 0280 0282 0284 D2B6 D2B9 D2BB D2BD D2BF D2C1 D2C2 D2C5 D2C7 D2C9 D2CB D2CD D2CF D2D2 D2D4 D2D7 D2D9 D2DC D2DD D2DF 02 0 0263 0265 0267 0269 D2EC D2EF D2F2 D2F4 D2F7 D2FA D2FC D2FE D2FF 0301 0303 0305 0307 030 1 23 39 6 9D 27 BD C1 18 D7 39 18 BD BD F7 9D 27 C6 BD BD 18 34 BD BD 6F 8E 6 30 9 23 6A 18 86 5F 34 73 5F 5C 6A 27 El 26 07 E6 8D 86 BD E6 8D 6D 27 4F BD E6 DB E7 20 8D 7E 35 B6 27 8E 4F 6F 4c 81 23 9E 6F BD 7F B6 27 7F BD 6E 86 8C 86 DD A6 97 8E 9F 09 E8 09 5 09 B7 03 22 27 95 02 06 5 08 5 2 02 04 5 2 09 E4 89 27 F6 E4 27 23 06 09 4 04 62 F7 03 64 48 FF D3 63
152. 24 C75F E7 E4 STB 5 SAVE REMAINDER ON STACK 1025 C761 C6 BA LDB 10 MULTIPLY QUOTIENT 1 1026 C763 3D MUL BY 10 1027 C764 35 92 PULS A PUT THE REMAINDER IN ACCA 1028 C766 5A LC766 DECB DECREMENT THE GRANULE COUNT BY ONE FOR 1029 C767 8B 99 ADDA 09 EVERY NINE SECTORS 1 GRANULE IN THE 1030 C769 28 FB BMI LC766 REMAINDER COMPENSATE FOR THE 1 IN QUOTIENT 1 1031 C76B 4F CLRA CLEAR MS BYTE OF ACCD 1032 C76C 39 LC76C RTS 1033 1034 MAKE SURE RAM FILE ALLOCATION TABLE DATA IS VALID 1035 C76D 8D B6 LC76D BSR LC725 POINT X TO FAT FOR THE CORRECT DRIVE NUMBER 1036 C76F 6D 00 TST CHECK TO SEE IF ANY FILES ARE ACTIVE 1037 C771 26 F9 BNE LC76C RETURN IF ANY FILES ACTIVE IN THIS FAT 1038 C773 6F 01 CLR FAT1 X RESET FAT DATA VALID FLAG 1039 C775 33 06 LEAU FATCON X LOAD U WITH START OF GRANULE DATA BUFFER 1040 777 86 06 00 LDX DBUF BUFFER FOR DISK TRANSFER 1041 C77A 9F EE STX DCBPT PUT IN DSKCON PARAMETER 1042 C77C CC 11 02 LDD 451102 DIRECTORY TRACK READ SECTOR 1043 C77F 97 EC STA STORE IN DSKCON TRACK NUMBER 1044 C781 D7 EA STB DCOPC STORE IN DSKCON OP CODE 1045 C783 C6 02 LDB 02 GET SECTOR NUMBER 2 FILE ALLOCATION TABLE 1046 C785 D7 ED SIB 5 STORE IN DSKCON PARAMETER 1047 C787 BD D5 FF JSR LD5FF GO READ SECTOR 1048 C78A C6 44 LDB GRANMX TRANSFER FILE ALLOCATION TABLE TO FILE ALLOC TABLE BUFFER 1049 C78C 7E A5 9A JMP LA59A MOVE B BYTES FROM X TO U 1050 1051 FIND FIRST FREE GRANULE ENTER WI
153. 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 0199 019 D19E 01 0 D1A2 D1A3 D1A5 D1A6 D1A8 D1AA D1AC D1AD D1AF 0181 0183 0185 0187 0189 D1BB D1BC D1BE 01C1 01C3 01C4 01C6 01C8 D1CA D1CC DICE 0100 0102 0104 0106 0108 D1DA D1DC D1DF 0162 0164 0165 0167 0169 0168 01660 D1EF D1F1 D1F3 D1F6 D1F8 D1FA DIFC D1FF 0201 0204 0206 0208 0208 0200 0210 0212 0214 0216 0219 0218 0216 0221 0222 0224 0226 D22A D22B D22E 0230 0233 0235 0236 0237 D23A D23C D23E 0240 0242 0244 0247 C3 25 6A 2A 5D 27 4C 27 85 27 4C 27 A7 DC 90 25 16 4C 27 18 24 4A 93 D3 1F A6 90 1F 9B 97 DB D7 35 97 F7 FF 96 4c 27 1F 93 D3 DD DE 9F 11 22 A6 A7 11 26 10 6F 20 7E DE 18 6F A6 A7 18 26 CE BE 5F AF 6F 30 6 1 23 7E 8D 5F 5C BD 27 A6 91 26 34 BD 35 01 6A E4 F7 93 60 01 03 59 E4 1B BC 4 4F 01 4 93 45 1 19 02 E4 BC 89 BA BA B7 B7 46 BC 09 09 68 08 20 19 6 6 1 1 93 13 C2 82 93 F7 9F 3F 13 AC 19 9F 3F 9L F7 09 09 C1 00 89 09 2 96 1A
154. 25 JSR LC725 POINT X TO FAT 0438 C31B 33 06 LEAU FATCON X POINT U TO FAT DATA 0439 C31D A6 E4 5 GET NUMBER OF GRANULES OFFSET TO RECORD 0440 C31F 4C INCA ADD ONE COMPENSATE FOR DECA BELOW 0441 C320 30 4 LC328 LEAX U POINT X TO FAT DATA 0442 C322 3A ABX POINT X TO CORRECT GRANULE 0443 C323 4A DECA DECREMENT GRANULE COUNTER 0444 C324 27 37 BEQ LC35D BRANCH IF CORRECT GRANULE FOUND 0445 C326 E7 E4 STB 5 SAVE GRANULE ADDRESS ON STACK 0446 C328 E6 84 LDB X GET NEXT GRANULE IN FILE 0447 2 C1 C CMPB LAST GRANULE IN FILE 0448 C32C 25 F2 BLO LC328 NO KEEP LOOKING 0449 0450 THE GRANULE BEING SEARCHED FOR IS NOT PRESENTLY DEFINED THIS RANDOM FILE 0451 2 E4 LDB 5 GET OFFSET TO LAST GRANULE 0452 C330 00 D8 TST VD8 CHECK GET PUT FLAG 0453 C332 26 14 BNE LC348 AND BRANCH IF PUT 0454 C334 C6 2E LC334 LDB 2 23 INPUT PAST END OF FILE ERROR 0455 C336 7E AC 46 JMP LAC46 JUMP TO ERROR HANDLER 0456 C339 30 C8 19 LC339 LEAX FCBCON U POINT X TO FCB DATA BUFFER 0457 0458 READ WRITE A SECTOR ENTER WITH OP CODE IN ACCB BUFFER PTR IN X 0459 C33C D7 EA LC33C STB DCOPC SAVE DSKCON OPERATION CODE VARIABLE 0460 C33E 9F EE STX DCBPT SAVE DSKCON LOAD BUFFER VARIABLE 0461 C340 30 4 LEAX POINT X TO FCB 0462 C342 BD C7 33 JSR LC733 CONVERT FCB TRACK AND SECTOR TO DSKCON VARIABLES 0463 C345 7E D5 FF JMP LD5FF READ WRITE A TRACK OR SECTOR 0464 0465 PUT DATA INTO A GRANULE NOT PRESENTLY INCLUDED IN THIS FILE 0
155. 26 5F 63 E7 39 EE 33 EF 39 7F 7F CC 97 07 C6 07 DF BD FF 31 A6 26 8D 8E A6 Al 26 8 26 F7 A6 87 39 33 11 26 5C C1 23 39 43 26 B6 26 F7 FF 39 C6 7D 26 7E BD BD BD 8D 8D 86 BD BE 6F C6 07 BD E6 8D 30 EQ 21 98 02 23 02 C7 88 EE D6 88 EQ 0 88 04 88 88 07 41 07 09 09 11 EC EA 03 06 06 09 C4 C4 28 29 09 80 09 F5 09 42 09 A8 83 D5 OB C6 07 09 06 09 09 34 09 8 MC 09 A5 C7 92 E9 FF 09 84 93 EA D6 gD 44 26 63 19 F2 18 17 18 73 77 02 00 F2 74 4C 57 73 76 20 07 77 77 78 73 46 35 C7 9D 97 74 F2 00 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 LC658 SUBB 5 SUBTRACT CURRENT SECTOR NUMBER AND PULS A BLO 16670 BRANCH IF PAST LAST SECTOR SECTOR NUMBER TO LC65E PSHS A SAVE SECTOR NUMBER DIFFERENCE BSR LC685 INCREMENT RECORD NUMBER LDA 02 GET READ OPERATION CODE STA DCOPC AND SAVE IT IN DSKCON VARIABLE JSR LC763 GET PROPER TRACK AND SECTOR TO DSKCON VARIABLES LEAU FCBCON X POINT U TO START OF FCB DATA BUFFER STU DCBPT AND SAVE IT IN DSKCON VARIABLE JSR LD6F2 GO READ A SECTOR INTO FCB BUFFER CLR FCBLFT X NUMBER OF CHARS LEFT IN BUFFER 256 108 5 GET SECTOR NUMBER OFF STACK BNE 16684 RETURN IF DATA LEFT FALL THRU IF LAST SECTOR LDD FCBLST X GET NUMBER OF BYT
156. 27 25 BEQ 10371 NUMBER OF GRANS IN THE FILE AND THE DESTINATION DISK 2634 MUST BE CHECKED FOR ENOUGH ROOM IF IT IS 0 2635 THEN THE CHECK HAS ALREADY BEEN DONE 2636 D34C 30 6B LEAX 11 5 POINT TO DESTINATION FILE PARAMETERS 2637 D34E BD D2 CQ JSR 102 0 GET DESTINATION FILE PARAMETERS FROM STACK 2638 D351 BD CF 7D JSR LCF7D SCAN DIRECTORY FOR FILE AE ERROR IF IT EXISTS 2639 D354 BD C7 6D JSR LC76D GET VALID FAT DATA 2640 2641 MAKE SURE THERE ARE ENOUGH FREE GRANULES ON THE DESTINATION DISK 2642 D357 BD C7 25 JSR LC725 POINT X TO FAT 2643 D35A 30 06 LEAX FATCON X SKIP PAST THE FAT CONTROL BYTES 2644 D35C A6 65 LDA 05 5 GET THE NUMBER OF GRANS IN THE FILE 2645 D35E C6 44 LDB GRANMX SET GRAN COUNTER TO MAXIMUM 2646 0360 63 84 10360 COM X CHECK TO SEE IF BRAN IS FREE 2647 0362 26 03 BNE LD367 AND BRANCH IF IT IS NOT FREE 2648 D364 4A DECA DECREMENT COUNTER AND BRANCH IF 2649 0365 27 08 BEQ LD36F THERE ARE ENOUGH FREE GRANULES 2650 D367 63 80 LD367 COM X RESTORE FAT BYTE AND INCREMENT POINTER 2651 D369 5A DECB DECREMENT GRAN COUNTER 2652 D36A 26 F4 BNE 10360 BRANCH IF ALL GRANS NOT CHECKED 2653 D36C 7E C7 C8 JMP LC7C8 DISK FULL ERROR 2654 D36F 63 84 LD36F COM X RESTORE FAT BYTE 2655 D371 8D 1B LD371 BSR LD38E PUT DATA FROM RAM BUFFER TO DESTINATION FILE 2656 0373 AE E4 LDX 5 GET THE NUMBER OF REMAINING SECTORS 2657 0375 27 00 BEQ 10384 EXIT ROUTINE IF NO SECTORS LEFT 2658 D377 EC 62 LDD 02 5 2659 D379 EB 64
157. 28 STA STORE BYTE IN MEMORY 2086 CF2A A1 80 CMPA X TEST TO SEE IF IT STORED PROPERLY AND 2087 CF2C 27 03 BEQ LCF31 BRANCH IF PROPER STORE NOT IN ROM OR BAD RAM 2088 CF2E 7E D6 16 JMP 10616 I 0 ERROR IF BAD STORE 2089 CF31 31 3F LCF31 LEAY 1 Y DECREMENT BYTE COUNT 2090 CF33 26 E9 BNE LCF1E GET NEXT BYTE IF NOT DONE 2091 CF35 20 00 LCFQ7 READ ANOTHER PRE POST AMBLE 2092 READ TWO BYTES FROM BUFFER RETURN THEM IN ACCD 2093 CF37 8D 00 LCF37 BSR LCF39 READ A BYTE SAVE IT IN ACCB 2094 CF39 BD CC E2 LCF39 JSR LCCE2 GET A CHARACTER FROM INPUT BUFFER RETURN IT IN ACCA 2095 CF3C 1E 89 EXG SWAP 2096 CF3E 39 RTS 2097 2098 RENAME COMMAND 2099 CF3F 9E A6 RENAME LDX CHARAD SAVE CURRENT INPUT POINTER 2100 41 34 10 PSHS X ON THE STACK 2101 CF43 8D 35 BSR LCF7A GET FILENAME OF SOURCE FILE 2102 45 96 EB LDA DCDRV SAVE DRIVE NUMBER 2103 CF47 34 02 5 5 ON THE STACK 2104 49 8D 2A BSR LCF75 SYNTAX CHECK FOR TO AND GET NEW FILENAME 2105 CFAB 35 92 PULS A GET SOURCE DRIVE NUMBER 2106 CF4D 91 CMPA DCDRV COMPARE TO NEW FILE DRIVE NUMBER 2107 10 26 4 F7 LBNE 1 44 FC ERROR IF FIIES ON DIFFERENT DRIVES 2108 CF53 8D 28 BSR LCF7D VERIFY THAT NEW FILE DOES NOT ALREADY EXIST 2109 CF55 35 10 PULS X RESTORE INPUT POINTER 2118 CF57 9F A6 STX CHARAD 2111 CF59 8D 1F BSR LCF7A GET SOURCE FILENAME AGAIN 2112 CF5B BD C6 5F JSR LC65F SCAN DIRECTORY FOR SOURCE FILENAME C22
158. 2D9 BRANCH IF END OF LINE 0392 C2C6 BD B2 6D JSR SYNCOMMA SYNTAX CHECK FOR COMMA 0393 C2C9 BD 83 E6 JSR LB3E6 EVALUATE EXPRESSION RETURN IN ACCD 0394 C2CC 9E F1 LC2CC LDX FCBTMP POINT X TO FCB 0395 2 ED 07 STD FCBREC X SAVE RECORD NUMBER IN FCB 0396 200 BD C6 58 LC2D8 JSR LC658 INCREMENT RECORD NUMBER 0397 203 09 LDD FCBRLN X GET RANDOM FILE RECORD LENGTH AND RANDOM FILE 0398 C2D5 AE B LDX FCBBUF X BUFFER POINTER AND SAVE THEM ON THE STACK 0399 C2D7 34 16 PSHS X B A THESE ARE THE INITIAL VALUES OF A TEMPORARY 0400 RECORD LENGTH COUNTER AND RANDOM BUFFER 0401 POINTER WHICH ARE MAINTAINED ON THE STACK 0402 C2D9 30 5E LEAX 2 U POINT X TO RECORD NUMBER 1 0403 C2DB BD 9F B5 JSR L9FB5 MULT UNSIGNED RECORD LENGTH X RECORD NUMBER 1 0404 C2DE 34 60 PSHS U Y SAVE PRODUCT ON THE STACK 0405 2 EQ LDA 5 CHECK MS BYTE OF PRODUCT 0406 2 2 26 09 BNE LC2ED BR ERROR IF NOT ZERO RECORD NUMBER TOO BIG 0407 C2E4 35 10 PULS X PULL THE BOTTOM 3 PRODUCT BYTES OFF THE STACK 0408 C2E6 35 04 PULS B TOP TWO IN X BOTTOM IN ACCB ACCB POINTS TO 0409 THE FIRST BYTE OF THE SECTOR USED BY THIS RECORD 0410 X CONTAINS THE SECTOR OFFSET WHICH SECTOR 0411 FROM THE START THE BYTE IS LOCATED 0412 2 8 8C 02 64 LC2E8 CMPX TRKMAX 1 612 SECTORS MAX IN A RANDOM FILE 0413 2 25 05 BLO LC2F2 BRANCH IF RECORD LENGTH 0 0414 C2ED C6 36 LC2ED LDB 2 27 BAD RECORD ERROR 0415 C2EF 7E AC
159. 2E 59 20 39 20 45 45 52 43 54 56 4C 45 cc C4 4 47 41 4 C5 54 49 4F 49 4B D9 49 4F C8 C8 CA c8 C8 C2 20 44 4C 53 30 52 28 38 54 52 4E 4F 52 c5 C4 D3 C5 4D C5 46 41 46 5 A4 A4 43 18 4B 59 60 4D 45 45 4F 49 49 43 41 20 53 4D 4F C5 09 C4 C9 00 LDX JSR LDX STX JMP DKWMST NOP BSR JSR JMP LC DD CLR CLR CLR CLR LDA STA EXG EXG LDA RTS DISK BASIC LC F6 FCB FDB FDB FCB FDB FDB APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 LC125 POINT X TO DISK BASIC COPYRIGHT MESSAGE STRINOUT PRINT COPYRIGHT MESSAGE TO SCREEN DKWMST GET DISK BASIC WARM START ADDRESS RSTVEC SAVE IT IN RESET VECTOR LAQE2 JUMP BACK TO BASIC WARM START INDICATOR LC DD INITIALIZE THE FLOPPY DISK CONTROLLER LD1E5 CLOSE FILES AND DO MORE INITIALIZATION XBWMST JUMP TO EXBAS WARM START NMIFLG RESET NMI FLAG RDYTMR RESET DRIVE NOT READY TIMER DRGRAM RESET RAM IMAGE OF DSKREG MOTORS OFF DSKREG RESET DISK CONTROL REGISTER 00 FORCE INTERRUPT COMMAND OF 1793 FDCREG SEND IT TO 1793 DELAY DELAY SOME MORE FDCREG GET 1793 STATUS CLEAR REGISTER COMMAND INTERP TABLES 19 19 DISK BASIC 1 0 COMMANDS LC17F DISK BASIC S COMMAND DICTIONARY LC220 COMMAND JUMP TABLE 6 6 DISK BASIC SECONDARY FUNCTIONS LC201 SECONDARY FUNCTION TABLE LC236 SECONDARY FUNCTION JUMP TABLE RAM HOOKS FOR DISK BASIC LC100 FDB FDB FDB FDB
160. 30 6 35 E6 27 A6 6F 35 E6 27 03 35 E6 6 6A 27 3A A6 35 34 4F 33 A6 34 6F A6 97 8D 35 35 A6 4C 34 81 23 4F 7 6 33 BD 3A 6 30 cl 24 35 80 26 7 20 04 23 C6 7E 09 42 03 06 56 C7 01 01 09 03 C7 06 6F 2F 62 14 70 09 6F 85 84 40 16 88 20 00 88 OB 8B 1F 94 88 08 88 88 94 88 04 70 94 05 05 88 06 88 94 60 88 C8 02 05 01 04 62 94 04 02 09 01 04 03 84 C7 06 C4 BA 02 BA 15 03 DC 3F 09 05 40 76 2 55 7 1 C7 26 15 09 01 15 10 11 18 17 18 19 19 55 46 2F APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 C SAVE IN RAM SAVE IN RAM IMAGE OF DIRECTORY TRACK GET WRITE OPERATION CODE AND SAVE IT IN DSKCON REGISTER GO WRITE A SECTOR IN DIRECTORY SAVE REGISTERS POINT X TO FILE ALLOCATION TABLE INDICATE NEW DATA IN FILE ALLOC TABLE GET NEW DATA FLAG HAVE ENOUGH GRANULES BEEN REMOVED FROM THE FAT TO CAUSE THE FAT TO BE WRITTEN TO THE DISK RETURN IF NO NEED TO WRITE OUT ALLOCATION TABLE WRITE FILE ALLOCATION SECTOR TO DISK RESTORE REGISTERS GET DEVICE NUMBER BRANCH IF NOT DISK FILE GET RID OF RETURN ADDRESS SAVE REGISTERS CLEAR BUFFER NOT EMPTY FLAG POINT TO FILE BUFFER VECTOR TABLE GET ACTIVE DISK FILE NUMBER TIMES 2 TWO BYTES PER FCB ADDRESS NOW X POINTS TO FILE BUFFER GET
161. 365 C367 C369 C36B C36D C36F C371 C373 C375 C377 C379 C37B C37D C380 C382 C385 C387 C38A C38C C38E C38F C398 C391 C394 C396 C398 C39B C39D C39F C3A1 C3A3 C3A5 C3A7 C3AA C3AD C3AF C3B1 C3B3 C3B6 C3B8 C3BA C3BB C3BD C3BF C3C1 C3C3 C3C5 C3C7 C3CA C3CC C3CE C3CF C3D1 C3D3 C3D6 C3D8 C3DA C3DE C3EQ C3E2 C3E5 C3E7 C3EA C3EB C3ED C3EF C3F1 C3F3 C3F5 C3F7 C3F9 C3FA C3FC C3FE C400 C402 C404 C406 C408 4 400 86 7 6 81 25 84 Al 24 96 27 6 8A 7 BD AE 8C 26 AC 27 86 21 4F 5F ED C6 AE 8C 26 32 AE 96 27 C6 7E BD 35 AF 34 8D 30 6 A6 81 25 84 Al 26 EC 84 34 4F 6 10 23 00 10 84 8A ED 35 30 34 86 24 35 50 20 E6 6F 6F 32 96 27 1E BD EF FF 4D 84 27 44 21 D8 BD 44 84 C5 49 01 08 c8 08 81 4F c8 02 49 01 00 67 48 08 02 03 C3 C3 14 4D 04 C7 06 43 84 24 44 1 7 06 62 63 00 08 27 01 80 94 c8 62 94 FF 61 97 61 94 08 62 61 62 61 08 02 13 5 62 7 00 13 13 00 3C 39 25 13 El FF 13 19 9A 56 LDA FF STA FCBSOF U LDA X CMPA BLO LC394 ANDA 3F CMPA FCBSEC U BHS LC394 LDA VD8 BEQ LC334 LDA FCBSEC U ORA 0 STA X JSR LC57C LDX FCBRLN U CMPX SECLEN BNE LC
162. 38F CMPX FCBLST U BEQ LC394 LDA 81 LC38E LC3DF LC38L CLRA CLRB STD FCBLST U LC394 LDB 02 LDX FCBRLN U SECLEN BNE LC3AA LEAS 07 5 LDX FCBBUF U LDA VD8 BEQ LC3A7 LDB 03 LC3A7 JMP LC33C LC3AA JSR LC339 PULS B X STX FCBSOF U LC3B1 5 5 B JSR LC725 LEAX FATCON X LDB FCBCGR U ABX LDA X CMPA BLO LC3E5 ANDA 3F CMPA FCBSEC U BNE LC3E5 LDD FCBLST U ANDA 7F PSHS B A CLRA LDB 9502 5 ADDD 03 S CMPD 5 BLS LC3E5 TST 08 LBEQ LC334 APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK SET FCBSOF U TO ILLEGAL SECTOR OFFSET WHICH WILL FORCE NEW SECTOR DATA TO BE READ IN GET CURRENT GRANULE IS IT THE LAST GRANULE NO MASK OFF LAST GRANULE FLAG BITS COMPARE CALCULATED SECTOR TO CURRENT SECTOR IN FCB AND BRANCH IF CALCULATED SECTOR IS LAST SECTOR IN FILE CHECK GET PUT FLAG IF GET THEN INPUT PAST END OF FILE ERROR GET CURRENT SECTOR NUMBER FROM FCB OR IN THE LAST GRANULE FLAG BITS AND SAVE IN FAT WRITE FAT TO DISK IF NECESSARY GET RECORD LENGTH AND CHECK TO SEE IF IT IS SECLEN EXACTLY ONE SECTOR BRANCH IF IT IS NOT EXACTLY ONE SECTOR BRANCH IF THE NUMBER OF BYTES IN THE LAST SECTOR IS SET TO ONE SECTOR SECLEN SET THE PRESAVED FLAG BIT15 AND FORCE THE NUMBER OF BYTES IN LAST SECTOR TO 256 SET THE NUMBER OF BYTES IN LAST SECTOR TO ZERO CLEAR LS BYTE OF ACCD SAVE THE
163. 43 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 CAF1 6 CAF8 CAFA CAFD CAFF C 01 CB03 C 05 C 07 09 CB B CB D C 10 CB13 CB15 CB17 1 CB1C CB1F CB21 CB23 CB24 CB27 CB29 CB2B CB2E CB2F CB30 CB31 CB33 CB35 CB38 CB3A CB3C CB3F CB41 CB43 CB45 CB47 CB4A CB4C 50 52 54 57 59 CB5A CB5C CB5E C 60 C 62 CB64 CB66 CB68 CB6A CB6C CB6E C 70 CB72 CB75 CB78 CB7B CB7F CB82 CB84 CB86 CB88 CB8A CB8C CB8F CB92 CB94 CB95 CB98 CB9A CB9C CBAS CBA3 5 CBA7 CBA9 CBAC CBAE BD 6A 6D 27 BD 9E 35 81 27 81 26 A6 27 BD 33 DF 8D A6 2A E6 C4 86 3D CE DF 31 E6 54 54 54 CB D7 97 80 84 C6 D7 7E 00 10 32 34 8E D6 58 AE E6 C1 27 81 26 6F 81 25 6C C1 26 EC C3 18 18 ED AE 30 35 7 35 6C E6 27 3A A7 35 34 A7 BD E6 D7 6c BD 31 E6 C7 00 01 03 C6 F1 02 20 08
164. 45 1246 1247 1248 C838 C838 C83D C841 C843 C845 C848 C84A C84B C84D C84F C851 C853 C856 C858 C85A C85E C868 C862 C864 C866 C868 C86A C86D C86F C872 C874 C876 C879 C87C C87E C881 C884 C886 C888 C88A C88D C891 C893 C895 C897 C899 C89B C89D C8AQ C8A2 C8A3 C8A6 C8A9 C8AB C8AD C8AF C8B0 C8B2 C8B4 C8B7 C8BA C8BB C8BD C8BF C8C2 C8C4 C8C6 C8C8 C8CA C8CC C8CE C801 C803 C805 C807 C8DA C8DC C8DE C8EQ C8E2 C8E4 C8E6 C8E9 C8EB C8EE C8F0 BD A6 10 81 27 7E 86 8C 86 00 2 BD 34 A6 18 81 27 1 26 35 8C 26 BD 81 26 BD BD C6 BD 8E AF 35 2F Fl 18 35 00 2F 32 34 OF BD 6 4F 8E 7E 00 2 32 39 32 1C 7F B6 43 84 27 BD 9E 9F A6 27 81 27 7E A6 97 26 7E EC DD 9F 96 27 86 BD 96 BD 86 BD C7 0g 27 4g C1 A6 18 20 6F 85 4 C7 06 00 27 40 06 E4 DF 96 64 B F7 B2 22 OB B2 6 3 B2 B 64 96 25 09 22 90 6F 18 62 16 6E C7 06 10 6F 02 62 62 FF FF 7F 03 AD A6 2F 80 07 25 2 81 00 03 80 68 6 OF 5B A2 68 BD 5D A2 49 DB BA 16 44 DB 9D 0 60 44 57 6F 1E 5B DD 8E 44 0g 7C 02 00 77 15 82 82 JSR LC749 LDA FCBTYP X LBEQ LA3FB RANFIL BEQ LC806 LC856 JMP 1 616 INPUT DEVICE NUMBER CHE
165. 46 JMP LAC46 JUMP TO ERROR HANDLER 0416 C2F2 DE F1 LC2F2 LDU FCBTMP POINT U TO FCB 0417 C2F4 4D CMPX FCBSOF U COMPARE SAVED SECTOR OFFSET TO THE CURRENT SECTOR OFFSET 0418 C2F6 10 27 00 B7 LBEQ LC3B1 BEING PROCESSED DO NOT PROCESS A NEW SECTOR IF THEY ARE EQUAL 0419 2 34 14 PSHS SAVE BYTE AND SECTOR OFFSET TO RECORD START ON STACK 0420 C2FC A6 4F LDA FCBFLG U CHECK FCB GET PUT FLAG AND 0421 2 27 06 BEQ LC306 BRANCH IF IT WAS GET 0422 C308 6F CLR FCBFLG U FORCE GET PUT TO PUT 0423 C382 C6 03 LDB 03 DSKCON WRITE OP CODE 0424 C394 8D 33 BSR 16339 GO WRITE A SECTOR SAVE PUT DATA ON DISK 0425 CONVERT THE SECTOR OFFSET TO A GRANULE AND SECTOR NUMBER 0426 C396 61 LC306 LDD 01 S GET THE NUMBER OF SECTORS TO THE START OF 0427 C308 BD C7 54 JSR LC754 THIS RECORD NUMBER AND CONVERT THEM TO A GRANULE OFFSET 0428 C30B 34 04 PSHS B SAVE GRANULE OFFSET ON THE STACK 0429 C30D BD C7 49 JSR 16749 MULTIPLY GRANULE NUMBER X 9 CONVERT TO NUMBER OF SECTORS 0430 C310 50 NEGB NEGATE LS BYTE OF GRANULE OFFSET AND ADD THE 0431 311 63 ADDB 503 5 LS BYTE OF SECTOR OFFSET ACCB SECTOR 0432 NUMBER 0 8 CORRESPONDING TO THE SECTOR NUMBER WITHIN A 0433 X GRANULE OF THE LAST SECTOR OF THE SECTOR OFFSET 0434 C313 5C INCB ADD ONE SECTORS SAVED IN THE FCB START 0435 C314 E7 44 STB FCBSEC U AT 1 NOT 0 SAVE IT IN THE FCB 0436 316 6 42 LDB FCBFGR U GET FIRST GRANULE IN FILE 0437 C318 BD C7
166. 466 C348 34 12 LC348 PSHS X A SAVE GRANULE COUNTER AND POINTER TO LAST USED GRANULE 0467 C34A BD C7 8F JSR LC78F FIND FIRST FREE GRANULE IN FAT 0468 C34D 1F 89 SAVE FREE GRANULE NUMBER IN ACCB 0469 C34F 35 42 PULS A U PULL LAST GRANULE POINTER AND COUNTER OFF OF STACK 0470 C351 E7 C4 STB U SAVE NEWLY FOUND GRANULE NUMBER IN ADDRESS OF LAST GRANULE 0471 C353 4A DECA DECREMENT GRANULE COUNTER 0472 C354 26 F2 BNE LC348 GET ANOTHER GRANULE IF NOT DONE 0473 C356 34 14 PSHS X B SAVE POINTER TO LAST GRANULE AND OFFSET 0474 C358 BD C6 F1 JSR 1 6 1 WRITE FAT TO DISK 0475 C35B 35 14 PULS B X RESTORE POINTER AND OFFSET 0476 0477 WHEN CORRECT GRANULE IS FOUND FIND THE RIGHT SECTOR 0478 C35D 32 61 LC35D LEAS 901 5 REMOVE GRAN NUMBER FROM STACK 0479 C35F DE F1 LDU FCBTMP POINT U TO FCB 0480 C361 E7 43 STB FCBCGR U SAVE CURRENT GRANULE IN FCB C5 DISK BASIC UNRAVELLED II 0481 0482 0483 0484 0485 0486 0487 0488 0489 0490 0491 0492 0493 0494 0495 0496 0497 0498 0499 0500 0501 0502 0503 0504 0505 0506 0507 0508 0509 0510 0511 0512 0513 0514 0515 0516 0517 0518 0519 0520 0521 0522 0523 0524 0525 0526 0527 0528 0529 0530 0531 0532 0533 0534 0535 0536 0537 0538 0539 0540 0541 0542 0543 0544 0545 0546 0547 0548 0549 0550 0551 0552 0553 0554 0555 0556 0557 0558 0559 0560 0561 0562 0563 0564 0565 0566 0567 0568 0569 0570 0571 0572 0573 0574 0575 0576 C363 C
167. 5 03 BD 9E BD D6 26 A7 20 7F 9F C6 A6 26 5A 26 9E 9F 6F 5A 2A BD BD BD BD 77 25 BD 77 18 7E 00 2 39 6 5C 34 D7 8D 35 5A 26 39 00 10 32 BD OF OF A6 27 34 6F 4D 27 09 09 DB A5 18 B2 52 B2 A5 03 09 99 09 OB 09 03 AD AC 09 09 26 AD 09 02 89 02 19 19 C5 70 04 80 F5 09 1 03 82 03 F9 1B 1B 80 F9 A4 AD 82 AC 09 03 4 09 25 6F DE 09 04 6F BE 04 F5 6F 2F 62 C7 6F F1 0g EC 02 00 05 45 59 60 6F C7 59 58 5E 19 7C 57 5E DC 3C 19 5D E2 E2 E2 37 97 5D 2D 21 9 EF 59 26 59 E3 6B 73 5B B8 35 14 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 LOAD COMMAND LOAD CMPA M LBEQ LCEE5 CLRA LC9A1 CLRB LC9A2 STA DRUNFL STB DMRGFL BSR 10985 JSR BEQ 1 9 JSR LDB R JSR LB26F JSR LA5C7 LDA 4 03 STA DRUNFL LC9BE BSR LC959 LDA DASCFL BEQ 1 900 TST DMRGFL BNE LC9CD JSR LADI9 LC9CD JMP LAC7C LOAD IN A CRUNCHED BASIC FILE LC9D 10 DFLTYP ORA DMRGFL LBNE LA616 JSR 1 019 COM DLODFL JSR LCCE2 JSR LCCE2 PSHS A JSR LCCE2 TFR A B PULS A ADDD TXTTAB JSR LAC37 LDX LC9F6 JSR LC597 LDB CINBFL BNE LC 01 STA X BRA LC9F6 LCA 1 CLR DLODFL STX VARTAB MAKE SURE LAST THREE BYTES LOADED WERE ZERO LDB 4 03 LCA 8 LDA X BNE LCA
168. 5 C918 C91A C91E C921 C923 C925 C929 C92A C92D C92F C932 C935 C938 C93A C93D C93F C942 C945 C947 C948 C94A C94C C94F C952 C954 C956 C958 C95A C95C C95E C968 C962 C964 C966 C968 C96A C96D C96E C96F C971 C973 C976 C978 C97A C97D C97F C981 C983 C985 C987 C989 C98B C98E C999 C992 C994 C996 C998 C999 C99B C99D C99F C9A1 9 9 5 9 7 C9A9 C9AB C9AD C9AF COBB C9B2 9D 1F 81 26 7E 81 26 TE 1F BD 20 32 96 34 BD BD 00 10 BD E6 C1 18 5F A6 26 E6 7E 8E 6F B6 97 CE 7 5A 26 C6 BD BD 33 C1 25 A6 81 26 A6 81 25 81 22 8D 8E 5C 5A 26 32 8C 26 C6 7E A6 81 27 81 27 81 27 8C 27 8D 20 8D 8D 5D 26 35 63 27 A6 80 25 81 22 97 39 8D 8E OF AQ 98 03 83 97 03 83 9 AD A6 62 6F 02 5 6F 2F C7 00 40 27 88 03 88 5 C2 E2 09 09 20 Cg FB 03 5 87 84 02 12 41 0 C4 30 06 33 02 33 09 0 61 09 67 2 20 2F 29 3A 09 09 E8 3E DA DD 05 DD 82 62 D7 C1 02 30 CL 03 C1 09 16 11 C6 ED DC 44 DC 18 17 4 9 4C 08 9 48 4C 4C 46 54 57 BC ED LC8F3 JSR GETNCH TFR CC B CMPA 98 BNE LC8FE JMP L8316 LCBFE CMPA 97 BNE LC905 JMP 18311 LC905 TFR B CC JSR LADC6 BRA LC8B2 EOF RAM HOOK DVEC14 LEAS 02 5
169. 535 D537 D539 7E 86 30 20 4F 30 97 BD AE BF 8E BF 86 F6 5C 9E CC ED 6 27 06 4 27 89 BD 9E EE EF E6 DE 34 9E EF BD 6 35 26 9 EF D6 E4 27 6F EC 8A ED 7E 8D 8D 34 8D 34 C6 BD CE 35 8D CE 35 34 C6 BD 33 35 E7 EF 35 7E BD 8E 8D TE BD C1 22 34 BD C1 22 34 BD D3 FF 6D 94 E8 D8 D3 68 09 01 09 52 09 C4 1 01 88 66 29 08 67 09 62 66 00 C2 F1 64 97 66 16 44 F1 B c2 61 44 F F1 09 OB 08 67 09 67 6A 80 88 CB 38 2B 18 27 18 02 05 06 10 05 06 10 50 80 5 84 10 84 02 10 5 B2 B3 2F Bl B7 03 1C 04 B7 22 13 04 B7 26 1A AD 57 00 7 5B 8D 0g 13 E6 EA 89 13 06 8 80 00 OF 9A 6D 57 46 B 38 38 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK PRINT THE PROMPT MESSAGE PRINT THE PROMPT MESSAGE IF REQUIRED PUT FLAG POINT X TO DESTINATION FILENAME DATA GO PUT SOME DATA ZERO IS THE GET FLAG POINT X TO THE SOURCE FILENAME DATA SAVE THE GET PUT FLAG GET FILENAME AND DRIVE DATA FROM THE STACK GET ASCII FLAG AND FILE TYPE AND SAVE THEM IN THE DISK RAM VARIABLES SAVE ONE SECTOR LENGTH IN RAM RECORD LENGTH VARIABLE RANDOM FILE TYPE FLAG GET THE HIGHEST RESERVED FCB NUMBER ADD ONE AND OPEN A RAND
170. 6 EC AE 31 34 31 DE 11 27 6 33 2 8D 33 20 35 11 27 16 E3 34 A6 2A E6 58 CB 4F 33 11 27 8D 33 20 AE BC 24 AC 25 AC 25 1F A3 ED 39 6F 6F 6F 39 6 5C 34 BD A6 81 26 EC 18 25 A3 ED 35 5A 26 35 11 27 A6 A7 06 CB 40 F9 09 B 8B 36 E4 1B 93 GE 41 42 92 28 45 EF 40 93 3 38 42 06 41 EF 44 05 CB A3 E2 04 45 F5 42 09 BE 22 BA 24 07 10 4 42 C4 42 43 09 04 C7 0g 40 OB OB A3 04 4 B 04 E5 56 B3 06 80 C3 1D 1F E4 48 5B 49 24 09 48 APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK ADD GRANULE OFFSET TO FAT POINTER INCREMENT GRANULE DATA ADD ONE SECTOR TO LAST GRANULE SKIP PAST THE SIX FAT CONTROL BYTES UPDATE FAT AND DIRECTORY RANDOM FILE NO UPDATE FAT AND DIRECTORY IF SEQUENTIAL INPUT FILE GET RECORD LENGTH POINT X TO RANDOM FILE BUFFER POINT Y TO END OF RANDOM FILE BUFFER SAVE POINTERS ON STACK POINT Y CURRENT STACK POINTER GET START OF VARIABLES COMPARE TO START OF ARRAYS BRANCH IF ALL VARIABLES CHECKED GET 2ND BYTE OF VARIABLE NAME MOVE POINTER TO START OF DESCRIPTOR BRANCH IF VARIABLE NUMERIC ADJUST STRING VARIABLE IF IN RANDOM FILE BUFFER MOVE POINTER TO NEXT VARIABLE PROCESS ANOTHER VARIABLE GET ADDRESS OF NEXT ARRAY TO U COMPARE TO END OF ARRAYS BRANCH IF END OF ARRAY
171. 66 JMP 1 935 10059 JSR 1 68 LDB 433 2 TST V973 LBNE LAC46 RTS WRITE COMMAND WRITE LBEQ 18958 BSR 1006 CLR DEVNUM LD GE RIS LD 6F BNE 10082 JSR LA5A5 JSR LA406 JSR LBEQ 18958 LD 7F JSR SYNCOMMA LD 82 JSR 1 156 LDA VALTYP BNE LD A7 JSR 18009 JSR 18516 JSR LB99F PRINT ITEM SEPARATOR TO CONSOLE OUT 10092 JSR GETCCH LBEQ 18958 JSR LA35F TST PRTDEV BEQ LD A3 LDA LD A3 BSR 10089 BRA LD 7F PRINT A STRING TO CONSOLE OUT LD A7 BSR 10080 JSR LB99F BSR LD B BRA 10092 PRINT STRIN G DELIMITER TO CONSOLE OUT ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK SYNTAX CHECK FOR TO AND GET NEW FILENAME GET SOURCE DRIVE NUMBER COMPARE TO NEW FILE DRIVE NUMBER FC ERROR IF FIIES ON DIFFERENT DRIVES VERIFY THAT NEW FILE DOES NOT ALREADY EXIST RESTORE INPUT POINTER GET SOURCE FILENAME AGAIN SCAN DIRECTORY FOR SOURCE FILENAME NE ERROR IF NOT FOUND SYNTAX CHECK FOR TO AND GET NEW FILENAME POINT X TO FILENAME POINT U TO DIRECTORY ENTRY OF SOURCE FILE 11 CHARACTERS IN FILENAME AND EXTENSION COPY NEW FILENAME TO SOURCE FILE DIRECTORY RAM IMAGE GET WRITE OP CODE AND SAVE IN DSKCON VARIABLE WRITE NEW DIRECTORY SECTOR FOR TO AND STRIP A FILENAME FROM BASIC TO TOKEN SYNTAX CHECK FOR TO GET FILENAME FROM BASIC SCAN DIRECTORY FOR FILENAME FILE ALREADY EXISTS ERROR CHECK FOR A MATCH AE ERROR IF FILE
172. 699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 0300 0303 0306 0308 030C D3DE D3E2 0364 0366 0368 D3EC D3EE 03 0 0363 D3F6 D3F9 D3FB D3FD D3FF 0402 0405 0408 040 0408 0400 040 0411 0412 0415 0417 0419 041 041 D41F D421 D423 D424 D426 D428 D42A 042 042 0430 0432 0434 0436 0438 D43A D43C D43F D442 D445 D448 D44A D44C 0446 0450 0452 0453 0455 0457 0458 D45A D45D D45F D461 D463 D465 D467 D469 D46B D46D D46E 0470 0472 0475 0476 BD BD 6F 30 6C 30 9C 24 6A 10 30 80 BD BD BE EE AE 34 BD F6 BD 34 4A 04 34 16 4F BD EB 89 8E 34 5F AE 27 5C 30 27 El 26 AF E7 8D 86 8D 6D 27 30 BD BD BD BD 30 A6 C6 63 26 27 63 5A 26 7E 63 8D AE 27 EC EB 89 ED 4F 8D 20 32 39 A5 CA E2 E9 E4 89 1F 6 4 27 6E BD C6 C6 09 BE OB 50 C7 09 CD 02 3F 04 89 C7 E4 00 00 16 4 09 1F 04 6A F7 4 64 50 FF 4
173. 6F 0071 0073 0076 0079 0078 DQ7F 0082 0085 0087 0089 008 D 8F 0092 0094 0098 009 0090 D09F 00 1 DBA3 0 5 0 7 00 9 D AC D AE 0080 0083 0085 0087 0089 D BC DOBF DOCO 00 1 D0C3 00 5 00 7 00 9 DOCE DOCF 0001 0003 0005 0008 D DA D DC DODF 009861 8D 35 91 18 8D 35 9F 8D BD BD 8D 8E FE C6 BD C6 D7 C6 BD 7E BD C6 7D 18 39 18 8D OF 39 81 26 BD BD 9D 18 BD BD 96 26 BD BD BD 9D 18 86 BD 00 27 86 80 20 80 BD 8D 20 BD 00 26 86 7 BD 4F 5F 34 90 26 35 BD 34 4F E3 25 AE 10 23 C6 7E EE ED 2A 02 26 28 10 6 1F C6 C6 12 09 09 OB A5 03 EA D6 A5 B2 C9 C6 42 09 26 27 03 6F 23 OF A5 A4 A5 27 B2 Bl 06 1 BD B5 B9 A5 27 2C A3 6E 02 00 14 08 07 9 02 2 6E B7 22 A2 c8 16 A5 02 96 B7 14 63 97 65 A3 05 44 63 63 4 8C E5 4C 74 9A F2 6F 35 8C 73 DB E8 A5 06 E8 6D 56 D9 16 9F E8 5F 9F 5F 82 2E 38 09 46 1 1 09 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 10051 PULS A CMPA DCDRV LBNE LB44A BSR 10059 PULS X STX CHARAD BSR 10056 JSR LC68C JSR 1 6 5 10051 LDX DNAMBF LDU V974 LDB 08 JSR LA59A LDB 4 03 STB DCOPC JMP LD6F2 DO A SYNTAX CHECK 10051 LDB 5 JSR LB26F 1005
174. 7 BSR 10465 LD436 JMP 18146 EVALUATE DRIVE TRACK AND SECTOR NUMBERS LD439 JSR EVALEXPB CMPB 03 BHI LD45C PSHS B JSR 18738 CMPB TRKMAX 1 BHI LD45C PSHS B JSR 18738 STB DSEC DECB CMPB SECMAX 1 BHI LD45C PULS A B STA DCTRK STB DCDRV RTS LD45C JMP 1 44 LD45F JSR SYNCOMMA LDX L8156 LD465 LDB DCDRV LDU DCTRK PSHS U B JSR X PULS B U STB DCDRV STU DCTRK C29 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK POINT X TO THE SYSTEM FCB SET THE NUMBER OF BYTES IN THE LAST SECTOR OF THE FILE EQUAL TO ONE SECTOR LENGTH GET THE NUMBER OF SECTORS TO MOVE AND BRANCH IF NONE LEFT GRAB THE GET PUT FLAG AND IT WITH THE GRAN TEST FLAG BRANCH IF GET ING DATA OR THIS IS NOT THE FIRST TIME THROUGH THE LOOP GET THE NUMBER OF SECTORS REMAINING TO BE COPIED AND ADD THE NUMBER TO BE COPIED THIS TIME THROUGH LOOP PUT THE LAST RECORD IN THE FILE TO THE SYSTEM FCB THE RECORD NUMBER IS IN ACCD POINT X TO THE SYSTEM FCB GET THE CURRENT RECORD NUMBER AND SAVE IT IN THE FCB GET THE NUMBER OF THE RECORD SECTOR TO MOVE END OF ARRAYS IS THE START OF THE COPY FREE RAM BUFFER SAVE SECTOR COUNTER AND BUFFER POINTER ON THE STACK POINT X TO SYSTEM FCB SET THE RANDOM FILE BUFFER POINTER TO THE COPY RAM BUFFER THIS WILL CAUSE THE SYSTEM TO HANG IF AN ERROR OCCURS DURING COPY GO GET OR PUT DATA TO THE SYSTEM FCB ADD 256 ONE SECTOR TO THE BUFFER POINTER GET THE SECTOR COUNTER
175. 7 CDEA CDEC CDEF CDF2 CDF4 CDF7 CDF9 CDFD CDFF 2 5 7 CE D 10 12 14 16 19 CE1B CE1D 20 23 25 29 CE2C CE2E 2 CE36 CE37 CE39 41 44 45 47 49 4 4 CE4F CE51 CE53 CE55 CE57 CE59 CE5B CE5D CESF CE61 CE63 CE65 CE68 CE6A CE6C CE6E CE70 CE72 CE75 CE77 CE7A CE7C CE7E CE80 CE82 CE84 CE87 CE8A CE8C 90 92 94 96 99 35 7 63 35 BD C1 18 OF 7E BD C6 BD BD 7E 8D EC DD 7E 96 34 BD BD 00 10 BD 35 97 6D 18 39 8D A6 97 E6 34 BD 4 C4 34 16 4F BD EB 89 35 34 6 81 35 26 34 93 27 83 8D D6 27 CB D7 BD AE EC 84 8D OF 96 06 BD BD 35 EC 8D OF 96 06 BD 7E 88 94 88 88 94 B6 05 25 06 BC Bl 05 5 BC B6 07 07 52 88 6F 02 1 5 6F 2F C7 02 6F 0g 27 EQ 01 02 10 CD 94 89 C7 EQ 0g 18 02 00 40 02 5 10 8A 93 4F 94 08 4F BC E4 88 7F 96 62 5C 4F B9 BC 10 09 84 62 5C 4F BB BC 11 18 54 E6 4D 14 43 OF 35 9B 43 E6 21 44 D5 C5 1E 79 01 5F C5 5F 91 EE APPENDIX B ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 1 REVISED 12 26 1999 WALTER K ZYDHEK STD FCBGET X PULS B X PC RESTOR
176. 7 unused direct page variables for the user when Disk Basic is installed At the beginning of Disk RAM are two sector length 256 bytes 0 buffers which are primarily used to buffer data transfers to and from the disk controller DBUF is the main I O buffer and is involved in virtually all disk data transfers The secondary I 0 buffer DBUF1 is used as a buffer during verify operations and is used as a scratchpad work area or a temporary home for the stack during certain other disk commands such as DSKI DSKO and DSKINI Following these two buffers are four buffers for the File Allocation Tables and control blocks for the four drives After these buffers are the variables which Disk Basic uses for its own internal purposes and a description of the function of these variables may be found in the direct page memory map found at the beginning of the disassembled list of Disk Basic Disk Basic also allocates two additional blocks of RAM for random file buffer and file control block storage The area for these storage areas is directly after the disk variable RAM and just before the graphic page reserved area The random file buffer area is used to save a one record length buffer for each active random file The random file buffer size may be changed with the FILES command Each time a random file is OPENed or CLOSEd one record length of memory is allocated or deallocated from the available buffer space in the random file buffer area If there is n
177. 8 EQ 88 38 09 27 09 02 EA D5 09 09 84 20 80 09 OB A5 09 40 21 C7 09 42 03 05 56 67 01 01 09 03 C6 D6 6F 2F 62 14 70 09 6F 46 73 48 7C 74 13 76 73 74 00 12 77 E7 73 FF 78 74 4C 9A 57 8F 76 FF 25 7A Fl C7 26 03 5C LC4DE LDB JMP PSHS TST BNE BSR BSR COM LC4E3 LC4EC INC PULS STD STU LDU STU BRA INITIALIZE LC500 BSR LDU LDU STU RTS INITIALIZE LC50B LDX LDB CLR DECB BNE LDX LDA STA LDA STA STA LDB SUBB ASLB ASLB ASLB PSHS LDD SUBD LDA MUL ADDA STA RTS LC50F APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 2 29 LAC46 973 LCAEC LC53A LC50g FCBSOF X FCBREC 1 X A B U RNBFAD FCBBUF X DFFLEN FCBRLN X LC496 FCB DATA FOR INPUT LC50B V974 DIRLST U FCBLST X FILE CONTROL BLOCK FCBTMP FCBCON X LC50F FCBTMP DCDRV FCBDRV X V976 FCBFGR X FCBCGR X 973 03 974 DBUFO 08 35 FCBDIR X 00 OF BUFFER SPACE ERROR JUMP TO ERROR HANDLER SAVE END OF RANDOM BUFFER ON STACK DID THIS FILE EXIST BRANCH IF SO SET UP NEW FILE IN DIRECTORY INITIALIZE FILE BUFFER SET FCBSOF X TO FF ILLEGAL SECTOR OFFSET WHICH WILL FORCE NEW SECTOR DATA TO BE READ IN DURING GET PUT INITIALIZE RECORD NUMBER 1 START OF RANDOM FILE BUFFER AREA ACCD END SAVE NEW START OF RANDOM FILE BUFFER AREA SAVE BUFFER S
178. 8 070 070 D7OF D711 D712 D714 D717 D719 D71B D71D 0720 0722 0724 0727 0729 0728 D72D D72F D731 D733 D735 D737 D739 D73B D73E D741 D744 D746 D749 D74C D74E 0750 0753 0756 0759 0758 0756 0760 0762 0764 0766 AD 35 D6 27 4A 27 34 8D 26 20 86 B7 35 8E 06 6F 86 B7 1E 1E 8D 8D 84 97 39 9E 30 27 6 85 26 39 86 B7 1E 1E B6 86 97 39 8E 30 26 39 86 8C 86 34 86 06 3A E6 F7 01 27 96 B7 A7 86 B7 1E 1E 8D 26 8D 84 27 97 35 96 B7 86 BF 9E B6 B6 8A 35 18 CE 73 1A F7 1E 1E C1 27 C6 95 02 OB 08 02 B F1 B4 78 09 F6 09 85 03 FF 88 88 97 24 10 F 8A 1F 08 FF 01 F5 00 FF 88 88 FF 80 F 22 1F FC 80 02 09 84 FF EC 1E EC FF 84 17 FF 88 88 81 08 18 04 F 82 ED FF D7 09 FF 09 80 04 9E FF 09 50 FF 88 88 80 1C 02 85 7 48 48 48 48 2 7 49 48 48 4 98 83 48 86 8A 48 82 48 JSR B X LD6AD PULS A LDB DCSTA BEQ LD6BE DECA BEQ LD6BE PSHS A BSR LD6C5 BNE LD6AD BRA 10672 LD6BE LDA 120 STA RDYTMR PULS A B X Y U PC RESTORE HEAD TO TRACK 0 LD6C5 LDX 4DROTRK LDB DCDRV CLR B X LDA 4 03 STA FDCREG EXG A A EXG A A BSR LD6DE BSR 106 0 ANDA 4510 STA DCSTA LD6DD RTS WAIT FOR THE 1793 TO BECOME UNBUSY FORCE AN INTERRUPT
179. 8 CINBFL FCBV1 2 DEVNUM C8 DISK FULL ERROR GET SECTOR NUMBER OF FIRST EMPTY DIRECTORY ENTRY DISK FULL ERROR IF NO EMPTY DIRECTORY ENTRIES SAVE SECTOR NUMBER OF FIRST EMPTY DIRECTORY ENTRY SAVE SECTOR NUMBER IN DSKCON REGISTER READ CODE SAVE IN DSKCON REGISTER READ SECTOR GET ADDRESS OF RAM IMAGE OF UNUSED DIRECTORY ENTRY AND SAVE AS CURRENT USED RAM IMAGE TFR X U POINT U TO DIRECTORY RAM IMAGE SET COUNTER TO CLEAR 32 BYTES DIRECTORY ENTRY CLEAR BYTE DECREMENT COUNTER CONTINUE IF NOT DONE POINT TO FILENAME AND EXTENSION RAM IMAGE 11 BYTES IN FILENAME AND EXTENSION MOVE B BYTES FROM X TO U GET FILE TYPE AND ASCII FLAG SAVE IN RAM IMAGE FIRST GRANULE TO CHECK FIND THE FIRST FREE GRANULE SAVE IN RAM SAVE IN RAM IMAGE OF DIRECTORY TRACK GET WRITE OPERATION CODE AND SAVE IT IN DSKCON REGISTER GO WRITE A SECTOR IN DIRECTORY SAVE REGISTERS POINT X TO FILE ALLOCATION TABLE INDICATE NEW DATA IN FILE ALLOC TABLE GET NEW DATA FLAG HAVE ENOUGH GRANULES BEEN REMOVED FROM THE FAT TO CAUSE THE FAT TO BE WRITTEN TO THE DISK RETURN IF NO NEED TO WRITE OUT ALLOCATION TABLE WRITE FILE ALLOCATION SECTOR TO DISK RESTORE REGISTERS GET DEVICE NUMBER BRANCH IF NOT DISK FILE GET RID OF RETURN ADDRESS SAVE REGISTERS CLEAR BUFFER NOT EMPTY FLAG POINT TO FILE BUFFER VECTOR TABLE GET ACTIVE DISK FILE NUMBER TIMES 2 TWO BYTES PER FCB ADDRESS ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTE
180. 83 89 APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 RTS DSKO COMMAND DSKO BSR 10439 BSR LD45F BSR 10436 LDX FPA0 2 PSHS X BSR LD45F JSR 18654 PSHS X B CLRB LDX DBUF LD489 CLR X DECB BNE 10489 PULS B X LDU DBUF0 128 BSR LD42B PULS X JSR LB659 LDU DBUFO BSR LD42B LDB 4 03 LD4A1 LDX DBUFO STX STB DCOPC JMP LD5FF DSKINI COMMAND DSKINI LBEQ LA61F JSR 10169 LDB 4504 JSR GETCCH BEQ L04C4 JSR LB738 CMPB 17 LBHS LB44A JSR L 5C7 104 4 5 5 LDX DBUF1 SECMAX LDB 5 LD4CB CLR X DECB BNE LD4CB CLRA BRA LD4E8 CALCULATE LOGICAL SECTOR NUMBERS LD4D3 ADDB 5 10405 INCB LD4D6 SUBB SECMAX BHS 10406 ADDB SECMAX TST B X BNE 10405 LD4E INCA STA B X CMPA SECMAX BLO LD4D3 LEAS 901 5 LDX DFLBUF 1888 2 CMPX MEMSIZ LBHI LAC44 JSR DVEC7 COM DRESFL LDS DBUF1 SECLEN JSR 195 LDA 4 00 STA DCOPC JSR LD5FF CLR RDYTMR LDA C0 STA FDCREG JSR LD6DE LBNE LD59B CLR DCTRK BRA 10533 10519 22 BLO 10525 LDA ORA 8510 STA DSKREG 10525 10 53 STA FDCREG EXG A A EXG A A JSR LD6DE BNE LD59B 10533 JSR LD6FD BSR D5A4 LDY FDCREG 3 ORCC 50 LDX 10562 STX DNMISV LDX DFLBUF C30 REVISED 12 26 1999 WALTER K ZYDHEK GET THE DRIVE TRACK AND SECTOR NUMBERS GET THE DESCRIPTOR OF STRING 1 TM ERROR IF NUMERIC EXPRESSION GET STRING 1 DESCRIPTOR ADDRESS AND SAVE IT ON THE STACK
181. 8357 JSR 18146 PSHS X LDX 2 CMPX DFLBUF BLO 10119 CMPX FCBADR BLO 1011 10119 LDB 2 35 JMP LAC46 LD11E LDB B3 JSR LB26F JSR 18748 PULS Y LDA Y BEQ 1015 PSHS B LDB 5 LDU 02 Y APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 FILL THE FIELDED STRING WITH BLANKS LD132 SIB U DECA BNE 10132 LDB 5 BEQ LDI5A CMPB V BLO 10143 LDB Y CLR 5 10143 100 02 Y TST 5 BEQ 10157 RSET ROUTINE PSHS B CLRA NEGB SBCA 500 ADDB Y ADCA 00 LEAU 0 0 PULS B 10157 JMP LA59A LD15A PULS A PC FILES COMMAND FILES JSR 195 LDD FCBADR SUBD DFLBUF PSHS B A LDB PSHS B JSR CMPA BEQ 10181 JSR EVALEXPB CMPB 15 LBHI LB44A STB 5 JSR GETCCH BEQ 10189 10181 JSR SYNCOMMA JSR LB3E6 STD 1 5 10189 JSR DVEC7 LDB 5 PSHS B LDD DFLBUF ADDD 502 5 BLO 10208 STD 02 5 RESERVE SPACE FOR FCBS ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK POINT ACCD TO START OF RANDOM FILE BUFFER POINT U TO THIS FIELD S SLOT IN THE RANDOM FILE BUFFER AND SAVE IT ON THE STACK SECONDARY TOKEN SYNTAX CHECK FOR SECONDARY TOKEN 5 TOKEN SYNTAX CHECK FOR AS TOKEN EVALUATE VARIABLE TM ERROR IF NUMERIC VARIABLE PULL STRING ADDRESS AND LENGTH OFF OF THE STACK AND SAVE THEM IN STRING DESCRIPTOR CHECK FOR ANOTHER FIELD SPECIFICATION SKIP ONE BYTE LSET FLAG 0 SAVE RSET 4F LSET FLAG ON THE STACK EVALUATE FIE
182. 9 DOFB DOFF 0101 0102 0103 0105 0108 0108 0100 010L 0112 0114 0117 0119 0118 0116 0120 0123 0126 0128 D12A D12C 012 0130 0132 0134 0135 0137 0139 0138 0130 013L 0141 0143 0145 0147 0149 0148 014C 0140 014L 0151 0153 0155 0157 D15A D15C D15F D162 D165 D167 D16A D16C D16E 0170 0172 0175 0177 0178 0170 D17F D181 D184 D187 D189 D18C 0186 0190 0193 0195 0197 EC 33 EF C6 BD C6 BD BD BD 35 E7 EF 20 86 4F 34 BD BD 34 AE 8C 25 BC 25 C6 7E C6 BD BD 35 A6 27 34 C6 EE 4 26 E6 27 El 25 E6 6F EE 6D 27 34 4F 50 82 89 33 35 L 35 BD FC 83 34 F6 34 9D 81 27 BD C1 18 E7 9D 27 BD BD ED BD E6 34 CC E3 25 ED B CB 61 FF B2 7 B2 B3 B1 44 84 92 C2 02 B3 Bl 18 02 09 05 09 05 46 B3 B2 87 20 A4 2E 04 20 22 1F A4 04 4 4 22 EQ BE 04 00 4 00 94 A5 82 95 09 09 06 09 04 5 2C OF B7 OF 22 4 5 08 2 B3 61 CA E4 04 09 62 71 62 6F 6F 57 46 57 46 89 4A 46 6F 48 9A AC 4A 89 5B B E2 6D E6 E9 89 CL LDD FCBBUF X LEAU D U STU 01 5 LDB FF JSR LB26F LDB 7 JSR LB26F JSR 18357 JSR 18146 PULS B U STB X STU 02 BRA LD C3 RSET COMMAND RSET LDA 4F LSET COMMAND LSET CLRA PSHS A JSR 1
183. 9 LC706 RTS 1100 1101 CHECK ALL ACTIVE FILES TO MAKE SURE A FILE IS NOT ALREADY OPEN TO OPEN 1102 A FILE BUFFER MUST MATCH THE DRIVE NUMBER AND FIRST GRANULE NUMBER 1103 IN RAM DIRECTORY ENTRY AND THE FCB TYPE MUST NOT MATCH THE FILE TYPE IN ACCA 1104 AN AO ERROR WILL NOT BE GENERATED IF A FILE IS BEING OPENED FOR 1105 THE SAME MODE THAT IT HAS ALREADY BEEN OPENED UNDER 1106 1107 C7D7 34 92 LC7D7 PSHS A SAVE FILE TYPE ON STACK 1108 709 F6 09 5B LDB NUMBER OF CURRENTLY OPEN FILES 1109 C7DC 5C INCB ADD ONE MORE TO FILE COUNTER 1114 C7DD BD C7 19 LC7DD JSR 16719 POINT X TO FCB OF THIS FILE 1111 C7EQ 27 17 BEQ LC7F9 BRANCH IF BUFFER NOT BEING USED 1112 C7E2 96 EB LDA DCDRV GET DRIVE NUMBER AND CHECK TO SEE IF IT 1113 C7E4 1 01 CMPA FCBDRV X MATCHES THE DRIVE NUMBER FOR THIS BUFFER 1114 C7E6 26 11 BNE LC7 9 FILE EXISTS ON ANOTHER DRIVE 1115 C7E8 FE 09 74 LDU V974 GET RAM DIRECTORY AREA 1116 C7EB A6 4D LDA DIRGRN U GET FIRST GRANULE IN FILE 1117 C7ED 1 02 CMPA FCBFGR X DOES IT MATCH THIS FILE BUFFER 1118 C7EF 26 08 BNE LC7F9 NO 1119 C7F1 A6 00 LDA FCBTYP X GET FILE TYPE OF THIS BUFFER 1120 7 Al E4 CMPA 5 DOES IT MATCH THE ONE WE ARE LOOKING FOR 1121 C7F5 10 26 DE 23 LBNE LA61C FILE ALREADY OPEN ERROR IF NOT 1122 C7F9 5A LC7F9 DECB DECR FILE COUNTER 1123 C7FA 26 1 BNE LC7DD BRANCH IF HAVEN T CHECKED ALL ACTIVE FILES 1124 C7FC 35 82 PULS A PC RESTORE FILE TYPE AND RE
184. A DCTRK LDX DFLBUF STX B27 SAVE IT IN DSKCON VARIABLE DISK BASIC UNRAVELLED II 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 030 030 0310 0312 0315 0317 0318 031 D31C D31E D31F D321 D322 D324 D326 D328 D32B D32E D331 D333 D336 D339 D33B D33D D33F D342 D344 D347 D34A D34C D34F D352 D354 D357 D35A D35C D35E D35F D365 D36B D36C D372 D378 D37E D384 D38A D38B D38C D392 D398 D399 D39B D39D D3AQ D3A2 D3A4 D3A5 D3A7 D3A9 D3AB D3AD D3AF D3B1 D3B3 D3B6 D3B9 D3BC D3BE 03C0 03C2 03C4 03C6 03C8 D3CB D3CE 96 C6 D7 BD 0 5C C1 23 0 26 39 E6 1 26 7 7 7 34 BD 86 C6 A6 27 8E C6 BD 86 C6 BD CC 97 BD BD 81 26 39 49 20 45 49 20 4E 20 54 44 gD 50 27 27 35 C6 8E A6 34 5A 26 96 34 6E A6 97 C6 CE 7E BD 8D 6F 9D 27 63 C6 BD BD 8D 03 01 ED D6 EE 12
185. A928 CLEAR SCREEN LDX LD35F POINT X TO INSERT SOURCE MESSAGE LDB 13 13 BYTES IN MESSAGE LDA 5 GET SOURCE DESTINATION FLAG FROM THE STACK BEQ 10344 BRANCH IF SOURCE LDX LD36C POINT X TO INSERT DESTINATION MESSAGE LDB 18 18 BYTES IN MESSAGE LD344 JSR LB9A2 SEND MESSAGE TO CONSOLE OUT LDX LD37E POINT X TO DISKETTE AND MESSAGE LDB 27 27 BYTES IN MESSAGE JSR LB9A2 SEND MESSAGE TO CONSOLE OUT LDD 456405 SET UP SOUND PARAMETERS STA SNDTON FOR A BEEP JSR LA951 JUMP TO SOUND DO A BEEP LD357 JSR LA171 GET A CHARACTER FROM CONSOLE IN CMPA CL KEEP LOOKING AT CONSOLE IN UNTIL BNE LD357 YOU GET A CARRIAGE RETURN LD45E RTS LD35F FCC INSERT SOURCE LD36C FCC INSERT DESTINATION LD37E FCC DISKETTE AND FCB CR PRESS ENTER PUSH FILENAME EXT AND DRIVE NUMBER ONTO THE STACK LD399 PULS Y SAVE RETURN ADDRESS IN Y LDB 11 11 CHARACTERS IN FILENAME AND EXTENSION LDX DNAMBF 11 POINT X TO TOP OF DISK NAME EXT BUFFER LD3A8 LDA GET A CHARACTER FROM FILENAME PSHS A EXT BUFFER AND PUSH IT ONTO THE DECB STACK DECREMENT COUNTER AND BNE LD3A8 KEEP LOOPING UNTIL DONE LDA DCDRV GET DRIVE NUMBER AND PUSH PSHS A IT ONTO THE STACK JMP SY PSEUDO RETURN TO CALLING ROUTINE PULL FILENAME EXT AND DRIVE NUMBER FROM X TO RAM LD3AD LDA X GET DRIVE NUMBER AND SAVE STA DCDRV IT IN DSKCON VARIABLE LDB 11 11 BYTES IN FILENAME AND EXTENSION LDU DNAMBF POINT U TO DISK NAME
186. ABLE CHECK FOR OUTPUT TYPE AND BRANCH IF NOT OUTPUT TYPE FILE GET THE NUMBER OF CHARACTERS IN BUFFER SET THE PRE SAVED BIT TO INDICATE THAT THE DATA HAS ALREADY BEEN SAVED ON DISK OR IN THE FULL SECTOR FLAG SAVE THE NUMBER OF BYTES USED IN THE LAST SECTOR INCREMENT THE SECTOR NUMBER GET THE CURRENT GRANULE NUMBER POINT X TO FILE ALLOCATION TABLE SET FAT DATA NOT VALID FLAG lt gt 0 DISK BASIC UNRAVELLED 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 CB2B CB2C CB2E CB31 CB33 CB35 CB37 CB39 CB3B CB3D CB3F CB41 CB44 CB46 CB48 CB4A CB4C CB4E CB50 CB52 CB54 C857 C859 CB5B CB5D CB5F CB61 CB63 CB65 CB66 CB68 CB69 CB6B CB6E C 70 CB72 CB74 CB76 CB78 CB7B CB7D CB7F CB81 CB83 CB85 CB87 CB89 CB8B CB8C CB8E 90 92 CB93 CB96 CB97 CB99 CB9C CB9E CBAS CBA2 CBA4 CBA7 CBA9 CBAB CBAD CBAF CBBO CBB2 CBB4 CBB8 CBBA CBBC 3A 6C 7E 81 2
187. ABLED 0748 4 HBORD HORIZONTAL BORDER IRQ ENABLED 0749 5 INTERRUPT FROM TIMER ENABLED 0750 BIT6 0751 BIT7 0752 0753 FF93 FIRQENR RMB 1 FIRQ INTERRUPT ENABLE REGISTER 0754 0755 FF93 BIT EI CARTRIDGE FIRQ ENABLED 0756 EIl KEYBOARD FIRQ ENABLED 0757 2 EI2 SERIAL DATA FIRQ ENABLED 0758 BIT3 VBORD VERTICAL BORDER FIRQ ENABLED 0759 4 HBORD HORIZONTAL BORDER FIRQ ENABLED 0760 BIT5 TMR INTERRUPT FROM TIMER ENABLED 0761 BIT6 0762 BIT7 0763 0764 FF94 V TIMER RMB 2 TIMER REGISTER 0765 FF96 RMB 2 RESERVED FOR FUTURE EXPANSION 0766 0767 FF98 VIDEOREG 1 VIDEO MODE REGISTER 0768 0769 FF98 BITE LPR LINES PER ROW SEE TABLE BELOW 0770 LINES PER ROW SEE TABLE BELOW 0771 2 2 LINES PER ROW SEE TABLE BELOW 0772 BIT3 H5 1 50 Hz VERTICAL REFRESH 0773 4 MOCH 1 MONOCHROME ON COMPOSITE 0774 5 1 BURST PHASE INVERTED 0775 6 0776 BIT7 BP ALPHA 1 BIT PLANE 0777 0778 2 LINES CHARACTER ROW 0779 0 0 0 1 GRAPHICS MODES 0780 2 C0C0 1 amp 2 ONLY 0781 0 1 0 3 C0C0 1 amp 2 ONLY 0782 1 8 0783 1 0 0 9 0784 1 0 RESERVED 0785 1 1 0 12 0786 1 1 RESERVED 0787 0788 99 VIDEOREG RMB VIDEO MODE REGISTER 0789 0790 FF99 BIT 50 COLOR RESOLUTION 0791 CRES1 COLOR RESOLUTION 0792 2 HRES HORIZONTAL RESOLUTION 0793 BIT3 51 HORIZONTAL RESOLUTION 0794 4 52 HOR
188. AND SAVE CMPA M LBEQ LCE8C BSR 10985 LDX ZERO STX DFLTYP JSR BEQ LC964 JSR LDB A JSR LB26F BNE LC931 COM DASCFL BSR LC956 CLRA JMP LIST OPEN A SEQUENTIAL FILE FOR INPUT OUTPUT USE FCB LOCATED AT THE TOP OF FCBS TOGGLE DRIVE FLAG BAD FILENAME ERROR IF DRIVE NUMBER DEFINED TWICE ASCII VALUE OF DRIVE NUMBER TO ACCA DECREMENT STRING LENGTH BY 2 FOR DRIVE X SUBTRACT ASCII BIAS DRIVE NUMBER TOO LOW MAX OF 4 DRIVES DRIVE NUMBER TOO HIGH BAD FILENAME ERROR STORE IN DSKCON DRIVE NUMBER BAD FILENAME ERROR BAD FILENAME ERROR IF NO FILENAME YET POINT X TO END OF EXTENSION BUFFER BLANK FILL EXTENSION WITH BLANKS DEFAULT DECREMENT STRING COUNTER RETURN IF ZERO GET A CHARACTER FROM STRING CHECK FOR DRIVE SEPARATOR CHECK FOR END OF ESTENSION RAM BUFFER amp BAD FILENAME ERROR IF EXTENSION TOO LONG PUT A CHARACTER IN EXTENSION BUFFER GET ANOTHER EXTENSION CHARACTER STORE CHARACTER IN FILENAME BUFFER BAD FILENAME ERROR ZEROES ARE ILLEGAL PERIOD BAD FILENAME SLASH BAD FILENAME CHECK FOR FF BAD FILENAME ERROR IF PERIOD ERROR IF SLASH ERROR IF FF BRANCH IF SAVEM GO GET FILENAME ETC ZERO OUT X REG SET FILE TYPE AND ASCII FLAG TO ZERO GET CURRENT INPUT CHARACTER FROM BASIC BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA ASCII FILE SYNTAX CHECK ON CONTENTS OF ACCB RETURN IF NO MORE CHARACTERS ON LINE S
189. ANOTHER GRANULE IF NOT DONE SAVE POINTER TO LAST GRANULE AND OFFSET WRITE FAT TO DISK RESTORE POINTER AND OFFSET SECTOR REMOVE GRAN NUMBER FROM STACK POINT U TO FCB SAVE CURRENT GRANULE IN FCB SET FCBSOF U TO ILLEGAL SECTOR OFFSET WHICH WILL FORCE NEW SECTOR DATA TO BE READ IN GET CURRENT GRANULE IS IT THE LAST GRANULE NO MASK OFF LAST GRANULE FLAG BITS COMPARE CALCULATED SECTOR TO CURRENT SECTOR IN FCB AND BRANCH IF CALCULATED SECTOR IS LAST SECTOR IN FILE CHECK GET PUT FLAG IF GET THEN INPUT PAST END OF FILE ERROR GET CURRENT SECTOR NUMBER FROM FCB OR IN THE LAST GRANULE FLAG BITS AND SAVE IN FAT WRITE FAT TO DISK IF NECESSARY GET RECORD LENGTH AND CHECK TO SEE IF IT IS SECLEN EXACTLY ONE SECTOR BRANCH IF IT IS NOT EXACTLY ONE SECTOR BRANCH IF THE NUMBER OF BYTES IN THE LAST SECTOR IS SET TO ONE SECTOR SECLEN SET THE PRESAVED FLAG BIT15 AND FORCE THE NUMBER OF BYTES IN LAST SECTOR TO 256 SET THE NUMBER OF BYTES IN LAST SECTOR TO ZERO CLEAR LS BYTE OF ACCD SAVE THE NUMBER OF BYTES IN LAST SECTOR DSKCON READ OP CODE GET RECORD LENGTH AND COMPARE IT TO SECLEN EXACTLY ONE SECTOR BRANCH IF NOT EXACTLY ONE SECTOR LONG CLEAN UP STACK POINT X TO START OF RANDOM FILE BUFFER CHECK GET PUT FLAG AND BRANCH IF GET DSKCON WRITE OP CODE READ WRITE A SECTOR READ A SECTOR INTO FCB DATA BUFFER GET BACK THE BYTE OFFSET TO RECORD X NUMBER OF SECTORS ACCB BYTE POI
190. ARANTEE ENOUGH ROOM SINCE ALL CALCULATIONS USE ONLY THE MSB OF THE ADDRESS OUT OF MEMORY ERROR IF PAST FFFF IS IT GREATER THAN THE START OF STRING SPACE OUT OF MEMORY IF START OF STRING SPACE SUBTRACT 256 COMPENSATE FOR INCA ABOVE SUBTRACT START OF VARIABLES ADD START OF BASIC Y HAS NEW START OF BASIC GET THE GRAPHIC RAM START SUBTRACT THE OLD GRAPHIC RAN START AND SAVE THE DIFFERENCE IN ACCA AND ACCB ADD THE OLD GRAPHIC PAGE START AND STORE THE NEW START OF GRAPHICS RAM ADD THE OLD GRAPHIC RAM END ADDRESS AND STORE THE NEW END OF GRAPHICS RAM ACCA MSB OF START OF GRAPHIC RAM ACCB NUMBER OF FILE BUFFERS U START OF FILE BUFFERS SAVE NEW START OF GRAPHIC RAM NUMBER OF FILE BUFFERS START OF FILE BUFFERS POINT U TO OLD START OF VARIABLES SAVE NEW START OF VARIBLES COMPARE OLD START OF VARIABLES TO NEW START OF VARIABLES amp BRANCH IF OLD NEW I I GET A BYTE MOVE 1T AT START OF BASIC PROGRAM NO STORE NEW START OF BASIC PROGRAM RESET START OF PROGRAM FLAG CLOSE ALL FILES OUT OF MEMORY ERROR START ADDRESS POINT U TO OLD START OF BASIC SAVE NEW START OF BASIC RESET START OF BASIC FLAG GET A BYTE MOVE IT AT START OF VARIABLES NO MOVE ANOTHER BYTE POINT POINT RESET STORE U TO FILE BUFFER POINTERS X TO START OF BUFFERS FILE COUNTER FILE ADDRESS IN VECTOR TABLE RESET FILE TYPE TO CLOSED GO TO NEXT FCB INCREMENT FILE COUNTER CLOSE ALL ACTIVE BUFFERS AN
191. B 16 BIT CORRESPO NDING IF DOUBLE WIDE IS SELECTED MEMORY MANAGEMENT UNIT REGISTERS 6 BITS D5 D4 MEMORY ADDRESS 18 A17 FOR MEMORY ACCESS PALETREG RMB ADDRESS 0000 2000 4000 6000 8000 000 XC000 000 0000 2000 4000 6000 8000 000 XC000 000 16 DATA BIT RGB OUTP COMP OU RANGE XLFFF X3FFF X5FFF X7FFF X9FFF XBFFF XDFFF XFFFF X1FFF X3FFF X5FFF X7FFF X9FFF XBFFF XDFFF XFFFF UT TPUT 15 A 0 0 0 1 1 1 1 A EA pa pa pa pa pa pa HL COLOR PALETTE D5 D4 R1 61 11 Ig D3 D2 A16 A15 A14 A13 0 0 0 0 0 0 0 0 0 0 0 0 D3 D2 Bl R P3 P2 D1 A14 D A13 6 ADDRESS LINES A13 A18 MMU LOCATION FFAS FFA1 2 FFA3 FFA4 FFAS FFA6 FFA7 FFA8 FFA9 FFAA FFAB FFAC FFAD FFAE FFAF REGISTERS 6 BITS Di 60 1 D B P FOR COCO COMPATIBILITY THE FOLLOWING SHOULD BE LOADED ON INITIALIZATION RGB VALUES FO SAMREG V CLR V SET VICLR VISET V2CLR 1 2 FFB4 FFB5 FFB6 FFB7 FFB8 FFB9 FFBA FFBB FFBC FFBD FFBE FFBF EQU RMB RMB RMB RMB RMB REEN ELLOW LUE ED UFF lt gt AGENTA RANGE LACK REEN LACK UFF LACK REEN LACK RANGE Z GO gt lt G
192. B JSR 18262 PULS B LDX LC214 JMP LB2CE ERROR DRIVER RAM VECTOR DVEC17 PULS Y JSR LAD33 JSR LD1E5 PSHS Y B JSR DVEC7 PULS B CMPB 42 27 1 5 XVEC17 LEAS 02 S JSR 1 7 9 JSR 14974 CLR DEVNUM JSR LB95C JSR LB9AF LDX LC278 2X27 JMP L C60 DISK BASIC ERROR MESSAGES LC290 BR FCC DF FCC FCC WP FCC FN FCC FS FCC AE FCC FO FCC 5 VF FCC ER DISK FILE EXTENSIONS BASEXT FCC BAS DEFEXT FCC DATEXT FCC BINEXT FCC BIN CLS RAM VECTOR DVEC22 5 5 X CC LDX 503 5 CMPX L975F BNE 1 2 7 CMPA BEQ LC2 9 LC2A7 PULS CC X PC GET PUT TO A DIRECT RANDOM FILE LC2A9 LEAS 905 5 JSR LC7FE STX FCBTMP CLR FCBGET X CLR FCBGET 1 X c4 COMPARE MODIFIED SECONDARY TOKEN TO HIGHEST DISK BASIC TOKEN amp BRANCH IF HIGHER JUMP TO USER SECONDARY COMMAND HANDLER SUBTRACT OUT THE SMALLEST SECONDARY DISK TOKEN amp SAVE MODIFIED TOKEN ON THE STACK SYNTAX CHECK FOR AND EVALUATE EXPRESSION RESTORE MODIFIED TOKEN POINT X TO SECONDARY COMMAND JUMP TABLE JUMP TO BASIC S SECONDARY COMMAND HANDLER PUT THE RETURN ADDRESS INTO Y RESET THE CONT FLAG ETC INITIALIZE SOME DISK VARIABLES AND CLOSE FILES PUT RETURN ADDRESS AND ERROR NUMBER ON THE STACK CLOSE ALL FILES GET THE ERROR NUMBER BACK COMPARE TO THE LOWEST DISK ERROR NUMBER BRANCH TO EXBAS ERROR HANDLER IF NOT DISK ERROR NUMBER PURGE RETURN ADDRESS OFF T
193. B 3 A5F6 C426 C44B OPEN COMMAND 0413 0161 RVECI RMB 3 A5B9 C838 C888 DEVICE NUMBER VALIDITY CHECK 0414 0164 RVEC2 RMB 3 A35F C843 C893 SET PRINT PARAMETERS 0415 0167 RMB 3 A282 8273 CB4A CC1C CONSOLE OUT 0416 016A RVEC4 RMB 3 A176 8CF1 C58F C5BC CONSOLE IN 0417 0160 RVEC5 RMB 3 A3ED C818 C848 INPUT DEVICE NUMBER CHECK 0418 0170 RVEC6 RMB 3 A406 C81B C84B PRINT DEVICE NUMBER CHECK 0419 9173 RVEC7 RMB 3 4426 CA3B CAE9 CLOSE ALL FILES 0420 0176 RVEC8 RMB 3 A42D 8286 CA4B CAF9 CLOSE ONE FILE 0421 0179 9 RMB 3 B918 8E90 8E90 8E90 PRINT 0422 017 10 RMB 3 5 061 CC5B CD35 INPUT 0423 017 RVECII RMB 3 4549 C859 C8A9 BREAK CHECK 0424 0182 RVEC12 RMB 3 A390 C6B7 C6E4 INPUTTING A BASIC LINE 0425 0185 RVECI3 RMB 3 A4BF CA36 4 TERMINATING BASIC LINE INPUT 0426 0188 RVEC14 RMB 3 A5CE CA6B 90 EOF COMMAND 0427 0188 RVEC15 RMB 3 B223 8846 CDF6 CED2 EVALUATE AN EXPRESSION 0428 018 RVEC16 RMB 3 AC46 C6B7 C6E4 RESERVED FOR ON ERROR GOTO COMMAND 0429 0191 RVEC17 RMB 3 AC49 88F C24D C265 ERROR DRIVER 0430 0194 RVEC18 RMB 3 AE75 829C C990 CA3E RUN 0431 0197 RVEC19 RMB 3 BD22 87EF ASCII TO FLOATING POINT CONVERSION 0432 019A 20 RMB 3 AD9E 82B9 C8B BASIC S COMMAND INTERPRETATION LOOP 0433 0190 RVEC21 RMB 3 A8C4 RESET SET POINT COMMANDS 0434 01 0 RVEC22 RMB 3 4910 CLS 0435 3 8162 EXBAS SECONDARY TOKEN HANDLER 0436 8AFA EXBAS RENUM TOKEN CHECK 0437
194. BIT6 DRIVE SELECT 3 0660 BIT7 HALT FLAG DISABLED 1 ENABLED 0661 0662 FF41 7 DSKREG IMAGES 0663 0664 FLOPPY DISK CONTROLLER INTERNAL REGISTERS 0665 48 FDCREG RMB 1 STATUS COMMAND REGISTER A9 DISK BASIC UNRAVELLED II APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK 0666 0667 COMMANDS COMMAND CODE 0668 5 503 0669 SEEK 17 0670 I STEP 23 0671 STEP IN 43 0672 I STEP OUT 53 0673 II READ SECTOR 80 0674 II WRITE SECTOR SAB 0675 III READ ADDRESS C0 0676 III READ TRACK E4 0677 III WRITE TRACK F4 0678 IV FORCE INTERRUPT 00 0679 0680 STATUS BIT TYPE I READ ADDRESS SECTOR TRACK WRITE SECTOR TRACK 0681 50 BUSY BUSY BUSY 0682 51 INDEX DRQ DRQ 0683 52 TRACK 0 LOST DATA LOST DATA 0684 53 CC CRC ERROR EXCEPT TRACK CRC ERROR EXCEPT TRACK 0685 54 5 RNF EXCEPT TRACK RNF EXCEPT TRACK 0686 S5 HEAD LOADED RECORD TYPE SECTOR ONLY WRITE FAULT 0687 S6 WRITE PROTECT WRITE PROTECT 0688 57 NOT READY NOT READY NOT READY 0689 0690 49 RMB TRACK REGISTER 0691 FF4A RMB SECTOR REGISTER 0692 4 RMB DATA REGISTER 0693 4 RMB 4 FDCREG IMAGES 0694 0695 50 RMB 6 UNUSED SPACE 0696 60 RMB X COORDINATE FOR X PAD 0697 FF61 RMB Y COORDINATE FOR X PAD 0698 FF62 RMB STATUS REGISTER FOR X PAD 0699 FF63 RMB 5 UNUSED 0700 RS 232 PROGRAM PAK 0701 FF68 RMB READ WRITE DATA REGISTER 0702 FF69 RMB STATUS REGISTER
195. BLY OF DISK BASIC 1 0 SPACE FOR FREE GRANULE COUNTER GET MAXIMUM NUMBER OF GRANULES GET GRANULE DATA FREE GRANULES FF BRANCH IF NOT FREE INCREMENT FREE GRANULE COUNTER DECREMENT GRANULE COUNTER BRANCH IF NOT DONE GET FREE GRANULE COUNTER TO ACCB LOAD ACCB INTO EVALUATE EXPR RETURN VALUE IN ACCB MAX DRIVE NUMBER 3 DEVICE ERROR IF DRIVE NUMBER gt 3 SAVE DEFAULT DRIVE NUMBER CHECK STACKED PRECEDENCE FLAG AND IF IT IS NOT AN END OF OPERATION BRANCH TO EXTENDED BASIC S EXPRESSION EVALUATION ROUTINE CHECK TWO RETURN ADDRESSES BACK ON THE STACK TO SEE IF THE CALL TO EVALUATE EXPRESSION IS COMING FROM THE LET COMMAND BRANCH OUT IF NOT COMING FROM LET IF COMING FROM LET REPLACE THE RETURN ADDR WITH THE DISK BASIC LET MODIFIER ADDRESS EXTENDED BASIC EXPRESSION EVALUATION X E I PULL VARIABLE TYPE OFF OF THE STACK SET CARRY IF SIRING CLEAR CARRY IF NUMERIC DO A TM CHECK IF NUMERIC VARIABLE PACK FPA INTO VARDES POINT X TO STRING DESCRIPTOR GET ADDRESS OF SIRING COMPARE TO START OF RANDOM FILE BUFFERS AND BRANCH IF LOWER SUBTRACT OUT THE END OF RANDOM FILE BUFFERS BRANCH IF STRING STORED IN RANDOM FILE BUFFER MOVE IT INTO THE STRING SPACE BRANCH BACK TO BASIC S LET COMMAND TOKEN FOR DLOAD YES TOKEN FOR PMODE NO DISK BASIC MODIFIER FOR PMODE ALLOWS FOR THE RAM THE DOS USES GET NEXT CHARACTER FROM BASIC CHECK FOR COMMA BRANCH IF COMMA EVALUATE E
196. BUFFER COUNTER ON THE STACK GET START OF RANDOM FILE BUFFERS ADD THE NEWLY SPECIFIED RANDOM FILE BUFFER SPACE OUT OF MEMORY ERROR IF gt FFFF SAVE START OF FCBS FCBLEN REQUIRED FOR EACH BUFFER OUT OF MEMORY ERROR IF gt FFFF DECREMENT BUFFER COUNTER BRANCH IF NOT DONE THE BPL WILL SET UP ONE MORE BUFFER THAN THE NUMBER REQUESTED THIS EXTRA BUFFER IS THE SYSTEM BUFFER AND IS LOCATED AT THE END OF THE NORMAL FCBS ONLY SYSTEM ROUTINES COPY BACKUP MERGE ETC MAY ACCESS THIS BUFFER AT AN EXACT 256 BYTE BOUNDARY DISK BASIC UNRAVELLED II 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 DOCA DOCD DOCF 0001 0003 0005 0007 0009 D DB D DC D DE 009861 09863 0064 00 6 0068 DOEC DOEE DOFO DOF2 DOF4 DOF6 DOF8 D FC D FF 0102 0104 0106 0109 0108 0100 010L 0112 0114 0117 0119 0118 0116 0120 0123 0125 0127 0129 012C 0126 0131 0134 0135
197. C766 LC76C LC76D LC78F LC798 LC7B6 LC7B8 LC7BC LC7C8 LC7CD LC7D6 LC7D7 LC7DD LC7F9 LC7FE LC815 LC836 LC85F LC884 LC887 LC88A LC897 LC8BC LC8C0 LC8C5 LC8CA LC8CF LC8E6 LC8ED LC8EF LC902 LC999 1 910 LC922 LC931 C657 C658 C65F APPENDIX E DISK BASIC 1 0 SYMBOL TABLE LC956 LC959 LC964 LC979 LC985 LC9A1 LC9A2 LC9BE LC9CD LC9D LC9F6 LCAG1 LCAQ8 LCA11 LCA18 LCA2C LCA3F LCA4A LCA53 LCA58 LCA8 LCA8E LCA9B LCA9F LCAA1 LCAB8 LCAC3 LCAD8 LCAD9 LCAE LCAE2 LCAEE LCAF1 LCAFD LCBOD LCB17 LCB43 LCB45 LCB52 LCB68 LCB6E LCB8C LCB98 LCB9A LCBC3 LCBC4 LCBE1 LCBEB LCC11 LCC2E LCC3D LCC44 LCC4A LCC71 LCC85 LCC9A LCCA7 2 C956 C959 C964 C979 C985 C9A1 C9A2 C9BE C9CD 90 C9F6 CAQ1 CA08 11 18 2 CA53 CA58 9 CA9F CAA1 CAB8 CAD8 CAD9 2 CAF1 CAFD CBOD CB17 CB43 CB45 CB52 CB68 CB6E CB8C CB98 CB9A CBC3 CBC4 1 11 2 CC3D CC44 CC4A CC71 CC85 CC9A CCA7 LCC84 LCC88 LCCBD LCCBE LCCC6 LCCD2 LCCD6 LCCDE LCCE2 LCCF1 LCCF6 LCCFB LCCFC LCD12 LCD3A LCD3D LCD8C LCD96 LCDDA LCDE1 LCE D LCE19 LCE2B LCE4E LCE8 LCE8C LCEBF LCED7 LCED9 LCEDF LCEE5 LCF02 LCF07 LCF1E LCF28 LCF31 LCF37 LCF39 LCF75 LCF7A LCF7D LCF92 LCF93 LCFA3 LCFA6 LCFB6 LCFC7 LCFCB LCFD4 LCFDD LCFE7 LCFED
198. C7BC C7BF C7C1 C7C3 C7C4 C7C6 C7C8 C7CA C7CC C7CE C7CF C701 C7D3 C7D4 C7D6 C7D8 C7DA C7DC C7DE C7EQ C7E2 C7E4 C7E6 C7E8 C7EA C7EC C7EE 7 C7F2 C7F4 C7F6 C7F8 C7FA C7FD C7FF C801 C802 C804 C806 C807 C809 C80C C80D C818 C812 C814 C816 C818 C81B C81D C81F C821 C823 C825 C829 C82A C82C C82E C831 C833 C834 8D 6D 26 6F 33 8E OF cc 97 D7 C6 07 BD C6 7E 8D 38 4F C4 6F 63 27 63 4C 81 24 5C C5 26 34 63 26 2 E6 63 32 20 EB C1 25 E6 Cg 20 C6 7E 32 1F 3A C6 E7 39 34 F6 5C BD 27 96 1 26 6 1 26 6 1 10 26 35 BD OF 5D 10 B6 00 F9 01 06 06 11 EC EA 92 ED D6 44 A5 94 06 2 85 31 85 44 25 01 06 02 62 0 EQ 04 4 61 61 DC 44 F6 E4 94 EE 38 AC 61 98 84 02 09 C7 17 EB 01 1 09 40 02 08 00 4 26 El 82 ADS 6F 2F 00 02 F2 9A 46 5B 49 74 DD F3 A5 EC 12 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK MAKE SURE RAM FILE ALLOCATION TABLE DATA IS VALID LC79D BSR LC755 POINT X TO FAT FOR THE CORRECT DRIVE NUMBER TST FAT X CHECK TO SEE IF ANY FILES ARE ACTIVE BNE LC79C RETURN IF ANY FILES ACTIVE IN THIS FAT CLR FAT1 X RESET FAT DATA VALID FLAG LEAU FATCON X LOAD U WITH START OF GRANULE DATA
199. C7C ACEF AD19 AD21 AD33 AD9E ADC6 ADD4 ADEB AE15 AF9A AFA4 AFB1 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK LASTPT LB00C LB069 LB143 LB146 LB148 LB156 LB166 LB244 LB262 LB26F LB277 LB2CE LB357 LB3E6 LB44A LB4F3 LB50F LB516 LB654 LB657 LB659 LB69B LB6A4 LB70E LB738 LB73D LB958 LB95C LB99F LB9A2 LB9AC LB9AF LB9C5 LBB91 LBC14 LBC33 LBC35 LBC5F LBDCC LBDD9 LC002 LC008 LC B LC037 LC057 LC0B3 LC DD LCOF6 LC126 LC17F LC1DB LC201 LC214 LC220 LC22C LC236 0000 00 B IE 8069 B143 B146 B148 B156 B166 B244 B262 B26F B277 B2CE B357 B3E6 B44A B4F3 B50F B516 B654 B657 B659 B69B B6A4 B70E B738 B73D B958 B95C B99F B9A2 B9AC B9AF 89C5 8891 8C14 8C33 8C35 BC5F BDCC BDD9 C002 C008 COBB C837 C057 C083 CODD COF6 C126 C17F C1DB C201 C214 C228 DISK BASIC UNRAVELLED II LC23E LC278 LC2A7 LC2A9 LC2CC LC2D0 LC2E8 LC2ED LC2F2 LC306 LC320 LC334 LC339 LC33C LC348 LC35D LC38F LC394 LC3A7 LC3AA LC3B1 LC3Eg LC3E5 LC3FC LC404 LC419 LC45C LC468 LC496 LC4 2 LC48C LC4C2 LC4CC LC4DE LC4E3 LC4EC LC500 LC508 LC5 F LC53A LC559 LC57C LC58D LC597 LC5BF LC5CC LC5D1 LC5D5 LC5E4 LC5FA LC5FC LC604 LC626 LC62B LC631 LC650 LC654 LC657 LC658 LC65F LC66E LC678 LC683 LC686 LC69A LC6A9 LC6AC LC6B8 LC6CF LC6E2 LC6F1 LC70C LC714 LC719 LC725 LC733 LC73E LC749 LC754 LC756 L
200. CC03 CC05 CC07 CCBA CCBC CCOE 11 CC15 CC17 CC19 CC1C CC22 CC24 CC26 CC29 CC2B CC2C CC2E CC30 CC32 CC34 CC36 CC38 CC3A CC3C CC3E CC40 CC42 CC44 CC47 CC4A cc4D CC51 CC54 CC56 CC58 CC5A CC5C CC5E CC61 CC64 CC66 CC67 CC6A CC6C CC6E CC72 CC74 CC76 CC78 CC7B 20 BF BD 6A 6D 27 BD 9E 35 81 27 81 26 A6 27 BD 33 DF 8D A6 2A E6 C4 86 3D CE DF 31 E6 54 54 54 CB D7 CC 97 8D EC 84 ED C6 D7 7E 00 10 32 34 86 06 58 E6 C1 27 81 26 6F 81 25 6C C1 26 EC C3 18 18 ED AE 30 35 7 35 6C E6 27 3A A7 35 34 A7 E6 D7 6c BD 31 F4 09 C7 00 01 03 C7 F1 92 20 08 4B Bg OF GA C7 88 EE 2C 88 9D 88 07 20 06 88 03 1 09 88 7 2 03 06 6F 2F 62 16 09 6F 85 84 18 36 00 02 06 20 02 06 40 1 88 00 22 88 OB 8B 02 1F 94 88 88 06 88 96 60 89 01 04 84 48 55 1 63 19 13 12 00 12 02 13 F2 B6 26 17 01 09 01 17 18 18 18 01 DF 51 7A 18 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 BRA LCBBA LCBC STX RNBFAD LCBC3 JSR LC755 DEC FAT X TST 1 BEQ LCBCF JSR 1 71 LCBCF LDX FCBTMP PULS A CMPA 0UTFIL BEQ LCBDF CMPA RANFIL BNE LCB8B LDA FCBFLG X BEQ LCBE9 WRITE CONTENTS OF FILE BUFFER TO DISK LCBDF
201. CEAA CEAD CEBO CEB2 4 6 CEB8 CEB9 CEBB CEBD CEBE CECB CEC2 5 CEC8 CECA CECE CED1 CED2 CED4 CED6 CED8 CEDB CEDD CEDF CEE2 CEE4 CEE7 CEE9 CEEC CEEE CEEF CEF2 CEF6 CEF8 CEFA CEFE CF00 CF03 CF07 CF A CF C CF18 CF14 CF16 CF18 CF1C CF21 CF25 CF27 CF2A CF2D CF2F CF32 CF34 CF38 CF3B CF3D CF3F CF42 CF45 CF47 CF49 CFAC CF4E CF50 CF52 CF54 CF56 CF59 CF5C CF5F CF61 CF63 BD BD C1 18 D7 BD BD 30 6F C6 A6 43 26 6 26 35 7 BD C1 18 F7 39 A6 26 AE 8C 26 AE 8C 26 86 AF 7E 35 46 BD 18 9E EC 18 25 B3 18 7E 81 27 81 18 9D 81 18 BD C1 18 96 7E BD 9D 7E CI 10 BD 96 34 BD BD 00 2 BD E6 Cl 26 35 97 EC 7E BD 35 97 D6 B1 B7 03 22 C7 C7 06 E2 44 80 02 4 F6 94 B4 B7 03 22 09 64 13 65 0 62 Bl 05 65 88 02 1 27 52 02 83 07 09 25 1C C8 26 9F 2C 27 B7 04 22 BC 96 A4 9F 8C 34 26 B2 6F 02 5 4 6F 13 C7 00 40 BA 02 6F 88 B4 A3 02 6F 6 43 GE D7 9D 55 F3 B D7 5A 66 EC 46 48 ED 09 4 4 2 C7 B E5 2E 1B B2 62 AE 06 44 17 F4 5F 77 51 3D 89 AA 28 34 25 30 FREE COMMAND APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 NUMBE
202. CHAR FROM BASiC BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA AND EVALUATE EXPRESSION MAX VALUE OF SKIP FACTOR 16 ILLEGAL FUNCTION CALL IF BAD SKIP FACTOR SYNTAX ERROR IF MORE CHARACTERS ON THE LINE SAVE SKIP FACTOR ON THE STACK POINT TO END OF LOGICAL SECTOR NUMBER STORAGE AREA 18 SECTORS PER TRACK CLEAR A BYTE IN THE BUFFER CLEARED ALL 18 KEEP GOING IF NOT RESET PHYSICAL SECTOR COUNTER START WITH FIRST PHYSICAL SECTOR 1 ADD SKIP FACTOR TO LOGICAL SECTOR COUNTER ADD ONE TO LOGICAL SECTOR COUNTER SUBTRACT MAX NUMBER OF SECTORS BRANCH UNTIL 0 gt ACCB gt 18 ADD 18 NOW ACCB IS 9 17 IS ANYTHING STORED HERE ALREADY YES GET ANOTHER SECTOR INCREMENT PHYSICAL SECTOR NUMBER AND SAVE IT IN THE RAM BUFFER FINISHED WITH ALL SECTORS NO KEEP GOING REMOVE SKIP FACTOR FROM STACK GET TOP OF RAM USED BY DSKINI IS IT CLEARED AREA 00 OF MEMORY ERROR IF gt CLEARED AREA CLOSE ALL FILES SET RESET FLAG TO FF THIS WILL CAUSE A DOS RESET SET STACK TO TOP OF DBUF1 RESET SAM TO DISPLAY PAGE ZERO AND ALPHA GRAPHICS YOU COULD DELETE THIS INSTRUCTION AND CHANGE FOLLOWING STA TO CLR RESTORE HEAD TO TRACK ZERO DSKCON OP CODE SET DSKCON TRACK VARIABLE TO TRACK ZERO RESTORE HEAD TO TRACK ZERO RESET THE READY TIMER FOC READ ADDRESS CODE CHECK DRIVE READY WAIT UNTIL READY BRANCH IF DRIVES READY DISK BASIC UNRAVELLED II 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988
203. CK FOR ITEM SEPARATOR OR TERMINATOR SEQUENCE AND EXIT ROUTINE STORE NEW CHARACTER IN BUFFER END OF INPUT BUFFER NO GET A CHARACTER FROM CONSOLE IN EXIT ROUTINE IF BUFFER EMPTY CHECK FOR CR OR CR LF AND EXIT ROUTINE GET A CHARACTER FROM CONSOLE IN BRANCH IF BUFFER NOT EMPTY PUT A ZERO AT END OF BUFFER WHEN DONE POINT X TO LINBUF RESET POINTER QUOTE YES SPACE NO EXIT ROUTINE GET A CHARACTER FROM CONSOLE IN EXIT ROUTINE IF BUFFER EMPTY SPACE YES GET ANOTHER CHARACTER COMMA ITEM SEPARATOR YES EXIT ROUTINE CARRIAGE RETURN NO GET A CHARACTER FROM CONSOLE IN EXIT ROUTINE IF BUFFER EMPTY LINE FEED TREAT CR LF AS A CR YES EXIT ROUTINE BACK UP PTR INPUT POINTER ONE EXIT ROUTINE GET A CHAR FROM INPUT BUFFER RETURN IN ACCA RETURN IF BUFFER NOT EMPTY POINT X TO START OF FILE BUFFER GET FILE TYPE IS IT RANDOM FILE TYPE INPUT PAST END OF FILE ERROR IF NOT RANDOM WRITE INPUT PAST END OF RECORD ERROR IF RANDOM JUMP TO THE ERROR HANDLER GET A CHAR FROM INPUT BUFFER SET FLAGS ACCORDING TO CONSOLE INPUT FLAG SAVE REGISTERS ON STACK POINT X TO PROPER FCB GET FILE TYPE OF THIS FCB IS IT A RANDOM FILE BRANCH IF NOT A RANDOM FILE GRAB THE RANDOM FILE GET POINTER MOVE IT BACK ONE AND RESTORE IT RESTORE REGISTERS AND RETURN SAVE THE CHARACTER IN THE CACHE SET THE CACHE FLAG TO FF DATA IN CACHE RESTORE REGISTERS AND RETURN LDB STB CHARAC LDA VALTYP BNE LCC71
204. CK RAM HOOK DVECS LDA INPFIL LC84A 8620 PRINT DEVICE NUMBER CHECK RAM HOOK DVEC6 LDA OUTFIL TST DEVNUM BLE LC806 STX 5 JSR LC744 PSHS B A LDA LBEQ LA3FB RANFIL BEQ LC868 CMPA S BNE LC845 LC866 PULS A B X PC LC868 LDX 504 5 CMPX LB C BNE LC866 JSR CMPA BNE LC881 JSR 18244 JSR 18657 LDB JSR LB26F LC881 LDX 1 01 STX 04 5 PULS A B X PC DEVICE NUMBER VALIDITY CHECK RAM HOOK DVECI BLE LC8AF CMPB FCBACT LBHI LA61F PULS X PC SET PRINT PARAMETERS RAM HOOK DVEC2 TST DEVNUM BLE LC8 LEAS 02 PSHS X B A CLR PRTDEV JSR LC744 LDB FCBPOS X CLRA LDX 851000 JMP LA37C BREAK CHECK RAM HOOK DVECII TST DEVNUM BLE LC8AF LEAS 902 5 LCBAF RTS COMMAND INTERPRETATION RAM HOOK DVEC20 LEAS 902 5 LC8B2 AF CLR PIAG 2 LDA PIAS COMA ANDA 7F BEQ LC8C2 JSR LADEB LC8C2 LDX CHARAD STX TINPTR LDA X BEQ LC801 CMPA BEQ LC8F3 JMP L 277 LC8D1 LDA X STA ENDFLAG BNE LC8DA JMP LAE15 LC8DA LDD X STD CURLIN STX CHARAD LDA TRCFLG BEQ LC8F3 LDA lt JSR LA282 LDA CURLIN JSR LBDCC gt JSR LA282 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 B13 POINT X TO FCB TEST IF BUFFER IS IN USE FILE NOT OPEN ERROR DIRECT RANDOM FILE RETURN IF RANDOM BAD FILE MODE ERROR IF NOT RANDOM INPUT FILE TYPE SKIP TWO BYTES OUTPUT FILE TYPE CHECK DEVICE NUMBER AND RETURN IF NOT A
205. CON VARIABLE LDA TMPLOC GET NUMBER OF TRACKS TO MOVE LD221 LDB 01 INITIALIZE SECTOR COUNTER TO ONE LD223 STB DSEC SAVE DSKCON SECTOR VARIABLE JSR LDSFF READ WRITE A SECTOR INC MOVE BUFFER POINTER UP ONE SECTOR 256 BYTES INCB INCREMENT SECTOR COUNTER CMPB SECMAX COMPARE TO MAXIMUM NUMBER OF SECTORS PER TRACK BLS 10223 BRANCH IF ANY SECTORS LEFT INC DCTRK INCREMENT TRACK COUNTER VARIABLE TO NEXT TRACK DECA DECREMENT TRACKS TO MOVE COUNTER BNE 10221 READ MORE TRACKS IF ANY LEFT RTS LD235 LDB 05 5 GET THE DESTINATION DRIVE NUMBER AND 06 S COMPARE IT TO THE SOURCE DRIVE NUMBER PRINT SOURCE DESTINATION DISK SWITCH PROMPT MESSAGE LD239 BNE 10271 RETURN IF DRIVE NUMBERS NOT EQUAL CLR RDYTMR RESET THE READY TIMER C26 DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 2497 0236 7F FF 48 CLR DSKREG CLEAR DSKREG TURN OFF ALL DISK MOTORS 2498 D241 7F 89 86 CLR DRGRAM CLEAR DSKREG RAM IMAGE 2499 D244 34 92 PSHS A SAVE SOURCE DESTINATION FLAG ON STACK 2500 D246 BD A9 28 JSR LA928 CLEAR SCREEN 2501 D249 8E D2 72 LDX 10272 POINT X TO INSERT SOURCE MESSAGE 2502 D24C C6 00 LDB 13 13 BYTES IN MESSAGE 2503 024 A6 EB LDA 5 GET SOURCE DESTINATION FLAG FROM THE STACK 2504 0250 27 05 BEQ 10257 BRANCH IF SOURCE 2505 0252 8E D2 7 LDX LD27F POINT X TO INSERT DESTINATION MESSAGE 2506 D255 C6 12 LDB 18 18 BYTES IN MESSAGE 2507 D257 BD B9 A2
206. CRC REQUEST GAP III POST DATA GAP SAVE ACCB 5 RETRIES SAVE RETRY COUNT RESTORE ACCB GO EXECUTE COMMAND CHECK STATUS BRANCH IF NO ERRORS GET DSKCON ERROR STATUS WRITE PROTECTED ERROR CHECK BIT 6 OF STATUS BRANCH IF WRITE PROTECT ERROR 1 0 ERROR JUMP TO ERROR DRIVER SAVE ACCA GET OPERATION CODE CHECK FOR WRITE SECTOR COMMAND RESTORE ACCA RETURN IF NOT WRITE SECTOR CHECK VERIFY FLAG RETURN IF NO VERIFY SAVE REGISTERS READ OPERATION CODE STORE TO DSKCON PARAMETER POINT U TO WRITE BUFFER ADDRESS ADDRESS OF VERIFY BUFFER TO DSKCON VARIABLE GO READ SECTOR RESTORE WRITE BUFFER WRITE OP CODE SAVE IN DSKCON VARIABLE CHECK STATUS FOR THE READ OPERATION BRANCH IF ERROR CHECK 256 BYTES GET BYTE FROM WRITE BUFFER COMPARE TO READ BUFFER BRANCH IF NOT EQUAL DECREMENT BYTE COUNTER AND BRANCH IF NOT DONE RESTORE REGISTERS RESTORE REGISTERS DECREMENT THE VERIFY COUNTER BRANCH IF MORE TRIES LEFT VERIFY ERROR JUMP TO ERROR HANDLER OFF FLAG 0 OFF TOKEN YES ON FLAG FF ON TOKEN BRANCH TO SYNTAX ERROR IF NOT ON OR OFF SET VERIFY FLAG GET NEXT CHARACTER FROM BASIC SAVE REGISTERS GET RETRY COUNT AND SAVE IT ON THE STACK RESET DRIVE NOT READY TIMER GET DRIVE NUMBER POINT X TO DRIVE ENABLE MASKS GET DSKREG IMAGE KEEP MOTOR STATUS DOUBLE DENSITY HALT ENABLE OR IN DRIVE SELECT DATA OR IN DOUBLE DENSITY GET TRACK NUMBER PRECOMPENSATION STARTS AT TRACK
207. D BRANCH IF GET GET PROPER TRACK amp SECTOR NUMBERS POINT U TO START OF FCB DATA SET UP FILE BUFFER POINTER FOR DSKCON GO WRITE A SECTOR CHECK THE PRE SAVED FLAG RETURN IF RECORD HAS ALREADY BEEN SAVED ON DISK GET DIRECTORY NUMBER OF THIS FILE 8 ENTRIES PER SECTOR DIRLEN BYTES PER DIRECTORY ENTRY GET SECTOR OFFSET FOR THIS ENTRY GET READ WRITE BUFFER 0 AND SAVE IT IN DSKCON REGISTER Y POINTS TO CORRECT DIRECTORY ENTRY GET DIRECTORY ENTRY NUMBER DIVIDE BY 8 EIGHT DIRECTORY ENTRIES PER SECTOR ADD BIAS FIRST 3 SECTORS NOT DIRECTORY STORE SECTOR NUMBER DIRECTORY TRACK READ OP CODE STORE TRACK NUMBER GO READ DIRECTORY GET NUMBER OF BYTES IN THE LAST SECTOR MASK OFF THE PRE SAVED FLAG SAVE NUMBER OF BYTES IN LAST SECTOR OF FILE IN DIRECTORY WRITE OP CODE SAVE DSKCON OP CODE VARIABLE GO READ WRITE SECTOR CHECK DEVICE NUMBER BRANCH TO EX BASIC IF NOT A DISK FILE POP RETURN OFF STACK SEND A CHARACTER IN ACCA TO A DISK FILE A CARRIAGE RETURN WILL RESET THE PRINT POSITION AND CONTROL CODES WILL NOT INCREMENT THE PRINT POSITION 10852 PSHS X B A LDX FCBV1 2 LDB ASLB LDX B X LDB CMPB amp 4INPFIL BEQ LC898 CMPA CR BNE LCB68 CLR FCBPOS X LCB68 CMPA SPACE BLO LCB6E INC FCBPOS X LCBGE CMPB RANFIL BNE LCBB8C PUT A BYTE INTO A RANDOM FILE LDD FCBPUT X ADDD 40001 CMPD FCBRLN X LBHI LCCF1 STD FCBPUT X LDX FCBBUF X LEAX D X PULS A STA 1
208. D PRINT ACCO IN DECIMAL TO CONSOLE OUT SEND CARRIAGE RETURN TO CONSOLE OUT PULL DIRECTORY POINTER OFF OF THE STACK MOVE X TO NEXT DIRECTORY ENTRY END OF 1 0 BUFFER BRANCH IF MORE DIRECTORY ENTRIES IN BUFFER GET CURRENT SECTOR BUMP COUNT SECMAX SECTORS IN DIRECTORY TRACK GET NEXT SECTOR FINISHED SEND CHARACTER TO CONSOLE OUT SEND BLANK TO CONSOLE OUT ACCB POINTING TO FIRST GRANULE IN A FILE RETURN THE NUMBER OF THE FILE IN ACCA THE GRANULE DATA FOR THE LAST SECTOR IN ACCB LC755 GRANMX LC653 U X 5C0 B19 POINT X TO FILE ALLOCATION BUFFER POINT U TO START OF GRANULE DATA RESET GRANULE COUNTER INCREMENT GRANULE COUNTER CHECKED ALL 68 GRANULES YES BAD FILE STRUCTURE ERROR POINT U TO START OF GRANULE DATA ADD POINTER TO FIRST GRANULE GET THIS GRANULE S CONTROL BYTE IS THIS THE LAST GRANULE IN FILE NO DATA STORED IN NEW SECTOR YET FORCE GRANULE NUMBER TO BE FINAL GRANULE IN FILE DISK BASIC UNRAVELLED II 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907
209. D SYSTEM FCB BRANCH IF NOT DONE READJUST LINE NUMBERS ETC GET DRIVE NUMBER CLEAR FILE COUNTER INCREMENT FILE COUNTER POINT X TO FCB BRANCH IF FILE NOT OPEN CHECK DRIVE NUMBER DOES IT MATCH THE UNLOAD DRIVE NUMBER NO MATCH DO NOT CLOSE THE FILE SAVE FILE COUNTER ON THE STACK CLOSE FCB RESTORE FILE COUNTER CHECKED ALL FILES NO BEQ 100 INCA BEQ 10118 LD CF STA 5 LDD VARTAB SUBA GRPRAM ADDA S BLO LD11B TFR D X INCA BEQ LD11B CMPD FRETOP BHS 10118 DECA SUBD VARTAB ADDD TXTTAB TFR D Y LDA 5 SUBA GRPRAM TFR A B ADDA BEGGRP STA BEGGRP ADDB ENDGRP STB ENDGRP PULS A B U STA STB STU FCBADR 10102 100 VARTAB STX VARTAB CMPU VARTAB BHI LD11E MOVE BASIC PROGRAM IF OLD START ADDRESS lt NEW START ADDRESS 10108 LDA STA X CMPU TXTTAB BNE L0108 STY TXTTAB CLR 1 Y BRA LD12E LD11B JMP LAC44 MOVE BASIC PROGRAM IF OLD START ADDRESS NEW LD11E 100 TXTTAB STY TXTTAB CLR 1 V 10125 LDA U STA Y VARTAB 10125 CLOSE ALL FCBS AND RECALCULATE FCB START ADDRESSES LD12E 100 FCBV1 LDX FCBADR CLRB 10135 STX CLR FCBTYP X LEAX FCBLEN X INCB CMPB FCBACT BLS 10135 JMP 196 UNLOAD COMMAND UNLOAD BSR LD162 CLRB 10149 INCB JSR LC719 BEQ LD15C LDA FCBDRV X CMPA DCDRV BNE LD15C PSHS B JSR LCA58 PULS B LD15C FCBACT BLS 10149 RTS GET DRIVE NUMBER FROM BASIC USE THE DEFAULT LD162 LDB DEF
210. D7CA D7CC D7CE 0700 0701 0703 0705 0707 D7DA D7DC D7DE D7DF 0761 0764 0766 0768 0768 0766 D7EF 07 0 0763 D7F5 D7F7 D7F8 D7FA D7FB D7FD D7FF 0802 0804 0805 0807 080 080 080 0810 0813 0815 0817 D81A D81C D81E 0820 0822 0824 0826 8E B6 84 AA 8A D6 Cl 25 8A 1F 8A B7 B7 C5 26 BD BD 8D 26 OF 8E 06 58 AD 35 D6 27 4A 27 34 8D 26 20 86 B7 35 8E 06 6F 86 B7 1E 1E 8D 8D 84 97 39 9E 30 27 6 85 26 39 86 B7 1E 1E B6 86 97 39 8E 30 26 39 86 8C 86 34 8E 06 3A E6 F7 01 27 96 B7 A7 86 B7 1E 1E 8D 26 8D 84 27 D8 9D 09 86 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 8 85 20 EC 16 02 10 89 08 09 FF 08 06 7 7 OA F D8 EA 95 02 OB 98 02 OB Fl B4 78 09 6 09 85 03 FF 88 88 97 24 10 F 8A 1F 08 FF 01 F5 00 FF 88 88 FF 80 F 22 1F FC 80 02 09 84 FF EC 1E EC FF 84 17 FF 88 88 81 08 18 04 86 40 01 01 95 85 7 48 48 48 48 2 7 49 48 48 LDX 10890 LDA DRGRAM ANDA 8 ORA B X ORA 20 LDB DCTRK CMPB 422 BLO 1077 ORA 10 LD77E TFR ORA 08 STA DRGRAM STA DSKREG BITB 4 08 BNE 10792 JSR 1 701 JSR 1 701 10792 BSR 10701 BNE 107 0 CLR DCSTA LDX 10895 LDB DCOPC ASLB JSR B X 10740 PULS A LDB BEQ L
211. DB 5 BNE LC657 LDD FCBLST X BNE LC654 10650 CLRB COM FCBDFL X LC654 STB FCBLFT X LC657 5 LC658 LDU FCBREC X LEAU 01 U STU FCBREC X c9 GET CURRENT SECTOR NUMBER ADD ONE SAVE NEW SECTOR NUMBER ON THE STACK NINE SECTORS PER GRANULE BRANCH IF lt 9 SET TO SECTOR ZERO SAVE SECTOR NUMBER GET GRANULE NUMBET TO FAT POINTER POINT U TO FCB TFR X U POINT X TO PROPER FILE ALLOCATION TABLE ADD OLD GRANULE NUMBER TO FAT POINTER GET GRANULE NUMBER 6 CONTROL BYTES AT FRONT OF FAT POINT X TO FCB IS CURRENT GRANULE LAST ONE IN FILE YES GET SECTOR NUMBER WAS IT 10 OVERFLOW TO NEXT GRANULE IF 50 BRANCH IF NOT SAVE NEW GRANULE NUMBER SET VARIABLES FOR NEW GRANULE GET NUMBER OF SECTORS USED IN THIS GRANULE 9 SECTORS GRANULE BRANCH IF OK BAD FILE STRUCTURE ERROR ERROR DRIVER SUBTRACT CURRENT SECTOR NUMBER AND PULS A BRANCH IF PAST LAST SECTOR SECTOR NUMBER TO ACCA SAVE SECTOR NUMBER DIFFERENCE INCREMENT RECORD NUMBER GET READ OPERATION CODE AND SAVE IT IN DSKCON VARIABLE GET PROPER TRACK AND SECTOR TO DSKCON VARIABLES POINT U TO START OF FCB DATA BUFFER AND SAVE IT IN DSKCON VARIABLE GO READ A SECTOR INTO FCB BUFFER NUMBER OF CHARS LEFT IN BUFFER 256 GET SECTOR NUMBER OFF STACK RETURN IF DATA LEFT FALL THRU IF LAST SECTOR GET NUMBER OF BYTES IN THE LAST SECTOR BRANCH IF SOME BYTES IN LAST SECTOR SET NUMBER OF REMAINING BYTES 256 SET DATA LEFT FLAG TO FF SAVE THE NUMBER O
212. DISK BASIC UNRAVELLED II LEAX TABLE PCp STA F 20 LO 4 LEAX 8 LDY 80 DA Y FOR THE TANDY TRS 80 COLOR COMPUTER TABLE OF CONTENTS FOREWORD INTRODUCTION HOW TO USE THIS BOOK DESCRIPTION OF DISK BASIC FILE CONTROL BLOCK STRUCTURE FILE ALLOCATION TABLE THE DIRECTORY 1793 FLOPPY DISK CONTROLLER DESCRIPTION MACHINE LANGUAGE FILE INPUT OUTPUT DISK BASIC RAM VARIABLES BUFFERS APPENDICES MEMORY MAP DISASSEMBLY OF DISK BASIC 1 1 DISASSEMBLY OF DISK BASIC 1 0 DISK BASIC SYMBOL TABLE 1 1 DISK BASIC SYMBOL TABLE 1 0 DISK BASIC ROUTINES AND ENTRY POINTS DISK BASIC S DATA ASCII TABLES DISK BASIC ERROR ENTRY POINTS ASCII CHART DISK BASIC UNRAVELLED II FOREWORD ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK FOREWORD Due to the many requests for the Unravelled Series produced by Spectral Associates and the fact that these books are rare and no longer in production I have taken it upon myself to reproduce them in electronic PDF Adobe Acrobat format I have re disassembled the ROMs listed in this book and added all the comments from the Original Extended Basic Unravelled Book Some changes were made to make the book a little easier to read 1 The comments have been cleaned up some In cases where a comments continued onto the next line a is placed in the Labels column as well as a at the beginning of each line of the comment In cases where the previous comment used thi
213. DISK FILE REPLACE SUBROUTINE RETURN ADDRESS WITH X REGISTER THIS IS THE SAME AS LEAS 2 5 AND PSHS X POINT X TO FCB SAVE ACCB AND FILE TYPE ON STACK GET FILE TYPE FILE NOT OPEN RANDOM FILE BRANCH IF RANDOM FILE IS THIS FCB OF THE PROPER TYPE FILE MODE ERROR IF NOT RESTORE ACCB X ACCA FILE TYPE AND RETURN ERROR GET CALLING ADDRESS FROM THE STACK AND RETURN UNLESS COMING FROM BASIC S INPUT STATEMENT SYNTAX CHECK FOR A COMMA CHECK FOR A DOUBLE QUOTE RETURN TO BASIC S INPUT COMMAND STRIP PROMPT STRING FROM BASIC AND PUT IT ON THE STRING STACK PURGE THE STRING PUT ON THE STRING STACK SEMICOLON DO A SYNTAX CHECK FOR SEMICOLON GET MODIFIED REENTRY POINT INTO BASIC AND PUT IT INTO THE RETURN ADDRESS ON THE STACK RETURN TO BASIC RETURN IF NOT A DISK FILE COMPARE DEVICE NUMBER TO HIGHEST POSSIBLE DEVICE NUMBER ERROR IF TOO BIG RETURN CHECK DEVICE NUMBER AND RETURN IF NOT DISK FILE PURGE RETURN ADDRESS OFF OF THE STACK SAVE REGISTERS SET PRINT DEVICE NUMBER TO NON CASSETTE POINT X TO FCB GET PRINT POSITION PRINT WIDTH 256 TAB FIELD WIDTH AND TAB ZONE SAVE THE PRINT PARAMETERS CHECK DEVICE NUMBER AND RETURN IF NOT A DISK FILE PURGE RETURN ADDRESS OFF OF THE STACK DON T DO A BREAK CHECK IF DISK FILE PURGE RETURN ADDRESS OFF OF THE STACK ENABLE IRQ amp FIRQ STROBE ALL KEYS COLUMN STROBE READ KEYBOARD ROWS INVERT KEYBOARD ROW DATA MASK OFF JOYSTICK INPUT BIT
214. DRV JSR GETCCH BEQ 10172 LD169 JSR EVALEXPB 03 LBHI LA61F LD172 STB DCDRV RTS BACKUP COMMAND BACKUP LBEQ LA61F JSR L95AC JSR 10169 STB DBUFQ 255 JSR GETCCH DRIVE IF NONE GIVEN GET DEFAULT DRIVE NUMBER GET NEXT INPUT CHAR USE DEFAULT DRIVE NUMBER IF NONE GIVEN EVALUATE EXPRESSION 4 DRIVES MAX DEVICE NUMBER ERROR IF gt 3 STORE IN DSKCON VARIABLE DEVICE NUMBER ERROR IF NO DRIVE NUMBERS GIVEN RESET SAM DISPLAY PAGE AND VOG MODE GET SOURCE DRIVE NUMBER AND SAVE IT TOP OF DBUF TOP OF NEW STACK GET A CHARACTER FROM BASIC DISK BASIC UNRAVELLED II 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 0184 0186 0188 0188 0186 0192 0194 0197 D19A D19C D19F 01 1 01 5 D1A7 D1A9 D1AB D1AF 0181 0182 0184 0187 D1B8 D1B9 D1BB D1BD D1BF 01C1 01C3 01C5 01C7 01C9 01CC DICE 0100 0102 0104 0105 0108 D1DA D1DC 0106 0160 0162 0165 0167 D1EA D1EC D1E
215. DVEC10 LCD4B LCD5F LCD74 LCD81 LCD8E LCD92 LCD97 TST BLE LDX STX LDX LDB STB LDA BNE LDB BSR CMPA BEQ CMPA BNE CMPB BNE TFR STB BRA CMPB BEQ CMPA BNE CMPX BEQ LDA CMPA BNE LDA TSTA BEQ CMPA BEQ PSHS CMPA BEQ STA CMPX BNE BSR BNE BRA BSR BEQ CLR LDX RTS DEVNUM LCD97 18069 E LINBUF 1 CHARAC VALTYP LC048 HSPACE LCDBC HSPACE LC048 M LCD5F LCD5F CHARAC LCD81 gus LCD74 HCR LCD74 LINBUF 1 LCDBO 14X LF LCDBO CR LCD8E CHARAC LCD98 B 5 LC098 X LINBUF LBUFMX LCD8E LCDD LCD92 LCDAC LCDD LCD5F X LINBUF ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK NO KEEP GOING CHECK DEVICE NUMBER AND RETURN IF NOT A DISK FILE CHANGE THE RETURN ADDRESS ON THE STACK TO RE ENTER BASIC S INPUT ROUTINE AT A DIFFERENT PLACE THAN THE CALLING ROUTINE POINT X TO THE LINE INPUT BUFFER COMMA IS READ ITEM SEPARATOR TEMPORARY STRING SEARCH FLAG GET VARIABLE TYPE AND BRANCH IF IT IS A STRING SPACE NUMERIC SEARCH DELIMITER GET AN INPUT CHARACTER SPACE YES GET ANOTHER CHARACTER QUOTE NO SEARCH CHARACTER COMMA NO NUMERIC SEARCH SAVE DOUBLE QUOTE AS THE SEARCH FLAG SAVE DOUBLE QUOTES AS FIRST ITEM IN BUFFER BRANCH IF INPUTTING A STRING VARIABLE IS THE INPUT CHARACTER A CARRIAGE RETURN NO IF AT THE START OF INPUTBUFFER CHECK FOR A FOLLOWING LINE FEED AND EXI
216. E 2 BIT3 4 5 6 BIT7 GRAPHICS MODES 16 COLOR MODES BYTE FROM DRAM BITE 2 BIT3 4 5 6 BIT7 4 COLOR MODES BYTE FROM DRAM BIT 2 BIT3 4 5 6 BIT7 2 COLOR MODES BYTE FROM DRAM BITE 2 BIT3 APPENDIX A MEMORY MAP DISPL v2 CHARA CHARA CHARA CHARA CHARA CHARA CHARA BGND BGND1 BGND2 6809 FGND1 FGND2 UNDLN BLINK 1 2 1 2 PAL PAG PAL PAG PAL PAG 1 AY MODE Q lt lt Ver lt CTER CTER CTER CTER CTER CTER CTER BIT BIT BIT BIT BIT BIT BIT BACKGROUND BACKGROUND BACKGROUND FOREGROUND FOREGROUND FOREGROUND CHARACTERS CHARACTERS CRESI 1 CRES0 0 SECOND PIXEL SECOND PIXEL SECOND PIXEL SECOND PIXEL FIRST PIXEL FIRST PIXEL FIRST PIXEL FIRST PIXEL CRES1 0 1 FOURTH PIXEL FOURTH PIXEL THIRD PIXEL THIRD PIXEL SECOND PIXEL SECOND PIXEL FIRST PIXEL FIRST PIXEL 51 0 CRES0 0 EIGHTH PIXEL SEVENTH PIXEL SIXTH PIXEL FIFTH PIXEL 2 1 1 1 1 1 1 REG FF22 7 6 5 0 x x 0 x x
217. E 1183 C864 34 02 PSHS A IT ON THE STACK 1184 C866 BD A5 AE JSR LASAE STRIP DEVICE NUMBER OFF OF INPUT LINE 1185 C869 BD A3 ED JSR LASED VERIFY THAT THE FILE TYPE WAS INPUT 1186 C86C 00 6F TST DEVNUM CHECK DEVICE NUMBER AND 1187 C86E 10 2F DD 68 LBLE LA5DA BRANCH BACK TO 5 EOF IF NOT DISK FILE 1188 C872 BD C7 14 JSR LC714 POINT X TO FCB 1189 C875 E6 00 LDB FCBTYP X GET FILE TYPE 1190 C877 1 40 RANFIL RANDOM FILE 1191 C879 27 9A BEQ LC815 BAD FILE MODE ERROR IF RANDOM 1192 C878 5F CLRB FILE NOT EMPTY FLAG SET TO NOT EMPTY 1193 C87C A6 88 10 LDA FCBCFL X CHECK THE CACHE FLAG BRANCH IF 1194 C87F 26 03 BNE LC884 THERE IS A CHARACTER WHICH HAS BEEN CACHED 1195 C881 E6 88 17 LDB FCBDFL X GET SEQUENTIAL INPUT FILE STATUS 1196 C884 7E A5 E4 LC884 JMP L 564 LINK BACK TO BASIC S EOF STATEMENT 1197 1198 GET FILENAME EXTENSION DRIVE NUMBER FROM BASIC 1199 C887 8E C2 91 LC887 LDX DEFEXT POINT TO BLANK DEFAULT EXTENSION 1200 C88A 6F E2 LC88A CLR 5 CLEAR A BYTE ON STACK FOR USE AS A DRIVES FLAG 1201 C88C B6 09 5A LDA DEFDRV GET DEFAULT DISK NUMBER 1202 C88F 97 EB STA DCDRV STORE IN DSKCON PARAMETER 1203 C891 CE 09 4C LDU DNAMBF DISK FILENAME BUFFER 1204 C894 CC 20 08 LDD 452008 STORE 8 BLANKS IN RAM DEFAULT FILE NAME 1205 C897 A7 CB LC897 STA U STORE A BLANK IN FILE NAME 1206 C899 5A DECB DECREMENT COUNTER 1207 C89A 26 FB BNE LC897 BRANCH IF NOT DONE 1208 C89C C6 03 LDB 03 3 BYTES IN EXTENSION
218. E AND BITS 0 5 ARE THE NUMBER OF USED SECTORS IN THAT GRANULE IF BITS 6 amp 7 ARE NOT SET THE DATA BYTE CONTAINS THE NUMBER OF THE NEXT GRANULE IN THE FILE X X OFFSETS TO FAT CONTROL BYTES FATO EQU 0 ACTIVE FILE COUNTER DISK TO RAM FAT IMAGE DISABLE 1 EQU 1 VALID DATA FLAG DISK DATA VALID lt gt NEW FAT DATA DISK DATA INVALID 2 TO 5 NOT USED FATCON EQU 6 OFFSET TO START OF FAT DATA 68 BYTES DIRECTORY ENTRY FORMAT THE DIRECTORY IS USED TO KEEP TRACK OF HOW MANY FILES ARE STORED ON A DISKETTE AND WHERE THE FILE IS STORED ON THE DISK THE FIRST GRANULE USED BY THE FILE WILL ALLOW THE FAT TO TRACK DOWN ALL OF THE GRANULES USED BY THE FILE IF THE FIRST BYTE OF THE DIRECTORY ENTRY IS ZERO THE FILE HAS BEEN KILLED IF THE FIRST BYTE IS FF THEN THE DIRECTORY ENTRY HAS NEVER BEEN USED BYTE DESCRIPTION DIRMAM EQU 0 FILE NAME DIREXT EQU 8 FILE EXTENSION DIRTYP EQU 11 FILE TYPE DIRASC EQU 12 ASCII FLAG DIRGRN EQU 13 FIRST GRANULE IN FILE DIRLST EQU 14 NUMBER OF BYTES IN LAST SECTOR 16 TO 31 UNUSED FILE CONTROL BLOCK FORMAT THE FILE STRUCTURE OF COLOR TRS DOS IS CONTROLLED BY A FILE CONTROL BLOCK FCB THE FCB CONTAINS 25 CONTROL BYTES AND A SECTOR LONG 256 BYTES DATA BUFFER THE CONTROL BYTES CONTROL THE ORDERLY FLOW OF DATA FROM THE COMPUTER S RAM TO THE DISKETTE AND VICE VERSA THE OPEN COMMAND INITIALIZES THE FCB THE INPUT
219. E FCB OPEN A SEQUENTIAL FILE FOR OUTPUT BASIC FILE FLAG CONSOLE OUT LOAD ACCD WITH START OF VARIABLES SUBTRACT START OF BASIC CONSOLE OUT FILE LENGTH MS BYTE PULL LS BYTE INTO ACCA CONSOLE OUT FILE LENGTH LS BYTE POINT X TO START OF BASIC GET BYTE FROM BASIC SEND TO CONSOLE OUT COMPARE TO END OF BASIC KEEP GOING IF NOT AT END CLOSE FILE POINT TO BAS EXTENSION DEFAULT LCAG4 10 0 LCAG6 8649 LCA 7 10 I LDB INCB STB DEVNUM JMP LC48D SAVE A CRUNCHED FILE A PREAMBLE OF THREE BYTES WILL PRECEED CRUNCHED FILES BYTE 1 FF 2 3 LENGTH OF BASIC PROGRAM LCA12 BSR LCA04 LDA 4 FF JSR LCC24 LDD SUBD TXTTAB JSR LCC24 TFR B A JSR LCC24 LDX LCA27 LDA X JSR LCC24 CMPX VARTAB BNE LCA27 JMP LA42D LDX BASEXT JMP LC938 MERGE COMMAND MERGE CLRA LDB FF BRA LCA5 amp RUN RAM VECTOR DVEC18 LBNE XVEC18 LDA 02 BRA LCA4F LOAD COMMAND LOAD CMPA M LBEQ CLRA LCA4F CLRB LCA50 STA DRUNFL STB DMRGFL BSR LCA33 JSR GETCCH BEQ LC 6C JSR SYNCOMMA LDB R JSR LB26F JSR LASC7 LDA 03 GET FILENAME EXT FROM BASIC RUN FLAG 0 DON T RUN MERGE FLAG FF MERGE GO LOAD THE FILE CHECK FOR FILENAME DELIMITER DOUBLE QUOTE NONE JUMP TO EXBAS RUN RAM HOOK RUN FLAG DON T CLOSE ALL FILES BEFORE RUN LOAD THE FILE BRANCH IF LOADM RUN FLAG ZERO DON T RUN CL
220. E GET PUT TO PUT DSKCON WRITE OP CODE GO WRITE A SECTOR SAVE PUT DATA ON DISK SECTOR OFFSET TO GRANULE AND SECTOR NUMBER GET THE NUMBER OF SECTORS TO THE START OF THIS RECORD NUMBER AND CONVERT THEM TO A GRANULE OFFSET SAVE GRANULE OFFSET ON THE STACK MULTIPLY GRANULE NUMBER X 9 CONVERT TO NUMBER OF SECTORS NEGATE LS BYTE OF GRANULE OFFSET AND ADD THE LS BYTE OF SECTOR OFFSET ACCB SECTOR NUMBER 0 8 CORRESPONDING TO THE SECTOR NUMBER WITHIN GRANULE OF THE LAST SECTOR OF THE SECTOR OFFSET ADD ONE SECTORS SAVED IN THE FCB START AT 1 NOT 0 SAVE IT IN THE FCB GET FIRST GRANULE IN FILE POINT X TO FAT POINT U TO FAT DATA GET NUMBER OF GRANULES OFFSET TO RECORD ADD ONE COMPENSATE FOR DECA BELOW POINT X TO FAT DATA POINT X TO CORRECT GRANULE DECREMENT GRANULE COUNTER BRANCH IF CORRECT GRANULE FOUND SAVE GRANULE ADDRESS ON STACK GET NEXT GRANULE IN FILE LAST GRANULE IN FILE NO KEEP LOOKING BEING SEARCHED FOR IS NOT PRESENTLY DEFINED IN THIS RANDOM FILE GET OFFSET TO LAST GRANULE CHECK GET PUT FLAG AND BRANCH IF PUT INPUT PAST END OF FILE ERROR JUMP TO ERROR HANDLER POINT X TO FCB DATA BUFFER READ WRITE A SECTOR ENTER WITH OP CODE IN ACCB BUFFER PTR IN X DVEC22 PSHS X CC LDX 503 5 CMPX L975F BNE LC2BF CMPA BEQ LC2C1 LC2BF PULS CC X PC GET PUT TO A DIRECT RANDOM FILE LC2Cl LEAS 905 5 JSR 1 82 STX FCBTMP CLR FCBGE
221. E NEW EXPONENT LCE72 JSR LBC5F SAVE NUMBER OF BYTES IN FULL SECTORS IN FPA1 LDX 5 POINT X TO FCB LDD FCBLST X GET NUMBER OF BYTES IN LAST SECTOR ANDA 7F MASK OFF THE PRE SAVED BYTE BSR 14 PUT NUMBER BYTES IN LAST SECTOR INTO CLR RESSGN FORCE SUM SIGN POSITIVE LDA FPIEXP GET EXPONENTS OF FPA AND LDB FPQEXP FPA1 PRIOR TO ADDITION JSR LB9C5 ADD NUMBER BYTES IN LAST SECTOR TO NUMBER OF BYTES IN FULL SECTORS JSR LBC5F SAVE TOTAL NUMBER OF BYTES IN 1 PULS X POINT X TO FCB LDD FCBRLN X GET RECORD LENGTH BSR 14 PUT IT INTO CLR RESSGN FORCE QUOTIENT SIGN POSITIVE LDA FPIEXP GET EXPONENTS OF FPA AND LDB FPQEXP FPA1 PRIOR TO DIVISION JSR LBB91 DIVIDE TOTAL NUMBER OF BYTES BY NUMBER OF BYTES IN A RECORD JMP INT CONVERT FPA TO AN INTEGER DISK BASIC UNRAVELLED II 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 9 CE9F CEA2 4 CEA8
222. E REGISTERS AND RETURN LCDEC STA FCBCDT X SAVE THE CHARACTER IN THE CACHE COM FCBCFL X SET THE CACHE FLAG TO FF DATA IN CACHE PULS B X PC RESTORE REGISTERS AND RETURN CVN COMMAND CVN JSR 18654 GET LENGTH AND ADDRESS OF STRING CMPB 05 FIVE BYTES IN A FLOATING POINT NUMBER LBCS 1 44 FC ERROR IF 5 BYTES CLR VALTYP SET VARIABLE TYPE TO NUMERIC JMP LBC14 COPY A PACKED FP NUMBER FROM X TO MKN COMMAND MKN JSR LB143 ERROR IF VALTYP STRING LDB 05 FIVE BYTES IN A FLOATING POINT NUMBER JSR LB5OF RESERVE FIVE BYTES IN STRING SPACE JSR LBC35 PACK AND STORE IT IN STRING SPACE JMP LB69B SAVE STRING DESCRIPTOR ON STRING STACK LOC COMMAND Loc BSR LCE19 POINT X TO FILE BUFFER LDD FCBREC X GET RECORD NUMBER RANDOM FILE OR SECTOR CTR SEQUENTIAL LCE14 STD FPA 2 SAVE ACCD IN BOTTOM 2 BYTES OF FPAQ AND JMP L880E CONVERT TO FLOATING POINT NUMBER STRIP A DEVICE NUMBER FROM A BASIC STATEMENT SET PRINT PARAMETERS ACCORDING TO IT ERROR IF FILE NOT OPEN RETURN WITH X POINTING TO THAT FILE S FCB LCE19 LDA DEVNUM GET CURRENT DEVICE NUMBER AND PSHS A SAVE IT ON THE STACK JSR LB143 ERROR IF VALTYP STRING JSR LASAE CHECK FOR VALID DEVICE NUMBER SET PRINT PARAMETERS TST DEVNUM CHECK DEVICE NUMBER LBLE LB44A BRANCH IF NOT DISK FILE ILLEGAL FUNCTION CALL JSR LC744 POINT X TO FILE BUFFER PULS A GET OLD DEVICE NUMBER OFF OF THE STACK AND STA DEVNUM SAVE IT AS DEVICE NUMBER
223. E7 9D 27 BD BD C3 ED BD E6 34 CC E3 25 ED C3 25 6A 2A 5D 44 84 92 c2 4F 02 B3 Bl 18 02 09 05 09 05 46 B3 B2 87 20 A4 2E 04 20 22 16 A4 04 4 4 22 EQ BE 94 00 4 00 04 5 82 95 09 09 06 09 04 5 26 OF B7 OF 22 4 5 OB B2 B3 0g 61 CA E4 04 09 62 5D 62 01 56 4 7 57 46 89 46 6F 48 9A AC 4 89 5 B E3 6D E6 01 3B 89 19 AB APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 PULS B U STB X STU 02 BRA LCFE7 RSET COMMAND RSET LDA 4F LSET COMMAND LSET CLRA PSHS A JSR 18357 JSR 18146 PSHS X LDX 02 X CMPX DFLBUF BLO 10030 CMPX FCBADR BLO 10042 10030 LDB 2 35 JMP LAC46 10042 LDB B3 JSR LB26F JSR 18748 PULS Y LDA Y BEQ 1007 PSHS B LDB 5 LDU 02 FILL THE FIELDED STRING WITH BLANKS 100566 STB U DECA BNE 10056 LDB S BEQ 1007 CMPB V BLO 10067 LDB V CLR 5 10067 LDU 02 Y TST 5 BEQ 10078 RSET ROUTINE PSHS B CLRA NEGB SBCA 500 ADDB Y ADCA 4500 LEAU D U PULS B 10078 JMP LA59A LD 7E PULS A PC FILES COMMAND FILES JSR 195 LDD FCBADR SUBD DFLBUF PSHS LDB PSHS B JSR CMPA BEQ 100 5 JSR EVALEXPB CMPB 15 LBHI LB44A STB 5 JSR BEQ 10080 LD A5 JSR SYNCOMMA JSR LB3E6 ADDD 40001 STD 1 5 10080 JSR D
224. EAR MERGE FLAG RUN FLAG 0 DON T RUN 2 RUN MERGE FLAG 0 NO MERGE FF MERGE GO GET FILENAME ETC FROM BASIC GET CURRENT INPUT CHAR BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA IS NEXT CHAR R RUN AFTER LOAD SYNTAX ERROR IF ANY MORE CHARS ON LINE SET FLAGS TO RUN AND CLOSE ALL FILES ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 69 6 CA6E CA71 CA73 CA76 CA78 CA7B CA7E CA81 CA84 CA88 CA8B CA91 CA94 CA96 CA99 CA9B CA9D CA9F CAA2 4 CAA7 CAA9 CAAB CAAD CAAF CAB2 4 6 CAB8 CABA CABB CABD CABF 1 4 6 9 CAD2 CAD5 CAD7 CADA CADD CAEL CAE4 CAE6 CAE8 CAE9 CAEC CAED CAEF CAF1 CAF3 CAF5 CAF6 CAF8 CAF9 CAFB CAFF C 01 C 04 C 06 C 08 CBBA CBBC CBBE 10 12
225. ECORD COUNTER 2611 4 S NUMBER OF SECTORS TO BE COPIED INITIALLY SET TO NUMBER OF 2612 SECTORS IN THE LAST GRANULE 2613 GRAN TEST FLAG INITIALLY SET TO NUMBER OF GRANS IN FILE 2614 FILE 7 5 ASCII FLAG 8 9 5 NUMBER OF BYTES IN LAST SECTOR 2615 NUMBER OF SECTORS WHICH WILL FIT IN THE CURRENTLY AVAILABLE FREE RAM 2616 DESTINATION FILENAME EXT AND DRIVE NUMBER 2617 23 5 SINGLE DISK COPY FLAG 24 35 5 SOURCE FILENAME EXT AND DRIVE NUMBER 2618 D330 5F 10330 CLRB SET SECTOR COUNTER TO ZERO 2619 0331 AE E4 LDX 5 GET THE NUMBER OF SECTORS REMAINING IN THE FILE 2620 0333 27 09 BEQ LD33E BRANCH IF NO SECTORS LEFT 2621 D335 5C LD335 INCB ADD A SECTOR TO TEMPORARY SECTOR COUNTER 2622 0336 30 LEAX 1 X DECREMENT REMAINING SECTORS COUNTER 2623 D338 27 94 BEQ LD33E BRANCH IF NO SECTORS LEFT 2624 D33A El 6A 10 5 COMPARE TEMPORARY COUNTER TO NUMBER OF SECTORS WHICH MAY 2625 BE STORED IN FREE RAM 2626 D33C 26 F7 BNE 10335 BRANCH IF STILL ROOM FOR MORE SECTORS 2627 0336 AF E4 LD33E STA 5 SAVE THE NUMBER OF UNCOPIED SECTORS REMAINING IN THE FILE 2628 0340 E7 64 STB 04 5 SAVE THE NUMBER OF SECTORS TO BE COPIED THIS TIME THROUGH 100 2629 0342 8D 58 BSR 0394 GET ACCB SECTORS TO RAM BUFFER 2630 D344 86 FF LDA FF SET SOURCE DESTINATION FLAG TO DESTINATION 2631 D346 8D 40 BSR 10388 PRINT PROMPT MESSAGE IF REQUIRED 2632 D348 6D 65 TST 05 5 CHECK THE GRAN TEST FLAG IF lt gt 0 IT CONTAINS THE 2633 D34A
226. ECTOR DECREMENT WAIT TIMER KEEP WAITING FOR 1793 DRQ GENERATE DRIVE NOT READY ERROR GET DATA BYTE FROM 1793 DATA REGISTER PUT IT IN RAM REPROGRAM FDC CONTROL REGISTER KEEP GETTING DATA BRANCH HERE ON COMPLETION OF SECTOR READ WRITE LD88B ANDCC AF LDA FDCREG ANDA 7C STA DCSTA RTS DSKCON OPERATION CODE JUMP VECTORS LD895 FDB LD7B8 10700 LD7F8 FDB LD7FB DSKREG MASKS FOR DISK DRIVE SELECT LD89D FCB 1 FCB 2 FCB 4 FCB 40 NMI SERVICE DNMISV LDA NMIFLG BEQ LD8AE LDX DNMIVC STX 10 5 CLR NMIFLG RTI IRQ SERVICE DIRQSV LDA PIA0 3 BPL LD8AE LDA 2 LDA RDYTMR BEQ LD8CD DECA STA RDYTMR BNE LD8CD LDA DRGRAM ANDA B STA DRGRAM STA DSKREG LD8CD JMP L8955 THIS IS THE END OF DISK BASIC EXCEPT FOR THE THE CODE FROM THIS POINT TO DF IS GARBAGE DOSBAS 1 1 1686 WASTED BYTES THIS IS THE CODE FOR THE DOS COMMAND ENABLE IRQ FIRO GET STATUS amp KEEP WRITE PROTECT RECORD TYPE WRITE FAULT RECORD NOT FOUND CRC ERROR OR LOST DATA SAVE IN DSKCON STATUS RESTORE HEAD TO TRACK ZERO NO OP RETURN READ SECTOR WRITE SECTOR DRIVE SEL 0 DRIVE SEL 1 DRIVE SEL 2 DRIVE SEL 3 GET NMI FLAG RETURN IF NOT ACTIVE GET NEW RETURN VECTOR STORE AT STACKED PC SLOT ON STACK RESET NMI FLAG 63 5 MICRO SECOND OR 60 HZ INTERRUPT RETURN IF 63 5 MICROSECOND RESET 60 HZ PIA INTERRUPT FLAG GET TIMER BRANCH IF NOT ACTIVE DECREMENT
227. ECTOR NUMBER WAS IT 10 OVERFLOW TO NEXT GRANULE IF SO BRANCH IF NOT SAVE NEW GRANULE NUMBER SET VARIABLES FOR NEW GRANULE GET NUMBER OF SECTORS USED IN THIS GRANULE 9 SECTORS GRANULE BRANCH IF OK BAD FILE STRUCTURE ERROR ERROR DRIVER ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED 0865 0866 0867 0868 0869 0870 0871 0872 0873 0874 0875 0876 0877 0878 0879 0880 0881 0882 0883 0884 0885 0886 0887 0888 0889 0890 0891 0892 0893 0894 0895 0896 0897 0898 0899 0900 0901 0902 0903 0904 0905 0906 0907 0908 0909 0910 0911 0912 0913 0914 0915 0916 0917 0918 0919 0920 0921 0922 0923 0924 0925 0926 0927 0928 0929 0930 0931 0932 0933 0934 0935 0936 0937 0938 0939 0940 0941 0942 0943 0944 0945 0946 0947 0948 0949 0950 0951 0952 0953 0954 0955 0956 0957 0958 0959 0960 C658 C65A C65C C65E C668 C662 C664 C666 C669 C66C C66E C671 C674 C676 C678 C67B C67D C67E C681 C684 C685 C687 C689 C68B C68C C68F C692 C695 C697 C699 C69B C69D C6 0 C6A2 C6A5 C6A8 C6AA C6AC C6AE C6B0 C6B3 C6B5 C6B7 C6B9 C6BC C6BE C6C1 C6C3 C6C6 C6C7 C6CA 6 C600 C601 C603 C605 C606 C607 C609 C60C C6DE C6E1 C6E4 C6E5 C6E7 C6EA C6EC C6EF C6F2 C6F5 C6F8 C6FA C6FC C6FE C701 C704 C706 C708 C7BA 700 C70L C711 EQ 25 1F 34 8D 86 97 BD 33 DF BD 6F E6 26 EC
228. ELFL TXTTAB UNLOAD USRADR USRJMP v40 V41 E3 0185 0188 0188 018 0191 0194 0197 0164 019A 0190 01 0 01 3 01 6 0167 016A 0160 0170 0173 0176 0179 0115 FFC0 C932 00 9 00 2 0080 008 42 43 44 45 46 47 48 V48 V4D V973 V974 V976 V977 V978 VAC VAD VAE VALTMP VARDES VARNAM VARPTR VARTAB VCB VCD VCF VD1 VD3 4 VD5 VD6 VD7 VD8 VD9 VDA VERBEG VERDEF VEREND VERIFY VIDRAM VOLHI VOLLOW WCOLOR WFATVL WRITE XBWMST XVEC15 XVEC17 XVEC18 XVEC3 XVEC4 XVEC8 XVEC9 ZERO ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK 0042 0043 0044 0045 0046 0047 0048 004 0048 0040 0973 0974 0976 0977 0978 OBAB 0 QUAD 0 0006 003 0037 0039 001 00 00 00 0001 0003 0004 DISK BASIC UNRAVELLED II APPENDIX F ORIGIN SPECTRAL ASSOC DISK ROUTINES AND ENTRY POINTS REVISED 12 26 1999 WALTER K ZYDHEK MODIFIED 1 1 1 0 REGISTERS ADDRESS ADDRESS DESCRIPTION B X Y U C48D C468 OPEN DISK FILE enter with the mode I 0 D R in ACCA file number in ACCB filename ext in DNAMBF and DFLTYP DASCFL amp DFFLEN initialized An FCB will be opened and initialized but any errors will cause control to be returned to BASIC A B X U C52D C509 INITIALIZE FCB FOR INPUT enter with the address of the desired FCB in FCBTMP and valid directory information in V973 V978 The FCB will be properly initialized and the directory will be
229. ENT GRANULE NUMBER BPL LC7E8 BRANCH IF LOWER BOUND NOT EXCEEDED LDB 5 RESTORE CURRENT GRANULE NUMBER IF LOWER BOUND EXCEEDED LC7E6 COM 01 5 COMPLEMENT FLAG IF GRANULE NUMBER HAS EXCEEDED BOUNDS ON EITHER THE HI OR LO SIDE FORCE IT TO GO IN THE DIRECTION OPPOSITE THE EXCEEDED BOUND LC7E8 LEAS 901 5 CLEAN UP STACK BRA LC7C8 CHECK FOR ANOTHER FREE GRANULE LC7EC ADDB 5 ADD THE GRANULE COUNTER TO THE CURRENT GRANULE NUMBER CMPB GRANMX GRANMX GRANULES PER DISK BLO LC7E8 BRANCH IF UPPER BOUND NOT EXCEEDED LDB 5 RESTORE CURRENT GRANULE COUNT AND GO TWICE SUBB 4504 AS FAR AS USUAL IN OPPOSITE DIRECTION IF UPPER BOUND EXCEEDED BRA LC7E6 KEEP SEARCHING LC7F8 LDB 2 28 DISK FULL ERROR JMP LAC46 JUMP TO ERROR HANDLER POINT X TO FIRST FREE GRANULE POSITION IN THE FILE ALLOCATION TABLE AND MARK THE POSITION WITH A LAST GRANULE IN FILE MARKER LC7FD LEAS 01 S CLEAR UP STACK REMOVE DIRECTION FLAG TFR B A GRANULE NUMBER TO ACCA ABX POINT X TO FIRST FOUND GRANULE LDB 0 LAST GRANULE FLAG 58 X MARK THE FIRST FOUND GRANULE AS THE LAST GRANULE LC886 RTS CHECK ALL ACTIVE FILES TO MAKE SURE A FILE IS NOT ALREADY OPEN TO BE OPEN A FILE BUFFER MUST MATCH THE DRIVE NUMBER AND FIRST GRANULE NUMBER IN RAM DIRECTORY ENTRY AND THE FCB TYPE MUST NOT MATCH THE FILE TYPE IN ACCA AN AO ERROR WILL NOT BE GENERATED IF A FILE IS BEING OPENED FOR THE SAME MODE THAT IT HAS ALREADY BEEN OPENED UNDER LC807 PSHS A SAVE FILE TYPE ON
230. EQUEST GET DSKREG IMAGE SET FLAG TO ENABLE 1793 TO HALT 6809 GET READ WRITE COMMAND FROM STACK ZERO OUT Y TIMEOUT INITIAL VALUE U POINTS TO 1793 INTERFACE REGISTERS NMI FLAG FF ENABLE NMI VECTOR DISABLE FIRQ IRQ SEND READ WRITE COMMAND TO 1793 SINGLE RECORD COMPARE FOR SIDE 0 NO 15 5 DELAY DISABLE SIDE SELECT COMPARE WRITE DATA ADDRESS MARK FB WAIT FOR STATUS WAS THIS A READ IF 50 GO LOOK FOR DATA DRQ MASK BIT IS 1793 READY FOR A BYTE DRQ SET IN STATUS BYTE BRANCH IF SO DECREMENT WAIT TIMER KEEP WAITING FOR THE 1793 DRQ RESET NMI FLAG ENABLE FIRQ IRQ LDX LD88B STX DNMIVC LDX LDA FDCREG LDA DRGRAM ORA 80 PULS B LDY ZERO LDU FDCREG COM NMIFLG ORCC 50 STB FDCREG EXG A A EXG A A CMPB 80 BEQ LD875 WAIT FOR THE 1793 TO ACKNOWLEDGE READY TO WRITE DATA LDB 4 02 LD85B BITB U BNE 1086 LEAY 1 Y BNE LD85B LD863 CLR NMIFLG ANDCC AF JMP LD7DF WRITE A SECTOR LD86B LDB X STB FDCREG 3 STA DSKREG BRA LD86B FORCE INTERRUPT SET DRIVE NOT READY ERROR GET A BYTE FROM RAM SEND IT TO 1793 DATA REGISTER REPROGRAM FDC CONTROL REGISTER SEND MORE DATA WAIT FOR THE 17933 TO ACKNOWLEDGE READY TO READ DATA LD875 LDB 02 LD877 BITB U BNE 10881 LEAY 1 Y BNE 10877 BRA 10863 READ A SECTOR LD881 LDB FDCREG 3 STB Xt STA DSKREG BRA 10881 DRQ MASK BIT DOES THE 1793 HAVE A BYTE DRQ SET IN STATUS BYTE YES GO READ A S
231. ER SAVE FCB POINTER RESET THE GET DATA POINTER RESET THE PUT DATA POINTER RESET PRINT POSITION COUNTER GET THE FCB DRIVE NUMBER AND SAVE IT IN DSKCON VARIABLE GET CURRENT INPUT CHARACTER FROM BASIC BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION RETURN IN X SAVE RECORD NUMBER IN ACCD POINT X TO FCB SAVE RECORD NUMBER IN FCB GET RECORD NUMBER BAD RECORD ERROR IF RECORD NUMBER 0 INCREMENT RECORD NUMBER GET RANDOM FILE RECORD LENGTH AND RANDOM FILE BUFFER POINTER AND SAVE THEM ON THE STACK THESE ARE THE INITIAL VALUES OF A TEMPORARY RECORD LENGTH COUNTER AND RANDOM BUFFER POINTER WHICH ARE MAINTAINED ON THE STACK POINT X TO RECORD NUMBER 1 MULT UNSIGNED RECORD LENGTH X RECORD NUMBER 1 SAVE PRODUCT ON THE STACK CHECK MS BYTE OF PRODUCT BR ERROR IF NOT ZERO RECORD NUMBER TOO BIG PULL THE BOTTOM 3 PRODUCT BYTES OFF THE STACK TOP TWO IN X BOTTOM IN ACCB ACCB POINTS TO THE FIRST BYTE OF THE SECTOR USED BY THIS RECORD X CONTAINS THE SECTOR OFFSET IN WHICH SECTOR FROM THE START THE BYTE IS LOCATED 612 SECTORS MAX IN A RANDOM FILE BRANCH IF RECORD LENGTH 0 BAD RECORD ERROR JUMP TO ERROR HANDLER POINT U TO FCB COMPARE SAVED SECTOR OFFSET TO THE CURRENT SECTOR OFFSET BEING PROCESSED DO NOT PROCESS A NEW SECTOR IF THEY ARE EQUAL SAVE BYTE AND SECTOR OFFSET TO RECORD START ON STACK CHECK FCB GET PUT FLAG AND BRANCH IF IT WAS A GET FORC
232. ER DATA FROM SOURCE TO DESTINATION BUFFERS SAVE NEW TEMP RECORD POINTER ON THE STACK GET MOVE DATA FROM FCB DATA BUFFER TO THE RANDOM FILE BUFFER IF GET OR FROM RANDOM FILE BUFFER TO FCB DATA BUFFER IF PUT LDU LDA BEQ STA STX LC43E LDX LEAX CLRB LDU LBNE PULS FCBTMP V08 LC43E FCBFLG U 502 5 FCBSOF U 01 X E LC306 A B X PC OPEN RAM HOOK DVEC LEAS 902 5 JSR 18156 JSR LB6A4 PSHS B JSR LA5A2 TSTB LBLE LA603 PULS A PSHS B A CLR DEVNUM JSR SYNCOMMA LDX 4DATEXT JSR 16938 LDD 01FF STD DFLTYP LDX SECLEN JSR BEQ LC481 JSR JSR LB3E6 LDX 2 LC481 STX DFFLEN LBEQ LB44A JSR LA5C7 PULS A B OPEN DISK FILE FOR READ OR WRITE LC48D 5 5 JSR 16749 LBNE LA61C STX FCBTMP JSR 1679 JSR LC68C PULS B LDA 4INPFIL PSHS A CMPB 1 BNE LC4C7 OPEN A SEQUENTIAL FILE FOR INPUT JSR 1 6 5 JSR LC807 LDX V974 LDD DIRTYP X STD DFLTYP BSR LC52D JSR LC627 LCABB JSR LC755 FAT0 X LDX FCBTMP PULS A STA FCBTYP X RTS LC4C7 ASL 5 CMPB 0 BNE LC4E8 OPEN A SEQUENTIAL FILE FOR OUTPUT TST V973 BEQ LC4E1 JSR LC6CF LDA V973 B7 POINT U TO FCB CHECK GET PUT FLAG AND BRANCH IF GET SAVE PUT FLAG IN THE FCB SAVE NEW TEMPORARY RECORD POINTER ON STACK PUT GET SECTOR OFFSET COUNTER AND ADD ONE TO IT SET BYTE OFFSET 0 CHECK THE LENGTH OF THE TEMPORARY RECORD LENGTH COUNTER AND KEEP MOVING DATA
233. ER POINTER GET THE TYPE OF THIS FILE RETURN IF FILE NOT OPEN SAVE FILE TYPE CLOSE THE FILE ZERO OUT THE FILE TYPE DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 1441 CA62 E6 01 LDB FCBDRV X GET DRIVE NUMBER AND 1442 CA64 D7 EB STB DCDRV SAVE IT IN DSKCON VARIABLE 1443 CA66 81 20 CMPA 0UTFIL CHECK FOR OUTPUT TYPE AND 1444 CA68 26 16 BNE LCA80 BRANCH IF NOT OUTPUT TYPE FILE 1445 1446 CLOSE A SEQUENTIAL OUTPUT FILE 1447 CA6A E6 88 18 LDB FCBLFT X GET THE NUMBER OF CHARACTERS IN BUFFER 1448 CA6D 86 80 LDA 80 SET THE PRE SAVED BIT TO INDICATE THAT THE DATA 1449 HAS ALREADY BEEN SAVED ON DISK 1450 CA6F ED 88 13 STD FCBLST X SAVE THE NUMBER OF BYTES USED IN THE LAST SECTOR 1451 CA72 6C 04 INC FCBSEC X INCREMENT THE SECTOR NUMBER 1452 CA74 E6 03 LDB FCBCGR X GET THE CURRENT GRANULE NUMBER 1453 CA76 BD C7 25 JSR LC725 POINT X TO FILE ALLOCATION TABLE 1454 79 A7 01 STA FAT1 X SET FAT DATA NOT VALID FLAG lt gt 0 1455 CA7B 3A ABX ADD GRANULE OFFSET TO FAT POINTER 1456 CA7C 6C 06 INC FATCON X INCREMENT GRANULE DATA ADD ONE SECTOR TO LAST 1457 GRANULE SKIP PAST THE SIX FAT CONTROL BYTES 1458 CA7E 20 71 BRA LCAF1 UPDATE FAT AND DIRECTORY 1459 CA80 81 40 LCA80 CMPA RANFIL RANDOM FILE 1460 CA82 26 6D BNE NO UPDATE FAT AND DIRECTORY 1461 1462 CLOSE A RANDOM FILE 1463 CA84 EC 99 LDD FCBRLN
234. ERS ON STACK NUMBER OF TRACKS WHICH FIT IN RAM 3 5 DESTINATION DRIVE NUMBER SET THE DISK RESET FLAG TO CAUSE A RESET INITIALIZE WRITE TRACK COUNTER TO ZERO ADD ONE TO WRITE TRACK COUNTER DECREMENT REMAINING TRACKS COUNTER AND BRANCH IF NO TRACKS LEFT COMPARE WRITE TRACK COUNTER TO NUMBER OF TRACKS THAT WILL FIT IN RAM AND BRANCH IF ROOM FOR MORE TRACKS IN RAM SAVE THE NUMBER OF TRACKS TO BE TRANSFERRED GET SOURCE DRIVE NUMBER FILL RAM BUFFER WITH TMPLOC TRACKS OF DATA SET SOURCE DESTINATION FLAG TO DESTINATION PRINT PROMPT MESSAGE IF NEEDED GET DESTINATION DRIVE NUMBER WRITE TMPLOC TRACKS FROM BUFFER TEST TRACKS REMAINING FLAG BRANCH IF BACKUP DONE SET SOURCE DESTINATION FLAG TO SOURCE PRINT PROMPT MESSAGE IF NEEDED GET THE TRACKS WRITTEN COUNTER ADD THE NUMBER OF TRACKS MOVED THIS TIME THROUGH LOOP AND SAVE THE NEW TRACKS WRITTEN COUNTER COPY SOME MORE TRACKS CHECK FOR DOS INITIALIZATION JUMP BACK TO BASIC S MAIN L00 PUT THE RETURN ADDRESS IN U TEST DISK RESET FLAG DON T RESET THE DOS IF FLAG NOT SET POINT X TO TABLE OF FCB ADDRESSES SET FILE COUNTER TO ZERO MARK FCB AS CLOSED ADD ONE TO FILE COUNTER COMPARE TO NUMBER OF RESERVED FILES BRANCH IF ANY FILES NOT SHUT DOWN LOAD X WITH THE START OF BASIC SET FIRST BYTE OF BASIC PROGRAM TO ZERO GO DO A RESET THE DOS RESET FLAG CHECK THE LOAD RESET FLAG AND BRANCH IF NOT SET CLEAR THE LOAD RESET FLAG GO DO A
235. ES IN THE LAST SECTOR BNE LC681 BRANCH IF SOME BYTES IN LAST SECTOR LC67D CLRB SET NUMBER OF REMAINING BYTES 256 COM FCBDFL X SET DATA LEFT FLAG TO FF LC681 STB FCBLFT X SAVE THE NUMBER OF CHARS LEFT IN BUFFER LC684 RTS LC685 LDU FCBREC X GET CURRENT RECORD NUMBER LEAU 01 U BUMP IT STU FCBREC X PUT IT BACK RTS SCAN DIRECTORY FOR FILENAME EXT FOUND IN DNAMBF IF FILENAME FOUND RETURN WITH SECTOR NUMBER IN V973 GRANULE IN V976 AND RAM BUFFER CONTAINING DIRECTORY DATA IN V974 IF DISK IS FULL THEN V973 V977 THE FIRST UNUSED SECTOR RETURNED IN V977 RAM IMAGE IN V978 LC68C CLR V973 CLEAR SECTOR NUMBER CLR V977 CLEAR TEMP SECTOR COUNTER LDD 451102 TRACK 17 DIRECTORY READ OPERATION CODE STA DCTRK SAVE TRACK NUMBER STB DCOPC SAVE OPERATION CODE READ LDB 03 READ SECTOR 3 FIRST DIRECTORY SECTOR LC69B 58 DSEC SAVE SECTOR NUMBER IN DSKCON VARIABLE LDU DBUF BUFFER AREA NUMBER AS DATA BUFFER SAVE STU DCBPT IN DSKCON VARIABLE JSR LD6F2 GO READ A SECTOR LC6A5 STU V974 SAVE RAM DIRECTORY BUFFER ADDRESS LEAY U POINT Y TO DIRECTORY BUFFER LDA U GET A BYTE FROM BUFFER BNE LC6D6 BRANCH IF NOT ZERO FILE IS ACTIVE BSR LC609 SET UNUSED FILE POINTERS IF ENTRY HAS BEEN KILLED LC680 LDX DNAMBF POINT TO DISK FILE NAME BUFFER LC6B3 LDA X COMPARE THE FILENAME AND EXTENSION CMPA U STORED IN RAM AT DNAMBF TO THE DIRECTORY BNE LC6C7 ENTRY STORED AT U BRANCH IF MISMATCH CMPX DNAMBF 11 AT END OF FILE NAME BUFFER
236. ET CRUNCHED ASCII FLAG TO ASCII OPEN A SEQUENTIAL FILE FOR OUTPUT SET ZERO FLAG CAUSE ENTIRE FILE TO BE LISTED LIST THE FILE TO CONSOLE OUT FROM BASIC THE SYSTEM OUTPUT FILE TYPE SKIP TWO BYTES INPUT FILE TYPE GET NUMBER OF RESERVED FILES CURRENTLY RESERVED ADD ONE USE ONE ABOVE HIGHEST RESERVED FCB SAVE IT IN DEVICE NUMBER OPEN A FILE amp INITIALIZE FCB OPEN A SEQUENTIAL FILE FOR OUTPUT BASIC FILE FLAG CONSOLE OUT LOAD ACCD WITH START OF VARIABLES SUBTRACT START OF BASIC CONSOLE OUT FILE LENGTH MS BYTE PULL LS BYTE INTO ACCA CONSOLE OUT FILE LENGTH LS BYTE POINT X TO START OF BASIC GET BYTE FROM BASIC SEND TO CONSOLE OUT COMPARE TO END OF BASIC KEEP GOING IF NOT AT END CLOSE FILE POINT TO BAS EXTENSION DEFAULT LC956 LDA 0 LC958 CMPX 8649 LC959 10 I LDB INCB STB DEVNUM JMP LC468 SAVE A CRUNCHED FILE A PREAMBLE OF THREE BYTES WILL PRECEED CRUNCHED FILES BYTE 1 FF 2 3 LENGTH OF BASIC PROGRAM LC964 BSR LC956 LDA FF JSR LCB52 LDD VARTAB SUBD TXTTAB JSR LCB52 TFR B A JSR LCB52 LDX IXII 8 LC979 LDA X JSR LCB52 VARTAB BNE LC979 JMP LA42D LC985 LDX BASEXT JMP LC88A MERGE COMMAND MERGE CLRA LDB FF BRA LC9A2 RUN RAM VECTOR DVEC18 CMPA LBNE XVEC18 LDA 02 BRA LC9A1 C14 GET FILENAME EXT FROM BASIC RUN FLAG 0 DON T RUN MERGE FLAG FF MERGE GO LOAD THE FILE CHECK FOR FILENAME DELIM
237. EXT AVAILABLE FILE FOR INPUT 2057 CEEC FC 09 57 LDD DFLTYP GET FILE TYPE AND ASCII FLAG 2058 CEEF 83 02 00 SUBD 0200 FOR LOADM FILE TYPE 2 ASCII FLAG 0 2059 CEF2 10 26 D7 20 LBNE LA616 BAD FILE MODE ERROR 2060 CEF6 9E 8A LDX ZERO ZERO OUT X REG DEFAULT VALUE OF OFFSET 2061 CEF8 9D A5 JSR GETCCH GET CURRENT CHARACTER FROM BASIC 2062 CEFA 27 06 BEQ LCF02 BRANCH IF END OF LINE NO OFFSET 2063 CEFC BD B2 6D JSR SYNCOMMA SYNTAX CHECK FOR COMMA 2064 CEFF BD B7 3D JSR LB73D EVALUATE EXPRESSION 2065 CF02 9F D3 LCF 2 SIX VD3 STORE OFFSET IN VD3 2066 CF04 BD A5 C7 JSR L 5C7 SYNTAX ERROR IF OTHER CHARACTERS ON LINE 2067 2068 GET PREAMBLE POSTAMBLE 2069 CF07 BD CC E2 LCFQ7 JSR LCCE2 GET FIRST BYTE 2070 CFBA 34 02 PSHS A SAVE IT ON THE STACK 2071 CF C 8D 29 BSR LCF37 GET FIRST ARGUMENT 2072 CF E 1F 02 SAVE IT IN Y 2073 10 8D 25 BSR LCF37 GET THE SECOND ARGUMENT 2074 CF12 D3 D3 ADDD VD3 ADD IT TO THE OFFSET 2075 CF14 DD 9D STD EXECJP STORE IT IN THE JUMP ADDRESS OF THE EXEC COMMAND 2076 CF16 01 D X SAVE IT IN X 2077 CF18 A6 EB LDA 5 GET THE FIRST BYTE OFF OF THE STACK 2078 CFIA 10 26 D5 OF LBNE 14420 CLOSE FILE IF POSTAMBLE EOF 2079 2080 GET RECORD BYTE S 2081 BD C5 97 LCF1E JSR LC597 GET BYTE FROM BUFFER 2082 CF21 D6 70 LDB CINBFL GET STATUS OF CONSOLE IN BUFFER 2083 CF23 27 03 BEQ LCF28 BRANCH IF BUFFER NOT EMPTY 2084 CF25 7E C3 34 JMP LC334 INPUT PAST END OF FILE ERROR 2085 CF28 A7 84 LCF
238. F 1 0 D1F2 D1F3 D1F6 D1F8 1 D1FC D1FF 0202 0205 0207 020 0200 D20F D211 D212 D214 D216 0218 D21A D21D D21F D221 D223 D225 D228 D22A D22B D22D D22F D231 D232 D234 D235 D237 D239 D23B 27 C6 BD BD 18 34 BD BD 6F 8E 6C 30 9 23 6A 18 86 5F 34 73 5F 5C 6A 27 El 26 07 6 80 86 BD 6 80 6D 27 4F BD 6 DB E7 20 8D 7E 35 B6 27 8E 4F 6F 4C B1 23 9E 6F BD 7F B6 27 7F BD 6E 86 8C 86 DD A6 97 8E OF 96 C6 07 BD 0 5C C1 23 0 26 39 E6 1 26 08 5 2 01 04 5 2 09 4 89 27 6 4 27 23 06 09 E4 94 62 F7 93 64 48 FF D2 63 42 E4 c D2 61 03 61 07 03 40 09 16 09 91 09 F8 19 TF AD 09 09 06 09 AD C4 02 86 33 63 EC 09 03 01 05 12 F4 E ED 65 66 36 09 6F 69 06 FF C7 3B 88 12 DA 95 5C 35 35 73 5C 28 5B 19 5C 5D 5D 19 03 89 FF 85 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK BEQ LD18E BRANCH IF END OF LINE LDB 5 TOKEN FOR TO JSR LB26F SYNTAX CHECK FOR TO JSR 10169 GET DESTINATION DRIVE NUMBER LD18E LDS DBUF 255 PUT STACK AT OF DBUF PSHS B SAVE DESTINATION DRIVE NUMBER ON STACK JSR 1 5 7 SYNTAX ERROR IF NOT END OF LINE JS
239. F CHARS LEFT IN BUFFER GET CURRENT RECORD NUMBER BUMP IT PUT IT BACK ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 0865 C65E 39 RTS 0866 0867 SCAN DIRECTORY FOR FILENAME EXT FOUND IN DNAMBF IF FILENAME FOUND 0868 RETURN WITH SECTOR NUMBER V973 GRANULE V976 AND RAM BUFFER 0869 CONTAINING DIRECTORY DATA IN V974 IF DISK IS FULL THEN V973 0870 V977 THE FIRST UNUSED SECTOR RETURNED V977 RAM IMAGE IN V978 0871 65 7F 09 73 LC65L CLR V973 CLEAR SECTOR NUMBER 0872 C662 7F 09 77 CLR V977 CLEAR TEMP SECTOR COUNTER 9873 C665 CC 11 02 LDD 451102 TRACK 17 DIRECTORY READ OPERATION CODE 0874 C668 97 EC STA DCTRK SAVE TRACK NUMBER 0875 C66A D7 EA STB DCOPC SAVE OPERATION CODE READ 0876 C66C C6 03 LDB 03 READ SECTOR 3 FIRST DIRECTORY SECTOR 0877 C66 D7 ED LC66E 58 DSEC SAVE SECTOR NUMBER IN DSKCON VARIABLE 0878 C670 CE 06 00 LDU DBUFS BUFFER AREA NUMBER AS DATA BUFFER SAVE 0879 C673 DF EE STU DCBPT IN DSKCON VARIABLE 0880 C675 BD D5 FF JSR LD5FF GO READ A SECTOR 0881 C678 FF 09 74 LC678 STU V974 SAVE RAM DIRECTORY BUFFER ADDRESS 0882 C67B 31 C4 LEAY U POINT Y TO DIRECTORY BUFFER 0883 C67D A6 C4 LDA GET A BYTE FROM BUFFER 0884 C67F 26 28 BNE LC6A9 BRANCH IF NOT ZERO FILE IS ACTIVE 0885 681 80 29 BSR LC6AC SET UNUSED FILE POINTERS IF ENTR
240. F NOT DOES FILE EXIST ON DIRECTORY BRANCH IF NOT KILL THE OLD FILE GET DIRECTORY SECTOR NUMBER OF OLD FILE AND ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED 0673 0674 0675 0676 0677 0678 0679 0680 0681 0682 0683 0684 0685 0686 0687 0688 0689 0690 0691 0692 0693 0694 0695 0696 0697 0698 0699 0700 0701 0702 0703 0704 0705 0706 0707 0708 0709 0710 0711 0712 0713 0714 0715 0716 0717 0718 0719 0720 0721 0722 0723 0724 0725 0726 0727 0728 0729 0730 0731 0732 0733 0734 0735 0736 0737 0738 0739 0740 0741 0742 0743 0744 0745 0746 0747 0748 0749 0750 0751 0752 0753 0754 0755 0756 0757 0758 0759 0760 0761 0762 0763 0764 0765 0766 0767 0768 C408 C4DB C4DE 4 1 C464 C4E6 C4E8 C4EA C4EC C4EE C4F2 C4F4 C4F7 C4F9 C4FC C4FE C592 C594 C506 C599 50 C5BE C518 C512 C514 C516 C519 C51B C51D C51F C521 C524 C526 C529 C52B C52D C52F C532 C534 C537 C538 C53A C53C C53E C53F C541 C543 C545 C547 C54A C54C C54E C551 C553 C554 C555 C556 C558 C55B C55E C568 C561 C563 C566 C567 C569 C56C C578 C573 C575 C577 C579 C57C C57F C582 C584 C586 C588 C589 C58B C58E C598 C593 C596 C598 C59A B7 BE BF BD 8D 20 C1 27 C1 18 68 FC 34 F3 25 10 23 C6 7E 34 7D 26 8D 20 86 BD 8D 63 6 35 FD EF FE EF 20 8D FE EE EF 39
241. F NOT DONE POINT TO FILENAME AND EXTENSION RAM IMAGE 11 BYTES IN FILENAME AND EXTENSION MOVE B BYTES FROM X TO U GET FILE TYPE AND ASCII FLAG SAVE IN RAM IMAGE FIRST GRANULE TO CHECK FIND THE FIRST FREE GRANULE DISK BASIC UNRAVELLED 0769 0770 0771 0772 0773 0774 0775 0776 0777 0778 0779 0780 0781 0782 0783 0784 0785 0786 0787 0788 0789 0790 0791 0792 0793 0794 0795 0796 0797 0798 0799 0800 0801 0802 0803 0804 0805 0806 0807 0808 0809 0810 0811 0812 0813 0814 0815 0816 0817 0818 0819 0820 0821 0822 0823 0824 0825 0826 0827 0828 0829 0830 0831 0832 0833 0834 0835 0836 0837 0838 0839 0840 0841 0842 0843 0844 0845 0846 0847 0848 0849 0850 0851 0852 0853 0854 0855 0856 0857 0858 0859 0860 0861 0862 0863 0864 C59D C5AQ C5A2 C5A4 C5A6 C5A9 C5AB C5AE C5B0 C5B2 C5B5 C5B7 C5BA C5BC C5BE C5C2 C5C4 C5C6 C5C8 C5CB C5CD C5CE C500 C502 C504 C506 C509 C5DC C5DE C5E1 C564 C5E6 C5E8 C5EA C5EC C5EF C5F1 C5F4 C5F7 C5F9 C5FC C5FE C600 C602 C604 C606 C699 C60B C60C C60L C611 C613 C614 C616 C619 C61B C61D C61L C621 C623 C625 C627 C629 C62A C62C C62E C630 C631 C633 C635 C637 C63A C63B C63D C63F C641 C643 C645 C647 C649 C64B C64D C64F C651 C653 C655 B7 A7 C6 D7 BD 34 BD 6 A6 Bl 25 BD 35 96 18 32 34 OF 8E 06 58 E6 C1 26 EC 18 24 C3 ED AE
242. FD FD CE 86 B7 A7 EC ED 8C 26 86 BF 8E BF 8E 9F CE C6 EF 5A 26 86 BF 86 B7 8E BF 86 B7 TE 7 TE 7F 8E BF 30 BF 30 BF 6F 30 BF 6F 30 BF 6F 86 B7 30 1F 5D 27 4C 85 27 4C 1F CB 12 13 17 18 4B 08 5F EA 4C 00 06 80 09 F9 C1 01 BA A5 B2 43 48 C4 45 CL 01 CL 01 01 7 01 81 C1 C1 C2 01 C8 01 09 84 BA 81 FB 08 01 7 01 08 01 13 09 08 08 08 08 09 09 89 09 01 09 00 89 09 00 89 09 00 02 09 89 10 01 01 01 89 18 00 89 09 34 9 77 BA 2D 32 32 5E 39 B2 1 B 9B 5F 4A 1 BA 09 00 7 00 4 94 DE 89 48 01 4 28 01 2 01 2C 5B 01 00 19 19 19 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 FCBDIR 18 FCBLST EQU 19 21 22 FCBDFL EQU 23 FCBLFT EQU 24 FCBCON EQU 25 ORG DOSBAS FCC DK 1 000 BRA 1 00 DCNVEC FDB DSKCON DSKVAR FDB DCOPC DSINIT FDB DOSINI DOSVEC FDB 005 0 ZERO OUT THE RAM USED BY DISK BASIC LC C LDX DBUF LC F CLR X CMPX DFLBUF BNE LC F LDX LC199 LDU 20 LDB 10 JSR 1 59 LDD L8277 STD 03 0 STD 08 0 CLR CLR 05 U LDD DXCVEC STD COMVEC 13 LDD DXIVEC STD COMVEC 18 MOVE THE RAM VECTORS FROM ROM TO RAM LDU RVECO LC 3B 10 7 STA RVEC22 STA LDD X STD U
243. FER MOVE X TO START OF RECORD POINT U TO CURRENT POSITION IN RANDOM FILE BUFFER SAVE BYTE OFFSET ON STACK CONVERT ACCD INTO A NEGATIVE 2 BYTE NUMBER REPRESENTING THE REMAINING UNUSED BYTES IN THE SECTOR ADD TEMPORARY RECORD LENGTH COUNTER SUBTRACT REMAINING BYTES FROM TEMPORARY RECORD LENGTH BRANCH IF THERE ARE ENOUGH UNUSED BYTES TO FINISH THE RECORD DISK BASIC UNRAVELLED 0577 41 0578 41 0579 41 0580 0581 C41F 0582 0583 0584 0585 C421 0586 C423 0587 C425 0588 C427 0589 C429 0590 C428 0591 C42D 0592 C42L 0593 C432 0594 0595 0596 0597 C434 0598 C436 0599 C438 0600 0601 C43C 0602 C43E 0603 C440 0604 C442 0605 C443 0606 C445 0607 C449 0608 0609 0610 0611 C44B 0612 C44D 0613 C450 0614 C453 0615 C455 0616 C458 0617 C459 0618 45 0619 C45F 0620 C461 0621 C463 0622 C466 0623 C469 0624 C46C 0625 C46F 0626 C472 0627 C475 0628 C477 0629 C479 0630 47 0631 47 0632 C481 0633 C484 0634 C488 0635 C488 0636 0637 0638 C48D 0639 C48F 0640 C492 0641 C496 0642 C498 0643 C498 0644 49 0645 4 0646 4 2 0647 4 4 0648 C4A6 0649 0650 0651 C4A8 0652 4 0653 C4AE 0654 C481 0655 C4B3 0656 C4 6 0657 C4B8 0658 CABB 0659 0660 CACO 0661 C4C2 0662 C4C4 0663 C4C6 0664 C4C7 0665 C4C9 0666 C4CB 0667 0668 0669 c4cD 0670 CADO 0671 C402 0672 C405 ED 35 50 E6 6F 6F 32 96 27 1E BD EF DE 96
244. FFER MOVE IT INTO THE STRING SPACE BRANCH BACK TO BASIC S LET COMMAND TOKEN FOR DLOAD YES TOKEN FOR PMODE NO GET NEXT CHARACTER FROM BASIC CHECK FOR COMMA BRANCH IF COMMA EVALUATE EXPRESSION RETURN VALUE IN ACCB CHECK FOR PMODE 4 FC ERROR IF PMODE gt 4 NUMBER BLOCKS BEFORE GRAPHICS PAGES JUMP TO EXEAS PMODE COMMAND CLOSE FILES GET NEXT CHARACTER FROM BASIC JUMP TO EXEAS DLOAD MODIFIED TOKEN FOR POS IF NOT POS GO TO EXBAS SECONDARY COMM HANDLER SYNTAX CHECK FOR AND EVALUATE EXPRESSION GET DEVICE NUMBER AND SAVE IT ON STACK EVALUATE DEVICE NUMBER TEST DEVICE NUMBER CHECK DEVICE NUMBER AND BRANCH IF NOT A DISK FILE POINT X TO FCB GET FILE TYPE DIRECT RANDOM FILE BRANCH IF NOT A RANDOM FILE RESTORE DEVICE NUMBER GRAB THE PUT DATA ITEM COUNTER AND CONVERT IT TO A FLOATING POINT NUMBER SET PRINT PARAMETERS RESTORE DEVICE NUMBER FREE JSR LB143 JSR 1 70 CMPB 03 LBHI LA61F STB DCDRV JSR 1679 JSR 16755 LEAX FATCON X CLR 5 LDB 6 LCEB6 10 X COMA BNE IN S LCEBD DECB BNE 1 6 PULS B JMP LB4F3 DRIVE COMMAND DRIVE JSR EVALEXPB CMPB 03 LBHI LA61F STB DEFDRV RTS EVALUATE EXPRESSION RAM VECTOR DVECI5 LDA 904 5 BNE LCEE9 LDX 505 5 CMPX LAF9A BNE LCEE9 LDX 502 5 CMPX L8166 BNE 1 9 LDX LCEEC STX 5 5 LCEE9 JMP 5 LET MODIFIER PULS A RORA JSR LB148 LBEQ LBC33 LDX 2
245. FFER AREA ACCD END SAVE NEW START OF RANDOM FILE BUFFER AREA SAVE BUFFER START IN FCB GET RANDOM FILE RECORD LENGTH AND SAVE IT IN FCB SET FAT FLAG SAVE FILE TYPE IN FCB INITIALIZE FCB GET RAM DIRECTORY IMAGE GET NUMBER OF BYTES IN LAST SECTOR OF FILE SAVE IT IN FCB GET CURRENT FILE BUFFER CLEAR FCB CONTROL BYTES CLEAR A BYTE DECREMENT COUNTER BRANCH IF NOT DONE GET CURRENT FILE BUFFER ADDRESS BACK GET CURRENT DRIVE NUMBER AND SAVE IT IN FCB GET FIRST GRANULE SAVE AS THE STARTING GRANULE NUMBER AND SAVE IT AS CURRENT GRANULE NUMBER GET DIRECTORY SECTOR NUMBER SUBTRACT 3 DIRECTORY SECTORS START AT 3 MULTIPLY SECTORS BY 8 8 DIRECTORY ENTRIES PER SECTOR SAVE SECTOR OFFSET GET RAM DIRECTORY IMAGE SUBTRACT RAM OFFSET 8 DIRECTORY ENTRIES SECTOR NOW ACCA CONTAINS 9 7 ACCA CONTAINS DIRECTORY ENTRY 9 71 SAVE DIRECTORY ENTRY NUMBER DIRECTORY AND UPDATE FILE ALLOCATION TABLE ENTRY IN FIRST UNUSED SECTOR DISK FULL ERROR GET SECTOR NUMBER OF FIRST EMPTY DIRECTORY ENTRY DISK FULL ERROR IF NO EMPTY DIRECTORY ENTRIES SAVE SECTOR NUMBER OF FIRST EMPTY DIRECTORY ENTRY SAVE SECTOR NUMBER IN DSKCON REGISTER READ CODE SAVE IN DSKCON REGISTER READ SECTOR GET ADDRESS OF RAM IMAGE OF UNUSED DIRECTORY ENTRY AND SAVE AS CURRENT USED RAM IMAGE TFR X U POINT U TO DIRECTORY RAM IMAGE SET COUNTER TO CLEAR 32 BYTES DIRECTORY ENTRY CLEAR BYTE DECREMENT COUNTER CONTINUE I
246. FPAG 1 2 FPCARY FPSBYT FREE FRESPC FRETOP FRQVEC GARBFL GETCCH GETNCH GIVABF GRBLOK GRPRAM HORBEG HORBYT HORDEF HOREND IFCTR IKEYIM INPFLG INT L8748 1880 18955 Di 8 0 C282 CC1C C5BC C848 C84B CF32 IRQ IRQVEC KEYBUF KILL L813C L8168 L8311 L8316 L836C L8C1B L95AC L962E 19650 L96CB L96EC L975F L9FB5 LABE2 LA171 LA176 LA282 LA35F LA37C LA3ED LA3FB LA406 LA426 LA429 LA42D LA549 LA59A LA5A2 LA5A5 LASAE LA5C7 LA5DA LA5E4 LA603 LA616 LA61C LA61F LA7D1 LA7E9 LA928 LA951 LA974 LAC37 LAC44 LAC46 60 LAC73 LAC7C LACEF LAD19 LAD21 LB069 LB143 LB146 FFF8 010C 0152 C6EF 813C 8168 8311 8316 836C 8C18 95AC 962E 9650 96 96 975F 9FB5 2 171 176 A282 A35F A37C A3ED A3FB A406 A426 A429 A42D A549 A59A A5A2 A5A5 A5AE A5C7 A5DA A5E4 A603 A616 A61C A61F A7D1 7 9 928 951 974 AC37 44 46 60 AC73 AC7C ACEF AD19 AD21 8069 B143 B146 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK LAD33 LAD9E LADC6 LADD4 LADEB LAE15 LAF9A LAFA4 LAFB1 LASTPT LB C LB 1E LB148 LB156 LB166 LB244 LB262 LB26F LB277 LB2CE LB357 LB3E6 LB44A LB4F3 LB50F LB516 LB654 LB657 LB659 LB69B LB6A4 LB70E LB738 LB73D LB958 LB95C LB99F LB9A2 LB9AC LB9AF LB9C5 LBB91 LBC14 LBC33 LBC35 LBC5F LBDCC LBDD9 LC002 LC00C LC00F LC03B LC061 LC BD LC C2 LC2EA
247. FPIEXP GET EXPONENTS OF FPA AND 1908 CDB8 D6 4F LDB FPQEXP FPA1 PRIOR TO DIVISION 1909 CDBA BD BB 91 JSR LBB91 DIVIDE TOTAL NUMBER OF BYTES BY NUMBER OF BYTES IN A RECORD 1910 CDBD 7E EE JMP INT CONVERT FPA TO AN INTEGER 1911 1912 FREE COMMAND 1913 CDC BD 43 FREE JSR LB143 NUMBER TYPE CHECK 1914 CDC3 BD B7 QE JSR LB7OE EVALUATE NUMERIC EXPRESSION AND RETURN VALUE IN ACCB 1915 CDC6 C1 03 CMPB 03 ONLY 4 LEGAL DRIVES 1916 CDC8 10 22 D8 53 LBHI LA61F DEVICE NUMBER ERROR IF DRIVE NUMBER IS gt 3 1917 CDCC D7 EB STB DCDRV SAVE IN DRIVE NUMBER 1918 CDCE BD C7 6D JSR LC76D GET FILE ALLOCATION TABLE AND STORE IN BUFFER 1919 CDD1 BD C7 25 JSR LC725 POINT X TO START OF FILE ALLOCATION TABLE BUFFER 1920 CDD4 30 06 LEAX FATCON X MOVE TO FIRST GRANULE DATA BYTE C20 DISK BASIC UNRAVELLED II 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 C006 CDD8 CDDA CDDC CDDD CDDF 1 CDE2 CDE4 CDE6 CDE9 CDEC
248. FROM BASIC 2565 D2CF 8D DB BSR LD2AC AND SAVE THEM ON THE STACK 2566 D2D1 6F E2 CLR 5 CLEAR A BYTE ON STACK SINGLE DISK COPY SDC FLAG 2567 D2D3 9D A5 JSR GETCCH GET CURRENT INPUT CHARACTER 2568 0205 27 A BEQ LD2E1 BRANCH IF END OF LINE SINGLE DISK COPY 2569 D2D7 63 E4 COM 5 SET SOC FLAG TO FF NO SINGLE DISK COPY 2570 209 C6 5 LDB 5 TOKEN FOR TO 2571 D2DB BD B2 6F JSR LB26F SYNTAX CHECK FOR TO 2572 D2DE BD C8 87 JSR LC887 GET DESTINATION FILENAME EXT AND DRIVE NUMBER 2573 D2E1 8D C9 LD2E1 BSR LD2AC SAVE DESTINATION FILENAME EXT amp DRIVE NUMBER ON STACK 2574 D2E3 BD A5 C7 JSR L 5C7 SYNTAX ERROR IF MORE CHARACTERS ON LINE 2575 02 6 BD CA 3B JSR DVEC7 CLOSE ALL FILES 2576 2577 COUNT THE NUMBER OF SECTORS WORTH OF FREE RAM AVAILABLE 2578 D2E9 6F E2 CLR 5 CLEAR A SECTOR COUNTER ON THE STACK 2579 02 30 E8 9C LEAX 100 5 BUG THIS SHOULD BE 190 TO POINT X ONE SECTOR LENGTH BELOW STACK 2580 D2EE 6C E4 LD2EE INC 5 INCREMENT SECTOR COUNTER 2581 02 0 30 89 FF 00 LEAX SECLEN X DECREMENT X BY ONE SECTOR 2582 02 4 9C 1F CMPX ARYEND COMPARE TO TOP OF ARRAYS 2583 D2F6 24 F6 BHS LD2EE BRANCH IF NOT AT BOTTOM OF FREE RAM 2584 D2F8 E4 DEC 5 DECREMENT SECTOR COUNTER 2585 D2FA 10 27 D9 46 LBEQ LAC44 OM ERROR IF NOT AT LEAST ONE FULL SECTOR OF FREE RAM 2586 D2FE 30 6E LEAX 14 5 POINT X TO START OF SOURCE DATA 2587 0300 8D BE BSR LD2C PUT SOURCE DATA INTO DNAMBF AND DSKCON 2588 0302 BD C6 5F J
249. GHEST RESERVED FCB NUMBER ADD ONE 2687 D3AD 5C INCB AND OPEN A RANDOM FILE WHOSE FCB WILL BE ONE ABOVE 2688 D3AE BD C4 68 JSR LC468 THE HIGHEST RESERVED FCB THE SYSTEM FCB C28 DISK BASIC UNRAVELLED II 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 03 1 0383 D3B6 D3B9 D3BB D3BD D3BF 03 1 D3C3 D3C5 D3C7 D3C9 D3CC D3CE 0300 0302 0304 0306 0308 D3DA D3DC D3DF 0361 0363 0364 0366 0368 0368 D3ED D3EF D3F1 D3F3 D3F5 D3F7 D3F9 D3FC D3FF 0401 0403 0405 0407 0409 0408 040 0411 0413 0415 0418 041 041 0416 0421 0423 0425 0427 0429 0428 0426 0431 0434 0436 0439 043C 0436 0440 0442 0445 0447 0449 0448 0446 0450 0451 0453 0455 0457 0459 0458 045C D45F D462 D465 D467 D469 D46B D46D D46F D471 9E cc ED E6 27 06 4 27 89 BD 9E EE EF E6 DE 34 9E EF BD 6 35 5A 26 9E CE EF 06 E4 27 6F EC 8A ED 7E
250. GTH OF PROGRAM PUT LS BYTE INTO ACCB NOW ACCD CONTAINS LENGTH OF PROGRAM ADD BEGINNING OF BASIC SEE OF ENOUGH ROOM IN RAM FOR THIS FILE GET START OF BASIC READ A CHAR FROM CONSOLE IN BUFFER EMPTY BRANCH IF SO STORE CHAR GET ANOTHER CHARACTER CLEAR LOAD FLAG LOAD WAS ERROR FREE SAVE NEW START OF VARIABLES CHECK THREE BYTES CHECK A BYTE BRANCH IF NON ZERO DECREMENT COUNTER KEEP CHECKING IF NOT DONE GET START OF VARIABLES SAVE START OF VARIABLES CLEAR A BYTE DECREMRNT COUNTER KEEP CLEARING BYTES IF NOT DONE CLOSE SELECTED FILE DO PART OF NEW ERASE VARIABLES RESET INPUT PTR INITIALIZE EXBAS GRAPHICS VARIABLES RELOCATE ALL THE BASIC NEXT LINE POINTERS CHECK LSB OF RUN FLAG BRANCH IF DON T CLOSE ALL FILES CLOSE ALL FILES TEST BIT 1 OF RUN FLAG BRANCH TO COMM INTERPRETATION LOOP IF BIT 1 SET RETURN TO DIRECT MODE CHECK DEVICE NUMBER AND TRY TO RUN FILE IF IT IS A DISK FILE GET THE NUMBER OF RESERVED FILE BUFFERS ADD ONE SAVE IT STORE IT IN DEVICE NUMBER CLOSE FILE GET BACK NUMBER OF FILE BUFFERS DECREMENT FILE BUFFER COUNTER BRANCH IF ALL FILES NOT CLOSED CHECK DEVICE NUMBER AND RETURN IF NOT A DISK FILE PURGE RETURN ADDRESS OFF OF THE STACK POINT X TO CORRECT FCB SET DEVICE NUMBER TO SCREEN SAVE FILE BUFFER POINTER GET THE TYPE OF THIS FILE RETURN IF FILE NOT OPEN SAVE FILE TYPE CLOSE THE FILE ZERO OUT THE FILE TYPE GET DRIVE NUMBER AND SAVE IT IN DSKCON VARI
251. HANDLER DXCVEC CA BEQ LCE4E CMPA C8 LBNE L813C JSR GETNCH CMPA LBEQ 19650 JSR EVALEXPB CMPB 04 LBHI LB44A LDA GRPRAM JMP 1962 DISK BASIC DLOAD MODIFIER LCE4E JSR 14429 JSR GETNCH JMP L8C1B DXIVEC 9A 80 2 LBNE L8168 JSR 18262 LDA DEVNUM PSHS A JSR 1 JSR 14406 TST DEVNUM BLE 1 80 JSR LC714 LDB FCBTYP X CMPB RANFIL BNE LC 80 PULS A STA DEVNUM LDD FCBPUT X JMP GIVABF 1 80 JSR LA35F PULS A STA DEVNUM LDB DEVPOS JMP LB4F3 SAVEM COMMAND LCEBC JSR GETNCH BSR JSR 1836 JSR L836C 802 5 LBCS LBA4A C21 IF START END THEN ILLEGAL FUNCTION CALL ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 2017 CE9C BD 83 6C JSR L836C EVAL EXPRESSION TRANSFER ADDRESS PUT ON STACK 2018 CE9F BD A5 C7 JSR LA5C7 SYNTAX ERROR IF ANY MORE CHARS ON THIS LINE 2019 2 02 00 LDD 450200 FILE TYPE 2 ASCII FLAG CRUNCHED 0 2020 5 FD 09 57 STD DFLTYP 2021 CEA8 BD C9 56 JSR LC956 GET NEXT UNOPEN FILE AND INITIALIZE FCB 2022 CEAB 4F CLRA ZERO FLAG FIRST BYTE OF PREAMBLE 2023 CEAC 8D 2B BSR LCED9 WRITE A BYTE TO BUFFER 2024 CEAE EC 62 LDD 02 5 GET END ADDRESS 2025 CEB A3 64 SUBD 904 5 SUBTRACT THE START ADDRESS 2026 CEB2 C3 00 01 ADDD 0001 THE SAVED DATA BLOCK WILL INCLUDE BOTH THE FIRST
252. HE STACK TURN OFF THE CASSETTE MOTOR DISABLE THE ANALOG MULTIPLEXER SET DEVICE NUMBER TO THE SCREEN SEND A CR TO THE SCREEN SEND A TO THE SCREEN POINT X TO DISK BASIC S ERROR TABLE JUMP TO BASIC S ERROR HANDLER 27 BAD RECORD 28 DISK FULL 29 OUT OF BUFFER SPACE 30 WRITE PROTECTED 31 BAD FILE NAME 32 BAD FILE STRUCTURE 33 FILE ALREADY EXISTS 34 FIELD OVERFLOW 35 SET TO NON FIELDED STRING 36 VERIFICATION ERROR 37 WRITE OR INPUT PAST END OF RECORD BASIC FILE EXTENSION BLANK DEFAULT FILE EXTENSION DATA FILE EXTENSION BINARY FILE EXTENSION SAVE X REG AND STATUS LOAD X WITH CALLING ADDRESS COMING FROM EXBAS GET PUT NO NUMBER SIGN GET PUT BRANCH IF GET OR PUT TO RANDOM FILE RESTORE X REG STATUS AND RETURN PURGE RETURN ADDRESS AND REGISTERS OFF OF THE STACK EVALUATE DEVICE NUMBER amp SET FCB POINTER SAVE FCB POINTER RESET THE GET DATA POINTER ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 0385 C2 6 6 88 17 CLR FCBPUT X RESET THE PUT 0386 C289 6 88 18 CLR FCBPUT 1 X DATA POINTER 0387 C2BC 6F 06 CLR FCBPOS X RESET PRINT POSITION COUNTER 0388 C2BE A6 01 LDA FCBDRV X GET THE FCB DRIVE NUMBER AND 0389 C2C0 97 EB STA DCDRV SAVE IT IN DSKCON VARIABLE 0390 C2C2 90 5 JSR GETCCH GET CURRENT INPUT CHARACTER FROM BASIC 0391 C2C4 27 BA BEQ LC
253. HS B LDA 1 ADDD 01 5 BHS LC3FC STD 901 5 PULS B NEGB BRA LC404 SET PRE SAVED FLAG BIT ALL PUT RECORDS ARE WRITTEN TO DISK BEFORE LEAVING PUT SAVE NUMBER OF BYTES USED IN LAST SECTOR PULL BYTE OFFSET OFF OF THE STACK POINT X TO FCB DATA BUFFER MOVE X TO START OF RECORD POINT U TO CURRENT POSITION IN RANDOM FILE BUFFER SAVE BYTE OFFSET ON STACK CONVERT ACCD INTO A NEGATIVE 2 BYTE NUMBER REPRESENTING THE REMAINING UNUSED BYTES IN THE SECTOR ADD TEMPORARY RECORD LENGTH COUNTER SUBTRACT REMAINING BYTES FROM TEMPORARY RECORD LENGTH BRANCH IF THERE ARE ENOUGH UNUSED BYTES TO FINISH THE RECORD SAVE NEW TEMPORARY RECORD LENGTH COUNTER RESTORE BYTE COUNTER NEGATE IT ACCB THE NUMBER OF BYTES AVAILABLE TO A RECORD IN THIS SECTOR MOVE THE DATA BRANCH HERE IF REMAINING RECORD LENGTH WILL FIT IN WHAT S LEFT OF THE CURRENTLY SELECTED SECTOR LC3FC LDB 02 5 CLR 1 5 CLR 02 5 LEAS 901 5 104044 10 VD8 BEQ 1 40 EXG X U LC4 A JSR LA59A STU 02 5 GET REMAINING RECORD LENGTH CLEAR THE TEMPORARY RECORD LENGTH COUNTER ON THE STACK PURGE BYTE OFFSET FROM STACK CHECK GET PUT FLAG AND BRANCH IF GET SWAP SOURCE AND DESTINATION POINTERS TRANSFER DATA FROM SOURCE TO DESTINATION BUFFERS SAVE NEW TEMP RECORD POINTER ON THE STACK GET MOVE DATA FROM FCB DATA BUFFER TO THE RANDOM FILE BUFFER IF GET OR FROM RANDOM FILE BUFFER TO FCB DATA BUFFER IF PUT C6
254. IC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 1153 C832 Al E4 CMPA 5 IS THIS FCB OF THE PROPER TYPE 1154 C834 26 DF BNE LC815 FILE MODE ERROR IF NOT 1155 C836 35 92 LC836 PULS A X PC RETURN 1156 DEVICE NUMBER VALIDITY CHECK RAM HOOK 1157 C838 2F 9C DVECI BLE LC7D6 RETURN IF NOT A DISK FILE 1158 C83A F1 09 5B CMPB FCBACT COMPARE DEVICE NUMBER TO HIGHEST POSSIBLE 1159 C83D 10 22 DD DE LBHI LA61F DEVICE NUMBER ERROR IF TOO BIG 1160 C841 35 90 PULS X PC RETURN 1161 1162 SET PRINT PARAMETERS RAM HOOK 1163 C843 OD 6F DVEC2 TST DEVNUM CHECK DEVICE NUMBER AND 1164 C845 2F 8F BLE LC7D6 RETURN IF NOT DISK FILE 1165 C847 32 62 LEAS 02 5 PURGE RETURN ADDRESS OFF OF THE STACK 1166 C849 34 16 PSHS X B A SAVE REGISTERS 1167 C84B OF 6E CLR PRTDEV SET PRINT DEVICE NUMBER TO NON CASSETTE 1168 C84D BD C7 14 JSR LC714 POINT X TO FCB 1169 C850 E6 06 LDB FCBPOS X GET PRINT POSITION 1170 C852 4 CLRA PRINT WIDTH 256 1171 C853 8E 10 00 LDX 1000 TAB FIELD WIDTH AND TAB ZONE 1172 C856 7E A3 7C JMP LA37C SAVE THE PRINT PARAMETERS 1173 1174 BREAK CHECK RAM HOOK 1175 C859 00 6F DVEC11 TST DEVNUM CHECK DEVICE NUMBER AND RETURN 1176 C85B 2F 02 BLE LC85F IF NOT A DISK FILE 1177 C85D 32 62 LEAS 02 5 PURGE RETURN ADDRESS OFF OF THE STACK DON T 1178 C85F 39 LC85F RTS DO A BREAK CHECK IF DISK FILE 1179 1188 EOF RAM HOOK 1181 C860 32 62 DVEC14 LEAS 02 5 PURGE RETURN ADDRESS OFF OF THE STACK 1182 C862 96 6F LDA DEVNUM GET DEVICE NUMBER AND SAV
255. INTER POINT U TO THE CORRECT GRANULE IN FAT SKIP PAST THE SIX FAT CONTROL BYTES GET CURRENT SECTOR FOR THIS GRANULE MAX SECTOR NUMBER 9 SECTORS GRANULE BRANCH IF NOT AT END OF GRANULE CLEAR SECTOR NUMBER GET NEXT FREE GRANULE SAVE NEW GRANULE IN FCB SKIP TWO BYTES NO DATA STORED IN NEW SECTOR YET FORCE GRANULE NUMBER TO BE FINAL GRANULE IN FILE STORE IN MAP UPDATE FILE ALLOCATION TABLE RESTORE REGISTERS RESTORE REGISTERS AND RETURN SCAN DRIVE NUMBER FROM INPUT LINE GET FAT FOR THIS DRIVE PRINT CARRIAGE RETURN TO CONSOLE OUT GET TRACK 17 AND READ OP CODE AND SAVE IN DSKCON VARIABLES START WITH SECTOR 3 FIRST DIRECTORY SECTOR SAVE SECTOR NUMBER IN DSKCON VARIABLE USE I 0 BUFFER 0 FOR DATA TRANSFER SAVE IN DSKCON VARIABLE READ A SECTOR SAVE TOP OF STACK GO DO A BREAK CHECK RESTORE STACK TEST FILE NAME FIRST BYTE BRANCH IF KILLED FF END OF DIRECTORY RETURN IF END OF DIRECTORY SAVE DIRECTORY POINTER ON STACK NUMBER CHARACTERS TO PRINT SEND FILENAME TO CONSOLE OUT SEND BLANK TO CONSOLE OUT NUMBER CHARACTERS TO PRINT SEND EXTENSION TO CONSOLE OUT SEND BLANK TO CONSOLE OUT GET FILE TYPE CHECK THE NUMBER OF DECIMAL DIGITS IN ACCB IF THERE IS ONLY ONE DIGIT SEND BLANK TO CONSOLE OUT CLEAR MS BYTE OF ACCO PRINT ACCD IN DECIMAL TO CONSOLE OUT SEND BLANK TO CONSOLE OUT X NOW POINTS TO DIRECTORY ENTRY ASCII BIAS ADD TO ASCII FLAG PRINT CHARACTER AND BLANK TO CONSOLE OUT
256. ITER DOUBLE QUOTE NONE JUMP TO EXBAS RUN RAM HOOK RUN FLAG DON T CLOSE ALL FILES BEFORE RUN LOAD THE FILE ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 99 C99C 9 0 9 1 9 2 9 5 C9A8 C9AA C9AC C9AE C9B1 C9B3 C9B6 C9B9 C9BB C9BE C9C0 C9C3 C9C5 C9C8 C9CA C9CD C9DB C9D3 C9D6 CODA C9DD C9EQ C9E3 C9E6 C9E8 C9EB C9ED C9EF C9F1 COF4 C9F6 C9F9 C9FB C9FD C9FF CAQ1 04 6 8 CABA CABC CABD 11 13 15 16 18 1 CALE CA21 CA24 CA27 CA29 CA2C CA2F CA33 CA36 CA38 CA3A CA3B CASE 41 4 45 47 48 CA4A CA4B CA4D CA51 CA53 CA56 CA58 CA5A 5 CASE 60 81 10 4F 5F B7 F7 8D 9D 27 BD c6 BD BD 86 B7 8D B6 27 7D 26 BD 7E B6 BA 18 BD 73 BD BD 34 BD 16 3
257. IZONTAL RESOLUTION 0795 5 LPF0 LINES PER FIELD SEE TABLE BELOW 0796 BIT6 LPF1 LINES PER FIELD SEE TABLE BELOW 0797 BIT7 0798 0799 LPF1 LINES PER FIELD 0800 0 0 192 0801 0 1 200 0802 1 0 RESERVED 0803 1 1 225 0804 0805 VIDEO RESOLUTION 0806 ALPHA BP 0 COCO 0 0807 MODE HRES2 HRES1 HRES CRES1 5 0808 32 0 1 0809 40 0 1 1 0810 80 1 1 1 0811 GRAPHICS BP 1 COCO 0 0812 PIXELSxCOLORS 52 HRES1 HRESQ CRES1 50 0813 640 4 1 1 1 0 1 11 DISK BASIC UNRAVELLED II 0814 0815 0816 0817 0818 0819 0820 0821 0822 0823 0824 0825 0826 0827 0828 0829 0830 0831 0832 0833 0834 0835 0836 0837 0838 0839 0840 0841 0842 0843 0844 0845 0846 0847 0848 0849 0850 0851 0852 0853 0854 0855 0856 0857 0858 0859 0860 0861 0862 0863 0864 0865 0866 0867 0868 0869 0870 0871 0872 0873 0874 0875 0876 0877 0878 0879 0880 0881 0882 0883 0884 0885 0886 0887 640 2 512 4 512 2 320x16 320x4 256x16 256x4 256x2 160x16 COCO MODE SELECTION ALPHA ALPHA INVERTED SEMIGRAPHICS 4 64x64 COLOR GRAPHICS 128x64 GRAPHICS 128x64 COLOR GRAPHICS 128x96 GRAPHICS 128x96 COLOR GRAPHICS 128x96 GRAPHICS 128x96 COLOR GRAPHICS 256x192 GRAPHICS c ALPHANUMERIC MODES TEXT SCREEN MEMORY EVEN BYTE BIT 2 BIT3 4 5 6 BIT7 ODD BYTE BIT
258. L error occurs while searching for an unused granule6 FCBPOS Single byte quantity containing the current print position in the file for output files unused for input files A carriage return in the output data stream will reset this value to zero Double byte quantity containing the number of whole sectors which have been input or output to a file Seven unused bytes Single byte cache flag 0 0 empty FF cache full when inputting data the DOS treats a CR LF sequence as a CR Therefore the DOS must look for a LF after a CR and if it does not find a LF it must save that character for the next time an input character is needed The cache flag indicates whether or not an extra character which needs to be saved cached has been pulled out of an input file Single byte cache data byte If the cache flag is set the cache data byte is stored here Single byte data left flag for input files data still left in file FF no data left in file Single byte quantity containing the number of characters left in the data buffer of an input file or the number of characters stored in the data buffer of an output file DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK FILE ALLOCATION TABLE The file allocation table FAT is used to keep track of whether or not a granule has been allocated to a file or if it is free The FAT is composed of six control bytes followed
259. LAG IF FIRST TIME THROUGH LOOP GET THE NUMBER OF BYTES IN THE LAST SECTOR OR IN THE PRE SAVED FLAG AND SAVE THE NUMBER OF BYTES IN THE LAST SECTOR IN THE FCB CLOSE THE FILE GET THE DRIVE TRACK AND SECTOR NUMBERS EVALUATE STRING VARIABLE 1 AND SAVE THE DESCRIPTOR ADDRESS ON THE STACK EVALUATE STRING VARIABLE 2 AND SAVE THE DESCRiPTOR ADDRESS ON THE STACK DSKCON READ OP CODE REAO A SECTOR INTO DBUF POINT U TO GET STRING PUT STRING POINT U TO GET STRING PUT STRING TOP HALF OF DBUF 2 DESCRIPTOR ADDRESS 2 INTO STRING SPACE BOTTOM HALF OF DBUF 1 DESCRIPTOR ADDRESS DESCRIPTOR amp SOURCE POINTER ON THE STACK RESERVE 128 BYTES IN STRING SPACE POINT U TO RESERVED STRING SPACE GET STRING DESCRIPTOR ADDRESS SAVE DESCRIPTOR DATA LENGTH AND ADDRESS OF THE NEW STRING GET THE SOURCE DBUF POINTER MOVE SECTOR DATA FROM DBUF TO STRING SPACE SYNTAX CHECK FOR A COMMA POINT X TO EVALUATE VARIABLE ROUTINE EVALUATE A VARIABLE TM ERROR IF NUMERIC VARIABLE EVALUATE EXPRESSION RETURN VALUE IN ACCB COMPARE TO 3 HIGHEST DRIVE NUMBER FC ERROR IF IT S gt 3 SAVE DRIVE NUMBER ON THE STACK SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION TRACK NUMBER CHECK FOR MAXIMUM TRACK NUMBER FC ERROR IF TRACK NUMBER 34 SAVE TRACK NUMBER ON THE STACK JMP 10326 PUT GET DATA FROM THE DESTINATION SOURCE FILES LDA7C 10 LEAX 13 5 BRA 10486 10482 CLRA LEAX 26 5 10486 STA
260. LC306 LC30B AD33 AD9E ADC6 ADD4 ADEB AE15 AF9A AFA4 AFB1 0000 B00C B 1E B148 B156 B166 B244 B262 B26F B277 B2CE B357 B3E6 B44A B4F3 B50F B516 B654 B657 B659 B69B B6A4 B70E B738 B73D B958 B95C B99F B9A2 B9AC B9AF 89C5 8891 8C14 8C33 8C35 BC5F BDCC BDD9 DISK BASIC UNRAVELLED II LCOFO LC189 LC139 LC192 LC1F1 LC219 LC22C LC238 LC244 LC24E LC256 LC299 LC2BF LC2C1 LC2E6 LC310 LC324 LC33E LC352 LC357 LC35A LC366 LC37B LC3AD LC3B2 LC3C5 LC3C8 LC3CF LC405 LC421 LC429 LC42F LC43E LC481 LC48D LC4BB LC4C7 LC4E1 LC4E8 LC4F2 LC504 LC509 LC514 LC519 LC52D LC538 LC53C LC567 LC586 LC5A9 LC5BA LC5C4 LC5EC LC5F9 LC5FE LC602 LC611 COFO C199 C139 LC627 LC629 LC631 LC64D LC653 LC658 LC65E LC67D LC681 LC684 LC685 LC68C LC69B LC6A5 LC680 LC683 LC6C7 LC6D6 LC6D9 LC6E5 LC6FC LC70L LC71E LC739 LC744 LC749 LC755 LC763 LC76E LC779 LC784 LC786 LC796 LC79C LC79D LC7BF LC7C8 LC7E6 LC7E8 LC7EC LC7F8 LC7FD LC806 LC807 LC80D LC829 LC82E LC845 LC866 LC868 LC881 LC8AF LC8B2 LC8C2 LC8D1 LC8DA LC8F3 LC8FE DISK BASIC 1 1 SYMBOL TABLE C627 C629 C631 C64D C653 C658 C65E C67D APPENDIX D LC905 LC932 LC935 LC938 LC945 LC96A LC96E LC973 LC978 LC97D LC994 LC99B LC99D LC980 LC987 LC9BE LC9D LC9DF LCAQ4 LCAQ7 LCA12 LCA27 LCA33 LCA4F LCA5 LCA6C LCA7B LCA7E LCAA4 LCAAF LCAB6 LCABD LCABF
261. LD STRING VARIABLE TM ERROR IF NUMERIC VARIABLE SAVE STRING DESCRIPTOR ON STACK POINT X TO ADDRESS OF STRING COMPARE STRING ADDRESS TO START OF RANDOM FILE BUFFER SE ERROR IF lt RANDOM FILE BUFFER COMPARE STRING ADDRESS TO TOP OF RANDOM FILE BUFFER AREA BRANCH IF STRING IN RANDOM FILE BUFFER SET TO NON FIELDED STRING ERROR JUMP TO ERROR HANDLER SYNTAX CHECK FOR TOKEN EVALUATE DATA STRING EXPRESSION RETURN WITH X POINTING TO STRING ACCB LENGTH POINT Y TO FIELD STRING DESCRIPTOR GET LENGTH OF FIELD STRING RETURN IF NULL STRING SAVE LENGTH OF DATA STRING ON STACK PREPARE TO FILL DATA STRING WITH BLANKS POINT U TO FIELD STRING ADDRESS STORE A SPACE IN FIELDED STRING DECREMENT LENGTH COUNTER KEEP FILLING W SPACES IF NOT DONE GET THE LENGTH OF THE DATA STRING AND RETURN IF IT IS NULL ZERO LENGTH OF DATA STRING TO LENGTH OF FIELD STRING BRANCH IF FIELD STRING gt DATA STRING GET THE LENGTH OF THE FIELD STRING AND FORCE THE RSET LSET FLAG TO LSET 0 IF DATA STRING LENGTH IS gt THE FIELD STRING LENGTH THIS WILL CAUSE THE RIGHT SIDE OF THE DATA STRING TO BE TRUNCATED LOAD U WITH THE ADDRESS OF THE FIELD STRING GET THE RSET LSET FLAG FROM THE STACK AND BRANCH IF LSET SAVE THE NUMBER OF BYTES TO MOVE INTO THE FIELD STRING TAKE THE 2 S COMPLEMENT OF AN UNSIGNED NUMBER IN ACCB LEAVE THE DOUBLE BYTE SIGNED RESULT IN ACCD ADD THE LENGTH OF THE FIELD STRING
262. LD257 JSR LB9A2 SEND MESSAGE TO CONSOLE OUT 2508 D25A 86 D2 91 LDX 10291 POINT X TO DISKETTE AND MESSAGE 2509 D25D C6 1B LDB 27 27 BYTES IN MESSAGE 2510 D25F BD B9 A2 JSR LB9A2 SEND MESSAGE TO CONSOLE OUT 2511 0262 CC 64 05 LDD 456405 SET UP SOUND PARAMETERS 2512 D265 97 8C STA SNDTON FOR A BEEP 2513 D267 BD A9 51 JSR LA951 JUMP TO SOUND DO A BEEP 2514 D26A BD A1 71 LD26A JSR LA171 GET A CHARACTER FROM CONSOLE IN 2515 0260 81 00 KEEP LOOKING CONSOLE IN UNTIL 2516 D26F 26 F9 BNE LD26A YOU GET A CARRIAGE RETURN 2517 D271 39 LD271 RTS 2518 2519 0272 49 53 45 52 54 10272 FCC INSERT SOURCE 2520 0278 20 53 4F 55 52 43 2521 D27E 45 2522 D27F 49 46 53 45 52 54 LD27F FCC INSERT DESTINATION 2523 D285 20 44 45 53 54 49 2524 D28B 41 54 49 4F 4E 2525 D291 20 44 49 53 4B 45 LD291 FCC DISKETTE AND 2526 D297 54 54 45 20 41 4E 2527 D29D 44 2528 D29E QD FCB CR 2529 D29F 50 52 45 53 53 20 FCC PRESS ENTER 2530 D2A5 27 45 54 45 52 2531 D2AB 27 2532 2533 PUSH FILENAME EXT AND DRIVE NUMBER ONTO THE STACK 2534 D2AC 35 20 LD2AC PULS Y SAVE RETURN ADDRESS IN Y 2535 D2AE C6 B LDB 11 11 CHARACTERS IN FILENAME AND EXTENSION 2536 0280 8E 09 57 LDX DNAMBF 11 POINT X TO TOP OF DISK NAME EXT BUFFER 2537 D2B3 A6 82 LD2B3 LDA X GET A CHARACTER FROM FILENAME 2538 D2B5 34 02 PSHS A EXT BUFFER AND PUSH IT ONTO THE 2539 D2B7 5A DECB STACK DECREMENT COUNTER AND 2540 D2B8
263. LES COUNT ON THE STACK POINT X TO FCB GET FILE TYPE IS IT A RANDOM FILE BRANCH IF NOT GET START OF THIS FILE S RANDOM FILE BUFFER COMPARE TO END OF RANDOM FILE BUFFER AREA AND BRANCH IF END OF RANDOM FILE BUFFER AREA SUBTRACT RECORD LENGTH OF SELECTED FILE SAVE NEW START OF RANDOM FILE BUFFER GET THE FILES COUNTER DECREMENT FILES COUNTER BRANCH IF ALL FILES NOT DONE ABX INC FATCON X LCB2E JMP LCBC3 LCB31 4RANFIL BNE LCB2E CLOSE A RANDOM FILE LDD FCBRLN X LDX FCBBUF X LEAY D X PSHS Y X B A LEAY S LDU VARTAB LCB41 CMPU ARYTAB BEQ LC854 LDA 01 U LEAU 02 U BPL LCB4E BSR 1 76 LCBAE LEAU 05 U BRA LCB41 LCB52 PULS LCB54 CMPU ARYEND BEQ LC893 TFR U D ADDD 02 U PSHS B A LDA 01 U BPL LCB52 LDB 504 0 ASLB ADDB 05 CLRA LEAU D U LCB6B CMPU 5 BEQ LC852 BSR 1 76 LEAU 05 U BRA LCB6B BUFFER IS BEING DELETED CLOSED LCB76 LDX 02 0 RNBFAD BHS LCB8B CMPX 02 Y BLO LCB8B 04 Y BLO LCB8C TFR X D SUBD Y STD 02 U LCB8B RTS LCB8C CLR CLR 02 U CLR 03 RTS REMOVE ADJUST LCB93 LDB INCB LCB97 5 5 B JSR 16749 LDA RANFIL BNE LDD FCBBUF X CMPD 04 Y BLO LCBAD SUBD Y STD FCBBUF X LCBAD PULS B DECB BNE 1 97 PULS A B X U THIS WOULD CAUSES THE RANDOM FILE BUFFER AREA CMPU BLO LDX BRA
264. LREADY OPEN ERROR IF FILE OPEN SAVE FILE BUFFER POINTER MAKE SURE FILE ALLOC TABLE IS VALID SCAN DIRECTORY FOR FILENAME EXT GET MODE INPUT TYPE FILE SAVE FILE TYPE ON STACK INPUT MODE BRANCH IF NOT CHECK TO SEE IF DIRECTORY MATCH IS FOUND CHECK TO SEE IF FILE ALREADY OPEN GET RAM DIRECTORY BUFFER GET FILE TYPE AND ASCII FLAG SAVE IN RAM IMAGE INITIALIZE FILE BUFFER CONTROL BLOCK GO FILL DATA BUFFER POINT X TO PROPER FILE ALLOCATION TABLE ADD ONE TO FAT ACTIVE FILE COUNTER GET FILE BUFFER POINTER GET FILE TYPE SAVE IT IN FCB SET FILE TYPE TO OUTPUT FILE MODE OUTPUT BRANCH IF NOT DOES FILE EXIST ON DIRECTORY BRANCH IF NOT KILL THE OLD FILE GET DIRECTORY SECTOR NUMBER OF OLD FILE AND SAVE IT AS FIRST FREE DIRECTORY ENTRY GET RAM DIRECTORY IMAGE OF OLD FILE AND SAVE AS FIRST FREE DIRECTORY ENTRY SET UP NEW DIRECTORY ENTRY ON DISK INITIALIZE FILE BUFFER FLAG AND MAP FCB AS BEING USED FILE MODE R RANDOM BRANCH IF SO FILE MODE D DIRECT BAD FILE MODE ERROR IF NOT SET FILE TYPE TO DIRECT GET ADDRESS OF RANDOM FILE BUFFER AREA AND SAVE IT ON THE STACK ADD THE RECORD LENGTH OB ERROR IF SUM gt FFFF IS IT gt THAN FCB DATA AREA BRANCH IF NOT ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 0673 0674 0675 0676 0677 0678 0679 0680 0681 0682 0683 0684 0685 0686 0687 0688 0689 0690 0691 0692 0693 0694 0695
265. M IMAGE RAM HOOKS ROM IMAGE COPYRIGHT MESSAGES PRIMARY RESERVED WORD TABLE PRIMARY RESERVED WORD DISPATCH TABLE SECONDARY RESERVED WORD TABLE SECONDARY RESERVED WORD DISPATCH TABLE ERROR MESSAGES DISK FILE EXTENSION MESSAGES INSERT SOURCE DESTINATION MESSAGES DISK FORMATTING DATA TABLE DSKCON OPERATION CODE JUMP VECTORS DSKREG MASKS FOR DRIVE SELECT 61 DISK BASIC UNRAVELLED II APPENDIX H ORIGIN SPECTRAL ASSOC DISK ERROR ENTRY POINTS REVISED 12 26 1999 WALTER K ZYDHEK There are times when it is useful to cause an error message to be printed to the screen in the same manner that BASIC prints its error messages The following table is provided to give the user the DISK BASIC entry points which will cause error messages to be printed to the screen A JMP to one of these error message routines will cause the two letter short form error message to be printed on the screen and a pseudo warm start into BASIC will be taken The pseudo warm start will reset the stack the string stack and the continue pointer and jump to BASIC s direct mode OK DISK BASIC ERROR JUMPS 1 1 1 0 1 1 1 0 NAME NBR LABEL LABEL ADDR ADDR DESCRIPTION IO 20 10709 10616 0709 D616 INPUT OUTPUT IE 23 16352 LC334 C352 C334 INPUT PAST END OF FILE NE 26 LC6E5 LC6B8 C6E5 C6B8 FILE NOT FOUND BR 27 LC308 LC2ED C30B C2ED BAD RECORD DF 28 LC7F8 LC7C8 C7F8 C7C8 DISK FULL 08 29 LC504 LCADE C504 CADE OUT OF BUFFER SPACE FN 31 160978 LC8CA C978 C8CA BAD FILE
266. ME MORE FOR MOTOR TO COME UP TO SPEED WAIT UNTIL NOT BUSY OR TIME OUT BRANCH IF TIMED OUT DOOR OPEN NO DISK NO POWER ETC CLEAR STATUS REGISTER POINT TO COMMAND JUMP VECTORS GET COMMAND 2 BYTES PER COMMAND JUMP ADDRESS GO DO IT GET RETRY COUNT GET STATUS BRANCH IF NO ERRORS DECREMENT RETRIES COUNTER BRANCH IF NO RETRIES LEFT SAVE RETRY COUNT ON STACK RESTORE HEAD TO TRACK 0 BRANCH IF SEEK ERROR GO TRY COMMAND AGAIN IF NO ERROR 120 1 60 2 SECONDS 1 60 SECOND FOR EACH IRQ INTERRUPT WAIT 2 SECONDS BEFORE TURNING OFF MOTOR RESTORE REGISTERS EXIT DSKCON II POINT TO TRACK TABLE GET DRIVE NUMBER ZERO TRACK NUMBER RESTORE HEAD TO TRACK 0 UNLOAD THE HEAD AT START 30 MS STEPPING RATE WAIT FOR 1793 TO RESPOND TO COMMAND WAIT TILL DRIVE NOT BUSY WAIT SOME MORE 1793 STATUS KEEP ONLY SEEK ERROR SAVE IN DSKCON STATUS IF IT DOES NOT BECOME UNBUSY 1793 ERROR GET ZERO TO X REGISTER LONG WAIT DECREMENT LONG WAIT COUNTER 1F NOT READY BY NOW FORCE INTERRUPT GET 1793 STATUS AND TEST BUSY STATUS BIT BRANCH IF BUSY FORCE INTERRUPT COMMAND TERMINATE ANY COMMAND IN PROCESS DO NOT GENERATE A 1793 INTERRUPT REQUEST WAIT BEFORE READING 1793 ox RESET INTRQ FDC INTERRUPT REQUEST RETURN DRIVE NOT READY STATUS IF THE DRIVE DID NOT BECOME UNBUSY SAVE DSKCON STATUS BYTE DELAY FOR A WHILE DECREMENT DELAY COUNTER AND BRANCH IF NOT DONE 80 IS READ FLAG 1793 READ SECTOR
267. MPARE TO THE MAXIMUM TRACK NUMBER AND KEEP LOOPING IF THERE ARE STILL TRACKS TO DO GO CHECK FOR A DOS RESET CLEAR RAM IMAGE OF DSKREG CLEAR DSKREG TURN DISK MOTORS OFF PROCESS DRIVES NOT READY ERROR II BUILD A FORMATTED TRACK OF DATA IN RAM STARTING AT DFLBUF 10691 LDX DFLBUF LDD 204E BSR 106 2 CLRB LD69A PSHS B LDU DBUF1 LDB B U STB DSEC LDU 10604 LDB 4 03 BSR 106 8 LDA DCTRK STA X CLR Xt LDA DSEC STA X LDB 4 09 BSR 106 8 PULS B INCB CMPB SECMAX BLO LD69A LDD C84E WRITE ACCA BYTES OF ACCB INTO BUFFER LD6C2 STB X DECA BNE LD6C2 RTS B32 START TRACK BUFFER AT DFLBUF GET SET TO WRITE 32 BYTES OF 4E GO WRITE GAP IV RESET SECTOR COUNTER SAVE SECTOR COUNTER POINT U TO THE TABLE OF LOGICAL SECTORS GET LOGICAL SECTOR NUMBER FROM TABLE AND SAVE IT IN THE DSKCON VARIABLE POINT U TO TABLE OF SECTOR FORMATTING DATA GET FIRST 3 DATA BLOCKS AND WRITE THEM TO BUFFER GET TRACK NUMBER AND STORE 1T IN THE RAM BUFFER CLEAR A BYTE SIDE NUMBER IN BUFFER GET SECTOR NUMBER AND STORE IT IN THE BUFFER GET THE LAST NINE DATA BLOCKS AND WRITE THEM TO THE BUFFER GET SECTOR COUNTER NEXT SECTOR 18 SECTORS PER TRACK BRANCH IF ALL SECTORS NOT DONE WRITE 200 BYTES OF 4E AT END OF TRACK STORE A BYTE IN THE BUFFER DECREMENT COUNTER BRANCH IF ALL BYTES NOT MOVED ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED 3073 3074 3075
268. NARY FF ASCII 0465 0959 DRUNFL RMB RUN FLAG IF BIT 1 1 THEN RUN IF BIT 8 1 THEN CLOSE 0466 ALL FILES BEFORE RUNNING 0467 095A DEFDRV RMB DEFAULT DRIVE NUMBER 0468 095 FCBACT RMB NUMBER OF FCBS ACTIVE 0469 095 DRESFL RMB RESET FLAG lt gt WILL CAUSE A amp SHUT DOWN ALL FCBS 0470 0950 DLOADFL RMB LOAD FLAG CAUSE A NEW FOLLOWING A LOAD ERROR 0471 095 DMRGFL RMB MERGE FLAG N MERGE FF MERGE 0472 095 DUSRVC RMB 20 DISK BASIC USR COMMAND VECTORS 0473 XXX DISK FILE WORK AREA FOR DIRECTORY SEARCH 0474 EXISTING FILE 0475 0973 V973 MM8 SECTOR NUMBER 0476 0974 V974 RMB 2 RAM DIRECTORY IMAGE ADDRESS 0477 0976 976 FIRST GRANULE NUMBER 0478 UNUSED FILE 0479 0977 V977 RMB SECTOR NUMBER 0480 0978 V978 RMB 2 RAM DIRECTORY IMAGE ADDRESS 0481 0482 097 WFATVL RMB 2 WRITE FAT VALUE NUMBER OF FREE GRANULES WHICH MUST BE TAKEN 0483 FROM THE FAT TO TRIGGER A WRITE FAT TO DISK SEQUENCE 0484 097 DFFLEN RMB 2 DIRECT ACCESS FILE RECORD LENGTH 0485 097 DROTRK RMB 4 CURRENT TRACK NUMBER DRIVES 0 1 2 3 0486 0982 NMIFLG RMB 1 NMI FLAG Q DON T VECTOR lt gt YECTOR OUT 0487 90983 DNMIVC RMB 2 NMI VECTOR WHERE TO JUMP FOLLOWING AN NMI 0488 INTERRUPT IF THE NMI FLAG IS SET 0489 90985 RDYTMR RMB 1 MOTOR TURN OFF TIMER 0490 0986 DRGRAM RMB 1 RAM IMAGE OF DSKREG 9 4 0491 0987 DVERFL RMB 1 VERIFY FLAG 0FF FF ON 0492 0988 ATTCTR RMB 1 READ WRITE ATTEMPT COUNTER NUMBER OF TIMES THE 0493 z DISK WILL ATTEMPT
269. NMI SERVICE DNMISV LDA NMIFLG BEQ LD7BB LDX DNMISV STX 10 5 CLR NMIFLG LD7BB RTI IRQ SERVICE DIRQSV LDA PIAQ 3 BPL LD7BB LDA PIAG 2 LDA RDYTMR BEQ LD7DA DECA STA RDYTMR BNE LD7DA LDA DRGRAM ANDA B STA DRG RAM STA DSKREG LD7 DA JMP 18955 THIS IS THE END OF DISK BASIC THE CODE FROM THIS POINT TO DFFF IS GARBAGE DOSBAS 1 0 2083 WASTED BYTES DRQ MASK BIT DOES THE 1793 HAVE A BYTE DRQ SET IN STATUS BYTE YES GO READ A SECTOR DECREMENT WAIT TIMER KEEP WAITING FOR 1793 DRQ GENERATE DRIVE NOT READY ERROR GET DATA BYTE FROM 1793 DATA REGISTER PUT IT IN RAM REPROGRAM FDC CONTROL REGISTER KEEP GETTING DATA HERE ON COMPLETION OF SECTOR READ WRITE OPERATION CODE JUMP VECTORS MASKS FOR DISK DRIVE SELECT C34 ENABLE IRQ FIRO GET STATUS amp KEEP WRITE PROTECT RECORD TYPE WRITE FAULT RECORD NOT FOUND CRC ERROR OR LOST DATA SAVE IN DSKCON STATUS RESTORE HEAD TO TRACK ZERO NO OP RETURN READ SECTOR WRITE SECTOR DRIVE SEL 0 DRIVE SEL 1 DRIVE SEL 2 DRIVE SEL 3 GET NMI FLAG RETURN IF NOT ACTIVE GET NEW RETURN VECTOR STORE AT STACKED PC SLOT ON STACK RESET NMI FLAG 63 5 MICRO SECOND OR 60 HZ INTERRUPT RETURN IF 63 5 MICROSECOND RESET 60 HZ PIA INTERRUPT FLAG GET TIMER BRANCH IF NOT ACTIVE DECREMENT THE TIMER SAVE IT BRANCH IF NOT TIME TO TURN OFF DISK MOTORS GET DSKREG IMAGE TURN ALL MOTORS AND DRIVE SELECTS OFF PUT IT BACK IN RAM IMAGE SEND TO C
270. NORMALLY 1 CHANGES FF00 TO DATA DIRECTION 0579 SEL 1 LSB OF TWO ANALOG MUX SELECT LINES 0580 4 ALWAYS 1 0581 BIT5 ALWAYS 1 0582 BIT6 NOT USED 0583 BIT7 HORIZONTAL SYNC INTERRUPT FLAG 0584 0585 FF02 BIT KEYBOARD COLUMN 1 0586 KEYBOARD COLUMN 2 0587 2 KEYBOARD COLUMN 3 0588 BIT3 KEYBOARD COLUMN 4 0589 4 KEYBOARD COLUMN 5 0590 5 KEYBOARD COLUMN 6 0591 BIT6 KEYBOARD COLUMN 7 RAM SIZE OUTPUT A8 DISK BASIC UNRAVELLED II APPENDIX A ORIGIN SPECTRAL ASSOC MEMORY MAP REVISED 12 26 1999 WALTER K ZYDHEK 0592 BIT7 KEYBOARD COLUMN 8 0593 0594 FF03 BIT CONTROL OF VSYNC 16 667ms IRQ TO CPU DISABLED 9595 INTERRUPT 1 IRQ TO CPU ENABLED 0596 CONTROL INTERRUPT FLAG SET ON FALLING EDGE OF FS 0597 POLARITY 1 FLAG SET ON RISING EDGE OF FS 0598 BIT2 NORMALLY 1 CHANGES FF02 TO DATA DIRECTION 0599 BIT3 SEL 2 MSB OF TWO ANALOG MUX SELECT LINES 0600 BIT4 ALWAYS 1 0601 5 ALWAYS 1 0602 6 NOT USED 0603 BIT7 FIELD SYNC INTERRUPT FLAG 0604 0605 FFO4 RMB 28 PIA IMAGES 0606 20 DA 0607 FF20 PIAL EQU PERIPHERAL INTERFACE ADAPTER TWO 0608 0609 20 BITE CASSETTE DATA INPUT 0610 RS 232C DATA OUTPUT 0611 2 6 BIT D A LSB 0612 BIT3 6 BIT D A 0613 4 6 BIT D A 0614 5 6 BIT D A 0615 BIT6 6 BIT D A 0616 BIT7 6 BIT D A MSB 0617 0618 FF21 CONTROL OF CD FIRQ TO CPU DISABLED 0619 RS 232C STATUS 1 FIRQ
271. NTER IN SECTOR SAVE SECTOR OFFSET IN FCB SAVE BYTE OFFSET ON STACK POINT X TO FILE ALLOCATION TABLE MOVE X TO FAT DATA GET CURRENT GRANULE NUMBER POINT X TO PROPER GRANULE IN FAT GET CURRENT GRANULE AND CHECK TO SEE IF IT IS LAST GRANULE BRANCH IF THIS GRANULE IS LAST GRANULE MASK OFF LAST GRANULE FLAG BITS COMPARE LAST SECTOR USED IN GRANULE TO CALCULATED SECTOR BRANCH IF NOT EQUAL GET NUMBER OF BYTES IN LAST SECTOR MASK OFF PRESAVED FLAG BIT 15 SAVE NUMBER OF BYTES IN LAST SECTOR ON STACK LOAD ACCB WITH THE BYTE OFFSET TO CURRENT RECORD AND ADD THE REMAINING RECORD LENGTH TO IT ACCD END OF RECORD OFFSET THE END OF RECORD OFFSET TO THE NUMBER OF BYTES USED IN THE LAST SECTOR CHECK GET PUT FLAG AND BRANCH IF GET TO INPUT PAST END OF FILE ERROR II IF LAST USED SECTOR CALCULATE HOW MANY BYTES ARE USED IF DATA IS BEING PUT PASTH THE CURRENT END OF FILE LC405 LC4gA CMPD BLS LDD ORA STD PULS LEAX ABX LDU PSHS LDA ADDD BHS SECLEN LC405 SECLEN 80 FCBLST U B FCBCON U 02 S B 1 01 S LC421 B6 COMPARE TO ONE SECTOR S LENGTH BRANCH IF REMAINDER OF RECORD LENGTH WILL FIT IN THIS SECTOR FORCE NUMBER OF BYTES ONE SECTOR LENGTH SET PRE SAVED FLAG BIT ALL PUT RECORDS ARE WRITTEN TO DISK BEFORE LEAVING PUT SAVE NUMBER OF BYTES USED IN LAST SECTOR PULL BYTE OFFSET OFF OF THE STACK POINT X TO FCB DATA BUF
272. NTROL BYTES CHAR IN ACCA SAVE REGISTERS POINT U TO CORRECT CHARACTER GET DATA CHAR SKIP PAST 25 CONTROL BYTES AND SAVE DATA CHARACTER ON STACK RESET CHAR POINTER TO START OF BUFFER GET DRIVE NUMBER AND SAVE IT IN DSKCON VARIABLE GO READ A SECTOR FILL THE BUFFER RESTORE REGISTERS AND DATA CHARACTER RESTORE REGISTERS AND RETURN DATA BUFFER FOR SEQUENTIAL FILES LDX B X LDB RANFIL BNE LC5BF LDD FCBGET X CMPD FCBRLN X BHS LC501 ADDD 40001 STD LDX FCBBUF X LEAX D X LDA 1 X PULS B X PC GET A BYTE FROM A SEQUENTIAL FILE LC5BF LDB FCBCFL X BEQ LC5CC LDA FCBCDT X CLR FCBCFL X PULS B X PC LC5CC LDB FCBDFL X BEQ LC505 LC5D1 CINBFL PULS B X PC LC5D5 LDB FCBCPT X INC DEC FCBLFT X BEQ 1 5 4 ABX LDA FCBCON X PULS B X PC GET A CHARACTER FROM LC5E4 PSHS U Y CLRA LEAU D X LDA FCBCON U PSHS A CLR FCBCPT X LDA FCBDRV X STA DCDRV BSR 1 5 PULS A Y U PULS B X PC REFILL THE FCB INPUT LCBFA LDA FCBSEC X LCBFC INCA PSHS A CMPA 09 BLS LC684 CLRA LC604 STA FCBSEC X LDB FCBCGR X LEAU X JSR 16725 ABX LDB FATCON X LEAX U CMPB BHS LC620 PULS A SUBA 10 BNE LC631 STB FCBCGR X BRA LC5FC 10600 ANDB 3F CMPB 09 BLS LC62B LC626 LDB 2 32 JMP LAC46 LC62B SUBB 5 BLO LC650 TFR B A LC631 5 5 BSR 10658 LDA 4502 STA DCOPC JSR LC733 LEAU FCBCON X STU JSR LD5FF CLR FCBLFT X L
273. NUMBER OF BYTES IN LAST SECTOR DSKCON READ OP CODE GET RECORD LENGTH AND COMPARE IT TO SECLEN EXACTLY ONE SECTOR BRANCH IF NOT EXACTLY ONE SECTOR LONG CLEAN UP STACK POINT X TO START OF RANDOM FILE BUFFER CHECK GET PUT FLAG AND BRANCH IF GET DSKCON WRITE OP CODE READ WRITE A SECTOR READ A SECTOR INTO FCB DATA BUFFER GET BACK THE BYTE OFFSET TO RECORD X NUMBER OF SECTORS ACCB BYTE POINTER IN SECTOR SAVE SECTOR OFFSET IN FCB SAVE BYTE OFFSET ON STACK POINT X TO FILE ALLOCATION TABLE MOVE X TO FAT DATA GET CURRENT GRANULE NUMBER POINT X TO PROPER GRANULE IN FAT GET CURRENT GRANULE AND CHECK TO SEE IF IT IS LAST GRANULE BRANCH IF THIS GRANULE IS LAST GRANULE MASK OFF LAST GRANULE FLAG BITS COMPARE LAST SECTOR USED IN GRANULE TO CALCULATED SECTOR BRANCH IF NOT EQUAL GET NUMBER OF BYTES IN LAST SECTOR MASK OFF PRESAVED FLAG BIT 15 SAVE NUMBER OF BYTES IN LAST SECTOR ON STACK LOAD ACCB WITH THE BYTE OFFSET TO CURRENT RECORD AND ADD THE REMAINING RECORD LENGTH TO IT ACCD END OF RECORD OFFSET THE END OF RECORD OFFSET TO THE NUMBER OF BYTES USED IN THE LAST SECTOR CHECK GET PUT FLAG AND BRANCH IF GET TO INPUT PAST END OF FILE ERROR X II IF LAST USED SECTOR CALCULATE HOW MANY BYTES ARE USED PASTH THE CURRENT END OF FILE IF DATA IS BEING PUT ANDA 01 ORA 80 STD FCBLST U LC3E5 PULS B LEAX FCBCON U ABX LDU 02 5 PS
274. OKEN ERROR IF lt DISK BASIC COMMAND TOKEN PROCESS A USER COMMAND TOKEN DISK BASIC SECONDARY COMMAND INTERPRETATION HANDLER LC24E CMPB 4 A7 80 2 BLS LC256 JMP COMVEC 38 10256 SUBB 4 A2 80 2 PSHS B JSR 18262 PULS B LDX LC22C JMP 1 2 ERROR DRIVER RAM VECTOR DVEC17 PULS Y JSR LAD33 JSR 10202 PSHS Y B JSR DVEC7 PULS B CMPB 42 27 1 5 XVECI7 LEAS 02 S JSR 1 7 9 JSR 14974 CLR DEVNUM JSR LB95C JSR LB9AF LDX LC290 2X27 JMP L C60 DISK BASIC ERROR MESSAGES LC290 BR FCC DF FCC FCC WP FCC FN FCC FS FCC AE FCC FO SE VF FCC ER DISK FILE EXTENSIONS BASEXT FCC BAS DEFEXT FCC o DATEXT FCC BINEXT FCC BIN B4 COMPARE MODIFIED SECONDARY TOKEN TO HIGHEST DISK BASIC TOKEN amp BRANCH IF HIGHER JUMP TO USER SECONDARY COMMAND HANDLER SUBTRACT OUT THE SMALLEST SECONDARY DISK TOKEN amp SAVE MODIFIED TOKEN ON THE STACK SYNTAX CHECK FOR AND EVALUATE EXPRESSION RESTORE MODIFIED TOKEN POINT X TO SECONDARY COMMAND JUMP TABLE JUMP TO BASIC S SECONDARY COMMAND HANDLER PUT THE RETURN ADDRESS INTO Y RESET THE CONT FLAG ETC INITIALIZE SOME DISK VARIABLES AND CLOSE FILES PUT RETURN ADDRESS AND ERROR NUMBER ON THE STACK CLOSE ALL FILES GET THE ERROR NUMBER BACK COMPARE TO THE LOWEST DISK ERROR NUMBER BRANCH TO EXBAS ERROR HANDLER IF NOT DISK ERROR NUMBER PURGE RETURN ADDRE
275. OM FILE WHOSE FCB WILL BE ONE ABOVE THE HIGHEST RESERVED FCB THE SYSTEM FCB POINT X TO THE SYSTEM FCB SET THE NUMBER OF BYTES IN THE LAST SECTOR OF THE FILE EQUAL TO ONE SECTOR LENGTH GET THE NUMBER OF SECTORS TO MOVE AND BRANCH IF NONE LEFT GRAB THE GET PUT FLAG AND IT WITH THE GRAN TEST FLAG BRANCH IF GET ING DATA OR THIS IS NOT THE FIRST TIME THROUGH THE LOOP GET THE NUMBER OF SECTORS REMAINING TO BE COPIED AND ADD THE NUMBER TO BE COPIED THIS TIME THROUGH LOOP PUT THE LAST RECORD IN THE FILE TO THE SYSTEM FCB THE RECORD NUMBER IS IN ACCD POINT X TO THE SYSTEM FCB GET THE CURRENT RECORD NUMBER AND SAVE IT IN THE FCB GET THE NUMBER OF THE RECORD SECTOR TO MOVE END OF ARRAYS IS THE START OF THE COPY FREE RAM BUFFER SAVE SECTOR COUNTER AND BUFFER POINTER ON THE STACK POINT X TO SYSTEM FCB SET THE RANDOM FILE BUFFER POINTER TO THE COPY RAM BUFFER THIS WILL CAUSE THE SYSTEM TO HANG IF AN ERROR OCCURS DURING COPY GO GET OR PUT DATA TO THE SYSTEM FCB ADD 256 ONE SECTOR TO THE BUFFER POINTER GET THE SECTOR COUNTER AND BUFFER POINER DECREMENT SECTOR COUNTER BRANCH IF ALL SECTORS NOT DONE POINT X TO SYSTEM FCB RESET THE RANDOM FILE BUFFER POINTER FOR THE SYSTEM FCB TO THE BOTTOM OF RANDOM FILE BUFFER AREA GRAB THE GET PUT FLAG AND IT WITH THE GRAN TEST FLAG CLOSE THE FILE IF GET ING DATA AND THIS IS NOT THE FIRST TIME THROUGH THE LOOP RESET THE GRAN TEST F
276. ON NEXT INSTRUCTION SHOULD JUST CHECK FOR MAXIMUM SECTOR NUMBER SECMAX FC ERROR IF SECTOR NUMBER TOO BIG GET TRACK AND DRIVE NUMBER OFF OF THE STACK AND SAVE IN DSKCON VARIABLES JUMP TO FC ERROR SYNTAX CHECK FOR COMMA POINT X TO EVALUATE EXPRESSION ROUTINE ADDRESS GET THE DSKCON DRIVE TRACK AND SECTOR VALUES AND SAVE THEM ON THE STACK GO EVALUATE AN EXPRESSION OR A VARIABLE GET THE DRIVE TRACK AND SECTOR NUMBERS OFF OF THE STACK AND PUT THEM BACK INTO THE DSKCON VARIABLES GET THE DRIVE TRACK AND SECTOR NUMBERS GET THE DESCRIPTOR OF STRING 1 TM ERROR IF NUMERIC EXPRESSION GET STRING 1 DESCRIPTOR ADDRESS AND SAVE IT ON THE STACK GET THE DESCRIPTOR OF STRING 2 GET LENGTH AND ADDRESS OF STRING 2 AND SAVE THEM ON THE STACK SET CLEAR COUNTER TO 256 FULL SECTOR BUFFER USE DBUF AS THE DSKO I O BUFFER CLEAR A BYTE IN 1 0 BUFFER DECREMENT CLEAR COUNTER BRANCH IF ALL 256 BYTES NOT CLEARED GET THE LENGTH AND ADDRESS OF STRING 2 POINT X TO STRING 2 DESTINATION MOVE STRING 2 DATA INTO DBUF POINT X TO STRING 1 DESCRIPTOR GET THE LENGTH AND ADDRESS OF STRING 1 POINT U TO STRING 1 DESTINATION MOVE STRING 1 DATA INTO DBUF DSKCON WRITE OP CODE POINT X TO 1 0 BUFFER DBUF SAVE NEW DSKCON BUFFER POINTER AND OP CODE VARIABLES GO WRITE OUT A SECTOR BRANCH TO DN ERROR IF NO DRIVE NUMBER SPECIFIED CALCULATE DRIVE NUMBER SKIP FACTOR DEFAULT VALUE GET CURRENT INPUT
277. ONTROL REGISTER MOTORS OFF JUMP TO EXTENDED BASIC S IRQ HANDLER ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II ALLCOL ANGLE ARYDIS ARYEND ARYTAB ATTCTR BACKUP BAKCOL BASEXT BAWMST BEGGRP BINEXT BINVAL BLKCNT BLKLEN BLKTYP BOTSTK BROMHK CASBUF CASFLG CBTPHA CBUFAD CCKSUM CFNBUF CHARAC CHARAD CHGFLG CINBFL CINCTR CINPTR CLSTSN CMP CMP1 CMPMID COEFCT COEFPT COMVEC COPY CPERTM CPULWD CSRERR CSSVAL CURLIN CURPOS CVN DA DASCFL DATEXT DATPTR DATTMP DATTXT DBUF DBUF1 DCBPT DCDRV DCNVEC DCOPC DCSTA 0085 DCTRK DEBVAL DEFDRV DEFEXT DEVCFW DEVLCF DEVNUM DEVPOS DEVWID DEXTBF DFFLEN DFLBUF DFLTYP DIMFLG DIR DIRQSV DKWMST DLBAUD DLODFL DMRGFL DNAMBF DNMISV DNMIVC DOS DOSBAS DOSBUF DOSCOM DOSINI DOSVEC DOTVAL DROTRK DRESFL DRGRAM DRIVE DRUNFL DSEC DSINIT DSKCON DSKI DSKINI DSKO DSKREG DSKVAR DUSRVC DVEC DVEC1 DVEC19g DVEC11 DVEC12 DVEC13 DVEC14 DVEC15 DVEC17 DVEC18 DVEC2 DVEC7 DVEC8 DVERFL DISK BASIC 1 1 SYMBOL TABLE OBEC 0118 995A C2A9 906A 006 006 006 0060 0954 097 0989 0957 0005 9 D8AF 7 00 6 0950 095 APPENDIX D DVEC29 DVEC22 DVEC3 DVEC4 DVEC5 DVEC6 DXCVEC DXIVEC ENDCHR ENDFLG ENDGRP EVALEXPB EXECJP EXPJMP FATBL FATBL1 FATBL2 FATBL3 FCBACT FCBADR FCBTMP FCBV1 FDCREG FIELD FILES FILSTA FIRQ FORCOL FP SGN FPIEXP FP1SGN
278. OP CODE STORE TRACK NUMBER GO READ DIRECTORY GET NUMBER OF BYTES IN THE LAST SECTOR MASK OFF THE PRE SAVED FLAG SAVE NUMBER OF BYTES IN LAST SECTOR OF FILE IN DIRECTORY WRITE OP CODE SAVE DSKCON OP CODE VARIABLE GO READ WRITE SECTOR CHECK DEVICE NUMBER BRANCH TO EX BASIC IF NOT A DISK FILE POP RETURN OFF STACK SEND A CHARACTER IN ACCA TO A DISK FILE A CARRIAGE RETURN WILL RESET THE PRINT POSITION AND CONTROL CODES WILL NOT INCREMENT THE PRINT POSITION LCC24 PSHS X B A LDX FCBV1 2 LDB ASLB LDX B X LDB CMPB INPFIL BEQ LCC6A CMPA CR BNE LCC3A CLR FCBPOS X LCC3A 5 BLO LCC40 INC FCBPOS X LCC4 RANFIL BNE LCC5E PUT A BYTE INTO A RANDOM FILE LDD FCBPUT X ADDD 0001 CMPD FCBRLN X LBHI LCDCB STD FCBPUT X LDX FCBBUF X LEAX D X PULS A STA 1 X PULS B X PC WRITE A BYTE TO SEQUENTIAL OUTPUT FILE LCC5E INC FCBLFT X LDB BEQ LCC6C ABX STA FCBCON 1 X LCC6A PULS A B X PC WRITE OUT A FULL BUFFER AND RESET BUFFER LCC6C PSHS U Y STA SECLEN FCBCON 1 X LDB FCBDRV X STB DCDRV INC 5 JSR LEAY X B18 SAVE REGISTERS POINT X TO TABLE OF FILE NUMBER VECTORS GET CURRENT FILE NUMBER 2 BYTES PER FCB ADDRESS POINT X TO PROPER FCB GET FILE TYPE IS IT AN INPUT FILE RETURN IF SO CARRIAGE RETURN ENTER NO CLEAR PRINT POSITION IF CARRIAGE RETURN BRANCH IF CONTROL CHAR INCREMENT PRINT
279. OR GET ZERO TO X REGISTER LONG WAIT DECREMENT LONG WAIT COUNTER 1F NOT READY BY NOW FORCE INTERRUPT GET 1793 STATUS AND TEST BUSY STATUS BIT BRANCH IF BUSY FORCE INTERRUPT COMMAND TERMINATE ANY COMMAND IN PROCESS DO NOT GENERATE A 1793 INTERRUPT REQUEST WAIT BEFORE READING 1793 RESET INTRQ FDC INTERRUPT REQUEST RETURN DRIVE NOT READY STATUS IF THE DRIVE DID NOT BECOME UNBUSY SAVE DSKCON STATUS BYTE DELAY FOR A WHILE DECREMENT DELAY COUNTER AND BRANCH IF NOT DONE 80 IS READ FLAG 1793 READ SECTOR SKIP TWO BYTES A IS WRITE FLAG 1793 WRITE SECTOR SAVE READ WRITE FLAG ON STACK POINT X TO TRACK NUMBER TABLE IN RAM GET DRIVE NUMBER POINT X TO CORRECT DRIVE S TRACK BYTE GET TRACK NUMBER OF CURRENT HEAD POSITION SEND TO 1793 TRACK REGISTER COMPARE TO DESIRED TRACK BRANCH IF ON CORRECT TRACK GET TRACK DESIRED SEND TO 1793 DATA REGiSTER SAVE IN RAM TRACK IMAGE SEEK COMMAND FOR 1793 DO NOT LOAD THE HEAD AT START VERIFY DESTINATION TRACK 30 MS STEPPING RATE WAIT FOR VALID STATUS FROM 1793 WAIT TILL NOT BUSY RETURN IF TIMED OUT WAIT SOME MORE KEEP ONLY SEEK ERROR OR CRC ERROR IN ID FIELD BRANCH IF NO ERRORS HEAD ON CORRECT TRACK SAVE IN DSKCON STATUS GET SECTOR NUMBER DESIRED SEND TO 1793 SECTOR REGISTER POINT X TO ROUTINE TO BE VECTORED TO BY NMI UPON COMPLETION OF DISK 1 0 AND SAVE VECTOR POINT X TO 1 0 BUFFER RESET INTRQ FDC INTERRUPT REQUEST GE
280. OR FLAG IS USED TO INDICATE THAT ANOTHER SECTOR MUST BE ADDED TO THE LENGTH OF FILE FOLLOWING ERROR PROCESSING GET NEXT FREE GRANULE CLEAR SECTOR NUMBER AND ERROR FLAG DISK WAS NOT FULL SAVE NEW GRANULE IN FCB SKIP TWO BYTES STORE IN MAP POINT X TO FCB INCREMENT RECORD NUMBER UPDATE FILE ALLOCATION TABLE RESTORE REGISTERS RESTORE REGISTERS AND RETURN SCAN DRIVE NUMBER FROM INPUT LINE GET FAT FOR THIS DRIVE PRINT CARRIAGE RETURN TO CONSOLE OUT GET TRACK 17 AND READ OP CODE AND SAVE IN DSKCON VARIABLES START WITH SECTOR 3 FIRST DIRECTORY SECTOR SAVE SECTOR NUMBER IN DSKCON VARIABLE USE I 0 BUFFER 0 FOR DATA TRANSFER SAVE IN DSKCON VARIABLE READ A SECTOR SAVE TOP OF STACK GO DO A BREAK CHECK RESTORE STACK TEST FILE NAME FIRST BYTE BRANCH IF KILLED FF END OF DIRECTORY RETURN IF END OF DIRECTORY SAVE DIRECTORY POINTER ON STACK NUMBER CHARACTERS TO PRINT SEND FILENAME TO CONSOLE OUT SEND BLANK TO CONSOLE OUT NUMBER CHARACTERS TO PRINT SEND EXTENSION TO CONSOLE OUT SEND BLANK TO CONSOLE OUT GET FILE TYPE CHECK THE NUMBER OF DECIMAL DIGITS IN ACCB IF THERE IS ONLY ONE DIGIT SEND BLANK TO CONSOLE OUT CLEAR MS BYTE OF ACCO PRINT ACCD IN DECIMAL TO CONSOLE OUT SEND BLANK TO CONSOLE OUT X NOW POINTS TO DIRECTORY ENTRY ASCII BIAS ADD TO ASCII FLAG PRINT CHARACTER AND BLANK TO CONSOLE OUT GET FIRST GRANULE IN FILE COUNT GRANULES SAVE COUNT IN ACCB CLEAR MS BYTE OF ACC
281. OUTPUT WRITE PRINT GET AND PUT COMMANDS TRANSFER DATA THROUGH THE FCB AND THE CLOSE COMMAND TURNS OFF THE FCB X X X XX TABLES OF OFFSETS TO FCB CONTROL BYTES RANDOM FILE DESCRIPTION FCBTYP EQU 0 FILE TYPE 40 RANDOM DIRECT Q CLOSED FCBDRV EQU 1 DRIVE NUMBER FCBFGR EQU 2 FIRST GRANULE IN FILE FCBCGR EQU 3 CURRENT GRANULE BEING USED FCBSEC EQU 4 CURRENT SECTOR BEING USED 1 9 5 UNUSED FCBPOS EQU 6 CURRENT PRINT POSITION ALWAYS ZERO IN RANDOM FILES FCBREC EQU 7 CURRENT RECORD NUMBER FCBRLN EQU 9 RANDOM FILE RECORD LENGTH FCBBUF EQU 11 POINTER TO START OF THIS FILE S RANDOM ACCESS BUFFER FCBSOF EQU 13 SECTOR OFFSET TO CURRENT POSITION IN RECORD FCBFLG EQU 15 GET PUT FLAG Q PUT 1 PUT 16 17 NOT USED FCBDIR EQU 18 DIRECTORY ENTRY NUMBER 0 71 FCBLST EQU 19 NUMBER OF BYTES IN LAST SECTOR OF FILE FCBGET EQU 21 GET RECORD COUNTER HOW MANY CHARACTERS HAVE BEEN PULLED OUT OF THE CURRENT RECORD FCBPUT EQU 23 PUT RECORD COUNTER POINTER TO WHERE IN THE RECORD THE NEXT BYTE WILL BE PUT FCBCON EQU 25 OFFSET TO START OF FCB DATA BUFFER 256 BYTES SEQUENTIAL FILE BYTE DESCRIPTION FCBTYP EQU 0 FILE TYPE 10 INPUT 2 OUTPUT CLOSED FCBDRV EQU 1 DRIVE NUMBER FCBFGR EQU 2 FIRST GRANULE IN FILE FCBCGR EQU 3 CURRENT GRANULE BEING USED FCBSEC EQU 4 CURRENT SECTOR BEING USED 1 9 FCBCPT EQU 5 INPUT FILE CHARACTER POINTER POINTS TO NEXT CHARACTER IN FILE
282. P CONSOLE IN RAM VECTOR DVEC4 LDA DEVNUM LBLE XVEC4 LEAS 02 S LC5C4 PSHS X B CLR CINBFL LDX FCBV1 2 LDB ASLB LDX B X LDB FCBTYPE X CMPB RANFIL BNE LC5EC LDD CMPD FCBRLN X BHS LC5FE ADDD 0001 STD FCBGET X LDX FCBBUF X LEAX D X 1 X PULS B X PC GET A BYTE FROM A SEQUENTIAL FILE LCBEC LDB FCBCFL X BEQ LC5F9 LDA FCBCDT X CLR FCBCFL X PULS B X PC LC5F9 LDB FCBDFL X BEQ 16602 COM CINBFL PULS B X PC 10600 LDB FCBCPT X INC FCBCPT X DEC FCBLFT X BEQ LC611 ABX LDA FCBCON X PULS B X PC GET A CHARACTER FROM LC611 5M5 U Y CLRA LEAU D X LDA FCBCON U PSHS A CLR FCBCPT X LDA FCBDRV X STA DCDRV BSR LC627 PULS A Y U PULS B X PC REFILL THE FCB INPUT LC627 10 FCBSEC X LC629 INCA PSHS A CMPA 09 BLS LC631 CLRA LC631 STA FCBSEC X LDB FCBCGR X LEAU X JSR LC755 ABX LDB FATCON X LEAX U CMPB BHS LC64D PULS A SUBA 10 BNE LC65E STB FCBCGR X BRA LC629 LC64D _ 3F CMPB 09 BLS LC658 LC653 LDB 2X32 JMP LAC46 B9 GET CURRENT SECTOR NUMBER ADD ONE SAVE NEW SECTOR NUMBER ON THE STACK NINE SECTORS PER GRANULE BRANCH IF 9 SET TO SECTOR ZERO SAVE SECTOR NUMBER GET GRANULE NUMBET TO FAT POINTER POINT U TO FCB TFR X U POINT X TO PROPER FILE ALLOCATION TABLE ADD OLD GRANULE NUMBER TO FAT POINTER GET GRANULE NUMBER 6 CONTROL BYTES AT FRONT OF FAT POINT X TO FCB IS CURRENT GRANULE LAST ONE IN FILE YES GET S
283. PORARY DESCRIPTOR STORAGE STACK SEARCH MANTISSA ONLY FLOATING POINT ACCUMULATOR 2 MANTISSA BOTTOM OF STACK AT LAST CHECK PV BEGINNING OF BASIC PROGRAM PV START OF VARIABLES PV START OF ARRAYS PV END OF ARRAYS 1 PV START OF STRING STORAGE TOP OF FREE RAM PV START OF STRING VARIABLES UTILITY STRING POINTER PV TOP OF STRING SPACE SAVED LINE NUMBER DURING A STOP BINARY VALUE OF A CONVERTED LINE NUMBER SAVED INPUT PTR DURING A STOP TEMPORARY INPUT POINTER STORAGE PV DATA STATEMENT LINE NUMBER POINTER PV DATA STATEMENT ADDRESS POINTER DATA POINTER FOR INPUT amp READ TV TEMP STORAGE FOR A VARIABLE NAME TV POINTER TO A VARIABLE DESCRIPTOR TEMP POINTER TO A VARIABLE DESCRIPTOR POINTER TO RELATIONAL OPERATOR PROCESSING ROUTINE TEMPORARY RELATIONAL OPERATOR FLAG BYTE FLOATING POINT ACCUMULATORS 23 4 amp 5 ARE MOSTLY USED AS SCRATCH PAD VARIABLES FLOATING POINT ACCUMULATOR 3 FLOATING POINT ACCUMULATOR 4 40 41 42 43 44 45 46 47 48 2 FLOATING POINT ACCUMULATOR 5 PACKED 940 544 PACKED 45 49 PACKED 4A 4E A2 DISK BASIC UNRAVELLED II 004A 004 0040 004 0050 0054 0055 0056 005 005 0050 006
284. POSITION IS IT RANDOM FILE BRANCH IF NOT RANDOM GET PUT BYTE COUNTER ADD ONE COMPARE TO RECORD LENGTH FR ERROR IF PUT BYTE COUNTER RECORD LENGTH SAVE NEW PUT BYTE COUNTER POINT TO RANDOM FILE BUFFER POINTER POINT TO ONE PAST END OF CURRENT RECORD DATA PULL DATA FROM STACK STORE IN DATA BUFFER RESTORE REGISTERS AND RETURN INCREMENT CHARACTER COUNT GET CHARACTER COUNT AND BRANCH IF THE BUFFER IS FULL ADD CHARACTER COUNT TO FCB ADDRESS STORE NEW CHARACTER SKIP PAST 25 CONTROL BYTES AT FCB START SAVE REGISTERS STORE LAST CHARACTER IN BUFFER GET DRIVE NUMBER AND SAVE IT IN DSKCON CONTROL TABLE INCREMENT SECTOR NUMBER WRITE THE FILE BUFFER TO DISK SAVE FCB POINTER IN Y DISK BASIC UNRAVELLED 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 CC7D CC7F CC82 CC83 CC85 CC87 CC89 CC8B CC8D CC8F CC92 CC94 CC96 CC98 CC99 CC9B CC9D CC9F CCA2 CCAS CCA7 CCA9 CCAC CCAF CCB2
285. R DVEC7 CLOSE ALL FILES CLR 5 CLEAR A TRACK COUNTER ON STACK LDX DFLBUF 1 POINT X TO TOP OF DISK RAM VARIABLES LD19F INC 5 INCREMENT TRACK COUNTER LEAX SECMAX SECLEN X INCREMENT X BY ONE TRACK CMPX MEMSIZ COMPARE TO TOP OF NON RESERVED RAN BLS LD19F KEEP GOING IF MORE FREE RAM LEFT DEC S DECREMENT TRACK COUNTER LBEQ LAC44 OM ERROR IF 1 TRACK OF FREE RAM LDA TRKMAX GET MAXIMUM NUMBER OF TRACKS INITIALIZE REMAINING TRACKS CTR CLRB INITIALIZE TRACKS WRITTEN COUNTER TO ZERO PSHS B A SAVE TRACKS WRITTEN AND REMAINING COUNTERS ON STACK AT THIS POINT THE STACK HAS THE FOLLOWING DATA ON IT S TRACKS REMAINING COUNTER 1 5 TRACKS WRITTEN COUNTER 2 S NUMBER OF TRACKS WHICH FIT IN RAM 3 S DESTINATION DRIVE NUMBER 4 S SOURCE DRIVE NUMBER COM DRESFL SET THE DISK RESET FLAG TO CAUSE A RESET LD1B7 CLRB INITIALIZE WRITE TRACK COUNTER TO ZERO LD1B8 INCB ADD ONE TO WRITE TRACK COUNTER DEC 5 DECREMENT REMAINING TRACKS COUNTER BEQ AND BRANCH IF NO TRACKS LEFT 02 S COMPARE WRITE TRACK COUNTER TO NUMBER OF TRACKS THAT BNE LD1B8 WILL FIT IN RAM AND BRANCH IF ROOM FOR MORE TRACKS IN RAM LD1Cl STB 10 SAVE THE NUMBER OF TRACKS TO BE TRANSFERRED LDB 04 5 GET SOURCE DRIVE NUMBER BSR LD2 F FILL RAM BUFFER WITH TMPLOC TRACKS OF DATA LDA FF SET SOURCE DESTINATION FLAG TO DESTINATION JSR 10235 PRINT PROMPT MESSAGE IF NEEDED LDB 03 5 GET DESTINATION DRIVE NUMBER BSR 10212 WRITE TMPLOC TRACKS FROM BUFFER
286. R FROM THE CURRENT GRANULE NUMBER 1075 C7B2 2A 94 BPL LC7B8 BRANCH IF LOWER BOUND NOT EXCEEDED 1076 7 4 E4 LDB 5 RESTORE CURRENT GRANULE NUMBER IF LOWER BOUND EXCEEDED 1077 C7B6 63 61 LC7B6 COM 01 5 COMPLEMENT FLAG IF GRANULE NUMBER HAS EXCEEDED 1078 BOUNDS ON EITHER THE HI OR LO SIDE FORCE IT TO GO IN 1079 THE DIRECTION OPPOSITE THE EXCEEDED BOUND 1080 7 8 32 61 LC7B8 LEAS 01 S CLEAN UP STACK 1081 C7BA 20 DC BRA LC798 CHECK FOR ANOTHER FREE GRANULE 1082 1083 7 EB LC7BC ADDB 5 ADD THE GRANULE COUNTER TO THE CURRENT GRANULE NUMBER 1084 C7BE C1 44 CMPB GRANMX GRANMX GRANULES PER DISK 1085 C7C0 25 F6 BLO LC7B8 BRANCH IF UPPER BOUND NOT EXCEEDED 1086 C7C2 E4 LDB 5 RESTORE CURRENT GRANULE COUNT AND GO TWICE 1087 C7C4 C 04 SUBB 04 AS FAR AS USUAL IN OPPOSITE DIRECTION IF UPPER BOUND EXCEEDED 1088 7 6 20 EE BRA LC7B6 KEEP SEARCHING 1089 C7C8 C6 38 LC7C8 LDB 2 28 DISK FULL ERROR 1090 7 7E AC 46 JMP 1 46 JUMP TO ERROR HANDLER 1091 1092 POINT X TO FIRST FREE GRANULE POSITION IN THE FILE ALLOCATION 1093 TABLE AND MARK THE POSITION WITH A LAST GRANULE IN FILE MARKER 1094 C7CD 32 61 LC7CD LEAS 01 S CLEAR UP STACK REMOVE DIRECTION FLAG 1095 C7CF 98 TFR GRANULE NUMBER TO 1096 701 POINT X TO FIRST FOUND GRANULE 1097 C7D2 C6 CB LDB LAST GRANULE FLAG 1098 704 E7 84 STR MARK THE FIRST FOUND GRANULE AS THE LAST GRANULE 1099 706 3
287. R K ZYDHEK DISK BASIC UNRAVELLED II 0769 0770 0771 0772 0773 0774 0775 0776 0777 0778 0779 0780 0781 0782 0783 0784 0785 0786 0787 0788 0789 0790 0791 0792 0793 0794 0795 0796 0797 0798 0799 0800 0801 0802 0803 0804 0805 0806 0807 0808 0809 0810 0811 0812 0813 0814 0815 0816 0817 0818 0819 0820 0821 0822 0823 0824 0825 0826 0827 0828 0829 0830 0831 0832 0833 0834 0835 0836 0837 0838 0839 0840 0841 0842 0843 0844 0845 0846 0847 0848 0849 0850 0851 0852 0853 0854 0855 0856 0857 0858 0859 0860 0861 0862 0863 0864 C5A1 C5A3 C5A5 C5A7 C5A9 C5AC C5AF C5B1 5 4 C5B7 C5B9 C5BB C5BD C5BF C5C2 C5C4 C5C7 C5CA C5CC C5CF C5D1 C5D3 C5D5 C5D7 C5D9 C5DC C5DE C5DF C5E2 C564 C5E6 5 7 C5E9 C5EC C5EE C5F0 C5F2 C5F4 C5F6 C5F8 C5FA C5FC C5FD C5FF C691 C693 C604 C606 C608 C60A C60D C60E C610 C612 C614 C616 C618 C61A C61C C61E C620 C622 C624 C626 C628 C62B C62D C62F C631 C633 C635 C637 C639 C63C C63F C641 C644 C647 C649 C64B C64E C658 C651 C654 C657 C658 C65A C65C AE E6 C1 26 EC 18 24 C3 ED AE 30 6 35 E6 27 A6 6F 35 E6 27 03 35 E6 6 6A 27 3A A6 35 34 4F 33 A6 34 6F A6 97 8D 35 35 A6 4C 34 81 23 4F 7 6 33 3A 6 30 cl 24 35 80 26 E7 20 04 23 C6 7E 25 16 34 80 86 97 BD 33 DF BD 6F
288. R TYPE CHECK EVALUATE NUMERIC EXPRESSION AND RETURN VALUE IN ACCB ONLY 4 LEGAL DRIVES DEVICE NUMBER ERROR IF DRIVE NUMBER IS gt 3 SAVE IN DRIVE NUMBER GET FILE ALLOCATION TABLE AND STORE IN BUFFER POINT X TO START OF FILE ALLOCATION TABLE BUFFER MOVE TO FIRST GRANULE DATA BYTE SPACE FOR FREE GRANULE COUNTER GET MAXIMUM NUMBER OF GRANULES GET GRANULE DATA FREE GRANULES FF BRANCH IF NOT FREE INCREMENT FREE GRANULE COUNTER DECREMENT GRANULE COUNTER BRANCH IF NOT DONE GET FREE GRANULE COUNTER TO ACCB LOAD ACCB INTO EVALUATE EXPR RETURN VALUE IN ACCB MAX DRIVE NUMBER 3 DEVICE ERROR IF DRIVE NUMBER gt 3 SAVE DEFAULT DRIVE NUMBER CHECK STACKED PRECEDENCE FLAG AND IF IT IS NOT AN END OF OPERATION BRANCH TO EXTENDED BASIC S EXPRESSION EVALUATION ROUTINE CHECK TWO RETURN ADDRESSES BACK ON THE STACK TO SEE IF THE CALL TO EVALUATE EXPRESSION IS COMING FROM THE LET COMMAND BRANCH OUT IF NOT COMING FROM LET IF COMING FROM LET REPLACE THE RETURN ADDR WITH THE DISK BASIC LET MODIFIER ADDRESS EXTENDED BASIC EXPRESSION EVALUATION PULL VARIABLE TYPE OFF OF THE STACK SET CARRY IF SIRING CLEAR CARRY IF NUMERIC DO A TM CHECK IF NUMERIC VARIABLE PACK FPA INTO VARDES POINT X TO STRING DESCRIPTOR GET ADDRESS OF SIRING COMPARE TO START OF RANDOM FILE BUFFERS AND BRANCH IF LOWER SUBTRACT OUT THE END OF RANDOM FILE BUFFERS BRANCH IF STRING STORED IN RANDOM FILE BU
289. RDER REGISTER BLUE LS GREEN L RED LSB BLUE MS GREEN M RED MSB RESERVED B SB B SB ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK VERTICAL SCROLL REGISTER VERTICAL OFFSET 1 REGISTER VERTICAL OFFSET REGISTER IN COCO MODE Y9 Y15 ARE NOT EFFECTIVE AND ARE CONTROLLED BY SAM BITS 6 ALSO IN COCO MODE Y16 Y18 SHOULD BE 1 ALL OTHERS 0 H OFSETO BITE RMB X 1 HORIZONTAL OFFSET REGISTER HORIZONTAL OFFSET ADDRESS A13 DISK BASIC UNRAVELLED II 0962 0976 FFAG FFCO FFC2 FFC3 FFC4 2 BIT3 4 5 BIT6 BIT7 XVEN APPENDIX A MEMORY MAP HORIZONTAL HORIZONTAL HORIZONTAL HORIZONTAL HORIZONTAL HORIZONTAL HORIZONTAL OFFSET ADDRESS OFFSET ADDRESS OFFSET ADDRESS OFFSET ADDRESS OFFSET ADDRESS OFFSET ADDRESS VIRTUAL ENABLE ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK HVEN ENABLES A HORIZONTAL SCREEN WIDTH OF 128 BYTES REGARDLESS OF THE HRES BITS AND CRES BITS SELECTED THIS WILL ALLOW A VIRTUAL SCREEN SOMEWHAT LARGER THAN THE DISPLAYED SCREEN WINDOW OF ATTRIBUTE OR 64 MMUREG RELATIONSHIP BETWEEN DATA IN TASK REGISTER AND GENERATED ADDRESS DATA FROM THE MMU IS THEN USED AS THE UPPER THE USER CAN MOVE THIS THE DISPLAYED SCREEN BY MEANS OF THE HORIZONTAL OFFSET BITS IM CHARACTER MODE THE SCREEN WIDTH IS 128 CHARACTERS REGARDLESS RM
290. REE 0941 C6ED C1 CB CMPB 0 WAS THIS THE LAST GRANULE g942 C6EF 25 F1 BLO 1 6 2 KEEP FREEING GRANULES IF NOT LAST ONE 0943 WRITE FILE ALLOCATION SECTOR TO DIRECTORY DO NOT WRITE 0944 THE SIX CONTROL BYTES AT THE START OF THE FAT TO THE DISK 0945 C6F1 CE 06 00 LC6F1 LDU DBUF POINT U TO DISK BUFFER 0 AND 0946 6 4 DF EE STU SAVE IT AS DSKCON VARIABLE 0947 C6F6 CC 11 03 LDD 451103 WRITE DIRECTORY TRACK SAVE 0948 C6F9 97 EC STA DCTRK TRACK AND WRITE OPERATION CODE IN 0949 C6FB D7 EA STB DCOPC DSKCON VARIABLES 0950 C6FD C6 02 LDB 02 GET FILE ALLOCATION SECTOR AND 0951 07 ED STB DSEC SAVE IN DSKCON VARIABLE 0952 C701 8D 22 BSR LC725 POINT X TO PROPER FILE ALLOCATION TABLE 0953 703 6F 01 CLR FAT1 X RESET FLAG INDICATING VALID FAT DATA HAS BEEN STORED ON DISK 0954 C785 30 06 LEAX FATCON X MOVE X TO START OF GRANULE DATA 0955 C787 C6 44 LDB 6 68 BYTES IN FAT 0956 C789 BD A5 9A JSR LA59A MOVE ACCB BYTES FROM FAT RAM IMAGE TO DBUF amp 0957 0958 ZERO OUT ALL OF THE BYTES IN THE FAT SECTOR WHICH DO NOT CONTAIN THE GRANULE DATA 0959 ZERO OUT THE REMAINDER OF THE SECTOR BUFFER 0960 70 6F 80 LC70C CLR X THIS IS A BUG SHOULD BE CLR U DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 0961 C70C 8C 07 00 DBUFO SECLEN MORE OF THE SAME BUG SHOULD BE CMPU 0962 BNE LC70C THIS INSTRUC
291. RESET THE TRACK COUNTER TO ZERO SET THE DSKCON TRACK VARIABLE RESET THE SECTOR COUNTER GET THE PHYSICAL SECTOR NUMBER SAVE DSKCON SECTOR VARIABLE READ A SECTOR INCREMENT THE SECTOR COUNTER AND COMPARE IT TO MAXIMUM SECTOR NUMBER AND KEEP LOOPING IF MORE SECTORS LEFT GET THE CURRENT TRACK NUMBER ADD ONE TO IT COMPARE TO THE MAXIMUM TRACK NUMBER AND KEEP LOOPING IF THERE ARE STILL TRACKS TO DO GO CHECK FOR A DOS RESET CLEAR RAM IMAGE OF DSKREG CLEAR DSKREG TURN DISK MOTORS OFF PROCESS DRIVES NOT READY ERROR II BUILD A FORMATTED TRACK OF DATA IN RAM STARTING AT DFLBUF LDX DFLBUF LDD 204E BSR 10505 CLRB LD5AD 5 B LDU DBUF1 LDB B U STB DSEC LDU LD5E7 LDB 4 03 BSR LD5DB LDA DCTRK STA X CLR Xt LDA DSEC STA X LDB 4 09 BSR LD5DB PULS B INCB CMPB SECMAX BLO LD5AD LDD C84E WRITE ACCA BYTES OF ACCB INTO BUFFER LD5D5 STB DECA BNE 10505 RTS LD5DB PSHS B LDD BSR 10505 PULS B DECB BNE LD5DB RTS DATA USED TO FORMAT A SECTOR ON THE DISK 10604 C8 FCB FCB 8 0 3 F5 1 FE START TRACK BUFFER AT DFLBUF GET SET TO WRITE 32 BYTES OF 4E GO WRITE GAP IV RESET SECTOR COUNTER SAVE SECTOR COUNTER POINT U TO THE TABLE OF LOGICAL SECTORS GET LOGICAL SECTOR NUMBER FROM TABLE AND SAVE IT IN THE DSKCON VARIABLE POINT U TO TABLE OF SECTOR FORMATTING DATA GET FIRST 3 DATA BLOCKS AND WRITE THEM TO BUFFER GET TRACK NUMBER
292. RROR IF NO FILENAME YET GET DRIVE NUMBER CHECK LENGTH OF STRING BAD FILENAME ERROR IF MORE CHARACTERS LEFT REMOVE DRIVES FLAG FROM STACK AND RETURN TOGGLE DRIVE FLAG BAD FILENAME ERROR IF DRIVE NUMBER DEFINED TWICE ASCII VALUE OF DRIVE NUMBER TO ACCA DECREMENT STRING LENGTH BY 2 FOR DRIVE X SUBTRACT ASCII BIAS DRIVE NUMBER TOO LOW BAD FILENAME ERROR MAX OF 4 DRIVES DRIVE NUMBER TOO HIGH BAD FILENAME ERROR STORE IN DSKCON DRIVE NUMBER BAD FILENAME ERROR IF NO FILENAME YET POINT X TO END OF EXTENSION BUFFER ORIGIN SPECTRAL 550C REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 C9B5 C9B7 C9B9 C9BC C9BE C9BF C9C1 C9C3 C9C5 C9C7 C9CA C9CC C9CE C9DB C902 C904 C906 C908 C9DA C9DC C9DD C9DF C9EQ C9E2 C9E6 C9E8 C9EA C9ED C9EF C9F1 COF4 C9F6 C9F9 C9FB C9FE CAD CA01 04 6 CAg7 CA09
293. RS REMAINING IN THE FILE SAVE THE NUMBER OF SECTORS TO BE COPIED THIS TIME THROUGH 100 GET ACCB SECTORS TO RAM BUFFER SET SOURCE DESTINATION FLAG TO DESTINATION PRINT PROMPT MESSAGE IF REQUIRED CHECK THE GRAN TEST FLAG IF lt gt 0 IT CONTAINS THE NUMBER OF GRANS IN THE FILE AND THE DESTINATION DISK MUST BE CHECKED FOR ENOUGH ROOM IF IT IS THEN THE CHECK HAS ALREADY BEEN DONE POINT TO DESTINATION FILE PARAMETERS GET DESTINATION FILE PARAMETERS FROM STACK SCAN DIRECTORY FOR FILE AE ERROR IF IT EXISTS GET VALID FAT DATA MAKE SURE THERE ARE ENOUGH FREE GRANULES ON THE DESTINATION DISK JSR 16755 LEAX FATCON X LDA 505 5 LDB GRANMX LD44E COM X BNE 10455 DECA BEQ 10450 LD455 X DECB BNE LD44E JMP LC7F8 10450 COM X LD45F BSR 1047 LDX 5 BEQ 10472 LDD 02 5 ADDB 504 5 ADCA 00 STD 2 5 CLRA BSR 10476 BRA LD41E 10472 LEAS 36 5 RTS 10476 TST 25 5 B29 POINT X TO FAT SKIP PAST THE FAT CONTROL BYTES GET THE NUMBER OF GRANS IN THE FILE SET GRAN COUNTER TO MAXIMUM CHECK TO SEE IF A BRAN IS FREE AND BRANCH IF IT IS NOT FREE DECREMENT COUNTER AND BRANCH IF THERE ARE ENOUGH FREE GRANULES RESTORE FAT BYTE AND INCREMENT POINTER DECREMENT GRAN COUNTER BRANCH IF ALL GRANS NOT CHECKED DISK FULL ERROR RESTORE FAT BYTE PUT DATA FROM RAM BUFFER TO DESTINATION FILE GET THE NUMBER OF REMAINING SECTORS EXIT ROUTINE IF NO SECTORS LEFT GET THE CURRENT RECORD COUN
294. S SAVE ARRAY START IN ACCD ADD OFFSET TO NEXT ARRAY AND SAVE ADDRESS OF NEXT ARRAY ON THE STACK GET 2ND LETTER OF VARIABLE NAME BRANCH IF NUMERIC GET THE NUMBER OF DIMENSIONS X2 2 BYTES PER DIMENSION 5 BYTES CONSTANT PER ARRAY DESCRIPTOR CLEAR MSB OF OFFSET ONLY 125 DIMENSIONS ALLOWED POINT U TO START OF THIS ARRAY S VARIABLES AT END OF THIS ARRAY YES ADJUST STRING VARIABLE IF IN RANDOM FILE BUFFER MOVE POINTER TO NEXT DESCRIPTOR CHECK NEXT VARIABLE CHECK TO SEE IF A STRING IS LOCATED IN THE RANDOM FILE BUFFER AREA IF IT IS THE RANDOM FILE BUFFER IN QUESTION IT WILL BE DELETED IF IT IS HIGHER IN THE RANDOM FILE BUFFER SPACE THAN THE BUFFER IN QUESTION THE LENGTH OF THE CURRENT BUFFER WILL BE SUBTRACTED FROM THE ADDRESS OF THE STRING BECAUSE THE CURRENT POINT X TO START OF STRING COMPARE TO START OF FREE RANDOM FILE BUFFER AREA RETURN IF gt START OF FREE RANDOM FILE BUFFER AREA COMPARE TO START OF THIS FILE S RANDOM BUFFER RETURN IF START OF THIS FILE S RANDOM BUFFER COMPARE TO END OF THIS FILE S RANDOM BUFFER RETURN IF END OF THIS FILE S RANDOM BUFFER SAVE POINTER IN ACCD SUBTRACT RECORD LENGTH FROM START OF STRING ADDRESS SAVE NEW START OF STRING ADDRESS CLEAR THE LENGTH OF THE STRING CLEAR THE ADDRESS OF THE STRING RESERVED SPACE IN RANDOM FILE BUFFER FOR A CLOSED RANDOM FILE THE START OF RANDOM FILE BUFFER POINTER IN ALL RANDOM FCBS GET THE NUMBER OF ACTIVE FILES ADD ONE SAVE FI
295. SAVE COMMAND SAVE CMPA M LBEQ LCF68 BSR LCA33 LDX ZERO STX DFLTYP JSR BEQ 1 12 JSR LDB A JSR LB26F BNE LC9DF COM DASCFL BSR CLRA JMP LIST OPEN A SEQUENTIAL FILE FOR INPUT OUTPUT USE FCB LOCATED AT THE TOP OF FCBS BLANK FILL EXTENSION WITH BLANKS DEFAULT DECREMENT STRING COUNTER RETURN IF ZERO GET A CHARACTER FROM STRING CHECK FOR DRIVE SEPARATOR CHECK FOR END OF ESTENSION RAM BUFFER amp BAD FILENAME ERROR IF EXTENSION TOO LONG PUT A CHARACTER IN EXTENSION BUFFER GET ANOTHER EXTENSION CHARACTER STORE CHARACTER IN FILENAME BUFFER BAD FILENAME ERROR ZEROES ARE ILLEGAL PERIOD BAD FILENAME SLASH BAD FILENAME CHECK FOR FF BAD FILENAME ERROR IF PERIOD ERROR IF SLASH ERROR IF FF BRANCH IF SAVEM GO GET FILENAME ETC ZERO OUT X REG SET FILE TYPE AND ASCII FLAG TO ZERO GET CURRENT INPUT CHARACTER FROM BASIC BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA ASCII FILE SYNTAX CHECK ON CONTENTS OF ACCB RETURN IF NO MORE CHARACTERS ON LINE SET CRUNCHED ASCII FLAG TO ASCII OPEN A SEQUENTIAL FILE FOR OUTPUT SET ZERO FLAG CAUSE ENTIRE FILE TO BE LISTED LIST THE FILE TO CONSOLE OUT FROM BASIC THE SYSTEM OUTPUT FILE TYPE SKIP TWO BYTES INPUT FILE TYPE GET NUMBER OF RESERVED FILES CURRENTLY RESERVED ADD ONE USE ONE ABOVE HIGHEST RESERVED FCB SAVE IT IN DEVICE NUMBER OPEN A FILE amp INITIALIZ
296. SE THIS BOOK Disk BASIC Unravelled is a commented disassembled listing of the TRS 80 Color Computer Disk BASIC ROM The author has never seen any kind of source listing for the Color Computer ROMs so the comments and disassembly are 100 unique Some of the variable label literals which were used have come from published memory maps of systems which use a BASIC similar to that used in the Color Computer The labels used in the disassembly correspond to absolute addresses in RAM preceded by L The labels correspond to the ad dresses in Version 1 0 of the ROM which may cause some confusion when trying to cross index the 1 0 and 1 1 versions Literal labels have been assigned to RAM variables memory locations that contain data which may change and some ROM routines and data tables The symbol table in Appendix D will allow the user to locate the address of the literal label If the address is between 0 and 989 the literal is a RAM variable the description of which will be found in appendix A the Memory Map If the address is between 8000 and 9FFF the label will be found in the Extended BASIC listing if it is between A000 and BFFF the label is in the Color BASIC listing and if it is between C000 and DFFF the label is in the Disk BASIC listing Some of the literal values such as SKP1 SECLEN etc are values not associated with an address They are defined at the beginning of the Memory Map appendix A in the table of EQUATES
297. SET FLAG TO LSET 0 IF DATA STRING LENGTH IS gt THE FIELD STRING LENGTH THIS WILL CAUSE THE RIGHT SIDE OF THE DATA STRING TO BE TRUNCATED LOAD U WITH THE ADDRESS OF THE FIELD STRING GET THE RSET LSET FLAG FROM THE STACK AND BRANCH IF LSET SAVE THE NUMBER OF BYTES TO MOVE INTO THE FIELD STRING TAKE THE 2 S COMPLEMENT OF AN UNSIGNED NUMBER IN ACCB LEAVE THE DOUBLE BYTE SIGNED RESULT IN ACCD ADD THE LENGTH OF THE FIELD STRING TO THE INVERSE OF THE NUMBER OF BYTES TO BE MOVED ADD RESULT TO START OF FIELD STRING NOW U WILL POINT TO NUMBER OF BYTES TO MOVE FROM THE RIGHT SIDE OF THE FIELD STRING GET THE NUMBER OF BYTES TO MOVE MOVE ACCB BYTES FROM X TO U DATA TO FIELD STRING PULL LSET RSET FLAG OFF OF STACK AND RETURN X II RESET SAM DISPLAY PAGE AND VDG MODE GET START OF FILE BUFFERS SUBTRACT THE START OF RANDOM FILE BUFFER SPACE SAVE DEFAULT VALUE OF RANDOM FILE BUFFER SPACE ON STACK GET CURRENT NUMBER OF FCBS AND SAVE ON THE STACK DEFAULT VALUE GET CURRENT INPUT CHAR CHECK FOR COMMA BRANCH IF COMMA NO BUFFER NUMBER PARAMETER GIVEN EVALUATE EXPRESSION BUFFER NUMBER 15 FCBS MAX BRANCH IF 15 ILLEGAL FUNCTION CALL SAVE NUMBER OF FCBS ON STACK CHECK CURRENT INPUT CHAR BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION RETURN VALUE IN ACCD ADD ONE BYTE SAVE RANDOM FILE BUFFER SIZE ON STACK CLOSE FILES GET THE NUMBER OF BUFFERS TO MAKE AND INITIALIZE A
298. SHS LDA BEQ COMA BEQ PSHS LDB JSR BSR LDB JSR BSR LDB CMPB BHS BSR CLRA JSR BSR LDX LDA ADDA BSR LDB BSR TFR CLRA JSR JSR PULS LEAX CMPX BLO LDB INCB CMPB BLS RTS JSR JMP LCCEB LCD08 LCD17 LCD18 LCD1B ENTER WITH GRANULES IN LCD1E JSR LEAU CLRA INCA CMPA LBHI LEAX ABX LDB CMPB LCD24 APPENDIX B DISASSEMBLY OF DISK BASIC 1 1 FCBCGR X LC755 5 09 LCC99 FCBSEC Y LC7BF FCBSEC Y FCBCPT Y FCBCGR Y 8AC0 C0 U n LC685 LC5A9 LD24F LC79D LB958 51102 DCTRK DCOPC 03 CTORY SECTOR INTO THE 1 0 BUFFER DSEC DBUFO DCBPT LD6F2 ORY INFORMATION TO CONSOLE OUT L 549 DIRNAM X LCD08 LCD17 X 08 L89 2 LCD1B 03 L89 2 LCD1B FCBTYP X 10 LCCEB LCD1B LBDCC LCD1B 5 DIRASC X LCD18 DIRGRN X LCDIE L80CC L8958 X DIRLEN X DBUFO SECLEN LCCC5 DSEC SECMAX LCCBB LA282 LB9AC GET GRANULE NUMBER POINT X TO PROPER ALLOCATION TABLE ADD THE GRANULE NUMBER TO FAT POINTER ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK POINT U TO THE CORRECT GRANULE IN FAT SKIP PAST THE SIX FAT CONTROL BYTES GET CURRENT SECTOR FOR THIS GRANULE MAX SECTOR NUMBER 9 SECTORS GRANULE BRANCH IF NOT AT END OF GRANULE DECREMENT SECTOR NUMBER AND INCREMENT ERROR FLAG IN CASE ERROR FOUND WHILE LOOKING FOR NEXT GRANULE THE ERR
299. SICAL SECTOR NUMBER AND SAVE IT IN THE RAM BUFFER FINISHED WITH ALL SECTORS NO KEEP GOING REMOVE SKIP FACTOR FROM STACK GET TOP OF RAM USED BY DSKINI IS IT CLEARED AREA OUT OF MEMORY ERROR IF gt CLEARED AREA CLOSE ALL FILES SET RESET FLAG TO FF THIS WILL CAUSE A DOS RESET SET STACK TO TOP OF DBUF1 RESET SAM TO DISPLAY PAGE ZERO AND ALPHA GRAPHICS YOU COULD DELETE THIS INSTRUCTION AND CHANGE FOLLOWING STA TO CLR RESTORE HEAD TO TRACK ZERO DSKCON OP CODE RESTORE HEAD TO TRACK ZERO RESET THE READY TIMER FOC READ ADDRESS CODE CHECK DRIVE READY WAIT UNTIL READY BRANCH IF NOT READY ISSUE AN ERROR RESET TRACK NUMBER START THE FORMATTING PROCESS CHECK FOR TRACK 22 PRECOMPENSATION AND BRANCH IF TRACK 22 NO PRECOMP GET THE RAM IMAGE OF DSKREG OR IN THE PRECOMPENSATION FLAG AND SEND IT TO DSKREG GET STEP IN COMMAND AND SEND IT TO THE 1793 DELAY AFTER ISSUING COMMAND TO 1793 CHECK DRIVE READY BRANCH IF NOT READY ISSUE AN ERROR WAIT A WHILE BUILD A FORMATTED TRACK IN RAM Y POINTS TO 1793 DATA REGISTER DISABLE INTERRUPTS GET RETURN ADDRESS AND STORE IT IN THE NON MASKABLE INTERRUPT VECTOR POINT X TO THE FORMATTED TRACK RAM IMAGE DISK BASIC UNRAVELLED II 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915
300. SK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK runs When the halt flag is high the DRQ Data ReQuest signal from the FDC 111 be connected to the halt input of the 6809 This will allow the DRQ signal to control the operation of the 6809 to the extent that the 6809 will not process any instructions while the FDC is processing data to or from the 6809 Writing a zero to bit 7 of will clear the halt flag FF48 or it will be cleared whenever the FDC generates an INTRQ Interrupt Request signal which indicates that the FDC has completed its current command Data transfer between the computer and the disk drives through the FDC is accomplished through a series of hardware and software tricks The slow clock speed of the Color Computer will not allow data to be transferred in the normal method of getting a byte from the computer giving it to the FDC and then performing status checks until the FDC is not busy There is just not enough time for this when operating at double density Part of the Color Computer s solution is a hardware trick whereby the disk controller board will allow the FDC to halt the 6809 while the FDC is storing or retrieving data The halt flag will allow the DRQ signal from the FDC to halt the 6809 so that the 6809 will wait while the FDC is processing a data request This trick will allow the 6809 to pass data to the FDC as fast as the FDC can take it by executing a fast
301. SR LC65F SCAN DIRECTORY FOR A MATCH 2589 0305 BD C6 B8 JSR LC6B8 NE ERROR IF MATCH NOT FOUND 2590 0308 BE 09 74 LDX V974 POINT X TO DIRECTORY RAM IMAGE OF FOUND FILE 2591 030 EE E LDU DIRLST X GET NUMBER OF BYTES IN LAST SECTOR AND 2592 0300 AE B LDX DIRTYP X SOURCE FILE TYPE AND ASCII FLAG DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BASIC 1 0 REVISED 12 26 1999 WALTER K ZYDHEK 2593 030 34 50 PSHS X AND SAVE THEM ON THE STACK 2594 D311 BD C7 6D JSR LC76D GET VALID FAT DATA 2595 D314 F6 99 76 LDB V976 GET NUMBER OF FIRST GRANULE IN FILE 2596 D317 BD CC 44 JSR LCC44 GET THE NUMBER OF GRANULES IN FILE 2597 D31A 34 02 PSHS A AND SAVE IT ON THE STACK 2598 D31C 4A DECA SUBTRACT OFF THE LAST GRANULE 2599 D31D C4 3F ANDB 3F MASK OFF LAST GRANULE FLAG BITS AND SAVE THE 2600 D31F 34 04 PSHS B NUMBER OF SECTORS IN LAST GRANULE ON STACK 2601 0321 1F 89 SAVE THE NUMBER OF GRANULES 2602 D323 4F CLRA CLEAR THE MS BYTE OF ACCD 2603 D324 BD C7 49 JSR 16749 MULTIPLY ACCD BY NINE 2604 D327 EB E4 ADDB S ADD THE NUMBER OF SECTORS IN THE LAST 2605 0329 89 00 00 GRANULE TO ACCD 2606 D32B 8E 00 01 LDX 450001 INITIALIZE RECORD COUNTER TO ONE 2607 032 34 16 5 5 INITIALIZE SECTOR AND RECORD COUNTERS ON THE STACK 2608 2609 AT THIS POINT THE CONTROL VARIABLES FOR COPY ARE STORED ON THE STACK 2610 1 S REMAINING SECTORS COUNTER 2 3 5 R
302. SR LC6CF LDA V973 STA V977 LDX 1974 STX V978 LC48C BSR LC53A BSR 1 50 BRA LC496 LC4C2 CMPB R BEQ LC4CC CMPB D LBNE LA616 A RANDOM DIRECT FILE LCACC ASL 5 LDD RNBFAD PSHS B A ADDD DFFLEN BLO LC4DE CMPD FCBADR BLS LC4E3 APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 C7 POINT TO FCB CHECK GET PUT FLAG AND BRANCH IF GET SAVE PUT FLAG IN THE FCB SAVE NEW TEMPORARY RECORD POINTER ON STACK PUT GET SECTOR OFFSET COUNTER AND ADD ONE TO IT SET BYTE OFFSET 0 CHECK THE LENGTH OF THE TEMPORARY RECORD LENGTH COUNTER AND KEEP MOVING DATA IF lt gt 0 PULL TEMPORARY RECORD LENGTH AND BUFFER ADDRESS OFF STACK AND RETURN PULL RETURN ADDRESS OFF OF THE STACK EVALUATE AN EXPRESSION GET MODE I O R FIRST BYTE OF STRING EXPRESSION AND SAVE IT ON STACK GET DEVICE NUMBER SET FLAGS BRANCH IF NOT A DISK FILE GET MODE SAVE MODE AND DEVICE NUMBER FILE NUMBER SET DEVICE NUMBER TO SCREEN SYNTAX CHECK FOR COMMA POINT TO DAT FOR EXTENSION GET FILENAME FROM BASIC DEFAULT DISK FILE TYPE AND ASCII FLAG SAVE DEFAULT VALUES DATA ASCII DEFAULT RECORD LENGTH 1 PAGE GET CHAR FROM BASIC BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION GET EVALUATED EXPRESSION RECORD LENGTH IF 0 THEN ILLEGAL FUNCTION CALL ERROR IF ANY FURTHER CHARACTERS ON LINE GET MODE AND FILE NUMBER SAVE MODE ON STACK POINT X TO FCB FOR THIS FILE FILE A
303. SS OFF THE STACK TURN OFF THE CASSETTE MOTOR DISABLE THE ANALOG MULTIPLEXER SET DEVICE NUMBER TO THE SCREEN SEND A CR TO THE SCREEN SEND A TO THE SCREEN POINT X TO DISK BASIC S ERROR TABLE JUMP TO BASIC S ERROR HANDLER 27 BAD RECORD 28 DISK FULL 29 OUT OF BUFFER SPACE 30 WRITE PROTECTED 31 BAD FILE NAME 32 BAD FILE STRUCTURE 33 FILE ALREADY EXISTS 34 FIELD OVERFLOW 35 SET TO NON FIELDED STRING 36 VERIFICATION ERROR 37 WRITE OR INPUT PAST END OF RECORD BASIC FILE EXTENSION BLANK DEFAULT FILE EXTENSION DATA FILE EXTENSION BINARY FILE EXTENSION ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 0385 0386 0387 0388 0389 0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 0400 0401 0402 0403 0404 0405 0406 0407 0408 0409 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 0450 0451 0452 0453 0454 0455 0456 0457 0458 0459 0460 0461 0462 0463 0464 0465 0466 0467 0468 0469 0470 0471 0472 0473 0474 0475 0476 0477 0478 0479 0480 C2B2 C2B4 C2B6 C2B9 C2BB C2BD C2BF C2C1 C2C3 C2C6 C2C8 C2CB C2CE C2D1 C2D4 C2D6 C2D8 C2DA C2DC C2DE 2 1 2 4 2 6 2 8 2 2 2 C2F1 C2F3 C2F5 C2F7 C2F9 C2FC C2FE C300
304. STACK LDB NUMBER OF CURRENTLY OPEN FILES INCB ADD ONE MORE TO FILE COUNTER LC80D JSR LC749 POINT X TO FCB OF THIS FILE BEQ LC829 BRANCH IF BUFFER NOT BEING USED LDA DCDRV GET DRIVE NUMBER AND CHECK TO SEE IF IT CMPA FCBDRV X MATCHES THE DRIVE NUMBER FOR THIS BUFFER BNE LC829 FILE EXISTS ON ANOTHER DRIVE LDU V974 GET RAM DIRECTORY AREA LDA DIRGRAN U GET FIRST GRANULE IN FILE CMPA FCBFGR X DOES IT MATCH THIS FILE BUFFER BNE LC829 NO LDA FCBTYP X GET FILE TYPE OF THIS BUFFER CMPA S DOES IT MATCH THE ONE WE ARE LOOKING FOR LBNE LA61C FILE ALREADY OPEN ERROR IF NOT LC829 DECB DECR FILE COUNTER BNE LC8 D BRANCH IF HAVEN T CHECKED ALL ACTIVE FILES PULS A PC RESTORE FILE TYPE AND RETURN LC82E JSR LA5A5 EVALUATE AN EXPRESSION DEVICE NUMBER CLR DEVNUM SET DEVICE NUMBER TO SCREEN TSTB TEST NEW DEVICE NUMBER LBLE LB44A FC ERROR IF DEVICE NUMBER NOT A DISK FILE B12 DISK BASIC UNRAVELLED 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 12
305. T DSKREG IMAGE SET FLAG TO ENABLE 1793 TO HALT 6809 GET READ WRITE COMMAND FROM STACK ZERO OUT Y TIMEOUT INITIAL VALUE U POINTS TO 1793 INTERFACE REGISTERS NMI FLAG FF ENABLE NMI VECTOR DISABLE FIRQ IRQ SEND READ WRITE COMMAND TO 1793 SINGLE RECORD COMPARE FOR SIDE 0 NO 15 5 DELAY DISABLE SIDE SELECT COMPARE WRITE DATA ADDRESS MARK FB WAIT FOR STATUS WAS THIS A READ IF S0 GO LOOK FOR DATA LDX 10798 STX DNMISV LDX LDA FDCREG LDA DRGRAM ORA 80 PULS B LDY ZERO LDU FDCREG COM NMIFLG ORCC 50 STB FDCREG EXG A A EXG A A CMPB 80 BEQ LD782 WAIT FOR THE 1793 TO ACKNOWLEDGE READY TO WRITE DATA LDB 4 02 C33 DRQ MASK BIT DISK BASIC UNRAVELLED II 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 0768 D76A 076 D76E 0770 0773 0775 0778 D77A D77D 0780 0782 0784 0786 0788 D78A D78C 0786 0791 0793 0796 0798 079 D79D D79F D7A1 D7A2 D7A4 D7A6 D7A8 D7AA D7AB D7AC D7AD D7AE D7B1 D7B3 D7B6 D7B8 D7BB D7BC D7BF 07C1 07C4 07C7 07C9 D7CA D7CD D7CF D7D2
306. T ROUTINE IF THE INPUT CHARACTER PRECEEDING THE CR WAS A LINE FEED THEN INSERT THE CR IN THE INPUT STRING OTHERWISE CHECK FOR A FOLLOWING LINE FEED AND EXIT THE ROUTINE RESTORE CARRIAGE RETURN AS THE INPUT CHARACTER CHECK FOR A NULL ZERO INPUT CHARACTER AND IGNORE IT IF 1T IS A NULL TO SEE IF THE INPUT CHARACTER MATCHES EITHER ACCB OR CHARAC AND IF IT DOES THEN BRANCH TO CHECK FOR ITEM SEPARATOR OR TERMINATOR SEQUENCE AND EXIT ROUTINE STORE NEW CHARACTER IN BUFFER END OF INPUT BUFFER NO GET A CHARACTER FROM CONSOLE IN EXIT ROUTINE IF BUFFER EMPTY CHECK FOR CR OR CR LF AND EXIT ROUTINE GET A CHARACTER FROM CONSOLE IN BRANCH IF BUFFER NOT EMPTY PUT A ZERO AT END OF BUFFER WHEN DONE POINT X TO LINBUF RESET POINTER CHECK FOR ITEM SEPARATOR OR TERMINATOR AND EXIT THE INPUT ROUTINE LCD98 LCDAC LCDB8 LCDBC LCDCB LCDD LCDD5 CMPA BEQ CMPA BNE BSR BNE CMPA BEQ CMPA BEQ CMPA BNE BSR BNE CMPA BEQ BSR BRA BSR BEQ JSR LDB CMPB LBNE LDB JMP JSR TST RTS LCDAS SPACE LC092 LCDD9 LCD92 SPACE LCDAS gt LCD92 SCR LCDB8 LCDD9 LCD92 LF LC092 LCDD6 LCD92 LCDD amp LCDD5 LC744 FCBTYP X RANFIL LC352 2 37 LAC46 LA176 CINBFL MOVE THE INPUT POINTER BACK ONE DISK FILE LCDD6 PSHS JSR LDB CMPB BNE LDD SUBD X B LC744 FCBTYP X HRANFIL LCDEC FCBGET X 0001 B20 QUOTE YES SPACE NO EXIT ROUTINE
307. T X CLR FCBGET 1 X CLR FCBPUT X CLR FCBPUT 1 X CLR LDA FCBDRV X STA DCDRV JSR BEQ LC2EA JSR JSR 18730 TFR X D LC2E6 LDX FCBTMP STD FCBREC X LC2EA LDD FCBREC X BEQ LC308 JSR LC685 LDD FCBRLN X LDX FCBBUF X PSHS X B A LEAX 2 U JSR L9FB5 PSHS U Y LDA 5 BNE LC308 PULS X PULS B LC306 TRKMAX 1 BLO LC310 LC30B LDB 2 27 JMP LAC46 LC318 100 FCBTMP CMPX FCBSOF U LBEQ LC3CF PSHS X B LDA FCBFLG U BEQ LC324 CLR FCBFLG U LDB 4 03 BSR 10357 CONVERT THE LC324 100 01 5 JSR LC784 PSHS B JSR LC779 NEGB ADDB 03 S INCB STB FCBSEC U LDB FCBFGR U JSR 16755 LEAU FATCON X LDA 5 INCA LC33E LEAX U ABX DECA BEQ LC37B STB 5 LDB X CMPB BLO LC33E THE GRANULE LDB 5 TST 08 BNE LC366 LC352 LDB 2X23 JMP LAC46 LC357 LEAX FCBCON U LC35A STB DCOPC STX LEAX U JSR LC763 B5 SAVE DSKCON OPERATION CODE VARIABLE SAVE DSKCON LOAD BUFFER VARIABLE POINT X TO FCB CONVERT FCB TRACK AND SECTOR TO DSKCON VARIABLES DISK BASIC UNRAVELLED II 0481 0482 0483 0484 0485 0486 0487 0488 0489 0490 0491 0492 0493 0494 0495 0496 0497 0498 0499 0500 0501 0502 0503 0504 0505 0506 0507 0508 0509 0510 0511 0512 0513 0514 0515 0516 0517 0518 0519 0520 0521 0522 0523 0524 0525 0526 0527 0528 0529 0530 0531 0532 0533 0534 0535 0536 0537 0538 0539 0540 0541 0542
308. TART IN FCB GET RANDOM FILE RECORD LENGTH AND SAVE IT IN FCB SET FAT FLAG SAVE FILE TYPE IN FCB INITIALIZE FCB GET RAM DIRECTORY IMAGE GET NUMBER OF BYTES IN LAST SECTOR OF FILE SAVE IT IN FCB GET CURRENT FILE BUFFER CLEAR FCB CONTROL BYTES CLEAR A BYTE DECREMENT COUNTER BRANCH IF NOT DONE GET CURRENT FILE BUFFER ADDRESS BACK GET CURRENT DRIVE NUMBER AND SAVE IT IN FCB GET FIRST GRANULE SAVE IT AS THE STARTING GRANULE NUMBER AND SAVE IT AS CURRENT GRANULE NUMBER GET DIRECTORY SECTOR NUMBER SUBTRACT 3 DIRECTORY SECTORS START AT 3 MULTIPLY SECTORS BY 8 8 DIRECTORY ENTRIES PER SECTOR SAVE SECTOR OFFSET GET RAM DIRECTORY IMAGE SUBTRACT RAM OFFSET 8 DIRECTORY ENTRIES SECTOR NOW ACCA CONTAINS 0 7 ACCA CONTAINS DIRECTORY ENTRY 9 71 SAVE DIRECTORY ENTRY NUMBER SET UP DIRECTORY AND UPDATE FILE ALLOCATION TABLE ENTRY IN FIRST UNUSED SECTOR LDB LDA LBEQ STA STA LDB STB JSR LDX STX LEAU LDB CLR DECB BNE LDX LDB JSR LDD STD LDB JSR STA STA LDB STB JSR PSHS JSR INC LDA CMPA LC559 LC57C BLO JSR LC58D PULS CONSOLE IN DVEC4 LDA LBLE LEAS PSHS CLR LDX LDB ASLB LC597 528 2 V977 LAC46 973 DSEC 02 DCOPC LD5FF V978 V974 x DIRLEN X LC559 DNAMBF 11 LA59A DFLTYP 33 LC78F V976 02 U 3503 DCOPC LD5FF U X B A LC725 1 1 WFATVL LC58D LC6F1 A B X U PC RAM VECTOR DEVNUM XVEC4 502 5 X
309. TE 5 1 15 DISK CINBFL RMB PV CONSOLE IN BUFFER FLAG NOT EMPTY FF EMPTY RSTFLG RMB PV WARM START FLAG 55 WARM OTHER COLD RSTVEC RMB 2 PV WARM START VECTOR JUMP ADDRESS FOR WARM START TOPRAM RMB 2 PV TOP OF RAM RMB 2 SPARE UNUSED VARIABLES FILSTA RMB PV FILE STATUS FLAG CLOSED 1 INPUT 2 OUTPUT CINCTR RMB PV CONSOLE IN BUFFER CHAR COUNTER CINPTR RMB 2 PV CONSOLE IN BUFFER POINTER BLKTYP RMB XIV CASS BLOCK TYPE O HEADER 1 DATA FF EOF BLKLEN RMB TV CASSETTE BYTE COUNT CBUFAD RMB 2 TV CASSETTE LOAD BUFFER POINTER CCKSUM RMB TV CASSETTE CHECKSUM BYTE CSRERR RMB TV ERROR FLAG CHARACTER COUNT CPULWD RMB TV PULSE WIDTH COUNT CPERTM RMB TV BIT COUNTER CBTPHA RMB TV BIT PHASE FLAG CLSTSN RMB TV LAST SINE TABLE ENTRY GRBLOK RMB TV GRAPHIC BLOCK VALUE FOR SET RESET AND POINT IKEYIM RMB TV INKEY RAM IMAGE CURPOS RMB 2 PV CURSOR LOCATION ZERO RMB 2 PV DUMMY THESE TWO BYTES ARE ALWAYS ZERO SNDTON RMB TV TONE VALUE FOR SOUND COMMAND SNDDUR RMB 2 TV DURATION VALUE FOR SOUND COMMAND THESE BYTES ARE MOVED DOWN FROM ROM RE INIT DESCRIPTION VALUE CMPMID RMB 8 PV 1200 2400 HERTZ PARTITION CMP RMB 24 PV UPPER LIMIT OF 1200 HERTZ PERIOD CMP1 RMB 0 PV UPPER LIMIT OF 2400 HERTZ PERIOD SYNCLN RMB 2 28 PV NUMBER OF 55 S TO CASSETTE LEADER BLKCNT RMB 1 PV CURSOR BLINK DELAY LPTBTD RMB 2 88 PV BAUD RATE CONSTANT 600 LPTLND RMB 2 PV PRINTER CARRIAGE RETURN DELAY LPTCFW RMB 6 PV TAB FIELD WIDTH
310. TEP IN COMMAND AND SEND IT TO THE 1793 DELAY AFTER ISSUING COMMAND TO 1793 Woo x I II CHECK DRIVE READY BRANCH IF NOT READY ISSUE AN ERROR WAIT A WHILE BUILD A FORMATTED TRACK IN RAM Y POINTS TO 1793 DATA REGISTER DISABLE INTERRUPTS GET RETURN ADDRESS AND STORE IT IN THE NON MASKABLE INTERRUPT VECTOR POINT X TO THE FORMATTED TRACK RAM IMAGE RESET STATUS OF THE 1793 ENABLE THE NMI FLAG TO VECTOR OUT OF AN I 0 LOOP UPON AN NMI INTERRUPT GET WRITE TRACK COMMAND AND SEND TO 1793 GET THE DSKREG RAM IMAGE AND OR IN THE FLAG WHICH WILL ENABLE THE 1793 TO HALT THE 6809 SEND RESULT TO DSKREG GET A BYTE FROM THE FORMATTED TRACK RAM IMAGE SEND IT TO THE 1793 AND LOOP BACK TO GET ANOTHER BYTE ll GET STATUS ENABLE INTERRUPTS KEEP ONLY WRITE PROTECT amp LOST DATA AND SAVE IT IN THE DSKCON STATUS BYTE BRANCH IF ERROR SKIP TO THE NEXT TRACK GET THE TRACK NUMBER WAS IT THE LAST TRACK NO KEEP GOING GET THE DSKCON READ OP CODE AND SAVE IT IN THE DSKCON VARIABLE POINT THE DSKCON BUFFER POINTER TO DBUF POINT U TO THE LOGICAL SECTOR NUMBERS RESET THE TRACK COUNTER TO ZERO SET THE DSKCON TRACK VARIABLE RESET THE SECTOR COUNTER GET THE PHYSICAL SECTOR NUMBER SAVE DSKCON SECTOR VARIABLE READ A SECTOR INCREMENT THE SECTOR COUNTER AND COMPARE IT TO MAXIMUM SECTOR NUMBER AND KEEP LOOPING IF MORE SECTORS LEFT GET THE CURRENT TRACK NUMBER ADD ONE TO IT CO
311. TER ADD THE NUMBER OF SECTORS RECORDS MOVED AND SAVE THE NEW RECORD COUNTER SET SOURCE DESTINATION FLAG TO SOURCE PRINT PROMPT MESSAGE IF REQUIRED KEEP COPYING SECTORS REMOVE TEMPORARY STORAGE VARIABLES FROM STACK COPY DONE CHECK SINGLE DISK COPY FLAG IF ZERO THEN DON T ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 0479 047 047 0480 0482 0483 0486 0488 0488 0480 0490 0493 0496 0498 0498 049C 049L 04 1 04 4 D4A7 D4A9 D4AB D4AD D4AF D4B1 D4B3 D4B5 D4B7 D4BA D4BC D4BE 04 0 04 2 04 4 04 6 04 8 D4CA D4cD DACF 0401 0402 0404 0406 0409 0468 0400 D4DF 0461 0463 0465 0467 D4EA D4ED D4EF D4F1 D4F3 D4F5 D4F7 D4F9 D4FC D4FF 0501 0503 0506 0508 050 050 D50F D511 D513 D515 D517 D519 D51C D51F D522 D524 D527 D52A D52C D52E D530 D533 D
312. TH ACCB CONTAINING 1052 GRANULE FROM WHICH TO START SEARCHING THE FOUND GRANULE 1053 IS MARKED BY STORING A C IN THE GRANULE S DATA BYTE 1054 TO INDICATE THAT IT IS THE LAST GRANULE IN THE FILE 1055 RETURN WITH FIRST FREE GRANULE FOUND IN ACCA 1056 78 80 94 LC78F BSR LC725 POINT X TO FILE ALLOC TABLE APPENDIX C DISASSEMBLY OF DISK BASIC 1 0 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK DISK BASIC UNRAVELLED II 1057 C791 30 906 LEAX FATCON X SKIP CONTROL BYTES 1058 C793 4 CLRA USE ACCA AS GRANULE COUNTER 1059 C794 C4 FE ANDB FE MASK OFF BIT ZERO OF SEARCH GRANULE 1060 C796 6 2 CLR 5 INITIALIZE AND SAVE BYTE ON STACK DIRECTION FLAG 1061 C798 63 85 LC798 COM B X IS THIS GRANULE FREE FF FREE 1062 79 27 31 BEQ LC7CD BRANCH IF IT IS 1063 C79C 63 85 COM B X RESTORE GRANULE DATA 1064 C79E 4C INCA ADD ONE TO GRANULE COUNTER 1065 79 81 44 CMPA GRANMX GRANMX GEANULES PER DISK 1066 7 1 24 25 BHS LC7C8 BRANCH IF ALL GRANULES CHECKED DISK FULL 1067 C7A3 5C INCB INCR TO NEXT GRANULE 1068 C7A4 C5 01 BITB 4901 IS BIT 0 SET 1069 C7A6 26 FB BNE LC798 BRANCH IF ODD GRANULE NUMBER SAME TRACK 1070 7 8 34 06 PSHS B A SAVE GRANULE COUNTER AND CURRENT GRANULE NUMBER 1071 C7AA CO 02 SUBB 02 SUBTRACT ONE TRACK 2 GRANULES 1072 C7AC 63 62 COM 02 5 COMPLEMENT DIRECTION FLAG 1073 C7AE 26 BC BNE LC7BC BRANCH EVERY OTHER TIME 1074 C7 0 EQ EB SUBB 5 SUBTRACT THE GRANULE COUNTE
313. THE NUMBER OF GRANULES IN FILE PSHS A AND SAVE IT ON THE STACK DECA SUBTRACT OFF THE LAST GRANULE ANDB 3F PSHS B TFR A B SAVE THE NUMBER OF GRANULES IN ACCB CLRA CLEAR THE MS BYTE OF ACCD JSR LC779 MULTIPLY ACCD BY NINE ADDB 5 ADCA 00 GRANULE TO ACCD LDX 0001 INITIALIZE RECORD COUNTER TO ONE PSHS X B A AT THIS POINT THE CONTROL VARIABLES FOR COPY ARE STORED ON THE STACK 1 5 REMAINING SECTORS COUNTER 2 3 5 RECORD COUNTER 4 S NUMBER OF SECTORS TO BE COPIED INITIALLY SET TO NUMBER OF SECTORS IN THE LAST GRANULE GRAN TEST FLAG INITIALLY SET TO NUMBER OF GRANS IN FILE FILE TYPE 7 5 ASCII FLAG 8 9 5 NUMBER OF BYTES IN LAST SECTOR NUMBER OF SECTORS WHICH WILL FIT IN THE CURRENTLY AVAILABLE FREE RAM DESTINATION FILENAME EXT AND DRIVE NUMBER SINGLE DISK COPY FLAG 24 35 5 SOURCE FILENAME EXT AND DRIVE NUMBER LD41E CLRB LDX 5 BEQ L042C 10423 INCB LEAX 1 X BEQ L042C 10 5 BNE 10423 10422 STX 5 STB 04 5 BSR 10482 LDA 4 FF BSR 10476 TST 05 S BEQ LD45F LEAX 11 5 JSR LD3AD JSR 10059 JSR 1679 SET SECTOR COUNTER TO ZERO GET THE NUMBER OF SECTORS REMAINING IN THE FILE BRANCH IF NO SECTORS LEFT ADD A SECTOR TO TEMPORARY SECTOR COUNTER DECREMENT REMAINING SECTORS COUNTER BRANCH IF NO SECTORS LEFT COMPARE TEMPORARY COUNTER TO NUMBER OF SECTORS WHICH MAY BE STORED IN FREE RAM BRANCH IF STILL ROOM FOR MORE SECTORS SAVE THE NUMBER OF UNCOPIED SECTO
314. THE TIMER SAVE IT BRANCH IF NOT TIME TO TURN OFF DISK MOTORS GET DSKREG IMAGE TURN ALL MOTORS AND DRIVE SELECTS OFF PUT IT BACK IN RAM IMAGE SEND TO CONTROL REGISTER MOTORS OFF JUMP TO EXTENDED BASIC S IRQ HANDLER DOS COMMAND AT DF00 DISK BASIC UNRAVELLED 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 090 DF02 DF04 DF 7 099 DF C DF E 0610 DF12 DF14 DF16 DF19 DF1B DF1D DF1F DF21 DF23 DF25 DF27 DF2B DF2D DF2F DF31 DF33 DF36 DF38 DF3B DF3F DF43 0646 0649 DFAC DF4F DF52 DF55 DF58 11 OF cc 34 BE 0 96 81 22 7 7 86 7 35 88 34 AD 6D 27 35 C6 7E 35 FC 18 18 7F 7F 7E FD FD FD 39 3F 03 26 06 03 03 12 22 03 02 84 22 02 06 04 01 06 9F 06 DA 06 28 06 26 83 27 26 26 38 01 01 01 00 06 00 46 00 4F 46 00 01 E8 3B 00 02 04 94 53 BF ORG DOSCOM 5 CLR LDD PSHS LDF 9 LDX INC LDA CMPA BHI STA LDD STA LDA STA PULS STD ADDA PSHS JSR TST BEQ LDF36 PULS LDB JMP PULS LDD CMPD LBEQ CLR DOSINI CLR JMP LDD STD STD STD END RTS DOSBAS 1F00 TMPLOC DOSBUF DSKVAR TMPLOC TMPLOC HSECMAX LDF36
315. TING ADDRESS OF FCB1 CLEAR THE FIRST BYTE OF FCB 1 CLOSE FCB POINT X TO FCB 2 SAVE ITS STARTING ADDRESS IN FCB VECTOR TABLE CLEAR THE FIRST BYTE OF FCB 2 CLOSE FCB POINT X TO SYSTEM FCB THIS FCB WILL ONLY BE USED TO COPY LOAD SAVE MERGE ETC SAVE ITS ADDRESS IN THE FCB VECTOR TABLE CLEAR THE FIRST BYTE OF SYSTEM FCB CLOSE FCB SET THE NUMBER OF ACTIVE RESERVED FILE BUFFERS TO 2 1 2 POINT X TO ONE PAST THE END OF SYSTEM FCB SAVE THE ADDRESS IN ACCD ON AN EVEN 256 BYTE BOUNDARY YES NO ADD 256 TO ADDRESS COPY ACCA TO ACCB SAVE ENOUGH ROOM FOR 4 GRAPHICS PAGES PCLEAR 4 SAVE NEW START OF BASIC ADDRESS INITIALIZE EXBAS VARIABLES amp DO A NEW GET THE START OF CURRENT GRAPHICS PAGE ADD 1 5K 6 X 256 ONE GRAPHICS PAGE SAVE NEW END OF GRAPHICS PAGE GO INITIALIZE THE FLOPPY DISK CONTROLLER TURN ON IRQ AND FIRQ I DISK BASIC UNRAVELLED II 0193 C0C6 0194 0 9 0195 0196 COCF 0197 C001 0198 0199 C004 0200 0 5 0201 C007 0202 CODA 0203 CODD 0204 CED 0205 0206 CE6 0207 9 0208 CHEB 0209 COEE 9210 COFO 0211 COF2 0212 COFS 0213 0214 0215 COF6 0216 COF7 0217 COF9 0218 COFB 0219 COFC 0220 COFE 0221 0222 0223 C100 0224 C106 0225 C10C 0226 C112 0227 118 0228 0229 C124 0230 0231 0232 C126 0233 C12C 0234 C132 0235 C138 0236 C13E 0237 C143 0238 C144 0239 C14A 0240 C150 0241 155 0242 156 0243 C15C
316. TION HAS BEEN LEFT OUT 0963 C711 7E D5 FF JMP LD5FF WRITE A SECTOR 0964 0965 ENTER WITH CONTAINING FILE NUMBER 1 15 EXIT WITH X POINTING 0966 TO CORRECT FILE BUFFER FLAGS SET ACCORDING TO FILE TYPE 0967 0968 C714 34 94 LC714 PSHS B SAVE FILE NUMBER ON STACK 0969 C716 D6 6F LDB DEVNUM GET DEVICE NUMBER FILE NUMBER 0970 C718 8C 34 04 LC718 453404 SKIP TWO BYTES 0971 C719 34 04 LC719 PSHS B SAVE FILE NUMBER ON STACK 0972 71 58 ASLB X2 2 BYTES PER POINTER 0973 71 8E 09 26 LDX amp FCBV1 2 POINT X TO START OF FCB POINTERS 0974 C71F AE 85 LDX X POINT X TO PROPER FCB 0975 C721 E6 00 LDB FCBTYP X SET FLAGS ACCORDING TO FILE TYPE 0976 C723 35 84 PULS B PC RESTORE FILE NUMBER 0977 0978 POINT X TO DRIVE ALLOCATION TABLE 0979 0980 C725 34 06 LC725 PSHS B A SAVE ACCD ON STACK 0981 C727 96 LDA DCDRV GET DRIVE NUMBER 0982 C729 C6 4A LDB GET LENGTH OF FILE ALLOCATION TABLE 0983 C72B 3D MUL MULTIPLY BY DRIVE NUMBER TO GET OFFSET 0984 C72C 8 08 00 LDX FATBLO START OF FILE ALLOCATION TABLE 0985 72 30 88 LEAX D X POINT TO RIGHT TABLE 0986 731 35 86 PULS A B PC RESTORE ACCD 0987 0988 CONVERT GRANULE NUMBER TO TRACK amp SECTOR NUMBER X MUST BE POINTING TO CORRECT 0989 FCB THE TRACK AND SECTOR NUMBER WILL BE STORED IN DSKCON REGISTERS 0990 C733 E6 03 LC733 LDB FCBCGR X GET GRANULE NUMBER 0991 C735 54 LSRB DIVIDE BY 2 2 GRANULES TRACK 0992 C736 D7 EC STB TRACK NUMBER
317. TO CPU ENABLED 0620 CONTROL INTERRUPT FLAG SET ON FALLING EDGE OF CD 0621 POLARITY 1 FLAG SET ON RISING EDGE OF CD 0622 2 NORMALLY 1 CHANGES 20 TO DATA DIRECTION 0623 BIT3 CASSETTE MOTOR CONTROL OFF 1 ON 0624 4 ALWAYS 1 0625 5 ALWAYS 1 0626 BIT6 NOT USED 0627 BIT7 CD INTERRUPT FLAG 0628 0629 FF22 BITE RS 232C DATA INPUT 0630 SINGLE BIT SOUND OUTPUT 0631 2 RAM SIZE INPUT 0632 BIT3 RGB MONITOR SENSING INPUT CSS 0633 4 VDG CONTROL OUTPUT amp UPPER LOWER CASE 0634 BIT5 VDG CONTROL OUTPUT GM1 amp INVERT 0635 BIT6 VDG CONTROL OUTPUT GM2 0636 BIT7 VDG CONTROL OUTPUT A G 0637 0638 FF23 BITE CONTROL OF CARTRIDGE FIRQ TO CPU DISABLED 0639 INTERRUPT 1 FIRQ TO CPU ENABLED 0640 CONTROL INTERRUPT FLAG SET ON FALLING EDGE OF CART 0641 POLARITY 1 FLAG SET ON RISING EDGE OF CART 0642 2 NORMALLY 1 CHANGES FF22 TO DATA DIRECTION 0643 BIT3 SOUND ENABLE 0644 4 ALWAYS 1 0645 5 ALWAYS 1 0646 BIT6 NOT USED 0647 BIT7 CARTRIDGE INTERRUPT FLAG 0648 0649 24 MM 28 1 IMAGES 0650 40 2 0651 40 DSKREG RMB 1 DISK CONTROL REGISTER 0652 0653 40 BITE DRIVE SELECT 0 0654 DRIVE SELECT 1 0655 2 DRIVE SELECT 2 0656 BIT3 DRIVE MOTOR ENABLE MOTORS OFF 1 MOTORS ON 0657 4 WRITE PRECOMPENSATION NO PRECOMP 1 PRECOMP 0658 BIT5 DENSITY FLAG SINGLE 1 DOUBLE 0659
318. TO THE INVERSE OF THE NUMBER OF BYTES TO BE MOVED ADD RESULT TO START OF FIELD STRING NOW U WILL POINT TO NUMBER OF BYTES TO MOVE FROM THE RIGHT SIDE OF THE FIELD STRING GET THE NUMBER OF BYTES TO MOVE MOVE ACCB BYTES FROM X TO U DATA TO FIELD STRING PULL LSET RSET FLAG OFF OF STACK AND RETURN X II RESET SAM DISPLAY PAGE AND VDG MODE GET START OF FILE BUFFERS SUBTRACT THE START OF RANDOM FILE BUFFER SPACE SAVE DEFAULT VALUE OF RANDOM FILE BUFFER SPACE ON STACK GET CURRENT NUMBER OF FCBS AND SAVE ON THE STACK DEFAULT VALUE GET CURRENT INPUT CHAR CHECK FOR COMMA BRANCH IF COMMA NO BUFFER NUMBER PARAMETER GIVEN EVALUATE EXPRESSION BUFFER NUMBER 15 FCBS MAX BRANCH IF 15 ILLEGAL FUNCTION CALL SAVE NUMBER OF FCBS ON STACK CHECK CURRENT INPUT CHAR BRANCH IF END OF LINE SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION RETURN VALUE IN ACCD SAVE RANDOM FILE BUFFER SIZE ON STACK CLOSE FILES GET THE NUMBER OF BUFFERS TO MAKE AND INITIALIZE A BUFFER COUNTER ON THE STACK GET START OF RANDOM FILE BUFFERS ADD THE NEWLY SPECIFIED RANDOM FILE BUFFER SPACE OUT OF MEMORY ERROR IF gt FFFF SAVE START OF FCBS DISK BASIC UNRAVELLED II 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445
319. TSI S TEST TRACKS REMAINING FLAG BEQ 101 0 BRANCH IF BACKUP DONE CLRA SET SOURCE DESTINATION FLAG TO SOURCE JSR 10235 PRINT PROMPT MESSAGE IF NEEDED LDB 01 5 GET THE TRACKS WRITTEN COUNTER ADD THE NUMBER OF ADDB TMPLOC TRACKS MOVED THIS TIME THROUGH LOOP AND STB 01 5 SAVE THE NEW TRACKS WRITTEN COUNTER BRA LD1B7 COPY SOME MORE TRACKS 01 0 BSR 101 5 CHECK FOR DOS INITIALIZATION JMP LAC73 JUMP BACK TO BASIC S MAIN L00 LD1E5 PULS U PUT THE RETURN ADDRESS IN U LDA DRESFL TEST DISK RESET FLAG BEQ LD292 DON T RESET THE DOS IF FLAG NOT SET LDX FCBV1 POINT X TO TABLE OF FCB ADDRESSES CLRA SET FILE COUNTER TO ZERO LD1F0 CLR X MARK FCB AS CLOSED INCA ADD ONE TO FILE COUNTER CMPA FCBACT COMPARE TO NUMBER OF RESERVED FILES BLS 101 0 BRANCH IF ANY FILES NOT SHUT DOWN LDX TXTTAB LOAD X WITH THE START OF BASIC CLR 1 X SET FIRST BYTE OF BASIC PROGRAM TO ZERO JSR LAD19 GO DO A CLR DRESFL RESET THE DOS RESET FLAG 10202 LDA DLODFL CHECK THE LOAD RESET FLAG AND BEQ 1020 BRANCH IF NOT SET CLR DLODFL CLEAR THE LOAD RESET FLAG JSR 1 019 GO DO A 10200 JMP JUMP BACK TO RETURN ADDRESS SAVED IN U ABOVE LDA 02 READ CODE LD211 458603 SKIP TWO BYTES LD212 LDA 03 WRITE OP CODE STD DCOPC SAVE IN DSKCON VARIABLE LDA 903 5 GET THE NUMBER OF THE TRACK BEING CURRENTLY STA DCTRK WRITTEN AND SAVE IT IN DSKCON VARIABLE LDX DFLBUF TRACK BUFFER STARTS AT DFLBUF STX DCBPT SAVE IT IN DSK
320. TURN 1125 1126 C7FE BD A5 A5 LC7FE JSR LA5A5 EVALUATE AN EXPRESSION DEVICE NUMBER 1127 C801 OF 6F CLR DEVNUM SET DEVICE NUMBER TO SCREEN 1128 C803 5D TSTB TEST NEW DEVICE NUMBER 1129 C804 10 2F EC 42 LBLE LB44A FC ERROR IF DEVICE NUMBER NOT A DISK FILE 1130 C808 BD C7 19 JSR 16719 POINT X TO FCB 1131 C80B A6 00 LDA FCBTYP X TEST IF BUFFER IS IN USE 1132 C800 10 27 DB EA LBEQ LA3FB FILE NOT OPEN ERROR 1133 C811 81 40 CMPA RANFIL DIRECT RANDOM FILE 1134 C813 27 C1 BEQ LC7D6 RETURN IF RANDOM 1135 C815 7E A6 16 LC815 JMP LA616 BAD FILE MODE ERROR IF NOT RANDOM 1136 1137 INPUT DEVICE NUMBER CHECK RAM HOOK 1138 C818 86 10 DVEC5 LDA INPFIL INPUT FILE TYPE 1139 C81A 8C 86 20 LC81A 458620 5 TWO BYTES 1140 1141 PRINT DEVICE NUMBER CHECK RAM HOOK 1142 C81B 86 20 DVEC6 LDA 0UTFIL OUTPUT FILE TYPE 1143 C81D OD 6F TST DEVNUM CHECK DEVICE NUMBER AND RETURN IF 1144 C81F 2F B5 BLE 1 706 NOT A DISK FILE 1145 C821 AF E4 SIX S REPLACE SUBROUTINE RETURN ADDRESS WITH X REGISTER 1146 THIS IS THE SAME AS LEAS 2 5 AND PSHS X 1147 C823 BD C7 14 JSR LC714 POINT X TO FCB 1148 C826 34 92 PSHS A SAVE FILE TYPE ON STACK 1149 C828 A6 00 LDA FCBTYP X GET FILE TYPE 1150 82 10 27 DB CD LBEQ LA3FB FILE NOT OPEN ERROR 1151 C82E 81 40 CMPA RANFIL RANDOM FILE 1152 C830 27 94 BEQ LC836 BRANCH IF RANDOM FILE C12 DISK BASIC UNRAVELLED II APPENDIX C ORIGIN SPECTRAL ASSOC DISASSEMBLY OF DISK BAS
321. The track and sector registers are used by the FDC to remember where the disk drive s head is currently located The data register is used to pass data to and from the FDC The command register is used to pass one of the eleven possible commands to the FDC Each of these commands has several different forms which are explained in the FDC data sheet The form used by Disk Basic are listed below TYPE COMMAND CODE I RESTORE 03 17 14 DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC I I I II II III III III IV REVISED 12 26 99 WALTER K ZYDHEK STEP 23 STEP IN 43 STEP OUT 53 READ SECTOR 80 WRITE SECTOR A0 READ ADDRESS CQ READ TRACK E4 WRITE TRACK F4 FORCE INTERRUPT 00 The status register is used to reflect the results of FDC command The contents of the status register will vary depending upon the TYPE of FDC command which was executed various TYPEs 57 Listed below are the contents of the status register for the STATUS REGISTER SUMMARY ALL TYPE I READ READ READ WRITE WRITE COMMANDS ADDRESS SECTOR TRACK SECTOR TRACK NOT READY NOT READY READY NOT READY READY NOT READY WRITE PROTECT HEAD LOADED SEEK ERROR RNF RNF 0 0 0 WRITE WRITE PROTECT PROTECT 0 RECORD 0 WRITE WRITE TYPE FAULT FAULT RNF 0 CRC ERROR ERROR ERROR 0 CRC ERROR 0 TRACK 0 INDEX BUSY LOST DATA LOST DATA 105 DATA LOST
322. UFFER WRITE OP CODE SAVE IN DSKCON VARIABLE CHECK STATUS FOR THE READ OPERATION BRANCH IF ERROR CHECK 256 BYTES GET BYTE FROM WRITE BUFFER COMPARE TO READ BUFFER BRANCH IF NOT EQUAL DECREMENT BYTE COUNTER AND BRANCH IF NOT DONE RESTORE REGISTERS RESTORE REGISTERS DECREMENT THE VERIFY COUNTER BRANCH IF MORE TRIES LEFT VERIFY ERROR JUMP TO ERROR HANDLER OFF FLAG 0 OFF TOKEN YES ON FLAG FF ON TOKEN BRANCH TO SYNTAX ERROR IF NOT ON OR OFF SET VERIFY FLAG GET NEXT CHARACTER FROM BASIC SAVE REGISTERS GET RETRY COUNT AND SAVE IT ON THE STACK RESET DRIVE NOT READY TIMER THESE DATA ARE CLOSE TO THE IBM SYSTEM 34 FORMAT FOR 256 BYTE SECTORS DOUBLE DENSITY THE FORMAT GENERALLY CONFORMS TO THAT SPECIFIED ON THE 1793 DATA SHEET THE GAP SIZES HAVE BEEN REDUCED TO THE MINIMUM ALLOWABLE THE IBM FORMAT USES 40 AS THE FILL CHARACTER FOR THE DATA BLOCKS WHILE COLOR DOS USES AN FF AS THE FILL CHARACTER 10604 8 0 FCB 3 F5 FCB 1 FE TRACK SIDE AND SECTOR NUMBERS ARE INSERTED HERE FCB 1 1 FCB 1 F7 FCB 22 4E FCB 12 0 FCB 3 F5 FCB 1 FB FCB FF FCB 1 F7 FCB 24 4E DOS COMMAND DOS BNE 10742 JMP DOSVEC LD6F2 5 5 B LDB 4 05 STB ATTCTR PULS B LD6FB BSR DSKCON TST 0 5 BEQ 1070 10701 LDA DCSTA LDB 2 3 4 40 BNE LD7OB 107099 LDB 2 20 LD7 B JMP LAC46 LD7 E 5 5 LDA DCOPC CMPA 03 PULS A BNE 10742 TST DVERFL BEQ
323. UNT enter with a drive number 8 3 in ACCB return the number of free granules in floating point accumulator 0 NONE D75F D66C DSKCON universal disk 1 0 routine A detailed ex planation is available in the Color Computer disk user s manual A B X D7B8 D6C5 RESTORE HEAD TO TRACK ZERO restore the head for the drive in DCDRV to track zero Return DCSTA 10 if there is a SEEK error ALL D7F8 0705 READ ONE SECTOR read one sector as specified by the DSKCON parameters DSEC DCTRK DCDRV and store the data at the address in DCBPT ALL D7FB 0708 WRITE ONE SECTOR write one sector as specified by the DSKCON parameters DSEC DCTRK DCDRV and get the data to go on the disk from the address in DCBPT F2 DISK BASIC UNRAVELLED II 1 1 START END C090 C094 C199 C113 C139 C192 C219 C22C C298 C2A6 D35F D6D4 D895 D89D C001 COBB C112 C138 C191 C1F0 C218 C22B C237 C2A5 C2B1 D398 D6EB D89C D8A0 1 APPENDIX G ORIGIN SPECTRAL ASSOC DISK BASIC S DATA ASCII TABLES REVISED 12 26 1999 WALTER K ZYDHEK 0 START END C000 C094 COF6 C199 C126 C17F C1DB C201 C214 C278 C28E D272 D5E7 D7A2 D7AA C201 C097 COFF C125 C17E C1DA C209 C213 C21F C28D C299 D2AB D5FE D7A9 D7AD DESCRIPTION DISK BASIC ROM IDENTIFIER INDIRECT JUMP TABLE COMMAND INTERPRETATION TABLE RO
324. V X LDA V976 STA FCBFGR X STA FCBCGR X LDB V973 SUBB 03 ASLB ASLB ASLB PSHS B LDD V974 SUBD DBUFS LDA 4 08 MUL ADDA 5 STA FCBDIR X RTS SET UP LC567 LDB 28 2 LDA V977 LBEQ LAC46 STA V973 STA DSEC LDB 4 02 STB DCOPC JSR LD6F2 LDX V978 STX V974 LEAU X LDB DIRLEN LC586 CLR X DECB BNE LC586 LDX DNAMBF LDB 11 JSR LA59A LDD DFLTYP STD 00 U LDB 433 JSR LC7BF B8 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK SAVE IT AS FIRST FREE DIRECTORY ENTRY GET RAM DIRECTORY IMAGE OF OLD FILE AND SAVE IT AS FIRST FREE DIRECTORY ENTRY SET UP NEW DIRECTORY ENTRY ON DISK INITIALIZE FILE BUFFER FLAG AND MAP FCB AS BEING USED FILE MODE R RANDOM BRANCH IF SO FILE MODE D DIRECT BAD FILE MODE ERROR IF NOT SET FILE TYPE TO DIRECT GET ADDRESS OF RANDOM FILE BUFFER AREA AND SAVE IT ON THE STACK ADD THE RECORD LENGTH OB ERROR IF SUM gt FFFF IS IT gt THAN FCB DATA AREA BRANCH IF NOT 00 OF BUFFER SPACE ERROR JUMP TO ERROR HANDLER SAVE END OF RANDOM BUFFER ON STACK DID THIS FILE EXIST BRANCH IF SO SET UP NEW FILE IN DIRECTORY INITIALIZE FCB SET FILE TYPE MATCH FF ILLEGAL VALUE THIS WILL FORCE ANY OPEN MATCHED FILE TO CAUSE A FILE ALREADY OPEN ERROR INITIALIZE FCB SET FCBSOF X TO FF ILLEGAL SECTOR OFFSET WHICH WILL FORCE NEW SECTOR DATA TO BE READ IN DURING GET PUT INITIALIZE RECORD NUMBER 1 START OF RANDOM FILE BU
325. VE X TO START OF GRANULE DATA 0979 C734 C6 44 LDB GRANMX 68 BYTES IN FAT 0980 C736 BD A5 9A JSR LA59A MOVE ACCB BYTES FROM FAT RAM IMAGE TO DBUF amp 0981 0982 ZERO OUT ALL OF THE BYTES IN THE FAT SECTOR WHICH DO NOT CONTAIN THE GRANULE DATA 0983 C739 6F CB LC739 CLR U CLEAR A BYTE 0984 C73B 11 83 07 00 CMPU DBUFO SECLEN FINISHED THE WHOLE SECTOR 0985 C73F 26 F8 BNE LC739 M0 0986 C741 7E D6 F2 JMP LD6F2 WRITE A SECTOR 0987 0988 ENTER WITH ACCB CONTAINING FILE NUMBER 1 15 EXIT WITH X POINTING 0989 TO CORRECT FILE BUFFER FLAGS SET ACCORDING TO FILE TYPE 0990 0991 C744 34 04 LC744 PSHS B SAVE FILE NUMBER ON STACK 0992 C746 D6 6F LDB DEVNUM GET DEVICE NUMBER FILE NUMBER 0993 C748 8 453404 SKIP TWO BYTES 0994 C749 34 04 LC719 PSHS B SAVE FILE NUMBER ON STACK 0995 C74B 58 ASLB X2 2 BYTES PER POINTER 0996 C74C 8E 09 26 LDX amp FCBV1 2 POINT X TO START OF FCB POINTERS 0997 C74F AE 85 LDX B X POINT X TO PROPER FCB 0998 C751 E6 00 LDB FCBTYP X SET FLAGS ACCORDING TO FILE TYPE 0999 C753 35 84 PULS B PC RESTORE FILE NUMBER 1000 1001 POINT X TO DRIVE ALLOCATION TABLE 1002 1003 C755 34 06 LC755 PSHS B A SAVE ACCD ON STACK 1004 C757 96 EB LDA DCDRV GET DRIVE NUMBER 1005 C759 C6 4A LDB GET LENGTH OF FILE ALLOCATION TABLE 1006 C75B 3D MUL MULTIPLY BY DRIVE NUMBER TO GET OFFSET 1007 C75C 8E 08 00 LDX amp FATBLO START OF FILE ALLOCATION TABLE 1008 C75F 30 8B LEAX D X POINT TO RIGHT TABLE 1009 C761 35 86 PULS A
326. VE NUMBER FC ERROR IF IT S gt 3 SAVE DRIVE NUMBER ON THE STACK SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION TRACK NUMBER CHECK FOR MAXIMUM TRACK NUMBER FC ERROR IF TRACK NUMBER 34 SAVE TRACK NUMBER ON THE STACK SYNTAX CHECK FOR COMMA EVALUATE EXPRESSION SECTOR NUMBER SAVE SECTOR NUMBER IN DSKCON VARIABLE USELESS INSTRUCTION NEXT INSTRUCTION SHOULD JUST CHECK FOR MAXIMUM SECTOR NUMBER SECMAX FC ERROR IF SECTOR NUMBER TOO BIG GET TRACK AND DRIVE NUMBER OFF OF THE STACK AND SAVE IN DSKCON VARIABLES JUMP TO FC ERROR SYNTAX CHECK FOR COMMA POINT X TO EVALUATE EXPRESSION GET THE DSKCON DRIVE TRACK AND SECTOR VALUES AND SAVE THEM ON THE STACK GO EVALUATE AN EXPRESSION OR A VARIABLE GET THE DRIVE TRACK AND SECTOR NUMBERS OFF OF THE STACK AND PUT THEM BACK INTO THE DSKCON VARIABLES ROUTINE ADDRESS DISK BASIC UNRAVELLED II 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879
327. VEC7 LDB 5 PSHS B LDD DFLBUF ADDD 502 5 BLO LD11B STD 2 5 RESERVE SPACE FOR FCBS LD C ADDD FCBLEN BLO LD11B DEC S BPL LD C TSTB C24 ORIGIN SPECTRAL ASSOC REVISED 12 26 1999 WALTER K ZYDHEK PULL STRING ADDRESS AND LENGTH OFF OF THE STACK AND SAVE THEM IN STRING DESCRIPTOR CHECK FOR ANOTHER FIELD SPECIFICATION SKIP ONE BYTE LSET FLAG 0 SAVE RSET 4F LSET FLAG ON THE STACK EVALUATE FIELD STRING VARIABLE TM ERROR IF NUMERIC VARIABLE SAVE STRING DESCRIPTOR ON STACK POINT X TO ADDRESS OF STRING COMPARE STRING ADDRESS TO START OF RANDOM FILE BUFFER SE ERROR IF lt RANDOM FILE BUFFER COMPARE STRING ADDRESS TO TOP OF RANDOM FILE BUFFER AREA BRANCH IF STRING IN RANDOM FILE BUFFER SET TO NON FIELDED STRING ERROR JUMP TO ERROR HANDLER SYNTAX CHECK FOR TOKEN EVALUATE DATA STRING EXPRESSION RETURN WITH X POINTING TO STRING ACCB LENGTH POINT Y TO FIELD STRING DESCRIPTOR GET LENGTH OF FIELD STRING RETURN IF NULL STRING SAVE LENGTH OF DATA STRING ON STACK PREPARE TO FILL DATA STRING WITH BLANKS POINT U TO FIELD STRING ADDRESS STORE A SPACE IN FIELDED STRING DECREMENT LENGTH COUNTER KEEP FILLING W SPACES IF NOT DONE GET THE LENGTH OF THE DATA STRING AND RETURN IF IT IS NULL ZERO LENGTH OF DATA STRING TO LENGTH OF FIELD STRING BRANCH IF FIELD STRING gt DATA STRING GET THE LENGTH OF THE FIELD STRING AND FORCE THE RSET L
328. XPRESSION RETURN VALUE IN ACCB CHECK FOR PMODE 4 FC ERROR IF PMODE 4 NUMBER BLOCKS BEFORE GRAPHICS PAGES JUMP TO EXEAS PMODE COMMAND CLOSE FILES GET NEXT CHARACTER FROM BASIC JUMP TO EXEAS DLOAD MODIFIED TOKEN FOR POS IF NOT POS GO TO EXBAS SECONDARY COMM HANDLER SYNTAX CHECK FOR AND EVALUATE EXPRESSION GET DEVICE NUMBER AND SAVE IT ON STACK EVALUATE DEVICE NUMBER TEST DEVICE NUMBER CHECK DEVICE NUMBER AND BRANCH IF NOT A DISK FILE POINT X TO FCB GET FILE TYPE DIRECT RANDOM FILE BRANCH IF NOT A RANDOM FILE RESTORE DEVICE NUMBER GRAB THE PUT DATA ITEM COUNTER AND CONVERT IT TO A FLOATING POINT NUMBER SET PRINT PARAMETERS RESTORE DEVICE NUMBER GET PRINT POSITION AND CONVERT IT TO FLOATING POINT NUMBER IN GET NEXT INPUT CHARACTER GET FILENAME ETC EVALUATE EXPRESSION PUT II 2 BYTES ON STACK DITTO COMPARE END ADDRESS TO START ADDRESS COMA BNE LCDE1 INC S LCDEl DECB BNE LCDDA PULS B JMP LB4F3 DRIVE COMMAND DRIVE JSR EVALEXPB CMPB 03 LBHI LA61F STB DEFDRV RTS EVALUATE EXPRESSION RAM VECTOR DVECI5 LDA 904 5 BNE LCE D LDX 505 5 CMPX LAF9A BNE LCE D LDX 02 S CMPX LB166 BNE LCE D LDX LCE10 SIX 05 5 LCE D JMP XVEC15 LET MODIFIER LCE1 PULS A RORA JSR 18148 LBEQ LBC33 LDX 2 LDD 02 X CMPD DFLBUF BLO LC 28 SUBD FCBADR LBCS LAFB1 LCE2B JMP LAFA4 MODIFIER FOR EXBAS COMMAND INTERPRETATION
329. XTBF COMPARE POINTER TO END OF FILENAME BUFFER 1240 C8EQ 27 E8 BEQ LC8CA BAD FILENAME ERROR FILENAME TOO LONG 1241 C8E2 8D 3E BSR 10922 PUT CHARACTER IN FILENAME 1242 C8E4 20 DA BRA LC8CB GET ANOTHER CHARACTER FROM STRING 1243 C8E6 8D DD LC8E6 BSR LC8C5 BAD FILENAME ERROR IF NO FILENAME YET 1244 C8E8 8D 05 BSR LC8EF GET DRIVE NUMBER 1245 C8EA 5D TSTB CHECK LENGTH OF STRING 1246 C8EB 26 DD BNE LC8CA BAD FILENAME ERROR IF MORE CHARACTERS LEFT 1247 C8ED 35 82 LC8ED PULS A PC REMOVE DRIVES FLAG FROM STACK AND RETURN 1248 DISK BASIC UNRAVELLED II 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 C8EF C8F1 C8F3 C8F5 C8F7 C8F9 C8FB C8FD C8FF C991 C992 C994 C997 C999 C9BB 90 C910 C911 C913 C915 C917 C919 C91C C91E C920 C922 C924 C926 C928 C92A C92C C92E C92F C931 C932 C934 C938 C93A C93C C93F C941 C943 C946 C948 C94B C94D C959 C952 C953 C956 C958 C959 C95B C95E C95F
330. Y 90 MULTIPLY BY 10 IS FASTER THAN DIVIDE BY 9 1042 C784 6F E2 LC784 CLR 5 CLEAR A TEMPORARY SLOT ON THE STACK 1043 C786 6C E4 LC756 INC 5 DIVIDE ACCD BY 90 SAVE THE 1044 C788 83 00 5A SUBD 9 10 QUOTIENT 1 ON THE STACK REMAINDER 1045 C78B 2A F9 BPL LC786 IN ACCB 1046 C78D A6 E4 LDA 5 PUT THE QUOTIENT 1 IN AND 1047 C78F E7 E4 STB 5 SAVE REMAINDER ON STACK 1048 C791 C6 BA LDB 10 MULTIPLY QUOTIENT 1 1049 C793 3D MUL BY 10 1050 C794 35 02 PULS A PUT THE REMAINDER IN ACCA 1051 C796 5A LC796 DECB DECREMENT THE GRANULE COUNT BY ONE FOR 1052 C797 8B 99 ADDA 09 EVERY NINE SECTORS 1 GRANULE IN THE 1053 C799 2B FB BMI LC796 REMAINDER COMPENSATE FOR THE 1 IN QUOTIENT 1 1054 C79B 4F CLRA CLEAR MS BYTE OF ACCD 1055 C79C 39 LC79C RTS 1056 DISK BASIC UNRAVELLED 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 C79D C79F 7 1 C7 3 C7A5 C7A7 C7AA C7AC C7AF 7 1 C7B3 C7B5 C7B7 C7BA
331. Y HAS BEEN KILLED 0886 C683 8 09 4C LC683 LDX DNAMBF POINT TO DISK FILE NAME BUFFER 0887 C686 A6 80 LC686 LDA X COMPARE THE FILENAME AND EXTENSION 0888 C688 1 CB CMPA U STORED IN RAM AT DNAMBF TO THE DIRECTORY 0889 C68A 26 BE BNE LC69A ENTRY STORED AT U BRANCH IF MISMATCH 0890 C68C 8C 09 57 DNAMBF 11 END OF FILE BUFFER 0891 C68F 26 F5 BNE 16686 BRANCH IF NOT DONE CHECKING FILENAME 0892 C691 F7 09 73 STB V973 SAVE SECTOR NUMBER IN DSKCON VARIABLE 0893 C694 6 42 LDA FCBFGR U GET NUMBER OF FIRST GRANULE IN FILE 0894 C696 B7 09 76 STA V976 AND SAVE IT IN V976 0895 C699 39 RTS 0896 0897 69 33 8 20 LC69A LEAU DIRLEN Y GET NEXT DIRECTORY ENTRY DIRLEN BYTES PER ENTRY 0898 C690 11 83 07 00 CMPU DBUFO SECLEN AT END OF BUFFER 0899 6 1 26 05 16678 CHECK NEXT ENTRY IF NOT END 0900 C6A3 5C INCB NEXT SECTOR 0901 C6A4 C1 B CMPB 11 11 SECTORS MAX IN DIRECTORY 0902 C6A6 23 C6 BLS LC66E BRANCH IF MORE SECTORS 0903 C6A8 39 RTS 0904 0905 C6A9 43 LC6A9 COMA COMPLEMENT FIRST BYTE IN DIRECTORY EMTRY 0906 C6AA 26 D7 BNE 16683 BRANCH IF FILE IS ACTIVE FALL THRU IF NOT USED 0907 0908 SET POINTERS FOR FIRST UNUSED DIRECTORY ENTRY 0909 C6AC B6 09 77 LC6AC LDA V977 UNUSED ENTRY ALREADY FOUND 0910 C6AF 26 06 BNE DVEC12 RETURN IF UNUSED ENTRY ALREADY FOUND 0911 6 1 F7 09 77 STB V977 SECTOR CONTAINING THIS DIRECTORY ENTRY 0912 6 4 09 78 STU V978 POINTS TO RAM AREA WHERE
332. YTE ADD FIELD LENGTH TO TOTAL FIELD LENGTH COUNTER FO ERROR IF SUM gt FFFF POINT X TO FCB COMPARE TO RECORD LENGTH amp BRANCH IF TOTAL FIELD LENGTH lt RECORD LENGTH FIELD OVERFLOW ERROR JUMP TO ERROR DRIVER LOAD U WITH OLD TOTAL LENGTH OF ALL FIELDS 10080 JSR LA35F TST PRTDEV BNE 1006 Gt LD B9 JMP 14282 FIELD COMMAND FIELD JSR LC82E CLRA CLRB PSHS X B A LD C3 JSR GETCCH BNE LD C9 PULS A B X PC LD C9 258 18738 5 5 X 8 AT THIS POINT THE STACK WILL HAVE THE FOLLOWING INFORMATION ON IT S FIELD LENGTH 1 2 5 RANDOM FILE BUFFER ADDRESS 3 4 5 TOTAL FIELD LENGTH 5 6 5 FCD POINTER CLRA ADDD 03 5 BLO LD DA LDX 505 5 CMPD FCBRLN X BLS LD DF LD DA LDB 34 2 JMP LAC46 LD DF LDU 503 5 STD 03 5 B24 SAVE NEW TOTAL FIELD LENGTH DISK BASIC UNRAVELLED II 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 00863 00965 09867 0969 DOEB DOEE DOFO 09863 DOF6 00
333. YTE OF FCB 1 CLOSE FCB POINT X TO FCB 2 SAVE ITS STARTING ADDRESS IN FCB VECTOR TABLE CLEAR THE FIRST BYTE OF FCB 2 CLOSE FCB POINT X TO SYSTEM FCB THIS FCB WILL ONLY BE USED TO COPY LOAD SAVE MERGE ETC SAVE ITS ADDRESS IN THE FCB VECTOR TABLE CLEAR THE FIRST BYTE OF SYSTEM FCB CLOSE FCB SET THE NUMBER OF ACTIVE RESERVED FILE BUFFERS TO 2 1 2 POINT X TO ONE PAST THE END OF SYSTEM FCB SAVE THE ADDRESS IN ACCD ON AN EVEN 256 BYTE BOUNDARY YES NO ADD 256 TO ADDRESS CHECK TO SEE IF ACCD IS ON AN EVEN 512 BYTE ONE GRAPHIC PAGE BOUNDARY ADD 256 INCA TO IT IF NOT COPY ACCA TO ACCB SAVE ENOUGH ROOM FOR 4 GRAPHICS PAGES PCLEAR 4 I DISK BASIC UNRAVELLED II 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240 0241 0242 0243 0244 0245 0246 0247 0248 0249 0250 0251 0252 0253 0254 0255 0256 0257 0258 0259 0260 0261 0262 0263 0264 0265 0266 0267 0268 0269 0270 0271 0272 0273 0274 0275 0276 0277 0278 0279 0280 0281 0282 0283 0284 0285 0286 0287 0288 C0C6 C0C8 C CB COCF C001 C005 C007 C009 C00C CODF 2 C064 C067 COEA COED COFO COF3 COF6 COF9 COFC COFE C101 C103 C105 C1
334. by 68 data bytes one byte for each granule The FAT is stored on sector two of the directory track 17 A RAM image of the FAT is kept in the disk RAM for each of the four possible drives Keeping an image of the FAT in RAM helps speed up the overall operation of the DOS by eliminating the need for disk 0 every time the DOS modifies the FAT Saving the FAT to disk is done approximately every 19 times that a new granule is pulled from the free granule reserve It is written to disk whenever a file is closed and there are some DOS operations which force the FAT to be written to disk when that DOS operation allocates a free granule Only the DOS uses two of the six control bytes The first FAT control byte keeps track of how many FCBs are active on the drive for a particular FAT This byte is used to preclude the loading in of the FAT from disk when there is any active file currently using the FAT You can imagine the disaster which would occur if you were creating a file and had allocated some granules to your new file but had not saved the new FAT to disk when the old FAT was loaded into RAM on top of the new FAT Your new file would be hopelessly gone For that reason the DOS must not allow the FAT to be loaded into RAM from disk while an FCB is active for that FAT The second FAT control byte is used to govern the need to write data from the FAT RAM image to the disk If the value of this byte is zero it means that the FAT RAM image is an exact
335. copy of what is currently stored on the disk If the value is non zero it indicates that the data in the FAT RAM image has been changed since the last time that the FAT was written to disk The number stored in this byte is an indicator of how many granules have been removed from the FAT since the last FAT to disk write Some BASIC commands such as KILL cause an immediate FAT RAM image to disk write when granules are either freed or allocated Other commands which allocate granules increment the second FAT control byte This byte is then compared to the disk variable WFATVL and when the second control byte is WFATVL the FAT is written to disk The FAT data bytes are used to determine whether or not a granule is free and if it has been allocated they are used to determine to which file the granule belongs If a data byte is FF it means that the granule is free and may be allocated to any file If a granule has been allocated it is part of a sector chain which defines which granules belong to a certain file The only information required to be able to trace the granule chain is the number of the first granule in the chain If the first granule of the chain is not known the chain cannot be traced down backwards A granule data byte which has been allocated will contain a value which is the number of the next granule in the granule chain for that file If the two most significant bits 6 7 of a granule data byte are set then that granule
336. e able to completely understand the theory behind COLOR DOS to the point of being able to modify it for his own purposes or add extra commands or functions to the DOS No attempt will be made to re explain the functions of BASIC and Extended Basic which were explained in the previous two books of the BASIC Unravelled series The reader should be aware of the fact that Color Disk Basic is not a stand alone system There are many direct calls into the Basic and Extended Basic ROMs These calls are not explained in this book the reader will have to refer to the Basic and Extended Basic Unravelled books in order to get a full explanation of these ROM calls A complete memory map of the system operating variables is given at the beginning of the DOS assembly listing and a symbol table showing the location of all referenced routines and tables is at the end of the listing All of the ROMs used in the Color Computer have undergone revisions since the inception of the machine The disk ROMs have undergone the most severe change of the three ROMs The first disk RON Revision 1 0 used only 6K of the available 8K RON space and the second disk RON Revision 1 1 used approximately 6 5K of ROM with the majority of the 5K increase going to correct bugs in the first ROM and to add the DOS command to Disk Basic That leaves 1 5K of free ROM space in the latest version of Disk Basic which is available to the user if he has a 64K machine It is not recommended that
337. ector numbers in DCTRK amp DSEC A B C779 C749 MULTIPLY ACCD BY NINE multiply the value in ACCD by nine A B C784 C754 CONVERT SECTORS TO GRANULE enter with a total number of sectors in ACCD Convert this number into Fl DISK BASIC UNRAVELLED II APPENDIX F ORIGIN SPECTRAL ASSOC DISK ROUTINES AND ENTRY POINTS REVISED 12 26 1999 WALTER K ZYDHEK the number of complete granules 0 67 contained in that many sectors and return the count in ACCD A B X C79D C76D READ FAT DATA load the RAM image of the FAT with data from the disk Data will not be loaded into the RAM image if any disk files are OPEN A B X C7BF C78F FIND FREE GRANULE find the first free granule Enter with the granule at which to start the search in ACCB The found granule is marked with a C to indicate that it is the last granule in the file and the number of the granule is returned in ACCA C807 C7D7 FILE OPEN CHECK check all active files to make sure a file is not already OPEN Enter with ACCA containing a file type to disable the 0 error for that file type A B X U C935 C887 GET FILENAME EXT DRIVE FROM BASIC get the file name extension and drive number from a BASIC input line A B X U CDIE CC44 GET GRANULE COUNT enter with the granule number of the first granule in a file The number of whole granules in that file will be returned in ACCA ACCB will contain the data from the last granule in the file A B X CEA8 CDCC GET FREE GRANULE CO
338. ectors 3 11 The remaining sectors are not used by the DOS in the current or past revisions to the BASIC ROMs Each directory entry requires 32 bytes so eight directory entries will fit in one sector for a total of 72 maximum directory entries However one full granule is required for each directory entry and there are only 68 granules on a disk so that only 68 directory entries files may exist on a disk at any time The format of the 32 byte directory entry is as follows Byte Description 0 7 Filename which is left justified and blank filled If byte is 0 then the file has been KILL ed and the directory entry is available for use If byte is FF then the entry and all following entries have never been used 8 10 Filename extension 11 File type BASIC 1 BASIC data 2 Machine language 3 Text editor source 12 ASCII flag binary or crunched BASIC FF ASCII 13 Number of the first granule in the file 14 15 Number of bytes used in the last sector of the file 16 31 Unused future use DIRECTORY CRASHES There has been much talk in the Color Computer media about so called directory crashes These directory crashes seem to occur at random and will result in an unreadable directory which causes the loss of all data on the directory at the time The typical solution for this problem seems to be keeping a spare copy of the directory on an unused portion of the disk so that if a crash occurs the spare copy may be used to rest
339. ed to keep track of how many sectors from the beginning of a random file the current data being processed is located These bytes are used to determine if the data in the FCB data buffer are valid for the current record number being processed The high order byte is often set to FF to cause new data to be read into the FCB data buffer 15 FCBFLG Single byte GET PUT flag GET 1 PUT 16 Two unused bytes 21 FCBGET Double byte quantity containing the number of characters which have been pulled out of the current record These bytes are set to zero every time a record is stored in PUT or retrieved from GET a file 23 FCBPUT Double byte quantity containing the number of characters which have been PUT into the current record These bytes are set to zero every time a record is stored in PUT or retrieved from GET a file DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK Listed below are the definitions of the non common FCB control bytes as used by sequential files OFFSET 5 FCBCPT 7 FCBREC 9 15 16 FCBCFL 17 FCBCDT 23 FCBDFL 24 FCBLFT DESCRIPTION Single byte quantity pointing to the next character to be processed for input files When this byte is incremented to zero it indicates that the data buffer needs to be refilled For output files this byte is used to indicate that 256 bytes of the last sector in the file have been used in case a DISK FUL
340. h commands as MERGE COPY SAVE LOAD etc This FCB may be accessed by the user under machine language but care must be exercised to insure that none of the BASIC commands which utilize the system FCB are used when doing 50 The OPEN command is used to initialize the FCB for disk I 0 It keeps track of which byte sector track and granule is currently being accessed by the DOS for the file controlled by the FCB When disk I 0 has been completed the FCB is deactivated with the CLOSE command When an FCB is closed it is available for use by another file and once the FCB is used by another file all of the information used by the previous file is lost Some of the information must be saved since the user may want to reopen the same file for use later on Only six bytes from the FCB must be saved in order to be able to reinitialize an FCB These six bytes are the file type 1 ASCII flag 1 first granule in file 2 and the number of bytes used in the last sector 2 and they are stored in the directory A two byte quantity is used to store number of bytes used in the last sector since the number of bytes may be any number from to 256 100 Listed below are those FCB control bytes which are common to all types of files and their relative offset from the start of the FCB OFFSET NAME DESCRIPTION g FCBTYP Single byte code representing the file type under which the file was opened It may not have any relationship to the actual type of data st
341. m TYPE WRITE data field address mark 1 Deleted Data Mark 0 FAULT Data Mark On any Write It indicates a Write Fault This bit is reset when updated When set it indicates that the desired track sector FOUND RNF or side was not found This bit is reset when updated S3 CRC ERROR If S4 is set an error is found in one or more ID fields otherwise it indicates error in data field This bit is reset when updated S2 LOST DATA When set it indicates the computer did not respond to DRQ in one byte time This bit is reset to zero when updated S1 DATA This bit is a copy of the DRQ output When set it REQUEST indicates the DR is full on a Read Operation or the DR is empty on a Write operation This bit Is reset to zero when updated 50 BUSY When set command is under execution When reset no command Is under execution The disk variable DCSTA is not a true reflection of the contents of the FDC status register Disk Basic filters the status bits of the FDC status register and allow only those errors which Disk Basic requires to pass through 16 DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK MACHINE LANGUAGE FILE INPUT OUTPUT The DOS uses a special format for transferring binary files to and from the disk The format is fairly simple and straightforward and allows the loading of non contiguous blocks of memory from the same file The only problem is that Radio
342. nt to PLEASE give freely These books are for educational informational use only These books are no longer in publication and Spectral Associates no longer in business Do not use these books for financial gain as that would most certainly abuse the Copyright Laws that I have already bruised by re producing them Other than that enjoy the books I II add more information to them as I get it I plan on adding more Memory Map information as well as hardware info in the coming months But for now take advantage of this fine resource Walter K Zydhek DISK BASIC UNRAVELLED II INTRODUCTION ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK INTRODUCTION Disk Basic Unravelled will provide the reader with a complete detailed and fully commented assembly listing of the Disk Operating System DOS of Radio Shack s COLOR BASIC It is not within the scope of this book to teach the neophyte how to construct a DOS or to be able to completely understand the COLOR DOS The reader will need to have a basic knowledge of 6809 assembly language programming to be able to take full advantage of the opportunities which this book presents It is also assumed that the reader is familiar with the contents of the Disk Basic Users manual which contains a general description of the overall operation of Disk Basic and much useful information concerning the physical and logical format of the tracks amp sectors Disk Basic Unravelled will allow the reader to b
343. ore the directory A couple of years ago we were having the same problem and Rodger Rosenbaum genius extraordinaire solved the problem by finding the bug in the disk controller which was causing it Given below is the hardware fix which will cure the directory crash problem Spectral Associates does not guarantee nor does it recommend this fix and Spectral Associates will not assume any responsibility or liability for damages caused should any person or entity use or attempt to use the fix 11 DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK User Supplied LS32 FD1793 U13 NOTE This fix is only valid for the old style disk controllers The new 5 volt only controllers do not suffer from this problem and should not be modified Add the wires shown with bold black lines In order to install the fix without cutting traces on the PC board gently lift IC s U9 and U13 out of their Sockets bend pins 6 and 4 respectively out and replace the IC s in their sockets Then solder wires to the bent out pins 12 DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK 1793 FLOPPY DISK CONTROLLER DESCRIPTION The 1793 Floppy Disk Controller FDC is the heart of the disk controller card which interfaces the Color Computer to the disk drive Only the basic knowledge of the FDC in order to understand the operation of Disk Basic is
344. ored in the file a sequential file may be opened as a random file and vice versa The allowed codes are 10 Sequential input 20 Sequential output 40 random 0 killed file 1 FCBDRV Single byte quantity defining the drive number where the file is located 0 3 2 FCBFGR Single byte quantity defining the first granule used by the file 3 FCBCGR Single byte quantity defining the current granule being accessed by the FCB DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK 4 FCBSEC Single byte quantity defining the current sector being accessed by the FCB 1 9 18 FCBDIR Single byte quantity defining the directory entry number for this file 0 71 19 FCBLST Double byte quantity containing the number of bytes used by this file in the last sector of the file Listed below are the definitions of the non common FCB control bytes as used by random files OFFSET DESCRIPTION 5 FCBCPT Unused 6 FCBPOS Print position always zero 7 FCBREC Double byte quantity containing the current record number being used by the FCB 8 FCBRLN Double byte quantity containing the length of a record 11 FCBBUF Double byte quantity containing a pointer to the absolute address of the start of random file buffer which is exactly one record length long 13 FCBSOF Double byte quantity containing the sector offset to the current position in the record These bytes are us
345. ot enough space in the random file buffer area to hold one record length an OB out of buffer space error will be generated Immediately after the random file buffer area is the area reserved for file control blocks The number of available FCBs may be changed by the FILES command Each FCB requires 281 bytes of RAM and there is always one more FCB the system FCB reserved than the number of FCBs requested by the FILES command 18 DISK BASIC UNRAVELLED II CODO 0008 0000 001 000 000 0020 003A 045E 2600 0006 0019 0020 0100 0012 1200 0023 004 0044 0119 0010 0020 0040 0018 0000 2000 CODO DFFF 0062 0029 0020 0000 0002 0003 0005 0080 0040 0020 0010 0008 0004 0002 0001 0020 0010 0008 0004 0002 0001 0030 0031 0032 0033 0034 0035 0036 0037 EQU 000 5 EQU 8 CL EQU D ESC EQU 1B EQU A FORMF EQU C SPACE EQU 28 STKBUF EQU 58 DEBDEL EQU 45E LBUFMX EQU 259 MAXLIN EQU FA DOSBUF EQU 2600 FATCON EQU 6 FCBCON EQU 25 DIRLEN EQU 32 SECLEN EQU 256 SECMAX EQU 18 TRKLEN EQU SECMAX SECLEN TRKMAX EQU 35 FATLEN EQU 6 TRKMAX 1 2 GRANMX EQU TRKMAX 1 2 FCBLEN EQU SECLEN 25 INPFIL EQU 10 OUTFIL EQU 20 RANFIL EQU 540 SUPER EXTENDED BASIC EQUATES ROWMAX EQU 24 RAMLINK EQU HRESSCRN EQU 2000 HRESBUFF EQU 000 TMPSTACK EQU DFFF EBHITOK EQU 62 EBHISTOK EQU 29 CURCHAR EQU SPACE HBUFF
346. rancois for reminding me of the name I had a couple of close friends that helped me explore the world of CoCo and by this time I knew that my CoCo would be my friend forever I give special thanks to Steve Cohn who helped me get started with ADOS Two other people whose names I can t remember were very beneficial to my mastering of the CoCo Shortly after getting my CoCo 3 I started BBS ing Wow a whole new world My knowledge just kept growing DISK BASIC UNRAVELLED II FOREWORD ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK A few years later I moved to Oregon then to Phoenix Arizona to attend school I studied Electronics Technology at Phoenix Institute of Technology In the second year we studied Micro processor Theory For our labs we just happen to use the Tandy Color Computer 3 for studying 6809 Processors I had it made In this class I added an EPROM programmer reader to my list of hardware My favorite instructor Gary Angle amp I spent many hours sharing information on the CoCo At one time we shared a joint project to disassemble ROMs from industrial machinery which used the 6809 Processor Using the CoCo to read the ROMs to work with I even had a BBS running under 0S 9 at one time RiBBS I think it was Very similar to QuickBBS and RemoteAccess BBS for the PC In 1991 I finally converted over to PC but never forgetting my CoCo About 5 years ago My CoCo and all related material was stolen from me And
347. s format a was used This was done in the original but not all comments stuck to this format 2 I have renumbered all the line numbers Each Appendix with code starts at Line 0001 3 Some spell checking and context checking was done to verify accuracy 4 I used the Letter Gothic MT Bold Font This allows for display of Slashed Zeros I thought it important to be able to distinguish between 0 and 0 5 All the Hex code now shows the Opcodes There were other minor changes that were made to make viewing a little better If any discrepancies arise please let me know so that I may correct the errors I can be contacted at mailto wzydhek internetcds com Special Thanks to Jean Frangois Morin for pointing out those Oops to me Id like to also thank those who have either given me or loaned me their copy of the original Unravelled Series About Me My name is Walter K Zydhek I ve been a Computer Hobbyist since 1984 when I received my 1 Tandy Color Computer 2 for Christmas It had 32K of ram Cassette and one Cartridge I quickly learned to program in Basic and then moved into Assembly Over the next few years I saved to purchase the Multi Pak Interface Disk Drives Modem 0S 9 and various Odds and Ends I moved to Tampa Florida and in the move My CoCo was damaged I then replaced it with the CoCo 3 WOW what a difference I added the 512K Ram Upgrade A CM 8 color monitor and joined the Carolwood CoCo Club Thanks Jean F
348. set up to save data on the disk in 35 tracks Each track is composed of 18 sectors and each sector contains 256 bytes The DOS treats this raw data as 68 granules with each granule containing 9 sectors 2 granules per track The one remaining track is used for the directory and the file allocation table FAT DISK BASIC UNRAVELLED II DESCTIPTION OF DISK BASIC ORIGINAL SPECTRAL ASSOC REVISED 12 26 99 WALTER K ZYDHEK FILE CONTROL BLOCK STRUCTURE The File Control Block FCB is used by the DOS to control the transfer of data between the computer s RAM and the disk It consists of 25 control bytes and a 256 byte data buffer The 25 control bytes may have different functions if the file is a random direct sequential input or sequential output file The data buffer is used to collect data so that the disk 1 0 will only be required when there is a full sector 256 bytes of data to be input or output to the disk The use of this buffer speeds up the overall disk I 0 by cutting down on the number of times that actual disk accesses are required The number of FCBs allowed is set by the FILES command which initializes the direct page variable FCBACT the maximum number of FCBs allowed The DOS always sets up a system FCB directly above the last allocated FCB which is reserved for the exclusive use of the DOS and is not accessible to the user through BASIC The system FCB is used when the system requires an FCB for disk 0 during the execution of suc
349. sk is the primary system for mass storage in microcomputers A floppy disk is a round piece of magnetic tape shaped like a record on which data is magnetically recorded Somehow the data which is stored on the disk must be capable of being transferred to and from the computer s random access memory This is a very complex task which requires many things in order to be done properly There must be a mechanical method of moving the disk and transferring the magnetic data to and from the disk This job is performed by the disk drive Also there must be a method of formatting and transferring data to and from the computer s RAM and the disk drive In the Color Computer the disk controller board does this The majority of the work done by the disk controller is performed by the 1793 Floppy Disk Controller FDC which is an integrated circuit as complicated as the 6809 chip In order to make the process orderly and logical there must be an overall controlling format or procedure for sending data to and from the 1793 which will only provide primitive transference of blocks of data to and from the drive The Disk Operating System DOS provides this overall control function by establishing a format for storing data and programs on the disk The DOS provides a method of storing or retrieving blocks or single bytes of data to or from the disk drive The 1793 is capable of storing data on a disk in many different formats For the Color Computer the 1793 is

Download Pdf Manuals

image

Related Search

Related Contents

GenePix 4000B User Guide Rev. E  Sony : Informations produit : SNT-EX154  LX-300ESB 型 取扱説明書 - レイシー  P5264 user Manual  Contents Finger Print Switch  Catamaran Bait Boat    domitop h - SGC Servicios  Nested PCR - Cód. BANG07-02, BANG07-05 e CTRG07  Dusk to Dawn Light Control  

Copyright © All rights reserved.
Failed to retrieve file