Acorn Disc and Network Filing Systems - DNFS 3.00 ================================================= Assembly listing generated by TurboMASM from the original Acorn source. Source: https://github.com/stardot/AcornDNFSv300/ Source: https://www.4corn.co.uk/articles/65hostandmos/ Branch slack calculated by Greg Cook with slack.pl (attached), 16 September 2023 Columns, left to right: (1) Filename, (2) line number and (3) hex address of limiting branch instruction (4) Direction of limiting branch: ^=backwards, v=forwards, Space=N/A (5) Hex number of bytes that may be inserted at this address, or between the branch instruction and the target SYMBOL at this address (NB: a more generous limit than shown may apply on the far side of the symbol.) --=no limit. (6) Current source filename, (7) line of assembly listing which typically starts with source line number, hex address and optional hex equate. *emulateturbo Acorn 6502 Tube 6502 Emulator OS 0.64 (19 Oct 1988) HIBASIC >*exec print1 >*| -> AsmRom >*TurMasm TURBOMASM Acorn Macro assembler 1.15 Action : PRINT ON Action : WIDTH 127 Action : length 127 Action : ASM NFS00 Macro library : Acorn macro assembler Page 1 Pass 1 Pass 2 0001 0000 0002 0000 TTL ECONET Version III - High level source > NFS00 0003 0000 OPT &01 0004 0000 ; This is an upgrade of the existing ECONET version II 0005 0000 ; for use with the BBC microcomputer. These sources deal 0006 0000 ; with the high level function of the network and assume 0007 0000 ; the existence of an underlying low-level software doing 0008 0000 ; all of the hard work such as transmission of packets. 0009 0000 ; The commenting of the sources may well give some clue as 0010 0000 ; to the intended function of the code. If the entire 0011 0000 ; implementation is finished by the end of April 1982, I 0012 0000 ; for one will be very surprised. 0013 0000 ; 0014 0000 ; 0015 0000 ; 0016 0000 ; VVV VVV #### #### #### 0017 0000 ; VVV VVV ## ## ## 0018 0000 ; VVV VVV ## ## ## 0019 0000 ; VVV VVV ## ## ## 0020 0000 ; VVV VVV ## ## ## 0021 0000 ; VVVVVV %% ## ## ## 0022 0000 ; VVVV %% #### #### #### 0023 0000 ; 0024 0000 ; 0025 0000 OPT 3 0046 0000 OPT VIII0 Acorn macro assembler Page 2 System Organisation 0047 0000 0048 0000 0000 YES * &0000 0049 0000 FFFF NO * &FFFF ;conditional assembly 0050 0000 0051 0000 0052 0000 0000 BBC * YES ; Assemble for BBCpu 0053 0000 0000 ROM * YES ; Sideways ROM 0054 0000 0000 LOWLVL * YES ; Is Low-level incorporated 0055 0000 0000 REG4XX * YES ; Is Register 1 available 0056 0000 0057 0000 ORG &8000 0058 8000 9630 LOWORG * . + &1630 ;low level code start address 0059 8000 0060 8000 < &00 ;get source from drive zero 0061 8000 > &02 ;object code to drive two 0062 8000 0063 8000 0064 8000 ; *** SYSTEM CALLS *** 0065 8000 FFE0 OSRDCH * &FFE0 0066 8000 FFE3 OSASCI * &FFE3 0067 8000 FFEE OSWRCH * &FFEE 0068 8000 FFE7 OSCRLF * &FFE7 0069 8000 FFE7 OSNEWL * OSCRLF 0070 8000 FFF7 OSCLI * &FFF7 0071 8000 FFF4 OSBYTE * &FFF4 0072 8000 FFF1 OSWORD * &FFF1 0073 8000 9F9D DISC * &9F9D ;* was $9FC8 DFS 0074 8000 BFF0 HEXOUT * &BFF0 ;** In DFS Rom now ** 0075 8000 0076 8000 ; *** FILE SERVER CODES *** 0077 8000 0078 8000 0001 FCSAVE * &0001 ;save 0079 8000 0002 FCLOAD * &0002 ;load 0080 8000 0003 FCEXAM * &0003 ;examine 0081 8000 0004 FCCHDR * &0004 ;catalogue 0082 8000 0005 FCCMND * &0005 ;load as command 0083 8000 0006 FCFIND * &0006 ;find/open 0084 8000 0007 FCSHUT * &0007 ;close 0085 8000 0008 FCBGET * &0008 ;getbyte 0086 8000 0009 FCPUTB * &0009 ;putbyte 0087 8000 000A FCGBYS * &000A ;getbytes 0088 8000 000B FCPBYS * &000B ;putbytes 0089 8000 000C FCGARG * &000C ;read pointer/extent of open file 0090 8000 000D FCSARG * &000D ;set the pointer/extent of open file 0091 8000 000E FCDISC * &000E ;returns the current discs 0092 8000 000F FCUSRS * &000F ;returns logged-on users 0093 8000 0011 FCEOF * &0011 ;end-of-file 0094 8000 0012 FCREAD * &0012 ;read args 0095 8000 0013 FCSET * &0013 ;set args 0096 8000 0014 FCDEL * &0014 ;code for delete 0097 8000 0015 FCUSER * &0015 ;read user environment 0098 8000 0016 FCOPT * &0016 ;set AUTOBOOT option number 0099 8000 0017 FCBYE * &0017 ;logoff (*BYE) code 0100 8000 0101 8000 0102 8000 ; *** PORTS *** 0103 8000 0104 8000 ;large fudge due to the need to interface 0105 8000 ;with the version 2 file server 0106 8000 0099 PCMND * &0099 0107 8000 0090 PREPLY * &0090 0108 8000 0091 PSAACK * &0091 0109 8000 0092 PLDATA * &0092 0110 8000 0093 PREMOT * &0093 ;remote port 0111 8000 00D1 PBLOCK * &00D1 ;printer port for blocks 0112 8000 0113 8000 ; The ports are arranged in the space above #B0 (say), 0114 8000 ; to allow the user a clear field from 1 to #AA. If you 0115 8000 ; put this in a manual it looks as if you've thought about 0116 8000 ; it. Obviously more ports can be accomodated, it's just 0117 8000 ; that I happen to like ports with the same digit 0118 8000 ; repeated, like #EE. 0119 8000 0120 8000 ; *** Delays for various operations eg. load,save *** 0121 8000 0122 8000 002A DLOAD * &002A ;all in seconds, all the same for now 0123 8000 002A DFINAL * &002A 0124 8000 0014 DLODBK * &0014 0125 8000 0014 DREPLY * &0014 0126 8000 0060 FSDELY * &0060 ;ms delay here 0127 8000 002A DSAVE * &002A 0128 8000 0129 8000 ; *** Operating System Vectors *** 0130 8000 0131 8000 0212 FILVEC * &0212 0132 8000 0133 8000 ; *** Error numbers *** 0134 8000 0135 8000 00A0 LINJAM * &A0 0136 8000 00A1 NETER * &A1 0137 8000 00A2 NOLISE * &A2 0138 8000 00A3 NOCLK * &A3 0139 8000 00A4 TXCBER * &A4 0140 8000 0011 ESCER * &11 0141 8000 00CB OPTER * &CB 0142 8000 00A5 NOREPE * &A5 0143 8000 00D6 NOTFND * &D6 0144 8000 0145 8000 ; *** A few constants *** 0146 8000 0147 8000 0000 ZERO * &0000 0148 8000 0001 ONE * &0001 0149 8000 0002 TWO * &0002 0150 8000 0003 THREE * &0003 0151 8000 0004 FOUR * &0004 0152 8000 0005 FIVE * &0005 0153 8000 0006 SIX * &0006 0154 8000 0007 SEVEN * &0007 0155 8000 0008 EIGHT * &0008 0156 8000 0009 NINE * &0009 0157 8000 0158 8000 0020 HAND * &0020 0159 8000 00FE FS * &FE ;default fileserver 0160 8000 00EB PS * &EB ;default printer station 0161 8000 00A8 ERRCUT * &00A8 ;error cutoff for FS 0162 8000 0163 8000 ;*** selectors in Control block *** 0164 8000 0165 8000 0004 LPTR * &0004 0166 8000 0008 HPTR * &0008 ;hi pointer into Tx/Rxcb 0167 8000 0002 DESTN * &0002 ;destination part of packet Acorn macro assembler Page 3 System Organisation 0168 8000 0001 PORT * &0001 ;port part of packet 0169 8000 0170 8000 ;*** Context info held in page #E00 *** 0171 8000 0172 8000 0E00 FSLOCN * &0E00 ;put at start of page E 0173 8000 0E02 URD * FSLOCN +&02 0174 8000 0E03 CSD * URD +&01 0175 8000 0E04 LIB * CSD +&01 0176 8000 0E05 OPT * LIB + &01 ;BOOT option number 0177 8000 0E06 MESS * OPT +&01 ;flag to indicate messages on,off 0178 8000 0E07 EOF * MESS +&01 ;flags for EOF operation 0179 8000 0E08 SEQNOS * EOF +&01 ;sequence numbers for Byte stream 0180 8000 ;*** Context is defined by these locations *** 0181 8000 0E09 ERROR * SEQNOS +&01 ;slot for last unknown error 0182 8000 0E0A SPARE * ERROR + &01 0183 8000 0E0A JCMNDP * SPARE 0184 8000 0185 8000 ;*** Manifests for useful things *** 0186 8000 0187 8000 000D CR * &000D ;carriage return 0188 8000 0020 SPACE * &0020 ;space 0189 8000 00FF FILLER * &00FF ;padding for 4-byte addresses 0190 8000 0080 TXFLAG * &0080 ;OR this with flag byte before xmit 0191 8000 007F RXRDY * &007F ;set flag byte to this value for reception 0192 8000 00FF FSTRY * &00FF ;number of retries 0193 8000 8000 SCREND * &8000 ;end of screen memory 0194 8000 0012 RXCBS * &12 ;number of RXCBs available 0195 8000 0196 8000 ; *** OSBYTE Manifests and the like *** 0197 8000 0198 8000 00D9 MARK * &00D9 0199 8000 00DA FSPACE * &00DA 0200 8000 0201 8000 ; *** Function codes for Immediate operations *** 0202 8000 0203 8000 0081 PEEK * &0081 0204 8000 0082 POKE * &0082 0205 8000 0206 8000 ; *** Zero page workspace, starting from #B8 *** 0207 8000 0208 8000 0099 PFLAGS * &99 ;Printer status flags 0209 8000 0210 8000 009A TXCBP * &9A ;pointer used with lo level 0211 8000 009A RXCBP * TXCBP ;complement to $23D in V2 0212 8000 0213 8000 00A0 LTXCBP * &A0 0214 8000 0215 8000 0D61 PBUFFP * &D61 ;*** dedicated area somewhere *** 0216 8000 0D62 TXCLR * &D62 ;flag to show Tx in progress 0217 8000 0D63 LSTAT * &D63 ;copy of PEEK, POKE status 0218 8000 0D64 LFLAG * &D64 ;flag byte used for T/Rx 0219 8000 0D65 OLDJSR * &D65 ;old copy of JSR buffer protection bits 0220 8000 0D67 TBFLAG * &D67 ;TUBE present flag, held by BRIAN 0221 8000 0222 8000 ;**** work area for OSWORD, SROMs & VIEW **** 0223 8000 0224 8000 00A8 UTIL0 * &A8 0225 8000 00A9 UTIL1 * UTIL0 + 1 0226 8000 00AA UTIL2 * UTIL1 + 1 0227 8000 00AB UTIL3 * UTIL2 + 1 0228 8000 00AC UTIL4 * UTIL3 + 1 0229 8000 00AD UTIL5 * UTIL4 + 1 0230 8000 0231 8000 ;**** Low level variables etc **** 0232 8000 0233 8000 00B0 WORK * &B0 ;space for variables 0234 8000 00B2 W1 * WORK +&02 0235 8000 00B3 W2 * W1 +&01 ;spare work variables 0236 8000 0237 8000 ;**** NB Two bytes free here ($CD,$CE) **** 0238 8000 0239 8000 00B8 JWORK * &B8 ;three bytes used for timing purposes 0240 8000 00B9 UNUSED * JWORK +&01 ;two spare bytes here ***** 0241 8000 00A8 ROMY * UTIL0 0242 8000 00A9 ROMA * UTIL1 0243 8000 00B9 CRFLAG * UNUSED ;used in two column cat's 0244 8000 00BA SPOOL1 * UNUSED + 1 ;used in RANDOM access 0245 8000 00BB TEMPX * JWORK +&03 ;start of 0-page area 0246 8000 00BC TEMPY * TEMPX +&01 ;save Y,forms a pointer with X 0247 8000 00BD TEMPA * TEMPY +&01 ;save monkeying with the stack 0248 8000 00BE POINTR * TEMPA +&01 ;a nice area for a pointer 0249 8000 00C0 TEMP0 * POINTR +&02 ;space used in OSWORD calls 0250 8000 00C0 TXCB * POINTR +&02 ;temp only 0251 8000 00C0 RXCB * TXCB ;note blocks overlap exactly 0252 8000 00CF SPOOL0 * RXCB +&0F ;last byte in 0-page, holds handle 0253 8000 0097 ESCAP * &97 ;flag to determine if escapable 0254 8000 ;** 9/2/84 moved from $CC due to printing clash 0255 8000 00FF ESCADR * &00FF ;flag for escape 0256 8000 0257 8000 ; *** RAM allocation of two pages, #0E and #0F *** 0258 8000 0259 8000 0F00 BIGBUF * &0F00 0260 8000 0F05 TXBUF * BIGBUF +&05 ;start of TX data area 0261 8000 0F05 RXBUF * TXBUF 0262 8000 0FFF RXBUFE * BIGBUF +&FF ;buffer size is 256 0263 8000 0F00 HDRREP * BIGBUF 0264 8000 0F01 HDRFN * HDRREP +&01 ;function code 0265 8000 0F02 HDRURD * HDRFN +&01 ;urd slot 0266 8000 0F03 HDRCSD * HDRURD +&01 ;csd slot 0267 8000 0F04 HDRLIB * HDRCSD +&01 ;lib slot 0268 8000 0F03 RXCC * RXBUF -&02 ;control code 0269 8000 0F04 RXRC * RXCC +&01 ;return code 0270 8000 0271 8000 0E10 CMNDP * &E10 ;pointer to rest of command line 0272 8000 0E0D RSTAT * JCMNDP +&03 0273 8000 0274 8000 ;**** Special buffer for BGET, BPUT **** 0275 8000 0276 8000 0FDC PUTB * &0FDC ;buffer for single byte random access 0277 8000 0FDC PUTB1 * PUTB 0278 8000 0FDD PUTB2 * PUTB1 +&01 0279 8000 0FDE PUTB3 * PUTB2 +&01 0280 8000 0FDF PUTB4 * PUTB3 +&01 0281 8000 0FDD GETB2 * PUTB2 0282 8000 0FDE GETB3 * PUTB3 0283 8000 0FDF GETB4 * PUTB4 ;buffer used for GETBYT as well 0284 8000 0285 8000 ;**** Area reserved, not to be used again **** 0286 8000 0287 8000 0E0E TARGET * RSTAT +&01 0288 8000 0E30 FNAME * CMNDP +&20 ;space to hold filename passed Acorn macro assembler Page 4 System Organisation 0289 8000 0E10 VDATA * TARGET +&02 0290 8000 FE00 R6845 * &FE00 0291 8000 FE01 D6845 * &FE01 0292 8000 0293 8000 000A ROFF * &000A 0294 8000 0295 8000 0000 RWRITE * &0000 0296 8000 0001 RWORD * &0001 0297 8000 0002 RBYTE1 * &0002 0298 8000 0003 RBYTE2 * &0003 0299 8000 0300 8000 ;*** Manifest offsets in the static area (2) *** 0301 8000 0302 8000 0000 PRXCB * &00 ;offset from start of page 0303 8000 0000 PTXCB * &0000 0304 8000 0002 PSLOCN * PTXCB +&02 ;located inside the CB 0305 8000 0018 UFSCB * 12 * 2 ;dedicated CB for DOFSOP's 0306 8000 000C RTXCB * &000C 0307 8000 00D9 BUFFER * RXCBS * &0C +&1 ;lowest area available 0308 8000 00DA DATA1 * BUFFER +&01 0309 8000 00DB DATA2 * DATA1 +&01 0310 8000 00DC DATA3 * DATA2 +&01 ;pointers into the 4 byte data area 0311 8000 00DD DATA4 * DATA3 +&01 0312 8000 00E9 VBUFF * &E9 ;offset in page2 0313 8000 0314 8000 ;*** Manifest offsets in the static area (1) *** 0315 8000 0316 8000 0000 SAVEAR * &0000 ;save area over OSWORD calls 0317 8000 0004 STAT2 * SAVEAR +&04 ;status byte 0318 8000 0005 SAVELO * STAT2 +&01 ;low level save area 0319 8000 0015 SAVEHI * SAVELO +&10 ;high level save area 0320 8000 001F PBUFF * SAVEHI +&0A ;start of printer buffer 0321 8000 0080 JSRBUF * &0080 ;start of JSR buffer 0322 8000 007F JSRSIZ * JSRBUF -&01 ;counter for JSR args 0323 8000 006F UTXCB * JSRSIZ -&10 ;user TXCB 0324 8000 0050 PSIZE * UTXCB - PBUFF ;as much space as is available 0325 8000 0326 8000 ;*** dedicated pointers *** 0327 8000 0328 8000 009C PAGE1 * &009C ;dedicated pointer 0329 8000 009E WORKP1 * &009E ;pointer to workarea 0330 8000 0331 8000 ;*** MOS 0-page save area for registers *** 0332 8000 0333 8000 00F0 PARMX * &00F0 0334 8000 00F1 PARMY * &00F1 0335 8000 00EF PARMA * &00EF ;parameters passed in OSBYTE,WORD 0336 8000 0337 8000 ;*** TUBE registers and routines *** 0338 8000 0339 8000 FEE5 REG3 * &FEE5 ;write data to here 0340 8000 0406 TBINIT * &0406 ;initialise the TUBE 0341 8000 00C3 TBSEMA * &C3 0342 8000 0083 TCSEMA * &83 ;claim and release protocol 0343 8000 0344 8000 ;*** MOS string reading routines *** 0345 8000 0346 8000 FFC2 GSINIT * &FFC2 0347 8000 FFC5 GSREAD * &FFC5 0348 8000 0349 8000 ;*** Control chars in data tables *** 0350 8000 0351 8000 00FE CBSTOP * &FE 0352 8000 00FD CBSKIP * &FD 0353 8000 00FC CBFILL * &FC 0354 8000 0355 8000 ;*** SEI-state 0-page *** 0356 8000 0357 8000 00FA SEI1 * &FA 0358 8000 00FB SEI2 * &FB 0359 8000 0360 8000 LNK NFS01 0001 8000 0002 8000 ; > NFS01 0003 8000 TTL Sideways ROM service routines 0004 8000 OPT ROMP Acorn macro assembler Page 5 Sideways ROM service routines 0005 8000 ;(C) 1981 ACORN Computers Limited 0006 8000 0007 8000 FFFF FALSE * &FFFF 0008 8000 0009 8000 ; OS routine indirections 0010 8000 021E FSCVEC * &021E 0011 8000 0012 8000 001B rFILID * &1B 0013 8000 0014 8000 0015 8000 ; ROM routine addresses 0016 8000 FF00 ROMNMI * &FF00 0017 8000 FF03 ROMBRK * ROMNMI+&3 0018 8000 FF06 ROMIRA * ROMBRK+&3 0019 8000 FF09 ROMIRB * ROMIRA+&3 0020 8000 FF0C ROMCOM * ROMIRB+&3 0021 8000 FF0F ROMBYT * ROMCOM+&3 0022 8000 FF12 ROMWRD * ROMBYT+&3 0023 8000 FF15 ROMWRC * ROMWRD+&3 0024 8000 FF18 ROMRDC * ROMWRC+&3 0025 8000 FF1B ROMFIL * ROMRDC+&3 0026 8000 FF1E ROMARG * ROMFIL+&3 0027 8000 FF21 ROMBGT * ROMARG+&3 0028 8000 FF24 ROMBPT * ROMBGT+&3 0029 8000 FF27 ROMGPB * ROMBPT+&3 0030 8000 FF2A ROMFND * ROMGPB+&3 0031 8000 FF2D ROMFSC * ROMFND+&3 0032 8000 FF30 ROMEVT * ROMFSC+&3 0033 8000 FF33 ROMVDU * ROMEVT+&3 0034 8000 FF36 ROMUPT * ROMVDU+&3 0035 8000 0036 8000 ; OSBYTE codes 0037 8000 007A FXSCAN * &7A ;scan keyboard 0038 8000 0077 FXSPEX * &77 ;close SPOOL and EXEC files 0039 8000 00A8 FXROMI * &A8 ;ROM 3-byte indirection origins 0040 8000 0078 FXOKEY * &78 ;set OKEY 0041 8000 00FD FXRSET * &FD ;reset type 0042 8000 0043 8000 ; MOS variables 0044 8000 00F2 LINE * &00F2 0045 8000 00F4 ROMID * &00F4 0046 8000 00F6 ROMPTR * &00F6 0047 8000 0048 8000 FFFF dA * FALSE 0049 8000 00A0 START * &00A0 0050 8000 00A2 ADDRL * START +&02 0051 8000 00A3 ADDRH * ADDRL +&01 0052 8000 00A4 TIMOUT * ADDRH +&01 0053 8000 00A9 END * TIMOUT +&05 0054 8000 0055 8000 TUBE 0056 8000 0400 RTUBE * &0400 ;other org 0057 8000 0128 WRAM * &0128 0058 8000 0700 SRAM * &0700 0059 8000 0000 ZRAM * &0000 0060 8000 0012 QRAM * ZRAM +&12 ;** 21/9/83 ** 0061 8000 0014 CLAIMT * QRAM +&02 0062 8000 0015 CLAIMER * CLAIMT +&01 0063 8000 0016 ZPTUBE * CLAIMER +&01 0064 8000 00FD REPTR * &00FD 0065 8000 00FF ESCFLG * &00FF 0066 8000 0202 BRKVEC * &0202 0067 8000 020E WRCVEC * &020E 0068 8000 0210 RDCVEC * &0210 0069 8000 0220 EVTVEC * &0220 0070 8000 FEE0 R1STAT * &FEE0 0071 8000 FEE1 R1DATA * R1STAT +&01 0072 8000 FEE2 R2STAT * R1DATA +&01 0073 8000 FEE3 R2DATA * R2STAT +&01 0074 8000 FEE4 R3STAT * R2DATA +&01 0075 8000 FEE5 R3DATA * R3STAT +&01 0076 8000 FEE6 R4STAT * R3DATA +&01 0077 8000 FEE7 R4DATA * R4STAT +&01 0078 8000 FFCE OSFIND * &FFCE 0079 8000 FFD1 OSGBPB * OSFIND +&03 0080 8000 FFD4 OSBPUT * OSGBPB +&03 0081 8000 FFD7 OSBGET * OSBPUT +&03 0082 8000 FFDA OSARGX * OSBGET +&03 0083 8000 FFDD OSFILE * OSARGX +&03 0084 8000 0085 8000 ; paged ROM origin 0086 8000 4C E1 80 ORG JMP RPROC ;Remote proc jump 0087 8003 4C F7 80 JMP THERE ;OS service routine 0088 8006 82 = &82 ;type byte (service ROM) 0089 8007 10 = COPYR ;offset pointer to copyright message 0090 8008 NAMES ;names to match on 0091 8008 83 BIN = &83 ;Binary version number 0092 8009 44 46 53 DISK = "DFS," 0093 800D 4E 45 54 NET = "NET" 0094 8010 COPYR 0095 8010 00 = ZERO ;terminator 0096 8011 28 43 29 = "(C)" 0097 8014 52 4F 46 ROFFL = "ROFF" 0098 8018 0099 8018 ERRTAB 0100 8018 00 = NLIST1 - MESTAB 0101 8019 0D = NLIST2 - MESTAB 0102 801A 18 = NLIST3 - MESTAB 0103 801B 27 = NLIST4 - MESTAB 0104 801C 31 = NLIST5 - MESTAB 0105 801D 31 = NLIST6 - MESTAB 0106 801E 31 = NLIST7 - MESTAB 0107 801F 39 = NLIST8 - MESTAB 0108 8020 45 = NRMSG - MESTAB 0109 8021 0110 8021 MCPEEK ;this area is peeked to determine the M/c info 0111 8021 01 = &01 ;BBCpu 0112 8022 00 = &00 ;Acorn M/c 0113 8023 60 = &60 ;=> kosher version (using reg. 4) 0114 8024 03 = &03 ;issue number 0115 8025 0116 8025 CASELO 0117 8025 0118 8025 SVLO ;lo-byte of service routine address 0119 8025 F5 = RTTS -&01 ;no-operation 0120 8026 BB = STATIC -&01 ;offer static workspace 0121 8027 C4 = DYNAM -&01 ;offer dynamic workspace 0122 8028 1C = BOOT -&01 ;offer bootstrap 0123 8029 B4 = NAME -&01 ;offer command name 0124 802A 3B = BRIANI -&01 ;unknown interrupt 0125 802B F5 = RTTS -&01 ;BRK Acorn macro assembler Page 6 Sideways ROM service routines 0126 802C 6E = FSBYTE -&01 ;OSBYTE call 0127 802D 86 = FSWORD -&01 ;OSWORD call 0128 802E 07 = HELP -&01 ;*HELP command 0129 802F F5 = RTTS - &01 ;Claim for static workspace 0130 8030 38 = BRIANQ - &01 ;Relinquish NMI, restore old user 0131 8031 35 = BRIANC - &01 ;call to claim NMI 0132 8032 F0 = NAME1 - &1 ;restart filing system 0133 8033 0134 8033 FC PRLO = CHARIN -&01 ;put chars into buffer 0135 8034 AE = REMOT - &01 ;initialise REMOTE 0136 8035 AA = CVIEW - &01 ;grab screen parameters 0137 8036 DC = RESET - &01 ;restart language 0138 8037 EC = RCHAR - &01 ;char from REMOTE 0139 8038 0140 8038 FTABLO 0141 8038 2B = OPTION -&01 ;(0) 0142 8039 AC = EOFR -&01 ;(1) end-of-file 0143 803A DB = CMNDR -&01 ;(2) 0144 803B 1A = DECODE -&01 ;(3) unrecognised command line 0145 803C DB = CMNDR -&01 ;(4) *RUN command 0146 803D 66 = CAT -&01 ;(5) catalogue request 0147 803E 50 = FSDIE - &01 ;(6) New filing system 0148 803F CA = HANDLE - &01 ;(7) bounds on handles 0149 8040 0150 8040 95 CTABLO = INFO -&01 0151 8041 37 = LOGIN -&01 0152 8042 38 = SDISC -&01 0153 8043 31 = SDIR -&01 0154 8044 E1 = CMND -&01 ;entry for load as command 0155 8045 2C = SLIB -&01 0156 8046 0157 8046 66 TABLO = TXPOLL -&01 0158 8047 6C = RXPOLL -&01 0159 8048 7C = DELCB -&01 0160 8049 BB = ROFFF - &01 0161 804A 0162 804A CASEHI 0163 804A 0164 804A SVHI ;hi-byte of service routine address 0165 804A 80 = /(RTTS -&01 ) 0166 804B 82 = /(STATIC -&01 ) 0167 804C 82 = /(DYNAM -&01 ) 0168 804D 82 = /(BOOT -&01 ) 0169 804E 81 = /(NAME -&01 ) 0170 804F 96 = /(BRIANI -&01 ) 0171 8050 80 = /(RTTS -&01 ) 0172 8051 80 = /(FSBYTE -&01 ) 0173 8052 8E = /(FSWORD -&01 ) 0174 8053 82 = /(HELP -&01 ) 0175 8054 80 = /(RTTS - &01 ) 0176 8055 96 = /(BRIANQ - &01 ) 0177 8056 96 = /(BRIANC - &01 ) 0178 8057 81 = /(NAME1 - &01 ) 0179 8058 0180 8058 84 PRHI = /(CHARIN -&01 ) 0181 8059 84 = /(REMOT -&01 ) 0182 805A 92 = /(CVIEW - &01 ) 0183 805B 84 = /(RESET - &01 ) 0184 805C 84 = /(RCHAR - &01 ) 0185 805D 0186 805D FTABHI 0187 805D 8A = /(OPTION -&01 ) ;(0) 0188 805E 88 = /(EOFR -&01 ) ;(1) 0189 805F 8D = /(CMNDR -&01 ) ;(2) 0190 8060 8C = /(DECODE -&01 ) ;(3) 0191 8061 8D = /(CMNDR -&01 ) ;(4) 0192 8062 8C = /(CAT -&01 ) ;(5) 0193 8063 83 = /(FSDIE - &01 ) ;(6) 0194 8064 86 = /(HANDLE - &01 ) ;(7) 0195 8065 0196 8065 8D CTABHI = /(INFO -&01 ) 0197 8066 8E = /(LOGIN -&01 ) 0198 8067 8E = /(SDISC -&01 ) 0199 8068 8E = /(SDIR -&01 ) 0200 8069 8D = /(CMND -&01 ) ;entry for load as command 0201 806A 8E = /(SLIB -&01 ) 0202 806B 0203 806B 8E TABHI = /(TXPOLL -&01 ) 0204 806C 8E = /(RXPOLL -&01 ) 0205 806D 8E = /(DELCB -&01 ) 0206 806E 81 = /(ROFFF -&01 ) 0207 806F 0208 806F 0005 PRTBLN * FTABLO - PRLO ;set table length 0209 806F FSBYTE ;call here on BYTE 0210 806F ;Y holds the call number 0211 806F ; Table of calls 0212 806F ; 50 = Poll Txcb 0213 806F ; 51 = Poll Rxcb 0214 806F ; 52 = Delete Rxcb 0215 806F ; 53 = Break Remote link 0216 806F 0217 806F A5 EF LDA PARMA ;old value 0218 8071 E9 31 SBCIM 49 ;check bounds 0219 8073 ; BMI RTTS 0220 8073 C9 04 CMPIM &04 0221 8075 B0 6C BCS RPROC1 0222 8077 AA TAX 0223 8078 0224 8078 A9 00 LDAIM 0 0225 807A 85 A9 STA ROMA ;claim call 0226 807C 0227 807C 98 TYA ;save Y 0228 807D A0 21 LDYIM TABLO - CASELO 0229 807F D0 66 BNE JMI ;do JMI 0230 8081 0231 8081 C8 READIN INY 0232 8082 LOGON ;called from DECODE as the FS number may 0233 8082 ;be embedded in the command line and should be extracted 0234 8082 ;and stored in FSLOCN. 0235 8082 0236 8082 B1 BB LDAIY TEMPX 0237 8084 C9 20 CMPIM SPACE 0238 8086 F0 F9 BEQ READIN 0239 8088 C9 3A CMPIM "9"+ 1 ;returns C=1 if no number 0240 808A B0 11 BCS PWFL1 0241 808C 20 77 86 JSR DECIN 0242 808F 90 07 BCC READEX ;found a '.' 0243 8091 0244 8091 8D 01 0E STA FSLOCN + 1 ;network number 0245 8094 C8 INY 0246 8095 20 77 86 JSR DECIN Acorn macro assembler Page 7 Sideways ROM service routines 0247 8098 0248 8098 F0 03 READEX BEQ PWFL1 0249 809A 8D 00 0E STA FSLOCN ;so set up new FS id 0250 809D 0251 809D 20 82 8D PWFL1 JSR CATLP 0252 80A0 88 PWFLA DEY 0253 80A1 F0 22 BEQ PWFLB 0254 80A3 B9 05 0F LDAAY TXBUF 0255 80A6 C9 3A CMPIM ":" 0256 80A8 D0 F6 BNE PWFLA 0257 80AA 0258 80AA 20 EE FF JSR OSWRCH ;prompt for password 0259 80AD 20 A1 84 PWFL3 JSR ESC ;detect escape here 0260 80B0 20 E0 FF JSR OSRDCH ;read password 0261 80B3 99 05 0F STAAY TXBUF ;fill it into the buffer 0262 80B6 C8 INY 0263 80B7 E8 INX 0264 80B8 C9 0D CMPIM CR ;'til end of line 0265 80BA D0 F1 BNE PWFL3 0266 80BC 20 E7 FF JSR OSNEWL 0267 80BF D0 DF BNE PWFLA 0268 80C1 0269 80C1 COMERR ;passes the command line to FS with Fn=0 0270 80C1 ;to get a FS decoding of it. The command code returned shows 0271 80C1 ;what action, if any, should be taken by the user. 0272 80C1 0273 80C1 20 82 8D JSR CATLP ;copy the command line across 0274 80C4 A8 TAY ;indicates command line decoding 0275 80C5 20 C7 83 PWFLB JSR DOFSOP 0276 80C8 AE 03 0F LDX RXCC ;get command code 0277 80CB F0 29 BEQ RTTS ;skip if RC=0 0278 80CD AD 05 0F LDA RXBUF 0279 80D0 A0 17 LDYIM CTABLO - CASELO -&04 ;get offset 0280 80D2 D0 13 BNE JMI 0281 80D4 0282 80D4 FSOP 0283 80D4 20 49 86 JSR PUTREG ;save registers 0284 80D7 C9 08 CMPIM &08 ;look for table extent 0285 80D9 B0 1B BCS RTTS ;exit, no regs corrupt 0286 80DB 0287 80DB AA TAX ;index the table 0288 80DC 98 TYA ;save A 0289 80DD A0 13 LDYIM FTABLO - CASELO 0290 80DF D0 06 BNE JMI 0291 80E1 0292 80E1 E0 05 RPROC CPXIM PRTBLN ;come here on Remote Proc jump 0293 80E3 B0 11 RPROC1 BCS RTTS ;skip if no good 0294 80E5 A0 0E LDYIM PRLO - CASELO 0295 80E7 E8 JMI INX 0296 80E8 88 DEY 0297 80E9 10 FC BPL JMI ;get correct offset 0298 80EB A8 TAY ;restore Y 0299 80EC BD 49 80 LDAAX CASEHI -&01 0300 80EF 48 PHA 0301 80F0 BD 24 80 LDAAX CASELO -&01 0302 80F3 48 PHA 0303 80F4 A6 BB LDX TEMPX 0304 80F6 60 RTTS RTS 0305 80F7 000D NSV * &0D ;number of entries in SV table 0306 80F7 SERVICE ;entered by MOS for service request 0307 80F7 ; A = service code 0308 80F7 ; X = ROM id 0309 80F7 ; Y = argument (service dependent) 0310 80F7 0311 80F7 2C 8F 02 THERE BIT &28F 0312 80FA 08 PHP 0313 80FB 10 03 BPL THERE7 0314 80FD 20 9D 9F JSR DISC 0315 8100 0316 8100 48 THERE7 PHA 0317 8101 C9 01 CMPIM 1 ;do this every RESET pass 1 0318 8103 D0 15 BNE FRUGA 0319 8105 0320 8105 AD A0 FE LDA &FEA0 ;status register 0 0321 8108 29 ED ANDIM &ED 0322 810A D0 07 BNE FRUGC 0323 810C 0324 810C AD A1 FE LDA &FEA1 ;status register 1 0325 810F 29 DB ANDIM &DB 0326 8111 F0 07 BEQ FRUGA 0327 8113 0328 8113 3E F0 0D FRUGC ROLAX &DF0 0329 8116 38 SEC 0330 8117 7E F0 0D RORAX &DF0 ;frugal the net here 0331 811A 0332 811A BD F0 0D FRUGA LDAAX &DF0 0333 811D 0A ASLA 0334 811E 68 PLA ;restore Acc 0335 811F 0336 811F 30 02 BMI THERE1 ;allow tube to function 0337 8121 B0 6E BCS SERVC3 ; ROM off here 0338 8123 0339 8123 ; Double jump here, so dont change condition 0340 8123 0341 8123 C9 FE THERE1 CMPIM &FE 0342 8125 90 5C BCC XXXL1 0343 8127 D0 1B BNE TGO ;A=$FF here 0344 8129 C0 00 CPYIM &00 ;A=$FE here 0345 812B F0 56 BEQ XXXL1 ;Skip here 0346 812D A2 06 LDXIM &06 0347 812F A9 14 LDAIM &14 0348 8131 20 F4 FF JSR OSBYTE 0349 8134 2C E0 FE TMESSA BIT R1STAT 0350 8137 10 FB BPL TMESSA 0351 8139 AD E1 FE LDA R1DATA 0352 813C F0 43 BEQ TOUT 0353 813E 20 EE FF JSR OSWRCH 0354 8141 4C 34 81 JMP TMESSA 0355 8144 0356 8144 A9 AD TGO LDAIM EVENT 0357 8146 8D 20 02 STA EVTVEC 0358 8149 A9 06 LDAIM /(EVENT ) 0359 814B 8D 21 02 STA EVTVEC +&01 0360 814E A9 16 LDAIM NEWBR 0361 8150 8D 02 02 STA BRKVEC 0362 8153 A9 00 LDAIM /(NEWBR ) 0363 8155 8D 03 02 STA BRKVEC +&01 0364 8158 A9 8E LDAIM &8E 0365 815A 8D E0 FE STA R1STAT 0366 815D 0367 815D A0 00 LDYIM 0 Acorn macro assembler Page 8 Sideways ROM service routines 0368 815F B9 62 93 CLOOP LDAAY ORG52 ;code ORG'd at $400 0369 8162 99 00 04 STAAY &0400 0370 8165 B9 62 94 LDAAY ORG53 ;code ORG'd at $500 0371 8168 99 00 05 STAAY &0500 0372 816B B9 62 95 LDAAY ORG53 +&FF+&01 ;one page on 0373 816E 99 00 06 STAAY &0600 0374 8171 88 DEY 0375 8172 D0 EB BNE CLOOP 0376 8174 20 21 04 JSR ADRRAL ;release all claims 0377 8177 A2 60 LDXIM &60 0378 8179 BD 21 93 FLOOP LDAAX ZCODE 0379 817C 95 16 STAAX ZPTUBE 0380 817E CA DEX 0381 817F 10 F8 BPL FLOOP 0382 8181 0383 8181 A9 00 TOUT LDAIM &00 0384 8183 0385 8183 C9 12 XXXL1 CMPIM &12 0386 8185 D0 08 BNE SERVC1 ;explicit test for $12 0387 8187 C0 05 CPYIM &05 0388 8189 D0 04 BNE SERVC1 ;restart only if Y=5 0389 818B A9 0D LDAIM NSV 0390 818D D0 04 BNE SERVC2 ;** 9/8/83 ** 0391 818F 0392 818F C9 0D SERVC1 CMPIM NSV 0393 8191 B0 1C SERVC3 BCS RTS ;[unrecognised service code] 0394 8193 AA SERVC2 TAX 0395 8194 A5 A9 LDA ROMA 0396 8196 48 PHA 0397 8197 A5 A8 LDA ROMY 0398 8199 48 PHA ;save work area 0399 819A 0400 819A 86 A9 STX ROMA ;save service code 0401 819C 84 A8 STY ROMY 0402 819E 0403 819E ; jump to appropriate service routine 0404 819E 98 TYA ;save Y 0405 819F A0 00 LDYIM SVLO - CASELO 0406 81A1 20 E7 80 JSR JMI 0407 81A4 A6 A9 LDX ROMA ;restore service code / zero 0408 81A6 0409 81A6 68 PLA 0410 81A7 85 A8 STA ROMY 0411 81A9 68 PLA 0412 81AA 85 A9 STA ROMA 0413 81AC 8A TXA 0414 81AD A6 F4 LDX ROMID ;restore X as ROM number 0415 81AF 0416 81AF RTS 0417 81AF 28 PLP 0418 81B0 30 37 BMI TABVC3 0419 81B2 4C 9D 9F JMP DISC 0420 81B5 0421 81B5 0422 81B5 NAME ;command name to decode 0423 81B5 ; LINE(ROMY) -> command name 0424 81B5 A2 0C LDXIM ROFFL - NAMES 0425 81B7 20 62 83 JSR MATCH ;returns A=0, Z=1 on match 0426 81BA D0 2E BNE NAME2 0427 81BC 0428 81BC ROFFF 0429 81BC NROFF 0430 81BC ;code executed when +++ 0431 81BC ;*ROFF or Break-link command issued 0432 81BC ;The System masks are reset and control 0433 81BC ;passes to the MOS. 0434 81BC 0435 81BC A0 04 LDYIM STAT2 0436 81BE B1 9C LDAIY PAGE1 0437 81C0 F0 21 BEQ NROFFX ;not done so end 0438 81C2 A9 00 LDAIM &00 0439 81C4 AA TAX 0440 81C5 91 9C STAIY PAGE1 0441 81C7 A8 TAY 0442 81C8 A9 C9 LDAIM &C9 0443 81CA 20 F4 FF JSR OSBYTE ;enable KB 0444 81CD A9 0A LDAIM ROFF 0445 81CF 20 C4 90 JSR NTX 0446 81D2 ;to set masks to zero 0447 81D2 86 9E REMOL0 STX WORKP1 0448 81D4 A9 CE LDAIM &CE 0449 81D6 A6 9E REMOL1 LDX WORKP1 0450 81D8 A0 7F LDYIM &7F ;keep lo 6 bits 0451 81DA 20 F4 FF JSR OSBYTE ;intercept calls 0452 81DD 69 01 ADCIM &01 ;carry set so add (net) 2 0453 81DF C9 D0 CMPIM &D0 0454 81E1 F0 F3 BEQ REMOL1 0455 81E3 A9 00 NROFFX LDAIM &00 0456 81E5 85 A9 STA ROMA ;claim call 0457 81E7 85 9E STA WORKP1 ;restore the pointer 0458 81E9 60 TABVC3 RTS 0459 81EA A2 05 NAME2 LDXIM NET -NAMES 0460 81EC 20 62 83 JSR MATCH 0461 81EF D0 24 BNE BADRTS 0462 81F1 0463 81F1 20 18 82 NAME1 JSR JM16 ;kill previous filing system 0464 81F4 38 SEC 0465 81F5 66 A8 ROR ROMY ;kill AUTO-BOOT here 0466 81F7 20 7B 82 JSR AUTOFS ;claim the work-space and vectors 0467 81FA A0 1D LDYIM SAVEHI +&08 ;restore saved area after *NET only 0468 81FC 0469 81FC B1 9C INITL LDAIY PAGE1 0470 81FE 99 EB 0D STAAY FSLOCN - SAVEHI 0471 8201 88 DEY 0472 8202 C0 14 CPYIM SAVEHI -&01 0473 8204 D0 F6 BNE INITL 0474 8206 F0 5C BEQ INIT 0475 8208 0476 8208 20 5C 86 HELP JSR VSTRNG 0477 820B 0D 4E 46 = CR,"NFS 3.60" 0478 8214 0D = CR ;Terminate HELP message 0479 8215 0480 8215 BOOT0 0481 8215 BADRTS 0482 8215 A4 A8 LDY ROMY 0483 8217 60 RTS 0484 8218 0485 8218 A9 06 JM16 LDAIM SIX 0486 821A 6C 1E 02 JM1 JMI &021E ;call to OSFUNC 0487 821D 0488 821D BOOT ;bootstrap offered Acorn macro assembler Page 9 Sideways ROM service routines 0489 821D ; scan keyboard 0490 821D 20 18 82 JSR JM16 ;call to claim vectors 0491 8220 A9 7A LDAIM FXSCAN 0492 8222 20 F4 FF JSR OSBYTE ;X := matrix address of pressed key ($FF=no key pressed) 0493 8225 8A TXA 0494 8226 30 0A BMI AUTO ;[auto boot, no key pressed] 0495 8228 ; key pressed - matrix address in A & X 0496 8228 49 55 EORIM &55 ;'n' 0497 822A D0 E9 BNE BOOT0 ;[not 'n' key] 0498 822C A8 TAY ;Y=0 here 0499 822D A9 78 LDAIM FXOKEY 0500 822F 20 F4 FF JSR OSBYTE ;forget key 0501 8232 AUTO ;identify filing system 0502 8232 20 5C 86 JSR VSTRNG 0503 8235 45 63 6F = "Econet Station " 0504 8244 A0 14 LDYIM SAVEHI - 1 0505 8246 B1 9C LDAIY PAGE1 ;output the station number 0506 8248 20 BD 8D JSR DECOUT 0507 824B A9 20 LDAIM &20 ;look for data carrier detect 0508 824D 2C A1 FE BIT &FEA1 ;SR2 0509 8250 F0 0D BEQ INITCR 0510 8252 20 5C 86 JSR VSTRNG 0511 8255 20 4E 6F = " No Clock" 0512 825E EA NOP ;negative byte 0513 825F 20 5C 86 INITCR JSR VSTRNG 0514 8262 0D 0D = CR,CR 0515 8264 INIT 0516 8264 ; alter normal OS indirections 0517 8264 A0 0D LDYIM FSCVEC-FILVEC+&1 0518 8266 INIT1 0519 8266 B9 9A 82 LDAAY VECTAB 0520 8269 99 12 02 STAAY FILVEC 0521 826C 88 DEY 0522 826D 10 F7 BPL INIT1 0523 826F ; alter ROM indirections 0524 826F ; ROMPTR -> ROM indirection 3-byte tuples 0525 826F 20 25 83 JSR DYNVEC ;intercept the NET vector 0526 8272 A0 1B LDYIM rFILID 0527 8274 A2 07 LDXIM &07 0528 8276 20 39 83 JSR INIT4 ;code in DYNVEC 0529 8279 86 A9 STX ROMA ;claim call 0530 827B 0531 827B A9 8F AUTOFS LDAIM &8F 0532 827D A2 0F LDXIM &0F 0533 827F 20 F4 FF JSR OSBYTE ;vectors claimed 0534 8282 A2 0A LDXIM &0A 0535 8284 20 F4 FF JSR OSBYTE ;claim FS workspace 0536 8287 A6 A8 LDX ROMY ;detect BOOT option 0537 8289 D0 37 BNE STATEX 0538 828B A2 92 LDXIM BOOTUP 0539 828D A0 82 LDYIM /(BOOTUP ) 0540 828F 4C 1B 8C JMP DECODE ;call with "I AM ... BOOT" 0541 8292 0542 8292 49 20 2E BOOTUP = "I .BOOT",CR 0543 829A 0544 829A VECTAB 0545 829A 1B = ROMFIL 0546 829B FF = /(ROMFIL ) 0547 829C 1E = ROMARG 0548 829D FF = /(ROMARG ) 0549 829E 21 = ROMBGT 0550 829F FF = /(ROMBGT ) 0551 82A0 24 = ROMBPT 0552 82A1 FF = /(ROMBPT ) 0553 82A2 27 = ROMGPB 0554 82A3 FF = /(ROMGPB ) 0555 82A4 2A = ROMFND 0556 82A5 FF = /(ROMFND ) 0557 82A6 2D = ROMFSC 0558 82A7 FF = /(ROMFSC ) 0559 82A8 0560 82A8 ECOTAB 0561 82A8 0C = FILEOP 0562 82A9 87 = /(FILEOP ) 0563 82AA 4A = "J" ;osfile 0564 82AB 0565 82AB 68 = OSARGS 0566 82AC 89 = /(OSARGS ) 0567 82AD 44 = "D" ;osargs 0568 82AE 0569 82AE 63 = GETBYT 0570 82AF 85 = /(GETBYT ) 0571 82B0 57 = "W" ;osbget 0572 82B1 0573 82B1 13 = PUTBYT 0574 82B2 84 = /(PUTBYT ) 0575 82B3 42 = "B" ;osbput 0576 82B4 0577 82B4 72 = OSBGPB 0578 82B5 8A = /(OSBGPB ) 0579 82B6 41 = "A" ;osbgpb 0580 82B7 0581 82B7 D8 = FINDOP 0582 82B8 89 = /(FINDOP ) 0583 82B9 52 = "R" ;osfind 0584 82BA 0585 82BA D4 = FSOP 0586 82BB 80 = /(FSOP ) 0587 82BC ; = ZERO ;fsfunc 0588 82BC 0589 82BC STATIC 0590 82BC C0 10 CPYIM &10 ;this fits into the space in ECOTAB 0591 82BE B0 02 BCS STATEX 0592 82C0 A0 10 LDYIM &10 0593 82C2 60 STATEX RTS 0594 82C3 0595 82C3 80 = ENTRY ;NETVEC interception 0596 82C4 90 = /(ENTRY ) 0597 82C5 0598 82C5 84 9D DYNAM STY &9D ;first page static area 0599 82C7 C8 INY ;claim one page 0600 82C8 84 9F STY &9F ;second page 0601 82CA A9 00 LDAIM &00 0602 82CC A0 04 LDYIM STAT2 0603 82CE 91 9C STAIY PAGE1 ;clean status byte 0604 82D0 A0 FF LDYIM FILLER 0605 82D2 85 9C STA &9C 0606 82D4 85 9E STA &9E ;set up pointers 0607 82D6 85 A8 STA ROMY 0608 82D8 8D 62 0D STA TXCLR ;reset TX sema 0609 82DB AA TAX Acorn macro assembler Page 10 Sideways ROM service routines 0610 82DC A9 FD LDAIM FXRSET ;check type of reset 0611 82DE 20 F4 FF JSR OSBYTE 0612 82E1 8A TXA ;A=0 then BREAK, A=1 then POWER-UP, A=2 then CTRL-BREAK 0613 82E2 F0 32 BEQ NETON 0614 82E4 0615 82E4 A0 15 LDYIM SAVEHI ;stow this in Dynamic space too 0616 82E6 A9 FE LDAIM FS 0617 82E8 8D 00 0E STA FSLOCN ;default station 0618 82EB 91 9C STAIY PAGE1 ;save in private workarea 0619 82ED A9 00 LDAIM 0 0620 82EF 8D 01 0E STA FSLOCN + 1 0621 82F2 8D 63 0D STA LSTAT ;initial status copied for Low level 0622 82F5 8D 06 0E STA MESS ;turn messages OFF 0623 82F8 8D 05 0E STA OPT ;initialise this (for small FS) 0624 82FB C8 INY 0625 82FC 91 9C STAIY PAGE1 ;save in private work area 0626 82FE A0 03 LDYIM 3 0627 8300 91 9E STAIY WORKP1 0628 8302 88 DEY 0629 8303 A9 EB LDAIM PS 0630 8305 91 9E STAIY WORKP1 ;set default printer server 0631 8307 0632 8307 A5 A8 DNAML1 LDA ROMY ;null flag byte 0633 8309 20 55 8E JSR OFFSET 0634 830C B0 08 BCS NETON 0635 830E A9 3F LDAIM &3F 0636 8310 91 9E STAIY WORKP1 ;set up CB's 0637 8312 E6 A8 INC ROMY 0638 8314 D0 F1 BNE DNAML1 0639 8316 AD 18 FE NETON LDA &FE18 ;read station Id 0640 8319 A0 14 LDYIM SAVEHI - 1 0641 831B 91 9C STAIY PAGE1 ;save station id 0642 831D 20 33 96 JSR BRIANP ;call lowlevel software to initialise 0643 8320 A9 40 LDAIM &40 ;enable user lowlevel Rx 0644 8322 8D 64 0D STA LFLAG 0645 8325 0646 8325 A9 A8 DYNVEC LDAIM FXROMI ;********* 0647 8327 A2 00 LDXIM &00 ;note new osbyte call 0648 8329 A0 FF LDYIM FILLER 0649 832B 20 F4 FF JSR OSBYTE 0650 832E ; XY -> ROM indirection 3-byte tuples 0651 832E 86 F6 STX ROMPTR+&00 0652 8330 84 F7 STY ROMPTR+&01 0653 8332 0654 8332 A0 36 LDYIM &36 0655 8334 8C 24 02 STY &0224 0656 8337 A2 01 LDXIM ONE 0657 8339 INIT4 0658 8339 B9 8D 82 LDAAY ECOTAB - rFILID 0659 833C 91 F6 STAIY ROMPTR 0660 833E C8 INY 0661 833F B9 8D 82 LDAAY ECOTAB - rFILID 0662 8342 91 F6 STAIY ROMPTR 0663 8344 C8 INY 0664 8345 A5 F4 LDA ROMID 0665 8347 91 F6 STAIY ROMPTR 0666 8349 C8 INY 0667 834A CA DEX 0668 834B D0 EC BNE INIT4 0669 834D 0670 834D A4 9F LDY WORKP1 +&01 0671 834F C8 INY ;return the updated pointer 0672 8350 60 RTS 0673 8351 0674 8351 FSDIE ;called through here when a new filing 0675 8351 ;system is started up, to relinquish the FS workarea. 0676 8351 A0 1D LDYIM SAVEHI +&08 0677 8353 B9 EB 0D FSDIEL LDAAY FSLOCN - SAVEHI 0678 8356 91 9C STAIY PAGE1 ;into dynamic area 0679 8358 88 DEY 0680 8359 C0 14 CPYIM SAVEHI -&01 0681 835B D0 F6 BNE FSDIEL ;save context 0682 835D A9 77 LDAIM FXSPEX 0683 835F 4C F4 FF JMP OSBYTE ;close SPOOL and EXEC files 0684 8362 0685 8362 MATCH ;try to match on command name 0686 8362 ; NAMES(X) -> name 0687 8362 ; LINE(ROMY) -> command name 0688 8362 A4 A8 LDY ROMY 0689 8364 MATCH1 0690 8364 B1 F2 LDAIY LINE 0691 8366 0692 8366 C9 2E CMPIM "." ;** 22/8/83 ** 0693 8368 F0 13 BEQ SKPSPI 0694 836A 0695 836A 29 DF ANDIM &DF ;force to upper case 0696 836C F0 09 BEQ MATCH2 ;[SPACE detected] 0697 836E DD 08 80 CMPAX NAMES 0698 8371 D0 04 BNE MATCH2 ;[mismatch] 0699 8373 C8 INY 0700 8374 E8 INX 0701 8375 D0 ED BNE MATCH1 ;[ALWAYS jump, end of internal name] 0702 8377 ; NEVER fall thru 0703 8377 0704 8377 MATCH2 ;check for end of internal name 0705 8377 BD 08 80 LDAAX NAMES 0706 837A F0 02 BEQ SKPSP ;[matched on full name, 0707 837C ; skip spaces and return result in Z flag] 0708 837C ; not a match on full name 0709 837C 60 RTS 0710 837D 0711 837D SKPSPI 0712 837D C8 INY 0713 837E SKPSP 0714 837E B1 F2 LDAIY LINE 0715 8380 C9 20 CMPIM SPACE 0716 8382 F0 F9 BEQ SKPSPI 0717 8384 49 0D EORIM CR ;return Z=1, A=0 if match 0718 8386 60 RTS 0719 8387 0720 8387 LNK NFS02 0001 8387 0002 8387 ; NFS02 0003 8387 OPT BRIAN Acorn macro assembler Page 11 Sideways ROM service routines 0004 8387 0005 8387 9630 BRIANX * LOWORG + &0000 ;transmit address 0006 8387 9633 BRIANP * LOWORG + &0003 ;power up 0007 8387 9636 BRIANC * LOWORG + &0006 ;relinquish NMI 0008 8387 9639 BRIANQ * LOWORG + &0009 ;reclaim NMI, NO message 0009 8387 963C BRIANI * LOWORG + &000C ;address for unknown interrupt 0010 8387 0011 8387 0012 8387 TTL Status Bytes 0013 8387 0014 8387 ; Low level byte 0015 8387 ; bit0 - PEEK 0016 8387 ; bit1 - POKE 0017 8387 ; bit2 - HALT 0018 8387 ; bit3 - REMOTE JSR 0019 8387 ; bit4 - REMOTE PROC 0020 8387 0021 8387 ; High level byte 0022 8387 ; bit0 - REMOTE {allowed} [=0] 0023 8387 ; bit1 - VIEW {allowed} [=0] 0024 8387 ; bit2 - NOTIFY {allowed} [=0] 0025 8387 ; bit3 - STATION REMOTED [=1] 0026 8387 ; bit4 - KB event in REMOTE [=1] 0027 8387 ; bit5 - ESC event in REMOTE [=1] 0028 8387 ; bit6 - VIEW/NOTIFY busy [=1] 0029 8387 ; bit7 - NET FS selected [=1] 0030 8387 0031 8387 ; High level flags 0032 8387 ; bit0 Printer enabled [=1] 0033 8387 ; bit6 always one 0034 8387 ; bit7 Sequence number 0035 8387 0036 8387 ; Rx enable byte 0037 8387 ; bit6 USER Rx enable [=1] 0038 8387 ; Bit7 FS Rx enable [=1] 0039 8387 0040 8387 0041 8387 LNK NFS03 0001 8387 0002 8387 ; > NFS03 0003 8387 TTL General Utilities 0004 8387 OPT UTILS Acorn macro assembler Page 12 General Utilities 0005 8387 0006 8387 ; This file contains most of the useful utility routines 0007 8387 ; used by the rest of the programs and routines. 0008 8387 0009 8387 0010 8387 FSRXCB ;sets up an Rxcb into the FS buffer 0011 8387 A9 90 LDAIM PREPLY ;option for default port 0012 8389 FSRXCC ;entry point for user-specified port 0013 8389 20 95 83 JSR FSTXCB 0014 838C 85 C1 STA RXCB + PORT ;A preserved over call 0015 838E A9 03 LDAIM RXCC 0016 8390 85 C4 STA RXCB +LPTR ;adjust the pointer 0017 8392 C6 C0 DEC RXCB ;$80 => $7F 0018 8394 60 RTS 0019 8395 0020 8395 FSTXCB ;sets up TXCB pointing to a full 0021 8395 ;FS buffer. The hi-pointer is ammended in another routine 0022 8395 ;to ensure that only significant data is sent. 0023 8395 0024 8395 48 PHA 0025 8396 A0 0B LDYIM &0B 0026 8398 B9 AD 83 FSTXL1 LDAAY TXTAB 0027 839B 99 C0 00 STAAY TXCB 0028 839E C0 02 CPYIM TWO 0029 83A0 10 06 BPL FSTXL2 0030 83A2 B9 00 0E LDAAY FSLOCN 0031 83A5 99 C2 00 STAAY TXCB + DESTN 0032 83A8 88 FSTXL2 DEY 0033 83A9 10 ED BPL FSTXL1 0034 83AB 68 PLA 0035 83AC 60 RTS 0036 83AD 0037 83AD TXTAB 0038 83AD 80 = TXFLAG 0039 83AE 99 = PCMND 0040 83AF 00 = ZERO 0041 83B0 00 = ZERO 0042 83B1 00 = BIGBUF 0043 83B2 0F = /(BIGBUF ) 0044 83B3 FF ALL1S = FILLER 0045 83B4 FF = FILLER 0046 83B5 FF = RXBUFE 0047 83B6 0F = /(RXBUFE ) 0048 83B7 FF = FILLER 0049 83B8 FF = FILLER ;usual table with padded addresses 0050 83B9 0051 83B9 DOFSBX 0052 83B9 ;entry point for use with the byte stream. 0053 83B9 ;On entry :- A = Handle 0054 83B9 ;X,Y as usual 0055 83B9 ;The entry point saves the handle and sets 0056 83B9 ;the carry as a flag for later use. 0057 83B9 0058 83B9 48 PHA ;save handle on stack 0059 83BA 38 SEC ;the all-important bit 0060 83BB B0 12 BCS DOFSL4 0061 83BD 0062 83BD B8 DOFSUP CLV 0063 83BE 50 0E BVC DOFSL6 ;common entry point 0064 83C0 0065 83C0 A9 77 BYE LDAIM &77 0066 83C2 20 F4 FF JSR OSBYTE 0067 83C5 A0 17 LDYIM FCBYE ;logoff code 0068 83C7 0069 83C7 DOFSOP ;first entry point, uses default timeout 0070 83C7 0071 83C7 ;perform a transaction with the fileserver. 0072 83C7 ;ENTRY :: A = wait period for FS reply 0073 83C7 ;X = extent of the FS buffer 0074 83C7 ;Y = function code for the transaction 0075 83C7 0076 83C7 B8 CLV 0077 83C8 AD 02 0E DOFSER LDA URD ;enter here with A=delay, HDRURD=URD for no errors 0078 83CB 8D 02 0F STA HDRURD 0079 83CE 0080 83CE 18 DOFSL6 CLC ;clear the carry on XMIT entry 0081 83CF 8C 01 0F DOFSL4 STY HDRFN 0082 83D2 A0 01 LDYIM ONE 0083 83D4 B9 03 0E DOFSL1 LDAAY CSD 0084 83D7 99 03 0F STAAY HDRCSD ;copy other two handles 0085 83DA 88 DEY 0086 83DB 10 F7 BPL DOFSL1 0087 83DD 08 DOFS0 PHP ;entry point with Fn and handles set up 0088 83DE ; LDAIM DLOAD 0089 83DE ; STA JWORK ;** 2/8/83 ** 0090 83DE A9 90 LDAIM PREPLY 0091 83E0 8D 00 0F STA HDRREP ;reply port 0092 83E3 20 95 83 JSR FSTXCB 0093 83E6 8A TXA 0094 83E7 69 05 ADCIM FIVE 0095 83E9 85 C8 STA TXCB +HPTR ;ammend TXCB end pointer 0096 83EB 28 PLP ;restore the carry flag 0097 83EC B0 1A BCS DOFSL5 ;do different if C = 1 0098 83EE 08 PHP ;save P over the call 0099 83EF 20 F7 85 JSR FSXMIT ;do the transmission 0100 83F2 28 PLP 0101 83F3 ; BCC DOFSL3 0102 83F3 DOFSL8 ; LDAIM DFINAL 0103 83F3 ; STA JWORK 0104 83F3 08 DOFSL3 PHP 0105 83F4 20 87 83 JSR FSRXCB ;reply on reply port 0106 83F7 ; LDA JWORK ;eliminate WAIT1 routine 0107 83F7 20 30 85 JSR WAITFS ;delay already set 0108 83FA 28 PLP 0109 83FB C8 DOFSL7 INY ;Y=0 on exit from BSXMIT and WAIT 0110 83FC B1 C4 LDAIY RXCB +LPTR ;get the return code 0111 83FE AA TAX 0112 83FF F0 06 BEQ DOFSEX 0113 8401 50 02 BVC DOFSEV ;skip if errors off 0114 8403 0115 8403 69 2A ADCIM &100-NOTFND ;C=0 here 0116 8405 D0 73 DOFSEV BNE FSERR ;stop if error not $D6 0117 8407 60 DOFSEX RTS ;C=1, A=0 if "not found" 0118 8408 0119 8408 68 DOFSL5 PLA ;get the handle for BSXMIT 0120 8409 A2 C0 LDXIM TXCB 0121 840B C8 INY 0122 840C 20 66 92 JSR BSXMIT ;do byte stream 0123 840F 85 B3 STA W2 ;save new sequence numbers 0124 8411 90 E8 BCC DOFSL7 ;.. then leap off to inspect the return code 0125 8413 Acorn macro assembler Page 13 General Utilities 0126 8413 ; ********************************* 0127 8413 ; *************************************** 0128 8413 ; ****** RANDOM ACCESS ***** 0129 8413 ; *************************************** 0130 8413 ; ******************************** 0131 8413 0132 8413 18 PUTBYT CLC 0133 8414 20 57 86 RANDOM JSR ENTER ;disable escape 0134 8417 48 PHA 0135 8418 8D DF 0F STA PUTB4 0136 841B 8A TXA 0137 841C 48 PHA 0138 841D 98 TYA 0139 841E 48 PHA ;save regs and carry 0140 841F 08 PHP 0141 8420 [ &00=0 0142 8420 84 BA STY SPOOL1 ;save new handle 0143 8422 ] 0144 8422 20 9B 86 JSR Y2FS 0145 8425 8C DE 0F STY PUTB3 0146 8428 84 CF STY SPOOL0 ;handle in FS format 0147 842A [ &FF=0 0149 842A ] 0150 842A A0 90 LDYIM PREPLY 0151 842C 8C DC 0F STY PUTB1 0152 842F 20 95 83 JSR FSTXCB 0153 8432 A9 DC LDAIM PUTB 0154 8434 85 C4 STA TXCB +LPTR 0155 8436 A9 E0 LDAIM PUTB4 +&01 ;accurate offset 0156 8438 85 C8 STA TXCB + HPTR ;ammend CB 0157 843A C8 INY 0158 843B A2 09 LDXIM FCPUTB 0159 843D 28 PLP 0160 843E 90 01 BCC RAND1 0161 8440 CA DEX 0162 8441 8E DD 0F RAND1 STX GETB2 0163 8444 A5 CF LDA SPOOL0 0164 8446 A2 C0 LDXIM TXCB ;point to CB 0165 8448 20 66 92 JSR BSXMIT 0166 844B AE DD 0F LDX GETB2 ;check return code 0167 844E F0 48 BEQ RAND3 0168 8450 0169 8450 A0 1F LDYIM RXBUFE -PUTB -&04 0170 8452 B9 DC 0F ERROR1 LDAAY PUTB 0171 8455 99 E0 0F STAAY PUTB +&04 0172 8458 88 DEY 0173 8459 10 F7 BPL ERROR1 0174 845B 0175 845B AA TAX ;last byte is error code 0 0176 845C A9 C6 LDAIM &C6 ;read spool handle 0177 845E 20 F4 FF JSR OSBYTE ;returned in X 0178 8461 0179 8461 [ &FF=0 0184 8461 | 0185 8461 A9 29 LDAIM SPOFF 0186 8463 C4 BA CPY SPOOL1 0187 8465 F0 06 BEQ FSERR2 0188 8467 A9 2D LDAIM EXOFF 0189 8469 E4 BA FSERR0 CPX SPOOL1 0190 846B D0 06 BNE FSERR4 0191 846D ] 0192 846D 0193 846D AA FSERR2 TAX ;get address 0194 846E A0 85 LDYIM /(SPOFF ) ;hand string to OSCLI 0195 8470 20 F7 FF JSR OSCLI 0196 8473 0197 8473 A9 E0 FSERR4 LDAIM PUTB +&04 0198 8475 85 C4 STA RXCB +LPTR ;ammend pointer 0199 8477 AE DD 0F LDX GETB2 0200 847A 0201 847A FSERR ;this handles errors from the file-server. These consist 0202 847A ;of a standard header + a message CR. The routine replaces 0203 847A ;the CR with a zero, replaces the CC with BRK and jumps to 0204 847A ;the BRK packet thus formed. 0205 847A 0206 847A 8E 09 0E STX ERROR ;save the error number for OSWORD call 0207 847D A0 01 LDYIM ONE 0208 847F E0 A8 CPXIM &A8 0209 8481 B0 04 BCS FSERR1 0210 8483 A9 A8 LDAIM &A8 ;standard error number 0211 8485 91 C4 STAIY RXCB +LPTR 0212 8487 0213 8487 [ &FF=0 0222 8487 | 0223 8487 A0 FF FSERR1 LDYIM &FF 0224 8489 C8 FSERR3 INY ;y=0 on entry 0225 848A B1 C4 LDAIY RXCB + LPTR 0226 848C 99 00 01 STAAY &100 0227 848F 49 0D EORIM CR ;look for carriage return 0228 8491 D0 F6 BNE FSERR3 0229 8493 99 00 01 STAAY &100 0230 8496 F0 52 BEQ NOL3 0231 8498 ] 0232 8498 0233 8498 8D 08 0E RAND3 STA SEQNOS ;update sequence numbers 0234 849B 68 PLA 0235 849C A8 TAY 0236 849D 68 PLA 0237 849E AA TAX 0238 849F 68 PLA 0239 84A0 60 NOERR RTS ;all restored 0240 84A1 0241 84A1 A5 FF ESC LDA ESCADR ;$FF, top bit 0242 84A3 25 97 AND ESCAP ;** 9/12/83 ** 0243 84A5 10 F9 BPL NOERR 0244 84A7 A9 7E LDAIM &7E 0245 84A9 20 F4 FF JSR OSBYTE ;ack the escape condition 0246 84AC 4C 12 85 JMP NLISNE ;leave with A=&7E 0247 84AF 0248 84AF ;This code is called from a REMOTE proc call 0249 84AF ;and performs the following actions 0250 84AF ; 1) Disables KB 0251 84AF ; 2) Sets the pointer to the work area 0252 84AF ; 3) Set status busy 0253 84AF ; 4) Sets the Read/Write/Byte/Word masks 0254 84AF ; 5) Sets up the CB 0255 84AF ; 6) Set mode7 0256 84AF ; 7) Set auto repeat rates 0257 84AF ; 8) Enter current language 0258 84AF 0259 84AF A0 04 REMOT LDYIM STAT2 ;adjust status byte Acorn macro assembler Page 14 General Utilities 0260 84B1 B1 9C LDAIY PAGE1 0261 84B3 F0 03 BEQ REMOT1 ;skip if already remoted 0262 84B5 4C F0 92 RCHEX JMP CLRJSR ;enable JSR's again anyway 0263 84B8 09 09 REMOT1 ORAIM &09 ;set bits 3,0 => REMOTED, remote DISallowed 0264 84BA 91 9C STAIY PAGE1 0265 84BC 0266 84BC A2 80 LDXIM &80 ;entry from RCHAR, omitting test phase 0267 84BE 0268 84BE A0 80 LDYIM JSRBUF ;copy numbers from JSRBUF to TERMIN 0269 84C0 B1 9C LDAIY PAGE1 0270 84C2 48 PHA 0271 84C3 C8 INY 0272 84C4 B1 9C LDAIY PAGE1 0273 84C6 A0 0F LDYIM RTXCB +&03 0274 84C8 91 9E STAIY WORKP1 0275 84CA 88 DEY 0276 84CB 68 PLA 0277 84CC 91 9E STAIY WORKP1 ;what a lot of fuss 0278 84CE 0279 84CE 20 D2 81 JSR REMOL0 0280 84D1 20 88 91 JSR CBSET1 ;new routine 0281 84D4 0282 84D4 A2 01 LDXIM ONE 0283 84D6 A0 00 LDYIM ZERO 0284 84D8 A9 C9 LDAIM &C9 0285 84DA 20 F4 FF JSR OSBYTE ;disable the KB 0286 84DD 0287 84DD 20 F0 92 RESET JSR CLRJSR ;enable JSR's again 0288 84E0 A2 02 LDXIM &02 0289 84E2 A9 00 RESET2 LDAIM &00 0290 84E4 9D 00 01 RESET1 STAAX &100 0291 84E7 CA DEX 0292 84E8 10 FA BPL RESET1 0293 84EA 4C 00 01 NOL3 JMP &100 ;BASIC fatal error 0294 84ED 0295 84ED RCHAR ;chars from REMOTE 0296 84ED A0 04 LDYIM STAT2 0297 84EF B1 9C LDAIY PAGE1 0298 84F1 F0 C5 BEQ REMOT1 0299 84F3 0300 84F3 A0 80 LDYIM JSRBUF 0301 84F5 B1 9C LDAIY PAGE1 0302 84F7 A0 0E LDYIM RTXCB +&02 0303 84F9 D1 9E CMPIY WORKP1 ;same station ???? 0304 84FB D0 B8 BNE RCHEX ;skip if not 0305 84FD 0306 84FD A0 82 CHARIN LDYIM JSRBUF +&02 ;grab the data passed 0307 84FF B1 9C LDAIY PAGE1 0308 8501 A8 TAY ;char in Y 0309 8502 A2 00 LDXIM ZERO ;KB buffer 0310 8504 20 F0 92 JSR CLRJSR ;after reading data, enable JSR's 0311 8507 A9 99 LDAIM &99 ;put char into buffer, detect Escape 0312 8509 4C F4 FF JMP OSBYTE ;and then return 0313 850C 0314 850C NREPLY ;a routine which indicates that a 'no reply' 0315 850C ;error has just occurred. This uses the MOS BRK convention. 0316 850C 0317 850C A9 08 LDAIM &08 0318 850E D0 04 BNE NLISN2 0319 8510 0320 8510 NLISTN ;this is similar to the above but produces 0321 8510 ;a 'not listening' message. 0322 8510 0323 8510 A1 9A LDAIX TXCBP ;get flag byte 0324 8512 29 07 NLISNE ANDIM &07 ;get low 7 bits 0325 8514 AA NLISN2 TAX ;use this as offset 0326 8515 BC 18 80 LDYAX ERRTAB ;get message offset 0327 8518 0328 8518 A2 00 LDXIM 0 0329 851A 8E 00 01 STX &100 0330 851D B9 80 85 NOL2 LDAAY MESTAB 0331 8520 9D 01 01 STAAX &0101 ;copy text message 0332 8523 F0 C5 BEQ NOL3 0333 8525 C8 INY 0334 8526 E8 INX 0335 8527 D0 F4 BNE NOL2 0336 8529 0337 8529 53 50 2E SPOFF = "SP.",CR 0338 852D 45 2E EXOFF = "E." 0339 852F 0D CROFF = CR 0340 8530 0341 8530 0085 SP1 * SPOFF :SHR: 8 0342 8530 0085 CR1 * CROFF :SHR: 8 0343 8530 [ CR1 - SP1=0 0344 8530 | 0346 8530 ] 0347 8530 0348 8530 A9 2A WAITFS LDAIM DFINAL 0349 8532 48 WAIT PHA ;save 'seconds' byte 0350 8533 0351 8533 AD 64 0D FSRXON LDA LFLAG 0352 8536 48 PHA ;second entry on stack is Rx flag 0353 8537 A6 9B LDX RXCBP + 1 ;Check if RX'ing into page zero control block 0354 8539 D0 05 BNE WAITJD ;No => DONT SET SYSTEM RX FLAG ! 0355 853B 0356 853B 09 80 ORAIM &80 ;enable system Rx 0357 853D 8D 64 0D STA LFLAG 0358 8540 0359 8540 A9 00 WAITJD LDAIM ZERO ;initialise counter 0360 8542 48 PHA 0361 8543 48 PHA ;null bytes 0362 8544 A8 TAY 0363 8545 BA TSX ;must not use store, so use stack 0364 8546 B1 9A WAITL1 LDAIY RXCBP ;poll RXCB 0365 8548 30 0F BMI WAITEX ;something happened 0366 854A DE 01 01 DECAX &0101 0367 854D D0 F7 BNE WAITL1 0368 854F DE 02 01 DECAX &0102 0369 8552 D0 F2 BNE WAITL1 0370 8554 DE 04 01 DECAX &0104 0371 8557 D0 ED BNE WAITL1 0372 8559 0373 8559 68 WAITEX PLA 0374 855A 68 PLA 0375 855B 68 PLA 0376 855C 8D 64 0D STA LFLAG 0377 855F 68 PLA ;tidy stack 0378 8560 F0 AA BEQ NREPLY 0379 8562 60 RTS 0380 8563 0381 8563 38 GETBYT SEC Acorn macro assembler Page 15 General Utilities 0382 8564 20 14 84 JSR RANDOM ;return with C = 1 0383 8567 38 SEC 0384 8568 A9 FE LDAIM &FE ;error byte 0385 856A 2C DF 0F BIT GETB4 ;return with A,X,Y all saved 0386 856D 70 10 BVS GETBEY ;test flag = $40 0387 856F 18 CLC 0388 8570 08 PHP 0389 8571 A5 CF LDA SPOOL0 ;get handle 0390 8573 28 PLP 0391 8574 30 03 BMI GBLAST ;test flag = $80 0392 8576 20 D5 86 JSR CLREOF ;clear end-of-file 0393 8579 20 D0 86 GBLAST JSR SETEOF ;fall thru' ok here 0394 857C AD DE 0F LDA GETB3 0395 857F 60 GETBEY RTS ;A = data, X,Y preserved, C = condition 0396 8580 0397 8580 MESTAB 0398 8580 A0 4C 69 NLIST1 = LINJAM,"Line Jammed",ZERO 0399 858D A1 4E 65 NLIST2 = NETER,"Net Error",ZERO 0400 8598 A2 4E 6F NLIST3 = NOLISE,"Not listening",ZERO 0401 85A7 A3 4E 6F NLIST4 = NOCLK,"No Clock",ZERO 0402 85B1 NLIST5 0403 85B1 NLIST6 0404 85B1 11 45 73 NLIST7 = ESCER,"Escape",ZERO 0405 85B9 CB 42 61 NLIST8 = OPTER,"Bad Option",ZERO 0406 85C5 A5 4E 6F NRMSG = NOREPE,"No reply",ZERO 0407 85CF 0408 85CF A0 0E CHAPRT LDYIM &0E 0409 85D1 B1 BB LDAIY TEMPX 0410 85D3 0411 85D3 ;BBCFS change BBC protection format to FS 0412 85D3 29 3F ANDIM &3F 0413 85D5 A2 04 LDXIM PROTTC - PROTTB - &01 ;index for the table 0414 85D7 D0 04 BNE BBCFS ;common code 0415 85D9 FSBBC ;change FS protection format to BBC 0416 85D9 29 1F ANDIM &1F ;lose top 3 bits 0417 85DB A2 FF LDXIM FILLER 0418 85DD 85 B8 BBCFS STA JWORK ;spare zero page 0419 85DF A9 00 LDAIM ZERO ;result returned in A 0420 85E1 0421 85E1 E8 BBCFS1 INX 0422 85E2 46 B8 LSR JWORK 0423 85E4 90 03 BCC BBCFS2 0424 85E6 1D EC 85 ORAAX PROTTB 0425 85E9 D0 F6 BBCFS2 BNE BBCFS1 ;not done yet 0426 85EB 60 RTS ;return in A 0427 85EC 0428 85EC 50 PROTTB = &50 ;set bits4, 6 0429 85ED 20 = &20 0430 85EE 05 = &05 0431 85EF 02 = &02 0432 85F0 88 = &88 ;set bits3, 7 0433 85F1 0434 85F1 04 PROTTC = &04 0435 85F2 08 = &08 0436 85F3 80 = &80 ;unused bit in access byte 0437 85F4 10 = &10 0438 85F5 01 = &01 0439 85F6 02 = &02 0440 85F7 0441 85F7 FSXMIT 0442 85F7 ;on call to transmit, pointer to TXCB is 0443 85F7 ;passed in page-0, indicated by X. Y holds 0444 85F7 ;the delay between retries and A holds the 0445 85F7 ;the number of retries. 0446 85F7 0447 85F7 ;FSXMIT assumes that TXCB is used, XMIT is 0448 85F7 ;the general routine 0449 85F7 0450 85F7 A2 C0 LDXIM TXCB 0451 85F9 86 9A STX TXCBP 0452 85FB A2 00 LDXIM /(TXCB ) 0453 85FD 86 9B STX TXCBP +&01 0454 85FF 0455 85FF A9 FF XMITFS LDAIM FSTRY ;standard number of retries 0456 8601 A0 60 XMITFY LDYIM FSDELY ;standard delay 0457 8603 0458 8603 48 XMIT PHA 0459 8604 98 TYA 0460 8605 48 PHA 0461 8606 A2 00 LDXIM ZERO 0462 8608 A1 9A LDAIX TXCBP 0463 860A 81 9A L0 STAIX TXCBP 0464 860C 48 PHA 0465 860D 0E 62 0D L5 ASL TXCLR 0466 8610 90 FB BCC L5 ;poll until clear 0467 8612 0468 8612 A5 9A LDA TXCBP ;copy pointer now that semaphore claimed 0469 8614 85 A0 STA LTXCBP 0470 8616 A5 9B LDA TXCBP +&01 0471 8618 85 A1 STA LTXCBP +&01 0472 861A 0473 861A 20 30 96 JSR BRIANX 0474 861D A1 9A L4 LDAIX TXCBP 0475 861F 30 FC BMI L4 0476 8621 0A ASLA 0477 8622 10 1F BPL L2 0478 8624 0A ASLA 0479 8625 F0 18 BEQ LE 0480 8627 0481 8627 20 A1 84 JSR ESC 0482 862A 0483 862A 68 PLA 0484 862B AA TAX 0485 862C 68 PLA 0486 862D A8 TAY 0487 862E 68 PLA 0488 862F F0 0E BEQ LE 0489 8631 E9 01 SBCIM &01 0490 8633 48 PHA 0491 8634 98 TYA 0492 8635 48 PHA 0493 8636 8A TXA 0494 8637 0495 8637 MSDELY 0496 8637 CA DLPP DEX 0497 8638 D0 FD BNE DLPP ;1msec loop 0498 863A 88 DEY 0499 863B D0 FA BNE DLPP ;Outer loop 0500 863D 0501 863D F0 CB BEQ L0 0502 863F AA LE TAX ;X=0 here Acorn macro assembler Page 16 General Utilities 0503 8640 4C 10 85 JMP NLISTN 0504 8643 68 L2 PLA 0505 8644 68 PLA 0506 8645 68 PLA 0507 8646 0508 8646 4C 57 86 JMP ENTER ;disable escape after here 0509 8649 0510 8649 ;** dont drop thru' here 0511 8649 0512 8649 86 F2 PUTREG STX &F2 0513 864B 84 F3 STY &F3 ;set up for MOS 0514 864D ; STX CMNDP 0515 864D ; STY CMNDP +%1 ;command line pointer 0516 864D REGPUT ;save the registers for later recovery 0517 864D 85 BD STA TEMPA 0518 864F 86 BB REGXY STX TEMPX ;save X,Y only 0519 8651 84 BC STY TEMPY ;forms a 0-page pointer of X,Y 0520 8653 86 BE STX POINTR 0521 8655 84 BF STY POINTR +&01 0522 8657 08 ENTER PHP ;** 9/12/83 ** 0523 8658 46 97 LSR ESCAP ;** disable escape 0524 865A 28 PLP ;carry preserved 0525 865B 60 RTS 0526 865C 0527 865C 0528 865C LNK NFS04 link to next file 0001 865C ; > NFS04 0002 865C TTL Tx/Rx and Screen I/O 0003 865C OPT DEBUG Acorn macro assembler Page 17 Tx/Rx and Screen I/O 0004 865C 0005 865C VSTRNG ;inline message handler,does not handle BRK!! 0006 865C 68 PLA 0007 865D 85 B0 STA WORK 0008 865F 68 PLA 0009 8660 85 B1 STA WORK +&01 ;current address 0010 8662 A0 00 LDYIM ZERO 0011 8664 E6 B0 VSTRLP INC WORK 0012 8666 D0 02 BNE INCPX 0013 8668 E6 B1 INC WORK +&01 0014 866A B1 B0 INCPX LDAIY WORK ;step pointer by 1 0015 866C 30 06 BMI VSTRNX 0016 866E 20 E3 FF JSR OSASCI 0017 8671 4C 64 86 JMP VSTRLP 0018 8674 6C B0 00 VSTRNX JMI WORK ;continue the execution 0019 8677 0020 8677 ; Routine to extract the FS number (or whatever) from 0021 8677 ; a string pointed at by TEMPX. 0022 8677 0023 8677 A9 00 DECIN LDAIM ZERO 0024 8679 85 B2 STA W1 0025 867B B1 BB DECIN1 LDAIY TEMPX 0026 867D ; CMPIM $40 0027 867D ; BCS DECIN3 0028 867D C9 2E CMPIM "." 0029 867F F0 16 BEQ DECIN2 0030 8681 90 13 BCC DECIN3 ;** 21/9/83 ** 0031 8683 ; BMI DECIN3 0032 8683 29 0F ANDIM &0F 0033 8685 0034 8685 85 B3 STA W2 ;addition routine 0035 8687 06 B2 ASL W1 0036 8689 A5 B2 LDA W1 0037 868B 0A ASLA 0038 868C 0A ASLA 0039 868D 65 B2 ADC W1 0040 868F 65 B3 ADC W2 0041 8691 85 B2 STA W1 0042 8693 0043 8693 C8 INY 0044 8694 D0 E5 BNE DECIN1 0045 8696 18 DECIN3 CLC 0046 8697 A5 B2 DECIN2 LDA W1 ;return A as number read 0047 8699 60 RTS 0048 869A 0049 869A A8 Y2FSA TAY ;handle passed in A, not Y here 0050 869B Y2FS 0051 869B ;Converts the FS handle to one 0052 869B ;segregated inside the BBCpu. This 0053 869B ;allows the user to discriminate handles 0054 869B 0055 869B ;Passed handle in Y 0056 869B 0057 869B 18 CLC 0058 869C 48 Y2FSX PHA ;enter here for FINDOP 0059 869D 8A TXA 0060 869E 48 PHA 0061 869F 0062 869F 98 TYA ;get the handle 0063 86A0 90 02 BCC Y2FSL5 ;detect 0-handle 0064 86A2 F0 0F BEQ Y2FSL4 0065 86A4 38 Y2FSL5 SEC 0066 86A5 E9 1F SBCIM HAND -&01 ;base for FS handles 0067 86A7 AA TAX ;>0 0068 86A8 A9 01 LDAIM ONE 0069 86AA 0A Y2FSL2 ASLA ;this loop returns 0 for invalid handles 0070 86AB CA DEX 0071 86AC D0 FC BNE Y2FSL2 ;set up the handle 0072 86AE 6A RORA ;shift right to adjust 0073 86AF 0074 86AF A8 TAY 0075 86B0 D0 01 BNE Y2FSL4 ;detect bad handle 0076 86B2 88 DEY ;pass $FF as handle 0077 86B3 68 Y2FSL4 PLA 0078 86B4 AA TAX 0079 86B5 68 PLA 0080 86B6 60 RTS ;return with Y=FS handle 0081 86B7 0082 86B7 FS2A ;handle passed in A 0083 86B7 ;Need to convert FS to internal form. 0084 86B7 A2 1F LDXIM HAND - 1 0085 86B9 E8 FS2AL1 INX 0086 86BA 4A LSRA 0087 86BB D0 FC BNE FS2AL1 0088 86BD 8A TXA 0089 86BE 60 RTS 0090 86BF 0091 86BF ;Return with A=internal form 0092 86BF A2 04 DATA0 LDXIM FOUR 0093 86C1 B5 AF DATA01 LDAAX WORK -&01 0094 86C3 55 B3 EORAX WORK +&03 ;testing for zero data 0095 86C5 D0 03 BNE DATA02 0096 86C7 CA DEX 0097 86C8 D0 F7 BNE DATA01 0098 86CA 60 DATA02 RTS ;return Z=1 for no data 0099 86CB 0100 86CB A2 20 HANDLE LDXIM HAND 0101 86CD A0 27 LDYIM HAND +&07 0102 86CF 60 HANDX RTS ;return the bounds on FS handles 0103 86D0 0104 86D0 0D 07 0E SETEOF ORA EOF 0105 86D3 D0 05 BNE SETCLR 0106 86D5 0107 86D5 49 FF CLREOF EORIM FILLER 0108 86D7 2D 07 0E AND EOF 0109 86DA 0110 86DA 8D 07 0E SETCLR STA EOF 0111 86DD 60 RTS 0112 86DE 0113 86DE 0114 86DE LNK NFS05 0001 86DE ; > NFS05 0002 86DE TTL Filing System 0003 86DE OPT VIIIX Acorn macro assembler Page 18 Filing System 0004 86DE ; *********************** 0005 86DE ; ***************************** 0006 86DE ; ******** OSFILE ******* 0007 86DE ; ***************************** 0008 86DE ; *********************** 0009 86DE 0010 86DE 0011 86DE ; OSFILE is a MOS call which deals with almost all 0012 86DE ; operations concerning Files which can be performed 0013 86DE ; using the file-title. Such operations include 0014 86DE ; Loading, Saving, Reading and Writing catalogue info 0015 86DE ; for existing files. All calls are associated with 0016 86DE ; a control block and the A register, to determine the 0017 86DE ; operation involved. 0018 86DE 0019 86DE ; X,Y -> -------------------- 0020 86DE ; : Pointer to title : (2) 0021 86DE ; -------------------- 0022 86DE ; : Load Address : (4) 0023 86DE ; -------------------- 0024 86DE ; : Exec Address : (4) 0025 86DE ; -------------------- 0026 86DE ; : Data start [length]: (4) 0027 86DE ; -------------------- 0028 86DE ; : Data end [Protn.] : (4) 0029 86DE ; -------------------- 0030 86DE 0031 86DE ;A = &FF -> LOAD file. If byte 6 of CB = 0 0032 86DE ;then load to supplied address else load to file address. 0033 86DE ;A = 0 -> SAVE file 0034 86DE ;A = 1,5 see CHARGS 0035 86DE 0036 86DE A0 01 QUOTES LDYIM ONE 0037 86E0 B1 BB FILE1 LDAIY TEMPX 0038 86E2 99 F2 00 STAAY &F2 0039 86E5 88 DEY 0040 86E6 10 F8 BPL FILE1 0041 86E8 0042 86E8 A0 00 QUOTED LDYIM &00 ;routine entered here too 0043 86EA A2 FF QUOTER LDXIM &FF 0044 86EC 18 CLC 0045 86ED 20 C2 FF JSR GSINIT 0046 86F0 F0 0B BEQ QUOTE2 ;look for null string 0047 86F2 20 C5 FF QUOTE1 JSR GSREAD 0048 86F5 B0 06 BCS QUOTE2 ;continue until C=1 0049 86F7 E8 INX 0050 86F8 9D 30 0E STAAX FNAME ;Y,A updated 0051 86FB 90 F5 BCC QUOTE1 0052 86FD E8 QUOTE2 INX 0053 86FE A9 0D LDAIM CR 0054 8700 9D 30 0E STAAX FNAME ;fill in CR 0055 8703 A9 30 LDAIM FNAME 0056 8705 85 BE STA POINTR 0057 8707 A9 0E LDAIM /(FNAME ) 0058 8709 85 BF STA POINTR +&01 0059 870B 60 RTS 0060 870C 0061 870C FILEOP 0062 870C 20 4D 86 JSR REGPUT 0063 870F 20 DE 86 JSR QUOTES 0064 8712 A5 BD LDA TEMPA ;test operation 0065 8714 10 7A BPL SAVEOP ;do a save operation 0066 8716 C9 FF CMPIM &FF 0067 8718 F0 03 BEQ LOADOP ;only allow legal operations 0068 871A 4C B3 89 JMP REGGET ;else return 0069 871D 0070 871D TTL OSFILE - load 0071 871D 0072 871D 20 82 8D LOADOP JSR COPYCL ;copy the filename 0073 8720 A0 02 LDYIM FCLOAD ;Y=Fn. code, X= buffer extent 0074 8722 0075 8722 A9 92 LODCMD LDAIM PLDATA ;enter here on load as command 0076 8724 85 97 STA ESCAP ;** 9/12/83 ** 0077 8726 8D 02 0F STA HDRURD ;fudge header to carry data port 0078 8729 ; LDAIM DLOAD 0079 8729 20 BD 83 JSR DOFSUP 0080 872C 0081 872C A0 06 LDYIM SIX 0082 872E B1 BB LDAIY TEMPX ;get exec flag 0083 8730 D0 08 BNE LODFIL ;if flag unset then skip loadaddress copy 0084 8732 0085 8732 20 2F 88 JSR LODR1 ;copy from CB to WORK 0086 8735 20 41 88 JSR LODR2 ;copy from RXBUF to CB 0087 8738 90 06 BCC LODCOM 0088 873A 0089 873A 20 41 88 LODFIL JSR LODR2 ;ammend CB with final data 0090 873D 20 2F 88 JSR LODR1 ;copy data into WORK 0091 8740 0092 8740 A0 04 LODCOM LDYIM FOUR ;C=0 here from either branch 0093 8742 B5 B0 LODSIZ LDAAX WORK 0094 8744 95 C8 STAAX RXCB +HPTR 0095 8746 7D 0D 0F ADCAX RXBUF +&08 ;.. WORK4-7 hold hi pointer 0096 8749 95 B4 STAAX WORK +&04 ;calculate file size 0097 874B E8 INX 0098 874C 88 DEY ;count on Y 0099 874D D0 F3 BNE LODSIZ ;loop three times for add 0100 874F 38 SEC 0101 8750 ED 10 0F SBC RXBUF +&0B ;C=0 here 0102 8753 85 B7 STA WORK +&07 0103 8755 0104 8755 20 65 87 JSR LODLP3 ;do the data xfer 0105 8758 0106 8758 A2 02 LDXIM TWO 0107 875A BD 10 0F LODATT LDAAX RXBUF +&0B ;move the date/protn. 0108 875D 9D 05 0F STAAX RXBUF 0109 8760 CA DEX 0110 8761 10 F7 BPL LODATT 0111 8763 30 73 BMI SAVRTS ;dual exit routine 0112 8765 0113 8765 ;Entry conditions for LODLP3 are that WORK[0:7] 0114 8765 ;hold the low and high addresses of the buffer 0115 8765 ;being received into. These locations are altered 0116 8765 ;during the routine and need not neccesarily 0117 8765 ;reside in 0-page 0118 8765 0119 8765 LODLP3 ;main loop for block transfer from FS 0120 8765 0121 8765 20 BF 86 JSR DATA0 ;test for zero data 0122 8768 F0 25 BEQ LODX 0123 876A 0124 876A A9 92 LDAIM PLDATA Acorn macro assembler Page 19 OSFILE - load 0125 876C 85 C1 STA RXCB + PORT ;set up the data port 0126 876E 0127 876E A2 03 LODLPV LDXIM THREE 0128 8770 B5 C8 LODLPX LDAAX RXCB + HPTR 0129 8772 95 C4 STAAX RXCB + LPTR 0130 8774 B5 B4 LDAAX WORK +&04 0131 8776 95 C8 STAAX RXCB + HPTR 0132 8778 CA DEX 0133 8779 10 F5 BPL LODLPX 0134 877B 0135 877B A9 7F LDAIM RXRDY 0136 877D 85 C0 STA RXCB ;ready for receive 0137 877F 20 30 85 JSR WAITFS 0138 8782 0139 8782 A0 03 LDYIM THREE 0140 8784 B9 C8 00 LODCHK LDAAY RXCB +HPTR 0141 8787 59 B4 00 EORAY WORK +&04 0142 878A D0 E2 BNE LODLPV 0143 878C 88 DEY 0144 878D 10 F5 BPL LODCHK 0145 878F 60 LODX RTS 0146 8790 0147 8790 TTL OSFILE - Save 0148 8790 0149 8790 ; ********************* 0150 8790 ;****** SAVE ****** 0151 8790 ; ********************* 0152 8790 0153 8790 SAVEOP ;called when A=0 0154 8790 0155 8790 F0 03 BEQ SAVEL1 0156 8792 4C D1 88 JMP CHARGS 0157 8795 A2 04 SAVEL1 LDXIM FOUR 0158 8797 A0 0E LDYIM &0E 0159 8799 0160 8799 SAVSIZ 0161 8799 B1 BB LDAIY TEMPX 0162 879B 99 A6 00 STAAY WORK -&0A ;save at WORK4->7 0163 879E 20 4E 88 JSR DOWN4 0164 87A1 F1 BB SBCIY TEMPX ;take start from end 0165 87A3 99 03 0F STAAY TXBUF -&02 ;save size 0166 87A6 48 PHA ;eliminate copying 0167 87A7 B1 BB LDAIY TEMPX 0168 87A9 99 A6 00 STAAY WORK -&0A ;save start addr for now 0169 87AC 68 PLA ;restore size 0170 87AD 91 BB STAIY TEMPX ;update CB 0171 87AF 20 3B 88 JSR UP5 0172 87B2 CA DEX ;count on X 0173 87B3 D0 E4 BNE SAVSIZ ;four byte size spec'd 0174 87B5 0175 87B5 A0 09 LDYIM NINE 0176 87B7 B1 BB SAVLP1 LDAIY TEMPX 0177 87B9 99 03 0F STAAY TXBUF -&02 0178 87BC 88 DEY 0179 87BD D0 F8 BNE SAVLP1 ;copy load and exec addresses 0180 87BF A9 91 LDAIM PSAACK 0181 87C1 85 97 STA ESCAP ;** 9/12/83 ** 0182 87C3 8D 02 0F STA HDRURD 0183 87C6 85 B8 STA WORK +&08 ;save ack. port for later 0184 87C8 0185 87C8 A2 0B LDXIM &0B 0186 87CA 20 84 8D JSR COPYCX 0187 87CD 0188 87CD A0 01 LDYIM FCSAVE 0189 87CF ; LDAIM DREPLY 0190 87CF 20 BD 83 JSR DOFSUP ;do the operation 0191 87D2 AD 05 0F LDA RXBUF ;get data port 0192 87D5 0193 87D5 20 53 88 JSR SAVLP ;else get the data 0194 87D8 0195 87D8 AD 03 0F SAVRTS LDA RXBUF - 2 ;Store fs indication from command code 0196 87DB 48 PHA 0197 87DC 0198 87DC 20 F3 83 JSR DOFSL8 ;share RC inspection code 0199 87DF 0200 87DF ;Screen monitor routine 0201 87DF ;Assumes the OSFILE control block 0202 87DF ;is up to date and the TEMPX points 0203 87DF ;at it, also that POINTR points at 0204 87DF ;the file title 0205 87DF 0206 87DF 68 PLA ;Restore fs type indication 0207 87E0 0208 87E0 AC 06 0E LDY MESS 0209 87E3 F0 32 BEQ SAVJD2 0210 87E5 A0 00 LDYIM &00 ;messages on here 0211 87E7 0212 87E7 AA TAX ;Check fd type indication 0213 87E8 F0 05 BEQ MONL1 ;Z implies old FS 0214 87EA 20 98 8D JSR INFOLP ;else print string in buffer 0215 87ED 30 14 BMI MONL3 ;exit condition 0216 87EF 0217 87EF B1 BE MONL1 LDAIY POINTR 0218 87F1 [ &FF=0 0223 87F1 | 0224 87F1 C9 21 CMPIM &21 0225 87F3 90 06 BCC MONL2 0226 87F5 ] 0227 87F5 20 E3 FF JSR OSASCI 0228 87F8 C8 INY 0229 87F9 D0 F4 BNE MONL1 0230 87FB 0231 87FB 20 7B 8D MONL2 JSR NUMSP 0232 87FE C8 INY 0233 87FF C0 0C CPYIM &0C 0234 8801 90 F8 BCC MONL2 0235 8803 0236 8803 A0 05 MONL3 LDYIM &05 0237 8805 20 70 8D JSR NUMOUT ;print load address 0238 8808 0239 8808 A0 09 LDYIM &09 0240 880A 20 70 8D JSR NUMOUT 0241 880D A0 0C LDYIM &0C 0242 880F A2 03 LDXIM THREE 0243 8811 20 72 8D JSR NUM01 0244 8814 0245 8814 20 E7 FF JSR OSNEWL 0246 8817 0247 8817 SAVJD2 0248 8817 ; LDXIM 0 ; ****************************** Bruce 27/2/86 *********** 0249 8817 8E 08 0F STX RXBUF +&03 ;zero byte for attributes Acorn macro assembler Page 20 OSFILE - Save 0250 881A A0 0E LDYIM &0E 0251 881C AD 05 0F LDA RXBUF ;convert protection format 0252 881F 20 D9 85 JSR FSBBC 0253 8822 91 BB SAVJD3 STAIY TEMPX ;fill in the CB 0254 8824 C8 INY 0255 8825 B9 F7 0E LDAAY RXBUF -&0E ;Read next byte 0256 8828 C0 12 CPYIM &12 0257 882A D0 F6 BNE SAVJD3 0258 882C 0259 882C 4C B3 89 SAVEXX JMP REGGET ;restore registers and return 0260 882F 0261 882F LODR1 ;routine to copy from CB into WORK 0262 882F A0 05 LDYIM FIVE 0263 8831 B1 BB LODRL1 LDAIY TEMPX 0264 8833 99 AE 00 STAAY WORK -&02 ;grab from LOAD address area 0265 8836 88 DEY 0266 8837 C0 02 CPYIM TWO 0267 8839 B0 F6 BCS LODRL1 ;stop after 4 bytes 0268 883B 0269 883B C8 UP5 INY ;pointer manipulation 0270 883C C8 UP4 INY ;routines 0271 883D C8 INY 0272 883E C8 INY 0273 883F C8 INY 0274 8840 0275 8840 60 RTS 0276 8841 0277 8841 LODR2 ;routine to copy LOAD and EXEC addr to CB 0278 8841 A0 0D LDYIM &0D 0279 8843 8A TXA ;zero here 0280 8844 91 BB LODRL2 STAIY TEMPX 0281 8846 B9 02 0F LDAAY RXBUF - &03 0282 8849 88 DEY 0283 884A C0 02 CPYIM TWO 0284 884C B0 F6 BCS LODRL2 0285 884E 0286 884E 88 DOWN4 DEY ;space saving 10/3/83 0287 884F 88 DOWN3 DEY 0288 8850 88 DEY 0289 8851 88 DEY 0290 8852 60 RTS 0291 8853 0292 8853 ;Entry conditions for this routine are that 0293 8853 ;WORK[0:7] hold the low and high addresses of 0294 8853 ;the data being sent. WORK[8] holds the port 0295 8853 ;on which to receive the byte acknowledges for 0296 8853 ;each data block. 0297 8853 0298 8853 SAVLP 0299 8853 48 PHA ;save this for call 0300 8854 20 BF 86 JSR DATA0 0301 8857 F0 74 BEQ EOFRTS 0302 8859 0303 8859 A9 00 SAVLP2 LDAIM ZERO ;Push 4-byte buffer value 0304 885B 48 PHA 0305 885C 48 PHA 0306 885D AA TAX ;Set counter = 0 0307 885E AD 07 0F LDA RXBUF + 2 0308 8861 48 PHA 0309 8862 AD 06 0F LDA RXBUF + 1 0310 8865 48 PHA 0311 8866 A0 04 LDYIM 4 0312 8868 18 CLC 0313 8869 0314 8869 B5 B0 SAVJD1 LDAAX WORK 0315 886B 95 C4 STAAX TXCB +LPTR 0316 886D 68 PLA 0317 886E 75 B0 ADCAX WORK 0318 8870 95 C8 STAAX RXCB +HPTR 0319 8872 95 B0 STAAX WORK 0320 8874 E8 INX 0321 8875 88 DEY 0322 8876 D0 F1 BNE SAVJD1 0323 8878 ;BCS SAVCC ;wrap-round check 0324 8878 0325 8878 ;Y=0, X=4 here 0326 8878 38 SEC 0327 8879 B9 B0 00 SAVCHK LDAAY WORK ;get current end pointer 0328 887C F9 B4 00 SBCAY WORK +&04 0329 887F C8 INY 0330 8880 CA DEX 0331 8881 D0 F6 BNE SAVCHK ;loop 4 times 0332 8883 90 09 BCC SAVMOR ;carry set on end condition 0333 8885 0334 8885 A2 03 SAVCC LDXIM &03 ;come here on wraparound 0335 8887 B5 B4 SAVEND LDAAX WORK +&04 0336 8889 95 C8 STAAX TXCB +HPTR 0337 888B CA DEX 0338 888C 10 F9 BPL SAVEND 0339 888E 0340 888E 68 SAVMOR PLA ;get data port 0341 888F 48 PHA ;save this again 0342 8890 08 PHP 0343 8891 85 C1 STA RXCB +PORT 0344 8893 A9 80 LDAIM TXFLAG 0345 8895 85 C0 STA TXCB 0346 8897 20 F7 85 JSR FSXMIT ;send the data 0347 889A A5 B8 LDA WORK +&08 0348 889C 20 89 83 JSR FSRXCC ;ready for reply 0349 889F 28 PLP 0350 88A0 B0 2B BCS EOFRTS 0351 88A2 A9 91 LDAIM PSAACK 0352 88A4 85 C1 STA RXCB + PORT 0353 88A6 ; LDAIM DSAVE 0354 88A6 0355 88A6 E6 C4 INC RXCB +LPTR ;RX ack. into RC slot, avoiding CC which indicates 0356 88A8 ;which fs type we are communicating with. 0357 88A8 ;Note assumes RXBUF don't cross a page !! 0358 88A8 0359 88A8 20 30 85 JSR WAITFS 0360 88AB D0 AC BNE SAVLP2 0361 88AD 0362 88AD TTL OSFSCM - EOF 0363 88AD 0364 88AD ; The BBCpu BASIC has a peculiar method of recognising 0365 88AD ; the end of an open file; the last byte is signalled, 0366 88AD ; the next byte returns with carry set and the next is 0367 88AD ; an error. The user may have upto eight files open 0368 88AD ; at once, so a byte is used to hold eight hints about 0369 88AD ; the state of each file. The hint bit, if zero, indicates 0370 88AD ; that the user is certainly NOT at the end of file, Acorn macro assembler Page 21 OSFSCM - EOF 0371 88AD ; otherwise the FS must be interrogated. The EOF status 0372 88AD ; is updated after GETBYTE(S),OPEN and EOF operations. 0373 88AD ; The hint is unset on a PTR update operation. 0374 88AD 0375 88AD 0376 88AD EOFR 0377 88AD ;hint set = 0 0378 88AD 0379 88AD 48 PHA 0380 88AE 8A TXA ;handle passed in X 0381 88AF 20 9A 86 JSR Y2FSA ;convert to FS form 0382 88B2 0383 88B2 98 TYA 0384 88B3 2D 07 0E AND EOF ;get the flag bit 0385 88B6 AA TAX ;return it in X 0386 88B7 F0 14 BEQ EOFRTS ;if zero then done 0387 88B9 48 PHA ;save true handle 0388 88BA 8C 05 0F STY TXBUF 0389 88BD A0 11 LDYIM FCEOF 0390 88BF A2 01 LDXIM ONE 0391 88C1 20 C7 83 JSR DOFSOP 0392 88C4 68 PLA ;A=true handle 0393 88C5 AE 05 0F LDX RXBUF ;X<>0 indicates end-of-file 0394 88C8 D0 03 BNE EOFRTS 0395 88CA 20 D5 86 JSR CLREOF 0396 88CD 68 EOFRTS PLA 0397 88CE A4 BC LDY TEMPY 0398 88D0 60 RTS ;restore A and Y 0399 88D1 0400 88D1 TTL OSFILE - args 1->6 0401 88D1 0402 88D1 ; *********************** 0403 88D1 ;********* OS-ARGS CALLS ********* 0404 88D1 ; *********************** 0405 88D1 0406 88D1 CHARGS 0407 88D1 ;concerned with READING and WRITING of file 0408 88D1 ;statistics. Operation is specified by A, passed 0409 88D1 ;in the call 0410 88D1 0411 88D1 0412 88D1 ;From the current specification :- 0413 88D1 0414 88D1 ;A = 1 : WRITE catalogue info for file 0415 88D1 ;A = 2 : WRITE load address for file 0416 88D1 ;A = 3 : WRITE exec address for file 0417 88D1 ;A = 4 : WRITE attributes for file 0418 88D1 ;A = 5 : READ file's catalogue information, Type in A 0419 88D1 0420 88D1 8D 05 0F STA TXBUF ;save A as FS arg 0421 88D4 C9 06 CMPIM SIX ;OSFILE delete 0422 88D6 F0 3F BEQ CHA6 0423 88D8 B0 48 BCS CHA6XX ;error return 0424 88DA C9 05 CMPIM FIVE 0425 88DC F0 52 BEQ CHA5 0426 88DE C9 04 CMPIM FOUR 0427 88E0 F0 44 BEQ CHA4 ;slightly different 0428 88E2 C9 01 CMPIM ONE 0429 88E4 F0 15 BEQ CHA1 ;also a bit different 0430 88E6 0A ASLA 0431 88E7 0A ASLA ;multiply by four 0432 88E8 A8 TAY ;form offset 0433 88E9 20 4F 88 JSR DOWN3 0434 88EC A2 03 LDXIM THREE 0435 88EE B1 BB CHALP1 LDAIY TEMPX 0436 88F0 9D 06 0F STAAX TXBUF +&01 0437 88F3 88 DEY 0438 88F4 CA DEX 0439 88F5 10 F7 BPL CHALP1 0440 88F7 A2 05 LDXIM FIVE 0441 88F9 D0 15 BNE CHASK2 ;skip a bit 0442 88FB 0443 88FB 20 CF 85 CHA1 JSR CHAPRT ;get protection status 0444 88FE 8D 0E 0F STA TXBUF +&09 0445 8901 A0 09 LDYIM &09 0446 8903 A2 08 LDXIM &08 0447 8905 B1 BB CHALP2 LDAIY TEMPX ;copy all LOAD, EXEC address 0448 8907 9D 05 0F STAAX TXBUF 0449 890A 88 DEY 0450 890B CA DEX 0451 890C D0 F7 BNE CHALP2 0452 890E A2 0A LDXIM &0A 0453 8910 20 84 8D CHASK2 JSR COPYCX ;filename after details 0454 8913 A0 13 LDYIM FCSET 0455 8915 D0 05 BNE CHAFSX 0456 8917 0457 8917 20 82 8D CHA6 JSR COPYCL ;copy the filename 0458 891A A0 14 LDYIM FCDEL ;dec 20 0459 891C 2C B3 83 CHAFSX BIT ALL1S 0460 891F 20 C8 83 JSR DOFSER ;perform the delete 0461 8922 B0 42 CHA6XX BCS CHA5FY ;exit if error found 0462 8924 90 71 BCC CHA5FX 0463 8926 ;[NB. no copy back of ex-cat info] 0464 8926 0465 8926 20 CF 85 CHA4 JSR CHAPRT 0466 8929 8D 06 0F STA TXBUF +&01 0467 892C A2 02 LDXIM TWO 0468 892E D0 E0 BNE CHASK2 0469 8930 0470 8930 A2 01 CHA5 LDXIM ONE ;offset in the buffer 0471 8932 20 84 8D JSR COPYCX ;copy filename 0472 8935 A0 12 LDYIM FCREAD ;function code to read args 0473 8937 20 C7 83 JSR DOFSOP ;get the info from FS 0474 893A 0475 893A AD 11 0F LDA RXBUF + &0C ;get the access byte 0476 893D 8E 11 0F STX RXBUF +&0C 0477 8940 8E 14 0F STX RXBUF +&0F 0478 8943 20 D9 85 JSR FSBBC ;convert the protection format 0479 8946 0480 8946 ; LDX RXBUF ;get the existence flag 0481 8946 ; BEQ CHA5FL ;.. object not found 0482 8946 0483 8946 A0 0E LDYIM &0E 0484 8948 91 BB STAIY TEMPX ;set access byte 0485 894A 88 DEY 0486 894B A2 0C LDXIM &0C ;counter thru RXBUF 0487 894D BD 05 0F COPYFS LDAAX RXBUF ;copy from FS buffer to CB 0488 8950 91 BB STAIY TEMPX ;count on Y 0489 8952 88 DEY 0490 8953 CA DEX 0491 8954 D0 F7 BNE COPYFS Acorn macro assembler Page 22 OSFILE - args 1->6 0492 8956 0493 8956 E8 INX ;X=1 0494 8957 E8 INX 0495 8958 A0 11 LDYIM &11 0496 895A BD 12 0F CHA5LP LDAAX RXBUF +&0D ;copy the date 0497 895D 91 BB STAIY TEMPX ;write the attributes to the CB 0498 895F 88 DEY 0499 8960 CA DEX 0500 8961 10 F7 BPL CHA5LP 0501 8963 AD 05 0F LDA RXBUF ;get existence flag 0502 8966 ;CHA5FL 0503 8966 ; TXA 0504 8966 10 4D CHA5FY BPL GETXY ;restore X,Y and return 0505 8968 0506 8968 TTL OSARGS 0507 8968 0508 8968 ; *************************** 0509 8968 ; ***** OSARGS ***** 0510 8968 ; *************************** 0511 8968 0512 8968 0513 8968 ; A routine for reading/writing a file's attributes 0514 8968 ; when only the handle is known. X points to four 0515 8968 ; zero-page locations, Y = handle, A = op. type. 0516 8968 ; The data is read/copied via the zero page bytes. 0517 8968 0518 8968 OSARGS ;general entry point 0519 8968 20 4D 86 JSR REGPUT ;save registers 0520 896B C9 03 CMPIM &03 0521 896D B0 44 BCS REGGET ;exit if 'ensure' attempted 0522 896F C0 00 CPYIM ZERO 0523 8971 F0 47 BEQ OSARG0 ;Y=0, more calls for OSARGS 0524 8973 20 9B 86 JSR Y2FS ;convert handle 0525 8976 8C 05 0F STY TXBUF ;store handle 0526 8979 4A LSRA ;get operation 0527 897A 8D 06 0F STA TXBUF +&01 ;set the argument 0528 897D 0529 897D ;A=0 : read pointer 0530 897D ;A=1 : write pointer 0531 897D ;A=2 : read extent 0532 897D 0533 897D B0 1A BCS SETARG ;write the pointer 0534 897F 0535 897F A0 0C LDYIM FCGARG 0536 8981 A2 02 LDXIM TWO 0537 8983 20 C7 83 JSR DOFSOP ;do the reading 0538 8986 85 BD STA TEMPA ;indicate operation performed 0539 8988 A6 BB LDX TEMPX ;restore X value 0540 898A A0 02 LDYIM TWO ;Y=2 0541 898C 95 03 STAAX THREE 0542 898E B9 05 0F SETLP1 LDAAY RXBUF ;copy data to zero page 0543 8991 95 02 STAAX TWO ;indexed by X 0544 8993 CA DEX 0545 8994 88 DEY 0546 8995 10 F7 BPL SETLP1 0547 8997 90 1A CHA5FX BCC REGGET ;tidy up and return 0548 8999 0549 8999 SETARG ;data in 0-page off X 0550 8999 98 TYA 0551 899A 48 PHA ;save handle 0552 899B A0 03 LDYIM THREE 0553 899D B5 03 SETLP2 LDAAX THREE 0554 899F 99 07 0F STAAY TXBUF +&02 0555 89A2 CA DEX 0556 89A3 88 DEY 0557 89A4 10 F7 BPL SETLP2 ;copy three bytes 0558 89A6 A0 0D LDYIM FCSARG 0559 89A8 A2 05 LDXIM FIVE 0560 89AA 20 C7 83 JSR DOFSOP ;do the operation 0561 89AD 86 BD STX TEMPA ;return A=0 if operation performed 0562 89AF 68 PLA ;restore handle 0563 89B0 20 D0 86 JSR SETEOF ;and unset the hint 0564 89B3 REGGET ;recovery of regs from usual locations 0565 89B3 A5 BD LDA TEMPA 0566 89B5 A6 BB GETXY LDX TEMPX ;restore X,Y only 0567 89B7 A4 BC LDY TEMPY 0568 89B9 60 RTS 0569 89BA 0570 89BA OSARG0 ;come here when Y=0 0571 89BA C9 02 CMPIM 2 0572 89BC F0 07 BEQ OSARG3 0573 89BE B0 14 BCS FINDEX 0574 89C0 A8 TAY ;A=0 or 1 0575 89C1 D0 05 BNE OSARG1 ;return pointer to rest of command line 0576 89C3 A9 0A LDAIM 10 ;magic network number 0577 89C5 4A OSARG3 LSRA ;return A=a/2 here 0578 89C6 D0 ED BNE GETXY ;all done 0579 89C8 B9 0A 0E OSARG1 LDAAY JCMNDP 0580 89CB 91 BB STAIY TEMPX ;tricky, TEMPY=0 ! 0581 89CD 88 DEY 0582 89CE 10 F8 BPL OSARG1 ;copy the last command line residue 0583 89D0 94 02 STYZX &2 ;stuff top bytes with $FF ** 4/8/83 ** 0584 89D2 94 03 STYZX &3 0585 89D4 A9 00 FINDEX LDAIM ZERO ;must return A=0 here 0586 89D6 10 DD OSEXIT BPL GETXY 0587 89D8 0588 89D8 TTL OSFIND 0589 89D8 0590 89D8 ; *********************** 0591 89D8 ; *************************** 0592 89D8 ; ****** OSFIND ***** 0593 89D8 ; *************************** 0594 89D8 ; *********************** 0595 89D8 0596 89D8 0597 89D8 ;OSFILE is the system call to open a file for read/ 0598 89D8 ;write/update. The operation is specified by A. 0599 89D8 ;A = 0 -> Close the file whose handle is given in Y. 0600 89D8 ;A <>0 -> Open file whose name is pointed at by X,Y. 0601 89D8 ;If A = &80 then writing and updating 0602 89D8 ;If A = &C0 then reading only 0603 89D8 0604 89D8 0605 89D8 ;The two flag bytes are set as follows : 0606 89D8 ;Flag 1 = 1 -> READ else WRITING/UPDATE 0607 89D8 ;Flag 2 = 1 -> EXISTS else WILL BE CREATED 0608 89D8 0609 89D8 0610 89D8 ;When a file is opened for reading then it must 0611 89D8 ;already exist, if opened for writing/update 0612 89D8 ;then it need NOT exist. Acorn macro assembler Page 23 OSFIND 0613 89D8 0614 89D8 0615 89D8 FINDOP 0616 89D8 20 49 86 JSR PUTREG 0617 89DB 38 SEC ;detect 0-handle exception 0618 89DC 20 9C 86 JSR Y2FSX ;convert Y 0619 89DF AA TAX ;check operation type 0620 89E0 F0 2E BEQ CLOSE ;A=0 so do close, handle in Y 0621 89E2 0622 89E2 29 3F ANDIM &3F ;check top bits only 0623 89E4 D0 EE BNE FINDEX ;exit if invalid parameter 0624 89E6 8A TXA ;restore A 0625 89E7 0626 89E7 49 80 EORIM &80 ;flip top bit only 0627 89E9 0A ASLA 0628 89EA 8D 05 0F STA RXBUF 0629 89ED 2A ROLA 0630 89EE 8D 06 0F STA RXBUF +&01 0631 89F1 20 E8 86 JSR QUOTED ;strip quotes 0632 89F4 A2 02 LDXIM TWO 0633 89F6 20 84 8D JSR CATLP0 ;copy the filename 0634 89F9 0635 89F9 A0 06 LDYIM FCFIND ;= 6 0636 89FB 2C B3 83 BIT ALL1S ;set V 0637 89FE 20 C8 83 JSR DOFSER 0638 8A01 B0 B2 BCS GETXY ;skip if error found 0639 8A03 AD 05 0F OPEN1 LDA RXBUF ;get the handle returned 0640 8A06 AA TAX 0641 8A07 20 D0 86 JSR SETEOF ;can't be EOF yet 0642 8A0A 8A TXA ;restore handle 0643 8A0B [ &FF=0 0647 8A0B ] 0648 8A0B 20 B7 86 JSR FS2A ;convert the handle to internal form 0649 8A0E D0 A5 OPENEX BNE GETXY ;restore X,Y and return 0650 8A10 0651 8A10 CLOSE 0652 8A10 98 TYA ;detect CLOSE#0 0653 8A11 D0 07 BNE CLOSE1 0654 8A13 A9 77 LDAIM &77 0655 8A15 20 F4 FF JSR OSBYTE 0656 8A18 A0 00 LDYIM ZERO 0657 8A1A 8C 05 0F CLOSE1 STY RXBUF 0658 8A1D A2 01 LDXIM ONE ;do not change this value 0659 8A1F A0 07 LDYIM FCSHUT 0660 8A21 20 C7 83 JSR DOFSOP 0661 8A24 AD 05 0F LDA RXBUF 0662 8A27 20 D0 86 JSR SETEOF ;so that next EOF goes to FS 0663 8A2A 90 87 CLOSEX BCC REGGET 0664 8A2C 0665 8A2C TTL OSFSCM - *OPT command 0666 8A2C 0667 8A2C F0 0B OPTION BEQ OPT0 ;** 22/8/83 ** 0668 8A2E E0 04 CPXIM FOUR 0669 8A30 D0 04 BNE OPTERR ;first parm must be 4 0670 8A32 C0 04 CPYIM FOUR 0671 8A34 90 0D BCC OPTL1 ;second must be less than 4 0672 8A36 CA OPTERR DEX ;look for message switch 0673 8A37 D0 05 BNE OPTER1 ;nb C=0 here 0674 8A39 8C 06 0E OPT0 STY MESS ;save flag 0675 8A3C 90 12 BCC OPT2 ;and exit 0676 8A3E A9 07 OPTER1 LDAIM &07 0677 8A40 4C 12 85 JMP NLISNE ;error string 0678 8A43 8C 05 0F OPTL1 STY TXBUF 0679 8A46 A0 16 LDYIM FCOPT 0680 8A48 20 C7 83 JSR DOFSOP ;set this in the fileserver 0681 8A4B A4 BC LDY TEMPY 0682 8A4D 8C 05 0E STY OPT ;update the local copy 0683 8A50 90 D8 OPT2 BCC CLOSEX ;clean up 0684 8A52 0685 8A52 TTL OSGBPB 0686 8A52 0687 8A52 ; **************************** 0688 8A52 ; **** MULTIPLE BYTE **** 0689 8A52 ; *** RANDOM ACCESS *** 0690 8A52 ; ************************ 0691 8A52 0692 8A52 ;That is to say, GETBYTES and PUTBYTES 0693 8A52 0694 8A52 ;------------------ 0695 8A52 ;: Handle : (1) 0696 8A52 ;----------------- 0697 8A52 ;: Pointer to data : (4) 0698 8A52 ;----------------- 0699 8A52 ;: No. to transfer : (4) 0700 8A52 ;----------------- 0701 8A52 ;: Offset in file : (4) 0702 8A52 ;----------------- 0703 8A52 0704 8A52 ;The control block is passed via X,Y as usual plus 0705 8A52 ;A indicating which operation is to be performed. 0706 8A52 ;A = 1 -> PB using supplied pointer 0707 8A52 ;A = 2 -> PB using file pointer 0708 8A52 ;A = 3 -> GB using supplied pointer 0709 8A52 ;A = 4 -> GB using file pointer 0710 8A52 0711 8A52 ;C = 0 -> all ok, transfer complete 0712 8A52 ;C = 1 -> end-of-file encountered 0713 8A52 0714 8A52 ;Due to spec. changes there now exist four more 0715 8A52 ;entry points to this routine. These are untidy 0716 8A52 ;but useful in theory. Unfortunately, they involve 0717 8A52 ;passing data across the TUBE, the only place in 0718 8A52 ;the entire document which needs this 0719 8A52 0720 8A52 ;The new entry points are: 0721 8A52 ;A = 5 -> Read Disc title, cycle number, option 0722 8A52 ;A = 6 -> Read Current Directory 0723 8A52 ;A = 7 -> Read Current Library 0724 8A52 ;A = 8 -> Read filenames (specified by CB) 0725 8A52 0726 8A52 ;The data format is as follows: 0727 8A52 ; 0728 8A52 ;A Null object name is denoted by a namelength of 0 chars. 0729 8A52 0730 8A52 A0 09 GBPBXY LDYIM &09 0731 8A54 20 59 8A JSR GBPBXZ 0732 8A57 A0 01 GBPBXU LDYIM &01 0733 8A59 18 GBPBXZ CLC 0734 8A5A A2 FC GBPBXX LDXIM &FC ;count up to zero 0735 8A5C B1 BB GBPBXV LDAIY TEMPX 0736 8A5E 24 B2 BIT W1 ;test flag Acorn macro assembler Page 24 OSGBPB 0737 8A60 30 06 BMI GBPSUB ;if plus then sub 0738 8A62 7D 0A 0E ADCAX RXBUF - &FB 0739 8A65 4C 6B 8A JMP GBPBX 0740 8A68 FD 0A 0E GBPSUB SBCAX RXBUF -&FB 0741 8A6B 91 BB GBPBX STAIY TEMPX ;update the CB 0742 8A6D C8 INY 0743 8A6E E8 INX 0744 8A6F D0 EB BNE GBPBXV ;count four loops 0745 8A71 60 RTS 0746 8A72 0747 8A72 20 4D 86 OSBGPB JSR REGPUT ;save registers 0748 8A75 AA TAX 0749 8A76 F0 05 BEQ GBPBX0 ;A=0 so exit 0750 8A78 CA DEX 0751 8A79 E0 08 CPXIM &08 ;A>8 in call ? 0752 8A7B 90 03 BCC GBPBX1 ;No ? 0753 8A7D 4C B3 89 GBPBX0 JMP REGGET ;else exit 0754 8A80 8A GBPBX1 TXA ;set up codes 0,3 0755 8A81 A0 00 LDYIM ZERO 0756 8A83 48 PHA 0757 8A84 C9 04 CMPIM FOUR ;look for the new codes 0758 8A86 90 03 BCC GBPBE1 0759 8A88 4C 31 8B JMP OSINFO 0760 8A8B B1 BB GBPBE1 LDAIY TEMPX ;get the handle for file 0761 8A8D 20 9A 86 JSR Y2FSA ;convert the format 0762 8A90 8C 05 0F STY TXBUF 0763 8A93 A0 0B LDYIM &0B 0764 8A95 A2 06 LDXIM &06 0765 8A97 B1 BB GBPBF1 LDAIY TEMPX 0766 8A99 9D 06 0F STAAX RXBUF +&01 0767 8A9C 88 DEY 0768 8A9D C0 08 CPYIM &08 0769 8A9F D0 01 BNE GBPBF2 0770 8AA1 88 DEY ;skip top byte 0771 8AA2 CA GBPBF2 DEX 0772 8AA3 D0 F2 BNE GBPBF1 ;copy six bytes only 0773 8AA5 68 PLA ;get operation flag 0774 8AA6 4A LSRA 0775 8AA7 48 PHA 0776 8AA8 90 01 BCC GBPBL1 ;skip if A=2 or 4 0777 8AAA E8 INX ;X=0 or 1 0778 8AAB 8E 06 0F GBPBL1 STX TXBUF +&01 ;save the flag byte 0779 8AAE 0780 8AAE ;zero = use passed pointer 0781 8AAE ;non-zero = use file pointer 0782 8AAE 0783 8AAE A0 0B LDYIM FCPBYS 0784 8AB0 A2 91 LDXIM PSAACK ;ack port for save 0785 8AB2 68 PLA ;restore code >> 1 0786 8AB3 48 PHA ;save it again 0787 8AB4 F0 03 BEQ GBPBL2 ;so code must be GB 0788 8AB6 A2 92 LDXIM PLDATA 0789 8AB8 88 DEY ;and fn getbytes = fn putbytes + 1 0790 8AB9 8E 02 0F GBPBL2 STX HDRURD ;hand over the requisite port 0791 8ABC 86 B8 STX WORK +&08 ;save ack port for pickup by SAVLP 0792 8ABE A2 08 LDXIM EIGHT 0793 8AC0 AD 05 0F LDA TXBUF ;get the handle 0794 8AC3 20 B9 83 JSR DOFSBX ;do bytestream, A=handle,Y=fn.code etc. 0795 8AC6 A5 B3 LDA W2 0796 8AC8 8D 08 0E STA SEQNOS 0797 8ACB 0798 8ACB ; **** DEAL WITH THE TRANSFER **** 0799 8ACB 0800 8ACB A2 04 LDXIM FOUR 0801 8ACD ; LDYIM ONE 0802 8ACD ;C=0 on exit from DOFSBX 0803 8ACD B1 BB GBPBL3 LDAIY TEMPX 0804 8ACF 99 AF 00 STAAY WORK -&01 ;set pointers for LODIN,SAVIN 0805 8AD2 99 C7 00 STAAY RXCB + HPTR-&01 0806 8AD5 20 3C 88 JSR UP4 0807 8AD8 71 BB ADCIY TEMPX 0808 8ADA 99 AF 00 STAAY WORK -&01 0809 8ADD 20 4F 88 JSR DOWN3 0810 8AE0 CA DEX 0811 8AE1 D0 EA BNE GBPBL3 0812 8AE3 E8 INX 0813 8AE4 BD 03 0F GBPBF3 LDAAX RXBUF -&02 0814 8AE7 9D 06 0F STAAX RXBUF +&01 ;move buffer size 0815 8AEA CA DEX 0816 8AEB 10 F7 BPL GBPBF3 0817 8AED 0818 8AED 68 PLA ;restore flag 0819 8AEE D0 08 BNE GBPBL4 ;**** NOTE CONDITION **** 0820 8AF0 0821 8AF0 AD 02 0F LDA HDRURD ;get data port 0822 8AF3 20 53 88 JSR SAVLP ;PUTBYTES so save the data 0823 8AF6 B0 03 BCS GBPBL5 0824 8AF8 0825 8AF8 20 65 87 GBPBL4 JSR LODLP3 ;else load the data 0826 8AFB GBPBL5 0827 8AFB ; **** TIDY UP **** 0828 8AFB 20 F3 83 JSR DOFSL8 0829 8AFE A1 BB LDAIX TEMPX ;get the handle 0830 8B00 2C 05 0F BIT RXBUF ;bit7=1 -> EOF# 0831 8B03 30 03 BMI GBPBE 0832 8B05 20 D5 86 JSR CLREOF ;clear the hint 0833 8B08 20 D0 86 GBPBE JSR SETEOF ;fall thru is OK here 0834 8B0B 86 B2 STX W1 ;flag to indicate subtraction 0835 8B0D 20 52 8A JSR GBPBXY ;general add/sub routine 0836 8B10 C6 B2 DEC W1 ;flag to indicate addition 0837 8B12 38 SEC 0838 8B13 20 5A 8A JSR GBPBXX ;perform the operation 0839 8B16 0840 8B16 ;all done now 0841 8B16 0E 05 0F ASL RXBUF ;get the flag byte for operation 0842 8B19 ; ASLA ;shift bit 7 into carry 0843 8B19 4C D4 89 JMP FINDEX 0844 8B1C 0845 8B1C LNK NFS06 0001 8B1C 0002 8B1C ; NFS06 0003 8B1C OPT PATCH Acorn macro assembler Page 25 OSGBPB 0004 8B1C 0005 8B1C ; This code is an add-on to allow the full MOS spec 0006 8B1C ; to be reached. The messy interface tacked onto 0007 8B1C ; OSBGPB is herein dealt with. 0008 8B1C 0009 8B1C INFO5 ;return disc type info 0010 8B1C A0 15 LDYIM FCUSER 0011 8B1E 20 C7 83 JSR DOFSOP 0012 8B21 AD 05 0E LDA OPT 0013 8B24 8D 16 0F STA RXBUF + &11 ;position 18 in the buffer 0014 8B27 86 B0 STX WORK ;start position in the buffer 0015 8B29 86 B1 STX WORK +&01 0016 8B2B A9 12 LDAIM &12 0017 8B2D 85 B2 STA WORK +&02 ;counter for data 0018 8B2F D0 4E INFO5X BNE INFOT1 0019 8B31 0020 8B31 A0 04 OSINFO LDYIM FOUR ;check TUBE addresses 0021 8B33 AD 67 0D LDA TBFLAG 0022 8B36 F0 07 BEQ INFOX 0023 8B38 D1 BB CMPIY TEMPX 0024 8B3A D0 03 BNE INFOX 0025 8B3C 88 DEY 0026 8B3D F1 BB SBCIY TEMPX 0027 8B3F ;TBFLAG=0 for no tube present 0028 8B3F 85 A9 INFOX STA ROMA ;save this for later use 0029 8B41 ;ROMA=0 for no tube, <> 0 for TUBE 0030 8B41 0031 8B41 B1 BB INFO2 LDAIY TEMPX ;set up POINTR anyway 0032 8B43 99 BD 00 STAAY POINTR -&01 0033 8B46 88 DEY 0034 8B47 D0 F8 BNE INFO2 ;set up POINTR 0035 8B49 0036 8B49 68 PLA 0037 8B4A 29 03 ANDIM &03 ;low two bits only 0038 8B4C F0 CE BEQ INFO5 ;A was #0100 0039 8B4E 4A LSRA 0040 8B4F F0 02 BEQ INFO6 ;A was #0101 here 0041 8B51 B0 6B BCS INFO8 ;A was #0111 here 0042 8B53 ;A was #0110 here 0043 8B53 A8 INFO6 TAY ;A=0 or A=1 0044 8B54 B9 03 0E LDAAY CSD 0045 8B57 8D 03 0F INFOC STA HDRCSD 0046 8B5A AD 04 0E LDA LIB 0047 8B5D 8D 04 0F STA HDRLIB 0048 8B60 AD 02 0E LDA URD 0049 8B63 8D 02 0F STA HDRURD 0050 8B66 A2 12 LDXIM FCREAD ;must set function code as well 0051 8B68 8E 01 0F STX HDRFN ;note carry should be clear 0052 8B6B A9 0D LDAIM CR 0053 8B6D 8D 06 0F STA RXBUF +&01 ;send null filename 0054 8B70 85 B2 STA WORK +&02 ;counter 0055 8B72 4A LSRA ;#1101 => #0110 !! 0056 8B73 8D 05 0F STA RXBUF ;arg to examine function 0057 8B76 18 CLC 0058 8B77 0059 8B77 20 DD 83 JSR DOFS0 ;entry point which does not touch handles 0060 8B7A 0061 8B7A 86 B1 STX WORK +&01 0062 8B7C E8 INX 0063 8B7D 86 B0 STX WORK 0064 8B7F A5 A9 INFOT1 LDA ROMA ;test data area 0065 8B81 ;over the TUBE here 0066 8B81 D0 11 BNE TBCOPY 0067 8B83 0068 8B83 A6 B0 LDX WORK 0069 8B85 A4 B1 LDY WORK +&01 0070 8B87 BD 05 0F INFOH1 LDAAX RXBUF 0071 8B8A 91 BE STAIY POINTR 0072 8B8C E8 INX 0073 8B8D C8 INY 0074 8B8E C6 B2 DEC WORK +&02 0075 8B90 D0 F5 BNE INFOH1 0076 8B92 F0 27 BEQ TBEXIT ;copy data to the HOST 0077 8B94 0078 8B94 TBCOPY 0079 8B94 20 13 8C JSR TCLAIM ;claim the TUBE 0080 8B97 A9 01 LDAIM ONE 0081 8B99 A6 BB LDX TEMPX 0082 8B9B A4 BC LDY TEMPY 0083 8B9D E8 INX 0084 8B9E D0 01 BNE TBL1 0085 8BA0 C8 INY 0086 8BA1 20 06 04 TBL1 JSR TBINIT ;&0406 0087 8BA4 A6 B0 LDX WORK 0088 8BA6 BD 05 0F TBCOP1 LDAAX RXBUF 0089 8BA9 8D E5 FE STA REG3 ;&FEE5 0090 8BAC E8 INX 0091 8BAD 0092 8BAD A0 06 LDYIM 6 0093 8BAF 88 DELAY DEY ;** lousy 16032 ** 0094 8BB0 D0 FD BNE DELAY 0095 8BB2 0096 8BB2 C6 B2 DEC WORK +&02 0097 8BB4 D0 F0 BNE TBCOP1 0098 8BB6 A9 83 LDAIM TCSEMA 0099 8BB8 20 06 04 JSR TBINIT ;release the TUBE 0100 8BBB 4C D4 89 TBEXIT JMP FINDEX ;copy data over the TUBE 0101 8BBE 0102 8BBE A0 09 INFO8 LDYIM &09 0103 8BC0 B1 BB LDAIY TEMPX 0104 8BC2 8D 06 0F STA TXBUF +&01 ;entry point to EXAMINE 0105 8BC5 A0 05 LDYIM &05 0106 8BC7 B1 BB LDAIY TEMPX 0107 8BC9 8D 07 0F STA TXBUF +&02 ;entries to examine in call 0108 8BCC A2 0D LDXIM CR 0109 8BCE 8E 08 0F STX TXBUF +&03 0110 8BD1 A0 02 LDYIM TWO 0111 8BD3 84 B0 STY WORK ;counter for TBCOPY 0112 8BD5 8C 05 0F STY TXBUF ;ARG to examine 0113 8BD8 0114 8BD8 C8 INY ;X=13 here 0115 8BD9 20 C7 83 JSR DOFSOP ;C=0 on return 0116 8BDC 0117 8BDC 86 B1 STX WORK +&01 ;counter for Y in INFOT1 copy 0118 8BDE AD 06 0F LDA RXBUF +&01 ;update cycle number 0119 8BE1 81 BB STAIX TEMPX 0120 8BE3 0121 8BE3 AD 05 0F LDA RXBUF 0122 8BE6 A0 09 LDYIM &09 0123 8BE8 71 BB ADCIY TEMPX ;C=0 after DOFSOP 0124 8BEA 91 BB STAIY TEMPX ;update entry point Acorn macro assembler Page 26 OSGBPB 0125 8BEC 0126 8BEC A5 C8 LDA RXCB +&08 0127 8BEE E9 07 SBCIM TXBUF +&02 ;calculate data received 0128 8BF0 8D 06 0F STA RXBUF +&01 ;ready for GBPB$$ routine 0129 8BF3 85 B2 STA WORK +&02 ;data counter for INFOT1 0130 8BF5 F0 03 BEQ INSKIP ;********* zero data fudge ******** 0131 8BF7 20 7F 8B JSR INFOT1 ;perform data copying 0132 8BFA 0133 8BFA ; LDAIM $00 0134 8BFA ; STA W1 0135 8BFA A2 02 INSKIP LDXIM &02 0136 8BFC 9D 07 0F INFO81 STAAX RXBUF +&02 0137 8BFF CA DEX 0138 8C00 10 FA BPL INFO81 ;fudge for GBPB$$ 0139 8C02 0140 8C02 20 57 8A JSR GBPBXU ;update CB[$01->$04] 0141 8C05 38 SEC 0142 8C06 C6 B2 DEC W1 ;alter flag for add/sub routine 0143 8C08 AD 05 0F LDA RXBUF 0144 8C0B 8D 06 0F STA RXBUF +&01 0145 8C0E 0146 8C0E 20 5A 8A JSR GBPBXX ;update CB[$05->$08] 0147 8C11 F0 A8 BEQ TBEXIT ;exit the routine 0148 8C13 0149 8C13 TCLAIM ;claim TUBE semaphore 0150 8C13 A9 C3 LDAIM TBSEMA ;individual number 0151 8C15 20 06 04 JSR TBINIT 0152 8C18 90 F9 BCC TCLAIM 0153 8C1A 60 RTS 0154 8C1B 0155 8C1B LNK NFS07 0001 8C1B 0002 8C1B ; NFS07 0003 8C1B TTL Command Line Decoding 0004 8C1B OPT VIII2 Acorn macro assembler Page 27 Command Line Decoding 0005 8C1B 0006 8C1B ; The command line interpreter is courtesy Roger Wilson 0007 8C1B ; but has the usual 'top bit set' bug removed for the 0008 8C1B ; purposes of development. The routine DECODE is passed 0009 8C1B ; a string via (X,Y) and this is decoded and the 0010 8C1B ; appropriate actions taken. Unrecognised command lines 0011 8C1B ; are dealt with by a routine COMERR placed at the 0012 8C1B ; end of the command table COMTAB. 0013 8C1B 0014 8C1B DECODE ;is passed a string via X and Y, and decodes 0015 8C1B ;the command to produce an address in WORK which 0016 8C1B ;is jumped to. The registers are saved as they 0017 8C1B ;will no doubt come in useful for something. 0018 8C1B 0019 8C1B 20 49 86 JSR PUTREG ;save pointer 0020 8C1E 0021 8C1E A2 FF LDXIM FILLER 0022 8C20 86 B9 STX CRFLAG ; inactive=$FF 0023 8C22 86 97 STX ESCAP ;** enable escape 0024 8C24 A0 FF DECLP1 LDYIM FILLER 0025 8C26 C8 DECFIR INY 0026 8C27 E8 INX 0027 8C28 BD 4B 8C DECMOR LDAAX COMTAB 0028 8C2B 30 18 BMI DECDON ;all done yet ? 0029 8C2D 51 BE EORIY POINTR 0030 8C2F 29 DF ANDIM &DF ;force UPPER case 0031 8C31 F0 F3 BEQ DECFIR 0032 8C33 CA DEX 0033 8C34 E8 DECMIN INX 0034 8C35 BD 4B 8C LDAAX COMTAB 0035 8C38 10 FA BPL DECMIN 0036 8C3A B1 BE LDAIY POINTR 0037 8C3C E8 INX 0038 8C3D C9 2E CMPIM "." ;look for abbrev's 0039 8C3F D0 E3 BNE DECLP1 ;else try the next one 0040 8C41 C8 INY 0041 8C42 CA DEX 0042 8C43 B0 E3 BCS DECMOR ;round again 0043 8C45 48 DECDON PHA ;this bit circumvents the "top bit" bug 0044 8C46 BD 4C 8C LDAAX COMTAB +&01 0045 8C49 48 PHA 0046 8C4A 60 RTS ;leap away at random 0047 8C4B 0048 8C4B COMTAB ;table of commands 0049 8C4B 49 2E = "I." ;fudge here 0050 8C4D 80 = !(/(COMERR - &01 ) ) 0051 8C4E C0 = COMERR - &01 0052 8C4F 49 20 41 = "I AM" 0053 8C53 80 = !(/(LOGON -&01 ) ) 0054 8C54 81 = LOGON -&01 0055 8C55 45 58 = "EX" 0056 8C57 8C = !(/(INFALL - &01 )) 0057 8C58 60 = INFALL - &01 0058 8C59 42 59 45 = "BYE",CR 0059 8C5D 83 = !(/(BYE -&01 ) ) 0060 8C5E BF = BYE -&01 0061 8C5F 80 = !(/(COMERR -&01 ) ) 0062 8C60 C0 = COMERR -&01 0063 8C61 0064 8C61 0065 8C61 INFALL ;does the System/3 type of operation 0066 8C61 ;to fully examine all entries in the catalogue. 0067 8C61 0068 8C61 A2 01 LDXIM ONE ;arg to examine 0069 8C63 A9 03 LDAIM 3 0070 8C65 D0 0B BNE CAT0 0071 8C67 0072 8C67 CAT ;does the catalogue operation. This involves a header 0073 8C67 ;request and repeated interrogation of examine until 0074 8C67 ;a total of zero entries is examined. This indicates 0075 8C67 ;the end of the catalogue. The data is received in pre- 0076 8C67 ;formatted chunks, to a buffer which abuts the Examine 0077 8C67 ;request buffer and ends at RXBUFE. On entry X,Y point to 0078 8C67 ;the command line after "CAT" or "." . 0079 8C67 0080 8C67 A2 03 LDXIM THREE 0081 8C69 86 B9 STX CRFLAG ;active#$FF 0082 8C6B A0 FF LDYIM &FF 0083 8C6D 84 97 STY ESCAP ;** 9/12/83 ** 0084 8C6F C8 INY 0085 8C70 A9 0B LDAIM &0B 0086 8C72 85 B5 CAT0 STA WORK +&05 ;number of entries to get 0087 8C74 86 B7 STX WORK +&07 ;arg to examine 0088 8C76 A9 06 LDAIM SIX 0089 8C78 8D 05 0F STA RXBUF ;argument for Read Object Info 0090 8C7B 20 EA 86 JSR QUOTER ;look for spaces,quoted strings etc 0091 8C7E A2 01 LDXIM ONE 0092 8C80 20 84 8D JSR CATLP0 ;copy the filetitle 0093 8C83 0094 8C83 A0 12 LDYIM FCREAD ;get function code 0095 8C85 20 C7 83 JSR DOFSOP ;perform the transfer of info 0096 8C88 0097 8C88 A2 03 LDXIM THREE 0098 8C8A 20 47 8D JSR STRING ;print the name of examined directory 0099 8C8D 0100 8C8D 20 5C 86 JSR VSTRNG 0101 8C90 28 = "(" 0102 8C91 AD 13 0F LDA RXBUF +&0E ;get the cycle number 0103 8C94 20 BD 8D JSR DECOUT ;****** should be decimal ******* 0104 8C97 20 5C 86 JSR VSTRNG 0105 8C9A 29 20 20 = ") " 0106 8CA0 0107 8CA0 ; NOP 0108 8CA0 ; JSR FILL5 ;print seven spaces 0109 8CA0 0110 8CA0 AC 12 0F LDY RXBUF +&0D ;inspect the access byte 0111 8CA3 D0 0B BNE CAT1 ;zero is offset of "Owner" 0112 8CA5 20 5C 86 JSR VSTRNG 0113 8CA8 4F 77 6E = "Owner",CR 0114 8CAE D0 0A BNE CAT2 0115 8CB0 20 5C 86 CAT1 JSR VSTRNG 0116 8CB3 50 75 62 = "Public",CR 0117 8CBA 0118 8CBA A0 15 CAT2 LDYIM FCUSER ;code for user environment 0119 8CBC 20 C7 83 JSR DOFSOP ;X undefined here, only sending TX hdr 0120 8CBF ;now have the CSD, DISC and LIB names 0121 8CBF ;also X=0 on exit 0122 8CBF 0123 8CBF E8 INX 0124 8CC0 A0 10 LDYIM &10 ;long name here 0125 8CC2 20 49 8D JSR STRIN1 ;print the disc name Acorn macro assembler Page 28 Command Line Decoding 0126 8CC5 20 5C 86 JSR VSTRNG 0127 8CC8 20 20 20 = " Option " 0128 8CD3 AD 05 0E LDA OPT 0129 8CD6 AA TAX 0130 8CD7 20 F0 BF JSR HEXOUT ;****** should be decimal ******* 0131 8CDA 20 5C 86 JSR VSTRNG 0132 8CDD 20 28 = " (" 0133 8CDF 0134 8CDF BC 54 8D LDYAX OPTTXT 0135 8CE2 B9 54 8D CATTXT LDAAY TEXTTB ;write the message 0136 8CE5 30 06 BMI CATOPT 0137 8CE7 20 E3 FF JSR OSASCI 0138 8CEA C8 INY 0139 8CEB D0 F5 BNE CATTXT 0140 8CED 0141 8CED 20 5C 86 CATOPT JSR VSTRNG 0142 8CF0 29 0D 44 = ")", CR,"Dir. " 0143 8CF7 A2 11 LDXIM &11 0144 8CF9 20 47 8D JSR STRING ;print the CSD name 0145 8CFC ; JSR FILL5 ;more spaces 0146 8CFC 0147 8CFC 20 5C 86 JSR VSTRNG 0148 8CFF 20 20 20 = " Lib. " 0149 8D09 A2 1B LDXIM &1B 0150 8D0B 20 47 8D JSR STRING 0151 8D0E 20 E7 FF JSR OSCRLF 0152 8D11 0153 8D11 8C 06 0F CATLP2 STY TXBUF +&01 ;entry point to examine 0154 8D14 84 B4 STY WORK +&04 0155 8D16 A6 B5 LDX WORK +&05 0156 8D18 8E 07 0F STX TXBUF +&02 ;entries to get 0157 8D1B 0158 8D1B A6 B7 LDX WORK +&07 0159 8D1D 8E 05 0F STX TXBUF 0160 8D20 A2 03 LDXIM THREE 0161 8D22 20 84 8D JSR CATLP0 ;copy filename into TXBUF +04+ 0162 8D25 0163 8D25 A0 03 LDYIM FCEXAM ;examine function code 0164 8D27 20 C7 83 JSR DOFSOP 0165 8D2A 0166 8D2A E8 INX 0167 8D2B AD 05 0F LDA RXBUF ;get entries examined 0168 8D2E D0 03 BNE CATJD1 0169 8D30 4C E7 FF JMP OSNEWL ;Newline and return 0170 8D33 0171 8D33 48 CATJD1 PHA ;save here 0172 8D34 0173 8D34 C8 CATLP7 INY 0174 8D35 B9 05 0F LDAAY RXBUF ;look for delimiter 0175 8D38 10 FA BPL CATLP7 0176 8D3A 99 04 0F STAAY RXBUF - 1 ;move it back one place 0177 8D3D 0178 8D3D 20 9F 8D JSR INFOL5 ;print the data from offset in X 0179 8D40 68 PLA 0180 8D41 18 CLC 0181 8D42 65 B4 ADC WORK +&04 ;update by number of entries examined 0182 8D44 A8 TAY 0183 8D45 D0 CA BNE CATLP2 0184 8D47 0185 8D47 A0 0A STRING LDYIM &0A ;print chars in RXBUF, from X 0186 8D49 BD 05 0F STRIN1 LDAAX RXBUF 0187 8D4C 20 E3 FF JSR OSASCI 0188 8D4F E8 INX 0189 8D50 88 DEY 0190 8D51 D0 F6 BNE STRIN1 ;count on Y 0191 8D53 60 RTS 0192 8D54 TEXTTB 0193 8D54 0194 8D54 2B OPTTXT = OPTX0 - TEXTTB 0195 8D55 3E = OPTX1 - TEXTTB 0196 8D56 66 = OPTX2 - TEXTTB 0197 8D57 18 = OPTX3 - TEXTTB 0198 8D58 0199 8D58 4C 2E LOAD = "L." 0200 8D5A 21 42 4F RUN = "!BOOT",CR 0201 8D60 45 2E 21 EXEC = "E.!BOOT" 0202 8D67 0D OFF = CR 0203 8D68 0204 8D68 67 BOOTLO = OFF 0205 8D69 58 = LOAD 0206 8D6A 5A = RUN 0207 8D6B 60 = EXEC 0208 8D6C 0209 8D6C 008D BOOTH4 * OFF :SHR: &8 0210 8D6C 008D BOOTH1 * LOAD :SHR: &8 0211 8D6C 008D BOOTH2 * RUN :SHR: &8 0212 8D6C 008D BOOTH3 * EXEC :SHR: &8 0213 8D6C 0214 8D6C 45 78 65 OPTX3 = "Exec" 0215 8D70 0216 8D70 [ OPTX3 - TEXTTB :SHR: 8=0 0217 8D70 | 0219 8D70 ] 0220 8D70 0221 8D70 A2 04 NUMOUT LDXIM &04 0222 8D72 B1 BB NUM01 LDAIY TEMPX 0223 8D74 20 F0 BF JSR HEXOUT 0224 8D77 88 DEY 0225 8D78 CA DEX 0226 8D79 D0 F7 BNE NUM01 0227 8D7B A9 20 NUMSP LDAIM SPACE 0228 8D7D D0 5A BNE DBWRL2 0229 8D7F 0230 8D7F 4F 66 66 OPTX0 = "Off" 0231 8D82 0232 8D82 [ OPTX0 - TEXTTB :SHR: 8=0 0233 8D82 | 0235 8D82 ] 0236 8D82 0237 8D82 0238 8D82 CATLP 0239 8D82 COPYCL ;copy the command line pointed at by TEMPX 0240 8D82 ;into the TXBUF. Nice routine, should get lots of use. 0241 8D82 0242 8D82 A2 00 LDXIM ZERO ;useful for specific copying 0243 8D84 COPYCX 0244 8D84 CATLP0 0245 8D84 A0 00 LDYIM ZERO 0246 8D86 B1 BE COPLP1 LDAIY POINTR ;get the command line 0247 8D88 9D 05 0F STAAX TXBUF ;into the Txbuf, offset set by X 0248 8D8B E8 INX Acorn macro assembler Page 29 Command Line Decoding 0249 8D8C C8 INY 0250 8D8D 49 0D EORIM CR ;carriage return ? 0251 8D8F D0 F5 BNE COPLP1 0252 8D91 60 INFOEX RTS ;Y holds length+1 of command line 0253 8D92 0254 8D92 4C 6F 61 OPTX1 = "Load" 0255 8D96 0256 8D96 [ OPTX1 - TEXTTB :SHR: 8=0 0257 8D96 | 0259 8D96 ] 0260 8D96 0261 8D96 0262 8D96 INFO ;called from COMERR when the command code 0263 8D96 ;is four. Command codes are looked up in CCTAB. 0264 8D96 0265 8D96 A2 00 LDXIM ZERO 0266 8D98 BD 05 0F INFOLP LDAAX RXBUF 0267 8D9B 30 F4 BMI INFOEX 0268 8D9D D0 15 BNE INFOL2 0269 8D9F 0270 8D9F A4 B9 INFOL5 LDY CRFLAG 0271 8DA1 30 0F BMI INFOL3 ;flag inactive 0272 8DA3 C8 INY 0273 8DA4 98 TYA 0274 8DA5 29 03 ANDIM &03 ;2 bit counter 0275 8DA7 85 B9 STA CRFLAG 0276 8DA9 0277 8DA9 F0 07 BEQ INFOL3 0278 8DAB 20 5C 86 JSR VSTRNG 0279 8DAE 20 20 = " " 0280 8DB0 D0 05 BNE INFOL4 0281 8DB2 0282 8DB2 A9 0D INFOL3 LDAIM CR 0283 8DB4 20 E3 FF INFOL2 JSR OSASCI ;deal with carriage return, line feed 0284 8DB7 E8 INFOL4 INX 0285 8DB8 D0 DE BNE INFOLP 0286 8DBA 0287 8DBA 52 75 6E OPTX2 = "Run" 0288 8DBD 0289 8DBD [ OPTX2 - TEXTTB :SHR: 8=0 0290 8DBD | 0292 8DBD ] 0293 8DBD 0294 8DBD 0295 8DBD A8 DECOUT TAY ;decimal output routine 0296 8DBE A9 64 LDAIM &64 ;subtract hundred 0297 8DC0 20 CA 8D JSR DEC1 ;get first digit 0298 8DC3 A9 0A LDAIM &0A 0299 8DC5 20 CA 8D JSR DEC1 ;and the second 0300 8DC8 A9 01 LDAIM &01 0301 8DCA 85 B8 DEC1 STA JWORK 0302 8DCC 98 TYA ;save value over call in Y 0303 8DCD A2 2F LDXIM &2F ;ascii '0' 0304 8DCF 38 SEC 0305 8DD0 E8 DEC2 INX 0306 8DD1 E5 B8 SBC JWORK 0307 8DD3 B0 FB BCS DEC2 0308 8DD5 65 B8 ADC JWORK ;make positive again 0309 8DD7 A8 TAY 0310 8DD8 8A TXA 0311 8DD9 DBWRL2 0312 8DD9 4C E3 FF DECCH JMP OSASCI 0313 8DDC 0314 8DDC [ &FF=0 0329 8DDC ] 0330 8DDC 0331 8DDC [ &FF=0 0337 8DDC ] 0338 8DDC 0339 8DDC 20 E8 86 CMNDR JSR QUOTED ;deal with quotes etc 0340 8DDF 20 82 8D JSR CATLP ;from *RUN commands 0341 8DE2 0342 8DE2 CMND ;load as command, response is as for LOAD(3) 0343 8DE2 ;but jump to exec address at the end of transfer. 0344 8DE2 0345 8DE2 A0 00 LDYIM 0 ;use MOS reading routines 0346 8DE4 18 CLC 0347 8DE5 20 C2 FF JSR GSINIT 0348 8DE8 20 C5 FF CMND3 JSR GSREAD 0349 8DEB 90 FB BCC CMND3 ;skip file name 0350 8DED 0351 8DED [ &FF=0 0357 8DED | 0358 8DED 20 7E 83 JSR SKPSP ;** 9/8/83 ** 0359 8DF0 ] 0360 8DF0 0361 8DF0 18 CLC 0362 8DF1 98 TYA 0363 8DF2 65 F2 ADC &F2 0364 8DF4 8D 0A 0E STA JCMNDP 0365 8DF7 A5 F3 LDA &F3 0366 8DF9 69 00 ADCIM 0 0367 8DFB 8D 0B 0E STA JCMNDP + 1 0368 8DFE 0369 8DFE A2 0E LDXIM /(CMNDP ) 0370 8E00 86 BC STX TEMPY ;X=$0F, dummy for buffer length 0371 8E02 A9 10 LDAIM CMNDP 0372 8E04 85 BB STA TEMPX ;point to CB 0373 8E06 8D 16 0E STA CMNDP + 6 0374 8E09 0375 8E09 A2 4A LDXIM &4A ;maximum buffer allowed 0376 8E0B A0 05 LDYIM FCCMND 0377 8E0D 20 22 87 JSR LODCMD ;perform load as command 0378 8E10 0379 8E10 ; SEC ;update CMNDP 0380 8E10 0381 8E10 AD 67 0D LDA TBFLAG ;get flag 0382 8E13 F0 14 BEQ CMNDX ;C=1 here 0383 8E15 6D 0B 0F ADC RXBUF +&06 0384 8E18 6D 0C 0F ADC RXBUF +&07 0385 8E1B B0 0C BCS CMNDX ;skip if HOST-side of TUBE 0386 8E1D 0387 8E1D 20 13 8C JSR TCLAIM 0388 8E20 A2 09 LDXIM RXBUF +&04 0389 8E22 A0 0F LDYIM /(RXBUF +&04 ) 0390 8E24 A9 04 LDAIM &04 ;for JUMP 0391 8E26 4C 06 04 JMP TBINIT ;leap over the TUBE 0392 8E29 0393 8E29 2A CMNDX ROLA ;Set A=1 here ** 14/11/83 ** 0394 8E2A 6C 09 0F JMI RXBUF +&04 ;leap to exec address 0395 8E2D Acorn macro assembler Page 30 Command Line Decoding 0396 8E2D SLIB ;user change library environment. Call passed 0397 8E2D ;to FS, jump here on return when CC=9. Just store the handle in LIB. 0398 8E2D 0399 8E2D 8C 04 0E STY LIB ;correct handle 0400 8E30 90 03 BCC CATDON ;do return 0401 8E32 0402 8E32 SDIR ;user change currently selected directory. 0403 8E32 ;Jump here on return from COMERR when CC=7. Save handle in CSD. 0404 8E32 0405 8E32 8C 03 0E STY CSD 0406 8E35 RTSS 0407 8E35 4C B3 89 CATDON JMP REGGET 0408 8E38 0409 8E38 0410 8E38 38 LOGIN SEC 0411 8E39 A2 03 SDISC LDXIM THREE ;come here on 'SDISC', X=2 0412 8E3B 90 06 BCC LOGON3 0413 8E3D BD 05 0F LOGON2 LDAAX RXBUF 0414 8E40 9D 02 0E STAAX URD 0415 8E43 CA LOGON3 DEX 0416 8E44 10 F7 BPL LOGON2 ;save the handles 0417 8E46 90 ED BCC CATDON ;do return 0418 8E48 0419 8E48 AC 05 0E LDY OPT 0420 8E4B BE 68 8D LDXAY BOOTLO 0421 8E4E ;cheating way of saving code if addresses are identical 0422 8E4E [ BOOTH4 - BOOTH1 =0 0423 8E4E A0 8D LDYIM BOOTH1 0424 8E50 0425 8E50 | 0435 8E50 ] 0436 8E50 4C F7 FF JMP OSCLI 0437 8E53 0438 8E53 LNK NFS08 0001 8E53 0002 8E53 ; NFS08 0003 8E53 TTL MOS interface 0004 8E53 OPT MOS Acorn macro assembler Page 31 MOS interface 0005 8E53 0006 8E53 ;[*****************************] 0007 8E53 ;[ Net dedicated 0-page ] 0008 8E53 ;[ $9C,$9D - first page, Always] 0009 8E53 ;[ $9E,$9F - used by remote ] 0010 8E53 ;[*****************************] 0011 8E53 0012 8E53 0013 8E53 ; This section of the implementation concerns the 0014 8E53 ; interface of the ECONET (sic) with the MOS. 0015 8E53 ; This allows operations to be carried out as 0016 8E53 ; function calls and not by direct manipulation 0017 8E53 ; of the Net routines. 0018 8E53 0019 8E53 ; The interface is defined in terms of OSbyte and 0020 8E53 ; OSword calls to handle the control blocks. 0021 8E53 ; The area of RAM allocated is in the second static 0022 8E53 ; workspace page. 0023 8E53 0024 8E53 ; Calls are passed to the interface as follows: 0025 8E53 ; A=7 : OSBYTE, Y= call number, X= ROM number 0026 8E53 ; A=8 : OSWORD, Y= call number, X= ROM number 0027 8E53 ; In both cases, &F0,F1 hold the original values 0028 8E53 ; for X, Y. 0029 8E53 0030 8E53 ; As these routines are called from within OSBYTE, 0031 8E53 ; OSWORD then MOS workspace can be claimed, provided 0032 8E53 ; that it is restored afterwards. 0033 8E53 0034 8E53 0035 8E53 TTL Static Workarea allocation 0036 8E53 OPT &01 0037 8E53 0038 8E53 ; PAGE 1 0039 8E53 ; |----------------------| 0040 8E53 ; | (128) | 0041 8E53 ; 128 | JSR BUFFER | 0042 8E53 ; |----------------------| 0043 8E53 ; | (1) | 0044 8E53 ; 127 | BUFFER COUNTER | 0045 8E53 ; |----------------------| 0046 8E53 ; | (16) | 0047 8E53 ; 111 | Txcb/Imm. Op | 0048 8E53 ; |----------------------| 0049 8E53 ; | (80) | 0050 8E53 ; 31 | Printer Buffer | 0051 8E53 ; |----------------------| 0052 8E53 ; | ( 9) | 0053 8E53 ; 22 | High level State | 0054 8E53 ; |----------------------| 0055 8E53 ; | (16) | 0056 8E53 ; 6 | Low level State | 0057 8E53 ; |----------------------| 0058 8E53 ; | (2) | 0059 8E53 ; 4 | Counters & flags | 0060 8E53 ; |----------------------| 0061 8E53 ; | (4) | 0062 8E53 ; 0 | byte/word save | 0063 8E53 ; |----------------------| 0064 8E53 0065 8E53 0066 8E53 ; Static Page 2 0067 8E53 ; ----------------------- 0068 8E53 ; 0 | Printer CB | 0069 8E53 ; ---------------------- 0070 8E53 ; 12 | Remote CB | 0071 8E53 ; ----------------------- 0072 8E53 ; ~ 16 Rxcb's ~ 0073 8E53 ; ----------------------- 0074 8E53 ; 217 | Zero | 0075 8E53 ; ----------------------- 0076 8E53 ; 218 | Printer work | 0077 8E53 ; ----------------------- 0078 8E53 ; ??? | Remote work | 0079 8E53 ; ----------------------- 0080 8E53 0081 8E53 TTL OSBYTE calls 0082 8E53 OPT &01 0083 8E53 A5 F0 OFFSEX LDA &F0 ;get the original parameter 0084 8E55 0A OFFSET ASLA ;passed A as Rxcb number 0085 8E56 0A ASLA 0086 8E57 48 PHA ;A *:= 4 0087 8E58 0A ASLA ;nb carry=0 0088 8E59 BA TSX 0089 8E5A 7D 01 01 ADCAX &0101 ;with previous result 0090 8E5D A8 TAY ;Y = A * 12 0091 8E5E 68 PLA ;A = A * 4 0092 8E5F C9 48 CMPIM RXCBS * &04 ;test the returned offset 0093 8E61 90 03 BCC OFF1 0094 8E63 A0 00 LDYIM &00 0095 8E65 98 TYA ;return error 0096 8E66 60 OFF1 RTS ;X = undefined 0097 8E67 0098 8E67 TXPOLL ;call to poll a Txcb 0099 8E67 A0 6F LDYIM UTXCB ;offset of user TXCB in first page 0100 8E69 B1 9C LDAIY PAGE1 ;dedicated pointer in 0-page 0101 8E6B 90 0D BCC RXPOL1 ;return value 0102 8E6D 0103 8E6D RXPOLL ;call to poll Rxcb given in $F0 0104 8E6D 20 53 8E JSR OFFSEX ;calculate the offset from pointer 0105 8E70 B0 06 BCS RXPOL2 ;error condition 0106 8E72 B1 9E LDAIY WORKP1 ;get the flag byte 0107 8E74 C9 3F CMPIM &3F ;check CB valid 0108 8E76 D0 02 BNE RXPOL1 0109 8E78 A9 00 RXPOL2 LDAIM &00 0110 8E7A 85 F0 RXPOL1 STA PARMX ;return value in X 0111 8E7C 60 RTS 0112 8E7D 0113 8E7D DELCB 0114 8E7D 20 53 8E JSR OFFSEX 0115 8E80 B0 F6 BCS RXPOL2 0116 8E82 ; ROR LFLAG ;disable USER Rx 0117 8E82 A9 3F LDAIM &3F ;delete flag byte 0118 8E84 91 9E STAIY WORKP1 0119 8E86 0120 8E86 ; ROL LFLAG ;enable Rx and return 0121 8E86 60 RTS 0122 8E87 0123 8E87 0124 8E87 ;This code has been moved to ROM file 0125 8E87 ;7/3/83 Acorn macro assembler Page 32 OSBYTE calls 0126 8E87 0127 8E87 ;ROFFF JSR NROFF 0128 8E87 ; BVC CLAIM 0129 8E87 0130 8E87 TTL OSWORD calls 0131 8E87 OPT &01 0132 8E87 0133 8E87 A5 EF FSWORD LDA PARMA ;get call number 0134 8E89 E9 0F SBCIM &0F ;test bounds - C=0 on entry 0135 8E8B 30 2A BMI NOWORD 0136 8E8D C9 05 CMPIM &05 0137 8E8F B0 26 BCS NOWORD 0138 8E91 0139 8E91 20 9F 8E JSR GOWORD ;call the routine 0140 8E94 0141 8E94 A0 02 CLAIMW LDYIM SAVEAR +&02 ;restore previous values 0142 8E96 B1 9C REST1 LDAIY PAGE1 0143 8E98 99 AA 00 STAAY UTIL3 - SAVEAR -&01 0144 8E9B 88 DEY 0145 8E9C 10 F8 BPL REST1 0146 8E9E 60 RTS 0147 8E9F 0148 8E9F AA GOWORD TAX 0149 8EA0 BD BD 8E LDAAX WORDHI 0150 8EA3 48 PHA 0151 8EA4 BD B8 8E LDAAX WORDLO 0152 8EA7 48 PHA 0153 8EA8 0154 8EA8 A0 02 LDYIM SAVEAR +&02 ;offset in first static page 0155 8EAA B9 AA 00 SAVE1 LDAAY UTIL3 - SAVEAR -&01 ;claim 0-page 0156 8EAD 91 9C STAIY PAGE1 ;dedicated pointer 0157 8EAF 88 DEY 0158 8EB0 10 F8 BPL SAVE1 0159 8EB2 C8 INY ;Y=0 0160 8EB3 B1 F0 LDAIY PARMX ;call routine with parameter 0161 8EB5 84 A9 STY ROMA ;claim the call here 0162 8EB7 60 NOWORD RTS 0163 8EB8 0164 8EB8 ; Table of OSWORD calls 0165 8EB8 ;&70 : Call TRANSMIT 0166 8EB8 ;&71 : 0 Open Rxcb 0167 8EB8 ; : n Read Rxcb(n) 0168 8EB8 ;&72 : Read Routine arguments 0169 8EB8 ;&73 : 0 Read File Server Id 0170 8EB8 ; : 1 Set File Server Id 0171 8EB8 ; : 2 Read Printer Server Id 0172 8EB8 ; : 3 Set Printer Server Id 0173 8EB8 ; : 4 Read protection masks 0174 8EB8 ; : 5 Set protection masks 0175 8EB8 ; : 6 Read context handles 0176 8EB8 ; : 7 Set context handles 0177 8EB8 ; : 8 Read local station number 0178 8EB8 ; : 9 Read Routine arguments buffer size 0179 8EB8 ;&74 : DOFSOP type call 0180 8EB8 0181 8EB8 0182 8EB8 C1 WORDLO = CALLTX-&01 0183 8EB9 7B = OPENRX-&01 0184 8EBA DB = READRA-&01 0185 8EBB 00 = RS-&01 0186 8EBC EF = DOFS -&01 0187 8EBD 0188 8EBD 8E WORDHI = /(CALLTX -&01 ) 0189 8EBE 8F = /(OPENRX -&01 ) 0190 8EBF 8E = /(READRA -&01 ) 0191 8EC0 8F = /(RS -&01 ) 0192 8EC1 8F = /(DOFS -&01 ) 0193 8EC2 0194 8EC2 CALLTX ;initiate Tx, $F0,$F1 point at TXCB 0195 8EC2 0196 8EC2 ; check Tx not already in progress 0197 8EC2 0198 8EC2 0E 62 0D ASL TXCLR 0199 8EC5 98 TYA ;return error in block 0200 8EC6 90 34 BCC READRY ;skip Tx if sema claimed 0201 8EC8 0202 8EC8 ;claim work area 0203 8EC8 0204 8EC8 A5 9D LDA PAGE1 +&01 ;get pointer 0205 8ECA 85 AC STA UTIL3 +&01 0206 8ECC 85 A1 STA LTXCBP +&01 ;copy direct into the pointer 0207 8ECE A9 6F LDAIM UTXCB 0208 8ED0 85 AB STA UTIL3 0209 8ED2 85 A0 STA LTXCBP 0210 8ED4 0211 8ED4 A2 0F LDXIM &0F ;copy 16 bytes, maybe immediate operation 0212 8ED6 20 1C 8F JSR COPY2 ;copy the data across 0213 8ED9 4C 30 96 JMP BRIANX ;call Brian 0214 8EDC 0215 8EDC READRA ;read the JSR arguments 0216 8EDC A5 9D LDA PAGE1 +&01 0217 8EDE 85 AC STA UTIL3 +&01 0218 8EE0 A0 7F LDYIM JSRSIZ 0219 8EE2 B1 9C LDAIY PAGE1 ;get the size of the buffer 0220 8EE4 C8 INY 0221 8EE5 84 AB STY UTIL3 0222 8EE7 AA TAX 0223 8EE8 CA DEX 0224 8EE9 A0 00 LDYIM ZERO 0225 8EEB 20 1C 8F JSR COPY2 ;carry clear on entry 0226 8EEE 4C F0 92 JMP CLRJSR ;reset the old LSTAT byte 0227 8EF1 0228 8EF1 READRB ;read the args size and the buffer size 0229 8EF1 A0 7F LDYIM JSRSIZ 0230 8EF3 B1 9C LDAIY PAGE1 ;get the args size 0231 8EF5 A0 01 LDYIM ONE 0232 8EF7 91 F0 STAIY &F0 0233 8EF9 C8 INY 0234 8EFA A9 80 LDAIM &80 ;buffer size 0235 8EFC 91 F0 READRY STAIY &F0 0236 8EFE 60 READRX RTS ;return store 0237 8EFF 0238 8EFF FF LOWP = FSLOCN -&01 0239 8F00 01 = PSLOCN - &01 0240 8F01 0241 8F01 RS ;call to read|set state information 0242 8F01 C9 06 CMPIM &06 0243 8F03 B0 41 BCS RSL1 0244 8F05 C9 04 CMPIM &04 0245 8F07 B0 22 BCS RSSL1 ;status byte read|set 0246 8F09 4A LSRA ;get data direction flow Acorn macro assembler Page 33 OSWORD calls 0247 8F0A A2 0D LDXIM /(FSLOCN - &01 ) 0248 8F0C A8 TAY 0249 8F0D F0 02 BEQ RSL3 0250 8F0F A6 9F RSL4 LDX WORKP1 +&01 0251 8F11 86 AC RSL3 STX UTIL3 +&01 0252 8F13 B9 FF 8E LDAAY LOWP 0253 8F16 85 AB STA UTIL3 ;set up copy pointr 0254 8F18 A2 01 LDXIM &01 0255 8F1A A0 01 LDYIM &01 0256 8F1C 0257 8F1C 90 04 COPY2 BCC COPYL2 0258 8F1E B1 F0 COPYL1 LDAIY &F0 0259 8F20 91 AB STAIY UTIL3 0260 8F22 ; BCS COPYL3 0261 8F22 B1 AB COPYL2 LDAIY UTIL3 0262 8F24 91 F0 STAIY &F0 0263 8F26 C8 COPYL3 INY 0264 8F27 CA DEX 0265 8F28 10 F2 BPL COPY2 ;count via X 0266 8F2A 60 RTS ;goto exit routine 0267 8F2B 0268 8F2B 4A RSSL1 LSRA 0269 8F2C C8 INY 0270 8F2D B1 F0 LDAIY PARMX ;get the data parameter 0271 8F2F B0 05 BCS RSSL2 ;skip if SET operation 0272 8F31 AD 63 0D LDA LSTAT 0273 8F34 91 F0 STAIY PARMX ;else READ the flags 0274 8F36 8D 63 0D RSSL2 STA LSTAT 0275 8F39 8D 65 0D STA OLDJSR ;ammend old copy just in case 0276 8F3C 60 RSL3X RTS 0277 8F3D 0278 8F3D A0 14 RSL8 LDYIM SAVEHI - 1 0279 8F3F B1 9C LDAIY PAGE1 0280 8F41 A0 01 LDYIM &01 0281 8F43 91 F0 STAIY PARMX ;return @ XY+1 0282 8F45 60 RTS 0283 8F46 0284 8F46 C9 08 RSL1 CMPIM &08 0285 8F48 F0 F3 BEQ RSL8 0286 8F4A C9 09 CMPIM &09 0287 8F4C F0 A3 BEQ READRB ;return buffersize and argssize for JSR 0288 8F4E 10 19 BPL RSL10 ;error handler 0289 8F50 ;must be read|set context handles 0290 8F50 A0 03 LDYIM THREE 0291 8F52 4A LSRA ;carry will determine which operation 0292 8F53 90 1B BCC READC1 0293 8F55 84 A8 STY ROMY 0294 8F57 A4 A8 SETC1 LDY ROMY 0295 8F59 B1 F0 LDAIY PARMX 0296 8F5B 20 9A 86 JSR Y2FSA 0297 8F5E 98 TYA 0298 8F5F A4 A8 LDY ROMY 0299 8F61 99 01 0E STAAY URD -&01 ;changed format 0300 8F64 C6 A8 DEC ROMY 0301 8F66 D0 EF BNE SETC1 0302 8F68 60 RTS 0303 8F69 0304 8F69 C8 RSL10 INY 0305 8F6A AD 09 0E LDA ERROR ;last error found 0306 8F6D 91 F0 STAIY PARMX 0307 8F6F 60 RTS 0308 8F70 0309 8F70 B9 01 0E READC1 LDAAY URD -&01 0310 8F73 20 B7 86 JSR FS2A 0311 8F76 91 F0 STAIY PARMX 0312 8F78 88 DEY 0313 8F79 D0 F5 BNE READC1 0314 8F7B 60 RTS 0315 8F7C 0316 8F7C OPENRX 0317 8F7C ;call to OPEN or READ an Rxcb 0318 8F7C ;If the call is for READ then the first 0319 8F7C ;byte of the CB contains the number of the 0320 8F7C ;block to be read. Otherwise the byte is zero. 0321 8F7C 0322 8F7C ;If the CB is already deleted then ZERO 0323 8F7C ;is returned in this byte. 0324 8F7C 0325 8F7C ;If the call is to OPEN then the CB number 0326 8F7C ;is returned here; if no CB's are free then 0327 8F7C ;ZERO is returned. 0328 8F7C 0329 8F7C 0330 8F7C A6 9F SETPP LDX WORKP1 +&01 ;static pointer 0331 8F7E 86 AC STX UTIL3 +&01 0332 8F80 84 AB STY UTIL3 0333 8F82 6E 64 0D ROR LFLAG ;System is off, so ROR turns off USER too 0334 8F85 B1 F0 LDAIY PARMX ;get the CB flag 0335 8F87 85 AA STA UTIL3 -&01 0336 8F89 D0 1B BNE OPENL1 ;skip if call is to READ 0337 8F8B 0338 8F8B A9 03 LDAIM &03 ;blocks 0,1,2 dedicated 0339 8F8D ;assumes pointer to RXCBV is set up 0340 8F8D 20 55 8E SCAN0 JSR OFFSET ;returns Y=A*12 0341 8F90 B0 3D BCS OPENL4 0342 8F92 4A LSRA 0343 8F93 4A LSRA 0344 8F94 AA TAX ;save index 0345 8F95 B1 AB LDAIY UTIL3 ;get flag byte 0346 8F97 F0 36 BEQ OPENL4 ;0 terminator 0347 8F99 C9 3F CMPIM &3F 0348 8F9B F0 04 BEQ SCAN1 0349 8F9D E8 INX 0350 8F9E 8A TXA 0351 8F9F D0 EC BNE SCAN0 0352 8FA1 8A SCAN1 TXA ;A returns number of RXCB 0353 8FA2 ;Y=offset of first free 0354 8FA2 ;else Y=0 if all full 0355 8FA2 A2 00 LDXIM ZERO 0356 8FA4 81 F0 STAIX PARMX ;returns the CB number 0357 8FA6 0358 8FA6 20 55 8E OPENL1 JSR OFFSET 0359 8FA9 B0 24 BCS OPENL4 ;skip if block number too big 0360 8FAB 88 DEY 0361 8FAC 84 AB STY UTIL3 ;adjust pointer to allow space for RESBYT 0362 8FAE 0363 8FAE 0364 8FAE A9 C0 LDAIM &C0 0365 8FB0 A0 01 LDYIM &01 0366 8FB2 A2 0B LDXIM &0B 0367 8FB4 Acorn macro assembler Page 34 OSWORD calls 0368 8FB4 C4 AA CPY UTIL3 -&01 ;[C=1 for OPEN] 0369 8FB6 71 AB ADCIY UTIL3 ;[ V=(READ|1|0)] 0370 8FB8 F0 03 BEQ OPENL6 ;[Z=1 if OPEN CB] 0371 8FBA 30 0E BMI OPENL7 ;skip if OPEN 0372 8FBC 18 OPENL8 CLC 0373 8FBD 20 1C 8F OPENL6 JSR COPY2 0374 8FC0 0375 8FC0 B0 0F BCS OPENL5 ;skip if OPENing CB 0376 8FC2 A9 3F LDAIM &3F 0377 8FC4 A0 01 LDYIM &01 0378 8FC6 91 AB STAIY UTIL3 ;delete the CB if READing 0379 8FC8 D0 07 BNE OPENL5 0380 8FCA 0381 8FCA 69 01 OPENL7 ADCIM ONE ;[C=0, A=&FF on error] 0382 8FCC D0 EE BNE OPENL8 ;else READ anyway 0383 8FCE 88 DEY 0384 8FCF 91 F0 OPENL4 STAIY PARMX ;return ZERO, error here 0385 8FD1 0386 8FD1 2E 64 0D OPENL5 ROL LFLAG ;restore flag byte 0387 8FD4 60 RTS 0388 8FD5 0389 8FD5 SETPPP ;C=1 on entry 0390 8FD5 A0 1C LDYIM UFSCB + LPTR 0391 8FD7 A5 F0 LDA PARMX 0392 8FD9 69 01 ADCIM ONE 0393 8FDB 20 E6 8F JSR SETPP1 0394 8FDE A0 01 LDYIM ONE 0395 8FE0 B1 F0 LDAIY PARMX ;add the size 0396 8FE2 A0 20 LDYIM UFSCB + HPTR 0397 8FE4 65 F0 ADC PARMX ;add on base address 0398 8FE6 91 9E SETPP1 STAIY WORKP1 0399 8FE8 C8 INY 0400 8FE9 A5 F1 LDA PARMY 0401 8FEB 69 00 ADCIM ZERO 0402 8FED 91 9E STAIY WORKP1 0403 8FEF 60 RTS 0404 8FF0 0405 8FF0 C9 01 DOFS CMPIM ONE 0406 8FF2 B0 4A BCS SENDST 0407 8FF4 A0 23 LDYIM UFSCB +&0B 0408 8FF6 B9 95 83 DOFS01 LDAAY TXTAB - UFSCB 0409 8FF9 D0 03 BNE DOFS04 0410 8FFB B9 E6 0D LDAAY FSLOCN - UFSCB-&02 ;fill in destination 0411 8FFE 91 9E DOFS04 STAIY WORKP1 ;set up control block number 2 0412 9000 88 DEY 0413 9001 C0 17 CPYIM UFSCB -&01 0414 9003 D0 F1 BNE DOFS01 0415 9005 C8 INY 0416 9006 84 9A STY TXCBP ;need this later 0417 9008 0418 9008 20 D5 8F JSR SETPPP 0419 900B 0420 900B ;**** control block now set up **** 0421 900B 0422 900B A0 02 LDYIM TWO 0423 900D A9 90 LDAIM PREPLY 0424 900F 85 97 STA ESCAP ;** 9/12/83 ** 0425 9011 91 F0 STAIY PARMX ;reply port 0426 9013 C8 INY 0427 9014 C8 INY 0428 9015 B9 FE 0D DOFS02 LDAAY URD - &04 ;Y=4 on entry 0429 9018 91 F0 STAIY PARMX ;fill in the handles 0430 901A C8 INY 0431 901B C0 07 CPYIM &07 0432 901D D0 F6 BNE DOFS02 ;copy handles as well 0433 901F 0434 901F A5 9F LDA WORKP1 +&01 ;pointer to page 0435 9021 85 9B STA TXCBP +&01 ;should be around $10,$11 0436 9023 58 CLI 0437 9024 20 FF 85 JSR XMITFS ;send the data 0438 9027 0439 9027 A0 20 LDYIM UFSCB +&08 0440 9029 A9 FF LDAIM FILLER 0441 902B 91 9E STAIY WORKP1 0442 902D C8 INY 0443 902E 91 9E STAIY WORKP1 ;arbitrary top bound on the buffer 0444 9030 0445 9030 A0 19 LDYIM UFSCB +&01 0446 9032 A9 90 LDAIM PREPLY 0447 9034 91 9E STAIY WORKP1 0448 9036 88 DEY 0449 9037 A9 7F LDAIM RXRDY 0450 9039 91 9E STAIY WORKP1 0451 903B 4C 30 85 JMP WAITFS ;poll the control block 0452 903E 0453 903E ;return, all done when data returned 0454 903E 0455 903E SENDST ;routine to send a string to a remote m/c 0456 903E ;and put it into the command buffer, to allow poking 0457 903E ;of BASIC programs etc. 0458 903E 0459 903E 08 PHP ;save Zflag 0460 903F A0 01 LDYIM ONE ;index byte is one 0461 9041 B1 F0 LDAIY PARMX ;get destination 0462 9043 AA TAX 0463 9044 C8 INY 0464 9045 B1 F0 LDAIY PARMX ;and NET number 0465 9047 0466 9047 C8 INY 0467 9048 84 AB STY UTIL3 ;saved area, string index 0468 904A 0469 904A A0 72 LDYIM UTXCB +&03 0470 904C 91 9C STAIY PAGE1 0471 904E 88 DEY 0472 904F 8A TXA ;old value 0473 9050 91 9C STAIY PAGE1 ;all done 0474 9052 28 PLP 0475 9053 D0 1C BNE DOFS2 0476 9055 0477 9055 A4 AB SENDS1 LDY UTIL3 0478 9057 E6 AB INC UTIL3 0479 9059 B1 F0 LDAIY PARMX 0480 905B F0 13 BEQ SENDS2 ;look for zero byte 0481 905D A0 7D LDYIM UTXCB +&0E ;buffer for char 0482 905F 91 9C STAIY PAGE1 ;move string to buffer char by char 0483 9061 48 PHA ;save this 0484 9062 20 7F 91 JSR CBSET ;JSR this char across to remote m/c 0485 9065 [ &FF=0 0488 9065 | 0489 9065 20 7C 90 JSR DOFSXM 0490 9068 ] Acorn macro assembler Page 35 OSWORD calls 0491 9068 CA SENDXX DEX 0492 9069 D0 FD BNE SENDXX ;slight delay loop 0493 906B 68 PLA 0494 906C 49 0D EORIM CR ;look for CR 0495 906E D0 E5 BNE SENDS1 ;loop until done [ <256 chars ] 0496 9070 60 SENDS2 RTS 0497 9071 0498 9071 20 7F 91 DOFS2 JSR CBSET ;set up the CB 0499 9074 A0 7B LDYIM UTXCB +&0C 0500 9076 B1 9C LDAIY PAGE1 ;ammend proc call 0501 9078 69 03 ADCIM &03 ;C=0 here 0502 907A 91 9C STAIY PAGE1 ;number = 3 0503 907C 58 DOFSXM CLI 0504 907D 4C FF 85 JMP XMITFS 0505 9080 0506 9080 LNK NFS09 0001 9080 0002 9080 ; > NFS09 0003 9080 TTL Remote Control - Computer end 0004 9080 OPT NETZ Acorn macro assembler Page 36 Remote Control - Computer end 0005 9080 0006 9080 0007 9080 ;This code is indirected from the NETVEC 0008 9080 ;currently located at $0224. All regs and 0009 9080 ;flags are preserved except where essential. 0010 9080 0011 9080 ;When a computer has control of a remote M/c 0012 9080 ;then it is said to be acting as a terminal. 0013 9080 ;The computer over which it has control is termed 0014 9080 ;the computer. All that the terminal does is 0015 9080 ;to poll its RRxcb like a dork until some 0016 9080 ;request from the computer is received.When this 0017 9080 ;occurs it is serviced and the RRxcb reopened. 0018 9080 0019 9080 ENTRY 0020 9080 08 PHP 0021 9081 48 PHA 0022 9082 8A TXA 0023 9083 48 PHA 0024 9084 98 TYA 0025 9085 48 PHA ;save all registers 0026 9086 BA TSX ;get reason code 0027 9087 BD 03 01 LDAAX &0103 ;from the stack 0028 908A C9 09 CMPIM &09 0029 908C B0 04 BCS ENTRY1 ;check inbounds 0030 908E AA TAX 0031 908F 20 99 90 JSR GO 0032 9092 68 ENTRY1 PLA 0033 9093 A8 TAY 0034 9094 68 PLA ;get results from stack 0035 9095 AA TAX 0036 9096 68 PLA 0037 9097 28 PLP 0038 9098 60 RTS ;restore status 0039 9099 0040 9099 BD AD 90 GO LDAAX TABHIZ 0041 909C 48 PHA 0042 909D BD A4 90 LDAAX TABLOZ 0043 90A0 48 PHA 0044 90A1 A5 EF LDA PARMA ;space saver 0045 90A3 60 RTS 0046 90A4 0047 90A4 TABLOZ 0048 90A4 F5 = RTTS -&01 0049 90A5 E9 = PRINT -&01 ;chars in printer buffer 0050 90A6 E9 = PRINT -&01 ;control-B 0051 90A7 E9 = PRINT -&01 ;control-C 0052 90A8 B5 = NWRCH -&01 ;net write char 0053 90A9 DA = SELECT -&01 ;printer selection changed 0054 90AA F5 = RTTS -&01 ;net read char 0055 90AB E7 = NBYTE -&01 ;net OSBYTE call 0056 90AC 53 = NWORD -&01 ;net OSWORD call 0057 90AD 0058 90AD TABHIZ 0059 90AD 80 = /(RTTS -&01 ) 0060 90AE 91 = /(PRINT -&01 ) 0061 90AF 91 = /(PRINT -&01 ) 0062 90B0 91 = /(PRINT -&01 ) 0063 90B1 90 = /(NWRCH -&01 ) 0064 90B2 91 = /(SELECT -&01 ) 0065 90B3 80 = /(RTTS -&01 ) 0066 90B4 90 = /(NBYTE -&01 ) 0067 90B5 91 = /(NWORD -&01 ) 0068 90B6 0069 90B6 ;WORKP1 is a pointer to the dynamic work area 0070 90B6 ;above the Filing system. The 0-page is dedicated 0071 90B6 ;to ECONET use only, so the pointer will be 0072 90B6 ;set up at AUTOBOOT and remain constant. 0073 90B6 0074 90B6 NWRCH 0075 90B6 ;write a char, passed in Y. 0076 90B6 BA TSX ;grab the stack pointer 0077 90B7 7E 06 01 RORAX &0106 0078 90BA 1E 06 01 ASLAX &0106 ;zero carry in Pbyte 0079 90BD 98 TYA 0080 90BE A0 DA LDYIM DATA1 ;offset in work area 0081 90C0 91 9E STAIY WORKP1 ;buffer the char 0082 90C2 A9 00 LDAIM RWRITE ;tag the packet 0083 90C4 0084 90C4 A0 D9 NTX LDYIM BUFFER ;store the tag byte 0085 90C6 91 9E STAIY WORKP1 ;A passed in the call 0086 90C8 A9 80 LDAIM &80 0087 90CA A0 0C LDYIM RTXCB ;offset of Remote T/Rxcb. 0088 90CC 91 9E STAIY WORKP1 ;set flag byte 0089 90CE 0090 90CE [ 0=0 0091 90CE A5 9A LDA TXCBP ;save work area over call 0092 90D0 48 PHA 0093 90D1 A5 9B LDA TXCBP +&01 0094 90D3 48 PHA 0095 90D4 ] 0096 90D4 0097 90D4 84 9A STY TXCBP ;restore after use [was zero] 0098 90D6 A6 9F LDX WORKP1 +&01 ;pointer to the pointer 0099 90D8 86 9B STX TXCBP +&01 0100 90DA 20 FF 85 JSR XMITFS ;do Tx, return to ENTRY 0101 90DD 0102 90DD A9 3F LDAIM &3F 0103 90DF 81 9A STAIX TXCBP ;reset CB to deleted 0104 90E1 0105 90E1 [ 0=0 0106 90E1 68 PLA ;restore it again after call 0107 90E2 85 9B STA TXCBP +&01 0108 90E4 68 PLA 0109 90E5 85 9A STA TXCBP 0110 90E7 ] 0111 90E7 0112 90E7 60 RTS 0113 90E8 0114 90E8 NBYTE 0115 90E8 ;When a M/c is remoted there may be occasion 0116 90E8 ;when the computer wishes to adjust the output 0117 90E8 ;it gives, eg change the flash rates, scan 0118 90E8 ;the KB etc. To do this OSBYTE and OSWORD calls 0119 90E8 ;should be used. These are indirected across 0120 90E8 ;the net to the terminal end. On reception 0121 90E8 ;the calls are dealt with and the results passed 0122 90E8 ;back across the net to the computer. Funky, huh! 0123 90E8 0124 90E8 ;Three bytes are passed, A,X,Y and the results 0125 90E8 ;are returned in X,Y. Acorn macro assembler Page 37 Remote Control - Computer end 0126 90E8 0127 90E8 ;The parms are passed in PARMA, PARMX, PARMY. 0128 90E8 ;Calls are claimed by V=1 on return. 0129 90E8 0130 90E8 ;This code deals with the computer end of 0131 90E8 ;such a transaction. OSBYTE and OSWORD calls 0132 90E8 ;are indicated by Tag number 0133 90E8 0134 90E8 ;[N.B. Vflag clear on entry] 0135 90E8 0136 90E8 A4 F1 NCALL LDY PARMY 0137 90EA C9 81 CMPIM &81 0138 90EC F0 13 BEQ NCAL2 ;look for INKEY 0139 90EE A0 01 LDYIM &01 0140 90F0 A2 09 NCAL1 LDXIM NCTBPL -NCALTB ;those calls returning Y>0 0141 90F2 20 3C 91 JSR NCALLP ;loop 0142 90F5 F0 0A BEQ NCAL2 0143 90F7 88 DEY 0144 90F8 88 DEY 0145 90F9 A2 0E LDXIM NCTBMI -NCALTB ;those calls returning Y<0 0146 90FB 20 3C 91 JSR NCALLP ;loop 0147 90FE F0 01 BEQ NCAL2 0148 9100 C8 INY 0149 9101 A2 02 NCAL2 LDXIM RBYTE1 0150 9103 98 TYA ;set flags 0151 9104 0152 9104 ;[Y=0, call not taken] 0153 9104 ;[Y>0, just looking] 0154 9104 ;[Y<0. change and claim call] 0155 9104 0156 9104 F0 35 NCAL3 BEQ NBYTEX ;if call not recognised 0157 9106 08 PHP 0158 9107 10 01 BPL NBYTE6 0159 9109 E8 INX 0160 910A A0 DC NBYTE6 LDYIM DATA3 ;copy Y,X,A 0161 910C 0162 910C B9 15 00 NBYTE1 LDAAY PARMA - DATA1 ;position independent 0163 910F 91 9E STAIY WORKP1 0164 9111 88 DEY 0165 9112 C0 DA CPYIM DATA1 ;copy parms Y,X,A DATA1-3 0166 9114 10 F6 BPL NBYTE1 ;buffer area 0167 9116 0168 9116 8A NBYTE2 TXA ;previously stored tag 0169 9117 0170 9117 20 C4 90 JSR NTX 0171 911A 28 PLP 0172 911B 10 1E BPL NBYTEX ;call to be done in BOTH M/c's 0173 911D 0174 911D A9 7F LDAIM &7F ;Changed 2/2/84 - JD 0175 911F A0 0C LDYIM RTXCB 0176 9121 91 9E STAIY WORKP1 0177 9123 0178 9123 B1 9E NRDCH2 LDAIY WORKP1 0179 9125 10 FC BPL NRDCH2 ;poll for char 0180 9127 0181 9127 BA TSX ;get the stack pointer 0182 9128 A0 DD LDYIM DATA4 0183 912A 0184 912A B1 9E LDAIY WORKP1 ;get the parms 0185 912C 09 44 ORAIM &44 ;set Vflag and Ibit 0186 912E D0 04 BNE NBYTE5 0187 9130 0188 9130 88 NBYTE4 DEY 0189 9131 CA DEX 0190 9132 B1 9E LDAIY WORKP1 ;get the parms 0191 9134 9D 06 01 NBYTE5 STAAX &0106 ;return the registers and status 0192 9137 C0 DA CPYIM DATA1 0193 9139 D0 F5 BNE NBYTE4 0194 913B 0195 913B 60 NBYTEX RTS ;all set up so return 0196 913C 0197 913C DD 45 91 NCALLP CMPAX NCALTB 0198 913F F0 03 BEQ NCALPX 0199 9141 CA DEX 0200 9142 10 F8 BPL NCALLP ;returns Z=1 on success 0201 9144 60 NCALPX RTS 0202 9145 0203 9145 04 NCALTB = &04 0204 9146 09 = &09 0205 9147 0A = &0A 0206 9148 ; = $14 0207 9148 15 = &15 ;** 6/6/83 ** 0208 9149 9A = &9A 0209 914A 9B = &9B 0210 914B E1 = &E1 ;** 7/2/84 ** 0211 914C E2 = &E2 0212 914D E3 = &E3 0213 914E E4 NCTBPL = &E4 0214 914F 0215 914F 0B = &0B 0216 9150 0C = &0C 0217 9151 0F = &0F 0218 9152 79 = &79 0219 9153 7A NCTBMI = &7A 0220 9154 0221 9154 NWORD 0222 9154 ;OSWORD calls intercepted in this manner 0223 9154 ;are 'make a sound' and 'define an envelope'. 0224 9154 ;As it is unlikely that such calls (or any 0225 9154 ;others) will need a result returning, 0226 9154 ;no mechanism is designed for this case. 0227 9154 0228 9154 ;Vflag clear on entry 0229 9154 ;recognise calls A=7 or 8 only 0230 9154 A0 0E LDYIM &0E 0231 9156 C9 07 CMPIM &07 0232 9158 F0 04 BEQ WORD1 0233 915A C9 08 CMPIM &08 0234 915C D0 E6 BNE NCALPX 0235 915E 0236 915E ;If WORDOK returns Z=1 then Y is set 0237 915E ;to be the number of parameters used in 0238 915E ;the call +1. 0239 915E 0240 915E A2 DB WORD1 LDXIM DATA2 0241 9160 86 9E STX WORKP1 ;ammend pointer 0242 9162 0243 9162 B1 F0 NWORD1 LDAIY PARMX ;get the data 0244 9164 91 9E STAIY WORKP1 ;save it in the data area 0245 9166 88 DEY 0246 9167 10 F9 BPL NWORD1 ;loop until all done Acorn macro assembler Page 38 Remote Control - Computer end 0247 9169 C8 INY 0248 916A C6 9E DEC WORKP1 ;point to DATA1 0249 916C A5 EF LDA PARMA ;call number 0250 916E 91 9E STAIY WORKP1 ;@ DATA1 0251 9170 84 9E STY WORKP1 ;restore pointer=0 0252 9172 0253 9172 A0 14 LDYIM RTXCB +&08 ;ammend pointer 0254 9174 A9 E9 LDAIM DATA2 +&0E ;new end pointer 0255 9176 91 9E STAIY WORKP1 0256 9178 A9 01 LDAIM RWORD ;tag the message 0257 917A 20 C4 90 JSR NTX 0258 917D 0259 917D 86 9E STX WORKP1 ;restore pointer 0260 917F [ &FF=0 0262 917F ] 0263 917F 0264 917F 0265 917F ;************************* 0266 917F ;** Initialisation code ** 0267 917F ;************************* 0268 917F 0269 917F CBSET ;set up control blocks from table 0270 917F A2 0D LDXIM CB1 - CB0 ;first control offset 0271 9181 A0 7C LDYIM UTXCB +&0D ;send to this offset 0272 9183 2C B3 83 BIT ALL1S ;set Vflag 0273 9186 70 05 BVS CBSET2 ;common code 0274 9188 A0 17 CBSET1 LDYIM RTXCB +&0B 0275 918A A2 1A LDXIM CB2 - CB0 ;second offset in table 0276 918C B8 CBSETP CLV ;discriminate on V flag 0277 918D BD B4 91 CBSET2 LDAAX CB0 ;get entry 0278 9190 C9 FE CMPIM CBSTOP 0279 9192 F0 1C BEQ CBEXIT ;spare RTS 0280 9194 C9 FD CMPIM CBSKIP 0281 9196 F0 14 BEQ CBSET5 0282 9198 C9 FC CMPIM CBFILL 0283 919A D0 08 BNE CBSET3 ;not dynamic char 0284 919C A5 9D LDA PAGE1 +&01 0285 919E 70 02 BVS CBSET6 0286 91A0 A5 9F LDA WORKP1 +&01 0287 91A2 85 9B CBSET6 STA TXCBP +&01 0288 91A4 70 04 CBSET3 BVS CBSET4 0289 91A6 91 9E STAIY WORKP1 0290 91A8 50 02 BVC CBSET5 0291 91AA 91 9C CBSET4 STAIY PAGE1 0292 91AC 88 CBSET5 DEY 0293 91AD CA DEX 0294 91AE 10 DD BPL CBSET2 ;continue until STOP char 0295 91B0 C8 CBEXIT INY 0296 91B1 84 9A STY TXCBP ;TXCBP setup in this routine 0297 91B3 60 RTS 0298 91B4 0299 91B4 CB0 0300 91B4 85 = &85 0301 91B5 00 = &00 0302 91B6 FD = CBSKIP ;destination 0303 91B7 FD = CBSKIP 0304 91B8 7D = UTXCB +&0E 0305 91B9 FC = CBFILL ;dynamic page (1) 0306 91BA FF = &FF 0307 91BB FF = &FF 0308 91BC 7E = UTXCB +&0F 0309 91BD FC = CBFILL ;dynamic page (1) 0310 91BE FF = &FF 0311 91BF FF = &FF 0312 91C0 00 = &00 ;CHARIN call 0313 91C1 00 CB1 = &00 0314 91C2 0315 91C2 FE = CBSTOP 0316 91C3 80 = &80 0317 91C4 93 = PREMOT ;remote port 0318 91C5 FD = CBSKIP ;spare space 0319 91C6 FD = CBSKIP ;controlling station 0320 91C7 D9 = BUFFER ;start of buffer 0321 91C8 FC = CBFILL 0322 91C9 FF = &FF 0323 91CA FF = &FF 0324 91CB DE = DATA4+&01 ;allow room for long OSword call 0325 91CC FC = CBFILL 0326 91CD FF = &FF 0327 91CE FF CB2 = &FF 0328 91CF 0329 91CF FE = CBSTOP 0330 91D0 D1 = &D1 0331 91D1 FD = CBSKIP 0332 91D2 FD = CBSKIP 0333 91D3 1F = PBUFF ;manifest start of print buffer 0334 91D4 FD = CBSKIP ;'wrong' page here 0335 91D5 FF = &FF 0336 91D6 FF = &FF 0337 91D7 FD = CBSKIP ;already setup 0338 91D8 FD = CBSKIP 0339 91D9 FF = &FF 0340 91DA FF CB3 = &FF 0341 91DB 0342 91DB TTL Network Print Routine 0343 91DB OPT &01 0344 91DB 0345 91DB ; 27/5/82 0346 91DB ; During the course of this implementation 0347 91DB ; lots of changes have been made to the spec. 0348 91DB ; The latest of these requires that the PRINTER 0349 91DB ; BUFFER be in a seperate page, adjacent to the 0350 91DB ; page holding the Tx/Rx CB's. Ah well.. 0351 91DB 0352 91DB ; The page holding the PRINTER BUFFER is located 0353 91DB ; in the first static page, the Tx/Rx CB's are 0354 91DB ; in the second. 0355 91DB 0356 91DB ; This code and the REMOTE facility share the same 0357 91DB ; page of DYNAMICALLY allocated STATIC workspace 0358 91DB ; and so can access it by the same pointer in 0-page. 0359 91DB ; As it cannot be guarenteed that these activities 0360 91DB ; will not interfere, care must be taken to ensure that 0361 91DB ; the pointer (WORKP1) is never left corrupted. 0362 91DB 0363 91DB SELECT ;come here when print selection changes 0364 91DB CA DEX ;X=4 now 0365 91DC E4 F0 CPX PARMX ;look at new print selection 0366 91DE D0 07 BNE SETUP1 ;A=6 here 0367 91E0 A9 1F SETOK LDAIM PBUFF 0368 91E2 8D 61 0D STA PBUFFP ;initial pointer Acorn macro assembler Page 39 Network Print Routine 0369 91E5 A9 41 LDAIM &41 ;initial flag byte 0370 91E7 85 99 SETUP1 STA PFLAGS 0371 91E9 60 SELEX RTS 0372 91EA 0373 91EA PRINT 0374 91EA ; ENTRY : A=1 char in buffer 0375 91EA ; : A=2 control-B 0376 91EA ; : A=3 control-C 0377 91EA ; : Y=buffer number 0378 91EA 0379 91EA ;PFLAGS is the print status byte 0380 91EA ; Bit7 = Sequence number 0381 91EA ; Bit6 = 1 always 0382 91EA ; Bit0 = 0 => print active 0383 91EA 0384 91EA C0 04 CPYIM FOUR ;buffer number 0385 91EC D0 FB BNE SELEX 0386 91EE 0387 91EE ;********************** 0388 91EE ; ENTER MAIN ROUTINE 0389 91EE ;********************** 0390 91EE 0391 91EE PRINT2 0392 91EE 0393 91EE ;********************* 0394 91EE ; DETERMINE ACTION 0395 91EE ;********************* 0396 91EE 0397 91EE 8A TXA 0398 91EF CA DEX ;look for control code 0399 91F0 D0 26 BNE PRINCC ;save status 0400 91F2 0401 91F2 0402 91F2 ;******************* 0403 91F2 ; SET EXIT CARRY 0404 91F2 ;******************* 0405 91F2 0406 91F2 BA TSX ;A=1 0407 91F3 1D 06 01 ORAAX &0106 ;set C=1 0408 91F6 9D 06 01 STAAX &0106 0409 91F9 0410 91F9 ;******************** 0411 91F9 ; EMPTY PRINT BUFFER 0412 91F9 ;******************** 0413 91F9 0414 91F9 A9 91 PRLP1 LDAIM &91 0415 91FB A2 03 LDXIM THREE ;buffer number 0416 91FD 20 F4 FF JSR OSBYTE ;returns char in Y 0417 9200 0418 9200 B0 E7 BCS SELEX ;carry set => buffer empty 0419 9202 98 TYA 0420 9203 20 0F 92 JSR PRBUFF 0421 9206 C0 6E CPYIM PSIZE +PBUFF -&01 ;test buffer full 0422 9208 90 EF BCC PRLP1 ;continue until all chars buffered 0423 920A 0424 920A 20 37 92 JSR PRSEND ;Tx the data 0425 920D 0426 920D 90 EA BCC PRLP1 ;continue, maybe more chars in buffer 0427 920F 0428 920F AC 61 0D PRBUFF LDY PBUFFP 0429 9212 91 9C STAIY PAGE1 0430 9214 EE 61 0D INC PBUFFP 0431 9217 60 RTS 0432 9218 0433 9218 PRINCC 0434 9218 ;************************ 0435 9218 ; CONTROL CHAR HERE 0436 9218 ;************************ 0437 9218 0438 9218 48 PHA ;save control char 0439 9219 8A TXA ;X=1 or 2 0440 921A 49 01 EORIM &01 ;A=0 or 3 here 0441 921C 20 0F 92 JSR PRBUFF 0442 921F 0443 921F 45 99 EOR PFLAGS ;update the flags 0444 9221 6A RORA ;bit0 => carry 0445 9222 90 06 BCC PRIL1 ;if print condition=0 then skip 0446 9224 0447 9224 2A ROLA 0448 9225 85 99 STA PFLAGS ;adjust PFLAGS for terminator flag 0449 9227 20 37 92 JSR PRSEND 0450 922A 0451 922A A5 99 PRIL1 LDA PFLAGS 0452 922C 29 F0 ANDIM &F0 0453 922E 6A RORA 0454 922F AA TAX ;save this 0455 9230 68 PLA 0456 9231 6A RORA ;set up carry 0457 9232 8A TXA 0458 9233 2A ROLA ;into bit0 0459 9234 85 99 STA PFLAGS 0460 9236 60 RTS ;other values restored so exit, DORMANT 0461 9237 0462 9237 PRSEND 0463 9237 ;************************* 0464 9237 ; SEND THE BUFFER 0465 9237 ;************************* 0466 9237 0467 9237 A0 08 LDYIM PTXCB +&08 0468 9239 AD 61 0D LDA PBUFFP 0469 923C 91 9E STAIY WORKP1 0470 923E A5 9D LDA PAGE1 +&01 0471 9240 C8 INY 0472 9241 91 9E STAIY WORKP1 0473 9243 A0 05 LDYIM PTXCB +&05 0474 9245 91 9E STAIY WORKP1 0475 9247 A0 0B LDYIM PTXCB +&0B 0476 9249 A2 26 LDXIM CB3 - CB0 0477 924B 20 8C 91 JSR CBSETP ;returns Y=PTXCB +1 0478 924E 88 DEY 0479 924F 0480 924F ;************************ 0481 924F ; UPDATE PFLAGS 0482 924F ;************************ 0483 924F 0484 924F A5 99 LDA PFLAGS 0485 9251 48 PHA 0486 9252 2A ROLA ;setup carry 0487 9253 68 PLA 0488 9254 49 80 EORIM &80 ;EOR top bit only 0489 9256 85 99 STA PFLAGS Acorn macro assembler Page 40 Network Print Routine 0490 9258 2A ROLA ;get flag byte for TX 0491 9259 91 9E STAIY WORKP1 ;update flag byte 0492 925B 0493 925B ;************************ 0494 925B ; SEND THE PACKET 0495 925B ;************************ 0496 925B 0497 925B A0 1F LDYIM PBUFF ;reset Pbuffp 0498 925D 8C 61 0D STY PBUFFP 0499 9260 0500 9260 A9 00 LDAIM &00 ;pseudo-handle 0501 9262 AA TAX 0502 9263 A4 9F LDY WORKP1 +&01 ;point to PTXCB 0503 9265 0504 9265 58 CLI ;enable interrupts 0505 9266 0506 9266 BSXMIT 0507 9266 ;entry conditions 0508 9266 ;A = Handle 0509 9266 ;X,Y point to the control block 0510 9266 0511 9266 ;A handle of Zero indicates a Print Stream 0512 9266 ;transaction. This sidesteps the SEQNOS 0513 9266 ;manipulation. 0514 9266 0515 9266 86 9A STX TXCBP 0516 9268 84 9B STY TXCBP +&01 0517 926A 48 PHA ;save acc 0518 926B 2D 08 0E AND SEQNOS 0519 926E F0 02 BEQ BSXL1 0520 9270 A9 01 LDAIM ONE 0521 9272 A0 00 BSXL1 LDYIM ZERO 0522 9274 11 9A ORAIY TXCBP ;setup the flag byte 0523 9276 48 PHA 0524 9277 91 9A STAIY TXCBP ;put the flag byte back 0525 9279 20 FF 85 JSR XMITFS ;do the transmit 0526 927C 0527 927C A9 FF LDAIM FILLER ;The BGET/PUT byte fix !!! 0528 927E A0 08 LDYIM HPTR ;offset of 8 in CB 0529 9280 91 9A STAIY TXCBP 0530 9282 C8 INY 0531 9283 91 9A STAIY TXCBP ;ready for anything here 0532 9285 0533 9285 68 PLA 0534 9286 AA TAX ;save it over next instr. 0535 9287 A0 D1 LDYIM PBLOCK ;ready for zero handle 0536 9289 68 PLA ;check handle or printer 0537 928A 48 PHA 0538 928B F0 02 BEQ BSPSX 0539 928D A0 90 LDYIM PREPLY 0540 928F 98 BSPSX TYA 0541 9290 A0 01 LDYIM &01 0542 9292 91 9A STAIY TXCBP ;set port 0543 9294 8A TXA 0544 9295 88 DEY 0545 9296 48 PHA ;save flag on stack 0546 9297 A9 7F BSXL0 LDAIM RXRDY 0547 9299 91 9A STAIY TXCBP 0548 929B 20 30 85 JSR WAITFS ;receive into the CB 0549 929E 68 PLA 0550 929F 48 PHA ;save old flag just in case 0551 92A0 51 9A EORIY TXCBP 0552 92A2 6A RORA ;look at the lsb 0553 92A3 B0 F2 BCS BSXL0 0554 92A5 68 PLA ;adjust stack 0555 92A6 68 PLA 0556 92A7 ; TAX ;** 22/8/83 ** 0557 92A7 ; INX ;look for X=0 here 0558 92A7 ; BEQ BSRTS 0559 92A7 4D 08 0E EOR SEQNOS ;update sequence number 0560 92AA 60 BSRTS RTS ;return with new SEQNOS in A 0561 92AB 0562 92AB LNK NFS10 0001 92AB 0002 92AB ; NFS10 0003 92AB OPT VIEW Acorn macro assembler Page 41 Network Print Routine 0004 92AB TTL VIEW - computer end 0005 92AB 0006 92AB 0007 92AB ; Second iteration of VIEW facility, started 27/7/82 0008 92AB ; This version uses dynamically allocated buffer store 0009 92AB ; and so is much longer than would otherwise be the case. 0010 92AB 0011 92AB ; The flag to indicate data ready is the dedicated 0012 92AB ; pointer ($9E,9F). This is set to non-zero value 0013 92AB ; on entry to this code, reset to zero on exit. 0014 92AB ; Polling on these bytes indicates data-ready and 0015 92AB ; also where the buffer is located. 0016 92AB 0017 92AB ;**** The Viewed end **** 0018 92AB 0019 92AB ; NB this end must be user-transparent as the NFS may 0020 92AB ; not be the dominant Filing-system. 0021 92AB 0022 92AB CVIEW ;prefix 'C' implies 'computer end' [cf REMOTE] 0023 92AB A5 AD LDA UTIL5 ;save this as work area 0024 92AD 48 PHA 0025 92AE 0026 92AE A9 E9 LDAIM VBUFF ;offset of VIEW buffer 0027 92B0 85 9E STA WORKP1 ;resurect this pointer after use 0028 92B2 0029 92B2 ;***** Reading the Palette ***** 0030 92B2 0031 92B2 ;Nb this code is in the wrong order at present 0032 92B2 0033 92B2 A0 00 LDYIM ZERO 0034 92B4 84 AD STY UTIL5 0035 92B6 AD 50 03 LDA &350 0036 92B9 91 9E STAIY WORKP1 0037 92BB E6 9E INC WORKP1 0038 92BD AD 51 03 LDA &351 0039 92C0 48 PHA 0040 92C1 98 TYA 0041 92C2 0042 92C2 91 9E CREAD2 STAIY WORKP1 ;update the CB 0043 92C4 A6 9E LDX WORKP1 0044 92C6 A4 9F LDY WORKP1 +&01 0045 92C8 A9 0B LDAIM &0B 0046 92CA 20 F1 FF JSR OSWORD 0047 92CD 68 PLA 0048 92CE A0 00 LDYIM ZERO 0049 92D0 91 9E STAIY WORKP1 ;restore previous result 0050 92D2 C8 INY 0051 92D3 B1 9E LDAIY WORKP1 ;preserve current result over next call 0052 92D5 48 PHA 0053 92D6 A6 9E LDX WORKP1 0054 92D8 E6 9E INC WORKP1 0055 92DA E6 AD INC UTIL5 ;increment the index 0056 92DC 88 DEY 0057 92DD A5 AD LDA UTIL5 0058 92DF E0 F9 CPXIM VBUFF +&10 0059 92E1 D0 DF BNE CREAD2 ;loop until buffer full 0060 92E3 68 PLA ;clean up the stack 0061 92E4 0062 92E4 84 AD STY UTIL5 ;counter for OSbyte index 0063 92E6 E6 9E INC WORKP1 ;update the data pointer 0064 92E8 20 F7 92 JSR CREADS ;get the screen data 0065 92EB E6 9E INC WORKP1 0066 92ED 68 PLA 0067 92EE 85 AD STA UTIL5 ;restore work area 0068 92F0 AD 65 0D CLRJSR LDA OLDJSR ;reset the JSR `uffer protection bits 0069 92F3 8D 63 0D STA LSTAT ; ... with old mask byte 0070 92F6 ; ... enable JSR's etc. again 0071 92F6 60 RTS ;return from the whole routine 0072 92F7 0073 92F7 ;***** Reading screen parameters ***** 0074 92F7 0075 92F7 AD 55 03 CREADS LDA &355 0076 92FA 91 9E STAIY WORKP1 0077 92FC AA TAX 0078 92FD 20 0A 93 JSR DOCALX 0079 9300 E6 9E INC WORKP1 0080 9302 98 TYA 0081 9303 81 9E STAIX WORKP1 0082 9305 20 08 93 JSR DOCALL 0083 9308 A2 00 DOCALL LDXIM ZERO ;**** main routine **** 0084 930A A4 AD DOCALX LDY UTIL5 0085 930C E6 AD INC UTIL5 0086 930E E6 9E INC WORKP1 0087 9310 B9 1E 93 LDAAY BYTETB ;get OSBYTE number 0088 9313 A0 FF LDYIM &FF ;for READ&SET operations 0089 9315 20 F4 FF JSR OSBYTE 0090 9318 8A TXA 0091 9319 A2 00 LDXIM ZERO 0092 931B 81 9E STAIX WORKP1 ;save the data 0093 931D 60 RTS ;return 0094 931E 0095 931E 85 BYTETB = &85 0096 931F C2 = &C2 0097 9320 C3 = &C3 ;three calls to do 0098 9321 0099 9321 ;****** End of VIEWED part ****** 0100 9321 LNK NFS11 0001 9321 ; NFS11 0002 9321 TTL TUBE code 0003 9321 OPT UADE51 Acorn macro assembler Page 42 TUBE code 0004 9321 > 2 ;object code to drive two 0005 9321 9321 ORG51 * . 0006 9321 9321 ZCODE * ORG51 0007 9321 ORG ZPTUBE 0008 0016 0016 S51 * . ;measure the length 0009 0016 A9 FF NEWBR LDAIM &FF 0010 0018 20 9E 06 JSR WRIFOR 0011 001B AD E3 FE LDA R2DATA 0012 001E A9 00 LDAIM &00 0013 0020 20 95 06 JSR RDCHA 0014 0023 A8 TAY 0015 0024 B1 FD LDAIY REPTR 0016 0026 20 95 06 JSR RDCHA 0017 0029 C8 NEWBA INY 0018 002A B1 FD LDAIY REPTR 0019 002C 20 95 06 JSR RDCHA 0020 002F AA TAX 0021 0030 D0 F7 BNE NEWBA 0022 0032 A2 FF TSTART LDXIM &FF 0023 0034 9A TXS 0024 0035 58 CLI 0025 0036 2C E0 FE MAIN BIT R1STAT 0026 0039 10 06 BPL MAINA 0027 003B AD E1 FE MAINB LDA R1DATA 0028 003E 20 EE FF JSR OSWRCH 0029 0041 2C E2 FE MAINA BIT R2STAT 0030 0044 10 F0 BPL MAIN 0031 0046 2C E0 FE BIT R1STAT 0032 0049 30 F0 BMI MAINB 0033 004B AE E3 FE LDX R2DATA 0034 004E 0050 JRAM * . +&02 0035 004E 86 51 STX JRAM +&01 0036 0050 6C 00 05 JMI TASKS ;JRAM defined here 0037 0053 00 SADR = &00 0038 0054 80 = &80 0039 0055 00 = &00 0040 0056 00 = &00 0041 0057 0042 0057 0057 E51 * . 0043 0057 0041 LEN51 * E51 - S51 0044 0057 0045 0057 LNK NFS12 0001 0057 ; -> NFS12 0002 0057 0003 0057 9362 ORG52 * ORG51 +LEN51 0004 0057 ORG RTUBE 0005 0400 0400 S52 * . 0006 0400 4C 84 04 JMP BEGIN 0007 0403 4C A7 06 JMP ESCAPE 0008 0406 C9 80 ADRR CMPIM &80 0009 0408 90 2B BCC ADDROK 0010 040A C9 C0 CMPIM &C0 0011 040C B0 1A BCS ADDRW 0012 040E 09 40 ORAIM &40 0013 0410 C5 15 CMP CLAIMER 0014 0412 D0 20 BNE ADDRWZ ;don't release, someone else (may of course be already released) 0015 0414 ADRREL 0016 0414 08 PHP ; ************************************ Bruce 27/2/86 ************* 0017 0415 78 SEI ; ************************************ Bruce 27/2/86 ************* 0018 0416 A9 05 LDAIM &05 ;tell 2nd processor transfer has stopped 0019 0418 20 9E 06 JSR WRIFOR 0020 041B A5 15 LDA CLAIMER 0021 041D 20 9E 06 JSR WRIFOR 0022 0420 28 PLP ; ************************************ Bruce 27/2/86 ************* 0023 0421 A9 80 ADRRAL LDAIM &80 0024 0423 85 15 STA CLAIMER ;** 18/1/84 ** 2's bug in FS 0025 0425 85 14 STA CLAIMT 0026 0427 60 RTS 0027 0428 06 14 ADDRW ASL CLAIMT 0028 042A B0 06 BCS ADDRWA ;got it 0029 042C C5 15 CMP CLAIMER 0030 042E F0 04 BEQ ADDRWZ ;same loony again so tell him ok 0031 0430 18 CLC 0032 0431 60 RTS 0033 0432 85 15 ADDRWA STA CLAIMER 0034 0434 60 ADDRWZ RTS 0035 0435 08 ADDROK PHP ;**** Jes 0036 0436 78 SEI ;**** critical region 0037 0437 84 13 STY QRAM +&01 0038 0439 86 12 STX QRAM 0039 043B 20 9E 06 JSR WRIFOR 0040 043E AA TAX 0041 043F A0 03 LDYIM &03 0042 0441 A5 15 LDA CLAIMER ;inform 2nd processor of user 0043 0443 20 9E 06 JSR WRIFOR 0044 0446 B1 12 ADRRB LDAIY QRAM 0045 0448 20 9E 06 JSR WRIFOR 0046 044B 88 DEY 0047 044C 10 F8 BPL ADRRB 0048 044E ; JSR WRIFOR ;** 10/1/84 ** 0049 044E A0 18 LDYIM &18 ;clear M and V flags 0050 0450 8C E0 FE STY R1STAT 0051 0453 BD 18 05 LDAAX VSTATE ;tube flags state 0052 0456 8D E0 FE STA R1STAT 0053 0459 4A LSRA 0054 045A 4A LSRA 0055 045B 90 06 BCC ADRRWP 0056 045D 2C E5 FE BIT R3DATA ;** 10/1/84 ** 0057 0460 2C E5 FE BIT R3DATA ;** 10/1/84 ** 0058 0463 20 9E 06 ADRRWP JSR WRIFOR ;** 10/1/84 ** 0059 0466 2C E6 FE ADRRWT BIT R4STAT ;synchronising byte 0060 0469 50 FB BVC ADRRWT 0061 046B B0 0D BCS ADRRP 0062 046D E0 04 CPXIM &04 0063 046F D0 11 BNE ANRTS 0064 0471 20 14 04 ADRRGO JSR ADRREL ; implicit release 0065 0474 20 95 06 JSR RDCHA 0066 0477 4C 32 00 JMP TSTART 0067 047A ADRRP ; BIT R3DATA ** 10/1/84 ** 0068 047A ; BIT R3DATA ** 10/1/84 ** 0069 047A 4A LSRA 0070 047B 90 05 BCC ANRTS 0071 047D A0 88 LDYIM &88 0072 047F 8C E0 FE STY R1STAT ;set M flag 0073 0482 28 ANRTS PLP ;restore interrupt status *** Jes 0074 0483 60 RTS 0075 0484 58 BEGIN CLI 0076 0485 B0 11 BCS BEGINR ;carry preserved from BEGIN 0077 0487 D0 03 BNE BEGINK 0078 0489 4C 9C 05 JMP QRPLY 0079 048C BEGINK Acorn macro assembler Page 43 TUBE code 0080 048C [ 1=1 ; ************************************ Bruce 27/2/86 ********** 0081 048C A2 00 LDXIM &00 0082 048E A0 FF LDYIM &FF 0083 0490 A9 FD LDAIM &FD 0084 0492 20 F4 FF JSR OSBYTE 0085 0495 8A TXA 0086 0496 | 0088 0496 ] 0089 0496 F0 D9 BEQ ADRRGO 0090 0498 A9 FF BEGINR LDAIM &FF ;***** 0091 049A 20 06 04 JSR ADRR ;***** 0092 049D 90 F9 BCC BEGINR ;***** 0093 049F ; SEI ; ************************************ Bruce 27/2/86 ************* 0094 049F 20 D2 04 JSR SETADR 0095 04A2 SENDW 0096 04A2 ; PHP ; ************************************ Bruce 27/2/86 ************* 0097 04A2 ; SEI ; ************************************ Bruce 27/2/86 ************* 0098 04A2 A9 07 LDAIM &07 0099 04A4 20 CB 04 JSR TADDR 0100 04A7 A0 00 LDYIM &00 0101 04A9 84 00 STY ZRAM 0102 04AB B1 00 SENDL LDAIY ZRAM 0103 04AD 8D E5 FE STA R3DATA 0104 04B0 [ 1=1 ; ************************************ Bruce 27/2/86 ************* 0105 04B0 EA NOP 0106 04B1 EA NOP 0107 04B2 EA NOP 0108 04B3 | 0111 04B3 ] 0112 04B3 C8 INY 0113 04B4 D0 F5 BNE SENDL 0114 04B6 ; PLP ; ************************************ Bruce 27/2/86 ************* 0115 04B6 E6 54 INC SADR +&01 0116 04B8 D0 06 BNE SENDT 0117 04BA E6 55 INC SADR +&02 0118 04BC D0 02 BNE SENDT 0119 04BE E6 56 INC SADR +&03 0120 04C0 E6 01 SENDT INC ZRAM +&01 0121 04C2 24 01 BIT ZRAM +&01 0122 04C4 50 DC BVC SENDW 0123 04C6 20 D2 04 JSR SETADR 0124 04C9 A9 04 LDAIM &04 0125 04CB A0 00 TADDR LDYIM /(SADR ) 0126 04CD A2 53 LDXIM SADR 0127 04CF 4C 06 04 JMP ADRR 0128 04D2 A9 80 SETADR LDAIM &80 0129 04D4 85 54 STA SADR +&01 0130 04D6 85 01 STA ZRAM +&01 0131 04D8 A9 20 LDAIM &20 0132 04DA 2D 06 80 AND &8006 0133 04DD A8 TAY ;**** Jes 0134 04DE 84 53 STY SADR 0135 04E0 F0 19 BEQ BEGINA 0136 04E2 AE 07 80 LDX &8007 0137 04E5 E8 BEGINL INX 0138 04E6 BD 00 80 LDAAX &8000 0139 04E9 D0 FA BNE BEGINL 0140 04EB BD 01 80 LDAAX &8001 0141 04EE 85 53 STA SADR 0142 04F0 BD 02 80 LDAAX &8002 0143 04F3 85 54 STA SADR +&01 0144 04F5 BC 03 80 LDYAX &8003 0145 04F8 BD 04 80 LDAAX &8004 0146 04FB 85 56 BEGINA STA SADR +&03 0147 04FD 84 55 STY SADR +&02 0148 04FF 60 RTS 0149 0500 0150 0500 0500 E52 * . 0151 0500 0100 LEN52 * E52 - S52 0152 0500 0153 0500 LNK NFS13 0001 0500 ; > NFS13 0002 0500 0480 Q * RTUBE +&80 0003 0500 0500 QTUBE * RTUBE+&100 0004 0500 9462 ORG53 * ORG52 +LEN52 0005 0500 ORG QTUBE 0006 0500 0500 S53 * . 0007 0500 37 05 TASKS & RDCHZ 0008 0502 96 05 & CLI 0009 0504 F2 05 & SBYTE 0010 0506 07 06 & BYTE 0011 0508 27 06 & WORD 0012 050A 68 06 & RDLN 0013 050C 5E 05 & ARGS 0014 050E 2D 05 & BGET 0015 0510 20 05 & BPUT 0016 0512 42 05 & FIND 0017 0514 A9 05 & FILE 0018 0516 D1 05 & GBPB 0019 0518 86 VSTATE = &86 0020 0519 88 = &88 0021 051A 96 = &96 0022 051B 98 = &98 0023 051C 18 = &18 0024 051D 18 = &18 0025 051E 82 = &82 0026 051F 18 = &18 0027 0520 20 C5 06 BPUT JSR NEWRC 0028 0523 A8 TAY 0029 0524 20 C5 06 JSR NEWRC 0030 0527 20 D4 FF JSR OSBPUT 0031 052A 4C 9C 05 JMP QRPLY 0032 052D 20 C5 06 BGET JSR NEWRC 0033 0530 A8 TAY 0034 0531 20 D7 FF JSR OSBGET 0035 0534 4C 3A 05 JMP RDCHY 0036 0537 20 E0 FF RDCHZ JSR OSRDCH 0037 053A 6A RDCHY RORA ;send C and A and go back to MAIN 0038 053B 20 95 06 JSR RDCHA 0039 053E 2A ROLA 0040 053F 4C 9E 05 JMP RPLY 0041 0542 20 C5 06 FIND JSR NEWRC 0042 0545 F0 0B BEQ FINDA 0043 0547 48 PHA 0044 0548 20 82 05 JSR STRNG 0045 054B 68 PLA 0046 054C 20 CE FF JSR OSFIND 0047 054F 4C 9E 05 JMP RPLY 0048 0552 20 C5 06 FINDA JSR NEWRC 0049 0555 A8 TAY 0050 0556 A9 00 LDAIM &00 Acorn macro assembler Page 44 TUBE code 0051 0558 20 CE FF JSR OSFIND 0052 055B 4C 9C 05 JMP QRPLY 0053 055E 20 C5 06 ARGS JSR NEWRC 0054 0561 A8 TAY 0055 0562 A2 04 LDXIM &04 0056 0564 20 C5 06 ARGSW JSR NEWRC 0057 0567 95 FF STAZX &FF ;ZRAM-%1 0058 0569 CA DEX 0059 056A D0 F8 BNE ARGSW 0060 056C 20 C5 06 JSR NEWRC 0061 056F 20 DA FF JSR OSARGX 0062 0572 20 95 06 JSR RDCHA 0063 0575 A2 03 LDXIM &03 0064 0577 B5 00 ARGSS LDAAX ZRAM 0065 0579 20 95 06 JSR RDCHA 0066 057C CA DEX 0067 057D 10 F8 BPL ARGSS 0068 057F 4C 36 00 JMP MAIN 0069 0582 A2 00 STRNG LDXIM SRAM 0070 0584 A0 00 LDYIM &00 0071 0586 20 C5 06 STRNH JSR NEWRC 0072 0589 99 00 07 STAAY SRAM 0073 058C C8 INY 0074 058D F0 04 BEQ STRNJ 0075 058F C9 0D CMPIM &0D 0076 0591 D0 F3 BNE STRNH 0077 0593 A0 07 STRNJ LDYIM /(SRAM ) 0078 0595 60 RTS 0079 0596 20 82 05 CLI JSR STRNG 0080 0599 20 F7 FF JSR OSCLI 0081 059C A9 7F QRPLY LDAIM &7F 0082 059E 2C E2 FE RPLY BIT R2STAT 0083 05A1 50 FB BVC RPLY 0084 05A3 8D E3 FE STA R2DATA 0085 05A6 4C 36 00 MJ JMP MAIN 0086 05A9 A2 10 FILE LDXIM &10 0087 05AB 20 C5 06 FILEA JSR NEWRC 0088 05AE 95 01 STAAX ZRAM +&01 0089 05B0 CA DEX 0090 05B1 D0 F8 BNE FILEA 0091 05B3 20 82 05 JSR STRNG 0092 05B6 86 00 STX ZRAM 0093 05B8 84 01 STY ZRAM +&01 0094 05BA A0 00 LDYIM /(ZRAM ) 0095 05BC 20 C5 06 JSR NEWRC 0096 05BF 20 DD FF JSR OSFILE 0097 05C2 20 95 06 JSR RDCHA 0098 05C5 A2 10 LDXIM &10 0099 05C7 B5 01 FILEB LDAAX ZRAM +&01 0100 05C9 20 95 06 JSR RDCHA 0101 05CC CA DEX 0102 05CD D0 F8 BNE FILEB 0103 05CF F0 D5 BEQ MJ 0104 05D1 A2 0D GBPB LDXIM &0D 0105 05D3 20 C5 06 GBPBA JSR NEWRC 0106 05D6 95 FF STAZX &FF ;ZRAM-%1 0107 05D8 CA DEX 0108 05D9 D0 F8 BNE GBPBA 0109 05DB 20 C5 06 JSR NEWRC 0110 05DE A0 00 LDYIM &00 0111 05E0 20 D1 FF JSR OSGBPB 0112 05E3 48 PHA 0113 05E4 A2 0C LDXIM &0C 0114 05E6 B5 00 GBPBB LDAAX ZRAM 0115 05E8 20 95 06 JSR RDCHA 0116 05EB CA DEX 0117 05EC 10 F8 BPL GBPBB 0118 05EE 68 PLA 0119 05EF 4C 3A 05 JMP RDCHY 0120 05F2 20 C5 06 SBYTE JSR NEWRC 0121 05F5 AA TAX 0122 05F6 20 C5 06 JSR NEWRC 0123 05F9 20 F4 FF JSR OSBYTE 0124 05FC 2C E2 FE SBYTC BIT R2STAT 0125 05FF 50 FB BVC SBYTC 0126 0601 8E E3 FE STX R2DATA 0127 0604 4C 36 00 BYTEX JMP MAIN 0128 0607 20 C5 06 BYTE JSR NEWRC 0129 060A AA TAX 0130 060B 20 C5 06 JSR NEWRC 0131 060E A8 TAY 0132 060F 20 C5 06 JSR NEWRC 0133 0612 20 F4 FF JSR OSBYTE 0134 0615 49 9D EORIM &9D 0135 0617 F0 EB BEQ BYTEX 0136 0619 6A RORA 0137 061A 20 95 06 JSR RDCHA 0138 061D 2C E2 FE BYTEC BIT R2STAT 0139 0620 50 FB BVC BYTEC 0140 0622 8C E3 FE STY R2DATA 0141 0625 70 D5 BVS SBYTC 0142 0627 20 C5 06 WORD JSR NEWRC 0143 062A A8 TAY ;***** 0144 062B 2C E2 FE WORDA BIT R2STAT 0145 062E 10 FB BPL WORDA 0146 0630 AE E3 FE LDX R2DATA 0147 0633 CA DEX 0148 0634 30 0F BMI WORDC 0149 0636 2C E2 FE WORDB BIT R2STAT 0150 0639 10 FB BPL WORDB 0151 063B AD E3 FE LDA R2DATA ;***** 0152 063E 9D 28 01 STAAX WRAM ;***** 0153 0641 CA DEX 0154 0642 10 F2 BPL WORDB 0155 0644 98 TYA ;***** 0156 0645 A2 28 WORDC LDXIM WRAM ;***** 0157 0647 A0 01 LDYIM /(WRAM ) ;***** 0158 0649 20 F1 FF JSR OSWORD 0159 064C 2C E2 FE WORDD BIT R2STAT 0160 064F 10 FB BPL WORDD 0161 0651 AE E3 FE LDX R2DATA 0162 0654 CA DEX 0163 0655 30 0E BMI WOREN 0164 0657 BC 28 01 WORDE LDYAX WRAM 0165 065A 2C E2 FE WORDF BIT R2STAT 0166 065D 50 FB BVC WORDF 0167 065F 8C E3 FE STY R2DATA 0168 0662 CA DEX 0169 0663 10 F2 BPL WORDE 0170 0665 4C 36 00 WOREN JMP MAIN 0171 0668 A2 04 RDLN LDXIM &04 Acorn macro assembler Page 45 TUBE code 0172 066A 20 C5 06 RDLNA JSR NEWRC 0173 066D 95 00 STAAX ZRAM 0174 066F CA DEX 0175 0670 10 F8 BPL RDLNA 0176 0672 E8 INX 0177 0673 A0 00 LDYIM /(ZRAM ) 0178 0675 8A TXA 0179 0676 20 F1 FF JSR OSWORD 0180 0679 90 05 BCC RDLNC 0181 067B A9 FF LDAIM &FF 0182 067D 4C 9E 05 JMP RPLY 0183 0680 A2 00 RDLNC LDXIM &00 0184 0682 A9 7F LDAIM &7F 0185 0684 20 95 06 JSR RDCHA 0186 0687 BD 00 07 RDLND LDAAX SRAM 0187 068A 20 95 06 RDLNE JSR RDCHA 0188 068D E8 INX 0189 068E C9 0D CMPIM &0D 0190 0690 D0 F5 BNE RDLND 0191 0692 4C 36 00 JMP MAIN 0192 0695 2C E2 FE RDCHA BIT R2STAT 0193 0698 50 FB BVC RDCHA 0194 069A 8D E3 FE STA R2DATA 0195 069D 60 RTS 0196 069E 2C E6 FE WRIFOR BIT R4STAT 0197 06A1 50 FB BVC WRIFOR 0198 06A3 8D E7 FE STA R4DATA 0199 06A6 60 RTS 0200 06A7 A5 FF ESCAPE LDA ESCFLG 0201 06A9 38 SEC 0202 06AA 6A RORA 0203 06AB 30 0F BMI ESCA 0204 06AD 48 EVENT PHA 0205 06AE A9 00 LDAIM &00 0206 06B0 20 BC 06 JSR ESCA 0207 06B3 98 TYA 0208 06B4 20 BC 06 JSR ESCA 0209 06B7 8A TXA 0210 06B8 20 BC 06 JSR ESCA 0211 06BB 68 PLA 0212 06BC 2C E0 FE ESCA BIT R1STAT 0213 06BF 50 FB BVC ESCA 0214 06C1 8D E1 FE STA R1DATA 0215 06C4 60 RTS 0216 06C5 2C E2 FE NEWRC BIT R2STAT 0217 06C8 10 FB BPL NEWRC 0218 06CA AD E3 FE LDA R2DATA 0219 06CD 60 RTS 0220 06CE 0221 06CE 06CE E53 * . 0222 06CE 4A 65 73 = "Jes" 0223 06D1 01CE LEN53 * E53 - S53 0224 06D1 9630 ORG54 * ORG53 +LEN53 0225 06D1 1630 THEEND * ORG54 -ORG 0226 06D1 0227 06D1 FF FF FF = &FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF 0228 06DB FF FF FF = &FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF 0229 06E5 FF FF FF = &FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF 0230 06EF FF FF FF = &FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF 0231 06F9 FF FF FF = &FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF 0232 0703 FF FF FF = &FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF,&FF 0233 070D ;unused bytes set to $FF, (thanks Paul) 0234 070D 0235 070D END Assembly finished, no errors Action : ASM LOWROM Macro library : Acorn macro assembler Page 1 Pass 1 Pass 2 0001 0000 9630 LOWORG * &9630 0002 0000 0000 ZERO * 0 0003 0000 0001 ONE * 1 0004 0000 0002 TWO * 2 0005 0000 0003 THREE * 3 0006 0000 0004 FOUR * 4 0007 0000 0005 FIVE * 5 0008 0000 0007 SEVEN * 7 0009 0000 0008 EIGHT * 8 0010 0000 0011 0000 0000 TRUE * 0 0012 0000 FFFF FALSE * &FFFF 0013 0000 0000 YES * TRUE 0014 0000 FFFF NO * FALSE 0015 0000 FFFF SECRET * NO 0016 0000 0017 0000 ; Flags for fast code assembly 0018 0000 0019 0000 0020 0000 0000 FAST1 * TRUE 0021 0000 FFFF FAST2 * FALSE 0022 0000 0000 FAST3 * TRUE 0023 0000 0000 FAST4 * TRUE 0024 0000 FFFF FAST5 * FALSE 0025 0000 0000 FAST6 * TRUE 0026 0000 0000 FAST7 * TRUE 0027 0000 0000 FAST8 * TRUE 0028 0000 FFFF FAST9 * FALSE 0029 0000 FFFF FAST10 * FALSE 0030 0000 0000 FAST11 * TRUE 0031 0000 0000 FAST12 * TRUE 0032 0000 0000 FAST13 * TRUE 0033 0000 0000 FAST14 * TRUE 0034 0000 0035 0000 0036 0000 0005 LLOLST * 5 0037 0000 0005 SWRTNS * 5 0038 0000 0005 RXRTNS * 5 0039 0000 0005 TXRTNS * 5 0040 0000 0005 NMILST * 5 0041 0000 0005 STATSL * 5 0042 0000 0043 0000 FFF4 OSBYTE * &FFF4 0044 0000 FFBF OSEVEN * &FFBF 0045 0000 0046 0000 00C0 RXCB * &C0 0047 0000 007F RXRDY * &7F 0048 0000 8000 USRPRC * &8000 0049 0000 FEE5 R3DATA * &FEE5 0050 0000 0098 TUBLOK * &98 0051 0000 8021 MCPEEK * &8021 0052 0000 0053 0000 009C DYNVC1 * &9C 0054 0000 009E DYNVC2 * &9E 0055 0000 0056 0000 0000 NFSORG * 0 0057 0000 0000 NFSEND * 0 0058 0000 0000 TUBORG * 0 0059 0000 0000 TUBEND * 0 0060 0000 0061 0000 0062 0000 LNK LOWL00 0001 0000 TTL Low level organization and constants File => LOWL00 0002 0000 OPT LLOLST Acorn macro assembler Page 2 Low level organization and constants File => LOWL00 0003 0000 ORG &9630 0004 9630 ;ECONET VERSION 3 : B.ROBERTSON 30:1:82 0005 9630 0006 9630 ;BBC MACHINE MANIFEST CONSTANTS. 0007 9630 0008 9630 ;HARDWARE DEPENDANT CONSTANTS 0009 9630 0010 9630 FEA0 ADLC * &FEA0 ;6854 SERIAL CONTROL CHIP LOCATION 0011 9630 [ SECRET = NO 0012 9630 FE18 STNID * &FE18 ;LOCATION OF STATION ID ADDRESS. 0013 9630 FE20 INTON * &FE20 ;INTERUPT ENABLE ADDRESS 0014 9630 FE18 INTOFF * &FE18 ;INTERUPT DISABLE ADDRESS 0015 9630 | 0019 9630 ] 0020 9630 FE30 ROMSWW * &FE30 ;ROM SWITCH WRITE LOCATION 0021 9630 FE40 VIA * &FE40 ;6522 LOCATION USED FOR GENERATING IRQ 0022 9630 0023 9630 0024 9630 ;MOS DEPENDANT CONSTANTS 0025 9630 00F4 ROMSWR * &00F4 ;ROM SWITCH READ LOCATION 0026 9630 0406 tADDRl * &0406 ;ADDRESS OF TUBE SOFTWARE 0027 9630 00A0 PAGEZ * &00A0 ;PAGE ZERO VARIABLE LOCATIONS 0028 9630 0D00 RAMCDE * &0D00 ;ORIGIN OF RAM CODE 0029 9630 0D38 VAR * &0D38 ;SCRATCH VARIABLE LOCATIONS.USED WHEN ACTIVE 0030 9630 0031 9630 0032 9630 ;LOCATIONS USED IN THE NFS CODE, *******************FIX THIS 0033 9630 0034 9630 8000 JEZZ * &8000 ;JUMP FOR REMOTE PROC CALLS 0035 9630 0D64 SSTATE * &D64 ;STATION STATE CONTROL BLOCKS EXIST 0036 9630 0D63 IMASK * &D63 ;IMMEDIATE OPERATION MASK PERMIT IMMEDIATE OPERATIONS 0037 9630 0D67 TUBEFL * &D67 ;FLAGS WHETHER TUBE PRESENT 0038 9630 0D62 TXCLRl * &D62 ;FLAGS WHETHER CLEAR FOR USER TO TX 0039 9630 0D65 MASKST * &D65 ;STORES VALUE OF IM PROT MASK WHEN JSR 0040 9630 0004 MSIZE * &04 ;MACHINE AREA FOUR BYTES TO PEEK 0041 9630 0042 9630 ;STATIC PAGE OFFSET CONSTANTS 0043 9630 007F BUFCNT * &7F ;NUMBER OF PARAMETERS IN BUFFER 0044 9630 0080 STNNO * &80 ;CALLING IM OP STATION 0045 9630 0082 PROBUF * &82 ;PROCEDURE PARAMETER BUFFER 0046 9630 0008 LLEVST * &08 ;LOW LEVEL STATE 0047 9630 0048 9630 ;USEFUL CONSTANTS 0049 9630 0000 DONTC * &00 ;DONT CARE CONSTANT 0050 9630 0051 9630 ;6854 LOCATIONS 0052 9630 FEA0 CReg1 * ADLC +&00 ;CONTROL REGISTER 1 C1B0=X 0053 9630 FEA1 CReg2 * ADLC +&01 ;CONTROL REGISTER 2 C1B0=0 0054 9630 FEA1 CReg3 * ADLC +&01 ;CONTROL REGISTER 3 C1B0=1 0055 9630 FEA3 CReg4 * ADLC +&03 ;CONTROL REGISTER 4 C1B0=1 0056 9630 FEA2 RXBYTE * ADLC +&02 ;RECEIVE BYTE C1B0=X 0057 9630 FEA0 SReg1 * ADLC +&00 ;STATUS REGISTER 1 C1B0=X 0058 9630 FEA1 SReg2 * ADLC +&01 ;STATUS REGISTER 2 C1B0=X 0059 9630 FEA2 TXBYTE * ADLC +&02 ;TRANSMIT NEXT BYTE C1B0=X 0060 9630 FEA3 TXLAST * ADLC +&03 ;TRANSMIT LAST BYTE C1B0=0 0061 9630 0062 9630 ;ADLC STATUS REGISTER A EVENT CONSTANTS 0063 9630 0002 S2RQ * &02 ;STATUS REGISTER 2 REQUEST 0064 9630 0010 CTS * &10 ;CLEAR TO SEND 0065 9630 0008 FD * &08 ;FLAG DETECT 0066 9630 0040 TDRA * &40 ;TRANSMIT DATA REGISTER AVAILABLE 0067 9630 0068 9630 ;STATUS REGISTER B EVENT CONSTANTS 0069 9630 0020 DCD * &20 ;DATA CARRIER DETECT 0070 9630 0004 RXIDLE * &04 ;INACTIVE IDLE RECEIVED 0071 9630 0002 FV * &02 ;FRAME VALID 0072 9630 0080 RDA * &80 ;RECEIVE DATA AVAILABLE 0073 9630 0010 CRC * &10 ;FRAME CHECKSUM ERROR 0074 9630 0001 AP * &01 ;ADDRESS PRESENT. 0075 9630 0076 9630 0077 9630 ;SCOUT BUFFER FORMAT 0078 9630 0000 SRLO * &00 0079 9630 0001 SRHI * &01 0080 9630 0002 CNTL * &02 ;ZERO FOR IMMEDIATE OPERATIONS 0081 9630 0003 PORTn * &03 0082 9630 0004 ADTO1 * &04 0083 9630 0005 ADTO2 * &05 0084 9630 0006 ADTO3 * &06 0085 9630 0007 ADTO4 * &07 0086 9630 0008 ADFR1 * &08 0087 9630 0009 ADFR2 * &09 0088 9630 000A ADFR3 * &0A 0089 9630 000B ADFR4 * &0B 0090 9630 000C SBSIZE * &0C ;SIZE OF SCOUT BUFFER 0091 9630 0092 9630 ;CONTROL BLOCK FORMAT - LOCATED ANYWHERE IN MEMORY 0093 9630 0000 CBCNTL * &00 ;N.B. SEE CONTROL BYTE VALUES VALID CONTROL BLOCK 0094 9630 0001 CBPORT * &01 0095 9630 0002 CBSRLO * &02 ;N.B. SEE STATION ID VALUES CONTROL BLOCK SOURCE LO 0096 9630 0003 CBSRHI * &03 0097 9630 0004 CBSALO * &04 ;CONTROL BLOCK DATA START ADDRESS LO 0098 9630 0005 CBSAHI * &05 0099 9630 0006 CBSAH1 * &06 0100 9630 0007 CBSAH2 * &07 0101 9630 0008 CBEALO * &08 ;CONTROL BLOCK DATA END ADDRESS LO 0102 9630 0009 CBEAHI * &09 0103 9630 000A CBEAH1 * &0A 0104 9630 000B CBEAH2 * &0B 0105 9630 000C XTRA1L * &0C 0106 9630 000D XTRA1H * &0D 0107 9630 000E XTRA2L * &0E 0108 9630 000F XTRA2H * &0F 0109 9630 0110 9630 0111 9630 ;CONTROL BYTE VALUE IMMEDIATE CONSTANTS. 0112 9630 0081 IPEEK * &81 ;REMOTE PEEK N.B. MUST BE LOWEST NUMBER 0113 9630 0082 IPOKE * &82 ;REMOTE POKE 0114 9630 0083 IRTN * &83 ;REMOTE ROUTINE CALL 0115 9630 0084 IPROCE * &84 ;REMOTE EVENT PROCEDURE CALL 0116 9630 0085 IPROCH * &85 ;REMOTE HIGH LEVEL PROCEDURE CALL 0117 9630 0086 ISTOP * &86 ;REMOTE STOP 0118 9630 0087 ISTRT * &87 ;REMOTE RESTART 0119 9630 0088 IMACH * &88 ;MACHINE TYPE PEEK. 0120 9630 0121 9630 ;PORT BYTE VALUE CONSTANTS. 0122 9630 0000 ANYPRT * &00 ;ANY PORT ACCEPTED 0123 9630 0124 9630 ;STATION ID RESERVED CONSTANTS 0125 9630 00FF BDCAST * &FF ;BROADCAST ADDRESS 0126 9630 00F0 PRIVID * &F0 ;N.B STATIONS 240-254 NOT SUBJECT TO REMOTE IMMED OP CONTROL MASK Acorn macro assembler Page 3 Low level organization and constants File => LOWL00 0127 9630 0000 NETnum * &00 ;NETWORK ID CONSTANT 0128 9630 0129 9630 ;STATION STATE CONSTANTS EXIST UNTIL CHANGED 0130 9630 0080 JEZZEX * &80 ;JEZZ RX CONTROL BLOCK EXISTS 0131 9630 0040 RXCBEX * &40 ;RXCBLOCK EXISTS N.B. MUST BE $80 FOR MINUS TEST 0132 9630 0004 STOP * &04 ;FLAGS A STOPPED STATE 0133 9630 0134 9630 0135 9630 ;NET STATE FLAG BITS RESET EVERY MESSAGE 0136 9630 0080 DACK * &80 ;FLAGS A DATA ACK PACKET 0137 9630 0040 BCAST * &40 ;SIGNALS A BROADCAST MESSAGE HAS BEEN RECEIVED 0138 9630 0020 ONEBYT * &20 ;FLAGS ONE BYTE LEFT FOR THE TUBE 0139 9630 0002 TUBEf * &02 ;FLAGS THAT DATA IS FOR SECOND PROCESSOR 0140 9630 0001 SHORT * &01 ;2 WAY HANDSHAKE 0141 9630 0142 9630 ;STATE1 CONSTANTS INDICATE INFO IN SCOUT PACKET 0143 9630 0080 X4BYT * &80 ;XTRA 4 BYTES TO BE TRANSMITTED 0144 9630 0040 X8BYT * &40 ;XTRA 8 BYTES TO BE TRANSMITTED 0145 9630 0146 9630 ;N.B. TXDAPT,RXYOFF,TXPAGE ARE SHARED WITH RX VARS 0147 9630 ;TRANSMITTER STATION NETWORK VARIABLE LOCATIONS 0148 9630 00A0 TXCBPT * PAGEZ +&00 ;TX CNTRL BLOCK POINTER. ONE BLOCK ONLY 0149 9630 00A4 TXDAPT * PAGEZ +&04 ;16 BIT POINTER OF DATA TO TX 0150 9630 0D4B TXLINK * VAR +&13 ;TRANSMIT SUBROUTINE LINKAGE 0151 9630 00A3 TXPAGE * PAGEZ +&03 ;NUMBER OF PAGES TO TX 0152 9630 00A2 TXYOFF * PAGEZ +&02 ;Y INDEX OF DATA TO TX 0153 9630 0D4F TXCNT * VAR +&17 ;COUNT FOR TX SCOUT PACKET 0154 9630 0D50 ENTXCT * VAR +&18 ;END COUNT OF TX PACKET 0155 9630 0D53 XTRADR * VAR +&1B ;USED FOR IM OP XTRA ADDR STORE 4 BYTES 0156 9630 0D20 TXBUFl * &0D20 ;SCOUT TRANSMIT BUFFER 0157 9630 0D20 TXDELO * TXBUFl +&00 0158 9630 0D21 TXDEHI * TXBUFl +&01 0159 9630 0D22 TXSRLO * TXBUFl +&02 0160 9630 0D23 TXSRHI * TXBUFl +&03 0161 9630 0D24 TXCNTL * TXBUFl +&04 0162 9630 0D25 TXPORT * TXBUFl +&05 0163 9630 0D26 TXADRT * TXBUFl +&06 0164 9630 0D2A TXADRF * TXBUFl +&0A 0165 9630 0166 9630 0167 9630 ;RECEIVER STATION NETWORK VARIABLE LOCATIONS 0168 9630 00A6 RXCBPT * PAGEZ +&06 ;RX CNTRL BLOCK POINTER. POINTS TO ARRAY OF CNTRL BLOCKS 0169 9630 00A4 RXDAPT * PAGEZ +&04 ;16 BIT POINTER OF DATA TO RX 0170 9630 0D3D SCOUTB * VAR +&05 ;SCOUT BUFFER LOCATION 0171 9630 0D3D SBSRLO * SCOUTB +SRLO 0172 9630 0D3E SBSRHI * SCOUTB +SRHI 0173 9630 0D3F SBCNTL * SCOUTB +CNTL ;ZERO FOR IMMEDIATE OPERATIONS 0174 9630 0D40 SBPORT * SCOUTB +PORTn 0175 9630 0D41 SBADT1 * SCOUTB +ADTO1 0176 9630 0D42 SBADT2 * SCOUTB +ADTO2 0177 9630 0D43 SBADT3 * SCOUTB +ADTO3 0178 9630 0D44 SBADT4 * SCOUTB +ADTO4 0179 9630 0D45 SBADF1 * SCOUTB +ADFR1 0180 9630 0D46 SBADF2 * SCOUTB +ADFR2 0181 9630 0D47 SBADF3 * SCOUTB +ADFR3 0182 9630 0D48 SBADF4 * SCOUTB +ADFR4 0183 9630 00A3 RXPAGE * PAGEZ +&03 ;NUMBER OF PAGES TO RX 0184 9630 00A2 RXYOFF * PAGEZ +&02 ;Y INDEX OF DATA TO RX 0185 9630 0D4A NSTATE * VAR +&12 ;NETWORK STATUS BITS INDICATE STATE 0186 9630 0D51 STORE * VAR +&19 ;IRQ STORE OF SHIFT REG BITS 0187 9630 0D57 IRQSTR * VAR +&1F ;IRQ STORE FOR VARIABLES COS ITS SLOW. 5 BYTES 0188 9630 0D5C TDIR * VAR +&24 ;TUBE DIRECTION 0189 9630 0D5D LSTBYT * VAR +&25 ;VALUE OF THE LAST BYTE FOR TUBE 0190 9630 0D66 ACTIVE * &D66 ;INDICATES IF NMI CODE IS ACTIVE 0191 9630 0192 9630 [ 1=0 0205 9630 ] 0206 9630 LNK LOWL01 0001 9630 TTL Net initialization and sideways routines. File > LOWL01 0002 9630 OPT SWRTNS Acorn macro assembler Page 4 Net initialization and sideways routines. File > LOWL01 0003 9630 0004 9630 4C 6E 9B JMP LOTRAN 0005 9633 4C 7A 96 JMP LOCNMI 0006 9636 4C 57 9F JMP LOQNMI 0007 9639 4C 98 96 JMP LORNMI 0008 963C ;JMP LOWINT 0009 963C 0010 963C ;RECEIVE IRQ 0011 963C LOWINT 0012 963C IRQ 0013 963C A9 04 LDAIM FOUR 0014 963E 2C 4D FE BIT VIA +&D ;TEST FOR IRQ FLAGED,IFR REG 0015 9641 D0 03 BNE ISVIA 0016 9643 A9 05 LDAIM &05 ;REASON CODE IS 5 0017 9645 60 RTS ;RETURN IF NOT REQUIRED INT 0018 9646 ISVIA 0019 9646 8A TXA 0020 9647 48 PHA 0021 9648 98 TYA 0022 9649 48 PHA 0023 964A AD 4B FE LDA VIA +&B ;ACR REG 0024 964D 29 E3 ANDIM &E3 0025 964F 0D 51 0D ORA STORE 0026 9652 8D 4B FE STA VIA +&B ;RESTORE BITS 2,3,4,ACR REG 0027 9655 AD 4A FE LDA VIA +&A ;CLEAR INT,SR REG 0028 9658 A9 04 LDAIM &04 0029 965A 8D 4D FE STA VIA +&D ;CLEAR INT,SR REG 0030 965D 8D 4E FE STA VIA +&E ;DISABLE IRQ,IER REG 0031 9660 0032 9660 AC 57 0D LDY IRQSTR 0033 9663 C0 86 CPYIM ISTOP 0034 9665 B0 0B BCS NOMASK 0035 9667 AD 63 0D LDA IMASK 0036 966A 8D 65 0D STA MASKST ;STORE MASK VALUE 0037 966D 09 1C ORAIM &1C ;KNOCK OUT PROTECTION BITS 0038 966F 8D 63 0D STA IMASK 0039 9672 NOMASK 0040 9672 ; LDAAY JMPI2H -IRTN ;NIFTY CASE INSTUCTION 0041 9672 A9 9B LDAIM JMPI2H 0042 9674 48 PHA 0043 9675 B9 9D 9A LDAAY JMPI2L -IRTN 0044 9678 48 PHA 0045 9679 60 RTS 0046 967A 0047 967A ; 0048 967A ; ****** NEVER fall through here ************ 0049 967A ; 0050 967A 0051 967A 0052 967A ;CLAIM NMI FIRST TIME ROUND 0053 967A BOOK 0054 967A LOCNMI 0055 967A 2C 18 FE BIT INTOFF ;DISABLES NMI 0056 967D 20 3D 9F JSR CPINIT ;INITIALISE ADLC CHIP 0057 9680 A9 EA LDAIM &EA ;OSBYTE TUBE TEST 0058 9682 A2 00 LDXIM ZERO 0059 9684 8E 66 0D STX ACTIVE ;MAKE MYSELF INACTIVE 0060 9687 A0 FF LDYIM &FF 0061 9689 20 F4 FF JSR OSBYTE ;TEST FOR TUBE 0062 968C 8E 67 0D STX TUBEFL 0063 968F A9 8F LDAIM &8F ;OSBYTE NMI CLAIM 0064 9691 A2 0C LDXIM &0C 0065 9693 A0 FF LDYIM &FF 0066 9695 20 F4 FF JSR OSBYTE ;CLAIM NMI 0067 9698 0068 9698 RCLM ;RECLAIM NMI AND ALL L.L. FUNCTIONS SIDEWAYS CALL 0069 9698 RDCDE 0070 9698 LORNMI 0071 9698 ;READS NMI CODE INTO D00 RAM AREA 0072 9698 A0 20 LDYIM CDELEN ;LOAD NMI CODE LENGTH 0073 969A MORECD 0074 969A B9 7C 9F LDAAY NMICDE - ONE 0075 969D 99 FF 0C STAAY RAMCDE - ONE 0076 96A0 88 DEY 0077 96A1 D0 F7 BNE MORECD 0078 96A3 0079 96A3 ;SSTATE SET UP BY JEZZ.STATION LONG TERM STATE E.G. RXCB EXISTS, STOPPED ETC 0080 96A3 A5 F4 LDA ROMSWR ;READ WHICH ROM WE ARE 0081 96A5 8D 07 0D STA ROMSTR + ONE ;STORE IT IN D00 CODE 0082 96A8 A9 80 LDAIM &80 0083 96AA 8D 62 0D STA TXCLRl ;FLAG CLEAR TO TRANSMIT 0084 96AD 8D 66 0D STA ACTIVE 0085 96B0 AD 18 FE LDA STNID 0086 96B3 8D 22 0D STA TXSRLO ;STORE MY ADDRESS IN TX SCOUT BUFF AREA 0087 96B6 8C 23 0D STY TXSRHI ;ASSUMES Y IS ZERO 0088 96B9 84 98 STY TUBLOK ;TUBE LOCK FLAG 0089 96BB 2C 20 FE BIT INTON ;ENABLES NMI INTERUPTS BY CLEARING NMI FLIP FLOP 0090 96BE 60 RTS 0091 96BF ; "LOQNMI" MOVED TO LOWL04 !!!!!!!!! 0092 96BF 0093 96BF LNK LOWL02 0001 96BF TTL Receive routines. File > LOWL02 0002 96BF OPT RXRTNS Acorn macro assembler Page 5 Receive routines. File > LOWL02 0003 96BF 0004 96BF ;RECEIVE ROUTINES 0005 96BF ;THIS IS THE CODE NEEDED TO RECEIVE AN ECONET MESSAGE 0006 96BF ;A SCOUT MESSAGE IS RECEIVED 0007 96BF ;IF THIS IS CORRECT AN ACKNOWLEDGE IS TRANSMITED 0008 96BF ;A DATA PACKET IS AWAITED 0009 96BF ;THE DATA PACKET IS LOADED INTO MEMORY 0010 96BF ;THE DATA PACKET IS ACKNOWLEDGED. 0011 96BF ; 0012 96BF ; ****** NEVER fall through here ************ 0013 96BF ; 0014 96BF 0015 96BF REC 0016 96BF A9 01 LDAIM AP 0017 96C1 2C A1 FE BIT SReg2 ;CHECK FOR ADDRESS PRESENT 0018 96C4 F0 38 BEQ RXSERR ;AP EXPECTED 0019 96C6 AD A2 FE LDA RXBYTE 0020 96C9 CD 18 FE CMP STNID ;TEST DESTLO FOR STATION MATCH 0021 96CC F0 09 BEQ TESTHI 0022 96CE C9 FF CMPIM BDCAST ;TEST DESTLO FOR BRCAST MATCH 0023 96D0 D0 18 BNE FRDISC 0024 96D2 A9 40 LDAIM BCAST 0025 96D4 8D 4A 0D STA NSTATE ;FLAG BROADCAST MESSAGE 0026 96D7 0027 96D7 TESTHI 0028 96D7 A9 DC LDAIM :LSB: RXDEHI 0029 96D9 [ FAST1 <> TRUE 0032 96D9 | 0033 96D9 4C 11 0D JMP WRXNTF ; New fast code ! 0034 96DC ] 0035 96DC 0036 96DC RXDEHI 0037 96DC 2C A1 FE BIT SReg2 0038 96DF 10 1D BPL RXSERR ;RXDA EXPECTED N.B IN 2BYTE MODE 0039 96E1 AD A2 FE LDA RXBYTE 0040 96E4 F0 0C BEQ FORUS ;NET NUMBER MUST BE ZERO 0041 96E6 49 FF EORIM BDCAST ;TEST DESTHI FOR NETWORK BROADCAST 0042 96E8 F0 0B BEQ FORUSB 0043 96EA 0044 96EA FRDISC ;FRAME DISCONTINUE 0045 96EA A9 A2 LDAIM &A2 ;+TXRS -RXRS +FRDSC -TDSR -RDSR -TIE +RIE CR2 0046 96EC 8D A0 FE STA CReg1 0047 96EF 4C EB 99 JMP NOUPD3 ;WAIT FOR ANOTHER RXINT 0048 96F2 0049 96F2 FORUS ;NOT BROADCAST FOR US 0050 96F2 8D 4A 0D STA NSTATE 0051 96F5 FORUSB ;BROADCAST FOR US 0052 96F5 85 A2 STA RXYOFF 0053 96F7 A9 0E LDAIM :LSB: RXHEAD 0054 96F9 [ FAST2 <> TRUE 0055 96F9 A0 97 LDYIM :MSB: RXHEAD 0056 96FB 4C 0E 0D JMP WRXINT 0057 96FE | 0059 96FE ] 0060 96FE 0061 96FE ;RESET RECEIVER FOR MORE PACKETS 0062 96FE RXSERR 0063 96FE AD A1 FE LDA SReg2 0064 9701 29 81 ANDIM &81 0065 9703 F0 06 BEQ NORST 0066 9705 20 3D 9F JSR CPINIT ;REINIT THE CHIP 0067 9708 4C EB 99 JMP NOUPD3 0068 970B NORST 0069 970B 4C E8 99 JMP NOUPD2 ;RESET CHIP AND WAIT FOR ANOTHER RXINIT 0070 970E 0071 970E ;THIS LOOP BUFFERS THE SCOUT PACKET IN THE SCOUT BUFFER 0072 970E RXHEAD ;RECEIVE PACKET: CNTRL,PORT,2DEST 0073 970E A4 A2 LDY RXYOFF ;LOAD COUNT 0074 9710 AD A1 FE LDA SReg2 0075 9713 RXHED2 0076 9713 10 E9 BPL RXSERR ;RXDA EXPECTED N.B. IN 2 BYTE MODE.SCOUT IS EVEN 0077 9715 AD A2 FE LDA RXBYTE 0078 9718 99 3D 0D STAAY SCOUTB 0079 971B C8 INY 0080 971C AD A1 FE LDA SReg2 0081 971F 30 02 BMI PASS3 ;2BYTES STILL AVAILABLE 0082 9721 D0 15 BNE SBUFEN ;END OF SCOUT PACKET E.G. FV CONDITION 0083 9723 PASS3 0084 9723 AD A2 FE LDA RXBYTE 0085 9726 99 3D 0D STAAY SCOUTB 0086 9729 C8 INY ;INCREMENT COUNT 0087 972A C0 0C CPYIM SBSIZE ;TEST COUNT 0088 972C F0 0A BEQ SBUFEN 0089 972E 84 A2 STY RXYOFF ;STORE COUNT 0090 9730 AD A1 FE LDA SReg2 0091 9733 D0 DE BNE RXHED2 0092 9735 4C 14 0D JMP WRXIN2 ;WE HAVE ALREADY STORED JUMP VECTOR 0093 9738 0094 9738 0095 9738 0096 9738 ;CLAIM LINE WITH FLAGS 0097 9738 SBUFEN 0098 9738 A9 00 LDAIM ZERO ;-TXRST -RXRST -RXDISC -TDSR -RDSR -TIE -RIE SCR2 0099 973A 8D A0 FE STA CReg1 0100 973D A9 84 LDAIM &84 ;+RTS -CTXST -CRXST -TXLAST TDRA FLAG 1-BYT -PSE 0101 973F 8D A1 FE STA CReg2 ;SWITCH TO 1-BYTE MODE PAD WITH FLAGS 0102 9742 0103 9742 ;CHECK FOR OK CRC 0104 9742 A9 02 LDAIM FV 0105 9744 2C A1 FE BIT SReg2 0106 9747 F0 B5 BEQ RXSERR ;BAD CRC 0107 9749 0108 9749 ;CHECK FOR UNREAD DATA BYTE 0109 9749 10 B3 BPL RXSERR ;NOT ONE MORE EXTRA BYTE 0110 974B AD A2 FE LDA RXBYTE 0111 974E 99 3D 0D STAAY SCOUTB ;STORE LAST BYTE OF SCOUT BUFFER 0112 9751 A9 44 LDAIM &44 ;-TXRST +RXRST -RXDISC -TDSR -RDSR +TIE -RIE SCR2 0113 9753 8D A0 FE STA CReg1 0114 9756 0115 9756 ;CHECK FOR IMMEDIATE OPERATION 0116 9756 38 SEC 0117 9757 66 98 ROR TUBLOK ;SET TUBE LOCK FLAG 0118 9759 AD 40 0D LDA SBPORT 0119 975C D0 03 BNE NOIMED 0120 975E 4C 46 9A JMP RXIMED ;PROCESS IMMEDIATE OPERATION 0121 9761 0122 9761 0123 9761 NOIMED 0124 9761 ;SWITCH OFF TX IF BROADCAST 0125 9761 2C 4A 0D BIT NSTATE 0126 9764 50 05 BVC NOBRD Acorn macro assembler Page 6 Receive routines. File > LOWL02 0127 9766 A9 07 LDAIM SEVEN ; -RTS -CTXST -CRXST -TXLAST TDRA FLAG 2-BYT +PSE 0128 9768 8D A1 FE STA CReg2 ;TURN OFF TX 0129 976B NOBRD 0130 976B ;CHECK WHETHER AN RX CONTROL BLOCK EXISTS 0131 976B 2C 64 0D BIT SSTATE 0132 976E 10 3E BPL USERCB ;NO NFS RXCB,TEST FOR USER CONTROL BLOCKS 0133 9770 0134 9770 ;FIND A MATCHING RXCBLOCK 0135 9770 A9 C0 LDAIM :LSB: RXCB 0136 9772 A0 00 LDYIM :MSB: RXCB 0137 9774 FNDLP1 0138 9774 85 A6 STA RXCBPT 0139 9776 84 A7 STY RXCBPT + ONE ;LOAD UP TO POINT TO NFS CONTROL BLOCKS 0140 9778 FINDLP 0141 9778 A0 00 LDYIM ZERO 0142 977A B1 A6 LDAIY RXCBPT 0143 977C F0 2D BEQ RXSCER ;TERMINATOR FOUND IN USER CBLOCKS 0144 977E C9 7F CMPIM RXRDY ;VALID RECEIVE CONTROL BYTE 0145 9780 D0 1C BNE NOMACH 0146 9782 C8 INY ;INCREMENT TO PORT 0147 9783 B1 A6 LDAIY RXCBPT 0148 9785 F0 05 BEQ PMATCH ;WILDCARD ZERO PORT ID 0149 9787 CD 40 0D CMP SBPORT 0150 978A D0 12 BNE NOMACH ;NO PORT MATCH 0151 978C PMATCH 0152 978C C8 INY ;INCR TO STATION LO 0153 978D B1 A6 LDAIY RXCBPT 0154 978F F0 28 BEQ MATCHl ; ****** Bruce 27/2/86 ******* SLOMAT ;WILDCARD ZERO STATION ID 0155 9791 CD 3D 0D CMP SBSRLO 0156 9794 D0 08 BNE NOMACH ;NO STATION LO MATCH 0157 9796 SLOMAT 0158 9796 C8 INY 0159 9797 B1 A6 LDAIY RXCBPT 0160 9799 CD 3E 0D CMP SBSRHI 0161 979C F0 1B BEQ MATCHl ;NO STATION HI MATCH 0162 979E NOMACH ; Get past pointer locations 0163 979E A5 A7 LDA RXCBPT + ONE ; Test to see if USER or NFS 0164 97A0 F0 0C BEQ USERCB ; Was in zero page so it was NFS 0165 97A2 A5 A6 LDA RXCBPT 0166 97A4 18 CLC 0167 97A5 69 0C ADCIM &0C ;POINT TO NEXT RXCB 0168 97A7 85 A6 STA RXCBPT 0169 97A9 90 CD BCC FINDLP ;RXCB SPACE EXHAUSTED AND NO MATCH 0170 97AB 0171 97AB RXSCER ;ERROR IN SCOUT PACKET 0172 97AB 4C 35 98 JMP RXDERR 0173 97AE 0174 97AE USERCB 0175 97AE 2C 64 0D BIT SSTATE ;CHECK BIT 4 0176 97B1 50 F8 BVC RXSCER 0177 97B3 A9 00 LDAIM ZERO 0178 97B5 A4 9F LDY DYNVC2 + ONE ;POINT TO 2ND PAGE DYNAMIC WORKSPACE 0179 97B7 D0 BB BNE FNDLP1 0180 97B9 0181 97B9 MATCHl 0182 97B9 ;CALCULATE DATA POINTERS I.E. TRANSLATION 0183 97B9 ; BIT NSTATE ;CHECK FOR BROADCAST 0184 97B9 ; BVC NOBRDC 0185 97B9 ; JMP BRDUP 0186 97B9 NOBRDC 0187 97B9 0188 97B9 A9 03 LDAIM THREE ;REG A INDICATES DOUBLE BYTE WRITE OPERATION 0189 97BB 8D 5C 0D STA TDIR ;INDICATE A WRITE TO TUBE 0190 97BE 20 CA 9E JSR ADCALC 0191 97C1 ; BCS CLMOKK ;NO TUBE CLAIM ERROR 0192 97C1 90 72 BCC RXDERR ; There was a TUBE claim error ! 0193 97C3 0194 97C3 2C 4A 0D BIT NSTATE ; Check for broadcast RX 0195 97C6 50 03 BVC CLMOKK ; If not then as normal 0196 97C8 4C F2 99 JMP BRDRX ; Recieve a broadcast 0197 97CB 0198 97CB CLMOKK 0199 97CB 0200 97CB ;ACKNOWLEDGE SCOUT PACKET N.B. DONT HAVE TO CLAIM 0201 97CB ACKSCO 0202 97CB A9 44 LDAIM &44 ;-TXRST +RXRST -RXDISC -TDSR -RDSR +TIE -RIE SCR2 0203 97CD 8D A0 FE STA CReg1 0204 97D0 A9 A7 LDAIM &A7 ;+RTS -CTXST +CRXST -TLAST TDRA FLAG 2-BYT +PSE 0205 97D2 8D A1 FE STA CReg2 0206 97D5 A9 DC LDAIM :LSB: NOACK 0207 97D7 A0 97 LDYIM :MSB: NOACK 0208 97D9 4C 07 99 JMP TXACK 0209 97DC 0210 97DC NOACK 0211 97DC A9 82 LDAIM &82 ;+TXRST -RXRST -RXDISC -TDSR -RDSR -RDSR -TIE +RIE SCR2 0212 97DE 8D A0 FE STA CReg1 0213 97E1 0214 97E1 A9 E6 LDAIM :LSB: RXDAST 0215 97E3 [ FAST3 <> TRUE 0218 97E3 | 0219 97E3 4C 11 0D JMP WRXNTF ; New fast code ! 0220 97E6 ] 0221 97E6 0222 97E6 ;RECEIVE DATA PACKET 0223 97E6 RXDAST 0224 97E6 A9 01 LDAIM AP 0225 97E8 2C A1 FE BIT SReg2 ;CHECK FOR ADDRESS PRESENT 0226 97EB F0 48 BEQ RXDERR ;ADDR PRESENT EXPECTED 0227 97ED AD A2 FE LDA RXBYTE 0228 97F0 CD 18 FE CMP STNID ;TEST DESTLO FOR STATION MATCH 0229 97F3 D0 40 BNE RXDERR ;DATA PACKET NOT FOR US. DISC PACKET 0230 97F5 ;TSTHI 0231 97F5 A9 FA LDAIM :LSB: WSOUR 0232 97F7 [ FAST4 <> TRUE 0235 97F7 | 0236 97F7 4C 11 0D JMP WRXNTF ; New fast code ! 0237 97FA ] 0238 97FA 0239 97FA WSOUR 0240 97FA 2C A1 FE BIT SReg2 0241 97FD 10 36 BPL RXDERR ;RXDA EXPECTED N.B IN 2BYTE MODE 0242 97FF AD A2 FE LDA RXBYTE ;NET NUMBER MUST BE ZERO 0243 9802 D0 31 BNE RXDERR ;DATA PACKET NOT FOR US 0244 9804 A9 10 LDAIM :LSB: WDEST 0245 9806 A0 98 LDYIM :MSB: WDEST 0246 9808 2C A0 FE BIT SReg1 ;QUICK IRQ POLL 0247 980B 30 03 BMI WDEST 0248 980D 4C 0E 0D JMP WRXINT 0249 9810 0250 9810 WDEST 0251 9810 2C A1 FE BIT SReg2 Acorn macro assembler Page 7 Receive routines. File > LOWL02 0252 9813 10 20 BPL RXDERR ;RXDA EXPECTED 0253 9815 AD A2 FE LDA RXBYTE ;READ 2 DEST BYTES 0254 9818 AD A2 FE LDA RXBYTE ;CHECK AGAINST SCOUT BUFF IF SECURITY NEEDED 0255 981B RXINF 0256 981B A9 02 LDAIM TUBEf 0257 981D 2C 4A 0D BIT NSTATE 0258 9820 D0 0C BNE ISTUBE 0259 9822 A9 43 LDAIM :LSB: AGAIN 0260 9824 A0 98 LDYIM :MSB: AGAIN 0261 9826 2C A0 FE BIT SReg1 ;QUICK IRQ POLL 0262 9829 30 18 BMI AGAIN 0263 982B 4C 0E 0D JMP WRXINT 0264 982E ISTUBE 0265 982E A9 A0 LDAIM :LSB: AGAIN2 0266 9830 A0 98 LDYIM :MSB: AGAIN2 0267 9832 4C 0E 0D JMP WRXINT 0268 9835 0269 9835 ;RECEIVE DATA PACKET ERROR 0270 9835 RXDERR 0271 9835 ;RESET RECEIVER FOR MORE PACKETS 0272 9835 AD 4A 0D LDA NSTATE 0273 9838 10 03 BPL NLACK ;BRANCH IF NO LONG ACK 0274 983A 4C AC 9E JMP TXBER1 ;REPORT TRANSMIT ERROR 0275 983D NLACK 0276 983D 20 3D 9F JSR CPINIT ;FLUSH OUT ANY REMAINING BYTES 0277 9840 4C DB 99 JMP NOUPDA 0278 9843 0279 9843 AGAIN 0280 9843 A4 A2 LDY RXYOFF ;LOAD COUNT 0281 9845 AD A1 FE LDA SReg2 0282 9848 AGAIN4 0283 9848 10 2D BPL RXEND ;RDA EXPECTED N.B IN 2-BYTE MODE 0284 984A AD A2 FE LDA RXBYTE 0285 984D 91 A4 STAIY RXDAPT 0286 984F C8 INY 0287 9850 D0 06 BNE PASS 0288 9852 E6 A5 INC RXDAPT + ONE 0289 9854 C6 A3 DEC RXPAGE 0290 9856 F0 DD BEQ RXDERR ;ERROR BUFFER FULL BUT ONE MORE BYTE 0291 9858 PASS 0292 9858 AD A1 FE LDA SReg2 0293 985B 30 02 BMI PASS8 0294 985D D0 18 BNE RXEND 0295 985F PASS8 0296 985F AD A2 FE LDA RXBYTE 0297 9862 91 A4 STAIY RXDAPT 0298 9864 C8 INY 0299 9865 84 A2 STY RXYOFF 0300 9867 D0 06 BNE OUTK 0301 9869 0302 9869 UPCONT 0303 9869 E6 A5 INC RXDAPT + ONE 0304 986B C6 A3 DEC RXPAGE 0305 986D F0 08 BEQ RXEND ;IS THIS AN ERROR? 0306 986F OUTK 0307 986F AD A1 FE LDA SReg2 ;QUICK IRQ POLL 0308 9872 D0 D4 BNE AGAIN4 0309 9874 4C 14 0D JMP WRXIN2 0310 9877 0311 9877 0312 9877 ;CHECK UNREAD DATA BYTE,CRC ETC. 0313 9877 RXEND 0314 9877 A9 84 LDAIM &84 ;+RTS -CTXST -CRXST -TLAST TDRA FLAG 1BYTE -PSE 0315 9879 8D A1 FE STA CReg2 ;SWITCH TO 1-BYTE FOR LATER 1 BYTE TEST 0316 987C A9 00 LDAIM ZERO ;-TXRS -RXRS -FDISC -TDSR -RDSR -TIE -RIE SCR2 0317 987E 8D A0 FE STA CReg1 0318 9881 84 A2 STY RXYOFF 0319 9883 A9 02 LDAIM FV ;CHECK CRC 0320 9885 2C A1 FE BIT SReg2 0321 9888 F0 AB BEQ RXDERR ;PACKET CRC BAD 0322 988A 0323 988A 10 11 BPL NOBYT ;CHECK UNREAD BYTE 0324 988C A5 A3 LDA RXPAGE 0325 988E F0 A5 BCXXX1 BEQ RXDERR ;FRAME TOO LONG, NOW BEING BRANCHED THROUGH 0326 9890 AD A2 FE LDA RXBYTE ;READ EXTRA BYTE 0327 9893 A4 A2 LDY RXYOFF 0328 9895 91 A4 STAIY RXDAPT 0329 9897 E6 A2 INC RXYOFF ;UPDATE POINTERS 0330 9899 D0 02 BNE NOBYT 0331 989B E6 A5 INC RXDAPT + ONE 0332 989D NOBYT 0333 989D 4C EE 98 JMP NOBYT2 0334 98A0 0335 98A0 0336 98A0 0337 98A0 AGAIN2 0338 98A0 AD A1 FE LDA SReg2 0339 98A3 AGAIN3 0340 98A3 10 1E BPL RXEND2 ;RXDA EXPECTED 0341 98A5 AD A2 FE LDA RXBYTE 0342 98A8 20 37 9A JSR INCRXP 0343 98AB F0 E1 BEQ BCXXX1 ; RXDER2, RXDERR is the real destination 0344 98AD 8D E5 FE STA R3DATA 0345 98B0 0346 98B0 CONTIN 0347 98B0 AD A2 FE LDA RXBYTE 0348 98B3 8D E5 FE STA R3DATA 0349 98B6 20 37 9A JSR INCRXP 0350 98B9 F0 08 BEQ RXEND2 0351 98BB OUTT 0352 98BB AD A1 FE LDA SReg2 ;QUICK IRQ POLL TO SAVE STACK WORK 0353 98BE D0 E3 BNE AGAIN3 0354 98C0 4C 14 0D JMP WRXIN2 0355 98C3 0356 98C3 ;RXDER2 0357 98C3 ; JMP RXDERR 0358 98C3 0359 98C3 RXEND2 0360 98C3 ;CHECK UNREAD DATA BYTE,CRC ETC. 0361 98C3 A9 00 LDAIM ZERO ;-TXRS -RXRS -FDISC -TDSR -RDSR -TIE -RIE SCR2 0362 98C5 8D A0 FE STA CReg1 0363 98C8 A9 84 LDAIM &84 ;+RTS -CTXST -CRXST -TLAST TDRA FLAG 1BYTE -PSE 0364 98CA 8D A1 FE STA CReg2 ;SWITCH TO 1-BYTE FOR LATER 1 BYTE TEST 0365 98CD A9 02 LDAIM FV ;CHECK CRC 0366 98CF 2C A1 FE BIT SReg2 0367 98D2 F0 BA BEQ BCXXX1 ; RXDER2 ;PACKET CRC BAD, RXDERR is destination 0368 98D4 0369 98D4 10 18 BPL NOBYT2 ;CHECK UNREAD BYTE 0370 98D6 A5 A2 LDA RXYOFF ;CHECK IF FRAME TOO LONG 0371 98D8 05 A3 ORA RXPAGE 0372 98DA 05 A4 ORA RXDAPT Acorn macro assembler Page 8 Receive routines. File > LOWL02 0373 98DC 05 A5 ORA RXDAPT + ONE 0374 98DE F0 AE BEQ BCXXX1 ; RXDER2 ;TUBE FRAME TOO LONG, RXDERR is destination 0375 98E0 AD A2 FE LDA RXBYTE ;N.B. CHECK COUNTERS!!!!! 0376 98E3 8D 5D 0D STA LSTBYT 0377 98E6 A9 20 LDAIM ONEBYT 0378 98E8 0D 4A 0D ORA NSTATE 0379 98EB 8D 4A 0D STA NSTATE 0380 98EE 0381 98EE NOBYT2 ;UPDATE RXDAPT TO POINT TO DATA END 0382 98EE NOPAGE 0383 98EE AD 4A 0D LDA NSTATE ;CHECK FOR LONG ACK PACKET 0384 98F1 10 06 BPL TXAK 0385 98F3 20 4E 99 JSR LASTBY ;PUT LAST BYTE UP TUBE IF ANY 0386 98F6 4C A8 9E JMP UPTXCB ;UPDATE TXCBLOCK 0387 98F9 0388 98F9 TXAK 0389 98F9 ;ACKNOWLEDGE DATA PACKET 0390 98F9 A9 44 LDAIM &44 ;-TXRST +RXRST -RXDISC -TDSR -RDSR -RDSR +TIE -RIE SCR2 0391 98FB 8D A0 FE STA CReg1 0392 98FE A9 A7 LDAIM &A7 ;+RTS -CTXST +CRXST -TLAST TDRA MARK 2-BYT +PSE 0393 9900 8D A1 FE STA CReg2 0394 9903 A9 95 LDAIM :LSB: UPDATE 0395 9905 A0 99 LDYIM :MSB: UPDATE 0396 9907 0397 9907 ;TRANSMIT AN ACKNOWLEDGEMENT PACKET 0398 9907 TXACK 0399 9907 8D 4B 0D STA TXLINK 0400 990A 8C 4C 0D STY TXLINK + ONE ;SAVE SUBROUTINE LINKAGE 0401 990D ;TX 2BYTES DESTINATION 0402 990D AD 3D 0D LDA SBSRLO 0403 9910 2C A0 FE BIT SReg1 0404 9913 50 36 BVC RXAERR ;TDRA EXPECTED N.B. IN 2 BYTE MODE 0405 9915 8D A2 FE STA TXBYTE ;TRANSMIT SOURCE LO 0406 9918 AD 3E 0D LDA SBSRHI 0407 991B 8D A2 FE STA TXBYTE ;TRANSMIT SOURCE HI 0408 991E A9 25 LDAIM :LSB: TXACKS 0409 9920 A0 99 LDYIM :MSB: TXACKS 0410 9922 4C 0E 0D JMP WTXINT ;WAIT FOR TX INTERUPT 0411 9925 0412 9925 TXACKS ;TX 2BYTES SOURCE 0413 9925 AD 18 FE LDA STNID 0414 9928 2C A0 FE BIT SReg1 0415 992B 50 1E BVC RXAERR ;TDRA EXPECTED N.B. IN 2-BYTE MODE 0416 992D 8D A2 FE STA TXBYTE 0417 9930 A9 00 LDAIM NETnum 0418 9932 8D A2 FE STA TXBYTE 0419 9935 AD 4A 0D LDA NSTATE 0420 9938 30 0E BMI NOEND 0421 993A ;END PACKET TRANSMISSION 0422 993A A9 3F LDAIM &3F ;-RTS -CTXST +CRXST +TXLST FC FLAG 2-BYT +PSE 0423 993C 8D A1 FE STA CReg2 0424 993F AD 4B 0D LDA TXLINK 0425 9942 AC 4C 0D LDY TXLINK + ONE 0426 9945 4C 0E 0D JMP WTXINT ;WAIT FOR TX INTERUPT FC EVENT AND RETURN TO CALLER 0427 9948 NOEND 0428 9948 4C B3 9D JMP TXINF ;FOR LONG ACK 0429 994B 0430 994B ;ERROR IN TRANSMITTING AN ACK PACKET 0431 994B RXAERR 0432 994B ;RESET RECEIVER FOR MORE PACKETS 0433 994B 4C 35 98 JMP RXDERR 0434 994E 0435 994E LASTBY 0436 994E A9 02 LDAIM TUBEf ;IF TUBE TERMINATE CHANNEL 0437 9950 2C 4A 0D BIT NSTATE 0438 9953 F0 3F BEQ TOUT2 ;EXIT AND FLAG T.UPDATE NOT DONE 0439 9955 ; .N.B. DO 32 BIT UPDATE 0440 9955 18 CLC 0441 9956 08 PHP 0442 9957 A0 08 LDYIM CBEALO 0443 9959 LOOPIN 0444 9959 B1 A6 LDAIY RXCBPT 0445 995B 28 PLP 0446 995C 79 9A 00 ADCAY RXYOFF -CBEALO 0447 995F 91 A6 STAIY RXCBPT 0448 9961 C8 INY 0449 9962 08 PHP 0450 9963 C0 0C CPYIM XTRA1L 0451 9965 90 F2 BCC LOOPIN 0452 9967 28 PLP 0453 9968 0454 9968 A9 20 LDAIM ONEBYT 0455 996A 2C 4A 0D BIT NSTATE 0456 996D F0 23 BEQ TOUT1 0457 996F 0458 996F 8A TXA 0459 9970 48 PHA 0460 9971 A9 08 LDAIM CBEALO 0461 9973 18 CLC 0462 9974 65 A6 ADC RXCBPT 0463 9976 AA TAX 0464 9977 A4 A7 LDY RXCBPT + ONE 0465 9979 A9 01 LDAIM ONE ; ONE BYTE WRITE 0466 997B 20 06 04 JSR tADDRl 0467 997E AD 5D 0D LDA LSTBYT 0468 9981 8D E5 FE STA R3DATA 0469 9984 38 SEC 0470 9985 A0 08 LDYIM CBEALO 0471 9987 TINC4 0472 9987 A9 00 LDAIM ZERO 0473 9989 71 A6 ADCIY RXCBPT 0474 998B 91 A6 STAIY RXCBPT 0475 998D C8 INY 0476 998E B0 F7 BCS TINC4 0477 9990 0478 9990 0479 9990 68 PLA 0480 9991 AA TAX 0481 9992 TOUT1 0482 9992 A9 FF LDAIM &FF 0483 9994 TOUT2 0484 9994 60 RTS 0485 9995 0486 9995 0487 9995 0488 9995 ;UPDATE RECEIVE CONTROL BLOCK 0489 9995 UPDATE 0490 9995 AD 40 0D LDA SBPORT 0491 9998 D0 0A BNE NOTIMM ;DONT UPDATE RXCB IF IMMED OPERATION 0492 999A AC 3F 0D LDY SBCNTL 0493 999D C0 82 CPYIM IPOKE Acorn macro assembler Page 9 Receive routines. File > LOWL02 0494 999F F0 03 BEQ NOTIMM 0495 99A1 4C E7 9A JMP ENDIM 0496 99A4 0497 99A4 NOTIMM 0498 99A4 20 4E 99 JSR LASTBY ;LAST BYTE TUBE WRITE 0499 99A7 D0 12 BNE CBUUPD ;BRANCH IF UPDATE DONE ALREADY 0500 99A9 NOTTUB 0501 99A9 A5 A2 LDA RXYOFF 0502 99AB 18 CLC ;CALC BUFFER END 0503 99AC 65 A4 ADC RXDAPT 0504 99AE 90 02 BCC NOPGE 0505 99B0 E6 A5 INC RXDAPT + ONE 0506 99B2 0507 99B2 NOPGE 0508 99B2 A0 08 LDYIM CBEALO 0509 99B4 91 A6 STAIY RXCBPT ;UPDATE BUFFER END LO 0510 99B6 C8 INY 0511 99B7 A5 A5 LDA RXDAPT + ONE ;UPDATE BUFFER END HI 0512 99B9 91 A6 STAIY RXCBPT 0513 99BB 0514 99BB CBUUPD 0515 99BB AD 40 0D LDA SBPORT 0516 99BE F0 1B BEQ NOUPDA ;IM PEEK OPERATION CHECK 0517 99C0 AD 3E 0D LDA SBSRHI ;UPDATE SOURCE HI 0518 99C3 A0 03 LDYIM CBSRHI 0519 99C5 91 A6 STAIY RXCBPT 0520 99C7 88 DEY 0521 99C8 0522 99C8 AD 3D 0D LDA SBSRLO ;UPDATE SOURCE LO 0523 99CB 91 A6 STAIY RXCBPT 0524 99CD 88 DEY 0525 99CE 0526 99CE AD 40 0D LDA SBPORT ;UPDATE PORT 0527 99D1 91 A6 STAIY RXCBPT 0528 99D3 88 DEY 0529 99D4 0530 99D4 AD 3F 0D LDA SBCNTL ;UPDATE CONTROL BYTE 0531 99D7 09 80 ORAIM &80 ;SET TOP BIT 0532 99D9 91 A6 STAIY RXCBPT 0533 99DB 0534 99DB 0535 99DB NOUPDA 0536 99DB A9 02 LDAIM TUBEf ;TEST IF WE HAVE BEEN TUBING 0537 99DD 2D 67 0D AND TUBEFL ;MAKE FUCKING SURE THERE IS A TUBE 0538 99E0 2C 4A 0D BIT NSTATE 0539 99E3 F0 03 BEQ NOUPD2 0540 99E5 20 2B 9A JSR TUBREL 0541 99E8 NOUPD2 0542 99E8 20 4C 9F JSR CPRST 0543 99EB NOUPD3 0544 99EB A9 BF LDAIM :LSB: REC 0545 99ED A0 96 LDYIM :MSB: REC 0546 99EF 4C 0E 0D JMP WRXINT 0547 99F2 0548 99F2 ;BRDUP ; The original broadcast RX 0549 99F2 ; LDYIM CBSALO 0550 99F2 ;BRDLP 0551 99F2 ; LDAAY SCOUTB 0552 99F2 ; STAIY RXCBPT 0553 99F2 ; INY 0554 99F2 ; CPYIM &0C ;COMPARE TO END OF CONTROL BLOCK 0555 99F2 ; BNE BRDLP 0556 99F2 ; JMP CBUUPD 0557 99F2 0558 99F2 BRDRX ; The new broadcast reception 0559 99F2 8A TXA 0560 99F3 48 PHA 0561 99F4 A2 04 LDXIM CBSALO 0562 99F6 A9 02 LDAIM TUBEf ; Also set Z flag on Tube state 0563 99F8 2C 4A 0D BIT NSTATE ; Do the check 0564 99FB D0 1C BNE TUBRDC 0565 99FD IOBRDC 0566 99FD A4 A2 LDY RXYOFF 0567 99FF 0568 99FF IOBRC1 0569 99FF BD 3D 0D LDAAX SCOUTB 0570 9A02 91 A4 STAIY RXDAPT 0571 9A04 C8 INY 0572 9A05 D0 06 BNE IOBRC2 0573 9A07 E6 A5 INC RXDAPT + ONE 0574 9A09 C6 A3 DEC RXPAGE 0575 9A0B F0 61 BEQ BRCER1 ; Remember to pull X first 0576 9A0D IOBRC2 0577 9A0D E8 INX 0578 9A0E 84 A2 STY RXYOFF 0579 9A10 E0 0C CPXIM CBSALO + EIGHT 0580 9A12 D0 EB BNE IOBRC1 0581 9A14 BRDCT1 0582 9A14 68 PLA 0583 9A15 AA TAX 0584 9A16 4C A4 99 JMP NOTIMM 0585 9A19 0586 9A19 TUBRDC 0587 9A19 BD 3D 0D LDAAX SCOUTB 0588 9A1C 8D E5 FE STA R3DATA 0589 9A1F 20 37 9A JSR INCRXP 0590 9A22 F0 4C BEQ BRCERR 0591 9A24 TUBRC2 0592 9A24 E8 INX 0593 9A25 E0 0C CPXIM CBSALO + EIGHT 0594 9A27 D0 F0 BNE TUBRDC 0595 9A29 F0 E9 BEQ BRDCT1 0596 9A2B 0597 9A2B TUBREL 0598 9A2B 24 98 BIT TUBLOK 0599 9A2D 30 05 BMI NOREL 0600 9A2F A9 82 LDAIM &82 ;RELEASE TUBE 0601 9A31 20 06 04 JSR tADDRl 0602 9A34 NOREL 0603 9A34 46 98 LSR TUBLOK 0604 9A36 60 RTS 0605 9A37 0606 9A37 INCRXP 0607 9A37 E6 A2 INC RXYOFF ; Increment the 4 byte pointer 0608 9A39 D0 0A BNE INCRXX 0609 9A3B E6 A3 INC RXPAGE 0610 9A3D D0 06 BNE INCRXX 0611 9A3F E6 A4 INC RXDAPT 0612 9A41 D0 02 BNE INCRXX 0613 9A43 E6 A5 INC RXDAPT + ONE 0614 9A45 INCRXX Acorn macro assembler Page 10 Receive routines. File > LOWL02 0615 9A45 60 RTS 0616 9A46 0617 9A46 0618 9A46 ;PROCESS IMMEDIATE OPERATION 0619 9A46 RXIMED 0620 9A46 AC 3F 0D LDY SBCNTL 0621 9A49 C0 81 CPYIM IPEEK 0622 9A4B 90 29 BCC IMERR 0623 9A4D C0 89 CPYIM IMACH + ONE 0624 9A4F B0 25 BCS IMERR ;RANGE CHECK 0625 9A51 C0 87 CPYIM ISTRT 0626 9A53 B0 0E BCS PRIVST ;NO PROTECTION FOR LAST TWO IM OPS 0627 9A55 0628 9A55 98 TYA 0629 9A56 38 SEC 0630 9A57 E9 81 SBCIM IPEEK 0631 9A59 A8 TAY 0632 9A5A AD 63 0D LDA IMASK 0633 9A5D FINDIM 0634 9A5D 6A RORA 0635 9A5E 88 DEY 0636 9A5F 10 FC BPL FINDIM 0637 9A61 B0 85 BCS NOUPD2 ;PROTECTED FROM IM OPERATION 0638 9A63 0639 9A63 PRIVST 0640 9A63 AC 3F 0D LDY SBCNTL 0641 9A66 ;LDAAY JMPIMH -IPEEK ;NIFTY CASE INSTUCTION 0642 9A66 A9 9A LDAIM JMPIMH 0643 9A68 48 PHA 0644 9A69 B9 F8 99 LDAAY JMPIML -IPEEK 0645 9A6C 48 PHA 0646 9A6D 60 RTS 0647 9A6E 0648 9A6E BRCER1 0649 9A6E E6 A2 INC RXYOFF 0650 9A70 BRCERR ; The error in broadcast 0651 9A70 E0 0B CPXIM CBSALO + SEVEN 0652 9A72 F0 A0 BEQ BRDCT1 0653 9A74 68 PLA 0654 9A75 AA TAX 0655 9A76 0656 9A76 IMERR 0657 9A76 4C 35 98 JMP RXDERR 0658 9A79 0659 9A79 JMPIML ;IMMED OP JUMP TABLE 0660 9A79 BB = RXPEEK - ONE 0661 9A7A 9E = RXPOKE - ONE 0662 9A7B 80 = RXRTN - ONE 0663 9A7C 80 = RXPROE - ONE 0664 9A7D 80 = RXPROH - ONE 0665 9A7E D5 = RXSTOP - ONE 0666 9A7F D5 = RXSTRT - ONE 0667 9A80 A9 = RXMACH - ONE 0668 9A81 0669 9A81 RXRTN 0670 9A81 RXPROE 0671 9A81 RXPROH 0672 9A81 A9 00 LDAIM ZERO 0673 9A83 85 A4 STA RXDAPT 0674 9A85 A9 82 LDAIM PROBUF 0675 9A87 85 A2 STA RXYOFF 0676 9A89 A9 01 LDAIM ONE 0677 9A8B 85 A3 STA RXPAGE 0678 9A8D A5 9D LDA DYNVC1 + ONE ;POINT TO DYNAMIC WORKSPACE 0679 9A8F 85 A5 STA RXDAPT + ONE 0680 9A91 A0 03 LDYIM THREE ;LOAD COUNTER 0681 9A93 MORSTR 0682 9A93 B9 41 0D LDAAY SBADT1 0683 9A96 99 58 0D STAAY IRQSTR + ONE 0684 9A99 88 DEY 0685 9A9A 10 F7 BPL MORSTR ;SAVE SCOUT BUFF VARIABLES COS IRQ IS VERY VERY SLOW 0686 9A9C 4C CB 97 JMP ACKSCO 0687 9A9F 0688 9A9F RXPOKE 0689 9A9F A9 3D LDAIM :LSB: SCOUTB 0690 9AA1 85 A6 STA RXCBPT 0691 9AA3 A9 0D LDAIM :MSB: SCOUTB ;MAKE RXCBPT POINT TO SCOUT BUFFER 0692 9AA5 85 A7 STA RXCBPT + ONE 0693 9AA7 4C B9 97 JMP NOBRDC 0694 9AAA RXMACH 0695 9AAA A9 01 LDAIM ONE ;ONE PAGE 0696 9AAC 85 A3 STA RXPAGE 0697 9AAE A9 FC LDAIM &100 - MSIZE ;POINT TO MACHINE PEEK AREA 0698 9AB0 85 A2 STA RXYOFF 0699 9AB2 A9 25 LDAIM :LSB: (MCPEEK + MSIZE - &100) 0700 9AB4 85 A4 STA RXDAPT 0701 9AB6 A9 7F LDAIM :MSB: (MCPEEK + MSIZE - &100) 0702 9AB8 85 A5 STA RXDAPT + ONE 0703 9ABA [ ZERO = :MSB: (MCPEEK + MSIZE - &100) 0705 9ABA | 0706 9ABA D0 12 BNE SENDIT 0707 9ABC ] 0708 9ABC 0709 9ABC 0710 9ABC RXPEEK 0711 9ABC ;CALCULATE RXDAPT RXYOFF RXPAGE 0712 9ABC A9 3D LDAIM :LSB: SCOUTB ;MAKE RXCBPT POINT TO SCOUT BUFFER 0713 9ABE 85 A6 STA RXCBPT 0714 9AC0 A9 0D LDAIM :MSB: SCOUTB 0715 9AC2 85 A7 STA RXCBPT + ONE 0716 9AC4 A9 02 LDAIM TWO ;DOUBLE BYTE WRITE 0717 9AC6 8D 5C 0D STA TDIR 0718 9AC9 20 CA 9E JSR ADCALC 0719 9ACC 90 4F BCC EXITIM ;TUBE CLAIM FAILED 0720 9ACE SENDIT 0721 9ACE AD 4A 0D LDA NSTATE ;SET LONG ACK FLAG 0722 9AD1 09 80 ORAIM &80 0723 9AD3 8D 4A 0D STA NSTATE ;NOTE AFTER TXACK THE JUMP BACK IS DIRECT 0724 9AD6 0725 9AD6 RXSTOP 0726 9AD6 RXSTRT 0727 9AD6 A9 44 LDAIM &44 ;-TXRST +RXRST -FDISC -TDSR -RDSR +TIE -RIE SCR2 0728 9AD8 8D A0 FE STA CReg1 0729 9ADB A9 A7 LDAIM &A7 ;+RTS -CTXST +CRXST -TXLD TDRA FLAG 2BYT +PSE 0730 9ADD 8D A1 FE STA CReg2 ;ENABLE TRANSMIT 0731 9AE0 A9 FD LDAIM :LSB: CIRQ 0732 9AE2 A0 9A LDYIM :MSB: CIRQ 0733 9AE4 4C 07 99 JMP TXACK 0734 9AE7 0735 9AE7 ENDIM 0736 9AE7 ;RESTORE RXDAPT TO POINT TO PROCEDURE BUFFER Acorn macro assembler Page 11 Receive routines. File > LOWL02 0737 9AE7 0738 9AE7 A5 A2 LDA RXYOFF ;CALC PARAMETER SIZE 0739 9AE9 18 CLC 0740 9AEA 69 80 ADCIM &100 -PROBUF +&02 ;TWO ALLOWS FOR STATION NUMBER 0741 9AEC A0 7F LDYIM BUFCNT 0742 9AEE 91 9C STAIY DYNVC1 ;UPDATE BUFFER COUNT 0743 9AF0 0744 9AF0 A0 80 LDYIM STNNO 0745 9AF2 AD 3D 0D LDA SBSRLO 0746 9AF5 91 9C STAIY DYNVC1 0747 9AF7 C8 INY 0748 9AF8 AD 3E 0D LDA SBSRHI 0749 9AFB 91 9C STAIY DYNVC1 ;STORE CALLING STATION NUMBER 0750 9AFD 0751 9AFD ;CAUSE IRQ 0752 9AFD CIRQ 0753 9AFD AD 3F 0D LDA SBCNTL 0754 9B00 8D 57 0D STA IRQSTR ;SAVE SCOUT BUF VARIABLES COS IRQ SLOW 0755 9B03 A9 84 LDAIM &84 0756 9B05 8D 4E FE STA VIA +&E ;ENABLE SHIFT INT,IER REG 0757 9B08 AD 4B FE LDA VIA +&B ;SHIFT CONTROL BY SYSTEM CLOCK,ACR REG 0758 9B0B 29 1C ANDIM &1C 0759 9B0D 8D 51 0D STA STORE ;SAVE BITS 2,3,4 0760 9B10 AD 4B FE LDA VIA +&B ;ACR REG 0761 9B13 29 E3 ANDIM &E3 0762 9B15 09 08 ORAIM EIGHT 0763 9B17 8D 4B FE STA VIA +&B ;ACR REG 0764 9B1A 2C 4A FE BIT VIA +&A ;READ TRIGGERS SHIFT OPERATION,SR REG 0765 9B1D EXITIM 0766 9B1D 4C E8 99 JMP NOUPD2 ;GOBACK TO NORMAL RECEIVE MODE 0767 9B20 0768 9B20 ; The "LOWINT" routine has been moved to LOWL01 !!!!!!! 0769 9B20 0770 9B20 JMPI2L ;IMMED OP LO BYTE JUMP TABLE 0771 9B20 24 = RXRTN2 - ONE 0772 9B21 2D = RXPRE2 - ONE 0773 9B22 3B = RXPRH2 - ONE 0774 9B23 47 = RXSTP2 - ONE 0775 9B24 5E = RXSTR2 - ONE 0776 9B25 0777 9B25 RXRTN2 0778 9B25 A9 9B LDAIM :MSB: (OUT - ONE) 0779 9B27 48 PHA 0780 9B28 A9 66 LDAIM :LSB: (OUT - ONE) ;NOTE TUBE JSR IS NOT ALLOWED 0781 9B2A 48 PHA 0782 9B2B 6C 58 0D JMI IRQSTR + ONE ;NON TUBE TYPE ROUTINE CALL 0783 9B2E 0784 9B2E RXPRE2 0785 9B2E A0 08 LDYIM EIGHT 0786 9B30 AE 58 0D LDX IRQSTR + ONE 0787 9B33 AD 59 0D LDA IRQSTR + TWO 0788 9B36 20 BF FF JSR OSEVEN ;CAUSE EVENT, ON EVENT X,Y HAS PROCEDURE NUMBER 0789 9B39 4C 67 9B JMP OUT 0790 9B3C 0791 9B3C RXPRH2 ;JUMP TO NFS 0792 9B3C AE 58 0D LDX IRQSTR + ONE 0793 9B3F AC 59 0D LDY IRQSTR + TWO ;LOAD X AND Y WITH PROC NUMBER 0794 9B42 20 00 80 JSR USRPRC 0795 9B45 4C 67 9B JMP OUT 0796 9B48 0797 9B48 RXSTP2 0798 9B48 A9 04 LDAIM STOP 0799 9B4A 2C 64 0D BIT SSTATE 0800 9B4D D0 18 BNE OUT 0801 9B4F 0D 64 0D ORA SSTATE ;FLAG PROCESSOR IS STOPPED 0802 9B52 8D 64 0D STA SSTATE 0803 9B55 A9 04 LDAIM STOP 0804 9B57 58 CLI ;ENABLE INTERUPT 0805 9B58 TSTSTP 0806 9B58 2C 64 0D BIT SSTATE 0807 9B5B D0 FB BNE TSTSTP ;LOOP UNTIL BIT RESET 0808 9B5D F0 08 BEQ OUT 0809 9B5F 0810 9B5F RXSTR2 0811 9B5F AD 64 0D LDA SSTATE 0812 9B62 29 FB ANDIM &FF -STOP 0813 9B64 8D 64 0D STA SSTATE ;CLEAR STOPPED STATE 0814 9B67 0815 9B67 OUT 0816 9B67 68 PLA 0817 9B68 A8 TAY 0818 9B69 68 PLA 0819 9B6A AA TAX 0820 9B6B OUT2 0821 9B6B A9 00 LDAIM ZERO ;CLAIM IRQ 0822 9B6D 60 RTS 0823 9B6E 0824 9B6E LNK LOWL03 0001 9B6E TTL Transmit routines. File > LOWL03 0002 9B6E OPT TXRTNS Acorn macro assembler Page 12 Transmit routines. File > LOWL03 0003 9B6E 0004 9B6E 0005 9B6E ;TRANSMIT ROUTINES 0006 9B6E ;A MESSAGE IS TRANSMITTED WITH A FOUR WAY PACKET HANDSHAKE: 0007 9B6E ;A SCOUT PACKET IS TRANSMITTED 0008 9B6E ;AN ACKNOWLEGE PACKET IS AWAITED 0009 9B6E ;UPON ACKNOWLEDGE A DATA PACKET IS TRANSMITTED 0010 9B6E ;AN ACKNOWEGE PACKET IS AWAITED 0011 9B6E 0012 9B6E 0013 9B6E ;TRANSMIT NMI SHOULD BE CLAIMED ALREADY 0014 9B6E TRANSM 0015 9B6E LOTRAN 0016 9B6E 8A TXA 0017 9B6F 48 PHA ;SAVE X REG 0018 9B70 0019 9B70 ;COPY TXCBLOCK TO TX SCOUT AREA 0020 9B70 A0 02 LDYIM CBSRLO 0021 9B72 B1 A0 LDAIY TXCBPT 0022 9B74 8D 20 0D STA TXDELO ;DEST LO 0023 9B77 C8 INY 0024 9B78 B1 A0 LDAIY TXCBPT 0025 9B7A 8D 21 0D STA TXDEHI ;DEST HI 0026 9B7D A0 00 LDYIM CBCNTL 0027 9B7F B1 A0 LDAIY TXCBPT 0028 9B81 30 03 BMI CBLOK ;CHECK VALID CONTROL BYTE TOP BIT SET 0029 9B83 4C 11 9C JMP TXCER4 ;CHECK VALID CONTROL BYTE TOP BIT SET 0030 9B86 CBLOK 0031 9B86 8D 24 0D STA TXCNTL ;CONTROL BYTE 0032 9B89 AA TAX 0033 9B8A C8 INY 0034 9B8B B1 A0 LDAIY TXCBPT 0035 9B8D 8D 25 0D STA TXPORT ;PORT BYTE 0036 9B90 D0 33 BNE NOTIM 0037 9B92 0038 9B92 E0 83 CPXIM IRTN ;CHECK IF PEEK OR POKE 0039 9B94 B0 1B BCS NOCALC 0040 9B96 ;CALCULATE IMMEDIATE VARIABLES N.B. CHECK GOOD CONTROL BYTE 0041 9B96 38 SEC ;CALC PART OF ADDRESS FOR PEEK AND POKE 0042 9B97 08 PHP 0043 9B98 A0 08 LDYIM CBEALO ;SUBTRACTION 0044 9B9A LOOPP 0045 9B9A B1 A0 LDAIY TXCBPT 0046 9B9C 88 DEY 0047 9B9D 88 DEY ;DOWN FOUR POINT TO START ADDRESS 0048 9B9E 88 DEY 0049 9B9F 88 DEY 0050 9BA0 28 PLP 0051 9BA1 F1 A0 SBCIY TXCBPT 0052 9BA3 99 26 0D STAAY TXADRF -CBSALO ;CALC EXTRA REMOTE ADDRESS 0053 9BA6 C8 INY 0054 9BA7 C8 INY 0055 9BA8 C8 INY ;UP FIVE TO END ADDRESS 0056 9BA9 C8 INY 0057 9BAA C8 INY 0058 9BAB 08 PHP 0059 9BAC C0 0C CPYIM XTRA1L 0060 9BAE 90 EA BCC LOOPP 0061 9BB0 28 PLP 0062 9BB1 0063 9BB1 NOCALC 0064 9BB1 E0 81 CPXIM IPEEK ;CHECK FOR LESS THAN PEEK 0065 9BB3 90 5C BCC TXCER4 0066 9BB5 E0 89 CPXIM IMACH + ONE ;COMPARE CONTROL BYTE 0067 9BB7 B0 58 BCS TXCER4 ;NOT VALID IM OP CONTROL BYTE 0068 9BB9 A0 0C LDYIM XTRA1L ;POINT TO CB REMOTE FROM 0069 9BBB LP 0070 9BBB B1 A0 LDAIY TXCBPT 0071 9BBD 99 1A 0D STAAY TXADRT -XTRA1L ;STORE IN TX SCOUT AREA 0072 9BC0 C8 INY 0073 9BC1 C0 10 CPYIM XTRA2H + ONE ;COPY REMOTE FROM 0074 9BC3 90 F6 BCC LP 0075 9BC5 0076 9BC5 0077 9BC5 0078 9BC5 ;CALCULATE DATA BUFFER VARIABLES 0079 9BC5 NOTIM 0080 9BC5 A9 20 LDAIM DCD ;CHECK FOR CLOCK 0081 9BC7 2C A1 FE BIT SReg2 0082 9BCA D0 55 BNE TXCER3 ;NO ECONET CLOCK 0083 9BCC 0084 9BCC ;INIT CLAIM VARIABLES 0085 9BCC A9 FD LDAIM &FD 0086 9BCE 48 PHA 0087 9BCF A9 06 LDAIM TXADRT -TXDELO 0088 9BD1 8D 50 0D STA ENTXCT ;STORE END COUNTER 0089 9BD4 A9 00 LDAIM ZERO 0090 9BD6 8D 4F 0D STA TXCNT ;STORE SCOUT BUFFER COUNTER 0091 9BD9 48 PHA ;STORE DELAY COUNT 0092 9BDA 48 PHA 0093 9BDB A0 E7 LDYIM &E7 ;+RTS +CTXS +CRXS -TXLA TDRA FLAG 2BYT +PSE 0094 9BDD 0095 9BDD ;POLL THE ECONET BUS FOR LINE FREE 0096 9BDD POLBUS ;N.B. COULD BE RECEIVING A PACKET,TX MUST DETECT THIS 0097 9BDD A9 04 LDAIM RXIDLE 0098 9BDF 08 PHP ;SAVE INT STATE ON STACK 0099 9BE0 78 SEI ;DISABLE IRQ INTERUPT 0100 9BE1 2C 18 FE BIT INTOFF ;DISABLE NMI INTERUPT 0101 9BE4 2C 18 FE BIT INTOFF ;MAKE SURE NMI OFF COS IT NIPS IN AFTER JUST ONE 0102 9BE7 2C A1 FE BIT SReg2 0103 9BEA F0 0F BEQ SKIP ;BUS IS NOT IDLE 0104 9BEC AD A0 FE LDA SReg1 ;READ STATUS FIRST 0105 9BEF A9 67 LDAIM &67 ;-RTS +CTXS +CRXS -TXL TDRA FLAG 2BYT +PSE 0106 9BF1 8D A1 FE STA CReg2 ;CLEAR TX AND RX STATUS 0107 9BF4 A9 10 LDAIM CTS 0108 9BF6 2C A0 FE BIT SReg1 0109 9BF9 D0 34 BNE CLAIM ;BUS UNDRIVEN I.E.FREE 0110 9BFB 0111 9BFB SKIP 0112 9BFB 2C 20 FE BIT INTON ;ENABLE NMI INTERUPT 0113 9BFE 28 PLP ;ENABLE IRQ INTERUPT 0114 9BFF BA TSX 0115 9C00 FE 01 01 INCAX &0101 0116 9C03 D0 D8 BNE POLBUS ;APPROX 10 SEC TIMEOUT LOOP 0117 9C05 FE 02 01 INCAX &0102 0118 9C08 D0 D3 BNE POLBUS 0119 9C0A FE 03 01 INCAX &0103 0120 9C0D D0 CE BNE POLBUS 0121 9C0F F0 04 BEQ TXCER0 ;LINE JAMMED OR HW FAULT 0122 9C11 0123 9C11 TXCER4 Acorn macro assembler Page 13 Transmit routines. File > LOWL03 0124 9C11 A9 44 LDAIM &44 ;NOT VALID CONTROL BYTE 0125 9C13 D0 0E BNE TXCERR 0126 9C15 ;ERROR IN CLAIMING THE ECONET 0127 9C15 TXCER0 ;LINE JAMMED 0128 9C15 A9 07 LDAIM SEVEN ;-RTS -CTXS -CRXS -TXLA TDRA FLAG 2BYT +PSE 0129 9C17 8D A1 FE STA CReg2 ;TURN OFF TX IN CASE ITS ME JAMMING 0130 9C1A 68 PLA 0131 9C1B 68 PLA 0132 9C1C 68 PLA ;GET RID OF 3BYTE COUNT VARIABLE 0133 9C1D A9 40 LDAIM &40 0134 9C1F D0 02 BNE TXCERR 0135 9C21 TXCER3 0136 9C21 A9 43 LDAIM &43 ;NO CLOCK 0137 9C23 TXCERR 0138 9C23 A0 00 LDYIM CBCNTL 0139 9C25 91 A0 STAIY TXCBPT 0140 9C27 A9 80 LDAIM &80 ;SIGNAL CLEAR FOR USER TX 0141 9C29 8D 62 0D STA TXCLRl 0142 9C2C 68 PLA 0143 9C2D AA TAX ;RESTORE X 0144 9C2E 60 RTS 0145 9C2F 0146 9C2F ;CLAIM THE ECONET 0147 9C2F CLAIM 0148 9C2F 8C A1 FE STY CReg2 ;+RTS +CTXS +CRXS -TXLA TDRA FLAG 2BYT +PSE 0149 9C32 A2 44 LDXIM &44 ;-TXRS +RXRS -FRDI -TDRA -RDSR +TIE -RIE SCR2 0150 9C34 8E A0 FE STX CReg1 ;-TXRS +RXRS -FRDI -TDRA -RDSR +TIE -RIE SCR2 0151 9C37 A2 CC LDXIM :LSB: WCLM 0152 9C39 A0 9C LDYIM :MSB: WCLM 0153 9C3B 8E 0C 0D STX TXJUMP + ONE 0154 9C3E 8C 0D 0D STY TXJUMP + TWO ;SAVE TX JUMP ADDRESS 0155 9C41 38 SEC 0156 9C42 66 98 ROR TUBLOK ;SET TUBE LOCK 0157 9C44 2C 20 FE BIT INTON ;ENABLE NMI INTERUPT 0158 9C47 0159 9C47 AD 25 0D LDA TXPORT ;POINT TO PORT 0160 9C4A D0 42 BNE NTIMM ;NOT IMMED OPERATION 0161 9C4C 0162 9C4C AC 24 0D LDY TXCNTL 0163 9C4F B9 41 9E LDAAY NSTAT1 -IPEEK 0164 9C52 8D 4A 0D STA NSTATE ;STORE NSTATE 0165 9C55 B9 39 9E LDAAY ENCT2 -IPEEK 0166 9C58 8D 50 0D STA ENTXCT ;STORE END COUNT 0167 9C5B 0168 9C5B ; LDAAY TXIMH -IPEEK ;NIFTY CASE INSTUCTION 0169 9C5B A9 9C LDAIM TXIMH 0170 9C5D 48 PHA 0171 9C5E B9 E2 9B LDAAY TXIML -IPEEK 0172 9C61 48 PHA 0173 9C62 60 RTS 0174 9C63 0175 9C63 0176 9C63 TXIML 0177 9C63 6E = PEEKIT - ONE 0178 9C64 72 = POKEIT - ONE 0179 9C65 B4 = RTNIT - ONE 0180 9C66 B4 = PROEIT - ONE 0181 9C67 B4 = PROHIT - ONE 0182 9C68 C4 = STOPIT - ONE 0183 9C69 C4 = STRTIT - ONE 0184 9C6A 6A = MACHIT - ONE 0185 9C6B 0186 9C6B MACHIT 0187 9C6B A9 03 LDAIM THREE ;TUBE WRITE 0188 9C6D D0 48 BNE SKIP8 0189 9C6F PEEKIT 0190 9C6F A9 03 LDAIM THREE ;TUBE WRITE 0191 9C71 D0 02 BNE SKIP7 0192 9C73 0193 9C73 POKEIT 0194 9C73 A9 02 LDAIM TWO ;TUBE READ 0195 9C75 SKIP7 0196 9C75 8D 5C 0D STA TDIR 0197 9C78 18 CLC 0198 9C79 08 PHP 0199 9C7A A0 0C LDYIM XTRA1L 0200 9C7C MRCOPY 0201 9C7C B9 1E 0D LDAAY TXADRF -XTRA1L ;ADDITION 0202 9C7F 28 PLP 0203 9C80 71 A0 ADCIY TXCBPT 0204 9C82 99 1E 0D STAAY TXADRF -XTRA1L ;CALCULATE EXTRA REMOTE ADDRESS LO 0205 9C85 C8 INY 0206 9C86 08 PHP 0207 9C87 C0 10 CPYIM XTRA1L + FOUR 0208 9C89 90 F1 BCC MRCOPY ; Exit condition is Y = XTRA1L + FOUR ( Y <> 0) 0209 9C8B 28 PLP 0210 9C8C D0 2C BNE CALCAD ;CALCULATE ADDRESSES, Hence a BNE here not JMP 0211 9C8E 0212 9C8E NTIMM 0213 9C8E AD 20 0D LDA TXDELO ;LOAD SOURCE ADDRESS 0214 9C91 2D 21 0D AND TXDEHI 0215 9C94 C9 FF CMPIM &FF 0216 9C96 D0 18 BNE NOBR 0217 9C98 A9 0E LDAIM &0E ;LENGTH OF BROADCAST SCOUT PACKET 0218 9C9A 8D 50 0D STA ENTXCT 0219 9C9D A9 40 LDAIM BCAST ;FLAG BROADCAST 0220 9C9F 8D 4A 0D STA NSTATE 0221 9CA2 A0 04 LDYIM CBSALO ;POINT TO CB REMOTE FROM 0222 9CA4 LPP 0223 9CA4 B1 A0 LDAIY TXCBPT ;COPY BROADCAST PARAMETERS 0224 9CA6 99 22 0D STAAY TXBUFl + TWO ;STORE IN TX SCOUT AREA 0225 9CA9 C8 INY 0226 9CAA C0 0C CPYIM XTRA1L 0227 9CAC 90 F6 BCC LPP 0228 9CAE B0 15 BCS OUT3 0229 9CB0 0230 9CB0 NOBR 0231 9CB0 A9 00 LDAIM ZERO 0232 9CB2 8D 4A 0D STA NSTATE ;STORE STATE TO END SCOUT PACKET 0233 9CB5 0234 9CB5 RTNIT 0235 9CB5 PROEIT 0236 9CB5 PROHIT 0237 9CB5 A9 02 LDAIM TWO ;DOUBLE BYTE TUBE READ 0238 9CB7 SKIP8 0239 9CB7 8D 5C 0D STA TDIR 0240 9CBA CALCAD 0241 9CBA A5 A0 LDA TXCBPT 0242 9CBC 85 A6 STA RXCBPT 0243 9CBE A5 A1 LDA TXCBPT + ONE 0244 9CC0 85 A7 STA RXCBPT + ONE Acorn macro assembler Page 14 Transmit routines. File > LOWL03 0245 9CC2 20 CA 9E JSR ADCALC ;AND RETURN 0246 9CC5 0247 9CC5 STOPIT 0248 9CC5 STRTIT 0249 9CC5 OUT3 0250 9CC5 28 PLP ;ENABLE IRQ INTERUPT 0251 9CC6 68 PLA 0252 9CC7 68 PLA 0253 9CC8 68 PLA ;GET RID OF 3 BYTE COUNTER 0254 9CC9 68 PLA 0255 9CCA AA TAX ;RESTORE X 0256 9CCB 60 RTS ;RETURN TO CALLER OF TX ROUTINE. CALLER NOW POLLS. 0257 9CCC ;TX OCCURS UNDER NMI INTERUPTS 0258 9CCC 0259 9CCC 0260 9CCC ;SEND SCOUT 0261 9CCC WCLM 0262 9CCC AC 4F 0D LDY TXCNT ;LOAD COUNTER 0263 9CCF 2C A0 FE BIT SReg1 0264 9CD2 WCLM2 0265 9CD2 50 22 BVC TXSER1 ;TDRA EXPECTED N.B. IN 2 BYTE MODE 0266 9CD4 B9 20 0D LDAAY TXDELO 0267 9CD7 8D A2 FE STA TXBYTE 0268 9CDA C8 INY 0269 9CDB B9 20 0D LDAAY TXDELO 0270 9CDE C8 INY 0271 9CDF 8C 4F 0D STY TXCNT 0272 9CE2 8D A2 FE STA TXBYTE 0273 9CE5 CC 50 0D CPY ENTXCT 0274 9CE8 B0 1E BCS ENDSCT 0275 9CEA 2C A0 FE BIT SReg1 ;QUICK IRQ POLL 0276 9CED 30 E3 BMI WCLM2 0277 9CEF 4C 14 0D JMP WTXIN2 ;WAIT FOR TX INTERUPT 0278 9CF2 0279 9CF2 0280 9CF2 ;ERROR IN TXSCOUT PACKET 0281 9CF2 TXSER2 0282 9CF2 A9 42 LDAIM &42 ;AP EXPECTED ERROR IN SCOUT ACK PACKET 0283 9CF4 D0 07 BNE SKIPIT 0284 9CF6 TXSER1 0285 9CF6 A9 67 LDAIM &67 ;-RTS +CTXST +CRXST -TXLST TDRA FLAG 2-BYT +PSE 0286 9CF8 8D A1 FE STA CReg2 0287 9CFB A9 41 LDAIM &41 ;TDRA EXPECTED DUE TO COLLISION OR LINE NOISE 0288 9CFD SKIPIT 0289 9CFD AC 18 FE LDY STNID 0290 9D00 COLARB ;THE NOTORIOUS COLLISION ARBITRATION 0291 9D00 48 PHA 0292 9D01 68 PLA ;DELAY A BIT 0293 9D02 C8 INY 0294 9D03 D0 FB BNE COLARB 0295 9D05 4C AE 9E JMP TXERRE ;JUMP TO ERROR REPORT 0296 9D08 0297 9D08 ENDSCT 0298 9D08 A9 3F LDAIM &3F ;-RTS -CTXST +CRXST +TXLST FC FLAG 2-BYT +PSE 0299 9D0A 8D A1 FE STA CReg2 0300 9D0D A9 14 LDAIM :LSB: ENPAK 0301 9D0F [ FAST5 <> TRUE 0302 9D0F A0 9D LDYIM :MSB: ENPAK 0303 9D11 4C 0E 0D JMP WTXINT ;WAIT FOR PACKET TO COMPLETE 0304 9D14 | 0306 9D14 ] 0307 9D14 0308 9D14 ;SCOUT TRANSMITTED 0309 9D14 ENPAK 0310 9D14 A9 82 LDAIM &82 ;+TXRST -RXRST -RXDISC -TDSR -RDSR -TIE +RIE SCR2 0311 9D16 8D A0 FE STA CReg1 0312 9D19 2C 4A 0D BIT NSTATE 0313 9D1C 50 03 BVC NOOBRD 0314 9D1E 4C A8 9E JMP UPTXCB 0315 9D21 NOOBRD 0316 9D21 A9 01 LDAIM SHORT 0317 9D23 2C 4A 0D BIT NSTATE 0318 9D26 F0 03 BEQ SCTAKK 0319 9D28 4C 50 9E JMP DATAK ;WAIT FOR DATA PACKET OR WAIT FOR LAST ACK PACKET 0320 9D2B 0321 9D2B SCTAKK 0322 9D2B A9 30 LDAIM :LSB: WSCACK 0323 9D2D [ FAST6 <> TRUE 0326 9D2D | 0327 9D2D 4C 11 0D JMP WRXNTF ; New fast code ! 0328 9D30 ] 0329 9D30 0330 9D30 0331 9D30 ;RECEIVE SCOUTACK PACKET 0332 9D30 WSCACK 0333 9D30 A9 01 LDAIM AP 0334 9D32 2C A1 FE BIT SReg2 0335 9D35 F0 BB BEQ TXSER2 ;AP EXPECTED I.E IF NOT LISTENING 0336 9D37 AD A2 FE LDA RXBYTE 0337 9D3A CD 18 FE CMP STNID 0338 9D3D D0 19 BNE TXAER1 ;NO SOURCE ADDRESS MATCH 0339 9D3F A9 44 LDAIM :LSB: WSCAKS 0340 9D41 [ FAST7 <> TRUE 0343 9D41 | 0344 9D41 4C 11 0D JMP WRXNTF ; New fast code ! 0345 9D44 ] 0346 9D44 0347 9D44 WSCAKS ;WAIT FOR SCOUT ACK SOURCE ADDRESS 0348 9D44 2C A1 FE BIT SReg2 0349 9D47 10 0F BPL TXAER1 ;RXDA EXPECTED 0350 9D49 AD A2 FE LDA RXBYTE ;NET NUMBER MUST BE ZERO 0351 9D4C D0 0A BNE TXAER1 ;NO SOURCE ADDRESS MATCH 0352 9D4E A9 5B LDAIM :LSB: WSCAKD 0353 9D50 [ FAST8 <> TRUE 0355 9D50 ] 0356 9D50 2C A0 FE BIT SReg1 ;QUICK IRQ POLL TO SAVE TIME 0357 9D53 30 06 BMI WSCAKD 0358 9D55 [ FAST8 <> TRUE 0360 9D55 | 0361 9D55 4C 11 0D JMP WRXNTF ; New fast code ! 0362 9D58 ] 0363 9D58 0364 9D58 ;ERROR IN RECEIVED ACK PACKET 0365 9D58 TXAER1 ;RXDA EXPECTED.NO MATCH ON SOUR/DEST ACK ADDR. BAD CRC 0366 9D58 4C AC 9E JMP TXBER1 ;JUMP TO ERROR REPORT 0367 9D5B 0368 9D5B WSCAKD ;WAIT FOR SCOUT ACK DESTINATION 0369 9D5B 2C A1 FE BIT SReg2 0370 9D5E 10 F8 BPL TXAER1 ;RXDA EXPECTED 0371 9D60 AD A2 FE LDA RXBYTE 0372 9D63 CD 20 0D CMP TXDELO Acorn macro assembler Page 15 Transmit routines. File > LOWL03 0373 9D66 D0 F0 BNE TXAER1 ;NOT FROM STATION SCOUT WAS SENT TO 0374 9D68 AD A2 FE LDA RXBYTE 0375 9D6B CD 21 0D CMP TXDEHI 0376 9D6E D0 E8 BNE TXAER1 ;NOT FROM NET SCOUT WAS SENT TO 0377 9D70 0378 9D70 A9 02 LDAIM FV ;SCOUT ACK END 0379 9D72 2C A1 FE BIT SReg2 0380 9D75 F0 E1 BEQ TXAER1 ;NOT FRAME VALID PACKET 0381 9D77 0382 9D77 0383 9D77 ;SEND DATA 0384 9D77 A9 A7 LDAIM &A7 ;+RTS -CTXST +CRXST -TXLD TDRA FLAG 2BYT +PSE 0385 9D79 8D A1 FE STA CReg2 ;ENABLE TRANSMIT 0386 9D7C A9 44 LDAIM &44 ;-TXRST +RXRST -RXDISC -TDSR -RDSR +TIE -RIE SCR2 0387 9D7E 8D A0 FE STA CReg1 0388 9D81 A9 50 LDAIM :LSB: DATAK 0389 9D83 A0 9E LDYIM :MSB: DATAK 0390 9D85 ;TX 2BYTES DESTINATION 0391 9D85 TXDATA 0392 9D85 8D 4B 0D STA TXLINK 0393 9D88 8C 4C 0D STY TXLINK + ONE 0394 9D8B AD 20 0D LDA TXDELO 0395 9D8E 2C A0 FE BIT SReg1 ;MAY NEED DELAY HERE IF S/W TOO FAST 0396 9D91 50 3A BVC BCXXX2 ; TXDER1 ;TDRA EXPECTED N.B. IN 2 BYTE MODE 0397 9D93 8D A2 FE STA TXBYTE ;TRANSMIT SOURCE LO 0398 9D96 AD 21 0D LDA TXDEHI 0399 9D99 8D A2 FE STA TXBYTE ;TRANSMIT SOURCE HI 0400 9D9C A9 A3 LDAIM :LSB: TXSR 0401 9D9E A0 9D LDYIM :MSB: TXSR 0402 9DA0 4C 0E 0D JMP WTXINT ;WAIT FOR TX INTERUPT 0403 9DA3 0404 9DA3 TXSR ;TX 2BYTES SOURCE 0405 9DA3 AD 18 FE LDA STNID 0406 9DA6 2C A0 FE BIT SReg1 0407 9DA9 50 22 BVC BCXXX2 ; TXDER1 ;TDRA EXPECTED N.B. IN 2-BYTE MODE 0408 9DAB 8D A2 FE STA TXBYTE ;TX STATION ID 0409 9DAE A9 00 LDAIM NETnum 0410 9DB0 8D A2 FE STA TXBYTE ;TX NET ID 0411 9DB3 TXINF 0412 9DB3 A9 02 LDAIM TUBEf 0413 9DB5 2C 4A 0D BIT NSTATE ;TEST IF DATA IS FROM TUBE 0414 9DB8 D0 07 BNE ISSTUB 0415 9DBA A9 C8 LDAIM :LSB: TXINFO 0416 9DBC A0 9D LDYIM :MSB: TXINFO 0417 9DBE 4C 0E 0D JMP WTXINT ;WAIT FOR TX INTERUPT 0418 9DC1 ISSTUB 0419 9DC1 A9 0F LDAIM :LSB: TXINF2 0420 9DC3 A0 9E LDYIM :MSB: TXINF2 0421 9DC5 4C 0E 0D JMP WTXINT 0422 9DC8 0423 9DC8 ;TRANSMIT DATA BYTES 0424 9DC8 TXINFO 0425 9DC8 A4 A2 LDY TXYOFF 0426 9DCA 2C A0 FE BIT SReg1 0427 9DCD TXINF3 0428 9DCD 50 79 BCXXX2 BVC TXDER1 ;TDRA EXPECTED N.B. IN 2-BYTE MODE, BRANCH THROUGH 0429 9DCF B1 A4 LDAIY TXDAPT 0430 9DD1 8D A2 FE STA TXBYTE 0431 9DD4 C8 INY 0432 9DD5 D0 06 BNE PASSX 0433 9DD7 C6 A3 DEC TXPAGE 0434 9DD9 F0 1A BEQ TXEND2 0435 9DDB E6 A5 INC TXDAPT + ONE 0436 9DDD PASSX 0437 9DDD B1 A4 LDAIY TXDAPT 0438 9DDF 8D A2 FE STA TXBYTE 0439 9DE2 C8 INY 0440 9DE3 84 A2 STY TXYOFF 0441 9DE5 D0 06 BNE OUTX 0442 9DE7 UPCNT 0443 9DE7 C6 A3 DEC TXPAGE 0444 9DE9 F0 0A BEQ TXEND2 0445 9DEB E6 A5 INC TXDAPT + ONE 0446 9DED OUTX 0447 9DED 2C A0 FE BIT SReg1 0448 9DF0 30 DB BMI TXINF3 ;QUICK IRQ POLL 0449 9DF2 4C 14 0D JMP WTXIN2 0450 9DF5 0451 9DF5 TXEND2 0452 9DF5 A9 3F LDAIM &3F ;-RTS -CTXST +CRXST +TXLST FC FLAG 2-BYT +PSE 0453 9DF7 8D A1 FE STA CReg2 0454 9DFA AD 4A 0D LDA NSTATE 0455 9DFD 10 07 BPL NOIM 0456 9DFF A9 DB LDAIM :LSB: NOUPDA 0457 9E01 [ FAST9 <> TRUE 0458 9E01 A0 99 LDYIM :MSB: NOUPDA 0459 9E03 4C 0E 0D JMP WTXINT ;WAIT FOR IMMEDIATE DATA TO COMPLETE 0460 9E06 | 0462 9E06 ] 0463 9E06 0464 9E06 NOIM 0465 9E06 AD 4B 0D LDA TXLINK 0466 9E09 AC 4C 0D LDY TXLINK + ONE 0467 9E0C 4C 0E 0D JMP WTXINT ;WAIT FOR PACKET TO COMPLETE 0468 9E0F 0469 9E0F 0470 9E0F ;TRANSMIT DATA BYTES OF TUBE 0471 9E0F TXINF2 0472 9E0F 2C A0 FE BIT SReg1 0473 9E12 TXINF4 0474 9E12 50 34 BVC TXDER1 ;TDRA EXPECTED N.B. IN 2-BYTE MODE 0475 9E14 AD E5 FE LDA R3DATA 0476 9E17 8D A2 FE STA TXBYTE 0477 9E1A E6 A2 INC TXYOFF 0478 9E1C D0 0C BNE CONTT2 0479 9E1E E6 A3 INC TXPAGE 0480 9E20 D0 08 BNE CONTT2 0481 9E22 E6 A4 INC TXDAPT 0482 9E24 D0 04 BNE CONTT2 0483 9E26 E6 A5 INC TXDAPT + ONE 0484 9E28 F0 CB BEQ TXEND2 0485 9E2A CONTT2 0486 9E2A AD E5 FE LDA R3DATA 0487 9E2D 8D A2 FE STA TXBYTE 0488 9E30 E6 A2 INC TXYOFF 0489 9E32 D0 0C BNE OUTTT 0490 9E34 UPCN2 0491 9E34 E6 A3 INC TXPAGE 0492 9E36 D0 08 BNE OUTTT 0493 9E38 E6 A4 INC TXDAPT 0494 9E3A D0 04 BNE OUTTT Acorn macro assembler Page 16 Transmit routines. File > LOWL03 0495 9E3C E6 A5 INC TXDAPT + ONE 0496 9E3E F0 B5 BEQ TXEND2 0497 9E40 OUTTT 0498 9E40 2C A0 FE BIT SReg1 ;QUICK IRQ POLL 0499 9E43 30 CD BMI TXINF4 0500 9E45 4C 14 0D JMP WTXIN2 0501 9E48 0502 9E48 ;ERROR IN TXDATA PACKET 0503 9E48 TXDER1 0504 9E48 AD 4A 0D LDA NSTATE 0505 9E4B 10 5F BPL TXBER1 ; NOIMM ;NO LONG ACK PACKET 0506 9E4D 4C DB 99 JMP NOUPDA 0507 9E50 ;NOIMM ;ERROR IN TXDATA PACKET 0508 9E50 ; JMP TXBER1 ;JUMP TO ERROR REPORT 0509 9E50 0510 9E50 ;TXEN2 0511 9E50 DATAK 0512 9E50 A9 82 LDAIM &82 ;+TXRST -RXRST -RXDISC -TDSR -RDSR -TIE +RIE SCR2 0513 9E52 8D A0 FE STA CReg1 0514 9E55 A9 5C LDAIM :LSB: DATACK 0515 9E57 [ FAST10 <> TRUE 0516 9E57 A0 9E LDYIM :MSB: DATACK 0517 9E59 4C 0E 0D JMP WRXINT ;WAIT DATA ACK PACKET 0518 9E5C | 0520 9E5C ] 0521 9E5C 0522 9E5C DATACK 0523 9E5C A9 01 LDAIM AP 0524 9E5E 2C A1 FE BIT SReg2 0525 9E61 F0 49 BEQ TXBER1 ;AP EXPECTED 0526 9E63 AD A2 FE LDA RXBYTE 0527 9E66 CD 18 FE CMP STNID 0528 9E69 D0 41 BNE TXBER1 ;NO SOURCE ADDRESS MATCH 0529 9E6B A9 70 LDAIM :LSB: WDAAKS 0530 9E6D [ FAST11 <> TRUE 0533 9E6D | 0534 9E6D 4C 11 0D JMP WRXNTF ; New fast code ! 0535 9E70 ] 0536 9E70 0537 9E70 WDAAKS ;WAIT FOR SCOUT ACK SOURCE ADDRESS 0538 9E70 2C A1 FE BIT SReg2 0539 9E73 10 37 BPL TXBER1 ;RXDA EXPECTED 0540 9E75 AD A2 FE LDA RXBYTE ;NET NUMBER MUST BE ZERO 0541 9E78 D0 32 BNE TXBER1 ;NO SOURCE ADDRESS MATCH 0542 9E7A A9 84 LDAIM :LSB: WDAAKD 0543 9E7C [ FAST12 <> TRUE 0545 9E7C ] 0546 9E7C 2C A0 FE BIT SReg1 ;QUICK IRQ POLL TO SAVE TIME 0547 9E7F 30 03 BMI WDAAKD 0548 9E81 [ FAST12 <> TRUE 0550 9E81 | 0551 9E81 4C 11 0D JMP WRXNTF ; New fast code ! 0552 9E84 ] 0553 9E84 0554 9E84 WDAAKD ;WAIT FOR SCOUT ACK DESTINATION 0555 9E84 2C A1 FE BIT SReg2 0556 9E87 10 23 BPL TXBER1 ;RXDA EXPECTED 0557 9E89 AD A2 FE LDA RXBYTE 0558 9E8C CD 20 0D CMP TXDELO 0559 9E8F D0 1B BNE TXBER1 ;NOT FROM STATION SCOUT WAS SENT TO 0560 9E91 AD A2 FE LDA RXBYTE 0561 9E94 CD 21 0D CMP TXDEHI 0562 9E97 D0 13 BNE TXBER1 ;NOT FROM NET SCOUT WAS SENT TO 0563 9E99 0564 9E99 AD 4A 0D LDA NSTATE 0565 9E9C 10 03 BPL NODATA 0566 9E9E 4C 1B 98 JMP RXINF 0567 9EA1 NODATA 0568 9EA1 A9 02 LDAIM FV ;TEST FOR SCOUT ACK END 0569 9EA3 2C A1 FE BIT SReg2 0570 9EA6 F0 04 BEQ TXBER1 ;NOT FRAME VALID PACKET 0571 9EA8 0572 9EA8 UPTXCB 0573 9EA8 A9 00 LDAIM ZERO ;GOOD UPDATE OF TX CONTROL BYTE 0574 9EAA F0 02 BEQ TXERRE 0575 9EAC 0576 9EAC ;ERROR IN RECEIVED DATA ACK PACKET 0577 9EAC TXBER1 0578 9EAC A9 41 LDAIM &41 ;AP/RXDA EXPECTED.NO MATCH ON DATA ACK SOUR/DEST ADDR.BAD CRC 0579 9EAE TXERRE 0580 9EAE A0 00 LDYIM CBCNTL 0581 9EB0 91 A0 STAIY TXCBPT ;STORE ERROR INDICATOR IN CNTRL BYTE 0582 9EB2 A9 80 LDAIM &80 0583 9EB4 8D 62 0D STA TXCLRl ;SIGNAL THAT USER CAN TX AGAIN 0584 9EB7 4C DB 99 JMP NOUPDA ;WAIT TO RECEIVE A NEW PACKET 0585 9EBA 0586 9EBA ENCT2 ;LENGTH OF IMMED SCOUT BUFFERS 0587 9EBA 0E = &0E ;PEEK SCOUT LENGTH 0588 9EBB 0E = &0E ;POKE SCOUT LENGTH 0589 9EBC 0A = &0A ;ROUTINE SCOUT LENGTH 0590 9EBD 0A = &0A ;PROCEDURE EVENT SCOUT LENGTH 0591 9EBE 0A = &0A ;PROCEDURE HIGH LEVEL SCOUT LENGTH 0592 9EBF 06 = &06 ;STOP SCOUT LENGTH 0593 9EC0 06 = &06 ;START SCOUT LENGTH 0594 9EC1 0A = &0A ;MACHINE TYPE SCOUT LENGTH 0595 9EC2 0596 9EC2 NSTAT1 ;NET STATE OF IM OPS 0597 9EC2 81 = &81 0598 9EC3 00 = &00 0599 9EC4 00 = &00 0600 9EC5 00 = &00 0601 9EC6 00 = &00 0602 9EC7 01 = &01 0603 9EC8 01 = &01 0604 9EC9 81 = &81 0605 9ECA 0606 9ECA 0607 9ECA ADCALC 0608 9ECA A0 06 LDYIM CBSAH1 0609 9ECC B1 A6 LDAIY RXCBPT 0610 9ECE C8 INY 0611 9ECF 31 A6 ANDIY RXCBPT 0612 9ED1 C9 FF CMPIM &FF ;TEST FOR TUBE ADDRESS 0613 9ED3 F0 44 BEQ NOTUB 0614 9ED5 AD 67 0D LDA TUBEFL ;TEST IF TUBE IS PRESENT 0615 9ED8 F0 3F BEQ NOTUB 0616 9EDA 0617 9EDA AD 4A 0D LDA NSTATE ;FLAG DATA IS FOR TUBE 0618 9EDD 09 02 ORAIM TUBEf 0619 9EDF 8D 4A 0D STA NSTATE 0620 9EE2 Acorn macro assembler Page 17 Transmit routines. File > LOWL03 0621 9EE2 38 SEC 0622 9EE3 08 PHP 0623 9EE4 A0 04 LDYIM CBSALO ;SET UP ADDRESSES 0624 9EE6 LOOPIT 0625 9EE6 B1 A6 LDAIY RXCBPT 0626 9EE8 C8 INY 0627 9EE9 C8 INY 0628 9EEA C8 INY ;UP FOUR 0629 9EEB C8 INY 0630 9EEC 28 PLP 0631 9EED F1 A6 SBCIY RXCBPT 0632 9EEF 99 9A 00 STAAY TXYOFF -CBEALO 0633 9EF2 88 DEY 0634 9EF3 88 DEY ;DOWN THREE 0635 9EF4 88 DEY 0636 9EF5 08 PHP 0637 9EF6 C0 08 CPYIM CBEALO 0638 9EF8 90 EC BCC LOOPIT 0639 9EFA 28 PLP 0640 9EFB 0641 9EFB 8A TXA 0642 9EFC 48 PHA ;SAVE XREG 0643 9EFD A9 04 LDAIM CBSALO 0644 9EFF 18 CLC 0645 9F00 65 A6 ADC RXCBPT 0646 9F02 AA TAX 0647 9F03 A4 A7 LDY RXCBPT + ONE 0648 9F05 A9 C2 LDAIM &C2 0649 9F07 20 06 04 JSR tADDRl ;CLAIM TUBE 0650 9F0A 90 0A BCC CLBAD 0651 9F0C AD 5C 0D LDA TDIR 0652 9F0F 20 06 04 JSR tADDRl 0653 9F12 20 2B 9A JSR TUBREL ;RELEASE TUBE 0654 9F15 38 SEC ;TUBE CLAIM OK 0655 9F16 CLBAD 0656 9F16 68 PLA 0657 9F17 AA TAX 0658 9F18 60 RTS 0659 9F19 0660 9F19 NOTUB 0661 9F19 A0 04 LDYIM CBSALO 0662 9F1B B1 A6 LDAIY RXCBPT 0663 9F1D A0 08 LDYIM CBEALO 0664 9F1F 38 SEC 0665 9F20 F1 A6 SBCIY RXCBPT 0666 9F22 85 A2 STA TXYOFF 0667 9F24 0668 9F24 A0 05 LDYIM CBSAHI 0669 9F26 B1 A6 LDAIY RXCBPT 0670 9F28 E9 00 SBCIM ZERO 0671 9F2A 85 A5 STA TXDAPT + ONE 0672 9F2C 0673 9F2C A0 08 LDYIM CBEALO 0674 9F2E B1 A6 LDAIY RXCBPT 0675 9F30 85 A4 STA TXDAPT 0676 9F32 0677 9F32 A0 09 LDYIM CBEAHI 0678 9F34 B1 A6 LDAIY RXCBPT 0679 9F36 38 SEC 0680 9F37 E5 A5 SBC TXDAPT + ONE 0681 9F39 85 A3 STA TXPAGE 0682 9F3B 38 SEC ;DUMMY TUBE CLAIM OK 0683 9F3C 60 RTS 0684 9F3D 0685 9F3D 0686 9F3D LNK LOWL04 0001 9F3D TTL Net initialization and sideways routines. File => LOWL04 0002 9F3D OPT SWRTNS Acorn macro assembler Page 18 Net initialization and sideways routines. File => LOWL04 0003 9F3D 0004 9F3D ; 0005 9F3D ; ****** NEVER fall through here ************ 0006 9F3D ; 0007 9F3D 0008 9F3D 0009 9F3D ;INITS ADLC CHIP 0010 9F3D CPINIT 0011 9F3D A9 C1 LDAIM &C1 ;+TXRS +RXRS -FRDIS -TDSR -RDSR -TIE -RIE SELCR3 0012 9F3F 8D A0 FE STA CReg1 0013 9F42 A9 1E LDAIM &1E ;NRZ -ABTEX -ABT 8TX 8RX 8RX F 0014 9F44 8D A3 FE STA CReg4 0015 9F47 A9 00 LDAIM ZERO ;-DTR 0016 9F49 8D A1 FE STA CReg3 0017 9F4C CPRST 0018 9F4C A9 82 LDAIM &82 ;+TXRS -RXRS -FRDISC -TDSR -RDSR -TIE +RIE SELCR2 0019 9F4E 8D A0 FE STA CReg1 0020 9F51 A9 67 LDAIM &67 ;-RTS +CTXST +CRXST -TXLAST TDRA FLAG 2BYTE +PSE 0021 9F53 8D A1 FE STA CReg2 0022 9F56 60 RTS 0023 9F57 0024 9F57 ; 0025 9F57 ; ****** NEVER fall through here ************ 0026 9F57 ; 0027 9F57 0028 9F57 ;RELINQUISH NMI AND ALL L.L. NET FUNCTIONS 0029 9F57 SAVE 0030 9F57 LOQNMI 0031 9F57 ;SAVE VARS IN FIRST PAGE DYN/STATIC WORKSPACE 0032 9F57 2C 66 0D BIT ACTIVE 0033 9F5A 10 1E BPL NOTACT 0034 9F5C WAITCL 0035 9F5C AD 0C 0D LDA TXJUMP + ONE ;WAIT FOR JUMP VECTOR TO GO TO BASE LEVEL 0036 9F5F C9 BF CMPIM REC 0037 9F61 D0 F9 BNE WAITCL 0038 9F63 AD 0D 0D LDA TXJUMP + TWO 0039 9F66 C9 96 CMPIM :MSB: REC 0040 9F68 D0 F2 BNE WAITCL 0041 9F6A 0042 9F6A 2C 18 FE BIT INTOFF ;DISABLES NMI 0043 9F6D 2C 18 FE BIT INTOFF ;DISABLES NMI 0044 9F70 A9 00 LDAIM ZERO 0045 9F72 8D 62 0D STA TXCLRl ;PREVENT FURTHER TRANSMISSIONS 0046 9F75 8D 66 0D STA ACTIVE 0047 9F78 A0 05 LDYIM FIVE ;NET NMI ID CLAIM NUMBER 0048 9F7A NOTACT 0049 9F7A 4C 4C 9F JMP CPRST ;MAKE SURE ALL CURRENT TX ARE ENDED 0050 9F7D 0051 9F7D LNK LOWL05 0001 9F7D TTL Non maskable interupt routines. File => LOWL05 0002 9F7D OPT NMILST Acorn macro assembler Page 19 Non maskable interupt routines. File => LOWL05 0003 9F7D 0004 9F7D NMICDE ; NMI code is stored here 0005 9F7D 0006 9F7D ; Main interupt handling 0007 9F7D 0008 9F7D ORG RAMCDE 0009 0D00 0010 0D00 ; Main interupt handler 0011 0D00 INT ; NMI ints enter here program routed via rx/tx jump vector 0012 0D00 2C 18 FE BIT INTOFF ; Disable NMI interupt 0013 0D03 48 PHA ; Save acumulator 0014 0D04 98 TYA 0015 0D05 48 PHA ; Save Y register 0016 0D06 ROMSTR 0017 0D06 A9 00 LDAIM ZERO ; !!!!!!!Self modifying code 0018 0D08 8D 30 FE STA ROMSWW ; Change over to Econet ROM 0019 0D0B TXJUMP 0020 0D0B RXJUMP ; !!!!!!Self modifying code n.b. must be in RAM 0021 0D0B 4C BF 96 JMP REC ; Jump to receive or transmit wait address 0022 0D0E 0023 0D0E 0024 0D0E ; Main routine that waits for tx interupt 0025 0D0E ; Returns from one int waits for another tx interupt 0026 0D0E WRXINT ; Saves rx jump address 0027 0D0E WTXINT ; Saves tx jump address 0028 0D0E 8C 0D 0D STY TXJUMP + TWO ; Store jump label 0029 0D11 WRXNTF ; The fast version only stores the LOW byte 0030 0D11 WTXNTF 0031 0D11 8D 0C 0D STA TXJUMP + ONE 0032 0D14 WRXIN2 ; Use same jump address as last time 0033 0D14 WTXIN2 ; Use same jump address as last time 0034 0D14 A5 F4 LDA ROMSWR ; Read old sideways ROM 0035 0D16 8D 30 FE STA ROMSWW ; Restore old sideways ROM 0036 0D19 68 PLA 0037 0D1A A8 TAY ; Restore Y register 0038 0D1B 68 PLA ; Restore accumulator 0039 0D1C 2C 20 FE BIT INTON ; Enable NMI 0040 0D1F 40 RTI ; Return to user process 0041 0D20 0042 0D20 0043 0D20 0020 CDELEN * . - INT 0044 0D20 0045 0D20 9F9D LOWEND * CDELEN + NMICDE 0046 0D20 0047 0D20 TTL Paging error check code File => LOWL05 0048 0D20 0049 0D20 ; Do the conditional assemblys here to check for 0050 0D20 ; paging errors generated in earlier files. 0051 0D20 0052 0D20 0053 0D20 009A JMPIMH * :MSB: (RXPEEK - ONE) ; This is the one 0054 0D20 [ JMPIMH <> :MSB: (RXPOKE - ONE) 0056 0D20 ] 0057 0D20 [ JMPIMH <> :MSB: (RXRTN - ONE) 0059 0D20 ] 0060 0D20 [ JMPIMH <> :MSB: (RXPROE - ONE) 0062 0D20 ] 0063 0D20 [ JMPIMH <> :MSB: (RXPROH - ONE) 0065 0D20 ] 0066 0D20 [ JMPIMH <> :MSB: (RXSTOP - ONE) 0068 0D20 ] 0069 0D20 [ JMPIMH <> :MSB: (RXSTRT - ONE) 0071 0D20 ] 0072 0D20 [ JMPIMH <> :MSB: (RXMACH - ONE) 0074 0D20 ] 0075 0D20 0076 0D20 0077 0D20 0078 0D20 009B JMPI2H * :MSB: (RXRTN2 - ONE) 0079 0D20 [ JMPI2H <> :MSB: (RXPRE2 - ONE) 0081 0D20 ] 0082 0D20 [ JMPI2H <> :MSB: (RXPRH2 - ONE) 0084 0D20 ] 0085 0D20 [ JMPI2H <> :MSB: (RXSTP2 - ONE) 0087 0D20 ] 0088 0D20 [ JMPI2H <> :MSB: (RXSTR2 - ONE) 0090 0D20 ] 0091 0D20 0092 0D20 0093 0D20 0094 0D20 009C TXIMH * :MSB: (PEEKIT - ONE) 0095 0D20 [ TXIMH <> :MSB: (POKEIT - ONE) 0097 0D20 ] 0098 0D20 [ TXIMH <> :MSB: (RTNIT - ONE) 0100 0D20 ] 0101 0D20 [ TXIMH <> :MSB: (PROEIT - ONE) 0103 0D20 ] 0104 0D20 [ TXIMH <> :MSB: (PROHIT - ONE) 0106 0D20 ] 0107 0D20 [ TXIMH <> :MSB: (STOPIT - ONE) 0109 0D20 ] 0110 0D20 [ TXIMH <> :MSB: (STRTIT - ONE) 0112 0D20 ] 0113 0D20 [ TXIMH <> :MSB: (MACHIT - ONE) 0115 0D20 ] 0116 0D20 0117 0D20 ; ******** 0118 0D20 0119 0D20 [ :MSB: RXDEHI <> :MSB: REC 0123 0D20 | 0124 0D20 [ FAST1 <> TRUE 0126 0D20 ] 0127 0D20 ] 0128 0D20 0129 0D20 ; ******** 0130 0D20 0131 0D20 [ :MSB: RXHEAD <> :MSB: RXDEHI 0132 0D20 [ FAST2 = TRUE 0134 0D20 ] 0135 0D20 | 0139 0D20 ] 0140 0D20 0141 0D20 ; ******** 0142 0D20 0143 0D20 [ :MSB: RXDAST <> :MSB: NOACK 0147 0D20 | 0148 0D20 [ FAST3 <> TRUE 0150 0D20 ] 0151 0D20 ] 0152 0D20 0153 0D20 ; ******** Acorn macro assembler Page 20 Paging error check code File => LOWL05 0154 0D20 0155 0D20 [ :MSB: WSOUR <> :MSB: RXDAST 0159 0D20 | 0160 0D20 [ FAST4 <> TRUE 0162 0D20 ] 0163 0D20 ] 0164 0D20 0165 0D20 ; ******** 0166 0D20 0167 0D20 [ :MSB: ENPAK <> :MSB: WCLM 0168 0D20 [ FAST5 = TRUE 0170 0D20 ] 0171 0D20 | 0175 0D20 ] 0176 0D20 0177 0D20 ; ******** 0178 0D20 0179 0D20 [ :MSB: WSCACK <> :MSB: ENPAK 0183 0D20 | 0184 0D20 [ FAST6 <> TRUE 0186 0D20 ] 0187 0D20 ] 0188 0D20 0189 0D20 ; ******** 0190 0D20 0191 0D20 [ :MSB: WSCAKS <> :MSB: WSCACK 0195 0D20 | 0196 0D20 [ FAST7 <> TRUE 0198 0D20 ] 0199 0D20 ] 0200 0D20 0201 0D20 ; ******** 0202 0D20 0203 0D20 [ :MSB: WSCAKD <> :MSB: WSCAKS 0207 0D20 | 0208 0D20 [ FAST8 <> TRUE 0210 0D20 ] 0211 0D20 ] 0212 0D20 0213 0D20 ; ******** 0214 0D20 0215 0D20 [ FAST9 = TRUE 0222 0D20 | 0223 0D20 [ :MSB: NOUPDA = :MSB: TXINF2 0228 0D20 ] 0229 0D20 ] 0230 0D20 0231 0D20 ; ******** 0232 0D20 0233 0D20 [ :MSB: DATACK <> :MSB: ENPAK 0234 0D20 [ FAST10 = TRUE 0236 0D20 ] 0237 0D20 | 0241 0D20 ] 0242 0D20 0243 0D20 ; ******** 0244 0D20 0245 0D20 [ :MSB: WDAAKS <> :MSB: DATACK 0249 0D20 | 0250 0D20 [ FAST11 <> TRUE 0252 0D20 ] 0253 0D20 ] 0254 0D20 0255 0D20 ; ******** 0256 0D20 0257 0D20 [ :MSB: WDAAKD <> :MSB: WDAAKS 0261 0D20 | 0262 0D20 [ FAST12 <> TRUE 0264 0D20 ] 0265 0D20 ] 0266 0D20 0267 0D20 TTL ROM statistics File => LOWL05 0268 0D20 OPT STATSL Acorn macro assembler Page 21 ROM statistics File => LOWL05 0269 0D20 0270 0D20 ; Calculate some ROM stats 0271 0D20 0272 0D20 0000 NFSLEN * NFSEND - NFSORG ; The length of the NFS 0273 0D20 0000 TUBLEN * TUBEND - TUBORG ; The length of the TUBE code 0274 0D20 096D LOWLEN * LOWEND - LOWORG ; The length of the low level code 0275 0D20 0276 0D20 096D ZZZZZZ * NFSLEN + TUBLEN + LOWLEN ; The total size 0277 0D20 0000 ROMORG * NFSORG ; For saving on to disc 0278 0D20 4000 ROMEND * NFSORG + &4000 0279 0D20 0280 0D20 END Assembly finished, no errors Action : ASM DOS01 Macro library : Acorn macro assembler Page 1 Pass 1 Pass 2 0001 0000 ;*** File One *** > DOS01 0002 0000 0003 0000 TTL - DOS01 - Storage Allocation 0004 0000 OPT &01 0005 0000 0006 0000 0000 DRIVEC * &00 0007 0000 < &00 0008 0000 > &02 0009 0000 GBLL $emu 0010 0000 $emu SETL 1=0 0011 0000 0012 0000 00FF RAMVER * &FF 0013 0000 00FF RAMGO * &FF 0014 0000 00FF NOENAB * &FF 0015 0000 0001 VERH * &01 0016 0000 0002 VERM * "2"-"0" 0017 0000 0000 VERL * "0"-"0" 0018 0000 0019 0000 0001 TUBEID * &01 ; My number for claiming/releasing Tube (c) 0020 0000 ; V n, |? = delete in strings trapped 0021 0000 0022 0000 ; V m 0023 0000 ; CLI in OSWORD $7F for typeahead 0024 0000 ; Delay in CMDDRV for write Ops 0025 0000 0026 0000 ; V l 0027 0000 ; Locked in OSFILE 1,2,3 removed 0028 0000 0029 0000 ; V j/k 0030 0000 ; Has semaphores in (BIT) QSTORE to say : 0031 0000 ; PL => FDC reinit. JSR ZTRKSC in next DRVSEL 0 0032 0000 ; VC => ditto. JSR ZTRKSC in next DRVSEL 1 0033 0000 0034 0000 ; Version i 0035 0000 ; *DIR $,*SAVE Q.ZOB,*DIR :2 0036 0000 ; leaving you in :2.Q is fixed 0037 0000 0009 VERBIN * &09 ;Version number (binary) 0038 0000 9F9D ROMLOC * &9F9D ; **$9FC8-$0054+$0011 ;ORG of double ROM version (16k) 0039 0000 0040 0000 [ RAMVER=0 0045 0000 | 0046 0000 DOS 0047 0000 ORG ROMLOC 0048 9F9D ; = $00,$00,$00 0049 9F9D 4C 94 B4 JMP CALLED 0050 9FA0 ; = $82,COFF,VERBIN,"DFS",$00 0051 9FA0 ; = VERH + '0' 0052 9FA0 ; = '.' 0053 9FA0 ; = VERM + '0' 0054 9FA0 ; = VERL + '0' 0055 9FA0 ;COFF = $00,"(C)",$00 0056 9FA0 ] 0057 9FA0 0058 9FA0 ;* Zero Page - takes up $20 bytes * 0059 9FA0 0060 9FA0 ^ &00A0 ;NMI allocation (8) 0061 9FA0 0062 9FA0 00A0 PRENMI # &01 ;Store for previous owner 0063 9FA0 00A1 SAVCOM # &01 ;Disk controller cmd 0064 9FA0 00A2 CNTA # &01 ;Error count 0065 9FA0 00A3 READNO # &03 ;Total bytes to read 0066 9FA0 00A6 RAMADR # &02 ;Indirection for NMI 0067 9FA0 0068 9FA0 0069 9FA0 ^ &00A8 ;Utility allocation (8) 0070 9FA0 0071 9FA0 00A8 LINNO # &02 ;BCD line number 0072 9FA0 00AA UTEMP # &01 ;Temp store 0073 9FA0 00AB LTEMP # &01 ;Temp utility store 0074 9FA0 00AC BLDTBL # &02 ;Misc table 0075 9FA0 00AE PTEMP # &02 ;Used by VSTRNG 0076 9FA0 0077 9FA0 ^ &00B0 ;High level allocation (20) 0078 9FA0 0079 9FA0 ;1st $10 bytes can withstand being 0080 9FA0 ;overwritten between calls. 0081 9FA0 00B0 TEMP # &02 ;Temporary zero page 0082 9FA0 00B2 XTEMP # &01 0083 9FA0 00B3 ITEMP # &01 0084 9FA0 00B4 ATEMP # &01 0085 9FA0 00B5 YTEMP # &01 0086 9FA0 00B6 VTEMP # &02 0087 9FA0 00B8 ZTEMP # &01 0088 9FA0 00B9 ETEMP # &01 0089 9FA0 00BA WORK # &12 0090 9FA0 00CC QUALIF # &01 0091 9FA0 00CD FDRIVE # &01 ;Drive to use. 0092 9FA0 00CE TRACK # &01 0093 9FA0 00CF SECTOR # &01 0094 9FA0 0095 9FA0 00BC COMTXT * WORK + &02 ;Pointer for HELP & SYNTAX 0096 9FA0 0097 9FA0 ;* NMI address and base for all other 0098 9FA0 ; memory allocation * 0099 9FA0 0100 9FA0 0D00 INTNMI * &0D00 0101 9FA0 0102 9FA0 0103 9FA0 ;* Non-zero page storage >$20 bytes ! * 0104 9FA0 ;Memory that does not require saving 0105 9FA0 0106 9FA0 ^ INTNMI + &0340 0107 9FA0 0108 9FA0 1040 SAVPAR # &05 ;Temp save of NMI prms 0109 9FA0 1045 TMPCIN # &0B 0110 9FA0 1050 NAMTRA # &08 0111 9FA0 1058 TMPNAM # &08 0112 9FA0 1060 DOSRAM # &12 0113 9FA0 1072 LDLOW # &02 ;Low bytes of load 0114 9FA0 1074 HIWORK # &08 0115 9FA0 107C SECNO # &01 ;Sectors left on track 0116 9FA0 107D BTEMP # &02 ;Used in BGBP 0117 9FA0 107F CTEMP # &01 ;Used in BGBP 0118 9FA0 1080 TUBCOM # &01 ;Direction of tube 0119 9FA0 1081 TUMFLG # &01 ;A tube flag 0120 9FA0 1082 CATDRV # &01 ;Catalog drive 0121 9FA0 1083 OLDDRV # &01 ;Currently selected drive 0122 9FA0 1084 XSTORE # &01 0123 9FA0 1085 QSTORE # &01 Acorn macro assembler Page 2 - DOS01 - Storage Allocation 0124 9FA0 1086 DUFFLG # &01 ; DUF flag - distinguishes closing/ensuring files 0125 9FA0 0126 9FA0 ;Memory that does require saving 0127 9FA0 0128 9FA0 ^ INTNMI + &03C0 0129 9FA0 0130 9FA0 10C0 DCBMAP # &01 0131 9FA0 10C1 DCBBIT # &01 0132 9FA0 10C2 DCBY # &01 0133 9FA0 ; *******SEQWA # $01 0134 9FA0 10C3 SEQWB # &01 0135 9FA0 10C4 SEQWC # &01 0136 9FA0 10C5 SEQWX # &01 0137 9FA0 10C6 MONFLG # &01 ;Monitor flag 0138 9FA0 10C7 ENAFLG # &01 ;Command enable flag 0139 9FA0 10C8 NMIFLG # &01 ;Got NMI Flag 0140 9FA0 10C9 DEFQUA # &01 ;Default qualifier 0141 9FA0 10CA DEFDSK # &01 ;Default disk 0142 9FA0 10CB LIBQUA # &01 ;Library qualifier 0143 9FA0 10CC LIBDSK # &01 ;Library disk 0144 9FA0 10CD WILDCH # &01 ;Wild char ($FF => no wild) 0145 9FA0 10CE DASHOP # &01 ;Dash operator ($FF => no dash) 0146 9FA0 10CF FRPAGE # &01 ;First free page 0147 9FA0 10D0 FRSIZE # &01 ;No. of free pages 0148 9FA0 10D1 FDRIV # &01 ;Source drive (MVDKDA) 0149 9FA0 10D2 TDRIV # &01 ;Destination drive (MVDKDA) 0150 9FA0 10D3 COLDS # &01 ;Cold start flag 0151 9FA0 10D4 MEMFLG # &01 ;Got memory 0152 9FA0 10D5 TUBFLG # &01 ;Tube flag 0153 9FA0 10D6 NOTUBE # &01 ;No tube flag 0154 9FA0 10D7 QTEMP # &02 0155 9FA0 10D9 LINADR # &02 0156 9FA0 10DB FCBADR # &02 0157 9FA0 10DD SEQSEM # &01 0158 9FA0 0159 9FA0 0160 9FA0 ;* Tempory buffer 0161 9FA0 1000 BUFFER * INTNMI + &0300 ;GP Buffer 0162 9FA0 0100 ERRBUF * &0100 ;Error buffer 0163 9FA0 0164 9FA0 ;** Equates ** 0165 9FA0 ;* Error numbers * 0166 9FA0 ^ &CF ;Error base 0167 9FA0 00CF ATTNUM # &00 - &01 ;Bad attribute 0168 9FA0 00CE DIRNUM # &00 - &01 ;Bad directory 0169 9FA0 00CD DRVNUM # &00 - &01 ;Bad drive 0170 9FA0 00CC FNANUM # &00 - &01 ;Bad filename 0171 9FA0 00CB OPTNUM # &00 - &01 ;Bad option 0172 9FA0 00CA # &00 - &01 ;Bad sum (unused) 0173 9FA0 00C9 DKPNUM # &00 - &01 ;Disk read only 0174 9FA0 00C8 DKCNUM # &00 - &01 ;Disk changed 0175 9FA0 00C7 DERNUM # &00 - &01 ;Disk fault 0176 9FA0 00C6 NORNUM # &00 - &01 ;Disk full 0177 9FA0 00C5 DFANUM # &00 - &01 ;Drive fault 0178 9FA0 00C4 FAXNUM # &00 - &01 ;File exists 0179 9FA0 00C3 LOKNUM # &00 - &01 ;File locked 0180 9FA0 00C2 FOPNUM # &00 - &01 ;File open 0181 9FA0 00C1 RDONUM # &00 - &01 ;File read only 0182 9FA0 00C0 TMFNUM # &00 - &01 ;Too many open files 0183 9FA0 00BF CNXNUM # &00 - &01 ;Can't extend 0184 9FA0 00BE DRFNUM # &00 - &01 ;Directory full 0185 9FA0 00BD CNENUM # &00 - &01 ;Not enabled 0186 9FA0 0187 9FA0 ;Special errors (in CFS) 0188 9FA0 00FE COMNUM * &FE ;Bad command 0189 9FA0 00DF EOFNUM * &DF ;EOF 0190 9FA0 00DE CHNNUM * &DE ;Channel 0191 9FA0 00DC SYNNUM * &DC ;Syntax errors 0192 9FA0 00D6 NOFNUM * &D6 ;File not found 0193 9FA0 0011 ESCNUM * &11 ;Escape 0194 9FA0 0195 9FA0 0196 9FA0 ;* System equates * 0197 9FA0 0000 MASDSK * &00 ;Start disk 0198 9FA0 0024 MASQUA * "$" ;Start qualifier 0199 9FA0 0023 MASWLD * "#" ;Wild char 0200 9FA0 002A MASDSH * "*" ;Dash char 0201 9FA0 [ DRIVEC=0 0202 9FA0 000E COMNO * &0E ;Number of commands 0203 9FA0 | 0205 9FA0 ] 0206 9FA0 0005 UTLNO * &05 ;Number of utilities 0207 9FA0 0002 HLPNO * &02 ;Number of help commands 0208 9FA0 000A TRIES * &0A ;Retries at loading 0209 9FA0 000A SECTRK * &0A ;Sectors per track 0210 9FA0 0004 FSYSNO * &04 ;Filing system number 0211 9FA0 0212 9FA0 0213 9FA0 ;Reason code for claim NMI 0214 9FA0 ^ &00 0215 9FA0 0000 WRMCLA # &01 ;Write from memory 0216 9FA0 0001 RDMCLA # &01 ;Read into memory 0217 9FA0 0002 NOPCLA # &01 ;Check error & return 0218 9FA0 0003 WTFCLA # &01 ;Write from tube 0219 9FA0 0004 WMFCLA # &01 ;Write from memory 0220 9FA0 0005 RTFCLA # &01 ;Read to tube 0221 9FA0 0006 RMFCLA # &01 ;Read to memory 0222 9FA0 0223 9FA0 0224 9FA0 ;* MOS RAM locations * 0225 9FA0 00EF WORDA * &00EF ;A of OSWORD call 0226 9FA0 00F0 WORDX * &00F0 ;X in OSWORD call 0227 9FA0 00F1 WORDY * &00F1 ;Y in OSWORD call 0228 9FA0 00F4 ROMID * &00F4 ;ID of current ROM 0229 9FA0 00F2 LINPTR * &00F2 ;Pointer to line 0230 9FA0 00FF ESCFLG * &00FF ;Escape flag 0231 9FA0 0212 VTAB2 * &0212 ;Start of vectors to zap 0232 9FA0 0DF0 PRIPTR * &0DF0 ;Pointer to private pages 0233 9FA0 0234 9FA0 0235 9FA0 ;* Pseudo-legal MOS entries * 0236 9FA0 0406 TUBADR * &0406 ;Set up address for tube 0237 9FA0 FFC2 RDINIT * &FFC2 ;Initialise read 0238 9FA0 ; ************RDCHR * $FFC5 ;Read char ; ********** HMT 0239 9FA0 0240 9FA0 ;* Legal MOS entries * 0241 9FA0 FFE0 OSRDCH * &FFE0 ;Read char from kbd 0242 9FA0 FFEE OSWRCH * &FFEE ;Write char to screen 0243 9FA0 FFE7 OSCRLF * &FFE7 ;Print CR LF 0244 9FA0 FFE3 OSASCI * &FFE3 ;OSWRCH + CR]CRLF 0245 9FA0 FFF4 OSBYTE * &FFF4 ;Misc OS calls Acorn macro assembler Page 3 - DOS01 - Storage Allocation 0246 9FA0 FFF1 OSWORD * &FFF1 ;More misc OS calls 0247 9FA0 FFD4 OSBPUT * &FFD4 ;Put bytes to file 0248 9FA0 FFD7 OSBGET * &FFD7 ;Get bytes from file 0249 9FA0 FFCE OSFIND * &FFCE ;Open file 0250 9FA0 FFF7 OSCLI * &FFF7 ;Execute command line 0251 9FA0 0252 9FA0 ;* OSBYTE call numbers * 0253 9FA0 0003 BYTESD * &03 ;Set OSWRCH destination 0254 9FA0 000F BYTECB * &0F ;Clear buffer 0255 9FA0 0077 BYTECS * &77 ;Close spool & exec files 0256 9FA0 0078 BYTECK * &78 ;Kill key 0257 9FA0 007A BYTEKS * &7A ;Keyboard scan 0258 9FA0 007E BYTEAE * &7E ;Acknowledge escape 0259 9FA0 0083 BYTEPA * &83 ;Get current page 0260 9FA0 0084 BYTETM * &84 ;Get top of memory 0261 9FA0 008E BYTESR * &8E ;Start language 0262 9FA0 008F BYTESC * &8F ;Do sideways call 0263 9FA0 00A8 BYTESV * &A8 ;Get address of sideways vectors 0264 9FA0 00BA BYTELR * &BA ;Find lang ROM ID 0265 9FA0 00C7 BYTESH * &C7 ;Get spool handle 0266 9FA0 00EA BYTETB * &EA ;Tube ? 0267 9FA0 00EC BYTEWD * &EC ;get Write Destination 0268 9FA0 00FF BYTESW * &FF ;Read switches 0269 9FA0 0270 9FA0 ;* Sideways reason codes * 0271 9FA0 0001 SWCIN1 * &01 ;Init 1st pass (claim static) 0272 9FA0 0002 SWCIN2 * &02 ;Init 2nd pass (claim dynamic) 0273 9FA0 0003 SWCIN3 * &03 ;Init 3rd pass (auto-boot) 0274 9FA0 0004 SWCLIN * &04 ;*Command passed 0275 9FA0 0008 SWCWRD * &08 ;Unknown OSWORD call 0276 9FA0 0009 SWCHLP * &09 ;HELP !! 0277 9FA0 000A SWCCME * &0A ;Claim memory 0278 9FA0 000B SWCRNM * &0B ;Release NMI 0279 9FA0 000C SWCCNM * &0C ;Claim NMI 0280 9FA0 000F SWCVCL * &0F ;I've claimed vectors 0281 9FA0 0012 SWCIFS * &12 ;Init filing system Y 0282 9FA0 0283 9FA0 ;* Device control addresses * 0284 9FA0 FE84 FDCD * &FE84 ;Data register (disk) 0285 9FA0 FE82 FDCRES * &FE82 ;Reset register 0286 9FA0 FE81 FDCR * &FE81 0287 9FA0 FE81 FDCP * &FE81 0288 9FA0 FE80 FDCC * &FE80 0289 9FA0 FE80 FDCS * &FE80 ;Status register (disk) 0290 9FA0 FEE5 TUBE * &FEE5 ;1 byte FIFO in tube 0291 9FA0 FE30 ROMSW * &FE30 ;ROM switching port 0292 9FA0 0293 9FA0 ;* Disk directory loaded in store from 0294 9FA0 ; $0E00 to $1000 * 0295 9FA0 ; 0296 9FA0 ;Directory info:- 0297 9FA0 ;DIRLOW + $00 ] $07: 1st 8 bytes title 0298 9FA0 ; + $08 ] $0F: 1st filename 0299 9FA0 ; + $10 ] $17: 2nd filename 0300 9FA0 ; + ... ] ...: n th filename 0301 9FA0 ; 0302 9FA0 ;DIRHIG + $00 ] $04: Last 5 bytes title 0303 9FA0 ; + $05 : No entries * 8 0304 9FA0 ; + $06 (0,1): Disk length (H) 0305 9FA0 ; (4,5): Boot option 0306 9FA0 ; + $07 : Disk length (L) 0307 9FA0 ; 0308 9FA0 ;CATHIG + $00 : Start addr (M) 0309 9FA0 ; + $01 : Start addr (L) 0310 9FA0 ; + $02 : Exec addr (M) 0311 9FA0 ; + $03 : (L) 0312 9FA0 ; + $04 : Length (M) 0313 9FA0 ; + $05 : Length (L) 0314 9FA0 ; + $06 (0,1): Start Sector (H) 0315 9FA0 ; (2,3): Start Addr (H) 0316 9FA0 ; (4,5): Length (H) 0317 9FA0 ; (6,7): Exec addr (H) 0318 9FA0 ; + $07 : Start sector (L) 0319 9FA0 0320 9FA0 0321 9FA0 0E00 DIRLOW * INTNMI + &0100 0322 9FA0 0E08 CATLOW * DIRLOW + &08 0323 9FA0 0E0F MODIFY * CATLOW + &07 0324 9FA0 0F00 DIRHIG * INTNMI + &0200 0325 9FA0 0F04 CYCNO * DIRHIG + &04 ;Directory cycle number 0326 9FA0 0F05 DIRLEN * DIRHIG + &05 0327 9FA0 0F06 OPTION * DIRHIG + &06 0328 9FA0 0F08 CATHIG * DIRHIG + &08 0329 9FA0 0330 9FA0 0331 9FA0 ;* Sequential file system workspace * 0332 9FA0 0333 9FA0 1100 SEQMAP * INTNMI + &0400 0334 9FA0 1109 SEQLL * SEQMAP + &09 ;Length (L) 0335 9FA0 110B SEQLM * SEQMAP + &0B ;Length (M) 0336 9FA0 110C SEQRDO * SEQMAP + &0C ;File read only bit 0337 9FA0 110D SEQLH * SEQMAP + &0D ;Length (H) Addr (H) 0338 9FA0 110E SEQLOK * SEQMAP + &0E ;Locked bit 0339 9FA0 110F SEQLOC * SEQMAP + &0F ;Disc addr (L) 0340 9FA0 1110 SEQPL * SEQMAP + &10 ;Seq pointer (L) 0341 9FA0 1111 SEQPM * SEQMAP + &11 ;Seq pointer (M) 0342 9FA0 1112 SEQPH * SEQMAP + &12 ;Seq pointer (H) 0343 9FA0 1113 SEQBUF * SEQMAP + &13 ;Buffer (H) 0344 9FA0 1114 SEQLLA * SEQMAP + &14 ;Length (L) 0345 9FA0 1115 SEQLMA * SEQMAP + &15 ;Length (M) 0346 9FA0 1116 SEQLHA * SEQMAP + &16 ;Length (H) 0347 9FA0 1117 SEQFLG * SEQMAP + &17 ;Flags & drive 0348 9FA0 1118 SEQEL * SEQMAP + &18 ;Always zero 0349 9FA0 1119 SEQEM * SEQMAP + &19 ;Extent (M) 0350 9FA0 111A SEQEH * SEQMAP + &1A ;Extent (H) 0351 9FA0 111B SEQBIT * SEQMAP + &1B ;DCBMAP bit 0352 9FA0 111C SEQDAL * SEQMAP + &1C ;Disc addr (L) 0353 9FA0 111D SEQDAH * SEQMAP + &1D ;Disc addr (H) 0354 9FA0 111E SEQUAL * SEQMAP + &1E ;Qualifer 0355 9FA0 111F SEQCHK * SEQMAP + &1F ;Checksum 0356 9FA0 0357 9FA0 0040 DFSIZE * &40 ;by default, files will be 64 sectors, 16Kbytes 0358 9FA0 000D CR * &0D 0359 9FA0 000A LF * &0A 0360 9FA0 0361 9FA0 ; ********************** 0362 9FA0 ; * END OF STORAGE MAP * 0363 9FA0 ; ********************** 0364 9FA0 0365 9FA0 TTL - DOS01 - Useful Subroutines 0366 9FA0 OPT &01 Acorn macro assembler Page 4 - DOS01 - Useful Subroutines 0367 9FA0 0368 9FA0 6C 1E 02 OSFSCM JMI &021E 0369 9FA3 0370 9FA3 20 B8 9F DSKMSG JSR ESTRNG 0371 9FA6 00 44 69 = &00,"Disk " 0372 9FAC 90 21 BCC GSTRNG 0373 9FAE 0374 9FAE 20 B8 9F ILLMSG JSR ESTRNG 0375 9FB1 00 42 61 = &00,"Bad " 0376 9FB6 90 17 BCC GSTRNG 0377 9FB8 0378 9FB8 ;**********FILMSG JSR ESTRNG 0379 9FB8 ;********** = $00,"File " 0380 9FB8 ;********** BCC GSTRNG ;********** HMT 0381 9FB8 0382 9FB8 ;Print string for error handling 0383 9FB8 ;Inserts error number 0384 9FB8 AD DD 10 ESTRNG LDA SEQSEM 0385 9FBB D0 03 BNE ESTRN1 0386 9FBD 20 C8 B0 JSR HMTSPE 0387 9FC0 A9 FF ESTRN1 LDAIM &FF 0388 9FC2 8D 82 10 STA CATDRV ; Invalidate old catalog for DFS0.9W 0389 9FC5 8D DD 10 STA SEQSEM 0390 9FC8 ; Alternate entry for if I'm not the current FS 0391 9FC8 A2 02 FSTRNG LDXIM &02 0392 9FCA A9 00 LDAIM &00 0393 9FCC 8D 00 01 STA ERRBUF 0394 9FCF 85 B3 GSTRNG STA ITEMP 0395 9FD1 68 PLA ;Get return address 0396 9FD2 85 AE STA PTEMP 0397 9FD4 68 PLA 0398 9FD5 85 AF STA PTEMP + &01 0399 9FD7 A5 B3 LDA ITEMP 0400 9FD9 A0 00 LDYIM &00 0401 9FDB 20 20 A3 JSR TMPINC 0402 9FDE B1 AE LDAIY PTEMP 0403 9FE0 8D 01 01 STA ERRBUF + &01 0404 9FE3 CA DEX 0405 9FE4 20 20 A3 ESTRN0 JSR TMPINC 0406 9FE7 E8 INX 0407 9FE8 B1 AE LDAIY PTEMP 0408 9FEA 9D 00 01 STAAX ERRBUF 0409 9FED 30 27 BMI VSTRNR 0410 9FEF D0 F3 BNE ESTRN0 0411 9FF1 20 FF A6 JSR RELTUB ;Release tube 0412 9FF4 4C 00 01 JMP ERRBUF 0413 9FF7 0414 9FF7 ;General purpose print string 0415 9FF7 85 B3 VSTRNG STA ITEMP 0416 9FF9 68 PLA ;Get return address 0417 9FFA 85 AE STA PTEMP 0418 9FFC 68 PLA 0419 9FFD 85 AF STA PTEMP + &01 0420 9FFF A5 B3 LDA ITEMP 0421 A001 48 PHA 0422 A002 98 TYA 0423 A003 48 PHA 0424 A004 A0 00 LDYIM &00 0425 A006 20 20 A3 VSTRLP JSR TMPINC 0426 A009 B1 AE LDAIY PTEMP 0427 A00B 30 06 BMI VSTRNX 0428 A00D 20 1F A0 JSR PCHR 0429 A010 4C 06 A0 JMP VSTRLP 0430 A013 68 VSTRNX PLA 0431 A014 A8 TAY 0432 A015 68 PLA 0433 A016 18 VSTRNR CLC 0434 A017 6C AE 00 JMI PTEMP 0435 A01A 0436 A01A ;Print digit and dot 0437 A01A 20 40 A0 DPDOT JSR DIGOUT 0438 A01D 0439 A01D ;Print dot 0440 A01D A9 2E PDOT LDAIM "." 0441 A01F 0442 A01F ;Print char but not to spool 0443 A01F 20 27 A3 PCHR JSR SAVITA 0444 A022 48 PHA 0445 A023 A9 EC LDAIM BYTEWD 0446 A025 20 A6 B9 JSR READBY 0447 A028 8A TXA 0448 A029 48 PHA 0449 A02A 09 10 ORAIM &10 0450 A02C 20 94 B9 JSR WRIWDE 0451 A02F 68 PLA 0452 A030 AA TAX 0453 A031 68 PLA 0454 A032 20 E3 FF JSR OSASCI 0455 A035 4C 95 B9 JMP WRIWDX 0456 A038 0457 A038 ; BYTOUT PRINTS 2 HEX DIGITS 0458 A038 ; TO GIVE THE VALUE OF A. 0459 A038 48 BYTOUT PHA 0460 A039 20 38 A1 JSR SFOUR 0461 A03C 20 40 A0 JSR DIGOUT 0462 A03F 68 PLA 0463 A040 ; DIGOUT PRINTS LOWER 4 BITS OF 0464 A040 ; A AS A HEX DIGIT. 0465 A040 20 45 A0 DIGOUT JSR DIGUT1 0466 A043 D0 DA BNE PCHR ;********** Always ********* HMT 0467 A045 0468 A045 29 0F DIGUT1 ANDIM &0F 0469 A047 C9 0A CMPIM &0A 0470 A049 90 02 BCC DIGOT0 0471 A04B 69 06 ADCIM &06 0472 A04D 69 30 DIGOT0 ADCIM &30 0473 A04F 60 RTS 0474 A050 0475 A050 ;Shift both high and low bytes 0476 A050 20 60 A0 SHFTBO JSR SHFTTW 0477 A053 CA DEX 0478 A054 CA DEX 0479 A055 0480 A055 ;Shift two high bytes 0481 A055 20 58 A0 JSR SHFTT0 0482 A058 B1 B0 SHFTT0 LDAIY TEMP 0483 A05A 9D 72 10 STAAX HIWORK - &02 0484 A05D E8 INX 0485 A05E C8 INY 0486 A05F 60 RTS 0487 A060 Acorn macro assembler Page 5 - DOS01 - Useful Subroutines 0488 A060 ;Shift two bytes from old FCB to WORK 0489 A060 20 63 A0 SHFTTW JSR SHFTON 0490 A063 B1 B0 SHFTON LDAIY TEMP 0491 A065 95 BA STAZX WORK 0492 A067 E8 INX 0493 A068 C8 INY 0494 A069 60 RTS 0495 A06A 0496 A06A 20 C3 A9 GETNAM JSR SETDEF 0497 A06D 4C 80 A0 JMP GETNM0 0498 A070 0499 A070 20 C3 A9 FRMNAM JSR SETDEF 0500 A073 A5 BA FRMNM1 LDA WORK 0501 A075 85 F2 STA LINPTR 0502 A077 A5 BB LDA WORK + &01 0503 A079 85 F3 STA LINPTR + &01 0504 A07B A0 00 LDYIM &00 0505 A07D 20 F1 A5 JSR SETUPR 0506 A080 A2 20 GETNM0 LDXIM " " 0507 A082 20 C9 A0 JSR RDCHR 0508 A085 B0 1E BCS NAMERR 0509 A087 8D 00 10 STA BUFFER 0510 A08A C9 2E CMPIM "." 0511 A08C D0 04 BNE GETNM1 0512 A08E 86 CC GETNM2 STX QUALIF 0513 A090 F0 EE BEQ GETNM0 ;-Always- 0514 A092 C9 3A GETNM1 CMPIM ":" 0515 A094 D0 18 BNE GETNM3 0516 A096 20 D3 A9 JSR GETDRV 0517 A099 20 99 A6 JSR DODRIV 0518 A09C 20 C9 A0 JSR RDCHR 0519 A09F B0 04 BCS NAMERR 0520 A0A1 ;*********** LDXIM MASQUA ; HMT 0521 A0A1 C9 2E CMPIM "." 0522 A0A3 F0 DB BEQ GETNM0 ; If just :0.filename leave the Qual HMT 0523 A0A5 0524 A0A5 20 AE 9F NAMERR JSR ILLMSG 0525 A0A8 CC 6E 61 = FNANUM,"name",&00 0526 A0AE AA GETNM3 TAX ; Good qualifier in X 0527 A0AF 20 C9 A0 JSR RDCHR 0528 A0B2 B0 29 BCS GETNM4 0529 A0B4 C9 2E CMPIM "." 0530 A0B6 F0 D6 BEQ GETNM2 0531 A0B8 A2 01 LDXIM &01 0532 A0BA 9D 00 10 GETNM5 STAAX BUFFER 0533 A0BD E8 INX 0534 A0BE 20 C9 A0 JSR RDCHR 0535 A0C1 B0 1C BCS GETNM6 0536 A0C3 E0 07 CPXIM &07 ; **** trap long names ****** HMT 0537 A0C5 D0 F3 BNE GETNM5 0538 A0C7 F0 DC BEQ NAMERR ;-Always- 0539 A0C9 0540 A0C9 0541 A0C9 ;************************************ 0542 A0C9 ; Modified RDCHR to check for control character 0543 A0C9 ;************************************ HMT 0544 A0C9 0545 A0C9 20 C5 FF RDCHR JSR &FFC5 ; The pseudo legal MOS entry 0546 A0CC 08 PHP 0547 A0CD 29 7F ANDIM &7F 0548 A0CF C9 0D CMPIM &0D ;** Char $8D is specified as legal char in filenames 0549 A0D1 F0 08 BEQ RDCHOK ;** Jes 8/2/84 ** 0550 A0D3 0551 A0D3 C9 20 CMPIM &20 0552 A0D5 90 CE BCC NAMERR 0553 A0D7 0554 A0D7 C9 7F CMPIM &7F 0555 A0D9 F0 CA BEQ NAMERR 0556 A0DB 0557 A0DB 28 RDCHOK PLP 0558 A0DC 60 RTS 0559 A0DD 0560 A0DD ;************************************ 0561 A0DD 0562 A0DD A2 01 GETNM4 LDXIM &01 0563 A0DF A9 20 GETNM6 LDAIM " " 0564 A0E1 9D 00 10 GETNM7 STAAX BUFFER 0565 A0E4 E8 INX 0566 A0E5 E0 40 CPXIM &40 0567 A0E7 D0 F8 BNE GETNM7 0568 A0E9 0569 A0E9 ;Copy filename into WORK + $0B 0570 A0E9 A2 06 COPNAM LDXIM &06 0571 A0EB BD 00 10 CLRNM0 LDAAX BUFFER 0572 A0EE 95 C5 STAZX WORK + &0B 0573 A0F0 CA DEX 0574 A0F1 10 F8 BPL CLRNM0 0575 A0F3 60 CLRNM1 RTS 0576 A0F4 0577 A0F4 ;Print name of file for things with 0578 A0F4 ; queries. 0579 A0F4 20 27 A3 PRTNAM JSR SAVITA 0580 A0F7 B9 0F 0E LDAAY MODIFY 0581 A0FA 08 PHP 0582 A0FB 29 7F ANDIM &7F 0583 A0FD D0 05 BNE PTNAM2 0584 A0FF 20 A6 BF JSR PDSPC 0585 A102 F0 06 BEQ PTNAM3 0586 A104 20 1F A0 PTNAM2 JSR PCHR 0587 A107 20 1D A0 JSR PDOT 0588 A10A A2 06 PTNAM3 LDXIM &06 0589 A10C B9 08 0E PTNAM0 LDAAY CATLOW 0590 A10F 29 7F ANDIM &7F 0591 A111 20 1F A0 JSR PCHR 0592 A114 C8 INY 0593 A115 CA DEX 0594 A116 10 F4 BPL PTNAM0 0595 A118 20 A6 BF JSR PDSPC 0596 A11B A9 20 LDAIM " " 0597 A11D 28 PLP 0598 A11E 10 02 BPL PTNAM1 0599 A120 A9 4C LDAIM "L" 0600 A122 20 1F A0 PTNAM1 JSR PCHR 0601 A125 A0 01 LDYIM &01 ;Print 1 space 0602 A127 0603 A127 ;Prints Y spaces 0604 A127 20 A9 BF YSPACE JSR PSPACE 0605 A12A 88 DEY 0606 A12B D0 FA BNE YSPACE 0607 A12D 60 RTS 0608 A12E Acorn macro assembler Page 6 - DOS01 - Useful Subroutines 0609 A12E 4A ISOEXE LSRA ;Isolate exec addr 0610 A12F 4A LSRA 0611 A130 4A ISOLEN LSRA ;Isolate length addr 0612 A131 4A LSRA 0613 A132 4A ISOLOD LSRA ;Isolate load addr 0614 A133 4A LSRA 0615 A134 29 03 ANDIM &03 0616 A136 60 RTS 0617 A137 0618 A137 ;Shift right A four or five times 0619 A137 4A SFIVE LSRA 0620 A138 4A SFOUR LSRA 0621 A139 4A LSRA 0622 A13A 4A LSRA 0623 A13B 4A LSRA 0624 A13C 60 RTS 0625 A13D 0626 A13D ;Shift left A four or five times 0627 A13D 0A LFIVE ASLA 0628 A13E 0A LFOUR ASLA 0629 A13F 0A ASLA 0630 A140 0A ASLA 0631 A141 0A ASLA 0632 A142 60 RTS 0633 A143 0634 A143 0635 A143 0636 A143 A5 BC ATOT LDA WORK + &02 0637 A145 85 A6 STA RAMADR 0638 A147 A5 BD LDA WORK + &03 0639 A149 85 A7 STA RAMADR + &01 0640 A14B A9 FF LDAIM &FF 0641 A14D 85 CE STA TRACK 0642 A14F A6 C1 LDX WORK + &07 0643 A151 E8 INX 0644 A152 86 A4 STX READNO + &01 0645 A154 A5 C2 LDA WORK + &08 0646 A156 20 30 A1 JSR ISOLEN 0647 A159 85 A5 STA READNO + &02 0648 A15B E6 A5 INC READNO + &02 0649 A15D A5 C0 LDA WORK + &06 0650 A15F 85 A3 STA READNO 0651 A161 D0 06 BNE ATOT0 0652 A163 C6 A4 DEC READNO + &01 0653 A165 D0 02 BNE ATOT0 0654 A167 C6 A5 DEC READNO + &02 0655 A169 A5 C2 ATOT0 LDA WORK + &08 0656 A16B 29 03 ANDIM &03 0657 A16D AA TAX 0658 A16E A5 C3 LDA WORK + &09 0659 A170 38 TRSCA SEC 0660 A171 E6 CE TRSCB INC TRACK 0661 A173 E9 0A SBCIM &0A 0662 A175 B0 FA BCS TRSCB 0663 A177 CA DEX 0664 A178 10 F6 BPL TRSCA 0665 A17A 69 0A ADCIM &0A 0666 A17C 85 CF STA SECTOR 0667 A17E 60 LOKSUC RTS 0668 A17F 0669 A17F 20 6A A0 GETLOK JSR GETNAM 0670 A182 30 03 BMI ERRLOK ;-Always- 0671 A184 0672 A184 20 70 A0 FRMLOK JSR FRMNAM 0673 A187 20 C3 A1 ERRLOK JSR LOOKUP 0674 A18A B0 F2 BCS LOKSUC 0675 A18C 0676 A18C 20 C8 9F NOFIL JSR FSTRNG 0677 A18F D6 4E 6F = NOFNUM,"Not found",&00 0678 A19A 0679 A19A 20 04 B8 INFO JSR SETWLD 0680 A19D 20 61 BA JSR CHKSYN 0681 A1A0 20 7F A1 JSR GETLOK 0682 A1A3 20 79 A2 INFO0 JSR PRTINF 0683 A1A6 20 BF A1 JSR NEXT 0684 A1A9 B0 F8 BCS INFO0 0685 A1AB 60 RTS 0686 A1AC 0687 A1AC A2 06 LOOKW LDXIM &06 0688 A1AE B5 C5 LOOKW0 LDAAX WORK + &0B 0689 A1B0 9D 58 10 STAAX TMPNAM 0690 A1B3 CA DEX 0691 A1B4 10 F8 BPL LOOKW0 0692 A1B6 A9 20 LDAIM " " 0693 A1B8 8D 5F 10 STA TMPNAM + &07 0694 A1BB A9 58 LDAIM TMPNAM 0695 A1BD D0 06 BNE LOOKUX ;-Always- 0696 A1BF 0697 A1BF A2 00 NEXT LDXIM &00 0698 A1C1 F0 10 BEQ NEXT0 ; Always 0699 A1C3 0700 A1C3 A9 00 LOOKUP LDAIM &00 0701 A1C5 48 LOOKUX PHA 0702 A1C6 20 5F AA JSR DIRLD 0703 A1C9 68 PLA 0704 A1CA AA TAX 0705 A1CB A9 0E LDAIM /(DIRLOW ) 0706 A1CD 85 B7 STA VTEMP + &01 0707 A1CF A9 00 LDAIM &00 0708 A1D1 85 B6 STA VTEMP 0709 A1D3 A0 00 NEXT0 LDYIM &00 0710 A1D5 A5 B6 LDA VTEMP 0711 A1D7 CD 05 0F CMP DIRLEN 0712 A1DA B0 49 BCS MATCHF 0713 A1DC 69 08 ADCIM &08 0714 A1DE 85 B6 STA VTEMP 0715 A1E0 20 FA A1 JSR MATCHS 0716 A1E3 90 EE BCC NEXT0 0717 A1E5 A5 CC LDA QUALIF ;Check qualifier 0718 A1E7 A0 07 LDYIM &07 0719 A1E9 20 27 A2 JSR CPCHAR 0720 A1EC D0 E5 BNE NEXT0 0721 A1EE A4 B6 LDY VTEMP 0722 A1F0 38 SEC 0723 A1F1 0724 A1F1 ; UNSTEP DECREMENTS Y BY 8. 0725 A1F1 ; INVERSE OF STEP 0726 A1F1 0727 A1F1 88 UNSTEP DEY 0728 A1F2 88 DEY 0729 A1F3 88 DEY Acorn macro assembler Page 7 - DOS01 - Useful Subroutines 0730 A1F4 88 DEY 0731 A1F5 88 DEY 0732 A1F6 88 DEY 0733 A1F7 88 DEY 0734 A1F8 88 DEY 0735 A1F9 60 RTS 0736 A1FA 0737 A1FA 20 27 A3 MATCHS JSR SAVITA 0738 A1FD BD 00 10 MATCH1 LDAAX BUFFER 0739 A200 0740 A200 CD CE 10 CMP DASHOP 0741 A203 D0 13 BNE MATCH4 0742 A205 E8 INX 0743 A206 20 FA A1 MATCH6 JSR MATCHS 0744 A209 B0 1B BCS MATCHR 0745 A20B C8 INY 0746 A20C C0 07 CPYIM &07 0747 A20E 90 F6 BCC MATCH6 0748 A210 0749 A210 ;*************** so *XABC doesnt match RSTUVWX 0750 A210 BD 00 10 MATHMT LDAAX BUFFER 0751 A213 C9 20 CMPIM " " 0752 A215 D0 0E BNE MATCHF 0753 A217 60 RTS 0754 A218 C0 07 MATCH4 CPYIM &07 0755 A21A B0 F4 BCS MATHMT 0756 A21C 20 27 A2 JSR CPCHAR 0757 A21F ; *************** HMT 0758 A21F D0 04 BNE MATCHF 0759 A221 0760 A221 E8 MATCH5 INX 0761 A222 C8 INY 0762 A223 D0 D8 BNE MATCH1 0763 A225 ; *************** HMT 0764 A225 0765 A225 18 MATCHF CLC 0766 A226 60 MATCHR RTS 0767 A227 0768 A227 ;Compare A with (VTEMP),Y 0769 A227 CD CE 10 CPCHAR CMP DASHOP 0770 A22A F0 10 BEQ CPRET 0771 A22C CD CD 10 CMP WILDCH 0772 A22F F0 0B BEQ CPRET 0773 A231 20 66 A2 JSR CAPS 0774 A234 51 B6 EORIY VTEMP 0775 A236 B0 02 BCS CPCHR0 0776 A238 29 5F ANDIM &5F 0777 A23A 29 7F CPCHR0 ANDIM &7F 0778 A23C 60 CPRET RTS 0779 A23D 0780 A23D ;Set A to capitals 0781 A23D 08 SETCAP PHP 0782 A23E 20 66 A2 JSR CAPS 0783 A241 B0 02 BCS SCAP0 0784 A243 29 5F ANDIM &5F 0785 A245 29 7F SCAP0 ANDIM &7F 0786 A247 28 PLP 0787 A248 60 RTS 0788 A249 0789 A249 0790 A249 ;Delete file from directory 0791 A249 20 B8 B8 DELFIL JSR CHKOPL 0792 A24C B9 10 0E DELLOP LDAAY CATLOW + &08 0793 A24F 99 08 0E STAAY CATLOW 0794 A252 B9 10 0F LDAAY CATHIG + &08 0795 A255 99 08 0F STAAY CATHIG 0796 A258 C8 INY 0797 A259 CC 05 0F CPY DIRLEN 0798 A25C 90 EE BCC DELLOP 0799 A25E 98 TYA 0800 A25F E9 08 SBCIM &08 0801 A261 8D 05 0F STA DIRLEN 0802 A264 18 LOOKX CLC 0803 A265 60 INFRTS RTS 0804 A266 0805 A266 ;Is it a letter ? 0806 A266 ; C = 0 => letter 0807 A266 ; C = 1 => NOT letter 0808 A266 48 CAPS PHA 0809 A267 29 5F ANDIM &5F 0810 A269 C9 41 CMPIM "A" 0811 A26B 90 04 BCC CAPS0 0812 A26D C9 5B CMPIM "Z" + &01 0813 A26F 90 01 BCC CAPS1 0814 A271 38 CAPS0 SEC 0815 A272 68 CAPS1 PLA 0816 A273 60 RTS 0817 A274 0818 A274 ;Print info if MONFLG is set 0819 A274 2C C6 10 INFORM BIT MONFLG 0820 A277 30 EC BMI INFRTS 0821 A279 0822 A279 ;Print catalog info about file 0823 A279 20 27 A3 PRTINF JSR SAVITA 0824 A27C 20 F4 A0 JSR PRTNAM ;Print name 0825 A27F 98 TYA 0826 A280 48 PHA 0827 A281 A9 60 LDAIM DOSRAM ;Set up tempory space 0828 A283 85 B0 STA TEMP 0829 A285 A9 10 LDAIM /(DOSRAM ) 0830 A287 85 B1 STA TEMP + &01 0831 A289 20 C8 A2 JSR CHUKBK ;Read cat info 0832 A28C A0 02 LDYIM &02 0833 A28E 20 A9 BF JSR PSPACE 0834 A291 20 B0 A2 JSR PRTIN0 ;Print start addr 0835 A294 20 B0 A2 JSR PRTIN0 ;Print exec addr 0836 A297 20 B0 A2 JSR PRTIN0 ;Print length 0837 A29A 68 PLA 0838 A29B A8 TAY 0839 A29C B9 0E 0F LDAAY CATHIG + &06 ;Print start sec 0840 A29F 29 03 ANDIM &03 0841 A2A1 20 40 A0 JSR DIGOUT 0842 A2A4 B9 0F 0F LDAAY CATHIG + &07 0843 A2A7 20 38 A0 JSR BYTOUT 0844 A2AA 20 B6 BC JSR PCRLF 0845 A2AD 4C 31 AB JMP DRVSEL ; In case the drive has stopped due to CTRL-N 0846 A2B0 ;*****************************HMT 0847 A2B0 0848 A2B0 ;Prints 3 bytes from TMPCIN + Y 0849 A2B0 A2 03 PRTIN0 LDXIM &03 0850 A2B2 B9 62 10 PRTIN1 LDAAY DOSRAM + &02 Acorn macro assembler Page 8 - DOS01 - Useful Subroutines 0851 A2B5 20 38 A0 JSR BYTOUT 0852 A2B8 88 DEY 0853 A2B9 CA DEX 0854 A2BA D0 F6 BNE PRTIN1 0855 A2BC 20 7D A6 JSR STEP7 0856 A2BF 4C A9 BF JMP PSPACE 0857 A2C2 0858 A2C2 ;Get directory from disk 0859 A2C2 20 27 A3 GETDIR JSR SAVITA 0860 A2C5 4C 6B AA JMP DIRLDY 0861 A2C8 0862 A2C8 ;Chucks directory info back into a FCB 0863 A2C8 ;whose address is in TEMP - and a pain 0864 A2C8 ;it is too. 0865 A2C8 20 27 A3 CHUKBK JSR SAVITA 0866 A2CB 98 TYA ;Move Y to X as I need 0867 A2CC 48 PHA ;Y for IYing 0868 A2CD AA TAX 0869 A2CE A0 12 LDYIM &12 ;Clear FCB to start with 0870 A2D0 A9 00 LDAIM &00 0871 A2D2 88 CHUKB7 DEY 0872 A2D3 91 B0 STAIY TEMP 0873 A2D5 C0 02 CPYIM &02 0874 A2D7 D0 F9 BNE CHUKB7 0875 A2D9 20 15 A3 CHUKB5 JSR CHUKB4 ;Move in obvious bits 0876 A2DC C8 INY 0877 A2DD C8 INY 0878 A2DE C0 0E CPYIM &0E 0879 A2E0 D0 F7 BNE CHUKB5 0880 A2E2 68 PLA 0881 A2E3 AA TAX ;Move in attribute (L) 0882 A2E4 BD 0F 0E LDAAX CATLOW + &07 0883 A2E7 10 04 BPL CHUKB3 0884 A2E9 A9 08 LDAIM &08 ;Locked 0885 A2EB 91 B0 STAIY TEMP ;Y=$0E already 0886 A2ED BD 0E 0F CHUKB3 LDAAX CATHIG + &06 0887 A2F0 A0 04 LDYIM &04 ;Move in high bytes 0888 A2F2 20 01 A3 JSR CHUKB1 ; Start addr 0889 A2F5 A0 0C LDYIM &0C 0890 A2F7 4A LSRA ;Length 0891 A2F8 4A LSRA 0892 A2F9 48 PHA 0893 A2FA 29 03 ANDIM &03 0894 A2FC 91 B0 STAIY TEMP 0895 A2FE 68 PLA 0896 A2FF A0 08 LDYIM &08 ;Exec address 0897 A301 0898 A301 ;Moves and fills in $FFs if required 0899 A301 4A CHUKB1 LSRA 0900 A302 4A LSRA 0901 A303 48 PHA 0902 A304 29 03 ANDIM &03 0903 A306 91 B0 STAIY TEMP 0904 A308 C9 03 CMPIM &03 ;If 3 assume means $FFFF 0905 A30A D0 07 BNE CHUKB2 0906 A30C A9 FF LDAIM &FF 0907 A30E 91 B0 STAIY TEMP 0908 A310 C8 INY 0909 A311 91 B0 STAIY TEMP 0910 A313 68 CHUKB2 PLA 0911 A314 60 RTS 0912 A315 0913 A315 ;Moves 2 bytes from dir to FCB 0914 A315 20 18 A3 CHUKB4 JSR CHUKB6 0915 A318 BD 08 0F CHUKB6 LDAAX CATHIG 0916 A31B 91 B0 STAIY TEMP 0917 A31D E8 INX 0918 A31E C8 INY 0919 A31F 60 RTS 0920 A320 0921 A320 ;Increment TEMP 0922 A320 E6 AE TMPINC INC PTEMP 0923 A322 D0 02 BNE TMPIN0 0924 A324 E6 AF INC PTEMP + &01 0925 A326 60 TMPIN0 RTS 0926 A327 0927 A327 ;Save A,X,Y so that on a RET they get 0928 A327 ; restored. 0929 A327 48 SAVITA PHA 0930 A328 8A TXA 0931 A329 48 PHA 0932 A32A 98 TYA 0933 A32B 48 PHA 0934 A32C A9 A3 LDAIM /(SAVRTA - &01 ) 0935 A32E 48 PHA 0936 A32F A9 49 LDAIM SAVRTA - &01 0937 A331 48 PHA 0938 A332 A0 05 SAVIT0 LDYIM &05 ;Copy the RetAddr,A,X,Y block 0939 A334 BA SAVIT1 TSX 0940 A335 BD 07 01 LDAAX &107 0941 A338 48 PHA 0942 A339 88 DEY 0943 A33A D0 F8 BNE SAVIT1 0944 A33C A0 0A LDYIM &0A ;Shift all down two 0945 A33E BD 09 01 SAVIT2 LDAAX &109 0946 A341 9D 0B 01 STAAX &10B 0947 A344 CA DEX 0948 A345 88 DEY 0949 A346 D0 F6 BNE SAVIT2 0950 A348 68 PLA ;Knock off two excess layers 0951 A349 68 PLA ;And drop thro' 0952 A34A 0953 A34A ;Return which restores A 0954 A34A 68 SAVRTA PLA 0955 A34B A8 TAY 0956 A34C 68 PLA 0957 A34D AA TAX 0958 A34E 68 PLA 0959 A34F 60 RTS 0960 A350 0961 A350 ;Saves X and Y only 0962 A350 48 SAVIT PHA 0963 A351 8A TXA 0964 A352 48 PHA 0965 A353 98 TYA 0966 A354 48 PHA 0967 A355 20 32 A3 JSR SAVIT0 0968 A358 0969 A358 ;Keep A 0970 A358 BA TSX 0971 A359 9D 03 01 STAAX &103 Acorn macro assembler Page 9 - DOS01 - Useful Subroutines 0972 A35C 4C 4A A3 JMP SAVRTA 0973 A35F 0974 A35F 0975 A35F 0976 A35F LNK DOS02 0001 A35F ;*** File Two *** > DOS02 0002 A35F TTL - DOS02 - Command Line Interpreter 0003 A35F OPT &01 0004 A35F ;* CLI * 0005 A35F 0006 A35F 20 EA A5 WDCAT JSR STXYLP 0007 A362 20 5C AA JSR DIR 0008 A365 A0 FF LDYIM &FF 0009 A367 84 A8 STY LINNO 0010 A369 C8 INY 0011 A36A 84 AA STY UTEMP ;Qualifier 0012 A36C 0013 A36C ;Print title 0014 A36C B9 00 0E CAT8 LDAAY DIRLOW 0015 A36F C0 08 CPYIM &08 0016 A371 90 03 BCC CAT9 0017 A373 B9 F8 0E LDAAY DIRHIG - &08 0018 A376 20 1F A0 CAT9 JSR PCHR 0019 A379 C8 INY 0020 A37A C0 0C CPYIM &0C 0021 A37C D0 EE BNE CAT8 0022 A37E 0023 A37E ;Print cycle number 0024 A37E 20 F7 9F JSR VSTRNG 0025 A381 20 28 = " (" 0026 A383 AD 04 0F LDA CYCNO 0027 A386 20 38 A0 JSR BYTOUT 0028 A389 0029 A389 ;Print drive number 0030 A389 20 F7 9F JSR VSTRNG 0031 A38C 29 0D = ")",CR 0032 A38E 44 72 69 = "Drive " 0033 A394 A5 CD LDA FDRIVE 0034 A396 20 40 A0 JSR DIGOUT 0035 A399 0036 A399 ;Print option 0037 A399 A0 0D LDYIM &0D 0038 A39B 20 27 A1 JSR YSPACE 0039 A39E 20 F7 9F JSR VSTRNG 0040 A3A1 4F 70 74 = "Option " 0041 A3A8 AD 06 0F LDA OPTION 0042 A3AB 20 38 A1 JSR SFOUR 0043 A3AE 48 PHA ;**************** HMT 0044 A3AF 20 40 A0 JSR DIGOUT ;Print number 0045 A3B2 20 F7 9F JSR VSTRNG 0046 A3B5 20 28 = " (" 0047 A3B7 A0 03 LDYIM &03 0048 A3B9 68 PLA ;**************** HMT 0049 A3BA 0A ASLA ;Get offset in text 0050 A3BB 0A ASLA 0051 A3BC AA TAX 0052 A3BD BD A9 A4 CAT5 LDAAX OPTTBL 0053 A3C0 20 1F A0 JSR PCHR ;Print text 0054 A3C3 E8 INX 0055 A3C4 88 DEY 0056 A3C5 10 F6 BPL CAT5 0057 A3C7 0058 A3C7 ;Print directory 0059 A3C7 20 F7 9F JSR VSTRNG 0060 A3CA 29 0D 44 = ")",CR,"Dir. :" 0061 A3D2 AD CA 10 LDA DEFDSK 0062 A3D5 20 1A A0 JSR DPDOT 0063 A3D8 AD C9 10 LDA DEFQUA 0064 A3DB 20 1F A0 JSR PCHR 0065 A3DE 0066 A3DE ;Print library 0067 A3DE A0 0B LDYIM &06+&05 0068 A3E0 20 27 A1 JSR YSPACE 0069 A3E3 20 F7 9F JSR VSTRNG 0070 A3E6 4C 69 62 = "Lib. :" 0071 A3EC AD CC 10 LDA LIBDSK 0072 A3EF 20 1A A0 JSR DPDOT 0073 A3F2 AD CB 10 LDA LIBQUA 0074 A3F5 20 1F A0 JSR PCHR 0075 A3F8 20 B6 BC JSR PCRLF 0076 A3FB 0077 A3FB A0 00 LDYIM &00 0078 A3FD CC 05 0F CAT0 CPY DIRLEN 0079 A400 B0 17 BCS CATSCN 0080 A402 B9 0F 0E LDAAY MODIFY 0081 A405 4D C9 10 EOR DEFQUA 0082 A408 ;************************************** 0083 A408 ; Is this the fix for LC quals? HMT 0084 A408 29 5F ANDIM &5F 0085 A40A ; However it must still be ANDIM $7F (?) so no saving 0086 A40A ;************************************** 0087 A40A D0 08 BNE CAT1 0088 A40C B9 0F 0E LDAAY MODIFY 0089 A40F 29 80 ANDIM &80 0090 A411 99 0F 0E STAAY MODIFY 0091 A414 20 7C A6 CAT1 JSR STEP 0092 A417 90 E4 BCC CAT0 ;Carry IS clear !! 0093 A419 A0 00 CATSCN LDYIM &00 0094 A41B 20 2B A4 JSR FINDIR ; FIND DIR ENTRY THAT 0095 A41E ; HAS NOT BEEN MARKED 0096 A41E 90 16 BCC NEWBST ; NEW BEST ENTRY 0097 A420 A9 FF LDAIM &FF ;Force catalogue read next 0098 A422 8D 82 10 STA CATDRV 0099 A425 4C B6 BC JMP PCRLF 0100 A428 0101 A428 ;FINDIR FINDS AN ENTRY IN THE 0102 A428 ;CATALOG THAT HAS NOT BEEN 0103 A428 ;MARKED NEGATIVE IN ITS 1ST 0104 A428 ;BYTE 0105 A428 20 7C A6 NXTCAT JSR STEP 0106 A42B CC 05 0F FINDIR CPY DIRLEN 0107 A42E B0 05 BCS FINDX 0108 A430 B9 08 0E LDAAY CATLOW 0109 A433 30 F3 BMI NXTCAT 0110 A435 60 FINDX RTS ; C=0 IF OK 0111 A436 0112 A436 84 AB NEWBST STY LTEMP 0113 A438 A2 00 LDXIM &00 0114 A43A B9 08 0E CATLOP LDAAY CATLOW 0115 A43D 20 3D A2 JSR SETCAP 0116 A440 9D 60 10 STAAX DOSRAM Acorn macro assembler Page 10 - DOS02 - Command Line Interpreter 0117 A443 C8 INY 0118 A444 E8 INX 0119 A445 E0 08 CPXIM &08 0120 A447 D0 F1 BNE CATLOP 0121 A449 20 2B A4 CATTRY JSR FINDIR 0122 A44C B0 23 BCS SCAND ; ONE SCAN COMPLETE 0123 A44E 38 SEC 0124 A44F A2 06 LDXIM &06 0125 A451 B9 0E 0E CATSBC LDAAY CATLOW + &06 0126 A454 20 3D A2 JSR SETCAP 0127 A457 FD 60 10 SBCAX DOSRAM 0128 A45A 88 DEY 0129 A45B CA DEX 0130 A45C 10 F3 BPL CATSBC 0131 A45E 20 7D A6 JSR STEP7 ;Restore Y 0132 A461 B9 0F 0E LDAAY MODIFY ;Get qualifier 0133 A464 20 3D A2 JSR SETCAP 0134 A467 ED 67 10 SBC DOSRAM + &07 0135 A46A ;NOW C=1 IF NEW ENTRY >= OLD 0136 A46A 90 CA BCC NEWBST 0137 A46C 20 7C A6 JSR STEP 0138 A46F B0 D8 BCS CATTRY 0139 A471 0140 A471 A4 AB SCAND LDY LTEMP 0141 A473 B9 08 0E LDAAY CATLOW 0142 A476 09 80 ORAIM &80 0143 A478 99 08 0E STAAY CATLOW ;Mark it as used 0144 A47B AD 67 10 LDA DOSRAM + &07 ;Qualifier 0145 A47E C5 AA CMP UTEMP 0146 A480 F0 10 BEQ SAMEQ 0147 A482 A6 AA LDX UTEMP 0148 A484 85 AA STA UTEMP 0149 A486 D0 0A BNE SAMEQ 0150 A488 20 B6 BC JSR PCRLF 0151 A48B 20 B6 BC CAT3 JSR PCRLF 0152 A48E A0 FF LDYIM &FF 0153 A490 D0 09 BNE FIRSTC 0154 A492 A4 A8 SAMEQ LDY LINNO ;Line used once flag 0155 A494 D0 F5 BNE CAT3 ;Line empty so far 0156 A496 A0 05 LDYIM &05 0157 A498 20 27 A1 JSR YSPACE ;Leaves Y=0 0158 A49B C8 FIRSTC INY 0159 A49C 84 A8 STY LINNO 0160 A49E A4 AB LDY LTEMP 0161 A4A0 20 A6 BF JSR PDSPC 0162 A4A3 20 F4 A0 JSR PRTNAM 0163 A4A6 4C 19 A4 JMP CATSCN 0164 A4A9 0165 A4A9 ;Table of boot options 0166 A4A9 6F 66 66 OPTTBL = "off",&00,"LOADRUN",&00,"EXEC" 0167 A4B9 0168 A4B9 B9 0E 0F DSKADR LDAAY CATHIG + &06 0169 A4BC 20 30 A1 JSR ISOLEN 0170 A4BF 85 C2 STA WORK + &08 0171 A4C1 18 CLC 0172 A4C2 A9 FF LDAIM &FF 0173 A4C4 79 0C 0F ADCAY CATHIG + &04 0174 A4C7 B9 0F 0F LDAAY CATHIG + &07 0175 A4CA 79 0D 0F ADCAY CATHIG + &05 0176 A4CD 85 C3 STA WORK + &09 0177 A4CF B9 0E 0F LDAAY CATHIG + &06 0178 A4D2 29 03 ANDIM &03 0179 A4D4 65 C2 ADC WORK + &08 0180 A4D6 85 C2 STA WORK + &08 0181 A4D8 38 DSKSPC SEC 0182 A4D9 B9 07 0F LDAAY DIRHIG + &07 0183 A4DC E5 C3 SBC WORK + &09 0184 A4DE 48 PHA 0185 A4DF B9 06 0F LDAAY DIRHIG + &06 0186 A4E2 29 03 ANDIM &03 0187 A4E4 E5 C2 SBC WORK + &08 0188 A4E6 AA TAX 0189 A4E7 A9 00 LDAIM &00 0190 A4E9 C5 C0 CMP WORK + &06 0191 A4EB 68 PLA 0192 A4EC E5 C1 SBC WORK + &07 0193 A4EE 8A TXA 0194 A4EF E5 C4 SBC WORK + &0A 0195 A4F1 60 RETURN RTS 0196 A4F2 0197 A4F2 ;Command table - at FS stage 0198 A4F2 41 43 43 COMTAB = "ACCESS" 0199 A4F8 A8 = !(/(ACCESS - &01 )) 0200 A4F9 2D = ACCESS - &01 0201 A4FA 32 = &32 0202 A4FB 42 41 43 = "BACKUP" 0203 A501 BC = !(/(CPYDSK - &01 )) 0204 A502 E8 = CPYDSK - &01 0205 A503 04 = &04 0206 A504 43 4F 4D = "COMPACT" 0207 A50B BB = !(/(COMPCT - &01 )) 0208 A50C 1D = COMPCT - &01 0209 A50D 07 = &07 0210 A50E 43 4F 50 = "COPY" 0211 A512 BD = !(/(CPYFIL - &01 )) 0212 A513 34 = CPYFIL - &01 0213 A514 24 = &24 0214 A515 44 45 4C = "DELETE" 0215 A51B A6 = !(/(DELETE - &01 )) 0216 A51C 23 = DELETE - &01 0217 A51D 01 = &01 0218 A51E 44 45 53 = "DESTROY" 0219 A525 A6 = !(/(DESTRY - &01 )) 0220 A526 35 = DESTRY - &01 0221 A527 02 = &02 0222 A528 44 49 52 = "DIR" 0223 A52B A7 = !(/(SET - &01 )) 0224 A52C 88 = SET - &01 0225 A52D 06 = &06 0226 A52E 0227 A52E [ DRIVEC=0 0228 A52E 44 52 49 = "DRIVE" 0229 A533 A6 = !(/(DRIVE - &01 )) 0230 A534 8F = DRIVE - &01 0231 A535 09 = &09 0232 A536 | 0233 A536 ] 0234 A536 0235 A536 45 4E 41 = "ENABLE" 0236 A53C A9 = !(/(ENABLE - &01 )) 0237 A53D 8E = ENABLE - &01 Acorn macro assembler Page 11 - DOS02 - Command Line Interpreter 0238 A53E 00 = &00 0239 A53F 49 4E 46 = "INFO" 0240 A543 A1 = !(/(INFO - &01 )) 0241 A544 99 = INFO - &01 0242 A545 02 = &02 0243 A546 4C 49 42 = "LIB" 0244 A549 A7 = !(/(SLIB - &01 )) 0245 A54A 8C = SLIB - &01 0246 A54B 06 = &06 0247 A54C 52 45 4E = "RENAME" 0248 A552 A9 = !(/(RENAME - &01 )) 0249 A553 F3 = RENAME - &01 0250 A554 05 = &05 0251 A555 54 49 54 = "TITLE" 0252 A55A A7 = !(/(TITLE - &01 )) 0253 A55B FE = TITLE - &01 0254 A55C 08 = &08 0255 A55D 57 49 50 = "WIPE" 0256 A561 A5 = !(/(QDEL - &01 )) 0257 A562 F4 = QDEL - &01 0258 A563 02 = &02 0259 A564 A7 = !(/(DEFCOM - &01 )) 0260 A565 0C = DEFCOM - &01 0261 A566 0262 A566 ;1st pass table - i.e. on a SWC 0263 A566 42 55 49 INITBL = "BUILD" 0264 A56B BF = !(/(BUILD - &01 )) 0265 A56C 5E = BUILD - &01 0266 A56D 01 = &01 0267 A56E 44 49 53 = "DISC" 0268 A572 B3 = !(/(INIT - &01 )) 0269 A573 C0 = INIT - &01 0270 A574 00 = &00 0271 A575 44 55 4D = "DUMP" 0272 A579 BE = !(/(DUMP - &01 )) 0273 A57A DE = DUMP - &01 0274 A57B 01 = &01 0275 A57C 4C 49 53 = "LIST" 0276 A580 BE = !(/(LIST - &01 )) 0277 A581 9C = LIST - &01 0278 A582 01 = &01 0279 A583 54 59 50 = "TYPE" 0280 A587 BE = !(/(TYPE - &01 )) 0281 A588 95 = TYPE - &01 0282 A589 01 = &01 0283 A58A 44 49 53 = "DISK" 0284 A58E B3 = !(/(INIT - &01 )) 0285 A58F C0 = INIT - &01 0286 A590 00 = &00 0287 A591 A4 = !(/(RETURN - &01 )) 0288 A592 F0 = RETURN - &01 0289 A593 0290 A593 ;Help lookup table 0291 A593 44 46 53 HLPTAB = "DFS" 0292 A596 BA = !(/(HELP - &01 )) 0293 A597 21 = HELP - &01 0294 A598 00 = &00 0295 A599 55 54 49 = "UTILS" 0296 A59E BA = !(/(PMHELP - &01 )) 0297 A59F 4D = PMHELP - &01 0298 A5A0 00 = &00 0299 A5A1 BA = !(/(NOHELP - &01 )) 0300 A5A2 54 = NOHELP - &01 0301 A5A3 0302 A5A3 20 EA A5 WNAME JSR STXYLP 0303 A5A6 A2 FD LDXIM &FD 0304 A5A8 98 WNAME0 TYA 0305 A5A9 48 PHA 0306 A5AA E8 THUNK INX 0307 A5AB E8 INX 0308 A5AC 68 PLA 0309 A5AD 48 PHA 0310 A5AE A8 TAY 0311 A5AF 20 F1 A5 JSR SETUPR 0312 A5B2 E8 INX 0313 A5B3 BD F2 A4 LDAAX COMTAB ;Check for EOT 0314 A5B6 30 28 BMI FINISH 0315 A5B8 CA DEX 0316 A5B9 88 DEY 0317 A5BA 86 BC STX COMTXT 0318 A5BC E8 FIRCH INX 0319 A5BD C8 INY 0320 A5BE BD F2 A4 COMMMM LDAAX COMTAB ;Compare loop 0321 A5C1 30 16 BMI CHKLST 0322 A5C3 51 F2 EORIY LINPTR 0323 A5C5 29 5F ANDIM &5F ;Zap lower case 0324 A5C7 F0 F3 BEQ FIRCH 0325 A5C9 CA DEX 0326 A5CA E8 MINUS INX 0327 A5CB BD F2 A4 LDAAX COMTAB 0328 A5CE 10 FA BPL MINUS 0329 A5D0 B1 F2 LDAIY LINPTR 0330 A5D2 C9 2E CMPIM "." ;'.'s finish off commands 0331 A5D4 D0 D4 BNE THUNK 0332 A5D6 C8 INY ;Point to next char 0333 A5D7 B0 07 BCS FINISH ;Always 0334 A5D9 B1 F2 CHKLST LDAIY LINPTR ;Check last char non alpha 0335 A5DB 20 66 A2 JSR CAPS 0336 A5DE 90 CA BCC THUNK 0337 A5E0 68 FINISH PLA ;Get rid of stack 0338 A5E1 BD F2 A4 LDAAX COMTAB 0339 A5E4 48 PHA 0340 A5E5 BD F3 A4 LDAAX COMTAB + &01 0341 A5E8 48 PHA 0342 A5E9 60 RTS 0343 A5EA 0344 A5EA 86 F2 STXYLP STX LINPTR 0345 A5EC 84 F3 STY LINPTR + &01 0346 A5EE A0 00 LDYIM &00 0347 A5F0 60 RTS 0348 A5F1 0349 A5F1 18 SETUPR CLC 0350 A5F2 4C C2 FF JMP RDINIT 0351 A5F5 0352 A5F5 20 04 B8 QDEL JSR SETWLD 0353 A5F8 20 61 BA JSR CHKSYN 0354 A5FB 20 7F A1 JSR GETLOK 0355 A5FE B9 0F 0E QDEL0 LDAAY MODIFY 0356 A601 30 1B BMI QDEL4 0357 A603 20 F4 A0 JSR PRTNAM 0358 A606 20 F7 9F JSR VSTRNG Acorn macro assembler Page 12 - DOS02 - Command Line Interpreter 0359 A609 20 3A 20 = " : ",&EA 0360 A60D 20 CD BC JSR GETYN 0361 A610 D0 09 BNE QDEL2 0362 A612 20 94 AE JSR CHKSAM 0363 A615 20 85 A6 JSR DELDEC 0364 A618 20 3B AA JSR DIROUT 0365 A61B 20 B6 BC QDEL2 JSR PCRLF 0366 A61E 20 BF A1 QDEL4 JSR NEXT 0367 A621 B0 DB BCS QDEL0 0368 A623 60 RTS 0369 A624 0370 A624 20 FB B7 DELETE JSR CLRWLD 0371 A627 20 61 BA JSR CHKSYN 0372 A62A 20 7F A1 JSR GETLOK 0373 A62D 20 74 A2 JSR INFORM 0374 A630 20 49 A2 JSR DELFIL 0375 A633 4C 3B AA JMP DIROUT 0376 A636 0377 A636 [ NOENAB=0 0379 A636 | 0380 A636 20 EF BB DESTRY JSR CHKENA 0381 A639 ] 0382 A639 20 04 B8 JSR SETWLD 0383 A63C 20 61 BA JSR CHKSYN 0384 A63F 20 7F A1 JSR GETLOK 0385 A642 B9 0F 0E DESTR1 LDAAY MODIFY 0386 A645 30 06 BMI DESTR5 0387 A647 20 F4 A0 JSR PRTNAM 0388 A64A 20 B6 BC JSR PCRLF 0389 A64D 20 BF A1 DESTR5 JSR NEXT 0390 A650 B0 F0 BCS DESTR1 0391 A652 ; JSR VSTRNG 0392 A652 ; = CR,"Delete (Y/N) ? ",$EA 0393 A652 ; JSR GETYN 0394 A652 20 BE BC JSR SURE 0395 A655 0396 A655 F0 03 BEQ DESTR2 0397 A657 4C B6 BC JMP PCRLF 0398 A65A 20 94 AE DESTR2 JSR CHKSAM 0399 A65D 20 C3 A1 JSR LOOKUP 0400 A660 B9 0F 0E DESTR3 LDAAY MODIFY 0401 A663 30 03 BMI DESTR4 0402 A665 20 85 A6 JSR DELDEC 0403 A668 20 BF A1 DESTR4 JSR NEXT 0404 A66B B0 F3 BCS DESTR3 0405 A66D 20 3B AA JSR DIROUT 0406 A670 20 F7 9F JSR VSTRNG 0407 A673 0D 44 65 = CR,"Deleted",CR 0408 A67C 0409 A67C ;Increment Y by 8 0410 A67C C8 STEP INY 0411 A67D C8 STEP7 INY 0412 A67E C8 INY 0413 A67F C8 INY 0414 A680 C8 INY 0415 A681 C8 INY 0416 A682 C8 INY 0417 A683 C8 INY 0418 A684 60 RTS 0419 A685 0420 A685 0421 A685 20 49 A2 DELDEC JSR DELFIL 0422 A688 A4 B6 LDY VTEMP 0423 A68A 20 F1 A1 JSR UNSTEP 0424 A68D 84 B6 STY VTEMP 0425 A68F 60 RTS 0426 A690 0427 A690 [ DRIVEC=0 0428 A690 20 61 BA DRIVE JSR CHKSYN 0429 A693 20 D3 A9 JSR GETDRV 0430 A696 8D CA 10 STA DEFDSK 0431 A699 | 0432 A699 ] 0433 A699 0434 A699 20 AE AC DODRIV JSR DSKWAI 0435 A69C 29 03 ANDIM &03 0436 A69E 85 CD STA FDRIVE 0437 A6A0 60 RTS 0438 A6A1 0439 A6A1 ;Load file with block at X and wait 0440 A6A1 20 84 A1 LOADER JSR FRMLOK 0441 A6A4 20 DA B8 JSR TRYFL0 0442 A6A7 20 C8 A2 JSR CHUKBK 0443 A6AA 0444 A6AA ;Load file set up in WORK 0445 A6AA 84 BA LOADT STY WORK 0446 A6AC A2 00 LDXIM &00 0447 A6AE A5 BE LDA WORK + &04 0448 A6B0 D0 06 BNE RELOC 0449 A6B2 C8 INY 0450 A6B3 C8 INY 0451 A6B4 A2 02 LDXIM &02 0452 A6B6 D0 08 BNE LOADT0 0453 A6B8 B9 0E 0F RELOC LDAAY CATHIG + &06 0454 A6BB 85 C2 STA WORK + &08 0455 A6BD 20 95 A9 JSR DECODL 0456 A6C0 B9 08 0F LOADT0 LDAAY CATHIG 0457 A6C3 95 BC STAZX WORK + &02 0458 A6C5 C8 INY 0459 A6C6 E8 INX 0460 A6C7 E0 08 CPXIM &08 0461 A6C9 D0 F5 BNE LOADT0 0462 A6CB 20 AC A9 JSR DECODE 0463 A6CE A4 BA LDY WORK 0464 A6D0 20 74 A2 JSR INFORM 0465 A6D3 0466 A6D3 ;Read block 0467 A6D3 20 A3 AB BLKRD JSR RDINT 0468 A6D6 D0 0C BNE BLKXX 0469 A6D8 0470 A6D8 ;Save memory into file set up in WORK 0471 A6D8 20 BF A8 SAVER JSR DIRDO 0472 A6DB 20 DA B8 JSR TRYFL0 0473 A6DE 20 C8 A2 JSR CHUKBK 0474 A6E1 0475 A6E1 ;Write block 0476 A6E1 20 B1 AB BLKWR JSR WTINT 0477 A6E4 20 43 A1 BLKXX JSR ATOT 0478 A6E7 20 4B AC JSR GETTS 0479 A6EA A9 01 LDAIM &01 0480 A6EC 20 6A B9 JSR DSKFIN Acorn macro assembler Page 13 - DOS02 - Command Line Interpreter 0481 A6EF 0482 A6EF ;Release tube conditional on whether 0483 A6EF ; you used it 0484 A6EF 48 PHA 0485 A6F0 AD D5 10 LDA TUBFLG 0486 A6F3 F0 13 BEQ RELTB0 0487 A6F5 A9 81 RELTB1 LDAIM &80 + TUBEID 0488 A6F7 20 06 04 JSR TUBADR 0489 A6FA 68 PLA 0490 A6FB 60 RTS 0491 A6FC 0492 A6FC ;Release NMI and tube 0493 A6FC 20 6D B9 NMTREL JSR NMIREL 0494 A6FF 0495 A6FF ;Release tube if tube exists 0496 A6FF 48 RELTUB PHA 0497 A700 A9 EA LDAIM BYTETB 0498 A702 20 A6 B9 JSR READBY 0499 A705 8A TXA 0500 A706 D0 ED BNE RELTB1 0501 A708 68 RELTB0 PLA 0502 A709 60 RTS 0503 A70A 0504 A70A ;RUN filename as if a utility 0505 A70A 20 EA A5 WNOTA JSR STXYLP 0506 A70D 0507 A70D ;Unrecognised command - try disk for 0508 A70D ;a utility. 0509 A70D 20 7C A7 DEFCOM JSR SUPLD 0510 A710 8C DA 10 STY LINADR + &01 0511 A713 20 70 A0 JSR FRMNAM 0512 A716 8C D9 10 STY LINADR 0513 A719 20 C3 A1 JSR LOOKUP 0514 A71C B0 22 BCS DEFSUC 0515 A71E AC DA 10 LDY LINADR + &01 0516 A721 AD CB 10 LDA LIBQUA 0517 A724 85 CC STA QUALIF 0518 A726 AD CC 10 LDA LIBDSK 0519 A729 20 99 A6 JSR DODRIV 0520 A72C 20 73 A0 JSR FRMNM1 0521 A72F 20 C3 A1 JSR LOOKUP 0522 A732 B0 0C BCS DEFSUC 0523 A734 20 AE 9F JSR ILLMSG 0524 A737 FE 63 6F = COMNUM,"command",&00 0525 A740 0526 A740 20 AA A6 DEFSUC JSR LOADT 0527 A743 18 CLC ;Work out address of line 0528 A744 AD D9 10 LDA LINADR 0529 A747 A8 TAY 0530 A748 65 F2 ADC LINPTR 0531 A74A 8D D9 10 STA LINADR 0532 A74D A5 F3 LDA LINPTR + &01 0533 A74F 69 00 ADCIM &00 0534 A751 8D DA 10 STA LINADR + &01 0535 A754 AD 76 10 LDA HIWORK + &02 ;Find where to run 0536 A757 2D 77 10 AND HIWORK + &03 0537 A75A 0D D6 10 ORA NOTUBE 0538 A75D C9 FF CMPIM &FF 0539 A75F F0 16 BEQ RUNHO 0540 A761 A5 BE LDA WORK + &04 ;Run that side 0541 A763 8D 74 10 STA HIWORK 0542 A766 A5 BF LDA WORK + &05 0543 A768 8D 75 10 STA HIWORK + &01 0544 A76B 20 04 AC JSR CLATUB 0545 A76E A2 74 LDXIM HIWORK 0546 A770 A0 10 LDYIM /(HIWORK ) 0547 A772 A9 04 LDAIM &04 0548 A774 4C 06 04 JMP TUBADR 0549 A777 A9 01 RUNHO LDAIM &01 0550 A779 6C BE 00 JMI WORK + &04 ;Run this side 0551 A77C 0552 A77C A9 FF SUPLD LDAIM &FF ;Set up load 0553 A77E 85 BE STA WORK + &04 0554 A780 A5 F2 LDA LINPTR 0555 A782 85 BA STA WORK 0556 A784 A5 F3 LDA LINPTR + &01 0557 A786 85 BB STA WORK + &01 0558 A788 60 RTS 0559 A789 0560 A789 ;Set default directory and disk 0561 A789 A2 00 SET LDXIM &00 0562 A78B F0 02 BEQ SLIB1 0563 A78D 0564 A78D ;Set library directory and disk 0565 A78D A2 02 SLIB LDXIM LIBDSK - DEFDSK 0566 A78F 20 C1 A7 SLIB1 JSR READDF 0567 A792 9D CA 10 STAAX DEFDSK 0568 A795 A5 CC LDA QUALIF 0569 A797 9D C9 10 STAAX DEFQUA 0570 A79A 60 RTS 0571 A79B 0572 A79B ;***** HMT 0573 A79B ; Save in private memory 0574 A79B 20 27 A3 SAVMEM JSR SAVITA ; Save A,X,Y 0575 A79E A5 B0 LDA TEMP 0576 A7A0 48 PHA 0577 A7A1 A5 B1 LDA TEMP+&01 0578 A7A3 48 PHA 0579 A7A4 0580 A7A4 20 10 B9 JSR SUSPRI ; Set up the pointer 0581 A7A7 0582 A7A7 A0 00 LDYIM &00 ;Save useful things 0583 A7A9 C0 C0 RELME1 CPYIM &C0 0584 A7AB 90 05 BCC RELME2 0585 A7AD B9 00 10 LDAAY BUFFER 0586 A7B0 B0 03 BCS RELME3 0587 A7B2 B9 00 11 RELME2 LDAAY SEQMAP 0588 A7B5 91 B0 RELME3 STAIY TEMP 0589 A7B7 88 DEY 0590 A7B8 D0 EF BNE RELME1 0591 A7BA ;************* Y=0 0592 A7BA ; Exit Y=0 always 0593 A7BA 0594 A7BA 68 PLA 0595 A7BB 85 B1 STA TEMP+&01 0596 A7BD 68 PLA 0597 A7BE 85 B0 STA TEMP 0598 A7C0 0599 A7C0 60 RTS 0600 A7C1 0601 A7C1 Acorn macro assembler Page 14 - DOS02 - Command Line Interpreter 0602 A7C1 0603 A7C1 ;Read directory - if none default to 0604 A7C1 ;MASDSK and MASQUA 0605 A7C1 AD C9 10 READDF LDA DEFQUA ; ********** HMT 0606 A7C4 85 CC STA QUALIF ; ********** HMT 0607 A7C6 ; To preserve the Qual Correctly over *DIR :0 0608 A7C6 20 F1 A5 JSR SETUPR 0609 A7C9 D0 07 BNE READD0 0610 A7CB A9 00 LDAIM MASDSK 0611 A7CD 20 99 A6 JSR DODRIV 0612 A7D0 [ MASDSK=0 0613 A7D0 F0 2A BEQ SET3 0614 A7D2 | 0616 A7D2 ] 0617 A7D2 AD CA 10 READD0 LDA DEFDSK 0618 A7D5 20 99 A6 JSR DODRIV 0619 A7D8 20 C9 A0 SET4 JSR RDCHR 0620 A7DB B0 10 BCS ILLDIR 0621 A7DD C9 3A CMPIM ":" 0622 A7DF D0 14 BNE SET0 0623 A7E1 20 D3 A9 JSR GETDRV 0624 A7E4 20 C9 A0 JSR RDCHR 0625 A7E7 B0 13 BCS SET3 0626 A7E9 C9 2E CMPIM "." 0627 A7EB F0 EB BEQ SET4 0628 A7ED 20 AE 9F ILLDIR JSR ILLMSG 0629 A7F0 CE 64 69 = DIRNUM,"dir",&00 0630 A7F5 85 CC SET0 STA QUALIF 0631 A7F7 20 C9 A0 JSR RDCHR 0632 A7FA 90 F1 BCC ILLDIR 0633 A7FC A5 CD SET3 LDA FDRIVE 0634 A7FE 60 RTS 0635 A7FF 0636 A7FF 20 61 BA TITLE JSR CHKSYN 0637 A802 20 C3 A9 JSR SETDEF 0638 A805 20 C2 A2 JSR GETDIR 0639 A808 0640 A808 A2 0B LDXIM &0B ;12 Chars in title 0641 A80A A9 20 LDAIM &20 ;Pad with nulls 0642 A80C 20 22 A8 CLRTI0 JSR TITWIT 0643 A80F CA DEX 0644 A810 10 FA BPL CLRTI0 0645 A812 0646 A812 E8 TITSET INX 0647 A813 20 C9 A0 JSR RDCHR ;Read in title 0648 A816 B0 07 BCS TITEND 0649 A818 0650 A818 20 22 A8 JSR TITWIT 0651 A81B E0 0B CPXIM &0B 0652 A81D 90 F3 BCC TITSET 0653 A81F 4C 3B AA TITEND JMP DIROUT 0654 A822 0655 A822 ;Put char in title 0656 A822 E0 08 TITWIT CPXIM &08 0657 A824 90 04 BCC TITLLW 0658 A826 9D F8 0E STAAX DIRHIG - &08 0659 A829 60 RTS 0660 A82A 9D 00 0E TITLLW STAAX DIRLOW 0661 A82D 60 RTS 0662 A82E 0663 A82E ;Lock or unlock file 0664 A82E 20 04 B8 ACCESS JSR SETWLD 0665 A831 20 61 BA JSR CHKSYN 0666 A834 20 6A A0 JSR GETNAM 0667 A837 A2 00 LDXIM &00 0668 A839 20 F1 A5 JSR SETUPR 0669 A83C D0 23 BNE ACCES5 0670 A83E 86 AA ACCES0 STX UTEMP 0671 A840 20 C3 A1 JSR LOOKUP 0672 A843 B0 03 BCS ACCES1 0673 A845 4C 8C A1 JMP NOFIL 0674 A848 20 BB B8 ACCES1 JSR CHKOPN 0675 A84B B9 0F 0E LDAAY MODIFY 0676 A84E 29 7F ANDIM &7F 0677 A850 05 AA ORA UTEMP 0678 A852 99 0F 0E STAAY MODIFY 0679 A855 20 74 A2 JSR INFORM 0680 A858 20 BF A1 JSR NEXT 0681 A85B B0 EB BCS ACCES1 0682 A85D 90 C0 BCC TITEND 0683 A85F A2 80 ACCES6 LDXIM &80 0684 A861 20 C9 A0 ACCES5 JSR RDCHR 0685 A864 B0 D8 BCS ACCES0 0686 A866 29 5F ANDIM &5F 0687 A868 C9 4C CMPIM "L" 0688 A86A F0 F3 BEQ ACCES6 0689 A86C 20 AE 9F JSR ILLMSG 0690 A86F CF 61 74 = ATTNUM,"attribute",&00 0691 A87A 0692 A87A 20 27 A3 WFOPT JSR SAVITA 0693 A87D 8A TXA 0694 A87E C9 04 CMPIM &04 0695 A880 F0 1A BEQ BOOTO 0696 A882 C9 02 CMPIM &02 0697 A884 90 0B BCC SETMON 0698 A886 20 AE 9F JSR ILLMSG 0699 A889 CB 6F 70 = OPTNUM,"option",&00 0700 A891 0701 A891 A2 FF SETMON LDXIM &FF 0702 A893 98 TYA 0703 A894 F0 02 BEQ STMON0 0704 A896 A2 00 LDXIM &00 0705 A898 8E C6 10 STMON0 STX MONFLG 0706 A89B 60 RTS 0707 A89C 0708 A89C 98 BOOTO TYA 0709 A89D 48 PHA 0710 A89E 20 C3 A9 JSR SETDEF 0711 A8A1 20 6B AA JSR DIRLDY 0712 A8A4 68 PLA 0713 A8A5 20 3E A1 JSR LFOUR 0714 A8A8 4D 06 0F EOR DIRHIG + &06 0715 A8AB 29 30 ANDIM &30 0716 A8AD 4D 06 0F EOR DIRHIG + &06 0717 A8B0 8D 06 0F STA DIRHIG + &06 0718 A8B3 4C 3B AA JMP DIROUT 0719 A8B6 0720 A8B6 20 A3 9F NOROOM JSR DSKMSG 0721 A8B9 C6 66 75 = NORNUM,"full",&00 0722 A8BF 0723 A8BF ;Generate file in directory Acorn macro assembler Page 15 - DOS02 - Command Line Interpreter 0724 A8BF 20 70 A0 DIRDO JSR FRMNAM 0725 A8C2 20 C3 A1 JSR LOOKUP 0726 A8C5 90 03 BCC FILELS 0727 A8C7 20 49 A2 JSR DELFIL 0728 A8CA A5 C0 FILELS LDA WORK + &06 0729 A8CC 48 PHA 0730 A8CD A5 C1 LDA WORK + &07 0731 A8CF 48 PHA 0732 A8D0 38 SEC 0733 A8D1 A5 C2 LDA WORK + &08 0734 A8D3 E5 C0 SBC WORK + &06 0735 A8D5 85 C0 STA WORK + &06 0736 A8D7 A5 C3 LDA WORK + &09 0737 A8D9 E5 C1 SBC WORK + &07 0738 A8DB 85 C1 STA WORK + &07 0739 A8DD AD 7A 10 LDA HIWORK + &06 0740 A8E0 ED 78 10 SBC HIWORK + &04 0741 A8E3 85 C4 STA WORK + &0A 0742 A8E5 20 FB A8 JSR GENFIL 0743 A8E8 AD 79 10 LDA HIWORK + &05 ;Move load address 0744 A8EB 8D 75 10 STA HIWORK + &01 0745 A8EE AD 78 10 LDA HIWORK + &04 0746 A8F1 8D 74 10 STA HIWORK 0747 A8F4 68 PLA 0748 A8F5 85 BD STA WORK + &03 0749 A8F7 68 PLA 0750 A8F8 85 BC STA WORK + &02 0751 A8FA 60 RTS 0752 A8FB 0753 A8FB A9 00 GENFIL LDAIM &00 0754 A8FD 85 C2 STA WORK + &08 0755 A8FF A9 02 LDAIM &02 0756 A901 85 C3 STA WORK + &09 0757 A903 AC 05 0F LDY DIRLEN 0758 A906 C0 F8 CPYIM &F8 0759 A908 B0 56 BCS DIRFUL 0760 A90A 20 D8 A4 JSR DSKSPC 0761 A90D 4C 18 A9 JMP SPACHK 0762 A910 F0 A4 SPALOP BEQ NOROOM 0763 A912 20 F1 A1 JSR UNSTEP 0764 A915 20 B9 A4 JSR DSKADR 0765 A918 98 SPACHK TYA 0766 A919 90 F5 BCC SPALOP 0767 A91B 84 B0 STY TEMP 0768 A91D AC 05 0F LDY DIRLEN 0769 A920 C4 B0 MOVEUP CPY TEMP 0770 A922 F0 0F BEQ INSNAM 0771 A924 B9 07 0E LDAAY CATLOW - &01 0772 A927 99 0F 0E STAAY CATLOW + &07 0773 A92A B9 07 0F LDAAY CATHIG - &01 0774 A92D 99 0F 0F STAAY CATHIG + &07 0775 A930 88 DEY 0776 A931 B0 ED BCS MOVEUP ; Y > TEMP ? 0777 A933 A2 00 INSNAM LDXIM &00 0778 A935 20 6D A9 JSR ENCODE 0779 A938 B5 C5 NAMIN LDAZX WORK + &0B 0780 A93A 99 08 0E STAAY CATLOW 0781 A93D C8 INY 0782 A93E E8 INX 0783 A93F E0 08 CPXIM &08 0784 A941 D0 F5 BNE NAMIN 0785 A943 B5 BB VARIN LDAZX WORK + &01 0786 A945 88 DEY 0787 A946 99 08 0F STAAY CATHIG 0788 A949 CA DEX 0789 A94A D0 F7 BNE VARIN 0790 A94C 20 74 A2 JSR INFORM 0791 A94F 98 TYA 0792 A950 48 PHA 0793 A951 AC 05 0F LDY DIRLEN 0794 A954 20 7C A6 JSR STEP 0795 A957 8C 05 0F STY DIRLEN 0796 A95A 20 3B AA JSR DIROUT 0797 A95D 68 PLA 0798 A95E A8 TAY 0799 A95F 60 RTS 0800 A960 0801 A960 20 B8 9F DIRFUL JSR ESTRNG 0802 A963 BE 43 61 = DRFNUM,"Cat full",&00 0803 A96D 0804 A96D AD 76 10 ENCODE LDA HIWORK + &02 ;Inserts half nibbles in reverse order 0805 A970 29 03 ANDIM &03 ;Starting with exec addr 0806 A972 0A ASLA 0807 A973 0A ASLA 0808 A974 45 C4 EOR WORK + &0A ;Length 0809 A976 29 FC ANDIM &FC 0810 A978 45 C4 EOR WORK + &0A 0811 A97A 0A ASLA 0812 A97B 0A ASLA 0813 A97C 4D 74 10 EOR HIWORK ;Load addr 0814 A97F 29 FC ANDIM &FC 0815 A981 4D 74 10 EOR HIWORK 0816 A984 0A ASLA 0817 A985 0A ASLA 0818 A986 45 C2 EOR WORK + &08 ;Start sec 0819 A988 29 FC ANDIM &FC 0820 A98A 45 C2 EOR WORK + &08 0821 A98C 85 C2 STA WORK + &08 ;Finally store 0822 A98E 60 RTS 0823 A98F 0824 A98F ;Enable misc commands 0825 A98F A9 01 ENABLE LDAIM &01 0826 A991 8D C7 10 STA ENAFLG 0827 A994 60 RTS 0828 A995 0829 A995 A9 00 DECODL LDAIM &00 0830 A997 8D 75 10 STA HIWORK + &01 0831 A99A A5 C2 LDA WORK + &08 0832 A99C 20 32 A1 JSR ISOLOD 0833 A99F C9 03 CMPIM &03 0834 A9A1 D0 05 BNE DECDL0 0835 A9A3 A9 FF LDAIM &FF 0836 A9A5 8D 75 10 STA HIWORK + &01 0837 A9A8 8D 74 10 DECDL0 STA HIWORK 0838 A9AB 60 RTS 0839 A9AC 0840 A9AC A9 00 DECODE LDAIM &00 0841 A9AE 8D 77 10 STA HIWORK + &03 0842 A9B1 A5 C2 LDA WORK + &08 0843 A9B3 20 2E A1 JSR ISOEXE 0844 A9B6 C9 03 CMPIM &03 Acorn macro assembler Page 16 - DOS02 - Command Line Interpreter 0845 A9B8 D0 05 BNE DECDE0 0846 A9BA A9 FF LDAIM &FF 0847 A9BC 8D 77 10 STA HIWORK + &03 0848 A9BF 8D 76 10 DECDE0 STA HIWORK + &02 0849 A9C2 60 RTS 0850 A9C3 0851 A9C3 ;Set up default qualifier and disk 0852 A9C3 AD C9 10 SETDEF LDA DEFQUA 0853 A9C6 85 CC STA QUALIF 0854 A9C8 AD CA 10 SETDDR LDA DEFDSK 0855 A9CB 4C 99 A6 JMP DODRIV 0856 A9CE 0857 A9CE ;Read drive - if nothing on line sets 0858 A9CE ; to default 0859 A9CE 20 F1 A5 READRV JSR SETUPR 0860 A9D1 F0 F5 BEQ SETDDR 0861 A9D3 0862 A9D3 ;Get drive from input string 0863 A9D3 ;Produces error on invalid drive 0864 A9D3 20 C9 A0 GETDRV JSR RDCHR 0865 A9D6 B0 12 BCS DRVERR 0866 A9D8 C9 3A CMPIM ":" 0867 A9DA F0 F7 BEQ GETDRV 0868 A9DC 38 SEC 0869 A9DD E9 30 SBCIM "0" 0870 A9DF 90 09 BCC DRVERR 0871 A9E1 C9 04 CMPIM &04 0872 A9E3 B0 05 BCS DRVERR 0873 A9E5 20 99 A6 JSR DODRIV 0874 A9E8 18 CLC 0875 A9E9 60 RTS 0876 A9EA 20 AE 9F DRVERR JSR ILLMSG 0877 A9ED CD 64 72 = DRVNUM,"drive",&00 0878 A9F4 0879 A9F4 20 FB B7 RENAME JSR CLRWLD 0880 A9F7 20 61 BA JSR CHKSYN 0881 A9FA 20 6A A0 JSR GETNAM 0882 A9FD 98 TYA 0883 A9FE 48 PHA 0884 A9FF 20 87 A1 JSR ERRLOK 0885 AA02 20 B8 B8 JSR CHKOPL 0886 AA05 84 B3 STY ITEMP 0887 AA07 68 PLA 0888 AA08 A8 TAY 0889 AA09 20 61 BA JSR CHKSYN 0890 AA0C A5 CD LDA FDRIVE ;Save 1st filename drive 0891 AA0E 48 PHA 0892 AA0F 20 6A A0 JSR GETNAM 0893 AA12 68 PLA 0894 AA13 C5 CD CMP FDRIVE ;Check same drive 0895 AA15 D0 D3 BNE DRVERR ;'Bad drive' error if not 0896 AA17 20 C3 A1 JSR LOOKUP 0897 AA1A 90 0F BCC REN4 0898 AA1C ;************************ So REN. A a works!!!! 0899 AA1C C4 B3 CPY ITEMP ; This is the cat entry of the extant file 0900 AA1E F0 0B BEQ REN4 ; If we're about to save in the same place 0901 AA20 ;************************ 0902 AA20 20 B8 9F JSR ESTRNG 0903 AA23 C4 45 78 = FAXNUM,"Exists",&00 0904 AA2B A4 B3 REN4 LDY ITEMP 0905 AA2D 20 7C A6 JSR STEP 0906 AA30 A2 07 LDXIM &07 0907 AA32 B5 C5 REN5 LDAZX WORK + &0B 0908 AA34 99 07 0E STAAY CATLOW - &01 0909 AA37 88 DEY 0910 AA38 CA DEX 0911 AA39 10 F7 BPL REN5 0912 AA3B 0913 AA3B ; 0914 AA3B ; And drop through to DIROUT 0915 AA3B ; 0916 AA3B AA3B EDOS02 * . 0917 AA3B 0918 AA3B LNK DOS03 0001 AA3B ;*** File Three *** -> DOS03 0002 AA3B TTL - DOS03 - Disk Primitives 0003 AA3B OPT &01 0004 AA3B ;FILE 03. DISC HANDLER ETC 0005 AA3B 0006 AA3B ;Output directory to disc 0007 AA3B 18 DIROUT CLC ;Cycle number in BCD 0008 AA3C F8 SED 0009 AA3D AD 04 0F LDA CYCNO 0010 AA40 69 01 ADCIM &01 0011 AA42 D8 CLD 0012 AA43 8D 04 0F STA CYCNO 0013 AA46 0014 AA46 ;*********************** HMT 0015 AA46 ; Maybe we should select the drive first ? 0016 AA46 20 AA AA JSR DRVSSK 0017 AA49 ;*********************** HMT 0018 AA49 0019 AA49 20 C7 AB JSR LDTRYS 0020 AA4C A0 2B DIROT0 LDYIM CHKSPD - CMDTAB 0021 AA4E C6 A2 DEC CNTA 0022 AA50 30 75 BMI DKNERN 0023 AA52 20 A4 AC JSR CMDRES 0024 AA55 D0 F5 BNE DIROT0 0025 AA57 20 B6 AB JSR WRINT0 ;Returns NZ 0026 AA5A D0 15 BNE DIROT1 ;Always 0027 AA5C 0028 AA5C ;Get directory from command line and 0029 AA5C ; read it 0030 AA5C 20 CE A9 DIR JSR READRV 0031 AA5F 0032 AA5F 20 84 AA DIRLD JSR DSKRDY 0033 AA62 F0 07 BEQ DIRLDY 0034 AA64 AD 82 10 LDA CATDRV 0035 AA67 C5 CD CMP FDRIVE 0036 AA69 F0 29 BEQ DRVSE0 0037 AA6B 0038 AA6B ;Read directory always 0039 AA6B 20 AA AA DIRLDY JSR DRVSSK 0040 AA6E 20 A8 AB JSR RDINT0 0041 AA71 A9 00 DIROT1 LDAIM &00 ;Detube 0042 AA73 8D 73 10 STA LDLOW + &01 0043 AA76 8D D5 10 STA TUBFLG 0044 AA79 20 4B AC JSR GETTS 0045 AA7C A5 CD LDA FDRIVE 0046 AA7E 8D 82 10 STA CATDRV 0047 AA81 4C 6A B9 JMP DSKFIN Acorn macro assembler Page 17 - DOS03 - Disk Primitives 0048 AA84 0049 AA84 ;Check disk ready - returns 0050 AA84 ; zero if not ready 0051 AA84 A9 6C DSKRDY LDAIM &6C 0052 AA86 20 92 AC JSR CMDDRV 0053 AA89 20 A7 AC JSR DSKRES 0054 AA8C 90 04 BCC DSKRDX ; C = Drive no. in CMDDRV 0055 AA8E 20 38 A1 JSR SFOUR 0056 AA91 38 SEC ; So C still = drive 0057 AA92 29 04 DSKRDX ANDIM &04 0058 AA94 60 DRVSE0 RTS 0059 AA95 0060 AA95 ;Output string of commands to controler 0061 AA95 B9 D8 AC CMDPAR LDAAY CMDTAB 0062 AA98 20 92 AC JSR CMDDRV 0063 AA9B C8 INY 0064 AA9C B9 D8 AC CMDPRA LDAAY CMDTAB 0065 AA9F C8 INY 0066 AAA0 C9 EA CMPIM &EA 0067 AAA2 F0 F0 BEQ DRVSE0 0068 AAA4 20 85 AC JSR DSKPAR 0069 AAA7 4C 9C AA JMP CMDPRA 0070 AAAA 0071 AAAA 20 31 AB DRVSSK JSR DRVSEL 0072 AAAD ;Seek track zero 0073 AAAD A9 02 ZTRKSC LDAIM NOPCLA 0074 AAAF 20 20 B9 JSR NMICLA 0075 AAB2 A0 00 LDYIM &00 0076 AAB4 84 CE STY TRACK ;Zero track sector 0077 AAB6 84 CF STY SECTOR 0078 AAB8 84 A3 STY READNO 0079 AABA C8 INY 0080 AABB 84 A5 STY READNO + &02 0081 AABD C8 INY 0082 AABE 84 A4 STY READNO + &01 0083 AAC0 A0 28 LDYIM DSKQRZ - CMDTAB 0084 AAC2 20 A4 AC JSR CMDRES 0085 AAC5 F0 CD BEQ DRVSE0 0086 AAC7 20 FC A6 DKNERN JSR NMTREL 0087 AACA C9 12 CMPIM &12 0088 AACC D0 0E BNE DKERR0 0089 AACE 20 A3 9F JSR DSKMSG 0090 AAD1 C9 72 65 = DKPNUM,"read only",&00 0091 AADC 0092 AADC 48 DKERR0 PHA ; Save for printing 0093 AADD C9 0A CMPIM &0A 0094 AADF F0 0C BEQ DRVFLT 0095 AAE1 29 0F ANDIM &0F 0096 AAE3 C9 08 CMPIM &08 0097 AAE5 90 06 BCC DRVFLT 0098 AAE7 0099 AAE7 20 A3 9F JSR DSKMSG 0100 AAEA 00 = &00 0101 AAEB 90 0E BCC DSKFLT ; Always 0102 AAED 0103 AAED 20 84 AB DRVFLT JSR RESFDC 0104 AAF0 20 B8 9F JSR ESTRNG 0105 AAF3 00 44 72 = &00,"Drive " 0106 AAFA EA NOP 0107 AAFB 0108 AAFB 20 CF 9F DSKFLT JSR GSTRNG 0109 AAFE C7 66 61 = DERNUM,"fault " 0110 AB05 EA NOP 0111 AB06 68 PLA 0112 AB07 20 C5 AD JSR TTSSER 0113 AB0A 20 CF 9F JSR GSTRNG 0114 AB0D C7 00 = DERNUM,&00 0115 AB0F 0116 AB0F ; Check the restore semaphore and do as necc. 0117 AB0F A9 80 DSKZSK LDAIM &80 0118 AB11 2C 85 10 BIT QSTORE 0119 AB14 B0 0A BCS CHKDR1 0120 AB16 30 0D BMI DELAY ; If Dr.0 OK, an RTS 0121 AB18 0D 85 10 CHKDR2 ORA QSTORE 0122 AB1B 8D 85 10 STA QSTORE 0123 AB1E D0 8D BNE ZTRKSC ; Always Restore 0124 AB20 70 03 CHKDR1 BVS DELAY ; If Dr.1 OK, an RTS 0125 AB22 4A LSRA ; A:= $40, bit 6, .. C:= 0 0126 AB23 90 F3 BCC CHKDR2 ; Always 0127 AB25 0128 AB25 ; Now the Delay on write operations to cure Disc Fault 18, I hope 0129 AB25 20 27 A3 DELAY JSR SAVITA ; Preserve Y is necc. 0130 AB28 0131 AB28 A0 46 LDYIM 70 0132 AB2A CA DELAY1 DEX 0133 AB2B D0 FD BNE DELAY1 0134 AB2D 88 DEY 0135 AB2E D0 FA BNE DELAY1 0136 AB30 0137 AB30 60 RTS 0138 AB31 0139 AB31 ;Select drive 0140 AB31 20 27 A3 DRVSEL JSR SAVITA 0141 AB34 0142 AB34 A5 CD LDA FDRIVE ;If preselected ignore 0143 AB36 A8 TAY 0144 AB37 CD 83 10 CMP OLDDRV 0145 AB3A D0 05 BNE DRVSL0 0146 AB3C 20 84 AA JSR DSKRDY 0147 AB3F D0 61 BNE DSKSEX ; another RTS in the wall 0148 AB41 8C 83 10 DRVSL0 STY OLDDRV 0149 AB44 A9 3A LDAIM &3A 0150 AB46 20 9B AC JSR DSKCMD 0151 AB49 A9 23 LDAIM &23 0152 AB4B 20 85 AC JSR DSKPAR 0153 AB4E B9 94 AB LDAAY SELPAR 0154 AB51 20 85 AC JSR DSKPAR 0155 AB54 ;***************************************** A Fix ???? 0156 AB54 98 TYA 0157 AB55 6A RORA ; Set the carry for ... 0158 AB56 A0 33 LDYIM RSROP - CMDTAB 0159 AB58 20 A4 AC JSR CMDRES ; Keeping the drive select bits, I hope 0160 AB5B AC 83 10 LDY OLDDRV 0161 AB5E 29 08 ANDIM &08 0162 AB60 F0 DF BEQ DRVSL0 ; If it hasn't loaded yet, tell it again 0163 AB62 0164 AB62 ;*********** Invalidate old catalog ************ HMT 0165 AB62 A9 FF LDAIM &FF 0166 AB64 8D 82 10 STA CATDRV 0167 AB67 ;*********************************************** HMT 0168 AB67 Acorn macro assembler Page 18 - DOS03 - Disk Primitives 0169 AB67 20 84 AA STARTW JSR DSKRDY 0170 AB6A D0 A3 BNE DSKZSK ; Check for Restore sema 0171 AB6C ;************************ 0172 AB6C 08 PHP 0173 AB6D 58 CLI 0174 AB6E 28 PLP 0175 AB6F ;************************ for Escape 0176 AB6F 24 FF BIT ESCFLG 0177 AB71 10 F4 BPL STARTW 0178 AB73 0179 AB73 20 84 AB JSR RESFDC ;************* HMT 0180 AB76 0181 AB76 20 99 B9 ESCAPE JSR ACKESC ;Cancel escape flag 0182 AB79 20 C8 9F JSR FSTRNG 0183 AB7C 11 45 73 = ESCNUM,"Escape",&00 0184 AB84 0185 AB84 ;Reset the FDC - this requires a reset 0186 AB84 ;pulse of at least 2.5uS 0187 AB84 A9 01 RESFDC LDAIM &01 ;Put it high... 0188 AB86 8D 82 FE STA FDCRES 0189 AB89 AA TAX ; X:= 1 (2) Waste time (6 cycles) 0190 AB8A CA DEX ; X:= 0 (2) 0191 AB8B 8E 82 FE STX FDCRES ; (3) ...and low again 0192 AB8E 20 B9 AC JSR INIFDC ;Re-initialise FDC 0193 AB91 4C FC A6 JMP NMTREL ;No more need for NMI or tube 0194 AB94 0195 AB94 48 88 68 SELPAR = &48,&88,&68,&A8 0196 AB98 0197 AB98 ;Ignore tube if present 0198 AB98 48 DETUBE PHA 0199 AB99 A9 FF LDAIM &FF 0200 AB9B 8D 74 10 STA HIWORK 0201 AB9E 8D 75 10 STA HIWORK + &01 0202 ABA1 68 PLA 0203 ABA2 60 DSKSEX RTS 0204 ABA3 0205 ABA3 ;Init for read 0206 ABA3 A9 01 RDINT LDAIM RDMCLA 0207 ABA5 20 D6 AB JSR CHKTUB 0208 ABA8 A9 01 RDINT0 LDAIM RDMCLA 0209 ABAA 20 20 B9 JSR NMICLA 0210 ABAD A9 53 LDAIM &53 0211 ABAF D0 0C BNE INTJMP 0212 ABB1 0213 ABB1 ;Init for write 0214 ABB1 A9 00 WTINT LDAIM WRMCLA 0215 ABB3 20 D6 AB JSR CHKTUB 0216 ABB6 A9 00 WRINT0 LDAIM WRMCLA 0217 ABB8 20 20 B9 JSR NMICLA 0218 ABBB A9 4B LDAIM &4B 0219 ABBD 85 A1 INTJMP STA SAVCOM 0220 ABBF A9 00 LDAIM DIRLOW ;Load into dir space 0221 ABC1 85 A6 STA RAMADR 0222 ABC3 A9 0E LDAIM /(DIRLOW ) 0223 ABC5 85 A7 STA RAMADR + &01 0224 ABC7 A9 0A LDTRYS LDAIM TRIES 0225 ABC9 85 A2 STA CNTA 0226 ABCB 60 RTS 0227 ABCC 0228 ABCC ;Check whether tube should be used 0229 ABCC ;Returns: 0230 ABCC ; Tubed => C clear,TUBFLG=$FF 0231 ABCC ; Untubed => C set,TUBFLG=$00 0232 ABCC AD 80 10 DOADDR LDA TUBCOM 0233 ABCF 48 PHA ;Just takes address at LDLOW 0234 ABD0 AD D5 10 LDA TUBFLG 0235 ABD3 4C F2 AB JMP DOADD0 0236 ABD6 0237 ABD6 48 CHKTUB PHA ;Stores in LDLOW 0238 ABD7 8D 80 10 STA TUBCOM 0239 ABDA A5 BC LDA WORK + &02 0240 ABDC 8D 72 10 STA LDLOW 0241 ABDF A5 BD LDA WORK + &03 0242 ABE1 8D 73 10 STA LDLOW + &01 0243 ABE4 AD 74 10 LDA HIWORK 0244 ABE7 2D 75 10 AND HIWORK + &01 0245 ABEA 0D D6 10 ORA NOTUBE 0246 ABED 49 FF EORIM &FF 0247 ABEF 8D D5 10 STA TUBFLG ;Store current tube status 0248 ABF2 38 DOADD0 SEC 0249 ABF3 F0 0D BEQ CKTUB1 0250 ABF5 20 04 AC JSR CLATUB 0251 ABF8 A2 72 LDXIM LDLOW 0252 ABFA A0 10 LDYIM /(LDLOW ) 0253 ABFC 68 PLA 0254 ABFD 48 PHA 0255 ABFE 20 06 04 JSR TUBADR 0256 AC01 18 CLC 0257 AC02 68 CKTUB1 PLA 0258 AC03 60 RTS 0259 AC04 0260 AC04 ;Claim tube - if not ready hang until 0261 AC04 ; it is ready 0262 AC04 48 CLATUB PHA 0263 AC05 A9 C1 CLATB0 LDAIM &C0 + TUBEID ;Magic number for claim 0264 AC07 20 06 04 JSR TUBADR 0265 AC0A 90 F9 BCC CLATB0 0266 AC0C 68 PLA 0267 AC0D 60 RTS 0268 AC0E 0269 AC0E ;Check for errors - retry if required 0270 AC0E ;and go onto next track if OK 0271 AC0E 20 A7 AC CHKGET JSR DSKRES 0272 AC11 D0 1F BNE CHKER1 0273 AC13 20 C7 AB JSR LDTRYS ;Reset tries counter 0274 AC16 E6 CE INC TRACK 0275 AC18 A9 00 LDAIM &00 0276 AC1A 85 CF STA SECTOR 0277 AC1C AD 7C 10 LDA SECNO ;Update address for tube 0278 AC1F 18 CLC 0279 AC20 6D 73 10 ADC LDLOW + &01 0280 AC23 8D 73 10 STA LDLOW + &01 0281 AC26 90 23 BCC GETTS 0282 AC28 EE 74 10 INC LDLOW + &02 0283 AC2B D0 1E BNE GETTS 0284 AC2D EE 75 10 INC LDLOW + &03 0285 AC30 B0 19 BCS GETTS ;Always 0286 AC32 C6 A2 CHKER1 DEC CNTA ;Too many errors ? 0287 AC34 10 03 BPL CHKER4 0288 AC36 4C C7 AA JMP DKNERN 0289 AC39 A0 04 CHKER4 LDYIM &04 ;Restore params Acorn macro assembler Page 19 - DOS03 - Disk Primitives 0290 AC3B B9 40 10 CHKER2 LDAAY SAVPAR 0291 AC3E 99 A3 00 STAAY READNO 0292 AC41 88 DEY 0293 AC42 10 F7 BPL CHKER2 0294 AC44 8A TXA ;Restore address if required 0295 AC45 48 PHA 0296 AC46 20 CC AB JSR DOADDR 0297 AC49 68 PLA 0298 AC4A AA TAX 0299 AC4B 0300 AC4B ;Get track and sectors 0301 AC4B A5 A5 GETTS LDA READNO + &02 ;Finished ?? 0302 AC4D F0 42 BEQ GETTS2 0303 AC4F A0 04 LDYIM &04 ;Backup params 0304 AC51 B9 A3 00 GETTS3 LDAAY READNO 0305 AC54 99 40 10 STAAY SAVPAR 0306 AC57 88 DEY 0307 AC58 10 F7 BPL GETTS3 0308 AC5A A5 A1 LDA SAVCOM ;No - start new R/W 0309 AC5C 20 92 AC JSR CMDDRV 0310 AC5F A5 CE LDA TRACK 0311 AC61 20 85 AC JSR DSKPAR 0312 AC64 A5 CF LDA SECTOR 0313 AC66 20 85 AC JSR DSKPAR 0314 AC69 A9 0A LDAIM SECTRK ;Get sectors left 0315 AC6B 38 SEC 0316 AC6C E5 CF SBC SECTOR 0317 AC6E 8D 7C 10 STA SECNO 0318 AC71 A5 A5 LDA READNO + &02 0319 AC73 C9 01 CMPIM &01 ;Lots left ?? 0320 AC75 D0 09 BNE GETTS0 0321 AC77 A5 A4 LDA READNO + &01 0322 AC79 F0 05 BEQ GETTS0 ;************************** 0323 AC7B CD 7C 10 CMP SECNO 0324 AC7E 90 03 BCC GETTS1 0325 AC80 AD 7C 10 GETTS0 LDA SECNO 0326 AC83 09 20 GETTS1 ORAIM &20 ;256 Byte sectors 0327 AC85 0328 AC85 ;Chuck data at disk parameter register 0329 AC85 48 DSKPAR PHA 0330 AC86 AD 80 FE DSKPRL LDA FDCS 0331 AC89 29 20 ANDIM &20 0332 AC8B [ $emu 0335 AC8B | 0336 AC8B D0 F9 BNE DSKPRL 0337 AC8D ] 0338 AC8D 68 PLA 0339 AC8E 8D 81 FE STA FDCP 0340 AC91 60 GETTS2 RTS 0341 AC92 0342 AC92 ;Send command to disk controller 0343 AC92 ; setting the drive bits 0344 AC92 48 CMDDRV PHA 0345 AC93 A5 CD LDA FDRIVE 0346 AC95 6A RORA 0347 AC96 68 PLA 0348 AC97 90 02 BCC DSKCMD 0349 AC99 49 C0 EORIM &C0 0350 AC9B 0351 AC9B ;Bung command at Disc Controller 0352 AC9B ; commmand register 0353 AC9B 2C 80 FE DSKCMD BIT FDCC 0354 AC9E [ $emu 0357 AC9E | 0358 AC9E 30 FB BMI DSKCMD 0359 ACA0 ] 0360 ACA0 8D 80 FE STA FDCC 0361 ACA3 60 RTS 0362 ACA4 0363 ACA4 ; Put a sequence of commands and get a result 0364 ACA4 20 95 AA CMDRES JSR CMDPAR 0365 ACA7 ;Get result from Disc Controller result 0366 ACA7 ; register 0367 ACA7 20 AE AC DSKRES JSR DSKWAI 0368 ACAA AD 81 FE LDA FDCR 0369 ACAD 60 RTS 0370 ACAE 0371 ACAE ;Wait for disk to finish 0372 ACAE DSKWAI 0373 ACAE 2C 80 FE DSKWA0 BIT FDCS 0374 ACB1 [ $emu 0377 ACB1 | 0378 ACB1 30 FB BMI DSKWA0 0379 ACB3 ] 0380 ACB3 2C 80 FE BIT FDCS 0381 ACB6 [ $emu 0384 ACB6 | 0385 ACB6 30 F6 BMI DSKWA0 0386 ACB8 ] 0387 ACB8 60 RTS 0388 ACB9 0389 ACB9 0390 ACB9 ;Init FDC chip. 0391 ACB9 20 A4 B9 INIFDC JSR READSW ;Work out D Drives from switches 0392 ACBC 8A TXA 0393 ACBD 29 30 ANDIM &30 0394 ACBF 4A LSRA 0395 ACC0 4A LSRA 0396 ACC1 85 B0 STA TEMP 0397 ACC3 4A LSRA 0398 ACC4 65 B0 ADC TEMP 0399 ACC6 A8 TAY 0400 ACC7 20 95 AA JSR CMDPAR 0401 ACCA A0 18 LDYIM INIDKZ - CMDTAB 0402 ACCC A2 03 LDXIM &03 0403 ACCE 20 95 AA DSKINL JSR CMDPAR ;Init drives 0404 ACD1 CA DEX 0405 ACD2 D0 FA BNE DSKINL 0406 ACD4 ; and set the restore semaphore 0407 ACD4 8E 85 10 STX QSTORE ; to 0 0408 ACD7 60 RTS 0409 ACD8 0410 ACD8 0411 ACD8 35 0D 02 CMDTAB = &35,&0D,&02,&08,&C0,&EA ;Tandon (pushing it) 0412 ACDE 35 0D 03 = &35,&0D,&03,&08,&C0,&EA ;Shugart + Tandon (easy) 0413 ACE4 0414 ACE4 35 0D 03 = &35,&0D,&03,&08,&C7,&EA ;Teac FD55 ************ HMT 0415 ACEA 0416 ACEA 35 0D 0C = &35,&0D,&0C,&0A,&C8,&EA ;Olivetti 0417 ACF0 35 10 FF INIDKZ = &35,&10,&FF,&FF,&00,&EA ;Bad tracks surface 0 0418 ACF6 35 18 FF = &35,&18,&FF,&FF,&00,&EA ;Bad tracks surface 1 Acorn macro assembler Page 20 - DOS03 - Disk Primitives 0419 ACFC 3A 17 C1 = &3A,&17,&C1,&EA ;Mode register setup 0420 AD00 69 00 EA DSKQRZ = &69,&00,&EA ;Seek track zero 0421 AD03 5F 00 08 CHKSPD = &5F,&00,&08,&22,&EA ;Verify secs 8,9 track 0 0422 AD08 ; ******RSRTK0 = $3D,$12,$EA ; Read special register - Track # on drive 0 0423 AD08 ; ******RSRTK1 = $3D,$1A,$EA ; Read special register - Track # on drive 1 0424 AD08 3D 06 EA RSRSEC = &3D,&06,&EA ; Read special register - Sector number 0425 AD0B 7D 23 EA RSROP = &7D,&23,&EA ; Read Special Reg. - Output port 0426 AD0E 0427 AD0E 0428 AD0E ;Code to catch NMIs ends up here with 0429 AD0E ;read code inserted by default - and 0430 AD0E ;a write modification overlayed on top 0431 AD0E ;for writing - surprisingly both are 0432 AD0E ;the same length 0433 AD0E 0434 AD0E 0435 AD0E ;++++++++++++ 0436 AD0E ;Write to disk overlay 0437 AD0E AC D5 10 WRIOVR LDY TUBFLG 0438 AD11 F0 09 BEQ WMEBYT 0439 AD13 0440 AD13 ;Load from tube to disk 0441 AD13 AD E5 FE LDA TUBE 0442 AD16 8D 84 FE STA FDCD 0443 AD19 4C 23 0D JMP MENMI0 - RDMNMI + INTNMI 0444 AD1C 0445 AD1C B1 A6 WMEBYT LDAIY RAMADR ;Get data from memory 0446 AD1E 8D 84 FE STA FDCD ;Store to disk 0447 AD21 ;++++++++++++ 0448 AD21 0449 AD21 0450 AD21 ;Read from disk 0451 AD21 48 RDMNMI PHA ;Save A and Y 0452 AD22 98 TYA 0453 AD23 48 PHA 0454 AD24 AD 80 FE LDA FDCC ;Check for data ready 0455 AD27 29 04 ANDIM &04 0456 AD29 F0 27 BEQ NMIB ;Not data 0457 AD2B ;------------ 0458 AD2B ;This bit gets overlayed if writing 0459 AD2B NMIOVR 0460 AD2B AD 84 FE LDA FDCD ;Read data off disk 0461 AD2E A4 A5 LDY READNO + &02 0462 AD30 F0 1C BEQ MENMI2 0463 AD32 AC D5 10 LDY TUBFLG 0464 AD35 F0 05 BEQ RMEBYT 0465 AD37 0466 AD37 ;Store across tube 0467 AD37 8D E5 FE STA TUBE 0468 AD3A D0 08 BNE MENMI0 ;Always 0469 AD3C 0470 AD3C 91 A6 RMEBYT STAIY RAMADR ;Store in memory 0471 AD3E ;------------ 0472 AD3E E6 A6 MENMI1 INC RAMADR ;Increment address 0473 AD40 D0 02 BNE MENMI0 0474 AD42 E6 A7 INC RAMADR + &01 0475 AD44 C6 A3 MENMI0 DEC READNO 0476 AD46 D0 06 BNE MENMI2 0477 AD48 C6 A4 DEC READNO + &01 0478 AD4A D0 02 BNE MENMI2 0479 AD4C C6 A5 DEC READNO + &02 0480 AD4E 68 MENMI2 PLA ;Return restoring Y and A 0481 AD4F A8 TAY 0482 AD50 68 PLA 0483 AD51 40 NOPNMI RTI 0484 AD52 0485 AD52 ;Not a byte moved interupt 0486 AD52 AD 80 FE NMIB LDA FDCS 0487 AD55 29 08 ANDIM &08 0488 AD57 F0 F5 BEQ MENMI2 ;Unknown - ignore 0489 AD59 0490 AD59 ;End of sectors - look for more 0491 AD59 A5 F4 LDA ROMID 0492 AD5B 48 PHA 0493 AD5C A9 00 MYID LDAIM &00 ;Switch ROMS 0494 AD5E 85 F4 STA ROMID 0495 AD60 8D 30 FE STA ROMSW 0496 AD63 20 0E AC JSR CHKGET 0497 AD66 68 PLA 0498 AD67 85 F4 STA ROMID 0499 AD69 8D 30 FE STA ROMSW 0500 AD6C 38 SEC 0501 AD6D B0 DF BCS MENMI2 0502 AD6F 0503 AD6F 48 RMFNMI PHA 0504 AD70 98 TYA 0505 AD71 48 PHA 0506 AD72 AD 80 FE LDA FDCC 0507 AD75 29 04 ANDIM &04 0508 AD77 F0 0D BEQ RMFNM0 0509 AD79 AD 84 FE LDA FDCD 0510 AD7C A0 00 LDYIM &00 0511 AD7E 91 A6 STAIY RAMADR 0512 AD80 E6 A6 INC RAMADR 0513 AD82 D0 02 BNE RMFNM0 0514 AD84 E6 A7 INC RAMADR + &01 0515 AD86 68 RMFNM0 PLA 0516 AD87 A8 TAY 0517 AD88 68 PLA 0518 AD89 40 RTI 0519 AD8A 0520 AD8A 48 WMFNMI PHA 0521 AD8B 98 TYA 0522 AD8C 48 PHA 0523 AD8D AD 80 FE LDA FDCC 0524 AD90 29 04 ANDIM &04 0525 AD92 F0 0D BEQ WMFNM0 0526 AD94 A0 00 LDYIM &00 0527 AD96 B1 A6 LDAIY RAMADR 0528 AD98 8D 84 FE STA FDCD 0529 AD9B E6 A6 INC RAMADR 0530 AD9D D0 02 BNE WMFNM0 0531 AD9F E6 A7 INC RAMADR + &01 0532 ADA1 68 WMFNM0 PLA 0533 ADA2 A8 TAY 0534 ADA3 68 PLA 0535 ADA4 40 RTI 0536 ADA5 0537 ADA5 48 RTFNMI PHA 0538 ADA6 AD 80 FE LDA FDCC 0539 ADA9 29 04 ANDIM &04 Acorn macro assembler Page 21 - DOS03 - Disk Primitives 0540 ADAB F0 06 BEQ RTFNM0 0541 ADAD AD 84 FE LDA FDCD 0542 ADB0 8D E5 FE STA TUBE 0543 ADB3 68 RTFNM0 PLA 0544 ADB4 40 RTI 0545 ADB5 0546 ADB5 48 WTFNMI PHA 0547 ADB6 AD 80 FE LDA FDCC 0548 ADB9 29 04 ANDIM &04 0549 ADBB F0 06 BEQ FNMIY 0550 ADBD AD E5 FE LDA TUBE 0551 ADC0 8D 84 FE STA FDCD 0552 ADC3 68 FNMIY PLA 0553 ADC4 40 RTI 0554 ADC5 0555 ADC5 NMIEND 0556 ADC5 20 DF AD TTSSER JSR DIGER1 0557 ADC8 20 CF 9F JSR GSTRNG 0558 ADCB 00 20 61 = &00," at " 0559 ADD0 A5 CE LDA TRACK 0560 ADD2 20 DF AD JSR DIGER1 0561 ADD5 20 CF 9F JSR GSTRNG 0562 ADD8 00 2F = &00,"/" 0563 ADDA A0 30 LDYIM RSRSEC-CMDTAB 0564 ADDC 20 A4 AC JSR CMDRES 0565 ADDF ; Put 2 hex digits from A at $0100,X 0566 ADDF 48 DIGER1 PHA 0567 ADE0 20 38 A1 JSR SFOUR 0568 ADE3 20 45 A0 JSR DIGUT1 0569 ADE6 9D 00 01 STAAX &0100 0570 ADE9 E8 INX 0571 ADEA 68 PLA 0572 ADEB 20 45 A0 JSR DIGUT1 0573 ADEE 9D 00 01 STAAX &0100 0574 ADF1 E8 INX 0575 ADF2 60 RTS 0576 ADF3 0577 ADF3 0578 ADF3 0579 ADF3 LNK DOS04 0001 ADF3 ;*** File Four *** > DOS04 0002 ADF3 TTL - DOS04 - Sequential File System 0003 ADF3 OPT &01 0004 ADF3 ;FILE 04. SEQUENTIAL FILES. 0005 ADF3 ;FIND,SHUT,RADR. CHECKSUMS 0006 ADF3 0007 ADF3 ;A.C. NORMAN. DEC 79/JAN 80. 0008 ADF3 0009 ADF3 0010 ADF3 ;$ THE AFL CODE GIVEN HERE 0011 ADF3 ; IS AN INFORMAL GUIDE TO 0012 ADF3 ; HOW THE ROUTINES ARE CODED, 0013 ADF3 ; AND MISS OUT SOME FINE BIT- 0014 ADF3 ; ADJUSTING DETAILS $ 0015 ADF3 ;DCL VSHUT(A): 0016 ADF3 ; IF A=0 THEN 0017 ADF3 ; FOR AA FROM #20 TO #100 0018 ADF3 ; STEP #20 DO VSHUT(AA) OD 0019 ADF3 ; ELIF SEQFLG&(CBU OR DUF)=0 0020 ADF3 ; THEN CLEAR BIT IN DCBMAP 0021 ADF3 ; ELSE 0022 ADF3 ; LOOKUP(FILENAME(A)); 0023 ADF3 ; IF NOTFOUND THEN BRK() FI; 0024 ADF3 ; IF SEQFLG&DUF THEN 0025 ADF3 ; UPDATEDIRECTORY(); 0026 ADF3 ; DIROUT() FI; 0027 ADF3 ; FLUSHIFCBU(); 0028 ADF3 ; CLEAR BIT IN DCBMAP 0029 ADF3 ; FI; 0030 ADF3 0031 ADF3 ;Handle limits 0032 ADF3 A2 11 WHLIM LDXIM &11 ;Get low handle limit 0033 ADF5 A0 15 LDYIM &15 ;High handle limit 0034 ADF7 60 SHTAL1 RTS 0035 ADF8 0036 ADF8 ;Die my FS => close spool & exec 0037 ADF8 20 27 A3 WFDIE JSR SAVITA 0038 ADFB A9 77 LDAIM BYTECS 0039 ADFD 4C F4 FF JMP OSBYTE 0040 AE00 0041 AE00 20 F8 AD CLOSE2 JSR WFDIE ;Kill off exec & spool 0042 AE03 A9 00 SHTALL LDAIM &00 0043 AE05 18 SHTAL0 CLC 0044 AE06 69 20 ADCIM &20 0045 AE08 F0 ED BEQ SHTAL1 0046 AE0A A8 TAY 0047 AE0B 20 1B AE JSR VSHUT 0048 AE0E D0 F5 BNE SHTAL0 ;Always 0049 AE10 0050 AE10 A9 20 WSHUT LDAIM &20 0051 AE12 8D 86 10 STA DUFFLG ; Default value of DUFFLG 0052 AE15 0053 AE15 98 TYA 0054 AE16 F0 E8 BEQ CLOSE2 ;Close all files 0055 AE18 20 0D B1 JSR DCRYCH ;Decrypt handle & check 0056 AE1B 0057 AE1B 48 VSHUT PHA 0058 AE1C 20 8C B0 JSR CHEEKY ;Check handle 0059 AE1F B0 46 BCS VSHUTQ ;Not open 0060 AE21 B9 1B 11 LDAAY SEQBIT ;Close it for me 0061 AE24 49 FF EORIM &FF 0062 AE26 2D C0 10 AND DCBMAP 0063 AE29 8D C0 10 STA DCBMAP 0064 AE2C B9 17 11 LDAAY SEQFLG 0065 AE2F 29 60 ANDIM &60 ; CBU+DUF 0066 AE31 F0 34 BEQ VSHUTQ ;Input ] that's all folks! 0067 AE33 20 6C AE JSR VLOOK 0068 AE36 B9 17 11 LDAAY SEQFLG 0069 AE39 2D 86 10 AND DUFFLG ; $20 for normal close, 0 for just ensure 0070 AE3C F0 26 BEQ VSHDD 0071 AE3E AE C3 10 LDX SEQWB ;Write back length to dir 0072 AE41 B9 14 11 LDAAY SEQLLA 0073 AE44 9D 0C 0F STAAX CATHIG + &04 0074 AE47 B9 15 11 LDAAY SEQLMA 0075 AE4A 9D 0D 0F STAAX CATHIG + &05 0076 AE4D B9 16 11 LDAAY SEQLHA 0077 AE50 20 3E A1 JSR LFOUR 0078 AE53 5D 0E 0F EORAX CATHIG + &06 0079 AE56 29 30 ANDIM &30 0080 AE58 5D 0E 0F EORAX CATHIG + &06 ; 2-XOR'S 0081 AE5B 9D 0E 0F STAAX CATHIG + &06 Acorn macro assembler Page 22 - DOS04 - Sequential File System 0082 AE5E 20 3B AA JSR DIROUT ;Put dir back on disc 0083 AE61 AC C2 10 LDY DCBY 0084 AE64 20 B6 B1 VSHDD JSR BFLUSH ;Write buffer to disc 0085 AE67 AE C5 10 VSHUTQ LDX SEQWX 0086 AE6A 68 PLA 0087 AE6B 60 RTS 0088 AE6C 0089 AE6C 20 87 AE VLOOK JSR SETQ ;Set qualif/drive 0090 AE6F A2 06 VLOOK3 LDXIM &06 0091 AE71 B9 0C 11 VSHUTL LDAAY SEQLOK - &02 0092 AE74 95 C5 STAAX WORK + &0B 0093 AE76 88 DEY 0094 AE77 88 DEY 0095 AE78 CA DEX 0096 AE79 10 F6 BPL VSHUTL 0097 AE7B 20 AC A1 JSR LOOKW ;Y:=DIRECTORY ENTRY 0098 AE7E 90 22 BCC DSKCHN ; DISASTER! NOT THERE 0099 AE80 8C C3 10 STY SEQWB ; POINTER TO DIRECTORY 0100 AE83 AC C2 10 LDY DCBY 0101 AE86 60 CKSAM0 RTS 0102 AE87 0103 AE87 ;Set qualifier and drive 0104 AE87 B9 0E 11 SETQ LDAAY SEQLOK 0105 AE8A 29 7F ANDIM &7F 0106 AE8C 85 CC STA QUALIF 0107 AE8E B9 17 11 LDAAY SEQFLG 0108 AE91 4C 99 A6 JMP DODRIV ; may wait if transfer still going 0109 AE94 0110 AE94 ;Check disk same - otherwise throw up 0111 AE94 20 27 A3 CHKSAM JSR SAVITA 0112 AE97 AD 04 0F LDA CYCNO 0113 AE9A 20 C2 A2 JSR GETDIR 0114 AE9D CD 04 0F CMP CYCNO 0115 AEA0 F0 E4 BEQ CKSAM0 0116 AEA2 20 A3 9F DSKCHN JSR DSKMSG 0117 AEA5 C8 63 68 = DKCNUM,"changed",&00 0118 AEAE 0119 AEAE ;VFIND OPENS A SEQUENTIAL 0120 AEAE ;FILE. 0121 AEAE ;IF C IS SET THE FILE MUST 0122 AEAE ;ALREADY EXIST, AND IT WILL BE 0123 AEAE ;SET UP FOR INPUT OR UPDATING. 0124 AEAE ;IF C IS CLEAR IT WILL BE SET 0125 AEAE ;UP FOR OUTPUT. 0126 AEAE ;N.B. IF FIND HAS TO CREATE A 0127 AEAE ;NEW FILE IT CLOBBERS THE WORK 0128 AEAE ;VECTOR IN SUCH A WAY THAT ITS 0129 AEAE ;ARG MUST NOT HAVE BEEN IN THAT 0130 AEAE ;AREA. 0131 AEAE 0132 AEAE 0133 AEAE 29 C0 WFIND ANDIM &C0 ; Top 2 bits only 0134 AEB0 D0 06 BNE WFIND0 0135 AEB2 20 27 A3 JSR SAVITA 0136 AEB5 4C 10 AE JMP WSHUT 0137 AEB8 20 50 A3 WFIND0 JSR SAVIT 0138 AEBB 86 BA STX WORK 0139 AEBD 84 BB STY WORK + &01 0140 AEBF 85 B4 STA ATEMP 0141 AEC1 24 B4 BIT ATEMP 0142 AEC3 08 PHP ;V flag indicates I/O 0143 AEC4 20 70 A0 JSR FRMNAM ; COPY NAME TO WORK VEC 0144 AEC7 20 FB B7 JSR CLRWLD 0145 AECA 20 C3 A1 JSR LOOKUP ; FIND IN DIRECTORY 0146 AECD B0 1A BCS NEWDCB ;File exists 0147 AECF 28 PLP ;File does not exist 0148 AED0 50 03 BVC VNEWO ;OPENOUT ] make a new one 0149 AED2 A9 00 LDAIM &00 ;OPENIN ] return A=0 0150 AED4 60 RTS 0151 AED5 0152 AED5 08 VNEWO PHP ;Generate new file 0153 AED6 A9 00 LDAIM &00 ;Clear FCB 0154 AED8 A2 07 LDXIM &07 0155 AEDA 95 BC VNEWL STAZX WORK + &02 ;Leave name 0156 AEDC 9D 74 10 STAAX HIWORK 0157 AEDF CA DEX 0158 AEE0 10 F8 BPL VNEWL 0159 AEE2 A9 40 LDAIM DFSIZE ;Default file size(secs) 0160 AEE4 85 C3 STA WORK + &09 0161 AEE6 20 BF A8 JSR DIRDO ;Create file 0162 AEE9 0163 AEE9 ;Find a free DCB to use - Y points to 0164 AEE9 ;file in catalogue 0165 AEE9 28 NEWDCB PLP 0166 AEEA 08 PHP 0167 AEEB 70 03 BVS FIND3 0168 AEED 20 A8 B8 JSR CHKLOK ;Check locked if OPENOUT 0169 AEF0 20 B6 AF FIND3 JSR CMPFIL ;Look for file open 0170 AEF3 90 0E BCC FIND1 0171 AEF5 B9 0C 11 FIND2 LDAAY SEQRDO ;Check R/O 0172 AEF8 10 20 BPL FILOPN 0173 AEFA 24 B4 BIT ATEMP ;Check request R/O 0174 AEFC 30 1C BMI FILOPN 0175 AEFE 20 B1 AF JSR NXTFIL ;Carry on search 0176 AF01 B0 F2 BCS FIND2 0177 AF03 AC C2 10 FIND1 LDY DCBY ;Free DCB found ?? 0178 AF06 D0 1B BNE SEQNUL 0179 AF08 0180 AF08 20 B8 9F JSR ESTRNG 0181 AF0B C0 54 6F = TMFNUM,"Too many open",&00 0182 AF1A 20 B8 9F FILOPN JSR ESTRNG 0183 AF1D C2 4F 70 = FOPNUM,"Open",&00 0184 AF23 0185 AF23 A9 08 SEQNUL LDAIM &08 ;Copy from dir to FCB 0186 AF25 8D C4 10 STA SEQWC ;Counter 0187 AF28 BD 08 0E FILLDA LDAAX CATLOW 0188 AF2B 99 00 11 STAAY SEQMAP 0189 AF2E C8 INY 0190 AF2F BD 08 0F LDAAX CATHIG 0191 AF32 99 00 11 STAAY SEQMAP 0192 AF35 C8 INY 0193 AF36 E8 INX 0194 AF37 CE C4 10 DEC SEQWC 0195 AF3A D0 EC BNE FILLDA 0196 AF3C A2 10 LDXIM &10 0197 AF3E A9 00 LDAIM &00 0198 AF40 99 00 11 FILLDB STAAY SEQMAP 0199 AF43 C8 INY 0200 AF44 CA DEX 0201 AF45 D0 F9 BNE FILLDB ; ZERO TO 2ND HALF. 0202 AF47 AD C2 10 LDA DCBY Acorn macro assembler Page 23 - DOS04 - Sequential File System 0203 AF4A A8 TAY 0204 AF4B 20 37 A1 JSR SFIVE 0205 AF4E 69 11 ADCIM /(SEQMAP ) ; BUFFER ADDRESS 0206 AF50 99 13 11 STAAY SEQBUF 0207 AF53 AD C1 10 LDA DCBBIT 0208 AF56 99 1B 11 STAAY SEQBIT 0209 AF59 0D C0 10 ORA DCBMAP 0210 AF5C 8D C0 10 STA DCBMAP 0211 AF5F B9 09 11 LDAAY SEQLL 0212 AF62 69 FF ADCIM &FF ; carry clear because of preceeding add 0213 AF64 B9 0B 11 LDAAY SEQLM 0214 AF67 69 00 ADCIM &00 0215 AF69 99 19 11 STAAY SEQEM 0216 AF6C B9 0D 11 LDAAY SEQLH 0217 AF6F 09 0F ORAIM &0F 0218 AF71 69 00 ADCIM &00 0219 AF73 20 30 A1 JSR ISOLEN 0220 AF76 99 1A 11 STAAY SEQEH ; EXTENT 0221 AF79 28 PLP ;Get R/W status 0222 AF7A 50 2E BVC VFINDO ;Was new file 0223 AF7C 30 08 BMI VFIND1 ;R/W 0224 AF7E A9 80 LDAIM &80 ;Set R/O bit 0225 AF80 19 0C 11 ORAAY SEQRDO 0226 AF83 99 0C 11 STAAY SEQRDO 0227 AF86 B9 09 11 VFIND1 LDAAY SEQLL ;Move length 0228 AF89 99 14 11 STAAY SEQLLA 0229 AF8C B9 0B 11 LDAAY SEQLM 0230 AF8F 99 15 11 STAAY SEQLMA 0231 AF92 B9 0D 11 LDAAY SEQLH 0232 AF95 20 30 A1 JSR ISOLEN 0233 AF98 99 16 11 STAAY SEQLHA 0234 AF9B A5 CD VFINXX LDA FDRIVE 0235 AF9D 19 17 11 ORAAY SEQFLG 0236 AFA0 99 17 11 STAAY SEQFLG 0237 AFA3 98 TYA 0238 AFA4 20 37 A1 JSR SFIVE ;Encrypt handle 0239 AFA7 09 10 ORAIM &10 0240 AFA9 60 RTS 0241 AFAA 0242 AFAA A9 20 VFINDO LDAIM &20 0243 AFAC 99 17 11 STAAY SEQFLG 0244 AFAF D0 EA BNE VFINXX ;Always 0245 AFB1 0246 AFB1 ;Find next file open 0247 AFB1 8A NXTFIL TXA 0248 AFB2 48 PHA 0249 AFB3 4C F5 AF JMP CMPFL1 0250 AFB6 0251 AFB6 ;Look for file open 0252 AFB6 A9 00 CMPFIL LDAIM &00 ;No free DCBs found yet 0253 AFB8 8D C2 10 STA DCBY 0254 AFBB A9 08 LDAIM &08 ;Fifth bit 0255 AFBD 85 B5 STA YTEMP 0256 AFBF 98 TYA 0257 AFC0 AA TAX 0258 AFC1 A0 A0 LDYIM &A0 ;Fifth DCB 0259 AFC3 84 B3 CMPFL4 STY ITEMP 0260 AFC5 8A TXA 0261 AFC6 48 PHA 0262 AFC7 A9 08 LDAIM &08 0263 AFC9 85 B2 STA XTEMP 0264 AFCB A5 B5 LDA YTEMP ;Is it alive anyway ?? 0265 AFCD 2C C0 10 BIT DCBMAP 0266 AFD0 F0 1D BEQ CMPFL5 ;No !! 0267 AFD2 B9 17 11 LDAAY SEQFLG ;Check same drive 0268 AFD5 45 CD EOR FDRIVE 0269 AFD7 29 03 ANDIM &03 0270 AFD9 D0 1A BNE CMPFL1 0271 AFDB BD 08 0E CMPFL0 LDAAX CATLOW 0272 AFDE 59 00 11 EORAY SEQMAP 0273 AFE1 29 7F ANDIM &7F ;Knock off top bit 0274 AFE3 D0 10 BNE CMPFL1 0275 AFE5 E8 INX 0276 AFE6 C8 INY 0277 AFE7 C8 INY 0278 AFE8 C6 B2 DEC XTEMP 0279 AFEA D0 EF BNE CMPFL0 0280 AFEC 38 SEC ;We have a match !! 0281 AFED B0 10 BCS CMPFL2 0282 AFEF 8C C2 10 CMPFL5 STY DCBY ;Free DCB found - save for later use 0283 AFF2 8D C1 10 STA DCBBIT 0284 AFF5 38 CMPFL1 SEC ;Go onto next DCB 0285 AFF6 A5 B3 LDA ITEMP 0286 AFF8 E9 20 SBCIM &20 0287 AFFA 85 B3 STA ITEMP 0288 AFFC 06 B5 ASL YTEMP 0289 AFFE 18 CLC 0290 AFFF 68 CMPFL2 PLA 0291 B000 AA TAX 0292 B001 A4 B3 LDY ITEMP 0293 B003 A5 B5 LDA YTEMP 0294 B005 B0 02 BCS CMPFL3 0295 B007 D0 BA BNE CMPFL4 0296 B009 60 CMPFL3 RTS 0297 B00A 0298 B00A ;Ensure file/files depending on Y 0299 B00A 20 26 B0 ENSUR JSR WOPA 0300 B00D AD C0 10 NSRNOW LDA DCBMAP ;********** HMT 0301 B010 48 PHA 0302 B011 0303 B011 A9 00 LDAIM &00 0304 B013 8D 86 10 STA DUFFLG ; Dont update the cat 0305 B016 0306 B016 98 TYA 0307 B017 D0 05 BNE ENSUR1 0308 B019 20 03 AE JSR SHTALL 0309 B01C F0 03 BEQ ENSUR0 ;Always 0310 B01E 20 10 AE ENSUR1 JSR WSHUT 0311 B021 68 ENSUR0 PLA 0312 B022 8D C0 10 STA DCBMAP 0313 B025 60 RTS 0314 B026 0315 B026 48 WOPA PHA 0316 B027 8A TXA 0317 B028 48 PHA 0318 B029 A9 00 LDAIM &00 0319 B02B BA TSX 0320 B02C 9D 09 01 STAAX &109 0321 B02F 68 PLA 0322 B030 AA TAX 0323 B031 68 PLA Acorn macro assembler Page 24 - DOS04 - Sequential File System 0324 B032 60 RTS 0325 B033 0326 B033 ;OSARGS called - only A = 0-2 supported 0327 B033 20 27 A3 WARGS JSR SAVITA 0328 B036 C9 FF CMPIM &FF 0329 B038 F0 D0 BEQ ENSUR 0330 B03A C0 00 CPYIM &00 0331 B03C F0 0E BEQ WARGS1 0332 B03E C9 03 CMPIM &03 0333 B040 B0 23 BCS WARGSR 0334 B042 20 26 B0 JSR WOPA 0335 B045 C9 01 CMPIM &01 0336 B047 D0 24 BNE VRADR 0337 B049 4C 05 B3 JMP VSTAR 0338 B04C C9 02 WARGS1 CMPIM &02 0339 B04E B0 15 BCS WARGSR 0340 B050 20 26 B0 JSR WOPA 0341 B053 F0 11 BEQ RDFSNO 0342 B055 0343 B055 ;Return address of rest of command line 0344 B055 A9 FF LDAIM &FF 0345 B057 95 02 STAZX &02 0346 B059 95 03 STAZX &03 0347 B05B AD D9 10 LDA LINADR 0348 B05E 95 00 STAZX &00 0349 B060 AD DA 10 LDA LINADR + &01 0350 B063 95 01 STAZX &01 0351 B065 60 WARGSR RTS 0352 B066 0353 B066 ;Read filing system number 0354 B066 A9 04 RDFSNO LDAIM FSYSNO 0355 B068 BA TSX 0356 B069 9D 05 01 STAAX &105 0357 B06C 60 RTS 0358 B06D 0359 B06D ;Read pointer and length 0360 B06D ; A = 0 : Read pointer 0361 B06D ; A = 2 : Read length 0362 B06D 20 0D B1 VRADR JSR DCRYCH 0363 B070 8C C2 10 STY DCBY 0364 B073 0A ASLA 0365 B074 6D C2 10 ADC DCBY ;C=0 FOR VALID A! 0366 B077 A8 TAY ; POINTS AT LOW BYTE OF DATA 0367 B078 B9 10 11 LDAAY SEQPL 0368 B07B 95 00 STAZX &00 0369 B07D B9 11 11 LDAAY SEQPM 0370 B080 95 01 STAZX &01 0371 B082 B9 12 11 LDAAY SEQPH 0372 B085 95 02 STAZX &02 0373 B087 A9 00 LDAIM &00 ;File only 3 bytes long 0374 B089 95 03 STAZX &03 0375 B08B 60 RTS 0376 B08C 0377 B08C 0378 B08C ;SAVE X,Y. VERIFY Y VALID. 0379 B08C 48 CHEEKY PHA 0380 B08D 8E C5 10 STX SEQWX 0381 B090 98 TYA 0382 B091 29 E0 ANDIM &E0 ; LOW 5 BITS MUST BE 0 0383 B093 8D C2 10 STA DCBY ; FORCE THEM SO, SAVE Y 0384 B096 F0 13 BEQ CHEKYZ ; FAILURE 0385 B098 20 37 A1 JSR SFIVE 0386 B09B A8 TAY ; NUMBER 1 TO 7 0387 B09C A9 00 LDAIM &00 0388 B09E 38 SEC 0389 B09F 6A CHEKYA RORA 0390 B0A0 88 DEY 0391 B0A1 D0 FC BNE CHEKYA 0392 B0A3 ;THERE IS ONE BIT FOR EACH 0393 B0A3 ;POSSIBLE HANDLE. 0394 B0A3 AC C2 10 LDY DCBY 0395 B0A6 2C C0 10 BIT DCBMAP 0396 B0A9 D0 03 BNE CHEKYB ; OK 0397 B0AB 68 CHEKYZ PLA 0398 B0AC 38 SEC ; CARRY BIT INDICATES FAILURE 0399 B0AD 60 RTS 0400 B0AE 68 CHEKYB PLA 0401 B0AF 18 CLC ; SUCCESS 0402 B0B0 60 RTS 0403 B0B1 0404 B0B1 ;Decrypt handle in X 0405 B0B1 48 DCRYPX PHA 0406 B0B2 8A TXA 0407 B0B3 4C B8 B0 JMP DCRYP2 0408 B0B6 0409 B0B6 ;Decrypt handle 0410 B0B6 ;Returns carry clear if OK 0411 B0B6 48 DCRYPT PHA 0412 B0B7 98 TYA 0413 B0B8 C9 10 DCRYP2 CMPIM &10 0414 B0BA 90 04 BCC DCRYP0 0415 B0BC C9 18 CMPIM &18 0416 B0BE 90 02 BCC DCRYP1 0417 B0C0 A9 08 DCRYP0 LDAIM &08 ;Will set C and A=0 0418 B0C2 20 3D A1 DCRYP1 JSR LFIVE ;C = bit 3 0419 B0C5 A8 TAY 0420 B0C6 68 PLA 0421 B0C7 60 RTS 0422 B0C8 0423 B0C8 0424 B0C8 ;END OF FILE 04. 0425 B0C8 0426 B0C8 LNK DOS05 0001 B0C8 ;*** File Five *** > DOS05 0002 B0C8 TTL - DOS05 - Sequential filing system 0003 B0C8 ;FILE 05. SEQUENTIAL FILES. 0004 B0C8 0005 B0C8 0006 B0C8 ; HMTSPE 0007 B0C8 ; Closes spool/Exec file if necc. 0008 B0C8 ; Expects DCRYPTed handle in DCBY 0009 B0C8 A9 C6 HMTSPE LDAIM &C6 ; Read EXEC handle 0010 B0CA 20 A6 B9 JSR READBY ; Into X 0011 B0CD 0012 B0CD 8A TXA 0013 B0CE F0 09 BEQ HMTSP1 ; If not EXECing anyway 0014 B0D0 0015 B0D0 20 EC B0 JSR HMTCMP 0016 B0D3 D0 04 BNE HMTSP1 0017 B0D5 0018 B0D5 A9 C6 LDAIM &C6 ; Set the EXEC handle to 0 Acorn macro assembler Page 25 - DOS05 - Sequential filing system 0019 B0D7 D0 0C BNE HMTBYT 0020 B0D9 0021 B0D9 A9 C7 HMTSP1 LDAIM &C7 ; Read SPOOL handle 0022 B0DB 20 A6 B9 JSR READBY ; Into X 0023 B0DE 20 EC B0 JSR HMTCMP 0024 B0E1 D0 11 BNE HMTSP2 0025 B0E3 0026 B0E3 A9 C7 LDAIM &C7 ; Set the SPOOL handle to 0 0027 B0E5 0028 B0E5 A2 00 HMTBYT LDXIM &00 0029 B0E7 A0 00 LDYIM &00 0030 B0E9 4C F4 FF JMP OSBYTE 0031 B0EC 0032 B0EC 8A HMTCMP TXA 0033 B0ED A8 TAY ; Handle in Y 0034 B0EE 20 B6 B0 JSR DCRYPT 0035 B0F1 CC C2 10 CPY DCBY ; See if the same 0036 B0F4 60 HMTSP2 RTS 0037 B0F5 0038 B0F5 0039 B0F5 ;VBGET READS A CHARACTER FROM 0040 B0F5 ;THE SEQUENTIAL FILE INDICATED 0041 B0F5 ;BY Y. RETURNS WITH C SET AT 0042 B0F5 ;END OF FILE. FAILS IF Y WAS 0043 B0F5 ;BAD IN ANY WAY. 0044 B0F5 0045 B0F5 0046 B0F5 48 WFEOF PHA 0047 B0F6 98 TYA 0048 B0F7 48 PHA 0049 B0F8 8A TXA 0050 B0F9 A8 TAY 0051 B0FA 20 0D B1 JSR DCRYCH 0052 B0FD 98 TYA 0053 B0FE 20 77 B3 JSR PCMP 0054 B101 D0 04 BNE WFEOF0 0055 B103 A2 FF LDXIM &FF 0056 B105 D0 02 BNE WFEOF2 0057 B107 A2 00 WFEOF0 LDXIM &00 0058 B109 68 WFEOF2 PLA 0059 B10A A8 TAY 0060 B10B 68 PLA 0061 B10C 60 DCRYC0 RTS 0062 B10D 0063 B10D ;Decrypt and check valid handle 0064 B10D 20 B6 B0 DCRYCH JSR DCRYPT 0065 B110 20 8C B0 JSR CHEEKY 0066 B113 90 F7 BCC DCRYC0 0067 B115 0068 B115 20 C8 B0 WFEOF1 JSR HMTSPE ; ********* Close SPOOL | EXEC file.... HMT 0069 B118 20 B8 9F JSR ESTRNG 0070 B11B DE 43 68 = CHNNUM,"Channel",&00 0071 B124 0072 B124 20 B8 9F ILLEOF JSR ESTRNG 0073 B127 DF 45 4F = EOFNUM,"EOF",&00 0074 B12C 0075 B12C 20 50 A3 WBGET JSR SAVIT 0076 B12F 20 0D B1 JSR DCRYCH ;Check handle 0077 B132 98 TYA 0078 B133 20 77 B3 JSR PCMP ; COMPARE P,L 0079 B136 D0 13 BNE NOTEOF 0080 B138 B9 17 11 LDAAY SEQFLG 0081 B13B 29 10 ANDIM &10 0082 B13D D0 E5 BNE ILLEOF ; BRK ON 2ND EOF 0083 B13F A9 10 LDAIM &10 0084 B141 20 A7 B1 JSR SETBIT 0085 B144 AE C5 10 LDX SEQWX 0086 B147 A9 FE LDAIM &FE ;Return EOF 0087 B149 38 SEC 0088 B14A 60 RTS ; RETURN WITH C=1 0089 B14B B9 17 11 NOTEOF LDAAY SEQFLG 0090 B14E 30 0A BMI VBGETB ; BUFFER OK 0091 B150 20 87 AE JSR SETQ ;Set qualif/drive 0092 B153 20 B6 B1 JSR BFLUSH 0093 B156 38 SEC 0094 B157 20 BE B1 JSR XBLOCK ; READ NEXT BLOCK 0095 B15A B9 10 11 VBGETB LDAAY SEQPL ; BUFFER OFFSET 0096 B15D 85 BA STA WORK 0097 B15F B9 13 11 LDAAY SEQBUF 0098 B162 85 BB STA WORK + &01 ; ADDRESS IN BUFFER 0099 B164 A0 00 LDYIM &00 0100 B166 B1 BA LDAIY WORK ; NEXT CHARACTER 0101 B168 48 PHA ;Save read char 0102 B169 AC C2 10 LDY DCBY 0103 B16C A6 BA LDX WORK 0104 B16E E8 INX 0105 B16F 8A TXA 0106 B170 99 10 11 STAAY SEQPL 0107 B173 D0 14 BNE VBGETX ; NO CARRY. EXIT 0108 B175 18 CLC 0109 B176 B9 11 11 LDAAY SEQPM 0110 B179 69 01 ADCIM &0001 0111 B17B 99 11 11 STAAY SEQPM 0112 B17E B9 12 11 LDAAY SEQPH 0113 B181 69 00 ADCIM &00 0114 B183 99 12 11 STAAY SEQPH 0115 B186 20 AC B1 JSR CLRCBF 0116 B189 18 VBGETX CLC 0117 B18A 68 PLA 0118 B18B 60 RTS 0119 B18C 0120 B18C 18 SETDA CLC 0121 B18D B9 0F 11 LDAAY SEQLOC 0122 B190 79 11 11 ADCAY SEQPM 0123 B193 85 C3 STA WORK + &09 0124 B195 99 1C 11 STAAY SEQDAL ; BLOCK ADDRESS (L) 0125 B198 B9 0D 11 LDAAY SEQLH 0126 B19B 29 03 ANDIM &03 0127 B19D 79 12 11 ADCAY SEQPH 0128 B1A0 85 C2 STA WORK + &08 0129 B1A2 99 1D 11 STAAY SEQDAH ; BLOCK ADDRESS (H) 0130 B1A5 0131 B1A5 A9 80 SETCBF LDAIM &80 0132 B1A7 19 17 11 SETBIT ORAAY SEQFLG 0133 B1AA D0 05 BNE CLRBT3 ;Always 0134 B1AC A9 7F CLRCBF LDAIM &7F 0135 B1AE 39 17 11 CLRBIT ANDAY SEQFLG 0136 B1B1 99 17 11 CLRBT3 STAAY SEQFLG 0137 B1B4 18 CLC 0138 B1B5 60 RTS 0139 B1B6 Acorn macro assembler Page 26 - DOS05 - Sequential filing system 0140 B1B6 B9 17 11 BFLUSH LDAAY SEQFLG 0141 B1B9 29 40 ANDIM &40 ; CBU 0142 B1BB F0 43 BEQ BFLX ; NOTHING TO DO 0143 B1BD ;BFLUSH SHOULD ONLY BE CALLED 0144 B1BD ;WHEN THE DCB IS CHECKSUM-SAFE 0145 B1BD 18 CLC 0146 B1BE 0147 B1BE ;XBLOCK READS OR WRITES 0148 B1BE ;ONE BLOCK (READ IF C=1) 0149 B1BE ;BETWEEN DISC AND THE BUFFER 0150 B1BE ;ASSOCIATED WITH A SEQUENTIAL 0151 B1BE ;FILE. THE DISC ADDRESS IS 0152 B1BE ;DERIVED FROM THE FILE'S 0153 B1BE ;SEQUENTIAL POINTER FOR READS 0154 B1BE ;AND FOR SEQDA FOR WRITES. 0155 B1BE ;Y IDENTIFIES THE DCB. 0156 B1BE 08 XBLOCK PHP ; CONTAINS R/W BIT 0157 B1BF EE DD 10 INC SEQSEM ; := 0 0158 B1C2 20 31 AB JSR DRVSEL 0159 B1C5 AC C2 10 LDY DCBY 0160 B1C8 B9 13 11 LDAAY SEQBUF 0161 B1CB 85 BD STA WORK + &03 0162 B1CD 20 98 AB JSR DETUBE ;Buffers this side of tube 0163 B1D0 A9 00 LDAIM &00 0164 B1D2 85 BC STA WORK + &02 0165 B1D4 85 C0 STA WORK + &06 0166 B1D6 A9 01 LDAIM &01 0167 B1D8 85 C1 STA WORK + &07 ; LENGTH = 1 SECTOR 0168 B1DA ;NOW A FAKE DIRECTORY ENTRY 0169 B1DA ;HAS BEEN CREATED. USE IT TO 0170 B1DA ;READ A BLOCK.... 0171 B1DA 28 PLP ; ... OR WRITE ONE 0172 B1DB B0 17 BCS XBLRD 0173 B1DD B9 1C 11 LDAAY SEQDAL 0174 B1E0 85 C3 STA WORK + &09 0175 B1E2 B9 1D 11 LDAAY SEQDAH 0176 B1E5 85 C2 STA WORK + &08 0177 B1E7 20 E1 A6 JSR BLKWR ; DISC DRIVER ENTRYPOINT 0178 B1EA AC C2 10 LDY DCBY 0179 B1ED A9 BF LDAIM &BF 0180 B1EF 20 AE B1 JSR CLRBIT 0181 B1F2 90 06 BCC XBLFIN 0182 B1F4 0183 B1F4 20 8C B1 XBLRD JSR SETDA ; GET DISC ADDRESS 0184 B1F7 20 D3 A6 JSR BLKRD ; DISC DRIVER ENTRY 0185 B1FA CE DD 10 XBLFIN DEC SEQSEM ; := FF 0186 B1FD AC C2 10 LDY DCBY ;RESTORE Y BEFORE EXIT 0187 B200 60 BFLX RTS 0188 B201 0189 B201 0190 B201 4C AD B8 VBPUT1 JMP DELPRT 0191 B204 20 B8 9F VBPUT2 JSR ESTRNG 0192 B207 C1 52 65 = RDONUM,"Read only",&00 0193 B212 0194 B212 20 27 A3 VBPUT JSR SAVITA 0195 B215 4C 1E B2 JMP WBPUT1 0196 B218 0197 B218 20 27 A3 WBPUT JSR SAVITA 0198 B21B 20 0D B1 JSR DCRYCH 0199 B21E 48 WBPUT1 PHA 0200 B21F B9 0C 11 LDAAY SEQRDO 0201 B222 30 E0 BMI VBPUT2 0202 B224 B9 0E 11 LDAAY SEQLOK 0203 B227 30 D8 BMI VBPUT1 ;File is locked 0204 B229 20 87 AE JSR SETQ 0205 B22C 98 TYA 0206 B22D 18 CLC 0207 B22E 69 04 ADCIM &04 0208 B230 20 77 B3 JSR PCMP 0209 B233 D0 69 BNE NOTFUL 0210 B235 20 6F AE JSR VLOOK3 ;Try to extend.. 0211 B238 AE C3 10 LDX SEQWB 0212 B23B 38 SEC ;Get length of space 0213 B23C BD 07 0F LDAAX DIRHIG + &07 ; Low order Disc address 0214 B23F FD 0F 0F SBCAX CATHIG + &07 ; Low order Disc Size/Address of next file 0215 B242 48 PHA 0216 B243 BD 06 0F LDAAX DIRHIG + &06 ; Hi order length 0217 B246 FD 0E 0F SBCAX CATHIG + &06 ; Hi order Disc size/Address of next file 0218 B249 29 03 ANDIM &03 0219 B24B D9 1A 11 CMPAY SEQEH 0220 B24E D0 1F BNE VOK ;Yes - so I can extend 0221 B250 68 PLA 0222 B251 D9 19 11 CMPAY SEQEM 0223 B254 D0 34 BNE VOKSPL 0224 B256 84 B4 STY ATEMP 0225 B258 ; LDAIM BYTESH ; (Dont) close SPOOL file HMT 0226 B258 ; JSR READBY 0227 B258 ; JSR DCRYPX 0228 B258 ; CPY ATEMP 0229 B258 ; BNE BPUT1 0230 B258 ; JSR ZERSPH ;Tell it it doesnt exist 0231 B258 ; BPUT1 ; ************** LDY ATEMP ; ************** HMT 0232 B258 ; ************** JSR VSHUT ;No - close up and scream 0233 B258 ; LDA ATEMP 0234 B258 8C C2 10 STY DCBY 0235 B25B 20 C8 B0 JSR HMTSPE ; ********* Close SPOOL & EXEC files.... HMT 0236 B25E 20 B8 9F JSR ESTRNG 0237 B261 BF 43 61 = CNXNUM,"Can't extend",&00 0238 B26F B9 1A 11 VOK LDAAY SEQEH ; Old Hi order length 0239 B272 18 CLC 0240 B273 69 01 ADCIM &01 ; Round up to 64k only 0241 B275 99 1A 11 STAAY SEQEH 0242 B278 0A ASLA 0243 B279 0A ASLA 0244 B27A 0A ASLA 0245 B27B 0A ASLA 0246 B27C 5D 0E 0F EORAX CATHIG + &06 0247 B27F 29 30 ANDIM &30 0248 B281 5D 0E 0F EORAX CATHIG + &06 0249 B284 9D 0E 0F STAAX CATHIG + &06 ; Into Hi order length in catalogue 0250 B287 68 PLA 0251 B288 A9 00 LDAIM &00 ; Lo order = 0 0252 B28A 9D 0D 0F VOKSPL STAAX CATHIG + &05 0253 B28D 99 19 11 STAAY SEQEM 0254 B290 A9 00 LDAIM &00 0255 B292 9D 0C 0F STAAX CATHIG + &04 0256 B295 20 3B AA JSR DIROUT 0257 B298 20 6A B9 JSR DSKFIN 0258 B29B AC C2 10 LDY DCBY 0259 B29E B9 17 11 NOTFUL LDAAY SEQFLG 0260 B2A1 30 17 BMI VBPUTB ; BUFFER ALLOCATED Acorn macro assembler Page 27 - DOS05 - Sequential filing system 0261 B2A3 20 B6 B1 JSR BFLUSH 0262 B2A6 B9 14 11 LDAAY SEQLLA 0263 B2A9 D0 0B BNE NOTEND ; LOW(L) NE 0 0264 B2AB 98 TYA 0265 B2AC 20 77 B3 JSR PCMP 0266 B2AF D0 05 BNE NOTEND 0267 B2B1 ; AT THE END I DO NOT HAVE 0268 B2B1 ; TO READ A SECTOR. 0269 B2B1 20 8C B1 JSR SETDA 0270 B2B4 D0 04 BNE VBPUTB 0271 B2B6 38 NOTEND SEC 0272 B2B7 20 BE B1 JSR XBLOCK ; READ BLOCK 0273 B2BA ; (EVEN THOUGH FILE BEING 0274 B2BA ;USED FOR OUTPUT) 0275 B2BA B9 10 11 VBPUTB LDAAY SEQPL 0276 B2BD 85 BA STA WORK 0277 B2BF B9 13 11 LDAAY SEQBUF 0278 B2C2 85 BB STA WORK + &01 0279 B2C4 68 PLA 0280 B2C5 A0 00 LDYIM &00 0281 B2C7 91 BA STAIY WORK ; CHAR -> FILE 0282 B2C9 AC C2 10 LDY DCBY 0283 B2CC A9 40 LDAIM &40 0284 B2CE 20 A7 B1 JSR SETBIT ; CBU 0285 B2D1 E6 BA INC WORK 0286 B2D3 A5 BA LDA WORK 0287 B2D5 99 10 11 STAAY SEQPL 0288 B2D8 D0 13 BNE NCARRY 0289 B2DA ; HERE I HAVE CARRY FROM LOW(P) 0290 B2DA 20 AC B1 JSR CLRCBF ; SEQFLG&:=#7F 0291 B2DD B9 11 11 LDAAY SEQPM 0292 B2E0 69 01 ADCIM &0001 0293 B2E2 99 11 11 STAAY SEQPM 0294 B2E5 B9 12 11 LDAAY SEQPH 0295 B2E8 69 00 ADCIM &00 0296 B2EA 99 12 11 STAAY SEQPH ; P INCREMENTED 0297 B2ED 98 NCARRY TYA 0298 B2EE 20 77 B3 JSR PCMP 0299 B2F1 90 11 BCC VBPUTX ; NOT EXTENDING 0300 B2F3 A9 20 LDAIM &20 ; DUF 0301 B2F5 20 A7 B1 JSR SETBIT 0302 B2F8 A2 02 LDXIM &02 0303 B2FA B9 10 11 VBPUT3 LDAAY SEQPL 0304 B2FD 99 14 11 STAAY SEQLLA 0305 B300 C8 INY 0306 B301 CA DEX 0307 B302 10 F6 BPL VBPUT3 0308 B304 60 VBPUTX RTS 0309 B305 0310 B305 20 27 A3 VSTAR JSR SAVITA 0311 B308 20 0D B1 JSR DCRYCH 0312 B30B ;NOTE THAT THE NEXT TWO 0313 B30B ;COMPARISONS TREAT THINGS 0314 B30B ;AS UNSIGNED INTEGERS. 0315 B30B 0316 B30B ;*********** JSR STEP + $04 0317 B30B ;*********** HMT, This is superflous 0318 B30B 0319 B30B AC C2 10 LDY DCBY 0320 B30E 20 8F B3 VSTARA JSR SCMP 0321 B311 B0 2F BCS VSTARB ; 0<=ARG<=LENGTH 0322 B313 B9 14 11 LDAAY SEQLLA ;Set pointer to length 0323 B316 99 10 11 STAAY SEQPL 0324 B319 B9 15 11 LDAAY SEQLMA 0325 B31C 99 11 11 STAAY SEQPM 0326 B31F B9 16 11 LDAAY SEQLHA 0327 B322 99 12 11 STAAY SEQPH 0328 B325 20 51 B3 JSR VSTARC 0329 B328 ;************************* HMT 0330 B328 ; Preserve VTEMP so that BGBP works 0331 B328 A5 B6 LDA VTEMP 0332 B32A 48 PHA 0333 B32B A5 B7 LDA VTEMP+&01 0334 B32D 48 PHA 0335 B32E A5 B8 LDA VTEMP+&02 0336 B330 48 PHA 0337 B331 ;************************* HMT 0338 B331 A9 00 LDAIM &00 0339 B333 20 12 B2 JSR VBPUT ;Pad the file with nulls 0340 B336 ;************************* HMT 0341 B336 68 PLA 0342 B337 85 B8 STA VTEMP+&02 0343 B339 68 PLA 0344 B33A 85 B7 STA VTEMP+&01 0345 B33C 68 PLA 0346 B33D 85 B6 STA VTEMP 0347 B33F ;************************ HMT 0348 B33F 4C 0E B3 JMP VSTARA 0349 B342 B5 00 VSTARB LDAZX &00 0350 B344 99 10 11 STAAY SEQPL 0351 B347 B5 01 LDAZX &01 0352 B349 99 11 11 STAAY SEQPM 0353 B34C B5 02 LDAZX &02 0354 B34E 99 12 11 STAAY SEQPH ; SET P 0355 B351 A9 6F VSTARC LDAIM &6F 0356 B353 20 AE B1 JSR CLRBIT ; CLEAR EOF, BUFFER 0357 B356 B9 0F 11 LDAAY SEQLOC 0358 B359 79 11 11 ADCAY SEQPM 0359 B35C 8D C4 10 STA SEQWC ; DISC ADDRESS LOW 0360 B35F B9 0D 11 LDAAY SEQLH 0361 B362 29 03 ANDIM &03 0362 B364 79 12 11 ADCAY SEQPH 0363 B367 D9 1D 11 CMPAY SEQDAH 0364 B36A D0 98 BNE VBPUTX ; DIFFERENT SECTOR 0365 B36C AD C4 10 LDA SEQWC 0366 B36F D9 1C 11 CMPAY SEQDAL 0367 B372 D0 90 BNE VBPUTX 0368 B374 4C A5 B1 JMP SETCBF 0369 B377 0370 B377 ;PCMP SETS THE COND CODES 0371 B377 ;ON THE BASIS OF P COMPARED 0372 B377 ;WITH L (IF A=Y) OR E 0373 B377 ;(IF A=Y+4). 0374 B377 AA PCMP TAX 0375 B378 B9 12 11 LDAAY SEQPH 0376 B37B DD 16 11 CMPAX SEQLHA 0377 B37E D0 0E BNE PCMPX 0378 B380 B9 11 11 LDAAY SEQPM 0379 B383 DD 15 11 CMPAX SEQLMA 0380 B386 D0 06 BNE PCMPX 0381 B388 B9 10 11 LDAAY SEQPL Acorn macro assembler Page 28 - DOS05 - Sequential filing system 0382 B38B DD 14 11 CMPAX SEQLLA 0383 B38E 60 PCMPX RTS 0384 B38F 0385 B38F ;SCMP COMPARES THE 3 BYTE 0386 B38F ;ARG IN PAGE 0 (POINTED AT 0387 B38F ;BY X) WITH L, OR WITH E 0388 B38F ;IF Y HAS BEEN DISPLACED BY 0389 B38F ;4. 0390 B38F B9 14 11 SCMP LDAAY SEQLLA 0391 B392 D5 00 CMPZX &00 0392 B394 B9 15 11 LDAAY SEQLMA 0393 B397 F5 01 SBCZX &0001 0394 B399 B9 16 11 LDAAY SEQLHA 0395 B39C F5 02 SBCZX &0002 0396 B39E 60 RTS 0397 B39F 0398 B39F ;END OF SEQ FILE PACKAGE 0399 B39F 0400 B39F 0401 B39F LNK DOS06 0001 B39F ;*** File Six *** > DOS06 0002 B39F TTL - DOS06 - Init & Sideways interface 0003 B39F OPT &01 0004 B39F 4C 2E 21 BOOTLD = "L.!BOOT",CR 0005 B3A7 0006 B3A7 45 2E BOOTEX = "E." 0007 B3A9 21 42 4F BOOTN = "!BOOT",CR 0008 B3AF 0009 B3AF 0010 B3AF A5 B3 SINIT LDA ITEMP 0011 B3B1 20 F7 9F JSR VSTRNG 0012 B3B4 41 63 6F = "Acorn DFS" 0013 B3BD [ RAMVER * NOENAB=0 0015 B3BD ] 0016 B3BD 0D 0D = CR,CR 0017 B3BF 90 02 BCC SINIT0 0018 B3C1 0019 B3C1 A9 FF INIT LDAIM &FF 0020 B3C3 20 26 B0 SINIT0 JSR WOPA ;A=0 on return 0021 B3C6 48 PHA 0022 B3C7 0023 B3C7 A9 06 LDAIM &06 ;Die previous FS 0024 B3C9 20 A0 9F JSR OSFSCM 0025 B3CC A2 0D LDXIM &0D ;Zap vectors @$0200 0026 B3CE BD AD B9 INIT0 LDAAX VTABB 0027 B3D1 9D 12 02 STAAX VTAB2 0028 B3D4 CA DEX 0029 B3D5 10 F7 BPL INIT0 0030 B3D7 A9 A8 LDAIM BYTESV 0031 B3D9 20 A6 B9 JSR READBY ;Get address 3 byte vectors 0032 B3DC 84 B1 STY TEMP + &01 0033 B3DE 86 B0 STX TEMP 0034 B3E0 A2 07 LDXIM &0007 ;Zap them 0035 B3E2 A0 1B LDYIM &1B 0036 B3E4 B9 A0 B9 INIT1 LDAAY VTABF - &1B 0037 B3E7 91 B0 STAIY TEMP 0038 B3E9 C8 INY 0039 B3EA B9 A0 B9 LDAAY VTABF - &1B 0040 B3ED 91 B0 STAIY TEMP 0041 B3EF C8 INY 0042 B3F0 A5 F4 LDA ROMID 0043 B3F2 91 B0 STAIY TEMP 0044 B3F4 C8 INY 0045 B3F5 CA DEX 0046 B3F6 D0 EC BNE INIT1 0047 B3F8 86 CD STX FDRIVE ;Make safe 0048 B3FA 8C 82 10 STY CATDRV 0049 B3FD 8C 83 10 STY OLDDRV 0050 B400 A2 0F LDXIM SWCVCL 0051 B402 20 A0 B9 JSR DOSWCL 0052 B405 20 10 B9 JSR SUSPRI ;Set up private ptr in TEMP 0053 B408 A0 D3 LDYIM COLDS 0054 B40A B1 B0 LDAIY TEMP ;Cold start ?? 0055 B40C 10 33 BPL INITCL 0056 B40E ;********************* HMT 0057 B40E ; Shift-Break does a cold start 0058 B40E 68 PLA ; Get auto boot flag 0059 B40F 48 PHA 0060 B410 F0 2F BEQ INITCL 0061 B412 ;******************** HMT 0062 B412 0063 B412 ;Warm start 0064 B412 A0 D4 LDYIM MEMFLG ;Got memory already ? 0065 B414 B1 B0 LDAIY TEMP 0066 B416 30 4F BMI BOOTIT ;************ HMT 0067 B418 20 FB B8 JSR GETMEM 0068 B41B A0 00 LDYIM &00 ;Restore FCBs and VARS 0069 B41D B1 B0 INIT2 LDAIY TEMP 0070 B41F C0 C0 CPYIM &C0 0071 B421 90 05 BCC INIT3 0072 B423 99 00 10 STAAY BUFFER 0073 B426 B0 03 BCS INIT4 0074 B428 99 00 11 INIT3 STAAY SEQMAP 0075 B42B 88 INIT4 DEY 0076 B42C D0 EF BNE INIT2 0077 B42E A9 A0 LDAIM &A0 ;Make the seq files read new secs 0078 B430 A8 INIT6 TAY 0079 B431 48 PHA 0080 B432 A9 3F LDAIM &3F 0081 B434 20 AE B1 JSR CLRBIT ;Returns C clear 0082 B437 68 PLA 0083 B438 99 1D 11 STAAY SEQDAH ;Insert rubbish 0084 B43B E9 1F SBCIM &1F 0085 B43D D0 F1 BNE INIT6 0086 B43F F0 26 BEQ BOOTIT ;************ HMT 0087 B441 ; PLA ;Remove auto-boot from stack 0088 B441 ; RTS 0089 B441 0090 B441 ;Cold start 0091 B441 20 FB B8 INITCL JSR GETMEM ;Claim your memory 0092 B444 A9 24 LDAIM MASQUA ;Set up qualifiers 0093 B446 8D C9 10 STA DEFQUA 0094 B449 8D CB 10 STA LIBQUA 0095 B44C A0 00 LDYIM MASDSK ;Set up disks 0096 B44E 8C CA 10 STY DEFDSK 0097 B451 8C CC 10 STY LIBDSK 0098 B454 A0 00 LDYIM &00 0099 B456 8C C0 10 STY DCBMAP ;No files at start 0100 B459 8C C8 10 STY NMIFLG ;Havent got NMI 0101 B45C 0102 B45C A0 FF LDYIM &FF Acorn macro assembler Page 29 - DOS06 - Init & Sideways interface 0103 B45E 8C C7 10 STY ENAFLG ;Disable ENABLE 0104 B461 8C C6 10 STY MONFLG ;Monitor OFF 0105 B464 8C DD 10 STY SEQSEM ; := FF 0106 B467 INIT5 0107 B467 0108 B467 ; Look for a tube at Warm start too 0109 B467 ; for the whinging swine in the 16032 grope. 0110 B467 ; Takes us up to 0.9h 0111 B467 A9 EA BOOTIT LDAIM BYTETB 0112 B469 20 A6 B9 JSR READBY ;Tube ?? 0113 B46C 8A TXA 0114 B46D 49 FF EORIM &FF 0115 B46F 8D D6 10 STA NOTUBE ;Complement of tube flag 0116 B472 0117 B472 0118 B472 ;Check for auto boot 0119 B472 68 PLA ;Auto-boot flag (MOS provided) 0120 B473 D0 0B BNE NOAUTO 0121 B475 20 6B AA JSR DIRLDY 0122 B478 0123 B478 ; LDYIM $00 0124 B478 ; LDXIM $00 0125 B478 0126 B478 AD 06 0F LDA DIRHIG + &06 ;What sort of A-Boot ? 0127 B47B 20 38 A1 JSR SFOUR 0128 B47E D0 01 BNE ABOOT2 ; ********* HMT 0129 B480 0130 B480 ; PHA 0131 B480 ; LDXIM BOOTN 0132 B480 ; LDYIM BOOTN / 0133 B480 ; JSR STXYLP 0134 B480 ; JSR GETNAM 0135 B480 ; JSR LOOKUP 0136 B480 ; PLA 0137 B480 ; BCS ABOOT2 0138 B480 ; JSR VSTRNG 0139 B480 ; = "File not found",CR,CR,$EA 0140 B480 0141 B480 60 NOAUTO RTS 0142 B481 A0 B3 ABOOT2 LDYIM /(BOOTLD ) 0143 B483 A2 9F LDXIM BOOTLD 0144 B485 C9 02 CMPIM &02 0145 B487 90 08 BCC ABOOT3 0146 B489 F0 04 BEQ ARUN 0147 B48B [ BOOTEX - BOOTLD :SHR: 8=0 0148 B48B | 0150 B48B ] 0151 B48B A2 A7 LDXIM BOOTEX ;EXEC !BOOT 0152 B48D [ BOOTEX :SHL: 8=0 0154 B48D | 0155 B48D D0 02 BNE ABOOT3 0156 B48F ] 0157 B48F ARUN 0158 B48F [ BOOTN - BOOTLD :SHR: 8=0 0159 B48F | 0161 B48F ] 0162 B48F A2 A9 LDXIM BOOTN ;RUN !BOOT 0163 B491 4C F7 FF ABOOT3 JMP OSCLI 0164 B494 0165 B494 ;Called from MOS as a sways ROM 0166 B494 CALLED 0167 B494 [ RAMGO=0 0175 B494 ] 0176 B494 ;*************************************************** 0177 B494 ; FRUGALITY 0178 B494 ; Now the mod for frugal ROMs 0179 B494 48 PHA 0180 B495 0181 B495 AD 80 FE LDA FDCS 0182 B498 29 03 ANDIM &03 ; These should be 0 if there's an 8271 0183 B49A [ $emu 0186 B49A | 0187 B49A D0 4D BNE FRUGAL ; If no 8271 0188 B49C ] 0189 B49C 0190 B49C BD F0 0D LDAAX PRIPTR ; Get the private ptr 0191 B49F 0A ASLA ;using bit6 in table 0192 B4A0 30 47 BMI FRUGAL ; a PLA : RTS 0193 B4A2 0194 B4A2 68 PLA 0195 B4A3 ;************************************************** 0196 B4A3 C9 01 CMPIM SWCIN1 ;1st pass memory alloc. 0197 B4A5 D0 07 BNE SAVPRI 0198 B4A7 0199 B4A7 ;Power up - grab memory 0200 B4A7 C0 17 CPYIM &17 ;I take up to page $17 0201 B4A9 B0 02 BCS SAVSP0 0202 B4AB A0 17 LDYIM &17 0203 B4AD 60 SAVSP0 RTS 0204 B4AE 0205 B4AE ;Save private memory 0206 B4AE C9 02 SAVPRI CMPIM SWCIN2 0207 B4B0 D0 39 BNE PMSG 0208 B4B2 48 PHA 0209 B4B3 98 TYA 0210 B4B4 48 PHA ; Old Y on the stack 0211 B4B5 0212 B4B5 85 B1 STA TEMP + &01 0213 B4B7 0214 B4B7 ; In storing my private pointer, I must preserve the top bit 0215 B4B7 ; as it refers to the NFS' frugalization 0216 B4B7 0A ASLA ; Remove top bit 0217 B4B8 1E F0 0D ASLAX PRIPTR ; Old Top bit -> C 0218 B4BB 6A RORA ; Insert old top bit 0219 B4BC 9D F0 0D STAAX PRIPTR 0220 B4BF 0221 B4BF A9 00 LDAIM &00 ;Indicate cold start next 0222 B4C1 85 B0 STA TEMP 0223 B4C3 0224 B4C3 ;***************** HMT 0225 B4C3 ; Preserve status over Soft-Break 0226 B4C3 A9 FD LDAIM &FD ; Read reset type 0227 B4C5 20 A6 B9 JSR READBY 0228 B4C8 CA DEX 0229 B4C9 ; X was 0 => A = FF, X 1 => A = 0, X 2 => A = 1 0230 B4C9 ; So X=0 => Soft reset => A is MI, else A is PL 0231 B4C9 0232 B4C9 8A TXA 0233 B4CA A0 D3 LDYIM COLDS ;Cold start 0234 B4CC 31 B0 ANDIY TEMP 0235 B4CE ; So if it was cold it stays cold Acorn macro assembler Page 30 - DOS06 - Init & Sideways interface 0236 B4CE ; If it was warm it is altered maybe 0237 B4CE 0238 B4CE 91 B0 STAIY TEMP 0239 B4D0 08 PHP 0240 B4D1 C8 INY ; So Y -> MEMFLG 0241 B4D2 28 PLP 0242 B4D3 10 07 BPL NOTGOT ; If a cold start, don't save anything 0243 B4D5 0244 B4D5 B1 B0 LDAIY TEMP ; Get MEMFLG, MI if we've got Memory 0245 B4D7 10 03 BPL NOTGOT ; If we've not got it! 0246 B4D9 0247 B4D9 ; We've got RAM, so save the contents 0248 B4D9 20 9B A7 JSR SAVMEM 0249 B4DC 0250 B4DC A9 00 NOTGOT LDAIM &00 ; So we dont have memory.... 0251 B4DE 91 B0 STAIY TEMP 0252 B4E0 0253 B4E0 [ &00=0 0254 B4E0 20 B9 AC JSR INIFDC ;************* HMT 0255 B4E3 ; Very dubious doing this here! 0256 B4E3 ] 0257 B4E3 0258 B4E3 A6 F4 LDX ROMID ; Recover X ; ************* HMT 0259 B4E5 68 PLA 0260 B4E6 A8 TAY 0261 B4E7 C8 INY 0262 B4E8 C8 INY ; 2 private pages ***** HMT 0263 B4E9 68 FRUGAL PLA 0264 B4EA 60 ABOOT1 RTS 0265 B4EB 0266 B4EB ;From here on nothing is returned in 0267 B4EB ; X or Y so do a SAVITA now - calls 0268 B4EB ;that need to set A=0 use WOPA 0269 B4EB 0270 B4EB 20 27 A3 PMSG JSR SAVITA 0271 B4EE C9 03 CMPIM SWCIN3 0272 B4F0 D0 16 BNE CHKCOM 0273 B4F2 0274 B4F2 ;Auto boot ? - Check & do if required 0275 B4F2 84 B3 STY ITEMP 0276 B4F4 A9 7A LDAIM BYTEKS ;Magic number (kbd scan) 0277 B4F6 20 F4 FF JSR OSBYTE 0278 B4F9 8A TXA 0279 B4FA 30 09 BMI ABOOT0 0280 B4FC C9 32 CMPIM &32 ;'D' would you believe? 0281 B4FE D0 EA BNE ABOOT1 0282 B500 A9 78 LDAIM BYTECK ;Cancel the D 0283 B502 20 F4 FF JSR OSBYTE 0284 B505 4C AF B3 ABOOT0 JMP SINIT 0285 B508 0286 B508 ;Check for '*DISC' or '*DISK' 0287 B508 C9 04 CHKCOM CMPIM SWCLIN 0288 B50A D0 05 BNE INIFSY 0289 B50C A2 71 LDXIM INITBL - COMTAB - &03 0290 B50E 4C A8 A5 DHELP0 JMP WNAME0 0291 B511 0292 B511 ;Init filing system Y 0293 B511 C9 12 INIFSY CMPIM SWCIFS 0294 B513 D0 07 BNE DOHELP 0295 B515 C0 04 CPYIM FSYSNO 0296 B517 D0 3C BNE INIFSR 0297 B519 4C C1 B3 JMP INIT 0298 B51C 0299 B51C ;Do help 0300 B51C C9 09 DOHELP CMPIM SWCHLP 0301 B51E D0 10 BNE RELMEM 0302 B520 B1 F2 LDAIY LINPTR 0303 B522 A2 9E LDXIM HLPTAB - COMTAB - &03 0304 B524 C9 0D CMPIM CR 0305 B526 D0 E6 BNE DHELP0 ;Something on command line ? 0306 B528 98 TYA 0307 B529 E8 INX 0308 B52A E8 INX 0309 B52B A0 02 LDYIM HLPNO 0310 B52D 4C 27 BA JMP HELP1 0311 B530 0312 B530 ;Release memory 0313 B530 20 26 B0 RELMEM JSR WOPA ;Here on A=0 if responded to 0314 B533 C9 0A CMPIM SWCCME 0315 B535 D0 1F BNE UNKWRD 0316 B537 0317 B537 20 10 B9 JSR SUSPRI ;Have I got mem anyway 0318 B53A A0 D4 LDYIM MEMFLG 0319 B53C B1 B0 LDAIY TEMP 0320 B53E 10 0F BPL UNKSWA ;De wop A 0321 B540 0322 B540 A0 00 LDYIM &00 0323 B542 20 0D B0 JSR NSRNOW ;Write files to disk (Y=0) ;*********** HMT 0324 B545 ; Preserves (TEMP) 0325 B545 0326 B545 20 9B A7 JSR SAVMEM ; Save the private store 0327 B548 ; Preserves (TEMP) 0328 B548 0329 B548 A0 D4 LDYIM MEMFLG ;Tell me I don't have it 0330 B54A A9 00 LDAIM &00 0331 B54C 91 B0 STAIY TEMP 0332 B54E 60 RTS 0333 B54F 0334 B54F 0335 B54F A9 0A UNKSWA LDAIM &0A ; For RC= $0A to DeWop OK! *********** HMT 0336 B551 0337 B551 ;Patent de woping rountine 0338 B551 BA UNKSWZ TSX 0339 B552 9D 05 01 STAAX &105 0340 B555 60 INIFSR RTS 0341 B556 0342 B556 ;Unknown OSWORD call 0343 B556 C9 08 UNKWRD CMPIM SWCWRD 0344 B558 D0 F7 BNE UNKSWZ 0345 B55A 0346 B55A A4 EF LDY WORDA 0347 B55C 30 F3 BMI UNKSWZ 0348 B55E C0 7D CPYIM &7D 0349 B560 90 EF BCC UNKSWZ ; Reject other than my calls now 0350 B562 0351 B562 A6 F0 LDX WORDX ;Copy WORDX Y into TEMP 0352 B564 86 B0 STX TEMP 0353 B566 A6 F1 LDX WORDY 0354 B568 86 B1 STX TEMP + &01 0355 B56A 0356 B56A C8 INY ;Disk size Acorn macro assembler Page 31 - DOS06 - Init & Sideways interface 0357 B56B 10 4B BPL GTDSKS ; If $7E or $7D 0358 B56D 0359 B56D ; $7F Send command to disk controller 0360 B56D ; 0361 B56D ;XY Points to 0362 B56D ; + $00 : Disk (if required) 0363 B56D ; + $01 : Address 0364 B56D ; + $05 : Number of params 0365 B56D ; + $06 : Command 0366 B56D ; + $07]: Parameters 0367 B56D ; 0368 B56D ;Result returned at end of params 0369 B56D 58 RWTS CLI 0370 B56E ; This to allow type ahead while in the OSWORD e.g. for CPM wallies 0371 B56E ; Its OK here as I've finished with WORDA,X and Y 0372 B56E A0 00 LDYIM &00 0373 B570 B1 B0 LDAIY TEMP 0374 B572 30 03 BMI RWTS2 ;If top bit of disk set - skip 0375 B574 20 99 A6 JSR DODRIV 0376 B577 20 31 AB RWTS2 JSR DRVSEL 0377 B57A C8 INY 0378 B57B A2 02 LDXIM &02 0379 B57D 20 50 A0 JSR SHFTBO 0380 B580 B1 B0 LDAIY TEMP ;Get number of pars 0381 B582 C8 INY 0382 B583 48 PHA 0383 B584 B1 B0 LDAIY TEMP ;Get command 0384 B586 48 PHA 0385 B587 20 92 AC JSR CMDDRV 0386 B58A 68 PLA 0387 B58B 20 38 A1 JSR SFOUR ;Bit 4 determines R/W on NMI 0388 B58E 29 01 ANDIM &01 0389 B590 20 D6 AB JSR CHKTUB 0390 B593 2A ROLA ;Work out what to do on NMI 0391 B594 69 03 ADCIM WTFCLA 0392 B596 20 20 B9 JSR NMICLA 0393 B599 A5 BC LDA WORK + &02 0394 B59B 85 A6 STA RAMADR 0395 B59D A5 BD LDA WORK + &03 0396 B59F 85 A7 STA RAMADR + &01 0397 B5A1 A0 07 LDYIM &07 0398 B5A3 68 PLA ;Get number of params 0399 B5A4 AA TAX 0400 B5A5 F0 09 BEQ RWTS1 0401 B5A7 B1 B0 RWTS0 LDAIY TEMP 0402 B5A9 20 85 AC JSR DSKPAR 0403 B5AC C8 INY 0404 B5AD CA DEX 0405 B5AE D0 F7 BNE RWTS0 0406 B5B0 20 A7 AC RWTS1 JSR DSKRES ;Get result 0407 B5B3 91 B0 STAIY TEMP 0408 B5B5 4C FC A6 JMP NMTREL 0409 B5B8 0410 B5B8 20 C3 A9 GTDSKS JSR SETDEF 0411 B5BB 20 C2 A2 JSR GETDIR 0412 B5BE C8 INY 0413 B5BF 30 08 BMI GETDSZ ; If it was $7E 0414 B5C1 0415 B5C1 ; $7D Get cycle number 0416 B5C1 ; 0417 B5C1 ;Result returned at XY 0418 B5C1 A0 00 LDYIM &00 0419 B5C3 AD 04 0F LDA CYCNO 0420 B5C6 91 B0 STAIY TEMP 0421 B5C8 60 RTS 0422 B5C9 0423 B5C9 ; $7E Get disk size 0424 B5C9 ; 0425 B5C9 ;4 Byte result returned at XY 0426 B5C9 A9 00 GETDSZ LDAIM &00 ;No units 0427 B5CB A8 TAY 0428 B5CC 91 B0 STAIY TEMP 0429 B5CE C8 INY 0430 B5CF AD 07 0F LDA DIRHIG + &07 0431 B5D2 91 B0 STAIY TEMP 0432 B5D4 C8 INY 0433 B5D5 AD 06 0F LDA DIRHIG + &06 0434 B5D8 29 03 ANDIM &03 0435 B5DA 91 B0 STAIY TEMP 0436 B5DC C8 INY 0437 B5DD A9 00 LDAIM &00 ;I claimed it 0438 B5DF 91 B0 STAIY TEMP ;High order zero too 0439 B5E1 60 GTLDR0 RTS 0440 B5E2 0441 B5E2 ;OSFILE call 0442 B5E2 20 50 A3 WFILE JSR SAVIT 0443 B5E5 48 PHA 0444 B5E6 20 FB B7 JSR CLRWLD 0445 B5E9 86 B0 STX TEMP 0446 B5EB 8E DB 10 STX FCBADR 0447 B5EE 84 B1 STY TEMP + &01 0448 B5F0 8C DC 10 STY FCBADR + &01 0449 B5F3 A2 00 LDXIM &00 0450 B5F5 A0 00 LDYIM &00 0451 B5F7 20 60 A0 JSR SHFTTW 0452 B5FA 20 50 A0 WFILE4 JSR SHFTBO 0453 B5FD C0 12 CPYIM &12 0454 B5FF D0 F9 BNE WFILE4 0455 B601 68 PLA 0456 B602 AA TAX 0457 B603 E8 INX 0458 B604 E0 08 CPXIM FILJPH - FILJPL 0459 B606 B0 08 BCS WFILE3 0460 B608 BD EA B9 LDAAX FILJPH 0461 B60B 48 PHA 0462 B60C BD E2 B9 LDAAX FILJPL 0463 B60F 48 PHA 0464 B610 A9 00 WFILE3 LDAIM &00 ; A NOP for bad commands ********** HMT 0465 B612 60 RTS 0466 B613 0467 B613 ;File handler call - check & jump out 0468 B613 C9 09 WFSCM CMPIM FSCHTB - FSCLTB 0469 B615 B0 F9 BCS WFILE3 0470 B617 86 B5 STX YTEMP 0471 B619 AA TAX 0472 B61A BD D9 B9 LDAAX FSCHTB 0473 B61D 48 PHA 0474 B61E BD D0 B9 LDAAX FSCLTB 0475 B621 48 PHA 0476 B622 8A TXA 0477 B623 A6 B5 LDX YTEMP Acorn macro assembler Page 32 - DOS06 - Init & Sideways interface 0478 B625 60 WBGPBR RTS 0479 B626 0480 B626 ;Multiple BGET or BPUT - total fudge 0481 B626 ;XY points to: 0482 B626 ; + $00 Handle 0483 B626 ; + $01 Address to put to/get from 0484 B626 ; + $05 No bytes to do 0485 B626 ; + $09 Optional pointer 0486 B626 ; 0487 B626 ;A = 1 Put using pointer 0488 B626 ;A = 2 Put ignoring pointer 0489 B626 ;A = 3 Get using pointer 0490 B626 ;A = 4 Get ignoring pointer 0491 B626 ;A = 5 Read drive,title,cyc,opt 0492 B626 ;A = 6 Read dir 0493 B626 ;A = 7 Read lib 0494 B626 ;A = 8 Read file names 0495 B626 C9 09 WBGPB CMPIM WGPTBH - WGPTBL 0496 B628 B0 FB BCS WBGPBR 0497 B62A 20 27 A3 JSR SAVITA 0498 B62D 20 26 B0 JSR WOPA ;Zero A on return 0499 B630 8E 7D 10 STX BTEMP 0500 B633 8C 7E 10 STY BTEMP + &01 0501 B636 A8 TAY 0502 B637 20 40 B6 JSR WBREST 0503 B63A 08 PHP 0504 B63B 20 FF A6 JSR RELTUB 0505 B63E 28 PLP 0506 B63F 60 RTS 0507 B640 0508 B640 B9 07 BA WBREST LDAAY WGPTBL 0509 B643 8D D7 10 STA QTEMP 0510 B646 B9 10 BA LDAAY WGPTBH 0511 B649 8D D8 10 STA QTEMP + &01 0512 B64C B9 19 BA LDAAY WBRWTB 0513 B64F 4A LSRA 0514 B650 08 PHP 0515 B651 4A LSRA 0516 B652 08 PHP ;Pointer flag in C 0517 B653 8D 7F 10 STA CTEMP 0518 B656 20 B2 B7 JSR MAKATP 0519 B659 A0 0C LDYIM &0C ;Move into work 0520 B65B B1 B4 WBGPB0 LDAIY ATEMP 0521 B65D 99 60 10 STAAY DOSRAM 0522 B660 88 DEY 0523 B661 10 F8 BPL WBGPB0 0524 B663 AD 63 10 LDA DOSRAM + &03 0525 B666 2D 64 10 AND DOSRAM + &04 0526 B669 0D D6 10 ORA NOTUBE 0527 B66C 18 CLC 0528 B66D 69 01 ADCIM &01 0529 B66F F0 06 BEQ WBGPBA 0530 B671 ; Now claim the tube so it works with the net 0531 B671 20 04 AC JSR CLATUB 0532 B674 18 CLC ; Carry must be clear 0533 B675 0534 B675 A9 FF LDAIM &FF 0535 B677 8D 81 10 WBGPBA STA TUMFLG 0536 B67A AD 7F 10 LDA CTEMP 0537 B67D B0 07 BCS WBGPB9 0538 B67F A2 61 LDXIM DOSRAM + &01 0539 B681 A0 10 LDYIM /(DOSRAM + &01 ) 0540 B683 20 06 04 JSR TUBADR 0541 B686 28 WBGPB9 PLP 0542 B687 B0 04 BCS WBGPBB 0543 B689 28 PLP 0544 B68A 6C D7 10 QJMI JMI QTEMP ;Indirect jump @QTEMP 0545 B68D A2 03 WBGPBB LDXIM &03 0546 B68F BD 69 10 WBGPB8 LDAAX DOSRAM + &09 0547 B692 95 B6 STAAX VTEMP 0548 B694 CA DEX 0549 B695 10 F8 BPL WBGPB8 0550 B697 A2 B6 LDXIM VTEMP 0551 B699 AC 60 10 LDY DOSRAM 0552 B69C A9 00 LDAIM &00 0553 B69E 28 PLP 0554 B69F B0 03 BCS WBGPB1 0555 B6A1 20 05 B3 JSR VSTAR ;Set pointer 0556 B6A4 20 6D B0 WBGPB1 JSR VRADR ;Read pointer 0557 B6A7 A2 03 LDXIM &03 0558 B6A9 B5 B6 WBGPB7 LDAAX VTEMP 0559 B6AB 9D 69 10 STAAX DOSRAM + &09 0560 B6AE CA DEX 0561 B6AF 10 F8 BPL WBGPB7 0562 B6B1 20 A4 B7 WCBAT0 JSR COMWRK 0563 B6B4 30 0D BMI WBGPB4 0564 B6B6 AC 60 10 WBGPB3 LDY DOSRAM 0565 B6B9 20 8A B6 JSR QJMI 0566 B6BC B0 0D BCS WBGPB6 0567 B6BE A2 09 LDXIM &09 ;Increment pointer 0568 B6C0 20 98 B7 JSR ZERINC 0569 B6C3 A2 05 WBGPB4 LDXIM &05 ;Increment counter 0570 B6C5 20 98 B7 JSR ZERINC 0571 B6C8 D0 EC BNE WBGPB3 0572 B6CA 18 CLC ;Legal exit - clear C 0573 B6CB 08 WBGPB6 PHP 0574 B6CC 20 A4 B7 JSR COMWRK ;Make sense of counter 0575 B6CF A2 05 LDXIM &05 0576 B6D1 20 98 B7 JSR ZERINC 0577 B6D4 A0 0C LDYIM &0C ;Move back 0578 B6D6 20 B2 B7 JSR MAKATP 0579 B6D9 B9 60 10 WBGPB5 LDAAY DOSRAM 0580 B6DC 91 B4 STAIY ATEMP 0581 B6DE 88 DEY 0582 B6DF 10 F8 BPL WBGPB5 0583 B6E1 28 PLP 0584 B6E2 60 RTS 0585 B6E3 0586 B6E3 ;Read catalogue entries 0587 B6E3 ; + $00 Cycle number 0588 B6E3 ; + $01 Address 0589 B6E3 ; + $05 Number to move 0590 B6E3 ; + $09 Last handle (00 to start) 0591 B6E3 ; 0592 B6E3 ;Returns 0593 B6E3 ; 0594 B6E3 0595 B6E3 20 C3 A9 WCBAT JSR SETDEF ;Read directory 0596 B6E6 20 5F AA JSR DIRLD 0597 B6E9 A9 F5 LDAIM WCBATR ;Set up loop vector 0598 B6EB 8D D7 10 STA QTEMP Acorn macro assembler Page 33 - DOS06 - Init & Sideways interface 0599 B6EE A9 B6 LDAIM /(WCBATR ) 0600 B6F0 8D D8 10 STA QTEMP + &01 0601 B6F3 D0 BC BNE WCBAT0 0602 B6F5 0603 B6F5 AC 69 10 WCBATR LDY DOSRAM + &09 ;Get previous number 0604 B6F8 CC 05 0F WCBAT4 CPY DIRLEN ;End of cat ? 0605 B6FB B0 28 BCS WCBAT2 0606 B6FD B9 0F 0E LDAAY MODIFY ;Check qual same 0607 B700 20 66 A2 JSR CAPS 0608 B703 45 CC EOR QUALIF 0609 B705 B0 02 BCS WCBAT5 0610 B707 29 DF ANDIM &DF 0611 B709 29 7F WCBAT5 ANDIM &7F 0612 B70B F0 05 BEQ WCBAT3 0613 B70D 20 7C A6 JSR STEP ;Get next 0614 B710 D0 E6 BNE WCBAT4 0615 B712 A9 07 WCBAT3 LDAIM &07 ;Filename seven long 0616 B714 20 C6 B7 JSR WBWRIT 0617 B717 85 B0 STA TEMP ;Copy filename 0618 B719 B9 08 0E WCBAT1 LDAAY CATLOW 0619 B71C 20 C6 B7 JSR WBWRIT 0620 B71F C8 INY 0621 B720 C6 B0 DEC TEMP 0622 B722 D0 F5 BNE WCBAT1 0623 B724 18 CLC ;DOSRAM + $09 will be INCed auto 0624 B725 8C 69 10 WCBAT2 STY DOSRAM + &09 0625 B728 AD 04 0F LDA CYCNO ;Store cycle number 0626 B72B 8D 60 10 STA DOSRAM 0627 B72E 60 RTS 0628 B72F 0629 B72F 0630 B72F ;Read title,option,drive 0631 B72F ;Returns:- 0632 B72F ; <title> 0633 B72F ; <option (bin)> 0634 B72F ; <drive (bin)> 0635 B72F 20 C3 A9 RDTCO JSR SETDEF 0636 B732 20 5F AA JSR DIRLD 0637 B735 A9 0C LDAIM &0C ;Length of title 0638 B737 20 C6 B7 JSR WBWRIT 0639 B73A A0 00 LDYIM &00 ;Write title 0640 B73C C0 08 RDTC0 CPYIM &08 ;********** HMT 0641 B73E B0 05 BCS RDTC1 0642 B740 0643 B740 B9 00 0E LDAAY DIRLOW 0644 B743 90 03 BCC RDTC2 0645 B745 0646 B745 B9 F8 0E RDTC1 LDAAY DIRHIG - &08 0647 B748 20 C6 B7 RDTC2 JSR WBWRIT 0648 B74B C8 INY 0649 B74C C0 0C CPYIM &0C ;Stop before cycle number 0650 B74E D0 EC BNE RDTC0 0651 B750 0652 B750 AD 06 0F LDA DIRHIG + &06 ;Option 0653 B753 20 38 A1 JSR SFOUR 0654 B756 20 C6 B7 JSR WBWRIT 0655 B759 A5 CD LDA FDRIVE 0656 B75B 4C C6 B7 JMP WBWRIT 0657 B75E 0658 B75E ;Read directory 0659 B75E ;<length disk> <disk> 0660 B75E ;<length directory> <directory> 0661 B75E 20 BD B7 RDBIR JSR WOWRIT 0662 B761 AD CA 10 LDA DEFDSK 0663 B764 09 30 ORAIM "0" 0664 B766 20 C6 B7 JSR WBWRIT 0665 B769 20 BD B7 JSR WOWRIT 0666 B76C AD C9 10 LDA DEFQUA 0667 B76F D0 55 BNE WBWRIT ;********** HMT 0668 B771 0669 B771 ;Read library 0670 B771 ;<length disk> <disk> 0671 B771 ;<length directory> <directory> 0672 B771 20 BD B7 RLBIB JSR WOWRIT 0673 B774 AD CC 10 LDA LIBDSK 0674 B777 09 30 ORAIM "0" 0675 B779 20 C6 B7 JSR WBWRIT 0676 B77C 20 BD B7 JSR WOWRIT 0677 B77F AD CB 10 LDA LIBQUA 0678 B782 D0 42 BNE WBWRIT ;********** HMT 0679 B784 0680 B784 48 ADRLD PHA 0681 B785 AD 61 10 LDA DOSRAM + &01 0682 B788 85 B8 STA ZTEMP 0683 B78A AD 62 10 LDA DOSRAM + &02 0684 B78D 85 B9 STA ZTEMP + &01 0685 B78F A2 00 LDXIM &00 0686 B791 68 PLA 0687 B792 60 RTS 0688 B793 0689 B793 20 27 A3 ADRINC JSR SAVITA 0690 B796 A2 01 LDXIM &01 0691 B798 0692 B798 ;Increment 4 bytes of WORK 0693 B798 A0 04 ZERINC LDYIM &04 0694 B79A FE 60 10 ZERIN0 INCAX DOSRAM 0695 B79D D0 04 BNE ZERIN1 0696 B79F E8 INX 0697 B7A0 88 DEY 0698 B7A1 D0 F7 BNE ZERIN0 0699 B7A3 60 ZERIN1 RTS 0700 B7A4 0701 B7A4 ;Complement count 0702 B7A4 A2 03 COMWRK LDXIM &03 0703 B7A6 A9 FF WBGPB2 LDAIM &FF 0704 B7A8 5D 65 10 EORAX DOSRAM + &05 0705 B7AB 9D 65 10 STAAX DOSRAM + &05 0706 B7AE CA DEX 0707 B7AF 10 F5 BPL WBGPB2 0708 B7B1 60 RTS 0709 B7B2 0710 B7B2 ;Resusitate ATEMP from BTEMP 0711 B7B2 AD 7D 10 MAKATP LDA BTEMP 0712 B7B5 85 B4 STA ATEMP 0713 B7B7 AD 7E 10 LDA BTEMP + &01 0714 B7BA 85 B5 STA ATEMP + &01 0715 B7BC 60 WBGTR0 RTS 0716 B7BD 0717 B7BD ;Put out a 1 0718 B7BD A9 01 WOWRIT LDAIM &01 0719 B7BF D0 05 BNE WBWRIT Acorn macro assembler Page 34 - DOS06 - Init & Sideways interface 0720 B7C1 0721 B7C1 ;Get byte for BGBP 0722 B7C1 20 2C B1 WBGTR JSR WBGET 0723 B7C4 B0 F6 BCS WBGTR0 0724 B7C6 0725 B7C6 2C 81 10 WBWRIT BIT TUMFLG 0726 B7C9 10 05 BPL WBWRI0 0727 B7CB 8D E5 FE STA TUBE 0728 B7CE 30 C3 BMI ADRINC ; Always 0729 B7D0 20 84 B7 WBWRI0 JSR ADRLD 0730 B7D3 81 B8 STAIX ZTEMP 0731 B7D5 4C 93 B7 JMP ADRINC 0732 B7D8 0733 B7D8 ;Put byte for BGBP 0734 B7D8 20 E0 B7 WBPTR JSR WBREAD 0735 B7DB 20 18 B2 JSR WBPUT 0736 B7DE 18 CLC 0737 B7DF 60 RTS 0738 B7E0 0739 B7E0 2C 81 10 WBREAD BIT TUMFLG 0740 B7E3 10 06 BPL WBREA0 0741 B7E5 AD E5 FE LDA TUBE 0742 B7E8 4C 93 B7 JMP ADRINC 0743 B7EB 20 84 B7 WBREA0 JSR ADRLD 0744 B7EE A1 B8 LDAIX ZTEMP 0745 B7F0 4C 93 B7 JMP ADRINC 0746 B7F3 0747 B7F3 ;It comes here every * command - used 0748 B7F3 ;for making ENABLE disabled 0749 B7F3 [ NOENAB=0 0752 B7F3 | 0753 B7F3 2C C7 10 WSTUS BIT ENAFLG 0754 B7F6 30 03 BMI WSTUS0 0755 B7F8 CE C7 10 DEC ENAFLG 0756 B7FB WSTUS0 0757 B7FB ] 0758 B7FB ;Enable use of wild characters by 0759 B7FB ;storing the character to be used in 0760 B7FB ;WILDCH 0761 B7FB ;Disable use of wild characters 0762 B7FB A9 FF CLRWLD LDAIM &FF 0763 B7FD 8D CE 10 STA DASHOP 0764 B800 8D CD 10 SETWL0 STA WILDCH 0765 B803 60 RTS 0766 B804 0767 B804 A9 2A SETWLD LDAIM MASDSH 0768 B806 8D CE 10 STA DASHOP 0769 B809 A9 23 LDAIM MASWLD 0770 B80B D0 F3 BNE SETWL0 0771 B80D 0772 B80D ;Read catalog info 0773 B80D 20 C6 B8 FRDCAT JSR TRYFIL 0774 B810 20 C8 A2 JSR CHUKBK 0775 B813 A9 01 LDAIM &01 0776 B815 60 RTS 0777 B816 0778 B816 ;Delete file 0779 B816 20 A3 B8 FDEFIL JSR TRYFLC 0780 B819 20 C8 A2 JSR CHUKBK 0781 B81C 20 49 A2 JSR DELFIL 0782 B81F 90 24 BCC DORT1A 0783 B821 0784 B821 ;Write all cat info to disk 0785 B821 20 C6 B8 FWRCAT JSR TRYFIL 0786 B824 20 4B B8 JSR MVILOD 0787 B827 20 67 B8 JSR MVIEXE 0788 B82A 50 16 BVC DORT1B ; Always 0789 B82C 0790 B82C ;Write load address to disk 0791 B82C 20 C6 B8 FWRLOD JSR TRYFIL 0792 B82F 20 4B B8 JSR MVILOD 0793 B832 50 11 BVC DORT1A ; Always 0794 B834 0795 B834 ;Write execution address to disk 0796 B834 20 C6 B8 FWREXE JSR TRYFIL 0797 B837 20 67 B8 JSR MVIEXE 0798 B83A 50 09 BVC DORT1A ; Always 0799 B83C 0800 B83C ;Write attributes to disk 0801 B83C 20 C6 B8 FWRATT JSR TRYFIL 0802 B83F 20 BB B8 JSR CHKOPN 0803 B842 20 8A B8 DORT1B JSR MVIATT 0804 B845 20 1F A8 DORT1A JSR TITEND 0805 B848 A9 01 LDAIM &01 0806 B84A 60 RTS 0807 B84B 0808 B84B ;Insert load address in directory 0809 B84B 20 27 A3 MVILOD JSR SAVITA 0810 B84E A0 02 LDYIM &02 0811 B850 B1 B0 LDAIY TEMP 0812 B852 9D 08 0F STAAX CATHIG 0813 B855 C8 INY 0814 B856 B1 B0 LDAIY TEMP 0815 B858 9D 09 0F STAAX CATHIG + &01 0816 B85B C8 INY 0817 B85C B1 B0 LDAIY TEMP 0818 B85E 0A ASLA 0819 B85F 0A ASLA 0820 B860 5D 0E 0F EORAX CATHIG + &06 0821 B863 29 0C ANDIM &0C 0822 B865 10 1B BPL MVIIN0 0823 B867 0824 B867 ;Insert execution address 0825 B867 20 27 A3 MVIEXE JSR SAVITA 0826 B86A A0 06 LDYIM &06 0827 B86C B1 B0 LDAIY TEMP 0828 B86E 9D 0A 0F STAAX CATHIG + &02 0829 B871 C8 INY 0830 B872 B1 B0 LDAIY TEMP 0831 B874 9D 0B 0F STAAX CATHIG + &03 0832 B877 C8 INY 0833 B878 B1 B0 LDAIY TEMP 0834 B87A 6A RORA 0835 B87B 6A RORA 0836 B87C 6A RORA 0837 B87D 5D 0E 0F EORAX CATHIG + &06 0838 B880 29 C0 ANDIM &C0 0839 B882 5D 0E 0F MVIIN0 EORAX CATHIG + &06 0840 B885 9D 0E 0F STAAX CATHIG + &06 0841 B888 B8 CLV 0842 B889 60 RTS Acorn macro assembler Page 35 - DOS06 - Init & Sideways interface 0843 B88A 0844 B88A ;Insert attributes into directory 0845 B88A 20 27 A3 MVIATT JSR SAVITA 0846 B88D A0 0E LDYIM &0E 0847 B88F B1 B0 LDAIY TEMP 0848 B891 29 0A ANDIM &0A 0849 B893 F0 02 BEQ MVIAT0 0850 B895 A9 80 LDAIM &80 0851 B897 5D 0F 0E MVIAT0 EORAX CATLOW + &07 0852 B89A 29 80 ANDIM &80 0853 B89C 5D 0F 0E EORAX CATLOW + &07 0854 B89F 9D 0F 0E STAAX CATLOW + &07 0855 B8A2 60 RTS 0856 B8A3 0857 B8A3 ;Try and get file and check for file 0858 B8A3 ;open or locked. 0859 B8A3 20 D0 B8 TRYFLC JSR TRYFL1 0860 B8A6 90 23 BCC TRYFL2 0861 B8A8 0862 B8A8 ;Check if locked 0863 B8A8 B9 0F 0E CHKLOK LDAAY MODIFY 0864 B8AB 10 22 BPL CHKOPR 0865 B8AD 0866 B8AD 20 B8 9F DELPRT JSR ESTRNG 0867 B8B0 C3 4C 6F = LOKNUM,"Locked",&00 0868 B8B8 0869 B8B8 ;Check for open or locked 0870 B8B8 20 A8 B8 CHKOPL JSR CHKLOK 0871 B8BB 0872 B8BB ;Check file open and scream if so. 0873 B8BB 20 27 A3 CHKOPN JSR SAVITA 0874 B8BE 20 B6 AF JSR CMPFIL 0875 B8C1 90 21 BCC TRYFL3 0876 B8C3 4C 1A AF JMP FILOPN 0877 B8C6 0878 B8C6 ;Try and get file if fail take of this 0879 B8C6 ; return and return to level below. 0880 B8C6 20 D0 B8 TRYFIL JSR TRYFL1 0881 B8C9 B0 19 BCS TRYFL3 0882 B8CB 68 TRYFL2 PLA 0883 B8CC 68 PLA 0884 B8CD A9 00 LDAIM &00 0885 B8CF 60 CHKOPR RTS 0886 B8D0 0887 B8D0 20 70 A0 TRYFL1 JSR FRMNAM 0888 B8D3 20 C3 A1 JSR LOOKUP 0889 B8D6 90 0C BCC TRYFL3 0890 B8D8 98 TYA 0891 B8D9 AA TAX 0892 B8DA AD DB 10 TRYFL0 LDA FCBADR 0893 B8DD 85 B0 STA TEMP 0894 B8DF AD DC 10 LDA FCBADR + &01 0895 B8E2 85 B1 STA TEMP + &01 0896 B8E4 60 TRYFL3 RTS 0897 B8E5 0898 B8E5 ;Get low mem address and length of free 0899 B8E5 ; memory. 0900 B8E5 A9 83 GETLSZ LDAIM BYTEPA 0901 B8E7 20 F4 FF JSR OSBYTE 0902 B8EA 8C CF 10 STY FRPAGE 0903 B8ED [ RAMVER=0 0906 B8ED | 0907 B8ED A9 84 LDAIM BYTETM 0908 B8EF 20 F4 FF JSR OSBYTE 0909 B8F2 ] 0910 B8F2 98 TYA 0911 B8F3 38 SEC 0912 B8F4 ED CF 10 SBC FRPAGE 0913 B8F7 8D D0 10 STA FRSIZE 0914 B8FA 60 RTS 0915 B8FB 0916 B8FB 0917 B8FB ;Get memory for DOS 0918 B8FB A2 0A GETMEM LDXIM SWCCME ;Claim memory 0919 B8FD 20 A0 B9 JSR DOSWCL 0920 B900 20 10 B9 JSR SUSPRI ;Tell me I've done it 0921 B903 0922 B903 A0 D3 LDYIM COLDS 0923 B905 A9 FF LDAIM &FF ;Indicate warm start up 0924 B907 91 B0 STAIY TEMP ; warmed **** HMT 0925 B909 8D D3 10 STA COLDS 0926 B90C 0927 B90C C8 INY ; So Y -> MEMFLG 0928 B90D 91 B0 STAIY TEMP 0929 B90F 60 RTS 0930 B910 0931 B910 ;Get private area 0932 B910 48 SUSPRI PHA 0933 B911 A6 F4 LDX ROMID 0934 B913 A9 00 LDAIM &00 0935 B915 85 B0 STA TEMP 0936 B917 BD F0 0D LDAAX PRIPTR 0937 B91A 29 3F ANDIM &3F ; Use only the non-frugal bits 0938 B91C 85 B1 STA TEMP + &01 0939 B91E 68 PLA 0940 B91F 60 RTS 0941 B920 0942 B920 ;Claim NMI 0943 B920 20 27 A3 NMICLA JSR SAVITA 0944 B923 48 PHA 0945 B924 2C C8 10 BIT NMIFLG ;Already got ? 0946 B927 30 11 BMI NMICL0 0947 B929 A9 8F LDAIM BYTESC 0948 B92B A2 0C LDXIM SWCCNM 0949 B92D 20 A8 B9 JSR READIT 0950 B930 84 A0 STY PRENMI ;Save for handing back 0951 B932 A9 FF LDAIM &FF ;Set NMI flag 0952 B934 8D C8 10 STA NMIFLG 0953 B937 0954 B937 ; Now ensure that a RESET in the middle doesn't fuck things up! 0955 B937 EE D3 10 INC COLDS ; <- 0, for a cold start 0956 B93A 0957 B93A 68 NMICL0 PLA 0958 B93B AA TAX 0959 B93C BD F2 B9 LDAAX NMITBL 0960 B93F 85 B8 STA ZTEMP 0961 B941 BD F9 B9 LDAAX NMITBH 0962 B944 85 B9 STA ZTEMP + &01 0963 B946 BC 00 BA LDYAX NMIROL ;Get length 0964 B949 B1 B8 NMICL1 LDAIY ZTEMP ;Move routine 0965 B94B 99 00 0D STAAY INTNMI Acorn macro assembler Page 36 - DOS06 - Init & Sideways interface 0966 B94E 88 DEY 0967 B94F 10 F8 BPL NMICL1 0968 B951 E0 02 CPXIM &02 0969 B953 B0 14 BCS NMICL2 0970 B955 A5 F4 LDA ROMID ;Store romID into LDAIM 0971 B957 8D 3C 0D STA MYID - RDMNMI + INTNMI + &01 0972 B95A E0 00 CPXIM &00 ;Write ? 0973 B95C D0 0B BNE NMICL2 0974 B95E A0 12 LDYIM RDMNMI - WRIOVR - &01 ;Put write overlay on 0975 B960 B9 0E AD NMICL3 LDAAY WRIOVR 0976 B963 99 0A 0D STAAY NMIOVR - RDMNMI + INTNMI 0977 B966 88 DEY 0978 B967 10 F7 BPL NMICL3 0979 B969 60 NMICL2 RTS 0980 B96A 0981 B96A ;Check disk finished and when done 0982 B96A ;release NMIs 0983 B96A 20 AE AC DSKFIN JSR DSKWAI 0984 B96D 0985 B96D ;Release NMI 0986 B96D 20 27 A3 NMIREL JSR SAVITA 0987 B970 2C C8 10 BIT NMIFLG ;Do I have it? 0988 B973 10 0E BPL NMIRL0 0989 B975 ;*********** is this neccessary? HMT JSR SAVITA 0990 B975 0991 B975 CE D3 10 DEC COLDS ; <- $FF for a worm start 0992 B978 0993 B978 A4 A0 LDY PRENMI ;Did anybody have it? 0994 B97A C0 FF CPYIM &FF 0995 B97C F0 05 BEQ NMIRL0 ;Ignore if not 0996 B97E A2 0B LDXIM SWCRNM ;Hand it back 0997 B980 20 A0 B9 JSR DOSWCL 0998 B983 A9 00 NMIRL0 LDAIM &00 0999 B985 8D C8 10 STA NMIFLG 1000 B988 60 RTS 1001 B989 1002 B989 ;Clear keyboard buffer 1003 B989 20 27 A3 CLRKEY JSR SAVITA 1004 B98C A9 0F LDAIM BYTECB 1005 B98E A2 01 LDXIM &01 1006 B990 A0 00 WRITBY LDYIM &00 1007 B992 F0 16 BEQ BYTJMP 1008 B994 1009 B994 ;Zero spool handle 1010 B994 ;***ZERSPH LDAIM BYTESH ;*** HMT 1011 B994 ;*** LDXIM $00 1012 B994 ;*** BEQ WRITBY 1013 B994 1014 B994 ;Set where OSWRCH goes 1015 B994 AA WRIWDE TAX 1016 B995 A9 03 WRIWDX LDAIM BYTESD 1017 B997 D0 11 BNE BYTJMP 1018 B999 1019 B999 ;Acknowledge escape 1020 B999 20 27 A3 ACKESC JSR SAVITA ;Keep registers 1021 B99C A9 7E LDAIM BYTEAE 1022 B99E D0 0A BNE BYTJMP 1023 B9A0 1024 B9A0 ;Do sideways call 1025 B9A0 A9 8F DOSWCL LDAIM BYTESC 1026 B9A2 D0 06 BNE BYTJMP 1027 B9A4 1028 B9A4 ;Read switches 1029 B9A4 A9 FF READSW LDAIM BYTESW 1030 B9A6 A2 00 READBY LDXIM &00 1031 B9A8 A0 FF READIT LDYIM &FF 1032 B9AA 4C F4 FF BYTJMP JMP OSBYTE 1033 B9AD 1034 B9AD ;Jump table to put into indirection 1035 B9AD ;vectors 1036 B9AD 1B VTABB = &1B 1037 B9AE FF = &FF 1038 B9AF 1E = &1E 1039 B9B0 FF = &FF 1040 B9B1 21 = &21 1041 B9B2 FF = &FF 1042 B9B3 24 = &24 1043 B9B4 FF = &FF 1044 B9B5 27 = &27 1045 B9B6 FF = &FF 1046 B9B7 2A = &2A 1047 B9B8 FF = &FF 1048 B9B9 2D = &2D 1049 B9BA FF = &FF 1050 B9BB 1051 B9BB ;Indirection table for use by sideways 1052 B9BB ;handler 1053 B9BB E2 VTABF = WFILE 1054 B9BC B5 = /(WFILE ) 1055 B9BD 00 = &00 1056 B9BE 33 = WARGS 1057 B9BF B0 = /(WARGS ) 1058 B9C0 00 = &00 1059 B9C1 2C = WBGET 1060 B9C2 B1 = /(WBGET ) 1061 B9C3 00 = &00 1062 B9C4 18 = WBPUT 1063 B9C5 B2 = /(WBPUT ) 1064 B9C6 00 = &00 1065 B9C7 26 = WBGPB 1066 B9C8 B6 = /(WBGPB ) 1067 B9C9 00 = &00 1068 B9CA AE = WFIND 1069 B9CB AE = /(WFIND ) 1070 B9CC 00 = &00 1071 B9CD 13 = WFSCM 1072 B9CE B6 = /(WFSCM ) 1073 B9CF 00 = &00 1074 B9D0 1075 B9D0 ;Jump out table for file handler call 1076 B9D0 79 FSCLTB = WFOPT - &01 1077 B9D1 F4 = WFEOF - &01 1078 B9D2 09 = WNOTA - &01 1079 B9D3 A2 = WNAME - &01 1080 B9D4 09 = WNOTA - &01 1081 B9D5 5E = WDCAT - &01 1082 B9D6 F7 = WFDIE - &01 1083 B9D7 F2 = WHLIM - &01 1084 B9D8 F2 = WSTUS - &01 1085 B9D9 A8 FSCHTB = /(WFOPT - &01 ) 1086 B9DA B0 = /(WFEOF - &01 ) Acorn macro assembler Page 37 - DOS06 - Init & Sideways interface 1087 B9DB A7 = /(WNOTA - &01 ) 1088 B9DC A5 = /(WNAME - &01 ) 1089 B9DD A7 = /(WNOTA - &01 ) 1090 B9DE A3 = /(WDCAT - &01 ) 1091 B9DF AD = /(WFDIE - &01 ) 1092 B9E0 AD = /(WHLIM - &01 ) 1093 B9E1 B7 = /(WSTUS - &01 ) 1094 B9E2 1095 B9E2 A0 FILJPL = LOADER - &01 1096 B9E3 D7 = SAVER - &01 1097 B9E4 20 = FWRCAT - &01 1098 B9E5 2B = FWRLOD - &01 1099 B9E6 33 = FWREXE - &01 1100 B9E7 3B = FWRATT - &01 1101 B9E8 0C = FRDCAT - &01 1102 B9E9 15 = FDEFIL - &01 1103 B9EA A6 FILJPH = /(LOADER - &01 ) 1104 B9EB A6 = /(SAVER - &01 ) 1105 B9EC B8 = /(FWRCAT - &01 ) 1106 B9ED B8 = /(FWRLOD - &01 ) 1107 B9EE B8 = /(FWREXE - &01 ) 1108 B9EF B8 = /(FWRATT - &01 ) 1109 B9F0 B8 = /(FRDCAT - &01 ) 1110 B9F1 B8 = /(FDEFIL - &01 ) 1111 B9F2 1112 B9F2 21 NMITBL = RDMNMI 1113 B9F3 21 = RDMNMI 1114 B9F4 51 = NOPNMI 1115 B9F5 B5 = WTFNMI 1116 B9F6 8A = WMFNMI 1117 B9F7 A5 = RTFNMI 1118 B9F8 6F = RMFNMI 1119 B9F9 AD NMITBH = /(RDMNMI ) 1120 B9FA AD = /(RDMNMI ) 1121 B9FB AD = /(NOPNMI ) 1122 B9FC AD = /(WTFNMI ) 1123 B9FD AD = /(WMFNMI ) 1124 B9FE AD = /(RTFNMI ) 1125 B9FF AD = /(RMFNMI ) 1126 BA00 4D NMIROL = RMFNMI - RDMNMI - &01 1127 BA01 4D = RMFNMI - RDMNMI - &01 1128 BA02 00 = &00 1129 BA03 0F = NMIEND - WTFNMI - &01 1130 BA04 1A = RTFNMI - WMFNMI - &01 1131 BA05 0F = WTFNMI - RTFNMI - &01 1132 BA06 1A = WMFNMI - RMFNMI - &01 1133 BA07 1134 BA07 ;In WBRWTB 1135 BA07 ; bit 0 = use pointer ? 0=Y,1=N 1136 BA07 ; bit 1 = read pointer ? 0=N,1=Y 1137 BA07 ; bit 2 = read(1),write(0) 1138 BA07 F1 WGPTBL = RETURN 1139 BA08 D8 = WBPTR 1140 BA09 D8 = WBPTR 1141 BA0A C1 = WBGTR 1142 BA0B C1 = WBGTR 1143 BA0C 2F = RDTCO 1144 BA0D 5E = RDBIR 1145 BA0E 71 = RLBIB 1146 BA0F E3 = WCBAT 1147 BA10 A4 WGPTBH = /(RETURN ) 1148 BA11 B7 = /(WBPTR ) 1149 BA12 B7 = /(WBPTR ) 1150 BA13 B7 = /(WBGTR ) 1151 BA14 B7 = /(WBGTR ) 1152 BA15 B7 = /(RDTCO ) 1153 BA16 B7 = /(RDBIR ) 1154 BA17 B7 = /(RLBIB ) 1155 BA18 B6 = /(WCBAT ) 1156 BA19 04 WBRWTB = &04 1157 BA1A 02 = &02 1158 BA1B 03 = &03 1159 BA1C 06 = &06 1160 BA1D 07 = &07 1161 BA1E 04 = &04 1162 BA1F 04 = &04 1163 BA20 04 = &04 1164 BA21 04 = &04 1165 BA22 1166 BA22 LNK DOS07 0001 BA22 ;*** File Seven *** > DOS07 0002 BA22 TTL - DOS07 - Help & Syntax ; 0003 BA22 OPT &01 0004 BA22 ;* Contains syntax messages * 0005 BA22 0006 BA22 ;Get help on DFS 0007 BA22 98 HELP TYA 0008 BA23 A2 FF LDXIM &FF 0009 BA25 A0 0E LDYIM COMNO 0010 BA27 48 HELP1 PHA 0011 BA28 20 F7 9F JSR VSTRNG ;Print DFS version number 0012 BA2B 0D 44 46 = CR,"DFS " 0013 BA30 31 = "0" + VERH 0014 BA31 2E = "." 0015 BA32 32 = "0" + VERM 0016 BA33 30 = "0" + VERL 0017 BA34 [ NOENAB=0 0019 BA34 ] 0020 BA34 0D = CR 0021 BA35 86 BC STX COMTXT 0022 BA37 A9 00 HELP0 LDAIM &00 0023 BA39 85 B9 STA ETEMP 0024 BA3B 20 A6 BF JSR PDSPC ;Indent info two spaces 0025 BA3E 20 7F BA JSR PSYNTX 0026 BA41 20 B6 BC JSR PCRLF 0027 BA44 88 DEY 0028 BA45 D0 F0 BNE HELP0 0029 BA47 68 PLA 0030 BA48 A8 TAY 0031 BA49 A2 9E HELP2 LDXIM HLPTAB - COMTAB - &03 0032 BA4B 4C A8 A5 JMP WNAME0 0033 BA4E 0034 BA4E ;Get help about UTILS 0035 BA4E 98 PMHELP TYA 0036 BA4F A2 73 LDXIM INITBL - COMTAB - &01 0037 BA51 A0 05 LDYIM UTLNO 0038 BA53 D0 D2 BNE HELP1 0039 BA55 0040 BA55 ;Don't know about that item of help 0041 BA55 20 F1 A5 NOHELP JSR SETUPR 0042 BA58 F0 70 BEQ PSYNT4 ;End of line => go away Acorn macro assembler Page 38 - DOS07 - Help & Syntax; 0043 BA5A 20 C9 A0 NOHLP1 JSR RDCHR 0044 BA5D 90 FB BCC NOHLP1 0045 BA5F B0 E8 BCS HELP2 0046 BA61 0047 BA61 20 F1 A5 CHKSYN JSR SETUPR 0048 BA64 D0 64 BNE PSYNT4 0049 BA66 20 C8 9F SYNERR JSR FSTRNG 0050 BA69 DC 53 79 = SYNNUM,"Syntax: " 0051 BA72 86 B9 STX ETEMP 0052 BA74 20 7F BA JSR PSYNTX 0053 BA77 A9 00 LDAIM &00 0054 BA79 20 BE BA JSR PHELPC 0055 BA7C 4C 00 01 JMP ERRBUF 0056 BA7F 0057 BA7F A6 BC PSYNTX LDX COMTXT 0058 BA81 E8 SYNER1 INX 0059 BA82 BD F2 A4 LDAAX COMTAB 0060 BA85 30 06 BMI SYNER0 0061 BA87 20 BE BA JSR PHELPC 0062 BA8A 4C 81 BA JMP SYNER1 0063 BA8D E8 SYNER0 INX 0064 BA8E E8 INX 0065 BA8F 86 BC STX COMTXT 0066 BA91 BD F2 A4 LDAAX COMTAB 0067 BA94 20 9A BA JSR PSYNT5 0068 BA97 20 38 A1 JSR SFOUR 0069 BA9A 20 27 A3 PSYNT5 JSR SAVITA 0070 BA9D 29 0F ANDIM &0F 0071 BA9F F0 29 BEQ PSYNT4 0072 BAA1 A8 TAY 0073 BAA2 A9 20 LDAIM " " 0074 BAA4 20 BE BA JSR PHELPC 0075 BAA7 A2 FF LDXIM &FF ; Used to be $00 0076 BAA9 E8 PSYNT2 INX 0077 BAAA BD CE BA LDAAX ARGTBL 0078 BAAD 10 FA BPL PSYNT2 0079 BAAF 88 PSYNT1 DEY 0080 BAB0 D0 F7 BNE PSYNT2 0081 BAB2 29 7F ANDIM &7F 0082 BAB4 20 BE BA PSYNT3 JSR PHELPC 0083 BAB7 E8 INX 0084 BAB8 BD CE BA LDAAX ARGTBL 0085 BABB 10 F7 BPL PSYNT3 0086 BABD 60 RTS 0087 BABE 0088 BABE 20 27 A3 PHELPC JSR SAVITA 0089 BAC1 A6 B9 LDX ETEMP 0090 BAC3 F0 06 BEQ PHLPC0 0091 BAC5 E6 B9 INC ETEMP 0092 BAC7 9D 00 01 STAAX ERRBUF 0093 BACA 60 PSYNT4 RTS 0094 BACB 4C 1F A0 PHLPC0 JMP PCHR 0095 BACE 0096 BACE BC 66 73 ARGTBL = !("<"),"fsp>" 0097 BAD3 BC 61 66 = !("<"),"afsp>" 0098 BAD9 A8 4C 29 = !("("),"L)" 0099 BADC BC 73 6F = !("<"),"source> <dest.>" 0100 BAEC BC 6F 6C = !("<"),"old fsp> <new fsp>" 0101 BAFF A8 3C 64 = !("("),"<dir>)" 0102 BB06 A8 3C 64 = !("("),"<drive>)" 0103 BB0F BC 74 69 = !("<"),"title>" 0104 BB16 BC 64 72 = !("<"),"drive>" 0105 BB1D FF = !(&FF ) ; Terminator 0106 BB1E 0107 BB1E 0108 BB1E LNK DOS08 0001 BB1E ;*** File Eight *** > DOS08 0002 BB1E TTL - DOS08 - Compact 0003 BB1E OPT &01 0004 BB1E ;* Compacts files on disk * 0005 BB1E 0006 BB1E 20 CE A9 COMPCT JSR READRV 0007 BB21 20 F7 9F JSR VSTRNG 0008 BB24 43 6F 6D = "Compacting :" 0009 BB30 8D D1 10 STA FDRIV 0010 BB33 8D D2 10 STA TDRIV 0011 BB36 20 40 A0 JSR DIGOUT 0012 BB39 20 B6 BC JSR PCRLF 0013 BB3C A0 00 LDYIM &00 ;Close all files 0014 BB3E 20 1B AE JSR VSHUT 0015 BB41 20 E5 B8 JSR GETLSZ 0016 BB44 20 C2 A2 JSR GETDIR 0017 BB47 AC 05 0F LDY DIRLEN 0018 BB4A 84 CA STY WORK + &10 0019 BB4C A9 02 LDAIM &02 0020 BB4E 85 C8 STA WORK + &0E 0021 BB50 A9 00 LDAIM &00 0022 BB52 85 C9 STA WORK + &0F 0023 BB54 A4 CA LOOPX LDY WORK + &10 0024 BB56 20 F1 A1 JSR UNSTEP 0025 BB59 C0 F8 CPYIM &F8 0026 BB5B D0 28 BNE NOTDUN 0027 BB5D 0028 BB5D [ &FF=0 0031 BB5D ] 0032 BB5D AD 07 0F LDA DIRHIG + &07 0033 BB60 38 SEC 0034 BB61 E5 C8 SBC WORK + &0E 0035 BB63 48 PHA 0036 BB64 AD 06 0F LDA DIRHIG + &06 0037 BB67 29 03 ANDIM &03 0038 BB69 E5 C9 SBC WORK + &0F 0039 BB6B 20 40 A0 JSR DIGOUT 0040 BB6E 68 PLA 0041 BB6F 20 38 A0 JSR BYTOUT 0042 BB72 20 F7 9F JSR VSTRNG 0043 BB75 20 66 72 = " free sectors",CR 0044 BB83 EA NOP 0045 BB84 60 RTS 0046 BB85 0047 BB85 84 CA NOTDUN STY WORK + &10 0048 BB87 20 74 A2 JSR INFORM 0049 BB8A A4 CA LDY WORK + &10 0050 BB8C [ &FF=0 0058 BB8C ] 0059 BB8C [ &FF=0 0063 BB8C | 0064 BB8C B9 0C 0F LDAAY CATHIG + &04 0065 BB8F C9 01 CMPIM &01 ; Does the same as the above 0066 BB91 ] 0067 BB91 A9 00 LDAIM &00 Acorn macro assembler Page 39 - DOS08 - Compact 0068 BB93 85 BC STA WORK + &02 0069 BB95 85 C0 STA WORK + &06 0070 BB97 79 0D 0F ADCAY CATHIG + &05 0071 BB9A 85 C4 STA WORK + &0A 0072 BB9C B9 0E 0F LDAAY CATHIG + &06 0073 BB9F 08 PHP 0074 BBA0 20 30 A1 JSR ISOLEN 0075 BBA3 28 PLP 0076 BBA4 69 00 ADCIM &00 0077 BBA6 85 C5 STA WORK + &0B 0078 BBA8 B9 0F 0F LDAAY CATHIG + &07 0079 BBAB 85 C6 STA WORK + &0C 0080 BBAD B9 0E 0F LDAAY CATHIG + &06 0081 BBB0 29 03 ANDIM &03 0082 BBB2 85 C7 STA WORK + &0D 0083 BBB4 C5 C9 CMP WORK + &0F 0084 BBB6 D0 14 BNE CMPCT2 0085 BBB8 A5 C6 LDA WORK + &0C 0086 BBBA C5 C8 CMP WORK + &0E 0087 BBBC D0 0E BNE CMPCT2 0088 BBBE 18 CLC 0089 BBBF 65 C4 ADC WORK + &0A 0090 BBC1 85 C8 STA WORK + &0E 0091 BBC3 A5 C9 LDA WORK + &0F 0092 BBC5 65 C5 ADC WORK + &0B 0093 BBC7 85 C9 STA WORK + &0F 0094 BBC9 4C E7 BB JMP CMPCT4 0095 BBCC A5 C8 CMPCT2 LDA WORK + &0E 0096 BBCE 99 0F 0F STAAY CATHIG + &07 0097 BBD1 B9 0E 0F LDAAY CATHIG + &06 0098 BBD4 29 FC ANDIM &FC 0099 BBD6 05 C9 ORA WORK + &0F 0100 BBD8 99 0E 0F STAAY CATHIG + &06 0101 BBDB A9 00 LDAIM &00 0102 BBDD 85 A8 STA LINNO 0103 BBDF 85 A9 STA LINNO + &01 0104 BBE1 20 02 BE JSR MVDKDA 0105 BBE4 20 3B AA JSR DIROUT 0106 BBE7 A4 CA CMPCT4 LDY WORK + &10 0107 BBE9 20 79 A2 JSR PRTINF 0108 BBEC 4C 54 BB JMP LOOPX 0109 BBEF 0110 BBEF LNK DOS09 0001 BBEF ;*** File Nine *** - DOS09 0002 BBEF TTL - DOS09 - Copy complete disk 0003 BBEF OPT &01 0004 BBEF ;* BACKUP - Does disk backup sector 0005 BBEF ; for sector * 0006 BBEF [ NOENAB=0 0007 BBEF | 0008 BBEF 2C C7 10 CHKENA BIT ENAFLG 0009 BBF2 10 5E BPL CHKEN0 0010 BBF4 0011 BBF4 20 BE BC JSR SURE 0012 BBF7 F0 02 BEQ CHKNA1 0013 BBF9 68 PLA 0014 BBFA 68 PLA ; Peel off one RTS level 0015 BBFB 4C B6 BC CHKNA1 JMP PCRLF 0016 BBFE ; ******* JSR ESTRNG 0017 BBFE ; ******* = CNENUM,"Not enabled",$00 0018 BBFE ] 0019 BBFE 0020 BBFE 20 61 BA GET2DR JSR CHKSYN 0021 BC01 20 D3 A9 JSR GETDRV 0022 BC04 8D D1 10 STA FDRIV 0023 BC07 20 61 BA JSR CHKSYN 0024 BC0A 20 D3 A9 JSR GETDRV 0025 BC0D 8D D2 10 STA TDRIV 0026 BC10 98 TYA 0027 BC11 48 PHA 0028 BC12 A9 00 LDAIM &00 0029 BC14 85 A9 STA LINNO + &01 0030 BC16 AD D2 10 LDA TDRIV 0031 BC19 CD D1 10 CMP FDRIV 0032 BC1C D0 06 BNE COPYNS 0033 BC1E A9 FF LDAIM &FF 0034 BC20 85 A9 STA LINNO + &01 0035 BC22 85 AA STA LINNO + &02 0036 BC24 20 E5 B8 COPYNS JSR GETLSZ 0037 BC27 20 F7 9F JSR VSTRNG 0038 BC2A 43 6F 70 = "Copying from :" 0039 BC38 AD D1 10 LDA FDRIV 0040 BC3B 20 40 A0 JSR DIGOUT 0041 BC3E 20 F7 9F JSR VSTRNG 0042 BC41 20 74 6F = " to :" 0043 BC46 AD D2 10 LDA TDRIV 0044 BC49 20 40 A0 JSR DIGOUT 0045 BC4C 20 B6 BC JSR PCRLF 0046 BC4F 68 PLA 0047 BC50 A8 TAY 0048 BC51 18 CLC 0049 BC52 60 CHKEN0 RTS 0050 BC53 0051 BC53 0052 BC53 20 27 A3 CHKDSF JSR SAVITA 0053 BC56 24 A9 BIT LINNO + &01 0054 BC58 10 0B BPL CHKDS1 0055 BC5A A9 00 LDAIM &00 0056 BC5C F0 0A BEQ CHKDS0 0057 BC5E 20 27 A3 CHKDST JSR SAVITA 0058 BC61 24 A9 BIT LINNO + &01 0059 BC63 30 01 BMI CHKDS2 0060 BC65 60 CHKDS1 RTS 0061 BC66 A9 80 CHKDS2 LDAIM &80 0062 BC68 C5 AA CHKDS0 CMP LINNO + &02 0063 BC6A F0 F9 BEQ CHKDS1 0064 BC6C 85 AA STA LINNO + &02 0065 BC6E 20 F7 9F JSR VSTRNG 0066 BC71 49 6E 73 = "Insert ",&EA 0067 BC79 24 AA BIT LINNO + &02 0068 BC7B 30 0B BMI CHKDS3 0069 BC7D 20 F7 9F JSR VSTRNG 0070 BC80 73 6F 75 = "source" 0071 BC86 90 0F BCC CHKDS4 0072 BC88 20 F7 9F CHKDS3 JSR VSTRNG 0073 BC8B 64 65 73 = "destination",&EA 0074 BC97 20 F7 9F CHKDS4 JSR VSTRNG 0075 BC9A 20 64 69 = " disk and hit a key",&EA 0076 BCAE 20 89 B9 JSR CLRKEY 0077 BCB1 20 E0 FF JSR OSRDCH 0078 BCB4 B0 2D BCS ABORT Acorn macro assembler Page 40 - DOS09 - Copy complete disk 0079 BCB6 0080 BCB6 ;Print carriage return line feed 0081 BCB6 48 PCRLF PHA 0082 BCB7 A9 0D LDAIM CR 0083 BCB9 20 1F A0 JSR PCHR 0084 BCBC 68 PLA 0085 BCBD 60 RTS 0086 BCBE 0087 BCBE 20 F7 9F SURE JSR VSTRNG 0088 BCC1 47 6F 20 = "Go (Y/N) ? ",&EA 0089 BCCD ;Get a 'Y' or 'N' from the keyboard 0090 BCCD ; defaults to 'N' 0091 BCCD 20 89 B9 GETYN JSR CLRKEY 0092 BCD0 20 E0 FF JSR OSRDCH 0093 BCD3 B0 0E BCS ABORT 0094 BCD5 29 5F ANDIM &5F 0095 BCD7 C9 59 CMPIM "Y" 0096 BCD9 08 PHP 0097 BCDA F0 02 BEQ GETYN0 0098 BCDC A9 4E LDAIM "N" 0099 BCDE 20 1F A0 GETYN0 JSR PCHR 0100 BCE1 28 PLP 0101 BCE2 60 RTS 0102 BCE3 0103 BCE3 ;Abort command 0104 BCE3 4C 76 AB ABORT JMP ESCAPE 0105 BCE6 0106 BCE6 4C B6 A8 NOCOP JMP NOROOM 0107 BCE9 0108 BCE9 [ NOENAB=0 0110 BCE9 | 0111 BCE9 CPYDSK ; ******* JSR CHKENA 0112 BCE9 ] 0113 BCE9 20 FE BB JSR GET2DR 0114 BCEC ; ****** 0115 BCEC 20 EF BB JSR CHKENA 0116 BCEF ; ****** 0117 BCEF [ NOENAB=0 0118 BCEF ] 0119 BCEF A9 00 LDAIM &00 0120 BCF1 85 C7 STA WORK + &0D 0121 BCF3 85 C9 STA WORK + &0F 0122 BCF5 85 C8 STA WORK + &0E 0123 BCF7 85 C6 STA WORK + &0C 0124 BCF9 85 A8 STA LINNO 0125 BCFB 20 53 BC JSR CHKDSF 0126 BCFE AD D1 10 LDA FDRIV 0127 BD01 85 CD STA FDRIVE 0128 BD03 20 6B AA JSR DIRLDY 0129 BD06 AD 07 0F LDA DIRHIG + &07 0130 BD09 85 C4 STA WORK + &0A 0131 BD0B AD 06 0F LDA DIRHIG + &06 0132 BD0E 29 03 ANDIM &03 0133 BD10 85 C5 STA WORK + &0B 0134 BD12 ;***************************** HMT 0135 BD12 ; LDA DIRHIG + $06 ; Get boot option 0136 BD12 ; ANDIM $F0 0137 BD12 ; STA QTEMP 0138 BD12 ;***************************** HMT 0139 BD12 20 5E BC JSR CHKDST 0140 BD15 AD D2 10 LDA TDRIV 0141 BD18 85 CD STA FDRIVE 0142 BD1A 20 6B AA JSR DIRLDY 0143 BD1D AD 06 0F LDA DIRHIG + &06 0144 BD20 29 03 ANDIM &03 0145 BD22 C5 C5 CMP WORK + &0B 0146 BD24 90 C0 BCC NOCOP 0147 BD26 D0 07 BNE CPYDK4 0148 BD28 AD 07 0F LDA DIRHIG + &07 0149 BD2B C5 C4 CMP WORK + &0A 0150 BD2D 90 B7 BCC NOCOP 0151 BD2F 20 02 BE CPYDK4 JSR MVDKDA ; Move the data HMT 0152 BD32 ;************************* HMT 0153 BD32 ; LDA DIRHIG + $06 0154 BD32 ; PHA 0155 BD32 ; LDA DIRHIG + $07 0156 BD32 ; PHA 0157 BD32 0158 BD32 4C 6B AA JMP DIRLDY ; Get the dir back into RAM 0159 BD35 0160 BD35 ; PLA 0161 BD35 ; STA DIRHIG + $07 0162 BD35 ; PLA 0163 BD35 ; ANDIM $0F 0164 BD35 ; ORA QTEMP 0165 BD35 ; STA DIRHIG + $06 0166 BD35 0167 BD35 ; JMP DIROUT 0168 BD35 ; This removed does not increment the MSN on the copy. HMT 0169 BD35 0170 BD35 ;************************* HMT 0171 BD35 0172 BD35 LNK DOS10 0001 BD35 ;*** File 10 *** - DOS10 0002 BD35 TTL - DOS10 - Copy files 0003 BD35 OPT &01 0004 BD35 ;* Copies files * 0005 BD35 0006 BD35 20 04 B8 CPYFIL JSR SETWLD 0007 BD38 20 FE BB JSR GET2DR 0008 BD3B 20 61 BA JSR CHKSYN 0009 BD3E 20 6A A0 JSR GETNAM 0010 BD41 20 53 BC JSR CHKDSF 0011 BD44 AD D1 10 LDA FDRIV 0012 BD47 20 99 A6 JSR DODRIV 0013 BD4A 20 87 A1 JSR ERRLOK 0014 BD4D A5 CC CPYFL3 LDA QUALIF 0015 BD4F ;**************************QSTORE 0016 BD4F 48 PHA ; Save bytes, instead of QSTORE 0017 BD50 A5 B6 LDA VTEMP 0018 BD52 85 AB STA LTEMP 0019 BD54 20 79 A2 JSR PRTINF 0020 BD57 A2 00 LDXIM &00 0021 BD59 B9 08 0E COPYL LDAAY CATLOW 0022 BD5C 95 C5 STAZX WORK + &0B 0023 BD5E 9D 50 10 STAAX NAMTRA 0024 BD61 B9 08 0F LDAAY CATHIG 0025 BD64 95 BB STAZX WORK + &01 0026 BD66 9D 47 10 STAAX TMPCIN + &02 0027 BD69 E8 INX 0028 BD6A C8 INY Acorn macro assembler Page 41 - DOS10 - Copy files 0029 BD6B E0 08 CPXIM &08 0030 BD6D D0 EA BNE COPYL 0031 BD6F A5 C1 LDA WORK + &07 0032 BD71 20 30 A1 JSR ISOLEN 0033 BD74 85 C3 STA WORK + &09 0034 BD76 A5 BF LDA WORK + &05 0035 BD78 18 CLC 0036 BD79 69 FF ADCIM &FF 0037 BD7B A5 C0 LDA WORK + &06 0038 BD7D 69 00 ADCIM &00 0039 BD7F 85 C4 STA WORK + &0A 0040 BD81 A5 C3 LDA WORK + &09 0041 BD83 69 00 ADCIM &00 0042 BD85 85 C5 STA WORK + &0B 0043 BD87 AD 4E 10 LDA TMPCIN + &09 0044 BD8A 85 C6 STA WORK + &0C 0045 BD8C AD 4D 10 LDA TMPCIN + &08 0046 BD8F 29 03 ANDIM &03 0047 BD91 85 C7 STA WORK + &0D 0048 BD93 A9 FF LDAIM &FF ;Set the output dir flag 0049 BD95 85 A8 STA LINNO 0050 BD97 20 02 BE JSR MVDKDA 0051 BD9A 20 53 BC JSR CHKDSF 0052 BD9D AD D1 10 LDA FDRIV 0053 BDA0 20 99 A6 JSR DODRIV 0054 BDA3 20 C2 A2 JSR GETDIR 0055 BDA6 A5 AB LDA LTEMP 0056 BDA8 85 B6 STA VTEMP 0057 BDAA ;**************************QSTORE 0058 BDAA 68 PLA ; Save bytes, instead of QSTORE 0059 BDAB 85 CC STA QUALIF 0060 BDAD 20 BF A1 JSR NEXT 0061 BDB0 B0 9B BCS CPYFL3 0062 BDB2 60 RTS 0063 BDB3 0064 BDB3 20 F1 BD REGEN JSR SWPFCB 0065 BDB6 20 5E BC JSR CHKDST 0066 BDB9 AD D2 10 LDA TDRIV 0067 BDBC 85 CD STA FDRIVE 0068 BDBE A5 CC LDA QUALIF 0069 BDC0 48 PHA ;save lock status 0070 BDC1 20 C2 A2 JSR GETDIR 0071 BDC4 20 AC A1 JSR LOOKW 0072 BDC7 90 03 BCC COPYFE 0073 BDC9 20 49 A2 JSR DELFIL 0074 BDCC 68 COPYFE PLA 0075 BDCD 85 CC STA QUALIF 0076 BDCF 20 95 A9 JSR DECODL 0077 BDD2 20 AC A9 JSR DECODE 0078 BDD5 A5 C2 LDA WORK + &08 0079 BDD7 20 30 A1 JSR ISOLEN 0080 BDDA 85 C4 STA WORK + &0A 0081 BDDC 20 FB A8 JSR GENFIL 0082 BDDF A5 C2 LDA WORK + &08 0083 BDE1 29 03 ANDIM &03 0084 BDE3 48 PHA 0085 BDE4 A5 C3 LDA WORK + &09 0086 BDE6 48 PHA 0087 BDE7 20 F1 BD JSR SWPFCB 0088 BDEA 68 PLA 0089 BDEB 85 C8 STA WORK + &0E 0090 BDED 68 PLA 0091 BDEE 85 C9 STA WORK + &0F 0092 BDF0 60 RTS 0093 BDF1 0094 BDF1 A2 11 SWPFCB LDXIM &11 0095 BDF3 BD 45 10 SWPFC0 LDAAX TMPCIN 0096 BDF6 B4 BA LDYZX WORK 0097 BDF8 95 BA STAZX WORK 0098 BDFA 98 TYA 0099 BDFB 9D 45 10 STAAX TMPCIN 0100 BDFE CA DEX 0101 BDFF 10 F2 BPL SWPFC0 0102 BE01 60 RTS 0103 BE02 0104 BE02 ;Move Disk Data 0105 BE02 ;On entry:- 0106 BE02 ;FDRIV: Source drive 0107 BE02 ;TDRIV: Destination drive 0108 BE02 ;WORK + $0F: Dest sec no (H) 0109 BE02 ; + $0E: (L) 0110 BE02 ; + $0D: Src sec no (H) 0111 BE02 ; + $0C: (L) 0112 BE02 ; + $0B: Secs to move (H) 0113 BE02 ; + $0A: (L) 0114 BE02 ; 0115 BE02 ;Used internally:- 0116 BE02 ; + $09: Sec no to R/W (H) 0117 BE02 ; + $08: (L) 0118 BE02 ; + $07: Sectors to shift this time 0119 BE02 ; + $06: Zero (Low length) 0120 BE02 ; + $05: 0121 BE02 ; + $04: 0122 BE02 ; + $03: Start of buffer (H) 0123 BE02 ; + $02: (L) (Zero) 0124 BE02 ; + $01: 0125 BE02 ; + $00: 0126 BE02 A9 00 MVDKDA LDAIM &00 0127 BE04 85 BC STA WORK + &02 0128 BE06 85 C0 STA WORK + &06 0129 BE08 F0 79 BEQ CPYFL8 ; Always, to Precheck the length 0130 BE0A 0131 BE0A A5 C4 CPYFL5 LDA WORK + &0A 0132 BE0C A8 TAY 0133 BE0D CD D0 10 CMP FRSIZE 0134 BE10 A5 C5 LDA WORK + &0B 0135 BE12 E9 00 SBCIM &00 0136 BE14 90 03 BCC SIZET 0137 BE16 AC D0 10 LDY FRSIZE 0138 BE19 84 C1 SIZET STY WORK + &07 0139 BE1B A5 C6 LDA WORK + &0C 0140 BE1D 85 C3 STA WORK + &09 0141 BE1F A5 C7 LDA WORK + &0D 0142 BE21 85 C2 STA WORK + &08 0143 BE23 AD CF 10 LDA FRPAGE 0144 BE26 85 BD STA WORK + &03 0145 BE28 AD D1 10 LDA FDRIV 0146 BE2B 85 CD STA FDRIVE 0147 BE2D 20 53 BC JSR CHKDSF 0148 BE30 20 98 AB JSR DETUBE 0149 BE33 20 31 AB JSR DRVSEL Acorn macro assembler Page 42 - DOS10 - Copy files 0150 BE36 20 D3 A6 JSR BLKRD 0151 BE39 AD D2 10 LDA TDRIV 0152 BE3C 85 CD STA FDRIVE 0153 BE3E 24 A8 BIT LINNO 0154 BE40 10 07 BPL CPYFL9 0155 BE42 20 B3 BD JSR REGEN 0156 BE45 A9 00 LDAIM &00 0157 BE47 85 A8 STA LINNO 0158 BE49 A5 C8 CPYFL9 LDA WORK + &0E 0159 BE4B 85 C3 STA WORK + &09 0160 BE4D A5 C9 LDA WORK + &0F 0161 BE4F 85 C2 STA WORK + &08 0162 BE51 AD CF 10 LDA FRPAGE 0163 BE54 85 BD STA WORK + &03 0164 BE56 20 5E BC JSR CHKDST 0165 BE59 20 98 AB JSR DETUBE 0166 BE5C 20 31 AB JSR DRVSEL 0167 BE5F 20 E1 A6 JSR BLKWR 0168 BE62 A5 C1 LDA WORK + &07 0169 BE64 18 CLC 0170 BE65 65 C8 ADC WORK + &0E 0171 BE67 85 C8 STA WORK + &0E 0172 BE69 90 02 BCC CPYFL6 0173 BE6B E6 C9 INC WORK + &0F 0174 BE6D A5 C1 CPYFL6 LDA WORK + &07 0175 BE6F 18 CLC 0176 BE70 65 C6 ADC WORK + &0C 0177 BE72 85 C6 STA WORK + &0C 0178 BE74 90 02 BCC CPYFL7 0179 BE76 E6 C7 INC WORK + &0D 0180 BE78 38 CPYFL7 SEC 0181 BE79 A5 C4 LDA WORK + &0A 0182 BE7B E5 C1 SBC WORK + &07 0183 BE7D 85 C4 STA WORK + &0A 0184 BE7F B0 02 BCS CPYFL8 0185 BE81 C6 C5 DEC WORK + &0B 0186 BE83 A5 C4 CPYFL8 LDA WORK + &0A ; This is here for the Precheck 0187 BE85 05 C5 ORA WORK + &0B 0188 BE87 D0 81 BNE CPYFL5 0189 BE89 60 RTS 0190 BE8A 0191 BE8A LNK DOS11 0001 BE8A ; *** File Eleven *** > DOS11 0002 BE8A TTL - DOS11 - Pseudo-MOS resident utilities 0003 BE8A OPT &01 0004 BE8A ;All those useful facilities that can 0005 BE8A ;be implemented by using only OSCALLs 0006 BE8A 0007 BE8A A6 F4 PRIBLD LDX ROMID 0008 BE8C BD F0 0D LDAAX PRIPTR 0009 BE8F 29 3F ANDIM &3F ; Dont use the FRUGAL bits 0010 BE91 85 AD STA BLDTBL + &01 0011 BE93 E6 AD INC BLDTBL + &01 0012 BE95 60 RTS 0013 BE96 0014 BE96 ;TYPE lists without line numbers 0015 BE96 20 B2 BF TYPE JSR ZERCHK 0016 BE99 A9 00 LDAIM &00 0017 BE9B F0 05 BEQ TYPE0 0018 BE9D 0019 BE9D ;LIST list with line numbers 0020 BE9D 20 B2 BF LIST JSR ZERCHK 0021 BEA0 A9 FF LDAIM &FF 0022 BEA2 85 AB TYPE0 STA LTEMP ;Store in linno flag 0023 BEA4 A9 40 LDAIM &40 ;Get for reading 0024 BEA6 20 CE FF JSR OSFIND ;Get file 0025 BEA9 A8 TAY 0026 BEAA A9 0D LDAIM CR ;Start with a linno 0027 BEAC C0 00 CPYIM &00 ;Did the file exist ? 0028 BEAE D0 1E BNE TYPE3 0029 BEB0 4C 8C A1 TYPE8 JMP NOFIL 0030 BEB3 20 D7 FF TYPE1 JSR OSBGET 0031 BEB6 B0 1E BCS TYPE2 ;EOF?? 0032 BEB8 C9 0A CMPIM LF ;Ignore LFs 0033 BEBA F0 F7 BEQ TYPE1 0034 BEBC 28 PLP 0035 BEBD D0 08 BNE TYPE4 0036 BEBF 48 PHA 0037 BEC0 20 DC BF JSR IPRDEC ;Print and INC linno 0038 BEC3 20 A9 BF JSR PSPACE 0039 BEC6 68 PLA 0040 BEC7 20 E3 FF TYPE4 JSR OSASCI ;Print char 0041 BECA 24 FF BIT ESCFLG 0042 BECC 30 1F BMI DUMP3 0043 BECE 25 AB TYPE3 AND LTEMP ;Linno disable 0044 BED0 C9 0D CMPIM CR 0045 BED2 08 PHP ;Save linno flag 0046 BED3 4C B3 BE JMP TYPE1 0047 BED6 28 TYPE2 PLP ;Remove from stack 0048 BED7 20 E7 FF JSR OSCRLF 0049 BEDA A9 00 TYPE9 LDAIM &00 ;EOF close down 0050 BEDC 4C CE FF JMP OSFIND 0051 BEDF 0052 BEDF 20 B2 BF DUMP JSR ZERCHK 0053 BEE2 A9 40 LDAIM &40 0054 BEE4 20 CE FF JSR OSFIND 0055 BEE7 A8 TAY 0056 BEE8 F0 C6 BEQ TYPE8 0057 BEEA 0058 BEEA 20 8A BE JSR PRIBLD ; Put the private pointer+1 into BLDTBL+$01 0059 BEED 0060 BEED ; LDX ROMID 0061 BEED ; LDAAX PRIPTR 0062 BEED ; ANDIM $3F ; Dont use the FRUGAL bits 0063 BEED ; STA BLDTBL + $01 0064 BEED ; INC BLDTBL + $01 0065 BEED 0066 BEED 24 FF DUMP3 BIT ESCFLG 0067 BEEF 30 65 BMI BUILD4 0068 BEF1 A5 A9 LDA LINNO + &01 0069 BEF3 20 F0 BF JSR HMTBUT 0070 BEF6 A5 A8 LDA LINNO 0071 BEF8 20 F0 BF JSR HMTBUT 0072 BEFB 20 A9 BF JSR PSPACE 0073 BEFE A9 07 LDAIM &07 0074 BF00 85 AC STA BLDTBL 0075 BF02 A2 00 LDXIM &00 0076 BF04 20 D7 FF DUMP2 JSR OSBGET 0077 BF07 B0 0D BCS DUMP4 0078 BF09 81 AC STAIX BLDTBL 0079 BF0B 20 F0 BF JSR HMTBUT Acorn macro assembler Page 43 - DOS11 - Pseudo-MOS resident utilities 0080 BF0E 20 A9 BF JSR PSPACE 0081 BF11 C6 AC DEC BLDTBL 0082 BF13 10 EF BPL DUMP2 0083 BF15 18 CLC 0084 BF16 08 DUMP4 PHP 0085 BF17 90 13 BCC DUMPB 0086 BF19 A9 2A DUMPC LDAIM "*" 0087 BF1B 20 E3 FF JSR OSASCI 0088 BF1E 20 E3 FF JSR OSASCI 0089 BF21 20 A9 BF JSR PSPACE ;**************************** HMT 0090 BF24 0091 BF24 A9 00 LDAIM &00 0092 BF26 81 AC STAIX BLDTBL 0093 BF28 C6 AC DEC BLDTBL 0094 BF2A 10 ED BPL DUMPC 0095 BF2C A9 07 DUMPB LDAIM &07 0096 BF2E 85 AC STA BLDTBL 0097 BF30 A1 AC DUMP6 LDAIX BLDTBL 0098 BF32 C9 7F CMPIM &7F 0099 BF34 B0 04 BCS DUMP7 0100 BF36 C9 20 CMPIM " " 0101 BF38 B0 02 BCS DUMP8 0102 BF3A A9 2E DUMP7 LDAIM "." 0103 BF3C 20 E3 FF DUMP8 JSR OSASCI 0104 BF3F C6 AC DEC BLDTBL 0105 BF41 10 ED BPL DUMP6 0106 BF43 20 E7 FF JSR OSCRLF 0107 BF46 A9 08 LDAIM &08 0108 BF48 18 CLC 0109 BF49 65 A8 ADC LINNO 0110 BF4B 85 A8 STA LINNO 0111 BF4D 90 02 BCC DUMP9 0112 BF4F E6 A9 INC LINNO + &01 0113 BF51 28 DUMP9 PLP 0114 BF52 B0 86 BCS TYPE9 0115 BF54 90 97 BCC DUMP3 0116 BF56 0117 BF56 20 99 B9 BUILD4 JSR ACKESC 0118 BF59 20 DA BE JSR TYPE9 0119 BF5C 4C 76 AB JMP ESCAPE 0120 BF5F 0121 BF5F 20 B2 BF BUILD JSR ZERCHK 0122 BF62 A9 80 LDAIM &80 0123 BF64 20 CE FF JSR OSFIND 0124 BF67 85 AB STA LTEMP 0125 BF69 20 DC BF BUILD1 JSR IPRDEC 0126 BF6C 20 A9 BF JSR PSPACE 0127 BF6F 0128 BF6F ; LDX ROMID 0129 BF6F ; LDYAX PRIPTR 0130 BF6F ; INY 0131 BF6F ; TYA 0132 BF6F ; ANDIM $3F ; Dont use FRUGAL bits 0133 BF6F ; STA BLDTBL + $01 0134 BF6F 0135 BF6F 20 8A BE JSR PRIBLD ; Put private pointer+1 into BLDTBL+$01 0136 BF72 0137 BF72 A2 AC LDXIM BLDTBL 0138 BF74 A0 FF LDYIM &FF 0139 BF76 84 AE STY BLDTBL + &02 0140 BF78 84 B0 STY BLDTBL + &04 0141 BF7A C8 INY ; Y := 0 0142 BF7B 84 AC STY BLDTBL 0143 BF7D A9 20 LDAIM " " ; Min. acceptable value 0144 BF7F 85 AF STA BLDTBL + &03 0145 BF81 98 TYA 0146 BF82 20 F1 FF JSR OSWORD 0147 BF85 08 PHP 0148 BF86 84 AA STY UTEMP 0149 BF88 A4 AB LDY LTEMP 0150 BF8A A2 00 LDXIM &00 0151 BF8C F0 07 BEQ BUILD3 ;Always 0152 BF8E A1 AC BUILD2 LDAIX BLDTBL 0153 BF90 20 D4 FF JSR OSBPUT 0154 BF93 E6 AC INC BLDTBL 0155 BF95 A5 AC BUILD3 LDA BLDTBL 0156 BF97 C5 AA CMP UTEMP 0157 BF99 D0 F3 BNE BUILD2 0158 BF9B 28 PLP 0159 BF9C B0 B8 BCS BUILD4 0160 BF9E A9 0D LDAIM CR 0161 BFA0 20 D4 FF JSR OSBPUT 0162 BFA3 4C 69 BF JMP BUILD1 0163 BFA6 0164 BFA6 ;*************************************************************** 0165 BFA6 ; This chunk is to be moved into DOS12 to ORG at the right place 0166 BFA6 ; to touch the top of the ROM so PNUM is always at $XFF0 0167 BFA6 [ &FF=0 0200 BFA6 ] 0201 BFA6 ;*************************************************************** 0202 BFA6 0203 BFA6 ;Print two spaces 0204 BFA6 20 A9 BF PDSPC JSR PSPACE 0205 BFA9 0206 BFA9 ;Print a space 0207 BFA9 48 PSPACE PHA 0208 BFAA A9 20 LDAIM " " 0209 BFAC 20 E3 FF JSR OSASCI 0210 BFAF 68 PLA 0211 BFB0 18 CLC 0212 BFB1 60 RTS 0213 BFB2 0214 BFB2 BA ZERCHK TSX ;A=0 on return 0215 BFB3 A9 00 LDAIM &00 0216 BFB5 9D 07 01 STAAX &107 0217 BFB8 88 DEY 0218 BFB9 C8 ZERCH2 INY 0219 BFBA B1 F2 LDAIY LINPTR 0220 BFBC C9 20 CMPIM " " 0221 BFBE F0 F9 BEQ ZERCH2 0222 BFC0 C9 0D CMPIM CR 0223 BFC2 D0 03 BNE ZERCH1 0224 BFC4 4C 66 BA JMP SYNERR 0225 BFC7 A9 00 ZERCH1 LDAIM &00 ;Clear the line counter 0226 BFC9 85 A8 STA LINNO 0227 BFCB 85 A9 STA LINNO + &01 0228 BFCD 0229 BFCD ;Convert LINPTR + Y to XY 0230 BFCD 48 PHA 0231 BFCE 98 TYA 0232 BFCF 18 CLC Acorn macro assembler Page 44 - DOS11 - Pseudo-MOS resident utilities 0233 BFD0 65 F2 ADC LINPTR 0234 BFD2 AA TAX 0235 BFD3 A5 F3 LDA LINPTR + &01 0236 BFD5 69 00 ADCIM &00 0237 BFD7 A8 TAY 0238 BFD8 68 PLA 0239 BFD9 60 RTS 0240 BFDA 0241 BFDA ENDPRG 0242 BFDA LNK DOS12 0001 BFDA ; *** File Twelve *** > DOS12 0002 BFDA TTL - DOS12 - Pseudo-MOS PNUM kept at $XFF0 0003 BFDA OPT &01 0004 BFDA 0005 BFDA [ . > &BFDC 0007 BFDA ] 0008 BFDA [ . < &BFDC 0009 BFDA 00 00 % &BFDC - . 0010 BFDC ] 0011 BFDC 0012 BFDC ; ORG &BFDC 0013 BFDC 0014 BFDC IPRDEC 0015 BFDC F8 SED 0016 BFDD 18 CLC 0017 BFDE A5 A8 LDA LINNO 0018 BFE0 69 01 ADCIM &01 0019 BFE2 85 A8 STA LINNO 0020 BFE4 A5 A9 LDA LINNO + 1 0021 BFE6 69 00 ADCIM 0 0022 BFE8 85 A9 STA LINNO + 1 0023 BFEA D8 CLD 0024 BFEB 20 F0 BF JSR PNUM 0025 BFEE A5 A8 LDA LINNO 0026 BFF0 0027 BFF0 PNUM ;******** PHA 0028 BFF0 ;******** PHP 0029 BFF0 ;******** JSR SFOUR 0030 BFF0 ;******** PLP 0031 BFF0 ;******** JSR PHNUM 0032 BFF0 ;******** PLA 0033 BFF0 ;********PHNUM TAX 0034 BFF0 ;******** BCS PHNUM0 0035 BFF0 ;******** BEQ PSPACE 0036 BFF0 ;******** BNE PHNUM0 ; Always 0037 BFF0 0038 BFF0 HMTBUT 0039 BFF0 48 PHA 0040 BFF1 20 38 A1 JSR SFOUR 0041 BFF4 20 F8 BF JSR PHNUM0 0042 BFF7 68 PLA 0043 BFF8 PHNUM0 0044 BFF8 20 45 A0 JSR DIGUT1 ; Convert to character 0045 BFFB 20 E3 FF JSR OSASCI ; Same as JSR DIGOUT only to SPOOL file ******* HMT 0046 BFFE 38 SEC 0047 BFFF 60 RTS 0048 C000 0049 C000 END Assembly finished, no errors Action : Action : *DIR X Action : GET File : NFS01 Offset : 13 New, Own or Previous address (N/O/P) : O Action : GET File : LOWL01 Offset : 05 New, Own or Previous address (N/O/P) : O Action : GET File : DOS01 Offset : 12 New, Own or Previous address (N/O/P) : O Action : *OPT 1 Action : *BACK Action : SAVE Output file : ROM Start address : &8000 End address : &C000 Load address : &8000 Proc. (T/P/H/I) P Exec address : &8000 Proc. (T/P/H/I) P Action : *spool This Perl script creates the slack columns from the raw listing. Copy the text between the cut lines. Paste it into a new file, slack.pl, and remove the first 30 characters from each line. Then call it with perl slack.pl dnfs.asm.txt >dnfs-slack.txt -------->8--- #!/usr/bin/perl $base=0x8000; @slack = (0x80) x 0x4001; open(ASM,'<'.shift(@ARGV))or die; while(<ASM>){ y/ -~//cd; if(/^Action :\s*asm\s+([A-Z0-9._-]+)/i) { $file=sprintf("%-7s",$1); } elsif(/^[0-9A-F]{4} [0-9A-F]{4} ...... LNK\s+([A-Z0-9._-]+)\s*$/) { $file=sprintf("%-7s",$1); # Link filename not held over as LNK lines do not assemble instructions. } elsif(/^([0-9A-F]{4}) ([0-9A-F]{4}) .. .. .. /) { $line=$1; $pc=hex($2); $label[$pc-$base] = $file.' '.$line.' '.$2 if $pc >= $base; } if(/^([0-9A-F]{4}) ([0-9A-F]{4}) [13579BDF]0 ([0-9A-F]{2}) ...... B/){ $line=$1; $pc=hex($2); $op=hex($3); if($op & 0x80) { $dest = $pc + 2 - 0x100 + $op; $slack = $op - 0x80; for($i = $pc + 2 - $base + $op - 0xFF; $i <= $pc - $base; ++$i) { if($slack[$i] > $slack) { $slack[$i] = $slack; $source[$i] = $pc-$base; } } } else { $dest = $pc + 2 + $op; $slack = 0x7f - $op; for($i = $pc + 2 - $base; $i <= $pc + 2 - $base + $op; ++$i) { if($slack[$i] > $slack) { $slack[$i] = $slack; $source[$i] = $pc-$base; } } } } } undef $file; undef $link; seek(ASM,0,0); while(<ASM>){ y/ -~//cd; if(/^Action :\s*asm\s+([A-Z0-9._-]+)/i) { $link=sprintf("%-7s",$1); } elsif(/^[0-9A-F]{4} [0-9A-F]{4} ...... LNK\s+([A-Z0-9._-]+)\s*$/) { $link=sprintf("%-7s",$1); } elsif(/^[0-9A-F]{4} [0-9A-F]{4} ...... END\s*$/) { $link=sprintf("%-7s",""); } if(/^([0-9A-F]{4}) ([0-9A-F]{4})(.*)$/) { $line=$1; $pc=hex($2); $source=$3; if($pc>=$base && $slack[$pc-$base] < 0x80) { printf("%-17s %s%02X %-7s %s\n", (($pc>=$base && defined($source[$pc-$base]) && defined($label[$source[$pc-$base]])) ? $label[$source[$pc-$base]] : ''), (($source[$pc-$base] < $pc-$base) ? 'v' : '^'), $slack[$pc-$base], $file, $_); } else { printf(" -- %-7s %s\n", $file, $_); } } else { printf(" %-7s %s\n", $file, $_); } if(defined($link)) { $file=$link; undef $link; } } -------->8--- End of dnfs-slack.txt