STARGO ====== Assembly listing generated by TurboMASM from the modified Acorn source. Source: https://www.4corn.co.uk/articles/65hostandmos/ Source: http://regregex.bbcmicro.net/#prog.os126 Source: https://github.com/regregex/OS126 Branch slack calculated by Greg Cook with slack.pl (attached), 18 August 2025 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 >*turmasm TURBOMASM Acorn Macro assembler 1.15 Action : width 127 Action : length 127 Action : stop on Action : print on Action : asm SgoHdr SgoHdr SgoHdr Macro library : SgoHdr SgoHdr SgoHdr SgoHdr Acorn macro assembler Page 1 SgoHdr SgoHdr SgoHdr Pass 1 SgoHdr Pass 2 -- SgoHdr 0001 0000 ; > SgoHdr -- SgoHdr 0002 0000 -- SgoHdr 0003 0000 GBLL $Tutu -- SgoHdr 0004 0000 $Tutu SETL 1=0 -- SgoHdr 0005 0000 -- SgoHdr 0006 0000 ; conditional assembly flags -- SgoHdr 0007 0000 007F MOS125 * &7F -- SgoHdr 0008 0000 0000 STARGO * &00 -- SgoHdr 0009 0000 00FF NOSP * &FF -- SgoHdr 0010 0000 ; ($00 => TRUE, $FF => FALSE) -- SgoHdr 0011 0000 -- SgoHdr 0012 0000 ; special labels for STARGO -- SgoHdr 0013 0000 00DC SEAL * &DC -- SgoHdr 0014 0000 ;The value to be returned in A by OSARGS A=1, Y=0 -- SgoHdr 0015 0000 ;when trapped by MOS/CFS/RFS. -- SgoHdr 0016 0000 ;MSRM says to preserve A (p. H.3-5), i.e. A=1 -- SgoHdr 0017 0000 ;however MOS 3.20 breaks the spec and returns A=&DC, mainly. -- SgoHdr 0018 0000 ;This is just a copy of the 3MSB of the pointer at X+1. -- SgoHdr 0019 0000 ;NAUG says A is undefined (p.253); other unofficial sources -- SgoHdr 0020 0000 ;suggest that implemented OSARGS calls *should not* -- SgoHdr 0021 0000 ;preserve A. -- SgoHdr 0022 0000 -- SgoHdr 0023 0000 02D0 TAILLO * &02D0 -- SgoHdr 0024 0000 02D1 TAILHI * &02D1 -- SgoHdr 0025 0000 ;Locations to store the command line tail pointer from *GO -- SgoHdr 0026 0000 ;and *RUN. Need not be adjacent. Formerly buffer activity -- SgoHdr 0027 0000 ;flags that are free in OS 1.26. -- SgoHdr 0028 0000 -- SgoHdr 0029 0000 LNK MOS00 -- MOS00 0001 0000 -- MOS00 0002 0000 TTL VDU File -> MOS00 -- MOS00 0003 0000 OPT &01 -- MOS00 0004 0000 -- MOS00 0005 0000 ; -- MOS00 0006 0000 ; MASM options -- MOS00 0007 0000 ; -- MOS00 0008 0000 0004 OPNEWP * &04 ;new page -- MOS00 0009 0000 0001 OPPON * &01 ;print on -- MOS00 0010 0000 0002 OPPOFF * &02 ;print off -- MOS00 0011 0000 ; -- MOS00 0012 0000 ; module print selections -- MOS00 0013 0000 ; -- MOS00 0014 0000 0005 DEFOPT * OPPON:OR:OPNEWP ;default option for MOS code -- MOS00 0015 0000 0005 MOS00 * DEFOPT -- MOS00 0016 0000 0005 MOS01 * DEFOPT -- MOS00 0017 0000 0005 MOS02 * DEFOPT -- MOS00 0018 0000 0005 MOS03 * DEFOPT -- MOS00 0019 0000 0005 MOS04 * DEFOPT -- MOS00 0020 0000 0005 MOS05 * DEFOPT -- MOS00 0021 0000 0005 MOS06 * DEFOPT -- MOS00 0022 0000 0005 MOS07 * DEFOPT -- MOS00 0023 0000 0005 MOS08 * DEFOPT -- MOS00 0024 0000 -- MOS00 0025 0000 0005 MOS10 * DEFOPT -- MOS00 0026 0000 0005 MOS11 * DEFOPT -- MOS00 0027 0000 -- MOS00 0028 0000 OPT MOS00 MOS00 MOS00 MOS00 MOS00 Acorn macro assembler Page 2 MOS00 VDU File -> MOS00 MOS00 -- MOS00 0029 0000 -- MOS00 0030 0000 00F0 WARGS * &00F0 -- MOS00 0031 0000 00FA SEIWKA * &00FA -- MOS00 0032 0000 00FB SEIWKB * &00FB -- MOS00 0033 0000 -- MOS00 0034 0000 ;Last updated 01/08/82 -- MOS00 0035 0000 -- MOS00 0036 0000 ;01/08/82 Intro of SEIWKA and SEIWKB to fix palette IRQ problem -- MOS00 0037 0000 ;01/05/82 Order of variables changed. Pseudo op # used. -- MOS00 0038 0000 ;21/04/82 QPOSN removed completely -- MOS00 0039 0000 ;25/03/82 Low byte of BEGSCN replaced with BYTCH (it was always zero) -- MOS00 0040 0000 ;04/02/82 QPOSN moved to MOS -- MOS00 0041 0000 ;07/01/82 VDUVEC removed (to $222 in MOS) -- MOS00 0042 0000 ;14/11/81 DOTS removed -- MOS00 0043 0000 -- MOS00 0044 0000 ;VARIABLES, NOT ZERO PAGE -- MOS00 0045 0000 -- MOS00 0046 0000 ;CHARACTER FONTS -- MOS00 0047 0000 -- MOS00 0048 0000 BF00 HFONT * &BF00 -- MOS00 0049 0000 00BF HFMSB * /(HFONT ) ;MSB of HFONT -- MOS00 0050 0000 -- MOS00 0051 0000 ;VARIABLES PROPER -- MOS00 0052 0000 -- MOS00 0053 0000 -- MOS00 0054 0000 0300 VARBLE * &0300 -- MOS00 0055 0000 0300 V * VARBLE ;An abbreviation -- MOS00 0056 0000 -- MOS00 0057 0000 -- MOS00 0058 0000 ^ VARBLE -- MOS00 0059 0000 -- MOS00 0060 0000 0300 GWLCOL # &02 ;Row no. of LH margin of graphics window (internal repn.) -- MOS00 0061 0000 0302 GWBROW # &02 ;Row no. of bottom margin of graphics window (internal repn.) -- MOS00 0062 0000 0304 GWRCOL # &02 ;Col no. of RH margin of graphics window (internal repn.) -- MOS00 0063 0000 0306 GWTROW # &02 ;Row no. of top margin of graphics window (internal repn.) -- MOS00 0064 0000 0308 TWLCOL # &01 ;Column number of left margin of text window -- MOS00 0065 0000 0309 TWBROW # &01 ;Row number of bottom margin of text window -- MOS00 0066 0000 030A TWRCOL # &01 ;Column number of right margin of text window -- MOS00 0067 0000 030B TWTROW # &01 ;Row number of top margin of text window -- MOS00 0068 0000 030C ORGX # &02 ;Screen origin (external represntation) -- MOS00 0069 0000 030E ORGY # &02 -- MOS00 0070 0000 0310 GCSX # &02 ;Graphics cursor (external representation) -- MOS00 0071 0000 0312 GCSY # &02 -- MOS00 0072 0000 0314 OLDCS # &04 ;Old graphics cursor -- MOS00 0073 0000 0318 CSX # &01 ;Text cursor posn (screen relative) -- MOS00 0074 0000 0319 CSY # &01 -- MOS00 0075 0000 031A YLINE # &01 ;Offset from ZMEMG for current graphics point -- MOS00 0076 0000 031B QQ # &08 ;Queue -- MOS00 0077 0000 0323 QEND # &01 ;Last byte in queue -- MOS00 0078 0000 0324 GCSIX # &02 ;Graphics cursor (internal representation) -- MOS00 0079 0000 0326 GCSIY # &02 -- MOS00 0080 0000 0328 VDUWS # &22 ;Workspace for VDU -- MOS00 0081 0000 034A CSPOSN # &02 ;Memory of top byte of character at cursor -- MOS00 0082 0000 034C PWWDTH # &02 ;Text window width in bytes -- MOS00 0083 0000 034E BEGSCN # &01 ;MSByte of Lowest byte address displayed -- MOS00 0084 0000 034F BYTCH # &01 ;No bytes per character displayed -- MOS00 0085 0000 0350 TOPSCN # &02 ;Address of top left byte on screen -- MOS00 0086 0000 0352 BYTROW # &02 ;Bytes per row -- MOS00 0087 0000 0354 BYTSCN # &01 ;Bytes used for screen display -- MOS00 0088 0000 0355 MODE # &01 ;Current VDU mode (0..7) -- MOS00 0089 0000 0356 MEMODE # &01 ;Memory map type (0..4) -- MOS00 0090 0000 ;STATS # $01 ;Individual bits used for various things - see docn. for details -- MOS00 0091 0000 0357 FTCOLF # &01 ;Next four must be in this order Foreground text colour -- MOS00 0092 0000 0358 BTCOLF # &01 ;Background text colour -- MOS00 0093 0000 0359 FGCOLF # &01 ;Foreground graphics colour -- MOS00 0094 0000 035A BGCOLF # &01 ;Background graphics colour -- MOS00 0095 0000 035B GPLFMD # &01 ;Current graphics foreground plot colour -- MOS00 0096 0000 035C GPLBMD # &01 ;Current graphics background plot colour -- MOS00 0097 0000 035D JVEC # &02 ;Jump vector for JMIs -- MOS00 0098 0000 035F CSTEMP # &01 ;Cursor start register of 6845 -- MOS00 0099 0000 0360 NCOLOR # &01 ;No. colours available (=0 for TTX) -- MOS00 0100 0000 0361 NPIX # &01 ;No. pixels per byte (=0 for non-graphics mode) -- MOS00 0101 0000 0362 MASKL # &01 ;Mask for left most pixel in byte -- MOS00 0102 0000 0363 MASKR # &01 ;Mask for right most pixel in byte -- MOS00 0103 0000 0364 PCSX # &01 ;Print cursor x position -- MOS00 0104 0000 0365 PCSY # &01 ;Print cursor y position -- MOS00 0105 0000 0366 CHCSR # &01 ;Character which is the displayed cursor on print line -- MOS00 0106 0000 0367 FNTFLG # &01 ;Default font flags, 0 for hard font, p.1=b6 .. p.7=b0 -- MOS00 0107 0000 0368 PGSFNT # &07 ;Page addresses for the soft font $20 - $3F & etc. -- MOS00 0108 0000 036F PARROT # &10 ;Storage of 16 physical colours -- MOS00 0109 0000 037F VEND # &00 ;End of the variables -- MOS00 0110 0000 -- MOS00 0111 0000 ; ************************** MANIFESTS **************************** -- MOS00 0112 0000 -- MOS00 0113 0000 -- MOS00 0114 0000 ^ VDUWS -- MOS00 0115 0000 0328 DLEWS # &08 ;Workspace for DLE -- MOS00 0116 0000 0330 DLENLN # &01 -- MOS00 0117 0000 -- MOS00 0118 0000 ^ VDUWS -- MOS00 0119 0000 0328 CANWS # &04 ;Workspace for CAN -- MOS00 0120 0000 032C CDELTA # &04 -- MOS00 0121 0000 -- MOS00 0122 0000 ^ VDUWS -- MOS00 0123 0000 0328 USWS # &02 ;Workspace for US -- MOS00 0124 0000 -- MOS00 0125 0000 ^ VDUWS -- MOS00 0126 0000 0328 SSWS # &02 ;Workspace for soft scrolling -- MOS00 0127 0000 -- MOS00 0128 0000 ^ VDUWS -- MOS00 0129 0000 0328 APCS1 # &04 ;Workspace for anomalous printing -- MOS00 0130 0000 -- MOS00 0131 0000 ^ VDUWS -- MOS00 0132 0000 0328 READWS # &08 ;Intermediate bit pattern formed during READCH -- MOS00 0133 0000 -- MOS00 0134 0000 ^ VDUWS -- MOS00 0135 0000 0328 RPXLWS # &04 ;Workspace for read pixel -- MOS00 0136 0000 -- MOS00 0137 0000 ;For graphics in general -- MOS00 0138 0000 -- MOS00 0139 0000 030C ORG * ORGX ;Graphics origin -- MOS00 0140 0000 0310 GCSR * GCSX ;Graphics external cursor -- MOS00 0141 0000 0324 GCSIR * GCSIX ;Graphics internal cursor -- MOS00 0142 0000 0320 NEWPT * QEND-&03 ;New point introduced by call to routine. Multiple of 8 ! -- MOS00 0143 0000 031F PLMODE * QEND-&04 ;Plot mode -- MOS00 0144 0000 -- MOS00 0145 0000 ;Plotting lines -- MOS00 0146 0000 -- MOS00 0147 0000 ^ VDUWS -- MOS00 0148 0000 0328 LDELTA # &04 ;DeltaX & DeltaY -- MOS00 0149 0000 032C LSTART # &04 ;Start point for line MOS00 MOS00 MOS00 MOS00 Acorn macro assembler Page 3 MOS00 VDU File -> MOS00 MOS00 -- MOS00 0150 0000 0330 HEND # &02 ;Horizontal end point -- MOS00 0151 0000 0332 D2JVEC # &02 ;Jump vector for D2 -- MOS00 0152 0000 0334 DOTFLG # &01 ;Dotted line flag -- MOS00 0153 0000 0335 LPARMS # &06 ;Parameters for line drawing -- MOS00 0154 0000 -- MOS00 0155 0000 ;Plotting triangles -- MOS00 0156 0000 -- MOS00 0157 0000 ^ VDUWS -- MOS00 0158 0000 0328 HPARMS # &06 -- MOS00 0159 0000 032E HSTART # &04 -- MOS00 0160 0000 0332 HDIREC # &01 -- MOS00 0161 0000 0333 SPARMS # &06 -- MOS00 0162 0000 0339 SSTART # &04 -- MOS00 0163 0000 033D SDIREC # &01 -- MOS00 0164 0000 033E GCSTMP # &08 -- MOS00 0165 0000 -- MOS00 0166 0000 032A HDELTA * HPARMS+&02 -- MOS00 0167 0000 0335 SDELTA * SPARMS+&02 -- MOS00 0168 0000 031B TRINLN * QQ -- MOS00 0169 0000 -- MOS00 0170 0000 ;Teletext temp variable for byte hidden by input cursor -- MOS00 0171 0000 -- MOS00 0172 0000 0338 TTXTMP * VDUWS+&10 ;as nothing available in TTX uses this much storage -- MOS00 0173 0000 -- MOS00 0174 0000 LNK MOS01 -- MOS01 0001 0000 -- MOS01 0002 0000 TTL VDU File - MOS01 -- MOS01 0003 0000 OPT MOS01 MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 4 MOS01 VDU File - MOS01 MOS01 -- MOS01 0004 0000 -- MOS01 0005 0000 < &0001 -- MOS01 0006 0000 > &0002 -- MOS01 0007 0000 -- MOS01 0008 0000 ;Last revision 02/06/82 -- MOS01 0009 0000 -- MOS01 0010 0000 ;02/06/82 Remove HWMOFS -- MOS01 0011 0000 ;26/05/82 Concatenate TBZGOE & FCOLTB -- MOS01 0012 0000 ;05/05/82 Reverse bytes of multiplication tables TXTTB & HRGTB -- MOS01 0013 0000 ; Delete LRGTB -- MOS01 0014 0000 ;02/05/82 Concatenate TBZGxx tables -- MOS01 0015 0000 ; Change order of D1 & D2 jump tables & EWTBA -- MOS01 0016 0000 ;21/04/82 Colour mode #5 (which gives no change) included in TBZGxx. -- MOS01 0017 0000 ; External entry points provided -- MOS01 0018 0000 ;15/04/82 NPCOL declared -- MOS01 0019 0000 ;24/03/82 Delete DFSFPG as these are calculated at run time -- MOS01 0020 0000 ;22/01/82 Delete PDIVTB, it wasn't referenced -- MOS01 0021 0000 ; Delete READVP entry point & asssociated jump table -- MOS01 0022 0000 ; Change VDUVEC to VDUVEC, prefix all MOS names with m -- MOS01 0023 0000 ; TRMCH fixed as $0D -- MOS01 0024 0000 ; Soft font default now the exploded default -- MOS01 0025 0000 ;07/01/82 Change MODEL & VDUVEC -- MOS01 0026 0000 ;09/11/81 Change to one entry point for read VDU parameters -- MOS01 0027 0000 ;28/10/81 ETB msb changed from $49 to $59 -- MOS01 0028 0000 ; Chars $C0-$DF taken from $10 (was $0C) -- MOS01 0029 0000 ; Chars $E0-$FF taken from $0C (was $10) -- MOS01 0030 0000 -- MOS01 0031 0000 ; conditional assembly flags -- MOS01 0032 0000 00FF STARTP * &FF ;assume end points plotted twice -- MOS01 0033 0000 0000 PAGEFX * &00 ;Fix bug in page mode (I hope) -- MOS01 0034 0000 ; ($00 => TRUE, $FF => FALSE) -- MOS01 0035 0000 -- MOS01 0036 0000 ;ZERO PAGE VARIABLES -- MOS01 0037 0000 -- MOS01 0038 0000 ^ &00D0 -- MOS01 0039 0000 00D0 STATS # &01 -- MOS01 0040 0000 -- MOS01 0041 0000 ; -- MOS01 0042 0000 00D1 ZMASK # &01 -- MOS01 0043 0000 00D2 ZORA # &01 ;Next four must be in this order -- MOS01 0044 0000 00D3 ZEOR # &01 -- MOS01 0045 0000 00D4 ZGORA # &01 -- MOS01 0046 0000 00D5 ZGEOR # &01 -- MOS01 0047 0000 ; -- MOS01 0048 0000 00D6 ZMEMG # &02 -- MOS01 0049 0000 00D8 ZMEMT # &02 ;Immediately before ZTEMP (SSCRS) -- MOS01 0050 0000 00DA ZTEMP # &02 -- MOS01 0051 0000 00DC ZTEMPB # &02 -- MOS01 0052 0000 00DE ZTEMPC # &02 -- MOS01 0053 0000 00E0 ZTBL # &02 -- MOS01 0054 0000 -- MOS01 0055 0000 ;EQUATE TABLE -- MOS01 0056 0000 -- MOS01 0057 0000 0006 ACKASC * &06 ;Ascii value of acknowledge -- MOS01 0058 0000 00FE INBYTE * &FE ;Dummy colour to indicate invert (illegal colour) -- MOS01 0059 0000 -- MOS01 0060 0000 0020 TTXBCL * &20 ;Byte to clear screen with in TTX -- MOS01 0061 0000 000D TRMCH * &0D ;Byte to terminate edit mode -- MOS01 0062 0000 000C SFPAGE * &0C ;Page of first definable set of characters -- MOS01 0063 0000 003F INVSXT * &3F ;Used to invert logical colour of mode 2 without touching flash -- MOS01 0064 0000 000F NPCOL * &0F ;number of physical colours - 1 -- MOS01 0065 0000 -- MOS01 0066 0000 ;MACHINE CONSTANTS -- MOS01 0067 0000 -- MOS01 0068 0000 FE00 CRTCA * &FE00 ;6845 address reg. -- MOS01 0069 0000 FE01 CRTCD * &FE01 ;6845 data register -- MOS01 0070 0000 -- MOS01 0071 0000 ;ENTRY POINTS -- MOS01 0072 0000 -- MOS01 0073 0000 C300 CODE * &C300 -- MOS01 0074 0000 00C3 CODORG * /CODE -- MOS01 0075 0000 -- MOS01 0076 0000 ORG CODE -- MOS01 0077 C300 -- MOS01 0078 C300 4C 31 CB JMP RESET ;Reset VDU to mode (A) -- MOS01 0079 C303 ; JMP GADDR -- MOS01 0080 C303 ; JMP WIND -- MOS01 0081 C303 ; JMP EIGABS -- MOS01 0082 C303 ; JMP IEG -- MOS01 0083 C303 ; JMP PLOT -- MOS01 0084 C303 ; JMP HPLOT -- MOS01 0085 C303 ; JMP SETZG -- MOS01 0086 C303 ; JMP RPXLD -- MOS01 0087 C303 -- MOS01 0088 C303 ; MOS messages to be written by WRSTR -- MOS01 0089 C303 MSG -- MOS01 0090 C303 MSGBBC ;BBC Computer -- MOS01 0091 C303 0D 42 42 = MCR,"BBC Computer ",0 -- MOS01 0092 C312 -- MOS01 0093 C312 MSG16K ;16K -- MOS01 0094 C312 31 36 4B = "16K",BEL,0 -- MOS01 0095 C317 -- MOS01 0096 C317 MSG32K ;32K -- MOS01 0097 C317 33 32 4B = "32K",BEL,0 -- MOS01 0098 C31C -- MOS01 0099 C31C MSG2CR -- MOS01 0100 C31C 08 = &08 -- MOS01 0101 C31D 0D = &0D -- MOS01 0102 C31E 0D = &0D ;uses the next $00 -- MOS01 0103 C31F -- MOS01 0104 C31F ;EXPANDED BIT PATTERN TABLES - must be contiguous -- MOS01 0105 C31F -- MOS01 0106 C31F ;FOUR COLOUR MODE -- MOS01 0107 C31F -- MOS01 0108 C31F 00 BPFTB = &00 -- MOS01 0109 C320 11 = &11 -- MOS01 0110 C321 22 = &22 -- MOS01 0111 C322 33 = &33 -- MOS01 0112 C323 44 = &44 -- MOS01 0113 C324 55 = &55 -- MOS01 0114 C325 66 = &66 -- MOS01 0115 C326 77 = &77 -- MOS01 0116 C327 88 = &88 -- MOS01 0117 C328 99 = &99 -- MOS01 0118 C329 AA = &AA -- MOS01 0119 C32A BB = &BB -- MOS01 0120 C32B CC = &CC -- MOS01 0121 C32C DD = &DD -- MOS01 0122 C32D EE = &EE -- MOS01 0123 C32E FF = &FF -- MOS01 0124 C32F MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 5 MOS01 VDU File - MOS01 MOS01 -- MOS01 0125 C32F ;SIXTEEN COLOUR MODE -- MOS01 0126 C32F -- MOS01 0127 C32F 00 BPSTB = &00 -- MOS01 0128 C330 55 = &55 -- MOS01 0129 C331 AA = &AA -- MOS01 0130 C332 FF = &FF -- MOS01 0131 C333 -- MOS01 0132 C333 -- MOS01 0133 C333 ;JUMP TABLES Lower byte -- MOS01 0134 C333 -- MOS01 0135 C333 12 JTBLO = ACK ;Points to an RTS -- MOS01 0136 C334 3A = SOH -- MOS01 0137 C335 93 = STX -- MOS01 0138 C336 9E = ETX -- MOS01 0139 C337 AA = EOT -- MOS01 0140 C338 B6 = ENQ -- MOS01 0141 C339 12 = ACK -- MOS01 0142 C33A BA = BELL -- MOS01 0143 C33B F9 = BS -- MOS01 0144 C33C 98 = HT -- MOS01 0145 C33D B8 = LF -- MOS01 0146 C33E 8F = VT -- MOS01 0147 C33F 7C = FF -- MOS01 0148 C340 EE = CR -- MOS01 0149 C341 8A = SO -- MOS01 0150 C342 A3 = SI -- MOS01 0151 C343 FD = DLE -- MOS01 0152 C344 36 = DCA -- MOS01 0153 C345 3A = DCB -- MOS01 0154 C346 B8 = DCC -- MOS01 0155 C347 75 = DCD -- MOS01 0156 C348 98 = NAK -- MOS01 0157 C349 06 = SYN -- MOS01 0158 C34A 0C = ETB -- MOS01 0159 C34B 46 = CAN -- MOS01 0160 C34C 98 = EM -- MOS01 0161 C34D CE = SUB -- MOS01 0162 C34E 12 = ACK ;Points to an RTS -- MOS01 0163 C34F 2E = FS -- MOS01 0164 C350 AE = GS -- MOS01 0165 C351 99 = RS -- MOS01 0166 C352 C6 = US -- MOS01 0167 C353 10 = DEL -- MOS01 0168 C354 -- MOS01 0169 C354 ;Higher byte unless bytes to be queued, in which case, lower nibble -- MOS01 0170 C354 ;gives number of bytes to be queued, upper offset of higher byte -- MOS01 0171 C354 ;of routine address from code origin as specified by CODORG. Note -- MOS01 0172 C354 ;that this must be <8, i.e. biy 7 of whole byte is clear. -- MOS01 0173 C354 -- MOS01 0174 C354 C5 JTBHI = /(ACK ) ;Points to an RTS -- MOS01 0175 C355 2F = SOH:SHR:&8-CODORG:SHL:&4+&10-&1 ;Queue 1 byte (SOH) -- MOS01 0176 C356 C5 = /(STX ) -- MOS01 0177 C357 C5 = /(ETX ) -- MOS01 0178 C358 C5 = /(EOT ) -- MOS01 0179 C359 C5 = /(ENQ ) -- MOS01 0180 C35A C5 = /(ACK ) -- MOS01 0181 C35B E8 = /(BELL ) -- MOS01 0182 C35C C5 = /(BS ) -- MOS01 0183 C35D C6 = /(HT ) -- MOS01 0184 C35E C6 = /(LF ) -- MOS01 0185 C35F C6 = /(VT ) -- MOS01 0186 C360 C7 = /(FF ) -- MOS01 0187 C361 C7 = /(CR ) -- MOS01 0188 C362 C5 = /(SO ) -- MOS01 0189 C363 C5 = /(SI ) -- MOS01 0190 C364 C7 = /(DLE ) -- MOS01 0191 C365 5F = DCA:SHR:&8-CODORG:SHL:&4+&10-&1 ;Queue 1 byte (DCA) -- MOS01 0192 C366 5E = DCB:SHR:&8-CODORG:SHL:&4+&10-&2 ;Queue 2 bytes (DCB) -- MOS01 0193 C367 5B = DCC:SHR:&8-CODORG:SHL:&4+&10-&5 ;Queue 5 bytes (DCC) -- MOS01 0194 C368 C8 = /(DCD ) -- MOS01 0195 C369 C5 = /(NAK ) -- MOS01 0196 C36A 6F = SYN:SHR:&8-CODORG:SHL:&4+&10-&1 ;Queue 1 byte (SYN) -- MOS01 0197 C36B [ MOS125 = &FF -- MOS01 0199 C36B | -- MOS01 0200 C36B 77 = ETB:SHR:&8-CODORG:SHL:&4+&20-&9 ;Queue 9 bytes (ETB) -- MOS01 0201 C36C ] -- MOS01 0202 C36C 78 = CAN:SHR:&8-CODORG:SHL:&4+&10-&8 ;Queue 8 bytes (CAN) -- MOS01 0203 C36D 6B = EM:SHR:&8-CODORG:SHL:&4+&10-&5 ;Queue 5 bytes (EM) -- MOS01 0204 C36E C9 = /(SUB ) -- MOS01 0205 C36F C5 = /(ACK ) ;Points to an RTS -- MOS01 0206 C370 4C = FS:SHR:&8-CODORG:SHL:&4+&10-&4 ;Queue 4 bytes (FS) -- MOS01 0207 C371 7C = GS:SHR:&8-CODORG:SHL:&4+&10-&4 ;Queue 4 bytes (GS) -- MOS01 0208 C372 C7 = /(RS ) -- MOS01 0209 C373 4E = US:SHR:&8-CODORG:SHL:&4+&10-&2 ;Queue 2 bytes (US) -- MOS01 0210 C374 D0 = /(DEL ) -- MOS01 0211 C375 -- MOS01 0212 C375 ;ROW OFFSETS FOR H.R.G. -- MOS01 0213 C375 -- MOS01 0214 C375 00 HRGTB = &00 -- MOS01 0215 C376 00 = &00 -- MOS01 0216 C377 02 = &02 -- MOS01 0217 C378 80 = &80 -- MOS01 0218 C379 05 = &05 -- MOS01 0219 C37A 00 = &00 -- MOS01 0220 C37B 07 = &07 -- MOS01 0221 C37C 80 = &80 -- MOS01 0222 C37D 0A = &0A -- MOS01 0223 C37E 00 = &00 -- MOS01 0224 C37F 0C = &0C -- MOS01 0225 C380 80 = &80 -- MOS01 0226 C381 0F = &0F -- MOS01 0227 C382 00 = &00 -- MOS01 0228 C383 11 = &11 -- MOS01 0229 C384 80 = &80 -- MOS01 0230 C385 14 = &14 -- MOS01 0231 C386 00 = &00 -- MOS01 0232 C387 16 = &16 -- MOS01 0233 C388 80 = &80 -- MOS01 0234 C389 19 = &19 -- MOS01 0235 C38A 00 = &00 -- MOS01 0236 C38B 1B = &1B -- MOS01 0237 C38C 80 = &80 -- MOS01 0238 C38D 1E = &1E -- MOS01 0239 C38E 00 = &00 -- MOS01 0240 C38F 20 = &20 -- MOS01 0241 C390 80 = &80 -- MOS01 0242 C391 23 = &23 -- MOS01 0243 C392 00 = &00 -- MOS01 0244 C393 25 = &25 -- MOS01 0245 C394 80 = &80 -- MOS01 0246 C395 28 = &28 MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 6 MOS01 VDU File - MOS01 MOS01 -- MOS01 0247 C396 00 = &00 -- MOS01 0248 C397 2A = &2A -- MOS01 0249 C398 80 = &80 -- MOS01 0250 C399 2D = &2D -- MOS01 0251 C39A 00 = &00 -- MOS01 0252 C39B 2F = &2F -- MOS01 0253 C39C 80 = &80 -- MOS01 0254 C39D 32 = &32 -- MOS01 0255 C39E 00 = &00 -- MOS01 0256 C39F 34 = &34 -- MOS01 0257 C3A0 80 = &80 -- MOS01 0258 C3A1 37 = &37 -- MOS01 0259 C3A2 00 = &00 -- MOS01 0260 C3A3 39 = &39 -- MOS01 0261 C3A4 80 = &80 -- MOS01 0262 C3A5 3C = &3C -- MOS01 0263 C3A6 00 = &00 -- MOS01 0264 C3A7 3E = &3E -- MOS01 0265 C3A8 80 = &80 -- MOS01 0266 C3A9 41 = &41 -- MOS01 0267 C3AA 00 = &00 -- MOS01 0268 C3AB 43 = &43 -- MOS01 0269 C3AC 80 = &80 -- MOS01 0270 C3AD 46 = &46 -- MOS01 0271 C3AE 00 = &00 -- MOS01 0272 C3AF 48 = &48 -- MOS01 0273 C3B0 80 = &80 -- MOS01 0274 C3B1 4B = &4B -- MOS01 0275 C3B2 00 = &00 -- MOS01 0276 C3B3 4D = &4D -- MOS01 0277 C3B4 80 = &80 -- MOS01 0278 C3B5 -- MOS01 0279 C3B5 ;ROW OFFSET TABLE FOR TELETEXT -- MOS01 0280 C3B5 -- MOS01 0281 C3B5 00 TXTTB = &00 -- MOS01 0282 C3B6 00 = &00 -- MOS01 0283 C3B7 00 = &00 -- MOS01 0284 C3B8 28 = &28 -- MOS01 0285 C3B9 00 = &00 -- MOS01 0286 C3BA 50 = &50 -- MOS01 0287 C3BB 00 = &00 -- MOS01 0288 C3BC 78 = &78 -- MOS01 0289 C3BD 00 = &00 -- MOS01 0290 C3BE A0 = &A0 -- MOS01 0291 C3BF 00 = &00 -- MOS01 0292 C3C0 C8 = &C8 -- MOS01 0293 C3C1 00 = &00 -- MOS01 0294 C3C2 F0 = &F0 -- MOS01 0295 C3C3 01 = &01 -- MOS01 0296 C3C4 18 = &18 -- MOS01 0297 C3C5 01 = &01 -- MOS01 0298 C3C6 40 = &40 -- MOS01 0299 C3C7 01 = &01 -- MOS01 0300 C3C8 68 = &68 -- MOS01 0301 C3C9 01 = &01 -- MOS01 0302 C3CA 90 = &90 -- MOS01 0303 C3CB 01 = &01 -- MOS01 0304 C3CC B8 = &B8 -- MOS01 0305 C3CD 01 = &01 -- MOS01 0306 C3CE E0 = &E0 -- MOS01 0307 C3CF 02 = &02 -- MOS01 0308 C3D0 08 = &08 -- MOS01 0309 C3D1 02 = &02 -- MOS01 0310 C3D2 30 = &30 -- MOS01 0311 C3D3 02 = &02 -- MOS01 0312 C3D4 58 = &58 -- MOS01 0313 C3D5 02 = &02 -- MOS01 0314 C3D6 80 = &80 -- MOS01 0315 C3D7 02 = &02 -- MOS01 0316 C3D8 A8 = &A8 -- MOS01 0317 C3D9 02 = &02 -- MOS01 0318 C3DA D0 = &D0 -- MOS01 0319 C3DB 02 = &02 -- MOS01 0320 C3DC F8 = &F8 -- MOS01 0321 C3DD 03 = &03 -- MOS01 0322 C3DE 20 = &20 -- MOS01 0323 C3DF 03 = &03 -- MOS01 0324 C3E0 48 = &48 -- MOS01 0325 C3E1 03 = &03 -- MOS01 0326 C3E2 70 = &70 -- MOS01 0327 C3E3 03 = &03 -- MOS01 0328 C3E4 98 = &98 -- MOS01 0329 C3E5 03 = &03 -- MOS01 0330 C3E6 C0 = &C0 -- MOS01 0331 C3E7 -- MOS01 0332 C3E7 ;NO. ROWS IN EACH MEMORY MODE -- MOS01 0333 C3E7 -- MOS01 0334 C3E7 1F PROWS = &1F -- MOS01 0335 C3E8 1F = &1F -- MOS01 0336 C3E9 1F = &1F -- MOS01 0337 C3EA 18 = &18 -- MOS01 0338 C3EB 1F = &1F -- MOS01 0339 C3EC 1F = &1F -- MOS01 0340 C3ED 18 = &18 -- MOS01 0341 C3EE 18 = &18 -- MOS01 0342 C3EF -- MOS01 0343 C3EF ;NO. COLS. IN EACH MEMORY MODE -- MOS01 0344 C3EF -- MOS01 0345 C3EF 4F PCOLS = &4F -- MOS01 0346 C3F0 27 = &27 -- MOS01 0347 C3F1 13 = &13 -- MOS01 0348 C3F2 4F = &4F -- MOS01 0349 C3F3 27 = &27 -- MOS01 0350 C3F4 13 = &13 -- MOS01 0351 C3F5 27 = &27 -- MOS01 0352 C3F6 27 = &27 -- MOS01 0353 C3F7 -- MOS01 0354 C3F7 ;BYTES TO BE LOADED INTO mMODREG FOR DIFFERENT MODES -- MOS01 0355 C3F7 -- MOS01 0356 C3F7 9C INDMOD = &9C -- MOS01 0357 C3F8 D8 = &D8 -- MOS01 0358 C3F9 F4 = &F4 -- MOS01 0359 C3FA 9C = &9C -- MOS01 0360 C3FB 88 = &88 -- MOS01 0361 C3FC C4 = &C4 -- MOS01 0362 C3FD 88 = &88 -- MOS01 0363 C3FE 4B = &4B -- MOS01 0364 C3FF -- MOS01 0365 C3FF ;BYTES PER CHARACTER -- MOS01 0366 C3FF ;IN EACH MODE -- MOS01 0367 C3FF MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 7 MOS01 VDU File - MOS01 MOS01 -- MOS01 0368 C3FF 08 BYTCHT = &08 -- MOS01 0369 C400 10 = &10 -- MOS01 0370 C401 20 = &20 -- MOS01 0371 C402 08 = &08 -- MOS01 0372 C403 08 = &08 -- MOS01 0373 C404 10 = &10 -- MOS01 0374 C405 08 = &08 -- MOS01 0375 C406 01 = &01 -- MOS01 0376 C407 -- MOS01 0377 C407 ;MASK TABLES - must be contiguous -- MOS01 0378 C407 -- MOS01 0379 C407 ;For each mode, the masks of each pixel, MS first -- MOS01 0380 C407 ;Note that it is now assumed that adjacent masks may be generated -- MOS01 0381 C407 ;by either ASL or LSR. -- MOS01 0382 C407 -- MOS01 0383 C407 ;SIXTEEN colour mode -- MOS01 0384 C407 -- MOS01 0385 C407 AA MASKTB = &AA -- MOS01 0386 C408 55 = &55 -- MOS01 0387 C409 -- MOS01 0388 C409 ;FOUR colour mode -- MOS01 0389 C409 88 = &88 -- MOS01 0390 C40A 44 = &44 -- MOS01 0391 C40B 22 = &22 -- MOS01 0392 C40C 11 = &11 -- MOS01 0393 C40D -- MOS01 0394 C40D ;TWO colour mode -- MOS01 0395 C40D -- MOS01 0396 C40D 80 BITTBL = &80 -- MOS01 0397 C40E 40 = &40 -- MOS01 0398 C40F 20 = &20 -- MOS01 0399 C410 10 = &10 -- MOS01 0400 C411 08 = &08 -- MOS01 0401 C412 04 = &04 -- MOS01 0402 C413 -- MOS01 0403 C413 02 = &02 ;**** NEXT 3 BYTES USED BY CFS **** -- MOS01 0404 C414 ;Uses $01 of next table -- MOS01 0405 C414 -- MOS01 0406 C414 ;COLOURS AVAILABLE FOR MODES -- MOS01 0407 C414 -- MOS01 0408 C414 01 COLMOD = &01 -- MOS01 0409 C415 03 = &03 -- MOS01 0410 C416 0F = &0F -- MOS01 0411 C417 -- MOS01 0412 C417 01 = &01 ;**** NEXT 3 BYTES USED BY CFS **** -- MOS01 0413 C418 01 = &01 -- MOS01 0414 C419 03 = &03 -- MOS01 0415 C41A 01 = &01 -- MOS01 0416 C41B ;TTX - must be 0 - uses 1st byte of next table -- MOS01 0417 C41B -- MOS01 0418 C41B ;Bytes for forming ZGORA & ZGEOR -- MOS01 0419 C41B ;Tables have been run into each other to save bytes. -- MOS01 0420 C41B ;They should be as follows -- MOS01 0421 C41B -- MOS01 0422 C41B ;TBZGOO OR the OR :- $FF,$00,$00,$FF,$FF,$FF -- MOS01 0423 C41B ;TBZGEO EOR the OR :- $00,$00,$FF,$FF,$FF,$FF -- MOS01 0424 C41B ;TBZGOE OR the EOR :- $00,$FF,$00,$00,$FF,$FF -- MOS01 0425 C41B ;TBZGEE EOR the EOR :- $FF,$FF,$FF,$00,$00,$FF -- MOS01 0426 C41B -- MOS01 0427 C41B ;These are for the colour modes 0 to 5, being -- MOS01 0428 C41B ;0=Store,1=OR,2=AND,3=EOR,4=Invert,5=No change -- MOS01 0429 C41B -- MOS01 0430 C41B 00 TBZGOE = &00 -- MOS01 0431 C41C FF TBZGOO = &FF -- MOS01 0432 C41D 00 TBZGEO = &00 -- MOS01 0433 C41E 00 = &00 -- MOS01 0434 C41F FF = &FF -- MOS01 0435 C420 FF TBZGEE = &FF -- MOS01 0436 C421 FF = &FF -- MOS01 0437 C422 FF = &FF -- MOS01 0438 C423 00 = &00 ;Uses next $00, $FF -- MOS01 0439 C424 -- MOS01 0440 C424 ;~~~ COLOUR TABLES ~~~ -- MOS01 0441 C424 -- MOS01 0442 C424 ;FULL COLOUR TABLES -- MOS01 0443 C424 ;Tables of 'full colours', -- MOS01 0444 C424 ;i.e. of bytes with all bits -- MOS01 0445 C424 ;set to 1 colour, in ascending -- MOS01 0446 C424 ;colour order -- MOS01 0447 C424 -- MOS01 0448 C424 00 FCOLTB = &00 ;Two colour table -- MOS01 0449 C425 FF = &FF -- MOS01 0450 C426 -- MOS01 0451 C426 ;Four colour table -- MOS01 0452 C426 -- MOS01 0453 C426 00 = &00 -- MOS01 0454 C427 0F = &0F -- MOS01 0455 C428 F0 = &F0 -- MOS01 0456 C429 FF = &FF -- MOS01 0457 C42A -- MOS01 0458 C42A ;Sixteen colour table -- MOS01 0459 C42A -- MOS01 0460 C42A 00 = &00 -- MOS01 0461 C42B 03 = &03 -- MOS01 0462 C42C 0C = &0C -- MOS01 0463 C42D 0F = &0F -- MOS01 0464 C42E 30 = &30 -- MOS01 0465 C42F 33 = &33 -- MOS01 0466 C430 3C = &3C -- MOS01 0467 C431 3F = &3F ;INVSXT This byte used to invert graphics pixels -- MOS01 0468 C432 C0 = &C0 -- MOS01 0469 C433 C3 = &C3 -- MOS01 0470 C434 CC = &CC -- MOS01 0471 C435 CF = &CF -- MOS01 0472 C436 F0 = &F0 -- MOS01 0473 C437 F3 = &F3 -- MOS01 0474 C438 FC = &FC -- MOS01 0475 C439 FF = &FF -- MOS01 0476 C43A -- MOS01 0477 C43A ;TABLE FOR NPIX -- MOS01 0478 C43A -- MOS01 0479 C43A ;No. pixles per byte in each graphics mode -- MOS01 0480 C43A ;(0 if not graphics) -- MOS01 0481 C43A -- MOS01 0482 C43A 07 NPIXTB = &07 -- MOS01 0483 C43B 03 = &03 -- MOS01 0484 C43C 01 = &01 -- MOS01 0485 C43D 00 = &00 ;(Non graphics) -- MOS01 0486 C43E 07 = &07 -- MOS01 0487 C43F 03 = &03 -- MOS01 0488 C440 ;Non-graphics modes - use next 2 $00s MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 8 MOS01 VDU File - MOS01 MOS01 -- MOS01 0489 C440 -- MOS01 0490 C440 ;MEMORY MAP TYPES -- MOS01 0491 C440 ;Index from MODE (0..7), to -- MOS01 0492 C440 ;the following 5 element tables -- MOS01 0493 C440 -- MOS01 0494 C440 MODETB -- MOS01 0495 C440 00 = &00 -- MOS01 0496 C441 SOUNDV ;channel dependent period offset -- MOS01 0497 C441 C43D SCHOFF * SOUNDV -&04 -- MOS01 0498 C441 -- MOS01 0499 C441 00 = &00 -- MOS01 0500 C442 00 = &00 -- MOS01 0501 C443 01 = &01 -- MOS01 0502 C444 02 = &02 -- MOS01 0503 C445 02 = &02 -- MOS01 0504 C446 03 = &03 -- MOS01 0505 C447 ;Uses $04 of next table -- MOS01 0506 C447 -- MOS01 0507 C447 -- MOS01 0508 C447 ;EXIT WINDOW OFFSET TABLE -- MOS01 0509 C447 -- MOS01 0510 C447 04 EWTBA = &04 -- MOS01 0511 C448 00 = &00 -- MOS01 0512 C449 06 = &06 -- MOS01 0513 C44A 02 = &02 -- MOS01 0514 C44B -- MOS01 0515 C44B -- MOS01 0516 C44B ;C0 control table -- MOS01 0517 C44B ;C1 control table -- MOS01 0518 C44B -- MOS01 0519 C44B 0D CONE = &0D -- MOS01 0520 C44C 05 = &05 -- MOS01 0521 C44D 0D = &0D -- MOS01 0522 C44E 05 = &05 ;Uses next $04 -- MOS01 0523 C44F 04 CZERO = &04 -- MOS01 0524 C450 04 = &04 -- MOS01 0525 C451 0C = &0C -- MOS01 0526 C452 0C = &0C -- MOS01 0527 C453 04 = &04 -- MOS01 0528 C454 -- MOS01 0529 C454 ;TABLES OF JUMP VECTORS -- MOS01 0530 C454 ;FOR CLEAR SCREEN -- MOS01 0531 C454 -- MOS01 0532 C454 15 CLSCTA = CLASCA ;(LSB) -- MOS01 0533 C455 45 = CLASCB -- MOS01 0534 C456 8D = CLASCC -- MOS01 0535 C457 A5 = CLASCD -- MOS01 0536 C458 F9 = CLASCE -- MOS01 0537 C459 -- MOS01 0538 C459 ;CLSCTB = CLASCA / ;(MSB) -- MOS01 0539 C459 ; = CLASCB / -- MOS01 0540 C459 ; = CLASCC / -- MOS01 0541 C459 ; = CLASCD / -- MOS01 0542 C459 ; = CLASCE / -- MOS01 0543 C459 -- MOS01 0544 C459 ;NO. BYTES PER SCREEN (MSB) -- MOS01 0545 C459 -- MOS01 0546 C459 50 BYTSTA = &50 -- MOS01 0547 C45A 40 = &40 -- MOS01 0548 C45B 28 = &28 -- MOS01 0549 C45C 20 = &20 -- MOS01 0550 C45D 04 = &04 -- MOS01 0551 C45E -- MOS01 0552 C45E ;MSB OF SCREEN START -- MOS01 0553 C45E -- MOS01 0554 C45E 30 STSCTB = &30 -- MOS01 0555 C45F 40 = &40 -- MOS01 0556 C460 58 = &58 -- MOS01 0557 C461 60 = &60 -- MOS01 0558 C462 7C = &7C -- MOS01 0559 C463 -- MOS01 0560 C463 ;BYTE WIDTH TYPES -- MOS01 0561 C463 ;Index from MEMODE (0..4), to -- MOS01 0562 C463 ;the following 3 element tables -- MOS01 0563 C463 -- MOS01 0564 C463 ;Now replaced with LSRA -- MOS01 0565 C463 -- MOS01 0566 C463 ;LSB OF NO. BYTES PER ROW -- MOS01 0567 C463 -- MOS01 0568 C463 28 BYTRTA = &28 -- MOS01 0569 C464 40 = &40 -- MOS01 0570 C465 80 = &80 -- MOS01 0571 C466 -- MOS01 0572 C466 ;LSB OF SCREEN OFFSET TABLES -- MOS01 0573 C466 -- MOS01 0574 C466 B5 TBZTBA = TXTTB -- MOS01 0575 C467 75 = HRGTB -- MOS01 0576 C468 75 = HRGTB -- MOS01 0577 C469 -- MOS01 0578 C469 -- MOS01 0579 C469 ;CRTC TABLES -- MOS01 0580 C469 -- MOS01 0581 C469 ;INDEX FOR CRTC TABLES -- MOS01 0582 C469 -- MOS01 0583 C469 0B CRTCX = &0B -- MOS01 0584 C46A 17 = &17 -- MOS01 0585 C46B 23 = &23 -- MOS01 0586 C46C 2F = &2F -- MOS01 0587 C46D 3B = &3B -- MOS01 0588 C46E -- MOS01 0589 C46E ;CRTC TABLE FOR MODES 0-2 -- MOS01 0590 C46E -- MOS01 0591 C46E 7F CRTCTB = &7F -- MOS01 0592 C46F 50 = &50 -- MOS01 0593 C470 62 = &62 -- MOS01 0594 C471 28 = &28 ;VS=2 -- MOS01 0595 C472 26 = &26 -- MOS01 0596 C473 00 = &00 -- MOS01 0597 C474 20 = &20 -- MOS01 0598 C475 22 = &22 ;was $22 & then it was $23 -- MOS01 0599 C476 01 = &01 -- MOS01 0600 C477 07 = &07 -- MOS01 0601 C478 67 = &67 -- MOS01 0602 C479 08 = &08 -- MOS01 0603 C47A -- MOS01 0604 C47A ;CRTC TABLE FOR MODE 3 -- MOS01 0605 C47A -- MOS01 0606 C47A 7F = &7F -- MOS01 0607 C47B 50 = &50 -- MOS01 0608 C47C 62 = &62 -- MOS01 0609 C47D 28 = &28 ;VS=2 MOS01 MOS01 MOS01 MOS01 Acorn macro assembler Page 9 MOS01 VDU File - MOS01 MOS01 -- MOS01 0610 C47E 1E = &1E -- MOS01 0611 C47F 02 = &02 -- MOS01 0612 C480 19 = &19 -- MOS01 0613 C481 1B = &1B ;was $1B & then it was $1C -- MOS01 0614 C482 01 = &01 -- MOS01 0615 C483 09 = &09 -- MOS01 0616 C484 67 = &67 -- MOS01 0617 C485 09 = &09 -- MOS01 0618 C486 -- MOS01 0619 C486 ;CRTC TABLE FOR MODES 4-5 -- MOS01 0620 C486 -- MOS01 0621 C486 3F = &3F -- MOS01 0622 C487 28 = &28 -- MOS01 0623 C488 31 = &31 -- MOS01 0624 C489 24 = &24 ;VS=2 -- MOS01 0625 C48A 26 = &26 -- MOS01 0626 C48B 00 = &00 -- MOS01 0627 C48C 20 = &20 -- MOS01 0628 C48D 22 = &22 ;was $22 & then it was $23 -- MOS01 0629 C48E 01 = &01 -- MOS01 0630 C48F 07 = &07 -- MOS01 0631 C490 67 = &67 -- MOS01 0632 C491 08 = &08 -- MOS01 0633 C492 -- MOS01 0634 C492 ;CRTC TABLE FOR MODE 6 -- MOS01 0635 C492 -- MOS01 0636 C492 3F = &3F -- MOS01 0637 C493 28 = &28 -- MOS01 0638 C494 31 = &31 -- MOS01 0639 C495 24 = &24 ;VS=2 -- MOS01 0640 C496 1E = &1E -- MOS01 0641 C497 02 = &02 -- MOS01 0642 C498 19 = &19 -- MOS01 0643 C499 1B = &1B ;was $1B & then it was $1C -- MOS01 0644 C49A 01 = &01 -- MOS01 0645 C49B 09 = &09 -- MOS01 0646 C49C 67 = &67 -- MOS01 0647 C49D 09 = &09 -- MOS01 0648 C49E -- MOS01 0649 C49E ;CRTC TABLE FOR MODE 7 -- MOS01 0650 C49E -- MOS01 0651 C49E 3F = &3F -- MOS01 0652 C49F 28 = &28 -- MOS01 0653 C4A0 33 = &33 -- MOS01 0654 C4A1 24 = &24 ;VS=2 -- MOS01 0655 C4A2 1E = &1E -- MOS01 0656 C4A3 02 = &02 -- MOS01 0657 C4A4 19 = &19 -- MOS01 0658 C4A5 1B = &1B ;was $1B & then it was $1C -- MOS01 0659 C4A6 93 = &93 -- MOS01 0660 C4A7 12 = &12 -- MOS01 0661 C4A8 72 = &72 -- MOS01 0662 C4A9 13 = &13 -- MOS01 0663 C4AA -- MOS01 0664 C4AA ;JUMP TABLES FOR PLOTTING ROUTINES -- MOS01 0665 C4AA -- MOS01 0666 C4AA 78 D1JTB = EA -- MOS01 0667 C4AB D3 = /(EA ) -- MOS01 0668 C4AC 70 = NA -- MOS01 0669 C4AD D3 = /(NA ) -- MOS01 0670 C4AE -- MOS01 0671 C4AE 5C D2JTBL = EB -- MOS01 0672 C4AF 66 = WB -- MOS01 0673 C4B0 34 = NB -- MOS01 0674 C4B1 3D = SB -- MOS01 0675 C4B2 -- MOS01 0676 C4B2 D3 D2JTBH = /(EB ) -- MOS01 0677 C4B3 D3 = /(WB ) -- MOS01 0678 C4B4 D3 = /(NB ) -- MOS01 0679 C4B5 D3 = /(SB ) -- MOS01 0680 C4B6 -- MOS01 0681 C4B6 -- MOS01 0682 C4B6 ;TELETEXT CONVERSION TABLE -- MOS01 0683 C4B6 -- MOS01 0684 C4B6 23 TTXTB = &23 -- MOS01 0685 C4B7 5F = &5F -- MOS01 0686 C4B8 60 = &60 -- MOS01 0687 C4B9 23 = &23 -- MOS01 0688 C4BA -- MOS01 0689 C4BA -- MOS01 0690 C4BA ; font table -- MOS01 0691 C4BA -- MOS01 0692 C4BA FFSZOT ;Four,Five,Six,Zero,One,Two -- MOS01 0693 C4BA 04 = &04 -- MOS01 0694 C4BB 05 = &05 -- MOS01 0695 C4BC 06 = &06 -- MOS01 0696 C4BD 00 = &00 -- MOS01 0697 C4BE 01 = &01 -- MOS01 0698 C4BF 02 = &02 -- MOS01 0699 C4C0 -- MOS01 0700 C4C0 -- MOS01 0701 C4C0 LNK MOS02 -- MOS02 0001 C4C0 -- MOS02 0002 C4C0 TTL VDU File - MOS02 -- MOS02 0003 C4C0 OPT MOS02 MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 10 MOS02 VDU File - MOS02 MOS02 -- MOS02 0004 C4C0 -- MOS02 0005 C4C0 ;Last revision 30/04/82 -- MOS02 0006 C4C0 -- MOS02 0007 C4C0 ;30/04/82 Recoded to allow for reverse queueing -- MOS02 0008 C4C0 ;19/04/82 To put ASCIQ in line, and various other byte savings -- MOS02 0009 C4C0 ;19/11/81 No longer include bell in printer range check -- MOS02 0010 C4C0 -- MOS02 0011 C4C0 -- MOS02 0012 C4C0 ;ENTRY POINT - SELECT ROUTINE -- MOS02 0013 C4C0 -- MOS02 0014 C4C0 -- MOS02 0015 C4C0 VDU -- MOS02 0016 C4C0 AE 6A 02 LDX QPOSN ;Are we Qing ? -- MOS02 0017 C4C3 D0 4E BNE QING ;Yes?, then queue this byte MOS02 0017 C4C3 v31 MOS02 0018 C4C5 24 D0 BIT STATS MOS02 0017 C4C3 v31 MOS02 0019 C4C7 50 0F BVC NOTCEA ;In C.E. mode? MOS02 0017 C4C3 v31 MOS02 0020 C4C9 20 65 C5 JSR CSWAP ;Yes?, then swap cursors MOS02 0017 C4C3 v31 MOS02 0021 C4CC 20 7B CD JSR OCSRDL ;Delete the output cursor MOS02 0017 C4C3 v31 MOS02 0022 C4CF 30 07 BMI NOTCEA ;Are we disabled ? then skip MOS02 0017 C4C3 v31 MOS02 0023 C4D1 C9 0D CMPIM TRMCH ;No?, then is this TRMCH ? MOS02 0017 C4C3 v31 MOS02 0024 C4D3 D0 03 BNE NOTCEA MOS02 0017 C4C3 v31 MOS02 0025 C4D5 20 AD D8 JSR CSEDEX ;Yes?, then exit C.E. mode MOS02 0017 C4C3 v31 MOS02 0026 C4D8 C9 7F NOTCEA CMPIM &7F ;No?, then form vector MOS02 0017 C4C3 v31 MOS02 0027 C4DA F0 14 BEQ ISDEL MOS02 0017 C4C3 v31 MOS02 0028 C4DC C9 20 CMPIM &20 MOS02 0017 C4C3 v31 MOS02 0029 C4DE 90 12 BCC NOTDEL ; Branch if unprintable MOS02 0017 C4C3 v31 MOS02 0030 C4E0 24 D0 BIT STATS ;Printable - are we disabled ? MOS02 0017 C4C3 v31 MOS02 0031 C4E2 30 06 BMI NOTC20 ;Yes, then print it if print module on MOS02 0017 C4C3 v31 MOS02 0032 C4E4 20 C2 CF JSR VDUPR ;No?, then print to VDU MOS02 0017 C4C3 v31 MOS02 0033 C4E7 20 98 C6 JSR HT MOS02 0017 C4C3 v31 MOS02 0034 C4EA [ MOS125 = &FF MOS02 0017 C4C3 v31 MOS02 0036 C4EA | MOS02 0017 C4C3 v31 MOS02 0037 C4EA NOTC20 ;A dead MOS02 0017 C4C3 v31 MOS02 0038 C4EA A5 D0 LDA STATS MOS02 0017 C4C3 v31 MOS02 0039 C4EC 4A LSRA ;C=1 if printer module on MOS02 0017 C4C3 v31 MOS02 0040 C4ED 4C 5E C5 JMP CSWDEX ;& ditto MOS02 0017 C4C3 v31 MOS02 0041 C4F0 ;BPL CSWDEX ;& ditto MOS02 0017 C4C3 v31 MOS02 0042 C4F0 ] MOS02 0017 C4C3 v31 MOS02 0043 C4F0 MOS02 0017 C4C3 v31 MOS02 0044 C4F0 A9 20 ISDEL LDAIM &20 ;(Form correct index for DEL) MOS02 0017 C4C3 v31 MOS02 0045 C4F2 MOS02 0017 C4C3 v31 MOS02 0046 C4F2 A8 NOTDEL TAY MOS02 0017 C4C3 v31 MOS02 0047 C4F3 B9 33 C3 LDAAY JTBLO ;Get LSByte of jump vector MOS02 0017 C4C3 v31 MOS02 0048 C4F6 8D 5D 03 STA JVEC MOS02 0017 C4C3 v31 MOS02 0049 C4F9 B9 54 C3 LDAAY JTBHI ;Get MSByte MOS02 0017 C4C3 v31 MOS02 0050 C4FC 30 47 BMI REXEC ;No Qing required, so execute routine MOS02 0017 C4C3 v31 MOS02 0051 C4FE AA TAX ;b7=0, so Q needed - set it up MOS02 0017 C4C3 v31 MOS02 0052 C4FF 09 F0 ORAIM &F0 ;2's comp. of no. of bytes to Q MOS02 0017 C4C3 v31 MOS02 0053 C501 8D 6A 02 STA QPOSN MOS02 0017 C4C3 v31 MOS02 0054 C504 8A TXA ;Generate MSByte of address - MSNybble, plus CODORG MOS02 0017 C4C3 v31 MOS02 0055 C505 4A LSRA MOS02 0017 C4C3 v31 MOS02 0056 C506 4A LSRA MOS02 0017 C4C3 v31 MOS02 0057 C507 4A LSRA MOS02 0017 C4C3 v31 MOS02 0058 C508 4A LSRA MOS02 0017 C4C3 v31 MOS02 0059 C509 [ MOS125 = &FF MOS02 0017 C4C3 v31 MOS02 0066 C509 | MOS02 0017 C4C3 v31 MOS02 0067 C509 ;C contains bit 3 i.e. C=1 if <9 bytes to queue MOS02 0017 C4C3 v31 MOS02 0068 C509 ;codorg offset in b6..4 and adcim operand account for this MOS02 0017 C4C3 v31 MOS02 0069 C509 69 C2 ADCIM CODORG -&01 ;Forms the high byte of the vector MOS02 0017 C4C3 v31 MOS02 0070 C50B 8D 5E 03 STA JVEC +&01 MOS02 0017 C4C3 v31 MOS02 0071 C50E 24 D0 BIT STATS ;Swap back again if C.E. MOS02 0017 C4C3 v31 MOS02 0072 C510 70 50 BVS NOTC10 MOS02 0072 C510 v2F MOS02 0073 C512 ;adcim codorg never overflows (here...), C=0 MOS02 0072 C510 v2F MOS02 0074 C512 ] MOS02 0072 C510 v2F MOS02 0075 C512 60 ACK RTS ;NUL points at this to save a byte MOS02 0072 C510 v2F MOS02 0076 C513 MOS02 0072 C510 v2F MOS02 0077 C513 MOS02 0072 C510 v2F MOS02 0078 C513 9D 24 02 QING STAAX QEND-&FF ;Q the byte MOS02 0072 C510 v2F MOS02 0079 C516 E8 INX MOS02 0072 C510 v2F MOS02 0080 C517 8E 6A 02 STX QPOSN ;(z preserved from INX) MOS02 0072 C510 v2F MOS02 0081 C51A D0 09 BNE CLCEX ;More to do?, then exit MOS02 0072 C510 v2F MOS02 0082 C51C 24 D0 BIT STATS ;Disabled?, then go away MOS02 0072 C510 v2F MOS02 0083 C51E 30 13 BMI DISABL MOS02 0072 C510 v2F MOS02 0084 C520 70 05 BVS NOTCEB ;C.E. mode, then do swapping MOS02 0072 C510 v2F MOS02 0085 C522 20 08 CD JSR RUNNER MOS02 0072 C510 v2F MOS02 0086 C525 [ MOS125 = &FF MOS02 0072 C510 v2F MOS02 0087 C525 | MOS02 0072 C510 v2F MOS02 0088 C525 CLCEX MOS02 0072 C510 v2F MOS02 0089 C525 ] MOS02 0072 C510 v2F MOS02 0090 C525 18 CLC MOS02 0072 C510 v2F MOS02 0091 C526 60 RTS MOS02 0072 C510 v2F MOS02 0092 C527 MOS02 0072 C510 v2F MOS02 0093 C527 20 65 C5 NOTCEB JSR CSWAP MOS02 0072 C510 v2F MOS02 0094 C52A 20 7B CD JSR OCSRDL MOS02 0072 C510 v2F MOS02 0095 C52D 20 08 CD JSR RUNNER MOS02 0072 C510 v2F MOS02 0096 C530 [ MOS125 = &FF MOS02 0072 C510 v2F MOS02 0100 C530 | MOS02 0072 C510 v2F MOS02 0101 C530 18 CLC MOS02 0072 C510 v2F MOS02 0102 C531 90 2F BCC REXE10 MOS02 0072 C510 v2F MOS02 0103 C533 ] MOS02 0072 C510 v2F MOS02 0104 C533 MOS02 0072 C510 v2F MOS02 0105 C533 AC 5E 03 DISABL LDY JVEC +&01 ;Was this an SOH ? MOS02 0072 C510 v2F MOS02 0106 C536 C0 C5 CPYIM /(SOH ) MOS02 0072 C510 v2F MOS02 0107 C538 D0 EB BNE CLCEX ;No?, then go home MOS02 0072 C510 v2F MOS02 0108 C53A MOS02 0072 C510 v2F MOS02 0109 C53A AA SOH TAX ;Yes, then (A)=Byte to be printed MOS02 0072 C510 v2F MOS02 0110 C53B A5 D0 LDA STATS ;Is printing enabled ? MOS02 0072 C510 v2F MOS02 0111 C53D 4A LSRA MOS02 0072 C510 v2F MOS02 0112 C53E 90 D2 BCC ACK MOS02 0072 C510 v2F MOS02 0113 C540 8A TXA MOS02 0072 C510 v2F MOS02 0114 C541 [ MOS125 = &FF MOS02 0072 C510 v2F MOS02 0115 C541 | MOS02 0072 C510 v2F MOS02 0116 C541 18 CLC ;C=0, prevent second printing; PRINT preserves flags MOS02 0072 C510 v2F MOS02 0117 C542 ] MOS02 0072 C510 v2F MOS02 0118 C542 4C 43 E2 JMP PRINT ;print character and return, setting c=0 (done by MOS) MOS02 0072 C510 v2F MOS02 0119 C545 MOS02 0072 C510 v2F MOS02 0120 C545 [ MOS125 = &FF MOS02 0072 C510 v2F MOS02 0143 C545 | MOS02 0072 C510 v2F MOS02 0144 C545 REXEC ;starting +2 from NOTC20; 1 spare byte MOS02 0072 C510 v2F MOS02 0145 C545 8D 5E 03 STA JVEC +&01 MOS02 0072 C510 v2F MOS02 0146 C548 A5 D0 LDA STATS MOS02 0072 C510 v2F MOS02 0147 C54A 6A RORA ;Is printer module on? MOS02 0072 C510 v2F MOS02 0148 C54B 98 TYA ;AND Is it range $08 to $0D ? (no longer include bell) MOS02 0072 C510 v2F MOS02 0149 C54C 6A RORA ;+4 = +6 MOS02 0072 C510 v2F MOS02 0150 C54D C9 84 CMPIM &84 MOS02 0072 C510 v2F MOS02 0151 C54F 49 FF EORIM &FF MOS02 0072 C510 v2F MOS02 0152 C551 6A RORA MOS02 0072 C510 v2F MOS02 0153 C552 69 43 ADCIM &43 MOS02 0072 C510 v2F MOS02 0154 C554 98 TYA ;-2 = +4 MOS02 0072 C510 v2F MOS02 0155 C555 ; MOS02 0072 C510 v2F MOS02 0156 C555 24 D0 BIT STATS ;Execute routine - are we disabled ? MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 11 MOS02 VDU File - MOS02 MOS02 MOS02 0072 C510 v2F MOS02 0157 C557 30 24 BMI ACKQ ;Was it an ACK? (can't be an SOH cos she queues) MOS02 0072 C510 v2F MOS02 0158 C559 ; MOS02 0072 C510 v2F MOS02 0159 C559 08 PHP ;and push c MOS02 0072 C510 v2F MOS02 0160 C55A 20 08 CD JSR RUNNER ;Do the routine MOS02 0072 C510 v2F MOS02 0161 C55D 28 PLP MOS02 0072 C510 v2F MOS02 0162 C55E CSWDEX ;enter with C=printer module on ;-5 = -1; 4 spare bytes MOS02 0072 C510 v2F MOS02 0163 C55E 24 D0 BIT STATS ;Following preserves c MOS02 0072 C510 v2F MOS02 0164 C560 50 B0 BVC ACK ;Not C.E. so exit MOS02 0072 C510 v2F MOS02 0165 C562 NOTC10 MOS02 0072 C510 v2F MOS02 0166 C562 20 8B CD REXE10 JSR OCSRWR ;Write output cursor MOS02 0157 C557 v5B MOS02 0167 C565 ] MOS02 0157 C557 v5B MOS02 0168 C565 MOS02 0157 C557 v5B MOS02 0169 C565 ;CSWAP - swap input and output text cursors MOS02 0157 C557 v5B MOS02 0170 C565 ; invert b1 of STATS MOS02 0157 C557 v5B MOS02 0171 C565 MOS02 0157 C557 v5B MOS02 0172 C565 08 CSWAP PHP ;Preserve carry MOS02 0157 C557 v5B MOS02 0173 C566 48 PHA MOS02 0157 C557 v5B MOS02 0174 C567 A2 18 LDXIM CSX-V MOS02 0157 C557 v5B MOS02 0175 C569 A0 64 LDYIM PCSX-V MOS02 0157 C557 v5B MOS02 0176 C56B 20 FA CD JSR SWAP2 MOS02 0157 C557 v5B MOS02 0177 C56E 20 24 CF JSR TADDRY ;Address this point MOS02 0157 C557 v5B MOS02 0178 C571 20 13 CA JSR CSDSP MOS02 0157 C557 v5B MOS02 0179 C574 A5 D0 LDA STATS MOS02 0157 C557 v5B MOS02 0180 C576 49 02 EORIM &02 ;Invert bit 1 of STATS MOS02 0157 C557 v5B MOS02 0181 C578 85 D0 STA STATS MOS02 0157 C557 v5B MOS02 0182 C57A 68 PLA MOS02 0157 C557 v5B MOS02 0183 C57B 28 PLP ;Restore c MOS02 0157 C557 v5B MOS02 0184 C57C 60 RTS MOS02 0157 C557 v5B MOS02 0185 C57D MOS02 0157 C557 v5B MOS02 0186 C57D ACKQ MOS02 0157 C557 v5B MOS02 0187 C57D ; C=0 => character not printable, C=1 => printable MOS02 0157 C557 v5B MOS02 0188 C57D 49 06 EORIM ACKASC ;Was it an ACK ? -- MOS02 0189 C57F D0 08 BNE VDURTS ;[not ACK] MOS02 0189 C57F v77 MOS02 0190 C581 ; MOS02 0189 C57F v77 MOS02 0191 C581 ; C=0 cos ACK not printable MOS02 0189 C57F v77 MOS02 0192 C581 A9 7F LDAIM &7F ;Yes?, then clear b7 of STATS MOS02 0189 C57F v77 MOS02 0193 C583 90 20 BCC STTAND ;always jump MOS02 0193 C583 v5F MOS02 0194 C585 MOS02 0193 C583 v5F MOS02 0195 C585 MOS02 0193 C583 v5F MOS02 0196 C585 MOS02 0193 C583 v5F MOS02 0197 C585 ;Test to see if printable ($20-$7E or $80-$FF) MOS02 0193 C583 v5F MOS02 0198 C585 ;Returns c=1 iff printable, c=0 otherwise MOS02 0193 C583 v5F MOS02 0199 C585 MOS02 0193 C583 v5F MOS02 0200 C585 MOS02 0193 C583 v5F MOS02 0201 C585 ;ANOMQ Returns z=0 iff cursors joined MOS02 0193 C583 v5F MOS02 0202 C585 MOS02 0193 C583 v5F MOS02 0203 C585 A5 D0 ANOMQ LDA STATS MOS02 0193 C583 v5F MOS02 0204 C587 29 20 ANDIM &20 ;Is b5 set ? (Answer to z) MOS02 0193 C583 v5F MOS02 0205 C589 VDURTS MOS02 0193 C583 v5F MOS02 0206 C589 60 RTS ;Returns(A)=0 if b5 clear MOS02 0193 C583 v5F MOS02 0207 C58A MOS02 0193 C583 v5F MOS02 0208 C58A ;INDIVIDUAL ROUTINES MOS02 0193 C583 v5F MOS02 0209 C58A MOS02 0193 C583 v5F MOS02 0210 C58A ;NUL ($00) - do nothing MOS02 0193 C583 v5F MOS02 0211 C58A MOS02 0193 C583 v5F MOS02 0212 C58A ;Jump table points to ACK, an RTS, to save a byte MOS02 0193 C583 v5F MOS02 0213 C58A MOS02 0193 C583 v5F MOS02 0214 C58A ;SOH ($01) - Next char to printer MOS02 0193 C583 v5F MOS02 0215 C58A MOS02 0193 C583 v5F MOS02 0216 C58A ;This is taken care of above MOS02 0193 C583 v5F MOS02 0217 C58A MOS02 0193 C583 v5F MOS02 0218 C58A MOS02 0193 C583 v5F MOS02 0219 C58A ;SO ($0E) - Page mode on MOS02 0193 C583 v5F MOS02 0220 C58A MOS02 0193 C583 v5F MOS02 0221 C58A A0 00 SO LDYIM &00 ;Initialise LINES MOS02 0193 C583 v5F MOS02 0222 C58C 8C 69 02 STY LINES MOS02 0193 C583 v5F MOS02 0223 C58F A9 04 LDAIM &04 ;Set b2 of STATS MOS02 0193 C583 v5F MOS02 0224 C591 D0 07 BNE STTOR MOS02 0193 C583 v5F MOS02 0225 C593 MOS02 0193 C583 v5F MOS02 0226 C593 ;SI ($0F) - Page mode OFF MOS02 0193 C583 v5F MOS02 0227 C593 ; This is frigged below MOS02 0193 C583 v5F MOS02 0228 C593 MOS02 0193 C583 v5F MOS02 0229 C593 ;STX ($02) - Start printer MOS02 0193 C583 v5F MOS02 0230 C593 MOS02 0193 C583 v5F MOS02 0231 C593 20 FF E2 STX JSR mUPT ;inform network (A assumed to contain $02) MOS02 0193 C583 v5F MOS02 0232 C596 A9 94 LDAIM &94 ;Set bit 0 of STATS. This maps to $01 MOS02 0193 C583 v5F MOS02 0233 C598 MOS02 0193 C583 v5F MOS02 0234 C598 ;NAK ($15) - Turn VDU off MOS02 0193 C583 v5F MOS02 0235 C598 MOS02 0193 C583 v5F MOS02 0236 C598 49 95 NAK EORIM &95 ;Set b7 of STATS. Map $15 to $80 MOS02 0193 C583 v5F MOS02 0237 C59A MOS02 0193 C583 v5F MOS02 0238 C59A 05 D0 STTOR ORA STATS MOS02 0303 C5F7 ^21 MOS02 0239 C59C D0 09 BNE STTEXT ;(branch always taken unless ORed with 0) MOS02 0303 C5F7 ^21 MOS02 0240 C59E MOS02 0303 C5F7 ^21 MOS02 0241 C59E MOS02 0303 C5F7 ^21 MOS02 0242 C59E ;ETX ($03) - Stop printer MOS02 0303 C5F7 ^21 MOS02 0243 C59E MOS02 0303 C5F7 ^21 MOS02 0244 C59E 20 FF E2 ETX JSR mUPT ;inform network (A assumed to contain $03) MOS02 0303 C5F7 ^21 MOS02 0245 C5A1 A9 0A LDAIM &0A ;clear bit 0 of STATS. Maps $0A on to $FE MOS02 0303 C5F7 ^21 MOS02 0246 C5A3 MOS02 0303 C5F7 ^21 MOS02 0247 C5A3 49 F4 SI EORIM &F4 ;Clears b2 of STATS. Maps $0F on to $FB MOS02 0303 C5F7 ^21 MOS02 0248 C5A5 MOS02 0303 C5F7 ^21 MOS02 0249 C5A5 25 D0 STTAND AND STATS MOS02 0303 C5F7 ^21 MOS02 0250 C5A7 85 D0 STTEXT STA STATS MOS02 0303 C5F7 ^21 MOS02 0251 C5A9 60 EOTEXT RTS MOS02 0303 C5F7 ^21 MOS02 0252 C5AA MOS02 0303 C5F7 ^21 MOS02 0253 C5AA MOS02 0303 C5F7 ^21 MOS02 0254 C5AA ;EOT ($04) - Separate cursors MOS02 0303 C5F7 ^21 MOS02 0255 C5AA MOS02 0303 C5F7 ^21 MOS02 0256 C5AA AD 61 03 EOT LDA NPIX ;Is this a graphics mode ? MOS02 0303 C5F7 ^21 MOS02 0257 C5AD F0 FA BEQ EOTEXT ;NO, then return MOS02 0303 C5F7 ^21 MOS02 0258 C5AF 20 5D C9 JSR ETCA ;Redisplay old cursor MOS02 0303 C5F7 ^21 MOS02 0259 C5B2 A9 DF LDAIM &DF ;Clear b5 of STATS MOS02 0303 C5F7 ^21 MOS02 0260 C5B4 D0 EF BNE STTAND ;(branch always taken) MOS02 0303 C5F7 ^21 MOS02 0261 C5B6 MOS02 0303 C5F7 ^21 MOS02 0262 C5B6 ;ENQ ($05) - Join cursors MOS02 0303 C5F7 ^21 MOS02 0263 C5B6 ;Store & hide current cursor MOS02 0303 C5F7 ^21 MOS02 0264 C5B6 ;Set bit 5 of STATS MOS02 0303 C5F7 ^21 MOS02 0265 C5B6 MOS02 0303 C5F7 ^21 MOS02 0266 C5B6 AD 61 03 ENQ LDA NPIX ;Is this a graphics mode ? MOS02 0303 C5F7 ^21 MOS02 0267 C5B9 F0 EE BEQ EOTEXT ;NO, then return MOS02 0303 C5F7 ^21 MOS02 0268 C5BB ;Access R10 OF 6845. NB cannot do this through CRTCP. MOS02 0303 C5F7 ^21 MOS02 0269 C5BB A9 20 LDAIM &20 ;Hide cursor MOS02 0303 C5F7 ^21 MOS02 0270 C5BD 20 60 C9 JSR ETCB ; Preserves flags MOS02 0303 C5F7 ^21 MOS02 0271 C5C0 D0 D8 BNE STTOR ;Set bit 5 of STATS, (A) preserved by ETCB MOS02 0303 C5F7 ^21 MOS02 0272 C5C2 MOS02 0303 C5F7 ^21 MOS02 0273 C5C2 [ MOS125 = &FF MOS02 0303 C5F7 ^21 MOS02 0274 C5C2 | MOS02 0303 C5F7 ^21 MOS02 0275 C5C2 ;VDUB for cursor control keys MOS02 0303 C5F7 ^21 MOS02 0276 C5C2 ;Now entered with character in Y MOS02 0303 C5F7 ^21 MOS02 0277 C5C2 MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 12 MOS02 VDU File - MOS02 MOS02 MOS02 0303 C5F7 ^21 MOS02 0278 C5C2 VDUB MOS02 0303 C5F7 ^21 MOS02 0279 C5C2 AD 6A 02 LDA QPOSN ;Qing bytes ? MOS02 0303 C5F7 ^21 MOS02 0280 C5C5 D0 E2 BNE EOTEXT ;Yes?, then ignore this MOS02 0303 C5F7 ^21 MOS02 0281 C5C7 A9 A0 LDAIM &A0 ;To see if the cursors are joined or drivers disabled when BIT is done MOS02 0303 C5F7 ^21 MOS02 0282 C5C9 24 D0 BIT STATS ;Are the drivers enabled ? MOS02 0303 C5F7 ^21 MOS02 0283 C5CB D0 DC BNE EOTEXT ;Leave if not, or cursors joined MOS02 0303 C5F7 ^21 MOS02 0284 C5CD 98 TYA ;save character MOS02 0303 C5F7 ^21 MOS02 0285 C5CE 48 PHA MOS02 0303 C5F7 ^21 MOS02 0286 C5CF 70 19 BVS VDUBA ;Are we in cursor edit mode ? Yes?, then skip MOS02 0303 C5F7 ^21 MOS02 0287 C5D1 AD 5F 03 LDA CSTEMP ;Flash the cursor at twice the rate MOS02 0303 C5F7 ^21 MOS02 0288 C5D4 29 9F ANDIM &9F ;Sets b5=0, b6=1 of r10 of 6845, giving fast flashing cursor MOS02 0303 C5F7 ^21 MOS02 0289 C5D6 09 40 ORAIM &40 MOS02 0303 C5F7 ^21 MOS02 0290 C5D8 20 60 C9 JSR ETCB ;Store in r10 of 6845, don't save to CSTEMP MOS02 0303 C5F7 ^21 MOS02 0291 C5DB A2 18 LDXIM CSX-V ;Set b1 of STATS or store CSX to PCSX MOS02 0303 C5F7 ^21 MOS02 0292 C5DD A0 64 LDYIM PCSX-V MOS02 0303 C5F7 ^21 MOS02 0293 C5DF 20 74 D4 JSR COPY2 MOS02 0303 C5F7 ^21 MOS02 0294 C5E2 20 8B CD JSR OCSRWR ;Print the output cursor MOS02 0303 C5F7 ^21 MOS02 0295 C5E5 A9 02 LDAIM &02 ;Set b1 of STATS MOS02 0303 C5F7 ^21 MOS02 0296 C5E7 20 9A C5 JSR STTOR MOS02 0303 C5F7 ^21 MOS02 0297 C5EA A9 BF VDUBA LDAIM &BF ;Clear b6 of STATS MOS02 0303 C5F7 ^21 MOS02 0298 C5EC 20 A5 C5 JSR STTAND MOS02 0303 C5F7 ^21 MOS02 0299 C5EF 68 PLA ;Restore input character to routine MOS02 0303 C5F7 ^21 MOS02 0300 C5F0 29 7F ANDIM &7F ;Kill the parity bit MOS02 0303 C5F7 ^21 MOS02 0301 C5F2 20 C0 C4 JSR VDU ;Execute cursor movement on input cursor MOS02 0303 C5F7 ^21 MOS02 0302 C5F5 A9 40 LDAIM &40 ;Set b6 of STATS MOS02 0303 C5F7 ^21 MOS02 0303 C5F7 D0 A1 BNE STTOR -- MOS02 0304 C5F9 ] -- MOS02 0305 C5F9 -- MOS02 0306 C5F9 ;ACK ($06) - Turn VDU drivers on again -- MOS02 0307 C5F9 ;Clear bit 7 of STATS -- MOS02 0308 C5F9 -- MOS02 0309 C5F9 ;Taken care of above -- MOS02 0310 C5F9 -- MOS02 0311 C5F9 ;BELL ($07) - Ring BELL -- MOS02 0312 C5F9 -- MOS02 0313 C5F9 ;The routine BELL is externally declared in file UADE90 -- MOS02 0314 C5F9 -- MOS02 0315 C5F9 ;Cursor primitives -- MOS02 0316 C5F9 -- MOS02 0317 C5F9 ;BS ($08) - Cursor left 1 character position -- MOS02 0318 C5F9 -- MOS02 0319 C5F9 20 85 C5 BS JSR ANOMQ -- MOS02 0320 C5FC D0 55 BNE CSAL MOS02 0320 C5FC v2A MOS02 0321 C5FE MOS02 0320 C5FC v2A MOS02 0322 C5FE ;Cursor left MOS02 0320 C5FC v2A MOS02 0323 C5FE MOS02 0320 C5FC v2A MOS02 0324 C5FE CE 18 03 CSL DEC CSX MOS02 0320 C5FC v2A MOS02 0325 C601 AE 18 03 LDX CSX ;Over LH margin ? MOS02 0320 C5FC v2A MOS02 0326 C604 EC 08 03 CPX TWLCOL MOS02 0320 C5FC v2A MOS02 0327 C607 30 19 BMI CSLC ;Yes, then up (see below) a line MOS02 0320 C5FC v2A MOS02 0328 C609 AD 4A 03 LDA CSPOSN ;Move cursor left MOS02 0320 C5FC v2A MOS02 0329 C60C 38 SEC MOS02 0320 C5FC v2A MOS02 0330 C60D ED 4F 03 SBC BYTCH MOS02 0320 C5FC v2A MOS02 0331 C610 AA TAX MOS02 0320 C5FC v2A MOS02 0332 C611 AD 4B 03 LDA CSPOSN +&01 MOS02 0320 C5FC v2A MOS02 0333 C614 E9 00 SBCIM &00 MOS02 0320 C5FC v2A MOS02 0334 C616 CD 4E 03 CMP BEGSCN ;Wraparound ? MOS02 0320 C5FC v2A MOS02 0335 C619 B0 03 BCS CSLA MOS02 0320 C5FC v2A MOS02 0336 C61B 6D 54 03 ADC BYTSCN ;Yes, then add screen MOS02 0320 C5FC v2A MOS02 0337 C61E A8 CSLA TAY MOS02 0320 C5FC v2A MOS02 0338 C61F 4C 07 CA JMP CSDSPA MOS02 0320 C5FC v2A MOS02 0339 C622 MOS02 0320 C5FC v2A MOS02 0340 C622 AD 0A 03 CSLC LDA TWRCOL ;Put csr = RH edge MOS02 0320 C5FC v2A MOS02 0341 C625 8D 18 03 STA CSX ;& fall through to ... MOS02 0320 C5FC v2A MOS02 0342 C628 MOS02 0320 C5FC v2A MOS02 0343 C628 ;Cursor up MOS02 0320 C5FC v2A MOS02 0344 C628 MOS02 0320 C5FC v2A MOS02 0345 C628 CE 69 02 CSU DEC LINES ;One more line to print before page mode occurs MOS02 0403 C692 ^14 MOS02 0346 C62B 10 03 BPL CSUC MOS02 0403 C692 ^14 MOS02 0347 C62D EE 69 02 INC LINES ;At top of page, so don't go -ve! MOS02 0403 C692 ^14 MOS02 0348 C630 AE 19 03 CSUC LDX CSY ;Cursor on top row ? MOS02 0403 C692 ^14 MOS02 0349 C633 EC 0B 03 CPX TWTROW MOS02 0403 C692 ^14 MOS02 0350 C636 F0 06 BEQ CSUA ;Yes, then scroll MOS02 0403 C692 ^14 MOS02 0351 C638 CE 19 03 DEC CSY MOS02 0403 C692 ^14 MOS02 0352 C63B 4C ED C6 JMP CSDA MOS02 0403 C692 ^14 MOS02 0353 C63E MOS02 0403 C692 ^14 MOS02 0354 C63E 18 CSUA CLC MOS02 0403 C692 ^14 MOS02 0355 C63F 20 52 CD JSR ENSCRL ;Account for scroll disable MOS02 0403 C692 ^14 MOS02 0356 C642 A9 08 LDAIM &08 ;Test hard/soft flag MOS02 0403 C692 ^14 MOS02 0357 C644 24 D0 BIT STATS MOS02 0403 C692 ^14 MOS02 0358 C646 D0 05 BNE CSUB ;S3 set, soft scroll MOS02 0403 C692 ^14 MOS02 0359 C648 20 A0 C9 JSR HSCRDN ;S3 clear, hard scroll MOS02 0403 C692 ^14 MOS02 0360 C64B D0 03 BNE CSUD ; HSCRDN returns zero false MOS02 0403 C692 ^14 MOS02 0361 C64D 20 C1 CD CSUB JSR SSCRDN MOS02 0403 C692 ^14 MOS02 0362 C650 4C EA C6 CSUD JMP CSDC MOS02 0403 C692 ^14 MOS02 0363 C653 A2 00 CSAL LDXIM &00 MOS02 0403 C692 ^14 MOS02 0364 C655 ; And fall through to MOS02 0403 C692 ^14 MOS02 0365 C655 MOS02 0403 C692 ^14 MOS02 0366 C655 ;Move graphics cursor 1 character - primitives. MOS02 0403 C692 ^14 MOS02 0367 C655 ;(X) = 0 if X cursor to be moved MOS02 0403 C692 ^14 MOS02 0368 C655 ; 2 if Y cursor to be moved MOS02 0403 C692 ^14 MOS02 0369 C655 ;Iff (X)=0, then if off window, LF/VT occurs MOS02 0403 C692 ^14 MOS02 0370 C655 ;If cursor crosses margin, then goes to opposite margin. MOS02 0403 C692 ^14 MOS02 0371 C655 ;Go down 1 character location MOS02 0403 C692 ^14 MOS02 0372 C655 MOS02 0403 C692 ^14 MOS02 0373 C655 86 DB GCSCHD STX ZTEMP +&01 ;Store offset MOS02 0433 C6C0 ^13 MOS02 0374 C657 20 41 D1 JSR WINDCS ;Window current cursor (result to ZTEMP) MOS02 0433 C6C0 ^13 MOS02 0375 C65A A6 DB LDX ZTEMP +&01 ;Subtract 8 from cursor MOS02 0433 C6C0 ^13 MOS02 0376 C65C 38 SEC MOS02 0433 C6C0 ^13 MOS02 0377 C65D BD 24 03 LDAAX GCSIR MOS02 0433 C6C0 ^13 MOS02 0378 C660 E9 08 SBCIM &08 MOS02 0433 C6C0 ^13 MOS02 0379 C662 9D 24 03 STAAX GCSIR MOS02 0433 C6C0 ^13 MOS02 0380 C665 B0 03 BCS GCSHDA MOS02 0433 C6C0 ^13 MOS02 0381 C667 DE 25 03 DECAX GCSIR+&01 MOS02 0433 C6C0 ^13 MOS02 0382 C66A A5 DA GCSHDA LDA ZTEMP ;Get window MOS02 0433 C6C0 ^13 MOS02 0383 C66C D0 1E BNE GCSHDB ;Out of window to begin with?, then skip MOS02 0433 C6C0 ^13 MOS02 0384 C66E 20 41 D1 JSR WINDCS ;Window current point MOS02 0433 C6C0 ^13 MOS02 0385 C671 F0 19 BEQ GCSHDB ;Still inside? , then return MOS02 0433 C6C0 ^13 MOS02 0386 C673 A6 DB LDX ZTEMP +&01 ;Gone outside?, then go to high margin MOS02 0433 C6C0 ^13 MOS02 0387 C675 BD 04 03 LDAAX GWRCOL MOS02 0433 C6C0 ^13 MOS02 0388 C678 E0 01 CPXIM &01 ;Plot by X?, then back up 1 character MOS02 0433 C6C0 ^13 MOS02 0389 C67A B0 02 BCS GCSHDC MOS02 0433 C6C0 ^13 MOS02 0390 C67C E9 06 SBCIM &06 ;c=0. so subt. 7 to get char. just on screen MOS02 0433 C6C0 ^13 MOS02 0391 C67E 9D 24 03 GCSHDC STAAX GCSIR MOS02 0433 C6C0 ^13 MOS02 0392 C681 BD 05 03 LDAAX GWRCOL+&01 MOS02 0433 C6C0 ^13 MOS02 0393 C684 E9 00 SBCIM &00 MOS02 0433 C6C0 ^13 MOS02 0394 C686 9D 25 03 STAAX GCSIR+&01 MOS02 0433 C6C0 ^13 MOS02 0395 C689 8A TXA ;Plot by X?, then go up a line as well MOS02 0433 C6C0 ^13 MOS02 0396 C68A F0 08 BEQ CSAU MOS02 0433 C6C0 ^13 MOS02 0397 C68C 4C B5 CA GCSHDB JMP IEG MOS02 0433 C6C0 ^13 MOS02 0398 C68F MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 13 MOS02 VDU File - MOS02 MOS02 MOS02 0433 C6C0 ^13 MOS02 0399 C68F MOS02 0433 C6C0 ^13 MOS02 0400 C68F ;VT ($0B) - Cursor up 1 character line MOS02 0433 C6C0 ^13 MOS02 0401 C68F MOS02 0433 C6C0 ^13 MOS02 0402 C68F 20 85 C5 VT JSR ANOMQ MOS02 0433 C6C0 ^13 MOS02 0403 C692 F0 94 BEQ CSU MOS02 0433 C6C0 ^13 MOS02 0404 C694 A2 02 CSAU LDXIM &02 MOS02 0433 C6C0 ^13 MOS02 0405 C696 D0 5C BNE GCSCHU ;(branch always taken) MOS02 0433 C6C0 ^13 MOS02 0406 C698 MOS02 0433 C6C0 ^13 MOS02 0407 C698 ;HT ($09) - Cursor right 1 character position MOS02 0433 C6C0 ^13 MOS02 0408 C698 MOS02 0433 C6C0 ^13 MOS02 0409 C698 A5 D0 HT LDA STATS ;Encode ANOMQ because this routine often referenced MOS02 0433 C6C0 ^13 MOS02 0410 C69A 29 20 ANDIM &20 MOS02 0433 C6C0 ^13 MOS02 0411 C69C D0 54 BNE CSAR MOS02 0433 C6C0 ^13 MOS02 0412 C69E MOS02 0433 C6C0 ^13 MOS02 0413 C69E ;Cursor right MOS02 0433 C6C0 ^13 MOS02 0414 C69E MOS02 0433 C6C0 ^13 MOS02 0415 C69E AE 18 03 CSR LDX CSX ;Cursor over RH col ? MOS02 0433 C6C0 ^13 MOS02 0416 C6A1 EC 0A 03 CPX TWRCOL MOS02 0433 C6C0 ^13 MOS02 0417 C6A4 B0 1C BCS CSRC MOS02 0433 C6C0 ^13 MOS02 0418 C6A6 EE 18 03 INC CSX MOS02 0433 C6C0 ^13 MOS02 0419 C6A9 AD 4A 03 LDA CSPOSN MOS02 0433 C6C0 ^13 MOS02 0420 C6AC 6D 4F 03 ADC BYTCH ;Add no. bytes per char MOS02 0433 C6C0 ^13 MOS02 0421 C6AF AA TAX MOS02 0433 C6C0 ^13 MOS02 0422 C6B0 AD 4B 03 LDA CSPOSN +&01 ;to posn. of csr. MOS02 0433 C6C0 ^13 MOS02 0423 C6B3 69 00 ADCIM &00 ;sets n for test in CSDSPA MOS02 0433 C6C0 ^13 MOS02 0424 C6B5 4C 07 CA JMP CSDSPA MOS02 0433 C6C0 ^13 MOS02 0425 C6B8 [ MOS125 = &FF MOS02 0433 C6C0 ^13 MOS02 0426 C6B8 | MOS02 0433 C6C0 ^13 MOS02 0427 C6B8 ;LF ($0A) - Cursor down 1 character line MOS02 0433 C6C0 ^13 MOS02 0428 C6B8 MOS02 0433 C6C0 ^13 MOS02 0429 C6B8 A5 D0 LF LDA STATS ;Encode ANOMQ because this routine often referenced MOS02 0433 C6C0 ^13 MOS02 0430 C6BA 29 20 ANDIM &20 MOS02 0433 C6C0 ^13 MOS02 0431 C6BC F0 0A BEQ CSD MOS02 0433 C6C0 ^13 MOS02 0432 C6BE A2 02 CSAD LDXIM &02 MOS02 0433 C6C0 ^13 MOS02 0433 C6C0 D0 93 BNE GCSCHD MOS02 0496 C729 ^13 MOS02 0434 C6C2 ] MOS02 0496 C729 ^13 MOS02 0435 C6C2 AD 08 03 CSRC LDA TWLCOL ;Put csr = LH edge MOS02 0496 C729 ^13 MOS02 0436 C6C5 8D 18 03 STA CSX ;& fall through to ... MOS02 0496 C729 ^13 MOS02 0437 C6C8 MOS02 0496 C729 ^13 MOS02 0438 C6C8 ;Cursor down MOS02 0496 C729 ^13 MOS02 0439 C6C8 MOS02 0496 C729 ^13 MOS02 0440 C6C8 18 CSD CLC ;do not set LEDs on first test for page wait (MOS requirement) MOS02 0496 C729 ^13 MOS02 0441 C6C9 20 F7 CA JSR PAGE ;Account for page mode MOS02 0496 C729 ^13 MOS02 0442 C6CC AE 19 03 LDX CSY ;Is cursor off bottom? MOS02 0496 C729 ^13 MOS02 0443 C6CF EC 09 03 CPX TWBROW MOS02 0496 C729 ^13 MOS02 0444 C6D2 B0 05 BCS CSDD ;Yes, then scroll MOS02 0496 C729 ^13 MOS02 0445 C6D4 EE 19 03 INC CSY ;No, then move down line MOS02 0496 C729 ^13 MOS02 0446 C6D7 90 14 BCC CSDA ;(branch always taken) MOS02 0496 C729 ^13 MOS02 0447 C6D9 MOS02 0496 C729 ^13 MOS02 0448 C6D9 20 52 CD CSDD JSR ENSCRL ;Account for scroll disable MOS02 0496 C729 ^13 MOS02 0449 C6DC A9 08 LDAIM &08 ;Test hard/soft flag MOS02 0496 C729 ^13 MOS02 0450 C6DE 24 D0 BIT STATS MOS02 0496 C729 ^13 MOS02 0451 C6E0 D0 05 BNE CSDB MOS02 0496 C729 ^13 MOS02 0452 C6E2 20 B0 C9 JSR HSCRUP ;No windows set, so use hard scroll MOS02 0496 C729 ^13 MOS02 0453 C6E5 D0 03 BNE CSDC ; HSCRUP unsets zero MOS02 0496 C729 ^13 MOS02 0454 C6E7 20 1B CE CSDB JSR SSCRUP ;Windows set, so use soft scroll MOS02 0496 C729 ^13 MOS02 0455 C6EA 20 C7 CE CSDC JSR CLTLIN ;Clear the line on which CSY lies MOS02 0496 C729 ^13 MOS02 0456 C6ED 20 24 CF CSDA JSR TADDRY ;address the cursor, point guaranteed in window MOS02 0496 C729 ^13 MOS02 0457 C6F0 90 74 BCC FSD ;and display it (TADDRY returns carry clear) MOS02 0457 C6F0 v0B MOS02 0458 C6F2 A2 00 CSAR LDXIM &00 MOS02 0457 C6F0 v0B MOS02 0459 C6F4 ; And fall through to MOS02 0457 C6F0 v0B MOS02 0460 C6F4 MOS02 0457 C6F0 v0B MOS02 0461 C6F4 ;Move graphics cursor 1 character - primitives. MOS02 0457 C6F0 v0B MOS02 0462 C6F4 ;(X) = 0 if Y cursor to be moved MOS02 0457 C6F0 v0B MOS02 0463 C6F4 ; 2 if X cursor to be moved MOS02 0457 C6F0 v0B MOS02 0464 C6F4 ;Iff (X)=0, then if off window, LF/VT occurs MOS02 0457 C6F0 v0B MOS02 0465 C6F4 ;If cursor crosses margin, then goes to opposite margin. MOS02 0457 C6F0 v0B MOS02 0466 C6F4 MOS02 0457 C6F0 v0B MOS02 0467 C6F4 86 DB GCSCHU STX ZTEMP +&01 ;Store offset MOS02 0457 C6F0 v0B MOS02 0468 C6F6 20 41 D1 JSR WINDCS ;Window current cursor (result to ZTEMP) MOS02 0457 C6F0 v0B MOS02 0469 C6F9 A6 DB LDX ZTEMP +&01 ;Add 8 to cursor MOS02 0457 C6F0 v0B MOS02 0470 C6FB 18 CLC MOS02 0457 C6F0 v0B MOS02 0471 C6FC BD 24 03 LDAAX GCSIR MOS02 0457 C6F0 v0B MOS02 0472 C6FF 69 08 ADCIM &08 MOS02 0457 C6F0 v0B MOS02 0473 C701 9D 24 03 STAAX GCSIR MOS02 0457 C6F0 v0B MOS02 0474 C704 90 03 BCC GCSHUA MOS02 0457 C6F0 v0B MOS02 0475 C706 FE 25 03 INCAX GCSIR+&01 MOS02 0457 C6F0 v0B MOS02 0476 C709 A5 DA GCSHUA LDA ZTEMP ;Get window MOS02 0457 C6F0 v0B MOS02 0477 C70B [ MOS125 = &FF MOS02 0457 C6F0 v0B MOS02 0481 C70B | MOS02 0457 C6F0 v0B MOS02 0482 C70B D0 1E BNE GCSHUB ;Out of window to begin with?, then skip MOS02 0457 C6F0 v0B MOS02 0483 C70D 20 41 D1 JSR WINDCS ;Window current point MOS02 0457 C6F0 v0B MOS02 0484 C710 F0 19 BEQ GCSHUB ;Still inside? , then return MOS02 0457 C6F0 v0B MOS02 0485 C712 ] MOS02 0457 C6F0 v0B MOS02 0486 C712 A6 DB LDX ZTEMP +&01 ;Gone outside?, then go to low margin MOS02 0457 C6F0 v0B MOS02 0487 C714 BD 00 03 LDAAX GWLCOL MOS02 0457 C6F0 v0B MOS02 0488 C717 E0 01 CPXIM &01 ;Plot by Y?, then go up a line MOS02 0457 C6F0 v0B MOS02 0489 C719 90 02 BCC GCSHUC MOS02 0457 C6F0 v0B MOS02 0490 C71B 69 06 ADCIM &06 ;c=1, so add 7 to get char. just on screen MOS02 0457 C6F0 v0B MOS02 0491 C71D 9D 24 03 GCSHUC STAAX GCSIR MOS02 0457 C6F0 v0B MOS02 0492 C720 BD 01 03 LDAAX GWLCOL+&01 MOS02 0457 C6F0 v0B MOS02 0493 C723 69 00 ADCIM &00 MOS02 0457 C6F0 v0B MOS02 0494 C725 9D 25 03 STAAX GCSIR+&01 MOS02 0457 C6F0 v0B MOS02 0495 C728 8A TXA ;Plot by X? MOS02 0457 C6F0 v0B MOS02 0496 C729 F0 93 BEQ CSAD ;Yes?, then go down a line as well MOS02 0457 C6F0 v0B MOS02 0497 C72B [ MOS125 = &FF MOS02 0457 C6F0 v0B MOS02 0498 C72B | MOS02 0457 C6F0 v0B MOS02 0499 C72B GCSHUB MOS02 0457 C6F0 v0B MOS02 0500 C72B ] MOS02 0457 C6F0 v0B MOS02 0501 C72B 4C B5 CA JMP IEG ;No?, then exit MOS02 0457 C6F0 v0B MOS02 0502 C72E MOS02 0457 C6F0 v0B MOS02 0503 C72E MOS02 0457 C6F0 v0B MOS02 0504 C72E [ MOS125 = &FF MOS02 0457 C6F0 v0B MOS02 0511 C72E ] MOS02 0457 C6F0 v0B MOS02 0512 C72E MOS02 0457 C6F0 v0B MOS02 0513 C72E ;FS ($1C) Define text area MOS02 0457 C6F0 v0B MOS02 0514 C72E MOS02 0457 C6F0 v0B MOS02 0515 C72E ;QEND-3 = L.H. margin = TWLCOL MOS02 0457 C6F0 v0B MOS02 0516 C72E ;QEND-2 = Bottom row = TWBROW MOS02 0457 C6F0 v0B MOS02 0517 C72E ;QEND-1 = R.H. margin = TWRCOL MOS02 0457 C6F0 v0B MOS02 0518 C72E ;QEND = Top row = TWTROW MOS02 0457 C6F0 v0B MOS02 0519 C72E MOS02 0457 C6F0 v0B MOS02 0520 C72E [ MOS125 = &FF MOS02 0457 C6F0 v0B MOS02 0536 C72E | MOS02 0457 C6F0 v0B MOS02 0537 C72E AE 55 03 FS LDX MODE MOS02 0457 C6F0 v0B MOS02 0538 C731 AD 21 03 LDA QEND-&02 ;Do y co-ordinates. Get bottom (higher numbered) row MOS02 0457 C6F0 v0B MOS02 0539 C734 CD 23 03 CMP QEND ;Top row above bottom ? MOS02 0457 C6F0 v0B MOS02 0540 C737 90 16 BCC FSF ;No?, then fail MOS02 0457 C6F0 v0B MOS02 0541 C739 DD E7 C3 CMPAX PROWS ;Is > max. no. rows? MOS02 0457 C6F0 v0B MOS02 0542 C73C F0 02 BEQ FSC MOS02 0457 C6F0 v0B MOS02 0543 C73E B0 09 BCS FSE ;Yes, then fail MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 14 MOS02 VDU File - MOS02 MOS02 MOS02 0457 C6F0 v0B MOS02 0544 C740 AD 22 03 FSC LDA QEND-&01 ;Do x co-ordinates. Get RH margin MOS02 0457 C6F0 v0B MOS02 0545 C743 A8 TAY MOS02 0457 C6F0 v0B MOS02 0546 C744 DD EF C3 CMPAX PCOLS ;Is > than max. cols? MOS02 0457 C6F0 v0B MOS02 0547 C747 F0 02 BEQ FSB MOS02 0457 C6F0 v0B MOS02 0548 C749 FSE MOS02 0457 C6F0 v0B MOS02 0549 C749 B0 74 BCS PRACX ;Yes, then fail MOS02 0457 C6F0 v0B MOS02 0550 C74B 38 FSB SEC MOS02 0457 C6F0 v0B MOS02 0551 C74C ED 20 03 SBC QEND-&03 ;How many cols. wide ? MOS02 0457 C6F0 v0B MOS02 0552 C74F FSF MOS02 0457 C6F0 v0B MOS02 0553 C74F 90 6E BCC PRACX ;Fail if -ve no. cols. MOS02 0457 C6F0 v0B MOS02 0554 C751 ] MOS02 0457 C6F0 v0B MOS02 0555 C751 A8 TAY MOS02 0457 C6F0 v0B MOS02 0556 C752 20 95 CA JSR SETPWW ;Set PWWDTH MOS02 0457 C6F0 v0B MOS02 0557 C755 A9 08 LDAIM &08 ;Set bit 3 for soft scrolling MOS02 0457 C6F0 v0B MOS02 0558 C757 20 9A C5 JSR STTOR MOS02 0457 C6F0 v0B MOS02 0559 C75A A2 20 LDXIM QEND-&03-V ;copy Q to TWxxxx MOS02 0457 C6F0 v0B MOS02 0560 C75C A0 08 LDYIM TWLCOL-V MOS02 0457 C6F0 v0B MOS02 0561 C75E 20 7C D4 JSR COPYF MOS02 0457 C6F0 v0B MOS02 0562 C761 20 06 CF JSR TADDR ;Is cursor still inside MOS02 0457 C6F0 v0B MOS02 0563 C764 B0 33 BCS RS ;No, then home cursor MOS02 0457 C6F0 v0B MOS02 0564 C766 4C 13 CA FSD JMP CSDSP MOS02 0675 C7E2 ^02 MOS02 0565 C769 MOS02 0675 C7E2 ^02 MOS02 0566 C769 RPXLXY MOS02 0675 C7E2 ^02 MOS02 0567 C769 A0 03 LDYIM &03 ;~~~ Read pixel at (x,y) ~~~ MOS02 0675 C7E2 ^02 MOS02 0568 C76B B1 F0 PRAAA LDAIY WARGS ;Copy (x,y) to RPXLWS ... MOS02 0675 C7E2 ^02 MOS02 0569 C76D 99 28 03 STAAY RPXLWS MOS02 0675 C7E2 ^02 MOS02 0570 C770 88 DEY MOS02 0675 C7E2 ^02 MOS02 0571 C771 10 F8 BPL PRAAA MOS02 0675 C7E2 ^02 MOS02 0572 C773 A9 28 LDAIM RPXLWS-V ;Convert in internal co-ordinates MOS02 0675 C7E2 ^02 MOS02 0573 C775 20 0B D8 JSR RPXLD ;Read pixel if extant MOS02 0675 C7E2 ^02 MOS02 0574 C778 A0 04 LDYIM &04 ;Store in (XY) +4 MOS02 0675 C7E2 ^02 MOS02 0575 C77A D0 3B BNE PRACB ;(branch always taken) MOS02 0675 C7E2 ^02 MOS02 0576 C77C MOS02 0675 C7E2 ^02 MOS02 0577 C77C [ MOS125 = &FF MOS02 0675 C7E2 ^02 MOS02 0588 C77C ] MOS02 0675 C7E2 ^02 MOS02 0589 C77C MOS02 0675 C7E2 ^02 MOS02 0590 C77C ;FF ($0C) Form feed MOS02 0675 C7E2 ^02 MOS02 0591 C77C MOS02 0675 C7E2 ^02 MOS02 0592 C77C 20 85 C5 FF JSR ANOMQ ;Cursors joined ? MOS02 0675 C7E2 ^02 MOS02 0593 C77F D0 79 BNE FFANOM ;Yes, then clear graphics area MOS02 0675 C7E2 ^02 MOS02 0594 C781 A5 D0 LDA STATS ;Window set ? MOS02 0675 C7E2 ^02 MOS02 0595 C783 29 08 ANDIM &08 ;Test bit 3 of STATS MOS02 0675 C7E2 ^02 MOS02 0596 C785 [ MOS125 = &FF MOS02 0675 C7E2 ^02 MOS02 0599 C785 | MOS02 0675 C7E2 ^02 MOS02 0600 C785 F0 64 BEQ FFC ;Clear?, then fast clear MOS02 0675 C7E2 ^02 MOS02 0601 C787 ] MOS02 0675 C7E2 ^02 MOS02 0602 C787 AE 0B 03 FFA LDX TWTROW ;Initialise cursor to top row MOS02 0675 C7E2 ^02 MOS02 0603 C78A 8E 19 03 FFB STX CSY ;Clear this line MOS02 0675 C7E2 ^02 MOS02 0604 C78D 20 C7 CE JSR CLTLIN MOS02 0675 C7E2 ^02 MOS02 0605 C790 AE 19 03 LDX CSY ;Move down a line MOS02 0675 C7E2 ^02 MOS02 0606 C793 EC 09 03 CPX TWBROW ;On the bottom ? MOS02 0675 C7E2 ^02 MOS02 0607 C796 E8 INX MOS02 0675 C7E2 ^02 MOS02 0608 C797 90 F1 BCC FFB ;(INX preserves c) MOS02 0675 C7E2 ^02 MOS02 0609 C799 MOS02 0675 C7E2 ^02 MOS02 0610 C799 ;& fall through to MOS02 0675 C7E2 ^02 MOS02 0611 C799 MOS02 0675 C7E2 ^02 MOS02 0612 C799 MOS02 0675 C7E2 ^02 MOS02 0613 C799 ;RS ($1E) Home character cursor MOS02 0675 C7E2 ^02 MOS02 0614 C799 MOS02 0675 C7E2 ^02 MOS02 0615 C799 20 85 C5 RS JSR ANOMQ MOS02 0675 C7E2 ^02 MOS02 0616 C79C F0 22 BEQ RSA MOS02 0675 C7E2 ^02 MOS02 0617 C79E [ MOS125 = &FF MOS02 0675 C7E2 ^02 MOS02 0619 C79E | MOS02 0675 C7E2 ^02 MOS02 0620 C79E ;RSAN Anomalous cursor home MOS02 0675 C7E2 ^02 MOS02 0621 C79E MOS02 0675 C7E2 ^02 MOS02 0622 C79E A2 06 RSAN LDXIM GWTROW-V ;Copy GWLCOL to GCSIR MOS02 0675 C7E2 ^02 MOS02 0623 C7A0 A0 26 LDYIM GCSIY-V MOS02 0675 C7E2 ^02 MOS02 0624 C7A2 20 74 D4 JSR COPY2 ;Copy 4 bytes of RAM saves 2 bytes of ROM MOS02 0675 C7E2 ^02 MOS02 0625 C7A5 MOS02 0675 C7E2 ^02 MOS02 0626 C7A5 ;& fall through to ... MOS02 0675 C7E2 ^02 MOS02 0627 C7A5 MOS02 0675 C7E2 ^02 MOS02 0628 C7A5 MOS02 0675 C7E2 ^02 MOS02 0629 C7A5 ;CRAN Anomalous carriage return MOS02 0675 C7E2 ^02 MOS02 0630 C7A5 MOS02 0675 C7E2 ^02 MOS02 0631 C7A5 A2 00 CRAN LDXIM GWLCOL-V ;Copy GWLCOL to GCSIX MOS02 0675 C7E2 ^02 MOS02 0632 C7A7 A0 24 LDYIM GCSIX-V MOS02 0675 C7E2 ^02 MOS02 0633 C7A9 20 74 D4 JSR COPY2 MOS02 0675 C7E2 ^02 MOS02 0634 C7AC 4C B5 CA JMP IEG MOS02 0675 C7E2 ^02 MOS02 0635 C7AF MOS02 0675 C7E2 ^02 MOS02 0636 C7AF RPALET MOS02 0675 C7E2 ^02 MOS02 0637 C7AF 2D 60 03 AND NCOLOR ;Read parrot MOS02 0675 C7E2 ^02 MOS02 0638 C7B2 AA TAX MOS02 0675 C7E2 ^02 MOS02 0639 C7B3 BD 6F 03 LDAAX PARROT MOS02 0675 C7E2 ^02 MOS02 0640 C7B6 C8 PRACA INY MOS02 0675 C7E2 ^02 MOS02 0641 C7B7 91 F0 PRACB STAIY WARGS MOS02 0675 C7E2 ^02 MOS02 0642 C7B9 A9 00 LDAIM &00 MOS02 0675 C7E2 ^02 MOS02 0643 C7BB C0 04 CPYIM &04 MOS02 0675 C7E2 ^02 MOS02 0644 C7BD D0 F7 BNE PRACA MOS02 0675 C7E2 ^02 MOS02 0645 C7BF 60 PRACX RTS MOS02 0675 C7E2 ^02 MOS02 0646 C7C0 ] MOS02 0675 C7E2 ^02 MOS02 0647 C7C0 MOS02 0675 C7E2 ^02 MOS02 0648 C7C0 8D 23 03 RSA STA QEND MOS02 0675 C7E2 ^02 MOS02 0649 C7C3 8D 22 03 STA QEND-&01 MOS02 0675 C7E2 ^02 MOS02 0650 C7C6 MOS02 0675 C7E2 ^02 MOS02 0651 C7C6 ;& fall through to .... MOS02 0675 C7E2 ^02 MOS02 0652 C7C6 MOS02 0675 C7E2 ^02 MOS02 0653 C7C6 ;US ($1F) Move text csr to x,y MOS02 0675 C7E2 ^02 MOS02 0654 C7C6 MOS02 0675 C7E2 ^02 MOS02 0655 C7C6 ;Put cursor to (x,y), where MOS02 0675 C7E2 ^02 MOS02 0656 C7C6 ;x in QEND-1 & y in QEND MOS02 0675 C7E2 ^02 MOS02 0657 C7C6 ;If illegal, leave cursor alone MOS02 0675 C7E2 ^02 MOS02 0658 C7C6 MOS02 0675 C7E2 ^02 MOS02 0659 C7C6 20 85 C5 US JSR ANOMQ ;Cursors joined ? MOS02 0675 C7E2 ^02 MOS02 0660 C7C9 D0 F4 BNE PRACX ;Yes, then skip MOS02 0675 C7E2 ^02 MOS02 0661 C7CB 20 E4 C7 JSR USAF ;Remember current cursor MOS02 0675 C7E2 ^02 MOS02 0662 C7CE 18 CLC MOS02 0675 C7E2 ^02 MOS02 0663 C7CF AD 22 03 LDA QEND-&01 ;Add offset to x posn MOS02 0675 C7E2 ^02 MOS02 0664 C7D2 6D 08 03 ADC TWLCOL MOS02 0675 C7E2 ^02 MOS02 0665 C7D5 8D 18 03 STA CSX MOS02 0675 C7E2 ^02 MOS02 0666 C7D8 AD 23 03 LDA QEND ;Add offset to y posn MOS02 0675 C7E2 ^02 MOS02 0667 C7DB 18 CLC MOS02 0675 C7E2 ^02 MOS02 0668 C7DC 6D 0B 03 ADC TWTROW MOS02 0675 C7E2 ^02 MOS02 0669 C7DF [ MOS125 = &FF MOS02 0675 C7E2 ^02 MOS02 0672 C7DF | MOS02 0675 C7E2 ^02 MOS02 0673 C7DF 20 03 CF JSR SYTADD ;Attempt to posn. csr MOS02 0675 C7E2 ^02 MOS02 0674 C7E2 ] MOS02 0675 C7E2 ^02 MOS02 0675 C7E2 90 82 BCC FSD ;to a JMP CSDSP MOS02 0593 C77F v06 MOS02 0676 C7E4 MOS02 0593 C77F v06 MOS02 0677 C7E4 A2 18 USAF LDXIM CSX-V MOS02 0593 C77F v06 MOS02 0678 C7E6 A0 28 LDYIM USWS-V MOS02 0593 C77F v06 MOS02 0679 C7E8 4C FA CD JMP SWAP2 MOS02 MOS02 MOS02 MOS02 Acorn macro assembler Page 15 MOS02 VDU File - MOS02 MOS02 MOS02 0593 C77F v06 MOS02 0680 C7EB MOS02 0593 C77F v06 MOS02 0681 C7EB [ MOS125 = &FF MOS02 0593 C77F v06 MOS02 0682 C7EB | MOS02 0593 C77F v06 MOS02 0683 C7EB FFC MOS02 0593 C77F v06 MOS02 0684 C7EB 4C D4 CB JMP CLATXT ;Clear?, then fast clear MOS02 0593 C77F v06 MOS02 0685 C7EE ] MOS02 0593 C77F v06 MOS02 0686 C7EE MOS02 0593 C77F v06 MOS02 0687 C7EE ;CR ($0D) Carriage return MOS02 0593 C77F v06 MOS02 0688 C7EE MOS02 0593 C77F v06 MOS02 0689 C7EE [ MOS125 = &FF MOS02 0593 C77F v06 MOS02 0693 C7EE | MOS02 0593 C77F v06 MOS02 0694 C7EE A5 D0 CR LDA STATS ;Encode ANOMQ because this routine often referenced MOS02 0593 C77F v06 MOS02 0695 C7F0 29 20 ANDIM &20 MOS02 0593 C77F v06 MOS02 0696 C7F2 D0 B1 BNE CRAN MOS02 0593 C77F v06 MOS02 0697 C7F4 ] MOS02 0593 C77F v06 MOS02 0698 C7F4 20 89 CE CRA JSR SSCRIM ;Position cursor to LH edge of window MOS02 0593 C77F v06 MOS02 0699 C7F7 4C ED C6 JMP CSDA ;Display cursor & TADDR MOS02 0593 C77F v06 MOS02 0700 C7FA MOS02 0593 C77F v06 MOS02 0701 C7FA LNK MOS03 MOS02 0593 C77F v06 MOS03 0001 C7FA MOS02 0593 C77F v06 MOS03 0002 C7FA TTL VDU File - MOS03 MOS02 0593 C77F v06 MOS03 0003 C7FA OPT MOS03 MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 16 MOS03 VDU File - MOS03 MOS03 MOS02 0593 C77F v06 MOS03 0004 C7FA MOS02 0593 C77F v06 MOS03 0005 C7FA ;Last revision 15/06/82 MOS02 0593 C77F v06 MOS03 0006 C7FA MOS02 0593 C77F v06 MOS03 0007 C7FA ;15/06/82 Route ALL unknown plot commands thru VDUVEC, even in text modes MOS02 0593 C77F v06 MOS03 0008 C7FA ;02/06/82 ETB mod to redef of ASCII MOS02 0593 C77F v06 MOS03 0009 C7FA ;27/05/82 DCC (programme palette) recoded MOS02 0593 C77F v06 MOS03 0010 C7FA ;05/05/82 Delete anomalous TAB MOS02 0593 C77F v06 MOS03 0011 C7FA ; Move NAK to MOS02 MOS02 0593 C77F v06 MOS03 0012 C7FA ;01/05/82 Recoded to allow for forward queueing & change in variable order MOS02 0593 C77F v06 MOS03 0013 C7FA ;24/04/82 ETB Function 1 (hide/display cursor) coded MOS02 0593 C77F v06 MOS03 0014 C7FA ;19/04/82 DCC & DCCB moved for byte saving MOS02 0593 C77F v06 MOS03 0015 C7FA ;15/04/82 NPCOL used to fix VDU 19,0,20,0,0,0 bug MOS02 0593 C77F v06 MOS03 0016 C7FA ;24/03/82 DLE leaves graphics cursor alone MOS02 0593 C77F v06 MOS03 0017 C7FA ; ETB to check if font exploded before reprogramming fonts 1-3 MOS02 0593 C77F v06 MOS03 0018 C7FA ;21/03/82 DLE to account for non-zero origins MOS02 0593 C77F v06 MOS03 0019 C7FA ;22/01/82 EIG to EIGABS in graphics window definition MOS02 0593 C77F v06 MOS03 0020 C7FA ;07/01/82 Catch illegal VDU 23,n,.... commands MOS02 0593 C77F v06 MOS03 0021 C7FA ;15/11/81 Vertical sync user adjustment (Paul) MOS02 0593 C77F v06 MOS03 0022 C7FA MOS02 0593 C77F v06 MOS03 0023 C7FA ;INDIVIDUAL ROUTINES MOS02 0593 C77F v06 MOS03 0024 C7FA MOS02 0593 C77F v06 MOS03 0025 C7FA MOS02 0593 C77F v06 MOS03 0026 C7FA ;DLE ($10) Clear graphics area MOS02 0593 C77F v06 MOS03 0027 C7FA MOS02 0593 C77F v06 MOS03 0028 C7FA 20 9E C7 FFANOM JSR RSAN -- MOS03 0029 C7FD AD 61 03 DLE LDA NPIX ;Non-graphics ? -- MOS03 0030 C800 F0 33 BEQ DLEX MOS03 0030 C800 v4C MOS03 0031 C802 AE 5A 03 LDX BGCOLF ;Clear to the background colour MOS03 0030 C800 v4C MOS03 0032 C805 AC 5C 03 LDY GPLBMD ;Use the background colour mode MOS03 0030 C800 v4C MOS03 0033 C808 20 E7 D0 JSR SETZG ;Set this up MOS03 0030 C800 v4C MOS03 0034 C80B A2 00 LDXIM GWLCOL-V ;Copy window params from GWTROW ... MOS03 0030 C800 v4C MOS03 0035 C80D A0 28 LDYIM DLEWS-V ;Copy window parameters to DLEWS MOS03 0030 C800 v4C MOS03 0036 C80F 20 6E D4 JSR COPY8 MOS03 0030 C800 v4C MOS03 0037 C812 38 SEC ;How many lines to do ? MOS03 0030 C800 v4C MOS03 0038 C813 AD 06 03 LDA GWTROW MOS03 0030 C800 v4C MOS03 0039 C816 ED 02 03 SBC GWBROW MOS03 0030 C800 v4C MOS03 0040 C819 A8 TAY MOS03 0030 C800 v4C MOS03 0041 C81A C8 INY ;Increment this to distinguish between 0 & 255 MOS03 0030 C800 v4C MOS03 0042 C81B 8C 30 03 STY DLENLN ;Line counter MOS03 0030 C800 v4C MOS03 0043 C81E A2 2C DLEA LDXIM DLEWS+&04-V ;Point to R.H. point, containing valid Y address MOS03 0030 C800 v4C MOS03 0044 C820 A0 28 LDYIM DLEWS-V ;Point to L.H. point, with irrelevant Y address MOS03 0030 C800 v4C MOS03 0045 C822 20 7E D6 JSR HPLOTA ;Clear the current line MOS03 0030 C800 v4C MOS03 0046 C825 AD 2E 03 LDA DLEWS+&06 ;Decrement the current line number MOS03 0030 C800 v4C MOS03 0047 C828 D0 03 BNE DLEB MOS03 0030 C800 v4C MOS03 0048 C82A CE 2F 03 DEC DLEWS+&07 MOS03 0030 C800 v4C MOS03 0049 C82D CE 2E 03 DLEB DEC DLEWS+&06 MOS03 0030 C800 v4C MOS03 0050 C830 CE 30 03 DEC DLENLN MOS03 0030 C800 v4C MOS03 0051 C833 D0 E9 BNE DLEA MOS03 0030 C800 v4C MOS03 0052 C835 60 DLEX RTS -- MOS03 0053 C836 -- MOS03 0054 C836 ;DC1 ($11) Programme foreground -- MOS03 0055 C836 ;or background colours for text -- MOS03 0056 C836 -- MOS03 0057 C836 A0 00 DCA LDYIM &00 ;Used for storing -- MOS03 0058 C838 F0 02 BEQ DCABA ;(branch always taken) MOS03 0058 C838 v7D MOS03 0059 C83A MOS03 0058 C838 v7D MOS03 0060 C83A ;DC2 ($12) Programme foreground MOS03 0058 C838 v7D MOS03 0061 C83A ;or background colours for graphics MOS03 0058 C838 v7D MOS03 0062 C83A ;QEND-1=mode MOS03 0058 C838 v7D MOS03 0063 C83A ;QEND =logical colour MOS03 0058 C838 v7D MOS03 0064 C83A MOS03 0058 C838 v7D MOS03 0065 C83A A0 02 DCB LDYIM &02 MOS03 0058 C838 v7D MOS03 0066 C83C AD 23 03 DCABA LDA QEND ;Get logical colour -- MOS03 0067 C83F 10 01 BPL DCABB ;Foreground ? MOS03 0067 C83F v7E MOS03 0068 C841 C8 INY ;No, then point to background locations MOS03 0067 C83F v7E MOS03 0069 C842 2D 60 03 DCABB AND NCOLOR -- MOS03 0070 C845 85 DA STA ZTEMP -- MOS03 0071 C847 AD 60 03 LDA NCOLOR ;Sneaky offset method -- MOS03 0072 C84A F0 1B BEQ DCABX ;Branch for TTX MOS03 0072 C84A v64 MOS03 0073 C84C 29 07 ANDIM &07 ;to FCOLTB. A=table base MOS03 0072 C84A v64 MOS03 0074 C84E 18 CLC MOS03 0072 C84A v64 MOS03 0075 C84F 65 DA ADC ZTEMP ;(A) = offset +1 MOS03 0072 C84A v64 MOS03 0076 C851 AA TAX MOS03 0072 C84A v64 MOS03 0077 C852 BD 23 C4 LDAAX FCOLTB -&01 MOS03 0072 C84A v64 MOS03 0078 C855 99 57 03 STAAY FTCOLF ;(Y) set above to 0..3 MOS03 0072 C84A v64 MOS03 0079 C858 [ MOS125 = &FF MOS03 0072 C84A v64 MOS03 0084 C858 | MOS03 0072 C84A v64 MOS03 0085 C858 98 TYA MOS03 0072 C84A v64 MOS03 0086 C859 4A LSRA ;Graphics? MOS03 0072 C84A v64 MOS03 0087 C85A D0 0C BNE DCBAC ;Yes, then set up GPLMDE MOS03 0072 C84A v64 MOS03 0088 C85C 18 CLC ;A=0, C=0; SBC takes one's complement MOS03 0072 C84A v64 MOS03 0089 C85D ED 57 03 SBC FTCOLF ;No, then set ZORA and ZEOR MOS03 0072 C84A v64 MOS03 0090 C860 ] MOS03 0072 C84A v64 MOS03 0091 C860 85 D3 STA ZEOR ;ZEOR = NOT foreground MOS03 0072 C84A v64 MOS03 0092 C862 4D 58 03 EOR BTCOLF ;ZORA = ZEOR EOR back MOS03 0072 C84A v64 MOS03 0093 C865 85 D2 STA ZORA MOS03 0072 C84A v64 MOS03 0094 C867 60 DCABX RTS MOS03 0087 C85A v73 MOS03 0095 C868 AD 22 03 DCBAC LDA QEND-&01 -- MOS03 0096 C86B 99 59 03 STAAY GPLFMD -&02 ;Y=2 or 3 (for fore or background) mode -- MOS03 0097 C86E 60 RTS -- MOS03 0098 C86F -- MOS03 0099 C86F A9 20 DCTTX LDAIM TTXBCL ;TTX load with a particular byte ($20) MOS03 0122 C883 ^6A MOS03 0100 C871 8D 58 03 STA BTCOLF ;Used only for screen clears MOS03 0122 C883 ^6A MOS03 0101 C874 60 RTS MOS03 0122 C883 ^6A MOS03 0102 C875 MOS03 0122 C883 ^6A MOS03 0103 C875 ;DC3 ($13) is below this routine MOS03 0122 C883 ^6A MOS03 0104 C875 MOS03 0122 C883 ^6A MOS03 0105 C875 MOS03 0122 C883 ^6A MOS03 0106 C875 ;DC4 ($14) Set default physical MOS03 0122 C883 ^6A MOS03 0107 C875 ;- logical relations MOS03 0122 C883 ^6A MOS03 0108 C875 ;Default back & foreground clrs MOS03 0122 C883 ^6A MOS03 0109 C875 MOS03 0122 C883 ^6A MOS03 0110 C875 A2 05 DCD LDXIM &05 ;Programme all full colours & modes to zero MOS03 0122 C883 ^6A MOS03 0111 C877 A9 00 LDAIM &00 MOS03 0122 C883 ^6A MOS03 0112 C879 9D 57 03 DCDA STAAX FTCOLF MOS03 0122 C883 ^6A MOS03 0113 C87C CA DEX MOS03 0122 C883 ^6A MOS03 0114 C87D 10 FA BPL DCDA MOS03 0122 C883 ^6A MOS03 0115 C87F [ MOS125 = &FF MOS03 0122 C883 ^6A MOS03 0119 C87F | MOS03 0122 C883 ^6A MOS03 0120 C87F 8A TXA ;A = &FF MOS03 0122 C883 ^6A MOS03 0121 C880 AE 60 03 LDX NCOLOR ;Set foreground colours & ZORA & ZEOR MOS03 0122 C883 ^6A MOS03 0122 C883 F0 EA BEQ DCTTX ;Branch for TTX -- MOS03 0123 C885 ] -- MOS03 0124 C885 E0 0F CPXIM &0F -- MOS03 0125 C887 D0 02 BNE DCDB MOS03 0125 C887 v7D MOS03 0126 C889 A9 3F LDAIM INVSXT ;Don't invert flashing bit MOS03 0125 C887 v7D MOS03 0127 C88B 8D 57 03 DCDB STA FTCOLF -- MOS03 0128 C88E 8D 59 03 STA FGCOLF -- MOS03 0129 C891 49 FF EORIM &FF -- MOS03 0130 C893 85 D2 STA ZORA -- MOS03 0131 C895 85 D3 STA ZEOR MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 17 MOS03 VDU File - MOS03 MOS03 -- MOS03 0132 C897 8E 1F 03 STX QEND-&04 ;set logical colour := NCOLOR -- MOS03 0133 C89A [ MOS125 = &FF -- MOS03 0166 C89A | -- MOS03 0167 C89A A9 07 LDAIM &07 -- MOS03 0168 C89C E0 03 CPXIM &03 ;How many colours? -- MOS03 0169 C89E 90 0A BCC DCDLF MOS03 0169 C89E v75 MOS03 0170 C8A0 D0 0E BNE DCDLI MOS03 0170 C8A0 v71 MOS03 0171 C8A2 MOS03 0170 C8A0 v71 MOS03 0172 C8A2 ;4 colour, use shift right of $07 MOS03 0170 C8A0 v71 MOS03 0173 C8A2 MOS03 0170 C8A0 v71 MOS03 0174 C8A2 20 B5 C8 JSR DCDLJ ;Programme log.=3, phys.=7 MOS03 0170 C8A0 v71 MOS03 0175 C8A5 CE 1F 03 DEC QEND-&04 ;Programme log.=2, phys.=3 MOS03 0170 C8A0 v71 MOS03 0176 C8A8 A9 03 LDAIM &03 ;then 1=1, 0=0 MOS03 0170 C8A0 v71 MOS03 0177 C8AA MOS03 0170 C8A0 v71 MOS03 0178 C8AA ;2 colour (TTX also executes this rouine) MOS03 0170 C8A0 v71 MOS03 0179 C8AA MOS03 0170 C8A0 v71 MOS03 0180 C8AA 20 B5 C8 DCDLF JSR DCDLJ ;Programme log.=1, phys.=7 MOS03 0170 C8A0 v71 MOS03 0181 C8AD CE 1F 03 DEC QEND-&04 MOS03 0170 C8A0 v71 MOS03 0182 C8B0 MOS03 0170 C8A0 v71 MOS03 0183 C8B0 ;16 colours - one to one MOS03 0170 C8A0 v71 MOS03 0184 C8B0 MOS03 0170 C8A0 v71 MOS03 0185 C8B0 DCDLI MOS03 0170 C8A0 v71 MOS03 0186 C8B0 MOS03 0170 C8A0 v71 MOS03 0187 C8B0 AD 1F 03 LDA QEND-&04 MOS03 0188 C8B3 ^75 MOS03 0188 C8B3 D0 F5 BNE DCDLF -- MOS03 0189 C8B5 8D 20 03 DCDLJ STA QEND-&03 ;& fall through to .... -- MOS03 0190 C8B8 ] -- MOS03 0191 C8B8 -- MOS03 0192 C8B8 ;DC3 ($13) - Programme logical/ -- MOS03 0193 C8B8 ;physical colour relation -- MOS03 0194 C8B8 -- MOS03 0195 C8B8 ;Logical colour in QEND-4 -- MOS03 0196 C8B8 ;Physical colour in QEND-3 -- MOS03 0197 C8B8 -- MOS03 0198 C8B8 08 DCC PHP -- MOS03 0199 C8B9 78 SEI -- MOS03 0200 C8BA AD 1F 03 LDA QEND-&04 ;Determine logical colour -- MOS03 0201 C8BD 2D 60 03 AND NCOLOR -- MOS03 0202 C8C0 AA TAX -- MOS03 0203 C8C1 AD 20 03 LDA QEND-&03 ;Get physical colour -- MOS03 0204 C8C4 29 0F DCC1 ANDIM NPCOL ;mask off confusing bits MOS03 0301 C904 ^3E MOS03 0205 C8C6 9D 6F 03 STAAX PARROT ;Write to list MOS03 0301 C904 ^3E MOS03 0206 C8C9 [ MOS125 = &FF MOS03 0301 C904 ^3E MOS03 0246 C8C9 | MOS03 0301 C904 ^3E MOS03 0247 C8C9 86 FA STX SEIWKA MOS03 0301 C904 ^3E MOS03 0248 C8CB AD 60 03 LDA NCOLOR MOS03 0301 C904 ^3E MOS03 0249 C8CE 4A LSRA MOS03 0301 C904 ^3E MOS03 0250 C8CF A8 TAY MOS03 0301 C904 ^3E MOS03 0251 C8D0 46 FA DCCALA LSR SEIWKA ;determine start position =Logi*16/(ncolor+1)*16 MOS03 0301 C904 ^3E MOS03 0252 C8D2 6A RORA MOS03 0301 C904 ^3E MOS03 0253 C8D3 B0 FB BCS DCCALA MOS03 0301 C904 ^3E MOS03 0254 C8D5 1D 6F 03 ORAAX PARROT ;Get physical colour MOS03 0301 C904 ^3E MOS03 0255 C8D8 49 07 EORIM &07 ;adjust value accounting for ULA bug MOS03 0301 C904 ^3E MOS03 0256 C8DA 88 DEY ;Does NCOLOR=3? MOS03 0301 C904 ^3E MOS03 0257 C8DB MOS03 0301 C904 ^3E MOS03 0258 C8DB ;Interrupts already disabled shown by use of SEIWKA MOS03 0301 C904 ^3E MOS03 0259 C8DB [ &FF = &00 MOS03 0301 C904 ^3E MOS03 0262 C8DB ] MOS03 0301 C904 ^3E MOS03 0263 C8DB MOS03 0301 C904 ^3E MOS03 0264 C8DB ;Y=$FF 2 colours 8 writes MOS03 0301 C904 ^3E MOS03 0265 C8DB ;Y=$00 4 colours 4 writes MOS03 0301 C904 ^3E MOS03 0266 C8DB ;Y=$06 16 colours 1 write MOS03 0301 C904 ^3E MOS03 0267 C8DB MOS03 0301 C904 ^3E MOS03 0268 C8DB 30 1B BMI DCCALB MOS03 0301 C904 ^3E MOS03 0269 C8DD D0 09 BNE DCCALC MOS03 0301 C904 ^3E MOS03 0270 C8DF 5D DA D8 EORAX DCCTAB +&05 MOS03 0301 C904 ^3E MOS03 0271 C8E2 8D 21 FE DCCALD STA VPROC1 MOS03 0301 C904 ^3E MOS03 0272 C8E5 49 10 EORIM &10 MOS03 0301 C904 ^3E MOS03 0273 C8E7 C8 INY MOS03 0301 C904 ^3E MOS03 0274 C8E8 8D 21 FE DCCALC STA VPROC1 MOS03 0301 C904 ^3E MOS03 0275 C8EB 59 D4 D8 EORAY DCCTAB -&01 MOS03 0301 C904 ^3E MOS03 0276 C8EE BE D4 D8 LDXAY DCCTAB -&01 MOS03 0301 C904 ^3E MOS03 0277 C8F1 D0 EF BNE DCCALD MOS03 0301 C904 ^3E MOS03 0278 C8F3 8D 49 02 STA VPREGB MOS03 0301 C904 ^3E MOS03 0279 C8F6 [ &FF = &00 MOS03 0301 C904 ^3E MOS03 0281 C8F6 ] MOS03 0301 C904 ^3E MOS03 0282 C8F6 28 PLP MOS03 0301 C904 ^3E MOS03 0283 C8F7 60 RTS MOS03 0301 C904 ^3E MOS03 0284 C8F8 MOS03 0301 C904 ^3E MOS03 0285 C8F8 A0 02 DCCALB LDYIM &02 MOS03 0301 C904 ^3E MOS03 0286 C8FA D0 E6 BNE DCCALD ;always branch MOS03 0301 C904 ^3E MOS03 0287 C8FC ] MOS03 0301 C904 ^3E MOS03 0288 C8FC MOS03 0301 C904 ^3E MOS03 0289 C8FC MOS03 0301 C904 ^3E MOS03 0290 C8FC ;OSWORD call to programme palette MOS03 0301 C904 ^3E MOS03 0291 C8FC MOS03 0301 C904 ^3E MOS03 0292 C8FC PRPAL MOS03 0301 C904 ^3E MOS03 0293 C8FC 08 PHP MOS03 0301 C904 ^3E MOS03 0294 C8FD 2D 60 03 AND NCOLOR ;Get logical colour MOS03 0301 C904 ^3E MOS03 0295 C900 AA TAX MOS03 0301 C904 ^3E MOS03 0296 C901 C8 INY ;(Y):=1 MOS03 0301 C904 ^3E MOS03 0297 C902 B1 F0 LDAIY WARGS ;Load physical colour MOS03 0301 C904 ^3E MOS03 0298 C904 [ MOS125 = &FF MOS03 0301 C904 ^3E MOS03 0300 C904 | MOS03 0301 C904 ^3E MOS03 0301 C904 B0 BE BCS DCC1 ;C=1 from OSB -- MOS03 0302 C906 ] -- MOS03 0303 C906 -- MOS03 0304 C906 ;SYN ($16) Change mode -- MOS03 0305 C906 -- MOS03 0306 C906 AD 23 03 SYN LDA QEND ;Get the mode -- MOS03 0307 C909 4C 47 CB JMP CHMODE -- MOS03 0308 C90C -- MOS03 0309 C90C ;ETB ($17) Programme soft font -- MOS03 0310 C90C ;Programme character font to user definition -- MOS03 0311 C90C ;Character to be programmed in Q+08, top row in Q+07 -- MOS03 0312 C90C ;through to bottom row in Q+00 -- MOS03 0313 C90C -- MOS03 0314 C90C AD 1B 03 ETB LDA QEND-&08 ;Is it the soft font ? -- MOS03 0315 C90F C9 20 CMPIM &20 ;Is it a printable character ? -- MOS03 0316 C911 90 38 BCC ETBD MOS03 0316 C911 v47 MOS03 0317 C913 [ MOS125 = &FF MOS03 0316 C911 v47 MOS03 0355 C913 | MOS03 0316 C911 v47 MOS03 0356 C913 20 72 D0 JSR CHADDR MOS03 0316 C911 v47 MOS03 0357 C916 ;returns X=font no., Y=(ZTEMPC+&01)=hard/soft page no. MOS03 0316 C911 v47 MOS03 0358 C916 ;A=font flag mask, (ZTEMPC)=hard/soft character address MOS03 0316 C911 v47 MOS03 0359 C916 2C 67 03 BIT FNTFLG ;flag set ? MOS03 0316 C911 v47 MOS03 0360 C919 D0 1E BNE ETBB ;Yes?, then just copy defn. MOS03 0316 C911 v47 MOS03 0361 C91B 0D 67 03 ORA FNTFLG MOS03 0316 C911 v47 MOS03 0362 C91E 8D 67 03 STA FNTFLG MOS03 0316 C911 v47 MOS03 0363 C921 84 DD STY ZTEMPB +&01 ;point to hard font MOS03 0316 C911 v47 MOS03 0364 C923 BC 67 03 LDYAX PGSFNT -&01 ;point to soft font MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 18 MOS03 VDU File - MOS03 MOS03 MOS03 0316 C911 v47 MOS03 0365 C926 84 DF STY ZTEMPC +&01 MOS03 0316 C911 v47 MOS03 0366 C928 A6 DE LDX ZTEMPC +&00 ;save character offset MOS03 0316 C911 v47 MOS03 0367 C92A A0 00 LDYIM &00 MOS03 0316 C911 v47 MOS03 0368 C92C 84 DC STY ZTEMPB +&00 ;align both pointers MOS03 0316 C911 v47 MOS03 0369 C92E 84 DE STY ZTEMPC +&00 MOS03 0316 C911 v47 MOS03 0370 C930 B1 DC ETBC LDAIY ZTEMPB ;copy from hard font MOS03 0316 C911 v47 MOS03 0371 C932 91 DE STAIY ZTEMPC ;to soft font MOS03 0316 C911 v47 MOS03 0372 C934 C8 INY MOS03 0316 C911 v47 MOS03 0373 C935 D0 F9 BNE ETBC MOS03 0316 C911 v47 MOS03 0374 C937 86 DE STX ZTEMPC +&00 ;restore character offset MOS03 0316 C911 v47 MOS03 0375 C939 ETBB MOS03 0316 C911 v47 MOS03 0376 C939 A0 07 LDYIM &07 ;& copy character into the font MOS03 0316 C911 v47 MOS03 0377 C93B B9 1C 03 ETBA LDAAY QEND-&07 MOS03 0316 C911 v47 MOS03 0378 C93E 91 DE STAIY ZTEMPC MOS03 0316 C911 v47 MOS03 0379 C940 88 DEY MOS03 0316 C911 v47 MOS03 0380 C941 10 F8 BPL ETBA MOS03 0316 C911 v47 MOS03 0381 C943 ] MOS03 0316 C911 v47 MOS03 0382 C943 60 ETCX RTS MOS03 0316 C911 v47 MOS03 0383 C944 MOS03 0316 C911 v47 MOS03 0384 C944 JMIV25 MOS03 0316 C911 v47 MOS03 0385 C944 AD 1F 03 LDA PLMODE MOS03 0442 C99B ^27 MOS03 0386 C947 18 CLC MOS03 0442 C99B ^27 MOS03 0387 C948 ; C=0 MOS03 0442 C99B ^27 MOS03 0388 C948 JMIV23 ;C=1 MOS03 0442 C99B ^27 MOS03 0389 C948 6C 26 02 JMI VDUVEC MOS03 0442 C99B ^27 MOS03 0390 C94B ; MOS03 0442 C99B ^27 MOS03 0391 C94B C9 01 ETBD CMPIM &01 ;Valid command ? MOS03 0442 C99B ^27 MOS03 0392 C94D 90 15 BCC ETD MOS03 0442 C99B ^27 MOS03 0393 C94F ; C=1 MOS03 0442 C99B ^27 MOS03 0394 C94F D0 F7 BNE JMIV23 ;No?, then jump indirect to user vector with C=1 MOS03 0442 C99B ^27 MOS03 0395 C951 ; MOS03 0442 C99B ^27 MOS03 0396 C951 20 85 C5 JSR ANOMQ ;Anom. printing? ~~~ FUNCTION 1 Turn cursor on/off ~~~ MOS03 0442 C99B ^27 MOS03 0397 C954 D0 ED BNE ETCX ;Yes?, then don't do it MOS03 0442 C99B ^27 MOS03 0398 C956 A9 20 LDAIM &20 MOS03 0442 C99B ^27 MOS03 0399 C958 AC 1C 03 LDY QEND-&07 ;Hide(0) or display(1)? MOS03 0442 C99B ^27 MOS03 0400 C95B F0 03 BEQ ETCB MOS03 0442 C99B ^27 MOS03 0401 C95D AD 5F 03 ETCA LDA CSTEMP ;RESTORE CURSOR MOS03 0442 C99B ^27 MOS03 0402 C960 A0 0A ETCB LDYIM &0A MOS03 0442 C99B ^27 MOS03 0403 C962 D0 2D BNE CRTCPA ;Programme the 6845 without saving to CSTEMP MOS03 0442 C99B ^27 MOS03 0404 C964 MOS03 0442 C99B ^27 MOS03 0405 C964 AD 1D 03 ETD LDA QEND-&06 ;~~~ FUNCTION 0 Programme 6845 register #(Q+7) WITH (Q+6) ~~~ MOS03 0442 C99B ^27 MOS03 0406 C967 AC 1C 03 LDY QEND-&07 MOS03 0442 C99B ^27 MOS03 0407 C96A MOS03 0442 C99B ^27 MOS03 0408 C96A C0 07 CRTCP CPYIM &07 MOS03 0442 C99B ^27 MOS03 0409 C96C 90 23 BCC CRTCPA ;[register<7, so not register 7 or 10] MOS03 0442 C99B ^27 MOS03 0410 C96E D0 03 BNE CRTCPC ;[not vertical sync position] MOS03 0442 C99B ^27 MOS03 0411 C970 MOS03 0442 C99B ^27 MOS03 0412 C970 6D 90 02 ADC VERTIC ;apply user adjustment (c=1) MOS03 0442 C99B ^27 MOS03 0413 C973 MOS03 0442 C99B ^27 MOS03 0414 C973 C0 08 CRTCPC CPYIM &08 MOS03 0442 C99B ^27 MOS03 0415 C975 D0 07 BNE CRTCPD ;[not interlace mode register] MOS03 0442 C99B ^27 MOS03 0416 C977 09 00 ORAIM &00 ; interlace mode register MOS03 0442 C99B ^27 MOS03 0417 C979 30 03 BMI CRTCPD ;[do not alter interlace (probably teletext)] MOS03 0442 C99B ^27 MOS03 0418 C97B ; MOS03 0442 C99B ^27 MOS03 0419 C97B 4D 91 02 EOR INTERL ;modify interlace MOS03 0442 C99B ^27 MOS03 0420 C97E C0 0A CRTCPD CPYIM &0A ;Cursor start register ? MOS03 0442 C99B ^27 MOS03 0421 C980 D0 0F BNE CRTCPA ;[not cursor start register] MOS03 0442 C99B ^27 MOS03 0422 C982 8D 5F 03 STA CSTEMP ;Yes?, then record this for separate cursors MOS03 0442 C99B ^27 MOS03 0423 C985 A8 TAY MOS03 0442 C99B ^27 MOS03 0424 C986 A5 D0 LDA STATS ;Are cursors joined ? MOS03 0442 C99B ^27 MOS03 0425 C988 29 20 ANDIM &20 MOS03 0442 C99B ^27 MOS03 0426 C98A 08 PHP ;(very nasty coding, but it is short) MOS03 0442 C99B ^27 MOS03 0427 C98B 98 TYA MOS03 0442 C99B ^27 MOS03 0428 C98C A0 0A LDYIM &0A MOS03 0442 C99B ^27 MOS03 0429 C98E 28 PLP MOS03 0442 C99B ^27 MOS03 0430 C98F D0 06 BNE CRTCPB ;Yes, then don't write to 6845 MOS03 0442 C99B ^27 MOS03 0431 C991 8C 00 FE CRTCPA STY CRTCA ;Address said register MOS03 0442 C99B ^27 MOS03 0432 C994 8D 01 FE STA CRTCD ;and store data therein MOS03 0442 C99B ^27 MOS03 0433 C997 60 CRTCPB RTS ;(Referenced from EM) MOS03 0442 C99B ^27 MOS03 0434 C998 MOS03 0442 C99B ^27 MOS03 0435 C998 ;ESC ($1B) does bugger all MOS03 0442 C99B ^27 MOS03 0436 C998 MOS03 0442 C99B ^27 MOS03 0437 C998 ;Jump table points to the RTS at ACK MOS03 0442 C99B ^27 MOS03 0438 C998 MOS03 0442 C99B ^27 MOS03 0439 C998 ;EM ($19) - Plotting MOS03 0442 C99B ^27 MOS03 0440 C998 MOS03 0442 C99B ^27 MOS03 0441 C998 AE 61 03 EM LDX NPIX ;Filter out non-graphics modes MOS03 0442 C99B ^27 MOS03 0442 C99B F0 A7 BEQ JMIV25 ;[text mode] -- MOS03 0443 C99D 4C 92 D0 JMP EMA ;Jump to graphics routines -- MOS03 0444 C9A0 -- MOS03 0445 C9A0 ;Hardware scroll down -- MOS03 0446 C9A0 ;Doesn't touch cursor -- MOS03 0447 C9A0 -- MOS03 0448 C9A0 ; These routines return z=0 -- MOS03 0449 C9A0 -- MOS03 0450 C9A0 AE 50 03 HSCRDN LDX TOPSCN ;Subt. BYTROW from TOPSCN -- MOS03 0451 C9A3 AD 51 03 LDA TOPSCN+&01 -- MOS03 0452 C9A6 20 0B CD JSR SUBROW -- MOS03 0453 C9A9 B0 14 BCS NEWTOP ;Wraparound? No?, then done MOS03 0453 C9A9 v6B MOS03 0454 C9AB 6D 54 03 ADC BYTSCN ;Yes?, then add screen length MOS03 0453 C9A9 v6B MOS03 0455 C9AE 90 0F BCC NEWTOP ;(branch always taken) MOS03 0453 C9A9 v6B MOS03 0456 C9B0 MOS03 0453 C9A9 v6B MOS03 0457 C9B0 AE 50 03 HSCRUP LDX TOPSCN ;Add BYTROW to TOPSCN MOS03 0453 C9A9 v6B MOS03 0458 C9B3 AD 51 03 LDA TOPSCN+&01 MOS03 0453 C9A9 v6B MOS03 0459 C9B6 20 E8 CA JSR ADDROW MOS03 0453 C9A9 v6B MOS03 0460 C9B9 10 04 BPL NEWTOP ;Wraparound? MOS03 0453 C9A9 v6B MOS03 0461 C9BB 38 SEC MOS03 0453 C9A9 v6B MOS03 0462 C9BC ED 54 03 SBC BYTSCN ;Yes?, then subtract off screen length MOS03 0453 C9A9 v6B MOS03 0463 C9BF 8D 51 03 NEWTOP STA TOPSCN +&01 -- MOS03 0464 C9C2 8E 50 03 STX TOPSCN -- MOS03 0465 C9C5 [ MOS125 = &FF -- MOS03 0466 C9C5 | -- MOS03 0467 C9C5 AC 55 03 LDY MODE -- MOS03 0468 C9C8 C0 07 CPYIM &07 -- MOS03 0469 C9CA ] -- MOS03 0470 C9CA A0 0C LDYIM &0C ;Prog. START of 6845 -- MOS03 0471 C9CC D0 56 BNE AXCRTA ;(branch always taken) MOS03 0471 C9CC v29 MOS03 0472 C9CE MOS03 0471 C9CC v29 MOS03 0473 C9CE ;SUB ($1A) - Sets default text MOS03 0471 C9CC v29 MOS03 0474 C9CE ;& graphics windows. MOS03 0471 C9CC v29 MOS03 0475 C9CE ;Homes both cursors MOS03 0471 C9CC v29 MOS03 0476 C9CE ;Sets graphics origin to (0,0) MOS03 0471 C9CC v29 MOS03 0477 C9CE MOS03 0471 C9CC v29 MOS03 0478 C9CE ;Clear all window parameters, MOS03 0471 C9CC v29 MOS03 0479 C9CE ;Both cusors, & gr. origin MOS03 0471 C9CC v29 MOS03 0480 C9CE MOS03 0471 C9CC v29 MOS03 0481 C9CE A9 00 SUB LDAIM &00 MOS03 0471 C9CC v29 MOS03 0482 C9D0 A2 2C LDXIM VDUWS+&04-GWLCOL ;THIS VALUE LIKELY TO CHANGE ! MOS03 0471 C9CC v29 MOS03 0483 C9D2 9D 00 03 SUBA STAAX GWLCOL MOS03 0471 C9CC v29 MOS03 0484 C9D5 CA DEX MOS03 0471 C9CC v29 MOS03 0485 C9D6 10 FA BPL SUBA MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 19 MOS03 VDU File - MOS03 MOS03 MOS03 0471 C9CC v29 MOS03 0486 C9D8 MOS03 0471 C9CC v29 MOS03 0487 C9D8 ;Set other parameters MOS03 0471 C9CC v29 MOS03 0488 C9D8 MOS03 0471 C9CC v29 MOS03 0489 C9D8 AE 55 03 LDX MODE ;Get no. of char. cols. MOS03 0471 C9CC v29 MOS03 0490 C9DB BC EF C3 LDYAX PCOLS ;How many columns ? MOS03 0471 C9CC v29 MOS03 0491 C9DE 8C 0A 03 STY TWRCOL ;Default text window MOS03 0471 C9CC v29 MOS03 0492 C9E1 20 95 CA JSR SETPWW ;Set the text width MOS03 0471 C9CC v29 MOS03 0493 C9E4 BC E7 C3 LDYAX PROWS ;Get no. char. rows MOS03 0471 C9CC v29 MOS03 0494 C9E7 8C 09 03 STY TWBROW ;Default text window MOS03 0471 C9CC v29 MOS03 0495 C9EA A0 03 LDYIM &03 ;GRAPHICS WINDOW Top row MOS03 0471 C9CC v29 MOS03 0496 C9EC 8C 23 03 STY QEND MOS03 0471 C9CC v29 MOS03 0497 C9EF C8 INY MOS03 0471 C9CC v29 MOS03 0498 C9F0 8C 21 03 STY QEND-&02 ;right column MOS03 0471 C9CC v29 MOS03 0499 C9F3 CE 22 03 DEC QEND-&01 ;now = $FF MOS03 0471 C9CC v29 MOS03 0500 C9F6 CE 20 03 DEC QEND-&03 ;now = $FF MOS03 0471 C9CC v29 MOS03 0501 C9F9 20 46 CA JSR CAN ;Transfer to window & convert co-ords MOS03 0471 C9CC v29 MOS03 0502 C9FC A9 F7 LDAIM &F7 ;Clear bit 3 of STATS (default windows set) MOS03 0471 C9CC v29 MOS03 0503 C9FE 20 A5 C5 JSR STTAND MOS03 0471 C9CC v29 MOS03 0504 CA01 AE 50 03 LDX TOPSCN ;Programme cursor MOS03 0471 C9CC v29 MOS03 0505 CA04 AD 51 03 LDA TOPSCN+&01 ;to top L.H. byte MOS03 0471 C9CC v29 MOS03 0506 CA07 8E 4A 03 CSDSPA STX CSPOSN MOS03 0471 C9CC v29 MOS03 0507 CA0A 8D 4B 03 STA CSPOSN +&01 MOS03 0471 C9CC v29 MOS03 0508 CA0D 10 04 BPL CSDSP MOS03 0471 C9CC v29 MOS03 0509 CA0F 38 SEC MOS03 0471 C9CC v29 MOS03 0510 CA10 ED 54 03 SBC BYTSCN MOS03 0471 C9CC v29 MOS03 0511 CA13 86 D8 CSDSP STX ZMEMT MOS03 0471 C9CC v29 MOS03 0512 CA15 85 D9 STA ZMEMT +&01 MOS03 0471 C9CC v29 MOS03 0513 CA17 AE 4A 03 LDX CSPOSN MOS03 0471 C9CC v29 MOS03 0514 CA1A AD 4B 03 LDA CSPOSN +&01 MOS03 0471 C9CC v29 MOS03 0515 CA1D [ MOS125 = &FF MOS03 0471 C9CC v29 MOS03 0521 CA1D | MOS03 0471 C9CC v29 MOS03 0522 CA1D AC 55 03 LDY MODE MOS03 0471 C9CC v29 MOS03 0523 CA20 C0 07 CPYIM &07 MOS03 0471 C9CC v29 MOS03 0524 CA22 A0 0E LDYIM &0E MOS03 0471 C9CC v29 MOS03 0525 CA24 AXCRTA MOS03 0471 C9CC v29 MOS03 0526 CA24 ] MOS03 0471 C9CC v29 MOS03 0527 CA24 B0 10 BCS AXCRTB MOS03 0527 CA24 v6F MOS03 0528 CA26 86 DA STX ZTEMP ;No?, then divide by 8 MOS03 0527 CA24 v6F MOS03 0529 CA28 4A LSRA MOS03 0527 CA24 v6F MOS03 0530 CA29 66 DA ROR ZTEMP MOS03 0527 CA24 v6F MOS03 0531 CA2B 4A LSRA MOS03 0527 CA24 v6F MOS03 0532 CA2C 66 DA ROR ZTEMP MOS03 0527 CA24 v6F MOS03 0533 CA2E 4A LSRA MOS03 0527 CA24 v6F MOS03 0534 CA2F 66 DA ROR ZTEMP MOS03 0527 CA24 v6F MOS03 0535 CA31 A6 DA LDX ZTEMP MOS03 0527 CA24 v6F MOS03 0536 CA33 4C 38 CA JMP AXCRTC MOS03 0527 CA24 v6F MOS03 0537 CA36 ;For TTX, fiddle the high address lines MOS03 0527 CA24 v6F MOS03 0538 CA36 [ MOS125 = &FF MOS03 0527 CA24 v6F MOS03 0541 CA36 | MOS03 0527 CA24 v6F MOS03 0542 CA36 ;on entry C=1, A=&7C..83, normal/wrapped screen address high byte, we need: MOS03 0527 CA24 v6F MOS03 0543 CA36 ;b5 = MA13 set, TTXVDU address mapping MOS03 0527 CA24 v6F MOS03 0544 CA36 ;b4 = MA12 clear, no HIRES wraparound MOS03 0527 CA24 v6F MOS03 0545 CA36 ;b3 = MA11 set, high RAM bank MOS03 0527 CA24 v6F MOS03 0546 CA36 ;b2 = MA10 indicates TTX wraparound, needed on-chip for cursor display MOS03 0527 CA24 v6F MOS03 0547 CA36 ;b7,6 unused MOS03 0527 CA24 v6F MOS03 0548 CA36 E9 54 AXCRTB SBCIM &54 ;map to &28..2F -- MOS03 0549 CA38 ] -- MOS03 0550 CA38 ;Write (A) to reg. (Y) of 6845 -- MOS03 0551 CA38 ;& (X) to reg. (Y)+1 -- MOS03 0552 CA38 -- MOS03 0553 CA38 8C 00 FE AXCRTC STY CRTCA ;Access reg. (Y) -- MOS03 0554 CA3B 8D 01 FE STA CRTCD ;Store MSB -- MOS03 0555 CA3E C8 INY ;Access reg. (Y)+1 -- MOS03 0556 CA3F 8C 00 FE STY CRTCA -- MOS03 0557 CA42 8E 01 FE STX CRTCD ;Store LSB -- MOS03 0558 CA45 60 RTS -- MOS03 0559 CA46 -- MOS03 0560 CA46 ;CAN ($18) Define graphics area -- MOS03 0561 CA46 -- MOS03 0562 CA46 ;QEND-7 = L.H. margin = GWLCOL Low byte 1st -- MOS03 0563 CA46 ;QEND-5 = Bottom row = GWBROW -- MOS03 0564 CA46 ;QEND-3 = R.H. margin = GWRCOL -- MOS03 0565 CA46 ;QEND-1 = Top row = GWTROW -- MOS03 0566 CA46 -- MOS03 0567 CA46 20 8E CA CAN JSR CANB ;Swap graphics cursor with innocuous bytes in WS -- MOS03 0568 CA49 A2 1C LDXIM QEND-&07-V -- MOS03 0569 CA4B A0 2C LDYIM CDELTA-V -- MOS03 0570 CA4D 20 03 D4 JSR TRISA ;Calculate window differences to CDELTA -- MOS03 0571 CA50 0D 2D 03 ORA CDELTA+&01 ;(A) returns with CDELTA+3= DeltaY, so OR with DeltaX -- MOS03 0572 CA53 30 39 BMI CANB ;If either is -ve, then illegal window MOS03 0572 CA53 v46 MOS03 0573 CA55 A2 20 LDXIM QEND-&03-V ;Convert window to Ico-ords MOS03 0572 CA53 v46 MOS03 0574 CA57 20 7D D1 JSR EIGABS MOS03 0572 CA53 v46 MOS03 0575 CA5A A2 1C LDXIM QEND-&07-V MOS03 0572 CA53 v46 MOS03 0576 CA5C 20 7D D1 JSR EIGABS MOS03 0572 CA53 v46 MOS03 0577 CA5F AD 1F 03 LDA QEND-&04 ;Are both lower margins +ve ? MOS03 0572 CA53 v46 MOS03 0578 CA62 0D 1D 03 ORA QEND-&06 MOS03 0572 CA53 v46 MOS03 0579 CA65 30 27 BMI CANB ;No?, then illegal MOS03 0572 CA53 v46 MOS03 0580 CA67 AD 23 03 LDA QEND ;Is Y valid ? MOS03 0572 CA53 v46 MOS03 0581 CA6A D0 22 BNE CANB ;Only if MSB is zero MOS03 0572 CA53 v46 MOS03 0582 CA6C AE 55 03 LDX MODE ;Is X valid ? MOS03 0572 CA53 v46 MOS03 0583 CA6F AD 21 03 LDA QEND-&02 ;Divide by 8 & see if > no. of character cols MOS03 0572 CA53 v46 MOS03 0584 CA72 85 DA STA ZTEMP MOS03 0572 CA53 v46 MOS03 0585 CA74 AD 20 03 LDA QEND-&03 ;LSB of RH margin -1 MOS03 0572 CA53 v46 MOS03 0586 CA77 46 DA LSR ZTEMP MOS03 0572 CA53 v46 MOS03 0587 CA79 6A RORA MOS03 0572 CA53 v46 MOS03 0588 CA7A 46 DA LSR ZTEMP MOS03 0572 CA53 v46 MOS03 0589 CA7C D0 10 BNE CANB MOS03 0572 CA53 v46 MOS03 0590 CA7E 6A RORA MOS03 0572 CA53 v46 MOS03 0591 CA7F 4A LSRA MOS03 0572 CA53 v46 MOS03 0592 CA80 DD EF C3 CMPAX PCOLS MOS03 0572 CA53 v46 MOS03 0593 CA83 F0 02 BEQ CANA MOS03 0572 CA53 v46 MOS03 0594 CA85 10 07 BPL CANB MOS03 0572 CA53 v46 MOS03 0595 CA87 A0 00 CANA LDYIM GWLCOL-V ;Copy to window MOS03 0572 CA53 v46 MOS03 0596 CA89 A2 1C LDXIM QEND-&07-V ;From Q MOS03 0572 CA53 v46 MOS03 0597 CA8B 20 6E D4 JSR COPY8 MOS03 0572 CA53 v46 MOS03 0598 CA8E A2 10 CANB LDXIM GCSR-V ;Swap GCSR with CANWS, as EIGABS corrupts this -- MOS03 0599 CA90 A0 28 LDYIM CANWS-V -- MOS03 0600 CA92 4C 02 CE JMP SWAPF -- MOS03 0601 CA95 -- MOS03 0602 CA95 ;Set printer window width -- MOS03 0603 CA95 ;Char. width in A -- MOS03 0604 CA95 ;Mode in X -- MOS03 0605 CA95 -- MOS03 0606 CA95 C8 SETPWW INY -- MOS03 0607 CA96 [ MOS125 = &FF -- MOS03 0612 CA96 | -- MOS03 0613 CA96 8C 4C 03 STY PWWDTH -- MOS03 0614 CA99 A0 00 LDYIM &00 -- MOS03 0615 CA9B 8C 4D 03 STY PWWDTH +&01 ;Clear MSB -- MOS03 0616 CA9E ] -- MOS03 0617 CA9E AD 4F 03 LDA BYTCH ;How many times to shift PWWDTH left ? MOS03 MOS03 MOS03 MOS03 Acorn macro assembler Page 20 MOS03 VDU File - MOS03 MOS03 -- MOS03 0618 CAA1 4A LSRA -- MOS03 0619 CAA2 F0 09 BEQ SETPWC ;TTX? MOS03 0619 CAA2 v76 MOS03 0620 CAA4 0E 4C 03 SETPWA ASL PWWDTH MOS03 0619 CAA2 v76 MOS03 0621 CAA7 2E 4D 03 ROL PWWDTH +&01 MOS03 0619 CAA2 v76 MOS03 0622 CAAA 4A LSRA MOS03 0619 CAA2 v76 MOS03 0623 CAAB 90 F7 BCC SETPWA MOS03 0619 CAA2 v76 MOS03 0624 CAAD 60 SETPWC RTS ;This used to be FSFAIL & ESCFL & ESCBB as well -- MOS03 0625 CAAE -- MOS03 0626 CAAE ;GS ($1D) Define graphics origin -- MOS03 0627 CAAE -- MOS03 0628 CAAE ;GSA Define graphics origin -- MOS03 0629 CAAE ;The co-ordinates are in external 16 bit space. This does not -- MOS03 0630 CAAE ;move the windows, but does move the graphics cursors -- MOS03 0631 CAAE -- MOS03 0632 CAAE A2 20 GS LDXIM QEND-&03-V -- MOS03 0633 CAB0 A0 0C LDYIM ORG-V ;Copy the new origin (external co-ords) to ORGY.. -- MOS03 0634 CAB2 20 7C D4 JSR COPYF -- MOS03 0635 CAB5 [ MOS125 = &FF -- MOS03 0656 CAB5 | -- MOS03 0657 CAB5 ;IEG Inverse of EIG. Converts Icursor to Ecursor -- MOS03 0658 CAB5 -- MOS03 0659 CAB5 A0 10 IEG LDYIM GCSR-V ;Copy GCSIY to GCSY -- MOS03 0660 CAB7 20 7A D4 JSR COPYFB -- MOS03 0661 CABA A2 02 LDXIM &02 ;Convert y co-ordinates -- MOS03 0662 CABC A9 F8 LDAIM &F8 ;by multiplying by 4 -- MOS03 0663 CABE 20 CE CA JSR IEGC -- MOS03 0664 CAC1 A2 00 LDXIM &00 ;Convert x co-ordinates -- MOS03 0665 CAC3 ;By multiplying by 2 -- MOS03 0666 CAC3 AD 61 03 LDA NPIX ;4, or 8, depending on (NPIX) -- MOS03 0667 CAC6 49 FF EORIM &FF -- MOS03 0668 CAC8 EC 56 03 CPX MEMODE ;Get memory map type -- MOS03 0669 CACB D0 01 BNE IEGC MOS03 0669 CACB v7E MOS03 0670 CACD 0A IEGE ASLA ;=0 if 20K mode in which case skip one multiplication MOS03 0674 CAD6 ^75 MOS03 0671 CACE 1E 10 03 IEGC ASLAX GCSR MOS03 0674 CAD6 ^75 MOS03 0672 CAD1 3E 11 03 ROLAX GCSR+&01 MOS03 0674 CAD6 ^75 MOS03 0673 CAD4 29 0E ANDIM &0E MOS03 0674 CAD6 ^75 MOS03 0674 CAD6 D0 F5 BNE IEGE -- MOS03 0675 CAD8 ;Now subtract off origin to give external co-ordinate -- MOS03 0676 CAD8 A8 TAY -- MOS03 0677 CAD9 38 SEC -- MOS03 0678 CADA 20 DE CA JSR IEGD -- MOS03 0679 CADD E8 INX -- MOS03 0680 CADE BD 10 03 IEGD LDAAX GCSR -- MOS03 0681 CAE1 FD 0C 03 SBCAX ORG -- MOS03 0682 CAE4 9D 10 03 STAAX GCSR -- MOS03 0683 CAE7 60 RTS -- MOS03 0684 CAE8 ] -- MOS03 0685 CAE8 LNK MOS04 -- MOS04 0001 CAE8 -- MOS04 0002 CAE8 TTL VDU File - MOS04 -- MOS04 0003 CAE8 OPT MOS04 MOS04 MOS04 MOS04 MOS04 Acorn macro assembler Page 21 MOS04 VDU File - MOS04 MOS04 -- MOS04 0004 CAE8 ;Last revision 02/06/82 -- MOS04 0005 CAE8 -- MOS04 0006 CAE8 ;02/06/82 Implode/Explode font change, RESET (fonts) changed -- MOS04 0007 CAE8 ;26/05/82 Replace table TBZTBX with LSRA -- MOS04 0008 CAE8 ;19/05/82 Compress PAGEE code -- MOS04 0009 CAE8 ;18/05/82 Conditional coding to remove bug from PAGE -- MOS04 0010 CAE8 ;01/05/82 Considerable recoding for new variable order & forward queueing -- MOS04 0011 CAE8 ;19/04/82 BYTE squashing -- MOS04 0012 CAE8 ;24/03/82 Add soft font implosion & explosion -- MOS04 0013 CAE8 ; Change refs. to BEGSCN+1 to BEGSCN -- MOS04 0014 CAE8 ;08/02/82 Remove initialisation of TRMCH -- MOS04 0015 CAE8 ;07/01/82 Remove initialisation of VDUVEC -- MOS04 0016 CAE8 ;16/11 Bug fix - page mode only at bottom line of window -- MOS04 0017 CAE8 ;14/11 Initialisation of DOTS removed -- MOS04 0018 CAE8 ;28/10 Initialisation of FNTFLG -- MOS04 0019 CAE8 -- MOS04 0020 CAE8 ;Get address of line below -- MOS04 0021 CAE8 -- MOS04 0022 CAE8 48 ADDROW PHA -- MOS04 0023 CAE9 8A TXA -- MOS04 0024 CAEA 18 CLC -- MOS04 0025 CAEB 6D 52 03 ADC BYTROW -- MOS04 0026 CAEE AA TAX -- MOS04 0027 CAEF 68 PLA -- MOS04 0028 CAF0 6D 53 03 ADC BYTROW +&01 -- MOS04 0029 CAF3 60 RTS -- MOS04 0030 CAF4 -- MOS04 0031 CAF4 ;Is page mode on ? -- MOS04 0032 CAF4 -- MOS04 0033 CAF4 ;CTRL and SHIFT keys pressed (c=1) -- MOS04 0034 CAF4 -- MOS04 0035 CAF4 20 28 CB PAGEF JSR PAGED ;reset LINES, N.B. does not corrupt c MOS04 0039 CAFC ^76 MOS04 0036 CAF7 ; If c=1 => set both LEDs MOS04 0039 CAFC ^76 MOS04 0037 CAF7 20 18 EA PAGE JSR MOSTST ;pause if CTRL and SHIFT keys pressed MOS04 0039 CAFC ^76 MOS04 0038 CAFA 90 02 BCC PAGEE ;[CTRL not pressed] MOS04 0039 CAFC ^76 MOS04 0039 CAFC 30 F6 BMI PAGEF ;[CTRL and SHIFT keys pressed ,c=1] MOS04 0038 CAFA v7D MOS04 0040 CAFE ; CTRL without SHIFT MOS04 0038 CAFA v7D MOS04 0041 CAFE MOS04 0038 CAFA v7D MOS04 0042 CAFE [ PAGEFX =0 ;TRUE if bug in page to be fixed MOS04 0038 CAFA v7D MOS04 0043 CAFE A5 D0 PAGEE LDA STATS -- MOS04 0044 CB00 49 04 EORIM &04 ;invert page mode bit -- MOS04 0045 CB02 29 46 ANDIM &46 ;Exit if C.E. or scroll disabled, or not in page mode -- MOS04 0046 CB04 D0 2A BNE PAGEX MOS04 0046 CB04 v55 MOS04 0047 CB06 | MOS04 0046 CB04 v55 MOS04 0052 CB06 ] MOS04 0046 CB04 v55 MOS04 0053 CB06 MOS04 0046 CB04 v55 MOS04 0054 CB06 AD 69 02 LDA LINES ;Is a page printed yet ? MOS04 0046 CB04 v55 MOS04 0055 CB09 30 22 BMI PAGEA ;If -ve, then reset (more down scrolls than up) MOS04 0046 CB04 v55 MOS04 0056 CB0B ; ensure on bottom line of text window MOS04 0046 CB04 v55 MOS04 0057 CB0B AD 19 03 LDA CSY MOS04 0046 CB04 v55 MOS04 0058 CB0E CD 09 03 CMP TWBROW MOS04 0046 CB04 v55 MOS04 0059 CB11 90 1A BCC PAGEA ;[not on bottom line of text window] MOS04 0046 CB04 v55 MOS04 0060 CB13 ; deal with overlap MOS04 0046 CB04 v55 MOS04 0061 CB13 4A LSRA MOS04 0046 CB04 v55 MOS04 0062 CB14 4A LSRA MOS04 0046 CB04 v55 MOS04 0063 CB15 38 SEC MOS04 0046 CB04 v55 MOS04 0064 CB16 6D 69 02 ADC LINES MOS04 0046 CB04 v55 MOS04 0065 CB19 6D 0B 03 ADC TWTROW ;(c=0) MOS04 0046 CB04 v55 MOS04 0066 CB1C CD 09 03 CMP TWBROW MOS04 0046 CB04 v55 MOS04 0067 CB1F 90 0C BCC PAGEA ;No, then continue MOS04 0046 CB04 v55 MOS04 0068 CB21 18 CLC ;do not set LEDs on first scroll test MOS04 0046 CB04 v55 MOS04 0069 CB22 ;wait for shift key MOS04 0046 CB04 v55 MOS04 0070 CB22 20 18 EA PAGEC JSR MOSTST MOS04 0046 CB04 v55 MOS04 0071 CB25 38 SEC ;test LEDs on subsequent scroll tests MOS04 0046 CB04 v55 MOS04 0072 CB26 10 FA BPL PAGEC MOS04 0046 CB04 v55 MOS04 0073 CB28 A9 FF PAGED LDAIM &FF ;Reinitialise LINES MOS04 0046 CB04 v55 MOS04 0074 CB2A 8D 69 02 STA LINES MOS04 0046 CB04 v55 MOS04 0075 CB2D EE 69 02 PAGEA INC LINES MOS04 0046 CB04 v55 MOS04 0076 CB30 60 PAGEX RTS -- MOS04 0077 CB31 -- MOS04 0078 CB31 ;INTIALISATION ROUTINE -- MOS04 0079 CB31 ;Initial mode in (A) -- MOS04 0080 CB31 -- MOS04 0081 CB31 48 RESET PHA ;Push mode -- MOS04 0082 CB32 A2 7F LDXIM VEND-V ;Clear all variables -- MOS04 0083 CB34 A9 00 LDAIM &00 -- MOS04 0084 CB36 85 D0 STA STATS -- MOS04 0085 CB38 9D FF 02 RESETA STAAX V-&01 MOS04 0087 CB3C ^7A MOS04 0086 CB3B CA DEX MOS04 0087 CB3C ^7A MOS04 0087 CB3C D0 FA BNE RESETA -- MOS04 0088 CB3E ; X=0 **** AND EQ status (used by FONT) **** -- MOS04 0089 CB3E 20 1A CD JSR FONT ;Ensure font imploded -- MOS04 0090 CB41 68 PLA ;Pull the mode back again -- MOS04 0091 CB42 A2 7F LDXIM &7F ;Initialise CHCSR to character for DEL -- MOS04 0092 CB44 8E 66 03 STX CHCSR ;and fall through to ... -- MOS04 0093 CB47 -- MOS04 0094 CB47 ;MODE CHANGE -- MOS04 0095 CB47 -- MOS04 0096 CB47 2C 8E 02 CHMODE BIT MODEL ;adjust according to model -- MOS04 0097 CB4A 30 02 BMI CHMOD1 ;[model B] MOS04 0097 CB4A v7D MOS04 0098 CB4C 09 04 ORAIM &04 ;model A MOS04 0097 CB4A v7D MOS04 0099 CB4E 29 07 CHMOD1 ANDIM &07 -- MOS04 0100 CB50 AA TAX -- MOS04 0101 CB51 8E 55 03 STX MODE ;Initialise MODE -- MOS04 0102 CB54 BD 14 C4 LDAAX COLMOD ;Get no. colours -- MOS04 0103 CB57 8D 60 03 STA NCOLOR ;=0 if TTX -- MOS04 0104 CB5A BD FF C3 LDAAX BYTCHT ;No. bytes / char. -- MOS04 0105 CB5D 8D 4F 03 STA BYTCH -- MOS04 0106 CB60 BD 3A C4 LDAAX NPIXTB ;no. pixles per byte -1, =0 if non-graphics mode -- MOS04 0107 CB63 8D 61 03 STA NPIX -- MOS04 0108 CB66 D0 02 BNE CHMODB MOS04 0108 CB66 v7D MOS04 0109 CB68 A9 07 LDAIM &07 ;Initialise left and right masks for read character MOS04 0108 CB66 v7D MOS04 0110 CB6A 0A CHMODB ASLA ;Define left and right masks. PRESERVE c !!! -- MOS04 0111 CB6B A8 TAY -- MOS04 0112 CB6C B9 06 C4 LDAAY MASKTB -&01 ;Offset to right mask -- MOS04 0113 CB6F 8D 63 03 STA MASKR -- MOS04 0114 CB72 0A CHMODC ASLA MOS04 0115 CB73 ^7D MOS04 0115 CB73 10 FD BPL CHMODC ;Generate left most mask -- MOS04 0116 CB75 8D 62 03 STA MASKL ;c=0 - preserve until byte width type generated -- MOS04 0117 CB78 BC 40 C4 LDYAX MODETB ;Memory map type -- MOS04 0118 CB7B 8C 56 03 STY MEMODE -- MOS04 0119 CB7E B9 4F C4 LDAAY CZERO ;Initialise C0 -- MOS04 0120 CB81 20 37 EA JSR CREG ;must preserve c=0 -- MOS04 0121 CB84 B9 4B C4 LDAAY CONE -- MOS04 0122 CB87 20 37 EA JSR CREG -- MOS04 0123 CB8A B9 59 C4 LDAAY BYTSTA ;Total bytes dsp.'ed -- MOS04 0124 CB8D 8D 54 03 STA BYTSCN -- MOS04 0125 CB90 B9 5E C4 LDAAY STSCTB ;Addr. 1st to disp'ed -- MOS04 0126 CB93 8D 4E 03 STA BEGSCN -- MOS04 0127 CB96 [ MOS125 = &FF -- MOS04 0133 CB96 | MOS04 MOS04 MOS04 MOS04 Acorn macro assembler Page 22 MOS04 VDU File - MOS04 MOS04 -- MOS04 0134 CB96 98 TYA ;Get byte width type -- MOS04 0135 CB97 49 07 EORIM &07 -- MOS04 0136 CB99 4A LSRA -- MOS04 0137 CB9A AA TAX -- MOS04 0138 CB9B CA DEX ;Map (0,1,2,3,4) to (2,2,1,1,0) -- MOS04 0139 CB9C ] -- MOS04 0140 CB9C BD 66 C4 LDAAX TBZTBA ;LSB of table addr. -- MOS04 0141 CB9F 85 E0 STA ZTBL -- MOS04 0142 CBA1 A9 C3 LDAIM /(HRGTB ) ;MSB of same (always the same) -- MOS04 0143 CBA3 85 E1 STA ZTBL +&01 -- MOS04 0144 CBA5 BD 63 C4 LDAAX BYTRTA ;Byte width of row -- MOS04 0145 CBA8 8D 52 03 STA BYTROW -- MOS04 0146 CBAB 8E 53 03 STX BYTROW +&01 -- MOS04 0147 CBAE A9 43 LDAIM &43 ;Preserve b6, b1 & b0 of STATS only -- MOS04 0148 CBB0 20 A5 C5 JSR STTAND ;Clear all others -- MOS04 0149 CBB3 AE 55 03 LDX MODE ;Indirect mode to mMODREG -- MOS04 0150 CBB6 BD F7 C3 LDAAX INDMOD ;from this table -- MOS04 0151 CBB9 20 3F EA JSR MVPRC0 ;as close as possible to the reprogramming of the 6845 -- MOS04 0152 CBBC -- MOS04 0153 CBBC ;PROGRAMME THE 6845 -- MOS04 0154 CBBC -- MOS04 0155 CBBC 08 PHP -- MOS04 0156 CBBD 78 SEI -- MOS04 0157 CBBE BE 69 C4 LDXAY CRTCX ;Get the table to Xmt -- MOS04 0158 CBC1 A0 0B LDYIM &0B ;No. bytes to feed it -- MOS04 0159 CBC3 BD 6E C4 CRTCLP LDAAX CRTCTB ;Load byte to MOS04 0163 CBCB ^76 MOS04 0160 CBC6 20 6A C9 JSR CRTCP ;Programme the 6845 and save value of cursor start MOS04 0163 CBCB ^76 MOS04 0161 CBC9 CA DEX MOS04 0163 CBCB ^76 MOS04 0162 CBCA 88 DEY MOS04 0163 CBCB ^76 MOS04 0163 CBCB 10 F6 BPL CRTCLP -- MOS04 0164 CBCD 28 PLP -- MOS04 0165 CBCE -- MOS04 0166 CBCE 20 75 C8 JSR DCD ;Default log.phys. cols. -- MOS04 0167 CBD1 20 CE C9 JSR SUB ;Clear any windowing -- MOS04 0168 CBD4 -- MOS04 0169 CBD4 ;fall through to ..... -- MOS04 0170 CBD4 -- MOS04 0171 CBD4 A2 00 CLATXT LDXIM &00 ;TOPSCN:=BEGSCN -- MOS04 0172 CBD6 AD 4E 03 LDA BEGSCN ;Load must be in this to ensure n=0, tested in CSDSPA -- MOS04 0173 CBD9 8E 50 03 STX TOPSCN -- MOS04 0174 CBDC 8D 51 03 STA TOPSCN +&01 -- MOS04 0175 CBDF 20 07 CA JSR CSDSPA ;Home cursor -- MOS04 0176 CBE2 A0 0C LDYIM &0C ;Take divided address -- MOS04 0177 CBE4 20 38 CA JSR AXCRTC -- MOS04 0178 CBE7 AD 58 03 LDA BTCOLF -- MOS04 0179 CBEA AE 56 03 LDX MEMODE ;Get mem.map type -- MOS04 0180 CBED BC 54 C4 LDYAX CLSCTA ;Set up jump vector -- MOS04 0181 CBF0 8C 5D 03 STY JVEC -- MOS04 0182 CBF3 A0 CC LDYIM /(CLASCA ) ;Used to be LDYAX CLSCTB -- MOS04 0183 CBF5 8C 5E 03 STY JVEC +&01 -- MOS04 0184 CBF8 A2 00 LDXIM &00 -- MOS04 0185 CBFA 8E 69 02 STX LINES ;Initialise the number of lines scrolled -- MOS04 0186 CBFD 8E 18 03 STX CSX -- MOS04 0187 CC00 8E 19 03 STX CSY -- MOS04 0188 CC03 6C 5D 03 JMI JVEC -- MOS04 0189 CC06 -- MOS04 0190 CC06 RCHDEF -- MOS04 0191 CC06 20 72 D0 JSR CHADDR ;Read character definition -- MOS04 0192 CC09 A0 00 LDYIM &00 ;Address character (start of defn. now in ZTEMPC) -- MOS04 0193 CC0B B1 DE PRABA LDAIY ZTEMPC ;Copy definition MOS04 0197 CC12 ^77 MOS04 0194 CC0D C8 INY MOS04 0197 CC12 ^77 MOS04 0195 CC0E 91 F0 STAIY WARGS MOS04 0197 CC12 ^77 MOS04 0196 CC10 C0 08 CPYIM &08 MOS04 0197 CC12 ^77 MOS04 0197 CC12 D0 F7 BNE PRABA -- MOS04 0198 CC14 60 RTS -- MOS04 0199 CC15 -- MOS04 0200 CC15 9D 00 30 CLASCA STAAX &3000 ;Modes 1-3 (20K) -- MOS04 0201 CC18 9D 00 31 STAAX &3100 -- MOS04 0202 CC1B 9D 00 32 STAAX &3200 -- MOS04 0203 CC1E 9D 00 33 STAAX &3300 -- MOS04 0204 CC21 9D 00 34 STAAX &3400 -- MOS04 0205 CC24 9D 00 35 STAAX &3500 -- MOS04 0206 CC27 9D 00 36 STAAX &3600 -- MOS04 0207 CC2A 9D 00 37 STAAX &3700 -- MOS04 0208 CC2D 9D 00 38 STAAX &3800 -- MOS04 0209 CC30 9D 00 39 STAAX &3900 -- MOS04 0210 CC33 9D 00 3A STAAX &3A00 -- MOS04 0211 CC36 9D 00 3B STAAX &3B00 -- MOS04 0212 CC39 9D 00 3C STAAX &3C00 -- MOS04 0213 CC3C 9D 00 3D STAAX &3D00 -- MOS04 0214 CC3F 9D 00 3E STAAX &3E00 -- MOS04 0215 CC42 9D 00 3F STAAX &3F00 -- MOS04 0216 CC45 9D 00 40 CLASCB STAAX &4000 ;Mode 3 (16k) -- MOS04 0217 CC48 9D 00 41 STAAX &4100 -- MOS04 0218 CC4B 9D 00 42 STAAX &4200 -- MOS04 0219 CC4E 9D 00 43 STAAX &4300 -- MOS04 0220 CC51 9D 00 44 STAAX &4400 -- MOS04 0221 CC54 9D 00 45 STAAX &4500 -- MOS04 0222 CC57 9D 00 46 STAAX &4600 -- MOS04 0223 CC5A 9D 00 47 STAAX &4700 -- MOS04 0224 CC5D 9D 00 48 STAAX &4800 -- MOS04 0225 CC60 9D 00 49 STAAX &4900 -- MOS04 0226 CC63 9D 00 4A STAAX &4A00 -- MOS04 0227 CC66 9D 00 4B STAAX &4B00 -- MOS04 0228 CC69 9D 00 4C STAAX &4C00 -- MOS04 0229 CC6C 9D 00 4D STAAX &4D00 -- MOS04 0230 CC6F 9D 00 4E STAAX &4E00 -- MOS04 0231 CC72 9D 00 4F STAAX &4F00 -- MOS04 0232 CC75 9D 00 50 STAAX &5000 -- MOS04 0233 CC78 9D 00 51 STAAX &5100 -- MOS04 0234 CC7B 9D 00 52 STAAX &5200 -- MOS04 0235 CC7E 9D 00 53 STAAX &5300 -- MOS04 0236 CC81 9D 00 54 STAAX &5400 -- MOS04 0237 CC84 9D 00 55 STAAX &5500 -- MOS04 0238 CC87 9D 00 56 STAAX &5600 -- MOS04 0239 CC8A 9D 00 57 STAAX &5700 -- MOS04 0240 CC8D 9D 00 58 CLASCC STAAX &5800 ;Modes 4,5 (10K) -- MOS04 0241 CC90 9D 00 59 STAAX &5900 -- MOS04 0242 CC93 9D 00 5A STAAX &5A00 -- MOS04 0243 CC96 9D 00 5B STAAX &5B00 -- MOS04 0244 CC99 9D 00 5C STAAX &5C00 -- MOS04 0245 CC9C 9D 00 5D STAAX &5D00 -- MOS04 0246 CC9F 9D 00 5E STAAX &5E00 -- MOS04 0247 CCA2 9D 00 5F STAAX &5F00 -- MOS04 0248 CCA5 9D 00 60 CLASCD STAAX &6000 ;Mode 6 (8k) -- MOS04 0249 CCA8 9D 00 61 STAAX &6100 -- MOS04 0250 CCAB 9D 00 62 STAAX &6200 -- MOS04 0251 CCAE 9D 00 63 STAAX &6300 -- MOS04 0252 CCB1 9D 00 64 STAAX &6400 -- MOS04 0253 CCB4 9D 00 65 STAAX &6500 -- MOS04 0254 CCB7 9D 00 66 STAAX &6600 MOS04 MOS04 MOS04 MOS04 Acorn macro assembler Page 23 MOS04 VDU File - MOS04 MOS04 -- MOS04 0255 CCBA 9D 00 67 STAAX &6700 -- MOS04 0256 CCBD 9D 00 68 STAAX &6800 -- MOS04 0257 CCC0 9D 00 69 STAAX &6900 -- MOS04 0258 CCC3 9D 00 6A STAAX &6A00 -- MOS04 0259 CCC6 9D 00 6B STAAX &6B00 -- MOS04 0260 CCC9 9D 00 6C STAAX &6C00 -- MOS04 0261 CCCC 9D 00 6D STAAX &6D00 -- MOS04 0262 CCCF 9D 00 6E STAAX &6E00 -- MOS04 0263 CCD2 9D 00 6F STAAX &6F00 -- MOS04 0264 CCD5 9D 00 70 STAAX &7000 -- MOS04 0265 CCD8 9D 00 71 STAAX &7100 -- MOS04 0266 CCDB 9D 00 72 STAAX &7200 -- MOS04 0267 CCDE 9D 00 73 STAAX &7300 -- MOS04 0268 CCE1 9D 00 74 STAAX &7400 -- MOS04 0269 CCE4 9D 00 75 STAAX &7500 -- MOS04 0270 CCE7 9D 00 76 STAAX &7600 -- MOS04 0271 CCEA 9D 00 77 STAAX &7700 -- MOS04 0272 CCED 9D 00 78 STAAX &7800 -- MOS04 0273 CCF0 9D 00 79 STAAX &7900 -- MOS04 0274 CCF3 9D 00 7A STAAX &7A00 -- MOS04 0275 CCF6 9D 00 7B STAAX &7B00 -- MOS04 0276 CCF9 9D 00 7C CLASCE STAAX &7C00 ;Mode 7 (1k = TTX) -- MOS04 0277 CCFC 9D 00 7D STAAX &7D00 -- MOS04 0278 CCFF 9D 00 7E STAAX &7E00 -- MOS04 0279 CD02 9D 00 7F STAAX &7F00 -- MOS04 0280 CD05 E8 INX -- MOS04 0281 CD06 F0 6E BEQ ENSCRX MOS04 0281 CD06 v11 MOS04 0282 CD08 6C 5D 03 RUNNER JMI JVEC MOS04 0281 CD06 v11 MOS04 0283 CD0B MOS04 0281 CD06 v11 MOS04 0284 CD0B ;Get the next line up, MOS04 0281 CD06 v11 MOS04 0285 CD0B ;test if wraparound MOS04 0281 CD06 v11 MOS04 0286 CD0B ;This is here as padding MOS04 0281 CD06 v11 MOS04 0287 CD0B MOS04 0281 CD06 v11 MOS04 0288 CD0B 48 SUBROW PHA MOS04 0281 CD06 v11 MOS04 0289 CD0C 8A TXA MOS04 0281 CD06 v11 MOS04 0290 CD0D 38 SEC MOS04 0281 CD06 v11 MOS04 0291 CD0E ED 52 03 SBC BYTROW MOS04 0281 CD06 v11 MOS04 0292 CD11 AA TAX MOS04 0281 CD06 v11 MOS04 0293 CD12 68 PLA MOS04 0281 CD06 v11 MOS04 0294 CD13 ED 53 03 SBC BYTROW +&01 MOS04 0281 CD06 v11 MOS04 0295 CD16 CD 4E 03 CMP BEGSCN MOS04 0281 CD06 v11 MOS04 0296 CD19 FONT0 MOS04 0281 CD06 v11 MOS04 0297 CD19 60 RTS MOS04 0281 CD06 v11 MOS04 0298 CD1A MOS04 0281 CD06 v11 MOS04 0299 CD1A FONT MOS04 0281 CD06 v11 MOS04 0300 CD1A ; MOS04 0281 CD06 v11 MOS04 0301 CD1A ; implode font MOS04 0281 CD06 v11 MOS04 0302 CD1A ; MOS04 0281 CD06 v11 MOS04 0303 CD1A A9 0F LDAIM &0F ;Fonts 1,2,3 hard (set 0). MSb not used MOS04 0281 CD06 v11 MOS04 0304 CD1C 8D 67 03 STA FNTFLG MOS04 0281 CD06 v11 MOS04 0305 CD1F ; MOS04 0281 CD06 v11 MOS04 0306 CD1F A9 0C LDAIM SFPAGE MOS04 0281 CD06 v11 MOS04 0307 CD21 A0 06 LDYIM &06 ;Set Fonts 1 to 7 to page SFPAGE MOS04 0281 CD06 v11 MOS04 0308 CD23 99 68 03 FIMPA STAAY PGSFNT MOS04 0281 CD06 v11 MOS04 0309 CD26 88 DEY MOS04 0281 CD06 v11 MOS04 0310 CD27 10 FA BPL FIMPA MOS04 0281 CD06 v11 MOS04 0311 CD29 ; MOS04 0281 CD06 v11 MOS04 0312 CD29 ; test operation type MOS04 0281 CD06 v11 MOS04 0313 CD29 ; MOS04 0281 CD06 v11 MOS04 0314 CD29 ; force X in range MOS04 0281 CD06 v11 MOS04 0315 CD29 E0 07 CPXIM &07 MOS04 0281 CD06 v11 MOS04 0316 CD2B 90 02 BCC FONTOK ;[X <= 6] MOS04 0281 CD06 v11 MOS04 0317 CD2D A2 06 LDXIM &06 MOS04 0281 CD06 v11 MOS04 0318 CD2F FONTOK ;0 <= X <= 6 MOS04 0281 CD06 v11 MOS04 0319 CD2F 8E 46 02 STX FONTSW ;record font state MOS04 0281 CD06 v11 MOS04 0320 CD32 ; MOS04 0281 CD06 v11 MOS04 0321 CD32 AD 43 02 LDA IHWM MOS04 0281 CD06 v11 MOS04 0322 CD35 ; MOS04 0281 CD06 v11 MOS04 0323 CD35 ; explode fonts that lie within extension pages MOS04 0281 CD06 v11 MOS04 0324 CD35 ; MOS04 0281 CD06 v11 MOS04 0325 CD35 A2 00 LDXIM &00 MOS04 0281 CD06 v11 MOS04 0326 CD37 FEXPA MOS04 0281 CD06 v11 MOS04 0327 CD37 EC 46 02 CPX FONTSW MOS04 0281 CD06 v11 MOS04 0328 CD3A B0 0B BCS FEXPA0 MOS04 0281 CD06 v11 MOS04 0329 CD3C ; C=0 MOS04 0281 CD06 v11 MOS04 0330 CD3C BC BA C4 LDYAX FFSZOT MOS04 0281 CD06 v11 MOS04 0331 CD3F 99 68 03 STAAY PGSFNT MOS04 0281 CD06 v11 MOS04 0332 CD42 ; C=0 MOS04 0281 CD06 v11 MOS04 0333 CD42 69 01 ADCIM &01 MOS04 0281 CD06 v11 MOS04 0334 CD44 E8 INX MOS04 0281 CD06 v11 MOS04 0335 CD45 D0 F0 BNE FEXPA ;[ALWAYS jump] MOS04 0281 CD06 v11 MOS04 0336 CD47 FEXPA0 MOS04 0281 CD06 v11 MOS04 0337 CD47 ; MOS04 0281 CD06 v11 MOS04 0338 CD47 ;X = FONTSW MOS04 0281 CD06 v11 MOS04 0339 CD47 8D 44 02 STA HWM MOS04 0281 CD06 v11 MOS04 0340 CD4A ; MOS04 0281 CD06 v11 MOS04 0341 CD4A A8 TAY MOS04 0281 CD06 v11 MOS04 0342 CD4B F0 CC BEQ FONT0 MOS04 0281 CD06 v11 MOS04 0343 CD4D A2 11 LDXIM SVHWMC MOS04 0281 CD06 v11 MOS04 0344 CD4F 4C 75 F1 JMP SVOP MOS04 0281 CD06 v11 MOS04 0345 CD52 MOS04 0281 CD06 v11 MOS04 0346 CD52 MOS04 0281 CD06 v11 MOS04 0347 CD52 LNK MOS05 MOS04 0281 CD06 v11 MOS05 0001 CD52 MOS04 0281 CD06 v11 MOS05 0002 CD52 TTL VDU File - MOS05 MOS04 0281 CD06 v11 MOS05 0003 CD52 OPT MOS05 MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 24 MOS05 VDU File - MOS05 MOS05 MOS04 0281 CD06 v11 MOS05 0004 CD52 ; MOS04 0281 CD06 v11 MOS05 0005 CD52 ;Last update 05/05/82 MOS04 0281 CD06 v11 MOS05 0006 CD52 MOS04 0281 CD06 v11 MOS05 0007 CD52 ;05/05/82 RSAN corrected MOS04 0281 CD06 v11 MOS05 0008 CD52 ;05/05/82 TADDRY changed to allow for only 1 table MOS04 0281 CD06 v11 MOS05 0009 CD52 ;01/05/82 Recoded using new variable order & manifests MOS04 0281 CD06 v11 MOS05 0010 CD52 ;01/05/82 Recode for new order of variables MOS04 0281 CD06 v11 MOS05 0011 CD52 ;22/04/82 Encode ADDSCN & SUBSCN MOS04 0281 CD06 v11 MOS05 0012 CD52 ;19/04/82 Comments added plus small byte squash MOS04 0281 CD06 v11 MOS05 0013 CD52 ;25/03/82 Change all refs. to BEGSCN+1 to BEGSCN MOS04 0281 CD06 v11 MOS05 0014 CD52 MOS04 0281 CD06 v11 MOS05 0015 CD52 ;Account for scroll disabling if needs be MOS04 0281 CD06 v11 MOS05 0016 CD52 ;Requires c=1 if scroll DOWN (cursor up) & vice versa MOS04 0281 CD06 v11 MOS05 0017 CD52 ;If scroll enabled (b1 of STATS =0) adjusts PCSY unless on a margin MOS04 0281 CD06 v11 MOS05 0018 CD52 ;If scroll disabled, wraps cursor, pulls return address from stack MOS04 0281 CD06 v11 MOS05 0019 CD52 ;and jumps to CSDA. MOS04 0281 CD06 v11 MOS05 0020 CD52 MOS04 0281 CD06 v11 MOS05 0021 CD52 A9 02 ENSCRL LDAIM &02 ;Is scroll disabled ? MOS04 0281 CD06 v11 MOS05 0022 CD54 24 D0 BIT STATS MOS04 0281 CD06 v11 MOS05 0023 CD56 D0 02 BNE ENSCRM ;Yes?, then skip MOS04 0281 CD06 v11 MOS05 0024 CD58 50 30 BVC ENSCRR ;Or is CE set ? MOS04 0281 CD06 v11 MOS05 0025 CD5A AD 09 03 ENSCRM LDA TWBROW ;Assume scroll up (so go to bottom row) MOS04 0281 CD06 v11 MOS05 0026 CD5D 90 03 BCC ENSCRN ;Unless c=1 MOS04 0281 CD06 v11 MOS05 0027 CD5F AD 0B 03 LDA TWTROW ;Whence scroll DOWN (& go to top row) MOS04 0281 CD06 v11 MOS05 0028 CD62 70 08 ENSCRN BVS ENSCRO ;If OUTPUT cursor, skip MOS04 0281 CD06 v11 MOS05 0029 CD64 8D 19 03 STA CSY ;(this assumes windows are rectangular!) MOS04 0281 CD06 v11 MOS05 0030 CD67 68 PLA ;Cheat return stack MOS04 0281 CD06 v11 MOS05 0031 CD68 68 PLA MOS04 0281 CD06 v11 MOS05 0032 CD69 4C ED C6 JMP CSDA MOS04 0281 CD06 v11 MOS05 0033 CD6C [ MOS125 = &FF MOS04 0281 CD06 v11 MOS05 0040 CD6C | MOS04 0281 CD06 v11 MOS05 0041 CD6C ENSCRO ;preserve carry MOS04 0281 CD06 v11 MOS05 0042 CD6C 4D 65 03 EOR PCSY ;Would the input cursor like to go off screen ? MOS04 0281 CD06 v11 MOS05 0043 CD6F F0 19 BEQ ENSCRR ;Yes?, then don't readdress it MOS04 0281 CD06 v11 MOS05 0044 CD71 90 04 BCC ENSCRQ MOS04 0281 CD06 v11 MOS05 0045 CD73 CE 65 03 DEC PCSY ;Scroll DOWN, so follow it down MOS04 0281 CD06 v11 MOS05 0046 CD76 ] MOS04 0281 CD06 v11 MOS05 0047 CD76 60 ENSCRX RTS ;May be referenced from MOS04 MOS05 0024 CD58 v4F MOS05 0048 CD77 EE 65 03 ENSCRQ INC PCSY ;Scroll UP, so go up as well MOS05 0024 CD58 v4F MOS05 0049 CD7A 60 RTS MOS05 0024 CD58 v4F MOS05 0050 CD7B MOS05 0024 CD58 v4F MOS05 0051 CD7B ;OCSRDL Delete output cursor MOS05 0024 CD58 v4F MOS05 0052 CD7B MOS05 0024 CD58 v4F MOS05 0053 CD7B 08 OCSRDL PHP MOS05 0024 CD58 v4F MOS05 0054 CD7C 48 PHA MOS05 0024 CD58 v4F MOS05 0055 CD7D AC 4F 03 LDY BYTCH MOS05 0024 CD58 v4F MOS05 0056 CD80 88 DEY ;TTX? MOS05 0024 CD58 v4F MOS05 0057 CD81 D0 0A BNE OCSRIV ;Not TTX?, then same as writing cursor, as it inverts MOS05 0024 CD58 v4F MOS05 0058 CD83 AD 38 03 LDA TTXTMP ;TTX?, then write remebered byte MOS05 0024 CD58 v4F MOS05 0059 CD86 91 D8 STAIY ZMEMT ;(Y)=0 MOS05 0024 CD58 v4F MOS05 0060 CD88 68 OCSREX PLA ;& exit MOS05 0024 CD58 v4F MOS05 0061 CD89 28 ENSCRP PLP ;Get the stack correct MOS05 0024 CD58 v4F MOS05 0062 CD8A 60 ENSCRR RTS MOS05 0107 CDAC ^5A MOS05 0063 CD8B MOS05 0107 CDAC ^5A MOS05 0064 CD8B ;OCSRWR Write output cursor MOS05 0107 CDAC ^5A MOS05 0065 CD8B MOS05 0107 CDAC ^5A MOS05 0066 CD8B [ MOS125 = &FF MOS05 0107 CDAC ^5A MOS05 0088 CD8B | MOS05 0107 CDAC ^5A MOS05 0089 CD8B 08 OCSRWR PHP MOS05 0107 CDAC ^5A MOS05 0090 CD8C 48 PHA MOS05 0107 CDAC ^5A MOS05 0091 CD8D A9 3F OCSRIV LDAIM INVSXT MOS05 0107 CDAC ^5A MOS05 0092 CD8F AC 4F 03 LDY BYTCH MOS05 0107 CDAC ^5A MOS05 0093 CD92 C0 20 CPYIM &20 ;Mode 2 ? MOS05 0107 CDAC ^5A MOS05 0094 CD94 F0 13 BEQ OCSRIW ;Yes?, then don't invert the flashing bit MOS05 0107 CDAC ^5A MOS05 0095 CD96 A9 FF LDAIM &FF MOS05 0107 CDAC ^5A MOS05 0096 CD98 88 DEY ;TTX? MOS05 0107 CDAC ^5A MOS05 0097 CD99 D0 08 BNE OCSRIU MOS05 0107 CDAC ^5A MOS05 0098 CD9B B1 D8 LDAIY ZMEMT ;(Y)=0 Yes?, then read byte directly from screen MOS05 0107 CDAC ^5A MOS05 0099 CD9D 8D 38 03 STA TTXTMP ;and store it out of harm's way (no plotting in this mode) MOS05 0107 CDAC ^5A MOS05 0100 CDA0 4D 66 03 EOR CHCSR ;Write the cursor MOS05 0107 CDAC ^5A MOS05 0101 CDA3 48 OCSRIU PHA MOS05 0107 CDAC ^5A MOS05 0102 CDA4 51 D8 EORIY ZMEMT ;Invert the character cell MOS05 0107 CDAC ^5A MOS05 0103 CDA6 91 D8 STAIY ZMEMT MOS05 0107 CDAC ^5A MOS05 0104 CDA8 68 PLA MOS05 0107 CDAC ^5A MOS05 0105 CDA9 88 OCSRIW DEY MOS05 0107 CDAC ^5A MOS05 0106 CDAA 10 F7 BPL OCSRIU MOS05 0107 CDAC ^5A MOS05 0107 CDAC 30 DA BMI OCSREX ; Branch always -- MOS05 0108 CDAE -- MOS05 0109 CDAE ;(SORTY exits with (X)<(Y)) -- MOS05 0110 CDAE -- MOS05 0111 CDAE A2 20 SORTA LDXIM NEWPT-V -- MOS05 0112 CDB0 A0 14 LDYIM OLDCS-V -- MOS05 0113 CDB2 BD 02 03 SORTY LDAAX V+&02 -- MOS05 0114 CDB5 D9 02 03 CMPAY V+&02 -- MOS05 0115 CDB8 BD 03 03 LDAAX V+&03 -- MOS05 0116 CDBB F9 03 03 SBCAY V+&03 -- MOS05 0117 CDBE 10 42 BPL SWAPF MOS05 0117 CDBE v3D MOS05 0118 CDC0 60 RTS MOS05 0117 CDBE v3D MOS05 0119 CDC1 ] MOS05 0117 CDBE v3D MOS05 0120 CDC1 MOS05 0117 CDBE v3D MOS05 0121 CDC1 ;Soft scrolling (non-anom.) MOS05 0117 CDBE v3D MOS05 0122 CDC1 MOS05 0117 CDBE v3D MOS05 0123 CDC1 ;Scroll DOWN MOS05 0117 CDBE v3D MOS05 0124 CDC1 MOS05 0117 CDBE v3D MOS05 0125 CDC1 20 76 CE SSCRDN JSR SSCRIN ;Initialise MOS05 0117 CDBE v3D MOS05 0126 CDC4 AD 09 03 LDA TWBROW ;1st receive address is bottom LH point MOS05 0117 CDBE v3D MOS05 0127 CDC7 8D 19 03 STA CSY ;(CSX initialised in SSCRIN) MOS05 0117 CDBE v3D MOS05 0128 CDCA 20 24 CF JSR TADDRY ;address bottom LH point (guaranteed in window) MOS05 0117 CDBE v3D MOS05 0129 CDCD 20 0B CD SSCRDA JSR SUBROW ;Get the address of the LH point of the next line up MOS05 0117 CDBE v3D MOS05 0130 CDD0 B0 03 BCS SSCRDB ;Wraparound between these two lines? NO, then continue MOS05 0117 CDBE v3D MOS05 0131 CDD2 6D 54 03 ADC BYTSCN ;Yes,then add screen and note we must scroll slowly! MOS05 0117 CDBE v3D MOS05 0132 CDD5 85 DB SSCRDB STA ZTEMP +&01 ;store transmit address MOS05 0117 CDBE v3D MOS05 0133 CDD7 86 DA STX ZTEMP MOS05 0117 CDBE v3D MOS05 0134 CDD9 85 DC STA ZTEMPB ;& MSB of next receive address (LSB is not changed) MOS05 0117 CDBE v3D MOS05 0135 CDDB [ MOS125 = &FF MOS05 0117 CDBE v3D MOS05 0142 CDDB | MOS05 0117 CDBE v3D MOS05 0143 CDDB 90 0A BCC SSCRDC ;c unchanged since just after SSCRDA MOS05 0117 CDBE v3D MOS05 0144 CDDD 20 0B CD SSCRDE JSR SUBROW ;Get next line up MOS05 0117 CDBE v3D MOS05 0145 CDE0 90 05 BCC SSCRDC ;Wraparound occured ?, then slow scroll to be safe MOS05 0117 CDBE v3D MOS05 0146 CDE2 20 53 CE JSR XMIT ;Scroll fast is possible MOS05 0117 CDBE v3D MOS05 0147 CDE5 F0 03 BEQ SSCRDD ;xmit returns EQ MOS05 0117 CDBE v3D MOS05 0148 CDE7 20 8E CE SSCRDC JSR SSCRS ;Scroll slowly ! MOS05 0117 CDBE v3D MOS05 0149 CDEA ] MOS05 0117 CDBE v3D MOS05 0150 CDEA A5 DC SSCRDD LDA ZTEMPB ;MSB of next receive address MOS05 0117 CDBE v3D MOS05 0151 CDEC A6 DA LDX ZTEMP ;LSB of same MOS05 0117 CDBE v3D MOS05 0152 CDEE 85 D9 STA ZMEMT +&01 ;Initialise next receive address MOS05 0117 CDBE v3D MOS05 0153 CDF0 86 D8 STX ZMEMT MOS05 0117 CDBE v3D MOS05 0154 CDF2 C6 DE DEC ZTEMPC ;Any more lines to copy ? MOS05 0117 CDBE v3D MOS05 0155 CDF4 D0 D7 BNE SSCRDA ;Don't bother to copy last line MOS05 0117 CDBE v3D MOS05 0156 CDF6 A2 28 SSCREX LDXIM SSWS-V ;Preserve or restore current text cursor MOS05 0217 CE51 ^23 MOS05 0157 CDF8 A0 18 LDYIM CSX-V MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 25 MOS05 VDU File - MOS05 MOS05 MOS05 0217 CE51 ^23 MOS05 0158 CDFA A9 02 SWAP2 LDAIM &02 MOS05 0217 CE51 ^23 MOS05 0159 CDFC D0 06 BNE SWAP MOS05 0217 CE51 ^23 MOS05 0160 CDFE A2 24 SWAPB LDXIM GCSIR-V ;SPLOTY requires c preserved MOS05 0217 CE51 ^23 MOS05 0161 CE00 A0 14 SWAPC LDYIM OLDCS-V MOS05 0217 CE51 ^23 MOS05 0162 CE02 MOS05 0217 CE51 ^23 MOS05 0163 CE02 ;SWAPF swaps 4 bytes between (V)+(X) & (V)+(Y) MOS05 0217 CE51 ^23 MOS05 0164 CE02 MOS05 0217 CE51 ^23 MOS05 0165 CE02 A9 04 SWAPF LDAIM &04 ;by falling through to ... MOS05 0217 CE51 ^23 MOS05 0166 CE04 MOS05 0217 CE51 ^23 MOS05 0167 CE04 ;SWAP swaps (A) bytes between (V)+(X) & (V)+(Y) MOS05 0217 CE51 ^23 MOS05 0168 CE04 MOS05 0217 CE51 ^23 MOS05 0169 CE04 85 DA SWAP STA ZTEMP MOS05 0217 CE51 ^23 MOS05 0170 CE06 BD 00 03 SWAPA LDAAX V MOS05 0217 CE51 ^23 MOS05 0171 CE09 48 PHA MOS05 0217 CE51 ^23 MOS05 0172 CE0A B9 00 03 LDAAY V MOS05 0217 CE51 ^23 MOS05 0173 CE0D 9D 00 03 STAAX V MOS05 0217 CE51 ^23 MOS05 0174 CE10 68 PLA MOS05 0217 CE51 ^23 MOS05 0175 CE11 99 00 03 STAAY V MOS05 0217 CE51 ^23 MOS05 0176 CE14 E8 INX MOS05 0217 CE51 ^23 MOS05 0177 CE15 C8 INY MOS05 0217 CE51 ^23 MOS05 0178 CE16 C6 DA DEC ZTEMP MOS05 0217 CE51 ^23 MOS05 0179 CE18 D0 EC BNE SWAPA MOS05 0217 CE51 ^23 MOS05 0180 CE1A 60 RTS MOS05 0217 CE51 ^23 MOS05 0181 CE1B MOS05 0217 CE51 ^23 MOS05 0182 CE1B MOS05 0217 CE51 ^23 MOS05 0183 CE1B ;Soft scroll UP MOS05 0217 CE51 ^23 MOS05 0184 CE1B MOS05 0217 CE51 ^23 MOS05 0185 CE1B 20 76 CE SSCRUP JSR SSCRIN ;Initialise MOS05 0217 CE51 ^23 MOS05 0186 CE1E AC 0B 03 LDY TWTROW ;Receive from top line, LH column MOS05 0217 CE51 ^23 MOS05 0187 CE21 8C 19 03 STY CSY MOS05 0217 CE51 ^23 MOS05 0188 CE24 20 24 CF JSR TADDRY ;Get 1st receive address (point guaranteed in window) MOS05 0217 CE51 ^23 MOS05 0189 CE27 20 E8 CA SSCRUA JSR ADDROW ;Get line below MOS05 0217 CE51 ^23 MOS05 0190 CE2A 10 04 BPL SSCRUE ;Wraparound ? MOS05 0217 CE51 ^23 MOS05 0191 CE2C 38 SEC ;Yes, then correct and scroll slowly MOS05 0217 CE51 ^23 MOS05 0192 CE2D ED 54 03 SBC BYTSCN MOS05 0217 CE51 ^23 MOS05 0193 CE30 85 DB SSCRUE STA ZTEMP +&01 ;Transmit address MOS05 0217 CE51 ^23 MOS05 0194 CE32 86 DA STX ZTEMP MOS05 0217 CE51 ^23 MOS05 0195 CE34 85 DC STA ZTEMPB ;MSB of next receive addr., LSB is preserved MOS05 0217 CE51 ^23 MOS05 0196 CE36 [ MOS125 = &FF MOS05 0217 CE51 ^23 MOS05 0203 CE36 | MOS05 0217 CE51 ^23 MOS05 0204 CE36 B0 0A BCS SSCRUC ;(c unchanged since just after SSCRUA) MOS05 0217 CE51 ^23 MOS05 0205 CE38 20 E8 CA SSCRUB JSR ADDROW ;Get next line down MOS05 0217 CE51 ^23 MOS05 0206 CE3B 30 05 BMI SSCRUC ;Wraparound ?, then scroll slowly to be safe MOS05 0217 CE51 ^23 MOS05 0207 CE3D 20 53 CE JSR XMIT ;No?, then we can scroll fast MOS05 0217 CE51 ^23 MOS05 0208 CE40 F0 03 BEQ SSCRUD ;xmit returns EQ MOS05 0217 CE51 ^23 MOS05 0209 CE42 20 8E CE SSCRUC JSR SSCRS ;Scroll slowly MOS05 0217 CE51 ^23 MOS05 0210 CE45 ] MOS05 0217 CE51 ^23 MOS05 0211 CE45 A5 DC SSCRUD LDA ZTEMPB ;Load next receive address MOS05 0217 CE51 ^23 MOS05 0212 CE47 A6 DA LDX ZTEMP MOS05 0217 CE51 ^23 MOS05 0213 CE49 85 D9 STA ZMEMT +&01 ;and store it MOS05 0217 CE51 ^23 MOS05 0214 CE4B 86 D8 STX ZMEMT MOS05 0217 CE51 ^23 MOS05 0215 CE4D C6 DE DEC ZTEMPC ;any more lines to copy ? MOS05 0217 CE51 ^23 MOS05 0216 CE4F D0 D6 BNE SSCRUA ;don't bother with the last line MOS05 0217 CE51 ^23 MOS05 0217 CE51 F0 A3 BEQ SSCREX ; Jump always -- MOS05 0218 CE53 -- MOS05 0219 CE53 ;XMIT - Fast soft scroll -- MOS05 0220 CE53 ;Copy PWWDTH bytes from (ZTEMP) to (ZMEMT) -- MOS05 0221 CE53 -- MOS05 0222 CE53 AE 4D 03 XMIT LDX PWWDTH +&01 ;How many pages? -- MOS05 0223 CE56 F0 10 BEQ XMITB ;None?, then attempt fractional MOS05 0223 CE56 v6F MOS05 0224 CE58 A0 00 LDYIM &00 MOS05 0223 CE56 v6F MOS05 0225 CE5A B1 DA XMITA LDAIY ZTEMP ;Inner loop - copy complete page MOS05 0223 CE56 v6F MOS05 0226 CE5C 91 D8 STAIY ZMEMT MOS05 0223 CE56 v6F MOS05 0227 CE5E C8 INY MOS05 0223 CE56 v6F MOS05 0228 CE5F D0 F9 BNE XMITA MOS05 0223 CE56 v6F MOS05 0229 CE61 E6 D9 INC ZMEMT +&01 ;Prepare to copy next page MOS05 0223 CE56 v6F MOS05 0230 CE63 E6 DB INC ZTEMP +&01 MOS05 0223 CE56 v6F MOS05 0231 CE65 CA DEX ;Any more complete pages to copy ? MOS05 0223 CE56 v6F MOS05 0232 CE66 D0 F2 BNE XMITA MOS05 0223 CE56 v6F MOS05 0233 CE68 AC 4C 03 XMITB LDY PWWDTH ;Copy fractional page? -- MOS05 0234 CE6B F0 08 BEQ XMITD ;No?, then exit MOS05 0234 CE6B v77 MOS05 0235 CE6D 88 XMITC DEY MOS05 0234 CE6B v77 MOS05 0236 CE6E B1 DA LDAIY ZTEMP ;Yes?, then do so MOS05 0234 CE6B v77 MOS05 0237 CE70 91 D8 STAIY ZMEMT MOS05 0234 CE6B v77 MOS05 0238 CE72 98 TYA MOS05 0234 CE6B v77 MOS05 0239 CE73 D0 F8 BNE XMITC MOS05 0234 CE6B v77 MOS05 0240 CE75 60 XMITD RTS ;Referenced below -- MOS05 0241 CE76 -- MOS05 0242 CE76 ;SSCRIN Soft scroll initialisation -- MOS05 0243 CE76 -- MOS05 0244 CE76 ;(SSWS) := (CSX)(CSY) -- MOS05 0245 CE76 ;(CSX) := (TWLCOL) -- MOS05 0246 CE76 ;(ZTEMPC) := No. of rows to scroll, minus one -- MOS05 0247 CE76 -- MOS05 0248 CE76 20 F6 CD SSCRIN JSR SSCREX ;Store current text cursor for future reference -- MOS05 0249 CE79 38 SEC ;Determine no. of rows to scroll -- MOS05 0250 CE7A AD 09 03 LDA TWBROW ;i.e. no. rows in window minus 1 -- MOS05 0251 CE7D ED 0B 03 SBC TWTROW -- MOS05 0252 CE80 85 DE STA ZTEMPC -- MOS05 0253 CE82 D0 05 BNE SSCRIM MOS05 0253 CE82 v7A MOS05 0254 CE84 68 PLA ;If zero lines to scroll, then cheat stack MOS05 0253 CE82 v7A MOS05 0255 CE85 68 PLA MOS05 0253 CE82 v7A MOS05 0256 CE86 4C F6 CD JMP SSCREX ;& restore cursor MOS05 0253 CE82 v7A MOS05 0257 CE89 MOS05 0253 CE82 v7A MOS05 0258 CE89 AD 08 03 SSCRIM LDA TWLCOL ;Put x cursor on LH margin -- MOS05 0259 CE8C 10 70 BPL CLTLND MOS05 0259 CE8C v0F MOS05 0260 CE8E MOS05 0259 CE8C v0F MOS05 0261 CE8E MOS05 0259 CE8C v0F MOS05 0262 CE8E ;SSCRS Slow soft scroll MOS05 0259 CE8C v0F MOS05 0263 CE8E ;Scrolls 1 row of characters, one by one from (ZTEMP) to (ZMEMT), MOS05 0259 CE8C v0F MOS05 0264 CE8E ;preserving the LSB of ZTEMP. MOS05 0259 CE8C v0F MOS05 0265 CE8E ;Requires that ZMEMT & ZTEMP be juxtaposed. MOS05 0259 CE8C v0F MOS05 0266 CE8E ;Checks for wraparound after each character is copied MOS05 0259 CE8C v0F MOS05 0267 CE8E MOS05 0259 CE8C v0F MOS05 0268 CE8E A5 DA SSCRS LDA ZTEMP ;Push LSB of ZTEMP MOS05 0259 CE8C v0F MOS05 0269 CE90 48 PHA MOS05 0259 CE8C v0F MOS05 0270 CE91 38 SEC ;Calc no. chars to copy -1 MOS05 0259 CE8C v0F MOS05 0271 CE92 AD 0A 03 LDA TWRCOL MOS05 0259 CE8C v0F MOS05 0272 CE95 ED 08 03 SBC TWLCOL MOS05 0259 CE8C v0F MOS05 0273 CE98 85 DF STA ZTEMPC +&01 ;No. of columns to be scrolled (for loop) MOS05 0259 CE8C v0F MOS05 0274 CE9A AC 4F 03 SSCRSA LDY BYTCH MOS05 0259 CE8C v0F MOS05 0275 CE9D 88 DEY MOS05 0259 CE8C v0F MOS05 0276 CE9E B1 DA SSCRSB LDAIY ZTEMP ;~~~ Copy 1 character ~~~ MOS05 0259 CE8C v0F MOS05 0277 CEA0 91 D8 STAIY ZMEMT ;by copying (BYTCH) consecutive bytes MOS05 0259 CE8C v0F MOS05 0278 CEA2 88 DEY MOS05 0259 CE8C v0F MOS05 0279 CEA3 10 F9 BPL SSCRSB MOS05 0259 CE8C v0F MOS05 0280 CEA5 A2 02 LDXIM &02 ;Now add BYTCH to ZMEMT & ZTEMP, MOS05 0259 CE8C v0F MOS05 0281 CEA7 18 SSCRSC CLC ;checking for wraparound on both MOS05 0259 CE8C v0F MOS05 0282 CEA8 B5 D8 LDAZX ZMEMT ;uses ZX mode, hence need for ZMEMT to be next to ZTEMP MOS05 0259 CE8C v0F MOS05 0283 CEAA 6D 4F 03 ADC BYTCH MOS05 0259 CE8C v0F MOS05 0284 CEAD 95 D8 STAZX ZMEMT MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 26 MOS05 VDU File - MOS05 MOS05 MOS05 0259 CE8C v0F MOS05 0285 CEAF B5 D9 LDAZX ZMEMT +&01 MOS05 0259 CE8C v0F MOS05 0286 CEB1 69 00 ADCIM &00 MOS05 0259 CE8C v0F MOS05 0287 CEB3 10 04 BPL SSCRSD ;Did wraparound occur? MOS05 0259 CE8C v0F MOS05 0288 CEB5 38 SEC MOS05 0259 CE8C v0F MOS05 0289 CEB6 ED 54 03 SBC BYTSCN MOS05 0259 CE8C v0F MOS05 0290 CEB9 95 D9 SSCRSD STAZX ZMEMT +&01 MOS05 0259 CE8C v0F MOS05 0291 CEBB CA DEX MOS05 0259 CE8C v0F MOS05 0292 CEBC CA DEX MOS05 0259 CE8C v0F MOS05 0293 CEBD F0 E8 BEQ SSCRSC ;(Do ZMEMT) MOS05 0259 CE8C v0F MOS05 0294 CEBF C6 DF DEC ZTEMPC +&01 ;Any more characters? MOS05 0259 CE8C v0F MOS05 0295 CEC1 10 D7 BPL SSCRSA MOS05 0259 CE8C v0F MOS05 0296 CEC3 68 PLA ;Restore LSB of ZMEMT MOS05 0259 CE8C v0F MOS05 0297 CEC4 85 DA STA ZTEMP MOS05 0259 CE8C v0F MOS05 0298 CEC6 60 RTS MOS05 0259 CE8C v0F MOS05 0299 CEC7 MOS05 0259 CE8C v0F MOS05 0300 CEC7 ;Clear the line of text addressed by CSY MOS05 0259 CE8C v0F MOS05 0301 CEC7 ;Preserve CSY & CSX MOS05 0259 CE8C v0F MOS05 0302 CEC7 MOS05 0259 CE8C v0F MOS05 0303 CEC7 AD 18 03 CLTLIN LDA CSX ;Push the current X cursor position MOS05 0259 CE8C v0F MOS05 0304 CECA 48 PHA MOS05 0259 CE8C v0F MOS05 0305 CECB 20 89 CE JSR SSCRIM ;CSX = Left margin of window MOS05 0259 CE8C v0F MOS05 0306 CECE 20 24 CF JSR TADDRY ;Init. ZMEMT MOS05 0259 CE8C v0F MOS05 0307 CED1 38 SEC MOS05 0259 CE8C v0F MOS05 0308 CED2 AD 0A 03 LDA TWRCOL MOS05 0259 CE8C v0F MOS05 0309 CED5 ED 08 03 SBC TWLCOL MOS05 0259 CE8C v0F MOS05 0310 CED8 85 DC STA ZTEMPB ;Column count MOS05 0259 CE8C v0F MOS05 0311 CEDA AD 58 03 CLTLNA LDA BTCOLF ;get colour MOS05 0259 CE8C v0F MOS05 0312 CEDD AC 4F 03 LDY BYTCH ;Bytes / character MOS05 0259 CE8C v0F MOS05 0313 CEE0 88 CLTNB DEY ;Inner loop - clear one character cell MOS05 0259 CE8C v0F MOS05 0314 CEE1 91 D8 STAIY ZMEMT ;(preserves z from previous DEY) MOS05 0259 CE8C v0F MOS05 0315 CEE3 D0 FB BNE CLTNB ;1 char cell MOS05 0259 CE8C v0F MOS05 0316 CEE5 8A TXA ;Update ZMEMT MOS05 0259 CE8C v0F MOS05 0317 CEE6 18 CLC MOS05 0259 CE8C v0F MOS05 0318 CEE7 6D 4F 03 ADC BYTCH MOS05 0259 CE8C v0F MOS05 0319 CEEA AA TAX MOS05 0259 CE8C v0F MOS05 0320 CEEB A5 D9 LDA ZMEMT +&01 MOS05 0259 CE8C v0F MOS05 0321 CEED 69 00 ADCIM &00 MOS05 0259 CE8C v0F MOS05 0322 CEEF 10 04 BPL CLNLC ;Wraparound ? MOS05 0259 CE8C v0F MOS05 0323 CEF1 38 SEC ;Yes, then subtract off the number of bytes per screen MOS05 0259 CE8C v0F MOS05 0324 CEF2 ED 54 03 SBC BYTSCN MOS05 0259 CE8C v0F MOS05 0325 CEF5 86 D8 CLNLC STX ZMEMT MOS05 0259 CE8C v0F MOS05 0326 CEF7 85 D9 STA ZMEMT +&01 MOS05 0259 CE8C v0F MOS05 0327 CEF9 C6 DC DEC ZTEMPB ;One less character to clear MOS05 0259 CE8C v0F MOS05 0328 CEFB 10 DD BPL CLTLNA ;Any more? MOS05 0259 CE8C v0F MOS05 0329 CEFD 68 PLA MOS05 0259 CE8C v0F MOS05 0330 CEFE 8D 18 03 CLTLND STA CSX -- MOS05 0331 CF01 38 FAIL SEC MOS05 0369 CF22 ^5D MOS05 0332 CF02 60 RTS MOS05 0369 CF22 ^5D MOS05 0333 CF03 MOS05 0369 CF22 ^5D MOS05 0334 CF03 MOS05 0369 CF22 ^5D MOS05 0335 CF03 ;Addresses CSX,CSY to memory locn. on screen. MOS05 0369 CF22 ^5D MOS05 0336 CF03 ;Checks that CSX & CSY are in window MOS05 0369 CF22 ^5D MOS05 0337 CF03 ;Returns with no action and c=1 if outside. MOS05 0369 CF22 ^5D MOS05 0338 CF03 ;If OK, initialises ZMEMT and CSPOSN MOS05 0369 CF22 ^5D MOS05 0339 CF03 ;Exits with cursor address in (AX) MOS05 0369 CF22 ^5D MOS05 0340 CF03 ;For cursor display, follow immediately with MOS05 0369 CF22 ^5D MOS05 0341 CF03 ;JSR CSDSP MOS05 0369 CF22 ^5D MOS05 0342 CF03 MOS05 0369 CF22 ^5D MOS05 0343 CF03 [ MOS125 = &FF MOS05 0369 CF22 ^5D MOS05 0356 CF03 | MOS05 0369 CF22 ^5D MOS05 0357 CF03 8D 19 03 SYTADD STA CSY MOS05 0369 CF22 ^5D MOS05 0358 CF06 AE 18 03 TADDR LDX CSX ;Check window of CSX MOS05 0369 CF22 ^5D MOS05 0359 CF09 EC 08 03 CPX TWLCOL ;Lower than LH margin ? MOS05 0369 CF22 ^5D MOS05 0360 CF0C 90 F3 BCC FAIL MOS05 0369 CF22 ^5D MOS05 0361 CF0E EC 0A 03 CPX TWRCOL ;Higher than RH edge ? MOS05 0369 CF22 ^5D MOS05 0362 CF11 90 02 BCC TADDRX MOS05 0369 CF22 ^5D MOS05 0363 CF13 D0 EC BNE FAIL MOS05 0369 CF22 ^5D MOS05 0364 CF15 AE 19 03 TADDRX LDX CSY ;Check CSY MOS05 0369 CF22 ^5D MOS05 0365 CF18 EC 0B 03 CPX TWTROW MOS05 0369 CF22 ^5D MOS05 0366 CF1B 90 E4 BCC FAIL MOS05 0369 CF22 ^5D MOS05 0367 CF1D EC 09 03 CPX TWBROW MOS05 0369 CF22 ^5D MOS05 0368 CF20 90 02 BCC TADDRY MOS05 0369 CF22 ^5D MOS05 0369 CF22 D0 DD BNE FAIL MOS05 0368 CF20 v7D MOS05 0370 CF24 ] MOS05 0368 CF20 v7D MOS05 0371 CF24 MOS05 0368 CF20 v7D MOS05 0372 CF24 ;End of windowing, now calc. memory posn. MOS05 0368 CF20 v7D MOS05 0373 CF24 ;As TADDR with no bounds checking MOS05 0368 CF20 v7D MOS05 0374 CF24 ;Returns carry clear MOS05 0368 CF20 v7D MOS05 0375 CF24 MOS05 0368 CF20 v7D MOS05 0376 CF24 AD 19 03 TADDRY LDA CSY ;Twice row no. to Y -- MOS05 0377 CF27 0A ASLA -- MOS05 0378 CF28 A8 TAY ;(c=0 at this point) -- MOS05 0379 CF29 B1 E0 LDAIY ZTBL ;MSB -- MOS05 0380 CF2B 85 D9 STA ZMEMT+&01 -- MOS05 0381 CF2D C8 INY -- MOS05 0382 CF2E A9 02 LDAIM &02 -- MOS05 0383 CF30 2D 56 03 AND MEMODE ;Non-zero if table offset is to be halved -- MOS05 0384 CF33 [ MOS125 = &FF -- MOS05 0389 CF33 | -- MOS05 0390 CF33 C9 01 CMPIM &01 -- MOS05 0391 CF35 B1 E0 LDAIY ZTBL ;LSB -- MOS05 0392 CF37 90 03 BCC TADDRH MOS05 0392 CF37 v7C MOS05 0393 CF39 ] MOS05 0392 CF37 v7C MOS05 0394 CF39 46 D9 LSR ZMEMT+&01 MOS05 0392 CF37 v7C MOS05 0395 CF3B 6A RORA MOS05 0392 CF37 v7C MOS05 0396 CF3C 6D 50 03 TADDRH ADC TOPSCN ;c=0 Add LSB -- MOS05 0397 CF3F 85 D8 STA ZMEMT -- MOS05 0398 CF41 A5 D9 LDA ZMEMT+&01 ;Add MSB -- MOS05 0399 CF43 6D 51 03 ADC TOPSCN+&01 -- MOS05 0400 CF46 A8 TAY ;Xfr MSB to Y -- MOS05 0401 CF47 ;Mpy. CSX by BYTCH -- MOS05 0402 CF47 AD 18 03 LDA CSX -- MOS05 0403 CF4A AE 4F 03 LDX BYTCH ;Is it TTX ? -- MOS05 0404 CF4D CA DEX -- MOS05 0405 CF4E F0 12 BEQ TADDRE ;Skip mult. if TTX MOS05 0405 CF4E v6D MOS05 0406 CF50 E0 0F CPXIM &0F ;4 colour (16 bytes) ? MOS05 0405 CF4E v6D MOS05 0407 CF52 F0 03 BEQ TADDRF MOS05 0405 CF4E v6D MOS05 0408 CF54 90 02 BCC TADDRG ;Less ? Then 2 colour MOS05 0405 CF4E v6D MOS05 0409 CF56 0A ASLA ;Must have been 16 colour MOS05 0405 CF4E v6D MOS05 0410 CF57 0A TADDRF ASLA ;4 colour MOS05 0405 CF4E v6D MOS05 0411 CF58 0A TADDRG ASLA ;2 colour MOS05 0405 CF4E v6D MOS05 0412 CF59 0A ASLA MOS05 0405 CF4E v6D MOS05 0413 CF5A 90 02 BCC TADDRB MOS05 0405 CF4E v6D MOS05 0414 CF5C C8 INY ;c=1?, then inc. MSB by 2 MOS05 0405 CF4E v6D MOS05 0415 CF5D C8 INY MOS05 0405 CF4E v6D MOS05 0416 CF5E 0A TADDRB ASLA MOS05 0405 CF4E v6D MOS05 0417 CF5F 90 02 BCC TADDRC MOS05 0405 CF4E v6D MOS05 0418 CF61 C8 INY ;c=1, then inc. MSB by 1 MOS05 0405 CF4E v6D MOS05 0419 CF62 18 TADDRE CLC MOS05 0417 CF5F v7D MOS05 0420 CF63 65 D8 TADDRC ADC ZMEMT ;(c=0), add LSB of row offset -- MOS05 0421 CF65 85 D8 STA ZMEMT MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 27 MOS05 VDU File - MOS05 MOS05 -- MOS05 0422 CF67 8D 4A 03 STA CSPOSN -- MOS05 0423 CF6A AA TAX ;LSB is returned by this routine in X -- MOS05 0424 CF6B 98 TYA ;MSB to A -- MOS05 0425 CF6C 69 00 ADCIM &00 -- MOS05 0426 CF6E 8D 4B 03 STA CSPOSN +&01 ;Store to cursor before wraparound -- MOS05 0427 CF71 10 04 BPL TADDRD ;Wraparound ? MOS05 0427 CF71 v7B MOS05 0428 CF73 38 SEC ;Yes, then subt. scn. MOS05 0427 CF71 v7B MOS05 0429 CF74 ED 54 03 SBC BYTSCN MOS05 0427 CF71 v7B MOS05 0430 CF77 85 D9 TADDRD STA ZMEMT +&01 ;Store physical address to ZMEMT -- MOS05 0431 CF79 18 CLC ;indicate successful addressing -- MOS05 0432 CF7A 60 RTS -- MOS05 0433 CF7B -- MOS05 0434 CF7B ;PRINT CHARACTER TO VDU -- MOS05 0435 CF7B -- MOS05 0436 CF7B -- MOS05 0437 CF7B -- MOS05 0438 CF7B -- MOS05 0439 CF7B ;ANOMALOUS PRINTING -- MOS05 0440 CF7B -- MOS05 0441 CF7B AE 59 03 PRANM LDX FGCOLF ;Printing to be in foreground graphics colour MOS05 0514 CFD1 ^28 MOS05 0442 CF7E AC 5B 03 LDY GPLFMD ;In the current foreground colour mode MOS05 0514 CFD1 ^28 MOS05 0443 CF81 20 E7 D0 PRANC JSR SETZG ;Initialise ZGORA & ZGEOR MOS05 0550 CFF1 ^0E MOS05 0444 CF84 MOS05 0550 CFF1 ^0E MOS05 0445 CF84 ;The graphics cursor is copied to 2 locations, APCS1 MOS05 0550 CFF1 ^0E MOS05 0446 CF84 ;and APCS2 . The latter is left untouched until the end of the printing, MOS05 0550 CFF1 ^0E MOS05 0447 CF84 ;when it is restored to the GCSIY. The former is copied to the GCSIY MOS05 0550 CFF1 ^0E MOS05 0448 CF84 ;after every column of pixels is printed, with the X cursor incremented MOS05 0550 CFF1 ^0E MOS05 0449 CF84 ;each time. MOS05 0550 CFF1 ^0E MOS05 0450 CF84 MOS05 0550 CFF1 ^0E MOS05 0451 CF84 20 78 D4 JSR COPYFA ;Copy GCSIY to APCS2 ... MOS05 0550 CFF1 ^0E MOS05 0452 CF87 A0 00 LDYIM &00 ;Initialise row counter MOS05 0550 CFF1 ^0E MOS05 0453 CF89 84 DC PRANMC STY ZTEMPB MOS05 0550 CFF1 ^0E MOS05 0454 CF8B [ MOS125 = &FF MOS05 0550 CFF1 ^0E MOS05 0456 CF8B ] MOS05 0550 CFF1 ^0E MOS05 0457 CF8B B1 DE LDAIY ZTEMPC ;Anything to do ? MOS05 0550 CFF1 ^0E MOS05 0458 CF8D F0 13 BEQ PRANMG ;No, then skip MOS05 0550 CFF1 ^0E MOS05 0459 CF8F 85 DD STA ZTEMPB +&01 MOS05 0550 CFF1 ^0E MOS05 0460 CF91 10 03 PRANMA BPL PRANMD MOS05 0550 CFF1 ^0E MOS05 0461 CF93 20 17 D1 JSR WPLOTA ;Yes, then plot if inside window MOS05 0550 CFF1 ^0E MOS05 0462 CF96 EE 24 03 PRANMD INC GCSIX ;Increment X cursor MOS05 0550 CFF1 ^0E MOS05 0463 CF99 D0 03 BNE PRANME MOS05 0550 CFF1 ^0E MOS05 0464 CF9B EE 25 03 INC GCSIX +&01 MOS05 0550 CFF1 ^0E MOS05 0465 CF9E 06 DD PRANME ASL ZTEMPB +&01 MOS05 0550 CFF1 ^0E MOS05 0466 CFA0 D0 EF BNE PRANMA MOS05 0550 CFF1 ^0E MOS05 0467 CFA2 A2 28 PRANMG LDXIM APCS1-V ;Restore previous x cursor MOS05 0550 CFF1 ^0E MOS05 0468 CFA4 A0 24 LDYIM GCSIR-V MOS05 0550 CFF1 ^0E MOS05 0469 CFA6 20 74 D4 JSR COPY2 MOS05 0550 CFF1 ^0E MOS05 0470 CFA9 AC 26 03 LDY GCSIY ;Decrement Igraphics Y cursor MOS05 0550 CFF1 ^0E MOS05 0471 CFAC D0 03 BNE PRANMF MOS05 0550 CFF1 ^0E MOS05 0472 CFAE CE 27 03 DEC GCSIY +&01 MOS05 0550 CFF1 ^0E MOS05 0473 CFB1 CE 26 03 PRANMF DEC GCSIY MOS05 0550 CFF1 ^0E MOS05 0474 CFB4 A4 DC LDY ZTEMPB ;Do next row MOS05 0550 CFF1 ^0E MOS05 0475 CFB6 C8 INY MOS05 0550 CFF1 ^0E MOS05 0476 CFB7 C0 08 CPYIM &08 MOS05 0550 CFF1 ^0E MOS05 0477 CFB9 D0 CE BNE PRANMC MOS05 0550 CFF1 ^0E MOS05 0478 CFBB A2 28 LDXIM APCS1 ;Finished, so restore grpahics cursor MOS05 0550 CFF1 ^0E MOS05 0479 CFBD A0 24 LDYIM GCSIR-V MOS05 0550 CFF1 ^0E MOS05 0480 CFBF 4C 7C D4 JMP COPYF ; (branch always taken) MOS05 0550 CFF1 ^0E MOS05 0481 CFC2 MOS05 0550 CFF1 ^0E MOS05 0482 CFC2 [ MOS125 = &FF MOS05 0550 CFF1 ^0E MOS05 0498 CFC2 ] MOS05 0550 CFF1 ^0E MOS05 0499 CFC2 MOS05 0550 CFF1 ^0E MOS05 0500 CFC2 ;NON-ANOMALOUS MOS05 0550 CFF1 ^0E MOS05 0501 CFC2 MOS05 0550 CFF1 ^0E MOS05 0502 CFC2 ;Character to be printed in (A) MOS05 0550 CFF1 ^0E MOS05 0503 CFC2 MOS05 0550 CFF1 ^0E MOS05 0504 CFC2 ;Set up address of bytes to be MOS05 0550 CFF1 ^0E MOS05 0505 CFC2 ;copied from soft font. Result MOS05 0550 CFF1 ^0E MOS05 0506 CFC2 ;to ZTEMP MOS05 0550 CFF1 ^0E MOS05 0507 CFC2 MOS05 0550 CFF1 ^0E MOS05 0508 CFC2 AE 60 03 VDUPR LDX NCOLOR ;TTX? MOS05 0550 CFF1 ^0E MOS05 0509 CFC5 F0 2C BEQ PTTX MOS05 0550 CFF1 ^0E MOS05 0510 CFC7 20 72 D0 JSR CHADDR ;Point (ZTEMPC) to character in soft font MOS05 0550 CFF1 ^0E MOS05 0511 CFCA AE 60 03 VDUPRB LDX NCOLOR ;Because CHADDR now destroys (X) MOS05 0550 CFF1 ^0E MOS05 0512 CFCD A5 D0 LDA STATS ;Is this anomalous printing ? MOS05 0550 CFF1 ^0E MOS05 0513 CFCF 29 20 ANDIM &20 MOS05 0550 CFF1 ^0E MOS05 0514 CFD1 D0 A8 BNE PRANM ;Anom. printing MOS05 0550 CFF1 ^0E MOS05 0515 CFD3 MOS05 0550 CFF1 ^0E MOS05 0516 CFD3 ;Now select the mode MOS05 0550 CFF1 ^0E MOS05 0517 CFD3 MOS05 0550 CFF1 ^0E MOS05 0518 CFD3 A0 07 LDYIM &07 ;No. rows (except TTX) MOS05 0550 CFF1 ^0E MOS05 0519 CFD5 E0 03 CPXIM &03 MOS05 0550 CFF1 ^0E MOS05 0520 CFD7 F0 4E BEQ PFOUR ;4 colour mode ? MOS05 0550 CFF1 ^0E MOS05 0521 CFD9 B0 78 BCS PSXTN ;16 colour mode ? MOS05 0521 CFD9 v07 MOS05 0522 CFDB MOS05 0521 CFD9 v07 MOS05 0523 CFDB ;TWO colour mode MOS05 0521 CFD9 v07 MOS05 0524 CFDB MOS05 0521 CFD9 v07 MOS05 0525 CFDB B1 DE PTWO LDAIY ZTEMPC MOS05 0521 CFD9 v07 MOS05 0526 CFDD 05 D2 ORA ZORA MOS05 0521 CFD9 v07 MOS05 0527 CFDF 45 D3 EOR ZEOR MOS05 0521 CFD9 v07 MOS05 0528 CFE1 91 D8 STAIY ZMEMT MOS05 0521 CFD9 v07 MOS05 0529 CFE3 88 DEY MOS05 0521 CFD9 v07 MOS05 0530 CFE4 10 F5 BPL PTWO MOS05 0521 CFD9 v07 MOS05 0531 CFE6 60 RTS MOS05 0521 CFD9 v07 MOS05 0532 CFE7 MOS05 0521 CFD9 v07 MOS05 0533 CFE7 ;TELETEXT mode MOS05 0521 CFD9 v07 MOS05 0534 CFE7 MOS05 0521 CFD9 v07 MOS05 0535 CFE7 [ MOS125 = &FF MOS05 0521 CFD9 v07 MOS05 0545 CFE7 | MOS05 0521 CFD9 v07 MOS05 0546 CFE7 A9 7F DELA LDAIM &7F ;Point to DEL, only unprintable char. in hard font =$FF...$FF MOS05 0521 CFD9 v07 MOS05 0547 CFE9 20 72 D0 JSR CHADDR MOS05 0521 CFD9 v07 MOS05 0548 CFEC AE 5A 03 LDX BGCOLF ;Force this to be graphics background colour MOS05 0521 CFD9 v07 MOS05 0549 CFEF A0 00 LDYIM &00 ;Mode is STORE MOS05 0521 CFD9 v07 MOS05 0550 CFF1 F0 8E BEQ PRANC MOS05 0521 CFD9 v07 MOS05 0551 CFF3 MOS05 0521 CFD9 v07 MOS05 0552 CFF3 PTTX ;C=1 from NOTCEA->VDUPR MOS05 0521 CFD9 v07 MOS05 0553 CFF3 TTXFRM ;transform once for ASCII->Teletext, twice for Teletext->ASCII MOS05 0521 CFD9 v07 MOS05 0554 CFF3 49 23 EORIM &23 ;is character ASCII &23, hash? MOS05 0521 CFD9 v07 MOS05 0555 CFF5 F0 04 BEQ PTTX5F ;then replace with Teletext &5F MOS05 0521 CFD9 v07 MOS05 0556 CFF7 ;PTTX23 MOS05 0521 CFD9 v07 MOS05 0557 CFF7 49 7C EORIM &23:EOR:&5F ;else is it ASCII &5F, underscore? MOS05 0521 CFD9 v07 MOS05 0558 CFF9 F0 04 BEQ PTTX60 ;then replace with Teletext &60 MOS05 0521 CFD9 v07 MOS05 0559 CFFB 49 3F PTTX5F EORIM &5F:EOR:&60 ;else is it ASCII &60, sterling? MOS05 0521 CFD9 v07 MOS05 0560 CFFD F0 0A BEQ PTTX23 ;then replace with Teletext &23 (won't loop!) MOS05 0521 CFD9 v07 MOS05 0561 CFFF 49 60 PTTX60 EORIM &60 ;else undo our fiddling MOS05 0521 CFD9 v07 MOS05 0562 D001 90 02 BCC PTTXC ;if C=0 then transform only else C=1, write to screen MOS05 0521 CFD9 v07 MOS05 0563 D003 81 D8 STAIX ZMEMT ;as (X)=0 MOS05 0521 CFD9 v07 MOS05 0564 D005 60 PTTXC RTS MOS05 0521 CFD9 v07 MOS05 0565 D006 MOS05 0521 CFD9 v07 MOS05 0566 D006 ;Code duplicated to print ASCII &60 as fast as OS 1.20 MOS05 0521 CFD9 v07 MOS05 0567 D006 ;(with zero penalty on other characters) MOS05 MOS05 MOS05 MOS05 Acorn macro assembler Page 28 MOS05 VDU File - MOS05 MOS05 MOS05 0521 CFD9 v07 MOS05 0568 D006 MOS05 0521 CFD9 v07 MOS05 0569 D006 A9 03 PTTXSP LDAIM &20:EOR:&23 ;Print TTX space MOS05 0521 CFD9 v07 MOS05 0570 D008 38 SEC ;write to screen MOS05 0521 CFD9 v07 MOS05 0571 D009 49 23 PTTX23 EORIM &23 MOS05 0521 CFD9 v07 MOS05 0572 D00B 90 02 BCC PTTX2C MOS05 0521 CFD9 v07 MOS05 0573 D00D 81 D8 STAIX ZMEMT MOS05 0521 CFD9 v07 MOS05 0574 D00F 60 PTTX2C RTS MOS05 0521 CFD9 v07 MOS05 0575 D010 MOS05 0521 CFD9 v07 MOS05 0576 D010 ;Moved here to protect PTTX, PTTXSP and PFOUR from page boundary MOS05 0521 CFD9 v07 MOS05 0577 D010 ;1 cycle penalty on all exits MOS05 0521 CFD9 v07 MOS05 0578 D010 ;DEL ($7F) Delete previous char MOS05 0521 CFD9 v07 MOS05 0579 D010 MOS05 0521 CFD9 v07 MOS05 0580 D010 20 F9 C5 DEL JSR BS ;Move back 1 character MOS05 0521 CFD9 v07 MOS05 0581 D013 20 85 C5 JSR ANOMQ MOS05 0521 CFD9 v07 MOS05 0582 D016 D0 CF BNE DELA MOS05 0521 CFD9 v07 MOS05 0583 D018 AE 60 03 LDX NCOLOR MOS05 0521 CFD9 v07 MOS05 0584 D01B F0 E9 BEQ PTTXSP ;TTX space MOS05 0521 CFD9 v07 MOS05 0585 D01D 85 DE STA ZTEMPC ;(A)=0 from ANOMQ MOS05 0521 CFD9 v07 MOS05 0586 D01F A9 C0 LDAIM HFMSB +&01 ;Point to hard font version of space MOS05 0521 CFD9 v07 MOS05 0587 D021 85 DF STA ZTEMPC +&01 MOS05 0521 CFD9 v07 MOS05 0588 D023 D0 A5 BNE VDUPRB ;always branch MOS05 0521 CFD9 v07 MOS05 0589 D025 ] MOS05 0521 CFD9 v07 MOS05 0590 D025 MOS05 0521 CFD9 v07 MOS05 0591 D025 ;FOUR colour mode MOS05 0521 CFD9 v07 MOS05 0592 D025 MOS05 0521 CFD9 v07 MOS05 0593 D025 [ MOS125 = &FF MOS05 0521 CFD9 v07 MOS05 0620 D025 | MOS05 0521 CFD9 v07 MOS05 0621 D025 A8 PFOURA TAY MOS05 0521 CFD9 v07 MOS05 0622 D026 88 DEY ;75 MOS05 0521 CFD9 v07 MOS05 0623 D027 B1 DE PFOUR LDAIY ZTEMPC ;Get bit pattern MOS05 0521 CFD9 v07 MOS05 0624 D029 48 PHA ;Push for L.S.Nybble MOS05 0521 CFD9 v07 MOS05 0625 D02A 4A LSRA MOS05 0521 CFD9 v07 MOS05 0626 D02B 4A LSRA MOS05 0521 CFD9 v07 MOS05 0627 D02C 4A LSRA MOS05 0521 CFD9 v07 MOS05 0628 D02D 4A LSRA ;16 MOS05 0521 CFD9 v07 MOS05 0629 D02E AA TAX MOS05 0521 CFD9 v07 MOS05 0630 D02F BD 1F C3 LDAAX BPFTB ;Get expanded patten MOS05 0521 CFD9 v07 MOS05 0631 D032 05 D2 ORA ZORA ;of M.S.Nybble MOS05 0521 CFD9 v07 MOS05 0632 D034 45 D3 EOR ZEOR MOS05 0521 CFD9 v07 MOS05 0633 D036 91 D8 STAIY ZMEMT ;34 MOS05 0521 CFD9 v07 MOS05 0634 D038 ; same size, reduce stack load MOS05 0521 CFD9 v07 MOS05 0635 D038 68 PLA ;Get L.S.Nybble MOS05 0521 CFD9 v07 MOS05 0636 D039 29 0F ANDIM &0F MOS05 0521 CFD9 v07 MOS05 0637 D03B AA TAX MOS05 0521 CFD9 v07 MOS05 0638 D03C 98 TYA MOS05 0521 CFD9 v07 MOS05 0639 D03D 49 08 EORIM &08 ;Access next char. cell MOS05 0521 CFD9 v07 MOS05 0640 D03F A8 TAY MOS05 0521 CFD9 v07 MOS05 0641 D040 BD 1F C3 LDAAX BPFTB ;52 MOS05 0521 CFD9 v07 MOS05 0642 D043 05 D2 ORA ZORA MOS05 0521 CFD9 v07 MOS05 0643 D045 45 D3 EOR ZEOR MOS05 0521 CFD9 v07 MOS05 0644 D047 91 D8 STAIY ZMEMT MOS05 0521 CFD9 v07 MOS05 0645 D049 98 TYA MOS05 0521 CFD9 v07 MOS05 0646 D04A 49 08 EORIM &08 MOS05 0521 CFD9 v07 MOS05 0647 D04C D0 D7 BNE PFOURA ;71 MOS05 0521 CFD9 v07 MOS05 0648 D04E ;41 MOS05 0521 CFD9 v07 MOS05 0649 D04E ] MOS05 0521 CFD9 v07 MOS05 0650 D04E 60 PSXTC RTS ;Also used by PSXTN MOS05 0521 CFD9 v07 MOS05 0651 D04F MOS05 0521 CFD9 v07 MOS05 0652 D04F ;SIXTEEN colour mode MOS05 0521 CFD9 v07 MOS05 0653 D04F MOS05 0521 CFD9 v07 MOS05 0654 D04F [ MOS125 = &FF MOS05 0521 CFD9 v07 MOS05 0679 D04F | MOS05 0521 CFD9 v07 MOS05 0680 D04F PSXTB ;Ref.the 1st cell again MOS05 0521 CFD9 v07 MOS05 0681 D04F F0 FD BEQ PSXTC ;Finished ? MOS05 0521 CFD9 v07 MOS05 0682 D051 A8 TAY ;No, then carry on .. MOS05 0521 CFD9 v07 MOS05 0683 D052 88 DEY MOS05 0521 CFD9 v07 MOS05 0684 D053 MOS05 0521 CFD9 v07 MOS05 0685 D053 B1 DE PSXTN LDAIY ZTEMPC ;Get bit pattern MOS05 0698 D069 ^64 MOS05 0686 D055 0A PSXTA ASLA MOS05 0702 D070 ^63 MOS05 0687 D056 2A ROLA MOS05 0702 D070 ^63 MOS05 0688 D057 85 DC STA ZTEMPB MOS05 0702 D070 ^63 MOS05 0689 D059 29 01 ANDIM &01 MOS05 0702 D070 ^63 MOS05 0690 D05B 2A ROLA ;(A)=next 2 bits MOS05 0702 D070 ^63 MOS05 0691 D05C AA TAX ;Get expanded bit pattern MOS05 0702 D070 ^63 MOS05 0692 D05D BD 2F C3 LDAAX BPSTB MOS05 0702 D070 ^63 MOS05 0693 D060 05 D2 ORA ZORA MOS05 0702 D070 ^63 MOS05 0694 D062 45 D3 EOR ZEOR MOS05 0702 D070 ^63 MOS05 0695 D064 91 D8 STAIY ZMEMT MOS05 0702 D070 ^63 MOS05 0696 D066 98 TYA ;Access next char. cell MOS05 0702 D070 ^63 MOS05 0697 D067 E9 17 SBCIM &17 ;c=0, subtract $18 MOS05 0702 D070 ^63 MOS05 0698 D069 B0 E4 BCS PSXTB MOS05 0702 D070 ^63 MOS05 0699 D06B 29 1F ANDIM &1F ;c=0 before & after MOS05 0702 D070 ^63 MOS05 0700 D06D A8 TAY MOS05 0702 D070 ^63 MOS05 0701 D06E A5 DC LDA ZTEMPB MOS05 0702 D070 ^63 MOS05 0702 D070 90 E3 BCC PSXTA ;(branch always taken) -- MOS05 0703 D072 ] -- MOS05 0704 D072 -- MOS05 0705 D072 ;Addresses character in soft font. -- MOS05 0706 D072 ;Takes (ascii) value in A, multiplies by 8, adds appropriate font address -- MOS05 0707 D072 ;(assumed to be on page boudary), and puts result to ZTEMPC. -- MOS05 0708 D072 ;This addresses top row of character, subsequent rows being in the -- MOS05 0709 D072 ;following 7 bytes. -- MOS05 0710 D072 -- MOS05 0711 D072 [ MOS125 = &FF -- MOS05 0731 D072 | -- MOS05 0732 D072 0A CHADDR ASLA ;ZTEMPC:=8*CHAR. + MSB of font -- MOS05 0733 D073 2A ROLA -- MOS05 0734 D074 2A ROLA -- MOS05 0735 D075 AA TAX -- MOS05 0736 D076 29 F8 ANDIM &F8 -- MOS05 0737 D078 85 DE STA ZTEMPC ;Store LSB of addr. -- MOS05 0738 D07A 8A TXA -- MOS05 0739 D07B 29 03 ANDIM &03 ;Get page number of character -- MOS05 0740 D07D 2A ROLA -- MOS05 0741 D07E AA TAX -- MOS05 0742 D07F 29 03 ANDIM &03 -- MOS05 0743 D081 69 BF ADCIM HFMSB ;MSB of hard font - overwrite if soft font (c=0 from last ROLA) -- MOS05 0744 D083 A8 TAY -- MOS05 0745 D084 BD 0D C4 LDAAX BITTBL ;Which bit in the flag byte is to be tested -- MOS05 0746 D087 2C 67 03 BIT FNTFLG ;Test to see if soft or hard font -- MOS05 0747 D08A F0 03 BEQ CHADDS ;Clear, thus hard font MOS05 0747 D08A v7C MOS05 0748 D08C BC 67 03 LDYAX PGSFNT -&01 ;Load soft font page number MOS05 0747 D08A v7C MOS05 0749 D08F 84 DF CHADDS STY ZTEMPC +&01 ;Store MSByte -- MOS05 0750 D091 60 RTS -- MOS05 0751 D092 ] -- MOS05 0752 D092 LNK MOS06 -- MOS06 0001 D092 -- MOS06 0002 D092 TTL VDU File - MOS06 -- MOS06 0003 D092 OPT MOS06 MOS06 MOS06 MOS06 MOS06 Acorn macro assembler Page 29 MOS06 VDU File - MOS06 MOS06 -- MOS06 0004 D092 -- MOS06 0005 D092 ;Last revision 15/05/82 -- MOS06 0006 D092 -- MOS06 0007 D092 ;15/06/82 Adjust bad plot mode indirection code -- MOS06 0008 D092 ;05/05/82 GADDR converted such that it takes only 1 table. -- MOS06 0009 D092 ; Moved to MOS11 -- MOS06 0010 D092 ;01/05/82 Recode to allow for new order of variables -- MOS06 0011 D092 ;21/04/82 Conditional assembly of start/end point double plotting. -- MOS06 0012 D092 ;22/01/82 Provide EIGABS -- MOS06 0013 D092 ;07/01/82 Put X to LSB of pointer -- MOS06 0014 D092 -- MOS06 0015 D092 ;******* PLOTTING ******* -- MOS06 0016 D092 -- MOS06 0017 D092 ;Prologue - converts from external to internal -- MOS06 0018 D092 ;co-ords, and distinguishes between types of -- MOS06 0019 D092 ;line & triangles -- MOS06 0020 D092 -- MOS06 0021 D092 A2 20 EMA LDXIM NEWPT-V ;Convert external to internal -- MOS06 0022 D094 [ MOS125 = &FF -- MOS06 0025 D094 | -- MOS06 0026 D094 AD 1F 03 LDA PLMODE ;Get plot mode -- MOS06 0027 D097 48 PHA -- MOS06 0028 D098 20 7F D1 JSR EIGC ;for the 4 bytes starting at Q -- MOS06 0029 D09B 68 PLA -- MOS06 0030 D09C ] -- MOS06 0031 D09C C9 04 CMPIM &04 ;BASIC's MOVE command -- MOS06 0032 D09E F0 6D BEQ EMAEX MOS06 0032 D09E v12 MOS06 0033 D0A0 A0 05 LDYIM &05 ;Point to do damn' all mode (for plotting that produces no change) MOS06 0032 D09E v12 MOS06 0034 D0A2 29 03 ANDIM &03 MOS06 0032 D09E v12 MOS06 0035 D0A4 F0 0E BEQ EMAA ;No change, then exit MOS06 0032 D09E v12 MOS06 0036 D0A6 4A LSRA ;Is it odd ? MOS06 0032 D09E v12 MOS06 0037 D0A7 B0 03 BCS EMAF ;No?, then invert MOS06 0032 D09E v12 MOS06 0038 D0A9 88 DEY ;(Y) = 4. Point to INVERT values of table MOS06 0032 D09E v12 MOS06 0039 D0AA D0 08 BNE EMAA ;(Branch always taken) MOS06 0032 D09E v12 MOS06 0040 D0AC AA EMAF TAX MOS06 0032 D09E v12 MOS06 0041 D0AD BC 5B 03 LDYAX GPLFMD MOS06 0032 D09E v12 MOS06 0042 D0B0 BD 59 03 LDAAX FGCOLF MOS06 0032 D09E v12 MOS06 0043 D0B3 AA TAX MOS06 0032 D09E v12 MOS06 0044 D0B4 20 E7 D0 EMAA JSR SETZG MOS06 0032 D09E v12 MOS06 0045 D0B7 MOS06 0032 D09E v12 MOS06 0046 D0B7 ;What's to be done ? MOS06 0032 D09E v12 MOS06 0047 D0B7 MOS06 0032 D09E v12 MOS06 0048 D0B7 AD 1F 03 LDA PLMODE ;Get plot mode MOS06 0032 D09E v12 MOS06 0049 D0BA ;* TAY MOS06 0032 D09E v12 MOS06 0050 D0BA 30 23 BMI EXGREF ;Negative, then reference external routine MOS06 0032 D09E v12 MOS06 0051 D0BC 0A ASLA ;Get type of operation MOS06 0032 D09E v12 MOS06 0052 D0BD 10 3B BPL EMAD ;Is it a line? MOS06 0032 D09E v12 MOS06 0053 D0BF 29 F0 ANDIM &F0 ;Get rid of irrelevant data MOS06 0032 D09E v12 MOS06 0054 D0C1 0A ASLA ;Is it point ($80, will be shifted out) ? MOS06 0032 D09E v12 MOS06 0055 D0C2 F0 46 BEQ EMAC MOS06 0032 D09E v12 MOS06 0056 D0C4 49 40 EORIM &40 ;Triangles? MOS06 0032 D09E v12 MOS06 0057 D0C6 F0 14 BEQ EMAG MOS06 0032 D09E v12 MOS06 0058 D0C8 48 PHA MOS06 0032 D09E v12 MOS06 0059 D0C9 20 10 D1 JSR EMAEY ;Copy newpoint to internal cursor MOS06 0032 D09E v12 MOS06 0060 D0CC 68 PLA MOS06 0032 D09E v12 MOS06 0061 D0CD 49 60 EORIM &60 ;SPLOT MOS06 0032 D09E v12 MOS06 0062 D0CF F0 11 BEQ EME ;($60=$20 EOR $40) MOS06 0032 D09E v12 MOS06 0063 D0D1 C9 40 CMPIM &40 ;SPLOT looking for b/g ($60 = $40 EOR $60 EOR $40) MOS06 0032 D09E v12 MOS06 0064 D0D3 D0 0A BNE EXGREF MOS06 0032 D09E v12 MOS06 0065 D0D5 A9 02 LDAIM &02 ;This is what is EORed with the flag register MOS06 0032 D09E v12 MOS06 0066 D0D7 85 DC STA ZTEMPB MOS06 0032 D09E v12 MOS06 0067 D0D9 4C F7 D4 JMP SCHEAT MOS06 0032 D09E v12 MOS06 0068 D0DC MOS06 0032 D09E v12 MOS06 0069 D0DC 4C D7 D5 EMAG JMP EMC ;Jump to triangles MOS06 0032 D09E v12 MOS06 0070 D0DF EXGREF MOS06 0032 D09E v12 MOS06 0071 D0DF ;* TYA ;Restore plot mode to A MOS06 0032 D09E v12 MOS06 0072 D0DF 4C 44 C9 JMP JMIV25 MOS06 0032 D09E v12 MOS06 0073 D0E2 MOS06 0032 D09E v12 MOS06 0074 D0E2 85 DC EME STA ZTEMPB ;(A)=0 .This is what is EORed with the flag register MOS06 0032 D09E v12 MOS06 0075 D0E4 4C B0 D4 JMP SPLOT ;Fill plot MOS06 0032 D09E v12 MOS06 0076 D0E7 MOS06 0032 D09E v12 MOS06 0077 D0E7 ;Set up ZGORA & ZGEOR, using MOS06 0032 D09E v12 MOS06 0078 D0E7 ;(X)=Full colour byte MOS06 0032 D09E v12 MOS06 0079 D0E7 ;(Y)=Plot mode MOS06 0032 D09E v12 MOS06 0080 D0E7 MOS06 0032 D09E v12 MOS06 0081 D0E7 8A SETZG TXA MOS06 0032 D09E v12 MOS06 0082 D0E8 19 1C C4 ORAAY TBZGOO MOS06 0032 D09E v12 MOS06 0083 D0EB 59 1D C4 EORAY TBZGEO MOS06 0032 D09E v12 MOS06 0084 D0EE 85 D4 STA ZGORA MOS06 0032 D09E v12 MOS06 0085 D0F0 8A TXA MOS06 0032 D09E v12 MOS06 0086 D0F1 19 1B C4 ORAAY TBZGOE MOS06 0032 D09E v12 MOS06 0087 D0F4 59 20 C4 EORAY TBZGEE MOS06 0032 D09E v12 MOS06 0088 D0F7 85 D5 STA ZGEOR MOS06 0032 D09E v12 MOS06 0089 D0F9 60 RTS MOS06 0032 D09E v12 MOS06 0090 D0FA MOS06 0032 D09E v12 MOS06 0091 D0FA ;Plot a line or curve MOS06 0032 D09E v12 MOS06 0092 D0FA MOS06 0032 D09E v12 MOS06 0093 D0FA 0A EMAD ASLA ;Is it a line or curve ? MOS06 0032 D09E v12 MOS06 0094 D0FB 30 E2 BMI EXGREF ;Curve, so reference user routine MOS06 0032 D09E v12 MOS06 0095 D0FD [ MOS125 = &FF MOS06 0032 D09E v12 MOS06 0099 D0FD | MOS06 0032 D09E v12 MOS06 0100 D0FD ;A,C clobbered in WPLOTA->GADDW->WIND->WINDA MOS06 0032 D09E v12 MOS06 0101 D0FD ;or LINE->LINSA->TRISA->TRISAA MOS06 0032 D09E v12 MOS06 0102 D0FD 29 20 ANDIM &20 ;It's a line, so is the first point to be plotted again? MOS06 0032 D09E v12 MOS06 0103 D0FF F0 03 BEQ EMAB ;No, then skip this, as routine plots both anyway MOS06 0032 D09E v12 MOS06 0104 D101 ] MOS06 0032 D09E v12 MOS06 0105 D101 ; MOS06 0032 D09E v12 MOS06 0106 D101 [ STARTP=0 MOS06 0032 D09E v12 MOS06 0109 D101 | MOS06 0032 D09E v12 MOS06 0110 D101 ; plot end point twice MOS06 0032 D09E v12 MOS06 0111 D101 20 1F D1 JSR WPLOT MOS06 0032 D09E v12 MOS06 0112 D104 ] MOS06 0032 D09E v12 MOS06 0113 D104 ; MOS06 0032 D09E v12 MOS06 0114 D104 20 E7 D1 EMAB JSR LINE MOS06 0032 D09E v12 MOS06 0115 D107 4C 0D D1 JMP EMAEX MOS06 0032 D09E v12 MOS06 0116 D10A MOS06 0032 D09E v12 MOS06 0117 D10A ;Plot a point MOS06 0032 D09E v12 MOS06 0118 D10A MOS06 0032 D09E v12 MOS06 0119 D10A 20 1F D1 EMAC JSR WPLOT ;Plot only if it is in window MOS06 0032 D09E v12 MOS06 0120 D10D ;SPLOTY requires that EMAEX preserves carry MOS06 0032 D09E v12 MOS06 0121 D10D 20 FE CD EMAEX JSR SWAPB ;Swap current cursor with last cursor -- MOS06 0122 D110 A0 24 EMAEY LDYIM GCSIR-V ;Copy new point to Icursor -- MOS06 0123 D112 A2 20 EMAEZ LDXIM NEWPT-V -- MOS06 0124 D114 4C 7C D4 JMP COPYF -- MOS06 0125 D117 -- MOS06 0126 D117 ;WPLOT windows point at NEWPT and plots it if inside -- MOS06 0127 D117 -- MOS06 0128 D117 A2 24 WPLOTA LDXIM GCSIR-V ;WPLOTA does this to current graphics cursor -- MOS06 0129 D119 20 2B D8 JSR GADDV ;WPLOTB does this for any point pointed to by X -- MOS06 0130 D11C F0 06 BEQ PLOT MOS06 0130 D11C v79 MOS06 0131 D11E 60 RTS MOS06 MOS06 MOS06 MOS06 Acorn macro assembler Page 30 MOS06 VDU File - MOS06 MOS06 MOS06 0130 D11C v79 MOS06 0132 D11F 20 29 D8 WPLOT JSR GADDW ;Window & address NEWPT MOS06 0130 D11C v79 MOS06 0133 D122 D0 13 BNE PLOTEX ;Out of window, then exit MOS06 0133 D122 v6C MOS06 0134 D124 MOS06 0133 D122 v6C MOS06 0135 D124 ;otherwise fall through to ..... MOS06 0133 D122 v6C MOS06 0136 D124 MOS06 0133 D122 v6C MOS06 0137 D124 ;PLOT plots a point MOS06 0133 D122 v6C MOS06 0138 D124 ;Requires LINEY, ZMEMG, ZGORA, ZGEOR MOS06 0133 D122 v6C MOS06 0139 D124 ;Uses ZTEMP as work byte MOS06 0133 D122 v6C MOS06 0140 D124 ;Alters 1 byte on screen MOS06 0133 D122 v6C MOS06 0141 D124 MOS06 0133 D122 v6C MOS06 0142 D124 AC 1A 03 PLOT LDY YLINE MOS06 0133 D122 v6C MOS06 0143 D127 A5 D1 PLOTS LDA ZMASK MOS06 0133 D122 v6C MOS06 0144 D129 25 D4 AND ZGORA MOS06 0133 D122 v6C MOS06 0145 D12B 11 D6 ORAIY ZMEMG MOS06 0133 D122 v6C MOS06 0146 D12D 85 DA STA ZTEMP MOS06 0133 D122 v6C MOS06 0147 D12F A5 D5 LDA ZGEOR MOS06 0133 D122 v6C MOS06 0148 D131 25 D1 AND ZMASK MOS06 0133 D122 v6C MOS06 0149 D133 45 DA EOR ZTEMP MOS06 0133 D122 v6C MOS06 0150 D135 91 D6 STAIY ZMEMG MOS06 0133 D122 v6C MOS06 0151 D137 60 PLOTEX RTS -- MOS06 0152 D138 -- MOS06 0153 D138 B1 D6 PLOTFF LDAIY ZMEMG ;Plots a full byte -- MOS06 0154 D13A 05 D4 ORA ZGORA -- MOS06 0155 D13C 45 D5 EOR ZGEOR -- MOS06 0156 D13E [ MOS125 = &7F -- MOS06 0157 D13E WRSC -- MOS06 0158 D13E ] -- MOS06 0159 D13E 91 D6 STAIY ZMEMG -- MOS06 0160 D140 60 RTS -- MOS06 0161 D141 -- MOS06 0162 D141 ;WIND windows the point at V+(X), as follows -- MOS06 0163 D141 ;If the point is below the lower limit, the window is 1 -- MOS06 0164 D141 ;If the point is above the upper limit, the window is 2 -- MOS06 0165 D141 ;If the point is within both limits, the window is 0 -- MOS06 0166 D141 ;The total window, returned in A (with z set appropriately) -- MOS06 0167 D141 ;is 4 times the window in the Y direction, plus the window -- MOS06 0168 D141 ;in the X direction. -- MOS06 0169 D141 ;The routine uses ZTEMP as a work byte -- MOS06 0170 D141 ;All windows, as specified by GWxxxx are reckoned as inclusive, -- MOS06 0171 D141 ;with the high byte last. -- MOS06 0172 D141 ;The order of the windows in RAM is reckoned as follows -- MOS06 0173 D141 ;GWLCOL, GWBROW, GWRCOL, GWTROW -- MOS06 0174 D141 -- MOS06 0175 D141 A2 24 WINDCS LDXIM GCSIR-V ;Special entry point to window graphics cursor -- MOS06 0176 D143 -- MOS06 0177 D143 A0 00 WIND LDYIM &00 ;Initialise result -- MOS06 0178 D145 84 DA STY ZTEMP -- MOS06 0179 D147 A0 02 LDYIM &02 ;Do the Y co-ords -- MOS06 0180 D149 20 5C D1 JSR WINDA -- MOS06 0181 D14C 06 DA ASL ZTEMP ;Mult. the Y window by 4 -- MOS06 0182 D14E 06 DA ASL ZTEMP -- MOS06 0183 D150 CA DEX -- MOS06 0184 D151 CA DEX -- MOS06 0185 D152 A0 00 LDYIM &00 ;Do the X window -- MOS06 0186 D154 20 5C D1 JSR WINDA -- MOS06 0187 D157 E8 INX ;Restore X -- MOS06 0188 D158 E8 INX -- MOS06 0189 D159 A5 DA LDA ZTEMP -- MOS06 0190 D15B 60 RTS -- MOS06 0191 D15C -- MOS06 0192 D15C ;Subtract margin from point to obtain sign of difference -- MOS06 0193 D15C -- MOS06 0194 D15C BD 02 03 WINDA LDAAX V+&02 ;(LSB) -- MOS06 0195 D15F D9 00 03 CMPAY GWLCOL ;(LSB of lower limit) -- MOS06 0196 D162 BD 03 03 LDAAX V+&03 ;(MSB) -- MOS06 0197 D165 F9 01 03 SBCAY GWLCOL+&01 ;(MSB of lower limit) -- MOS06 0198 D168 30 10 BMI WINDAA MOS06 0198 D168 v6F MOS06 0199 D16A B9 04 03 LDAAY GWRCOL ;(LSB of upper limit) MOS06 0198 D168 v6F MOS06 0200 D16D DD 02 03 CMPAX V+&02 ;(LSB) MOS06 0198 D168 v6F MOS06 0201 D170 B9 05 03 LDAAY GWRCOL+&01 ;(MSB of upper limit) MOS06 0198 D168 v6F MOS06 0202 D173 FD 03 03 SBCAX V+&03 ;(MSB) MOS06 0198 D168 v6F MOS06 0203 D176 10 04 BPL WINDAB ;Is this <= upper limit ? MOS06 0198 D168 v6F MOS06 0204 D178 E6 DA INC ZTEMP MOS06 0198 D168 v6F MOS06 0205 D17A E6 DA WINDAA INC ZTEMP MOS06 0203 D176 v7B MOS06 0206 D17C 60 WINDAB RTS ;No longer referenced from EIG, incidentally, saving TWO WHOLE BYTES !! -- MOS06 0207 D17D -- MOS06 0208 D17D ;EIGABS in some embarassment is to provide EIG in ABSOLUTE co-ords -- MOS06 0209 D17D -- MOS06 0210 D17D A9 FF EIGABS LDAIM &FF -- MOS06 0211 D17F [ MOS125 = &FF -- MOS06 0213 D17F ] -- MOS06 0214 D17F -- MOS06 0215 D17F ;Convert external to internal co-ordinates -- MOS06 0216 D17F -- MOS06 0217 D17F ;EIG converts from external co-ords (either relative or abs) -- MOS06 0218 D17F ;and produces internal ones in situ. No windowing is done. -- MOS06 0219 D17F ;Requires (X) = the offset from V of the points to be converted -- MOS06 0220 D17F ;b2 of PLMODE = 0 for relative co-ords (add the Ecursor) -- MOS06 0221 D17F ; 1 for absolute co-ords (add the origin) -- MOS06 0222 D17F ;GCSR, ORGX, ORGY as usual -- MOS06 0223 D17F ;Writes the transformed co-ordinates from whence they came -- MOS06 0224 D17F ;Also writes new point to external cursor (GCSX,GCSY) -- MOS06 0225 D17F ;hence in triangle relative mode, the points are relative -- MOS06 0226 D17F ;to the last specified, not the original cursor -- MOS06 0227 D17F -- MOS06 0228 D17F ;a) Add the cursor to current posn. if relative -- MOS06 0229 D17F ;& add origin in both cases -- MOS06 0230 D17F -- MOS06 0231 D17F [ MOS125 = &FF -- MOS06 0233 D17F ] -- MOS06 0234 D17F 85 DA EIGC STA ZTEMP -- MOS06 0235 D181 A0 02 LDYIM &02 ;Do this for Y co-ordinates -- MOS06 0236 D183 20 A5 D1 JSR EIGS -- MOS06 0237 D186 20 DC D1 JSR DIVAXT ;1024 points vertically -- MOS06 0238 D189 A0 00 LDYIM &00 -- MOS06 0239 D18B CA DEX -- MOS06 0240 D18C CA DEX -- MOS06 0241 D18D 20 A5 D1 JSR EIGS ;Do this for X co-ordinates -- MOS06 0242 D190 -- MOS06 0243 D190 ;b) scale down by the necessary factor -- MOS06 0244 D190 ;(EIGS has already divided by 2) -- MOS06 0245 D190 -- MOS06 0246 D190 AC 61 03 LDY NPIX ;How many pixles ? -- MOS06 0247 D193 C0 03 CPYIM &03 -- MOS06 0248 D195 F0 05 BEQ EIGA ;4?, then divide by 4 MOS06 0248 D195 v7A MOS06 0249 D197 B0 06 BCS EIGB ;8?, then divide by 2 MOS06 0249 D197 v79 MOS06 0250 D199 20 DC D1 JSR DIVAXT ;2?, then divide by 8 MOS06 0249 D197 v79 MOS06 0251 D19C 20 DC D1 EIGA JSR DIVAXT MOS06 0249 D197 v79 MOS06 0252 D19F AD 56 03 EIGB LDA MEMODE ;Is it a 10K mode? -- MOS06 0253 D1A2 D0 38 BNE DIVAXT ;YES, then another divide by 2 MOS06 0253 D1A2 v47 MOS06 0254 D1A4 60 RTS ; NO, then skip MOS06 MOS06 MOS06 MOS06 Acorn macro assembler Page 31 MOS06 VDU File - MOS06 MOS06 MOS06 0253 D1A2 v47 MOS06 0255 D1A5 MOS06 0253 D1A2 v47 MOS06 0256 D1A5 18 EIGS CLC MOS06 0253 D1A2 v47 MOS06 0257 D1A6 A5 DA LDA ZTEMP ;Test b2 of plot mode, for rel./abs. MOS06 0253 D1A2 v47 MOS06 0258 D1A8 29 04 ANDIM &04 MOS06 0253 D1A2 v47 MOS06 0259 D1AA F0 09 BEQ EIGSA ;Clear, so relative ( & skip ) MOS06 0253 D1A2 v47 MOS06 0260 D1AC BD 02 03 LDAAX V+&02 ;(LSB) ~~~ ABSOLUTE ~~~ MOS06 0253 D1A2 v47 MOS06 0261 D1AF 48 PHA MOS06 0253 D1A2 v47 MOS06 0262 D1B0 BD 03 03 LDAAX V+&03 ;(MSB) MOS06 0253 D1A2 v47 MOS06 0263 D1B3 90 0E BCC EIGSB ;(branch always taken) MOS06 0253 D1A2 v47 MOS06 0264 D1B5 BD 02 03 EIGSA LDAAX V+&02 ;~~~ RELATIVE ~~~ MOS06 0253 D1A2 v47 MOS06 0265 D1B8 79 10 03 ADCAY GCSR ;so add prev. cursor (LSB) MOS06 0253 D1A2 v47 MOS06 0266 D1BB 48 PHA MOS06 0253 D1A2 v47 MOS06 0267 D1BC BD 03 03 LDAAX V+&03 ;(MSB) MOS06 0253 D1A2 v47 MOS06 0268 D1BF 79 11 03 ADCAY GCSR+&01 MOS06 0253 D1A2 v47 MOS06 0269 D1C2 18 CLC MOS06 0253 D1A2 v47 MOS06 0270 D1C3 99 11 03 EIGSB STAAY GCSR+&01 ;Update MSB of cursor MOS06 0253 D1A2 v47 MOS06 0271 D1C6 79 0D 03 ADCAY ORG+&01 ;Now add origin for both addressing modes ! MOS06 0253 D1A2 v47 MOS06 0272 D1C9 9D 03 03 STAAX V+&03 ;(MSB) MOS06 0253 D1A2 v47 MOS06 0273 D1CC 68 PLA ;Pull LSByte MOS06 0253 D1A2 v47 MOS06 0274 D1CD 99 10 03 STAAY GCSR ;Update LSB of cursor MOS06 0253 D1A2 v47 MOS06 0275 D1D0 18 CLC MOS06 0253 D1A2 v47 MOS06 0276 D1D1 79 0C 03 ADCAY ORG ;(LSB) MOS06 0253 D1A2 v47 MOS06 0277 D1D4 9D 02 03 STAAX V+&02 MOS06 0253 D1A2 v47 MOS06 0278 D1D7 90 03 BCC DIVAXT MOS06 0253 D1A2 v47 MOS06 0279 D1D9 FE 03 03 INCAX V+&03 ;Carry into MSB if needs be MOS06 0253 D1A2 v47 MOS06 0280 D1DC MOS06 0253 D1A2 v47 MOS06 0281 D1DC ;Divide this by 2 by falling through to ... MOS06 0253 D1A2 v47 MOS06 0282 D1DC MOS06 0253 D1A2 v47 MOS06 0283 D1DC BD 03 03 DIVAXT LDAAX V+&03 ;Signed division by 2 -- MOS06 0284 D1DF 0A ASLA ;(Screen now 1280 by 1024) -- MOS06 0285 D1E0 7E 03 03 RORAX V+&03 -- MOS06 0286 D1E3 7E 02 03 RORAX V+&02 -- MOS06 0287 D1E6 [ MOS125 = &FF -- MOS06 0288 D1E6 | -- MOS06 0289 D1E6 LINEX1 -- MOS06 0290 D1E6 ] -- MOS06 0291 D1E6 60 RTS MOS07 0127 D25D ^07 MOS06 0292 D1E7 MOS07 0127 D25D ^07 MOS06 0293 D1E7 [ MOS125 = &FF MOS07 0127 D25D ^07 MOS06 0322 D1E7 ] MOS07 0127 D25D ^07 MOS06 0323 D1E7 MOS07 0127 D25D ^07 MOS06 0324 D1E7 LNK MOS07 MOS07 0127 D25D ^07 MOS07 0001 D1E7 TTL VDU File - MOS07 MOS07 0127 D25D ^07 MOS07 0002 D1E7 OPT MOS07 MOS07 MOS07 MOS07 MOS07 Acorn macro assembler Page 32 MOS07 VDU File - MOS07 MOS07 MOS07 0127 D25D ^07 MOS07 0003 D1E7 MOS07 0127 D25D ^07 MOS07 0004 D1E7 ;Last revision 01/05/82 MOS07 0127 D25D ^07 MOS07 0005 D1E7 MOS07 0127 D25D ^07 MOS07 0006 D1E7 ;01/05/82 Recoded to allow for new order of variables & manifests MOS07 0127 D25D ^07 MOS07 0007 D1E7 ;21/04/82 LINE rewritten MOS07 0127 D25D ^07 MOS07 0008 D1E7 ;19/04/82 One byte saved in SB MOS07 0127 D25D ^07 MOS07 0009 D1E7 ;25/03/82 Change all refs. to BEGSCN+1 to BEGSCN MOS07 0127 D25D ^07 MOS07 0010 D1E7 ;14/11/81 Variable mark space on DOTS removed MOS07 0127 D25D ^07 MOS07 0011 D1E7 MOS07 0127 D25D ^07 MOS07 0012 D1E7 ;******* PLOTTING ******* MOS07 0127 D25D ^07 MOS07 0013 D1E7 MOS07 0127 D25D ^07 MOS07 0014 D1E7 ;LINE plots straight line from cursor to new point MOS07 0127 D25D ^07 MOS07 0015 D1E7 ;taking account windowing, & plotting partial lines MOS07 0127 D25D ^07 MOS07 0016 D1E7 ;if necessary MOS07 0127 D25D ^07 MOS07 0017 D1E7 MOS07 0127 D25D ^07 MOS07 0018 D1E7 ;Requires GCSIR = the current cursor position (I co-ords) MOS07 0127 D25D ^07 MOS07 0019 D1E7 ;NEWPT = the point to plotted to (I co-ords) MOS07 0127 D25D ^07 MOS07 0020 D1E7 ;Windowing is assumed of neither MOS07 0127 D25D ^07 MOS07 0021 D1E7 MOS07 0127 D25D ^07 MOS07 0022 D1E7 MOS07 0127 D25D ^07 MOS07 0023 D1E7 ;Plot a straight line MOS07 0127 D25D ^07 MOS07 0024 D1E7 MOS07 0127 D25D ^07 MOS07 0025 D1E7 20 FF D3 LINE JSR LINSA ;Find DeltaX & DeltaY to LDELTA MOS07 0127 D25D ^07 MOS07 0026 D1EA ;LINSB Returns n=1 iff MOD DeltaX < MOD DeltaY MOS07 0127 D25D ^07 MOS07 0027 D1EA ;Encoded version of a previous routine MOS07 0127 D25D ^07 MOS07 0028 D1EA MOS07 0127 D25D ^07 MOS07 0029 D1EA AD 2B 03 LDA LDELTA+&03 ;DY, MSB Are the deltas of the same sign? MOS07 0127 D25D ^07 MOS07 0030 D1ED [ MOS125 = &FF MOS07 0127 D25D ^07 MOS07 0043 D1ED | MOS07 0127 D25D ^07 MOS07 0044 D1ED AA TAX MOS07 0127 D25D ^07 MOS07 0045 D1EE 4D 29 03 EOR LDELTA+&01 ;DX, MSB MOS07 0127 D25D ^07 MOS07 0046 D1F1 0A ASLA MOS07 0127 D25D ^07 MOS07 0047 D1F2 AD 2A 03 LDA LDELTA+&02 MOS07 0127 D25D ^07 MOS07 0048 D1F5 B0 0A BCS LINSBA MOS07 0127 D25D ^07 MOS07 0049 D1F7 CD 28 03 CMP LDELTA ;YES, then compare DeltaY - DeltaX MOS07 0127 D25D ^07 MOS07 0050 D1FA 8A TXA MOS07 0127 D25D ^07 MOS07 0051 D1FB ED 29 03 SBC LDELTA+&01 MOS07 0127 D25D ^07 MOS07 0052 D1FE 4C 09 D2 JMP LINSBB MOS07 0127 D25D ^07 MOS07 0053 D201 18 LINSBA CLC ;NO, then add MOS07 0127 D25D ^07 MOS07 0054 D202 6D 28 03 ADC LDELTA MOS07 0127 D25D ^07 MOS07 0055 D205 8A TXA MOS07 0127 D25D ^07 MOS07 0056 D206 6D 29 03 ADC LDELTA+&01 MOS07 0127 D25D ^07 MOS07 0057 D209 ] MOS07 0127 D25D ^07 MOS07 0058 D209 6A LINSBB RORA ;c to b7 of A MOS07 0127 D25D ^07 MOS07 0059 D20A A2 00 LDXIM &00 MOS07 0127 D25D ^07 MOS07 0060 D20C 4D 2B 03 EOR LDELTA+&03 ;If DY < 0, then invert b7 of A. Sets n as required MOS07 0127 D25D ^07 MOS07 0061 D20F ; MOS07 0127 D25D ^07 MOS07 0062 D20F 10 02 BPL LINEA MOS07 0127 D25D ^07 MOS07 0063 D211 A2 02 LDXIM &02 MOS07 0127 D25D ^07 MOS07 0064 D213 86 DE LINEA STX ZTEMPC ;0 if p.b.X, 2 if p.b.Y MOS07 0127 D25D ^07 MOS07 0065 D215 BD AA C4 LDAAX D1JTB ;JVEC initialisation (D1 jump vector) MOS07 0127 D25D ^07 MOS07 0066 D218 8D 5D 03 STA JVEC MOS07 0127 D25D ^07 MOS07 0067 D21B BD AB C4 LDAAX D1JTB+&01 MOS07 0127 D25D ^07 MOS07 0068 D21E 8D 5E 03 STA JVEC+&01 MOS07 0127 D25D ^07 MOS07 0069 D221 [ MOS125 = &FF MOS07 0127 D25D ^07 MOS07 0076 D221 | MOS07 0127 D25D ^07 MOS07 0077 D221 A9 24 LDAIM GCSIR-V ;+ve, then LSTART from GCSIR... MOS07 0127 D25D ^07 MOS07 0078 D223 BC 29 03 LDYAX LDELTA+&01 ;Sign of D1 MOS07 0127 D25D ^07 MOS07 0079 D226 30 02 BMI LINEC MOS07 0127 D25D ^07 MOS07 0080 D228 A9 20 LDAIM NEWPT-V ;Copy LSTART from new point MOS07 0127 D25D ^07 MOS07 0081 D22A 85 DF LINEC STA ZTEMPC+&01 ;Offset of LSTART (=PStart of old) MOS07 0127 D25D ^07 MOS07 0082 D22C AA TAX MOS07 0127 D25D ^07 MOS07 0083 D22D ] MOS07 0127 D25D ^07 MOS07 0084 D22D A0 2C LDYIM LSTART-V ;Copy to LSTART MOS07 0127 D25D ^07 MOS07 0085 D22F 20 7C D4 JSR COPYF MOS07 0127 D25D ^07 MOS07 0086 D232 A5 DF LDA ZTEMPC+&01 ;Get Horizontal co-ordinate of other (end) point MOS07 0127 D25D ^07 MOS07 0087 D234 49 04 EORIM &04 ;This requires NEWPT to be multiple of 8 & GCSIR 4 above it MOS07 0127 D25D ^07 MOS07 0088 D236 85 DD STA ZTEMPB+&01 MOS07 0127 D25D ^07 MOS07 0089 D238 05 DE ORA ZTEMPC ;Get Hend (horizontal co-ordinate of endpoint) MOS07 0127 D25D ^07 MOS07 0090 D23A AA TAX MOS07 0127 D25D ^07 MOS07 0091 D23B 20 72 D4 JSR COPY2H MOS07 0127 D25D ^07 MOS07 0092 D23E [ MOS125 = &FF MOS07 0127 D25D ^07 MOS07 0107 D23E | MOS07 0127 D25D ^07 MOS07 0108 D23E A2 2C LDXIM LSTART-V ;Window start point LSTART MOS07 0127 D25D ^07 MOS07 0109 D240 20 43 D1 JSR WIND MOS07 0127 D25D ^07 MOS07 0110 D243 85 DC STA ZTEMPB MOS07 0127 D25D ^07 MOS07 0111 D245 C9 01 CMPIM &01 ;C=1 iff start point not inside MOS07 0127 D25D ^07 MOS07 0112 D247 AD 1F 03 LDA PLMODE ;Initialise dotted line test MOS07 0127 D25D ^07 MOS07 0113 D24A 29 10 ANDIM &10 ;Isolate b4 MOS07 0127 D25D ^07 MOS07 0114 D24C F0 02 BEQ LINED MOS07 0127 D25D ^07 MOS07 0115 D24E A9 80 LDAIM &80 ;now $80 if plot dotted line, $00 if full line MOS07 0127 D25D ^07 MOS07 0116 D250 90 02 LINED BCC LINEL MOS07 0127 D25D ^07 MOS07 0117 D252 09 40 ORAIM &40 ;Start point not inside, so slow plot MOS07 0127 D25D ^07 MOS07 0118 D254 85 DB LINEL STA ZTEMP+&01 MOS07 0127 D25D ^07 MOS07 0119 D256 A6 DD LDX ZTEMPB+&01 ;Window other point MOS07 0127 D25D ^07 MOS07 0120 D258 ] MOS07 0127 D25D ^07 MOS07 0121 D258 20 43 D1 JSR WIND MOS07 0127 D25D ^07 MOS07 0122 D25B 24 DC BIT ZTEMPB ;Anything to do ? MOS07 0127 D25D ^07 MOS07 0123 D25D [ MOS125 = &FF MOS07 0127 D25D ^07 MOS07 0126 D25D | MOS07 0127 D25D ^07 MOS07 0127 D25D D0 87 BNE LINEX1 ;No, then exit -- MOS07 0128 D25F ] -- MOS07 0129 D25F A6 DE LINEE LDX ZTEMPC ;Isolate 2nd horizontal window -- MOS07 0130 D261 F0 02 BEQ LINEF MOS07 0130 D261 v7D MOS07 0131 D263 4A LSRA MOS07 0130 D261 v7D MOS07 0132 D264 4A LSRA MOS07 0130 D261 v7D MOS07 0133 D265 29 02 LINEF ANDIM &02 -- MOS07 0134 D267 F0 07 BEQ LINEG ;Zero, so Hend is in window MOS07 0134 D267 v78 MOS07 0135 D269 8A TXA ;Point X to upper margin! MOS07 0134 D267 v78 MOS07 0136 D26A 09 04 ORAIM GWRCOL-V ;Assumes GWLCOL-V is a multiple of 4 MOS07 0134 D267 v78 MOS07 0137 D26C AA TAX ;Endpoint outside horizontal window, MOS07 0134 D267 v78 MOS07 0138 D26D 20 72 D4 JSR COPY2H ;so alter Hend to high margin MOS07 0134 D267 v78 MOS07 0139 D270 20 1E D4 LINEG JSR LINSG ;Get L values & MOD deltas -- MOS07 0140 D273 A5 DE LDA ZTEMPC -- MOS07 0141 D275 49 02 EORIM &02 -- MOS07 0142 D277 AA TAX ;Unsigned D2 -- MOS07 0143 D278 A8 TAY -- MOS07 0144 D279 AD 29 03 LDA LDELTA+&01 ;Sign of D2 ? -- MOS07 0145 D27C 4D 2B 03 EOR LDELTA+&03 -- MOS07 0146 D27F 10 01 BPL LINEH MOS07 0146 D27F v7E MOS07 0147 D281 E8 INX ;Signed D2 - E,W,N,S MOS07 0146 D27F v7E MOS07 0148 D282 BD AE C4 LINEH LDAAX D2JTBL ;Initialise D2 jump vector -- MOS07 0149 D285 8D 32 03 STA D2JVEC -- MOS07 0150 D288 BD B2 C4 LDAAX D2JTBH -- MOS07 0151 D28B 8D 33 03 STA D2JVEC+&01 -- MOS07 0152 D28E A9 7F LDAIM &7F ;dotted line initialisation -- MOS07 0153 D290 8D 34 03 STA DOTFLG -- MOS07 0154 D293 24 DB BIT ZTEMP+&01 -- MOS07 0155 D295 70 29 BVS LINEI ;Slow plot , so set ZTEMPC strangely MOS07 0155 D295 v56 MOS07 0156 D297 BD 47 C4 LDAAX EWTBA ;(4,0,6,2) Calculate V points MOS07 0155 D295 v56 MOS07 0157 D29A AA TAX MOS07 MOS07 MOS07 MOS07 Acorn macro assembler Page 33 MOS07 VDU File - MOS07 MOS07 MOS07 0155 D295 v56 MOS07 0158 D29B 38 SEC MOS07 0155 D295 v56 MOS07 0159 D29C BD 00 03 LDAAX GWLCOL MOS07 0155 D295 v56 MOS07 0160 D29F F9 2C 03 SBCAY LSTART MOS07 0155 D295 v56 MOS07 0161 D2A2 85 DA STA ZTEMP MOS07 0155 D295 v56 MOS07 0162 D2A4 BD 01 03 LDAAX GWLCOL+&01 MOS07 0155 D295 v56 MOS07 0163 D2A7 F9 2D 03 SBCAY LSTART+&01 MOS07 0155 D295 v56 MOS07 0164 D2AA A4 DA LDY ZTEMP MOS07 0155 D295 v56 MOS07 0165 D2AC AA TAX ;Ensure +ve MOS07 0155 D295 v56 MOS07 0166 D2AD 10 04 BPL LINEH1 MOS07 0155 D295 v56 MOS07 0167 D2AF 20 8D D4 JSR NEGAY MOS07 0155 D295 v56 MOS07 0168 D2B2 [ MOS125 = &FF MOS07 0155 D295 v56 MOS07 0170 D2B2 | MOS07 0155 D295 v56 MOS07 0171 D2B2 AA TAX ;MSB of no. V points MOS07 0155 D295 v56 MOS07 0172 D2B3 LINEH1 MOS07 0155 D295 v56 MOS07 0173 D2B3 ] MOS07 0155 D295 v56 MOS07 0174 D2B3 C8 INY ;Increment this no. MOS07 0155 D295 v56 MOS07 0175 D2B4 D0 01 BNE LINEH2 MOS07 0155 D295 v56 MOS07 0176 D2B6 E8 INX MOS07 0155 D295 v56 MOS07 0177 D2B7 8A LINEH2 TXA ;MSB non-zero ? MOS07 0155 D295 v56 MOS07 0178 D2B8 F0 02 BEQ LINEH3 MOS07 0155 D295 v56 MOS07 0179 D2BA A0 00 LDYIM &00 ;Yes, then no limit to no. of vertical points MOS07 0155 D295 v56 MOS07 0180 D2BC 84 DF LINEH3 STY ZTEMPC+&01 ; Zero is always set here MOS07 0155 D295 v56 MOS07 0181 D2BE F0 09 BEQ LINEJ1 MOS07 0155 D295 v56 MOS07 0182 D2C0 8A LINEI TXA ;b7 = sign of D2. b1=D2 MOS07 0181 D2BE v76 MOS07 0183 D2C1 4A LSRA MOS07 0181 D2BE v76 MOS07 0184 D2C2 6A RORA MOS07 0181 D2BE v76 MOS07 0185 D2C3 09 02 ORAIM &02 MOS07 0181 D2BE v76 MOS07 0186 D2C5 45 DE EOR ZTEMPC MOS07 0181 D2BE v76 MOS07 0187 D2C7 85 DE STA ZTEMPC MOS07 0181 D2BE v76 MOS07 0188 D2C9 A2 2C LINEJ1 LDXIM LSTART-V ;Address the first point -- MOS07 0189 D2CB 20 30 D8 JSR GADDR ;Now loads YLINE to Y -- MOS07 0190 D2CE A6 DC LDX ZTEMPB -- MOS07 0191 D2D0 D0 02 BNE LINEN MOS07 0191 D2D0 v7D MOS07 0192 D2D2 C6 DD DEC ZTEMPB+&01 MOS07 0191 D2D0 v7D MOS07 0193 D2D4 CA LINEN DEX -- MOS07 0194 D2D5 ; -- MOS07 0195 D2D5 ; Fall through to main plot routine -- MOS07 0196 D2D5 ; -- MOS07 0197 D2D5 A5 DB LINEJ LDA ZTEMP +&01 ;Was midpoint or DOTS referenced ? -- MOS07 0198 D2D7 F0 1F BEQ DOTYES ;No?, then run along MOS07 0198 D2D7 v60 MOS07 0199 D2D9 10 10 BPL MPTEST ;No, then do midpoint test MOS07 0198 D2D7 v60 MOS07 0200 D2DB 2C 34 03 BIT DOTFLG ;b7 set, then dotted MOS07 0198 D2D7 v60 MOS07 0201 D2DE 10 05 BPL DOTY ;Branch if last was a space MOS07 0198 D2D7 v60 MOS07 0202 D2E0 CE 34 03 DEC DOTFLG ;now to $7F MOS07 0198 D2D7 v60 MOS07 0203 D2E3 D0 23 BNE DOTNO ;(branch always taken) MOS07 0203 D2E3 v5C MOS07 0204 D2E5 EE 34 03 DOTY INC DOTFLG ;to $80 MOS07 0203 D2E3 v5C MOS07 0205 D2E8 0A ASLA MOS07 0203 D2E3 v5C MOS07 0206 D2E9 10 0D BPL DOTYES ;No?, then plot the point MOS07 0203 D2E3 v5C MOS07 0207 D2EB 86 DC MPTEST STX ZTEMPB ;Store X temporarily MOS07 0203 D2E3 v5C MOS07 0208 D2ED A2 2C LDXIM LSTART-V ;Window the point at Q +0D (PStart) MOS07 0203 D2E3 v5C MOS07 0209 D2EF 20 2B D8 JSR GADDV ;& address if window was successful MOS07 0203 D2E3 v5C MOS07 0210 D2F2 A6 DC LDX ZTEMPB ;Restore X MOS07 0203 D2E3 v5C MOS07 0211 D2F4 09 00 ORAIM &00 ;To TSTA (a la 6800) (result of window) MOS07 0203 D2E3 v5C MOS07 0212 D2F6 D0 10 BNE DOTNO ;Outside?, then skip the plot MOS07 0203 D2E3 v5C MOS07 0213 D2F8 A5 D1 DOTYES LDA ZMASK ;Plot the point MOS07 0203 D2E3 v5C MOS07 0214 D2FA 25 D4 AND ZGORA MOS07 0203 D2E3 v5C MOS07 0215 D2FC 11 D6 ORAIY ZMEMG MOS07 0203 D2E3 v5C MOS07 0216 D2FE 85 DA STA ZTEMP MOS07 0203 D2E3 v5C MOS07 0217 D300 A5 D5 LDA ZGEOR MOS07 0203 D2E3 v5C MOS07 0218 D302 25 D1 AND ZMASK MOS07 0203 D2E3 v5C MOS07 0219 D304 45 DA EOR ZTEMP MOS07 0203 D2E3 v5C MOS07 0220 D306 91 D6 STAIY ZMEMG MOS07 0203 D2E3 v5C MOS07 0221 D308 MOS07 0203 D2E3 v5C MOS07 0222 D308 ;L := L - DeltaV MOS07 0203 D2E3 v5C MOS07 0223 D308 MOS07 0203 D2E3 v5C MOS07 0224 D308 38 DOTNO SEC -- MOS07 0225 D309 AD 35 03 LDA LPARMS ;L,LSB -- MOS07 0226 D30C ED 37 03 SBC LPARMS+&02 ;DeltaV,LSB -- MOS07 0227 D30F 8D 35 03 STA LPARMS -- MOS07 0228 D312 AD 36 03 LDA LPARMS+&01 ;L,MSB -- MOS07 0229 D315 ED 38 03 SBC LPARMS+&03 ;DeltaV,MSB -- MOS07 0230 D318 B0 11 BCS LINED1 ;Skip if D2 not to be taken ( L > 0 ) MOS07 0230 D318 v6E MOS07 0231 D31A 85 DA STA ZTEMP ;D2 must be taken, thus MOS07 0230 D318 v6E MOS07 0232 D31C AD 35 03 LDA LPARMS ;L := L + DeltaH MOS07 0230 D318 v6E MOS07 0233 D31F 6D 39 03 ADC LPARMS+&04 ;LSB of DeltaH (c=0) MOS07 0230 D318 v6E MOS07 0234 D322 8D 35 03 STA LPARMS MOS07 0230 D318 v6E MOS07 0235 D325 A5 DA LDA ZTEMP MOS07 0230 D318 v6E MOS07 0236 D327 6D 3A 03 ADC LPARMS+&05 ;MSB of DeltaH MOS07 0230 D318 v6E MOS07 0237 D32A 18 CLC ;Do do D2 MOS07 0230 D318 v6E MOS07 0238 D32B 8D 36 03 LINED1 STA LPARMS+&01 ;Store MSB of L, preserving c -- MOS07 0239 D32E 08 PHP ;Needed for decrementing no. of V points -- MOS07 0240 D32F B0 09 BCS LINEE1 ;Don't do D2 if you're not meant to MOS07 0240 D32F v76 MOS07 0241 D331 6C 32 03 JMI D2JVEC ;Jump to D2, through JVEC2, to xB (below) MOS07 0240 D32F v76 MOS07 0242 D334 88 NB DEY MOS07 0240 D32F v76 MOS07 0243 D335 10 03 BPL LINEE1 ;~~~~~~~~~~~~~~ D2 KING MOVES ~~~~~~~~~~~~~~ MOS07 0240 D32F v76 MOS07 0244 D337 20 C5 D3 JSR NBDY MOS07 0240 D32F v76 MOS07 0245 D33A 6C 5D 03 LINEE1 JMI JVEC MOS07 0266 D368 ^50 MOS07 0246 D33D C8 SB INY MOS07 0266 D368 ^50 MOS07 0247 D33E C0 08 CPYIM &08 MOS07 0266 D368 ^50 MOS07 0248 D340 D0 F8 BNE LINEE1 MOS07 0266 D368 ^50 MOS07 0249 D342 18 CLC ; encoded version of SBDY MOS07 0266 D368 ^50 MOS07 0250 D343 A5 D6 LDA ZMEMG MOS07 0266 D368 ^50 MOS07 0251 D345 6D 52 03 ADC BYTROW MOS07 0266 D368 ^50 MOS07 0252 D348 85 D6 STA ZMEMG MOS07 0266 D368 ^50 MOS07 0253 D34A A5 D7 LDA ZMEMG +&01 MOS07 0266 D368 ^50 MOS07 0254 D34C 6D 53 03 ADC BYTROW +&01 MOS07 0266 D368 ^50 MOS07 0255 D34F 10 04 BPL SBDYA MOS07 0266 D368 ^50 MOS07 0256 D351 38 SEC MOS07 0266 D368 ^50 MOS07 0257 D352 ED 54 03 SBC BYTSCN MOS07 0266 D368 ^50 MOS07 0258 D355 85 D7 SBDYA STA ZMEMG +&01 MOS07 0266 D368 ^50 MOS07 0259 D357 A0 00 LDYIM &00 MOS07 0266 D368 ^50 MOS07 0260 D359 6C 5D 03 JMI JVEC MOS07 0266 D368 ^50 MOS07 0261 D35C 46 D1 EB LSR ZMASK MOS07 0266 D368 ^50 MOS07 0262 D35E 90 DA BCC LINEE1 MOS07 0266 D368 ^50 MOS07 0263 D360 20 DF D3 JSR EBDY MOS07 0266 D368 ^50 MOS07 0264 D363 6C 5D 03 JMI JVEC MOS07 0266 D368 ^50 MOS07 0265 D366 06 D1 WB ASL ZMASK MOS07 0266 D368 ^50 MOS07 0266 D368 90 D0 BCC LINEE1 -- MOS07 0267 D36A 20 EF D3 JSR WBDY -- MOS07 0268 D36D 6C 5D 03 JMI JVEC -- MOS07 0269 D370 88 NA DEY -- MOS07 0270 D371 10 0C BPL LINEF1 ;~~~~~~~~~~~~~~ D1 KING MOVES ~~~~~~~~~~~~~~ MOS07 0270 D371 v73 MOS07 0271 D373 20 C5 D3 JSR NBDY MOS07 0270 D371 v73 MOS07 0272 D376 D0 07 BNE LINEF1 ; NBDY returns Zero false MOS07 0270 D371 v73 MOS07 0273 D378 46 D1 EA LSR ZMASK MOS07 0270 D371 v73 MOS07 0274 D37A 90 03 BCC LINEF1 MOS07 0270 D371 v73 MOS07 0275 D37C 20 DF D3 JSR EBDY MOS07 0270 D371 v73 MOS07 0276 D37F 28 LINEF1 PLP ;Did D2 occur ? Result to c (c=0 if it did) -- MOS07 0277 D380 E8 INX ;Inc no. H points left to plot (following preserves c) -- MOS07 0278 D381 D0 04 BNE LINEG1 MOS07 0278 D381 v7B MOS07 0279 D383 E6 DD INC ZTEMPB +&01 MOS07 MOS07 MOS07 MOS07 Acorn macro assembler Page 34 MOS07 VDU File - MOS07 MOS07 MOS07 0278 D381 v7B MOS07 0280 D385 F0 0A BEQ LINEX ;Zero?, then exit MOS07 0280 D385 v75 MOS07 0281 D387 24 DB LINEG1 BIT ZTEMP +&01 ;Was midpoint referenced? (preserves c) MOS07 0280 D385 v75 MOS07 0282 D389 70 07 BVS FRIGA ;Yes, then go to the nasty bit MOS07 0280 D385 v75 MOS07 0283 D38B B0 35 BCS LINEK ;D2 ?, then test V window. c from last PLP MOS07 0283 D38B v4A MOS07 0284 D38D C6 DF DEC ZTEMPC +&01 ;Off V window ?, then exit MOS07 0283 D38B v4A MOS07 0285 D38F D0 31 BNE LINEK MOS07 0283 D38B v4A MOS07 0286 D391 60 LINEX RTS MOS07 0283 D38B v4A MOS07 0287 D392 A5 DE FRIGA LDA ZTEMPC ;Which direction was D2 ? MOS07 0283 D38B v4A MOS07 0288 D394 86 DC STX ZTEMPB MOS07 0283 D38B v4A MOS07 0289 D396 29 02 ANDIM &02 MOS07 0283 D38B v4A MOS07 0290 D398 AA TAX MOS07 0283 D38B v4A MOS07 0291 D399 B0 19 BCS FRIGC ;No D2?, then skip the adjustment of V MOS07 0283 D38B v4A MOS07 0292 D39B 24 DE BIT ZTEMPC ;Was D2 +ve ? MOS07 0283 D38B v4A MOS07 0293 D39D 30 0A BMI FRIGB MOS07 0283 D38B v4A MOS07 0294 D39F FE 2C 03 INCAX LSTART ;D2 +ve, so increment V co-ord MOS07 0283 D38B v4A MOS07 0295 D3A2 D0 10 BNE FRIGC MOS07 0283 D38B v4A MOS07 0296 D3A4 FE 2D 03 INCAX LSTART+&01 MOS07 0283 D38B v4A MOS07 0297 D3A7 90 0B BCC FRIGC ;(branch always taken) MOS07 0283 D38B v4A MOS07 0298 D3A9 BD 2C 03 FRIGB LDAAX LSTART ;D2 -ve, so dec. the V co-ord. MOS07 0283 D38B v4A MOS07 0299 D3AC D0 03 BNE FRIGF MOS07 0283 D38B v4A MOS07 0300 D3AE DE 2D 03 DECAX LSTART+&01 MOS07 0283 D38B v4A MOS07 0301 D3B1 DE 2C 03 FRIGF DECAX LSTART MOS07 0283 D38B v4A MOS07 0302 D3B4 8A FRIGC TXA ;Get offset of D1 MOS07 0283 D38B v4A MOS07 0303 D3B5 49 02 EORIM &02 MOS07 0283 D38B v4A MOS07 0304 D3B7 AA TAX MOS07 0283 D38B v4A MOS07 0305 D3B8 FE 2C 03 INCAX LSTART ;D1 +ve,so inc. H co-ord MOS07 0283 D38B v4A MOS07 0306 D3BB D0 03 BNE FRIGD MOS07 0283 D38B v4A MOS07 0307 D3BD FE 2D 03 INCAX LSTART+&01 MOS07 0283 D38B v4A MOS07 0308 D3C0 A6 DC FRIGD LDX ZTEMPB MOS07 0283 D38B v4A MOS07 0309 D3C2 4C D5 D2 LINEK JMP LINEJ -- MOS07 0310 D3C5 -- MOS07 0311 D3C5 ;BOUNDARY ROUTINES -- MOS07 0312 D3C5 -- MOS07 0313 D3C5 ;NORTH -- MOS07 0314 D3C5 -- MOS07 0315 D3C5 ; Returns zero false -- MOS07 0316 D3C5 38 NBDY SEC -- MOS07 0317 D3C6 A5 D6 LDA ZMEMG -- MOS07 0318 D3C8 ED 52 03 SBC BYTROW -- MOS07 0319 D3CB 85 D6 STA ZMEMG -- MOS07 0320 D3CD A5 D7 LDA ZMEMG +&01 -- MOS07 0321 D3CF ED 53 03 SBC BYTROW +&01 -- MOS07 0322 D3D2 CD 4E 03 CMP BEGSCN ;Wraparound ? -- MOS07 0323 D3D5 B0 03 BCS NBDYA MOS07 0323 D3D5 v7C MOS07 0324 D3D7 6D 54 03 ADC BYTSCN MOS07 0323 D3D5 v7C MOS07 0325 D3DA 85 D7 NBDYA STA ZMEMG +&01 -- MOS07 0326 D3DC A0 07 LDYIM &07 -- MOS07 0327 D3DE 60 RTS -- MOS07 0328 D3DF -- MOS07 0329 D3DF ;EAST -- MOS07 0330 D3DF -- MOS07 0331 D3DF AD 62 03 EBDY LDA MASKL -- MOS07 0332 D3E2 85 D1 STA ZMASK -- MOS07 0333 D3E4 A5 D6 LDA ZMEMG -- MOS07 0334 D3E6 69 07 ADCIM &07 ;c=1 from branch not taken to call this -- MOS07 0335 D3E8 85 D6 STA ZMEMG -- MOS07 0336 D3EA 90 02 BCC EBDYA MOS07 0336 D3EA v7D MOS07 0337 D3EC E6 D7 INC ZMEMG +&01 MOS07 0336 D3EA v7D MOS07 0338 D3EE 60 EBDYA RTS -- MOS07 0339 D3EF -- MOS07 0340 D3EF ;WEST -- MOS07 0341 D3EF -- MOS07 0342 D3EF AD 63 03 WBDY LDA MASKR ;encoded version of WBDY -- MOS07 0343 D3F2 85 D1 STA ZMASK -- MOS07 0344 D3F4 A5 D6 LDA ZMEMG -- MOS07 0345 D3F6 D0 02 BNE WBDYA MOS07 0345 D3F6 v7D MOS07 0346 D3F8 C6 D7 DEC ZMEMG +&01 MOS07 0345 D3F6 v7D MOS07 0347 D3FA E9 08 WBDYA SBCIM &08 ;c=1 from failure of BCC -- MOS07 0348 D3FC 85 D6 STA ZMEMG -- MOS07 0349 D3FE 60 RTS -- MOS07 0350 D3FF -- MOS07 0351 D3FF LNK MOS08 -- MOS08 0001 D3FF -- MOS08 0002 D3FF TTL VDU File - MOS08 -- MOS08 0003 D3FF OPT MOS08 MOS08 MOS08 MOS08 MOS08 Acorn macro assembler Page 35 MOS08 VDU File - MOS08 MOS08 -- MOS08 0004 D3FF -- MOS08 0005 D3FF ;Last revision 18/05/82 -- MOS08 0006 D3FF ; -- MOS08 0007 D3FF ;18/05/82 External graphics cursor now updated on exit of SPLOT -- MOS08 0008 D3FF ;04/05/82 SPLOT routine entered -- MOS08 0009 D3FF ;01/05/82 Recoded using new variable order & manifests -- MOS08 0010 D3FF ;21/04/82 Most of this deleted ! LINSG modified for new LINE routine -- MOS08 0011 D3FF ;19/04/82 Byte saving in LINSCE -- MOS08 0012 D3FF -- MOS08 0013 D3FF ;LINSA calculates Delta X & Delta Y -- MOS08 0014 D3FF ;(New point - cursor), where both are in Ico-ords -- MOS08 0015 D3FF ;Max. I value always assumed to be $8000, as arithmetic -- MOS08 0016 D3FF ;is performed in 2's comp., 16 bit -- MOS08 0017 D3FF ;New point in NEWPT, results to LDELTA -- MOS08 0018 D3FF -- MOS08 0019 D3FF A0 28 LINSA LDYIM LDELTA-V ;Offset of results from V -- MOS08 0020 D401 A2 20 LDXIM NEWPT-V ;Offset of operands, from V -- MOS08 0021 D403 -- MOS08 0022 D403 ;fall through to ....... -- MOS08 0023 D403 -- MOS08 0024 D403 ;TRISA calculates Delta X & Delta Y for operands starting -- MOS08 0025 D403 ;at V+(X), and results to V+(Y). Calculation from -- MOS08 0026 D403 ;(Point at (V+(X)+4)) - (Point at (V+(X))) -- MOS08 0027 D403 -- MOS08 0028 D403 20 0A D4 TRISA JSR TRISAA -- MOS08 0029 D406 E8 INX -- MOS08 0030 D407 E8 INX -- MOS08 0031 D408 C8 INY -- MOS08 0032 D409 C8 INY -- MOS08 0033 D40A 38 TRISAA SEC -- MOS08 0034 D40B BD 04 03 LDAAX V+&04 -- MOS08 0035 D40E FD 00 03 SBCAX V -- MOS08 0036 D411 99 00 03 STAAY V -- MOS08 0037 D414 BD 05 03 LDAAX V+&05 -- MOS08 0038 D417 FD 01 03 SBCAX V+&01 -- MOS08 0039 D41A 99 01 03 STAAY V+&01 -- MOS08 0040 D41D 60 RTS -- MOS08 0041 D41E -- MOS08 0042 D41E ;LINSG calculates no. H points before H exit -- MOS08 0043 D41E ;putting 2's comp. to ZTEMPB,ZTEMPB +01 (LSB 1st). -- MOS08 0044 D41E ;Initialises MOD DELTAs & L -- MOS08 0045 D41E ;Requires ZTEMPB as usual, destroying original data -- MOS08 0046 D41E -- MOS08 0047 D41E A5 DE LINSG LDA ZTEMPC ;Calc. MOD DELTAs. -- MOS08 0048 D420 D0 07 BNE LINSGB ;Plot by Y, so straight copy MOS08 0048 D420 v78 MOS08 0049 D422 A2 28 LDXIM LDELTA-V ;Swap DeltaX & DeltaY MOS08 0048 D420 v78 MOS08 0050 D424 A0 2A LDYIM LDELTA+&02-V MOS08 0048 D420 v78 MOS08 0051 D426 20 FA CD JSR SWAP2 MOS08 0048 D420 v78 MOS08 0052 D429 A2 28 LINSGB LDXIM LDELTA-V ;Copy from modified DX & DY (now DH & DV) -- MOS08 0053 D42B A0 37 LDYIM LPARMS+&02-V ;to LPARMS+2=LDELTA -- MOS08 0054 D42D 20 7C D4 JSR COPYF ;Copy 4 bytes -- MOS08 0055 D430 -- MOS08 0056 D430 ;Initialise No. H points -- MOS08 0057 D430 -- MOS08 0058 D430 38 SEC -- MOS08 0059 D431 A6 DE LDX ZTEMPC -- MOS08 0060 D433 AD 30 03 LDA HEND ;He, LSB -- MOS08 0061 D436 FD 2C 03 SBCAX LSTART ;HSt, LSB -- MOS08 0062 D439 A8 TAY -- MOS08 0063 D43A AD 31 03 LDA HEND+&01 ;He, MSB -- MOS08 0064 D43D FD 2D 03 SBCAX LSTART+&01 ;HSt, MSB -- MOS08 0065 D440 30 03 BMI LINSGA ;Ensure in 2's comp. MOS08 0065 D440 v7C MOS08 0066 D442 20 8D D4 JSR NEGAY MOS08 0065 D440 v7C MOS08 0067 D445 85 DD LINSGA STA ZTEMPB +&01 -- MOS08 0068 D447 84 DC STY ZTEMPB -- MOS08 0069 D449 -- MOS08 0070 D449 ;now initialise L & MODULO the DH & DV -- MOS08 0071 D449 -- MOS08 0072 D449 A2 35 LDXIM LPARMS-V ;Point to the deltas -- MOS08 0073 D44B -- MOS08 0074 D44B ;& fall through to ... -- MOS08 0075 D44B -- MOS08 0076 D44B ;TRISB Set up L & MODULO deltas. -- MOS08 0077 D44B ;Assumes V+(X) points to LL,LH,DVL,DVH,DHL,DHH -- MOS08 0078 D44B ;Sets all Dxy to ABS in situ. Sets L := DH/2 (2 byte arith) -- MOS08 0079 D44B -- MOS08 0080 D44B 20 59 D4 TRISB JSR TRISBA ;Do DH -- MOS08 0081 D44E 4A LSRA -- MOS08 0082 D44F 9D 01 03 STAAX V+&01 ;Initialise LH -- MOS08 0083 D452 98 TYA ;Now do LL -- MOS08 0084 D453 6A RORA -- MOS08 0085 D454 9D 00 03 STAAX V -- MOS08 0086 D457 CA DEX ;Now DV -- MOS08 0087 D458 CA DEX -- MOS08 0088 D459 BC 04 03 TRISBA LDYAX V+&04 ;LSB -- MOS08 0089 D45C BD 05 03 LDAAX V+&05 ;MSB -- MOS08 0090 D45F 10 0C BPL TRISBB ;Find ABS value MOS08 0090 D45F v73 MOS08 0091 D461 20 8D D4 JSR NEGAY MOS08 0090 D45F v73 MOS08 0092 D464 9D 05 03 STAAX V+&05 ;PAIN - why the hell isn't there a STYAX on this wretched chip ?? MOS08 0090 D45F v73 MOS08 0093 D467 48 PHA MOS08 0090 D45F v73 MOS08 0094 D468 98 TYA MOS08 0090 D45F v73 MOS08 0095 D469 9D 04 03 STAAX V+&04 MOS08 0090 D45F v73 MOS08 0096 D46C 68 PLA MOS08 0090 D45F v73 MOS08 0097 D46D 60 TRISBB RTS -- MOS08 0098 D46E -- MOS08 0099 D46E -- MOS08 0100 D46E ;COPYF copies 4 bytes from (V)+(X) to (V)+(Y) -- MOS08 0101 D46E -- MOS08 0102 D46E A9 08 COPY8 LDAIM &08 -- MOS08 0103 D470 D0 0C BNE COPY MOS08 0103 D470 v73 MOS08 0104 D472 MOS08 0103 D470 v73 MOS08 0105 D472 A0 30 COPY2H LDYIM HEND-V MOS08 0103 D470 v73 MOS08 0106 D474 A9 02 COPY2 LDAIM &02 MOS08 0103 D470 v73 MOS08 0107 D476 D0 06 BNE COPY MOS08 0103 D470 v73 MOS08 0108 D478 MOS08 0103 D470 v73 MOS08 0109 D478 A0 28 COPYFA LDYIM APCS1-V MOS08 0103 D470 v73 MOS08 0110 D47A A2 24 COPYFB LDXIM GCSIR-V MOS08 0103 D470 v73 MOS08 0111 D47C A9 04 COPYF LDAIM &04 ;SPLOTY requires that c preserved MOS08 0103 D470 v73 MOS08 0112 D47E 85 DA COPY STA ZTEMP -- MOS08 0113 D480 BD 00 03 COPYA LDAAX V MOS08 0118 D48A ^74 MOS08 0114 D483 99 00 03 STAAY V MOS08 0118 D48A ^74 MOS08 0115 D486 E8 INX MOS08 0118 D48A ^74 MOS08 0116 D487 C8 INY MOS08 0118 D48A ^74 MOS08 0117 D488 C6 DA DEC ZTEMP MOS08 0118 D48A ^74 MOS08 0118 D48A D0 F4 BNE COPYA -- MOS08 0119 D48C 60 RTS -- MOS08 0120 D48D -- MOS08 0121 D48D 48 NEGAY PHA ;Negate (AY) - push MSB -- MOS08 0122 D48E 98 TYA -- MOS08 0123 D48F 49 FF EORIM &FF -- MOS08 0124 D491 A8 TAY MOS08 MOS08 MOS08 MOS08 Acorn macro assembler Page 36 MOS08 VDU File - MOS08 MOS08 -- MOS08 0125 D492 68 PLA -- MOS08 0126 D493 49 FF EORIM &FF -- MOS08 0127 D495 [ MOS125 = &FF -- MOS08 0133 D495 | -- MOS08 0134 D495 C0 FF CPYIM &FF -- MOS08 0135 D497 C8 INY -- MOS08 0136 D498 69 00 ADCIM &00 -- MOS08 0137 D49A 60 RTS -- MOS08 0138 D49B ] -- MOS08 0139 D49B -- MOS08 0140 D49B 20 29 D8 SPF JSR GADDW ;Address new point COMMON CODE -- MOS08 0141 D49E D0 08 BNE SPFA ;Off window?, then exit MOS08 0141 D49E v77 MOS08 0142 D4A0 B1 D6 LDAIY ZMEMG ;Get the current byte MOS08 0141 D49E v77 MOS08 0143 D4A2 4D 5A 03 EOR BGCOLF ;Set b/g pixels to zero MOS08 0141 D49E v77 MOS08 0144 D4A5 85 DA STA ZTEMP MOS08 0141 D49E v77 MOS08 0145 D4A7 60 RTS MOS08 0141 D49E v77 MOS08 0146 D4A8 68 SPFA PLA -- MOS08 0147 D4A9 68 PLA -- MOS08 0148 D4AA -- MOS08 0149 D4AA ; & fall through to -- MOS08 0150 D4AA -- MOS08 0151 D4AA EE 26 03 SPLOTY INC GCSIY ;Failed, so make the L.H. cursor > R.H. MOS08 0162 D4B5 ^73 MOS08 0152 D4AD 4C 36 D5 JMP SPLOTX MOS08 0162 D4B5 ^73 MOS08 0153 D4B0 MOS08 0162 D4B5 ^73 MOS08 0154 D4B0 ;SPLOT plots from the new point left & right MOS08 0162 D4B5 ^73 MOS08 0155 D4B0 ; until it finds a pixel which is NOT background colour MOS08 0162 D4B5 ^73 MOS08 0156 D4B0 ; It scans a byte at a time if possible, taking a lot MOS08 0162 D4B5 ^73 MOS08 0157 D4B0 ; of code. MOS08 0162 D4B5 ^73 MOS08 0158 D4B0 MOS08 0162 D4B5 ^73 MOS08 0159 D4B0 MOS08 0162 D4B5 ^73 MOS08 0160 D4B0 20 9B D4 SPLOT JSR SPF MOS08 0162 D4B5 ^73 MOS08 0161 D4B3 25 D1 AND ZMASK ;Is the new point in b/g? MOS08 0162 D4B5 ^73 MOS08 0162 D4B5 D0 F3 BNE SPLOTY ;No?, then exit -- MOS08 0163 D4B7 A2 00 LDXIM &00 ;Set up for plotting to the left -- MOS08 0164 D4B9 20 7F D5 JSR SPS ;Corrupts all registers -- MOS08 0165 D4BC F0 2D BEQ SPLOTE ;Nothing to do MOS08 0165 D4BC v52 MOS08 0166 D4BE AC 1A 03 LDY YLINE MOS08 0165 D4BC v52 MOS08 0167 D4C1 06 D1 ASL ZMASK ;Don't want to plot the midpoint again MOS08 0165 D4BC v52 MOS08 0168 D4C3 B0 05 BCS SPLOTB ;So move left MOS08 0165 D4BC v52 MOS08 0169 D4C5 20 69 D5 JSR SPB ;Plot the LH fractional byte MOS08 0165 D4BC v52 MOS08 0170 D4C8 90 21 BCC SPLOTE ;No complete bytes to attempt? MOS08 0165 D4BC v52 MOS08 0171 D4CA MOS08 0165 D4BC v52 MOS08 0172 D4CA 20 EF D3 SPLOTB JSR WBDY ;Do complete bytes left MOS08 0165 D4BC v52 MOS08 0173 D4CD B1 D6 LDAIY ZMEMG ;(NB WBDY assumes c=1) MOS08 0165 D4BC v52 MOS08 0174 D4CF 4D 5A 03 EOR BGCOLF MOS08 0165 D4BC v52 MOS08 0175 D4D2 85 DA STA ZTEMP MOS08 0165 D4BC v52 MOS08 0176 D4D4 D0 12 BNE SPLOTD ;Not a complete byte of b/g? MOS08 0165 D4BC v52 MOS08 0177 D4D6 38 SEC ;Go for next byte - add to pixel counter MOS08 0165 D4BC v52 MOS08 0178 D4D7 8A TXA MOS08 0165 D4BC v52 MOS08 0179 D4D8 6D 61 03 ADC NPIX MOS08 0165 D4BC v52 MOS08 0180 D4DB 90 04 BCC SPLOTC MOS08 0165 D4BC v52 MOS08 0181 D4DD E6 DB INC ZTEMP+&01 ;MSB of pixel counter MOS08 0165 D4BC v52 MOS08 0182 D4DF 10 07 BPL SPLOTD ;Reached margin? Then skip MOS08 0165 D4BC v52 MOS08 0183 D4E1 AA SPLOTC TAX ;Not reached margin - then MOS08 0165 D4BC v52 MOS08 0184 D4E2 20 38 D1 JSR PLOTFF MOS08 0165 D4BC v52 MOS08 0185 D4E5 38 SEC ;carry on MOS08 0165 D4BC v52 MOS08 0186 D4E6 B0 E2 BCS SPLOTB ;(branch always taken). Sorry about the last comment MOS08 0165 D4BC v52 MOS08 0187 D4E8 MOS08 0165 D4BC v52 MOS08 0188 D4E8 20 69 D5 SPLOTD JSR SPB ;Do whatever is right of the line MOS08 0165 D4BC v52 MOS08 0189 D4EB A0 00 SPLOTE LDYIM &00 ;Translate back to Ico-ords -- MOS08 0190 D4ED 20 99 D5 JSR SPU -- MOS08 0191 D4F0 -- MOS08 0192 D4F0 A0 20 LDYIM NEWPT-V ;Entry point for look for b/g colour -- MOS08 0193 D4F2 A2 24 LDXIM GCSIR-V ;Swap newpoint (in GCSIR) & calculated RH endpoint -- MOS08 0194 D4F4 20 02 CE JSR SWAPF -- MOS08 0195 D4F7 -- MOS08 0196 D4F7 20 9B D4 SCHEAT JSR SPF ;Address midpoint again held in NEWPT -- MOS08 0197 D4FA A2 04 LDXIM &04 ;Set up for plotting right -- MOS08 0198 D4FC 20 7F D5 JSR SPS ;Musn't corrupt ZTEMP -- MOS08 0199 D4FF 8A TXA ;Plot the midpoint -- MOS08 0200 D500 D0 02 BNE SPLOTA MOS08 0200 D500 v7D MOS08 0201 D502 C6 DB DEC ZTEMP+&01 MOS08 0200 D500 v7D MOS08 0202 D504 CA SPLOTA DEX -- MOS08 0203 D505 -- MOS08 0204 D505 20 3C D5 SPLOTL JSR SPA ;Do this RH fractional byte MOS08 0213 D516 ^6D MOS08 0205 D508 90 27 BCC SPLOTK ;No full bytes to attempt? MOS08 0205 D508 v58 MOS08 0206 D50A MOS08 0205 D508 v58 MOS08 0207 D50A 20 DF D3 SPLOTI JSR EBDY ;Full bytes right MOS08 0205 D508 v58 MOS08 0208 D50D B1 D6 LDAIY ZMEMG MOS08 0205 D508 v58 MOS08 0209 D50F 4D 5A 03 EOR BGCOLF MOS08 0205 D508 v58 MOS08 0210 D512 85 DA STA ZTEMP MOS08 0205 D508 v58 MOS08 0211 D514 MOS08 0205 D508 v58 MOS08 0212 D514 A5 DC LDA ZTEMPB MOS08 0205 D508 v58 MOS08 0213 D516 D0 ED BNE SPLOTL MOS08 0205 D508 v58 MOS08 0214 D518 MOS08 0205 D508 v58 MOS08 0215 D518 A5 DA LDA ZTEMP MOS08 0205 D508 v58 MOS08 0216 D51A D0 12 BNE SPLOTJ ;This isn't a full byte MOS08 0205 D508 v58 MOS08 0217 D51C 38 SEC ;Add (NPIX)+1=no.pixels to counter MOS08 0205 D508 v58 MOS08 0218 D51D 8A TXA MOS08 0205 D508 v58 MOS08 0219 D51E 6D 61 03 ADC NPIX MOS08 0205 D508 v58 MOS08 0220 D521 90 04 BCC SPLOTF MOS08 0205 D508 v58 MOS08 0221 D523 E6 DB INC ZTEMP+&01 MOS08 0205 D508 v58 MOS08 0222 D525 10 07 BPL SPLOTJ ;Skip if hit margin MOS08 0205 D508 v58 MOS08 0223 D527 AA SPLOTF TAX MOS08 0205 D508 v58 MOS08 0224 D528 20 38 D1 JSR PLOTFF MOS08 0205 D508 v58 MOS08 0225 D52B 38 SEC MOS08 0205 D508 v58 MOS08 0226 D52C B0 DC BCS SPLOTI ;(branch always taken) MOS08 0205 D508 v58 MOS08 0227 D52E MOS08 0205 D508 v58 MOS08 0228 D52E 20 3C D5 SPLOTJ JSR SPA MOS08 0205 D508 v58 MOS08 0229 D531 A0 04 SPLOTK LDYIM &04 ;Convert to address of LH endpoint -- MOS08 0230 D533 20 99 D5 JSR SPU -- MOS08 0231 D536 20 0D D1 SPLOTX JSR EMAEX ;Finished -- MOS08 0232 D539 4C B5 CA JMP IEG ;update external cursor -- MOS08 0233 D53C -- MOS08 0234 D53C ;SPA Plots fractional LH byte on RH line end -- MOS08 0235 D53C -- MOS08 0236 D53C A5 D1 SPA LDA ZMASK ;Push the initial combined mask -- MOS08 0237 D53E [ MOS125 = &FF -- MOS08 0239 D53E ] -- MOS08 0240 D53E 18 CLC -- MOS08 0241 D53F 90 0E BCC SPAF ;(branch always taken) MOS08 0241 D53F v71 MOS08 0242 D541 MOS08 0241 D53F v71 MOS08 0243 D541 68 SPAA PLA ;Try next pixel - pull combined mask MOS08 0271 D55A ^65 MOS08 0244 D542 E8 INX ;Increment the pixel counter MOS08 0271 D55A ^65 MOS08 0245 D543 D0 04 BNE SPAB MOS08 0271 D55A ^65 MOS08 0246 D545 E6 DB INC ZTEMP+&01 MOS08 0271 D55A ^65 MOS08 0247 D547 10 16 BPL SPAE ;Exit if all pixels plotted MOS08 0271 D55A ^65 MOS08 0248 D549 46 D1 SPAB LSR ZMASK ;Shift mask MOS08 0271 D55A ^65 MOS08 0249 D54B B0 12 BCS SPAE ;Exit if shifted out of character cell MOS08 0271 D55A ^65 MOS08 0250 D54D 05 D1 ORA ZMASK ;Continue forming combined mask MOS08 0271 D55A ^65 MOS08 0251 D54F [ MOS125 = &FF MOS08 MOS08 MOS08 MOS08 Acorn macro assembler Page 37 MOS08 VDU File - MOS08 MOS08 MOS08 0271 D55A ^65 MOS08 0254 D54F | MOS08 0271 D55A ^65 MOS08 0255 D54F 48 SPAF PHA ;& push it again MOS08 0271 D55A ^65 MOS08 0256 D550 A5 D1 LDA ZMASK ;START HERE MOS08 0271 D55A ^65 MOS08 0257 D552 ] MOS08 0271 D55A ^65 MOS08 0258 D552 24 DA BIT ZTEMP ;Is this pixel b/g colour ? MOS08 0271 D55A ^65 MOS08 0259 D554 MOS08 0271 D55A ^65 MOS08 0260 D554 08 PHP ;Invert z flag if needs be MOS08 0271 D55A ^65 MOS08 0261 D555 68 PLA MOS08 0271 D55A ^65 MOS08 0262 D556 45 DC EOR ZTEMPB ;By inverting it with ZTEMPB (0 or 2) MOS08 0271 D55A ^65 MOS08 0263 D558 [ MOS125 = &FF MOS08 0271 D55A ^65 MOS08 0268 D558 | MOS08 0271 D55A ^65 MOS08 0269 D558 29 02 ANDIM &02 ;No shorter but saves 5 cycles and ZTEMPB can't corrupt PSR MOS08 0271 D55A ^65 MOS08 0270 D55A MOS08 0271 D55A ^65 MOS08 0271 D55A D0 E5 BNE SPAA ;Z now inverted, NE means NOT background, so loop MOS08 0247 D547 v69 MOS08 0272 D55C ] MOS08 0247 D547 v69 MOS08 0273 D55C 68 PLA ;Found it?, then pull combined mask MOS08 0247 D547 v69 MOS08 0274 D55D 45 D1 EOR ZMASK ;& delete this pixel from it MOS08 0247 D547 v69 MOS08 0275 D55F 85 D1 SPAE STA ZMASK ;These must preserve c! MOS08 0320 D57D ^60 MOS08 0276 D561 4C 24 D1 JMP PLOT MOS08 0320 D57D ^60 MOS08 0277 D564 MOS08 0320 D57D ^60 MOS08 0278 D564 [ MOS125 = &FF MOS08 0320 D57D ^60 MOS08 0301 D564 | MOS08 0320 D57D ^60 MOS08 0302 D564 SPBD MOS08 0320 D57D ^60 MOS08 0303 D564 45 D1 EOR ZMASK MOS08 0320 D57D ^60 MOS08 0304 D566 4A LSRA MOS08 0320 D57D ^60 MOS08 0305 D567 90 F6 BCC SPAE ;(branch always taken) MOS08 0320 D57D ^60 MOS08 0306 D569 MOS08 0320 D57D ^60 MOS08 0307 D569 ;SPB Plots fractional RH byte on LH line end MOS08 0320 D57D ^60 MOS08 0308 D569 MOS08 0320 D57D ^60 MOS08 0309 D569 A9 00 SPB LDAIM &00 MOS08 0320 D57D ^60 MOS08 0310 D56B 0A SPBE ASLA ;CC preserved via SPAE->PLOT and seen by caller MOS08 0320 D57D ^60 MOS08 0311 D56C 05 D1 ORA ZMASK MOS08 0320 D57D ^60 MOS08 0312 D56E 24 DA BIT ZTEMP MOS08 0320 D57D ^60 MOS08 0313 D570 D0 F2 BNE SPBD MOS08 0320 D57D ^60 MOS08 0314 D572 E8 INX MOS08 0320 D57D ^60 MOS08 0315 D573 D0 04 BNE SPBB MOS08 0320 D57D ^60 MOS08 0316 D575 E6 DB INC ZTEMP+&01 MOS08 0320 D57D ^60 MOS08 0317 D577 10 E6 BPL SPAE MOS08 0320 D57D ^60 MOS08 0318 D579 C9 80 SPBB CMPIM &80 MOS08 0320 D57D ^60 MOS08 0319 D57B 90 EE BCC SPBE MOS08 0320 D57D ^60 MOS08 0320 D57D B0 E0 BCS SPAE ;(branch always taken) -- MOS08 0321 D57F ] -- MOS08 0322 D57F -- MOS08 0323 D57F ;SPS Set up pixel counter -- MOS08 0324 D57F -- MOS08 0325 D57F BD 00 03 SPS LDAAX GWLCOL -- MOS08 0326 D582 38 SEC -- MOS08 0327 D583 ED 20 03 SBC NEWPT -- MOS08 0328 D586 A8 TAY -- MOS08 0329 D587 BD 01 03 LDAAX GWLCOL+&01 -- MOS08 0330 D58A ED 21 03 SBC NEWPT+&01 -- MOS08 0331 D58D 30 03 BMI SPSA ;Ensure this is -ve MOS08 0331 D58D v7C MOS08 0332 D58F 20 8D D4 JSR NEGAY MOS08 0331 D58D v7C MOS08 0333 D592 85 DB SPSA STA ZTEMP+&01 ;Store MSB -- MOS08 0334 D594 98 TYA -- MOS08 0335 D595 AA TAX ;LSB to X -- MOS08 0336 D596 05 DB ORA ZTEMP+&01 ;Set z=1 if nothing to do -- MOS08 0337 D598 60 RTS -- MOS08 0338 D599 -- MOS08 0339 D599 ;SPU Work out the internal co-ordinates of where we are -- MOS08 0340 D599 -- MOS08 0341 D599 84 DA SPU STY ZTEMP -- MOS08 0342 D59B 8A TXA -- MOS08 0343 D59C A8 TAY -- MOS08 0344 D59D A5 DB LDA ZTEMP+&01 -- MOS08 0345 D59F 30 02 BMI SPUA ;This byte is $00 at most MOS08 0345 D59F v7D MOS08 0346 D5A1 A9 00 LDAIM &00 ;although it can get a $01 in it MOS08 0345 D59F v7D MOS08 0347 D5A3 A6 DA SPUA LDX ZTEMP -- MOS08 0348 D5A5 D0 03 BNE SPUB MOS08 0348 D5A5 v7C MOS08 0349 D5A7 20 8D D4 JSR NEGAY MOS08 0348 D5A5 v7C MOS08 0350 D5AA 48 SPUB PHA -- MOS08 0351 D5AB 18 CLC -- MOS08 0352 D5AC 98 TYA -- MOS08 0353 D5AD 7D 00 03 ADCAX GWLCOL -- MOS08 0354 D5B0 8D 20 03 STA NEWPT -- MOS08 0355 D5B3 68 PLA -- MOS08 0356 D5B4 7D 01 03 ADCAX GWLCOL+&01 -- MOS08 0357 D5B7 8D 21 03 STA NEWPT+&01 -- MOS08 0358 D5BA 60 RTS -- MOS08 0359 D5BB -- MOS08 0360 D5BB CSREAD -- MOS08 0361 D5BB A9 03 LDAIM &03 ;Convert internal co-ordiantes at OLDCS & GCSIR -- MOS08 0362 D5BD 20 C2 D5 JSR SPCA -- MOS08 0363 D5C0 A9 07 LDAIM &07 -- MOS08 0364 D5C2 48 SPCA PHA -- MOS08 0365 D5C3 20 FE CD JSR SWAPB ;Swap old cursor with cursor -- MOS08 0366 D5C6 20 B5 CA JSR IEG ;Convert to external co-ordiantes -- MOS08 0367 D5C9 A2 03 LDXIM &03 ;& copy it -- MOS08 0368 D5CB 68 PLA -- MOS08 0369 D5CC A8 TAY -- MOS08 0370 D5CD BD 10 03 SPCB LDAAX GCSR MOS08 0374 D5D4 ^77 MOS08 0371 D5D0 91 F0 STAIY WARGS MOS08 0374 D5D4 ^77 MOS08 0372 D5D2 88 DEY MOS08 0374 D5D4 ^77 MOS08 0373 D5D3 CA DEX MOS08 0374 D5D4 ^77 MOS08 0374 D5D4 10 F7 BPL SPCB -- MOS08 0375 D5D6 60 RTS -- MOS08 0376 D5D7 -- MOS08 0377 D5D7 LNK MOS10 -- MOS10 0001 D5D7 -- MOS10 0002 D5D7 TTL VDU File - MOS10 -- MOS10 0003 D5D7 OPT MOS10 MOS10 MOS10 MOS10 MOS10 Acorn macro assembler Page 38 MOS10 VDU File - MOS10 MOS10 -- MOS10 0004 D5D7 -- MOS10 0005 D5D7 ;Last revision 10/05/82 -- MOS10 0006 D5D7 -- MOS10 0007 D5D7 ;10/05/82 Save 1 byte by BCS HPLOT -> BCC TRSRTS -- MOS10 0008 D5D7 ;05/05/82 HPLOT uses PLOTFF -- MOS10 0009 D5D7 ;01/05/82 Recoded using manifests & new ordering of static variables -- MOS10 0010 D5D7 ;07/02/82 Zero height triangles not so disasterous (GPT) -- MOS10 0011 D5D7 -- MOS10 0012 D5D7 ;TRIANGLE PLOTTING -- MOS10 0013 D5D7 -- MOS10 0014 D5D7 ;INITIALISATION -- MOS10 0015 D5D7 -- MOS10 0016 D5D7 A2 20 EMC LDXIM NEWPT-V ;Copy new point & graphics cursor to a safe place -- MOS10 0017 D5D9 A0 3E LDYIM GCSTMP-V -- MOS10 0018 D5DB 20 6E D4 JSR COPY8 -- MOS10 0019 D5DE 20 AE CD JSR SORTA ;Sort into Y co-ords, in order NEWPT=Lo, GCSIR=Hi, OLDCS=Med -- MOS10 0020 D5E1 A2 14 LDXIM OLDCS-V -- MOS10 0021 D5E3 A0 24 LDYIM GCSIR-V -- MOS10 0022 D5E5 20 B2 CD JSR SORTY -- MOS10 0023 D5E8 20 AE CD JSR SORTA -- MOS10 0024 D5EB A2 20 LDXIM NEWPT-V ;Set paramters for hypotenuse ... -- MOS10 0025 D5ED A0 2A LDYIM HDELTA-V ;Find Deltas -- MOS10 0026 D5EF 20 03 D4 JSR TRISA -- MOS10 0027 D5F2 AD 2B 03 LDA HDELTA+&01 ;Copy sign of DeltaX to determine direction -- MOS10 0028 D5F5 8D 32 03 STA HDIREC -- MOS10 0029 D5F8 A2 28 LDXIM HPARMS -- MOS10 0030 D5FA 20 4B D4 JSR TRISB ;complete definition of hypotenuse parameters -- MOS10 0031 D5FD A0 2E LDYIM HSTART-V ;Copy NEWPT to PStart of hypotenuse -- MOS10 0032 D5FF 20 12 D1 JSR EMAEZ -- MOS10 0033 D602 ;Swap Y co-ords 2 & 3, to give 1st side -- MOS10 0034 D602 20 FE CD JSR SWAPB ;Y co-ords now in order Lo, Med, Hi -- MOS10 0035 D605 18 CLC ;Don't plot the last line -- MOS10 0036 D606 20 30 D6 JSR TRSF ;Do the lower half of the triangle -- MOS10 0037 D609 ;Swap points to enable set up of 2nd side -- MOS10 0038 D609 20 FE CD JSR SWAPB ;Y co-ords now Lo, Hi, Med -- MOS10 0039 D60C A2 20 LDXIM NEWPT-V ;swap Y co-ords 1 & 3 to give 2nd side -- MOS10 0040 D60E 20 00 CE JSR SWAPC ;& now Med, Hi, Lo -- MOS10 0041 D611 38 SEC ;Do plot the last line -- MOS10 0042 D612 20 30 D6 JSR TRSF ;& plot the top half -- MOS10 0043 D615 A2 3E LDXIM GCSTMP-V ;Restore original graphics cursor & new point -- MOS10 0044 D617 A0 20 LDYIM NEWPT-V -- MOS10 0045 D619 20 6E D4 JSR COPY8 -- MOS10 0046 D61C 4C 0D D1 JMP EMAEX ;& do things to the cursors -- MOS10 0047 D61F -- MOS10 0048 D61F [ MOS125 = &FF -- MOS10 0059 D61F ] -- MOS10 0060 D61F -- MOS10 0061 D61F CSRPOS -- MOS10 0062 D61F AD 18 03 LDA CSX ;~~~ Read text cursor position ~~~ -- MOS10 0063 D622 38 SEC -- MOS10 0064 D623 ED 08 03 SBC TWLCOL -- MOS10 0065 D626 AA TAX -- MOS10 0066 D627 AD 19 03 LDA CSY -- MOS10 0067 D62A 38 SEC -- MOS10 0068 D62B ED 0B 03 SBC TWTROW -- MOS10 0069 D62E A8 TAY -- MOS10 0070 D62F 60 TRSRTS RTS ;No, then return MOS10 0109 D678 ^35 MOS10 0071 D630 MOS10 0109 D678 ^35 MOS10 0072 D630 ;TRSF Initialises a parameter list for ULN MOS10 0109 D678 ^35 MOS10 0073 D630 ;Sets up the "sides" (as opposed to the hypoteneuse) only. Skips if MOS10 0109 D678 ^35 MOS10 0074 D630 ;the 2 Y values are equal, otherwise calls HPLOT & ULN the requisite MOS10 0109 D678 ^35 MOS10 0075 D630 ;number of times MOS10 0109 D678 ^35 MOS10 0076 D630 ;Assumes the points forming the side to be initialised are in MOS10 0109 D678 ^35 MOS10 0077 D630 ;NEWPT & GCSIR MOS10 0109 D678 ^35 MOS10 0078 D630 MOS10 0109 D678 ^35 MOS10 0079 D630 08 TRSF PHP ;Push carry - is set if last line is to be plotted MOS10 0109 D678 ^35 MOS10 0080 D631 A2 20 LDXIM NEWPT-V ;Set up triangle parameters MOS10 0109 D678 ^35 MOS10 0081 D633 A0 35 LDYIM SDELTA-V ;Find deltas (sides only) MOS10 0109 D678 ^35 MOS10 0082 D635 20 03 D4 JSR TRISA MOS10 0109 D678 ^35 MOS10 0083 D638 AD 36 03 LDA SDELTA+&01 ;Find direction by sign of DeltaX MOS10 0109 D678 ^35 MOS10 0084 D63B 8D 3D 03 STA SDIREC MOS10 0109 D678 ^35 MOS10 0085 D63E A2 33 LDXIM SPARMS-V ;Find MOD Deltas, and initialise L MOS10 0109 D678 ^35 MOS10 0086 D640 20 4B D4 JSR TRISB MOS10 0109 D678 ^35 MOS10 0087 D643 A0 39 LDYIM SSTART-V ;Copy NEWPT to SSTART MOS10 0109 D678 ^35 MOS10 0088 D645 20 12 D1 JSR EMAEZ MOS10 0109 D678 ^35 MOS10 0089 D648 38 SEC ;How many Y values are there to be done ? MOS10 0109 D678 ^35 MOS10 0090 D649 AD 22 03 LDA NEWPT+&02 MOS10 0109 D678 ^35 MOS10 0091 D64C ED 26 03 SBC GCSIY MOS10 0109 D678 ^35 MOS10 0092 D64F 8D 1B 03 STA TRINLN ;Result (2's comp.) to TRINLN MOS10 0109 D678 ^35 MOS10 0093 D652 AD 23 03 LDA NEWPT+&03 MOS10 0109 D678 ^35 MOS10 0094 D655 ED 27 03 SBC GCSIY+&01 MOS10 0109 D678 ^35 MOS10 0095 D658 8D 1C 03 STA TRINLN+&01 ;(MSB) MOS10 0109 D678 ^35 MOS10 0096 D65B 0D 1B 03 ORA TRINLN ;Anything to do? MOS10 0109 D678 ^35 MOS10 0097 D65E F0 17 BEQ TRSFA MOS10 0109 D678 ^35 MOS10 0098 D660 20 7A D6 TRSFB JSR HPLOT ;Plot the line MOS10 0109 D678 ^35 MOS10 0099 D663 A2 33 LDXIM SPARMS-V ;Move the side up MOS10 0109 D678 ^35 MOS10 0100 D665 20 4A D7 JSR ULN MOS10 0109 D678 ^35 MOS10 0101 D668 A2 28 LDXIM HPARMS-V ;Move the hypoteneuse up MOS10 0109 D678 ^35 MOS10 0102 D66A 20 4A D7 JSR ULN MOS10 0109 D678 ^35 MOS10 0103 D66D EE 1B 03 INC TRINLN ;Any more lines ? MOS10 0109 D678 ^35 MOS10 0104 D670 D0 EE BNE TRSFB ;Yes, then loop, otherwise MOS10 0109 D678 ^35 MOS10 0105 D672 EE 1C 03 INC TRINLN+&01 MOS10 0109 D678 ^35 MOS10 0106 D675 D0 E9 BNE TRSFB MOS10 0109 D678 ^35 MOS10 0107 D677 MOS10 0109 D678 ^35 MOS10 0108 D677 28 TRSFA PLP ;Plot the last line? MOS10 0109 D678 ^35 MOS10 0109 D678 90 B5 BCC TRSRTS ;No, if c=0 -- MOS10 0110 D67A -- MOS10 0111 D67A ;HPLOT Fast plot of horizontal line -- MOS10 0112 D67A ;Plots horizontal line in current colour from points defined -- MOS10 0113 D67A ;at SSTART & HSTART, or, if entered at HPLOTA, from -- MOS10 0114 D67A ;GWTROW+(X) to GWTROW+(Y). -- MOS10 0115 D67A ;Y co-ordinate taken from point at (X) -- MOS10 0116 D67A -- MOS10 0117 D67A A2 39 HPLOT LDXIM SSTART-V ;Initialise point pointers -- MOS10 0118 D67C A0 2E LDYIM HSTART-V -- MOS10 0119 D67E 86 DE HPLOTA STX ZTEMPC ;Store these point pointers -- MOS10 0120 D680 BD 00 03 LDAAX V ;Is x co-ord. of (X)<(Y) ? -- MOS10 0121 D683 D9 00 03 CMPAY V -- MOS10 0122 D686 BD 01 03 LDAAX V+&01 -- MOS10 0123 D689 F9 01 03 SBCAY V+&01 -- MOS10 0124 D68C 30 06 BMI HPLOTB ;No, then swap (X) < = > (Y) MOS10 0124 D68C v79 MOS10 0125 D68E 98 TYA MOS10 0124 D68C v79 MOS10 0126 D68F A4 DE LDY ZTEMPC MOS10 0124 D68C v79 MOS10 0127 D691 AA TAX MOS10 0124 D68C v79 MOS10 0128 D692 86 DE STX ZTEMPC MOS10 0124 D68C v79 MOS10 0129 D694 84 DF HPLOTB STY ZTEMPC +&01 -- MOS10 0130 D696 -- MOS10 0131 D696 ;ZTEMPC & X now contain the offset from V to the L.H. point -- MOS10 0132 D696 ;& ZTEMPC +01 & Y the offset from V to the R.H. point -- MOS10 0133 D696 -- MOS10 0134 D696 B9 00 03 LDAAY V ;Push R.H. x co-ordinate MOS10 MOS10 MOS10 MOS10 Acorn macro assembler Page 39 MOS10 VDU File - MOS10 MOS10 -- MOS10 0135 D699 48 PHA -- MOS10 0136 D69A B9 01 03 LDAAY V+&01 -- MOS10 0137 D69D 48 PHA -- MOS10 0138 D69E A6 DF LDX ZTEMPC +&01 ;Window the R.H. point -- MOS10 0139 D6A0 20 43 D1 JSR WIND -- MOS10 0140 D6A3 F0 0D BEQ HPLOTC ;Within window?, then plot to this point MOS10 0140 D6A3 v72 MOS10 0141 D6A5 C9 02 CMPIM &02 ;Only other allowed value of this window is 2 MOS10 0140 D6A3 v72 MOS10 0142 D6A7 D0 3D BNE HPLOTX ;Exit if this isn't =2 MOS10 0142 D6A7 v42 MOS10 0143 D6A9 A2 04 LDXIM GWRCOL-V ;It was 2?, then copy R.H. margin to x co-ord of RH point MOS10 0142 D6A7 v42 MOS10 0144 D6AB A4 DF LDY ZTEMPC+&01 MOS10 0142 D6A7 v42 MOS10 0145 D6AD 20 74 D4 JSR COPY2 MOS10 0142 D6A7 v42 MOS10 0146 D6B0 A6 DF LDX ZTEMPC+&01 MOS10 0142 D6A7 v42 MOS10 0147 D6B2 20 30 D8 HPLOTC JSR GADDR ;Address (modified) RH end point MOS10 0142 D6A7 v42 MOS10 0148 D6B5 A6 DE LDX ZTEMPC ;Window L.H. end point MOS10 0142 D6A7 v42 MOS10 0149 D6B7 20 43 D1 JSR WIND MOS10 0142 D6A7 v42 MOS10 0150 D6BA 4A LSRA ;Only allowed values of this window are 0 & 1 MOS10 0142 D6A7 v42 MOS10 0151 D6BB D0 29 BNE HPLOTX ;Neither of those?, then exit MOS10 0142 D6A7 v42 MOS10 0152 D6BD 90 02 BCC HPLOTD ;Window was zero, then don't modify L.H. end point MOS10 0142 D6A7 v42 MOS10 0153 D6BF A2 00 LDXIM GWLCOL-V ;L.H. endpoint was to the left of L. margin, so plot to latter MOS10 0142 D6A7 v42 MOS10 0154 D6C1 A4 DF HPLOTD LDY ZTEMPC +&01 ;Point to R.H. end point MOS10 0142 D6A7 v42 MOS10 0155 D6C3 38 SEC ;to determine no. of points needed MOS10 0142 D6A7 v42 MOS10 0156 D6C4 B9 00 03 LDAAY V ;Generate no. of points to be plotted MOS10 0142 D6A7 v42 MOS10 0157 D6C7 FD 00 03 SBCAX V MOS10 0142 D6A7 v42 MOS10 0158 D6CA 85 DC STA ZTEMPB MOS10 0142 D6A7 v42 MOS10 0159 D6CC B9 01 03 LDAAY V+&01 MOS10 0142 D6A7 v42 MOS10 0160 D6CF FD 01 03 SBCAX V+&01 MOS10 0142 D6A7 v42 MOS10 0161 D6D2 85 DD STA ZTEMPB +&01 MOS10 0142 D6A7 v42 MOS10 0162 D6D4 A9 00 LDAIM &00 ;Generate the mask for the R.H. fractional byte MOS10 0142 D6A7 v42 MOS10 0163 D6D6 0A HPLOTG ASLA MOS10 0142 D6A7 v42 MOS10 0164 D6D7 05 D1 ORA ZMASK ;Generate R.H fractional mask MOS10 0142 D6A7 v42 MOS10 0165 D6D9 A4 DC LDY ZTEMPB MOS10 0142 D6A7 v42 MOS10 0166 D6DB D0 14 BNE HPLOTE MOS10 0142 D6A7 v42 MOS10 0167 D6DD C6 DD DEC ZTEMPB +&01 ;No more points to be plotted ? MOS10 0142 D6A7 v42 MOS10 0168 D6DF 10 10 BPL HPLOTE MOS10 0142 D6A7 v42 MOS10 0169 D6E1 85 D1 STA ZMASK ;No?, then plot this byte only MOS10 0142 D6A7 v42 MOS10 0170 D6E3 20 24 D1 JSR PLOT MOS10 0142 D6A7 v42 MOS10 0171 D6E6 A6 DF HPLOTX LDX ZTEMPC+&01 ;Restore R.H. end point's x co-ordinate MOS10 0219 D72D ^37 MOS10 0172 D6E8 68 PLA MOS10 0219 D72D ^37 MOS10 0173 D6E9 9D 01 03 STAAX V+&01 MOS10 0219 D72D ^37 MOS10 0174 D6EC 68 PLA MOS10 0219 D72D ^37 MOS10 0175 D6ED 9D 00 03 STAAX V MOS10 0219 D72D ^37 MOS10 0176 D6F0 60 RTS MOS10 0219 D72D ^37 MOS10 0177 D6F1 C6 DC HPLOTE DEC ZTEMPB MOS10 0219 D72D ^37 MOS10 0178 D6F3 AA TAX ;Continue with generation of R.H. fractional byte mask MOS10 0219 D72D ^37 MOS10 0179 D6F4 10 E0 BPL HPLOTG ;until b7 of this mask is set, whence is the mask complete MOS10 0219 D72D ^37 MOS10 0180 D6F6 85 D1 STA ZMASK MOS10 0219 D72D ^37 MOS10 0181 D6F8 20 24 D1 JSR PLOT ;Plot R.H. fractional byte MOS10 0219 D72D ^37 MOS10 0182 D6FB A6 DC LDX ZTEMPB ;LSB of no. points to be plotted, excl RH fractional byte MOS10 0219 D72D ^37 MOS10 0183 D6FD E8 INX ;Increment this, for no. points is inclusive MOS10 0219 D72D ^37 MOS10 0184 D6FE D0 02 BNE HPLOTL MOS10 0219 D72D ^37 MOS10 0185 D700 E6 DD INC ZTEMPB +&01 MOS10 0219 D72D ^37 MOS10 0186 D702 8A HPLOTL TXA MOS10 0219 D72D ^37 MOS10 0187 D703 48 PHA ;Needed for the determination of the LH fractional byte MOS10 0219 D72D ^37 MOS10 0188 D704 46 DD LSR ZTEMPB +&01 ;Divide no. points by no.pixels to give no. bytes MOS10 0219 D72D ^37 MOS10 0189 D706 6A RORA MOS10 0219 D72D ^37 MOS10 0190 D707 AC 61 03 LDY NPIX MOS10 0219 D72D ^37 MOS10 0191 D70A C0 03 CPYIM &03 MOS10 0219 D72D ^37 MOS10 0192 D70C F0 05 BEQ HPLOTP MOS10 0219 D72D ^37 MOS10 0193 D70E 90 04 BCC HPLOTQ MOS10 0219 D72D ^37 MOS10 0194 D710 46 DD LSR ZTEMPB +&01 ;y>3, i.e 8 pixels per byte MOS10 0219 D72D ^37 MOS10 0195 D712 6A RORA MOS10 0219 D72D ^37 MOS10 0196 D713 [ MOS125 = &FF MOS10 0219 D72D ^37 MOS10 0198 D713 | MOS10 0219 D72D ^37 MOS10 0199 D713 HPLOTP ;y=3, i.e. 4 pixels per byte MOS10 0219 D72D ^37 MOS10 0200 D713 ;ZTEMPB +&01 dead; C dead as A must not exceed &4F MOS10 0219 D72D ^37 MOS10 0201 D713 ] MOS10 0219 D72D ^37 MOS10 0202 D713 4A LSRA MOS10 0219 D72D ^37 MOS10 0203 D714 AC 1A 03 HPLOTQ LDY YLINE ;Prepare ye the way of the loop MOS10 0219 D72D ^37 MOS10 0204 D717 AA TAX ;Contains the nuber of complete bytes to be filled in MOS10 0219 D72D ^37 MOS10 0205 D718 F0 0F BEQ HPLOTF ;None?, then skip to plotting of L.H. fractional byte MOS10 0219 D72D ^37 MOS10 0206 D71A MOS10 0219 D72D ^37 MOS10 0207 D71A 98 HPLOTI TYA ;MAIN FULL BYTE LOOP MOS10 0219 D72D ^37 MOS10 0208 D71B 38 SEC ;Move Y back 8 bytes MOS10 0219 D72D ^37 MOS10 0209 D71C E9 08 SBCIM &08 MOS10 0219 D72D ^37 MOS10 0210 D71E A8 TAY MOS10 0219 D72D ^37 MOS10 0211 D71F B0 02 BCS HPLOTH ;Carry generated? MOS10 0219 D72D ^37 MOS10 0212 D721 C6 D7 DEC ZMEMG +&01 ;Yes?, then decrement MSB of IY vector MOS10 0219 D72D ^37 MOS10 0213 D723 20 38 D1 HPLOTH JSR PLOTFF ;Plot the bugger ! MOS10 0219 D72D ^37 MOS10 0214 D726 CA DEX ;Any more ? MOS10 0219 D72D ^37 MOS10 0215 D727 D0 F1 BNE HPLOTI ;Yes, then loop again MOS10 0219 D72D ^37 MOS10 0216 D729 MOS10 0219 D72D ^37 MOS10 0217 D729 68 HPLOTF PLA ;Pull the LSB of the number of points to plotted MOS10 0219 D72D ^37 MOS10 0218 D72A 2D 61 03 AND NPIX ;No. of points in L.H. fractional byte MOS10 0219 D72D ^37 MOS10 0219 D72D F0 B7 BEQ HPLOTX ;Leave if nothing to do -- MOS10 0220 D72F AA TAX ;Generate the mask for the LH fractional byte -- MOS10 0221 D730 A9 00 LDAIM &00 -- MOS10 0222 D732 0A HPLOTJ ASLA MOS10 0225 D737 ^79 MOS10 0223 D733 0D 63 03 ORA MASKR MOS10 0225 D737 ^79 MOS10 0224 D736 CA DEX MOS10 0225 D737 ^79 MOS10 0225 D737 D0 F9 BNE HPLOTJ -- MOS10 0226 D739 85 D1 STA ZMASK -- MOS10 0227 D73B 98 TYA -- MOS10 0228 D73C 38 SEC ;Move Y back 8 bytes again -- MOS10 0229 D73D E9 08 SBCIM &08 -- MOS10 0230 D73F A8 TAY -- MOS10 0231 D740 B0 02 BCS HPLOTK ;Carry generated MOS10 0231 D740 v7D MOS10 0232 D742 C6 D7 DEC ZMEMG +&01 ;Yes?, then decrement MSB of IY vector MOS10 0231 D740 v7D MOS10 0233 D744 20 27 D1 HPLOTK JSR PLOTS ;Plot the L.H. fractional byte -- MOS10 0234 D747 4C E6 D6 JMP HPLOTX -- MOS10 0235 D74A -- MOS10 0236 D74A ;ULN Increments the current graphics line which is drawing the triangle -- MOS10 0237 D74A ;It varies the X points according to the values of the MOD deltas, and -- MOS10 0238 D74A ;the direction byte. -- MOS10 0239 D74A ;As input, it requires in X the offset of the parameter list from V. -- MOS10 0240 D74A ;The parameter list is assumed to be in the following order : -- MOS10 0241 D74A ;Bytes 0-1 "L", the variable used in determining the steps left/right -- MOS10 0242 D74A ;Bytes 2-3 MOD Delta X -- MOS10 0243 D74A ;Bytes 4-5 MOD Delta Y -- MOS10 0244 D74A ;Bytes 6-9 Point from which the line is to be drawn (XL,XH,YL,YH) -- MOS10 0245 D74A ;Byte A Direction - +ve if x increasing as Y does, else -ve -- MOS10 0246 D74A -- MOS10 0247 D74A FE 08 03 ULN INCAX V+&08 ;Increment Y value of point to be drawn from/to -- MOS10 0248 D74D D0 03 BNE ULNA MOS10 0248 D74D v7C MOS10 0249 D74F FE 09 03 INCAX V+&09 MOS10 0248 D74D v7C MOS10 0250 D752 38 ULNA SEC ;L := L - MOD(DeltaX) -- MOS10 0251 D753 BD 00 03 LDAAX V -- MOS10 0252 D756 FD 02 03 SBCAX V+&02 -- MOS10 0253 D759 9D 00 03 STAAX V -- MOS10 0254 D75C BD 01 03 LDAAX V+&01 -- MOS10 0255 D75F FD 03 03 SBCAX V+&03 -- MOS10 0256 D762 9D 01 03 STAAX V+&01 MOS10 MOS10 MOS10 MOS10 Acorn macro assembler Page 40 MOS10 VDU File - MOS10 MOS10 -- MOS10 0257 D765 10 2F BPL ULNB ;+ve?, then skip the move X part following MOS10 0257 D765 v50 MOS10 0258 D767 [ MOS125 = &FF MOS10 0257 D765 v50 MOS10 0270 D767 | MOS10 0257 D765 v50 MOS10 0271 D767 18 ULNF CLC MOS10 0257 D765 v50 MOS10 0272 D768 BD 0A 03 LDAAX V+&0A ;Move X, which direction ? MOS10 0257 D765 v50 MOS10 0273 D76B 30 0A BMI ULNC ;Skip if move left MOS10 0257 D765 v50 MOS10 0274 D76D FE 06 03 INCAX V+&06 ;Move right, therefore increment the X value MOS10 0257 D765 v50 MOS10 0275 D770 D0 10 BNE ULND MOS10 0257 D765 v50 MOS10 0276 D772 FE 07 03 INCAX V+&07 MOS10 0257 D765 v50 MOS10 0277 D775 90 0B BCC ULND ;always branch MOS10 0257 D765 v50 MOS10 0278 D777 BD 06 03 ULNC LDAAX V+&06 ;Move left, therefore decrement X value MOS10 0257 D765 v50 MOS10 0279 D77A D0 03 BNE ULNE MOS10 0257 D765 v50 MOS10 0280 D77C DE 07 03 DECAX V+&07 MOS10 0257 D765 v50 MOS10 0281 D77F DE 06 03 ULNE DECAX V+&06 MOS10 0257 D765 v50 MOS10 0282 D782 ULND ;L := L + MOD DeltaY MOS10 0257 D765 v50 MOS10 0283 D782 ] MOS10 0257 D765 v50 MOS10 0284 D782 BD 00 03 LDAAX V MOS10 0257 D765 v50 MOS10 0285 D785 7D 04 03 ADCAX V+&04 MOS10 0257 D765 v50 MOS10 0286 D788 9D 00 03 STAAX V MOS10 0257 D765 v50 MOS10 0287 D78B BD 01 03 LDAAX V+&01 MOS10 0257 D765 v50 MOS10 0288 D78E 7D 05 03 ADCAX V+&05 MOS10 0257 D765 v50 MOS10 0289 D791 9D 01 03 STAAX V+&01 MOS10 0257 D765 v50 MOS10 0290 D794 30 D1 BMI ULNF ;Move left/right again ? TRAP HORIZONTAL LINES BEFORE !! MOS10 0257 D765 v50 MOS10 0291 D796 60 ULNB RTS -- MOS10 0292 D797 LNK MOS11 -- MOS11 0001 D797 -- MOS11 0002 D797 TTL VDU File - MOS11 -- MOS11 0003 D797 OPT MOS11 MOS11 MOS11 MOS11 MOS11 Acorn macro assembler Page 41 MOS11 VDU File - MOS11 MOS11 -- MOS11 0004 D797 -- MOS11 0005 D797 ;Last revision 05/05/82 -- MOS11 0006 D797 -- MOS11 0007 D797 ;05/05/82 Move GADDR here. Change to tabke with 1 entry only -- MOS11 0008 D797 ;01/05/82 Recoded to account for new ordering of variables -- MOS11 0009 D797 ;24/04/82 READCH returns mode in Y, char. in X (AGAIN!) -- MOS11 0010 D797 ;19/04/82 Improved exit at RPXLC -- MOS11 0011 D797 ;16/04/82 improved READCH code -- MOS11 0012 D797 ;25/03/82 Change order of READCH character search -- MOS11 0013 D797 ;22/01/82 Change EIG to EIGABS for READPX -- MOS11 0014 D797 ;07/01/82 Rewrite READCH for non-TTX (GPT) -- MOS11 0015 D797 ;16/11/81 Fix to READCH change (15/11) -- MOS11 0016 D797 ;15/11/81 READCH returns mode in Y, char. in X -- MOS11 0017 D797 ;09/11/81 (Paul) Read start of VDU space coping with model A -- MOS11 0018 D797 -- MOS11 0019 D797 ;READCH Reads the character at the current cursor location, -- MOS11 0020 D797 ;returning the result in A. -- MOS11 0021 D797 ;If the character is not found, 0 is returned. -- MOS11 0022 D797 ;Assumes new font splitting, using FNTFLG & PGSFNT -- MOS11 0023 D797 -- MOS11 0024 D797 READCH -- MOS11 0025 D797 AC 60 03 LDY NCOLOR ;Is it TTX? -- MOS11 0026 D79A D0 0F BNE READCE MOS11 0026 D79A v70 MOS11 0027 D79C B1 D8 LDAIY ZMEMT ;Yes, then read character direct (Y=0) MOS11 0026 D79A v70 MOS11 0028 D79E [ MOS125 = &FF MOS11 0026 D79A v70 MOS11 0038 D79E | MOS11 0026 D79A v70 MOS11 0039 D79E ;CS from OSB or RDCHK->RDCHGY->COPYCH MOS11 0026 D79A v70 MOS11 0040 D79E ;(or RDCHGS->GKEY..RDCHGY->COPYCH after hacking) MOS11 0026 D79A v70 MOS11 0041 D79E 18 CLC ;transform only MOS11 0026 D79A v70 MOS11 0042 D79F 20 F3 CF JSR TTXFRM ;convert ASCII to Teletext MOS11 0026 D79A v70 MOS11 0043 D7A2 20 F3 CF JSR TTXFRM ;and again to convert Teletext to ASCII MOS11 0026 D79A v70 MOS11 0044 D7A5 AA TAX MOS11 0026 D79A v70 MOS11 0045 D7A6 AC 55 03 READKE LDY MODE ;Only way of getting the mode MOS11 0082 D7D3 ^51 MOS11 0046 D7A9 8A TXA MOS11 0082 D7D3 ^51 MOS11 0047 D7AA ] MOS11 0082 D7D3 ^51 MOS11 0048 D7AA 60 RTS MOS11 0082 D7D3 ^51 MOS11 0049 D7AB MOS11 0082 D7D3 ^51 MOS11 0050 D7AB MOS11 0082 D7D3 ^51 MOS11 0051 D7AB 20 D5 D7 READCE JSR PTCNV ;Get the bit pattern to READWS MOS11 0082 D7D3 ^51 MOS11 0052 D7AE [ MOS125 = &FF MOS11 0082 D7D3 ^51 MOS11 0055 D7AE | MOS11 0082 D7D3 ^51 MOS11 0056 D7AE A9 20 LDAIM &20 ;First character to be checked MOS11 0082 D7D3 ^51 MOS11 0057 D7B0 READKF ;Address charcter MOS11 0082 D7D3 ^51 MOS11 0058 D7B0 ] MOS11 0082 D7D3 ^51 MOS11 0059 D7B0 48 PHA MOS11 0082 D7D3 ^51 MOS11 0060 D7B1 20 72 D0 JSR CHADDR ;Result to ZTEMPC MOS11 0082 D7D3 ^51 MOS11 0061 D7B4 68 PLA MOS11 0082 D7D3 ^51 MOS11 0062 D7B5 AA TAX MOS11 0082 D7D3 ^51 MOS11 0063 D7B6 A0 07 READKA LDYIM &07 ;Compare this character MOS11 0082 D7D3 ^51 MOS11 0064 D7B8 B9 28 03 READKB LDAAY READWS ;Get bit pattern MOS11 0082 D7D3 ^51 MOS11 0065 D7BB D1 DE CMPIY ZTEMPC ;Compare with font MOS11 0082 D7D3 ^51 MOS11 0066 D7BD D0 07 BNE READKC ;Different?, then not this character MOS11 0082 D7D3 ^51 MOS11 0067 D7BF 88 DEY ;Same?, then look at next row down MOS11 0082 D7D3 ^51 MOS11 0068 D7C0 10 F6 BPL READKB MOS11 0082 D7D3 ^51 MOS11 0069 D7C2 [ MOS125 = &FF MOS11 0082 D7D3 ^51 MOS11 0071 D7C2 ] MOS11 0082 D7D3 ^51 MOS11 0072 D7C2 E0 7F CPXIM &7F ;Is it a DEL? MOS11 0082 D7D3 ^51 MOS11 0073 D7C4 D0 E0 BNE READKE ;No?, then you have found it MOS11 0082 D7D3 ^51 MOS11 0074 D7C6 E8 READKC INX ;Next character up MOS11 0082 D7D3 ^51 MOS11 0075 D7C7 A5 DE LDA ZTEMPC ;LSB of font pointer up by 8 MOS11 0082 D7D3 ^51 MOS11 0076 D7C9 18 CLC MOS11 0082 D7D3 ^51 MOS11 0077 D7CA 69 08 ADCIM &08 MOS11 0082 D7D3 ^51 MOS11 0078 D7CC 85 DE STA ZTEMPC MOS11 0082 D7D3 ^51 MOS11 0079 D7CE D0 E6 BNE READKA ;More on this page? MOS11 0082 D7D3 ^51 MOS11 0080 D7D0 8A TXA ;Finished search? MOS11 0082 D7D3 ^51 MOS11 0081 D7D1 D0 DD BNE READKF ;No?, then try next page MOS11 0082 D7D3 ^51 MOS11 0082 D7D3 F0 D1 BEQ READKE ;(branch always taken) -- MOS11 0083 D7D5 -- MOS11 0084 D7D5 ;Converts the 8,16 or 32 byte character on the screen to an 8 byte -- MOS11 0085 D7D5 ;bit pattern in Q .. Q+07. Not very fast, in particular, the 8 byte -- MOS11 0086 D7D5 ;version could be speeded up. Background text colour is recognized -- MOS11 0087 D7D5 ;as 'background', even if cursors are joined. Anything else is -- MOS11 0088 D7D5 ;recognised as 'foreground' -- MOS11 0089 D7D5 -- MOS11 0090 D7D5 ;ZTEMP is the row number (7..0) -- MOS11 0091 D7D5 ;ZTEMP +01 is he bit pattern being formed from this row -- MOS11 0092 D7D5 ;ZTEMPB is the mask being used to isolate the current pixel -- MOS11 0093 D7D5 -- MOS11 0094 D7D5 A0 07 PTCNV LDYIM &07 ;The row to be converted -- MOS11 0095 D7D7 [ MOS125 = &FF -- MOS11 0111 D7D7 | -- MOS11 0112 D7D7 ;Adds 4 bytes but OS 1.25 gets them anyway -- MOS11 0113 D7D7 ;to remain parallel with 1.26 until GADDR -- MOS11 0114 D7D7 PTCNVA ;Start of 'convert 1 row' loop -- MOS11 0115 D7D7 A9 01 LDAIM &01 ;The bit pattern to be formed MOS11 0148 D806 ^4F MOS11 0116 D7D9 85 DB STA ZTEMP +&01 ;Finshed when a carry shifted out MOS11 0148 D806 ^4F MOS11 0117 D7DB CD 63 03 CMP MASKR ;C=0 if >1bpp MOS11 0148 D806 ^4F MOS11 0118 D7DE PTCNVB MOS11 0148 D806 ^4F MOS11 0119 D7DE B1 D8 LDAIY ZMEMT ;Get the byte to be tested MOS11 0148 D806 ^4F MOS11 0120 D7E0 4D 58 03 EOR BTCOLF ;Isolate back from foreground MOS11 0148 D806 ^4F MOS11 0121 D7E3 B0 1D BCS PTCNVF ;Write byte directly if 1bpp MOS11 0148 D806 ^4F MOS11 0122 D7E5 85 DC STA ZTEMPB MOS11 0148 D806 ^4F MOS11 0123 D7E7 AD 62 03 LDA MASKL ;Isolates the pixel to be tested in the current byte MOS11 0148 D806 ^4F MOS11 0124 D7EA 24 DC PTCNVC BIT ZTEMPB ;Are any of the bits in this pixel set ? MOS11 0148 D806 ^4F MOS11 0125 D7EC F0 01 BEQ PTCNVD ;No?, then this pixel was background MOS11 0148 D806 ^4F MOS11 0126 D7EE 38 SEC ;Yes?, then it was foreground MOS11 0148 D806 ^4F MOS11 0127 D7EF 26 DB PTCNVD ROL ZTEMP +&01 ;Shift this bit into the bit pattern MOS11 0148 D806 ^4F MOS11 0128 D7F1 6A RORA ;Isolate the next pixel MOS11 0148 D806 ^4F MOS11 0129 D7F2 90 F6 BCC PTCNVC ;carry clear, then continue MOS11 0148 D806 ^4F MOS11 0130 D7F4 30 06 BMI PTCNVE ;pattern overflow?, then this pattern is complete MOS11 0148 D806 ^4F MOS11 0131 D7F6 ] MOS11 0148 D806 ^4F MOS11 0132 D7F6 98 TYA ;c=1, then examine the next byte in the row MOS11 0148 D806 ^4F MOS11 0133 D7F7 69 07 ADCIM &07 ;(c=1), by adding 8 to Y MOS11 0148 D806 ^4F MOS11 0134 D7F9 A8 TAY MOS11 0148 D806 ^4F MOS11 0135 D7FA 90 E2 BCC PTCNVB ;and continue (branch always taken) MOS11 0148 D806 ^4F MOS11 0136 D7FC [ MOS125 = &FF MOS11 0148 D806 ^4F MOS11 0139 D7FC | MOS11 0148 D806 ^4F MOS11 0140 D7FC 98 PTCNVE TYA ;Restore Y MOS11 0148 D806 ^4F MOS11 0141 D7FD 29 07 ANDIM &07 MOS11 0148 D806 ^4F MOS11 0142 D7FF A8 TAY MOS11 0148 D806 ^4F MOS11 0143 D800 A5 DB LDA ZTEMP +&01 ;bit pattern finished, store it in the READWS MOS11 0148 D806 ^4F MOS11 0144 D802 PTCNVF MOS11 0148 D806 ^4F MOS11 0145 D802 ] MOS11 0148 D806 ^4F MOS11 0146 D802 99 28 03 STAAY READWS MOS11 0148 D806 ^4F MOS11 0147 D805 88 DEY ;& do the next row up MOS11 0148 D806 ^4F MOS11 0148 D806 10 CF BPL PTCNVA -- MOS11 0149 D808 [ MOS125 = &FF -- MOS11 0150 D808 | -- MOS11 0151 D808 A9 FF RPXLC LDAIM &FF ;Return $FF if point was outside graphics window MOS11 0166 D815 ^71 MOS11 0152 D80A ] MOS11 0166 D815 ^71 MOS11 0153 D80A 60 RTS ;or return MOS11 MOS11 MOS11 MOS11 Acorn macro assembler Page 42 MOS11 VDU File - MOS11 MOS11 MOS11 0166 D815 ^71 MOS11 0154 D80B MOS11 0166 D815 ^71 MOS11 0155 D80B ;RPXL Reads the pixel at V+(A), MOS11 0166 D815 ^71 MOS11 0156 D80B ;returning $FF if the cursor is out of the window, else the logical MOS11 0166 D815 ^71 MOS11 0157 D80B ;colour at the cursor. MOS11 0166 D815 ^71 MOS11 0158 D80B ;Assumes the current cursor in internal representation is GCSIY... MOS11 0166 D815 ^71 MOS11 0159 D80B MOS11 0166 D815 ^71 MOS11 0160 D80B 48 RPXLD PHA MOS11 0166 D815 ^71 MOS11 0161 D80C AA TAX ;Convert to Ico-ords MOS11 0166 D815 ^71 MOS11 0162 D80D 20 7D D1 JSR EIGABS MOS11 0166 D815 ^71 MOS11 0163 D810 68 PLA MOS11 0166 D815 ^71 MOS11 0164 D811 AA TAX MOS11 0166 D815 ^71 MOS11 0165 D812 20 2B D8 JSR GADDV MOS11 0166 D815 ^71 MOS11 0166 D815 D0 F1 BNE RPXLC ;Out of window?, then return $FF. -- MOS11 0167 D817 B1 D6 LDAIY ZMEMG -- MOS11 0168 D819 [ MOS125 = &FF -- MOS11 0181 D819 | -- MOS11 0182 D819 85 DA STA ZTEMP -- MOS11 0183 D81B B0 01 RPXLA BCS RPXLB ;kick the bit out again if it wasn't relevant MOS11 0188 D823 ^76 MOS11 0184 D81D 4A LSRA MOS11 0188 D823 ^76 MOS11 0185 D81E 06 DA RPXLB ASL ZTEMP ;Shift out the leftmost bit MOS11 0188 D823 ^76 MOS11 0186 D820 2A ROLA ;& shift into the byte to receive the pixel's logical colour MOS11 0188 D823 ^76 MOS11 0187 D821 06 D1 ASL ZMASK ;unless the bit was irrelevant MOS11 0188 D823 ^76 MOS11 0188 D823 D0 F6 BNE RPXLA ;Have we finished ? -- MOS11 0189 D825 2D 60 03 AND NCOLOR -- MOS11 0190 D828 ] -- MOS11 0191 D828 60 RPXLX RTS ;& finish MOS11 0197 D82E ^78 MOS11 0192 D829 MOS11 0197 D82E ^78 MOS11 0193 D829 ;Window a point, & plot if in window MOS11 0197 D82E ^78 MOS11 0194 D829 MOS11 0197 D82E ^78 MOS11 0195 D829 A2 20 GADDW LDXIM NEWPT-V ;Do this for new point MOS11 0197 D82E ^78 MOS11 0196 D82B 20 43 D1 GADDV JSR WIND ;Do this for general point. Is it in window ? MOS11 0197 D82E ^78 MOS11 0197 D82E D0 F8 BNE RPXLX ;No, then skip the windowing -- MOS11 0198 D830 -- MOS11 0199 D830 ;otherwise fall through to ... -- MOS11 0200 D830 -- MOS11 0201 D830 ;GADDR Addresses a single pixel on the graphics screen -- MOS11 0202 D830 ;Results are not guaranteed unless point is on screen -- MOS11 0203 D830 ;Requires :- -- MOS11 0204 D830 ;(X) = offset from V of point to be addressed. -- MOS11 0205 D830 ;Format of the pointed at point is INTERNAL co-ords, non-inverted Y axis -- MOS11 0206 D830 ;with 4 bytes of XL,XH,YL,YH. -- MOS11 0207 D830 ;ZTBL points to row offset table as per character writing -- MOS11 0208 D830 ;TOPSCN as usual. -- MOS11 0209 D830 ;NPIX = No. pixles per byte -- MOS11 0210 D830 ;Wraparound may occur on ends of lines only, thus hardware must display -- MOS11 0211 D830 ;ALL the characters in the display area (OK for modes as proposed). -- MOS11 0212 D830 ;Sets the following variables -- MOS11 0213 D830 ;YLINE = line offset within character cell (0..7) -- MOS11 0214 D830 ;ZMEMG = 1st byte of character cell -- MOS11 0215 D830 ;ZMASK = mask -- MOS11 0216 D830 -- MOS11 0217 D830 BD 02 03 GADDR LDAAX V+&02 ;(Y,LSB) MSB assumed 0 -- MOS11 0218 D833 49 FF EORIM &FF ;Invert Y axis -- MOS11 0219 D835 A8 TAY -- MOS11 0220 D836 29 07 ANDIM &07 ;Get YLINE = 3 least significant bits of Y -- MOS11 0221 D838 8D 1A 03 STA YLINE -- MOS11 0222 D83B 98 TYA -- MOS11 0223 D83C 4A LSRA ;Get twice the character row (for 2 byte entry lookup table) -- MOS11 0224 D83D 4A LSRA -- MOS11 0225 D83E 4A LSRA -- MOS11 0226 D83F 0A ASLA ;c=0 guaranteed (better than AND $FE : CLC) -- MOS11 0227 D840 A8 TAY ;Character row offset -- MOS11 0228 D841 B1 E0 LDAIY ZTBL ;Add row offset to TOPSCN -- MOS11 0229 D843 85 DA STA ZTEMP ;MSB -- MOS11 0230 D845 C8 INY -- MOS11 0231 D846 B1 E0 LDAIY ZTBL ;LSB -- MOS11 0232 D848 AC 56 03 LDY MEMODE -- MOS11 0233 D84B F0 03 BEQ GADDRD ; Divide by 2 if 10K mode (can only be 0 or 2) MOS11 0233 D84B v7C MOS11 0234 D84D 46 DA LSR ZTEMP MOS11 0233 D84B v7C MOS11 0235 D84F 6A RORA MOS11 0233 D84B v7C MOS11 0236 D850 6D 50 03 GADDRD ADC TOPSCN ;c=0 guaranteed before this add -- MOS11 0237 D853 85 D6 STA ZMEMG -- MOS11 0238 D855 A5 DA LDA ZTEMP -- MOS11 0239 D857 6D 51 03 ADC TOPSCN+&01 -- MOS11 0240 D85A 85 D7 STA ZMEMG +&01 -- MOS11 0241 D85C -- MOS11 0242 D85C ;Now calculate the X offset -- MOS11 0243 D85C -- MOS11 0244 D85C BD 01 03 LDAAX V+&01 ;(MSB,X) -- MOS11 0245 D85F 85 DA STA ZTEMP -- MOS11 0246 D861 BD 00 03 LDAAX V ;(LSB,X) -- MOS11 0247 D864 48 PHA ;Push the LSB of the X co-ordinate -- MOS11 0248 D865 2D 61 03 AND NPIX ;Calc. ZMASK (NB, c=0 from prev. addition) -- MOS11 0249 D868 6D 61 03 ADC NPIX ;This gives the correct starting position -- MOS11 0250 D86B A8 TAY ;within the table, plus 1 -- MOS11 0251 D86C B9 06 C4 LDAAY MASKTB-&01 ;So compensate by subtracting one here -- MOS11 0252 D86F 85 D1 STA ZMASK -- MOS11 0253 D871 68 PLA ;Retrieve the LSB of X co-ordinate -- MOS11 0254 D872 AC 61 03 LDY NPIX -- MOS11 0255 D875 C0 03 CPYIM &03 ;Divide by NPIX, and mult. by 8 -- MOS11 0256 D877 F0 05 BEQ GADDRA ;4 pixles/byte - mult. by 2 MOS11 0256 D877 v7A MOS11 0257 D879 B0 06 BCS GADDRB ;8 pixles/byte - don't do anything MOS11 0257 D879 v79 MOS11 0258 D87B 0A ASLA ;2 pixles per byte - mult. by 4 MOS11 0257 D879 v79 MOS11 0259 D87C 26 DA ROL ZTEMP MOS11 0257 D879 v79 MOS11 0260 D87E 0A GADDRA ASLA MOS11 0257 D879 v79 MOS11 0261 D87F 26 DA ROL ZTEMP MOS11 0257 D879 v79 MOS11 0262 D881 29 F8 GADDRB ANDIM &F8 ;Ignore any low order bits -- MOS11 0263 D883 18 CLC ;Calculate the final address, LSB 1st -- MOS11 0264 D884 65 D6 ADC ZMEMG -- MOS11 0265 D886 85 D6 STA ZMEMG -- MOS11 0266 D888 A5 DA LDA ZTEMP -- MOS11 0267 D88A 65 D7 ADC ZMEMG +&01 -- MOS11 0268 D88C 10 04 BPL GADDRC ;Skip wraparound if < $8000 MOS11 0268 D88C v7B MOS11 0269 D88E 38 SEC ;Correct by subtracting off screen if it is MOS11 0268 D88C v7B MOS11 0270 D88F ED 54 03 SBC BYTSCN MOS11 0268 D88C v7B MOS11 0271 D892 85 D7 GADDRC STA ZMEMG +&01 ;Store final address, MSB -- MOS11 0272 D894 AC 1A 03 LDY YLINE -- MOS11 0273 D897 A9 00 COPYZX LDAIM &00 ;Sets z=1 MOS11 0312 D8A0 ^75 MOS11 0274 D899 60 RTS MOS11 0312 D8A0 ^75 MOS11 0275 D89A MOS11 0312 D8A0 ^75 MOS11 0276 D89A [ MOS125 = &FF MOS11 0312 D8A0 ^75 MOS11 0304 D89A ] MOS11 0312 D8A0 ^75 MOS11 0305 D89A MOS11 0312 D8A0 ^75 MOS11 0306 D89A ;Copy key in cursor editing MOS11 0312 D8A0 ^75 MOS11 0307 D89A MOS11 0312 D8A0 ^75 MOS11 0308 D89A COPYCH MOS11 0312 D8A0 ^75 MOS11 0309 D89A A9 20 LDAIM &20 ;Cursors joined ? MOS11 0312 D8A0 ^75 MOS11 0310 D89C 24 D0 BIT STATS MOS11 0312 D8A0 ^75 MOS11 0311 D89E 50 F7 BVC COPYZX ;Not C.E. mode, then do nothing MOS11 0312 D8A0 ^75 MOS11 0312 D8A0 D0 F5 BNE COPYZX ;Cursors joined, so do nothing -- MOS11 0313 D8A2 20 97 D7 JSR READCH ;Read character at cursor position MOS11 MOS11 MOS11 MOS11 Acorn macro assembler Page 43 MOS11 VDU File - MOS11 MOS11 -- MOS11 0314 D8A5 F0 05 BEQ COPYCX ;Not recognised?, then exit with no further action MOS11 0314 D8A5 v7A MOS11 0315 D8A7 48 PHA ;Move input cursor right MOS11 0314 D8A5 v7A MOS11 0316 D8A8 20 98 C6 JSR HT ;But with no scrolling MOS11 0314 D8A5 v7A MOS11 0317 D8AB 68 VDUBEX PLA MOS11 0314 D8A5 v7A MOS11 0318 D8AC 60 COPYCX RTS -- MOS11 0319 D8AD -- MOS11 0320 D8AD ;CSEDEX Finish cursor edit mode -- MOS11 0321 D8AD -- MOS11 0322 D8AD A9 BD CSEDEX LDAIM &BD ;Clear b1 & b6 from STATS -- MOS11 0323 D8AF 20 A5 C5 JSR STTAND -- MOS11 0324 D8B2 20 5D C9 JSR ETCA ;Restore cursor from CSTEMP to r10 of 6845 -- MOS11 0325 D8B5 A9 0D LDAIM TRMCH ;Restore (A) -- MOS11 0326 D8B7 60 RTS -- MOS11 0327 D8B8 -- MOS11 0328 D8B8 TOPCMD -- MOS11 0329 D8B8 AE 55 03 LDX MODE ;~~~ Beginning of screen memory ~~~ -- MOS11 0330 D8BB -- MOS11 0331 D8BB ;& fall through to .... -- MOS11 0332 D8BB -- MOS11 0333 D8BB TOPMDX -- MOS11 0334 D8BB 8A TXA ;Don't trust (X) anymore .... -- MOS11 0335 D8BC 29 07 ANDIM &07 -- MOS11 0336 D8BE A8 TAY -- MOS11 0337 D8BF ; read VDU low water mark for mode Y -- MOS11 0338 D8BF BE 40 C4 LDXAY MODETB ;~~~ Read beginning of memory for mode (Y) ~~~ -- MOS11 0339 D8C2 BD 5E C4 LDAAX STSCTB ;A := hi-byte of lwm address -- MOS11 0340 D8C5 A2 00 LDXIM &00 ;Used later -- MOS11 0341 D8C7 ; check model type -- MOS11 0342 D8C7 2C 8E 02 BIT MODEL -- MOS11 0343 D8CA 30 07 BMI PRBB1 ;[model B, all modes permissable] MOS11 0343 D8CA v78 MOS11 0344 D8CC ; model A MOS11 0343 D8CA v78 MOS11 0345 D8CC ; return HWM of zero for modes 0 to 3 MOS11 0343 D8CA v78 MOS11 0346 D8CC ; (cos they require between 16K and 20K) MOS11 0343 D8CA v78 MOS11 0347 D8CC 29 3F ANDIM &3F ;correct for 16K m/c (model A) MOS11 0343 D8CA v78 MOS11 0348 D8CE C0 04 CPYIM &04 ;fault modes<=3 on model A MOS11 0343 D8CA v78 MOS11 0349 D8D0 B0 01 BCS PRBB1 ;[mode>=4] MOS11 0343 D8CA v78 MOS11 0350 D8D2 8A TXA ;model A and mode<=3. Sets (A):=0 MOS11 0343 D8CA v78 MOS11 0351 D8D3 PRBB1 ;return low water mark MOS11 0343 D8CA v78 MOS11 0352 D8D3 A8 TAY -- MOS11 0353 D8D4 60 RTS -- MOS11 0354 D8D5 -- MOS11 0355 D8D5 [ MOS125 = &FF -- MOS11 0356 D8D5 | -- MOS11 0357 D8D5 ;place new table after GADDR but within VDU code area -- MOS11 0358 D8D5 DCCTAB -- MOS11 0359 D8D5 50 00 = &50,&00 ;4 colour modes toggle b4,b6, zero terminates -- MOS11 0360 D8D7 30 70 30 = &30,&70,&30 ;16 colour modes toggle b4,b5,b6, next byte terminates -- MOS11 0361 D8DA 00 60 00 = &00,&60,&00,&60 ;4 colour modes move Logi b6 to b5 -- MOS11 0362 D8DE ] -- MOS11 0363 D8DE -- MOS11 0364 D8DE ENDVDU ;end of VDU code -- MOS11 0365 D8DE ; Now test code layout for correctness -- MOS11 0366 D8DE -- MOS11 0367 D8DE 0000 T1 * SOH:SHR:&8-CODORG:SHR:&3 -- MOS11 0368 D8DE 0000 T2 * DCA:SHR:&8-CODORG:SHR:&3 -- MOS11 0369 D8DE 0000 T3 * DCB:SHR:&8-CODORG:SHR:&3 -- MOS11 0370 D8DE 0000 T4 * DCC:SHR:&8-CODORG:SHR:&3 -- MOS11 0371 D8DE 0000 T5 * SYN:SHR:&8-CODORG:SHR:&3 -- MOS11 0372 D8DE [ MOS125 = &FF -- MOS11 0374 D8DE | -- MOS11 0375 D8DE 0000 T6 * ETB:SHR:&8-CODORG+&1:SHR:&3 -- MOS11 0376 D8DE ] -- MOS11 0377 D8DE 0000 T7 * CAN:SHR:&8-CODORG:SHR:&3 -- MOS11 0378 D8DE 0000 T8 * EM:SHR:&8-CODORG:SHR:&3 -- MOS11 0379 D8DE 0000 T9 * FS:SHR:&8-CODORG:SHR:&3 -- MOS11 0380 D8DE 0000 TA * GS:SHR:&8-CODORG:SHR:&3 -- MOS11 0381 D8DE 0000 TB * US:SHR:&8-CODORG:SHR:&3 -- MOS11 0382 D8DE [ T1=0 -- MOS11 0383 D8DE | -- MOS11 0385 D8DE ] -- MOS11 0386 D8DE [ T2=0 -- MOS11 0387 D8DE | -- MOS11 0389 D8DE ] -- MOS11 0390 D8DE [ T3=0 -- MOS11 0391 D8DE | -- MOS11 0393 D8DE ] -- MOS11 0394 D8DE [ T4=0 -- MOS11 0395 D8DE | -- MOS11 0397 D8DE ] -- MOS11 0398 D8DE [ T5=0 -- MOS11 0399 D8DE | -- MOS11 0401 D8DE ] -- MOS11 0402 D8DE [ T6=0 -- MOS11 0403 D8DE | -- MOS11 0405 D8DE ] -- MOS11 0406 D8DE [ T7=0 -- MOS11 0407 D8DE | -- MOS11 0409 D8DE ] -- MOS11 0410 D8DE [ T8=0 -- MOS11 0411 D8DE | -- MOS11 0413 D8DE ] -- MOS11 0414 D8DE [ T9=0 -- MOS11 0415 D8DE | -- MOS11 0417 D8DE ] -- MOS11 0418 D8DE [ TA=0 -- MOS11 0419 D8DE | -- MOS11 0421 D8DE ] -- MOS11 0422 D8DE [ TB=0 -- MOS11 0423 D8DE | -- MOS11 0425 D8DE ] -- MOS11 0426 D8DE -- MOS11 0427 D8DE 00C3 TC * HRGTB:SHR: 8 -- MOS11 0428 D8DE 00C3 TD * TXTTB:SHR: 8 -- MOS11 0429 D8DE [ TC-TD=0 -- MOS11 0430 D8DE | -- MOS11 0432 D8DE ] -- MOS11 0433 D8DE -- MOS11 0434 D8DE 00CC TE * CLASCA:SHR: 8 -- MOS11 0435 D8DE 00CC TF * CLASCE:SHR: 8 -- MOS11 0436 D8DE -- MOS11 0437 D8DE [ TE-TF=0 -- MOS11 0438 D8DE | -- MOS11 0440 D8DE ] -- MOS11 0441 D8DE -- MOS11 0442 D8DE OPT OPPON -- MOS11 0443 D8DE < 3 -- MOS11 0444 D8DE -- MOS11 0445 D8DE LNK MOS30 -- MOS30 0001 D8DE ; MOS30 -- MOS30 0002 D8DE OPT &01 -- MOS30 0003 D8DE TTL MOS30 Manifests MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 44 MOS30 MOS30 Manifests MOS30 -- MOS30 0004 D8DE -- MOS30 0005 D8DE ;Change record: -- MOS30 0006 D8DE -- MOS30 0007 D8DE -- MOS30 0008 D8DE < &0003 -- MOS30 0009 D8DE > &0002 -- MOS30 0010 D8DE -- MOS30 0011 D8DE -- MOS30 0012 D8DE -- MOS30 0013 D8DE -- MOS30 0014 D8DE ; module print selections -- MOS30 0015 D8DE ; -- MOS30 0016 D8DE 0005 MOS30 * DEFOPT -- MOS30 0017 D8DE 0005 MOS32 * DEFOPT -- MOS30 0018 D8DE 0005 MOS34 * DEFOPT -- MOS30 0019 D8DE 0005 MOS36 * DEFOPT -- MOS30 0020 D8DE 0005 MOS38 * DEFOPT -- MOS30 0021 D8DE 0005 MOS39 * DEFOPT -- MOS30 0022 D8DE 0005 MOS40 * DEFOPT -- MOS30 0023 D8DE 0005 MOS42 * DEFOPT -- MOS30 0024 D8DE 0005 MOS44 * DEFOPT -- MOS30 0025 D8DE 0005 MOS46 * DEFOPT -- MOS30 0026 D8DE 0005 MOS48 * DEFOPT -- MOS30 0027 D8DE -- MOS30 0028 D8DE 0005 MOS52 * DEFOPT -- MOS30 0029 D8DE 0005 MOS54 * DEFOPT -- MOS30 0030 D8DE 0005 MOS56 * DEFOPT -- MOS30 0031 D8DE -- MOS30 0032 D8DE 0005 MOS99 * DEFOPT -- MOS30 0033 D8DE -- MOS30 0034 D8DE -- MOS30 0035 D8DE OPT MOS30 MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 45 MOS30 MOS30 Manifests MOS30 -- MOS30 0036 D8DE ;(c) 1981 ACORN Computers Limited -- MOS30 0037 D8DE ;BBC Microcomputer Machine Operating System (MOS) -- MOS30 0038 D8DE ;Change record: -- MOS30 0039 D8DE ;Author(s): -- MOS30 0040 D8DE ;PB Paul Bond -- MOS30 0041 D8DE ;MP Mike Prees -- MOS30 0042 D8DE -- MOS30 0043 D8DE -- MOS30 0044 D8DE ; version number -- MOS30 0045 D8DE ; -- MOS30 0046 D8DE 0001 MCVER * &01 ;OS binary version number -- MOS30 0047 D8DE 0031 VERA * "1" -- MOS30 0048 D8DE 0032 VERB * "2" -- MOS30 0049 D8DE [ MOS125 = &FF -- MOS30 0051 D8DE ] -- MOS30 0052 D8DE [ MOS125 = &7F -- MOS30 0053 D8DE 0036 VERC * "6" -- MOS30 0054 D8DE ] -- MOS30 0055 D8DE [ MOS125 = &00 -- MOS30 0057 D8DE ] -- MOS30 0058 D8DE -- MOS30 0059 D8DE -- MOS30 0060 D8DE ; composition -- MOS30 0061 D8DE ; -- MOS30 0062 D8DE 0000 TRUE * &00 ;for conditional assembly -- MOS30 0063 D8DE 00FF FALSE * &FF ;for conditional assembly -- MOS30 0064 D8DE -- MOS30 0065 D8DE -- MOS30 0066 D8DE ; options -- MOS30 0067 D8DE ; -- MOS30 0068 D8DE 0000 INKYSW * TRUE -- MOS30 0069 D8DE -- MOS30 0070 D8DE -- MOS30 0071 D8DE ; VDU software interface -- MOS30 0072 D8DE ; -- MOS30 0073 D8DE C300 VDUORG * &C300 ;VDU software module origin -- MOS30 0074 D8DE C300 VDINIT * VDUORG +&00 ;initialise RAM and VDU -- MOS30 0075 D8DE D8DE ORIGIN * ENDVDU -- MOS30 0076 D8DE -- MOS30 0077 D8DE -- MOS30 0078 D8DE ; tube interface -- MOS30 0079 D8DE ; -- MOS30 0080 D8DE ^ &0400 -- MOS30 0081 D8DE 0400 TBLANG # &03 ;enter language -- MOS30 0082 D8DE 0403 TBESC # &03 ;alter escape condition -- MOS30 0083 D8DE 0406 TBADDR # &03 ;address translation -- MOS30 0084 D8DE -- MOS30 0085 D8DE -- MOS30 0086 D8DE -- MOS30 0087 D8DE ; error codes -- MOS30 0088 D8DE -- MOS30 0089 D8DE ; special reports -- MOS30 0090 D8DE ; -- MOS30 0091 D8DE -- MOS30 0092 D8DE -- MOS30 0093 D8DE -- MOS30 0094 D8DE ; infamous BASIC error number assignment boob -- MOS30 0095 D8DE ; -- MOS30 0096 D8DE -- MOS30 0097 D8DE -- MOS30 0098 D8DE -- MOS30 0099 D8DE ; MOS errors -- MOS30 0100 D8DE ; -- MOS30 0101 D8DE -- MOS30 0102 D8DE -- MOS30 0103 D8DE -- MOS30 0104 D8DE ; $FF is reserved for a non-trappable error in future systems -- MOS30 0105 D8DE ; -- MOS30 0106 D8DE 00FE BADCMD * &FE ;'Bad command' -- MOS30 0107 D8DE 00FD BADST * &FD ;'Bad string' -- MOS30 0108 D8DE 00FC BADADR * &FC ;'Bad address' -- MOS30 0109 D8DE 00FB BADKY * &FB ;'Bad key' -- MOS30 0110 D8DE 00FA KEYUSE * &FA ;'Key in use' -- MOS30 0111 D8DE 00F9 NOLROM * &F9 ;'No language ROM' -- MOS30 0112 D8DE 00F8 NOFSYS * &F8 ;'No filing system' -- MOS30 0113 D8DE 00F7 FX0MSG * &F7 ;operating system version number -- MOS30 0114 D8DE -- MOS30 0115 D8DE -- MOS30 0116 D8DE ; file system control operations -- MOS30 0117 D8DE ; -- MOS30 0118 D8DE 0000 FSOPT * &00 ;*OPT x,y value assumed by FX code -- MOS30 0119 D8DE 0001 FSEOF * &01 ;EOF#chan value assumed by FX code -- MOS30 0120 D8DE 0002 FSNOTA * &02 ;*non-alpha -- MOS30 0121 D8DE 0003 FSNAME * &03 ;*name -- MOS30 0122 D8DE 0004 FSRUN * &04 ;*RUN name -- MOS30 0123 D8DE 0005 FSCAT * &05 ;*CAT name -- MOS30 0124 D8DE 0006 FSDIE * &06 ;kill filing system -- MOS30 0125 D8DE 0007 FSHRNG * &07 ;return handle range in X (lo) and Y (hi) -- MOS30 0126 D8DE -- MOS30 0127 D8DE 0008 FSCLI * &08 ;*command encountered -- MOS30 0128 D8DE -- MOS30 0129 D8DE -- MOS30 0130 D8DE ; user print operations -- MOS30 0131 D8DE ; -- MOS30 0132 D8DE 0000 UPTIME * &00 ;timer interrupt -- MOS30 0133 D8DE 0001 UPWRCH * &01 ;write character -- MOS30 0134 D8DE ; return C=0 => printer busy, C=1 => printer free -- MOS30 0135 D8DE -- MOS30 0136 D8DE -- MOS30 0137 D8DE -- MOS30 0138 D8DE -- MOS30 0139 D8DE ; NET operations -- MOS30 0140 D8DE ; -- MOS30 0141 D8DE ; hi-level -- MOS30 0142 D8DE ; -- MOS30 0143 D8DE ; VALUES $01-$03,$05 RESERVED FOR PRINTER INTERFACE -- MOS30 0144 D8DE 0004 NTWRCH * &04 ;WRCH -- MOS30 0145 D8DE 0006 NTRDCH * &06 ;RDCH -- MOS30 0146 D8DE -- MOS30 0147 D8DE 0008 NTWORD * &08 ;OSWORD call (c.f. SVWORD) -- MOS30 0148 D8DE -- MOS30 0149 D8DE -- MOS30 0150 D8DE -- MOS30 0151 D8DE ; service ROM operations -- MOS30 0152 D8DE ; -- MOS30 0153 D8DE 0010 NROM * &0010 ;number of paged ROMs -- MOS30 0154 D8DE -- MOS30 0155 D8DE 0000 SVNOP * &00 ;no operation -- MOS30 0156 D8DE 0001 SVSTAT * &01 ;offer static allocation -- MOS30 0157 D8DE 0002 SVDYN * &02 ;offer dynamic allocation -- MOS30 0158 D8DE 0003 SVBOOT * &03 ;offer bootstrap MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 46 MOS30 MOS30 Manifests MOS30 -- MOS30 0159 D8DE 0004 SVNAME * &04 ;offer command -- MOS30 0160 D8DE 0005 SVINT * &05 ;unknown interrupt -- MOS30 0161 D8DE 0006 SVBRK * &06 ;offer BRK -- MOS30 0162 D8DE 0007 SVBYTE * &07 ;offer bad OSBYTE (N.B. also NTxxxx code) -- MOS30 0163 D8DE 0008 SVWORD * &08 ;offer bad OSWORD (N.B. also NTxxxx code) -- MOS30 0164 D8DE ; -- MOS30 0165 D8DE [ FALSE=0 -- MOS30 0167 D8DE | -- MOS30 0168 D8DE 0009 SVHELP * &09 ;*HELP facility -- MOS30 0169 D8DE ] -- MOS30 0170 D8DE ; -- MOS30 0171 D8DE 000A SVCSHR * &0A ;claim shared workspace -- MOS30 0172 D8DE 000B SVRNMI * &0B ;release NMI -- MOS30 0173 D8DE 000C SVCNMI * &0C ;claim NMI -- MOS30 0174 D8DE 000D SVISFS * &0D ;initialise speech filing system -- MOS30 0175 D8DE 000E SVRSFS * &0E ;read from speech filing system -- MOS30 0176 D8DE 000F SVFSIC * &0F ;changed filing system indirections -- MOS30 0177 D8DE -- MOS30 0178 D8DE 0010 SVSHES * &10 ;shut EXEC and SPOOL files -- MOS30 0179 D8DE 0011 SVHWMC * &11 ;change of HWM ******** DO NOT CHANGE ******** -- MOS30 0180 D8DE 0012 SVSTFS * &12 ;start filing system N -- MOS30 0181 D8DE 00FE SVTPIN * &FE ;tube post-initialisation **** VALUE ASSUMED BY RESET **** -- MOS30 0182 D8DE 00FF SVTUBE * &FF ;initialise tube software -- MOS30 0183 D8DE -- MOS30 0184 D8DE -- MOS30 0185 D8DE ; language entry reasons -- MOS30 0186 D8DE ; -- MOS30 0187 D8DE 0000 LGNONE * &00 ;no language ROM (tube entry reason) -- MOS30 0188 D8DE 0001 LGENTR * &01 ;enter language -- MOS30 0189 D8DE -- MOS30 0190 D8DE -- MOS30 0191 D8DE ; RS423 transmitter control bits -- MOS30 0192 D8DE ; -- MOS30 0193 D8DE 0000 RHITXD * &00 ;RTS hi, Tx interrupt disabled -- MOS30 0194 D8DE 0020 RHITXE * &20 ;RTS hi, Tx interrupt enabled -- MOS30 0195 D8DE 0040 RLOTXD * &40 ;RTS lo, Tx interrupt disabled -- MOS30 0196 D8DE 0060 RHITXB * &60 ;RTS hi, Tx break -- MOS30 0197 D8DE 0056 RSCDEF * &16+RLOTXD ;Rx interrupt disabled ... -- MOS30 0198 D8DE ; ... RTS lo, Tx interrupt disabled, divide by 64, 8 data bits, 1 stop bit -- MOS30 0199 D8DE -- MOS30 0200 D8DE -- MOS30 0201 D8DE ; speech processor opcodes -- MOS30 0202 D8DE ; -- MOS30 0203 D8DE 0010 SPOPRB * &10 ;read byte -- MOS30 0204 D8DE 0060 SPOPSE * &60 ;speak external -- MOS30 0205 D8DE 0030 SPOPBR * &30 ;read and branch -- MOS30 0206 D8DE 0040 SPOPLA * &40 ;load address -- MOS30 0207 D8DE 0050 SPOPSP * &50 ;speak -- MOS30 0208 D8DE 00FF SPOPRT * &FF ;reset -- MOS30 0209 D8DE -- MOS30 0210 D8DE -- MOS30 0211 D8DE ; memory map assignments -- MOS30 0212 D8DE ; -- MOS30 0213 D8DE FC00 FRED * &FC00 -- MOS30 0214 D8DE FCFF MEG1P * &FCFF ;1MHz bus page selector -- MOS30 0215 D8DE FD00 JIM * &FD00 -- MOS30 0216 D8DE FE00 SHEIL * &FE00 -- MOS30 0217 D8DE FE08 ACIA * &FE08 -- MOS30 0218 D8DE FE10 SERPRC * &FE10 ;serial processor -- MOS30 0219 D8DE -- MOS30 0220 D8DE FE20 VPROC0 * &FE20 ;video processor -- MOS30 0221 D8DE FE21 VPROC1 * VPROC0 +&01 -- MOS30 0222 D8DE FE20 STNID * &FE20 ;ECONET station identifier -- MOS30 0223 D8DE FE30 ROM * &FE30 ;ROM select latch -- MOS30 0224 D8DE FE40 VIAA * &FE40 ;first 6522 -- MOS30 0225 D8DE FE60 VIAB * &FE60 ;second 6522 -- MOS30 0226 D8DE -- MOS30 0227 D8DE -- MOS30 0228 D8DE ; analog to digital converter -- MOS30 0229 D8DE ; -- MOS30 0230 D8DE FEC0 ADCONV * &FEC0 -- MOS30 0231 D8DE FEC0 ADCCTL * ADCONV +&00 -- MOS30 0232 D8DE FEC1 ADCHI * ADCONV +&01 -- MOS30 0233 D8DE FEC2 ADCLO * ADCONV +&02 -- MOS30 0234 D8DE -- MOS30 0235 D8DE -- MOS30 0236 D8DE ; tube register(s) -- MOS30 0237 D8DE ; -- MOS30 0238 D8DE FEE0 TREG0 * &FEE0 -- MOS30 0239 D8DE FEE5 TREG3 * &FEE5 -- MOS30 0240 D8DE -- MOS30 0241 D8DE -- MOS30 0242 D8DE -- MOS30 0243 D8DE ; test software indirection -- MOS30 0244 D8DE ; -- MOS30 0245 D8DE FDFE TSTSFT * &FDFE -- MOS30 0246 D8DE -- MOS30 0247 D8DE -- MOS30 0248 D8DE ; language ROM address -- MOS30 0249 D8DE ; -- MOS30 0250 D8DE 8000 LANG * &8000 -- MOS30 0251 D8DE 8000 ROMHRD * LANG +&00 ;hard ROM entry point -- MOS30 0252 D8DE 8003 ROMSFT * LANG +&03 ;soft ROM entry point -- MOS30 0253 D8DE -- MOS30 0254 D8DE 8006 ROMTYP * LANG +&06 ;ROM type -- MOS30 0255 D8DE 8007 COPYRP * LANG +&07 ;relative offset (from LANG) to copyright string -- MOS30 0256 D8DE 8008 ROMVER * LANG +&08 ;version byte -- MOS30 0257 D8DE 8009 ROMMSG * LANG +&09 ;name -- MOS30 0258 D8DE -- MOS30 0259 D8DE -- MOS30 0260 D8DE ; miscellaneous constants -- MOS30 0261 D8DE ; -- MOS30 0262 D8DE 0000 ZERO * &00 -- MOS30 0263 D8DE 0000 NULL * ZERO ;don't care value -- MOS30 0264 D8DE 0020 SPACE * &20 -- MOS30 0265 D8DE 0040 AT * &40 -- MOS30 0266 D8DE 0041 ALPHAA * "A" -- MOS30 0267 D8DE 0022 DQUOTE * """" -- MOS30 0268 D8DE 002A SPLAT * "*" -- MOS30 0269 D8DE 0060 POUND * &60 -- MOS30 0270 D8DE -- MOS30 0271 D8DE -- MOS30 0272 D8DE -- MOS30 0273 D8DE 0007 BEL * &07 -- MOS30 0274 D8DE -- MOS30 0275 D8DE 0009 MHT * &09 -- MOS30 0276 D8DE 0009 TAB * MHT -- MOS30 0277 D8DE 000A MLF * &0A -- MOS30 0278 D8DE 000D MCR * &0D -- MOS30 0279 D8DE 0015 MNAK * &15 -- MOS30 0280 D8DE MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 47 MOS30 MOS30 Manifests MOS30 -- MOS30 0281 D8DE 001B ESC * &1B -- MOS30 0282 D8DE 007F MDEL * &7F -- MOS30 0283 D8DE -- MOS30 0284 D8DE -- MOS30 0285 D8DE ; real softkeys -- MOS30 0286 D8DE ; -- MOS30 0287 D8DE 0080 SOFTK0 * &0080 ;f0 (value must NOT be altered) -- MOS30 0288 D8DE 0081 SOFTK1 * SOFTK0 +&01 ;f1 -- MOS30 0289 D8DE 0082 SOFTK2 * SOFTK1 +&01 ;f2 -- MOS30 0290 D8DE 0083 SOFTK3 * SOFTK2 +&01 ;f3 -- MOS30 0291 D8DE 0084 SOFTK4 * SOFTK3 +&01 ;f4 -- MOS30 0292 D8DE 0085 SOFTK5 * SOFTK4 +&01 ;f5 -- MOS30 0293 D8DE 0086 SOFTK6 * SOFTK5 +&01 ;f6 -- MOS30 0294 D8DE 0087 SOFTK7 * SOFTK6 +&01 ;f7 -- MOS30 0295 D8DE 0088 SOFTK8 * SOFTK7 +&01 ;f8 -- MOS30 0296 D8DE 0089 SOFTK9 * SOFTK8 +&01 ;f9 -- MOS30 0297 D8DE -- MOS30 0298 D8DE -- MOS30 0299 D8DE ; pseudo softkeys, including cursor controls -- MOS30 0300 D8DE ; -- MOS30 0301 D8DE 008A SOFTKA * SOFTK9 +&01 -- MOS30 0302 D8DE 008B SOFTKB * SOFTKA +&01 ;COPY -- MOS30 0303 D8DE 008B MCOPY * SOFTKB -- MOS30 0304 D8DE 008C SOFTKC * SOFTKB +&01 ;cursor left arrow -- MOS30 0305 D8DE 008C CURLFT * SOFTKC -- MOS30 0306 D8DE 008D SOFTKD * SOFTKC +&01 ;cursor right arrow -- MOS30 0307 D8DE 008D CURRHT * SOFTKD -- MOS30 0308 D8DE 008E SOFTKE * SOFTKD +&01 ;cursor down -- MOS30 0309 D8DE 008E CURDWN * SOFTKE -- MOS30 0310 D8DE 008F SOFTKF * SOFTKE +&01 ;cursor up -- MOS30 0311 D8DE 008F CURUP * SOFTKF -- MOS30 0312 D8DE 00BF MAXSK * &BF ;maximum value of SHIFT/CTRL softkey code -- MOS30 0313 D8DE 00CA BREKEY * &CA ;softkey 10 feature -- MOS30 0314 D8DE -- MOS30 0315 D8DE -- MOS30 0316 D8DE ; default auto-repeat rates -- MOS30 0317 D8DE ; -- MOS30 0318 D8DE 0032 DAUTOD * 50 ;delay (centiseconds) -- MOS30 0319 D8DE 0008 DAUTOP * 8 ;period (centiseconds) -- MOS30 0320 D8DE -- MOS30 0321 D8DE -- MOS30 0322 D8DE ; default RS423 baud rates -- MOS30 0323 D8DE ; -- MOS30 0324 D8DE 0064 B9600 * &64 ;Tx9600 and Rx9600 -- MOS30 0325 D8DE -- MOS30 0326 D8DE -- MOS30 0327 D8DE ; RS423 printer timeout period -- MOS30 0328 D8DE ; -- MOS30 0329 D8DE 00E7 PTIMUT * &E7 ;(-) 25/50 second -- MOS30 0330 D8DE -- MOS30 0331 D8DE -- MOS30 0332 D8DE ; OS constants -- MOS30 0333 D8DE 0E00 OSHWM * &0E00 ;default high water mark -- MOS30 0334 D8DE 0D00 NMI * &0D00 -- MOS30 0335 D8DE -- MOS30 0336 D8DE -- MOS30 0337 D8DE ; buffer indices -- MOS30 0338 D8DE ; -- MOS30 0339 D8DE 0000 BRDCH * &0000 ;RDCH (keyboard) -- MOS30 0340 D8DE 0001 BRSI * &0001 ;RS423 input -- MOS30 0341 D8DE 0001 INPUT * BRSI -- MOS30 0342 D8DE 0002 BRSO * &0002 ;RS423 output -- MOS30 0343 D8DE 0002 OUTPUT * BRSO -- MOS30 0344 D8DE 0003 BPRNT * &0003 ;print -- MOS30 0345 D8DE 0004 BSND1 * &0004 ;sound channel 1 -- MOS30 0346 D8DE 0005 BSND2 * BSND1+&1 ;sound channel 2 -- MOS30 0347 D8DE 0006 BSND3 * BSND2+&1 ;sound channel 3 -- MOS30 0348 D8DE 0007 BSND4 * BSND3+&1 ;sound channel 4 -- MOS30 0349 D8DE 0008 BSPCH * BSND4+&1 ;speech -- MOS30 0350 D8DE 0008 BUPB * BSPCH -- MOS30 0351 D8DE -- MOS30 0352 D8DE -- MOS30 0353 D8DE ; keyboard status bits -- MOS30 0354 D8DE ; -- MOS30 0355 D8DE 0008 SHFT * &08 ;SHIFT active -- MOS30 0356 D8DE 0010 CAPSL * &10 ;not CAPITALS lock -- MOS30 0357 D8DE 0020 SHFTL * &20 ;not SHIFT lock -- MOS30 0358 D8DE 0040 CTRL * &40 ;CTRL active -- MOS30 0359 D8DE 0080 INVERT * &80 ;SHIFT enable -- MOS30 0360 D8DE 00B7 CTLSHI * &B7 ;inverted (CTRL and SHIFT status bits) -- MOS30 0361 D8DE -- MOS30 0362 D8DE -- MOS30 0363 D8DE ; keyboard matrix element values -- MOS30 0364 D8DE ; -- MOS30 0365 D8DE 00C0 CPLKKY * &C0 ;CAPITALS lock key -- MOS30 0366 D8DE 00D0 SHLKKY * &D0 ;SHIFT lock key -- MOS30 0367 D8DE -- MOS30 0368 D8DE -- MOS30 0369 D8DE ; FX numbers -- MOS30 0370 D8DE ; -- MOS30 0371 D8DE 0088 FXCODE * &88 -- MOS30 0372 D8DE 0089 FXMOTR * &89 -- MOS30 0373 D8DE 008B FXOPT * &8B -- MOS30 0374 D8DE 008C FXTAPE * &8C -- MOS30 0375 D8DE 008D FXSROM * &8D -- MOS30 0376 D8DE 0090 FXTV * &90 -- MOS30 0377 D8DE -- MOS30 0378 D8DE -- MOS30 0379 D8DE ; MC6850 addresses -- MOS30 0380 D8DE ; -- MOS30 0381 D8DE FE08 RSCTL * ACIA -- MOS30 0382 D8DE FE08 RSTAT * ACIA -- MOS30 0383 D8DE FE09 RSDATA * ACIA +&01 -- MOS30 0384 D8DE -- MOS30 0385 D8DE -- MOS30 0386 D8DE ; miscellaneous -- MOS30 0387 D8DE ; -- MOS30 0388 D8DE 0004 NADC * &04 ;number of ADC channels -- MOS30 0389 D8DE -- MOS30 0390 D8DE -- MOS30 0391 D8DE ; 6522 addresses -- MOS30 0392 D8DE ; -- MOS30 0393 D8DE FE40 PBQ * VIAA -- MOS30 0394 D8DE FE41 PAQ * VIAA +&01 -- MOS30 0395 D8DE FE42 DDRBQ * VIAA +&02 -- MOS30 0396 D8DE FE43 DDRAQ * VIAA +&03 -- MOS30 0397 D8DE FE44 TQCLQ * VIAA +&04 -- MOS30 0398 D8DE FE45 TQCHQ * VIAA +&05 -- MOS30 0399 D8DE FE46 TQLLQ * VIAA +&06 -- MOS30 0400 D8DE FE47 TQLHQ * VIAA +&07 -- MOS30 0401 D8DE FE48 TRCLQ * VIAA +&08 MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 48 MOS30 MOS30 Manifests MOS30 -- MOS30 0402 D8DE FE49 TRCHQ * VIAA +&09 -- MOS30 0403 D8DE FE4A SRQ * VIAA +&0A -- MOS30 0404 D8DE FE4B ACRQ * VIAA +&0B -- MOS30 0405 D8DE FE4C PCRQ * VIAA +&0C -- MOS30 0406 D8DE 000A CAPULS * &0A -- MOS30 0407 D8DE 000C CA2LO * &0C -- MOS30 0408 D8DE 000E CA2HI * &0E -- MOS30 0409 D8DE 00A0 CBPULS * &A0 -- MOS30 0410 D8DE 00C0 CB2LO * &C0 -- MOS30 0411 D8DE 00E0 CB2HI * &E0 -- MOS30 0412 D8DE FE4D IFRQ * VIAA +&0D -- MOS30 0413 D8DE FE4E IERQ * VIAA +&0E -- MOS30 0414 D8DE FE4F PAPQ * VIAA +&0F -- MOS30 0415 D8DE FE60 PBR * VIAB -- MOS30 0416 D8DE FE61 PAR * VIAB +&01 -- MOS30 0417 D8DE FE62 DDRBR * VIAB +&02 -- MOS30 0418 D8DE FE63 DDRAR * VIAB +&03 -- MOS30 0419 D8DE FE64 TQCLR * VIAB +&04 -- MOS30 0420 D8DE FE65 TQCHR * VIAB +&05 -- MOS30 0421 D8DE FE66 TQLLR * VIAB +&06 -- MOS30 0422 D8DE FE67 TQLHR * VIAB +&07 -- MOS30 0423 D8DE FE68 TRCLR * VIAB +&08 -- MOS30 0424 D8DE FE69 TRCHR * VIAB +&09 -- MOS30 0425 D8DE FE6A SRR * VIAB +&0A -- MOS30 0426 D8DE FE6B ACRR * VIAB +&0B -- MOS30 0427 D8DE FE6C PCRR * VIAB +&0C -- MOS30 0428 D8DE FE6D IFRR * VIAB +&0D -- MOS30 0429 D8DE FE6E IERR * VIAB +&0E -- MOS30 0430 D8DE FE6F PAPR * VIAB +&0F -- MOS30 0431 D8DE -- MOS30 0432 D8DE -- MOS30 0433 D8DE ; interrupt flags in 6522 IER and IFR -- MOS30 0434 D8DE ; -- MOS30 0435 D8DE 0002 CA1 * &0002 -- MOS30 0436 D8DE 0001 CA2 * &0001 -- MOS30 0437 D8DE 0010 CB1 * &0010 -- MOS30 0438 D8DE 0008 CB2 * &0008 -- MOS30 0439 D8DE 0040 TIMER1 * &0040 -- MOS30 0440 D8DE 0020 TIMER2 * &0020 -- MOS30 0441 D8DE -- MOS30 0442 D8DE -- MOS30 0443 D8DE ; VIA pin assignments -- MOS30 0444 D8DE ; -- MOS30 0445 D8DE ; VIAA:- -- MOS30 0446 D8DE ; PA7-PA0 keyboard -- MOS30 0447 D8DE ; CA1 VSYNC interrupt -- MOS30 0448 D8DE 0002 VSYNC * CA1 -- MOS30 0449 D8DE ; CA2 keyboard interrupt ('any key down') -- MOS30 0450 D8DE 0001 KEYBD * CA2 -- MOS30 0451 D8DE ; PB7 VSP interrupt -- MOS30 0452 D8DE ; PB6 VSP ready -- MOS30 0453 D8DE ; PB5,PB4 paddle -- MOS30 0454 D8DE ; PB3-PB0 addressable latch -- MOS30 0455 D8DE ; PB3 data value -- MOS30 0456 D8DE ; PB2-PB0 latch register -- MOS30 0457 D8DE ; 0 sound enable -- MOS30 0458 D8DE ; 1 speech RS -- MOS30 0459 D8DE ; 2 speech WS -- MOS30 0460 D8DE ; 3 keyboard disable -- MOS30 0461 D8DE ; 4,5 hardware scroll -- MOS30 0462 D8DE ; 6,7 ROM select -- MOS30 0463 D8DE ; CB1 ADC -- MOS30 0464 D8DE 0010 ADC * CB1 -- MOS30 0465 D8DE ; CB2 light pen -- MOS30 0466 D8DE -- MOS30 0467 D8DE ; VIAB:- -- MOS30 0468 D8DE ; PA7-PA0 printer output -- MOS30 0469 D8DE ; CA1 printer acknowledge -- MOS30 0470 D8DE 0002 PRNT * CA1 -- MOS30 0471 D8DE ; CA2 printer strobe -- MOS30 0472 D8DE ; PB7-PB0 reserved for user -- MOS30 0473 D8DE ; CB1 reserved for user -- MOS30 0474 D8DE ; CB2 reserved for user -- MOS30 0475 D8DE ; TIMER 1 = MAIN CLOCK -- MOS30 0476 D8DE 0040 CLOCK * TIMER1 -- MOS30 0477 D8DE -- MOS30 0478 D8DE -- MOS30 0479 D8DE ; page one is main system stack -- MOS30 0480 D8DE ; -- MOS30 0481 D8DE 00FF STACK * &FF -- MOS30 0482 D8DE -- MOS30 0483 D8DE -- MOS30 0484 D8DE -- MOS30 0485 D8DE ; BUFFERS -- MOS30 0486 D8DE -- MOS30 0487 D8DE -- MOS30 0488 D8DE ; keyboard -- MOS30 0489 D8DE ; -- MOS30 0490 D8DE 03E0 RDCHBF * &03E0 ;RDCH (keyboard) buffer -- MOS30 0491 D8DE 0020 RDCHSZ * &0020 -- MOS30 0492 D8DE -- MOS30 0493 D8DE -- MOS30 0494 D8DE ; sound -- MOS30 0495 D8DE ; -- MOS30 0496 D8DE 0800 SNDWRK * &0800 ;sound workspace -- MOS30 0497 D8DE 0804 MACTIV * SNDWRK+&04 ;activation flags -- MOS30 0498 D8DE -- MOS30 0499 D8DE 0840 SNDBF1 * &0840 ;sound buffer channel 1 -- MOS30 0500 D8DE 0010 SBSIZE * &0010 ;sound buffer size -- MOS30 0501 D8DE 0850 SNDBF2 * SNDBF1+SBSIZE ;sound buffer channel 2 -- MOS30 0502 D8DE 0860 SNDBF3 * SNDBF2+SBSIZE ;sound buffer channel 3 -- MOS30 0503 D8DE 0870 SNDBF4 * SNDBF3+SBSIZE ;sound buffer channel 4 -- MOS30 0504 D8DE -- MOS30 0505 D8DE -- MOS30 0506 D8DE ; printer -- MOS30 0507 D8DE ; -- MOS30 0508 D8DE 0880 PRNBF * &0880 ;print buffer -- MOS30 0509 D8DE 0040 PRNSZ * &0040 -- MOS30 0510 D8DE -- MOS30 0511 D8DE -- MOS30 0512 D8DE ; envelopes -- MOS30 0513 D8DE ; -- MOS30 0514 D8DE 08C0 ENVEL * &08C0 ;sound envelopes -- MOS30 0515 D8DE 0010 ENVSIZ * &0010 ;size of each envelope -- MOS30 0516 D8DE 0004 NENV * &0004 ;number of envelopes -- MOS30 0517 D8DE -- MOS30 0518 D8DE -- MOS30 0519 D8DE ; RS423 output -- MOS30 0520 D8DE ; -- MOS30 0521 D8DE 0900 RSROBF * &0900 ;RS423 output -- MOS30 0522 D8DE 00C0 RSROSZ * &00C0 MOS30 MOS30 MOS30 MOS30 Acorn macro assembler Page 49 MOS30 MOS30 Manifests MOS30 -- MOS30 0523 D8DE -- MOS30 0524 D8DE -- MOS30 0525 D8DE ; speech -- MOS30 0526 D8DE ; -- MOS30 0527 D8DE 09C0 SPCHBF * &09C0 ;speech buffer -- MOS30 0528 D8DE 0040 SPCHSZ * &0040 -- MOS30 0529 D8DE -- MOS30 0530 D8DE -- MOS30 0531 D8DE ; RS423 input -- MOS30 0532 D8DE ; -- MOS30 0533 D8DE 0A00 RSRIBF * &0A00 ;RS423 input -- MOS30 0534 D8DE 0100 RSRISZ * &0100 -- MOS30 0535 D8DE 0008 RSOVR * 8 ;handshake overflow allowance -- MOS30 0536 D8DE -- MOS30 0537 D8DE -- MOS30 0538 D8DE ; soft key buffer -- MOS30 0539 D8DE ; -- MOS30 0540 D8DE 0B00 SKPTR * &0B00 ;pointers to soft key strings -- MOS30 0541 D8DE 0010 NSOFTK * 16 -- MOS30 0542 D8DE 0B01 SKBUF * SKPTR+&01 ;N.B. soft key pointers are relative to this origin -- MOS30 0543 D8DE 0B10 SKEND * SKPTR+NSOFTK ;logical end of string -- MOS30 0544 D8DE 00EF TOTSFT * SKPTR+&0100-SKEND-&01 ;soft key data byte size -- MOS30 0545 D8DE -- MOS30 0546 D8DE -- MOS30 0547 D8DE LNK MOS32 -- MOS32 0001 D8DE -- MOS32 0002 D8DE ; -> MOS32 -- MOS32 0003 D8DE TTL MOS32 Initialisation and external interfaces -- MOS32 0004 D8DE OPT MOS32 MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 50 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0005 D8DE ;(c) 1981 ACORN Computers Limited -- MOS32 0006 D8DE ;BBC Microcomputer Machine Operating System (MOS) -- MOS32 0007 D8DE ;Change record: -- MOS32 0008 D8DE ;Author(s): -- MOS32 0009 D8DE ;PB Paul Bond -- MOS32 0010 D8DE ;MP Mike Prees -- MOS32 0011 D8DE -- MOS32 0012 D8DE -- MOS32 0013 D8DE ; origin of real code -- MOS32 0014 D8DE ORG ORIGIN ;MOS starts where VDU ends -- MOS32 0015 D8DE -- MOS32 0016 D8DE -- MOS32 0017 D8DE IPAGE0 ;page zero values -- MOS32 0018 D8DE ; externally accessed zero page values -- MOS32 0019 D8DE ^ &00FF -- MOS32 0020 D8DE ; -- MOS32 0021 D8DE 00FF ESCFLG # 0 ;Bit 7 of this is the escape flag -- MOS32 0022 D8DE -- MOS32 0023 D8DE -- MOS32 0024 D8DE ; bit7 escape pending -- MOS32 0025 D8DE ;= ZERO -- MOS32 0026 D8DE -- MOS32 0027 D8DE 00FF # -2 -- MOS32 0028 D8DE 00FD REPTR # &00 ;pointer after BRK -- MOS32 0029 D8DE ;= NULL /;hi-byte -- MOS32 0030 D8DE ;= NULL ;lo-byte -- MOS32 0031 D8DE -- MOS32 0032 D8DE 00FD # -1 -- MOS32 0033 D8DE 00FC TEMPA # &00 ;user IRQ routine save slot for register A -- MOS32 0034 D8DE ;= NULL -- MOS32 0035 D8DE -- MOS32 0036 D8DE 00FC # -2 -- MOS32 0037 D8DE 00FA SEIWK # &00 ;two work slots used whilst interrupts disabled -- MOS32 0038 D8DE ; -- MOS32 0039 D8DE 00FA JMILO * SEIWK +&00 ;used by OSBYTE/OSWORD -- MOS32 0040 D8DE 00FB JMIHI * SEIWK +&01 ;used by OSBYTE/OSWORD -- MOS32 0041 D8DE ; -- MOS32 0042 D8DE 00FA KEYSV * SEIWK +&00 ;work area for ... -- MOS32 0043 D8DE 00FB SKSZWK * SEIWK +&01 ; ... soft key compaction (also SKSIZE) -- MOS32 0044 D8DE ; -- MOS32 0045 D8DE 00FA KTEMP * SEIWK +&00 ;work area for keyboard -- MOS32 0046 D8DE ; -- MOS32 0047 D8DE 00FA BUFFLO * SEIWK +&00 ;work slots used by buffer management -- MOS32 0048 D8DE 00FB BUFFHI * SEIWK +&01 -- MOS32 0049 D8DE ; -- MOS32 0050 D8DE 00FA CRLO * SEIWK +&00 ;work slots used during ROM compare -- MOS32 0051 D8DE 00FB CRHI * SEIWK +&01 -- MOS32 0052 D8DE ; -- MOS32 0053 D8DE 00FA MASK * SEIWK +&00 ;work slots used by set Rx/Tx RS423 baud rates -- MOS32 0054 D8DE 00FB BAUD * SEIWK +&01 -- MOS32 0055 D8DE ; -- MOS32 0056 D8DE 00FA RSOP * SEIWK +&00 ;work slot used by RSUCTL -- MOS32 0057 D8DE ; -- MOS32 0058 D8DE 00FA NOTEWK * SEIWK +&00 ;work slot used by NOTE -- MOS32 0059 D8DE ; -- MOS32 0060 D8DE 00FA EVENTA * SEIWK +&00 ;work slot used by EVENT (hopefully no clashes) -- MOS32 0061 D8DE ; -- MOS32 0062 D8DE 00FA PEEKLO * SEIWK +&00 ;work slot used by OSWORD read-byte/write-byte -- MOS32 0063 D8DE 00FB PEEKHI * SEIWK +&01 -- MOS32 0064 D8DE ; -- MOS32 0065 D8DE 00FA SPWK1 * SEIWK +&00 ;used by speech sprocessing -- MOS32 0066 D8DE 00FB SPWK2 * SEIWK +&01 ;used by TIMER2 (speech) interrupt routine -- MOS32 0067 D8DE -- MOS32 0068 D8DE 00FA # -1 -- MOS32 0069 D8DE 00F9 SPARE0 # &00 ;**************** -- MOS32 0070 D8DE ; = NULL -- MOS32 0071 D8DE -- MOS32 0072 D8DE 00F9 # -1 -- MOS32 0073 D8DE 00F8 SPARE1 # &00 ;**************** -- MOS32 0074 D8DE ;= NULL -- MOS32 0075 D8DE -- MOS32 0076 D8DE 00F8 # -2 -- MOS32 0077 D8DE 00F6 ROMPTR # &00 ;pointer used by ROM filing system -- MOS32 0078 D8DE ;= NULL -- MOS32 0079 D8DE ;= NULL -- MOS32 0080 D8DE -- MOS32 0081 D8DE 00F6 # -1 -- MOS32 0082 D8DE 00F5 SEROM # &00 ;serial ROM id -- MOS32 0083 D8DE ;= NULL -- MOS32 0084 D8DE -- MOS32 0085 D8DE 00F5 # -1 -- MOS32 0086 D8DE 00F4 ROMID # &00 ;currently selected ROM -- MOS32 0087 D8DE -- MOS32 0088 D8DE ;= NULL -- MOS32 0089 D8DE -- MOS32 0090 D8DE 00F4 # -2 -- MOS32 0091 D8DE 00F2 WORK # &00 ;miscellaneous pointer -- MOS32 0092 D8DE ;= NULL -- MOS32 0093 D8DE ;= NULL -- MOS32 0094 D8DE -- MOS32 0095 D8DE 00F2 # -2 -- MOS32 0096 D8DE ; WORD values may be shared with other sei-routines -- MOS32 0097 D8DE 00F0 WORDX # &00 -- MOS32 0098 D8DE 00F0 BYTEX * WORDX -- MOS32 0099 D8DE 00F1 WORDY * WORDX +&01 -- MOS32 0100 D8DE 00F1 BYTEY * WORDY -- MOS32 0101 D8DE -- MOS32 0102 D8DE 00F0 # -1 -- MOS32 0103 D8DE 00EF WORDA # &00 -- MOS32 0104 D8DE 00EF BYTEA * WORDA -- MOS32 0105 D8DE ;= NULL -- MOS32 0106 D8DE -- MOS32 0107 D8DE 00EF # -1 -- MOS32 0108 D8DE 00EE PAGE1M # &00 ;selected page for 1MHz bus -- MOS32 0109 D8DE ;= ZERO -- MOS32 0110 D8DE -- MOS32 0111 D8DE 00EE # -1 -- MOS32 0112 D8DE 00ED OKEY # &00 ;current key value -- MOS32 0113 D8DE ;= ZERO -- MOS32 0114 D8DE -- MOS32 0115 D8DE 00ED # -1 -- MOS32 0116 D8DE 00EC CKEY # &00 ;current key value -- MOS32 0117 D8DE ;= ZERO -- MOS32 0118 D8DE -- MOS32 0119 D8DE 00EC # -1 -- MOS32 0120 D8DE 00EB ESSEMA # &00 ;EXEC/SPOOL semaphore (used by CFS) -- MOS32 0121 D8DE -- MOS32 0122 D8DE -- MOS32 0123 D8DE 00EB # -1 -- MOS32 0124 D8DE 00EA RSTUT # &00 ;RS423 printer timeouT -- MOS32 0125 D8DE ;= ZERO MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 51 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0126 D8DE -- MOS32 0127 D8DE 00EA # -2 -- MOS32 0128 D8DE 00E8 RDLNBF # &00 ;buffer address used by OSWORD readline routine -- MOS32 0129 D8DE -- MOS32 0130 D8DE 00E8 # -1 -- MOS32 0131 D8DE 00E7 ARCTR # &00 ;auto-repeat counter -- MOS32 0132 D8DE ;= ZERO -- MOS32 0133 D8DE -- MOS32 0134 D8DE 00E7 # -1 -- MOS32 0135 D8DE 00E6 WRKCLI # &00 ;shared work slot with interrupts enabled -- MOS32 0136 D8DE ; -- MOS32 0137 D8DE 00E6 RDCTEM * WRKCLI ;used by RDCH -- MOS32 0138 D8DE 00E6 CLIRY * WRKCLI ;used by CLI decoder -- MOS32 0139 D8DE ; -- MOS32 0140 D8DE 00E6 NUMBER * WRKCLI ;work slot for GETNUM -- MOS32 0141 D8DE 00E6 CSKEY * NUMBER ;current softkey number (must not share with KMASK or KQUOTE) -- MOS32 0142 D8DE ; -- MOS32 0143 D8DE 00E6 FILEY * WRKCLI ;save area for register Y -- MOS32 0144 D8DE 00E6 EXECY * FILEY ;save area used by EXEC -- MOS32 0145 D8DE -- MOS32 0146 D8DE 00E6 SPOOLY * FILEY ;save area used by SPOOL -- MOS32 0147 D8DE ;= NULL -- MOS32 0148 D8DE -- MOS32 0149 D8DE 00E6 # -1 -- MOS32 0150 D8DE 00E5 FXREGX # &00 ;used by FX CLI command -- MOS32 0151 D8DE 00E5 KMASK # &00 ;used by GSREAD -- MOS32 0152 D8DE ; must not be shared with CSKEY -- MOS32 0153 D8DE ;= NULL -- MOS32 0154 D8DE -- MOS32 0155 D8DE 00E5 # -1 -- MOS32 0156 D8DE 00E4 FXREGY # &00 ;used by FX CLI command -- MOS32 0157 D8DE 00E4 KQUOTE # &00 ;must not be shared with KMASK -- MOS32 0158 D8DE ; must not be shared with CSKEY -- MOS32 0159 D8DE ;= NULL -- MOS32 0160 D8DE -- MOS32 0161 D8DE 00E4 # -1 -- MOS32 0162 D8DE 00E3 CFS1 # &00 ;reserved for CFS -- MOS32 0163 D8DE -- MOS32 0164 D8DE 00E3 # -1 -- MOS32 0165 D8DE ; -- MOS32 0166 D8DE ; CFS workspace -- MOS32 0167 D8DE ; ============= -- MOS32 0168 D8DE ; -- MOS32 0169 D8DE 00E2 CFS0 # &00 ;reserved for CFS -- MOS32 0170 D8DE 00E2 CFSTAT * CFS0 -- MOS32 0171 D8DE ;PAGE ZERO -- MOS32 0172 D8DE -- MOS32 0173 D8DE 00B0 PZERO * &00B0 ;Start of p.0 workspace -- MOS32 0174 D8DE -- MOS32 0175 D8DE 00B0 BKADDR * PZERO ;4 BYTE BLOCK PTR. -- MOS32 0176 D8DE 00B4 HIADDR * BKADDR +&04 ;Top of data being saved, -- MOS32 0177 D8DE ;Must be contiguous with BKADDR -- MOS32 0178 D8DE -- MOS32 0179 D8DE 00B4 BLOKNO * HIADDR -- MOS32 0180 D8DE 00B6 SRCHBK * BLOKNO +&02 ;Block numbers being searched for -- MOS32 0181 D8DE ;Not used in SAVE, hence can overlap HIADDR -- MOS32 0182 D8DE -- MOS32 0183 D8DE 00B8 FTPTR * HIADDR +&04 ;Used in VSTRIN -- MOS32 0184 D8DE 00BA ERRSW * FTPTR +&02 ;In p.0 to save space -- MOS32 0185 D8DE 00BB USFLGS * ERRSW +&01 -- MOS32 0186 D8DE 00BC TEMP * USFLGS +&01 -- MOS32 0187 D8DE 00BD IBUF * TEMP +&01 -- MOS32 0188 D8DE 00BE CHKSUM * IBUF +&01 -- MOS32 0189 D8DE 00C0 IFLAG * CHKSUM +&02 -- MOS32 0190 D8DE 00C1 HDRCRC * IFLAG +&01 -- MOS32 0191 D8DE 00C2 ITYPE * HDRCRC +&01 -- MOS32 0192 D8DE 00C3 CURDRV * ITYPE +&01 ;Currently selected cassette -- MOS32 0193 D8DE 00C4 IADDR * CURDRV +&01 -- MOS32 0194 D8DE 00C6 SPEED * IADDR +&02 -- MOS32 0195 D8DE 00C7 GAPTIM * SPEED +&01 -- MOS32 0196 D8DE 00C8 GENPTR * GAPTIM +&01 ;Used in FILEGO/LOAD only -- MOS32 0197 D8DE 00CA TXFLAG * GENPTR +&02 ;"We are transmitting" flag -- MOS32 0198 D8DE 00CB CRCCNT * TXFLAG +&01 ;Used in CRC check -- MOS32 0199 D8DE 00CC FSIZE * CRCCNT + 1 ;File size to modify control block in LOAD -- MOS32 0200 D8DE -- MOS32 0201 D8DE 00E3 OPTS * CFS1 ;Retained over filing system change -- MOS32 0202 D8DE ;************************************** -- MOS32 0203 D8DE -- MOS32 0204 D8DE 00E2 BPAGE0 # &00 -- MOS32 0205 D8DE -- MOS32 0206 D8DE -- MOS32 0207 D8DE -- MOS32 0208 D8DE IPAGE2 -- MOS32 0209 D8DE ; page two values -- MOS32 0210 D8DE ^ &0200 -- MOS32 0211 D8DE 0200 APAGE2 # &00 -- MOS32 0212 D8DE 0200 USRVEC # &02 ;user vector -- MOS32 0213 D8DE 4A = BADFX -- MOS32 0214 D8DF E4 = /(BADFX ) -- MOS32 0215 D8E0 0202 BRKVEC # &02 ;BRK handling -- MOS32 0216 D8E0 76 = DEFBRK -- MOS32 0217 D8E1 DB = /(DEFBRK ) -- MOS32 0218 D8E2 0204 IRQALL # &02 ;all IRQs indirect thru here -- MOS32 0219 D8E2 2F = DEFIRQ -- MOS32 0220 D8E3 DE = /(DEFIRQ ) -- MOS32 0221 D8E4 0206 IRQVEC # &02 ;unrecognised IRQ -- MOS32 0222 D8E4 41 = IRQTWO -- MOS32 0223 D8E5 DE = /(IRQTWO ) -- MOS32 0224 D8E6 0208 COMVEC # &02 ;command line intepreter -- MOS32 0225 D8E6 F9 = CLINT -- MOS32 0226 D8E7 DF = /(CLINT ) -- MOS32 0227 D8E8 020A BYTVEC # &02 ;MOS routine, 0 1 or 2 arguments -- MOS32 0228 D8E8 EF = BYTE -- MOS32 0229 D8E9 E7 = /(BYTE ) -- MOS32 0230 D8EA 020C WORVEC # &02 ;MOS routine, >2 arguments -- MOS32 0231 D8EA 5A = WORD -- MOS32 0232 D8EB E8 = /(WORD ) -- MOS32 0233 D8EC 020E WRCVEC # &02 ;write character -- MOS32 0234 D8EC C9 = WRCH -- MOS32 0235 D8ED E1 = /(WRCH ) -- MOS32 0236 D8EE 0210 RDCVEC # &02 ;read character -- MOS32 0237 D8EE 7D = RDCH -- MOS32 0238 D8EF DE = /(RDCH ) -- MOS32 0239 D8F0 CFSTAB -- MOS32 0240 D8F0 0212 FILVEC # &02 ;load/save memory image -- MOS32 0241 D8F0 E0 = FILEGO -- MOS32 0242 D8F1 F1 = /(FILEGO ) -- MOS32 0243 D8F2 0214 ARGVEC # &02 ;read/set file attributes -- MOS32 0244 D8F2 99 = ARGGO -- MOS32 0245 D8F3 F1 = /(ARGGO ) -- MOS32 0246 D8F4 0216 BGTVEC # &02 ;get byte from random file MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 52 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0247 D8F4 E5 = GETBYT -- MOS32 0248 D8F5 F4 = /(GETBYT ) -- MOS32 0249 D8F6 0218 BPTVEC # &02 ;put byte to random file -- MOS32 0250 D8F6 48 = PUTBYT -- MOS32 0251 D8F7 F5 = /(PUTBYT ) -- MOS32 0252 D8F8 021A GPBVEC # &02 ;get/put bytes -- MOS32 0253 D8F8 B2 = RTS -- MOS32 0254 D8F9 FF = /(RTS ) -- MOS32 0255 D8FA 021C FNDVEC # &02 ;open/close random file -- MOS32 0256 D8FA EB = FIND -- MOS32 0257 D8FB F3 = /(FIND ) -- MOS32 0258 D8FC 021E FSCVEC # &02 ;file system control entry -- MOS32 0259 D8FC AB = FSFUNC -- MOS32 0260 D8FD F1 = /(FSFUNC ) -- MOS32 0261 D8FE 0220 EVTVEC # &02 ;event interrupt -- MOS32 0262 D8FE B2 = DEFEVT -- MOS32 0263 D8FF FF = /(DEFEVT ) -- MOS32 0264 D900 0222 UPTVEC # &02 ;user print routine -- MOS32 0265 D900 ; default hangs printer -- MOS32 0266 D900 B2 = DEFUPT -- MOS32 0267 D901 FF = /(DEFUPT ) -- MOS32 0268 D902 0224 NETVEC # &02 ;ECONET effects -- MOS32 0269 D902 ; default hangs printer -- MOS32 0270 D902 B2 = DEFNET -- MOS32 0271 D903 FF = /(DEFNET ) -- MOS32 0272 D904 0226 VDUVEC # &02 ;VDU command indirection -- MOS32 0273 D904 -- MOS32 0274 D904 B2 = RTS -- MOS32 0275 D905 FF = /(RTS ) -- MOS32 0276 D906 0228 KEYVEC # &02 ;keyboard control indirection -- MOS32 0277 D906 3F = DEFKEY -- MOS32 0278 D907 EF = /(DEFKEY ) -- MOS32 0279 D908 022A INSVEC # &02 ;buffer insert indirection -- MOS32 0280 D908 56 = INS -- MOS32 0281 D909 E1 = /(INS ) -- MOS32 0282 D90A 022C REMVEC # &02 ;buffer remove indirection -- MOS32 0283 D90A 26 = REM -- MOS32 0284 D90B E1 = /(REM ) -- MOS32 0285 D90C 022E CNPVEC # &02 ;buffer count / purge buffer indirection -- MOS32 0286 D90C 0A = CNP -- MOS32 0287 D90D E3 = /(CNP ) -- MOS32 0288 D90E 0230 INDONE # &02 -- MOS32 0289 D90E B2 = RTS -- MOS32 0290 D90F FF = /(RTS ) -- MOS32 0291 D910 0232 INDTWO # &02 -- MOS32 0292 D910 B2 = RTS -- MOS32 0293 D911 FF = /(RTS ) -- MOS32 0294 D912 0234 INDTRH # &02 -- MOS32 0295 D912 B2 = RTS -- MOS32 0296 D913 FF = /(RTS ) -- MOS32 0297 D914 0036 VLEN * @-APAGE2 -- MOS32 0298 D914 ; -- MOS32 0299 D914 001B NP2IND * VLEN:SHR: 1 ;number of page 2 indirections -- MOS32 0300 D914 0051 ROMIVS * NP2IND* 3 ;page ROM indirection vector size -- MOS32 0301 D914 0D9F ROMVEC * &0DF0-ROMIVS ;paged ROM routine vectors -- MOS32 0302 D914 -- MOS32 0303 D914 -- MOS32 0304 D914 0236 VARS # &00 -- MOS32 0305 D914 ; -- MOS32 0306 D914 0236 # &02 ;variables origin -- MOS32 0307 D914 90 = VBASE ;166 -- MOS32 0308 D915 01 = /(VBASE ) -- MOS32 0309 D916 -- MOS32 0310 D916 0238 # &02 ;origin of 3-byte ROM indirection vectors -- MOS32 0311 D916 9F = ROMVEC ;168 -- MOS32 0312 D917 0D = /(ROMVEC ) -- MOS32 0313 D918 -- MOS32 0314 D918 023A # &02 ;paged ROM info -- MOS32 0315 D918 A1 = ROMS ;170 -- MOS32 0316 D919 02 = /(ROMS ) -- MOS32 0317 D91A -- MOS32 0318 D91A 023C # &02 ;keyboard matrix info -- MOS32 0319 D91A 5E = KTBL ;172 -- MOS32 0320 D91B F0 = /(KTBL ) -- MOS32 0321 D91C -- MOS32 0322 D91C 023E # &02 ;VDU module origin of variables -- MOS32 0323 D91C 00 = VARBLE ;174 -- MOS32 0324 D91D 03 = /(VARBLE ) -- MOS32 0325 D91E -- MOS32 0326 D91E 0240 CYCLE # &01 ;filing system timeout byte -- MOS32 0327 D91E -- MOS32 0328 D91E 00 = NULL -- MOS32 0329 D91F -- MOS32 0330 D91F 0241 RDCHSW # &01 ;RDCH source switch (assumed not in page zero, see KTBL) -- MOS32 0331 D91F 00 = ZERO ;177 BRDCH (zero) -- MOS32 0332 D920 -- MOS32 0333 D920 0242 KSEMA # &01 ;keyboard semaphore -- MOS32 0334 D920 FF = &FF ;178 -- MOS32 0335 D921 -- MOS32 0336 D921 0243 IHWM # &01 -- MOS32 0337 D921 -- MOS32 0338 D921 00 = ZERO ;179 -- MOS32 0339 D922 -- MOS32 0340 D922 0244 HWM # &01 -- MOS32 0341 D922 -- MOS32 0342 D922 00 = NULL ;180 -- MOS32 0343 D923 -- MOS32 0344 D923 0245 RS8BIT # &01 -- MOS32 0345 D923 01 = &01 ;181 1 => 8 bits, 0 => soft key processing -- MOS32 0346 D924 -- MOS32 0347 D924 -- MOS32 0348 D924 0246 FONTSW # &01 ;current state of font explosion/implosion -- MOS32 0349 D924 -- MOS32 0350 D924 00 = ZERO ;182 -- MOS32 0351 D925 ; -- MOS32 0352 D925 0247 SROMSW # &01 ;SEROM/cassette switch -- MOS32 0353 D925 -- MOS32 0354 D925 00 = ZERO ;183 cassette by default -- MOS32 0355 D926 -- MOS32 0356 D926 -- MOS32 0357 D926 0248 VPREGA # &01 ;video ULA control register 0 -- MOS32 0358 D926 00 = NULL ;184 -- MOS32 0359 D927 ; -- MOS32 0360 D927 0249 VPREGB # &01 ;video ULA control register 1 -- MOS32 0361 D927 00 = NULL ;185 -- MOS32 0362 D928 -- MOS32 0363 D928 -- MOS32 0364 D928 024A REPROM # &01 ;ROM id after BRK -- MOS32 0365 D928 00 = NULL ;186 -- MOS32 0366 D929 ; -- MOS32 0367 D929 024B BROMID # &01 ;BASIC ROM id MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 53 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0368 D929 FF = &FF ;187 -- MOS32 0369 D92A -- MOS32 0370 D92A -- MOS32 0371 D92A 024C ADCHAN # &01 ;ADC channel number -- MOS32 0372 D92A 04 = NADC ;188 -- MOS32 0373 D92B ; -- MOS32 0374 D92B 024D MAXADC # &01 ;maximum ADC channel in use -- MOS32 0375 D92B 04 = NADC ;189 -- MOS32 0376 D92C ; -- MOS32 0377 D92C 024E ADCCNV # &01 -- MOS32 0378 D92C 00 = ZERO ;190 ADC conversion type (12 bits) -- MOS32 0379 D92D -- MOS32 0380 D92D -- MOS32 0381 D92D 024F RSFLAG # &01 ;RS423 use flag -- MOS32 0382 D92D -- MOS32 0383 D92D ; 1xxx xxxx => dormant -- MOS32 0384 D92D ; 0xxx xxxx => busy -- MOS32 0385 D92D FF = &FF ;191 -- MOS32 0386 D92E ; -- MOS32 0387 D92E 0250 RSCTFL # &01 -- MOS32 0388 D92E -- MOS32 0389 D92E 56 = RSCDEF ;192 -- MOS32 0390 D92F -- MOS32 0391 D92F -- MOS32 0392 D92F ; -- MOS32 0393 D92F 0251 FLCNT # &01 ;flash period counter -- MOS32 0394 D92F 19 = &19 ;193 1/2 SECOND -- MOS32 0395 D930 ; -- MOS32 0396 D930 0252 FLASHB # &00 ;used by flash FX calls -- MOS32 0397 D930 0252 FLSPC # &01 ;flash space period -- MOS32 0398 D930 19 = &19 ;194 1/2 SECOND -- MOS32 0399 D931 0253 FLMRK # &01 ;flash mark period -- MOS32 0400 D931 19 = &19 ;195 1/2 SECOND -- MOS32 0401 D932 ; -- MOS32 0402 D932 -- MOS32 0403 D932 -- MOS32 0404 D932 ;**** FOLLOWING MUST BE CONTIGUOUS (c.f. *FX11 and *FX12) **** -- MOS32 0405 D932 0254 FARSET # &01 ;first auto-repeat reset -- MOS32 0406 D932 32 = DAUTOD ;196 -- MOS32 0407 D933 0255 ARSET # &01 ;reset for above -- MOS32 0408 D933 08 = DAUTOP ;197 -- MOS32 0409 D934 -- MOS32 0410 D934 -- MOS32 0411 D934 0256 EXECH # &01 ;*EXEC handle -- MOS32 0412 D934 -- MOS32 0413 D934 00 = ZERO ;198 -- MOS32 0414 D935 ; -- MOS32 0415 D935 0257 SPOOLH # &01 ;*SPOOL handle -- MOS32 0416 D935 -- MOS32 0417 D935 00 = ZERO ;199 -- MOS32 0418 D936 ; -- MOS32 0419 D936 0258 CRIT # &01 ;critical region indicator -- MOS32 0420 D936 -- MOS32 0421 D936 00 = &00 ;200 not within critical region -- MOS32 0422 D937 ; -- MOS32 0423 D937 0259 NETKDS # &01 ;net keyboard disable -- MOS32 0424 D937 00 = ZERO ;201 default: not disabled -- MOS32 0425 D938 ; -- MOS32 0426 D938 025A KSTAT # &01 ;keyboard status (see MOS56) -- MOS32 0427 D938 20 = SHFTL ;202 -- MOS32 0428 D939 ; -- MOS32 0429 D939 025B RSHLVL # &01 ;RS423 handshake level -- MOS32 0430 D939 09 = RSOVR+&01 ;203 -- MOS32 0431 D93A ; -- MOS32 0432 D93A 025C RSSHUT # &01 ;suppress RS423 input -- MOS32 0433 D93A 00 = ZERO ;204 default: enable RS423 input -- MOS32 0434 D93B ; -- MOS32 0435 D93B 025D RSCASS # &01 ;cassette/RS423 serial processor select -- MOS32 0436 D93B 00 = ZERO ;205 $00 => select RS423, $40 => select cassette -- MOS32 0437 D93C ; -- MOS32 0438 D93C 025E NETIOC # &01 ;net interception of OS calls -- MOS32 0439 D93C 00 = ZERO ;206 default: not intercepted -- MOS32 0440 D93D ; -- MOS32 0441 D93D 025F NETRDC # &01 ;net interception of RDCH -- MOS32 0442 D93D 00 = ZERO ;207 default: not intercepted -- MOS32 0443 D93E ; -- MOS32 0444 D93E 0260 NETWRC # &01 ;net interception of WRCH -- MOS32 0445 D93E 00 = ZERO ;208 default: not intercepted -- MOS32 0446 D93F ; -- MOS32 0447 D93F 0261 SHUTSP # &01 ;speech suppressor -- MOS32 0448 D93F 50 = SPOPSP ;209 -- MOS32 0449 D940 ; -- MOS32 0450 D940 0262 SHUTUP # &01 ;sound suppressor -- MOS32 0451 D940 00 = ZERO ;210 allow sound by default -- MOS32 0452 D941 ; -- MOS32 0453 D941 0263 BELLC # &01 ;bell channel -- MOS32 0454 D941 03 = &03 ;211 -- MOS32 0455 D942 ; -- MOS32 0456 D942 0264 BELLI # &01 ;bell envelope and chord information -- MOS32 0457 D942 90 = &90 ;212 -- MOS32 0458 D943 ; -- MOS32 0459 D943 0265 BELLN # &01 ;bell frequency -- MOS32 0460 D943 64 = &64 ;213 -- MOS32 0461 D944 ; -- MOS32 0462 D944 0266 BELLD # &01 ;bell duration -- MOS32 0463 D944 06 = &06 ;214 -- MOS32 0464 D945 ; -- MOS32 0465 D945 0267 QUIET # &01 -- MOS32 0466 D945 81 = &81 ;215 suppress start-up message / !BOOT option -- MOS32 0467 D946 ; -- MOS32 0468 D946 0268 SOFKL # &01 ;soft key string length -- MOS32 0469 D946 00 = ZERO ;216 -- MOS32 0470 D947 ; -- MOS32 0471 D947 0269 LINES # &01 ;used by VDU software -- MOS32 0472 D947 -- MOS32 0473 D947 00 = ZERO ;217 used by VDU software in page mode -- MOS32 0474 D948 ; -- MOS32 0475 D948 026A QPOSN # &01 ;VDU queue count -- MOS32 0476 D948 -- MOS32 0477 D948 00 = ZERO ;218 -- MOS32 0478 D949 ; -- MOS32 0479 D949 026B TABCOD # &01 ;TAB key code -- MOS32 0480 D949 09 = TAB ;219 -- MOS32 0481 D94A ; -- MOS32 0482 D94A 026C INTCH # &01 -- MOS32 0483 D94A 1B = ESC ;220 interrupt character (normally ESC) -- MOS32 0484 D94B ; -- MOS32 0485 D94B 026D SOFTLO # &00 -- MOS32 0486 D94B ;221 softkey 10 feature -- MOS32 0487 D94B 026D EXBREK # &01 -- MOS32 0488 D94B 01 = &01 ;expand softkey MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 54 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0489 D94C ;222 reserved -- MOS32 0490 D94C 026E # &01 -- MOS32 0491 D94C D0 = &D0 -- MOS32 0492 D94D ;223 reserved -- MOS32 0493 D94D 026F # &01 -- MOS32 0494 D94D E0 = &E0 -- MOS32 0495 D94E ;224 reserved -- MOS32 0496 D94E 0270 # &01 -- MOS32 0497 D94E F0 = &F0 -- MOS32 0498 D94F ;225 -- MOS32 0499 D94F ; 0 => enable softkey expansion on fnkey -- MOS32 0500 D94F ; N => return code N+i for fnkey(i), i=0..9 -- MOS32 0501 D94F 0271 # &01 -- MOS32 0502 D94F 01 = &01 ;return soft strings by default -- MOS32 0503 D950 ;226 -- MOS32 0504 D950 ; 0 => enable softkey expansion on SHIFT/fnkey -- MOS32 0505 D950 ; N => return code N+i for SHIFT/fnkey(i), i=0..9 -- MOS32 0506 D950 0272 # &01 -- MOS32 0507 D950 80 = &80 ;return codes $80..$89 by default (user definable characters) -- MOS32 0508 D951 ;227 -- MOS32 0509 D951 ; 0 => enable softkey expansion on CTRL/fnkey -- MOS32 0510 D951 ; N => return code N+i for CTRL/fnkey(i), i=0..9 -- MOS32 0511 D951 0273 # &01 -- MOS32 0512 D951 90 = &90 ;return codes $90..$99 by default (user definable characters) -- MOS32 0513 D952 ;228 -- MOS32 0514 D952 ; 0 => enable softkey expansion on SHIFT/CTRL/fnkey -- MOS32 0515 D952 ; N => return code N+i for SHIFT/CTRL/fnkey(i), i=0..9 -- MOS32 0516 D952 0274 # &01 -- MOS32 0517 D952 00 = ZERO ;ingnore key combination by default -- MOS32 0518 D953 -- MOS32 0519 D953 0275 ESCHAR # &01 ;make INTERRUPT CHARACTER return normal value -- MOS32 0520 D953 00 = ZERO ;229 <>0 => return normal value -- MOS32 0521 D954 -- MOS32 0522 D954 0276 EAOPT # &01 ;suppress normal escape acknowledge actions -- MOS32 0523 D954 00 = ZERO ;230 suppress if <> 0 -- MOS32 0524 D955 -- MOS32 0525 D955 0277 B6522 # &01 ;$00 => no, $FF => second 6522 present -- MOS32 0526 D955 FFBYT -- MOS32 0527 D955 FF = &FF ;231 assume 6522B present -- MOS32 0528 D956 -- MOS32 0529 D956 0278 C6850 # &01 ;$00 => no, $FF => 6850 present -- MOS32 0530 D956 FF = &FF ;232 assume 6850 present -- MOS32 0531 D957 -- MOS32 0532 D957 0279 A6522 # &01 ;$00 => no, $FF => primary 6522 present -- MOS32 0533 D957 FF = &FF ;233 assume 6522A present -- MOS32 0534 D958 -- MOS32 0535 D958 027A TUBEM # &01 ;$FF if tube present -- MOS32 0536 D958 027A TUBE * TUBEM -- MOS32 0537 D958 00 = ZERO ;234 assume tube not present -- MOS32 0538 D959 -- MOS32 0539 D959 027B SPFLAG # &01 ;$FF if speech chip present -- MOS32 0540 D959 00 = ZERO ;235 -- MOS32 0541 D95A -- MOS32 0542 D95A 027C WRCHSW # &01 ;OSWRCH destinations flag -- MOS32 0543 D95A 0001 WRRS * &01 ;WRCH is RS423 -- MOS32 0544 D95A 0002 WRVDU * &02 ;WRCH is ***NOT*** VDU -- MOS32 0545 D95A 0004 WRPREN * &04 ;0 => ENABLE PRINT -- MOS32 0546 D95A 0008 WRPRNT * &08 ;WRCH is ***NOT*** print -- MOS32 0547 D95A 0010 WRSPL * &10 ;WRCH is ***NOT*** spool -- MOS32 0548 D95A 0040 WRVDU1 * &40 ;WRCH to printer only by VDU1 -- MOS32 0549 D95A 00 = ZERO ;236 WRCH is VDU/print/spool -- MOS32 0550 D95B ; ******** DO NOT ALTER ******** -- MOS32 0551 D95B -- MOS32 0552 D95B 027D CURSED # &01 -- MOS32 0553 D95B 00 = ZERO ;237 -- MOS32 0554 D95C -- MOS32 0555 D95C 007E MPAGE2 * @-APAGE2 -- MOS32 0556 D95C -- MOS32 0557 D95C 027E SPARE8 # &03 -- MOS32 0558 D95C 00 = ZERO -- MOS32 0559 D95D 00 = ZERO -- MOS32 0560 D95E 00 = ZERO -- MOS32 0561 D95F ; 238, 239, 240 -- MOS32 0562 D95F -- MOS32 0563 D95F 0281 UFX1 # &01 ;FX 1 value -- MOS32 0564 D95F 00 = ZERO ;241 -- MOS32 0565 D960 ; ******** DO NOT ALTER ******** -- MOS32 0566 D960 -- MOS32 0567 D960 0282 SPREGA # &01 ;serial processor register contents -- MOS32 0568 D960 -- MOS32 0569 D960 64 = B9600 ;242 -- MOS32 0570 D961 -- MOS32 0571 D961 0283 TIMESW # &01 ;TIME pointer, either 5 or 10 -- MOS32 0572 D961 05 = &05 ;243 -- MOS32 0573 D962 -- MOS32 0574 D962 0284 USKFLG # &01 ;soft key consistency flag -- MOS32 0575 D962 FF = &FF ;244 =0 => soft keys consistent -- MOS32 0576 D963 -- MOS32 0577 D963 0285 PRNTSW # &01 ;PRINT destination flag -- MOS32 0578 D963 0001 PCEN * &01 ;print is (C)ENTRONICS -- MOS32 0579 D963 0002 PRS * &02 ;print is (RS)232 -- MOS32 0580 D963 0003 PUSE * &03 ;print is (user) routine -- MOS32 0581 D963 0004 PNET * &04 ;print is ECO(NET) -- MOS32 0582 D963 01 = PCEN ;245 -- MOS32 0583 D964 ; ******** DO NOT ALTER ******** -- MOS32 0584 D964 -- MOS32 0585 D964 0286 PIGNOR # &01 ;printer ignore character -- MOS32 0586 D964 0A = MLF ;246 support auto-linefeed printers by default -- MOS32 0587 D965 ; ******** DO NOT ALTER ******** -- MOS32 0588 D965 -- MOS32 0589 D965 0087 PPAGE2 * @-APAGE2 -- MOS32 0590 D965 -- MOS32 0591 D965 0287 BREAKI # &03 ;used for interception of BREAK -- MOS32 0592 D965 00 = ZERO ;247 change to $4C to intercept BREAK -- MOS32 0593 D966 00 = ZERO ;248 -- MOS32 0594 D967 00 = ZERO ;249 -- MOS32 0595 D968 -- MOS32 0596 D968 028A SPARE9 # &02 ;spare -- MOS32 0597 D968 00 = ZERO ;250 -- MOS32 0598 D969 00 = ZERO ;251 -- MOS32 0599 D96A -- MOS32 0600 D96A 028C LROMID # &01 ;current language ROM id -- MOS32 0601 D96A FF = &FF ;252 -- MOS32 0602 D96B -- MOS32 0603 D96B 008D NPAGE2 * @-APAGE2 -- MOS32 0604 D96B -- MOS32 0605 D96B 028D TYPE # &01 ;restart type -- MOS32 0606 D96B ;= ZERO ;253 -- MOS32 0607 D96B -- MOS32 0608 D96B 028E MODELB # &01 -- MOS32 0609 D96B 028E MODEL * MODELB MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 55 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0610 D96B ;= ZERO ;254 -- MOS32 0611 D96B -- MOS32 0612 D96B 028F OPTION # &01 ;start up options -- MOS32 0613 D96B ;= ZERO ;255 -- MOS32 0614 D96B -- MOS32 0615 D96B 0190 VBASE * @-&100 -- MOS32 0616 D96B 00A6 VORG * VARS-VBASE -- MOS32 0617 D96B [ VARS-VBASE- 166=0 -- MOS32 0618 D96B | -- MOS32 0620 D96B ] -- MOS32 0621 D96B ; -- MOS32 0622 D96B -- MOS32 0623 D96B 0290 DPAGE2 # &00 -- MOS32 0624 D96B -- MOS32 0625 D96B 0290 VERTIC # &01 ;VDU vertical adjust -- MOS32 0626 D96B -- MOS32 0627 D96B ;= ZERO -- MOS32 0628 D96B -- MOS32 0629 D96B 0291 INTERL # &01 ;interlace invert -- MOS32 0630 D96B -- MOS32 0631 D96B ;= ZERO -- MOS32 0632 D96B -- MOS32 0633 D96B ; time -- MOS32 0634 D96B 0292 TIME1 # &05 ;first absolute time counter -- MOS32 0635 D96B 0292 TIME * TIME1 -- MOS32 0636 D96B ;= ZERO -- MOS32 0637 D96B ;= ZERO -- MOS32 0638 D96B ;= ZERO -- MOS32 0639 D96B ;= ZERO -- MOS32 0640 D96B ;= ZERO -- MOS32 0641 D96B 0297 TIME2 # &05 ;second absolute time counter -- MOS32 0642 D96B ;= ZERO -- MOS32 0643 D96B ;= ZERO -- MOS32 0644 D96B ;= ZERO -- MOS32 0645 D96B ;= ZERO -- MOS32 0646 D96B ;= ZERO -- MOS32 0647 D96B ; N.B. soft restart zeroes from here onwards -- MOS32 0648 D96B 029C STPW # &05 ;stopwatch counter -- MOS32 0649 D96B 029C CPAGE2 * STPW -- MOS32 0650 D96B ;= ZERO -- MOS32 0651 D96B ;= ZERO -- MOS32 0652 D96B ;= ZERO -- MOS32 0653 D96B ;= ZERO -- MOS32 0654 D96B ;= ZERO -- MOS32 0655 D96B -- MOS32 0656 D96B 02A1 ROMS # NROM -- MOS32 0657 D96B -- MOS32 0658 D96B ;= ZERO (NROM times) -- MOS32 0659 D96B -- MOS32 0660 D96B ; work slots used by CLI -- MOS32 0661 D96B 02B1 RDCTLO # &01 ;INKEY wait counter 1 -- MOS32 0662 D96B ;= ZERO -- MOS32 0663 D96B 02B2 RDCTHI # &01 ;INKEY wait counter 2 -- MOS32 0664 D96B ;= ZERO -- MOS32 0665 D96B -- MOS32 0666 D96B ; work slots used by RDLN -- MOS32 0667 D96B ; values must not be altered by any sei-routine -- MOS32 0668 D96B 02B3 RDLNN # &01 -- MOS32 0669 D96B ;= NULL -- MOS32 0670 D96B 02B4 RDLNLC # &01 -- MOS32 0671 D96B ;= NULL -- MOS32 0672 D96B 02B5 RDLNHC # &01 -- MOS32 0673 D96B ;= NULL -- MOS32 0674 D96B -- MOS32 0675 D96B ; ADC control -- MOS32 0676 D96B ; may not be shared -- MOS32 0677 D96B 02B6 ADCLOV # NADC ;ADC lo byte values (0 to 3) -- MOS32 0678 D96B ;= ZERO -- MOS32 0679 D96B ;= ZERO -- MOS32 0680 D96B ;= ZERO -- MOS32 0681 D96B ;= ZERO -- MOS32 0682 D96B 02BA ADCHIV # NADC ;ADC hi byte values (0 to 3) -- MOS32 0683 D96B ;= ZERO -- MOS32 0684 D96B ;= ZERO -- MOS32 0685 D96B ;= ZERO -- MOS32 0686 D96B ;= ZERO -- MOS32 0687 D96B 02BE ADCFLG # &01 -- MOS32 0688 D96B ;= ZERO -- MOS32 0689 D96B -- MOS32 0690 D96B ; event interrupt vectors -- MOS32 0691 D96B 000A NEVENT * &000A ;total number of events -- MOS32 0692 D96B 02BF EVENTS # NEVENT ;event flags -- MOS32 0693 D96B 0000 EVMPTY * &00 ;output buffer empty -- MOS32 0694 D96B ;= ZERO -- MOS32 0695 D96B 0001 EVFULL * &01 ;input buffer full -- MOS32 0696 D96B ;= ZERO -- MOS32 0697 D96B 0002 EVKYBD * &02 ;keyboard interrupt -- MOS32 0698 D96B ;= ZERO -- MOS32 0699 D96B 0003 EVADC * &03 ;ADC conversion complete -- MOS32 0700 D96B ;= ZERO -- MOS32 0701 D96B 0004 EVVSYN * &04 ;VSYNC -- MOS32 0702 D96B ;= ZERO -- MOS32 0703 D96B 0005 EVSWCH * &05 ;(timer) stopwatch -- MOS32 0704 D96B ;= ZERO -- MOS32 0705 D96B 0006 EVESC * &06 ;escape detected -- MOS32 0706 D96B ;= ZERO -- MOS32 0707 D96B 0007 EVRS * &07 ;RS423 Rx error -- MOS32 0708 D96B ;= ZERO -- MOS32 0709 D96B 0008 EVUSER * &08 ;user allocated event -- MOS32 0710 D96B ;= ZERO -- MOS32 0711 D96B -- MOS32 0712 D96B ; miscellaneous -- MOS32 0713 D96B 02C9 SOFKP # &01 ;pointer to soft key string -- MOS32 0714 D96B ;= NULL -- MOS32 0715 D96B ; -- MOS32 0716 D96B 02CA FARCTR # &01 ;first auto-repeat count -- MOS32 0717 D96B ;= NULL -- MOS32 0718 D96B -- MOS32 0719 D96B 02CB KSCSTA # &03 ;keyboard scan start address work vector -- MOS32 0720 D96B ;= NULL -- MOS32 0721 D96B -- MOS32 0722 D96B ; values to be initialised to $FF -- MOS32 0723 D96B 02CE FFBYTE # &00 -- MOS32 0724 D96B ; -- MOS32 0725 D96B 02CE SSEMA # &01 ;sound semaphore -- MOS32 0726 D96B ; -- MOS32 0727 D96B ; buffer activity flags -- MOS32 0728 D96B 02CF BACTIV # &00 -- MOS32 0729 D96B 02CF DUMMY # 3 ;Not used - necessary for padding (see PURGE) -- MOS32 0730 D96B 02D2 PFLAG # &01 ;print flag -- MOS32 0731 D96B ; 1xxx xxxx => dormant MOS32 MOS32 MOS32 MOS32 Acorn macro assembler Page 56 MOS32 MOS32 Initialisation and external interfaces MOS32 -- MOS32 0732 D96B ; 0xxx xxxx => busy -- MOS32 0733 D96B 02D3 SFLUSH # &04 ;sound flush flags -- MOS32 0734 D96B 02D7 SPSTAT # &01 ;speech processor status -- MOS32 0735 D96B ; -- MOS32 0736 D96B ; buffer control -- MOS32 0737 D96B ; buffer start page offsets -- MOS32 0738 D96B 02D8 BFSTRT # BUPB+&01 -- MOS32 0739 D96B ; buffer end page offsets -- MOS32 0740 D96B 02E1 BFEND # BUPB+&01 -- MOS32 0741 D96B ; -- MOS32 0742 D96B 02EA CFSA # &03 -- MOS32 0743 D96B -- MOS32 0744 D96B ; -- MOS32 0745 D96B 02ED CFSD # &01 -- MOS32 0746 D96B -- MOS32 0747 D96B 02EE FBLOCK # &12 ;load/save control block -- MOS32 0748 D96B 0000 FSTR * &0000 ;pointer to filename (2 bytes) -- MOS32 0749 D96B 0002 FLOAD * &0002 ;load address (4 bytes) -- MOS32 0750 D96B 0006 FEXEC * &0006 ;execute address (4 bytes) -- MOS32 0751 D96B 000A FFROM * &000A ;from address (4 bytes) -- MOS32 0752 D96B 000E FTO * &000E ;to address (4 bytes) -- MOS32 0753 D96B ;= 18*NULL -- MOS32 0754 D96B -- MOS32 0755 D96B 0300 ZPAGE2 # &00 -- MOS32 0756 D96B -- MOS32 0757 D96B LNK MOS34 -- MOS34 0001 D96B -- MOS34 0002 D96B ; MOS34 -- MOS34 0003 D96B TTL MOS34 Initialisation -- MOS34 0004 D96B OPT MOS34 MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 57 MOS34 MOS34 Initialisation MOS34 -- MOS34 0005 D96B -- MOS34 0006 D96B ;(c) 1981 ACORN Computers Limited -- MOS34 0007 D96B ;BBC Microcomputer MOS -- MOS34 0008 D96B -- MOS34 0009 D96B ;Change record: -- MOS34 0010 D96B ;100 15-Apr-82 PB Use PCEN=1 -- MOS34 0011 D96B ;039 15-Aug-81 PB Start of change to PROTON interface -- MOS34 0012 D96B ;004 29-Jul-81 MP Prototype version -- MOS34 0013 D96B -- MOS34 0014 D96B ;Author(s): -- MOS34 0015 D96B ;PB Paul Bond -- MOS34 0016 D96B ;MP Mike Prees -- MOS34 0017 D96B TTL Entry point after hardware break/reset -- MOS34 0018 D96B OPT OPNEWP MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 58 MOS34 Entry point after hardware break/reset MOS34 -- MOS34 0019 D96B -- MOS34 0020 D96B -- MOS34 0021 D96B MRESET ;entered here after reset -- MOS34 0022 D96B -- MOS34 0023 D96B ; ensure NMIs are ignored as sson as possible -- MOS34 0024 D96B ; -- MOS34 0025 D96B A9 40 LDAIM &40 ;A := RTI opcode -- MOS34 0026 D96D 8D 00 0D STA NMI -- MOS34 0027 D970 -- MOS34 0028 D970 ; ensure interrupts disabled (useful for JMP -4 freaks) -- MOS34 0029 D970 ; -- MOS34 0030 D970 78 SEI -- MOS34 0031 D971 -- MOS34 0032 D971 ; clear decimal mode -- MOS34 0033 D971 ; -- MOS34 0034 D971 D8 CLD -- MOS34 0035 D972 -- MOS34 0036 D972 ; reset stack -- MOS34 0037 D972 ; -- MOS34 0038 D972 A2 FF LDXIM &FF -- MOS34 0039 D974 9A TXS -- MOS34 0040 D975 -- MOS34 0041 D975 ; push hard reset status -- MOS34 0042 D975 ; -- MOS34 0043 D975 AD 4E FE LDA IERQ -- MOS34 0044 D978 0A ASLA -- MOS34 0045 D979 48 PHA ;A=0 => hard, A<>0 => soft -- MOS34 0046 D97A F0 09 BEQ HRDRST ;[hard reset, A=0] MOS34 0046 D97A v76 MOS34 0047 D97C ; MOS34 0046 D97A v76 MOS34 0048 D97C ; prepare for possible soft reset MOS34 0046 D97A v76 MOS34 0049 D97C ; MOS34 0046 D97A v76 MOS34 0050 D97C ; check for critical region MOS34 0046 D97A v76 MOS34 0051 D97C ; MOS34 0046 D97A v76 MOS34 0052 D97C AD 58 02 LDA CRIT MOS34 0046 D97A v76 MOS34 0053 D97F 4A LSRA MOS34 0046 D97A v76 MOS34 0054 D980 C9 01 CMPIM &01 MOS34 0046 D97A v76 MOS34 0055 D982 D0 38 BNE SFTRST ;[not within a critical region] MOS34 0055 D982 v47 MOS34 0056 D984 ; A=1 MOS34 0055 D982 v47 MOS34 0057 D984 4A LSRA MOS34 0055 D982 v47 MOS34 0058 D985 ; A=0 MOS34 0055 D982 v47 MOS34 0059 D985 ; MOS34 0055 D982 v47 MOS34 0060 D985 ; within a critical region - clear store MOS34 0055 D982 v47 MOS34 0061 D985 ; MOS34 0055 D982 v47 MOS34 0062 D985 HRDRST ;hard reset MOS34 0055 D982 v47 MOS34 0063 D985 ; A=0 MOS34 0055 D982 v47 MOS34 0064 D985 ; hard reset MOS34 0055 D982 v47 MOS34 0065 D985 ; clear store MOS34 0055 D982 v47 MOS34 0066 D985 [ MOS125 = &FF MOS34 0055 D982 v47 MOS34 0092 D985 ] MOS34 0055 D982 v47 MOS34 0093 D985 MOS34 0055 D982 v47 MOS34 0094 D985 [ MOS125 = &7F MOS34 0055 D982 v47 MOS34 0095 D985 A2 04 LDXIM &04 ;start clearing at page 4 MOS34 0055 D982 v47 MOS34 0096 D987 A8 TAY ;Y := 0 MOS34 0055 D982 v47 MOS34 0097 D988 85 00 STA &0000 MOS34 0055 D982 v47 MOS34 0098 D98A CLRPG MOS34 0055 D982 v47 MOS34 0099 D98A 86 01 STX &0001 MOS34 0055 D982 v47 MOS34 0100 D98C C8 INY MOS34 0055 D982 v47 MOS34 0101 D98D 91 00 STAIY &0000 ;saves 163 ms MOS34 0055 D982 v47 MOS34 0102 D98F E4 01 CPX &0001 MOS34 0055 D982 v47 MOS34 0103 D991 D0 23 BNE CLEAR0 ;[16K RAM] MOS34 0055 D982 v47 MOS34 0104 D993 E8 INX MOS34 0055 D982 v47 MOS34 0105 D994 E0 0D CPXIM /(NMI ) MOS34 0055 D982 v47 MOS34 0106 D996 85 F2 STA WORK MOS34 0055 D982 v47 MOS34 0107 D998 86 F3 STX WORK+1 MOS34 0055 D982 v47 MOS34 0108 D99A F0 06 BEQ CLEARA ;leave RTI in place MOS34 0055 D982 v47 MOS34 0109 D99C 88 DEY ;otherwise Y=0 MOS34 0055 D982 v47 MOS34 0110 D99D MOS34 0055 D982 v47 MOS34 0111 D99D ; clear store to $00 (no blobs on screen) MOS34 0055 D982 v47 MOS34 0112 D99D ; done: 0000 even . 0 . . MOS34 0055 D982 v47 MOS34 0113 D99D ; X WORK odd x . . . MOS34 0055 D982 v47 MOS34 0114 D99D ; Y MOS34 0055 D982 v47 MOS34 0115 D99D CLEAR MOS34 0055 D982 v47 MOS34 0116 D99D 91 F2 STAIY WORK ;saves 4 ms MOS34 0055 D982 v47 MOS34 0117 D99F C8 INY ;1 MOS34 0055 D982 v47 MOS34 0118 D9A0 91 00 STAIY &0000 MOS34 0055 D982 v47 MOS34 0119 D9A2 CLEARA MOS34 0055 D982 v47 MOS34 0120 D9A2 91 F2 STAIY WORK ;saves 4 ms MOS34 0055 D982 v47 MOS34 0121 D9A4 C8 INY ;2 MOS34 0055 D982 v47 MOS34 0122 D9A5 91 00 STAIY &0000 ;saves 24 ms MOS34 0055 D982 v47 MOS34 0123 D9A7 91 F2 STAIY WORK ;saves 4 ms MOS34 0055 D982 v47 MOS34 0124 D9A9 C8 INY ;3 MOS34 0055 D982 v47 MOS34 0125 D9AA 91 00 STAIY &0000 ;saves 8 ms MOS34 0055 D982 v47 MOS34 0126 D9AC 91 F2 STAIY WORK ;saves 4 ms MOS34 0055 D982 v47 MOS34 0127 D9AE C8 INY ;0 MOS34 0055 D982 v47 MOS34 0128 D9AF 91 00 STAIY &0000 ;saves 4 ms MOS34 0055 D982 v47 MOS34 0129 D9B1 D0 EA BNE CLEAR MOS34 0055 D982 v47 MOS34 0130 D9B3 E8 INX MOS34 0055 D982 v47 MOS34 0131 D9B4 10 D4 BPL CLRPG MOS34 0055 D982 v47 MOS34 0132 D9B6 ; 32K RAM MOS34 0055 D982 v47 MOS34 0133 D9B6 ; MOS34 0055 D982 v47 MOS34 0134 D9B6 CLEAR0 MOS34 0055 D982 v47 MOS34 0135 D9B6 ; $0001 = $80 (model B) or $40 (model A) MOS34 0055 D982 v47 MOS34 0136 D9B6 8E 8E 02 STX MODELB MOS34 0055 D982 v47 MOS34 0137 D9B9 ; MOS34 0055 D982 v47 MOS34 0138 D9B9 ; force soft keys reset MOS34 0055 D982 v47 MOS34 0139 D9B9 8E 84 02 STX USKFLG ;USKFLG := non-zero MOS34 0055 D982 v47 MOS34 0140 D9BC ] MOS34 0055 D982 v47 MOS34 0141 D9BC MOS34 0055 D982 v47 MOS34 0142 D9BC [ MOS125 = &00 MOS34 0055 D982 v47 MOS34 0169 D9BC ] MOS34 0055 D982 v47 MOS34 0170 D9BC MOS34 0055 D982 v47 MOS34 0171 D9BC ; MOS34 0055 D982 v47 MOS34 0172 D9BC SFTRST MOS34 0055 D982 v47 MOS34 0173 D9BC ; MOS34 0055 D982 v47 MOS34 0174 D9BC ; initialise addressable latch outputs hi MOS34 0055 D982 v47 MOS34 0175 D9BC ; MOS34 0055 D982 v47 MOS34 0176 D9BC A2 0F LDXIM &0F ;for latch driving -- MOS34 0177 D9BE 8E 42 FE STX DDRBQ ;set PB3-PB0 as outputs to drive addressable latch -- MOS34 0178 D9C1 ; -- MOS34 0179 D9C1 IALTCH -- MOS34 0180 D9C1 CA DEX MOS34 0183 D9C7 ^78 MOS34 0181 D9C2 8E 40 FE STX PBQ ;first store value = $0E, last store value = $08 MOS34 0183 D9C7 ^78 MOS34 0182 D9C5 E0 09 CPXIM &09 MOS34 0183 D9C7 ^78 MOS34 0183 D9C7 B0 F8 BCS IALTCH -- MOS34 0184 D9C9 ; fall thru when X=$08 -- MOS34 0185 D9C9 -- MOS34 0186 D9C9 -- MOS34 0187 D9C9 ; check for hard restart -- MOS34 0188 D9C9 ; -- MOS34 0189 D9C9 ; read start-up options -- MOS34 0190 D9C9 ; MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 59 MOS34 Entry point after hardware break/reset MOS34 -- MOS34 0191 D9C9 E8 INX ;X := $09, scan down from last start-up option -- MOS34 0192 D9CA ; -- MOS34 0193 D9CA RDOPT1 -- MOS34 0194 D9CA 8A TXA ;save X in A MOS34 0203 D9D4 ^74 MOS34 0195 D9CB 20 5D F0 JSR KC ;read state of matrix element addressed by X (A maintained) MOS34 0203 D9D4 ^74 MOS34 0196 D9CE ; MOS34 0203 D9D4 ^74 MOS34 0197 D9CE ; N.B. does not corrupt A MOS34 0203 D9D4 ^74 MOS34 0198 D9CE ; MOS34 0203 D9D4 ^74 MOS34 0199 D9CE E0 80 CPXIM &80 ;C=0 => option open, C=1 => option closed MOS34 0203 D9D4 ^74 MOS34 0200 D9D0 66 FC ROR TEMPA ;rotate state of start-up option into TEMPA byte MOS34 0203 D9D4 ^74 MOS34 0201 D9D2 AA TAX ;restore X MOS34 0203 D9D4 ^74 MOS34 0202 D9D3 CA DEX MOS34 0203 D9D4 ^74 MOS34 0203 D9D4 D0 F4 BNE RDOPT1 ;execute loop 9 times -- MOS34 0204 D9D6 ; -- MOS34 0205 D9D6 ; N.B. exits with X=0, SHIFT key has not been scanned -- MOS34 0206 D9D6 ; state of CTRL key has been rotated into TEMPA -- MOS34 0207 D9D6 ; -- MOS34 0208 D9D6 8E 8D 02 STX TYPE ;restart type := 0 -- MOS34 0209 D9D9 26 FC ROL TEMPA ;C = state of CTRL key, TEMPA = start-up options -- MOS34 0210 D9DB 20 28 EF JSR KBDIS ;disable keyboard (and resume hardware scan) -- MOS34 0211 D9DE ; -- MOS34 0212 D9DE 6A RORA ;C=1 => CTRL pressed (KBDIS does PHP ... PLA) -- MOS34 0213 D9DF ; -- MOS34 0214 D9DF A2 9C LDXIM CPAGE2 ;(do not set to reset timer if soft restart) -- MOS34 0215 D9E1 A0 8D LDYIM NPAGE2 ;reset BREAKI if power up -- MOS34 0216 D9E3 68 PLA ;pull hard restart status -- MOS34 0217 D9E4 F0 09 BEQ POWER ;[power up] MOS34 0217 D9E4 v76 MOS34 0218 D9E6 ; MOS34 0217 D9E4 v76 MOS34 0219 D9E6 A0 7E LDYIM MPAGE2 ;prepare for BREAK MOS34 0217 D9E4 v76 MOS34 0220 D9E8 90 11 BCC SOFT ;[CTRL not pressed - force soft reset, b1b0(TYPE) := 0] MOS34 0220 D9E8 v6E MOS34 0221 D9EA ; MOS34 0220 D9E8 v6E MOS34 0222 D9EA ; b1b0(TYPE) := 2 MOS34 0220 D9E8 v6E MOS34 0223 D9EA ; MOS34 0220 D9E8 v6E MOS34 0224 D9EA A0 87 LDYIM PPAGE2 ;CTRL/BREAK MOS34 0220 D9E8 v6E MOS34 0225 D9EC EE 8D 02 INC TYPE MOS34 0220 D9E8 v6E MOS34 0226 D9EF ; MOS34 0220 D9E8 v6E MOS34 0227 D9EF POWER ;power up, b1b0(TYPE) := 1 MOS34 0220 D9E8 v6E MOS34 0228 D9EF ;HARD ;hard restart MOS34 0220 D9E8 v6E MOS34 0229 D9EF EE 8D 02 INC TYPE MOS34 0220 D9E8 v6E MOS34 0230 D9F2 ; MOS34 0220 D9E8 v6E MOS34 0231 D9F2 ; initialise OPTION MOS34 0220 D9E8 v6E MOS34 0232 D9F2 ; MOS34 0220 D9E8 v6E MOS34 0233 D9F2 A5 FC LDA TEMPA MOS34 0220 D9E8 v6E MOS34 0234 D9F4 49 FF EORIM &FF ;invert VDU mode selection MOS34 0220 D9E8 v6E MOS34 0235 D9F6 8D 8F 02 STA OPTION MOS34 0220 D9E8 v6E MOS34 0236 D9F9 ; MOS34 0220 D9E8 v6E MOS34 0237 D9F9 A2 90 LDXIM DPAGE2 ;set to reset timer MOS34 0220 D9E8 v6E MOS34 0238 D9FB MOS34 0220 D9E8 v6E MOS34 0239 D9FB MOS34 0220 D9E8 v6E MOS34 0240 D9FB SOFT MOS34 0220 D9E8 v6E MOS34 0241 D9FB ; initialise other page two locations to zero/$FF MOS34 0220 D9E8 v6E MOS34 0242 D9FB ; N.B. X has been set to an appropriate value MOS34 0220 D9E8 v6E MOS34 0243 D9FB A9 00 LDAIM ZERO -- MOS34 0244 D9FD IP0SX -- MOS34 0245 D9FD E0 CE CPXIM FFBYTE MOS34 0258 DA0C ^6F MOS34 0246 D9FF [ MOS125 = &FF MOS34 0258 DA0C ^6F MOS34 0249 D9FF | MOS34 0258 DA0C ^6F MOS34 0250 D9FF D0 07 BNE Z0BYTE MOS34 0258 DA0C ^6F MOS34 0251 DA01 A9 FF LDAIM &FF MOS34 0258 DA0C ^6F MOS34 0252 DA03 8D CE 02 STA SSEMA MOS34 0258 DA0C ^6F MOS34 0253 DA06 A2 D2 LDXIM PFLAG MOS34 0258 DA0C ^6F MOS34 0254 DA08 ] MOS34 0258 DA0C ^6F MOS34 0255 DA08 Z0BYTE MOS34 0258 DA0C ^6F MOS34 0256 DA08 9D 00 02 STAAX &0200 MOS34 0258 DA0C ^6F MOS34 0257 DA0B E8 INX MOS34 0258 DA0C ^6F MOS34 0258 DA0C D0 EF BNE IP0SX -- MOS34 0259 DA0E ; N.B. A=$FF, X=0 -- MOS34 0260 DA0E 8D 63 FE STA DDRAR ;set all outputs on printer data direction register (6522B) -- MOS34 0261 DA11 -- MOS34 0262 DA11 -- MOS34 0263 DA11 ; initialise page zero locations to zero -- MOS34 0264 DA11 ; -- MOS34 0265 DA11 8A TXA ;A := 0 -- MOS34 0266 DA12 A2 E2 LDXIM BPAGE0 -- MOS34 0267 DA14 IP0SW -- MOS34 0268 DA14 95 00 STAAX ZERO MOS34 0270 DA17 ^7B MOS34 0269 DA16 E8 INX MOS34 0270 DA17 ^7B MOS34 0270 DA17 D0 FB BNE IP0SW -- MOS34 0271 DA19 ; X=0 -- MOS34 0272 DA19 -- MOS34 0273 DA19 -- MOS34 0274 DA19 ; initialise page two specific values -- MOS34 0275 DA19 ; -- MOS34 0276 DA19 IP2SV -- MOS34 0277 DA19 B9 DD D8 LDAAY IPAGE2 -&01 MOS34 0280 DA20 ^77 MOS34 0278 DA1C 99 FF 01 STAAY APAGE2 -&01 MOS34 0280 DA20 ^77 MOS34 0279 DA1F 88 DEY MOS34 0280 DA20 ^77 MOS34 0280 DA20 D0 F7 BNE IP2SV -- MOS34 0281 DA22 ; Y=0 -- MOS34 0282 DA22 -- MOS34 0283 DA22 -- MOS34 0284 DA22 ; make old key space in case CFS auto-boot selected -- MOS34 0285 DA22 ; -- MOS34 0286 DA22 A9 62 LDAIM &62 -- MOS34 0287 DA24 85 ED STA OKEY -- MOS34 0288 DA26 ; X=0, Y=0 -- MOS34 0289 DA26 -- MOS34 0290 DA26 -- MOS34 0291 DA26 ; setup MC6850 -- MOS34 0292 DA26 ; -- MOS34 0293 DA26 20 1A FB JSR MC6850 ;N.B. does not corrupt X or Y -- MOS34 0294 DA29 ; X=0, Y=0 -- MOS34 0295 DA29 -- MOS34 0296 DA29 -- MOS34 0297 DA29 ; clear any 6522 interrupt status -- MOS34 0298 DA29 ; -- MOS34 0299 DA29 A9 7F LDAIM &7F -- MOS34 0300 DA2B E8 INX ;X=1 -- MOS34 0301 DA2C IFRIER ;X=1 initialises IERQ&IERR, X=0 initialises IFRQ&IFRR -- MOS34 0302 DA2C 9D 4D FE STAAX IFRQ MOS34 0305 DA33 ^77 MOS34 0303 DA2F 9D 6D FE STAAX IFRR MOS34 0305 DA33 ^77 MOS34 0304 DA32 CA DEX MOS34 0305 DA33 ^77 MOS34 0305 DA33 10 F7 BPL IFRIER ;[execute loop once more with X=0] -- MOS34 0306 DA35 ; X=$FF -- MOS34 0307 DA35 ; -- MOS34 0308 DA35 [ FALSE=0 -- MOS34 0311 DA35 ] -- MOS34 0312 DA35 -- MOS34 0313 DA35 ; TEMPA is now 0 -- MOS34 0314 DA35 ; if an interrupt occurs it will adopt the value $7F -- MOS34 0315 DA35 ; MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 60 MOS34 Entry point after hardware break/reset MOS34 -- MOS34 0316 DA35 ; allow test equipment to interrupt if present -- MOS34 0317 DA35 ; -- MOS34 0318 DA35 58 CLI -- MOS34 0319 DA36 ; ** TEST EQUIPMENT INTERRUPT MAY OCCUR HERE ** -- MOS34 0320 DA36 78 SEI -- MOS34 0321 DA37 ; -- MOS34 0322 DA37 24 FC BIT TEMPA -- MOS34 0323 DA39 50 03 BVC NOTST1 MOS34 0323 DA39 v7C MOS34 0324 DA3B ; C=0 MOS34 0323 DA39 v7C MOS34 0325 DA3B 20 88 F0 JSR JMITST ;enter test routine (first call) MOS34 0323 DA39 v7C MOS34 0326 DA3E NOTST1 MOS34 0323 DA39 v7C MOS34 0327 DA3E MOS34 0323 DA39 v7C MOS34 0328 DA3E MOS34 0323 DA39 v7C MOS34 0329 DA3E [ FALSE=0 MOS34 0323 DA39 v7C MOS34 0348 DA3E ] MOS34 0323 DA39 v7C MOS34 0349 DA3E MOS34 0323 DA39 v7C MOS34 0350 DA3E MOS34 0323 DA39 v7C MOS34 0351 DA3E ; initialise 6522s MOS34 0323 DA39 v7C MOS34 0352 DA3E ; MOS34 0323 DA39 v7C MOS34 0353 DA3E A2 F2 LDXIM &F2 ;enable TIMER1(clock,40), TIMER2(speech,20) -- MOS34 0354 DA40 ; CB1(ADC,10), CA1(VSYNC,02) and NOT[CA2(keyboard,01)] -- MOS34 0355 DA40 8E 4E FE STX IERQ -- MOS34 0356 DA43 -- MOS34 0357 DA43 -- MOS34 0358 DA43 ; initialise peripheral control register -- MOS34 0359 DA43 ; -- MOS34 0360 DA43 A2 04 LDXIM &04 -- MOS34 0361 DA45 8E 4C FE STX PCRQ ;select CA2 positive active edge -- MOS34 0362 DA48 -- MOS34 0363 DA48 -- MOS34 0364 DA48 ; setup centisecond timer -- MOS34 0365 DA48 ; -- MOS34 0366 DA48 A9 60 LDAIM &60 ;TIMER1 continuous, TIMER2 count pulses on PB6 -- MOS34 0367 DA4A 8D 4B FE STA ACRQ -- MOS34 0368 DA4D -- MOS34 0369 DA4D -- MOS34 0370 DA4D ; N.B. ACRR zeroed by reset -- MOS34 0371 DA4D ; -- MOS34 0372 DA4D ; set timer hi-byte -- MOS34 0373 DA4D ; -- MOS34 0374 DA4D A9 0E LDAIM &0E ;timer 1 period = 998 usec -- MOS34 0375 DA4F 8D 46 FE STA TQLLQ -- MOS34 0376 DA52 8D 6C FE STA PCRR ;set CA2 hi (for printer) -- MOS34 0377 DA55 ; -- MOS34 0378 DA55 ; start conversion on analog/digital chip -- MOS34 0379 DA55 ; -- MOS34 0380 DA55 8D C0 FE STA ADCCTL ;12 bits from chip channel 2 -- MOS34 0381 DA58 -- MOS34 0382 DA58 -- MOS34 0383 DA58 ; check whether 6522B present -- MOS34 0384 DA58 ; -- MOS34 0385 DA58 CD 6C FE CMP PCRR -- MOS34 0386 DA5B F0 03 BEQ B6522E ;[6522B exists] MOS34 0386 DA5B v7C MOS34 0387 DA5D ; MOS34 0386 DA5B v7C MOS34 0388 DA5D ; 6522B does not exist MOS34 0386 DA5B v7C MOS34 0389 DA5D ; MOS34 0386 DA5B v7C MOS34 0390 DA5D EE 77 02 INC B6522 ;B6522 := $00 MOS34 0386 DA5B v7C MOS34 0391 DA60 B6522E MOS34 0386 DA5B v7C MOS34 0392 DA60 ; MOS34 0386 DA5B v7C MOS34 0393 DA60 ; set timer lo-byte MOS34 0386 DA5B v7C MOS34 0394 DA60 ; MOS34 0386 DA5B v7C MOS34 0395 DA60 A9 27 LDAIM &27 -- MOS34 0396 DA62 8D 47 FE STA TQLHQ -- MOS34 0397 DA65 8D 45 FE STA TQCHQ -- MOS34 0398 DA68 -- MOS34 0399 DA68 -- MOS34 0400 DA68 ; kill sound -- MOS34 0401 DA68 ; -- MOS34 0402 DA68 20 02 ED JSR SNDRST -- MOS34 0403 DA6B -- MOS34 0404 DA6B -- MOS34 0405 DA6B ; ensure motor off -- MOS34 0406 DA6B ; reinitialise serproc -- MOS34 0407 DA6B ; -- MOS34 0408 DA6B AD 82 02 LDA SPREGA -- MOS34 0409 DA6E 29 7F ANDIM &7F -- MOS34 0410 DA70 20 33 E7 JSR STASP ;STA SPREGA, STA SERPRC -- MOS34 0411 DA73 ; X, Y corrupted -- MOS34 0412 DA73 -- MOS34 0413 DA73 -- MOS34 0414 DA73 ; conditionally reset soft keys -- MOS34 0415 DA73 ; soft keys are reset -- MOS34 0416 DA73 ; (a) after a hard reset -- MOS34 0417 DA73 ; (b) if reset occurred during a critical update of the soft keys -- MOS34 0418 DA73 ; -- MOS34 0419 DA73 AE 84 02 LDX USKFLG -- MOS34 0420 DA76 F0 03 BEQ SKOK MOS34 0420 DA76 v7C MOS34 0421 DA78 20 07 EA JSR RSOFT ;reset soft keys, sets X=0 MOS34 0420 DA76 v7C MOS34 0422 DA7B SKOK MOS34 0420 DA76 v7C MOS34 0423 DA7B ; X=0 MOS34 0420 DA76 v7C MOS34 0424 DA7B MOS34 0420 DA76 v7C MOS34 0425 DA7B MOS34 0420 DA76 v7C MOS34 0426 DA7B ; compare ROMs MOS34 0420 DA76 v7C MOS34 0427 DA7B ; MOS34 0420 DA76 v7C MOS34 0428 DA7B CRX MOS34 0420 DA76 v7C MOS34 0429 DA7B 20 E7 DB JSR STXROM ;select ROM MOS34 0486 DACD ^2C MOS34 0430 DA7E ; MOS34 0486 DACD ^2C MOS34 0431 DA7E ; check for copyright string MOS34 0486 DACD ^2C MOS34 0432 DA7E ; MOS34 0486 DACD ^2C MOS34 0433 DA7E A2 03 LDXIM &03 MOS34 0486 DACD ^2C MOS34 0434 DA80 AC 07 80 LDY COPYRP MOS34 0486 DACD ^2C MOS34 0435 DA83 CRCPYR MOS34 0486 DACD ^2C MOS34 0436 DA83 B9 00 80 LDAAY LANG MOS34 0486 DACD ^2C MOS34 0437 DA86 DD 3F F5 CMPAX COPYR MOS34 0486 DACD ^2C MOS34 0438 DA89 D0 2E BNE CRBAD MOS34 0486 DACD ^2C MOS34 0439 DA8B C8 INY MOS34 0486 DACD ^2C MOS34 0440 DA8C CA DEX MOS34 0486 DACD ^2C MOS34 0441 DA8D 10 F4 BPL CRCPYR MOS34 0486 DACD ^2C MOS34 0442 DA8F ; MOS34 0486 DACD ^2C MOS34 0443 DA8F ; ROM has copyright string MOS34 0486 DACD ^2C MOS34 0444 DA8F ; MOS34 0486 DACD ^2C MOS34 0445 DA8F A6 F4 LDX ROMID MOS34 0486 DACD ^2C MOS34 0446 DA91 A4 F4 LDY ROMID MOS34 0486 DACD ^2C MOS34 0447 DA93 CRY MOS34 0486 DACD ^2C MOS34 0448 DA93 C8 INY MOS34 0486 DACD ^2C MOS34 0449 DA94 C0 10 CPYIM NROM MOS34 0486 DACD ^2C MOS34 0450 DA96 B0 25 BCS CRNX ;[Y > number of ROMs] MOS34 0486 DACD ^2C MOS34 0451 DA98 98 TYA MOS34 0486 DACD ^2C MOS34 0452 DA99 49 FF EORIM &FF MOS34 0486 DACD ^2C MOS34 0453 DA9B 85 FA STA CRLO MOS34 0486 DACD ^2C MOS34 0454 DA9D A9 7F LDAIM &7F ;N.B. this is LANG / - 1 MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 61 MOS34 Entry point after hardware break/reset MOS34 MOS34 0486 DACD ^2C MOS34 0455 DA9F 85 FB STA CRHI MOS34 0486 DACD ^2C MOS34 0456 DAA1 CRLOOP MOS34 0486 DACD ^2C MOS34 0457 DAA1 8C 30 FE STY ROM ;select second (Y) ROM MOS34 0486 DACD ^2C MOS34 0458 DAA4 B1 FA LDAIY CRLO MOS34 0486 DACD ^2C MOS34 0459 DAA6 8E 30 FE STX ROM ;select first (X) ROM MOS34 0486 DACD ^2C MOS34 0460 DAA9 D1 FA CMPIY CRLO MOS34 0486 DACD ^2C MOS34 0461 DAAB D0 E6 BNE CRY ;[ROMs do not match] MOS34 0486 DACD ^2C MOS34 0462 DAAD E6 FA INC CRLO MOS34 0486 DACD ^2C MOS34 0463 DAAF D0 F0 BNE CRLOOP MOS34 0486 DACD ^2C MOS34 0464 DAB1 E6 FB INC CRHI MOS34 0486 DACD ^2C MOS34 0465 DAB3 A5 FB LDA CRHI MOS34 0486 DACD ^2C MOS34 0466 DAB5 C9 84 CMPIM &84 ;compare only first 1K of ROMs MOS34 0486 DACD ^2C MOS34 0467 DAB7 90 E8 BCC CRLOOP MOS34 0486 DACD ^2C MOS34 0468 DAB9 ; ROMs match MOS34 0486 DACD ^2C MOS34 0469 DAB9 CRBAD MOS34 0486 DACD ^2C MOS34 0470 DAB9 A6 F4 LDX ROMID MOS34 0486 DACD ^2C MOS34 0471 DABB 10 0D BPL CRNX1 ;[ALWAYS jump] MOS34 0486 DACD ^2C MOS34 0472 DABD ; NEVER fall thru MOS34 0486 DACD ^2C MOS34 0473 DABD ; MOS34 0486 DACD ^2C MOS34 0474 DABD CRNX MOS34 0486 DACD ^2C MOS34 0475 DABD AD 06 80 LDA ROMTYP MOS34 0486 DACD ^2C MOS34 0476 DAC0 9D A1 02 STAAX ROMS ;store type of recognised ROM MOS34 0486 DACD ^2C MOS34 0477 DAC3 ; check for BASIC ROM MOS34 0486 DACD ^2C MOS34 0478 DAC3 ;***** N.B. WHITE BASIC MAY NEED 'ANDIM $FE' ***** MOS34 0486 DACD ^2C MOS34 0479 DAC3 29 8F ANDIM &8F MOS34 0486 DACD ^2C MOS34 0480 DAC5 D0 03 BNE CRNX1 ;[not a BASIC ROM] MOS34 0486 DACD ^2C MOS34 0481 DAC7 ; BASIC ROM - remember ROM id for *BASIC command MOS34 0486 DACD ^2C MOS34 0482 DAC7 8E 4B 02 STX BROMID MOS34 0486 DACD ^2C MOS34 0483 DACA CRNX1 MOS34 0486 DACD ^2C MOS34 0484 DACA E8 INX MOS34 0486 DACD ^2C MOS34 0485 DACB E0 10 CPXIM NROM MOS34 0486 DACD ^2C MOS34 0486 DACD 90 AC BCC CRX ;[X a valid ROM number] -- MOS34 0487 DACF -- MOS34 0488 DACF [ NOSP = &00 -- MOS34 0490 DACF | -- MOS34 0491 DACF ; X=NROM -- MOS34 0492 DACF ; -- MOS34 0493 DACF ; if speech chip ready is still high then the chip has not been fitted -- MOS34 0494 DACF ; -- MOS34 0495 DACF 2C 40 FE BIT PBQ -- MOS34 0496 DAD2 30 11 BMI START1 ;[chip does not exist] MOS34 0496 DAD2 v6E MOS34 0497 DAD4 ; X=NROM MOS34 0496 DAD2 v6E MOS34 0498 DAD4 ; speech chip present MOS34 0496 DAD2 v6E MOS34 0499 DAD4 ; MOS34 0496 DAD2 v6E MOS34 0500 DAD4 CE 7B 02 DEC SPFLAG ;SPFLAG := $FF MOS34 0496 DAD2 v6E MOS34 0501 DAD7 ; X=NROM MOS34 0496 DAD2 v6E MOS34 0502 DAD7 ; reset speech processor MOS34 0496 DAD2 v6E MOS34 0503 DAD7 ; MOS34 0496 DAD2 v6E MOS34 0504 DAD7 ; write NROM * $FF (reset) to speech processor MOS34 0496 DAD2 v6E MOS34 0505 DAD7 SPRST1 MOS34 0496 DAD2 v6E MOS34 0506 DAD7 A0 FF LDYIM SPOPRT MOS34 0496 DAD2 v6E MOS34 0507 DAD9 20 BF EE JSR WSPECH ;N.B. corrupts A and Y MOS34 0496 DAD2 v6E MOS34 0508 DADC CA DEX MOS34 0496 DAD2 v6E MOS34 0509 DADD D0 F8 BNE SPRST1 MOS34 0496 DAD2 v6E MOS34 0510 DADF ; X=0 MOS34 0496 DAD2 v6E MOS34 0511 DADF ; MOS34 0496 DAD2 v6E MOS34 0512 DADF 8E 48 FE STX TRCLQ MOS34 0496 DAD2 v6E MOS34 0513 DAE2 8E 49 FE STX TRCHQ ;enable interrupt after one negative pulse on PB6 (speech int) MOS34 0496 DAD2 v6E MOS34 0514 DAE5 ] MOS34 0496 DAD2 v6E MOS34 0515 DAE5 MOS34 0496 DAD2 v6E MOS34 0516 DAE5 START1 MOS34 0496 DAD2 v6E MOS34 0517 DAE5 MOS34 0496 DAD2 v6E MOS34 0518 DAE5 MOS34 0496 DAD2 v6E MOS34 0519 DAE5 AD 8F 02 LDA OPTION ;initialise graphics mode from start-up options -- MOS34 0520 DAE8 20 00 C3 JSR VDINIT ;initialise VDU module -- MOS34 0521 DAEB -- MOS34 0522 DAEB -- MOS34 0523 DAEB ; set up reset soft key (fA) -- MOS34 0524 DAEB ; -- MOS34 0525 DAEB A0 CA LDYIM BREKEY -- MOS34 0526 DAED 20 A5 E1 JSR RDCHS ;set to expand softkeyA immediately -- MOS34 0527 DAF0 ; C=0 cos buffer empty -- MOS34 0528 DAF0 ; -- MOS34 0529 DAF0 ; let user intercept BREAK -- MOS34 0530 DAF0 ; -- MOS34 0531 DAF0 ; C=0 -- MOS34 0532 DAF0 20 58 EB JSR BREAK -- MOS34 0533 DAF3 ; -- MOS34 0534 DAF3 ; initialise CFS state -- MOS34 0535 DAF3 ; -- MOS34 0536 DAF3 20 44 F1 JSR INIT -- MOS34 0537 DAF6 ; -- MOS34 0538 DAF6 ; check for tube -- MOS34 0539 DAF6 ; -- MOS34 0540 DAF6 A9 81 LDAIM &81 -- MOS34 0541 DAF8 8D E0 FE STA TREG0 -- MOS34 0542 DAFB AD E0 FE LDA TREG0 -- MOS34 0543 DAFE 6A RORA -- MOS34 0544 DAFF 90 0A BCC NOTUBE ;[tube not present] MOS34 0544 DAFF v75 MOS34 0545 DB01 ; MOS34 0544 DAFF v75 MOS34 0546 DB01 ; tube present MOS34 0544 DAFF v75 MOS34 0547 DB01 ; MOS34 0544 DAFF v75 MOS34 0548 DB01 A2 FF LDXIM SVTUBE MOS34 0544 DAFF v75 MOS34 0549 DB03 20 75 F1 JSR SVOP ;initialise tube MOS34 0544 DAFF v75 MOS34 0550 DB06 D0 03 BNE NOTUBE ;[tube software not present] MOS34 0544 DAFF v75 MOS34 0551 DB08 CE 7A 02 DEC TUBEM ;TUBEM := $FF MOS34 0544 DAFF v75 MOS34 0552 DB0B NOTUBE MOS34 0544 DAFF v75 MOS34 0553 DB0B ; MOS34 0544 DAFF v75 MOS34 0554 DB0B ; initialise service ROMs before writing to screen MOS34 0544 DAFF v75 MOS34 0555 DB0B ; MOS34 0544 DAFF v75 MOS34 0556 DB0B A0 0E LDYIM /(OSHWM ) ;Y := default high water mark -- MOS34 0557 DB0D ; -- MOS34 0558 DB0D A2 01 LDXIM SVSTAT ;offer static area -- MOS34 0559 DB0F 20 75 F1 JSR SVOP -- MOS34 0560 DB12 ; -- MOS34 0561 DB12 A2 02 LDXIM SVDYN ;offer dynamic area -- MOS34 0562 DB14 20 75 F1 JSR SVOP -- MOS34 0563 DB17 ; -- MOS34 0564 DB17 8C 43 02 STY IHWM ;save adjusted high water mark -- MOS34 0565 DB1A 8C 44 02 STY HWM ;save adjusted high water mark -- MOS34 0566 DB1D ; -- MOS34 0567 DB1D ; allow tube post-initialisation (e.g. exploding font) -- MOS34 0568 DB1D ; -- MOS34 0569 DB1D A2 FE LDXIM SVTPIN ;******** ASSUMED = $FE ******** -- MOS34 0570 DB1F AC 7A 02 LDY TUBEM ;pass tube flag as argument -- MOS34 0571 DB22 20 75 F1 JSR SVOP -- MOS34 0572 DB25 ; A=$00 (tube present) -- MOS34 0573 DB25 ; A=$FF (tube not present) -- MOS34 0574 DB25 ; -- MOS34 0575 DB25 ; conditionally output start-up message -- MOS34 0576 DB25 ; 'BBC Computer' MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 62 MOS34 Entry point after hardware break/reset MOS34 -- MOS34 0577 DB25 ; -- MOS34 0578 DB25 2D 67 02 AND QUIET ;may be set by paged ROM -- MOS34 0579 DB28 10 1B BPL ENTER ;[shshh ... you know who] MOS34 0579 DB28 v64 MOS34 0580 DB2A ; MOS34 0579 DB28 v64 MOS34 0581 DB2A ; output start up message MOS34 0579 DB28 v64 MOS34 0582 DB2A ; MOS34 0579 DB28 v64 MOS34 0583 DB2A A0 02 LDYIM MSGBBC-&01 MOS34 0579 DB28 v64 MOS34 0584 DB2C 20 61 DE JSR WRSTR MOS34 0579 DB28 v64 MOS34 0585 DB2F ; MOS34 0579 DB28 v64 MOS34 0586 DB2F ; indicate model type MOS34 0579 DB28 v64 MOS34 0587 DB2F ; MOS34 0579 DB28 v64 MOS34 0588 DB2F AD 8D 02 LDA TYPE MOS34 0579 DB28 v64 MOS34 0589 DB32 F0 0C BEQ Z ;[soft restart] MOS34 0579 DB28 v64 MOS34 0590 DB34 ; MOS34 0579 DB28 v64 MOS34 0591 DB34 ; hard restart MOS34 0579 DB28 v64 MOS34 0592 DB34 ; complete message MOS34 0579 DB28 v64 MOS34 0593 DB34 ; MOS34 0579 DB28 v64 MOS34 0594 DB34 A0 16 LDYIM MSG32K-&01 MOS34 0579 DB28 v64 MOS34 0595 DB36 2C 8E 02 BIT MODELB MOS34 0579 DB28 v64 MOS34 0596 DB39 30 02 BMI B ;[model B] MOS34 0579 DB28 v64 MOS34 0597 DB3B ; MOS34 0579 DB28 v64 MOS34 0598 DB3B ; model A MOS34 0579 DB28 v64 MOS34 0599 DB3B ; MOS34 0579 DB28 v64 MOS34 0600 DB3B A0 11 LDYIM MSG16K-&01 MOS34 0579 DB28 v64 MOS34 0601 DB3D B MOS34 0579 DB28 v64 MOS34 0602 DB3D 20 61 DE JSR WRSTR MOS34 0579 DB28 v64 MOS34 0603 DB40 Z MOS34 0579 DB28 v64 MOS34 0604 DB40 A0 1B LDYIM MSG2CR-&01 MOS34 0579 DB28 v64 MOS34 0605 DB42 20 61 DE JSR WRSTR MOS34 0579 DB28 v64 MOS34 0606 DB45 ; MOS34 0579 DB28 v64 MOS34 0607 DB45 ENTER ;initialise TAPE/DISC MOS34 0579 DB28 v64 MOS34 0608 DB45 ; MOS34 0579 DB28 v64 MOS34 0609 DB45 ; let user intercept BREAK after filing system initialisation MOS34 0579 DB28 v64 MOS34 0610 DB45 ; MOS34 0579 DB28 v64 MOS34 0611 DB45 38 SEC -- MOS34 0612 DB46 20 58 EB JSR BREAK -- MOS34 0613 DB49 ; -- MOS34 0614 DB49 ; service ROMs again -- MOS34 0615 DB49 ; test for auto-boot condition (SHIFT and startup option bit3) -- MOS34 0616 DB49 ; -- MOS34 0617 DB49 20 18 EA JSR MOSTST ;test shift -- MOS34 0618 DB4C [ MOS125 = &FF -- MOS34 0621 DB4C | -- MOS34 0622 DB4C ;Slightly iffy using A directly as no other callers of MOSTST do -- MOS34 0623 DB4C ;however MOSTST always returns SHIFT state in both N and A b7 -- MOS34 0624 DB4C ] -- MOS34 0625 DB4C 4A LSRA -- MOS34 0626 DB4D 4A LSRA -- MOS34 0627 DB4E 4A LSRA -- MOS34 0628 DB4F 4A LSRA -- MOS34 0629 DB50 4D 8F 02 EOR OPTION -- MOS34 0630 DB53 29 08 ANDIM &08 ;use bit3 -- MOS34 0631 DB55 A8 TAY ;Y=0 => auto-boot, Y<>0 => do not auto-boot -- MOS34 0632 DB56 A2 03 LDXIM SVBOOT ;offer bootstrap -- MOS34 0633 DB58 20 75 F1 JSR SVOP -- MOS34 0634 DB5B F0 30 BEQ SLANG ;[file system booted] MOS34 0634 DB5B v4F MOS34 0635 DB5D ; MOS34 0634 DB5B v4F MOS34 0636 DB5D ; file system not booted - try to auto-boot from SEROM MOS34 0634 DB5B v4F MOS34 0637 DB5D ; MOS34 0634 DB5B v4F MOS34 0638 DB5D 98 TYA MOS34 0634 DB5B v4F MOS34 0639 DB5E D0 27 BNE NOAUTO ;[do not auto boot] MOS34 0634 DB5B v4F MOS34 0640 DB60 ; MOS34 0634 DB5B v4F MOS34 0641 DB60 ; auto-boot from SEROM MOS34 0634 DB5B v4F MOS34 0642 DB60 ; MOS34 0634 DB5B v4F MOS34 0643 DB60 A9 8D LDAIM FXSROM MOS34 0634 DB5B v4F MOS34 0644 DB62 20 50 F1 JSR CROM ;'*ROM' MOS34 0634 DB5B v4F MOS34 0645 DB65 A2 51 LDXIM SLBOOT MOS34 0634 DB5B v4F MOS34 0646 DB67 A0 EB LDYIM /(SLBOOT ) MOS34 0634 DB5B v4F MOS34 0647 DB69 CE 67 02 DEC QUIET ;flag as loading auto-boot program MOS34 0634 DB5B v4F MOS34 0648 DB6C 20 F7 FF JSR OSCLI ;'/!BOOT' MOS34 0634 DB5B v4F MOS34 0649 DB6F EE 67 02 INC QUIET ;flag as not loading auto-boot program MOS34 0634 DB5B v4F MOS34 0650 DB72 ; if an error occurs whilst running the !BOOT program MOS34 0634 DB5B v4F MOS34 0651 DB72 ; then the MOS jumps to EBRK (early BRK) MOS34 0634 DB5B v4F MOS34 0652 DB72 D0 19 BNE DNRFS ;[ALWAYS jump, do not reset filing system] MOS34 0634 DB5B v4F MOS34 0653 DB74 ; MOS34 0634 DB5B v4F MOS34 0654 DB74 [ MOS125 = &FF MOS34 0634 DB5B v4F MOS34 0655 DB74 | MOS34 0634 DB5B v4F MOS34 0656 DB74 ;Restoring OS 1.20 behaviour: MOS34 0634 DB5B v4F MOS34 0657 DB74 ;*FX215,0 by early birds (or *FX215,255 by RFS !BOOT) MOS34 0634 DB5B v4F MOS34 0658 DB74 ;forces *TAPE12 on successful completion of RFS !BOOT MOS34 0634 DB5B v4F MOS34 0659 DB74 ;with no error message printed MOS34 0634 DB5B v4F MOS34 0660 DB74 F0 11 BEQ NOAUTO MOS34 0634 DB5B v4F MOS34 0661 DB76 ;NEVER fall through MOS34 0634 DB5B v4F MOS34 0662 DB76 MOS34 0634 DB5B v4F MOS34 0663 DB76 DEFBRK ;default BRK routine outputs error message MOS34 0634 DB5B v4F MOS34 0664 DB76 ; assume still decimal mode MOS34 0634 DB5B v4F MOS34 0665 DB76 A0 00 LDYIM ZERO MOS34 0634 DB5B v4F MOS34 0666 DB78 20 69 DE JSR WRSTR1 ;output error message MOS34 0634 DB5B v4F MOS34 0667 DB7B ; check whether within auto-boot program MOS34 0634 DB5B v4F MOS34 0668 DB7B AD 67 02 LDA QUIET MOS34 0634 DB5B v4F MOS34 0669 DB7E 6A RORA MOS34 0634 DB5B v4F MOS34 0670 DB7F STOP MOS34 0634 DB5B v4F MOS34 0671 DB7F B0 FE BCS STOP ;hang if not within auto-boot program MOS34 0634 DB5B v4F MOS34 0672 DB81 20 E7 FF JSR OSNEWL MOS34 0634 DB5B v4F MOS34 0673 DB84 20 E7 FF JSR OSNEWL ;place 2*CR/LF after error message MOS34 0634 DB5B v4F MOS34 0674 DB87 ;fall through MOS34 0634 DB5B v4F MOS34 0675 DB87 ] MOS34 0634 DB5B v4F MOS34 0676 DB87 MOS34 0634 DB5B v4F MOS34 0677 DB87 NOAUTO MOS34 0634 DB5B v4F MOS34 0678 DB87 EBRK ;unexpected (early) BRK (e.g. 'File not found') MOS34 0634 DB5B v4F MOS34 0679 DB87 ; MOS34 0634 DB5B v4F MOS34 0680 DB87 ; initialise cassette filing system (CFS) MOS34 0634 DB5B v4F MOS34 0681 DB87 ; MOS34 0634 DB5B v4F MOS34 0682 DB87 A9 00 LDAIM ZERO ;select CFS MOS34 0634 DB5B v4F MOS34 0683 DB89 AA TAX ;X:=0, select default baudrate (1200 baud) MOS34 0634 DB5B v4F MOS34 0684 DB8A 20 52 F1 JSR TAPE12 ;initialise CFS MOS34 0634 DB5B v4F MOS34 0685 DB8D ; MOS34 0634 DB5B v4F MOS34 0686 DB8D DNRFS ;do not reset filing system MOS34 0634 DB5B v4F MOS34 0687 DB8D ; MOS34 0634 DB5B v4F MOS34 0688 DB8D SLANG ;select a language ROM to enter MOS34 0634 DB5B v4F MOS34 0689 DB8D AD 8D 02 LDA TYPE -- MOS34 0690 DB90 D0 05 BNE SLANG1 ;[hard restart - use same language as last time] MOS34 0690 DB90 v7A MOS34 0691 DB92 ; MOS34 0690 DB90 v7A MOS34 0692 DB92 ; soft restart - ensure language exists MOS34 0690 DB90 v7A MOS34 0693 DB92 ; A b0=0 used by ILR2 enter ROM with C=0 MOS34 0690 DB90 v7A MOS34 0694 DB92 ; MOS34 0690 DB90 v7A MOS34 0695 DB92 AE 8C 02 LDX LROMID MOS34 0690 DB90 v7A MOS34 0696 DB95 10 1E BPL ILR2 ;[language does exist] MOS34 0696 DB95 v61 MOS34 0697 DB97 ; MOS34 0696 DB95 v61 MOS34 0698 DB97 SLANG1 ;find first language ROM MOS34 0696 DB95 v61 MOS34 0699 DB97 ; MOS34 MOS34 MOS34 MOS34 Acorn macro assembler Page 63 MOS34 Entry point after hardware break/reset MOS34 MOS34 0696 DB95 v61 MOS34 0700 DB97 A2 0F LDXIM NROM-&1 MOS34 0696 DB95 v61 MOS34 0701 DB99 ILR1 MOS34 0696 DB95 v61 MOS34 0702 DB99 BD A1 02 LDAAX ROMS MOS34 0696 DB95 v61 MOS34 0703 DB9C [ MOS125 = &FF MOS34 0696 DB95 v61 MOS34 0705 DB9C | MOS34 0696 DB95 v61 MOS34 0706 DB9C 0A ASLA ;b0=0 used by ILR2 enter ROM with C=0 MOS34 0696 DB95 v61 MOS34 0707 DB9D ] MOS34 0696 DB95 v61 MOS34 0708 DB9D 30 16 BMI ILR2 ;[found language ROM] MOS34 0696 DB95 v61 MOS34 0709 DB9F ; MOS34 0696 DB95 v61 MOS34 0710 DB9F CA DEX MOS34 0696 DB95 v61 MOS34 0711 DBA0 10 F7 BPL ILR1 ;[continue search for language ROM] MOS34 0696 DB95 v61 MOS34 0712 DBA2 ; MOS34 0696 DB95 v61 MOS34 0713 DBA2 A9 00 LDAIM LGNONE MOS34 0696 DB95 v61 MOS34 0714 DBA4 2C 7A 02 BIT TUBEM MOS34 0696 DB95 v61 MOS34 0715 DBA7 30 30 BMI TLANG ;[tube active] MOS34 0715 DBA7 v4F MOS34 0716 DBA9 ; neither language nor tube present MOS34 0715 DBA7 v4F MOS34 0717 DBA9 00 BRK MOS34 0715 DBA7 v4F MOS34 0718 DBAA F9 = NOLROM MOS34 0715 DBA7 v4F MOS34 0719 DBAB 4C 61 6E = "Language?" MOS34 0715 DBA7 v4F MOS34 0720 DBB4 00 = ZERO MOS34 0715 DBA7 v4F MOS34 0721 DBB5 ; MOS34 0715 DBA7 v4F MOS34 0722 DBB5 [ MOS125 = &FF MOS34 0715 DBA7 v4F MOS34 0725 DBB5 | MOS34 0715 DBA7 v4F MOS34 0726 DBB5 ILR2 ;*BASIC enters with A b0=1 indicate manual entry MOS34 0715 DBA7 v4F MOS34 0727 DBB5 4A LSRA ;C=0 indicate to tube that this is a restart MOS34 0715 DBA7 v4F MOS34 0728 DBB6 ] MOS34 0715 DBA7 v4F MOS34 0729 DBB6 SELANG ;FX entry point, entered with C=1 (for tube) MOS34 0715 DBA7 v4F MOS34 0730 DBB6 ; found language ROM MOS34 0715 DBA7 v4F MOS34 0731 DBB6 ; select language ROM MOS34 0715 DBA7 v4F MOS34 0732 DBB6 08 PHP ;save entry type (present in C) MOS34 0715 DBA7 v4F MOS34 0733 DBB7 [ MOS125 = &FF MOS34 0715 DBA7 v4F MOS34 0735 DBB7 ] MOS34 0715 DBA7 v4F MOS34 0736 DBB7 20 E7 DB JSR STXROM MOS34 0715 DBA7 v4F MOS34 0737 DBBA ; output ROM message MOS34 0715 DBA7 v4F MOS34 0738 DBBA A9 80 LDAIM /(LANG ) MOS34 0715 DBA7 v4F MOS34 0739 DBBC A0 08 LDYIM ROMMSG-&1 MOS34 0715 DBA7 v4F MOS34 0740 DBBE 20 63 DE JSR WRSTRA MOS34 0715 DBA7 v4F MOS34 0741 DBC1 ; N.B. Y offset left pointing to copyright message MOS34 0715 DBA7 v4F MOS34 0742 DBC1 84 FD STY REPTR +&00 MOS34 0715 DBA7 v4F MOS34 0743 DBC3 20 E7 FF JSR OSNEWL MOS34 0715 DBA7 v4F MOS34 0744 DBC6 20 E7 FF JSR OSNEWL MOS34 0715 DBA7 v4F MOS34 0745 DBC9 ; MOS34 0715 DBA7 v4F MOS34 0746 DBC9 ; enter language MOS34 0715 DBA7 v4F MOS34 0747 DBC9 ; MOS34 0715 DBA7 v4F MOS34 0748 DBC9 28 PLP ;restore entry type into C MOS34 0715 DBA7 v4F MOS34 0749 DBCA [ MOS125 = &FF MOS34 0715 DBA7 v4F MOS34 0750 DBCA | MOS34 0715 DBA7 v4F MOS34 0751 DBCA ;preserve BRK handler until all printing done MOS34 0715 DBA7 v4F MOS34 0752 DBCA A5 F4 LDA ROMID MOS34 0715 DBA7 v4F MOS34 0753 DBCC 8D 8C 02 STA LROMID MOS34 0715 DBA7 v4F MOS34 0754 DBCF ] MOS34 0715 DBA7 v4F MOS34 0755 DBCF A9 01 LDAIM LGENTR ;entry reason MOS34 0715 DBA7 v4F MOS34 0756 DBD1 2C 7A 02 BIT TUBEM MOS34 0715 DBA7 v4F MOS34 0757 DBD4 30 03 BMI TLANG ;[tube active] MOS34 0715 DBA7 v4F MOS34 0758 DBD6 4C 00 80 JMP ROMHRD ;ROM entry MOS34 0715 DBA7 v4F MOS34 0759 DBD9 TLANG MOS34 0715 DBA7 v4F MOS34 0760 DBD9 4C 00 04 JMP TBLANG ;tube entry -- MOS34 0761 DBDC -- MOS34 0762 DBDC -- MOS34 0763 DBDC LNK MOS36 -- MOS36 0001 DBDC ; > MOS36 -- MOS36 0002 DBDC TTL MOS36 Int servicing -- MOS36 0003 DBDC OPT MOS36 MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 64 MOS36 MOS36 Int servicing MOS36 -- MOS36 0004 DBDC -- MOS36 0005 DBDC ;(c) 1981 ACORN Computers Limited -- MOS36 0006 DBDC ;BBC MOS -- MOS36 0007 DBDC ;Change record: -- MOS36 0008 DBDC -- MOS36 0009 DBDC ;Author(s): -- MOS36 0010 DBDC ;PB Paul Bond -- MOS36 0011 DBDC -- MOS36 0012 DBDC ; interrupt service mainline -- MOS36 0013 DBDC ; priority sequence:- -- MOS36 0014 DBDC ; [6850] -- MOS36 0015 DBDC ; 1. RS423 -- MOS36 0016 DBDC ; [6522a] -- MOS36 0017 DBDC ; 2. VSYNC -- MOS36 0018 DBDC ; 3. centisecond timer -- MOS36 0019 DBDC ; 4. ADC -- MOS36 0020 DBDC ; 5. keyboard -- MOS36 0021 DBDC ; [6522b] -- MOS36 0022 DBDC ; 6. printer (parallel interface) -- MOS36 0023 DBDC -- MOS36 0024 DBDC -- MOS36 0025 DBDC RPROM ;read byte from paged ROM -- MOS36 0026 DBDC ; read byte at ROMPTR in ROM Y into A -- MOS36 0027 DBDC A6 F4 LDX ROMID -- MOS36 0028 DBDE 84 F4 STY ROMID -- MOS36 0029 DBE0 8C 30 FE STY ROM -- MOS36 0030 DBE3 A0 00 LDYIM ZERO -- MOS36 0031 DBE5 B1 F6 LDAIY ROMPTR -- MOS36 0032 DBE7 STXROM -- MOS36 0033 DBE7 86 F4 STX ROMID -- MOS36 0034 DBE9 8E 30 FE STX ROM -- MOS36 0035 DBEC 60 RTS -- MOS36 0036 DBED -- MOS36 0037 DBED -- MOS36 0038 DBED -- MOS36 0039 DBED IRQ ;entered at IRQ or BRK -- MOS36 0040 DBED 85 FC STA TEMPA -- MOS36 0041 DBEF 68 PLA -- MOS36 0042 DBF0 48 PHA ;A := processor status -- MOS36 0043 DBF1 29 10 ANDIM &10 -- MOS36 0044 DBF3 D0 03 BNE BRK MOS36 0044 DBF3 v7C MOS36 0045 DBF5 6C 04 02 JMI IRQALL ;indirect thru 'all IRQs' routine MOS36 0044 DBF3 v7C MOS36 0046 DBF8 ; (defaults to DEFIRQ) MOS36 0044 DBF3 v7C MOS36 0047 DBF8 ; MOS36 0044 DBF3 v7C MOS36 0048 DBF8 BRK MOS36 0044 DBF3 v7C MOS36 0049 DBF8 8A TXA -- MOS36 0050 DBF9 48 PHA ;save X -- MOS36 0051 DBFA BA TSX -- MOS36 0052 DBFB BD 03 01 LDAAX &0100+&03 ;get address low -- MOS36 0053 DBFE D8 CLD -- MOS36 0054 DBFF 38 SEC -- MOS36 0055 DC00 E9 01 SBCIM &01 -- MOS36 0056 DC02 85 FD STA REPTR +&00 -- MOS36 0057 DC04 BD 04 01 LDAAX &0100+&04 ;get address high -- MOS36 0058 DC07 E9 00 SBCIM ZERO -- MOS36 0059 DC09 85 FE STA REPTR +&01 -- MOS36 0060 DC0B ; record ROM source of BRK -- MOS36 0061 DC0B A5 F4 LDA ROMID -- MOS36 0062 DC0D 8D 4A 02 STA REPROM -- MOS36 0063 DC10 ; offer BRK to service ROMs -- MOS36 0064 DC10 86 F0 STX BYTEX ;provide clean way for service ROM to access relevant stack area -- MOS36 0065 DC12 A2 06 LDXIM SVBRK -- MOS36 0066 DC14 20 75 F1 JSR SVOP -- MOS36 0067 DC17 ; force language ROM (may be BASIC in pre-interface days) -- MOS36 0068 DC17 AE 8C 02 LDX LROMID -- MOS36 0069 DC1A 20 E7 DB JSR STXROM ;reset to language ROM -- MOS36 0070 DC1D ; -- MOS36 0071 DC1D ; restore X -- MOS36 0072 DC1D ; -- MOS36 0073 DC1D 68 PLA -- MOS36 0074 DC1E AA TAX -- MOS36 0075 DC1F ; -- MOS36 0076 DC1F ; restore A -- MOS36 0077 DC1F ; -- MOS36 0078 DC1F A5 FC LDA TEMPA -- MOS36 0079 DC21 ; -- MOS36 0080 DC21 ; enable interrupts and let user process BRK -- MOS36 0081 DC21 ; -- MOS36 0082 DC21 58 CLI -- MOS36 0083 DC22 6C 02 02 JMI BRKVEC ;process BRK, N.B. default is DEFBRK -- MOS36 0084 DC25 ; -- MOS36 0085 DC25 [ MOS125 = &FF -- MOS36 0098 DC25 ] -- MOS36 0099 DC25 -- MOS36 0100 DC25 -- MOS36 0101 DC25 TTL IRQ processing -- MOS36 0102 DC25 OPT OPNEWP MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 65 MOS36 IRQ processing MOS36 -- MOS36 0103 DC25 -- MOS36 0104 DC25 -- MOS36 0105 DC25 TXDINT ;disable Tx interrupt -- MOS36 0106 DC25 ; -- MOS36 0107 DC25 ; RS423 printer selected but printer buffer empty -- MOS36 0108 DC25 ; -- MOS36 0109 DC25 38 SEC MOS36 0267 DC83 ^20 MOS36 0110 DC26 6E 4F 02 ROR RSFLAG ;flag RS423 available MOS36 0267 DC83 ^20 MOS36 0111 DC29 ; MOS36 0267 DC83 ^20 MOS36 0112 DC29 ; no more characters to print MOS36 0267 DC83 ^20 MOS36 0113 DC29 ; MOS36 0267 DC83 ^20 MOS36 0114 DC29 ; disable RS423 Tx MOS36 0267 DC83 ^20 MOS36 0115 DC29 ; find whether to set RTS hi or lo MOS36 0267 DC83 ^20 MOS36 0116 DC29 ; MOS36 0267 DC83 ^20 MOS36 0117 DC29 ; check whether RS423 Rx enabled MOS36 0267 DC83 ^20 MOS36 0118 DC29 ; MOS36 0267 DC83 ^20 MOS36 0119 DC29 2C 50 02 BIT RSCTFL MOS36 0267 DC83 ^20 MOS36 0120 DC2C 10 07 BPL RLO ;[Rx disabled] MOS36 0267 DC83 ^20 MOS36 0121 DC2E ; MOS36 0267 DC83 ^20 MOS36 0122 DC2E ; Rx enabled MOS36 0267 DC83 ^20 MOS36 0123 DC2E ; MOS36 0267 DC83 ^20 MOS36 0124 DC2E ; check bytes in RS423 input buffer MOS36 0267 DC83 ^20 MOS36 0125 DC2E ; MOS36 0267 DC83 ^20 MOS36 0126 DC2E 20 80 E3 JSR CNTRS MOS36 0267 DC83 ^20 MOS36 0127 DC31 ; MOS36 0267 DC83 ^20 MOS36 0128 DC31 ; C=0 => overflow, C=1 => no overflow MOS36 0267 DC83 ^20 MOS36 0129 DC31 ; check whether within overflow region MOS36 0267 DC83 ^20 MOS36 0130 DC31 ; MOS36 0267 DC83 ^20 MOS36 0131 DC31 A2 00 LDXIM RHITXD MOS36 0267 DC83 ^20 MOS36 0132 DC33 B0 02 BCS RSOK ;[not overflowing] MOS36 0267 DC83 ^20 MOS36 0133 DC35 ; MOS36 0267 DC83 ^20 MOS36 0134 DC35 ; within overflow region MOS36 0267 DC83 ^20 MOS36 0135 DC35 ; MOS36 0267 DC83 ^20 MOS36 0136 DC35 RLO ;set RTS lo, Tx interrupt disabled (unfortunately) MOS36 0267 DC83 ^20 MOS36 0137 DC35 A2 40 LDXIM RLOTXD MOS36 0267 DC83 ^20 MOS36 0138 DC37 ; MOS36 0267 DC83 ^20 MOS36 0139 DC37 RSOK ;set RTS hi/lo, Tx interrupt disabled MOS36 0267 DC83 ^20 MOS36 0140 DC37 4C D7 E2 JMP RSED ;disable Tx interrupts AND return from interrupt MOS36 0267 DC83 ^20 MOS36 0141 DC3A MOS36 0267 DC83 ^20 MOS36 0142 DC3A MOS36 0267 DC83 ^20 MOS36 0143 DC3A RX68 ;RS423 Rx interrupt MOS36 0267 DC83 ^20 MOS36 0144 DC3A ; MOS36 0267 DC83 ^20 MOS36 0145 DC3A ; A = 0|0|PE|OVRN|FE|CTS|DCD|TDRE MOS36 0267 DC83 ^20 MOS36 0146 DC3A ; MOS36 0267 DC83 ^20 MOS36 0147 DC3A AC 09 FE LDY RSDATA ;read data byte to clear interrupt MOS36 0267 DC83 ^20 MOS36 0148 DC3D 29 3A ANDIM &3A ;CTS & TDRE are not relevant to Rx MOS36 0267 DC83 ^20 MOS36 0149 DC3F D0 26 BNE RX68BD ;[bad Rx, PE|OVRN|FE|DCD] MOS36 0267 DC83 ^20 MOS36 0150 DC41 ; MOS36 0267 DC83 ^20 MOS36 0151 DC41 ; good reception - move byte into RS423 input buffer MOS36 0267 DC83 ^20 MOS36 0152 DC41 ; MOS36 0267 DC83 ^20 MOS36 0153 DC41 AE 5C 02 LDX RSSHUT MOS36 0267 DC83 ^20 MOS36 0154 DC44 D0 09 BNE NRSI ;[suppress RS423 input] MOS36 0267 DC83 ^20 MOS36 0155 DC46 ; MOS36 0267 DC83 ^20 MOS36 0156 DC46 ; X=0 MOS36 0267 DC83 ^20 MOS36 0157 DC46 ; MOS36 0267 DC83 ^20 MOS36 0158 DC46 E8 INX ;X = BRSI = $01 MOS36 0267 DC83 ^20 MOS36 0159 DC47 20 A7 E1 JSR RNSRT ;insert character into RS423 buffer MOS36 0267 DC83 ^20 MOS36 0160 DC4A ; MOS36 0267 DC83 ^20 MOS36 0161 DC4A ; check number of characters in buffer MOS36 0267 DC83 ^20 MOS36 0162 DC4A ; MOS36 0267 DC83 ^20 MOS36 0163 DC4A 20 80 E3 JSR CNTRS MOS36 0267 DC83 ^20 MOS36 0164 DC4D ; MOS36 0267 DC83 ^20 MOS36 0165 DC4D ; check whether running into overflow area MOS36 0267 DC83 ^20 MOS36 0166 DC4D ; MOS36 0267 DC83 ^20 MOS36 0167 DC4D 90 E6 BCC RLO ;[running into overflow area, set RTS lo, Tx interrupt disabled] MOS36 0267 DC83 ^20 MOS36 0168 DC4F NRSI ;suppress RS423 input MOS36 0267 DC83 ^20 MOS36 0169 DC4F 60 RTS MOS36 0267 DC83 ^20 MOS36 0170 DC50 MOS36 0267 DC83 ^20 MOS36 0171 DC50 MOS36 0267 DC83 ^20 MOS36 0172 DC50 [ MOS125 = &FF MOS36 0267 DC83 ^20 MOS36 0188 DC50 | MOS36 0267 DC83 ^20 MOS36 0189 DC50 VAT MOS36 0267 DC83 ^20 MOS36 0190 DC50 ] MOS36 0267 DC83 ^20 MOS36 0191 DC50 ; MOS36 0267 DC83 ^20 MOS36 0192 DC50 ; indicate in DEFIRQ MOS36 0267 DC83 ^20 MOS36 0193 DC50 ; MOS36 0267 DC83 ^20 MOS36 0194 DC50 B8 CLV MOS36 0267 DC83 ^20 MOS36 0195 DC51 ; MOS36 0267 DC83 ^20 MOS36 0196 DC51 IRQ68 ;check for interrupt from 6850 MOS36 0267 DC83 ^20 MOS36 0197 DC51 ; MOS36 0267 DC83 ^20 MOS36 0198 DC51 [ $Tutu MOS36 0267 DC83 ^20 MOS36 0201 DC51 | MOS36 0267 DC83 ^20 MOS36 0202 DC51 AD 08 FE LDA RSTAT MOS36 0267 DC83 ^20 MOS36 0203 DC54 ] MOS36 0267 DC83 ^20 MOS36 0204 DC54 70 02 BVS RSTIME ;[timer interrupt] MOS36 0267 DC83 ^20 MOS36 0205 DC56 ; MOS36 0267 DC83 ^20 MOS36 0206 DC56 10 5D BPL IRQA ;[not a 6850 interrupt, N.B. possibly timer interrupt entry] MOS36 0267 DC83 ^20 MOS36 0207 DC58 ; MOS36 0267 DC83 ^20 MOS36 0208 DC58 RSTIME ;timer interrupt MOS36 0267 DC83 ^20 MOS36 0209 DC58 ; MOS36 0267 DC83 ^20 MOS36 0210 DC58 ; 6850 interrupt MOS36 0267 DC83 ^20 MOS36 0211 DC58 ; MOS36 0267 DC83 ^20 MOS36 0212 DC58 ; use RSTUT to decide where to route the interrupt MOS36 0267 DC83 ^20 MOS36 0213 DC58 ; MOS36 0267 DC83 ^20 MOS36 0214 DC58 A6 EA LDX RSTUT MOS36 0267 DC83 ^20 MOS36 0215 DC5A CA DEX MOS36 0267 DC83 ^20 MOS36 0216 DC5B 30 30 BMI NOTCFS ;[RS423 not managed by CFS] MOS36 0267 DC83 ^20 MOS36 0217 DC5D ; MOS36 0267 DC83 ^20 MOS36 0218 DC5D ; inform CFS of the interrupt MOS36 0267 DC83 ^20 MOS36 0219 DC5D ; MOS36 0267 DC83 ^20 MOS36 0220 DC5D 70 2D BVS RTS68 ;[ignore timer interrupt entry] MOS36 0267 DC83 ^20 MOS36 0221 DC5F 4C DE F5 JMP IRUPT ;let CFS handle interrupt AND return from interrupt MOS36 0267 DC83 ^20 MOS36 0222 DC62 MOS36 0267 DC83 ^20 MOS36 0223 DC62 MOS36 0267 DC83 ^20 MOS36 0224 DC62 MDCD ;neither Rx not Tx interrupt => DCD interrupt MOS36 0267 DC83 ^20 MOS36 0225 DC62 ; MOS36 0267 DC83 ^20 MOS36 0226 DC62 AC 09 FE LDY RSDATA ;clear DCD interrupt MOS36 0267 DC83 ^20 MOS36 0227 DC65 2A ROLA ;DCD -> lo-bit MOS36 0267 DC83 ^20 MOS36 0228 DC66 0A ASLA ;restore status byte MOS36 0267 DC83 ^20 MOS36 0229 DC67 ; MOS36 0267 DC83 ^20 MOS36 0230 DC67 RX68BD ;bad RS423 Rx MOS36 0267 DC83 ^20 MOS36 0231 DC67 ; MOS36 0267 DC83 ^20 MOS36 0232 DC67 ; A = 0|0|PE|OVRN|FE|0|DCD|0 MOS36 0267 DC83 ^20 MOS36 0233 DC67 ; C=1 MOS36 0267 DC83 ^20 MOS36 0234 DC67 ; MOS36 0267 DC83 ^20 MOS36 0235 DC67 ; signal RS423 error MOS36 0267 DC83 ^20 MOS36 0236 DC67 ; MOS36 0267 DC83 ^20 MOS36 0237 DC67 AA TAX ;X := status MOS36 0267 DC83 ^20 MOS36 0238 DC68 98 TYA ;A := character MOS36 0267 DC83 ^20 MOS36 0239 DC69 A0 07 LDYIM EVRS ;RS423 error event MOS36 0267 DC83 ^20 MOS36 0240 DC6B 4C 86 E1 JMP EVENT ;signal event AND return from interrupt MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 66 MOS36 IRQ processing MOS36 MOS36 0267 DC83 ^20 MOS36 0241 DC6E MOS36 0267 DC83 ^20 MOS36 0242 DC6E MOS36 0267 DC83 ^20 MOS36 0243 DC6E TDRE ;Tx interrupt MOS36 0267 DC83 ^20 MOS36 0244 DC6E ; MOS36 0267 DC83 ^20 MOS36 0245 DC6E ; RS423 is not claimed by CFS, so we are either MOS36 0267 DC83 ^20 MOS36 0246 DC6E ; writing or printing to RS423 MOS36 0267 DC83 ^20 MOS36 0247 DC6E ; MOS36 0267 DC83 ^20 MOS36 0248 DC6E ; extract character from RS423 Tx buffer MOS36 0267 DC83 ^20 MOS36 0249 DC6E ; MOS36 0267 DC83 ^20 MOS36 0250 DC6E A2 02 LDXIM BRSO MOS36 0267 DC83 ^20 MOS36 0251 DC70 20 99 E5 JSR REMOV MOS36 0267 DC83 ^20 MOS36 0252 DC73 90 10 BCC TXCH ;[character to transmit] MOS36 0267 DC83 ^20 MOS36 0253 DC75 ; X=BRSO MOS36 0267 DC83 ^20 MOS36 0254 DC75 ; MOS36 0267 DC83 ^20 MOS36 0255 DC75 ; check for print to RS423 MOS36 0267 DC83 ^20 MOS36 0256 DC75 ; MOS36 0267 DC83 ^20 MOS36 0257 DC75 AD 85 02 LDA PRNTSW MOS36 0267 DC83 ^20 MOS36 0258 DC78 C9 02 CMPIM PRS MOS36 0267 DC83 ^20 MOS36 0259 DC7A D0 A9 BNE TXDINT ;[RS423 printer not selected] MOS36 0267 DC83 ^20 MOS36 0260 DC7C ; X=BRSO MOS36 0267 DC83 ^20 MOS36 0261 DC7C ; MOS36 0267 DC83 ^20 MOS36 0262 DC7C ; remove possible character from print buffer MOS36 0267 DC83 ^20 MOS36 0263 DC7C ; MOS36 0267 DC83 ^20 MOS36 0264 DC7C E8 INX ;X = BRSO+1 = BPRNT MOS36 0267 DC83 ^20 MOS36 0265 DC7D 20 99 E5 JSR REMOV ;remove character from printer buffer MOS36 0267 DC83 ^20 MOS36 0266 DC80 6E D2 02 ROR PFLAG ;update printer flag MOS36 0267 DC83 ^20 MOS36 0267 DC83 30 A0 BMI TXDINT ;[no character to print] MOS36 0292 DC98 ^20 MOS36 0268 DC85 ; MOS36 0292 DC98 ^20 MOS36 0269 DC85 TXCH ;transmit character in A MOS36 0292 DC98 ^20 MOS36 0270 DC85 ; MOS36 0292 DC98 ^20 MOS36 0271 DC85 8D 09 FE STA RSDATA ;transmit character MOS36 0292 DC98 ^20 MOS36 0272 DC88 ; MOS36 0292 DC98 ^20 MOS36 0273 DC88 ; set RS423 printer timeout active MOS36 0292 DC98 ^20 MOS36 0274 DC88 ; MOS36 0292 DC98 ^20 MOS36 0275 DC88 A9 E7 LDAIM PTIMUT MOS36 0292 DC98 ^20 MOS36 0276 DC8A 85 EA STA RSTUT MOS36 0292 DC98 ^20 MOS36 0277 DC8C ; MOS36 0292 DC98 ^20 MOS36 0278 DC8C MOS36 0292 DC98 ^20 MOS36 0279 DC8C RTS68 MOS36 0292 DC98 ^20 MOS36 0280 DC8C UNK0 MOS36 0292 DC98 ^20 MOS36 0281 DC8C 60 RTS ;return from interrupt MOS36 0292 DC98 ^20 MOS36 0282 DC8D MOS36 0292 DC98 ^20 MOS36 0283 DC8D MOS36 0292 DC98 ^20 MOS36 0284 DC8D NOTCFS ;RS423 not managed by CFS MOS36 0292 DC98 ^20 MOS36 0285 DC8D ; MOS36 0292 DC98 ^20 MOS36 0286 DC8D 2D 78 02 AND C6850 ;suppress bits according to user tastes MOS36 0292 DC98 ^20 MOS36 0287 DC90 4A LSRA ;C=Rx MOS36 0292 DC98 ^20 MOS36 0288 DC91 90 07 BCC NOTRX ;[not Rx int] MOS36 0292 DC98 ^20 MOS36 0289 DC93 70 05 BVS NOTRX ;[do not allow Rx by polling] MOS36 0292 DC98 ^20 MOS36 0290 DC95 ; MOS36 0292 DC98 ^20 MOS36 0291 DC95 AC 50 02 LDY RSCTFL MOS36 0292 DC98 ^20 MOS36 0292 DC98 30 A0 BMI RX68 ;[recieve interrupts enabled] MOS36 0206 DC56 v22 MOS36 0293 DC9A ; MOS36 0206 DC56 v22 MOS36 0294 DC9A NOTRX MOS36 0206 DC56 v22 MOS36 0295 DC9A 4A LSRA ;C=Tx, N=Rx MOS36 0206 DC56 v22 MOS36 0296 DC9B 6A RORA ;C=DCD, N=Tx MOS36 0206 DC56 v22 MOS36 0297 DC9C B0 C4 BCS MDCD ;[DCD interrupt] MOS36 0206 DC56 v22 MOS36 0298 DC9E ; MOS36 0206 DC56 v22 MOS36 0299 DC9E 30 CE BMI TDRE ;[TDRE] MOS36 0206 DC56 v22 MOS36 0300 DCA0 ; MOS36 0206 DC56 v22 MOS36 0301 DCA0 70 EA BVS RTS68 ;[timer interrupt entry] MOS36 0206 DC56 v22 MOS36 0302 DCA2 ; MOS36 0206 DC56 v22 MOS36 0303 DCA2 ; not timer interrupt entry MOS36 0206 DC56 v22 MOS36 0304 DCA2 ; MOS36 0206 DC56 v22 MOS36 0305 DCA2 UNKIRQ ;unknown interrupt MOS36 0206 DC56 v22 MOS36 0306 DCA2 ; MOS36 0206 DC56 v22 MOS36 0307 DCA2 A2 05 LDXIM SVINT MOS36 0415 DD07 ^19 MOS36 0308 DCA4 20 75 F1 JSR SVOP ;allow FS ROMs to process interrupt MOS36 0415 DD07 ^19 MOS36 0309 DCA7 F0 E3 BEQ UNK0 ;[service ROM dealt with interrupt] MOS36 0415 DD07 ^19 MOS36 0310 DCA9 ; MOS36 0415 DD07 ^19 MOS36 0311 DCA9 ; pull return address MOS36 0415 DD07 ^19 MOS36 0312 DCA9 ; MOS36 0415 DD07 ^19 MOS36 0313 DCA9 68 PLA MOS36 0415 DD07 ^19 MOS36 0314 DCAA 68 PLA MOS36 0415 DD07 ^19 MOS36 0315 DCAB ; MOS36 0415 DD07 ^19 MOS36 0316 DCAB ; restore X and Y for user interrupt routine MOS36 0415 DD07 ^19 MOS36 0317 DCAB ; MOS36 0415 DD07 ^19 MOS36 0318 DCAB 68 PLA MOS36 0415 DD07 ^19 MOS36 0319 DCAC A8 TAY MOS36 0415 DD07 ^19 MOS36 0320 DCAD 68 PLA MOS36 0415 DD07 ^19 MOS36 0321 DCAE AA TAX MOS36 0415 DD07 ^19 MOS36 0322 DCAF 68 PLA MOS36 0415 DD07 ^19 MOS36 0323 DCB0 85 FC STA TEMPA MOS36 0415 DD07 ^19 MOS36 0324 DCB2 6C 06 02 JMI IRQVEC ;assume that user will clear the interrupt MOS36 0415 DD07 ^19 MOS36 0325 DCB5 ; (defaults to IRQTWO) MOS36 0415 DD07 ^19 MOS36 0326 DCB5 MOS36 0415 DD07 ^19 MOS36 0327 DCB5 MOS36 0415 DD07 ^19 MOS36 0328 DCB5 MOS36 0415 DD07 ^19 MOS36 0329 DCB5 IRQA ;check for interrupt from primary 6522 MOS36 0415 DD07 ^19 MOS36 0330 DCB5 ; MOS36 0415 DD07 ^19 MOS36 0331 DCB5 AD 4D FE LDA IFRQ ;A = IFR [IRQ,TIMER1,TIMER2,CB1,CB2,SHIFTREG,CA1,CA2] MOS36 0415 DD07 ^19 MOS36 0332 DCB8 10 3A BPL IRQB ;[not a VIAA interrupt] MOS36 0415 DD07 ^19 MOS36 0333 DCBA ; MOS36 0415 DD07 ^19 MOS36 0334 DCBA ; MOS36 0415 DD07 ^19 MOS36 0335 DCBA 2D 79 02 AND A6522 ;suppress bits according to user tastes MOS36 0415 DD07 ^19 MOS36 0336 DCBD 2D 4E FE AND IERQ ;N.B. only look at enabled interrupts MOS36 0415 DD07 ^19 MOS36 0337 DCC0 ; MOS36 0415 DD07 ^19 MOS36 0338 DCC0 ; MOS36 0415 DD07 ^19 MOS36 0339 DCC0 6A RORA ;A = IFR >> 1 MOS36 0415 DD07 ^19 MOS36 0340 DCC1 6A RORA ;A = IFR >> 2, C = CA1, N = CA2 MOS36 0415 DD07 ^19 MOS36 0341 DCC2 90 52 BCC ITIME2 ;[not VSYNC interrupt] MOS36 0415 DD07 ^19 MOS36 0342 DCC4 ; MOS36 0415 DD07 ^19 MOS36 0343 DCC4 ; VSYNC interrupt MOS36 0415 DD07 ^19 MOS36 0344 DCC4 ; N.B. C=1 MOS36 0415 DD07 ^19 MOS36 0345 DCC4 ; MOS36 0415 DD07 ^19 MOS36 0346 DCC4 CE 40 02 DEC CYCLE ;update CFS timeout byte MOS36 0415 DD07 ^19 MOS36 0347 DCC7 A5 EA LDA RSTUT ;decrement RS423 printer timeout MOS36 0415 DD07 ^19 MOS36 0348 DCC9 10 02 BPL NPRST MOS36 0415 DD07 ^19 MOS36 0349 DCCB E6 EA INC RSTUT MOS36 0415 DD07 ^19 MOS36 0350 DCCD ; MOS36 0415 DD07 ^19 MOS36 0351 DCCD NPRST ;no RS423 printer timeout MOS36 0415 DD07 ^19 MOS36 0352 DCCD ; MOS36 0415 DD07 ^19 MOS36 0353 DCCD AD 51 02 LDA FLCNT MOS36 0415 DD07 ^19 MOS36 0354 DCD0 F0 18 BEQ IVS1 ;[flash disabled] MOS36 0415 DD07 ^19 MOS36 0355 DCD2 CE 51 02 DEC FLCNT MOS36 0415 DD07 ^19 MOS36 0356 DCD5 D0 13 BNE IVS1 ;[flash count not exhausted] MOS36 0415 DD07 ^19 MOS36 0357 DCD7 ; MOS36 0415 DD07 ^19 MOS36 0358 DCD7 ; flash count exhausted MOS36 0415 DD07 ^19 MOS36 0359 DCD7 ; reset FLCNT MOS36 0415 DD07 ^19 MOS36 0360 DCD7 ; MOS36 0415 DD07 ^19 MOS36 0361 DCD7 [ MOS125 = &FF MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 67 MOS36 IRQ processing MOS36 MOS36 0415 DD07 ^19 MOS36 0372 DCD7 | MOS36 0415 DD07 ^19 MOS36 0373 DCD7 ; A=1 MOS36 0415 DD07 ^19 MOS36 0374 DCD7 AE 52 02 LDX FLSPC MOS36 0415 DD07 ^19 MOS36 0375 DCDA 4D 48 02 EOR VPREGA ;invert flash bit MOS36 0415 DD07 ^19 MOS36 0376 DCDD 4A LSRA ;C = new flash bit MOS36 0415 DD07 ^19 MOS36 0377 DCDE B0 03 BCS FLASH1 ;[old flash bit = 0] MOS36 0415 DD07 ^19 MOS36 0378 DCE0 ; old flash bit = 1 MOS36 0415 DD07 ^19 MOS36 0379 DCE0 AE 53 02 LDX FLMRK MOS36 0415 DD07 ^19 MOS36 0380 DCE3 FLASH1 MOS36 0415 DD07 ^19 MOS36 0381 DCE3 ; MOS36 0415 DD07 ^19 MOS36 0382 DCE3 2A ROLA ;A = VPREGA MOS36 0415 DD07 ^19 MOS36 0383 DCE4 ] MOS36 0415 DD07 ^19 MOS36 0384 DCE4 20 3F EA JSR MVPRC0 ;update video processor and register image MOS36 0415 DD07 ^19 MOS36 0385 DCE7 8E 51 02 STX FLCNT ;update flash count MOS36 0415 DD07 ^19 MOS36 0386 DCEA ; MOS36 0415 DD07 ^19 MOS36 0387 DCEA IVS1 MOS36 0415 DD07 ^19 MOS36 0388 DCEA A0 04 LDYIM EVVSYN MOS36 0415 DD07 ^19 MOS36 0389 DCEC 20 86 E1 JSR EVENT MOS36 0415 DD07 ^19 MOS36 0390 DCEF ; MOS36 0415 DD07 ^19 MOS36 0391 DCEF A9 02 LDAIM VSYNC MOS36 0415 DD07 ^19 MOS36 0392 DCF1 4C 1B DE JMP IVIAA0 ;clear interrupt and return MOS36 0415 DD07 ^19 MOS36 0393 DCF4 MOS36 0415 DD07 ^19 MOS36 0394 DCF4 MOS36 0415 DD07 ^19 MOS36 0395 DCF4 MOS36 0415 DD07 ^19 MOS36 0396 DCF4 IRQB ;check for interrupt from secondary 6522 MOS36 0415 DD07 ^19 MOS36 0397 DCF4 ; MOS36 0415 DD07 ^19 MOS36 0398 DCF4 AD 6D FE LDA IFRR ;A = IFR, C = ?, N = IRQ MOS36 0415 DD07 ^19 MOS36 0399 DCF7 10 A9 BPL UNKIRQ ;[not a VIAB interrupt] MOS36 0415 DD07 ^19 MOS36 0400 DCF9 ; MOS36 0415 DD07 ^19 MOS36 0401 DCF9 ; MOS36 0415 DD07 ^19 MOS36 0402 DCF9 2D 77 02 AND B6522 ;suppress bits if secondary 6522 not present MOS36 0415 DD07 ^19 MOS36 0403 DCFC 2D 6E FE AND IERR ;only look at enabled interrupts MOS36 0415 DD07 ^19 MOS36 0404 DCFF 6A RORA ;A = IFR >> 1 MOS36 0415 DD07 ^19 MOS36 0405 DD00 6A RORA ;A = IFR >> 2, C = CA1 MOS36 0415 DD07 ^19 MOS36 0406 DD01 90 9F BCC UNKIRQ ;[not a printer interrupt] MOS36 0415 DD07 ^19 MOS36 0407 DD03 ; MOS36 0415 DD07 ^19 MOS36 0408 DD03 IPRNT ;printer interrupt MOS36 0415 DD07 ^19 MOS36 0409 DD03 ; MOS36 0415 DD07 ^19 MOS36 0410 DD03 ; acknowledge interrupt MOS36 0415 DD07 ^19 MOS36 0411 DD03 ; N.B. clear before sending next character since printer MOS36 0415 DD07 ^19 MOS36 0412 DD03 ; may acknowledge quickly and we could miss the interrupt MOS36 0415 DD07 ^19 MOS36 0413 DD03 AC 85 02 LDY PRNTSW MOS36 0415 DD07 ^19 MOS36 0414 DD06 88 DEY ;******** ASSUMES PCEN = 1 ******** MOS36 0415 DD07 ^19 MOS36 0415 DD07 D0 99 BNE UNKIRQ ;[ignore printer interrupt cos centronics not selected] MOS36 0341 DCC2 v2D MOS36 0416 DD09 ; MOS36 0341 DCC2 v2D MOS36 0417 DD09 A9 02 LDAIM PRNT MOS36 0341 DCC2 v2D MOS36 0418 DD0B 8D 6D FE STA IFRR ;acknowledge interrupt MOS36 0341 DCC2 v2D MOS36 0419 DD0E 8D 6E FE STA IERR ;disable printer interrupt MOS36 0341 DCC2 v2D MOS36 0420 DD11 ; (will be enabled again by STROBE if another character is sent MOS36 0341 DCC2 v2D MOS36 0421 DD11 ; using the parallel port) MOS36 0341 DCC2 v2D MOS36 0422 DD11 ; MOS36 0341 DCC2 v2D MOS36 0423 DD11 A2 03 LDXIM BPRNT ;X := print bufferid MOS36 0341 DCC2 v2D MOS36 0424 DD13 4C 99 E2 JMP STROBE ;if character read then print it AND return from interrupt MOS36 0341 DCC2 v2D MOS36 0425 DD16 MOS36 0341 DCC2 v2D MOS36 0426 DD16 MOS36 0341 DCC2 v2D MOS36 0427 DD16 ITIME2 ;check for TIMER2 interrupt MOS36 0341 DCC2 v2D MOS36 0428 DD16 ; MOS36 0341 DCC2 v2D MOS36 0429 DD16 2A ROLA ;A = IFR >> 1 -- MOS36 0430 DD17 2A ROLA ;A = IFR -- MOS36 0431 DD18 2A ROLA ;:A = IFR << 1, N = TIMER1 -- MOS36 0432 DD19 2A ROLA ;A = IFR << 2, N = TIMER2, C = TIMER1 -- MOS36 0433 DD1A 10 5B BPL ITIME1 ;[not TIMER2, check for TIMER1 interrupt] MOS36 0433 DD1A v24 MOS36 0434 DD1C [ NOSP = &00 MOS36 0433 DD1A v24 MOS36 0437 DD1C | MOS36 0433 DD1A v24 MOS36 0438 DD1C ; MOS36 0433 DD1A v24 MOS36 0439 DD1C ; timer 2 interrupt MOS36 0433 DD1A v24 MOS36 0440 DD1C ; acknowledge interrupt MOS36 0433 DD1A v24 MOS36 0441 DD1C ; MOS36 0433 DD1A v24 MOS36 0442 DD1C ; and MOS36 0433 DD1A v24 MOS36 0443 DD1C ; MOS36 0433 DD1A v24 MOS36 0444 DD1C ; set speech RDY to interrupt again MOS36 0433 DD1A v24 MOS36 0445 DD1C ; MOS36 0433 DD1A v24 MOS36 0446 DD1C A9 20 LDAIM TIMER2 MOS36 0433 DD1A v24 MOS36 0447 DD1E A2 00 LDXIM ZERO MOS36 0433 DD1A v24 MOS36 0448 DD20 ; N.B. minimise time between next two instructions MOS36 0433 DD1A v24 MOS36 0449 DD20 8D 4D FE STA IFRQ ;clear interrupt MOS36 0433 DD1A v24 MOS36 0450 DD23 8E 49 FE STX TRCHQ ;set to interrupt on speech chip INT MOS36 0433 DD1A v24 MOS36 0451 DD26 ; MOS36 0433 DD1A v24 MOS36 0452 DD26 ; process speech request MOS36 0433 DD1A v24 MOS36 0453 DD26 ; MOS36 0433 DD1A v24 MOS36 0454 DD26 PRSPRQ ;process speech request MOS36 0433 DD1A v24 MOS36 0455 DD26 ; MOS36 0433 DD1A v24 MOS36 0456 DD26 ; set speak external repeat counter to 4 MOS36 0433 DD1A v24 MOS36 0457 DD26 ; MOS36 0433 DD1A v24 MOS36 0458 DD26 A2 08 LDXIM BSPCH MOS36 0433 DD1A v24 MOS36 0459 DD28 86 FB STX SPWK2 ;**** ASSUMES BSPCH=8 **** MOS36 0433 DD1A v24 MOS36 0460 DD2A ; MOS36 0433 DD1A v24 MOS36 0461 DD2A SPEREP ;repeat poke of speak external data MOS36 0433 DD1A v24 MOS36 0462 DD2A ; MOS36 0433 DD1A v24 MOS36 0463 DD2A ; inspect speech buffer MOS36 0433 DD1A v24 MOS36 0464 DD2A ; MOS36 0433 DD1A v24 MOS36 0465 DD2A 20 94 E5 JSR EXAM MOS36 0433 DD1A v24 MOS36 0466 DD2D ; MOS36 0433 DD1A v24 MOS36 0467 DD2D ; record buffer status - MI => dormant, PL => busy MOS36 0433 DD1A v24 MOS36 0468 DD2D ; MOS36 0433 DD1A v24 MOS36 0469 DD2D 6E D7 02 ROR SPSTAT MOS36 0433 DD1A v24 MOS36 0470 DD30 30 44 BMI NSPECH ;[buffer empty] MOS36 0433 DD1A v24 MOS36 0471 DD32 ; MOS36 0433 DD1A v24 MOS36 0472 DD32 A8 TAY MOS36 0433 DD1A v24 MOS36 0473 DD33 F0 05 BEQ SPOK ;[speak external data] MOS36 0433 DD1A v24 MOS36 0474 DD35 ; MOS36 0433 DD1A v24 MOS36 0475 DD35 ; new command - ensure not talking MOS36 0433 DD1A v24 MOS36 0476 DD35 ; MOS36 0433 DD1A v24 MOS36 0477 DD35 20 AD EE JSR RSPECH MOS36 0433 DD1A v24 MOS36 0478 DD38 30 3C BMI NSPECH ;[talking active] MOS36 0433 DD1A v24 MOS36 0479 DD3A ; MOS36 0433 DD1A v24 MOS36 0480 DD3A ; new command and not talking MOS36 0433 DD1A v24 MOS36 0481 DD3A ; MOS36 0433 DD1A v24 MOS36 0482 DD3A SPOK ;speak external data MOS36 0433 DD1A v24 MOS36 0483 DD3A ; MOS36 0433 DD1A v24 MOS36 0484 DD3A ; get command byte from speech buffer MOS36 0433 DD1A v24 MOS36 0485 DD3A ; MOS36 0433 DD1A v24 MOS36 0486 DD3A 20 99 E5 JSR REMOV MOS36 0433 DD1A v24 MOS36 0487 DD3D ; MOS36 0433 DD1A v24 MOS36 0488 DD3D ; codeword in A MOS36 0433 DD1A v24 MOS36 0489 DD3D ; MOS36 0433 DD1A v24 MOS36 0490 DD3D 85 F5 STA SEROM MOS36 0433 DD1A v24 MOS36 0491 DD3F ; MOS36 0433 DD1A v24 MOS36 0492 DD3F ; pull data MOS36 0433 DD1A v24 MOS36 0493 DD3F ; MOS36 0433 DD1A v24 MOS36 0494 DD3F 20 99 E5 JSR REMOV MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 68 MOS36 IRQ processing MOS36 MOS36 0433 DD1A v24 MOS36 0495 DD42 85 F7 STA ROMPTR+&01 ;hi-address / hi-data MOS36 0433 DD1A v24 MOS36 0496 DD44 20 99 E5 JSR REMOV MOS36 0433 DD1A v24 MOS36 0497 DD47 85 F6 STA ROMPTR+&00 ;lo-address / lo-data MOS36 0433 DD1A v24 MOS36 0498 DD49 ; MOS36 0433 DD1A v24 MOS36 0499 DD49 ; switch on codeword MOS36 0433 DD1A v24 MOS36 0500 DD49 ; MOS36 0433 DD1A v24 MOS36 0501 DD49 A4 F5 LDY SEROM MOS36 0433 DD1A v24 MOS36 0502 DD4B F0 1B BEQ ISP2 ;[command=0, do not treat codeword as a command] MOS36 0433 DD1A v24 MOS36 0503 DD4D 10 16 BPL ISP3 ;[command>0, speech command without address] MOS36 0433 DD1A v24 MOS36 0504 DD4F ; MOS36 0433 DD1A v24 MOS36 0505 DD4F ; command with address MOS36 0433 DD1A v24 MOS36 0506 DD4F ; command either speak(address) OR read-and-branch(address) MOS36 0433 DD1A v24 MOS36 0507 DD4F ; MOS36 0433 DD1A v24 MOS36 0508 DD4F ; check for read and branch request MOS36 0433 DD1A v24 MOS36 0509 DD4F ; MOS36 0433 DD1A v24 MOS36 0510 DD4F 24 F5 BIT SEROM MOS36 0433 DD1A v24 MOS36 0511 DD51 [ MOS125 = &FF MOS36 0433 DD1A v24 MOS36 0531 DD51 | MOS36 0433 DD1A v24 MOS36 0532 DD51 50 09 BVC LADDR ;[speak(address)] MOS36 0433 DD1A v24 MOS36 0533 DD53 ;read and branch (speak indirect) MOS36 0433 DD1A v24 MOS36 0534 DD53 ; MOS36 0433 DD1A v24 MOS36 0535 DD53 ; multiply offset by two MOS36 0433 DD1A v24 MOS36 0536 DD53 ; MOS36 0433 DD1A v24 MOS36 0537 DD53 06 F6 ASL ROMPTR+&00 MOS36 0433 DD1A v24 MOS36 0538 DD55 26 F7 ROL ROMPTR+&01 MOS36 0433 DD1A v24 MOS36 0539 DD57 ; MOS36 0433 DD1A v24 MOS36 0540 DD57 ; reselect address MOS36 0433 DD1A v24 MOS36 0541 DD57 ; MOS36 0433 DD1A v24 MOS36 0542 DD57 20 7C EE JSR SPLIND ;load address indirect (returns C=0) MOS36 0433 DD1A v24 MOS36 0543 DD5A 90 03 BCC ISPX ;always branch MOS36 0433 DD1A v24 MOS36 0544 DD5C MOS36 0433 DD1A v24 MOS36 0545 DD5C LADDR MOS36 0433 DD1A v24 MOS36 0546 DD5C ; MOS36 0433 DD1A v24 MOS36 0547 DD5C ; speak(address) MOS36 0433 DD1A v24 MOS36 0548 DD5C ; load address into speech processor MOS36 0433 DD1A v24 MOS36 0549 DD5C ; MOS36 0433 DD1A v24 MOS36 0550 DD5C ; V=0 MOS36 0433 DD1A v24 MOS36 0551 DD5C 20 FB EE JSR SPLOAD ;N.B. does PHP...PLP MOS36 0433 DD1A v24 MOS36 0552 DD5F ] MOS36 0433 DD1A v24 MOS36 0553 DD5F ; MOS36 0433 DD1A v24 MOS36 0554 DD5F ISPX MOS36 0433 DD1A v24 MOS36 0555 DD5F AC 61 02 LDY SHUTSP ;command defaults to speech MOS36 0433 DD1A v24 MOS36 0556 DD62 4C BF EE JMP WSPECH ;send command AND return MOS36 0433 DD1A v24 MOS36 0557 DD65 ; MOS36 0433 DD1A v24 MOS36 0558 DD65 ; MOS36 0433 DD1A v24 MOS36 0559 DD65 ISP3 ;treat codeword as a command MOS36 0433 DD1A v24 MOS36 0560 DD65 ; MOS36 0433 DD1A v24 MOS36 0561 DD65 20 BF EE JSR WSPECH ;issue codeword command MOS36 0433 DD1A v24 MOS36 0562 DD68 ; MOS36 0433 DD1A v24 MOS36 0563 DD68 ISP2 ;write argument data bytes MOS36 0433 DD1A v24 MOS36 0564 DD68 ; MOS36 0433 DD1A v24 MOS36 0565 DD68 A4 F6 LDY ROMPTR+&00 MOS36 0433 DD1A v24 MOS36 0566 DD6A 20 BF EE JSR WSPECH MOS36 0433 DD1A v24 MOS36 0567 DD6D A4 F7 LDY ROMPTR+&01 MOS36 0433 DD1A v24 MOS36 0568 DD6F 20 BF EE JSR WSPECH MOS36 0433 DD1A v24 MOS36 0569 DD72 ; MOS36 0433 DD1A v24 MOS36 0570 DD72 ; repeat poke of speak external data up to 4 times (8 bytes) MOS36 0433 DD1A v24 MOS36 0571 DD72 ; MOS36 0433 DD1A v24 MOS36 0572 DD72 46 FB LSR SPWK2 MOS36 0433 DD1A v24 MOS36 0573 DD74 D0 B4 BNE SPEREP ;[try poking more speak external data] MOS36 0433 DD1A v24 MOS36 0574 DD76 ; MOS36 0433 DD1A v24 MOS36 0575 DD76 NSPECH MOS36 0433 DD1A v24 MOS36 0576 DD76 60 RTS MOS36 0433 DD1A v24 MOS36 0577 DD77 ] MOS36 0433 DD1A v24 MOS36 0578 DD77 MOS36 0433 DD1A v24 MOS36 0579 DD77 MOS36 0433 DD1A v24 MOS36 0580 DD77 MOS36 0433 DD1A v24 MOS36 0581 DD77 ITIME1 ;check for TIMER1 interrupt MOS36 0433 DD1A v24 MOS36 0582 DD77 ; MOS36 0433 DD1A v24 MOS36 0583 DD77 90 7B BCC IADC ;[not TIMER1, check for ADC interrupt] MOS36 0583 DD77 v04 MOS36 0584 DD79 ; C=1 MOS36 0583 DD77 v04 MOS36 0585 DD79 ; MOS36 0583 DD77 v04 MOS36 0586 DD79 ; main clock interrupt MOS36 0583 DD77 v04 MOS36 0587 DD79 ; MOS36 0583 DD77 v04 MOS36 0588 DD79 ; clear interrupt MOS36 0583 DD77 v04 MOS36 0589 DD79 ; MOS36 0583 DD77 v04 MOS36 0590 DD79 A9 40 LDAIM CLOCK MOS36 0583 DD77 v04 MOS36 0591 DD7B 8D 4D FE STA IFRQ ;acknowledge clock interrupt MOS36 0583 DD77 v04 MOS36 0592 DD7E ; C=1 MOS36 0583 DD77 v04 MOS36 0593 DD7E ; MOS36 0583 DD77 v04 MOS36 0594 DD7E ; increment absolute time MOS36 0583 DD77 v04 MOS36 0595 DD7E ; MOS36 0583 DD77 v04 MOS36 0596 DD7E AD 83 02 LDA TIMESW MOS36 0583 DD77 v04 MOS36 0597 DD81 AA TAX ;X -> current timer MOS36 0583 DD77 v04 MOS36 0598 DD82 49 0F EORIM &0F MOS36 0583 DD77 v04 MOS36 0599 DD84 48 PHA MOS36 0583 DD77 v04 MOS36 0600 DD85 A8 TAY ;Y -> other timer MOS36 0583 DD77 v04 MOS36 0601 DD86 ; C=1 MOS36 0583 DD77 v04 MOS36 0602 DD86 ;****SEC ;N.B. add 1 to timer MOS36 0583 DD77 v04 MOS36 0603 DD86 ; MOS36 0583 DD77 v04 MOS36 0604 DD86 IT1 MOS36 0583 DD77 v04 MOS36 0605 DD86 BD 91 02 LDAAX TIME -&01 MOS36 0583 DD77 v04 MOS36 0606 DD89 69 00 ADCIM ZERO MOS36 0583 DD77 v04 MOS36 0607 DD8B 99 91 02 STAAY TIME -&01 MOS36 0583 DD77 v04 MOS36 0608 DD8E CA DEX MOS36 0583 DD77 v04 MOS36 0609 DD8F F0 03 BEQ IT2 MOS36 0583 DD77 v04 MOS36 0610 DD91 88 DEY MOS36 0583 DD77 v04 MOS36 0611 DD92 D0 F2 BNE IT1 MOS36 0583 DD77 v04 MOS36 0612 DD94 IT2 MOS36 0583 DD77 v04 MOS36 0613 DD94 ; MOS36 0583 DD77 v04 MOS36 0614 DD94 68 PLA MOS36 0583 DD77 v04 MOS36 0615 DD95 8D 83 02 STA TIMESW ;switch timers MOS36 0583 DD77 v04 MOS36 0616 DD98 ; MOS36 0583 DD77 v04 MOS36 0617 DD98 ; MOS36 0583 DD77 v04 MOS36 0618 DD98 A2 05 LDXIM &05 MOS36 0583 DD77 v04 MOS36 0619 DD9A IVIAA5 MOS36 0583 DD77 v04 MOS36 0620 DD9A FE 9B 02 INCAX STPW -&01 MOS36 0583 DD77 v04 MOS36 0621 DD9D D0 08 BNE IINKEY MOS36 0583 DD77 v04 MOS36 0622 DD9F CA DEX MOS36 0583 DD77 v04 MOS36 0623 DDA0 D0 F8 BNE IVIAA5 MOS36 0583 DD77 v04 MOS36 0624 DDA2 ; MOS36 0583 DD77 v04 MOS36 0625 DDA2 ; stopwatch timeout MOS36 0583 DD77 v04 MOS36 0626 DDA2 ; MOS36 0583 DD77 v04 MOS36 0627 DDA2 A0 05 LDYIM EVSWCH MOS36 0583 DD77 v04 MOS36 0628 DDA4 20 86 E1 JSR EVENT MOS36 0583 DD77 v04 MOS36 0629 DDA7 ; MOS36 0583 DD77 v04 MOS36 0630 DDA7 IINKEY ;decrement INKEY counter MOS36 0583 DD77 v04 MOS36 0631 DDA7 ; MOS36 0583 DD77 v04 MOS36 0632 DDA7 AD B1 02 LDA RDCTLO MOS36 0583 DD77 v04 MOS36 0633 DDAA D0 08 BNE IIN1 ;[just decrement lo] MOS36 0583 DD77 v04 MOS36 0634 DDAC ; lo zero MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 69 MOS36 IRQ processing MOS36 MOS36 0583 DD77 v04 MOS36 0635 DDAC AD B2 02 LDA RDCTHI MOS36 0583 DD77 v04 MOS36 0636 DDAF F0 06 BEQ IIN0 ;[counter zero] MOS36 0583 DD77 v04 MOS36 0637 DDB1 ; decrement lo and hi MOS36 0583 DD77 v04 MOS36 0638 DDB1 CE B2 02 DEC RDCTHI MOS36 0583 DD77 v04 MOS36 0639 DDB4 IIN1 ;just decrement lo MOS36 0583 DD77 v04 MOS36 0640 DDB4 CE B1 02 DEC RDCTLO MOS36 0583 DD77 v04 MOS36 0641 DDB7 IIN0 ;counter zero MOS36 0583 DD77 v04 MOS36 0642 DDB7 MOS36 0583 DD77 v04 MOS36 0643 DDB7 [ $Tutu ; no sound, no speech shit wanted - nothing from this point on MOS36 0583 DD77 v04 MOS36 0647 DDB7 | MOS36 0583 DD77 v04 MOS36 0648 DDB7 ; MOS36 0583 DD77 v04 MOS36 0649 DDB7 ; MOS36 0583 DD77 v04 MOS36 0650 DDB7 ; check sound sema to ensure exclusive access to sound code MOS36 0583 DD77 v04 MOS36 0651 DDB7 ; MOS36 0583 DD77 v04 MOS36 0652 DDB7 2C CE 02 BIT SSEMA MOS36 0583 DD77 v04 MOS36 0653 DDBA ] MOS36 0583 DD77 v04 MOS36 0654 DDBA 10 0B BPL SINUSE ;[sound software in use] MOS36 0583 DD77 v04 MOS36 0655 DDBC ; MOS36 0583 DD77 v04 MOS36 0656 DDBC ; sound software available MOS36 0583 DD77 v04 MOS36 0657 DDBC ; MOS36 0583 DD77 v04 MOS36 0658 DDBC EE CE 02 INC SSEMA ;claim sound sema MOS36 0583 DD77 v04 MOS36 0659 DDBF 58 CLI ;enable interrupts during sound processing MOS36 0583 DD77 v04 MOS36 0660 DDC0 20 B3 EB JSR SNDIRQ MOS36 0583 DD77 v04 MOS36 0661 DDC3 78 SEI ;disable interrupts after sound processing MOS36 0583 DD77 v04 MOS36 0662 DDC4 CE CE 02 DEC SSEMA ;release sound sema MOS36 0583 DD77 v04 MOS36 0663 DDC7 SINUSE MOS36 0583 DD77 v04 MOS36 0664 DDC7 [ NOSP = &00 MOS36 0583 DD77 v04 MOS36 0666 DDC7 | MOS36 0583 DD77 v04 MOS36 0667 DDC7 ; MOS36 0583 DD77 v04 MOS36 0668 DDC7 ; give speech a chance MOS36 0583 DD77 v04 MOS36 0669 DDC7 ; MOS36 0583 DD77 v04 MOS36 0670 DDC7 ; check buffer MOS36 0583 DD77 v04 MOS36 0671 DDC7 ; MOS36 0583 DD77 v04 MOS36 0672 DDC7 2C D7 02 BIT SPSTAT MOS36 0583 DD77 v04 MOS36 0673 DDCA 30 0C BMI SPBUSY ;[speech buffer empty] MOS36 0583 DD77 v04 MOS36 0674 DDCC ; MOS36 0583 DD77 v04 MOS36 0675 DDCC ; read speech chip status MOS36 0583 DD77 v04 MOS36 0676 DDCC ; MOS36 0583 DD77 v04 MOS36 0677 DDCC 20 AD EE JSR RSPECH ;N.B. does not alter A if speech chip not present MOS36 0583 DD77 v04 MOS36 0678 DDCF ; MOS36 0583 DD77 v04 MOS36 0679 DDCF ; A>=$80 => busy MOS36 0583 DD77 v04 MOS36 0680 DDCF ; MOS36 0583 DD77 v04 MOS36 0681 DDCF ; N.B. if speech chip does not exist then 25% chance that PRSPRQ will MOS36 0583 DD77 v04 MOS36 0682 DDCF ; be called, this will just result in a no-operation effect MOS36 0583 DD77 v04 MOS36 0683 DDCF ; MOS36 0583 DD77 v04 MOS36 0684 DDCF 49 A0 EORIM &A0 MOS36 0583 DD77 v04 MOS36 0685 DDD1 C9 60 CMPIM &60 MOS36 0583 DD77 v04 MOS36 0686 DDD3 90 03 BCC SPBUSY ;[100, 101 or 111] MOS36 0583 DD77 v04 MOS36 0687 DDD5 ; MOS36 0583 DD77 v04 MOS36 0688 DDD5 20 26 DD JSR PRSPRQ ;process speech request MOS36 0583 DD77 v04 MOS36 0689 DDD8 ] MOS36 0583 DD77 v04 MOS36 0690 DDD8 ; MOS36 0583 DD77 v04 MOS36 0691 DDD8 SPBUSY ;speech chip busy MOS36 0583 DD77 v04 MOS36 0692 DDD8 ; MOS36 0583 DD77 v04 MOS36 0693 DDD8 ; check RS423 for possible Tx MOS36 0583 DD77 v04 MOS36 0694 DDD8 ; MOS36 0583 DD77 v04 MOS36 0695 DDD8 2C 55 D9 BIT FFBYT ;indicate timer interrupt call MOS36 0583 DD77 v04 MOS36 0696 DDDB 20 51 DC JSR IRQ68 MOS36 0583 DD77 v04 MOS36 0697 DDDE ; MOS36 0583 DD77 v04 MOS36 0698 DDDE ; check keyboard if keys active MOS36 0583 DD77 v04 MOS36 0699 DDDE ; MOS36 0583 DD77 v04 MOS36 0700 DDDE A5 EC LDA CKEY MOS36 0583 DD77 v04 MOS36 0701 DDE0 05 ED ORA OKEY MOS36 0583 DD77 v04 MOS36 0702 DDE2 2D 42 02 AND KSEMA ;check for keyboard critical region MOS36 0583 DD77 v04 MOS36 0703 DDE5 F0 04 BEQ ICLK0 ;[no keys active, clear timer interrupt] MOS36 0583 DD77 v04 MOS36 0704 DDE7 38 SEC MOS36 0583 DD77 v04 MOS36 0705 DDE8 20 98 F0 JSR JMIKYV ;key(s) active, process timer interrupt MOS36 0583 DD77 v04 MOS36 0706 DDEB ; ******** MAY ENABLE INTERRUPTS (EXITS DISABLED) ******** MOS36 0583 DD77 v04 MOS36 0707 DDEB ; MOS36 0583 DD77 v04 MOS36 0708 DDEB ICLK0 MOS36 0583 DD77 v04 MOS36 0709 DDEB ; give user print routine a chance MOS36 0583 DD77 v04 MOS36 0710 DDEB 20 F8 E2 JSR UPTINT MOS36 0583 DD77 v04 MOS36 0711 DDEE ; MOS36 0583 DD77 v04 MOS36 0712 DDEE ; the ADC is connected on CB1 MOS36 0583 DD77 v04 MOS36 0713 DDEE ; when port B is read (by keyboard routines) any MOS36 0583 DD77 v04 MOS36 0714 DDEE ; interrupt is lost, and the ADC must be restarted MOS36 0583 DD77 v04 MOS36 0715 DDEE ; MOS36 0583 DD77 v04 MOS36 0716 DDEE 2C C0 FE BIT ADCCTL MOS36 0583 DD77 v04 MOS36 0717 DDF1 70 04 BVS IADCB ;[ADC not busy] MOS36 0583 DD77 v04 MOS36 0718 DDF3 60 RTS ;return from interrupt MOS36 0583 DD77 v04 MOS36 0719 DDF4 MOS36 0583 DD77 v04 MOS36 0720 DDF4 MOS36 0583 DD77 v04 MOS36 0721 DDF4 IADC ;check for ADC interrupt MOS36 0583 DD77 v04 MOS36 0722 DDF4 ; MOS36 0583 DD77 v04 MOS36 0723 DDF4 2A ROLA ;A = IFR << 3, N = CB1 MOS36 0717 DDF1 v7B MOS36 0724 DDF5 10 28 BPL IKEYBD ;[not an ADC intterupt] MOS36 0724 DDF5 v57 MOS36 0725 DDF7 ; MOS36 0724 DDF5 v57 MOS36 0726 DDF7 ; ADC interrupt MOS36 0724 DDF5 v57 MOS36 0727 DDF7 ; check ADC enabled MOS36 0724 DDF5 v57 MOS36 0728 DDF7 ; MOS36 0724 DDF5 v57 MOS36 0729 DDF7 IADCB MOS36 0724 DDF5 v57 MOS36 0730 DDF7 AE 4C 02 LDX ADCHAN MOS36 0724 DDF5 v57 MOS36 0731 DDFA F0 1D BEQ IADC0 ;[ADC disabled] MOS36 0724 DDF5 v57 MOS36 0732 DDFC ; MOS36 0724 DDF5 v57 MOS36 0733 DDFC ; read conversion lo byte MOS36 0724 DDF5 v57 MOS36 0734 DDFC ; MOS36 0724 DDF5 v57 MOS36 0735 DDFC AD C2 FE LDA ADCLO MOS36 0724 DDF5 v57 MOS36 0736 DDFF 9D B5 02 STAAX ADCLOV -&01 MOS36 0724 DDF5 v57 MOS36 0737 DE02 ; MOS36 0724 DDF5 v57 MOS36 0738 DE02 ; read conversion hi byte MOS36 0724 DDF5 v57 MOS36 0739 DE02 ; MOS36 0724 DDF5 v57 MOS36 0740 DE02 AD C1 FE LDA ADCHI MOS36 0724 DDF5 v57 MOS36 0741 DE05 9D B9 02 STAAX ADCHIV -&01 MOS36 0724 DDF5 v57 MOS36 0742 DE08 ; MOS36 0724 DDF5 v57 MOS36 0743 DE08 ; set latest conversion number MOS36 0724 DDF5 v57 MOS36 0744 DE08 ; MOS36 0724 DDF5 v57 MOS36 0745 DE08 8E BE 02 STX ADCFLG MOS36 0724 DDF5 v57 MOS36 0746 DE0B ; MOS36 0724 DDF5 v57 MOS36 0747 DE0B ; signal ADC conversion event, X = channel number MOS36 0724 DDF5 v57 MOS36 0748 DE0B ; MOS36 0724 DDF5 v57 MOS36 0749 DE0B A0 03 LDYIM EVADC MOS36 0724 DDF5 v57 MOS36 0750 DE0D 20 86 E1 JSR EVENT MOS36 0724 DDF5 v57 MOS36 0751 DE10 ; MOS36 0724 DDF5 v57 MOS36 0752 DE10 ; step to next channel MOS36 0724 DDF5 v57 MOS36 0753 DE10 ; MOS36 0724 DDF5 v57 MOS36 0754 DE10 CA DEX MOS36 0724 DDF5 v57 MOS36 0755 DE11 D0 03 BNE IADC2 ;[channel >= 1] MOS36 0724 DDF5 v57 MOS36 0756 DE13 ; MOS36 0724 DDF5 v57 MOS36 0757 DE13 ; channel counter underflow MOS36 0724 DDF5 v57 MOS36 0758 DE13 ; reload channel counter MOS36 0724 DDF5 v57 MOS36 0759 DE13 ; MOS36 MOS36 MOS36 MOS36 Acorn macro assembler Page 70 MOS36 IRQ processing MOS36 MOS36 0724 DDF5 v57 MOS36 0760 DE13 AE 4D 02 LDX MAXADC MOS36 0724 DDF5 v57 MOS36 0761 DE16 IADC2 MOS36 0724 DDF5 v57 MOS36 0762 DE16 ; MOS36 0724 DDF5 v57 MOS36 0763 DE16 ; initiate next conversion MOS36 0724 DDF5 v57 MOS36 0764 DE16 ; X = channel number MOS36 0724 DDF5 v57 MOS36 0765 DE16 ; MOS36 0724 DDF5 v57 MOS36 0766 DE16 20 47 DE JSR ADCBGX ;begin conversion, sets ADCHAN=X MOS36 0724 DDF5 v57 MOS36 0767 DE19 IADC0 MOS36 0724 DDF5 v57 MOS36 0768 DE19 A9 10 LDAIM ADC MOS36 0724 DDF5 v57 MOS36 0769 DE1B IVIAA0 ;return from VIAA interrupt MOS36 0724 DDF5 v57 MOS36 0770 DE1B 8D 4D FE STA IFRQ ;clear interrupt state MOS36 0724 DDF5 v57 MOS36 0771 DE1E 60 RTS ;return from interrupt MOS36 0724 DDF5 v57 MOS36 0772 DE1F MOS36 0724 DDF5 v57 MOS36 0773 DE1F MOS36 0724 DDF5 v57 MOS36 0774 DE1F IKEYBD ;keyboard interrupt check MOS36 0724 DDF5 v57 MOS36 0775 DE1F ; MOS36 0724 DDF5 v57 MOS36 0776 DE1F 2A ROLA ;A = IFR << 4 MOS36 0787 DE2A ^6F MOS36 0777 DE20 2A ROLA ;A = IFR << 5 MOS36 0787 DE2A ^6F MOS36 0778 DE21 2A ROLA ;A = IFR << 6 MOS36 0787 DE2A ^6F MOS36 0779 DE22 2A ROLA ;A = IFR << 7, N = CA2 MOS36 0787 DE2A ^6F MOS36 0780 DE23 10 07 BPL JUNKIRQ ;[not keyboard interrupt] MOS36 0787 DE2A ^6F MOS36 0781 DE25 ; MOS36 0787 DE2A ^6F MOS36 0782 DE25 ; C=0 because no VSYNC MOS36 0787 DE2A ^6F MOS36 0783 DE25 ; MOS36 0787 DE2A ^6F MOS36 0784 DE25 20 98 F0 JSR JMIKYV ;find and set up new current key (enter with C=0) MOS36 0787 DE2A ^6F MOS36 0785 DE28 ; ******** MAY ENABLE INTERRUPTS (EXITS DISABLED) ******** MOS36 0787 DE2A ^6F MOS36 0786 DE28 A9 01 LDAIM KEYBD MOS36 0787 DE2A ^6F MOS36 0787 DE2A D0 EF BNE IVIAA0 ;[ALWAYS jump] MOS36 0780 DE23 v78 MOS36 0788 DE2C ; MOS36 0780 DE23 v78 MOS36 0789 DE2C 4C A2 DC JUNKIRQ JMP UNKIRQ ;IRQ not identified -- MOS36 0790 DE2F -- MOS36 0791 DE2F -- MOS36 0792 DE2F -- MOS36 0793 DE2F [ MOS125 = &FF -- MOS36 0794 DE2F | -- MOS36 0795 DE2F DEFIRQ ;default IRQ routine -- MOS36 0796 DE2F D8 CLD -- MOS36 0797 DE30 A5 FC LDA TEMPA -- MOS36 0798 DE32 48 PHA -- MOS36 0799 DE33 8A TXA -- MOS36 0800 DE34 48 PHA -- MOS36 0801 DE35 98 TYA -- MOS36 0802 DE36 48 PHA -- MOS36 0803 DE37 ; -- MOS36 0804 DE37 ; schedule return from interrupt -- MOS36 0805 DE37 ; -- MOS36 0806 DE37 20 50 DC JSR VAT -- MOS36 0807 DE3A ] -- MOS36 0808 DE3A IRQ0 ;return from interrupt restoring registers -- MOS36 0809 DE3A 68 PLA -- MOS36 0810 DE3B A8 TAY -- MOS36 0811 DE3C 68 PLA -- MOS36 0812 DE3D AA TAX -- MOS36 0813 DE3E 68 PLA -- MOS36 0814 DE3F 85 FC STA TEMPA -- MOS36 0815 DE41 ; -- MOS36 0816 DE41 IRQTWO -- MOS36 0817 DE41 A5 FC LDA TEMPA -- MOS36 0818 DE43 40 RTI -- MOS36 0819 DE44 -- MOS36 0820 DE44 -- MOS36 0821 DE44 ADCBEG ;begin forced ADC conversion -- MOS36 0822 DE44 ; -- MOS36 0823 DE44 ; X = external channel number -- MOS36 0824 DE44 ; Y = 0 -- MOS36 0825 DE44 ; -- MOS36 0826 DE44 8C BE 02 STY ADCFLG ;clear conversion number -- MOS36 0827 DE47 ; -- MOS36 0828 DE47 ADCBGX ;begin ADC conversion -- MOS36 0829 DE47 ; -- MOS36 0830 DE47 ; X = external channel number -- MOS36 0831 DE47 ; Y corrupted -- MOS36 0832 DE47 ; -- MOS36 0833 DE47 E0 05 CPXIM NADC +&01 -- MOS36 0834 DE49 90 02 BCC ADCBG1 ;[valid channel number] MOS36 0834 DE49 v7D MOS36 0835 DE4B A2 04 LDXIM NADC ;force valid channel number MOS36 0834 DE49 v7D MOS36 0836 DE4D ADCBG1 ;channel number now valid (but possibly 0) MOS36 0834 DE49 v7D MOS36 0837 DE4D ; MOS36 0834 DE49 v7D MOS36 0838 DE4D 8E 4C 02 STX ADCHAN -- MOS36 0839 DE50 AC 4E 02 LDY ADCCNV ;normally 0, 8 or 12 (0 has same effect as 12) -- MOS36 0840 DE53 88 DEY -- MOS36 0841 DE54 98 TYA -- MOS36 0842 DE55 29 08 ANDIM &08 ;extract conversion type -- MOS36 0843 DE57 18 CLC -- MOS36 0844 DE58 6D 4C 02 ADC ADCHAN -- MOS36 0845 DE5B ; C=0 -- MOS36 0846 DE5B E9 00 SBCIM ZERO ;subtract 1, add in INTERNAL channel number (1->0 ... 4->3) -- MOS36 0847 DE5D 8D C0 FE STA ADCCTL ;start conversion -- MOS36 0848 DE60 ; -- MOS36 0849 DE60 ; if X was 0 on entry then a conversion is initiated on channel 3 -- MOS36 0850 DE60 ; of the opposite conversion type to that expected, but the result -- MOS36 0851 DE60 ; of this conversion will be ignored -- MOS36 0852 DE60 ; -- MOS36 0853 DE60 60 RTS -- MOS36 0854 DE61 -- MOS36 0855 DE61 -- MOS36 0856 DE61 WRSTR ;write string -- MOS36 0857 DE61 ; -- MOS36 0858 DE61 A9 C3 LDAIM /MSG -- MOS36 0859 DE63 WRSTRA -- MOS36 0860 DE63 85 FE STA REPTR +&01 -- MOS36 0861 DE65 A9 00 LDAIM ZERO -- MOS36 0862 DE67 85 FD STA REPTR +&00 -- MOS36 0863 DE69 WRSTR1 -- MOS36 0864 DE69 C8 INY MOS36 0868 DE70 ^77 MOS36 0865 DE6A B1 FD LDAIY REPTR MOS36 0868 DE70 ^77 MOS36 0866 DE6C 20 E3 FF JSR OSASCI ;write message character MOS36 0868 DE70 ^77 MOS36 0867 DE6F AA TAX MOS36 0868 DE70 ^77 MOS36 0868 DE70 D0 F7 BNE WRSTR1 ;[ALWAYS jump, step to next message character] -- MOS36 0869 DE72 ; terminator found -- MOS36 0870 DE72 60 RTS -- MOS36 0871 DE73 -- MOS36 0872 DE73 -- MOS36 0873 DE73 LNK MOS38 -- MOS38 0001 DE73 ; > MOS38 -- MOS38 0002 DE73 TTL MOS38 CLI -- MOS38 0003 DE73 OPT MOS38 MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 71 MOS38 MOS38 CLI MOS38 -- MOS38 0004 DE73 ;(c) 1981 ACORN -- MOS38 0005 DE73 ;BBC MOS -- MOS38 0006 DE73 ;Change record: -- MOS38 0007 DE73 ;004 29-Jul-81 MP Prototype version -- MOS38 0008 DE73 ;Author(s): -- MOS38 0009 DE73 ;PB Paul Bond -- MOS38 0010 DE73 ;MP Mike Prees -- MOS38 0011 DE73 -- MOS38 0012 DE73 -- MOS38 0013 DE73 ; RDCH -- MOS38 0014 DE73 INKEY -- MOS38 0015 DE73 8E B1 02 STX RDCTLO ;set INKEY counter -- MOS38 0016 DE76 8C B2 02 STY RDCTHI -- MOS38 0017 DE79 A9 FF LDAIM &FF ;indicate INKEY operational -- MOS38 0018 DE7B D0 02 BNE RDCH5 ;[ALWAYS JUMP] MOS38 0018 DE7B v7D MOS38 0019 DE7D RDCH ;default OSRDCH MOS38 0018 DE7B v7D MOS38 0020 DE7D A9 00 LDAIM ZERO ;indicate not INKEY MOS38 0018 DE7B v7D MOS38 0021 DE7F RDCH5 MOS38 0018 DE7B v7D MOS38 0022 DE7F 85 E6 STA RDCTEM -- MOS38 0023 DE81 ; save X and Y -- MOS38 0024 DE81 8A TXA -- MOS38 0025 DE82 48 PHA -- MOS38 0026 DE83 98 TYA -- MOS38 0027 DE84 48 PHA -- MOS38 0028 DE85 ; check for exec file -- MOS38 0029 DE85 AC 56 02 LDY EXECH -- MOS38 0030 DE88 F0 15 BEQ RDCHQ ;[no exec file] MOS38 0030 DE88 v6A MOS38 0031 DE8A ; MOS38 0030 DE88 v6A MOS38 0032 DE8A 38 SEC MOS38 0030 DE88 v6A MOS38 0033 DE8B 66 EB ROR ESSEMA ;enter critical region MOS38 0030 DE88 v6A MOS38 0034 DE8D 20 D7 FF JSR OSBGET ;get a byte from exec file MOS38 0030 DE88 v6A MOS38 0035 DE90 [ MOS125 = &FF MOS38 0030 DE88 v6A MOS38 0040 DE90 | MOS38 0030 DE88 v6A MOS38 0041 DE90 66 EB ROR ESSEMA ;exit critical region MOS38 0030 DE88 v6A MOS38 0042 DE92 18 CLC MOS38 0030 DE88 v6A MOS38 0043 DE93 10 27 BPL RDCH3 ;[return character] MOS38 0043 DE93 v58 MOS38 0044 DE95 ] MOS38 0043 DE93 v58 MOS38 0045 DE95 ; MOS38 0043 DE93 v58 MOS38 0046 DE95 ; end of exec file: close exec file MOS38 0043 DE93 v58 MOS38 0047 DE95 ; Y = handle MOS38 0043 DE93 v58 MOS38 0048 DE95 A9 00 LDAIM ZERO MOS38 0043 DE93 v58 MOS38 0049 DE97 [ MOS125 = &FF MOS38 0043 DE93 v58 MOS38 0050 DE97 | MOS38 0043 DE93 v58 MOS38 0051 DE97 85 EB STA ESSEMA ;exit critical region MOS38 0043 DE93 v58 MOS38 0052 DE99 ] MOS38 0043 DE93 v58 MOS38 0053 DE99 8D 56 02 STA EXECH ;cancel exec file handle MOS38 0043 DE93 v58 MOS38 0054 DE9C 20 CE FF JSR OSFIND ;close exec file MOS38 0043 DE93 v58 MOS38 0055 DE9F RDCHQ ;read character MOS38 0043 DE93 v58 MOS38 0056 DE9F 24 FF BIT ESCFLG MOS38 0043 DE93 v58 MOS38 0057 DEA1 30 16 BMI RDCH1 ;[ESCAPE detected] MOS38 0043 DE93 v58 MOS38 0058 DEA3 ; MOS38 0043 DE93 v58 MOS38 0059 DEA3 AE 41 02 LDX RDCHSW ;set to read ch from selected buffer MOS38 0043 DE93 v58 MOS38 0060 DEA6 20 0B E6 JSR RDCHG ;get ch from kybd input buffer MOS38 0043 DE93 v58 MOS38 0061 DEA9 90 11 BCC RDCHN ;[character available] MOS38 0043 DE93 v58 MOS38 0062 DEAB ; MOS38 0043 DE93 v58 MOS38 0063 DEAB ; C=1 MOS38 0043 DE93 v58 MOS38 0064 DEAB ; MOS38 0043 DE93 v58 MOS38 0065 DEAB 24 E6 BIT RDCTEM MOS38 0043 DE93 v58 MOS38 0066 DEAD 50 F0 BVC RDCHQ ;[INKEY not operational] MOS38 0043 DE93 v58 MOS38 0067 DEAF ; MOS38 0043 DE93 v58 MOS38 0068 DEAF AD B1 02 LDA RDCTLO MOS38 0043 DE93 v58 MOS38 0069 DEB2 0D B2 02 ORA RDCTHI MOS38 0043 DE93 v58 MOS38 0070 DEB5 D0 E8 BNE RDCHQ ;[INKEY counter <> 0] MOS38 0043 DE93 v58 MOS38 0071 DEB7 ; MOS38 0043 DE93 v58 MOS38 0072 DEB7 ;INKEY count exhausted MOS38 0043 DE93 v58 MOS38 0073 DEB7 ; MOS38 0043 DE93 v58 MOS38 0074 DEB7 B0 05 BCS RDCH2 ;[ALWAYS jump, return A=$FF, C=1] MOS38 0043 DE93 v58 MOS38 0075 DEB9 ; MOS38 0043 DE93 v58 MOS38 0076 DEB9 RDCH1 ;ESCAPE detected MOS38 0043 DE93 v58 MOS38 0077 DEB9 38 SEC ;indicate escape detected MOS38 0043 DE93 v58 MOS38 0078 DEBA A9 1B LDAIM ESC MOS38 0043 DE93 v58 MOS38 0079 DEBC RDCHN ;C=0 => 'real' character MOS38 0043 DE93 v58 MOS38 0080 DEBC RDCH3 ;C=1 => escape detected OR INKEY count expired MOS38 0043 DE93 v58 MOS38 0081 DEBC 85 E6 STA RDCTEM ;save character read MOS38 0074 DEB7 v7A MOS38 0082 DEBE RDCH2 ;entry point used when INKEY count exhausted (N.B. RDCTEM=$FF) MOS38 0074 DEB7 v7A MOS38 0083 DEBE 68 PLA ;restore X and Y -- MOS38 0084 DEBF A8 TAY -- MOS38 0085 DEC0 68 PLA -- MOS38 0086 DEC1 AA TAX -- MOS38 0087 DEC2 A5 E6 LDA RDCTEM ;A := character -- MOS38 0088 DEC4 60 RTS -- MOS38 0089 DEC5 [ MOS125 = &FF -- MOS38 0365 DEC5 ] -- MOS38 0366 DEC5 -- MOS38 0367 DEC5 [ MOS125 = &FF -- MOS38 0368 DEC5 | -- MOS38 0369 DEC5 ;START OF MOS 1.25 -- MOS38 0370 DEC5 ; COPYR had been anchored here for fear that CLISKP -- MOS38 0371 DEC5 ; would be entered with X<2; this is now ruled out -- MOS38 0372 DEC5 ; but instead end-of-table marker must be within -- MOS38 0373 DEC5 ; 253 bytes of COMTAB -- MOS38 0374 DEC5 ; command level interpreter -- MOS38 0375 DEC5 COMTAB ;table of MOS commands -- MOS38 0376 DEC5 ; this table uses the fact that all routine address hi-bytes -- MOS38 0377 DEC5 ; will have the top bit set -- MOS38 0378 DEC5 ; N.B. addresses are stored hi-byte followed by lo-byte -- MOS38 0379 DEC5 ; hi-byte is assumed to be >=$80 -- MOS38 0380 DEC5 ; code following address is A reg on entry to address -- MOS38 0381 DEC5 ; A+ => enter with XY -> line -- MOS38 0382 DEC5 ; A- => enter with Y = offset -- MOS38 0383 DEC5 -- MOS38 0384 DEC5 ; CAT -- MOS38 0385 DEC5 ;must come first to trap *. -- MOS38 0386 DEC5 43 41 54 = "CAT" -- MOS38 0387 DEC8 E0 C6 & /JMIFSC -- MOS38 0388 DECA 05 = FSCAT ;enter with XY -> line -- MOS38 0389 DECB -- MOS38 0390 DECB ; FX -- MOS38 0391 DECB ;second entry in OS 1.20. -- MOS38 0392 DECB ;some naughty code might rely on the same quick response -- MOS38 0393 DECB ;but we also want to give fast access to USERV (*FX136) -- MOS38 0394 DECB ;and match early due to the sheer volume of calls -- MOS38 0395 DECB 46 58 = "FX" -- MOS38 0396 DECD E4 61 & /FX -- MOS38 0397 DECF FF = &FF ;enter with Y = offset -- MOS38 0398 DED0 -- MOS38 0399 DED0 ; CODE -- MOS38 0400 DED0 ;match after FX to take less time than *FX136 -- MOS38 0401 DED0 43 4F 44 = "CODE" -- MOS38 0402 DED4 E4 67 & /FXN -- MOS38 0403 DED6 88 = FXCODE ;enter with Y = offset MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 72 MOS38 MOS38 CLI MOS38 -- MOS38 0404 DED7 -- MOS38 0405 DED7 ; LOAD -- MOS38 0406 DED7 ;must come before LINE to trap *L. -- MOS38 0407 DED7 4C 4F 41 = "LOAD" -- MOS38 0408 DEDB E3 8D & /LOAD -- MOS38 0409 DEDD -- MOS38 0410 DEDD 00 = &00 ;enter with XY -> line -- MOS38 0411 DEDE -- MOS38 0412 DEDE ; LINE -- MOS38 0413 DEDE ;needs fast service the most as user code may be time critical -- MOS38 0414 DEDE ;the only (trivial) way to pass a string from parasite to USERV -- MOS38 0415 DEDE 4C 49 4E = "LINE" -- MOS38 0416 DEE2 E6 EB & /JMIUSR -- MOS38 0417 DEE4 01 = &01 ;enter with A=$01, XY -> line, C=0 -- MOS38 0418 DEE5 -- MOS38 0419 DEE5 ; default if first character is not alpha, |, . or / -- MOS38 0420 DEE5 ;filter the wordless *commands off early -- MOS38 0421 DEE5 ;a substitute for testing the first char in code -- MOS38 0422 DEE5 [ MOS125 = &7F -- MOS38 0423 DEE5 [ STARGO = &00 -- MOS38 0424 DEE5 E0 BF & /JMICMD -- MOS38 0425 DEE7 | -- MOS38 0427 DEE7 ] -- MOS38 0428 DEE7 | -- MOS38 0430 DEE7 ] -- MOS38 0431 DEE7 03 = FSNAME ;enter with XY -> line -- MOS38 0432 DEE8 -- MOS38 0433 DEE8 ; RUN -- MOS38 0434 DEE8 ;must come before ROM to trap *R. -- MOS38 0435 DEE8 ;should be as fast as *wordless to have equal advantage -- MOS38 0436 DEE8 52 55 4E = "RUN" -- MOS38 0437 DEEB [ MOS125 = &7F -- MOS38 0438 DEEB [ STARGO = &00 -- MOS38 0439 DEEB E0 BF & /JMICMD -- MOS38 0440 DEED | -- MOS38 0442 DEED ] -- MOS38 0443 DEED | -- MOS38 0445 DEED ] -- MOS38 0446 DEED -- MOS38 0447 DEED 04 = FSRUN ;enter with XY -> line -- MOS38 0448 DEEE -- MOS38 0449 DEEE ; OPT -- MOS38 0450 DEEE ;part of a program's operation, has high priority -- MOS38 0451 DEEE 4F 50 54 = "OPT" -- MOS38 0452 DEF1 E4 67 & /FXN -- MOS38 0453 DEF3 -- MOS38 0454 DEF3 8B = FXOPT ;enter with Y = offset -- MOS38 0455 DEF4 -- MOS38 0456 DEF4 ; EXEC -- MOS38 0457 DEF4 ;slow but provides the computer with work, should not hold it up -- MOS38 0458 DEF4 45 58 45 = "EXEC" -- MOS38 0459 DEF8 F6 E3 & /EXEC -- MOS38 0460 DEFA -- MOS38 0461 DEFA 00 = ZERO ;enter with XY -> line -- MOS38 0462 DEFB -- MOS38 0463 DEFB ; MOTOR -- MOS38 0464 DEFB ;a quick command but not urgent coming through OSCLI -- MOS38 0465 DEFB 4D 4F 54 = "MOTOR" -- MOS38 0466 DF00 E4 67 & /FXN -- MOS38 0467 DF02 -- MOS38 0468 DF02 89 = FXMOTR ;enter with Y = offset -- MOS38 0469 DF03 -- MOS38 0470 DF03 ; SAVE -- MOS38 0471 DF03 ;must come before SPOOL to trap *S. -- MOS38 0472 DF03 ;a slow command and rarer than loading -- MOS38 0473 DF03 53 41 56 = "SAVE" -- MOS38 0474 DF07 E3 8F & /SAVE -- MOS38 0475 DF09 -- MOS38 0476 DF09 00 = ZERO ;enter with XY -> line -- MOS38 0477 DF0A -- MOS38 0478 DF0A ; SPOOL -- MOS38 0479 DF0A ;also slow and rarer than saving -- MOS38 0480 DF0A 53 50 4F = "SPOOL" -- MOS38 0481 DF0F E3 D2 & /SPOOL -- MOS38 0482 DF11 -- MOS38 0483 DF11 00 = ZERO ;enter with XY -> line -- MOS38 0484 DF12 -- MOS38 0485 DF12 ; KEY -- MOS38 0486 DF12 ;low volume, called by programs at setup -- MOS38 0487 DF12 4B 45 59 = "KEY" -- MOS38 0488 DF15 E4 96 & /KEY -- MOS38 0489 DF17 -- MOS38 0490 DF17 FF = &FF ;enter with Y = offset -- MOS38 0491 DF18 -- MOS38 0492 DF18 ; TAPE -- MOS38 0493 DF18 ;must come before TV to trap *T. -- MOS38 0494 DF18 ;slightly more complex, called by programs at setup -- MOS38 0495 DF18 54 41 50 = "TAPE" -- MOS38 0496 DF1C E4 67 & /FXN -- MOS38 0497 DF1E -- MOS38 0498 DF1E 8C = FXTAPE ;enter with Y = offset -- MOS38 0499 DF1F -- MOS38 0500 DF1F ; TV -- MOS38 0501 DF1F ;cosmetic, called by programs at setup -- MOS38 0502 DF1F 54 56 = "TV" -- MOS38 0503 DF21 E4 67 & /FXN -- MOS38 0504 DF23 -- MOS38 0505 DF23 90 = FXTV ;enter with Y = offset -- MOS38 0506 DF24 -- MOS38 0507 DF24 ; HELP -- MOS38 0508 DF24 ;user command -- MOS38 0509 DF24 48 45 4C = "HELP" -- MOS38 0510 DF28 F5 6A & /HELP -- MOS38 0511 DF2A -- MOS38 0512 DF2A FF = &FF ;enter with Y = offset -- MOS38 0513 DF2B -- MOS38 0514 DF2B ; ROM -- MOS38 0515 DF2B ;rarely used. as RFS installations are site-specific -- MOS38 0516 DF2B ;this is essentially a user command -- MOS38 0517 DF2B 52 4F 4D = "ROM" -- MOS38 0518 DF2E E4 67 & /FXN -- MOS38 0519 DF30 -- MOS38 0520 DF30 8D = FXSROM ;don't care -- MOS38 0521 DF31 -- MOS38 0522 DF31 ; BASIC -- MOS38 0523 DF31 ;invokes the language (i.e. non-transient) -- MOS38 0524 DF31 ;called either by the user or in a slow *EXEC file -- MOS38 0525 DF31 42 41 53 = "BASIC" -- MOS38 0526 DF36 E0 A4 & /BASIC -- MOS38 0527 DF38 01 = &01 ;bit 0 set for ILR2 to enter ROM with C=1 -- MOS38 0528 DF39 ] MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 73 MOS38 MOS38 CLI MOS38 -- MOS38 0529 DF39 -- MOS38 0530 DF39 [ MOS125 = &7F -- MOS38 0531 DF39 [ STARGO = &00 -- MOS38 0532 DF39 ; GOIO -- MOS38 0533 DF39 ;comes before GO to trap *G. -- MOS38 0534 DF39 47 4F 49 = "GOIO" -- MOS38 0535 DF3D DF A4 & /GOIO -- MOS38 0536 DF3F -- MOS38 0537 DF3F 80 = /LANG ;assumed -ve; stored as default jump address -- MOS38 0538 DF40 -- MOS38 0539 DF40 ; GO -- MOS38 0540 DF40 47 4F = "GO" -- MOS38 0541 DF42 DF A5 & /GO -- MOS38 0542 DF44 -- MOS38 0543 DF44 80 = /LANG ;assumed -ve; stored as default jump address -- MOS38 0544 DF45 -- MOS38 0545 DF45 = "" -- MOS38 0546 DF45 80 = &80 ;end of table -- MOS38 0547 DF46 -- MOS38 0548 DF46 00 00 00 % 94 ;padding -- MOS38 0549 DFA4 -- MOS38 0550 DFA4 [ NOSP = &00 -- MOS38 0552 DFA4 ] -- MOS38 0553 DFA4 -- MOS38 0554 DFA4 GOIO -- MOS38 0555 DFA4 38 SEC -- MOS38 0556 DFA5 GO -- MOS38 0557 DFA5 08 PHP -- MOS38 0558 DFA6 A2 D4 LDXIM INFO +BKEXEC -FBLOCK ;stretch! -- MOS38 0559 DFA8 20 47 E3 JSR CLRFB -- MOS38 0560 DFAB 8D C3 03 STA INFO +BKEXEC +&01 ;default address = &00008000 -- MOS38 0561 DFAE 20 58 E3 JSR LSA ;replace with user address if present -- MOS38 0562 DFB1 28 PLP -- MOS38 0563 DFB2 90 08 BCC GETENV ;if *GO then use whole address MOS38 0563 DFB2 v77 MOS38 0564 DFB4 A9 FF LDAIM &FF MOS38 0563 DFB2 v77 MOS38 0565 DFB6 8D C4 03 STA INFO +BKEXEC +&02 MOS38 0563 DFB2 v77 MOS38 0566 DFB9 8D C5 03 STA INFO +BKEXEC +&03 ;else force an I/O processor address MOS38 0563 DFB2 v77 MOS38 0567 DFBC GETENV MOS38 0563 DFB2 v77 MOS38 0568 DFBC 20 CA E0 JSR SKIPSP ;get next argument -- MOS38 0569 DFBF F0 07 BEQ GOTO ;if CR then point tail at it MOS38 0569 DFBF v78 MOS38 0570 DFC1 C9 3B CMPIM ";" MOS38 0569 DFBF v78 MOS38 0571 DFC3 D0 03 BNE GOTO ;if not semicolon then point tail at it MOS38 0569 DFBF v78 MOS38 0572 DFC5 20 C9 E0 JSR SKIPSN ;else absorb semicolon once MOS38 0569 DFBF v78 MOS38 0573 DFC8 GOTO MOS38 0569 DFBF v78 MOS38 0574 DFC8 4C 08 F3 JMP RUNGO ;set up tail from Y and enter user code -- MOS38 0575 DFCB -- MOS38 0576 DFCB RETAIL ;return command line tail to OSARGS control block -- MOS38 0577 DFCB ;Y=high byte -- MOS38 0578 DFCB 94 01 STYZX &01 ;store in 3MSB -- MOS38 0579 DFCD AC D0 02 LDY TAILLO -- MOS38 0580 DFD0 94 00 STYZX &00 ;store low byte in MSB -- MOS38 0581 DFD2 A0 FF LDYIM &FF ;command line tail is always in I/O processor -- MOS38 0582 DFD4 94 02 STYZX &02 ;set high word to &FFFF -- MOS38 0583 DFD6 94 03 STYZX &03 -- MOS38 0584 DFD8 C8 INY ;Y=0 for return -- MOS38 0585 DFD9 [ TRUE = &00 -- MOS38 0586 DFD9 A9 DC LDAIM SEAL ;set conventional return value (conflicting documentation) -- MOS38 0587 DFDB ] -- MOS38 0588 DFDB 60 RTS -- MOS38 0589 DFDC -- MOS38 0590 DFDC COLHEX -- MOS38 0591 DFDC [ FALSE = &00 -- MOS38 0594 DFDC ] -- MOS38 0595 DFDC AE C2 03 LDX INFO +BKEXEC ;get selected slot to X MOS38 0702 E04A ^10 MOS38 0596 DFDF E0 10 CPXIM NROM ;does the slot have a table entry? MOS38 0702 E04A ^10 MOS38 0597 DFE1 [ TRUE = &00 MOS38 0702 E04A ^10 MOS38 0598 DFE1 B0 70 BCS FRIEZE ;[not in table] MOS38 0598 DFE1 v0F MOS38 0599 DFE3 | MOS38 0598 DFE1 v0F MOS38 0601 DFE3 ] MOS38 0598 DFE1 v0F MOS38 0602 DFE3 BD A1 02 LDAAX ROMS MOS38 0598 DFE1 v0F MOS38 0603 DFE6 10 6B BPL FRIEZE ;[not a service ROM] MOS38 0598 DFE1 v0F MOS38 0604 DFE8 ABACUS MOS38 0598 DFE1 v0F MOS38 0605 DFE8 A5 F4 LDA ROMID ;save current ROM MOS38 0598 DFE1 v0F MOS38 0606 DFEA 48 PHA MOS38 0598 DFE1 v0F MOS38 0607 DFEB 20 E7 DB JSR STXROM MOS38 0598 DFE1 v0F MOS38 0608 DFEE A9 04 LDAIM SVNAME MOS38 0598 DFE1 v0F MOS38 0609 DFF0 20 03 80 JSR ROMSFT ;call service ROM MOS38 0598 DFE1 v0F MOS38 0610 DFF3 AA TAX ;if ROM did not claim the call MOS38 0598 DFE1 v0F MOS38 0611 DFF4 D0 5D BNE FRIEZE ;then raise "Bad command" MOS38 0598 DFE1 v0F MOS38 0612 DFF6 4C 91 F1 JMP SVOP3 ;[service claimed, do not offer to other ROMs] MOS38 0598 DFE1 v0F MOS38 0613 DFF9 | MOS38 0598 DFE1 v0F MOS38 0622 DFF9 ] MOS38 0598 DFE1 v0F MOS38 0623 DFF9 ] MOS38 0598 DFE1 v0F MOS38 0624 DFF9 MOS38 0598 DFE1 v0F MOS38 0625 DFF9 [ MOS125 = &00 MOS38 0598 DFE1 v0F MOS38 0634 DFF9 ] MOS38 0598 DFE1 v0F MOS38 0635 DFF9 MOS38 0598 DFE1 v0F MOS38 0636 DFF9 [ MOS125 = &FF MOS38 0598 DFE1 v0F MOS38 0637 DFF9 | MOS38 0598 DFE1 v0F MOS38 0638 DFF9 CLINT MOS38 0598 DFE1 v0F MOS38 0639 DFF9 86 F2 STX WORK +&00 MOS38 0598 DFE1 v0F MOS38 0640 DFFB 84 F3 STY WORK +&01 MOS38 0598 DFE1 v0F MOS38 0641 DFFD ; report *command to filing system MOS38 0598 DFE1 v0F MOS38 0642 DFFD A9 08 LDAIM FSCLI MOS38 0598 DFE1 v0F MOS38 0643 DFFF 20 C6 E0 JSR JMIFSC MOS38 0598 DFE1 v0F MOS38 0644 E002 ; check line is terminated by CR MOS38 0598 DFE1 v0F MOS38 0645 E002 A0 00 LDYIM ZERO MOS38 0598 DFE1 v0F MOS38 0646 E004 A9 0D LDAIM MCR MOS38 0598 DFE1 v0F MOS38 0647 E006 D1 F2 CLICHK CMPIY WORK MOS38 0598 DFE1 v0F MOS38 0648 E008 F0 04 BEQ CLILOK ;[terminator present] MOS38 0598 DFE1 v0F MOS38 0649 E00A C8 INY MOS38 0598 DFE1 v0F MOS38 0650 E00B D0 F9 BNE CLICHK MOS38 0598 DFE1 v0F MOS38 0651 E00D ; no terminator within 256 bytes so ignore line MOS38 0598 DFE1 v0F MOS38 0652 E00D CLIRTS MOS38 0598 DFE1 v0F MOS38 0653 E00D 60 RTS MOS38 0598 DFE1 v0F MOS38 0654 E00E ; MOS38 0598 DFE1 v0F MOS38 0655 E00E A0 FF CLILOK LDYIM &FF ;start scan from beginning of input buffer MOS38 0598 DFE1 v0F MOS38 0656 E010 ; N.B. Y will now be incremented to ZERO by SKIPSN MOS38 0598 DFE1 v0F MOS38 0657 E010 CLIR ;skip leading spaces and asterisks MOS38 0598 DFE1 v0F MOS38 0658 E010 20 C9 E0 JSR SKIPSN ;skip spaces/asterisk and spaces MOS38 0598 DFE1 v0F MOS38 0659 E013 F0 F8 BEQ CLIRTS ;[reached end-of-line, ignore line] MOS38 0598 DFE1 v0F MOS38 0660 E015 C9 2A CMPIM SPLAT MOS38 0598 DFE1 v0F MOS38 0661 E017 F0 F7 BEQ CLIR ;[asterisk, ignore] MOS38 0598 DFE1 v0F MOS38 0662 E019 [ FALSE=0 MOS38 0598 DFE1 v0F MOS38 0666 E019 ] MOS38 0598 DFE1 v0F MOS38 0667 E019 ; ignore comment line MOS38 0598 DFE1 v0F MOS38 0668 E019 C9 7C CMPIM "|" MOS38 0598 DFE1 v0F MOS38 0669 E01B F0 F0 BEQ CLIRTS ;[*| command] MOS38 0598 DFE1 v0F MOS38 0670 E01D ; check for override MOS38 0598 DFE1 v0F MOS38 0671 E01D C9 2F CMPIM "/" MOS38 0598 DFE1 v0F MOS38 0672 E01F D0 09 BNE NOTSL ;[not /] MOS38 MOS38 MOS38 MOS38 Acorn macro assembler Page 74 MOS38 MOS38 CLI MOS38 MOS38 0598 DFE1 v0F MOS38 0673 E021 ; */name MOS38 0598 DFE1 v0F MOS38 0674 E021 C8 INY ;skip past / MOS38 0598 DFE1 v0F MOS38 0675 E022 20 95 E0 JSR CLIXY ;make XY -> after / MOS38 0598 DFE1 v0F MOS38 0676 E025 A9 02 LDAIM FSNOTA MOS38 0598 DFE1 v0F MOS38 0677 E027 [ MOS125 = &7F MOS38 0598 DFE1 v0F MOS38 0678 E027 [ STARGO = &00 MOS38 0598 DFE1 v0F MOS38 0679 E027 4C BF E0 JMP JMICMD ;[ALWAYS JUMP] MOS38 0598 DFE1 v0F MOS38 0680 E02A NOTSL MOS38 0598 DFE1 v0F MOS38 0681 E02A ; save pointer to rest of line MOS38 0598 DFE1 v0F MOS38 0682 E02A 84 E6 STY CLIRY MOS38 0598 DFE1 v0F MOS38 0683 E02C C9 3A CMPIM ":" MOS38 0598 DFE1 v0F MOS38 0684 E02E D0 26 BNE NOTCO MOS38 0598 DFE1 v0F MOS38 0685 E030 C8 INY ;skip past colon MOS38 0598 DFE1 v0F MOS38 0686 E031 [ TRUE = &00 MOS38 0598 DFE1 v0F MOS38 0687 E031 D1 F2 CMPIY WORK ;is there a second colon? MOS38 0598 DFE1 v0F MOS38 0688 E033 D0 21 BNE NOTCO ;reject if not MOS38 0598 DFE1 v0F MOS38 0689 E035 C8 INY ;skip past colon MOS38 0598 DFE1 v0F MOS38 0690 E036 ] MOS38 0598 DFE1 v0F MOS38 0691 E036 D1 F2 CMPIY WORK ;three colons? MOS38 0598 DFE1 v0F MOS38 0692 E038 D0 06 BNE COLON ;if not then get hex MOS38 0598 DFE1 v0F MOS38 0693 E03A 20 C9 E0 JSR SKIPSN ;else skip colon and spaces MOS38 0598 DFE1 v0F MOS38 0694 E03D 98 TYA ;command line offset to A MOS38 0598 DFE1 v0F MOS38 0695 E03E D0 7A BNE CLIFS ;pass rest of line via FSC 3 (always) MOS38 0695 E03E v05 MOS38 0696 E040 COLON MOS38 0695 E03E v05 MOS38 0697 E040 A2 D4 LDXIM INFO +BKEXEC -FBLOCK ;hopefully out of the way MOS38 0695 E03E v05 MOS38 0698 E042 20 58 E3 JSR LSA ;hex to scratch space MOS38 0695 E03E v05 MOS38 0699 E045 08 PHP ;save result MOS38 0695 E03E v05 MOS38 0700 E046 20 CA E0 JSR SKIPSP MOS38 0695 E03E v05 MOS38 0701 E049 28 PLP MOS38 0695 E03E v05 MOS38 0702 E04A B0 90 BCS COLHEX ;if hex present, call specific ROM MOS38 0695 E03E v05 MOS38 0703 E04C A2 04 LDXIM SVNAME ;else pass to service ROMs only MOS38 0695 E03E v05 MOS38 0704 E04E 20 75 F1 JSR SVOP MOS38 0695 E03E v05 MOS38 0705 E051 F0 50 BEQ SVACK MOS38 0695 E03E v05 MOS38 0706 E053 FRIEZE MOS38 0695 E03E v05 MOS38 0707 E053 4C 4A E4 JMP MBDCMD MOS38 0695 E03E v05 MOS38 0708 E056 NOTCO MOS38 0695 E03E v05 MOS38 0709 E056 | MOS38 0695 E03E v05 MOS38 0714 E056 ] MOS38 0695 E03E v05 MOS38 0715 E056 | MOS38 0695 E03E v05 MOS38 0720 E056 ] MOS38 0695 E03E v05 MOS38 0721 E056 ; X=&FF going to 0, point to start of table MOS38 0695 E03E v05 MOS38 0722 E056 A2 FF LDXIM &FF MOS38 0695 E03E v05 MOS38 0723 E058 CLIRST ; restart search at next keyword MOS38 0695 E03E v05 MOS38 0724 E058 A4 E6 LDY CLIRY ; reset pointer to start of user word MOS38 0695 E03E v05 MOS38 0725 E05A 88 DEY ;cancel first INY MOS38 0695 E03E v05 MOS38 0726 E05B CLIADV ; compare characters MOS38 0695 E03E v05 MOS38 0727 E05B C8 INY ; advance user word pointer MOS38 0695 E03E v05 MOS38 0728 E05C B1 F2 LDAIY WORK ; fetch user character MOS38 0695 E03E v05 MOS38 0729 E05E 29 DF ANDIM &DF ;equate cases MOS38 0695 E03E v05 MOS38 0730 E060 C9 5B CMPIM "Z"+&01 MOS38 0695 E03E v05 MOS38 0731 E062 90 02 BCC CLIALF ;if above "Z" MOS38 0695 E03E v05 MOS38 0732 E064 A9 00 LDAIM &00 ;then ensure A<&30, C=0 MOS38 0695 E03E v05 MOS38 0733 E066 C9 41 CLIALF CMPIM "A" ;C=1, "A"<=A<="Z" iff alpha MOS38 0695 E03E v05 MOS38 0734 E068 E8 INX ; advance table pointer or skip aux byte MOS38 0695 E03E v05 MOS38 0735 E069 5D C5 DE EORAX COMTAB ; set b7 from table and compare b6..0 MOS38 0695 E03E v05 MOS38 0736 E06C F0 ED BEQ CLIADV ;keywords must be all capital letters MOS38 0695 E03E v05 MOS38 0737 E06E B0 09 BCS CLISKP ;C=1, mismatch or end of keyword, reject MOS38 0695 E03E v05 MOS38 0738 E070 30 07 BMI CLISKP ;C=0, end of both words, accept MOS38 0695 E03E v05 MOS38 0739 E072 B1 F2 LDAIY WORK ;else end of user word, test for abbreviation MOS38 0695 E03E v05 MOS38 0740 E074 C8 INY ;move past the dot MOS38 0695 E03E v05 MOS38 0741 E075 49 2E EORIM "." MOS38 0695 E03E v05 MOS38 0742 E077 C9 01 CMPIM &01 ;C=1 iff not dot, reject MOS38 0695 E03E v05 MOS38 0743 E079 CLISKP MOS38 0695 E03E v05 MOS38 0744 E079 E8 INX ; skip high byte of action address MOS38 0695 E03E v05 MOS38 0745 E07A CLIALI ; align to keyword terminator MOS38 0695 E03E v05 MOS38 0746 E07A E8 INX ; advance table pointer or skip low byte of action address MOS38 0695 E03E v05 MOS38 0747 E07B BD C3 DE LDAAX COMTAB -&02 ; test table byte at original offset MOS38 0695 E03E v05 MOS38 0748 E07E 10 FA BPL CLIALI ;[not reached address hi-byte] MOS38 0695 E03E v05 MOS38 0749 E080 B0 2A BCS CLITMN ;if C=1, compare with next keyword MOS38 0695 E03E v05 MOS38 0750 E082 ;CLIMFN ;full name match MOS38 0695 E03E v05 MOS38 0751 E082 ; found CLI command match MOS38 0695 E03E v05 MOS38 0752 E082 ; construct JMI hi-byte value to command processing code MOS38 0695 E03E v05 MOS38 0753 E082 48 PHA MOS38 0695 E03E v05 MOS38 0754 E083 ; construct JMI lo-byte value to command processing code MOS38 0695 E03E v05 MOS38 0755 E083 BD C4 DE LDAAX COMTAB -&01 MOS38 0695 E03E v05 MOS38 0756 E086 48 PHA MOS38 0695 E03E v05 MOS38 0757 E087 ; skip spaces after command name MOS38 0695 E03E v05 MOS38 0758 E087 20 CA E0 JSR SKIPSP MOS38 0695 E03E v05 MOS38 0759 E08A 18 CLC ;C=0 used by FXN entry MOS38 0695 E03E v05 MOS38 0760 E08B 08 PHP ;status used by EXEC and SPOOL MOS38 0695 E03E v05 MOS38 0761 E08C ; (optionally) make XY -> rest of line MOS38 0695 E03E v05 MOS38 0762 E08C 20 90 E0 JSR CLIXYA MOS38 0695 E03E v05 MOS38 0763 E08F 40 RTI ;enter command processing routine MOS38 0695 E03E v05 MOS38 0764 E090 MOS38 0695 E03E v05 MOS38 0765 E090 MOS38 0695 E03E v05 MOS38 0766 E090 CLIXYA ;conditionally make XY -> rest of line MOS38 0695 E03E v05 MOS38 0767 E090 BD C5 DE LDAAX COMTAB MOS38 0695 E03E v05 MOS38 0768 E093 30 0E BMI CLIXY0 ;[keep Y = offset of rest of line from WORK] MOS38 0695 E03E v05 MOS38 0769 E095 CLIXY ;make XY -> rest of command line MOS38 0695 E03E v05 MOS38 0770 E095 98 TYA ;A = offset of rest of line MOS38 0695 E03E v05 MOS38 0771 E096 BC C5 DE LDYAX COMTAB ;Y := function code MOS38 0695 E03E v05 MOS38 0772 E099 CLIXY2 MOS38 0695 E03E v05 MOS38 0773 E099 18 CLC MOS38 0695 E03E v05 MOS38 0774 E09A 65 F2 ADC WORK ;N.B. C=1 => carry MOS38 0695 E03E v05 MOS38 0775 E09C AA TAX ;X = lo-byte of pointer to rest of line MOS38 0695 E03E v05 MOS38 0776 E09D 98 TYA ;A = function code MOS38 0695 E03E v05 MOS38 0777 E09E A4 F3 LDY WORK +&01 MOS38 0695 E03E v05 MOS38 0778 E0A0 90 01 BCC CLIXY1 ;[no carry] MOS38 0695 E03E v05 MOS38 0779 E0A2 ; carry MOS38 0695 E03E v05 MOS38 0780 E0A2 C8 INY MOS38 0695 E03E v05 MOS38 0781 E0A3 CLIXY1 ;N.B. Y = hi-byte of pointer to rest of line MOS38 0695 E03E v05 MOS38 0782 E0A3 CLIXY0 MOS38 0695 E03E v05 MOS38 0783 E0A3 SVACK ;command accepted by service ROM MOS38 0695 E03E v05 MOS38 0784 E0A3 60 RTS MOS38 0695 E03E v05 MOS38 0785 E0A4 MOS38 0695 E03E v05 MOS38 0786 E0A4 MOS38 0695 E03E v05 MOS38 0787 E0A4 BASIC ;select BASIC language ROM MOS38 0695 E03E v05 MOS38 0788 E0A4 AE 4B 02 LDX BROMID MOS38 0695 E03E v05 MOS38 0789 E0A7 30 06 BMI NBASIC ;[no BASIC ROM] MOS38 0695 E03E v05 MOS38 0790 E0A9 4C B5 DB JMP ILR2 ;enter BASIC ROM (N.B. A b0=1, enter with C=1) MOS38 0695 E03E v05 MOS38 0791 E0AC MOS38 0695 E03E v05 MOS38 0792 E0AC CLITMN MOS38 0695 E03E v05 MOS38 0793 E0AC 0A ASLA MOS38 0695 E03E v05 MOS38 0794 E0AD D0 A9 BNE CLIRST MOS38 0695 E03E v05 MOS38 0795 E0AF ;else fall through to CLIEND MOS38 0695 E03E v05 MOS38 0796 E0AF MOS38 0695 E03E v05 MOS38 0797 E0AF MOS38 0695 E03E v05 MOS38 0798 E0AF ;END OF MOS 1.25 MOS38 0695 E03E v05 MOS38 0799 E0AF ] MOS38 0695 E03E v05 MOS38 0800 E0AF MOS38 0695 E03E v05 MOS38 0801 E0AF LNK MOS39 MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 75 MOS39 MOS38 CLI MOS39 MOS38 0695 E03E v05 MOS39 0001 E0AF ; > MOS39 MOS38 0695 E03E v05 MOS39 0002 E0AF TTL MOS39 CLI MOS38 0695 E03E v05 MOS39 0003 E0AF OPT MOS39 MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 76 MOS39 MOS39 CLI MOS39 MOS38 0695 E03E v05 MOS39 0004 E0AF ;(c) 1981 ACORN MOS38 0695 E03E v05 MOS39 0005 E0AF ;BBC MOS MOS38 0695 E03E v05 MOS39 0006 E0AF ;Change record: MOS38 0695 E03E v05 MOS39 0007 E0AF ;004 29-Jul-81 MP Prototype version MOS38 0695 E03E v05 MOS39 0008 E0AF ;Author(s): MOS38 0695 E03E v05 MOS39 0009 E0AF ;PB Paul Bond MOS38 0695 E03E v05 MOS39 0010 E0AF ;MP Mike Prees MOS38 0695 E03E v05 MOS39 0011 E0AF MOS38 0695 E03E v05 MOS39 0012 E0AF MOS38 0695 E03E v05 MOS39 0013 E0AF NBASIC ;BASIC ROM not present so offer to service ROMs MOS38 0695 E03E v05 MOS39 0014 E0AF CLIEND ;entered here if command not recognised or does not exist MOS38 0695 E03E v05 MOS39 0015 E0AF ; offer command to service ROMs MOS38 0695 E03E v05 MOS39 0016 E0AF A4 E6 LDY CLIRY ;restore Y offset to point to command name MOS38 0695 E03E v05 MOS39 0017 E0B1 A2 04 LDXIM SVNAME MOS38 0695 E03E v05 MOS39 0018 E0B3 20 75 F1 JSR SVOP MOS38 0695 E03E v05 MOS39 0019 E0B6 F0 EB BEQ SVACK ;[accepted by service ROM] MOS38 0695 E03E v05 MOS39 0020 E0B8 ; command not accepted by a service ROM MOS38 0695 E03E v05 MOS39 0021 E0B8 ; so pass command to filing system MOS38 0695 E03E v05 MOS39 0022 E0B8 A5 E6 LDA CLIRY ;A = offset to command name MOS38 0695 E03E v05 MOS39 0023 E0BA [ MOS125 = &7F MOS38 0695 E03E v05 MOS39 0024 E0BA [ STARGO = &00 MOS38 0695 E03E v05 MOS39 0025 E0BA CLIFS MOS38 0695 E03E v05 MOS39 0026 E0BA ] MOS38 0695 E03E v05 MOS39 0027 E0BA ] MOS38 0695 E03E v05 MOS39 0028 E0BA 20 99 E0 JSR CLIXY2 ;make XY -> rest of line -- MOS39 0029 E0BD A9 03 LDAIM FSNAME -- MOS39 0030 E0BF [ MOS125 = &7F -- MOS39 0031 E0BF [ STARGO = &00 -- MOS39 0032 E0BF JMICMD -- MOS39 0033 E0BF ;entry for FSC calls 2,3,4,(11) -- MOS39 0034 E0BF ;cancel OSARGS 1 intercept, FS provides the tail pointer itself -- MOS39 0035 E0BF 48 PHA -- MOS39 0036 E0C0 A9 00 LDAIM &00 -- MOS39 0037 E0C2 8D D1 02 STA TAILHI -- MOS39 0038 E0C5 68 PLA -- MOS39 0039 E0C6 ] -- MOS39 0040 E0C6 ] -- MOS39 0041 E0C6 -- MOS39 0042 E0C6 JMIFSC -- MOS39 0043 E0C6 -- MOS39 0044 E0C6 6C 1E 02 JMI FSCVEC -- MOS39 0045 E0C9 [ MOS125 = &FF -- MOS39 0054 E0C9 ] -- MOS39 0055 E0C9 -- MOS39 0056 E0C9 -- MOS39 0057 E0C9 ; ignore space characters -- MOS39 0058 E0C9 C8 SKIPSN INY ;skip current character MOS39 0061 E0CE ^79 MOS39 0059 E0CA B1 F2 SKIPSP LDAIY WORK MOS39 0068 E0D3 ^75 MOS39 0060 E0CC C9 20 CMPIM SPACE MOS39 0068 E0D3 ^75 MOS39 0061 E0CE F0 F9 BEQ SKIPSN ;[character is space, ignore] MOS39 0068 E0D3 ^75 MOS39 0062 E0D0 C9 0D SKPSP1 CMPIM MCR MOS39 0073 E0DA ^74 MOS39 0063 E0D2 ; Z=1 next character is CR MOS39 0073 E0DA ^74 MOS39 0064 E0D2 ; Z=0 next character is not CR MOS39 0073 E0DA ^74 MOS39 0065 E0D2 60 RTS MOS39 0073 E0DA ^74 MOS39 0066 E0D3 SKPCM ;C=0 => check for line end MOS39 0073 E0DA ^74 MOS39 0067 E0D3 ;C=1 => skip optional comma and check for line end MOS39 0073 E0DA ^74 MOS39 0068 E0D3 90 F5 BCC SKIPSP MOS39 0073 E0DA ^74 MOS39 0069 E0D5 SKPCOM MOS39 0073 E0DA ^74 MOS39 0070 E0D5 ; skip spaces and an optional comma MOS39 0073 E0DA ^74 MOS39 0071 E0D5 20 CA E0 JSR SKIPSP MOS39 0073 E0DA ^74 MOS39 0072 E0D8 C9 2C CMPIM "," MOS39 0073 E0DA ^74 MOS39 0073 E0DA D0 F4 BNE SKPSP1 -- MOS39 0074 E0DC C8 INY ;N.B. force Z=0 (i.e. non-zero result) -- MOS39 0075 E0DD 60 RTS -- MOS39 0076 E0DE ; get decimal number -- MOS39 0077 E0DE [ MOS125 = &FF -- MOS39 0110 E0DE | -- MOS39 0111 E0DE GETNUM -- MOS39 0112 E0DE 20 CA E0 JSR SKIPSP ;skip leading spaces, A := delimiter -- MOS39 0113 E0E1 20 04 E1 JSR TSTNUM -- MOS39 0114 E0E4 B0 11 BCS GN0 MOS39 0114 E0E4 v6E MOS39 0115 E0E6 60 RTS ;C=0 [not a digit] MOS39 0114 E0E4 v6E MOS39 0116 E0E7 MOS39 0114 E0E4 v6E MOS39 0117 E0E7 GNT MOS39 0114 E0E4 v6E MOS39 0118 E0E7 E0 1A CPXIM &1A ;if 26 or more MOS39 0130 E0FD ^68 MOS39 0119 E0E9 B0 28 BCS TSTNR ;then overflow MOS39 0119 E0E9 v57 MOS39 0120 E0EB 06 E6 ASL NUMBER ;else double accumulated value MOS39 0119 E0E9 v57 MOS39 0121 E0ED 65 E6 ADC NUMBER ;C=0; A := N + 2*X MOS39 0119 E0E9 v57 MOS39 0122 E0EF 06 E6 ASL NUMBER ;quadruple accumulated value MOS39 0119 E0E9 v57 MOS39 0123 E0F1 65 E6 ADC NUMBER ;C=0; A := N + 6*X MOS39 0119 E0E9 v57 MOS39 0124 E0F3 65 E6 ADC NUMBER ;C=0; A := N + 10*X MOS39 0119 E0E9 v57 MOS39 0125 E0F5 B0 1C BCS TSTNR ;[overflow] MOS39 0119 E0E9 v57 MOS39 0126 E0F7 GN0 MOS39 0119 E0E9 v57 MOS39 0127 E0F7 85 E6 STA NUMBER ;NUMBER := accumulated number so far (must save for KEY) MOS39 0119 E0E9 v57 MOS39 0128 E0F9 AA TAX MOS39 0119 E0E9 v57 MOS39 0129 E0FA 20 03 E1 JSR TSTNUX ;read digit skipping current character MOS39 0119 E0E9 v57 MOS39 0130 E0FD B0 E8 BCS GNT ;process digit [non-digit serves as terminator] MOS39 0119 E0E9 v57 MOS39 0131 E0FF C9 0D CMPIM MCR MOS39 0119 E0E9 v57 MOS39 0132 E101 TSTNRG MOS39 0119 E0E9 v57 MOS39 0133 E101 38 SEC MOS39 0119 E0E9 v57 MOS39 0134 E102 ; return with: MOS39 0119 E0E9 v57 MOS39 0135 E102 ; C=1 => valid number, Z=1/0 => delimiter is/is_not CR, number in X MOS39 0119 E0E9 v57 MOS39 0136 E102 60 RTS MOS39 0119 E0E9 v57 MOS39 0137 E103 ] MOS39 0119 E0E9 v57 MOS39 0138 E103 MOS39 0119 E0E9 v57 MOS39 0139 E103 ; check character is a digit MOS39 0119 E0E9 v57 MOS39 0140 E103 TSTNUX MOS39 0119 E0E9 v57 MOS39 0141 E103 C8 INY ;skip current character MOS39 0119 E0E9 v57 MOS39 0142 E104 TSTNUM MOS39 0119 E0E9 v57 MOS39 0143 E104 B1 F2 LDAIY WORK ;get next character MOS39 0119 E0E9 v57 MOS39 0144 E106 [ MOS125 = &FF MOS39 0119 E0E9 v57 MOS39 0152 E106 | MOS39 0119 E0E9 v57 MOS39 0153 E106 49 30 EORIM "0" ;convert digit to number, all other chars higher MOS39 0119 E0E9 v57 MOS39 0154 E108 C9 0A CMPIM &0A ;if number in range 0..9 MOS39 0119 E0E9 v57 MOS39 0155 E10A 90 F5 BCC TSTNRG ;then return C=1, A=valid number MOS39 0119 E0E9 v57 MOS39 0156 E10C 49 30 EORIM "0" ;else restore other character MOS39 0119 E0E9 v57 MOS39 0157 E10E 18 CLC ;return C=0, not a digit MOS39 0119 E0E9 v57 MOS39 0158 E10F 60 RTS MOS39 0119 E0E9 v57 MOS39 0159 E110 ] MOS39 0119 E0E9 v57 MOS39 0160 E110 MOS39 0119 E0E9 v57 MOS39 0161 E110 TSTNRX MOS39 0119 E0E9 v57 MOS39 0162 E110 20 D5 E0 JSR SKPCOM MOS39 0119 E0E9 v57 MOS39 0163 E113 TSTNR MOS39 0119 E0E9 v57 MOS39 0164 E113 18 CLC MOS39 0185 E122 ^6C MOS39 0165 E114 ; C=0 bad number, A = delimiting character MOS39 0185 E122 ^6C MOS39 0166 E114 60 RTS MOS39 0185 E122 ^6C MOS39 0167 E115 MOS39 0185 E122 ^6C MOS39 0168 E115 TSTHEX ;test for, and convert, hex digit MOS39 0185 E122 ^6C MOS39 0169 E115 20 04 E1 JSR TSTNUM MOS39 0185 E122 ^6C MOS39 0170 E118 B0 0A BCS TSTH0 ;[is a number, therefore a valid hex digit] MOS39 0185 E122 ^6C MOS39 0171 E11A 29 DF ANDIM &DF ;force upper case MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 77 MOS39 MOS39 CLI MOS39 MOS39 0185 E122 ^6C MOS39 0172 E11C [ MOS125 = &FF MOS39 0185 E122 ^6C MOS39 0180 E11C | MOS39 0185 E122 ^6C MOS39 0181 E11C 08 PHP ;C=0; save V MOS39 0185 E122 ^6C MOS39 0182 E11D 69 B9 ADCIM &B9 ;= &FA - 'A' MOS39 0185 E122 ^6C MOS39 0183 E11F 28 PLP ;restore V MOS39 0185 E122 ^6C MOS39 0184 E120 C9 FA CMPIM &FA ;b7..4 = %1111, discarded MOS39 0185 E122 ^6C MOS39 0185 E122 90 EC BCC TSTNRX ;[<>'A'-'F' so fail] MOS39 0170 E118 v75 MOS39 0186 E124 ] MOS39 0170 E118 v75 MOS39 0187 E124 ; C=1 MOS39 0170 E118 v75 MOS39 0188 E124 TSTH0 ;C=1 MOS39 0170 E118 v75 MOS39 0189 E124 C8 INY -- MOS39 0190 E125 60 RTS -- MOS39 0191 E126 -- MOS39 0192 E126 -- MOS39 0193 E126 [ MOS125 = &FF -- MOS39 0194 E126 | -- MOS39 0195 E126 ;REM (and entangled routines) moved up the ROM -- MOS39 0196 E126 ;to denote compatibility with both the documentation -- MOS39 0197 E126 ;(AUG p.263, NAUG p.137) and the non-compliant OS: -- MOS39 0198 E126 ;V=0, REMOV returns the byte in A (for internal calls) -- MOS39 0199 E126 ; and in Y (for OSBYTE &91 and as documented); -- MOS39 0200 E126 ;V=1, EXAM returns the byte in A (for internal calls -- MOS39 0201 E126 ; and as documented) and in Y (for OSBYTE &98). -- MOS39 0202 E126 ;Location &022D in the I/O processor NOT containing values -- MOS39 0203 E126 ;&E4 or &E5 indicates conformance with the above. -- MOS39 0204 E126 ;(If fetching this value across the Tube is expensive, -- MOS39 0205 E126 ;calling OSBYTE with A=0, X=1 and receiving X<>1 rules out -- MOS39 0206 E126 ;a faulty implementation so that REMV need only be tested -- MOS39 0207 E126 ;when X=1 is returned.) -- MOS39 0208 E126 REM -- MOS39 0209 E126 [ $Tutu -- MOS39 0212 E126 | -- MOS39 0213 E126 ; disable interrupts -- MOS39 0214 E126 08 PHP -- MOS39 0215 E127 78 SEI -- MOS39 0216 E128 ] -- MOS39 0217 E128 ; get buffer start pointer -- MOS39 0218 E128 BD D8 02 LDAAX BFSTRT -- MOS39 0219 E12B DD E1 02 CMPAX BFEND -- MOS39 0220 E12E F0 53 BEQ REMOV1 MOS39 0220 E12E v2C MOS39 0221 E130 A8 TAY ;Y := buffer start pointer MOS39 0220 E12E v2C MOS39 0222 E131 ; set buffer pointer MOS39 0220 E12E v2C MOS39 0223 E131 20 89 E5 JSR SETBUF MOS39 0220 E12E v2C MOS39 0224 E134 ; remove character from buffer MOS39 0220 E12E v2C MOS39 0225 E134 B1 FA LDAIY BUFFLO MOS39 0220 E12E v2C MOS39 0226 E136 70 1A BVS REMOV3 ;[examine option, exit with character] MOS39 0220 E12E v2C MOS39 0227 E138 48 PHA ;push character MOS39 0220 E12E v2C MOS39 0228 E139 ; update buffer start pointer MOS39 0220 E12E v2C MOS39 0229 E139 C8 INY MOS39 0220 E12E v2C MOS39 0230 E13A 98 TYA MOS39 0220 E12E v2C MOS39 0231 E13B D0 03 BNE REMOV2 MOS39 0220 E12E v2C MOS39 0232 E13D ; wraparound MOS39 0220 E12E v2C MOS39 0233 E13D BD 80 E5 LDAAX BFORG MOS39 0220 E12E v2C MOS39 0234 E140 REMOV2 MOS39 0220 E12E v2C MOS39 0235 E140 9D D8 02 STAAX BFSTRT MOS39 0220 E12E v2C MOS39 0236 E143 ; check for removal of last character in buffer MOS39 0220 E12E v2C MOS39 0237 E143 ; N.B. this code is only executed for the remove option MOS39 0220 E12E v2C MOS39 0238 E143 E0 02 CPXIM OUTPUT MOS39 0220 E12E v2C MOS39 0239 E145 90 0A BCC REMOV4 ;[input buffer, buffer empty event not applicable] MOS39 0220 E12E v2C MOS39 0240 E147 DD E1 02 CMPAX BFEND MOS39 0220 E12E v2C MOS39 0241 E14A D0 05 BNE REMOV4 ;[not last character] MOS39 0220 E12E v2C MOS39 0242 E14C ; signal buffer empty event MOS39 0220 E12E v2C MOS39 0243 E14C A0 00 LDYIM EVMPTY MOS39 0220 E12E v2C MOS39 0244 E14E 20 86 E1 JSR EVENT MOS39 0220 E12E v2C MOS39 0245 E151 REMOV4 MOS39 0220 E12E v2C MOS39 0246 E151 68 PLA ;restore character read MOS39 0220 E12E v2C MOS39 0247 E152 REMOV3 ;return with C=0 indicating removal successful MOS39 0220 E12E v2C MOS39 0248 E152 A8 TAY ;Y := character MOS39 0220 E12E v2C MOS39 0249 E153 28 PLP ;restore interrupt state MOS39 0220 E12E v2C MOS39 0250 E154 18 CLC MOS39 0220 E12E v2C MOS39 0251 E155 60 RTS MOS39 0220 E12E v2C MOS39 0252 E156 MOS39 0220 E12E v2C MOS39 0253 E156 MOS39 0220 E12E v2C MOS39 0254 E156 INS MOS39 0220 E12E v2C MOS39 0255 E156 ; A = character MOS39 0220 E12E v2C MOS39 0256 E156 ; X = buffer index MOS39 0220 E12E v2C MOS39 0257 E156 [ $Tutu MOS39 0220 E12E v2C MOS39 0260 E156 | MOS39 0220 E12E v2C MOS39 0261 E156 ; disable interrupts MOS39 0220 E12E v2C MOS39 0262 E156 08 PHP MOS39 0220 E12E v2C MOS39 0263 E157 78 SEI MOS39 0220 E12E v2C MOS39 0264 E158 ] MOS39 0220 E12E v2C MOS39 0265 E158 ; save character MOS39 0220 E12E v2C MOS39 0266 E158 48 PHA MOS39 0220 E12E v2C MOS39 0267 E159 ; construct buffer end offset in Y MOS39 0220 E12E v2C MOS39 0268 E159 BC E1 02 LDYAX BFEND MOS39 0220 E12E v2C MOS39 0269 E15C C8 INY MOS39 0220 E12E v2C MOS39 0270 E15D D0 03 BNE INSRT2 MOS39 0220 E12E v2C MOS39 0271 E15F ; buffer wraparound MOS39 0220 E12E v2C MOS39 0272 E15F BC 80 E5 LDYAX BFORG MOS39 0220 E12E v2C MOS39 0273 E162 INSRT2 MOS39 0220 E12E v2C MOS39 0274 E162 98 TYA MOS39 0220 E12E v2C MOS39 0275 E163 DD D8 02 CMPAX BFSTRT MOS39 0220 E12E v2C MOS39 0276 E166 F0 0F BEQ INSRT1 ;[buffer full] MOS39 0220 E12E v2C MOS39 0277 E168 ; update buffer end pointer MOS39 0220 E12E v2C MOS39 0278 E168 BC E1 02 LDYAX BFEND MOS39 0220 E12E v2C MOS39 0279 E16B 9D E1 02 STAAX BFEND MOS39 0220 E12E v2C MOS39 0280 E16E ; construct buffer pointer MOS39 0220 E12E v2C MOS39 0281 E16E 20 89 E5 JSR SETBUF MOS39 0220 E12E v2C MOS39 0282 E171 ; store character in buffer MOS39 0220 E12E v2C MOS39 0283 E171 68 PLA ;A := character MOS39 0220 E12E v2C MOS39 0284 E172 91 FA STAIY BUFFLO MOS39 0220 E12E v2C MOS39 0285 E174 ; return with C=0 => insert successful MOS39 0220 E12E v2C MOS39 0286 E174 28 PLP ;restore interrupt state MOS39 0220 E12E v2C MOS39 0287 E175 18 CLC MOS39 0220 E12E v2C MOS39 0288 E176 60 RTS MOS39 0220 E12E v2C MOS39 0289 E177 MOS39 0220 E12E v2C MOS39 0290 E177 INSRT1 ;signal buffer full event MOS39 0220 E12E v2C MOS39 0291 E177 68 PLA ;restore character MOS39 0220 E12E v2C MOS39 0292 E178 E0 02 CPXIM OUTPUT MOS39 0220 E12E v2C MOS39 0293 E17A B0 07 BCS INOBUF ;[output buffer, buffer full event not applicable] MOS39 0220 E12E v2C MOS39 0294 E17C ; signal input buffer full event MOS39 0220 E12E v2C MOS39 0295 E17C A0 01 LDYIM EVFULL MOS39 0220 E12E v2C MOS39 0296 E17E 20 86 E1 JSR EVENT ;A=character, X=bufferid MOS39 0220 E12E v2C MOS39 0297 E181 ; (N.B. does not corrupt A, should not corrupt X) MOS39 0220 E12E v2C MOS39 0298 E181 48 PHA ;compensate for following PLA MOS39 0220 E12E v2C MOS39 0299 E182 EVENT0 ;indicate event was disabled MOS39 0220 E12E v2C MOS39 0300 E182 68 PLA MOS39 0220 E12E v2C MOS39 0301 E183 INOBUF ;output buffer, buffer full event not applicable MOS39 0220 E12E v2C MOS39 0302 E183 REMOV1 ;return with C=1 => insert/remove failed due to buffer full/empty MOS39 0220 E12E v2C MOS39 0303 E183 28 PLP ;restore interrupt state MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 78 MOS39 MOS39 CLI MOS39 MOS39 0315 E18E ^72 MOS39 0304 E184 38 SEC MOS39 0315 E18E ^72 MOS39 0305 E185 60 RTS MOS39 0315 E18E ^72 MOS39 0306 E186 MOS39 0315 E18E ^72 MOS39 0307 E186 MOS39 0315 E18E ^72 MOS39 0308 E186 EVENT ;signal event given by Y, optional arguments given in A & X MOS39 0315 E18E ^72 MOS39 0309 E186 ; this routine must not corrupt A MOS39 0315 E18E ^72 MOS39 0310 E186 08 PHP MOS39 0315 E18E ^72 MOS39 0311 E187 78 SEI MOS39 0315 E18E ^72 MOS39 0312 E188 48 PHA ;save A MOS39 0315 E18E ^72 MOS39 0313 E189 85 FA STA EVENTA ;save A MOS39 0315 E18E ^72 MOS39 0314 E18B B9 BF 02 LDAAY EVENTS MOS39 0315 E18E ^72 MOS39 0315 E18E F0 F2 BEQ EVENT0 ;[event disabled] -- MOS39 0316 E190 ; event enabled, call event routine -- MOS39 0317 E190 98 TYA ;A = event code -- MOS39 0318 E191 A4 FA LDY EVENTA ;Y := argument passed originally in A -- MOS39 0319 E193 20 D8 F0 JSR JMIEVT ;A = event code, must not corrupt X -- MOS39 0320 E196 68 PLA ;restore A -- MOS39 0321 E197 28 PLP -- MOS39 0322 E198 18 CLC ;indicate event was enabled -- MOS39 0323 E199 60 RTS -- MOS39 0324 E19A -- MOS39 0325 E19A CKESCY ;insert character in Y into buffer -- MOS39 0326 E19A ; -- MOS39 0327 E19A ; signal input event -- MOS39 0328 E19A ; -- MOS39 0329 E19A 98 TYA ;A := character MOS39 0353 E1B4 ^64 MOS39 0330 E19B A0 02 LDYIM EVKYBD MOS39 0353 E1B4 ^64 MOS39 0331 E19D 20 86 E1 JSR EVENT ;assumes A and X not corrupted MOS39 0353 E1B4 ^64 MOS39 0332 E1A0 A8 TAY MOS39 0353 E1B4 ^64 MOS39 0333 E1A1 INSERT ;FX call to insert character into buffer MOS39 0353 E1B4 ^64 MOS39 0334 E1A1 98 TYA MOS39 0353 E1B4 ^64 MOS39 0335 E1A2 INSRT ;insert character into buffer MOS39 0353 E1B4 ^64 MOS39 0336 E1A2 ; MOS39 0353 E1B4 ^64 MOS39 0337 E1A2 6C 2A 02 JMI INSVEC ;use indirection (defaults to INS) MOS39 0353 E1B4 ^64 MOS39 0338 E1A5 ; MOS39 0353 E1B4 ^64 MOS39 0339 E1A5 RDCHS ;insert character into RDCH (keyboard) buffer MOS39 0353 E1B4 ^64 MOS39 0340 E1A5 A2 00 LDXIM BRDCH MOS39 0353 E1B4 ^64 MOS39 0341 E1A7 RNSRT MOS39 0353 E1B4 ^64 MOS39 0342 E1A7 ; insert character Y into buffer whose index is X, MOS39 0353 E1B4 ^64 MOS39 0343 E1A7 ; checking for the interrupt character (default ASCII escape) MOS39 0353 E1B4 ^64 MOS39 0344 E1A7 ; MOS39 0353 E1B4 ^64 MOS39 0345 E1A7 ; RS423 8 bit does not detect interrupt character MOS39 0353 E1B4 ^64 MOS39 0346 E1A7 8A TXA MOS39 0353 E1B4 ^64 MOS39 0347 E1A8 2D 45 02 AND RS8BIT MOS39 0353 E1B4 ^64 MOS39 0348 E1AB D0 F4 BNE INSERT ;[RSI & RS423-8-bit, no input event] MOS39 0353 E1B4 ^64 MOS39 0349 E1AD ; MOS39 0353 E1B4 ^64 MOS39 0350 E1AD 98 TYA MOS39 0353 E1B4 ^64 MOS39 0351 E1AE 4D 6C 02 EOR INTCH ;default INTCH is ESC MOS39 0353 E1B4 ^64 MOS39 0352 E1B1 0D 75 02 ORA ESCHAR ;treat as character? MOS39 0353 E1B4 ^64 MOS39 0353 E1B4 D0 E4 BNE CKESCY ;[not escape character or let escape thru, take no action] -- MOS39 0354 E1B6 ; -- MOS39 0355 E1B6 ; ESC detected - ignore ? -- MOS39 0356 E1B6 AD 58 02 LDA CRIT -- MOS39 0357 E1B9 6A RORA -- MOS39 0358 E1BA 98 TYA ;A := character -- MOS39 0359 E1BB B0 0A BCS CLCRTS ;[ignore escape] MOS39 0359 E1BB v75 MOS39 0360 E1BD ; MOS39 0359 E1BB v75 MOS39 0361 E1BD A0 06 LDYIM EVESC MOS39 0359 E1BB v75 MOS39 0362 E1BF 20 86 E1 JSR EVENT ;N.B. does not corrupt A MOS39 0359 E1BB v75 MOS39 0363 E1C2 90 03 BCC CKESC1 ;[event was enabled, no need to take default action] MOS39 0359 E1BB v75 MOS39 0364 E1C4 ; MOS39 0359 E1BB v75 MOS39 0365 E1C4 ; event was disabled, so take default action MOS39 0359 E1BB v75 MOS39 0366 E1C4 ; default escape routine MOS39 0359 E1BB v75 MOS39 0367 E1C4 ; C=1 MOS39 0359 E1BB v75 MOS39 0368 E1C4 20 06 E7 JSR CESCPS ;set escape flag **** MUST USE ROUTINE CESCPS **** MOS39 0359 E1BB v75 MOS39 0369 E1C7 CKESC1 ;character 'inserted' successfully MOS39 0359 E1BB v75 MOS39 0370 E1C7 CLCRTS MOS39 0359 E1BB v75 MOS39 0371 E1C7 18 CLC -- MOS39 0372 E1C8 ; C=0 => character inserted OK, C=1 => character not inserted -- MOS39 0373 E1C8 60 RTS ;RETURN - do not insert ESC into buffer -- MOS39 0374 E1C9 ] -- MOS39 0375 E1C9 -- MOS39 0376 E1C9 WRCH ;system write character -- MOS39 0377 E1C9 [ MOS125 = &FF -- MOS39 0378 E1C9 | -- MOS39 0379 E1C9 18 CLC ;don't sink after null NETV, don't print w/o VDU -- MOS39 0380 E1CA ] -- MOS39 0381 E1CA 48 PHA ;save character on stack -- MOS39 0382 E1CB 8A TXA ;save registers -- MOS39 0383 E1CC 48 PHA -- MOS39 0384 E1CD 98 TYA -- MOS39 0385 E1CE 48 PHA -- MOS39 0386 E1CF BA TSX -- MOS39 0387 E1D0 BD 03 01 LDAAX &0103 ;restore character -- MOS39 0388 E1D3 48 PHA -- MOS39 0389 E1D4 ; A = character -- MOS39 0390 E1D4 -- MOS39 0391 E1D4 ; examine WRCH selection(s) -- MOS39 0392 E1D4 ; -- MOS39 0393 E1D4 2C 60 02 BIT NETWRC -- MOS39 0394 E1D7 10 08 BPL WRCNTN ;[WRCH not to net] MOS39 0394 E1D7 v77 MOS39 0395 E1D9 ; WRCH to net MOS39 0394 E1D7 v77 MOS39 0396 E1D9 ; A = character MOS39 0394 E1D7 v77 MOS39 0397 E1D9 A8 TAY ;send character in Y MOS39 0394 E1D7 v77 MOS39 0398 E1DA A9 04 LDAIM NTWRCH MOS39 0394 E1D7 v77 MOS39 0399 E1DC 20 12 E6 JSR JMINET ;WRCH thru net MOS39 0394 E1D7 v77 MOS39 0400 E1DF B0 51 BCS WRCHNN ;[immediate return to caller] MOS39 0400 E1DF v2E MOS39 0401 E1E1 ; MOS39 0400 E1DF v2E MOS39 0402 E1E1 ; continue within WRCH MOS39 0400 E1DF v2E MOS39 0403 E1E1 ; MOS39 0400 E1DF v2E MOS39 0404 E1E1 WRCNTN MOS39 0400 E1DF v2E MOS39 0405 E1E1 MOS39 0400 E1DF v2E MOS39 0406 E1E1 [ MOS125 = &FF MOS39 0400 E1DF v2E MOS39 0408 E1E1 ] MOS39 0400 E1DF v2E MOS39 0409 E1E1 A9 02 LDAIM WRVDU MOS39 0400 E1DF v2E MOS39 0410 E1E3 2C 7C 02 BIT WRCHSW MOS39 0400 E1DF v2E MOS39 0411 E1E6 D0 05 BNE WRCHNV ;[WRCH not to VDU] MOS39 0400 E1DF v2E MOS39 0412 E1E8 ; WRCH to VDU MOS39 0400 E1DF v2E MOS39 0413 E1E8 68 PLA MOS39 0400 E1DF v2E MOS39 0414 E1E9 48 PHA ;A := character MOS39 0400 E1DF v2E MOS39 0415 E1EA 20 C0 C4 JSR VDU MOS39 0400 E1DF v2E MOS39 0416 E1ED ; C=0 => VDU says do not print character MOS39 0400 E1DF v2E MOS39 0417 E1ED WRCHNV ;WRCH not to VDU MOS39 0400 E1DF v2E MOS39 0418 E1ED MOS39 0400 E1DF v2E MOS39 0419 E1ED ; C=0 => VDU (if selected) says do not print character MOS39 0400 E1DF v2E MOS39 0420 E1ED ; check who controls printing MOS39 0400 E1DF v2E MOS39 0421 E1ED A9 08 LDAIM WRPRNT MOS39 0400 E1DF v2E MOS39 0422 E1EF 2C 7C 02 BIT WRCHSW MOS39 0400 E1DF v2E MOS39 0423 E1F2 D0 02 BNE WRCHNC ;[printing not controlled by VDU] MOS39 0400 E1DF v2E MOS39 0424 E1F4 ; printing controlled by VDU MOS39 0400 E1DF v2E MOS39 0425 E1F4 90 05 BCC WRCHNP ;[VDU says do not print character] MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 79 MOS39 MOS39 CLI MOS39 MOS39 0400 E1DF v2E MOS39 0426 E1F6 WRCHNC ;conditionally print character MOS39 0400 E1DF v2E MOS39 0427 E1F6 68 PLA MOS39 0400 E1DF v2E MOS39 0428 E1F7 48 PHA ;A := character MOS39 0400 E1DF v2E MOS39 0429 E1F8 20 39 E2 JSR MPRINT ;conditionally print character MOS39 0400 E1DF v2E MOS39 0430 E1FB WRCHNP ;do not print character MOS39 0400 E1DF v2E MOS39 0431 E1FB MOS39 0400 E1DF v2E MOS39 0432 E1FB ; check for output to RS423 MOS39 0400 E1DF v2E MOS39 0433 E1FB ; MOS39 0400 E1DF v2E MOS39 0434 E1FB [ FALSE=0 MOS39 0400 E1DF v2E MOS39 0438 E1FB | MOS39 0400 E1DF v2E MOS39 0439 E1FB AD 7C 02 LDA WRCHSW MOS39 0400 E1DF v2E MOS39 0440 E1FE 6A RORA ;**************** ASSUME WRRS = 1 **************** MOS39 0400 E1DF v2E MOS39 0441 E1FF 90 1B BCC WRCHNR ;[RS423 disabled] MOS39 0400 E1DF v2E MOS39 0442 E201 ] MOS39 0400 E1DF v2E MOS39 0443 E201 MOS39 0400 E1DF v2E MOS39 0444 E201 ; WRCH via RS423 MOS39 0400 E1DF v2E MOS39 0445 E201 A4 EA LDY RSTUT MOS39 0400 E1DF v2E MOS39 0446 E203 88 DEY MOS39 0400 E1DF v2E MOS39 0447 E204 10 16 BPL WRCHNR ;[RS423 managed by CFS, ignore WRCH request] MOS39 0400 E1DF v2E MOS39 0448 E206 68 PLA MOS39 0400 E1DF v2E MOS39 0449 E207 48 PHA ;A := character MOS39 0400 E1DF v2E MOS39 0450 E208 ; MOS39 0400 E1DF v2E MOS39 0451 E208 08 PHP MOS39 0400 E1DF v2E MOS39 0452 E209 78 SEI MOS39 0400 E1DF v2E MOS39 0453 E20A A2 02 LDXIM BRSO MOS39 0400 E1DF v2E MOS39 0454 E20C 48 PHA MOS39 0400 E1DF v2E MOS39 0455 E20D 20 94 E5 JSR EXAM MOS39 0400 E1DF v2E MOS39 0456 E210 90 03 BCC WRCNP1 ;[buffer not empty] MOS39 0400 E1DF v2E MOS39 0457 E212 ; RS423 output buffer empty MOS39 0400 E1DF v2E MOS39 0458 E212 20 CD E2 JSR RSBUSY ;enable RS423 Tx interrupts MOS39 0400 E1DF v2E MOS39 0459 E215 WRCNP1 MOS39 0400 E1DF v2E MOS39 0460 E215 68 PLA MOS39 0400 E1DF v2E MOS39 0461 E216 A2 02 LDXIM BRSO MOS39 0400 E1DF v2E MOS39 0462 E218 20 31 E3 JSR WRITE ;insert character into RS423 output buffer, waiting if necessary MOS39 0400 E1DF v2E MOS39 0463 E21B ; N.B. WRITE disables interrupts MOS39 0400 E1DF v2E MOS39 0464 E21B ; character not inserted if ESCAPE detected MOS39 0400 E1DF v2E MOS39 0465 E21B 28 PLP MOS39 0400 E1DF v2E MOS39 0466 E21C ; MOS39 0400 E1DF v2E MOS39 0467 E21C WRCHNR ;not via RS423 MOS39 0400 E1DF v2E MOS39 0468 E21C MOS39 0400 E1DF v2E MOS39 0469 E21C ; check for spooling enabled MOS39 0400 E1DF v2E MOS39 0470 E21C ; check whether spooling active MOS39 0400 E1DF v2E MOS39 0471 E21C A9 10 LDAIM WRSPL MOS39 0400 E1DF v2E MOS39 0472 E21E 2C 7C 02 BIT WRCHSW MOS39 0400 E1DF v2E MOS39 0473 E221 D0 0F BNE WRCHNS ;[spooling disabled] MOS39 0400 E1DF v2E MOS39 0474 E223 ; spool character MOS39 0400 E1DF v2E MOS39 0475 E223 AC 57 02 LDY SPOOLH MOS39 0400 E1DF v2E MOS39 0476 E226 F0 0A BEQ WRCHNS ;[spooling not active] MOS39 0400 E1DF v2E MOS39 0477 E228 ; spooling active MOS39 0400 E1DF v2E MOS39 0478 E228 ; write byte to spool file MOS39 0400 E1DF v2E MOS39 0479 E228 68 PLA MOS39 0400 E1DF v2E MOS39 0480 E229 48 PHA ;A := character MOS39 0400 E1DF v2E MOS39 0481 E22A ; MOS39 0400 E1DF v2E MOS39 0482 E22A 38 SEC MOS39 0400 E1DF v2E MOS39 0483 E22B 66 EB ROR ESSEMA ;enter critical region MOS39 0400 E1DF v2E MOS39 0484 E22D 20 D4 FF JSR OSBPUT MOS39 0400 E1DF v2E MOS39 0485 E230 46 EB LSR ESSEMA ;exit critical region MOS39 0400 E1DF v2E MOS39 0486 E232 WRCHNS ;no spooling MOS39 0400 E1DF v2E MOS39 0487 E232 MOS39 0400 E1DF v2E MOS39 0488 E232 WRCHNN MOS39 0400 E1DF v2E MOS39 0489 E232 ; exit restoring registers MOS39 0400 E1DF v2E MOS39 0490 E232 68 PLA ;pull redundant byte -- MOS39 0491 E233 [ MOS125 = &FF -- MOS39 0492 E233 | -- MOS39 0493 E233 PLYXAR -- MOS39 0494 E233 ] -- MOS39 0495 E233 68 PLA -- MOS39 0496 E234 A8 TAY -- MOS39 0497 E235 68 PLA -- MOS39 0498 E236 AA TAX -- MOS39 0499 E237 68 PLA ;restore character -- MOS39 0500 E238 60 RTS -- MOS39 0501 E239 -- MOS39 0502 E239 MPRINT ;conditionally print character in A -- MOS39 0503 E239 ; N.B. character should never be NUL -- MOS39 0504 E239 ; decide whether to ignore character -- MOS39 0505 E239 2C 7C 02 BIT WRCHSW -- MOS39 0506 E23C 70 20 BVS PRINT0 ;[only print thru VDU1] MOS39 0506 E23C v5F MOS39 0507 E23E CD 86 02 CMP PIGNOR MOS39 0506 E23C v5F MOS39 0508 E241 F0 1B BEQ PRINT0 ;[match on printer ignore character] MOS39 0506 E23C v5F MOS39 0509 E243 ; MOS39 0506 E23C v5F MOS39 0510 E243 ; MOS39 0506 E23C v5F MOS39 0511 E243 ; ====== MOS39 0506 E23C v5F MOS39 0512 E243 ; PRINT MOS39 0506 E23C v5F MOS39 0513 E243 ; ====== MOS39 0506 E23C v5F MOS39 0514 E243 ; MOS39 0506 E23C v5F MOS39 0515 E243 ; Print a character via VDU 1 MOS39 0506 E23C v5F MOS39 0516 E243 ; MOS39 0506 E23C v5F MOS39 0517 E243 ; ENTRY:- A = Character MOS39 0506 E23C v5F MOS39 0518 E243 ; MOS39 0506 E23C v5F MOS39 0519 E243 ; EXIT:- A,X,Y corrupt MOS39 0506 E23C v5F MOS39 0520 E243 ; Flags preserved MOS39 0506 E23C v5F MOS39 0521 E243 ; MOS39 0506 E23C v5F MOS39 0522 E243 PRINT ;used by VDU (SOH), uses fact of exit with C=0 MOS39 0506 E23C v5F MOS39 0523 E243 08 PHP MOS39 0506 E23C v5F MOS39 0524 E244 78 SEI MOS39 0506 E23C v5F MOS39 0525 E245 ; N.B. if print sink is 0 then character will MOS39 0506 E23C v5F MOS39 0526 E245 ; eventually be ignored by STROBE MOS39 0506 E23C v5F MOS39 0527 E245 ; MOS39 0506 E23C v5F MOS39 0528 E245 AA TAX ;save print character MOS39 0506 E23C v5F MOS39 0529 E246 ; MOS39 0506 E23C v5F MOS39 0530 E246 ; test whether printer enabled MOS39 0506 E23C v5F MOS39 0531 E246 ; MOS39 0506 E23C v5F MOS39 0532 E246 A9 04 LDAIM WRPREN MOS39 0506 E23C v5F MOS39 0533 E248 2C 7C 02 BIT WRCHSW MOS39 0506 E23C v5F MOS39 0534 E24B D0 10 BNE PRINT4 ;[printer disabled] MOS39 0506 E23C v5F MOS39 0535 E24D ; MOS39 0506 E23C v5F MOS39 0536 E24D 8A TXA ;restore print character MOS39 0506 E23C v5F MOS39 0537 E24E A2 03 LDXIM BPRNT ;X := print bufferid MOS39 0506 E23C v5F MOS39 0538 E250 20 31 E3 JSR WRITE ;write character to buffer, waiting if necessary MOS39 0506 E23C v5F MOS39 0539 E253 B0 08 BCS PRINT3 ;[ESCAPE detected] MOS39 0506 E23C v5F MOS39 0540 E255 ; MOS39 0506 E23C v5F MOS39 0541 E255 ; test printer status; interrupts disabled MOS39 0506 E23C v5F MOS39 0542 E255 ; MOS39 0506 E23C v5F MOS39 0543 E255 2C D2 02 BIT PFLAG MOS39 0506 E23C v5F MOS39 0544 E258 10 03 BPL PRINT3 ;[printer busy] MOS39 0506 E23C v5F MOS39 0545 E25A ; MOS39 0506 E23C v5F MOS39 0546 E25A ; printer dormant MOS39 0506 E23C v5F MOS39 0547 E25A ; send the first character MOS39 0506 E23C v5F MOS39 0548 E25A ; MOS39 0506 E23C v5F MOS39 0549 E25A 20 99 E2 JSR STROBE ;send character to selected printer MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 80 MOS39 MOS39 CLI MOS39 MOS39 0506 E23C v5F MOS39 0550 E25D ; MOS39 0506 E23C v5F MOS39 0551 E25D PRINT3 ;printer busy MOS39 0506 E23C v5F MOS39 0552 E25D PRINT4 ;return enabling interrupts MOS39 0506 E23C v5F MOS39 0553 E25D 28 PLP ;restore interrupt state, set C=0 (fact used by VDU) MOS39 0506 E23C v5F MOS39 0554 E25E ; MOS39 0506 E23C v5F MOS39 0555 E25E PRINT0 MOS39 0506 E23C v5F MOS39 0556 E25E 60 RTS -- MOS39 0557 E25F -- MOS39 0558 E25F -- MOS39 0559 E25F [ MOS125 = &FF -- MOS39 0560 E25F | -- MOS39 0561 E25F FLUSHC ;flush buffer -- MOS39 0562 E25F D0 0F BNE JFLUSH ;[flush currently selected input buffer] MOS39 0562 E25F v70 MOS39 0563 E261 ; X=0 => flush all buffers MOS39 0562 E25F v70 MOS39 0564 E261 FLSHAL ;flush all buffers MOS39 0562 E25F v70 MOS39 0565 E261 A2 08 LDXIM BUPB MOS39 0562 E25F v70 MOS39 0566 E263 FLUSH3 MOS39 0562 E25F v70 MOS39 0567 E263 ; allow interrupts MOS39 0562 E25F v70 MOS39 0568 E263 58 CLI MOS39 0562 E25F v70 MOS39 0569 E264 78 SEI MOS39 0562 E25F v70 MOS39 0570 E265 20 6B E2 JSR FLUSHS ;flush buffer given by X MOS39 0562 E25F v70 MOS39 0571 E268 CA DEX MOS39 0562 E25F v70 MOS39 0572 E269 10 F8 BPL FLUSH3 MOS39 0562 E25F v70 MOS39 0573 E26B ; MOS39 0562 E25F v70 MOS39 0574 E26B ; N.B. X<0, so is an invalid bufferid (and will be ignored by FLUSHS) MOS39 0562 E25F v70 MOS39 0575 E26B ; MOS39 0562 E25F v70 MOS39 0576 E26B FLUSHS ;flush specific buffer MOS39 0562 E25F v70 MOS39 0577 E26B E0 09 CPXIM BUPB +&01 MOS39 0562 E25F v70 MOS39 0578 E26D 90 04 BCC FLUSH2 ;[valid bufferid] MOS39 0562 E25F v70 MOS39 0579 E26F ; invalid bufferid MOS39 0562 E25F v70 MOS39 0580 E26F 60 RTS MOS39 0562 E25F v70 MOS39 0581 E270 MOS39 0562 E25F v70 MOS39 0582 E270 JFLUSH ;flush input buffer and clear soft key expansion MOS39 0562 E25F v70 MOS39 0583 E270 AE 41 02 LDX RDCHSW ;X := input bufferid MOS39 0578 E26D v7B MOS39 0584 E273 FLUSH2 MOS39 0578 E26D v7B MOS39 0585 E273 STROB4 ;not user print MOS39 0578 E26D v7B MOS39 0586 E273 STCRS ;RS423 managed by cassette MOS39 0578 E26D v7B MOS39 0587 E273 ; ignore print request by purging buffer AND return MOS39 0578 E26D v7B MOS39 0588 E273 PURGE MOS39 0578 E26D v7B MOS39 0589 E273 ; purge buffer given by index in X MOS39 0578 E26D v7B MOS39 0590 E273 ; this routine does not corrupt A or X MOS39 0578 E26D v7B MOS39 0591 E273 18 CLC MOS39 0684 E2C8 ^29 MOS39 0592 E274 ; MOS39 0684 E2C8 ^29 MOS39 0593 E274 PURGEX ;entered by OSWORD sound routine with C=1 MOS39 0684 E2C8 ^29 MOS39 0594 E274 48 PHA ;save A MOS39 0684 E2C8 ^29 MOS39 0595 E275 08 PHP ;save interrupt state MOS39 0684 E2C8 ^29 MOS39 0596 E276 78 SEI MOS39 0684 E2C8 ^29 MOS39 0597 E277 ; MOS39 0684 E2C8 ^29 MOS39 0598 E277 ; kill sound channel if sound buffer MOS39 0684 E2C8 ^29 MOS39 0599 E277 B0 08 BCS PURNSB ;[OSWORD call so do not kill sound] MOS39 0684 E2C8 ^29 MOS39 0600 E279 BD EC E9 LDAAX BUFTYP MOS39 0684 E2C8 ^29 MOS39 0601 E27C 10 03 BPL PURNSB ;[not a sound buffer] MOS39 0684 E2C8 ^29 MOS39 0602 E27E ; kill sound on channel X MOS39 0684 E2C8 ^29 MOS39 0603 E27E 20 E8 EC JSR SCRST MOS39 0684 E2C8 ^29 MOS39 0604 E281 PURNSB MOS39 0684 E2C8 ^29 MOS39 0605 E281 ; MOS39 0684 E2C8 ^29 MOS39 0606 E281 ; check for input buffer MOS39 0684 E2C8 ^29 MOS39 0607 E281 E0 02 CPXIM OUTPUT MOS39 0684 E2C8 ^29 MOS39 0608 E283 B0 08 BCS VAULT ;[output buffer] MOS39 0684 E2C8 ^29 MOS39 0609 E285 ; MOS39 0684 E2C8 ^29 MOS39 0610 E285 ; input buffer, kill soft key expansion and VDU queueing MOS39 0684 E2C8 ^29 MOS39 0611 E285 ; MOS39 0684 E2C8 ^29 MOS39 0612 E285 A9 00 LDAIM ZERO MOS39 0684 E2C8 ^29 MOS39 0613 E287 8D 68 02 STA SOFKL ;kill soft key expansion MOS39 0684 E2C8 ^29 MOS39 0614 E28A 8D 6A 02 STA QPOSN ;kill VDU queueing MOS39 0684 E2C8 ^29 MOS39 0615 E28D ; MOS39 0684 E2C8 ^29 MOS39 0616 E28D ;if input buffer OR first output buffer i.e. RS423 MOS39 0684 E2C8 ^29 MOS39 0617 E28D ;then Z=1; buffer flag unused, preserve MOS39 0684 E2C8 ^29 MOS39 0618 E28D F0 04 VAULT BEQ PURGE3 MOS39 0684 E2C8 ^29 MOS39 0619 E28F ;otherwise C=1 MOS39 0684 E2C8 ^29 MOS39 0620 E28F ; flag buffer dormant MOS39 0684 E2C8 ^29 MOS39 0621 E28F 7E CF 02 RORAX BACTIV MOS39 0684 E2C8 ^29 MOS39 0622 E292 38 SEC ;pass C=1; N=1, V=1, Z=* from BIT FFBYT MOS39 0684 E2C8 ^29 MOS39 0623 E293 ; MOS39 0684 E2C8 ^29 MOS39 0624 E293 PURGE3 MOS39 0684 E2C8 ^29 MOS39 0625 E293 ; MOS39 0684 E2C8 ^29 MOS39 0626 E293 20 C7 E7 JSR JMIPUR ;use indirection with V=1 (defaults to CNP) MOS39 0684 E2C8 ^29 MOS39 0627 E296 ; MOS39 0684 E2C8 ^29 MOS39 0628 E296 28 PLP ;restore interrupt state MOS39 0684 E2C8 ^29 MOS39 0629 E297 68 PLA ;restore A MOS39 0684 E2C8 ^29 MOS39 0630 E298 60 RTS MOS39 0684 E2C8 ^29 MOS39 0631 E299 ] MOS39 0684 E2C8 ^29 MOS39 0632 E299 MOS39 0684 E2C8 ^29 MOS39 0633 E299 STROBE ;send character to selected printer MOS39 0684 E2C8 ^29 MOS39 0634 E299 ; **************************************** MOS39 0684 E2C8 ^29 MOS39 0635 E299 ; MUST BE ENTERED WITH INTERRUPTS DISABLED MOS39 0684 E2C8 ^29 MOS39 0636 E299 ; ********************************** MOS39 0684 E2C8 ^29 MOS39 0637 E299 ; determine print sink MOS39 0684 E2C8 ^29 MOS39 0638 E299 AD 85 02 LDA PRNTSW MOS39 0684 E2C8 ^29 MOS39 0639 E29C F0 D5 BEQ PURGE ;[ignore print request] MOS39 0684 E2C8 ^29 MOS39 0640 E29E ; print sink determined by PRNTSW MOS39 0684 E2C8 ^29 MOS39 0641 E29E ; 0: infinite print sink MOS39 0684 E2C8 ^29 MOS39 0642 E29E ; 1: centronics MOS39 0684 E2C8 ^29 MOS39 0643 E29E ; 2: RS423 output MOS39 0684 E2C8 ^29 MOS39 0644 E29E ; 3: user print routine MOS39 0684 E2C8 ^29 MOS39 0645 E29E ; 4: net printer server MOS39 0684 E2C8 ^29 MOS39 0646 E29E [ MOS125 = &FF MOS39 0684 E2C8 ^29 MOS39 0649 E29E | MOS39 0684 E2C8 ^29 MOS39 0650 E29E C9 02 CMPIM PRS MOS39 0684 E2C8 ^29 MOS39 0651 E2A0 B0 21 BCS STROB1 ;[not centronics] MOS39 0684 E2C8 ^29 MOS39 0652 E2A2 ] MOS39 0684 E2C8 ^29 MOS39 0653 E2A2 ; centronics interface MOS39 0684 E2C8 ^29 MOS39 0654 E2A2 ; this code must be executed with interrupts disabled MOS39 0684 E2C8 ^29 MOS39 0655 E2A2 ; otherwise a CA1 interrupt coinciding with the STA PAR MOS39 0684 E2C8 ^29 MOS39 0656 E2A2 ; would result in a spurious interrupt which would not MOS39 0684 E2C8 ^29 MOS39 0657 E2A2 ; be recognised, resulting in a 'Bad IRQ' state MOS39 0684 E2C8 ^29 MOS39 0658 E2A2 20 99 E5 JSR REMOV ;remove character from print buffer MOS39 0684 E2C8 ^29 MOS39 0659 E2A5 6E D2 02 ROR PFLAG MOS39 0684 E2C8 ^29 MOS39 0660 E2A8 30 43 BMI STROB0 ;[no more characters to print] MOS39 0684 E2C8 ^29 MOS39 0661 E2AA A0 82 LDYIM &82 MOS39 0684 E2C8 ^29 MOS39 0662 E2AC 8C 6E FE STY IERR ;enable parallel port printer interrupt MOS39 0684 E2C8 ^29 MOS39 0663 E2AF ; write character MOS39 0684 E2C8 ^29 MOS39 0664 E2AF 8D 61 FE STA PAR MOS39 0684 E2C8 ^29 MOS39 0665 E2B2 ; pulse strobe line MOS39 0684 E2C8 ^29 MOS39 0666 E2B2 AD 6C FE LDA PCRR MOS39 0684 E2C8 ^29 MOS39 0667 E2B5 29 F1 ANDIM &F1 ;********** DO NOT CHANGE MOS39 0684 E2C8 ^29 MOS39 0668 E2B7 09 0C ORAIM CA2LO ;********** DO NOT CHANGE MOS39 0684 E2C8 ^29 MOS39 0669 E2B9 8D 6C FE STA PCRR ;CA2 strobe lo (signal inverted by h/w) MOS39 0684 E2C8 ^29 MOS39 0670 E2BC 09 0E ORAIM CA2HI ;********** DO NOT CHANGE MOS39 0684 E2C8 ^29 MOS39 0671 E2BE 8D 6C FE STA PCRR ;CA2 strobe hi (signal inverted by h/w) MOS39 0684 E2C8 ^29 MOS39 0672 E2C1 ; N.B. leave signal hi MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 81 MOS39 MOS39 CLI MOS39 MOS39 0684 E2C8 ^29 MOS39 0673 E2C1 D0 2A BNE STROB0 ;[ALWAYS jump, exit] MOS39 0684 E2C8 ^29 MOS39 0674 E2C3 MOS39 0684 E2C8 ^29 MOS39 0675 E2C3 STROB1 ;not centronics MOS39 0684 E2C8 ^29 MOS39 0676 E2C3 ; X = bufferid MOS39 0684 E2C8 ^29 MOS39 0677 E2C3 [ MOS125 = &FF MOS39 0684 E2C8 ^29 MOS39 0679 E2C3 ] MOS39 0684 E2C8 ^29 MOS39 0680 E2C3 D0 29 BNE STROB3 ;[not RS423] MOS39 0684 E2C8 ^29 MOS39 0681 E2C5 ; printer is RS423 MOS39 0684 E2C8 ^29 MOS39 0682 E2C5 A4 EA LDY RSTUT MOS39 0684 E2C8 ^29 MOS39 0683 E2C7 88 DEY MOS39 0684 E2C8 ^29 MOS39 0684 E2C8 10 A9 BPL STCRS ;[RS423 printer managed by CFS, ignore print request] MOS39 0660 E2A8 v3C MOS39 0685 E2CA ; print to RS423 MOS39 0660 E2A8 v3C MOS39 0686 E2CA 4E D2 02 LSR PFLAG ;flag printer busy MOS39 0660 E2A8 v3C MOS39 0687 E2CD ; MOS39 0660 E2A8 v3C MOS39 0688 E2CD RSBUSY MOS39 0660 E2A8 v3C MOS39 0689 E2CD 4E 4F 02 LSR RSFLAG ;flag RS423 busy MOS39 0660 E2A8 v3C MOS39 0690 E2D0 ; MOS39 0660 E2A8 v3C MOS39 0691 E2D0 RSETX ;enable RS423 Tx interrupts MOS39 0660 E2A8 v3C MOS39 0692 E2D0 20 80 E3 JSR CNTRS MOS39 0660 E2A8 v3C MOS39 0693 E2D3 90 18 BCC RSOVF ;[RS423 input buffer overflow] MOS39 0660 E2A8 v3C MOS39 0694 E2D5 ; MOS39 0660 E2A8 v3C MOS39 0695 E2D5 A2 20 LDXIM RHITXE ;set RTS hi, Tx interrupt enabled MOS39 0660 E2A8 v3C MOS39 0696 E2D7 ; MOS39 0660 E2A8 v3C MOS39 0697 E2D7 RSED ;alter Tx control register to X MOS39 0660 E2A8 v3C MOS39 0698 E2D7 A0 9F LDYIM &9F ;field is b6-b5 MOS39 0660 E2A8 v3C MOS39 0699 E2D9 ; MOS39 0660 E2A8 v3C MOS39 0700 E2D9 RS423 MOS39 0660 E2A8 v3C MOS39 0701 E2D9 08 PHP MOS39 0660 E2A8 v3C MOS39 0702 E2DA 78 SEI MOS39 0660 E2A8 v3C MOS39 0703 E2DB 98 TYA ;A := mask MOS39 0660 E2A8 v3C MOS39 0704 E2DC ; ***************************************** MOS39 0660 E2A8 v3C MOS39 0705 E2DC ; MUST BE EXECUTED WITH INTERRUPTS DISABLED MOS39 0660 E2A8 v3C MOS39 0706 E2DC ; ***************************************** MOS39 0660 E2A8 v3C MOS39 0707 E2DC ; A = mask (altered) MOS39 0660 E2A8 v3C MOS39 0708 E2DC ; X = new value MOS39 0660 E2A8 v3C MOS39 0709 E2DC 86 FA STX RSOP ;save new value of field MOS39 0660 E2A8 v3C MOS39 0710 E2DE 2D 50 02 AND RSCTFL ;copy status and clear field for new status MOS39 0660 E2A8 v3C MOS39 0711 E2E1 45 FA EOR RSOP ;add in new status MOS39 0660 E2A8 v3C MOS39 0712 E2E3 AE 50 02 LDX RSCTFL ;X := old value MOS39 0660 E2A8 v3C MOS39 0713 E2E6 STARSC ;used by MC6850 N.B. does PLP RTS MOS39 0660 E2A8 v3C MOS39 0714 E2E6 MOS39 0660 E2A8 v3C MOS39 0715 E2E6 8D 50 02 STA RSCTFL ;update record of status MOS39 0660 E2A8 v3C MOS39 0716 E2E9 8D 08 FE STA RSCTL ;update 6850 MOS39 0660 E2A8 v3C MOS39 0717 E2EC 28 PLP MOS39 0660 E2A8 v3C MOS39 0718 E2ED RSOVF ;RS423 input buffer overflow MOS39 0660 E2A8 v3C MOS39 0719 E2ED STROB0 MOS39 0660 E2A8 v3C MOS39 0720 E2ED 60 RTS MOS39 0680 E2C3 v56 MOS39 0721 E2EE MOS39 0680 E2C3 v56 MOS39 0722 E2EE STROB3 ;not RS423 MOS39 0680 E2C3 v56 MOS39 0723 E2EE MOS39 0680 E2C3 v56 MOS39 0724 E2EE 18 CLC -- MOS39 0725 E2EF -- MOS39 0726 E2EF ; C=0 -- MOS39 0727 E2EF ; user or net print -- MOS39 0728 E2EF ; X=print_bufferid -- MOS39 0729 E2EF ; character in printer buffer -- MOS39 0730 E2EF A9 01 LDAIM UPWRCH -- MOS39 0731 E2F1 20 FF E2 JSR mUPT ;call print routine (returns with carry meaningful) -- MOS39 0732 E2F4 PFREE ;indicate printer dormant (OSBYTE call used by UPT routine) -- MOS39 0733 E2F4 6E D2 02 ROR PFLAG ;set printer status according to user print routine -- MOS39 0734 E2F7 ; C=0 => printer busy -- MOS39 0735 E2F7 ; C=1 => printer free -- MOS39 0736 E2F7 ; (default user print routine is DEFUPT) -- MOS39 0737 E2F7 UPTRTS -- MOS39 0738 E2F7 60 RTS MOS39 0743 E2FB ^7A MOS39 0739 E2F8 MOS39 0743 E2FB ^7A MOS39 0740 E2F8 MOS39 0743 E2FB ^7A MOS39 0741 E2F8 UPTINT ;timer interrupt MOS39 0743 E2FB ^7A MOS39 0742 E2F8 2C D2 02 BIT PFLAG MOS39 0743 E2FB ^7A MOS39 0743 E2FB 30 FA BMI UPTRTS ;[printer dormant] -- MOS39 0744 E2FD ; -- MOS39 0745 E2FD ; give a hand to polled printers -- MOS39 0746 E2FD A9 00 LDAIM UPTIME -- MOS39 0747 E2FF ; -- MOS39 0748 E2FF MUPT ;call user print routine (also used by VDU software) -- MOS39 0749 E2FF ; A = reason code ($02/$03) -- MOS39 0750 E2FF A2 03 LDXIM BPRNT ;X := print buffer id -- MOS39 0751 E301 ; -- MOS39 0752 E301 UPTX ;entered by *FX5 -- MOS39 0753 E301 AC 85 02 LDY PRNTSW ;Y := current print selection -- MOS39 0754 E304 20 12 E6 JSR JMINET ;call net print routine -- MOS39 0755 E307 6C 22 02 JMI UPTVEC ;call user print routine AND return -- MOS39 0756 E30A -- MOS39 0757 E30A -- MOS39 0758 E30A [ MOS125 = &FF -- MOS39 0801 E30A ] -- MOS39 0802 E30A ; -- MOS39 0803 E30A ; -- MOS39 0804 E30A CNP ;count buffer entries / purge buffer -- MOS39 0805 E30A [ $Tutu -- MOS39 0808 E30A | -- MOS39 0809 E30A 50 07 BVC COUNT ;[count buffer entries] MOS39 0809 E30A v78 MOS39 0810 E30C ] MOS39 0809 E30A v78 MOS39 0811 E30C ; MOS39 0809 E30A v78 MOS39 0812 E30C ; purge buffer MOS39 0809 E30A v78 MOS39 0813 E30C ; MOS39 0809 E30A v78 MOS39 0814 E30C ; reset buffer pointers MOS39 0809 E30A v78 MOS39 0815 E30C ; set buffer start = buffer end MOS39 0809 E30A v78 MOS39 0816 E30C BD D8 02 LDAAX BFSTRT MOS39 0809 E30A v78 MOS39 0817 E30F 9D E1 02 STAAX BFEND MOS39 0809 E30A v78 MOS39 0818 E312 60 RTS MOS39 0809 E30A v78 MOS39 0819 E313 ; MOS39 0809 E30A v78 MOS39 0820 E313 ; MOS39 0809 E30A v78 MOS39 0821 E313 COUNT MOS39 0809 E30A v78 MOS39 0822 E313 08 PHP -- MOS39 0823 E314 78 SEI -- MOS39 0824 E315 ; -- MOS39 0825 E315 08 PHP ;save count type -- MOS39 0826 E316 ; -- MOS39 0827 E316 38 SEC -- MOS39 0828 E317 BD E1 02 LDAAX BFEND -- MOS39 0829 E31A FD D8 02 SBCAX BFSTRT -- MOS39 0830 E31D B0 04 BCS BUFNX1 MOS39 0830 E31D v7B MOS39 0831 E31F ; adjust for overflow MOS39 0830 E31D v7B MOS39 0832 E31F 38 SEC MOS39 0830 E31D v7B MOS39 0833 E320 FD 80 E5 SBCAX BFORG MOS39 0830 E31D v7B MOS39 0834 E323 BUFNX1 MOS39 0830 E31D v7B MOS39 0835 E323 ; MOS39 0830 E31D v7B MOS39 0836 E323 28 PLP ;restore count type -- MOS39 0837 E324 ; -- MOS39 0838 E324 90 06 BCC BFCNT0 ;[input buffer] MOS39 MOS39 MOS39 MOS39 Acorn macro assembler Page 82 MOS39 MOS39 CLI MOS39 MOS39 0838 E324 v79 MOS39 0839 E326 ; MOS39 0838 E324 v79 MOS39 0840 E326 ; output buffer MOS39 0838 E324 v79 MOS39 0841 E326 ; adjust to give remaining entries MOS39 0838 E324 v79 MOS39 0842 E326 18 CLC MOS39 0838 E324 v79 MOS39 0843 E327 7D 80 E5 ADCAX BFORG MOS39 0838 E324 v79 MOS39 0844 E32A 49 FF EORIM &FF MOS39 0838 E324 v79 MOS39 0845 E32C ; MOS39 0838 E324 v79 MOS39 0846 E32C BFCNT0 MOS39 0838 E324 v79 MOS39 0847 E32C A0 00 LDYIM ZERO -- MOS39 0848 E32E AA TAX -- MOS39 0849 E32F ; -- MOS39 0850 E32F 28 PLP -- MOS39 0851 E330 60 RTS -- MOS39 0852 E331 -- MOS39 0853 E331 -- MOS39 0854 E331 LNK MOS40 -- MOS40 0001 E331 -- MOS40 0002 E331 ; MOS40 -- MOS40 0003 E331 TTL MOS40 Machine operating system internal commands -- MOS40 0004 E331 OPT MOS40 MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 83 MOS40 MOS40 Machine operating system internal commands MOS40 -- MOS40 0005 E331 ;(c) 1981 ACORN Computers Limited -- MOS40 0006 E331 ;BBC Microcomputer Machine Operating System (MOS) -- MOS40 0007 E331 ;Change record: -- MOS40 0008 E331 ;033 12-Aug-81 PB Reset SKNEND code, check KEY line termination -- MOS40 0009 E331 ;032 12-Aug-81 PB Extracted from CLI code -- MOS40 0010 E331 ;Author(s): -- MOS40 0011 E331 ;PB Paul Bond -- MOS40 0012 E331 ;MP Mike Prees -- MOS40 0013 E331 -- MOS40 0014 E331 -- MOS40 0015 E331 WRITE -- MOS40 0016 E331 WRITE1 -- MOS40 0017 E331 78 SEI ;another critical region MOS40 0039 E344 ^6B MOS40 0018 E332 20 A2 E1 JSR INSRT ;attempt to add character to print queue MOS40 0039 E344 ^6B MOS40 0019 E335 90 0F BCC WRITE0 ;[character inserted into printer buffer] MOS40 0039 E344 ^6B MOS40 0020 E337 ; printer buffer full MOS40 0039 E344 ^6B MOS40 0021 E337 ; C=1 MOS40 0039 E344 ^6B MOS40 0022 E337 20 29 EA JSR LEDSON ;conditionally set LEDs and test escape condition MOS40 0039 E344 ^6B MOS40 0023 E33A ; N.B. does not corrupt C or X MOS40 0039 E344 ^6B MOS40 0024 E33A ; C=1 MOS40 0039 E344 ^6B MOS40 0025 E33A ; reset LEDs MOS40 0039 E344 ^6B MOS40 0026 E33A 08 PHP MOS40 0039 E344 ^6B MOS40 0027 E33B 48 PHA MOS40 0039 E344 ^6B MOS40 0028 E33C 20 28 EF JSR KBDIS MOS40 0039 E344 ^6B MOS40 0029 E33F 68 PLA MOS40 0039 E344 ^6B MOS40 0030 E340 28 PLP MOS40 0039 E344 ^6B MOS40 0031 E341 ; MOS40 0039 E344 ^6B MOS40 0032 E341 30 03 BMI WRITE0 ;[escape detected] MOS40 0039 E344 ^6B MOS40 0033 E343 58 CLI ;enable interrupts to allow printer buffer to purge. MOS40 0039 E344 ^6B MOS40 0034 E344 ; Interrupts are enabled at this part of the loop, MOS40 0039 E344 ^6B MOS40 0035 E344 ; rather than at the begining (which would save 2 bytes of code) MOS40 0039 E344 ^6B MOS40 0036 E344 ; in order to ensure that if the print routine is called with MOS40 0039 E344 ^6B MOS40 0037 E344 ; interrupts disabled, then interrupts are not enabled if there is MOS40 0039 E344 ^6B MOS40 0038 E344 ; room in the print buffer. MOS40 0039 E344 ^6B MOS40 0039 E344 B0 EB BCS WRITE1 ;[ALWAYS jump, wait for room in printer buffer, C=1] MOS40 0019 E335 v70 MOS40 0040 E346 WRITE0 MOS40 0019 E335 v70 MOS40 0041 E346 60 RTS -- MOS40 0042 E347 -- MOS40 0043 E347 -- MOS40 0044 E347 CLRFB ;clear file control block -- MOS40 0045 E347 48 PHA -- MOS40 0046 E348 A9 00 LDAIM ZERO -- MOS40 0047 E34A 9D EE 02 STAAX FBLOCK -- MOS40 0048 E34D 9D EF 02 STAAX FBLOCK +&01 -- MOS40 0049 E350 9D F0 02 STAAX FBLOCK +&02 -- MOS40 0050 E353 9D F1 02 STAAX FBLOCK +&03 -- MOS40 0051 E356 68 PLA -- MOS40 0052 E357 60 RTS -- MOS40 0053 E358 [ MOS125 = &FF -- MOS40 0076 E358 | -- MOS40 0077 E358 20 CA E0 LSA JSR SKIPSP -- MOS40 0078 E35B 20 15 E1 JSR TSTHEX -- MOS40 0079 E35E 90 1F BCC LSA0 ;[hex not present, return V=1] MOS40 0079 E35E v60 MOS40 0080 E360 ; MOS40 0079 E35E v60 MOS40 0081 E360 ; clear field MOS40 0079 E35E v60 MOS40 0082 E360 ; MOS40 0079 E35E v60 MOS40 0083 E360 20 47 E3 JSR CLRFB MOS40 0079 E35E v60 MOS40 0084 E363 ; MOS40 0079 E35E v60 MOS40 0085 E363 ; read address MOS40 0079 E35E v60 MOS40 0086 E363 ; MOS40 0079 E35E v60 MOS40 0087 E363 LSA1 ;rotate hex digit into 4-byte address MOS40 0079 E35E v60 MOS40 0088 E363 ; move nibble into high nibble MOS40 0079 E35E v60 MOS40 0089 E363 ;set b3, clear b2..0 MOS40 0079 E35E v60 MOS40 0090 E363 ;SEC ;C=1 from BCC LSA0 (CLRFB preserves) or BCS LSA1 MOS40 0079 E35E v60 MOS40 0091 E363 2A ROLA MOS40 0079 E35E v60 MOS40 0092 E364 0A ASLA MOS40 0079 E35E v60 MOS40 0093 E365 0A ASLA MOS40 0079 E35E v60 MOS40 0094 E366 0A ASLA MOS40 0079 E35E v60 MOS40 0095 E367 ;shift once more. C=hex b3, A b4=1, b3..0=0 MOS40 0079 E35E v60 MOS40 0096 E367 0A ASLA MOS40 0079 E35E v60 MOS40 0097 E368 ROL4A ;rotate bit into address MOS40 0079 E35E v60 MOS40 0098 E368 3E EE 02 ROLAX FBLOCK MOS40 0079 E35E v60 MOS40 0099 E36B 3E EF 02 ROLAX FBLOCK +&01 MOS40 0079 E35E v60 MOS40 0100 E36E 3E F0 02 ROLAX FBLOCK +&02 MOS40 0079 E35E v60 MOS40 0101 E371 3E F1 02 ROLAX FBLOCK +&03 MOS40 0079 E35E v60 MOS40 0102 E374 B0 42 BCS MBADHX ;[overflow] MOS40 0102 E374 v3D MOS40 0103 E376 ; C=0 MOS40 0102 E374 v3D MOS40 0104 E376 0A ASLA MOS40 0102 E374 v3D MOS40 0105 E377 D0 EF BNE ROL4A ;execute loop four times MOS40 0102 E374 v3D MOS40 0106 E379 ; C=1 which TSTHEX ignores MOS40 0102 E374 v3D MOS40 0107 E379 20 15 E1 JSR TSTHEX MOS40 0102 E374 v3D MOS40 0108 E37C B0 E5 BCS LSA1 MOS40 0102 E374 v3D MOS40 0109 E37E CNTRS0 MOS40 0102 E374 v3D MOS40 0110 E37E 38 SEC ;return C=1 MOS40 0102 E374 v3D MOS40 0111 E37F LSA0 ;Z=1 => CR terminator MOS40 0102 E374 v3D MOS40 0112 E37F 60 RTS MOS40 0102 E374 v3D MOS40 0113 E380 MOS40 0102 E374 v3D MOS40 0114 E380 CNTRS ;count bytes left in RS423 input buffer MOS40 0102 E374 v3D MOS40 0115 E380 38 SEC ;count empty slots left ... MOS40 0102 E374 v3D MOS40 0116 E381 A2 01 LDXIM BRSI ;... in RS423 input buffer MOS40 0102 E374 v3D MOS40 0117 E383 20 C4 E7 JSR JMICNT MOS40 0102 E374 v3D MOS40 0118 E386 ; count in Y (hi) and X (lo) MOS40 0102 E374 v3D MOS40 0119 E386 98 TYA MOS40 0102 E374 v3D MOS40 0120 E387 D0 F5 BNE CNTRS0 ;[more than RSOVER bytes left] MOS40 0102 E374 v3D MOS40 0121 E389 ; MOS40 0102 E374 v3D MOS40 0122 E389 EC 5B 02 CPX RSHLVL MOS40 0102 E374 v3D MOS40 0123 E38C ; MOS40 0102 E374 v3D MOS40 0124 E38C ; C=0 => overflow MOS40 0102 E374 v3D MOS40 0125 E38C ; C=1 => no overflow MOS40 0102 E374 v3D MOS40 0126 E38C 60 RTS MOS40 0102 E374 v3D MOS40 0127 E38D ] MOS40 0102 E374 v3D MOS40 0128 E38D MOS40 0102 E374 v3D MOS40 0129 E38D MOS40 0102 E374 v3D MOS40 0130 E38D LOAD ;LOAD [load address] MOS40 0102 E374 v3D MOS40 0131 E38D A9 FF LDAIM &FF MOS40 0102 E374 v3D MOS40 0132 E38F SAVE ;(A=$00) SAVE [exechex] [loadhex] MOS40 0102 E374 v3D MOS40 0133 E38F 86 F2 STX WORK MOS40 0102 E374 v3D MOS40 0134 E391 84 F3 STY WORK +&01 MOS40 0102 E374 v3D MOS40 0135 E393 8E EE 02 STX FBLOCK+FSTR+&0 MOS40 0102 E374 v3D MOS40 0136 E396 8C EF 02 STY FBLOCK+FSTR+&1 MOS40 0102 E374 v3D MOS40 0137 E399 [ MOS125 = &FF MOS40 0102 E374 v3D MOS40 0139 E399 ] MOS40 0102 E374 v3D MOS40 0140 E399 ; clear load address MOS40 0102 E374 v3D MOS40 0141 E399 A2 02 LDXIM FLOAD MOS40 0102 E374 v3D MOS40 0142 E39B 20 47 E3 JSR CLRFB MOS40 0102 E374 v3D MOS40 0143 E39E ; set lsb exec address = $FF (preparing for possible LOAD) MOS40 0102 E374 v3D MOS40 0144 E39E A0 FF LDYIM &FF MOS40 0102 E374 v3D MOS40 0145 E3A0 8C F4 02 STY FBLOCK+FEXEC ;'use file load address' MOS40 0102 E374 v3D MOS40 0146 E3A3 ; set to read characters from WORK buffer MOS40 0102 E374 v3D MOS40 0147 E3A3 C8 INY ;Y:=0 MOS40 0102 E374 v3D MOS40 0148 E3A4 ; skip filename MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 84 MOS40 MOS40 Machine operating system internal commands MOS40 MOS40 0102 E374 v3D MOS40 0149 E3A4 [ MOS125 = &FF MOS40 0102 E374 v3D MOS40 0150 E3A4 | MOS40 0102 E374 v3D MOS40 0151 E3A4 48 PHA MOS40 0102 E374 v3D MOS40 0152 E3A5 ] MOS40 0102 E374 v3D MOS40 0153 E3A5 20 97 EA JSR GSINTC MOS40 0102 E374 v3D MOS40 0154 E3A8 20 A9 EA LS2 JSR GSREAD MOS40 0102 E374 v3D MOS40 0155 E3AB 90 FB BCC LS2 ;[string character] MOS40 0102 E374 v3D MOS40 0156 E3AD ; determine command type MOS40 0102 E374 v3D MOS40 0157 E3AD 68 PLA MOS40 0102 E374 v3D MOS40 0158 E3AE 48 PHA MOS40 0102 E374 v3D MOS40 0159 E3AF F0 4D BEQ SAVEX ;[SAVE command] MOS40 0159 E3AF v32 MOS40 0160 E3B1 ; LOAD command MOS40 0159 E3AF v32 MOS40 0161 E3B1 ; MOS40 0159 E3AF v32 MOS40 0162 E3B1 ; read load address MOS40 0159 E3AF v32 MOS40 0163 E3B1 ; N.B. X=FLOAD MOS40 0159 E3AF v32 MOS40 0164 E3B1 20 58 E3 JSR LSA MOS40 0159 E3AF v32 MOS40 0165 E3B4 B0 3B BCS LOADX1 ;hex present MOS40 0159 E3AF v32 MOS40 0166 E3B6 F0 3E BEQ LS0 ;[just CR terminator] MOS40 0159 E3AF v32 MOS40 0167 E3B8 MBADHX ;report error 'Bad address' MOS40 0159 E3AF v32 MOS40 0168 E3B8 00 BRK MOS40 0159 E3AF v32 MOS40 0169 E3B9 FC = BADADR MOS40 0159 E3AF v32 MOS40 0170 E3BA 42 61 64 = "Bad address" MOS40 0159 E3AF v32 MOS40 0171 E3C5 00 = ZERO ;message terminator MOS40 0159 E3AF v32 MOS40 0172 E3C6 MOS40 0159 E3AF v32 MOS40 0173 E3C6 MOS40 0159 E3AF v32 MOS40 0174 E3C6 SHUTES ;shut EXEC and SPOOL files MOS40 0159 E3AF v32 MOS40 0175 E3C6 MOS40 0159 E3AF v32 MOS40 0176 E3C6 ; MOS40 0159 E3AF v32 MOS40 0177 E3C6 ; inform paged ROMs of intentions MOS40 0159 E3AF v32 MOS40 0178 E3C6 ; MOS40 0159 E3AF v32 MOS40 0179 E3C6 A2 10 LDXIM SVSHES MOS40 0159 E3AF v32 MOS40 0180 E3C8 20 75 F1 JSR SVOP MOS40 0159 E3AF v32 MOS40 0181 E3CB F0 23 BEQ SPOOL0 ;[claimed, do not close files] MOS40 0159 E3AF v32 MOS40 0182 E3CD ; MOS40 0159 E3AF v32 MOS40 0183 E3CD ; deal with EXEC file MOS40 0159 E3AF v32 MOS40 0184 E3CD ; MOS40 0159 E3AF v32 MOS40 0185 E3CD 20 E1 F6 JSR ECLOSE ;Close EXEC file MOS40 0159 E3AF v32 MOS40 0186 E3D0 ; MOS40 0159 E3AF v32 MOS40 0187 E3D0 ; close SPOOL file AND return MOS40 0159 E3AF v32 MOS40 0188 E3D0 ; MOS40 0159 E3AF v32 MOS40 0189 E3D0 A9 00 LDAIM ZERO ;Z=1, A=$00 MOS40 0159 E3AF v32 MOS40 0190 E3D2 ; MOS40 0159 E3AF v32 MOS40 0191 E3D2 SPOOL ;SPOOL MOS40 0159 E3AF v32 MOS40 0192 E3D2 ; XY -> filename MOS40 0159 E3AF v32 MOS40 0193 E3D2 ; A = $00 MOS40 0159 E3AF v32 MOS40 0194 E3D2 ; EQ -> spool off MOS40 0159 E3AF v32 MOS40 0195 E3D2 ;remember whether to just turn spooling off MOS40 0159 E3AF v32 MOS40 0196 E3D2 08 PHP MOS40 0159 E3AF v32 MOS40 0197 E3D3 ; close old spool file MOS40 0159 E3AF v32 MOS40 0198 E3D3 84 E6 STY SPOOLY ;save Y MOS40 0159 E3AF v32 MOS40 0199 E3D5 AC 57 02 LDY SPOOLH MOS40 0159 E3AF v32 MOS40 0200 E3D8 8D 57 02 STA SPOOLH ;clear spooling MOS40 0159 E3AF v32 MOS40 0201 E3DB F0 03 BEQ SPOOL2 ;[not currently spooling] MOS40 0159 E3AF v32 MOS40 0202 E3DD ; A=0 MOS40 0159 E3AF v32 MOS40 0203 E3DD 20 CE FF JSR OSFIND ;close spool file MOS40 0159 E3AF v32 MOS40 0204 E3E0 SPOOL2 MOS40 0159 E3AF v32 MOS40 0205 E3E0 A4 E6 LDY SPOOLY ;restore Y MOS40 0159 E3AF v32 MOS40 0206 E3E2 28 PLP MOS40 0159 E3AF v32 MOS40 0207 E3E3 F0 0B BEQ SPOOL0 ;[just close spool file] MOS40 0159 E3AF v32 MOS40 0208 E3E5 ; open given spool file MOS40 0159 E3AF v32 MOS40 0209 E3E5 A9 80 LDAIM &80 ;open file for output MOS40 0159 E3AF v32 MOS40 0210 E3E7 20 CE FF JSR OSFIND MOS40 0159 E3AF v32 MOS40 0211 E3EA A8 TAY MOS40 0159 E3AF v32 MOS40 0212 E3EB F0 5D BEQ BADFX ;[open failure] MOS40 0212 E3EB v22 MOS40 0213 E3ED 8D 57 02 STA SPOOLH MOS40 0212 E3EB v22 MOS40 0214 E3F0 SPOOL0 ;Z=1 MOS40 0212 E3EB v22 MOS40 0215 E3F0 60 RTS MOS40 0212 E3EB v22 MOS40 0216 E3F1 MOS40 0212 E3EB v22 MOS40 0217 E3F1 MOS40 0212 E3EB v22 MOS40 0218 E3F1 LOADX1 ;explicit load address given MOS40 0212 E3EB v22 MOS40 0219 E3F1 D0 57 BNE BADFX ;[no CR terminator] MOS40 0212 E3EB v22 MOS40 0220 E3F3 EE F4 02 INC FBLOCK+FEXEC ;use explicit load address MOS40 0212 E3EB v22 MOS40 0221 E3F6 LS0 ;load file MOS40 0212 E3EB v22 MOS40 0222 E3F6 A2 EE LDXIM FBLOCK MOS40 0212 E3EB v22 MOS40 0223 E3F8 A0 02 LDYIM /(FBLOCK ) MOS40 0212 E3EB v22 MOS40 0224 E3FA 68 PLA MOS40 0212 E3EB v22 MOS40 0225 E3FB 4C DD FF JMP OSFILE MOS40 0212 E3EB v22 MOS40 0226 E3FE ; MOS40 0212 E3EB v22 MOS40 0227 E3FE [ MOS125 = &FF MOS40 0212 E3EB v22 MOS40 0244 E3FE ] MOS40 0212 E3EB v22 MOS40 0245 E3FE ; MOS40 0212 E3EB v22 MOS40 0246 E3FE ; MOS40 0212 E3EB v22 MOS40 0247 E3FE SAVEX ;SAVE command MOS40 0212 E3EB v22 MOS40 0248 E3FE ; MOS40 0212 E3EB v22 MOS40 0249 E3FE ; read FROM address MOS40 0212 E3EB v22 MOS40 0250 E3FE ; MOS40 0212 E3EB v22 MOS40 0251 E3FE A2 0A LDXIM FFROM MOS40 0212 E3EB v22 MOS40 0252 E400 20 58 E3 JSR LSA MOS40 0212 E3EB v22 MOS40 0253 E403 90 45 BCC BADFX MOS40 0212 E3EB v22 MOS40 0254 E405 ; MOS40 0212 E3EB v22 MOS40 0255 E405 ; read TO address MOS40 0212 E3EB v22 MOS40 0256 E405 ; check if preceeded by '+' MOS40 0212 E3EB v22 MOS40 0257 E405 ; MOS40 0212 E3EB v22 MOS40 0258 E405 [ MOS125 = &FF MOS40 0212 E3EB v22 MOS40 0264 E405 | MOS40 0212 E3EB v22 MOS40 0265 E405 B1 F2 LDAIY WORK MOS40 0212 E3EB v22 MOS40 0266 E407 49 AB EORIM "+":EOR:&80 MOS40 0212 E3EB v22 MOS40 0267 E409 69 FE ADCIM &FE ;c=1, set V iff symbol='+' MOS40 0212 E3EB v22 MOS40 0268 E40B 50 01 BVC SAVEX3 ;['+' not present] MOS40 0212 E3EB v22 MOS40 0269 E40D ] MOS40 0212 E3EB v22 MOS40 0270 E40D C8 INY ;skip '+' symbol MOS40 0212 E3EB v22 MOS40 0271 E40E SAVEX3 MOS40 0212 E3EB v22 MOS40 0272 E40E A2 0E LDXIM FTO MOS40 0212 E3EB v22 MOS40 0273 E410 20 58 E3 JSR LSA ;N.B. does not corrupt V MOS40 0212 E3EB v22 MOS40 0274 E413 90 35 BCC BADFX ;[to address not given] MOS40 0212 E3EB v22 MOS40 0275 E415 ; C=1 MOS40 0212 E3EB v22 MOS40 0276 E415 08 PHP ;Z => no exec address MOS40 0212 E3EB v22 MOS40 0277 E416 ; if '+' was specified then the TO address was really MOS40 0212 E3EB v22 MOS40 0278 E416 ; a length specification MOS40 0212 E3EB v22 MOS40 0279 E416 50 0F BVC SAVEX4 ;['+' not specified] MOS40 0212 E3EB v22 MOS40 0280 E418 ; convert length to end address MOS40 0212 E3EB v22 MOS40 0281 E418 ; N.B. C=1 MOS40 0212 E3EB v22 MOS40 0282 E418 00FC MINUS4 * &00FC MOS40 0212 E3EB v22 MOS40 0283 E418 A2 FC LDXIM MINUS4 MOS40 0212 E3EB v22 MOS40 0284 E41A 18 CLC MOS40 0212 E3EB v22 MOS40 0285 E41B SAVEX5 MOS40 0212 E3EB v22 MOS40 0286 E41B BD FC 01 LDAAX FBLOCK+FFROM-MINUS4 MOS40 0212 E3EB v22 MOS40 0287 E41E 7D 00 02 ADCAX FBLOCK+FTO-MINUS4 MOS40 0212 E3EB v22 MOS40 0288 E421 9D 00 02 STAAX FBLOCK+FTO-MINUS4 MOS40 0212 E3EB v22 MOS40 0289 E424 E8 INX MOS40 0212 E3EB v22 MOS40 0290 E425 D0 F4 BNE SAVEX5 ;[execute loop four times] MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 85 MOS40 MOS40 Machine operating system internal commands MOS40 MOS40 0212 E3EB v22 MOS40 0291 E427 SAVEX4 ;copy 'from' address to execute and load fields MOS40 0212 E3EB v22 MOS40 0292 E427 A2 03 LDXIM &03 MOS40 0212 E3EB v22 MOS40 0293 E429 SAVEX1 MOS40 0212 E3EB v22 MOS40 0294 E429 BD F8 02 LDAAX FBLOCK+FFROM MOS40 0212 E3EB v22 MOS40 0295 E42C 9D F4 02 STAAX FBLOCK+FEXEC MOS40 0212 E3EB v22 MOS40 0296 E42F 9D F0 02 STAAX FBLOCK+FLOAD MOS40 0212 E3EB v22 MOS40 0297 E432 CA DEX MOS40 0212 E3EB v22 MOS40 0298 E433 10 F4 BPL SAVEX1 MOS40 0212 E3EB v22 MOS40 0299 E435 ; check if exec address present MOS40 0212 E3EB v22 MOS40 0300 E435 28 PLP MOS40 0212 E3EB v22 MOS40 0301 E436 F0 BE BEQ LS0 ;[no exec address] MOS40 0212 E3EB v22 MOS40 0302 E438 ; read exec address MOS40 0212 E3EB v22 MOS40 0303 E438 A2 06 LDXIM FEXEC MOS40 0212 E3EB v22 MOS40 0304 E43A 20 58 E3 JSR LSA MOS40 0212 E3EB v22 MOS40 0305 E43D 90 0B BCC BADFX ;[expected exec address not found] MOS40 0212 E3EB v22 MOS40 0306 E43F F0 B5 BEQ LS0 ;[no following load address] MOS40 0212 E3EB v22 MOS40 0307 E441 ; read load address MOS40 0212 E3EB v22 MOS40 0308 E441 A2 02 LDXIM FLOAD MOS40 0212 E3EB v22 MOS40 0309 E443 20 58 E3 JSR LSA MOS40 0212 E3EB v22 MOS40 0310 E446 90 02 BCC BADFX ;[expected load address not found] MOS40 0212 E3EB v22 MOS40 0311 E448 F0 AC BEQ LS0 ;[good line termination] MOS40 0212 E3EB v22 MOS40 0312 E44A BADFX MOS40 0212 E3EB v22 MOS40 0313 E44A MBDCMD MOS40 0212 E3EB v22 MOS40 0314 E44A 00 BRK ;report error 'Bad command' MOS40 0410 E493 ^35 MOS40 0315 E44B FE = BADCMD MOS40 0410 E493 ^35 MOS40 0316 E44C 42 61 64 = "Bad command" MOS40 0410 E493 ^35 MOS40 0317 E457 00 BADKEY BRK ;report error 'Bad KEY' / end of preceeding error message MOS40 0465 E4C1 ^14 MOS40 0318 E458 FB = BADKY MOS40 0465 E4C1 ^14 MOS40 0319 E459 42 61 64 = "Bad key" MOS40 0465 E4C1 ^14 MOS40 0320 E460 00 = ZERO ;message terminator MOS40 0465 E4C1 ^14 MOS40 0321 E461 MOS40 0465 E4C1 ^14 MOS40 0322 E461 [ MOS125 = &FF MOS40 0465 E4C1 ^14 MOS40 0354 E461 ] MOS40 0465 E4C1 ^14 MOS40 0355 E461 MOS40 0465 E4C1 ^14 MOS40 0356 E461 MOS40 0465 E4C1 ^14 MOS40 0357 E461 MOS40 0465 E4C1 ^14 MOS40 0358 E461 FX ;*FX x,y MOS40 0465 E4C1 ^14 MOS40 0359 E461 20 DE E0 JSR GETNUM ;read FX function code MOS40 0465 E4C1 ^14 MOS40 0360 E464 90 E4 BCC BADFX ;[bad FX number] MOS40 0465 E4C1 ^14 MOS40 0361 E466 ; MOS40 0465 E4C1 ^14 MOS40 0362 E466 ; N.B. C=1 MOS40 0465 E4C1 ^14 MOS40 0363 E466 ; push function code MOS40 0465 E4C1 ^14 MOS40 0364 E466 ; MOS40 0465 E4C1 ^14 MOS40 0365 E466 8A TXA MOS40 0465 E4C1 ^14 MOS40 0366 E467 FXN ;entry point used by CLI, C=0 MOS40 0465 E4C1 ^14 MOS40 0367 E467 48 PHA MOS40 0465 E4C1 ^14 MOS40 0368 E468 A9 00 LDAIM ZERO ;set default argument values MOS40 0465 E4C1 ^14 MOS40 0369 E46A 85 E5 STA FXREGX MOS40 0465 E4C1 ^14 MOS40 0370 E46C 85 E4 STA FXREGY MOS40 0465 E4C1 ^14 MOS40 0371 E46E ; MOS40 0465 E4C1 ^14 MOS40 0372 E46E ; check for line end MOS40 0465 E4C1 ^14 MOS40 0373 E46E ; MOS40 0465 E4C1 ^14 MOS40 0374 E46E 20 D3 E0 JSR SKPCM ;N.B. C=0 => just check for line end MOS40 0465 E4C1 ^14 MOS40 0375 E471 ; MOS40 0465 E4C1 ^14 MOS40 0376 E471 ; C=1 => skip an optional comma and check for line end MOS40 0465 E4C1 ^14 MOS40 0377 E471 ; MOS40 0465 E4C1 ^14 MOS40 0378 E471 F0 18 BEQ FX1 ;[line end, just a function code] MOS40 0465 E4C1 ^14 MOS40 0379 E473 ; MOS40 0465 E4C1 ^14 MOS40 0380 E473 ; try reading another argument MOS40 0465 E4C1 ^14 MOS40 0381 E473 ; MOS40 0465 E4C1 ^14 MOS40 0382 E473 20 DE E0 JSR GETNUM MOS40 0465 E4C1 ^14 MOS40 0383 E476 90 D2 BCC BADFX ;[bad FX number] MOS40 0465 E4C1 ^14 MOS40 0384 E478 ; MOS40 0465 E4C1 ^14 MOS40 0385 E478 ; N.B. C=1 MOS40 0465 E4C1 ^14 MOS40 0386 E478 ; MOS40 0465 E4C1 ^14 MOS40 0387 E478 86 E5 STX FXREGX MOS40 0465 E4C1 ^14 MOS40 0388 E47A ; MOS40 0465 E4C1 ^14 MOS40 0389 E47A ; check for line end MOS40 0465 E4C1 ^14 MOS40 0390 E47A ; MOS40 0465 E4C1 ^14 MOS40 0391 E47A 20 D5 E0 JSR SKPCOM MOS40 0465 E4C1 ^14 MOS40 0392 E47D F0 0C BEQ FX1 MOS40 0465 E4C1 ^14 MOS40 0393 E47F ; MOS40 0465 E4C1 ^14 MOS40 0394 E47F ; try reading another argument MOS40 0465 E4C1 ^14 MOS40 0395 E47F ; MOS40 0465 E4C1 ^14 MOS40 0396 E47F 20 DE E0 JSR GETNUM MOS40 0465 E4C1 ^14 MOS40 0397 E482 90 C6 BCC BADFX ;[bad FX number] MOS40 0465 E4C1 ^14 MOS40 0398 E484 86 E4 STX FXREGY MOS40 0465 E4C1 ^14 MOS40 0399 E486 ; MOS40 0465 E4C1 ^14 MOS40 0400 E486 ; ensure line end MOS40 0465 E4C1 ^14 MOS40 0401 E486 ; MOS40 0465 E4C1 ^14 MOS40 0402 E486 20 CA E0 JSR SKIPSP MOS40 0465 E4C1 ^14 MOS40 0403 E489 D0 BF BNE BADFX ;[bad command termination] MOS40 0465 E4C1 ^14 MOS40 0404 E48B ; MOS40 0465 E4C1 ^14 MOS40 0405 E48B FX1 MOS40 0465 E4C1 ^14 MOS40 0406 E48B A4 E4 LDY FXREGY ;load OSBYTE arguments MOS40 0465 E4C1 ^14 MOS40 0407 E48D A6 E5 LDX FXREGX MOS40 0465 E4C1 ^14 MOS40 0408 E48F 68 PLA MOS40 0465 E4C1 ^14 MOS40 0409 E490 20 F4 FF JSR OSBYTE MOS40 0465 E4C1 ^14 MOS40 0410 E493 70 B5 BVS BADFX ;[unrecognised FX code] MOS40 0465 E4C1 ^14 MOS40 0411 E495 [ MOS125 = &FF MOS40 0465 E4C1 ^14 MOS40 0412 E495 | MOS40 0465 E4C1 ^14 MOS40 0413 E495 KEYZAP MOS40 0465 E4C1 ^14 MOS40 0414 E495 ] MOS40 0465 E4C1 ^14 MOS40 0415 E495 60 RTS MOS40 0465 E4C1 ^14 MOS40 0416 E496 MOS40 0465 E4C1 ^14 MOS40 0417 E496 MOS40 0465 E4C1 ^14 MOS40 0418 E496 [ MOS125 = &FF MOS40 0465 E4C1 ^14 MOS40 0419 E496 | MOS40 0465 E4C1 ^14 MOS40 0420 E496 KEY ;KEY MOS40 0465 E4C1 ^14 MOS40 0421 E496 20 DE E0 JSR GETNUM MOS40 0465 E4C1 ^14 MOS40 0422 E499 90 BC BCC BADKEY ;[bad soft key number (>255)] MOS40 0465 E4C1 ^14 MOS40 0423 E49B ; A = character delimiting number MOS40 0465 E4C1 ^14 MOS40 0424 E49B ; X = NUMBER = CSKEY = key number MOS40 0465 E4C1 ^14 MOS40 0425 E49B ; Y = soft key number argument MOS40 0465 E4C1 ^14 MOS40 0426 E49B ; check soft key number range MOS40 0465 E4C1 ^14 MOS40 0427 E49B E0 10 CPXIM NSOFTK MOS40 0465 E4C1 ^14 MOS40 0428 E49D B0 B8 BCS BADKEY ;[soft_key_number > number of soft keys - 1] MOS40 0465 E4C1 ^14 MOS40 0429 E49F ; key number in range 0 to NSOFTK-1 MOS40 0465 E4C1 ^14 MOS40 0430 E49F ; MOS40 0465 E4C1 ^14 MOS40 0431 E49F [ FALSE=0 MOS40 0465 E4C1 ^14 MOS40 0434 E49F ] MOS40 0465 E4C1 ^14 MOS40 0435 E49F ; MOS40 0465 E4C1 ^14 MOS40 0436 E49F 20 D5 E0 JSR SKPCOM ;skip optional spaces and an optional comma MOS40 0465 E4C1 ^14 MOS40 0437 E4A2 08 PHP ;save line end status MOS40 0465 E4C1 ^14 MOS40 0438 E4A3 AE 10 0B LDX SKEND ;Y points to unused portion of soft key buffer area MOS40 0465 E4C1 ^14 MOS40 0439 E4A6 ; (set to reset SKNEND as it might have been set as a result MOS40 0465 E4C1 ^14 MOS40 0440 E4A6 ; of a 'KEY in use' error) MOS40 0465 E4C1 ^14 MOS40 0441 E4A6 98 TYA MOS40 0465 E4C1 ^14 MOS40 0442 E4A7 48 PHA MOS40 0465 E4C1 ^14 MOS40 0443 E4A8 20 0A E5 JSR SKGCR ;delete soft key (uses value in X) MOS40 0465 E4C1 ^14 MOS40 0444 E4AB ; on exit X = SKEND MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 86 MOS40 MOS40 Machine operating system internal commands MOS40 MOS40 0465 E4C1 ^14 MOS40 0445 E4AB 68 PLA MOS40 0465 E4C1 ^14 MOS40 0446 E4AC A8 TAY MOS40 0465 E4C1 ^14 MOS40 0447 E4AD 28 PLP ;restore line end status MOS40 0465 E4C1 ^14 MOS40 0448 E4AE F0 E5 BEQ KEYZAP ; end of line - specified soft key value value has been deleted so return MOS40 0465 E4C1 ^14 MOS40 0449 E4B0 ] MOS40 0465 E4C1 ^14 MOS40 0450 E4B0 CLI1 MOS40 0465 E4C1 ^14 MOS40 0451 E4B0 38 SEC MOS40 0465 E4C1 ^14 MOS40 0452 E4B1 20 98 EA JSR GSINTS ;initialise for reading quoted string MOS40 0465 E4C1 ^14 MOS40 0453 E4B4 CLIWP MOS40 0465 E4C1 ^14 MOS40 0454 E4B4 20 A9 EA JSR GSREAD ;read string character MOS40 0465 E4C1 ^14 MOS40 0455 E4B7 B0 08 BCS CLIY ;end of string MOS40 0465 E4C1 ^14 MOS40 0456 E4B9 E8 INX MOS40 0465 E4C1 ^14 MOS40 0457 E4BA F0 9B BEQ BADKEY ;[buffer full, (N.B. buffer assumed to be 256 bytes long)] MOS40 0465 E4C1 ^14 MOS40 0458 E4BC ; buffer not full MOS40 0465 E4C1 ^14 MOS40 0459 E4BC 9D 00 0B STAAX SKBUF -&01 ;store character in soft key buffer MOS40 0465 E4C1 ^14 MOS40 0460 E4BF ;(N.B. note offset of -1) MOS40 0465 E4C1 ^14 MOS40 0461 E4BF 90 F3 BCC CLIWP ;[ALWAYS jump, go process next character] MOS40 0465 E4C1 ^14 MOS40 0462 E4C1 ; SOFT KEY FINAL CHECK TO SEE IF ANY OTHER KEY SHARES SAME MOS40 0465 E4C1 ^14 MOS40 0463 E4C1 ; VALUE POINTER - IF IT DOES THEN SET IT EQUAL TO SKEND MOS40 0465 E4C1 ^14 MOS40 0464 E4C1 CLIY MOS40 0465 E4C1 ^14 MOS40 0465 E4C1 D0 94 BNE BADKEY ;[string not terminated by CR] -- MOS40 0466 E4C3 ; N.B. new buffer end in X -- MOS40 0467 E4C3 08 PHP -- MOS40 0468 E4C4 78 SEI ;** DISABLE INTERRUPTS ** -- MOS40 0469 E4C5 20 0A E5 JSR SKGCR ;delete old soft key and replace with new value (uses value in X) -- MOS40 0470 E4C8 ;N.B. sets Y to specified soft key number -- MOS40 0471 E4C8 A2 10 LDXIM NSOFTK ;X to be roving soft key number -- MOS40 0472 E4CA CLIYP -- MOS40 0473 E4CA E4 E6 CPX CSKEY MOS40 0482 E4DD ^6B MOS40 0474 E4CC F0 0E BEQ CLIYQ ;[do not process specified soft key] MOS40 0482 E4DD ^6B MOS40 0475 E4CE BD 00 0B LDAAX SKPTR MOS40 0482 E4DD ^6B MOS40 0476 E4D1 D9 00 0B CMPAY SKPTR ;compare soft key buffer pointers MOS40 0482 E4DD ^6B MOS40 0477 E4D4 D0 06 BNE CLIYQ ;[pointers differ] MOS40 0482 E4DD ^6B MOS40 0478 E4D6 AD 10 0B LDA SKEND MOS40 0482 E4DD ^6B MOS40 0479 E4D9 9D 00 0B STAAX SKPTR ;update soft key buffer pointer MOS40 0482 E4DD ^6B MOS40 0480 E4DC CLIYQ MOS40 0482 E4DD ^6B MOS40 0481 E4DC CA DEX MOS40 0482 E4DD ^6B MOS40 0482 E4DD 10 EB BPL CLIYP ;[go process next soft key] -- MOS40 0483 E4DF 28 PLP ;** ENABLE INTERRUPTS ** -- MOS40 0484 E4E0 60 RTS -- MOS40 0485 E4E1 -- MOS40 0486 E4E1 -- MOS40 0487 E4E1 SKSIZE ;A := size of soft key given by Y -- MOS40 0488 E4E1 ; ** THIS MODULE DISABLES INTERRUPTS ** -- MOS40 0489 E4E1 ; this routine is called by soft key set (via *KEY command) -- MOS40 0490 E4E1 ; and soft key read (via RDCH processing). -- MOS40 0491 E4E1 ; the choice is to duplicate the code, using a distinct work slot, -- MOS40 0492 E4E1 ; or share the code within a critical region in order that SKSZWK -- MOS40 0493 E4E1 ; may be shared -- MOS40 0494 E4E1 08 PHP ;save interrupt state -- MOS40 0495 E4E2 78 SEI ;** DISABLE INTERRUPTS ** -- MOS40 0496 E4E3 AD 10 0B LDA SKEND -- MOS40 0497 E4E6 38 SEC -- MOS40 0498 E4E7 F9 00 0B SBCAY SKPTR -- MOS40 0499 E4EA 85 FB STA SKSZWK ;SKSZWK := number of bytes to end of buffer -- MOS40 0500 E4EC 8A TXA -- MOS40 0501 E4ED 48 PHA ;push X -- MOS40 0502 E4EE A2 10 LDXIM NSOFTK ;X is roving soft key number -- MOS40 0503 E4F0 SKS1 -- MOS40 0504 E4F0 BD 00 0B LDAAX SKPTR MOS40 0513 E502 ^6C MOS40 0505 E4F3 38 SEC MOS40 0513 E502 ^6C MOS40 0506 E4F4 F9 00 0B SBCAY SKPTR ;A := length of soft key w.r.t. specified soft key MOS40 0513 E502 ^6C MOS40 0507 E4F7 90 08 BCC SKS2 ;[ignore negative length] MOS40 0513 E502 ^6C MOS40 0508 E4F9 F0 06 BEQ SKS2 ;[ignore zero length] MOS40 0513 E502 ^6C MOS40 0509 E4FB C5 FB CMP SKSZWK MOS40 0513 E502 ^6C MOS40 0510 E4FD B0 02 BCS SKS2 ;[this length >= past lengths] MOS40 0513 E502 ^6C MOS40 0511 E4FF 85 FB STA SKSZWK ;remember new minimum length MOS40 0513 E502 ^6C MOS40 0512 E501 CA SKS2 DEX MOS40 0513 E502 ^6C MOS40 0513 E502 10 EC BPL SKS1 ;[go process next soft key] -- MOS40 0514 E504 68 PLA -- MOS40 0515 E505 AA TAX ;restore X -- MOS40 0516 E506 A5 FB LDA SKSZWK -- MOS40 0517 E508 28 PLP ;** RESTORE INTERRUPT STATE ** -- MOS40 0518 E509 ; A := length of soft key string -- MOS40 0519 E509 ; Y := soft key number given on entry -- MOS40 0520 E509 60 RTS -- MOS40 0521 E50A -- MOS40 0522 E50A -- MOS40 0523 E50A ; SOFT KEY BUFFER GARBAGE COLLECTION ROUTINE.STRING -- MOS40 0524 E50A ; FOR KEY NUMBER GIVEN IN 'CSKEY' IS DELETED & ALL -- MOS40 0525 E50A ; POINTERS ADJUSTED ACC -- MOS40 0526 E50A SKGCR ;delete (and insert) key value(s) -- MOS40 0527 E50A ;** THIS MODULE DISABLES INTERRUPTS ** -- MOS40 0528 E50A 08 PHP ;** SAVE INTERRUPT STATE OF CALLER ** -- MOS40 0529 E50B 78 SEI ;** DISABLE INTERRUPTS ** -- MOS40 0530 E50C ; save new end address -- MOS40 0531 E50C 8A TXA -- MOS40 0532 E50D 48 PHA -- MOS40 0533 E50E A4 E6 LDY CSKEY ;Y is specified soft key number -- MOS40 0534 E510 20 E1 E4 JSR SKSIZE ;A := length of soft key string -- MOS40 0535 E513 ; NOW SKSZWK = LENGTH OF CURRENT SK STRING -- MOS40 0536 E513 ; SO SETUP FOR DELETING THIS STRING. -- MOS40 0537 E513 B9 00 0B LDAAY SKPTR -- MOS40 0538 E516 A8 TAY ;Y points to specified soft key string -- MOS40 0539 E517 18 CLC -- MOS40 0540 E518 65 FB ADC SKSZWK -- MOS40 0541 E51A AA TAX ;X points to start of byte area to be moved down -- MOS40 0542 E51B 85 FA STA KEYSV -- MOS40 0543 E51D ; TO AVOID MASHING POINTER STRUCTURE IF -- MOS40 0544 E51D ; MACHINE CRASHES ELSEWHERE,IT IS ESSENTIAL -- MOS40 0545 E51D ; THAT INTERRUPTS ARE *OFF* FOR THIS NEXT BIT -- MOS40 0546 E51D ; before altering the data structure, check that a soft key -- MOS40 0547 E51D ; is not being used by RDCH -- MOS40 0548 E51D AD 68 02 LDA SOFKL ;A := length of soft key in use by RDCH -- MOS40 0549 E520 F0 0D BEQ SK3 ;[no soft key in use] MOS40 0549 E520 v72 MOS40 0550 E522 ; soft key being 'unwound' by RDCH MOS40 0549 E520 v72 MOS40 0551 E522 ; N.B. altering the data structure would confuse RDCH MOS40 0549 E520 v72 MOS40 0552 E522 00 BRK ;report error 'KEY in use' MOS40 0549 E520 v72 MOS40 0553 E523 FA = KEYUSE MOS40 0549 E520 v72 MOS40 0554 E524 4B 65 79 = "Key in use" MOS40 0549 E520 v72 MOS40 0555 E52E 00 = ZERO ;end of error message MOS40 0549 E520 v72 MOS40 0556 E52F MOS40 0549 E520 v72 MOS40 0557 E52F SK3 MOS40 0549 E520 v72 MOS40 0558 E52F CE 84 02 DEC USKFLG ;indicate update of soft keys in progress (USKFLG<>0) -- MOS40 0559 E532 68 PLA ;A := new end of buffer -- MOS40 0560 E533 38 SEC -- MOS40 0561 E534 E5 FA SBC KEYSV -- MOS40 0562 E536 85 FA STA KEYSV ;KEYSV := number of bytes to copy -- MOS40 0563 E538 F0 0C BEQ SKGCV ;[zero bytes to copy] MOS40 0563 E538 v73 MOS40 0564 E53A SKGCS MOS40 0563 E538 v73 MOS40 0565 E53A BD 01 0B LDAAX SKBUF ;*MOVE MOS40 MOS40 MOS40 MOS40 Acorn macro assembler Page 87 MOS40 MOS40 Machine operating system internal commands MOS40 MOS40 0563 E538 v73 MOS40 0566 E53D 99 01 0B STAAY SKBUF ;*CHARACTERS MOS40 0563 E538 v73 MOS40 0567 E540 C8 INY MOS40 0563 E538 v73 MOS40 0568 E541 E8 INX MOS40 0563 E538 v73 MOS40 0569 E542 C6 FA DEC KEYSV MOS40 0563 E538 v73 MOS40 0570 E544 D0 F4 BNE SKGCS ;[more bytes to copy] MOS40 0563 E538 v73 MOS40 0571 E546 ; NOW ADJUST ALL POINTERS WHICH ARE GREATER MOS40 0563 E538 v73 MOS40 0572 E546 ; THAN THE ONE AT CSKEY. MOS40 0563 E538 v73 MOS40 0573 E546 SKGCV MOS40 0563 E538 v73 MOS40 0574 E546 ; save new end address MOS40 0563 E538 v73 MOS40 0575 E546 98 TYA -- MOS40 0576 E547 48 PHA -- MOS40 0577 E548 A4 E6 LDY CSKEY ;Y is specified soft key number -- MOS40 0578 E54A A2 10 LDXIM NSOFTK ;X is roving soft key number, including end pointer -- MOS40 0579 E54C SKGCT -- MOS40 0580 E54C BD 00 0B LDAAX SKPTR MOS40 0594 E55C ^6E MOS40 0581 E54F D9 00 0B CMPAY SKPTR MOS40 0594 E55C ^6E MOS40 0582 E552 90 07 BCC SKGCU ;[current pointer precedes specified pointer] MOS40 0594 E55C ^6E MOS40 0583 E554 [ TRUE=0 MOS40 0594 E55C ^6E MOS40 0584 E554 F0 05 BEQ SKGCU ;[current pointer equals specified pointer] MOS40 0594 E55C ^6E MOS40 0585 E556 ] MOS40 0594 E55C ^6E MOS40 0586 E556 ; current pointer is beyond specified pointer MOS40 0594 E55C ^6E MOS40 0587 E556 ; if pointers are equal then specified soft key was null ... MOS40 0594 E55C ^6E MOS40 0588 E556 ; ... therefore its size was zero and a drop thru is a no-operation MOS40 0594 E55C ^6E MOS40 0589 E556 ; C=1 MOS40 0594 E55C ^6E MOS40 0590 E556 E5 FB SBC SKSZWK ;C already 1 MOS40 0594 E55C ^6E MOS40 0591 E558 9D 00 0B STAAX SKPTR ;adjust current buffer pointer MOS40 0594 E55C ^6E MOS40 0592 E55B SKGCU MOS40 0594 E55C ^6E MOS40 0593 E55B CA DEX MOS40 0594 E55C ^6E MOS40 0594 E55C 10 EE BPL SKGCT ;[go process next soft key] -- MOS40 0595 E55E ; NOW UPDATE CURRENT KEY POINTER -- MOS40 0596 E55E AD 10 0B LDA SKEND -- MOS40 0597 E561 99 00 0B STAAY SKPTR ;adjust specified soft key pointer to point to end of buffer -- MOS40 0598 E564 68 PLA ;A := new end address -- MOS40 0599 E565 8D 10 0B STA SKEND ;make end buffer pointers equal -- MOS40 0600 E568 AA TAX ;X := new end of buffer pointer -- MOS40 0601 E569 EE 84 02 INC USKFLG ;indicate update of soft keys over (USKFLG=0) -- MOS40 0602 E56C 28 PLP ;** RESTORE INTERRUPT STATE OF CALLER ** -- MOS40 0603 E56D ; X = SKEND -- MOS40 0604 E56D ; Y = specified soft key number -- MOS40 0605 E56D 60 RTS -- MOS40 0606 E56E LNK MOS42 -- MOS42 0001 E56E -- MOS42 0002 E56E ; > MOS42 -- MOS42 0003 E56E TTL MOS42 Buffer management -- MOS42 0004 E56E OPT MOS42 MOS42 MOS42 MOS42 MOS42 Acorn macro assembler Page 88 MOS42 MOS42 Buffer management MOS42 -- MOS42 0005 E56E ;(c) 1981 ACORN Computers Limited -- MOS42 0006 E56E ;BBC Microcomputer Machine Operating System (MOS) -- MOS42 0007 E56E ;Change record: -- MOS42 0008 E56E ;201 01-May-82 PB EVENT restores A -- MOS42 0009 E56E ;004 29-Jul-81 MP Prototype version -- MOS42 0010 E56E ;Author(s): -- MOS42 0011 E56E ;PB Paul Bond -- MOS42 0012 E56E ;MP Mike Prees -- MOS42 0013 E56E ; buffer address table (hi byte) -- MOS42 0014 E56E BFADHI -- MOS42 0015 E56E 03 = /(RDCHBF+RDCHSZ-&0100 ) -- MOS42 0016 E56F 0A = /(RSRIBF+RSRISZ-&0100 ) -- MOS42 0017 E570 08 = /(RSROBF+RSROSZ-&0100 ) -- MOS42 0018 E571 07 = /(PRNBF+PRNSZ-&0100 ) -- MOS42 0019 E572 07 = /(SNDBF1+SBSIZE-&0100 ) -- MOS42 0020 E573 07 = /(SNDBF2+SBSIZE-&0100 ) -- MOS42 0021 E574 07 = /(SNDBF3+SBSIZE-&0100 ) -- MOS42 0022 E575 07 = /(SNDBF4+SBSIZE-&0100 ) -- MOS42 0023 E576 09 = /(SPCHBF+SPCHSZ-&0100 ) -- MOS42 0024 E577 ; buffer address table (lo byte) -- MOS42 0025 E577 BFADLO -- MOS42 0026 E577 00 = RDCHBF+RDCHSZ-&0100 ;RDCH (keyboard) buffer -- MOS42 0027 E578 00 = RSRIBF+RSRISZ-&0100 ;RS423 input -- MOS42 0028 E579 C0 = RSROBF+RSROSZ-&0100 ;RS423 output -- MOS42 0029 E57A C0 = PRNBF+PRNSZ-&0100 ;print -- MOS42 0030 E57B 50 = SNDBF1+SBSIZE-&0100 ;sound channel 1 -- MOS42 0031 E57C 60 = SNDBF2+SBSIZE-&0100 ;sound channel 2 -- MOS42 0032 E57D 70 = SNDBF3+SBSIZE-&0100 ;sound channel 3 -- MOS42 0033 E57E 80 = SNDBF4+SBSIZE-&0100 ;sound channel 4 -- MOS42 0034 E57F 00 = SPCHBF+SPCHSZ-&0100 ;speech -- MOS42 0035 E580 ; buffer origin offsets within page -- MOS42 0036 E580 BFORG -- MOS42 0037 E580 E0 = &0100-RDCHSZ -- MOS42 0038 E581 00 = &0100-RSRISZ -- MOS42 0039 E582 40 = &0100-RSROSZ -- MOS42 0040 E583 C0 = &0100-PRNSZ -- MOS42 0041 E584 F0 = &0100-SBSIZE -- MOS42 0042 E585 F0 = &0100-SBSIZE -- MOS42 0043 E586 F0 = &0100-SBSIZE -- MOS42 0044 E587 F0 = &0100-SBSIZE -- MOS42 0045 E588 C0 = &0100-SPCHSZ -- MOS42 0046 E589 ; general buffer manipulation routines -- MOS42 0047 E589 SETBUF -- MOS42 0048 E589 ; set buffer pointer -- MOS42 0049 E589 BD 77 E5 LDAAX BFADLO -- MOS42 0050 E58C 85 FA STA BUFFLO -- MOS42 0051 E58E BD 6E E5 LDAAX BFADHI -- MOS42 0052 E591 85 FB STA BUFFHI -- MOS42 0053 E593 60 RTS -- MOS42 0054 E594 -- MOS42 0055 E594 -- MOS42 0056 E594 EXAM ;examine character in buffer -- MOS42 0057 E594 2C 55 D9 BIT FFBYT ;V=1 => examine option -- MOS42 0058 E597 70 01 BVS EXAM1 ;[ALWAYS jump] MOS42 0058 E597 v7E MOS42 0059 E599 ; NEVER fall thru MOS42 0058 E597 v7E MOS42 0060 E599 REMOV ;remove character from buffer MOS42 0058 E597 v7E MOS42 0061 E599 B8 CLV ;V=0 => indicate remove option MOS42 0058 E597 v7E MOS42 0062 E59A ; X = buffer index MOS42 0058 E597 v7E MOS42 0063 E59A ; V=0 => remove, V=1 => examine MOS42 0058 E597 v7E MOS42 0064 E59A EXAM1 ;entered with V=1 MOS42 0058 E597 v7E MOS42 0065 E59A ; MOS42 0058 E597 v7E MOS42 0066 E59A 6C 2C 02 JMI REMVEC ;use indirection (defaults to REM) -- MOS42 0067 E59D ; -- MOS42 0068 E59D [ MOS125 = &FF -- MOS42 0198 E59D ] -- MOS42 0199 E59D -- MOS42 0200 E59D -- MOS42 0201 E59D CAPS ;test for an uppercase letter -- MOS42 0202 E59D -- MOS42 0203 E59D [ MOS125 = &FF -- MOS42 0216 E59D | -- MOS42 0217 E59D 48 PHA -- MOS42 0218 E59E ;Must preserve V during LOADGO->SRCH0->LOOK->CMPFT->CAPS -- MOS42 0219 E59E ;ANDIM &DF;CMPIM "A";EORIM &FF;RORA;ADCIM "Z":SHR:1 -- MOS42 0220 E59E ;ORAIM &20;CMPIM "z"+&01;EORIM &FF;RORA;ADCIM ("a":SHR:1):OR:&80 -- MOS42 0221 E59E 29 DF ANDIM &DF -- MOS42 0222 E5A0 C9 5B CMPIM "Z"+&01 -- MOS42 0223 E5A2 B0 04 BCS CAPSX MOS42 0223 E5A2 v7B MOS42 0224 E5A4 49 FF EORIM &FF MOS42 0223 E5A2 v7B MOS42 0225 E5A6 C9 BF CMPIM "A"-&01:EOR:&FF MOS42 0223 E5A2 v7B MOS42 0226 E5A8 CAPSX MOS42 0223 E5A2 v7B MOS42 0227 E5A8 68 PLA -- MOS42 0228 E5A9 ; C=0 => Pass, C=1 => Fail -- MOS42 0229 E5A9 60 RTS -- MOS42 0230 E5AA ] -- MOS42 0231 E5AA -- MOS42 0232 E5AA -- MOS42 0233 E5AA [ MOS125 = &FF -- MOS42 0269 E5AA ] -- MOS42 0270 E5AA -- MOS42 0271 E5AA RDCHGX ;check for cursor option 1 -- MOS42 0272 E5AA 6A RORA MOS42 0394 E5F5 ^33 MOS42 0273 E5AB 68 PLA MOS42 0394 E5F5 ^33 MOS42 0274 E5AC B0 78 BCS RDCHGCLC ;[option 1 active, return &87..&8B] MOS42 0274 E5AC v07 MOS42 0275 E5AE ; treat as cursor option 2 MOS42 0274 E5AC v07 MOS42 0276 E5AE RDCHGS ;process character as real softkey MOS42 0274 E5AC v07 MOS42 0277 E5AE 98 TYA ;A := character MOS42 0274 E5AC v07 MOS42 0278 E5AF ; MOS42 0274 E5AC v07 MOS42 0279 E5AF [ MOS125 = &FF MOS42 0274 E5AC v07 MOS42 0300 E5AF | MOS42 0274 E5AC v07 MOS42 0301 E5AF 29 0F ANDIM &0F MOS42 0274 E5AC v07 MOS42 0302 E5B1 48 PHA MOS42 0274 E5AC v07 MOS42 0303 E5B2 98 TYA MOS42 0274 E5AC v07 MOS42 0304 E5B3 4A LSRA MOS42 0274 E5AC v07 MOS42 0305 E5B4 4A LSRA MOS42 0274 E5AC v07 MOS42 0306 E5B5 4A LSRA MOS42 0274 E5AC v07 MOS42 0307 E5B6 4A LSRA MOS42 0274 E5AC v07 MOS42 0308 E5B7 ; MOS42 0274 E5AC v07 MOS42 0309 E5B7 49 04 EORIM &04 ;fudge to tie in with frozen documentation MOS42 0274 E5AC v07 MOS42 0310 E5B9 A8 TAY MOS42 0274 E5AC v07 MOS42 0311 E5BA ; character on stack MOS42 0274 E5AC v07 MOS42 0312 E5BA ; MOS42 0274 E5AC v07 MOS42 0313 E5BA A9 01 LDAIM &01 MOS42 0274 E5AC v07 MOS42 0314 E5BC D9 65 02 CMPAY SOFTLO-&08 MOS42 0274 E5AC v07 MOS42 0315 E5BF F0 67 BEQ GKEY ;[expand softkey] MOS42 0274 E5AC v07 MOS42 0316 E5C1 68 PLA ;restore character MOS42 0274 E5AC v07 MOS42 0317 E5C2 B0 0A BCS RDCHG1 ;[ignore key] MOS42 0274 E5AC v07 MOS42 0318 E5C4 ; return byte code MOS42 0274 E5AC v07 MOS42 0319 E5C4 ; C=0 MOS42 0274 E5AC v07 MOS42 0320 E5C4 79 65 02 ADCAY SOFTLO-&08 MOS42 0274 E5AC v07 MOS42 0321 E5C7 ] MOS42 MOS42 MOS42 MOS42 Acorn macro assembler Page 89 MOS42 MOS42 Buffer management MOS42 MOS42 0274 E5AC v07 MOS42 0322 E5C7 MOS42 0274 E5AC v07 MOS42 0323 E5C7 18 CLC MOS42 0274 E5AC v07 MOS42 0324 E5C8 60 RTS ;read successful, character in A MOS42 0274 E5AC v07 MOS42 0325 E5C9 MOS42 0274 E5AC v07 MOS42 0326 E5C9 MOS42 0274 E5AC v07 MOS42 0327 E5C9 RDCHGB MOS42 0274 E5AC v07 MOS42 0328 E5C9 ; invalid character at cursor position MOS42 0274 E5AC v07 MOS42 0329 E5C9 ; complain by transmitting BEL MOS42 0274 E5AC v07 MOS42 0330 E5C9 20 BA E8 JSR BELL ;**** N.B. NOT THRU OSWRCH **** must restore X MOS42 0274 E5AC v07 MOS42 0331 E5CC 68 PLA MOS42 0274 E5AC v07 MOS42 0332 E5CD AA TAX ;restore X MOS42 0274 E5AC v07 MOS42 0333 E5CE ; get next character MOS42 0274 E5AC v07 MOS42 0334 E5CE ; MOS42 0274 E5AC v07 MOS42 0335 E5CE RDCHG1 ;process character from currently selected input buffer MOS42 0274 E5AC v07 MOS42 0336 E5CE 20 99 E5 JSR REMOV ;get character from buffer MOS42 0274 E5AC v07 MOS42 0337 E5D1 B0 54 BCS RDCHG0 ;[buffer empty, C=1] MOS42 0274 E5AC v07 MOS42 0338 E5D3 ; MOS42 0274 E5AC v07 MOS42 0339 E5D3 ; C=0 MOS42 0274 E5AC v07 MOS42 0340 E5D3 ; MOS42 0274 E5AC v07 MOS42 0341 E5D3 ; character is in A MOS42 0274 E5AC v07 MOS42 0342 E5D3 ; MOS42 0274 E5AC v07 MOS42 0343 E5D3 ; check whether to set RTS hi for RS423 input MOS42 0274 E5AC v07 MOS42 0344 E5D3 ; save A MOS42 0274 E5AC v07 MOS42 0345 E5D3 48 PHA MOS42 0274 E5AC v07 MOS42 0346 E5D4 ; MOS42 0274 E5AC v07 MOS42 0347 E5D4 ; check for RS423 input buffer MOS42 0274 E5AC v07 MOS42 0348 E5D4 E0 01 CPXIM BRSI MOS42 0274 E5AC v07 MOS42 0349 E5D6 D0 06 BNE RDCHL ;[keyboard buffer, C=0] MOS42 0274 E5AC v07 MOS42 0350 E5D8 ; MOS42 0274 E5AC v07 MOS42 0351 E5D8 20 D0 E2 JSR RSETX ;set RHITXE if applicable MOS42 0274 E5AC v07 MOS42 0352 E5DB ; MOS42 0274 E5AC v07 MOS42 0353 E5DB A2 01 LDXIM BRSI ;restore bufferid MOS42 0274 E5AC v07 MOS42 0354 E5DD 38 SEC MOS42 0274 E5AC v07 MOS42 0355 E5DE ; MOS42 0274 E5AC v07 MOS42 0356 E5DE RDCHL ;do not alter RTS MOS42 0274 E5AC v07 MOS42 0357 E5DE ; C=0 => keyboard, C=1 => RS423 MOS42 0274 E5AC v07 MOS42 0358 E5DE ; MOS42 0274 E5AC v07 MOS42 0359 E5DE ; restore A MOS42 0274 E5AC v07 MOS42 0360 E5DE 68 PLA MOS42 0274 E5AC v07 MOS42 0361 E5DF ; MOS42 0274 E5AC v07 MOS42 0362 E5DF 90 05 BCC RDCHK ;[keyboard] MOS42 0274 E5AC v07 MOS42 0363 E5E1 ; MOS42 0274 E5AC v07 MOS42 0364 E5E1 ; RS423 MOS42 0274 E5AC v07 MOS42 0365 E5E1 ; MOS42 0274 E5AC v07 MOS42 0366 E5E1 AC 45 02 LDY RS8BIT MOS42 0274 E5AC v07 MOS42 0367 E5E4 D0 40 BNE RDCHGCLC ;[let RS423 deliver 8 bit codes] MOS42 0274 E5AC v07 MOS42 0368 E5E6 RDCHK MOS42 0274 E5AC v07 MOS42 0369 E5E6 ; MOS42 0274 E5AC v07 MOS42 0370 E5E6 ; test to see if it is a softkey (real or pseudo) MOS42 0274 E5AC v07 MOS42 0371 E5E6 A8 TAY ;Y := character MOS42 0274 E5AC v07 MOS42 0372 E5E7 10 3D BPL RDCHGCLC ;[not a soft key (top bit zero), C=0] MOS42 0274 E5AC v07 MOS42 0373 E5E9 MOS42 0274 E5AC v07 MOS42 0374 E5E9 [ FALSE=0 MOS42 0274 E5AC v07 MOS42 0377 E5E9 ] MOS42 0274 E5AC v07 MOS42 0378 E5E9 MOS42 0274 E5AC v07 MOS42 0379 E5E9 ; character is a softkey MOS42 0274 E5AC v07 MOS42 0380 E5E9 ; check for cursor control key MOS42 0274 E5AC v07 MOS42 0381 E5E9 29 0F ANDIM &0F MOS42 0274 E5AC v07 MOS42 0382 E5EB C9 0B CMPIM MCOPY-SOFTK0 MOS42 0274 E5AC v07 MOS42 0383 E5ED 90 BF BCC RDCHGS ;[not a cursor control, therefore a real softkey] MOS42 0274 E5AC v07 MOS42 0384 E5EF ; cursor control key MOS42 0274 E5AC v07 MOS42 0385 E5EF ; C=1 MOS42 0274 E5AC v07 MOS42 0386 E5EF ; convert character to codes &87..&8B MOS42 0274 E5AC v07 MOS42 0387 E5EF 69 7B ADCIM &87-MCOPY+SOFTK0-&1 MOS42 0274 E5AC v07 MOS42 0388 E5F1 48 PHA ;save converted code, real character still in Y MOS42 0274 E5AC v07 MOS42 0389 E5F2 ; there are 3 cursor options (selected by *FX4) MOS42 0274 E5AC v07 MOS42 0390 E5F2 ; 0 cursor edit VDU MOS42 0274 E5AC v07 MOS42 0391 E5F2 ; 1 return codes &87..&8B MOS42 0274 E5AC v07 MOS42 0392 E5F2 ; 2 treat as softkey MOS42 0274 E5AC v07 MOS42 0393 E5F2 AD 7D 02 LDA CURSED MOS42 0274 E5AC v07 MOS42 0394 E5F5 D0 B3 BNE RDCHGX ;[not option 0] MOS42 0274 E5AC v07 MOS42 0395 E5F7 ; option 0 MOS42 0274 E5AC v07 MOS42 0396 E5F7 ; check if output to VDU MOS42 0274 E5AC v07 MOS42 0397 E5F7 AD 7C 02 LDA WRCHSW MOS42 0274 E5AC v07 MOS42 0398 E5FA 6A RORA MOS42 0274 E5AC v07 MOS42 0399 E5FB 6A RORA MOS42 0274 E5AC v07 MOS42 0400 E5FC 68 PLA ;restore converted code MOS42 0274 E5AC v07 MOS42 0401 E5FD B0 CF BCS RDCHG1 ;[ignore character, output not to VDU] MOS42 0274 E5AC v07 MOS42 0402 E5FF ; let VDU process code MOS42 0274 E5AC v07 MOS42 0403 E5FF C9 87 CMPIM &87 MOS42 0274 E5AC v07 MOS42 0404 E601 F0 35 BEQ RDCHGY ;[COPY key] MOS42 0274 E5AC v07 MOS42 0405 E603 ; cursor direction key MOS42 0274 E5AC v07 MOS42 0406 E603 A8 TAY ;save X MOS42 0274 E5AC v07 MOS42 0407 E604 8A TXA MOS42 0274 E5AC v07 MOS42 0408 E605 48 PHA MOS42 0274 E5AC v07 MOS42 0409 E606 [ MOS125 = &FF MOS42 0274 E5AC v07 MOS42 0411 E606 ] MOS42 0274 E5AC v07 MOS42 0412 E606 20 C2 C5 JSR VDUB ;N.B. cursor control entry point MOS42 0274 E5AC v07 MOS42 0413 E609 68 PLA MOS42 0274 E5AC v07 MOS42 0414 E60A AA TAX ;restore X MOS42 0274 E5AC v07 MOS42 0415 E60B ; falling thru will transfer control to RDCHG1 MOS42 0274 E5AC v07 MOS42 0416 E60B RDCHG MOS42 0274 E5AC v07 MOS42 0417 E60B ; FETCH CHAR FROM RDCH BUFFER MOS42 0274 E5AC v07 MOS42 0418 E60B ; EXPAND SOFT KEYS AS NECESSARY MOS42 0274 E5AC v07 MOS42 0419 E60B ; PASS CURSOR CONTROL KEYS MOS42 0274 E5AC v07 MOS42 0420 E60B ; STRAIGHT TO VDU DRIVER MOS42 0274 E5AC v07 MOS42 0421 E60B ; RETURN CARRY SET IF CHARACTER MOS42 0274 E5AC v07 MOS42 0422 E60B ; AVAILABLE MOS42 0274 E5AC v07 MOS42 0423 E60B ; MOS42 0274 E5AC v07 MOS42 0424 E60B ; check for ECONET interception MOS42 0274 E5AC v07 MOS42 0425 E60B ; MOS42 0274 E5AC v07 MOS42 0426 E60B 2C 5F 02 BIT NETRDC MOS42 0274 E5AC v07 MOS42 0427 E60E 10 05 BPL RDCHNM ;[normal RDCH] MOS42 0274 E5AC v07 MOS42 0428 E610 ; MOS42 0274 E5AC v07 MOS42 0429 E610 ; let network supply character MOS42 0274 E5AC v07 MOS42 0430 E610 ; MOS42 0274 E5AC v07 MOS42 0431 E610 A9 06 LDAIM NTRDCH MOS42 0274 E5AC v07 MOS42 0432 E612 6C 24 02 JMINET JMI NETVEC ;network operation call, results returned in A and C MOS42 0274 E5AC v07 MOS42 0433 E615 MOS42 0274 E5AC v07 MOS42 0434 E615 MOS42 0274 E5AC v07 MOS42 0435 E615 RDCHNM ;not reading from network MOS42 0274 E5AC v07 MOS42 0436 E615 AD 68 02 LDA SOFKL MOS42 0274 E5AC v07 MOS42 0437 E618 F0 B4 BEQ RDCHG1 ;[no pending soft key expansion] MOS42 0274 E5AC v07 MOS42 0438 E61A AC C9 02 LDY SOFKP MOS42 0274 E5AC v07 MOS42 0439 E61D B9 01 0B LDAAY SKBUF ;GET EXPANSION CHAR MOS42 0274 E5AC v07 MOS42 0440 E620 EE C9 02 INC SOFKP ;increment pointer into soft key buffer MOS42 0274 E5AC v07 MOS42 0441 E623 CE 68 02 DEC SOFKL ;decrement remaining count of soft key characters MOS42 0274 E5AC v07 MOS42 0442 E626 RDCHGCLC MOS42 0274 E5AC v07 MOS42 0443 E626 18 CLC ;C=0 => character read successfully MOS42 0465 E63E ^09 MOS42 0444 E627 RDCHG0 MOS42 0465 E63E ^09 MOS42 0445 E627 60 RTS MOS42 MOS42 MOS42 MOS42 Acorn macro assembler Page 90 MOS42 MOS42 Buffer management MOS42 MOS42 0465 E63E ^09 MOS42 0446 E628 MOS42 0465 E63E ^09 MOS42 0447 E628 GKEY ;soft key detected AND soft keys enabled MOS42 0465 E63E ^09 MOS42 0448 E628 68 PLA ;restore softkey code MOS42 0465 E63E ^09 MOS42 0449 E629 [ MOS125 = &FF MOS42 0465 E63E ^09 MOS42 0451 E629 ] MOS42 0465 E63E ^09 MOS42 0452 E629 A8 TAY ;Y := soft key number MOS42 0465 E63E ^09 MOS42 0453 E62A 20 E1 E4 JSR SKSIZE ;A := length of soft key string given by Y MOS42 0465 E63E ^09 MOS42 0454 E62D 8D 68 02 STA SOFKL ;SOFKL := length of soft key string MOS42 0465 E63E ^09 MOS42 0455 E630 ; N.B. X = soft key number MOS42 0465 E63E ^09 MOS42 0456 E630 B9 00 0B LDAAY SKPTR MOS42 0465 E63E ^09 MOS42 0457 E633 8D C9 02 STA SOFKP ;SOFKP points to key string (N.B. pointer always <> 0) MOS42 0465 E63E ^09 MOS42 0458 E636 D0 D3 BNE RDCHG ;[ALWAYS JUMP] MOS42 0465 E63E ^09 MOS42 0459 E638 MOS42 0465 E63E ^09 MOS42 0460 E638 RDCHGY ;copy character at text cursor position MOS42 0465 E63E ^09 MOS42 0461 E638 8A TXA MOS42 0465 E63E ^09 MOS42 0462 E639 48 PHA ;save X MOS42 0465 E63E ^09 MOS42 0463 E63A 20 9A D8 JSR COPYCH ;N.B. VDU sets Z bit, but this is not used MOS42 0465 E63E ^09 MOS42 0464 E63D A8 TAY ;save character MOS42 0465 E63E ^09 MOS42 0465 E63E F0 89 BEQ RDCHGB ;[invalid character at text cursor] -- MOS42 0466 E640 ; valid character at cursor position -- MOS42 0467 E640 68 PLA -- MOS42 0468 E641 AA TAX ;restore X -- MOS42 0469 E642 98 TYA ;restore character -- MOS42 0470 E643 ; C=0, character in A -- MOS42 0471 E643 18 CLC -- MOS42 0472 E644 60 RTS -- MOS42 0473 E645 -- MOS42 0474 E645 -- MOS42 0475 E645 LNK MOS44 -- MOS44 0001 E645 ; > MOS44 -- MOS44 0002 E645 TTL MOS44 OSBYTE routines -- MOS44 0003 E645 OPT MOS44 MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 91 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0004 E645 ;(c) 1981 ACORN Computers Limited -- MOS44 0005 E645 ;BBC Microcomputer Machine Operating System (MOS) -- MOS44 0006 E645 ;Change record: -- MOS44 0007 E645 ;01-Mar-82 PB PEEK and POKE introduced -- MOS44 0008 E645 ;Author(s): -- MOS44 0009 E645 ;PB Paul Bond -- MOS44 0010 E645 -- MOS44 0011 E645 -- MOS44 0012 E645 BYTET ;table for OSBYTE. N.B. lo-byte followed by hi-byte -- MOS44 0013 E645 ; -- MOS44 0014 E645 ; 0 indicate version number -- MOS44 0015 E645 ; X=0 => BRK message -- MOS44 0016 E645 ; X<>0 => return version number in X -- MOS44 0017 E645 90 EA & VER -- MOS44 0018 E647 -- MOS44 0019 E647 ; -- MOS44 0020 E647 ; 1 set value -- MOS44 0021 E647 C8 E9 & V2B156 -- MOS44 0022 E649 -- MOS44 0023 E649 ; -- MOS44 0024 E649 ; 2 select input stream -- MOS44 0025 E649 ; X=0 => select keyboard, disable RS423 -- MOS44 0026 E649 ; X=1 => select RS423, enable RS423 -- MOS44 0027 E649 ; X=2 => select keyboard, enable RS423 -- MOS44 0028 E649 5F E7 & SELIN -- MOS44 0029 E64B -- MOS44 0030 E64B ; -- MOS44 0031 E64B ; 3 select output stream(s) -- MOS44 0032 E64B ; X=rrrrspvl -- MOS44 0033 E64B ; r (reserved) -- MOS44 0034 E64B ; s=0 => spooling enabled -- MOS44 0035 E64B ; p=0 => printing enabled -- MOS44 0036 E64B ; v=0 => output to VDU enabled -- MOS44 0037 E64B ; l=1 => output to RS423 enabled -- MOS44 0038 E64B D7 E9 & V2B34 -- MOS44 0039 E64D -- MOS44 0040 E64D ; -- MOS44 0041 E64D ; 4 enable/disable cursor edit -- MOS44 0042 E64D ; X=0 => cursor editing enabled -- MOS44 0043 E64D ; X=1 => COPY/LEFT/RIGHT/DOWN/UP return $87/$88/$89/$8A/$8B -- MOS44 0044 E64D ; X=2 => COPY/LEFT/RIGHT/DOWN/UP at as soft keys 11 thru 15 -- MOS44 0045 E64D D7 E9 & V2B34 -- MOS44 0046 E64F -- MOS44 0047 E64F ; -- MOS44 0048 E64F ; 5 select print destination -- MOS44 0049 E64F ; X=0 => infinite sink -- MOS44 0050 E64F ; X=1 => centronics -- MOS44 0051 E64F ; X=2 => RS423 -- MOS44 0052 E64F B6 E9 & SPRINT -- MOS44 0053 E651 -- MOS44 0054 E651 ; -- MOS44 0055 E651 ; 6 set printer ignore character -- MOS44 0056 E651 ; X=0 => ignore no characters -- MOS44 0057 E651 ; X<>0 => ignore character -- MOS44 0058 E651 C8 E9 & V2B156 -- MOS44 0059 E653 -- MOS44 0060 E653 ; -- MOS44 0061 E653 ; 7 set RS423 receive baud rate -- MOS44 0062 E653 ; X=0 => set default (9600) -- MOS44 0063 E653 ; X=1/2/3/4/5/6/7/8 => 75/150/300/1200/2400/4800/9600/19200 -- MOS44 0064 E653 1C E7 & RXBAUD -- MOS44 0065 E655 -- MOS44 0066 E655 ; -- MOS44 0067 E655 ; 8 set RS423 trasmit baud rate -- MOS44 0068 E655 ; [values as for OSBYTE(7)] -- MOS44 0069 E655 1A E7 & TXBAUD -- MOS44 0070 E657 -- MOS44 0071 E657 ; -- MOS44 0072 E657 ; 9 set flash mark period -- MOS44 0073 E657 ; X=0 => infinite -- MOS44 0074 E657 ; X<>0 => * 20 milliseconds -- MOS44 0075 E657 3C E7 & FMRK -- MOS44 0076 E659 -- MOS44 0077 E659 ; -- MOS44 0078 E659 ; 10 set flash space period -- MOS44 0079 E659 ; 9 set flash mark period -- MOS44 0080 E659 ; X=0 => infinite -- MOS44 0081 E659 ; X<>0 => * 20 milliseconds -- MOS44 0082 E659 3E E7 & FSPC -- MOS44 0083 E65B -- MOS44 0084 E65B ; -- MOS44 0085 E65B ; 11 set auto-repeat delay period -- MOS44 0086 E65B ; X=0 => suppress auto-repeat -- MOS44 0087 E65B ; X<>0 => set delay between first and second character to centiseconds -- MOS44 0088 E65B D5 E9 & ARDLY -- MOS44 0089 E65D -- MOS44 0090 E65D ; -- MOS44 0091 E65D ; 12 set auto-repeat repeat period -- MOS44 0092 E65D ; X=0 => set delay and period to values on power-up -- MOS44 0093 E65D ; X<>0 => set period between subsequent characters to centiseconds -- MOS44 0094 E65D CC E9 & ARRPT -- MOS44 0095 E65F -- MOS44 0096 E65F ; -- MOS44 0097 E65F ; 13 disable event -- MOS44 0098 E65F ; X=event_code -- MOS44 0099 E65F ; 0: output buffer empty -- MOS44 0100 E65F ; 1: input buffer full -- MOS44 0101 E65F ; 2: character entering input buffer -- MOS44 0102 E65F ; 3: ADC conversion complete -- MOS44 0103 E65F ; 4: vertical SYNC -- MOS44 0104 E65F ; 5: interval timer crossing zero -- MOS44 0105 E65F ; 6: ESCAPE detected -- MOS44 0106 E65F ; 7: RS423 error -- MOS44 0107 E65F 85 E7 & MDSABL -- MOS44 0108 E661 -- MOS44 0109 E661 ; -- MOS44 0110 E661 ; 14 enable event -- MOS44 0111 E661 ; [values as for OSBYTE(13)] -- MOS44 0112 E661 86 E7 & ENABLE -- MOS44 0113 E663 -- MOS44 0114 E663 ; -- MOS44 0115 E663 ; 15 flush buffer class -- MOS44 0116 E663 ; X=0 => flush all buffers -- MOS44 0117 E663 ; X=1 => flush currently selected input buffer -- MOS44 0118 E663 5F E2 & FLUSHC -- MOS44 0119 E665 -- MOS44 0120 E665 ; -- MOS44 0121 E665 ; 16 select number of ADC channels -- MOS44 0122 E665 ; X=0 => stop scanning ADC channels -- MOS44 0123 E665 ; X=1/2/3/4 => only scan channels 1 thru -- MOS44 0124 E665 92 E7 & SETADC MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 92 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0125 E667 -- MOS44 0126 E667 ; -- MOS44 0127 E667 ; 17 start ADC conversion on channel X -- MOS44 0128 E667 ; X=1/2/3/4 => start conversion on channel -- MOS44 0129 E667 44 DE & ADCBEG -- MOS44 0130 E669 -- MOS44 0131 E669 ; -- MOS44 0132 E669 ; 18 reset soft keys -- MOS44 0133 E669 07 EA & RSOFT -- MOS44 0134 E66B -- MOS44 0135 E66B ; -- MOS44 0136 E66B ; 19 wait for vertical sync -- MOS44 0137 E66B F5 E9 & WFVS -- MOS44 0138 E66D -- MOS44 0139 E66D ; -- MOS44 0140 E66D ; 20 implode/explode soft font -- MOS44 0141 E66D 1A CD & FONT -- MOS44 0142 E66F -- MOS44 0143 E66F ; -- MOS44 0144 E66F ; 21 flush specific buffer -- MOS44 0145 E66F 6B E2 & FLUSHS -- MOS44 0146 E671 -- MOS44 0147 E671 ; -- MOS44 0148 E671 0016 BYTEL * .-BYTET:SHR: 1 ;next entry in BYTETL table (lo component) -- MOS44 0149 E671 ; -- MOS44 0150 E671 BYTET2 -- MOS44 0151 E671 0075 BYTEM * &0075 -- MOS44 0152 E671 ; -- MOS44 0153 E671 ; -- MOS44 0154 E671 B7 E8 & VDUST ;read VDU status; $75 -- MOS44 0155 E673 -- MOS44 0156 E673 ; -- MOS44 0157 E673 18 EA & MOSTST ;reflect state of KSTAT; $76 -- MOS44 0158 E675 -- MOS44 0159 E675 ; -- MOS44 0160 E675 C6 E3 & SHUTES ;close EXEC and SPOOL files; $77 -- MOS44 0161 E677 -- MOS44 0162 E677 ; -- MOS44 0163 E677 5B F2 & OLDKEY ;set keyboard old key; $78 -- MOS44 0164 E679 -- MOS44 0165 E679 ; -- MOS44 0166 E679 DE F0 & XSCANB ;scan keyboard at specific address; $79 -- MOS44 0167 E67B -- MOS44 0168 E67B ; -- MOS44 0169 E67B DC F0 & XSCANA ;scan keyboard from matrix entry $10; $7A -- MOS44 0170 E67D -- MOS44 0171 E67D ; -- MOS44 0172 E67D F4 E2 & PFREE ;indicate printer dormant; $7B -- MOS44 0173 E67F -- MOS44 0174 E67F ; -- MOS44 0175 E67F 05 E7 & CESCPC ;clear escape flag; $7C -- MOS44 0176 E681 -- MOS44 0177 E681 ; -- MOS44 0178 E681 06 E7 & CESCPS ;set escape flag; $7D -- MOS44 0179 E683 -- MOS44 0180 E683 ; -- MOS44 0181 E683 EE E6 & CESCP ;clear escape flag and purge selected input buffer; $7E -- MOS44 0182 E685 -- MOS44 0183 E685 ; -- MOS44 0184 E685 C9 F0 & EOF ;end of file; $7F -- MOS44 0185 E687 -- MOS44 0186 E687 ; -- MOS44 0187 E687 ; $80 -- MOS44 0188 E687 ;; read data on ADC channel -- MOS44 0189 E687 ; in: Y>=0 => X=0 => read control information -- MOS44 0190 E687 ; X<>0 => read last conversion on channel X -- MOS44 0191 E687 ; Y<0 => read info for buffer NOT(X) -- MOS44 0192 E687 ; out: Y>=0 => X=0 => X=fire-buttons, Y=last-channel-to-convert -- MOS44 0193 E687 ; X<>0 => X=lo-data, Y=hi-data -- MOS44 0194 E687 ; Y<0 => X=buffer-count (input: bytes ready, output: bytes left) -- MOS44 0195 E687 CD E7 & RADCX -- MOS44 0196 E689 -- MOS44 0197 E689 ; -- MOS44 0198 E689 ; $81 -- MOS44 0199 E689 ; read key with time limit -- MOS44 0200 E689 ; in: Y>=0 => X=lo-count, Y=hi-count (centiseconds) -- MOS44 0201 E689 ; Y<0 => X=NOT(key-matrix-address) -- MOS44 0202 E689 ; out: Y>=0 => Y=$00 => X=character -- MOS44 0203 E689 ; Y=$1B => escape condition detected -- MOS44 0204 E689 ; Y=$FF => timeout -- MOS44 0205 E689 ; Y<0 => X=0 => key not pressed -- MOS44 0206 E689 ; X<>0 => key pressed -- MOS44 0207 E689 9F E7 & INKY -- MOS44 0208 E68B -- MOS44 0209 E68B ; -- MOS44 0210 E68B ; $82 -- MOS44 0211 E68B ; read machine high order address -- MOS44 0212 E68B ; out: X = lo-component, Y = hi-component -- MOS44 0213 E68B B5 E7 & RMHA -- MOS44 0214 E68D -- MOS44 0215 E68D ; -- MOS44 0216 E68D ; $83 -- MOS44 0217 E68D ; read operating system high water mark -- MOS44 0218 E68D ; out: X = lo-address, Y = hi-address -- MOS44 0219 E68D B8 F0 & RMLA -- MOS44 0220 E68F -- MOS44 0221 E68F ; -- MOS44 0222 E68F ; $84 -- MOS44 0223 E68F ; read address of start of current screen mode -- MOS44 0224 E68F ; out: X = lo-address, Y = hi-address -- MOS44 0225 E68F B8 D8 & TOPCMD -- MOS44 0226 E691 -- MOS44 0227 E691 ; -- MOS44 0228 E691 ; $85 -- MOS44 0229 E691 ; read address of start of screen for mode X -- MOS44 0230 E691 ; in: X = mode -- MOS44 0231 E691 ; out: X = lo-address, Y = hi-address -- MOS44 0232 E691 BB D8 & TOPMDX -- MOS44 0233 E693 -- MOS44 0234 E693 ; -- MOS44 0235 E693 ; $86 -- MOS44 0236 E693 ;; read text cursor position -- MOS44 0237 E693 ; out: X = x-text-coord, Y = y-text-coord -- MOS44 0238 E693 1F D6 & CSRPOS -- MOS44 0239 E695 -- MOS44 0240 E695 ; -- MOS44 0241 E695 ; $87 -- MOS44 0242 E695 ;; read character at text cursor -- MOS44 0243 E695 ; out: X=0 => no character at cursor position -- MOS44 0244 E695 ; X<>0 => X=character -- MOS44 0245 E695 ; Y = current screen mode MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 93 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0246 E695 97 D7 & READCH -- MOS44 0247 E697 -- MOS44 0248 E697 ; -- MOS44 0249 E697 ; $88 -- MOS44 0250 E697 ; *CODE X, Y -- MOS44 0251 E697 ; in: X = arg, Y = arg -- MOS44 0252 E697 ; out: C = return code -- MOS44 0253 E697 ; X = return code -- MOS44 0254 E697 ; Y = return code -- MOS44 0255 E697 E9 E6 & MCODE -- MOS44 0256 E699 -- MOS44 0257 E699 ; -- MOS44 0258 E699 ; $89 -- MOS44 0259 E699 ; *MOTOR X, Y -- MOS44 0260 E699 ; in: X=0 => turn motor off -- MOS44 0261 E699 ; X=1 => turn motor on -- MOS44 0262 E699 ; Y => motor selection -- MOS44 0263 E699 10 E7 & MOTOR ;MOTOR command; $89 -- MOS44 0264 E69B -- MOS44 0265 E69B ; -- MOS44 0266 E69B ; $8A -- MOS44 0267 E69B ; insert character into buffer -- MOS44 0268 E69B ; in: X = bufferid, Y = character -- MOS44 0269 E69B A1 E1 & INSERT -- MOS44 0270 E69D -- MOS44 0271 E69D ; -- MOS44 0272 E69D ; $8B -- MOS44 0273 E69D ; *OPT X, Y -- MOS44 0274 E69D ; in: X = arg, Y = arg (effect is filing system dependent) -- MOS44 0275 E69D C8 F0 & OPT -- MOS44 0276 E69F -- MOS44 0277 E69F ; -- MOS44 0278 E69F ; $8C -- MOS44 0279 E69F ; *TAPE X, Y -- MOS44 0280 E69F ; in: X=0 => tape filing system at default baud rate (1200 baud) -- MOS44 0281 E69F ; X=3 => tape filing system at 300 baud -- MOS44 0282 E69F ; X=12 => tape filing system at 1200 baud -- MOS44 0283 E69F ; Y=$00 => tape filing system is cassette -- MOS44 0284 E69F ; Y=$FF => tape filing system is ROMs -- MOS44 0285 E69F 50 F1 & TAPE -- MOS44 0286 E6A1 -- MOS44 0287 E6A1 ; -- MOS44 0288 E6A1 ; $8D -- MOS44 0289 E6A1 ; *ROM X, Y -- MOS44 0290 E6A1 ; X and Y ignored -- MOS44 0291 E6A1 50 F1 & CROM -- MOS44 0292 E6A3 -- MOS44 0293 E6A3 ; -- MOS44 0294 E6A3 ; $8E -- MOS44 0295 E6A3 ; enter language -- MOS44 0296 E6A3 ; in: X = ROMid of language, Y = arg -- MOS44 0297 E6A3 B6 DB & SELANG -- MOS44 0298 E6A5 -- MOS44 0299 E6A5 ; -- MOS44 0300 E6A5 ; $8F -- MOS44 0301 E6A5 ; call paged ROM function -- MOS44 0302 E6A5 ; in: X = reason code, Y = arg -- MOS44 0303 E6A5 ; out: C = return code -- MOS44 0304 E6A5 ; Y = return code -- MOS44 0305 E6A5 75 F1 & SVOP -- MOS44 0306 E6A7 -- MOS44 0307 E6A7 ; -- MOS44 0308 E6A7 ; $90 -- MOS44 0309 E6A7 ; alter TV characteristics -- MOS44 0310 E6A7 ; in: X = vertical sync adjust, Y = interlace adjust -- MOS44 0311 E6A7 62 EB & TV -- MOS44 0312 E6A9 -- MOS44 0313 E6A9 ; -- MOS44 0314 E6A9 ; $91 -- MOS44 0315 E6A9 ; remove character from buffer -- MOS44 0316 E6A9 ; in: X = bufferid -- MOS44 0317 E6A9 ; out: C=0 => Y=character -- MOS44 0318 E6A9 ; C=1 => buffer empty -- MOS44 0319 E6A9 99 E5 & REMOV -- MOS44 0320 E6AB -- MOS44 0321 E6AB [ MOS125 = &FF -- MOS44 0360 E6AB | -- MOS44 0361 E6AB ; -- MOS44 0362 E6AB ; $92 -- MOS44 0363 E6AB ; read from FRED -- MOS44 0364 E6AB ; in: X = offset -- MOS44 0365 E6AB ; out: Y = value -- MOS44 0366 E6AB 59 EA & CHEQUE -- MOS44 0367 E6AD -- MOS44 0368 E6AD ; -- MOS44 0369 E6AD ; $93 -- MOS44 0370 E6AD ; write to FRED -- MOS44 0371 E6AD ; in: X = offset, Y = value -- MOS44 0372 E6AD 59 EA & CHEQUE -- MOS44 0373 E6AF -- MOS44 0374 E6AF ; -- MOS44 0375 E6AF ; $94 -- MOS44 0376 E6AF ; read from JIM -- MOS44 0377 E6AF ; in: X = offset -- MOS44 0378 E6AF ; out: Y = value -- MOS44 0379 E6AF 59 EA & CHEQUE -- MOS44 0380 E6B1 -- MOS44 0381 E6B1 ; -- MOS44 0382 E6B1 ; $95 -- MOS44 0383 E6B1 ; write to JIM -- MOS44 0384 E6B1 ; in: X = offset, Y = value -- MOS44 0385 E6B1 59 EA & CHEQUE -- MOS44 0386 E6B3 -- MOS44 0387 E6B3 ; -- MOS44 0388 E6B3 ; $96 -- MOS44 0389 E6B3 ; read from SHEILA -- MOS44 0390 E6B3 ; in: X = offset -- MOS44 0391 E6B3 ; out: Y = value -- MOS44 0392 E6B3 59 EA & CHEQUE -- MOS44 0393 E6B5 -- MOS44 0394 E6B5 ; -- MOS44 0395 E6B5 ; $97 -- MOS44 0396 E6B5 ; write to SHEILA -- MOS44 0397 E6B5 ; in: X = offset, Y = value -- MOS44 0398 E6B5 59 EA & CHEQUE -- MOS44 0399 E6B7 ] -- MOS44 0400 E6B7 -- MOS44 0401 E6B7 ; -- MOS44 0402 E6B7 ; $98 -- MOS44 0403 E6B7 ; examine character in buffer -- MOS44 0404 E6B7 ; in: X = bufferid MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 94 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0405 E6B7 ; out: C=0 => Y=character -- MOS44 0406 E6B7 ; C=1 => buffer empty -- MOS44 0407 E6B7 94 E5 & EXAM -- MOS44 0408 E6B9 -- MOS44 0409 E6B9 ; -- MOS44 0410 E6B9 ; $99 -- MOS44 0411 E6B9 ; insert character into buffer dealing with ESC code -- MOS44 0412 E6B9 ; in: X = bufferid, Y = character -- MOS44 0413 E6B9 A7 E1 & RNSRT -- MOS44 0414 E6BB -- MOS44 0415 E6BB ; -- MOS44 0416 E6BB ;; $9A -- MOS44 0417 E6BB ; update vidproc control register -- MOS44 0418 E6BB ; in: X = value -- MOS44 0419 E6BB 3E EA & VP0 -- MOS44 0420 E6BD -- MOS44 0421 E6BD ; -- MOS44 0422 E6BD ; $9B -- MOS44 0423 E6BD ; update vidproc palette register -- MOS44 0424 E6BD ; in: X = value EOR $07 -- MOS44 0425 E6BD 4F EA & VP1 -- MOS44 0426 E6BF -- MOS44 0427 E6BF ; -- MOS44 0428 E6BF ; $9C -- MOS44 0429 E6BF ; update 6850 ACIA -- MOS44 0430 E6BF ; in: X = value, Y = mask -- MOS44 0431 E6BF D9 E2 & RS423 -- MOS44 0432 E6C1 -- MOS44 0433 E6C1 ; -- MOS44 0434 E6C1 ; $9D -- MOS44 0435 E6C1 ; fast tube BPUT -- MOS44 0436 E6C1 ; in: X = byte, Y = handle -- MOS44 0437 E6C1 66 FF & FXBPUT -- MOS44 0438 E6C3 -- MOS44 0439 E6C3 ; -- MOS44 0440 E6C3 ; $9E -- MOS44 0441 E6C3 ; read from speech chip -- MOS44 0442 E6C3 ; in: Y = command -- MOS44 0443 E6C3 ; out: Y = result -- MOS44 0444 E6C3 AD EE & RSPECH -- MOS44 0445 E6C5 -- MOS44 0446 E6C5 ; -- MOS44 0447 E6C5 ; $9F -- MOS44 0448 E6C5 ; write to speech chip -- MOS44 0449 E6C5 ; in: Y = command -- MOS44 0450 E6C5 BF EE & WSPECH -- MOS44 0451 E6C7 -- MOS44 0452 E6C7 ; -- MOS44 0453 E6C7 ; $A0 -- MOS44 0454 E6C7 ; read VDU variables -- MOS44 0455 E6C7 ; in: X = index -- MOS44 0456 E6C7 ; out: X = variable0, Y = variable1 -- MOS44 0457 E6C7 FF E9 & VDUVAR -- MOS44 0458 E6C9 -- MOS44 0459 E6C9 ; -- MOS44 0460 E6C9 00A1 BYTEH * .-BYTET2:SHR: 1+BYTEM ;next entry in BYTET table (hi component) -- MOS44 0461 E6C9 ; -- MOS44 0462 E6C9 DB E9 & SETV ;set variable -- MOS44 0463 E6CB -- MOS44 0464 E6CB ; -- MOS44 0465 E6CB EB E6 & JMIUSR ;OSWORD calls >=$E0 -- MOS44 0466 E6CD -- MOS44 0467 E6CD -- MOS44 0468 E6CD -- MOS44 0469 E6CD WORDT ;table for OSWORD. N.B. lo-byte followed by hi-byte -- MOS44 0470 E6CD ; -- MOS44 0471 E6CD 3E E9 & RDLN ;read line; $00 -- MOS44 0472 E6CF -- MOS44 0473 E6CF ; -- MOS44 0474 E6CF 14 E9 & RATM ;read absolute time; $01 -- MOS44 0475 E6D1 -- MOS44 0476 E6D1 ; -- MOS44 0477 E6D1 23 E9 & WATM ;write absolute time; $02 -- MOS44 0478 E6D3 -- MOS44 0479 E6D3 ; -- MOS44 0480 E6D3 10 E9 & RITM ;read interval time; $03 -- MOS44 0481 E6D5 -- MOS44 0482 E6D5 ; -- MOS44 0483 E6D5 27 E9 & WITM ;write interval time; $04 -- MOS44 0484 E6D7 -- MOS44 0485 E6D7 ; -- MOS44 0486 E6D7 7D EA & PEEK ;PEEK; $05 -- MOS44 0487 E6D9 -- MOS44 0488 E6D9 ; -- MOS44 0489 E6D9 7E EA & POKE ;POKE; $06 -- MOS44 0490 E6DB -- MOS44 0491 E6DB ; -- MOS44 0492 E6DB 0007 OSWSND * .-WORDT:SHR: 1 -- MOS44 0493 E6DB ; -- MOS44 0494 E6DB 72 E8 & NOTE ;sound; $07 -- MOS44 0495 E6DD -- MOS44 0496 E6DD ; -- MOS44 0497 E6DD F9 E8 & NVLP ;define envelope; $08 -- MOS44 0498 E6DF -- MOS44 0499 E6DF ; -- MOS44 0500 E6DF 69 C7 & RPXLXY ;read pixel at given coordinate to X; $09 -- MOS44 0501 E6E1 -- MOS44 0502 E6E1 ; -- MOS44 0503 E6E1 06 CC & RCHDEF ;read character definition of XY to XY+1..8; $0A -- MOS44 0504 E6E3 -- MOS44 0505 E6E3 ; -- MOS44 0506 E6E3 AF C7 & RPALET ;read palette for XY to XY+1..4; $0B -- MOS44 0507 E6E5 -- MOS44 0508 E6E5 ; -- MOS44 0509 E6E5 FC C8 & PRPAL ;programme palette; $0C -- MOS44 0510 E6E7 -- MOS44 0511 E6E7 ; -- MOS44 0512 E6E7 BB D5 & CSREAD ;cursor read; $0D -- MOS44 0513 E6E9 -- MOS44 0514 E6E9 ; -- MOS44 0515 E6E9 000E WORDN * .-WORDT:SHR: 1 ;number of entries in WORDT table -- MOS44 0516 E6E9 -- MOS44 0517 E6E9 -- MOS44 0518 E6E9 [ NOSP = &00 -- MOS44 0520 E6E9 | -- MOS44 0521 E6E9 MCODE ;call user code -- MOS44 0522 E6E9 A9 00 LDAIM ZERO -- MOS44 0523 E6EB 6C 00 02 JMIUSR JMI USRVEC ;user OSBYTE call/OSWORD calls -- MOS44 0524 E6EE ] -- MOS44 0525 E6EE -- MOS44 0526 E6EE MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 95 MOS44 MOS44 OSBYTE routines MOS44 -- MOS44 0527 E6EE ; OSBYTE specific routines -- MOS44 0528 E6EE ; N.B. routines must exit with PLP to restore -- MOS44 0529 E6EE ; caller's interrupt state -- MOS44 0530 E6EE CESCP ;clear escape flag ad purge selected input buffer -- MOS44 0531 E6EE A2 00 LDXIM ZERO ;indicate escape not cleared -- MOS44 0532 E6F0 24 FF BIT ESCFLG -- MOS44 0533 E6F2 10 11 BPL CESCPC ;[no escape to clear] MOS44 0533 E6F2 v6E MOS44 0534 E6F4 ; bypass procedure ? MOS44 0533 E6F2 v6E MOS44 0535 E6F4 AD 76 02 LDA EAOPT MOS44 0533 E6F2 v6E MOS44 0536 E6F7 D0 0A BNE CESCX ;[bypass normal acknowledge procedure] MOS44 0533 E6F2 v6E MOS44 0537 E6F9 ; Z=1, A=$00 MOS44 0533 E6F2 v6E MOS44 0538 E6F9 ; close exec file MOS44 0533 E6F2 v6E MOS44 0539 E6F9 58 CLI ;********** (close may be a long operation) MOS44 0533 E6F2 v6E MOS44 0540 E6FA 8D 69 02 STA LINES ;reset page mode page origin MOS44 0533 E6F2 v6E MOS44 0541 E6FD 20 E3 F6 JSR EXEC ;just close exec file, N.B. needs Z=1, A=$00 MOS44 0533 E6F2 v6E MOS44 0542 E700 ; flush all buffers and clear soft key expansion MOS44 0533 E6F2 v6E MOS44 0543 E700 20 61 E2 JSR FLSHAL ;N.B. also kills sound AND cancels VDU queueing MOS44 0533 E6F2 v6E MOS44 0544 E703 CESCX MOS44 0533 E6F2 v6E MOS44 0545 E703 A2 FF LDXIM &FF ;indicate escape cleared MOS44 0533 E6F2 v6E MOS44 0546 E705 CESCPC ;clear system escape flag MOS44 0533 E6F2 v6E MOS44 0547 E705 18 CLC -- MOS44 0548 E706 CESCPS ;set system escape flag (N.B. C=1) -- MOS44 0549 E706 66 FF ROR ESCFLG -- MOS44 0550 E708 2C 7A 02 BIT TUBEM -- MOS44 0551 E70B [ MOS125 = &FF -- MOS44 0554 E70B | -- MOS44 0555 E70B 10 2E BPL TESCO ;[tube inactive] MOS44 0555 E70B v51 MOS44 0556 E70D ] MOS44 0555 E70B v51 MOS44 0557 E70D ; MOS44 0555 E70B v51 MOS44 0558 E70D TESC MOS44 0555 E70B v51 MOS44 0559 E70D 4C 03 04 JMP TBESC ;tube escape MOS44 0555 E70B v51 MOS44 0560 E710 MOS44 0555 E70B v51 MOS44 0561 E710 MOS44 0555 E70B v51 MOS44 0562 E710 MOTOR ;control cassette motor MOS44 0555 E70B v51 MOS44 0563 E710 ; on entry: X=0 => motor off MOS44 0555 E70B v51 MOS44 0564 E710 ; X<>0 => motor on MOS44 0555 E70B v51 MOS44 0565 E710 ; N.B. previous instruction was LDX MOS44 0555 E70B v51 MOS44 0566 E710 AD 82 02 LDA SPREGA MOS44 0555 E70B v51 MOS44 0567 E713 A8 TAY ;Y := old value MOS44 0555 E70B v51 MOS44 0568 E714 ; MOS44 0555 E70B v51 MOS44 0569 E714 2A ROLA MOS44 0555 E70B v51 MOS44 0570 E715 E0 01 CPXIM &01 ;C=0 => X=0, C=1 => X<>0 MOS44 0555 E70B v51 MOS44 0571 E717 6A RORA MOS44 0555 E70B v51 MOS44 0572 E718 50 19 BVC STASP ;[ALWAYS jump] MOS44 0555 E70B v51 MOS44 0573 E71A MOS44 0555 E70B v51 MOS44 0574 E71A MOS44 0555 E70B v51 MOS44 0575 E71A TXBAUD ;set RS423 transmit baudrate (N.B. A=$08) MOS44 0555 E70B v51 MOS44 0576 E71A A9 38 LDAIM &38 MOS44 0555 E70B v51 MOS44 0577 E71C RXBAUD ;set RS423 receive baudrate (N.B. A=$07) MOS44 0555 E70B v51 MOS44 0578 E71C [ MOS125 = &FF MOS44 0555 E70B v51 MOS44 0591 E71C | MOS44 0555 E70B v51 MOS44 0592 E71C 49 7F EORIM &7F ;Rx: A=$78, Tx: A=$47 MOS44 0555 E70B v51 MOS44 0593 E71E 85 FA STA MASK MOS44 0555 E70B v51 MOS44 0594 E720 AC 82 02 LDY SPREGA MOS44 0555 E70B v51 MOS44 0595 E723 E0 09 CPXIM &09 MOS44 0555 E70B v51 MOS44 0596 E725 B0 12 BCS BAUD1 ;[bad baud selection] MOS44 0555 E70B v51 MOS44 0597 E727 98 TYA MOS44 0555 E70B v51 MOS44 0598 E728 5D EC E9 EORAX BAUDS MOS44 0555 E70B v51 MOS44 0599 E72B 25 FA AND MASK MOS44 0555 E70B v51 MOS44 0600 E72D 4D 82 02 EOR SPREGA ;NB bit 6 = 1 MOS44 0555 E70B v51 MOS44 0601 E730 ] MOS44 0555 E70B v51 MOS44 0602 E730 4D 5D 02 EOR RSCASS ;select cassette/RS423 MOS44 0555 E70B v51 MOS44 0603 E733 ; MOS44 0555 E70B v51 MOS44 0604 E733 STASP ;used by MOTOR and RESET MOS44 0555 E70B v51 MOS44 0605 E733 8D 82 02 STA SPREGA MOS44 0555 E70B v51 MOS44 0606 E736 8D 10 FE STA SERPRC MOS44 0555 E70B v51 MOS44 0607 E739 ; MOS44 0555 E70B v51 MOS44 0608 E739 BAUD1 MOS44 0555 E70B v51 MOS44 0609 E739 TYATAX ;used by TXBAUD, RXBAUD, FSPC, FMRK MOS44 0555 E70B v51 MOS44 0610 E739 98 TYA MOS44 0698 E790 ^27 MOS44 0611 E73A BADEVT MOS44 0698 E790 ^27 MOS44 0612 E73A AA TAX ;X := old value (bad events appear disabled) MOS44 0698 E790 ^27 MOS44 0613 E73B [ MOS125 = &FF MOS44 0698 E790 ^27 MOS44 0614 E73B | MOS44 0698 E790 ^27 MOS44 0615 E73B TESCO MOS44 0698 E790 ^27 MOS44 0616 E73B ] MOS44 0698 E790 ^27 MOS44 0617 E73B 60 RTS MOS44 0698 E790 ^27 MOS44 0618 E73C MOS44 0698 E790 ^27 MOS44 0619 E73C MOS44 0698 E790 ^27 MOS44 0620 E73C FMRK ;set flash mark, Y=0, C=1 MOS44 0698 E790 ^27 MOS44 0621 E73C C8 INY MOS44 0698 E790 ^27 MOS44 0622 E73D 18 CLC MOS44 0698 E790 ^27 MOS44 0623 E73E ; MOS44 0698 E790 ^27 MOS44 0624 E73E ; Y=1, C=0 MOS44 0698 E790 ^27 MOS44 0625 E73E ; MOS44 0698 E790 ^27 MOS44 0626 E73E FSPC ;set flash space, Y=0, C=1 MOS44 0698 E790 ^27 MOS44 0627 E73E B9 52 02 LDAAY FLASHB MOS44 0698 E790 ^27 MOS44 0628 E741 ; MOS44 0698 E790 ^27 MOS44 0629 E741 48 PHA MOS44 0698 E790 ^27 MOS44 0630 E742 8A TXA MOS44 0698 E790 ^27 MOS44 0631 E743 99 52 02 STAAY FLASHB MOS44 0698 E790 ^27 MOS44 0632 E746 68 PLA MOS44 0698 E790 ^27 MOS44 0633 E747 ; MOS44 0698 E790 ^27 MOS44 0634 E747 A8 TAY MOS44 0698 E790 ^27 MOS44 0635 E748 ; MOS44 0698 E790 ^27 MOS44 0636 E748 ; C=0 => mark, C=1 => space MOS44 0698 E790 ^27 MOS44 0637 E748 ; FMS0 exit used, despite X not being corrupted MOS44 0698 E790 ^27 MOS44 0638 E748 ; (makes code clearer) MOS44 0698 E790 ^27 MOS44 0639 E748 AD 51 02 LDA FLCNT MOS44 0698 E790 ^27 MOS44 0640 E74B D0 10 BNE FMS1 ;[flash enabled] MOS44 0698 E790 ^27 MOS44 0641 E74D ; 'kick' flash count MOS44 0698 E790 ^27 MOS44 0642 E74D 8E 51 02 STX FLCNT MOS44 0698 E790 ^27 MOS44 0643 E750 ; force mark/space (lsb VPREGA := C) MOS44 0698 E790 ^27 MOS44 0644 E750 AD 48 02 LDA VPREGA MOS44 0698 E790 ^27 MOS44 0645 E753 [ MOS125 = &FF MOS44 0698 E790 ^27 MOS44 0650 E753 | MOS44 0698 E790 ^27 MOS44 0651 E753 ;same size, faster, reduce stack load MOS44 0698 E790 ^27 MOS44 0652 E753 29 FE ANDIM &FE MOS44 0698 E790 ^27 MOS44 0653 E755 69 00 ADCIM &00 ;V=0 MOS44 0698 E790 ^27 MOS44 0654 E757 ] MOS44 0698 E790 ^27 MOS44 0655 E757 8D 48 02 STA VPREGA MOS44 0698 E790 ^27 MOS44 0656 E75A 8D 20 FE STA VPROC0 MOS44 0698 E790 ^27 MOS44 0657 E75D FMS1 ; chain from clear escape condition routine MOS44 0698 E790 ^27 MOS44 0658 E75D 50 DA BVC TYATAX ;[ALWAYS jump] MOS44 0698 E790 ^27 MOS44 0659 E75F MOS44 0698 E790 ^27 MOS44 0660 E75F MOS44 0698 E790 ^27 MOS44 0661 E75F SELIN ;select input MOS44 0698 E790 ^27 MOS44 0662 E75F 8A TXA MOS44 0698 E790 ^27 MOS44 0663 E760 29 01 ANDIM &01 ;force legal bufferid MOS44 0698 E790 ^27 MOS44 0664 E762 48 PHA ;save change MOS44 0698 E790 ^27 MOS44 0665 E763 AD 50 02 LDA RSCTFL ;A := old state of controller status MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 96 MOS44 MOS44 OSBYTE routines MOS44 MOS44 0698 E790 ^27 MOS44 0666 E766 2A ROLA MOS44 0698 E790 ^27 MOS44 0667 E767 E0 01 CPXIM &01 ;C=0 => disable RS423, C=1 => enable RS423 MOS44 0698 E790 ^27 MOS44 0668 E769 6A RORA ;A := new state of controller status MOS44 0698 E790 ^27 MOS44 0669 E76A ; *FX 2,0 disables RS423, *FX 2,(1,2) enables RS423 MOS44 0698 E790 ^27 MOS44 0670 E76A ; if RS423 then enable RS423 Rx interrupt MOS44 0698 E790 ^27 MOS44 0671 E76A CD 50 02 CMP RSCTFL MOS44 0698 E790 ^27 MOS44 0672 E76D 08 PHP MOS44 0698 E790 ^27 MOS44 0673 E76E 8D 50 02 STA RSCTFL MOS44 0698 E790 ^27 MOS44 0674 E771 8D 08 FE STA RSCTL ;update RS423 control register MOS44 0698 E790 ^27 MOS44 0675 E774 20 D0 E2 JSR RSETX ;set RHITXE if possible MOS44 0698 E790 ^27 MOS44 0676 E777 28 PLP MOS44 0698 E790 ^27 MOS44 0677 E778 F0 03 BEQ SELIN1 ;branch if no change MOS44 0698 E790 ^27 MOS44 0678 E77A 2C 09 FE BIT RSDATA ;purge character in controller MOS44 0698 E790 ^27 MOS44 0679 E77D ; this purges data register if: disabled state -> enabled state MOS44 0698 E790 ^27 MOS44 0680 E77D ; this does not matter if: enabled state -> disabled state MOS44 0698 E790 ^27 MOS44 0681 E77D SELIN1 MOS44 0698 E790 ^27 MOS44 0682 E77D AE 41 02 LDX RDCHSW ;X := old value MOS44 0698 E790 ^27 MOS44 0683 E780 68 PLA MOS44 0698 E790 ^27 MOS44 0684 E781 8D 41 02 STA RDCHSW ;update value MOS44 0698 E790 ^27 MOS44 0685 E784 60 RTS MOS44 0698 E790 ^27 MOS44 0686 E785 MOS44 0698 E790 ^27 MOS44 0687 E785 MOS44 0698 E790 ^27 MOS44 0688 E785 MDSABL ;disable event X MOS44 0698 E790 ^27 MOS44 0689 E785 ; N.B. Y=0 MOS44 0698 E790 ^27 MOS44 0690 E785 98 TYA ;A := 0 MOS44 0698 E790 ^27 MOS44 0691 E786 ;* LDAIM ZERO MOS44 0698 E790 ^27 MOS44 0692 E786 ENABLE ;enable event X (N.B. A<>$00) MOS44 0698 E790 ^27 MOS44 0693 E786 E0 0A CPXIM NEVENT MOS44 0698 E790 ^27 MOS44 0694 E788 B0 B0 BCS BADEVT MOS44 0698 E790 ^27 MOS44 0695 E78A BC BF 02 LDYAX EVENTS MOS44 0698 E790 ^27 MOS44 0696 E78D 9D BF 02 STAAX EVENTS MOS44 0698 E790 ^27 MOS44 0697 E790 ; MOS44 0698 E790 ^27 MOS44 0698 E790 50 A7 BVC TYATAX ;[ALWAYS jump] -- MOS44 0699 E792 -- MOS44 0700 E792 -- MOS44 0701 E792 SETADC ;set number of ADC channels to scan -- MOS44 0702 E792 ; N.B. preceeding instruction was LDX -- MOS44 0703 E792 ; Y=0 -- MOS44 0704 E792 F0 03 BEQ SETAD1 ;[kill ADC (eventually)] MOS44 0704 E792 v7C MOS44 0705 E794 20 44 DE JSR ADCBEG ;initiate conversion on channel X, uses Y=0 MOS44 0704 E792 v7C MOS44 0706 E797 ; N.B. X not corrupted MOS44 0704 E792 v7C MOS44 0707 E797 SETAD1 MOS44 0704 E792 v7C MOS44 0708 E797 ; a value of X=0 stops the ADC after the next (external) channel 1 MOS44 0704 E792 v7C MOS44 0709 E797 ; conversion MOS44 0704 E792 v7C MOS44 0710 E797 AD 4D 02 LDA MAXADC -- MOS44 0711 E79A 8E 4D 02 STX MAXADC -- MOS44 0712 E79D AA TAX ;X := old value -- MOS44 0713 E79E 60 RTS -- MOS44 0714 E79F -- MOS44 0715 E79F -- MOS44 0716 E79F INKY ;read key with time limit -- MOS44 0717 E79F 98 TYA -- MOS44 0718 E7A0 30 0B BMI RDKY MOS44 0718 E7A0 v74 MOS44 0719 E7A2 58 CLI ;**** ENABLE INTERRUPTS MOS44 0718 E7A0 v74 MOS44 0720 E7A3 20 73 DE JSR INKEY MOS44 0718 E7A0 v74 MOS44 0721 E7A6 B0 03 BCS INKY1 ;[escape detected or count exhausted] MOS44 0718 E7A0 v74 MOS44 0722 E7A8 ; MOS44 0718 E7A0 v74 MOS44 0723 E7A8 ; character read MOS44 0718 E7A0 v74 MOS44 0724 E7A8 ; MOS44 0718 E7A0 v74 MOS44 0725 E7A8 AA TAX ;X := character (INKEY) or lo-count (BUFN) MOS44 0718 E7A0 v74 MOS44 0726 E7A9 A9 00 LDAIM ZERO ;Y = 0 => success MOS44 0718 E7A0 v74 MOS44 0727 E7AB ; MOS44 0718 E7A0 v74 MOS44 0728 E7AB INKY1 ;escape detected or count exhausted, C=1 MOS44 0718 E7A0 v74 MOS44 0729 E7AB A8 TAY ;Y < $80 => escape, Y >= $80 => count exhausted MOS44 0718 E7A0 v74 MOS44 0730 E7AC 60 RTS MOS44 0718 E7A0 v74 MOS44 0731 E7AD MOS44 0718 E7A0 v74 MOS44 0732 E7AD MOS44 0718 E7A0 v74 MOS44 0733 E7AD RDKY ;C=1, V=0, read key addressed by X MOS44 0718 E7A0 v74 MOS44 0734 E7AD ; N.B. interrupts disabled MOS44 0718 E7A0 v74 MOS44 0735 E7AD ; MOS44 0718 E7A0 v74 MOS44 0736 E7AD ; test key at matrix address MOS44 0718 E7A0 v74 MOS44 0737 E7AD ; MOS44 0718 E7A0 v74 MOS44 0738 E7AD [ $Tutu MOS44 0718 E7A0 v74 MOS44 0746 E7AD | MOS44 0718 E7A0 v74 MOS44 0747 E7AD 8A TXA -- MOS44 0748 E7AE 49 7F EORIM &7F -- MOS44 0749 E7B0 AA TAX -- MOS44 0750 E7B1 20 9B F0 JSR JMIKEY -- MOS44 0751 E7B4 2A ROLA ;result into C -- MOS44 0752 E7B5 ] -- MOS44 0753 E7B5 ; -- MOS44 0754 E7B5 BADADC ;entered with C=1 -- MOS44 0755 E7B5 RMHA ;entered with C=1 -- MOS44 0756 E7B5 ; C=0 => return 0, C=1 => return -1 -- MOS44 0757 E7B5 A2 FF LDXIM &FF ;N.B. I/O processor is notionally located at address $FFFFxxxx MOS44 0820 E7D1 ^62 MOS44 0758 E7B7 A0 FF LDYIM &FF MOS44 0820 E7D1 ^62 MOS44 0759 E7B9 B0 02 BCS RDKY0 MOS44 0820 E7D1 ^62 MOS44 0760 E7BB ; INKEY entry (key open) MOS44 0820 E7D1 ^62 MOS44 0761 E7BB E8 INX ;X=0 MOS44 0820 E7D1 ^62 MOS44 0762 E7BC ; invalid soft key read, return Y<>0 MOS44 0820 E7D1 ^62 MOS44 0763 E7BC C8 INY ;Y=0 (except for soft key read entry) MOS44 0820 E7D1 ^62 MOS44 0764 E7BD RDKY0 MOS44 0820 E7D1 ^62 MOS44 0765 E7BD 60 RTS MOS44 0820 E7D1 ^62 MOS44 0766 E7BE MOS44 0820 E7D1 ^62 MOS44 0767 E7BE MOS44 0820 E7D1 ^62 MOS44 0768 E7BE BUFN ;count entries in buffer, called by FX ADVAL with negative argument MOS44 0820 E7D1 ^62 MOS44 0769 E7BE ; -N gives count for buffer with external id N MOS44 0820 E7D1 ^62 MOS44 0770 E7BE ; C=1 (by FX conventions) MOS44 0820 E7D1 ^62 MOS44 0771 E7BE 8A TXA MOS44 0820 E7D1 ^62 MOS44 0772 E7BF 49 FF EORIM &FF MOS44 0820 E7D1 ^62 MOS44 0773 E7C1 AA TAX ;X := bufferid MOS44 0820 E7D1 ^62 MOS44 0774 E7C2 ; MOS44 0820 E7D1 ^62 MOS44 0775 E7C2 ; count entries (in)/(remaining in) buffer given by X MOS44 0820 E7D1 ^62 MOS44 0776 E7C2 ; returns: MOS44 0820 E7D1 ^62 MOS44 0777 E7C2 ; number of entries present for input buffers MOS44 0820 E7D1 ^62 MOS44 0778 E7C2 ; number of entries remaining for output buffers MOS44 0820 E7D1 ^62 MOS44 0779 E7C2 ; MOS44 0820 E7D1 ^62 MOS44 0780 E7C2 E0 02 CPXIM OUTPUT MOS44 0820 E7D1 ^62 MOS44 0781 E7C4 ; C=0 => count used entries MOS44 0820 E7D1 ^62 MOS44 0782 E7C4 ; C=1 => count free slots MOS44 0820 E7D1 ^62 MOS44 0783 E7C4 ; MOS44 0820 E7D1 ^62 MOS44 0784 E7C4 JMICNT MOS44 0820 E7D1 ^62 MOS44 0785 E7C4 B8 CLV ;V=0 => count buffer entry MOS44 0820 E7D1 ^62 MOS44 0786 E7C5 50 03 BVC JMICNP ;[ALWAYS jump] MOS44 0820 E7D1 ^62 MOS44 0787 E7C7 ; MOS44 0820 E7D1 ^62 MOS44 0788 E7C7 2C 55 D9 JMIPUR BIT FFBYT ;V=1 MOS44 0820 E7D1 ^62 MOS44 0789 E7CA 6C 2E 02 JMICNP JMI CNPVEC ;use indirection (defaults to CNP) MOS44 0820 E7D1 ^62 MOS44 0790 E7CD ; return count in X (lo) and Y (hi) MOS44 0820 E7D1 ^62 MOS44 0791 E7CD MOS44 0820 E7D1 ^62 MOS44 0792 E7CD MOS44 0820 E7D1 ^62 MOS44 0793 E7CD [ MOS125 = &FF MOS44 MOS44 MOS44 MOS44 Acorn macro assembler Page 97 MOS44 MOS44 OSBYTE routines MOS44 MOS44 0820 E7D1 ^62 MOS44 0808 E7CD ] MOS44 0820 E7D1 ^62 MOS44 0809 E7CD MOS44 0820 E7D1 ^62 MOS44 0810 E7CD MOS44 0820 E7D1 ^62 MOS44 0811 E7CD RADCX ;read ADC channel X MOS44 0820 E7D1 ^62 MOS44 0812 E7CD [ MOS125 = &FF MOS44 0820 E7D1 ^62 MOS44 0817 E7CD | MOS44 0820 E7D1 ^62 MOS44 0818 E7CD 30 EF BMI BUFN ;[count entries in buffer] MOS44 0820 E7D1 ^62 MOS44 0819 E7CF E0 05 CPXIM &05 MOS44 0820 E7D1 ^62 MOS44 0820 E7D1 B0 E2 BCS BADADC -- MOS44 0821 E7D3 8A TXA -- MOS44 0822 E7D4 F0 08 BEQ FIRE ;[get status of fire buttons] MOS44 0822 E7D4 v77 MOS44 0823 E7D6 ] MOS44 0822 E7D4 v77 MOS44 0824 E7D6 ; return latest conversion MOS44 0822 E7D4 v77 MOS44 0825 E7D6 BC B9 02 LDYAX ADCHIV -&01 MOS44 0822 E7D4 v77 MOS44 0826 E7D9 BD B5 02 LDAAX ADCLOV -&01 MOS44 0822 E7D4 v77 MOS44 0827 E7DC AA TAX ;X := lo-byte MOS44 0822 E7D4 v77 MOS44 0828 E7DD 60 RTS MOS44 0822 E7D4 v77 MOS44 0829 E7DE MOS44 0822 E7D4 v77 MOS44 0830 E7DE MOS44 0822 E7D4 v77 MOS44 0831 E7DE FIRE ;get status of fire buttons MOS44 0822 E7D4 v77 MOS44 0832 E7DE [ MOS125 = &FF MOS44 0822 E7D4 v77 MOS44 0840 E7DE | MOS44 0822 E7D4 v77 MOS44 0841 E7DE ; X=0, A=0, C=0 MOS44 0822 E7D4 v77 MOS44 0842 E7DE ED 40 FE SBC PBQ ;take one's complement of system VIA port B -- MOS44 0843 E7E1 6A RORA -- MOS44 0844 E7E2 6A RORA -- MOS44 0845 E7E3 6A RORA -- MOS44 0846 E7E4 6A RORA -- MOS44 0847 E7E5 ] -- MOS44 0848 E7E5 29 03 ANDIM &03 ;A := fire buttons -- MOS44 0849 E7E7 AC BE 02 LDY ADCFLG ;return latest conversion number -- MOS44 0850 E7EA ; clear latest conversion number -- MOS44 0851 E7EA 8E BE 02 STX ADCFLG -- MOS44 0852 E7ED AA TAX ;return status of fire buttons in b0 and b1 -- MOS44 0853 E7EE 60 RTS -- MOS44 0854 E7EF -- MOS44 0855 E7EF -- MOS44 0856 E7EF LNK MOS46 -- MOS46 0001 E7EF ; > MOS46 -- MOS46 0002 E7EF TTL MOS46 OSWORD routines -- MOS46 0003 E7EF OPT MOS46 MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 98 MOS46 MOS46 OSWORD routines MOS46 -- MOS46 0004 E7EF ;(c) 1981 ACORN Computers Limited -- MOS46 0005 E7EF ;BBC MOS -- MOS46 0006 E7EF ;Change record: -- MOS46 0007 E7EF ;203 01-May-82 PB Fix EXTSND bug -- MOS46 0008 E7EF ;041 15-Aug-81 PB First edition -- MOS46 0009 E7EF ;Author(s): -- MOS46 0010 E7EF ;PB Paul Bond -- MOS46 0011 E7EF -- MOS46 0012 E7EF -- MOS46 0013 E7EF BYTE ;OSBYTE call -- MOS46 0014 E7EF ; -- MOS46 0015 E7EF ; uses: -- MOS46 0016 E7EF ; BYTEX, BYTEY (may be shared by sei-routines) -- MOS46 0017 E7EF ; JMILO, JMIHI -- MOS46 0018 E7EF ; -- MOS46 0019 E7EF 48 PHA -- MOS46 0020 E7F0 08 PHP -- MOS46 0021 E7F1 78 SEI ;**** DISABLE INTERRUPTS **** -- MOS46 0022 E7F2 ; -- MOS46 0023 E7F2 ; save A and X -- MOS46 0024 E7F2 ; -- MOS46 0025 E7F2 85 EF STA BYTEA -- MOS46 0026 E7F4 86 F0 STX BYTEX -- MOS46 0027 E7F6 84 F1 STY BYTEY -- MOS46 0028 E7F8 ; -- MOS46 0029 E7F8 A2 07 LDXIM SVBYTE ;illegal codes are referred to paged ROM -- MOS46 0030 E7FA ; -- MOS46 0031 E7FA ; check for legal code -- MOS46 0032 E7FA ; -- MOS46 0033 E7FA C9 75 CMPIM BYTEM -- MOS46 0034 E7FC 90 42 BCC BYTELO ;[interactive code] MOS46 0034 E7FC v3D MOS46 0035 E7FE ; MOS46 0034 E7FC v3D MOS46 0036 E7FE ; code >= BYTEM MOS46 0034 E7FC v3D MOS46 0037 E7FE ; MOS46 0034 E7FC v3D MOS46 0038 E7FE C9 A1 CMPIM BYTEH MOS46 0034 E7FC v3D MOS46 0039 E800 90 09 BCC BYTEHI ;[code < BYTEH] MOS46 0034 E7FC v3D MOS46 0040 E802 ; MOS46 0034 E7FC v3D MOS46 0041 E802 ; check for variable setting MOS46 0034 E7FC v3D MOS46 0042 E802 ; MOS46 0034 E7FC v3D MOS46 0043 E802 C9 A6 CMPIM VORG MOS46 0034 E7FC v3D MOS46 0044 E804 90 40 BCC BYTE0 ;[not a variable setting] MOS46 0034 E7FC v3D MOS46 0045 E806 ; MOS46 0034 E7FC v3D MOS46 0046 E806 ; set variable MOS46 0034 E7FC v3D MOS46 0047 E806 ; MOS46 0034 E7FC v3D MOS46 0048 E806 18 CLC ;force A=BYTEH MOS46 0034 E7FC v3D MOS46 0049 E807 ; MOS46 0034 E7FC v3D MOS46 0050 E807 WORDU ;user OSWORD call, C=1, force A=BYTEH+$01 MOS46 0034 E7FC v3D MOS46 0051 E807 ; MOS46 0034 E7FC v3D MOS46 0052 E807 A9 A1 LDAIM BYTEH MOS46 0222 E867 ^1E MOS46 0053 E809 69 00 ADCIM ZERO ;add in carry (C=0 => variable, C=1 => user OSWORD) MOS46 0222 E867 ^1E MOS46 0054 E80B ; MOS46 0222 E867 ^1E MOS46 0055 E80B BYTEHI MOS46 0222 E867 ^1E MOS46 0056 E80B ; MOS46 0222 E867 ^1E MOS46 0057 E80B 38 SEC MOS46 0222 E867 ^1E MOS46 0058 E80C E9 5F SBCIM BYTEM-BYTEL MOS46 0222 E867 ^1E MOS46 0059 E80E ; MOS46 0222 E867 ^1E MOS46 0060 E80E BYTE1 ;construct address of specific OSBYTE routine MOS46 0222 E867 ^1E MOS46 0061 E80E ; MOS46 0222 E867 ^1E MOS46 0062 E80E 0A ASLA ;prepare for Y := 2*code MOS46 0222 E867 ^1E MOS46 0063 E80F ; MOS46 0222 E867 ^1E MOS46 0064 E80F 38 SEC ;indicate OSBYTE call MOS46 0222 E867 ^1E MOS46 0065 E810 ; MOS46 0222 E867 ^1E MOS46 0066 E810 BYTE2 ;C=0 => OSWORD call MOS46 0222 E867 ^1E MOS46 0067 E810 ; MOS46 0222 E867 ^1E MOS46 0068 E810 84 F1 STY BYTEY ;save Y MOS46 0222 E867 ^1E MOS46 0069 E812 ; MOS46 0222 E867 ^1E MOS46 0070 E812 A8 TAY ;Y := 2*code MOS46 0222 E867 ^1E MOS46 0071 E813 ; MOS46 0222 E867 ^1E MOS46 0072 E813 ; allow net to indirect OS call MOS46 0222 E867 ^1E MOS46 0073 E813 ; MOS46 0222 E867 ^1E MOS46 0074 E813 [ MOS125 = &FF MOS46 0222 E867 ^1E MOS46 0082 E813 | MOS46 0222 E867 ^1E MOS46 0083 E813 AD 5E 02 LDA NETIOC MOS46 0222 E867 ^1E MOS46 0084 E816 B8 CLV MOS46 0222 E867 ^1E MOS46 0085 E817 10 07 BPL NET1 ;[net not indirecting OS calls] MOS46 0222 E867 ^1E MOS46 0086 E819 ; MOS46 0222 E867 ^1E MOS46 0087 E819 ; indirect OS call thru net MOS46 0222 E867 ^1E MOS46 0088 E819 ; MOS46 0222 E867 ^1E MOS46 0089 E819 8A TXA ;A := reason code MOS46 0222 E867 ^1E MOS46 0090 E81A ] MOS46 0222 E867 ^1E MOS46 0091 E81A 20 12 E6 JSR JMINET ;args in BYTEA, BYTEX, BYTEY (call type in A) MOS46 0222 E867 ^1E MOS46 0092 E81D 70 1B BVS OSRET ;[net substituted result] MOS46 0222 E867 ^1E MOS46 0093 E81F [ MOS125 = &FF MOS46 0222 E867 ^1E MOS46 0094 E81F | MOS46 0222 E867 ^1E MOS46 0095 E81F 78 SEI MOS46 0222 E867 ^1E MOS46 0096 E820 ;re-disable interrupts in case a naughty NETV cleared I MOS46 0222 E867 ^1E MOS46 0097 E820 ;previous interrupt state was saved at BYTE/WORD MOS46 0222 E867 ^1E MOS46 0098 E820 ] MOS46 0222 E867 ^1E MOS46 0099 E820 ; MOS46 0222 E867 ^1E MOS46 0100 E820 ; construct specific OSBYTE routine address MOS46 0222 E867 ^1E MOS46 0101 E820 ; MOS46 0222 E867 ^1E MOS46 0102 E820 NET1 ;call internal routine MOS46 0222 E867 ^1E MOS46 0103 E820 B9 46 E6 LDAAY BYTET+&01 ;hi-byte MOS46 0222 E867 ^1E MOS46 0104 E823 85 FB STA JMIHI MOS46 0222 E867 ^1E MOS46 0105 E825 B9 45 E6 LDAAY BYTET+&00 ;lo-byte MOS46 0222 E867 ^1E MOS46 0106 E828 85 FA STA JMILO MOS46 0222 E867 ^1E MOS46 0107 E82A ; MOS46 0222 E867 ^1E MOS46 0108 E82A ; enter specific OSBYTE routine MOS46 0222 E867 ^1E MOS46 0109 E82A ; MOS46 0222 E867 ^1E MOS46 0110 E82A ; X = SVBYTE or SVWORD MOS46 0222 E867 ^1E MOS46 0111 E82A ; MOS46 0222 E867 ^1E MOS46 0112 E82A ; MOS46 0222 E867 ^1E MOS46 0113 E82A A5 EF LDA BYTEA ;in case OSBYTE call MOS46 0222 E867 ^1E MOS46 0114 E82C A4 F1 LDY BYTEY ;restore Y MOS46 0222 E867 ^1E MOS46 0115 E82E ; MOS46 0222 E867 ^1E MOS46 0116 E82E ; determine type of call MOS46 0222 E867 ^1E MOS46 0117 E82E ; MOS46 0222 E867 ^1E MOS46 0118 E82E B0 04 BCS OSB ;[OSBYTE call] MOS46 0222 E867 ^1E MOS46 0119 E830 ; MOS46 0222 E867 ^1E MOS46 0120 E830 ; OSWORD call MOS46 0222 E867 ^1E MOS46 0121 E830 ; MOS46 0222 E867 ^1E MOS46 0122 E830 A0 00 LDYIM ZERO MOS46 0222 E867 ^1E MOS46 0123 E832 B1 F0 LDAIY WORDX MOS46 0222 E867 ^1E MOS46 0124 E834 ; MOS46 0222 E867 ^1E MOS46 0125 E834 OSB MOS46 0222 E867 ^1E MOS46 0126 E834 ; MOS46 0222 E867 ^1E MOS46 0127 E834 ; ********** V=0 USED BY OSBYTE ROUTINES ********** MOS46 0222 E867 ^1E MOS46 0128 E834 38 SEC ;used by several routines MOS46 0222 E867 ^1E MOS46 0129 E835 A6 F0 LDX BYTEX ;restore X (N.B. N, Z status used by several routines) MOS46 0222 E867 ^1E MOS46 0130 E837 20 8B F0 JSR JMI ;enter specific routine MOS46 0222 E867 ^1E MOS46 0131 E83A ; MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 99 MOS46 MOS46 OSWORD routines MOS46 MOS46 0222 E867 ^1E MOS46 0132 E83A OSRET MOS46 0222 E867 ^1E MOS46 0133 E83A ; MOS46 0222 E867 ^1E MOS46 0134 E83A 6A RORA ;save C MOS46 0222 E867 ^1E MOS46 0135 E83B 28 PLP MOS46 0222 E867 ^1E MOS46 0136 E83C 2A ROLA ;restore C (needed by readline routine - BASIC expects it) MOS46 0222 E867 ^1E MOS46 0137 E83D 68 PLA ;restore A MOS46 0222 E867 ^1E MOS46 0138 E83E B8 CLV ;indicate call recognised MOS46 0222 E867 ^1E MOS46 0139 E83F 60 RTS MOS46 0222 E867 ^1E MOS46 0140 E840 MOS46 0222 E867 ^1E MOS46 0141 E840 MOS46 0222 E867 ^1E MOS46 0142 E840 [ NOSP = &00 MOS46 0222 E867 ^1E MOS46 0147 E840 ] MOS46 0222 E867 ^1E MOS46 0148 E840 MOS46 0222 E867 ^1E MOS46 0149 E840 BYTELO ;code has top bit clear - use table lo component MOS46 0222 E867 ^1E MOS46 0150 E840 A0 00 LDYIM ZERO ;only one argument, set Y=0 for variable settings and ADC ops MOS46 0222 E867 ^1E MOS46 0151 E842 C9 16 CMPIM BYTEL MOS46 0222 E867 ^1E MOS46 0152 E844 90 C8 BCC BYTE1 ;[recognised code] MOS46 0222 E867 ^1E MOS46 0153 E846 ; MOS46 0222 E867 ^1E MOS46 0154 E846 ; unrecognised code MOS46 0222 E867 ^1E MOS46 0155 E846 ; MOS46 0222 E867 ^1E MOS46 0156 E846 BYTE0 ;unrecognised OSBYTE code MOS46 0222 E867 ^1E MOS46 0157 E846 WORD0 ;unrecognised OSWORD code (C=1) MOS46 0222 E867 ^1E MOS46 0158 E846 ; force 4 bytes on stack (making 4 before Preg, simulating a return link) MOS46 0222 E867 ^1E MOS46 0159 E846 08 PHP ;N.B. non-zero byte (SEI mode) MOS46 0222 E867 ^1E MOS46 0160 E847 08 PHP MOS46 0222 E867 ^1E MOS46 0161 E848 ; MOS46 0222 E867 ^1E MOS46 0162 E848 EXTSND ;entry point used by SOUND (return link still on stack) MOS46 0222 E867 ^1E MOS46 0163 E848 68 PLA MOS46 0222 E867 ^1E MOS46 0164 E849 68 PLA MOS46 0222 E867 ^1E MOS46 0165 E84A ; MOS46 0222 E867 ^1E MOS46 0166 E84A 20 75 F1 JSR SVOP ;offer to paged ROMs (N.B. X=SVBYTE or X=SVWORD) MOS46 0222 E867 ^1E MOS46 0167 E84D D0 05 BNE BADOSC ;[unrecognised OS call] MOS46 0222 E867 ^1E MOS46 0168 E84F ; MOS46 0222 E867 ^1E MOS46 0169 E84F ; recognised OS call MOS46 0222 E867 ^1E MOS46 0170 E84F ; MOS46 0222 E867 ^1E MOS46 0171 E84F A6 F0 LDX BYTEX ;replace X (corrupted by SVOP) MOS46 0222 E867 ^1E MOS46 0172 E851 ; MOS46 0222 E867 ^1E MOS46 0173 E851 4C 3A E8 JMP OSRET MOS46 0222 E867 ^1E MOS46 0174 E854 MOS46 0222 E867 ^1E MOS46 0175 E854 MOS46 0222 E867 ^1E MOS46 0176 E854 BADOSC ;bad OS call MOS46 0222 E867 ^1E MOS46 0177 E854 28 PLP ;restore interrupt status MOS46 0222 E867 ^1E MOS46 0178 E855 68 PLA ;restore code to return with MOS46 0222 E867 ^1E MOS46 0179 E856 2C 55 D9 BIT FFBYT ;indicate call not recognised MOS46 0222 E867 ^1E MOS46 0180 E859 60 RTS MOS46 0222 E867 ^1E MOS46 0181 E85A MOS46 0222 E867 ^1E MOS46 0182 E85A MOS46 0222 E867 ^1E MOS46 0183 E85A [ MOS125 = &FF MOS46 0222 E867 ^1E MOS46 0199 E85A ] MOS46 0222 E867 ^1E MOS46 0200 E85A MOS46 0222 E867 ^1E MOS46 0201 E85A MOS46 0222 E867 ^1E MOS46 0202 E85A WORD ;OSWORD call MOS46 0222 E867 ^1E MOS46 0203 E85A ; uses: MOS46 0222 E867 ^1E MOS46 0204 E85A ; WORDX, WORDY (may be shared by sei-routines) MOS46 0222 E867 ^1E MOS46 0205 E85A ; JMILO, JMIHI (may be shared by sei-routines) MOS46 0222 E867 ^1E MOS46 0206 E85A ; MOS46 0222 E867 ^1E MOS46 0207 E85A 48 PHA MOS46 0222 E867 ^1E MOS46 0208 E85B 08 PHP ;save interrupt state MOS46 0222 E867 ^1E MOS46 0209 E85C 78 SEI ;**** DISABLE INTERRUPTS **** MOS46 0222 E867 ^1E MOS46 0210 E85D ; MOS46 0222 E867 ^1E MOS46 0211 E85D ; save A, X and Y MOS46 0222 E867 ^1E MOS46 0212 E85D ; MOS46 0222 E867 ^1E MOS46 0213 E85D 85 EF STA WORDA MOS46 0222 E867 ^1E MOS46 0214 E85F 86 F0 STX WORDX MOS46 0222 E867 ^1E MOS46 0215 E861 84 F1 STY WORDY MOS46 0222 E867 ^1E MOS46 0216 E863 ; MOS46 0222 E867 ^1E MOS46 0217 E863 A2 08 LDXIM SVWORD ;code used if indirection taken MOS46 0222 E867 ^1E MOS46 0218 E865 ; MOS46 0222 E867 ^1E MOS46 0219 E865 ; check for user OSWORD call MOS46 0222 E867 ^1E MOS46 0220 E865 ; MOS46 0222 E867 ^1E MOS46 0221 E865 C9 E0 CMPIM &E0 MOS46 0222 E867 ^1E MOS46 0222 E867 B0 9E BCS WORDU ;[user OSWORD call - route thru USRVEC, C=1] MOS46 0243 E870 ^1E MOS46 0223 E869 ; MOS46 0243 E870 ^1E MOS46 0224 E869 ; not a user OSWORD call MOS46 0243 E870 ^1E MOS46 0225 E869 ; MOS46 0243 E870 ^1E MOS46 0226 E869 ; check for legal code MOS46 0243 E870 ^1E MOS46 0227 E869 ; MOS46 0243 E870 ^1E MOS46 0228 E869 C9 0E CMPIM WORDN MOS46 0243 E870 ^1E MOS46 0229 E86B B0 D9 BCS WORD0 ;[unrecognised code] MOS46 0243 E870 ^1E MOS46 0230 E86D ; C=0 MOS46 0243 E870 ^1E MOS46 0231 E86D ; MOS46 0243 E870 ^1E MOS46 0232 E86D ; recognised OSWORD call MOS46 0243 E870 ^1E MOS46 0233 E86D ; construct address of specific OSWORD routine MOS46 0243 E870 ^1E MOS46 0234 E86D ; MOS46 0243 E870 ^1E MOS46 0235 E86D ; C=0 MOS46 0243 E870 ^1E MOS46 0236 E86D 69 44 ADCIM WORDT-BYTET:SHR: 1 MOS46 0243 E870 ^1E MOS46 0237 E86F ; C=0 MOS46 0243 E870 ^1E MOS46 0238 E86F ; MOS46 0243 E870 ^1E MOS46 0239 E86F ; enter specific OSWORD routine MOS46 0243 E870 ^1E MOS46 0240 E86F ; MOS46 0243 E870 ^1E MOS46 0241 E86F 0A ASLA ;prepare for Y := 2*code MOS46 0243 E870 ^1E MOS46 0242 E870 ; C=0 MOS46 0243 E870 ^1E MOS46 0243 E870 90 9E BCC BYTE2 ;[ALWAYS jump, C=0 => OSWORD call] MOS46 0322 E87D ^49 MOS46 0244 E872 MOS46 0322 E87D ^49 MOS46 0245 E872 [ MOS125 = &FF MOS46 0322 E87D ^49 MOS46 0283 E872 ] MOS46 0322 E87D ^49 MOS46 0284 E872 MOS46 0322 E87D ^49 MOS46 0285 E872 NOTE ;add note to note buffer MOS46 0322 E87D ^49 MOS46 0286 E872 ; ********************* MOS46 0322 E87D ^49 MOS46 0287 E872 ; MAY ENABLE INTERRUPTS MOS46 0322 E87D ^49 MOS46 0288 E872 ; ********************* MOS46 0322 E87D ^49 MOS46 0289 E872 ; XY -> 8 bytes of info MOS46 0322 E87D ^49 MOS46 0290 E872 ; C=1 MOS46 0322 E87D ^49 MOS46 0291 E872 ; X=SVWORD MOS46 0322 E87D ^49 MOS46 0292 E872 ; Y=0 MOS46 0322 E87D ^49 MOS46 0293 E872 ; MOS46 0322 E87D ^49 MOS46 0294 E872 [ NOSP = &00 MOS46 0322 E87D ^49 MOS46 0306 E872 | MOS46 0322 E87D ^49 MOS46 0307 E872 [ $Tutu MOS46 0322 E87D ^49 MOS46 0312 E872 | MOS46 0322 E87D ^49 MOS46 0313 E872 C8 INY MOS46 0322 E87D ^49 MOS46 0314 E873 B1 F0 LDAIY WORDX ;A := command type indicator (hi-byte of 1st argument) MOS46 0322 E87D ^49 MOS46 0315 E875 C9 FF CMPIM &FF MOS46 0322 E87D ^49 MOS46 0316 E877 ] MOS46 0322 E87D ^49 MOS46 0317 E877 F0 5F BEQ SPEECH ;[speech command] MOS46 0317 E877 v20 MOS46 0318 E879 C9 20 CMPIM &20 MOS46 0317 E877 v20 MOS46 0319 E87B ] MOS46 0317 E877 v20 MOS46 0320 E87B MOS46 0317 E877 v20 MOS46 0321 E87B A2 08 LDXIM SVWORD ;in case EXTSND called MOS46 0317 E877 v20 MOS46 0322 E87D B0 C9 BCS EXTSND ;[route command to paged ROM] MOS46 0317 E877 v20 MOS46 0323 E87F ; MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 100 MOS46 MOS46 OSWORD routines MOS46 MOS46 0317 E877 v20 MOS46 0324 E87F ; sound command MOS46 0317 E877 v20 MOS46 0325 E87F ; MOS46 0317 E877 v20 MOS46 0326 E87F 88 DEY ;Y := 0 MOS46 0317 E877 v20 MOS46 0327 E880 [ MOS125 = &FF MOS46 0317 E877 v20 MOS46 0329 E880 | MOS46 0317 E877 v20 MOS46 0330 E880 B1 F0 LDAIY WORDX MOS46 0317 E877 v20 MOS46 0331 E882 C9 10 CMPIM &10 MOS46 0317 E877 v20 MOS46 0332 E884 29 03 ANDIM &03 ;C => flush, A = channel MOS46 0317 E877 v20 MOS46 0333 E886 ] MOS46 0317 E877 v20 MOS46 0334 E886 09 04 ORAIM &04 ;********** N.B. assumes BSND1=4 MOS46 0317 E877 v20 MOS46 0335 E888 AA TAX ;X := (internal) sound bufferid MOS46 0317 E877 v20 MOS46 0336 E889 90 03 BCC NOTENF ;[do not flush channel] MOS46 0317 E877 v20 MOS46 0337 E88B ; C=1 MOS46 0317 E877 v20 MOS46 0338 E88B ; flush channel MOS46 0317 E877 v20 MOS46 0339 E88B ; MOS46 0317 E877 v20 MOS46 0340 E88B ; C=1 MOS46 0317 E877 v20 MOS46 0341 E88B 20 74 E2 JSR PURGEX ;purge buffer MOS46 0317 E877 v20 MOS46 0342 E88E [ MOS125 = &FF MOS46 0317 E877 v20 MOS46 0347 E88E | MOS46 0317 E877 v20 MOS46 0348 E88E ; MOS46 0317 E877 v20 MOS46 0349 E88E NOTENF MOS46 0317 E877 v20 MOS46 0350 E88E A0 01 LDYIM &01 ;restore Y MOS46 0317 E877 v20 MOS46 0351 E890 B1 F0 LDAIY WORDX MOS46 0317 E877 v20 MOS46 0352 E892 C9 10 CMPIM &10 MOS46 0317 E877 v20 MOS46 0353 E894 29 03 ANDIM &03 ;C => release continue, A = chordcount-1 MOS46 0317 E877 v20 MOS46 0354 E896 ] MOS46 0317 E877 v20 MOS46 0355 E896 85 FA STA NOTEWK MOS46 0317 E877 v20 MOS46 0356 E898 ; MOS46 0317 E877 v20 MOS46 0357 E898 08 PHP ;needed in order to share code with BELL MOS46 0317 E877 v20 MOS46 0358 E899 A0 06 LDYIM &06 ;A := duration-lo MOS46 0317 E877 v20 MOS46 0359 E89B B1 F0 LDAIY WORDX MOS46 0317 E877 v20 MOS46 0360 E89D 48 PHA MOS46 0317 E877 v20 MOS46 0361 E89E ; MOS46 0317 E877 v20 MOS46 0362 E89E A0 04 LDYIM &04 ;A := note-lo MOS46 0317 E877 v20 MOS46 0363 E8A0 B1 F0 LDAIY WORDX MOS46 0317 E877 v20 MOS46 0364 E8A2 48 PHA MOS46 0317 E877 v20 MOS46 0365 E8A3 ; MOS46 0317 E877 v20 MOS46 0366 E8A3 ; C => release continue MOS46 0317 E877 v20 MOS46 0367 E8A3 ; MOS46 0317 E877 v20 MOS46 0368 E8A3 A0 02 LDYIM &02 MOS46 0317 E877 v20 MOS46 0369 E8A5 B1 F0 LDAIY WORDX ;A = envelope-lo MOS46 0317 E877 v20 MOS46 0370 E8A7 2A ROLA ;rotate in release continue bit MOS46 0317 E877 v20 MOS46 0371 E8A8 38 SEC MOS46 0317 E877 v20 MOS46 0372 E8A9 E9 02 SBCIM &02 ;envelope numbers start at 1 MOS46 0317 E877 v20 MOS46 0373 E8AB 0A ASLA MOS46 0317 E877 v20 MOS46 0374 E8AC 0A ASLA ;rotate in 2 zero bits MOS46 0317 E877 v20 MOS46 0375 E8AD 05 FA ORA NOTEWK ;A := AEEE ERHH MOS46 0317 E877 v20 MOS46 0376 E8AF ; MOS46 0317 E877 v20 MOS46 0377 E8AF ; insert byte into buffer, waiting if necessary MOS46 0317 E877 v20 MOS46 0378 E8AF ; MOS46 0317 E877 v20 MOS46 0379 E8AF 20 31 E3 JSR WRITE MOS46 0317 E877 v20 MOS46 0380 E8B2 90 1E BCC NOTE2 ;[byte inserted] MOS46 0317 E877 v20 MOS46 0381 E8B4 ; MOS46 0317 E877 v20 MOS46 0382 E8B4 SPESC ;ESCAPE detected MOS46 0317 E877 v20 MOS46 0383 E8B4 68 PLA MOS46 0317 E877 v20 MOS46 0384 E8B5 68 PLA MOS46 0317 E877 v20 MOS46 0385 E8B6 28 PLP MOS46 0317 E877 v20 MOS46 0386 E8B7 ; MOS46 0317 E877 v20 MOS46 0387 E8B7 VDUST ;FX call to return VDU status MOS46 0317 E877 v20 MOS46 0388 E8B7 A6 D0 LDX STATS MOS46 0317 E877 v20 MOS46 0389 E8B9 ; MOS46 0317 E877 v20 MOS46 0390 E8B9 60 RTS MOS46 0317 E877 v20 MOS46 0391 E8BA MOS46 0317 E877 v20 MOS46 0392 E8BA MOS46 0317 E877 v20 MOS46 0393 E8BA ; MOS46 0317 E877 v20 MOS46 0394 E8BA ;; ===== MOS46 0317 E877 v20 MOS46 0395 E8BA ; BELL MOS46 0317 E877 v20 MOS46 0396 E8BA ; ===== MOS46 0317 E877 v20 MOS46 0397 E8BA ; MOS46 0317 E877 v20 MOS46 0398 E8BA ; Add BELL to sound queue MOS46 0317 E877 v20 MOS46 0399 E8BA ; MOS46 0317 E877 v20 MOS46 0400 E8BA ; ENTRY:- No conditions MOS46 0317 E877 v20 MOS46 0401 E8BA ; MOS46 0317 E877 v20 MOS46 0402 E8BA ; EXIT:- A,X,Y Corrupted MOS46 0317 E877 v20 MOS46 0403 E8BA ; Flags preserved MOS46 0317 E877 v20 MOS46 0404 E8BA ; MOS46 0317 E877 v20 MOS46 0405 E8BA BELL MOS46 0317 E877 v20 MOS46 0406 E8BA 08 PHP MOS46 0317 E877 v20 MOS46 0407 E8BB 78 SEI MOS46 0317 E877 v20 MOS46 0408 E8BC ; MOS46 0317 E877 v20 MOS46 0409 E8BC ; try to add bell to sound channel queue MOS46 0317 E877 v20 MOS46 0410 E8BC ; MOS46 0317 E877 v20 MOS46 0411 E8BC AD 63 02 LDA BELLC MOS46 0317 E877 v20 MOS46 0412 E8BF 29 07 ANDIM &07 MOS46 0317 E877 v20 MOS46 0413 E8C1 09 04 ORAIM &04 MOS46 0317 E877 v20 MOS46 0414 E8C3 AA TAX ;force valid sound channel MOS46 0317 E877 v20 MOS46 0415 E8C4 ; MOS46 0317 E877 v20 MOS46 0416 E8C4 ; insert envelope/chord info MOS46 0317 E877 v20 MOS46 0417 E8C4 ; MOS46 0317 E877 v20 MOS46 0418 E8C4 AD 64 02 LDA BELLI MOS46 0317 E877 v20 MOS46 0419 E8C7 20 A2 E1 JSR INSRT MOS46 0317 E877 v20 MOS46 0420 E8CA ; MOS46 0317 E877 v20 MOS46 0421 E8CA ; N.B. ignore return code MOS46 0317 E877 v20 MOS46 0422 E8CA ; C=0 => inserted, C=1 => not inserted MOS46 0317 E877 v20 MOS46 0423 E8CA ; if first INSRT failed then so will the following INSRTs MOS46 0317 E877 v20 MOS46 0424 E8CA ; set to insert duration MOS46 0317 E877 v20 MOS46 0425 E8CA ; MOS46 0317 E877 v20 MOS46 0426 E8CA AD 66 02 LDA BELLD MOS46 0317 E877 v20 MOS46 0427 E8CD 48 PHA MOS46 0317 E877 v20 MOS46 0428 E8CE ; MOS46 0317 E877 v20 MOS46 0429 E8CE ; set to insert note MOS46 0317 E877 v20 MOS46 0430 E8CE ; MOS46 0317 E877 v20 MOS46 0431 E8CE AD 65 02 LDA BELLN MOS46 0317 E877 v20 MOS46 0432 E8D1 48 PHA MOS46 0317 E877 v20 MOS46 0433 E8D2 ; MOS46 0317 E877 v20 MOS46 0434 E8D2 NOTE2 ;buffer slot available MOS46 0317 E877 v20 MOS46 0435 E8D2 ; C=0 => inserted, C=1 => not inserted MOS46 0317 E877 v20 MOS46 0436 E8D2 ; MOS46 0317 E877 v20 MOS46 0437 E8D2 38 SEC MOS46 0317 E877 v20 MOS46 0438 E8D3 7E 00 08 RORAX MACTIV-BSND1 MOS46 0317 E877 v20 MOS46 0439 E8D6 [ NOSP = &00 MOS46 0317 E877 v20 MOS46 0441 E8D6 | MOS46 0317 E877 v20 MOS46 0442 E8D6 30 17 BMI NOTE3 ;[ALWAYS JUMP] MOS46 0317 E877 v20 MOS46 0443 E8D8 ; MOS46 0317 E877 v20 MOS46 0444 E8D8 SPEECH ;SOUND -1,x,y,z command MOS46 0317 E877 v20 MOS46 0445 E8D8 ; Y=1 MOS46 0317 E877 v20 MOS46 0446 E8D8 08 PHP ;needed to share code with BELL MOS46 0459 E8EA ^48 MOS46 0447 E8D9 C8 INY ;Y := $02 MOS46 0459 E8EA ^48 MOS46 0448 E8DA B1 F0 LDAIY WORDX MOS46 0459 E8EA ^48 MOS46 0449 E8DC 48 PHA MOS46 0459 E8EA ^48 MOS46 0450 E8DD ; MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 101 MOS46 MOS46 OSWORD routines MOS46 MOS46 0459 E8EA ^48 MOS46 0451 E8DD C8 INY ;Y := $03 MOS46 0459 E8EA ^48 MOS46 0452 E8DE B1 F0 LDAIY WORDX MOS46 0459 E8EA ^48 MOS46 0453 E8E0 48 PHA MOS46 0459 E8EA ^48 MOS46 0454 E8E1 ; MOS46 0459 E8EA ^48 MOS46 0455 E8E1 A0 00 LDYIM ZERO MOS46 0459 E8EA ^48 MOS46 0456 E8E3 B1 F0 LDAIY WORDX MOS46 0459 E8EA ^48 MOS46 0457 E8E5 A2 08 LDXIM BSPCH MOS46 0459 E8EA ^48 MOS46 0458 E8E7 20 31 E3 JSR WRITE ;insert first byte into buffer MOS46 0459 E8EA ^48 MOS46 0459 E8EA B0 C8 BCS SPESC ;[escape detected] MOS46 0442 E8D6 v68 MOS46 0460 E8EC ; MOS46 0442 E8D6 v68 MOS46 0461 E8EC ; C=0 MOS46 0442 E8D6 v68 MOS46 0462 E8EC ; MOS46 0442 E8D6 v68 MOS46 0463 E8EC 6E D7 02 ROR SPSTAT ;indicate speech buffer non-empty MOS46 0442 E8D6 v68 MOS46 0464 E8EF ] MOS46 0442 E8D6 v68 MOS46 0465 E8EF ; MOS46 0442 E8D6 v68 MOS46 0466 E8EF NOTE3 ;add note and duration (ignored if first byte not inserted) MOS46 0442 E8D6 v68 MOS46 0467 E8EF 68 PLA -- MOS46 0468 E8F0 20 A2 E1 JSR INSRT ;add note data to queue -- MOS46 0469 E8F3 68 PLA -- MOS46 0470 E8F4 20 A2 E1 JSR INSRT ;add duration info to queue -- MOS46 0471 E8F7 28 PLP -- MOS46 0472 E8F8 60 RTS -- MOS46 0473 E8F9 -- MOS46 0474 E8F9 -- MOS46 0475 E8F9 NVLP ;define envelope shape -- MOS46 0476 E8F9 ; A := envelope number -- MOS46 0477 E8F9 ; C=1 -- MOS46 0478 E8F9 ; -- MOS46 0479 E8F9 [ MOS125 = &FF -- MOS46 0491 E8F9 | -- MOS46 0492 E8F9 ; -- MOS46 0493 E8F9 ; envelope number forced into range 0 to 15 (1->0, 2->1 ... 16->15) -- MOS46 0494 E8F9 ; (0 forced to 255, which will have the same effect as 15) -- MOS46 0495 E8F9 ; -- MOS46 0496 E8F9 0A ASLA -- MOS46 0497 E8FA 0A ASLA -- MOS46 0498 E8FB 0A ASLA -- MOS46 0499 E8FC 0A ASLA ;envelope number := envelope number * 16 -- MOS46 0500 E8FD AA TAX ;N.B. ENVSIZ must be 16! -- MOS46 0501 E8FE ] -- MOS46 0502 E8FE ; -- MOS46 0503 E8FE ; copy envelope definition to envelope slot -- MOS46 0504 E8FE ; padding to 16 bytes with zeroes -- MOS46 0505 E8FE ; -- MOS46 0506 E8FE A9 00 LDAIM ZERO ;padding value -- MOS46 0507 E900 A0 10 LDYIM ENVSIZ -- MOS46 0508 E902 ; -- MOS46 0509 E902 NVLP1 -- MOS46 0510 E902 C0 0E CPYIM ENVSIZ-&02 MOS46 0523 E90D ^73 MOS46 0511 E904 B0 02 BCS NVLP2 ;[still padding] MOS46 0523 E90D ^73 MOS46 0512 E906 ; MOS46 0523 E90D ^73 MOS46 0513 E906 B1 F0 LDAIY WORDX MOS46 0523 E90D ^73 MOS46 0514 E908 NVLP2 MOS46 0523 E90D ^73 MOS46 0515 E908 [ MOS125 = &FF MOS46 0523 E90D ^73 MOS46 0518 E908 | MOS46 0523 E90D ^73 MOS46 0519 E908 CA DEX MOS46 0523 E90D ^73 MOS46 0520 E909 9D C0 08 STAAX ENVEL MOS46 0523 E90D ^73 MOS46 0521 E90C ] MOS46 0523 E90D ^73 MOS46 0522 E90C 88 DEY MOS46 0523 E90D ^73 MOS46 0523 E90D D0 F3 BNE NVLP1 -- MOS46 0524 E90F ; -- MOS46 0525 E90F 60 RTS -- MOS46 0526 E910 -- MOS46 0527 E910 [ MOS125 = &FF -- MOS46 0534 E910 ] -- MOS46 0535 E910 -- MOS46 0536 E910 RITM ;read interval time -- MOS46 0537 E910 A2 0F LDXIM STPW+&5-TIME -- MOS46 0538 E912 D0 03 BNE RTM ;[ALWAYS jump] MOS46 0538 E912 v7C MOS46 0539 E914 ; NEVER fall thru MOS46 0538 E912 v7C MOS46 0540 E914 RATM ;read absolute time MOS46 0538 E912 v7C MOS46 0541 E914 AE 83 02 LDX TIMESW MOS46 0538 E912 v7C MOS46 0542 E917 RTM MOS46 0538 E912 v7C MOS46 0543 E917 A0 04 LDYIM &04 -- MOS46 0544 E919 RTM1 -- MOS46 0545 E919 BD 8D 02 LDAAX TIME -&05 MOS46 0549 E920 ^77 MOS46 0546 E91C 91 F0 STAIY WORDX MOS46 0549 E920 ^77 MOS46 0547 E91E E8 INX MOS46 0549 E920 ^77 MOS46 0548 E91F 88 DEY MOS46 0549 E920 ^77 MOS46 0549 E920 10 F7 BPL RTM1 -- MOS46 0550 E922 WTM0 -- MOS46 0551 E922 60 RTS MOS46 0581 E938 ^68 MOS46 0552 E923 MOS46 0581 E938 ^68 MOS46 0553 E923 [ MOS125 = &FF MOS46 0581 E938 ^68 MOS46 0562 E923 | MOS46 0581 E938 ^68 MOS46 0563 E923 WATM ;write absolute time MOS46 0581 E938 ^68 MOS46 0564 E923 AC 83 02 LDY TIMESW MOS46 0581 E938 ^68 MOS46 0565 E926 18 CLC ;indicate WATM entry MOS46 0581 E938 ^68 MOS46 0566 E927 WITM ;write interval time, C=1, Y=0 MOS46 0581 E938 ^68 MOS46 0567 E927 98 TYA MOS46 0581 E938 ^68 MOS46 0568 E928 49 0F EORIM &0F ;assumes STPW-TIME = &A MOS46 0581 E938 ^68 MOS46 0569 E92A ] MOS46 0581 E938 ^68 MOS46 0570 E92A WTM MOS46 0581 E938 ^68 MOS46 0571 E92A 48 PHA ;save TIMESW for WATM entry MOS46 0581 E938 ^68 MOS46 0572 E92B AA TAX MOS46 0581 E938 ^68 MOS46 0573 E92C A0 04 LDYIM &04 MOS46 0581 E938 ^68 MOS46 0574 E92E WTM1 MOS46 0581 E938 ^68 MOS46 0575 E92E B1 F0 LDAIY WORDX MOS46 0581 E938 ^68 MOS46 0576 E930 9D 8D 02 STAAX TIME -&05 MOS46 0581 E938 ^68 MOS46 0577 E933 E8 INX MOS46 0581 E938 ^68 MOS46 0578 E934 88 DEY MOS46 0581 E938 ^68 MOS46 0579 E935 10 F7 BPL WTM1 MOS46 0581 E938 ^68 MOS46 0580 E937 68 PLA MOS46 0581 E938 ^68 MOS46 0581 E938 B0 E8 BCS WTM0 ;[not WATM entry, do not reset TIMESW] -- MOS46 0582 E93A ; WATM entry, reset TIMESW -- MOS46 0583 E93A 8D 83 02 STA TIMESW -- MOS46 0584 E93D 60 RTS -- MOS46 0585 E93E -- MOS46 0586 E93E RDLN ;read input buffer -- MOS46 0587 E93E ; ****************** -- MOS46 0588 E93E ; ENABLES INTERRUPTS -- MOS46 0589 E93E ; ****************** -- MOS46 0590 E93E ;**************** -- MOS46 0591 E93E ;variables: -- MOS46 0592 E93E ;zero page: RDLNX, RDLNY (contiguous) -- MOS46 0593 E93E ;other page: RDLNN, RDLNLC, RDLNHC (contiguous) -- MOS46 0594 E93E ;**************** -- MOS46 0595 E93E ;Called with Y and X the high and low addresses of the information -- MOS46 0596 E93E ;describing what is to be done. The bytes in order are: -- MOS46 0597 E93E ;lsb address of buffer -- MOS46 0598 E93E ;msb address of buffer MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 102 MOS46 MOS46 OSWORD routines MOS46 -- MOS46 0599 E93E ;maximum length allowed -- MOS46 0600 E93E ;minimum character value to be stored in buffer -- MOS46 0601 E93E ;maximum character value to be stored in buffer -- MOS46 0602 E93E ;Return when escape is pressed or seen with CARRY SET -- MOS46 0603 E93E ;Return after CR (which is always stored) with CARRY CLEAR -- MOS46 0604 E93E ;Always returns with Y the number of characters in the buffer -- MOS46 0605 E93E ;DEL,ESC and NAK are always processed -- MOS46 0606 E93E ;**** NOTE **** -- MOS46 0607 E93E ; if the 'other page' variables are put into page zero -- MOS46 0608 E93E ; this routine can be made ~10 bytes shorter. -- MOS46 0609 E93E ; however, an extra pointer variable in page zero would -- MOS46 0610 E93E ; then be required. -- MOS46 0611 E93E ; this routine enables interrupts -- MOS46 0612 E93E ; ********** -- MOS46 0613 E93E ; copy 'other page' values -- MOS46 0614 E93E -- MOS46 0615 E93E A0 04 LDYIM &04 -- MOS46 0616 E940 BUFFPR -- MOS46 0617 E940 B1 F0 LDAIY WORDX MOS46 0621 E948 ^76 MOS46 0618 E942 99 B1 02 STAAY RDLNN -&02 ;N.B. offset of -02 MOS46 0621 E948 ^76 MOS46 0619 E945 88 DEY MOS46 0621 E948 ^76 MOS46 0620 E946 C0 02 CPYIM &02 MOS46 0621 E948 ^76 MOS46 0621 E948 B0 F6 BCS BUFFPR ;[more arguments to copy] -- MOS46 0622 E94A ; -- MOS46 0623 E94A ; C=0, Y=1 -- MOS46 0624 E94A ; copy buffer pointer -- MOS46 0625 E94A ; -- MOS46 0626 E94A B1 F0 LDAIY WORDX ;hi-byte -- MOS46 0627 E94C 85 E9 STA RDLNBF +&01 -- MOS46 0628 E94E 88 DEY ;Y := 0 -- MOS46 0629 E94F 8C 69 02 STY LINES ;reset page mode page origin -- MOS46 0630 E952 B1 F0 LDAIY WORDX ;lo-byte -- MOS46 0631 E954 85 E8 STA RDLNBF +&00 -- MOS46 0632 E956 ; -- MOS46 0633 E956 ; C=0, Y=0 -- MOS46 0634 E956 ; -- MOS46 0635 E956 58 CLI ;**** ENABLE INTERRUPTS **** -- MOS46 0636 E957 90 1F BCC BUFFIN ;[ALWAYS JUMP] MOS46 0636 E957 v60 MOS46 0637 E959 ; MOS46 0636 E957 v60 MOS46 0638 E959 ; NEVER fall thru MOS46 0636 E957 v60 MOS46 0639 E959 MOS46 0636 E957 v60 MOS46 0640 E959 MOS46 0636 E957 v60 MOS46 0641 E959 [ MOS125 = &FF MOS46 0636 E957 v60 MOS46 0645 E959 | MOS46 0636 E957 v60 MOS46 0646 E959 A9 07 BUFEXH LDAIM BEL ;reflect bell to indicate error MOS46 0636 E957 v60 MOS46 0647 E95B D0 18 BNE BUFIGN ;ALWAYS jump MOS46 0636 E957 v60 MOS46 0648 E95D MOS46 0636 E957 v60 MOS46 0649 E95D BUFNXB ;check for ESC explicitly in case machine in non ESC mode MOS46 0636 E957 v60 MOS46 0650 E95D ;CMPIM ESC MOS46 0636 E957 v60 MOS46 0651 E95D ;BEQ BUFESC ;[ESC, N.B. C = 1] MOS46 0636 E957 v60 MOS46 0652 E95D ; not DEL, NAK or ESC MOS46 0636 E957 v60 MOS46 0653 E95D 91 E8 STAIY RDLNBF ;store character in buffer MOS46 0725 E991 ^4A MOS46 0654 E95F C9 0D CMPIM MCR MOS46 0725 E991 ^4A MOS46 0655 E961 F0 3F BEQ BUFEND ;[CR detected, exit indicating CR received] MOS46 0655 E961 v40 MOS46 0656 E963 CC B3 02 CPY RDLNN MOS46 0655 E961 v40 MOS46 0657 E966 B0 F1 BCS BUFEXH ;[buffer exhausted, do not echo character] MOS46 0655 E961 v40 MOS46 0658 E968 ; MOS46 0655 E961 v40 MOS46 0659 E968 ; buffer not exhausted MOS46 0655 E961 v40 MOS46 0660 E968 ; MOS46 0655 E961 v40 MOS46 0661 E968 CD B4 02 CMP RDLNLC MOS46 0655 E961 v40 MOS46 0662 E96B 90 08 BCC BUFIGN ;[character < lo-character] MOS46 0655 E961 v40 MOS46 0663 E96D CD B5 02 CMP RDLNHC MOS46 0655 E961 v40 MOS46 0664 E970 90 02 BCC BUFECH ;[character < hi-character, so accept] MOS46 0655 E961 v40 MOS46 0665 E972 D0 01 BNE BUFIGN ;[character > hi-character, so ignore] MOS46 0655 E961 v40 MOS46 0666 E974 C8 BUFECH INY ;increment count of characters in buffer MOS46 0655 E961 v40 MOS46 0667 E975 BUFIGN MOS46 0655 E961 v40 MOS46 0668 E975 ] MOS46 0655 E961 v40 MOS46 0669 E975 ; echo character MOS46 0655 E961 v40 MOS46 0670 E975 BFWRCH MOS46 0655 E961 v40 MOS46 0671 E975 20 EE FF JSR OSWRCH MOS46 0655 E961 v40 MOS46 0672 E978 ; MOS46 0655 E961 v40 MOS46 0673 E978 BUFFIN ;main loop MOS46 0655 E961 v40 MOS46 0674 E978 20 E0 FF JSR OSRDCH ;read a character MOS46 0655 E961 v40 MOS46 0675 E97B B0 2B BCS BUFESC ;[escape detected] MOS46 0655 E961 v40 MOS46 0676 E97D AA TAX MOS46 0655 E961 v40 MOS46 0677 E97E AD 7C 02 LDA WRCHSW MOS46 0655 E961 v40 MOS46 0678 E981 6A RORA MOS46 0655 E961 v40 MOS46 0679 E982 6A RORA MOS46 0655 E961 v40 MOS46 0680 E983 8A TXA MOS46 0655 E961 v40 MOS46 0681 E984 B0 05 BCS BUFNQ ;[output does not include VDU] MOS46 0655 E961 v40 MOS46 0682 E986 ; MOS46 0655 E961 v40 MOS46 0683 E986 ; output includes VDU MOS46 0655 E961 v40 MOS46 0684 E986 ; MOS46 0655 E961 v40 MOS46 0685 E986 ; MOS46 0655 E961 v40 MOS46 0686 E986 AE 6A 02 LDX QPOSN MOS46 0655 E961 v40 MOS46 0687 E989 D0 EA BNE BFWRCH ;[VDU queueing, reflect character] MOS46 0655 E961 v40 MOS46 0688 E98B ; MOS46 0655 E961 v40 MOS46 0689 E98B ; output does not include VDU MOS46 0655 E961 v40 MOS46 0690 E98B ; MOS46 0655 E961 v40 MOS46 0691 E98B BUFNQ ;VDU not queueing MOS46 0655 E961 v40 MOS46 0692 E98B [ MOS125 = &FF MOS46 0655 E961 v40 MOS46 0721 E98B | MOS46 0655 E961 v40 MOS46 0722 E98B C9 7F CMPIM MDEL MOS46 0655 E961 v40 MOS46 0723 E98D F0 05 BEQ BUFCNL ;[DEL received] MOS46 0655 E961 v40 MOS46 0724 E98F C9 15 CMPIM MNAK MOS46 0655 E961 v40 MOS46 0725 E991 D0 CA BNE BUFNXB ;[not DEL or NAK] MOS46 0655 E961 v40 MOS46 0726 E993 18 CLC MOS46 0655 E961 v40 MOS46 0727 E994 BUFCNL ;output DEL once (CC) or for each character in the buffer MOS46 0655 E961 v40 MOS46 0728 E994 98 TYA MOS46 0655 E961 v40 MOS46 0729 E995 F0 E1 BEQ BUFFIN ;[reached start of line] MOS46 0655 E961 v40 MOS46 0730 E997 88 DEY MOS46 0655 E961 v40 MOS46 0731 E998 A9 7F LDAIM MDEL MOS46 0655 E961 v40 MOS46 0732 E99A B0 D9 BCS BFWRCH ;[if DEL, reflect DEL and get next char] MOS46 0655 E961 v40 MOS46 0733 E99C 20 EE FF JSR OSWRCH MOS46 0655 E961 v40 MOS46 0734 E99F 18 CLC MOS46 0655 E961 v40 MOS46 0735 E9A0 90 F2 BCC BUFCNL ;[ALWAYS jump, more characters to delete] MOS46 0655 E961 v40 MOS46 0736 E9A2 ] MOS46 0655 E961 v40 MOS46 0737 E9A2 ; NEVER fall thru MOS46 0655 E961 v40 MOS46 0738 E9A2 ; MOS46 0655 E961 v40 MOS46 0739 E9A2 [ MOS125 = &FF MOS46 0655 E961 v40 MOS46 0759 E9A2 ] MOS46 0655 E961 v40 MOS46 0760 E9A2 MOS46 0655 E961 v40 MOS46 0761 E9A2 BUFEND ;read line successful MOS46 0655 E961 v40 MOS46 0762 E9A2 ; echo LF CR MOS46 0655 E961 v40 MOS46 0763 E9A2 20 E7 FF JSR OSNEWL MOS46 0675 E97B v54 MOS46 0764 E9A5 20 12 E6 JSR JMINET ;N.B. assumes NTCR has value $0D MOS46 0675 E97B v54 MOS46 0765 E9A8 ; MOS46 0675 E97B v54 MOS46 0766 E9A8 BUFESC ;escape exit (C=1) MOS46 0675 E97B v54 MOS46 0767 E9A8 A5 FF LDA ESCFLG -- MOS46 0768 E9AA 2A ROLA ;C=0 => no escape, C=1 => escape -- MOS46 0769 E9AB 60 RTS MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 103 MOS46 MOS46 OSWORD routines MOS46 -- MOS46 0770 E9AC -- MOS46 0771 E9AC -- MOS46 0772 E9AC [ MOS125 = &7F -- MOS46 0773 E9AC ;flash keyboard LEDs while waiting for printer buffer to purge -- MOS46 0774 E9AC ;C=1 -- MOS46 0775 E9AC SPFL -- MOS46 0776 E9AC 8A TXA MOS46 0795 E9BF ^6B MOS46 0777 E9AD 48 PHA ;save printer selection MOS46 0795 E9BF ^6B MOS46 0778 E9AE 20 18 EA JSR MOSTST ;flash LEDs MOS46 0795 E9BF ^6B MOS46 0779 E9B1 68 PLA MOS46 0795 E9BF ^6B MOS46 0780 E9B2 AA TAX ;restore printer selection MOS46 0795 E9BF ^6B MOS46 0781 E9B3 A9 05 LDAIM &05 ;restore FX call number MOS46 0795 E9BF ^6B MOS46 0782 E9B5 38 SEC ;restore C=1 MOS46 0795 E9BF ^6B MOS46 0783 E9B6 ] MOS46 0795 E9BF ^6B MOS46 0784 E9B6 MOS46 0795 E9BF ^6B MOS46 0785 E9B6 SPRINT ;change printer selection (*FX 5) MOS46 0795 E9BF ^6B MOS46 0786 E9B6 ; allow interrupts during wait, this means that: MOS46 0795 E9BF ^6B MOS46 0787 E9B6 ; (a) the printer can purge AND/OR MOS46 0795 E9BF ^6B MOS46 0788 E9B6 ; (b) escape can be detected MOS46 0795 E9BF ^6B MOS46 0789 E9B6 58 CLI MOS46 0795 E9BF ^6B MOS46 0790 E9B7 78 SEI MOS46 0795 E9BF ^6B MOS46 0791 E9B8 24 FF BIT ESCFLG MOS46 0795 E9BF ^6B MOS46 0792 E9BA 30 2F BMI SPR0 ;[escape detected] MOS46 0792 E9BA v50 MOS46 0793 E9BC 2C D2 02 BIT PFLAG MOS46 0792 E9BA v50 MOS46 0794 E9BF [ MOS125 = &7F MOS46 0792 E9BA v50 MOS46 0795 E9BF 10 EB BPL SPFL ;printer busy, flash LEDs while purging MOS46 0792 E9BA v50 MOS46 0796 E9C1 | MOS46 0792 E9BA v50 MOS46 0798 E9C1 ] MOS46 0792 E9BA v50 MOS46 0799 E9C1 ; mention change of printer to print routines MOS46 0792 E9BA v50 MOS46 0800 E9C1 20 01 E3 JSR UPTX ;N.B. Y corrupted MOS46 0792 E9BA v50 MOS46 0801 E9C4 ; interrupts may have corrupted BYTEX and BYTEY, so restore them MOS46 0792 E9BA v50 MOS46 0802 E9C4 A0 00 LDYIM ZERO ;Y altered by call to UPTX MOS46 0792 E9BA v50 MOS46 0803 E9C6 84 F1 STY BYTEY MOS46 0792 E9BA v50 MOS46 0804 E9C8 ; N.B. X reset at SETVX MOS46 0792 E9BA v50 MOS46 0805 E9C8 ; N.B. A not altered since SPRINT MOS46 0792 E9BA v50 MOS46 0806 E9C8 ; MOS46 0792 E9BA v50 MOS46 0807 E9C8 V2B156 ;convert FX 1,5,6 to FX 241,245,246 MOS46 0792 E9BA v50 MOS46 0808 E9C8 09 F0 ORAIM &F0 MOS46 0792 E9BA v50 MOS46 0809 E9CA D0 0D BNE SETVX ;[ALWAYS jump] MOS46 0792 E9BA v50 MOS46 0810 E9CC ; MOS46 0792 E9BA v50 MOS46 0811 E9CC ARRPT ;A = $0C, set auto-repeat repeat count MOS46 0792 E9BA v50 MOS46 0812 E9CC ; N.B. previous instruction was LDX MOS46 0792 E9BA v50 MOS46 0813 E9CC ; C=1 MOS46 0792 E9BA v50 MOS46 0814 E9CC D0 07 BNE ARRPT1 ;[X<>0 => do not set defaults] MOS46 0792 E9BA v50 MOS46 0815 E9CE ; set defaults MOS46 0792 E9BA v50 MOS46 0816 E9CE A2 32 LDXIM DAUTOD MOS46 0792 E9BA v50 MOS46 0817 E9D0 8E 54 02 STX FARSET MOS46 0792 E9BA v50 MOS46 0818 E9D3 A2 08 LDXIM DAUTOP MOS46 0792 E9BA v50 MOS46 0819 E9D5 ARRPT1 ;A = $0C, C=1 MOS46 0792 E9BA v50 MOS46 0820 E9D5 ARDLY ;A = $0B, C=1, set auto-repeat delay count (0 => disable) MOS46 0792 E9BA v50 MOS46 0821 E9D5 [ MOS125 = &FF MOS46 0792 E9BA v50 MOS46 0827 E9D5 | MOS46 0792 E9BA v50 MOS46 0828 E9D5 09 D0 ORAIM &D0 ;preserve C=1 MOS46 0792 E9BA v50 MOS46 0829 E9D7 ; MOS46 0792 E9BA v50 MOS46 0830 E9D7 V2B34 ;C=1 MOS46 0792 E9BA v50 MOS46 0831 E9D7 69 E8 ADCIM 233 -&01 ;convert FX 3&4 to FX 236,237 MOS46 0792 E9BA v50 MOS46 0832 E9D9 ] MOS46 0792 E9BA v50 MOS46 0833 E9D9 ; MOS46 0792 E9BA v50 MOS46 0834 E9D9 SETVX MOS46 0792 E9BA v50 MOS46 0835 E9D9 86 F0 STX BYTEX MOS46 0792 E9BA v50 MOS46 0836 E9DB ; MOS46 0792 E9BA v50 MOS46 0837 E9DB SETV ;set variable MOS46 0792 E9BA v50 MOS46 0838 E9DB ; A = FX code MOS46 0792 E9BA v50 MOS46 0839 E9DB ; X = value MOS46 0792 E9BA v50 MOS46 0840 E9DB ; Y = mask MOS46 0792 E9BA v50 MOS46 0841 E9DB A8 TAY ;Y := FX code MOS46 0792 E9BA v50 MOS46 0842 E9DC B9 90 01 LDAAY VBASE ;A := old value MOS46 0792 E9BA v50 MOS46 0843 E9DF AA TAX ;X := old value MOS46 0792 E9BA v50 MOS46 0844 E9E0 25 F1 AND BYTEY ;apply mask MOS46 0792 E9BA v50 MOS46 0845 E9E2 45 F0 EOR BYTEX ;apply value MOS46 0792 E9BA v50 MOS46 0846 E9E4 99 90 01 STAAY VBASE ;store new value MOS46 0792 E9BA v50 MOS46 0847 E9E7 B9 91 01 LDAAY VBASE+&01 MOS46 0792 E9BA v50 MOS46 0848 E9EA A8 TAY ;return following byte MOS46 0792 E9BA v50 MOS46 0849 E9EB SPR0 MOS46 0792 E9BA v50 MOS46 0850 E9EB 60 RTS -- MOS46 0851 E9EC -- MOS46 0852 E9EC -- MOS46 0853 E9EC BAUDS ;baud rate table (N.B. RS423 bit set cos of B9600 definition) -- MOS46 0854 E9EC BUFTYP ;**** WARNING - SUBTLE WAY TO DETECT SOUND BUFFERS **** -- MOS46 0855 E9EC ; (*) = sound buffer -- MOS46 0856 E9EC 0080 SOUNDB * &80 -- MOS46 0857 E9EC 64 = B9600 ;default baud rate / buffer 0 -- MOS46 0858 E9ED 7F = &7F ;75 111 111 / buffer 1 -- MOS46 0859 E9EE 5B = &5B ;150 011 011 / buffer 2 -- MOS46 0860 E9EF 6D = &6D ;300 101 101 / buffer 3 -- MOS46 0861 E9F0 C9 = &49+SOUNDB ;1200 001 001 / buffer 4 (*) -- MOS46 0862 E9F1 F6 = &76+SOUNDB ;2400 110 110 / buffer 5 (*) -- MOS46 0863 E9F2 D2 = &52+SOUNDB ;4800 010 010 / buffer 6 (*) -- MOS46 0864 E9F3 E4 = B9600+SOUNDB ;9600 100 100 / buffer 7 (*) -- MOS46 0865 E9F4 40 = &40 ;19200 000 000 / buffer 8 -- MOS46 0866 E9F5 -- MOS46 0867 E9F5 -- MOS46 0868 E9F5 WFVS ;wait for vertical sync -- MOS46 0869 E9F5 AD 40 02 LDA CYCLE -- MOS46 0870 E9F8 WFVS1 ;wait for CYCLE to alter -- MOS46 0871 E9F8 58 CLI ;must enable interrupts to allow CYCLE to operate MOS46 0876 E9FD ^79 MOS46 0872 E9F9 ; this should give the user control immediately after VSYNC MOS46 0876 E9FD ^79 MOS46 0873 E9F9 ; interrupt occurred MOS46 0876 E9FD ^79 MOS46 0874 E9F9 78 SEI MOS46 0876 E9FD ^79 MOS46 0875 E9FA CD 40 02 CMP CYCLE MOS46 0876 E9FD ^79 MOS46 0876 E9FD F0 F9 BEQ WFVS1 ;[CYCLE not altered] -- MOS46 0877 E9FF ; -- MOS46 0878 E9FF ; share exit with read VDU variable -- MOS46 0879 E9FF ; -- MOS46 0880 E9FF VDUVAR ;read VDU variables -- MOS46 0881 E9FF BC 01 03 LDYAX VARBLE+&01 -- MOS46 0882 EA02 BD 00 03 LDAAX VARBLE+&00 -- MOS46 0883 EA05 AA TAX -- MOS46 0884 EA06 60 RTS -- MOS46 0885 EA07 -- MOS46 0886 EA07 -- MOS46 0887 EA07 RSOFT ;reset soft keys -- MOS46 0888 EA07 ; initialise soft key pointers -- MOS46 0889 EA07 ; exits with X=0 (used by RESET) -- MOS46 0890 EA07 ; ********** MUST NOT CORRUPT Y (SEE RESET) ********** -- MOS46 0891 EA07 A9 10 LDAIM NSOFTK -- MOS46 0892 EA09 8D 84 02 STA USKFLG ;signal soft keys inconsistent -- MOS46 0893 EA0C A2 00 LDXIM ZERO -- MOS46 0894 EA0E STTA ;set soft key buffer pointers, including the two end pointers -- MOS46 0895 EA0E 9D 00 0B STAAX SKPTR MOS46 0897 EA12 ^7A MOS46 0896 EA11 E8 INX MOS46 MOS46 MOS46 MOS46 Acorn macro assembler Page 104 MOS46 MOS46 OSWORD routines MOS46 MOS46 0897 EA12 ^7A MOS46 0897 EA12 D0 FA BNE STTA -- MOS46 0898 EA14 ; X=0 -- MOS46 0899 EA14 8E 84 02 STX USKFLG ;USKFLG set to zero when soft keys consistent -- MOS46 0900 EA17 ; X=0 -- MOS46 0901 EA17 60 RTS -- MOS46 0902 EA18 -- MOS46 0903 EA18 -- MOS46 0904 EA18 LNK MOS48 -- MOS48 0001 EA18 -- MOS48 0002 EA18 ; MOS48 -- MOS48 0003 EA18 TTL MOS48 Miscellaneous routines -- MOS48 0004 EA18 OPT MOS48 MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 105 MOS48 MOS48 Miscellaneous routines MOS48 -- MOS48 0005 EA18 ;(c) 1981 ACORN Computers Limited -- MOS48 0006 EA18 ;BBC Microcomputer Machine Operating System (MOS) -- MOS48 0007 EA18 -- MOS48 0008 EA18 ;Change record: -- MOS48 0009 EA18 ;01/03/82 PB GSINTC CR indication -- MOS48 0010 EA18 ;05/01/82 PB Change from printer claim to RS423 -- MOS48 0011 EA18 -- MOS48 0012 EA18 ;Author(s): -- MOS48 0013 EA18 ;PB Paul Bond -- MOS48 0014 EA18 -- MOS48 0015 EA18 -- MOS48 0016 EA18 TTL MOS48 External interface routines -- MOS48 0017 EA18 OPT OPNEWP MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 106 MOS48 MOS48 External interface routines MOS48 -- MOS48 0018 EA18 -- MOS48 0019 EA18 -- MOS48 0020 EA18 ; external interfaces -- MOS48 0021 EA18 -- MOS48 0022 EA18 -- MOS48 0023 EA18 MOSTST -- MOS48 0024 EA18 ; C=0 => do not set LEDs, C=1 => set LEDs -- MOS48 0025 EA18 ; N.B. must not corrupt X (see WRCH print section) -- MOS48 0026 EA18 08 PHP ;push interrupt state -- MOS48 0027 EA19 78 SEI -- MOS48 0028 EA1A ; test for ESCAPE -- MOS48 0029 EA1A A9 40 LDAIM &40 -- MOS48 0030 EA1C 20 29 EA JSR LEDSON ;conditionally set LEDs and test escape condition -- MOS48 0031 EA1F 30 05 BMI SHIFTX ;[escape pending, simulate SHIFT without CTRL] MOS48 0031 EA1F v7A MOS48 0032 EA21 ; MOS48 0031 EA1F v7A MOS48 0033 EA21 18 CLC ;indicate test ctrl/shift entry point MOS48 0031 EA1F v7A MOS48 0034 EA22 B8 CLV MOS48 0031 EA1F v7A MOS48 0035 EA23 20 9B F0 JSR JMIKEY MOS48 0031 EA1F v7A MOS48 0036 EA26 ; MOS48 0031 EA1F v7A MOS48 0037 EA26 SHIFTX ;b7(A) => CTRL, b6(A) => SHIFT MOS48 0031 EA1F v7A MOS48 0038 EA26 28 PLP -- MOS48 0039 EA27 2A ROLA ;C => CTRL, MI => SHIFT -- MOS48 0040 EA28 60 RTS -- MOS48 0041 EA29 -- MOS48 0042 EA29 -- MOS48 0043 EA29 LEDSON ;turn LEDs on -- MOS48 0044 EA29 ; **************************************** -- MOS48 0045 EA29 ; MUST BE ENTERED WITH INTERRUPTS DISABLED -- MOS48 0046 EA29 ; **************************************** -- MOS48 0047 EA29 ; C=0 => do not turn LEDs on, C=1 => turn LEDs on -- MOS48 0048 EA29 ; returns status of BIT ESCFLG -- MOS48 0049 EA29 90 09 BCC LEDS0 ;[do not turn LEDs on] MOS48 0049 EA29 v76 MOS48 0050 EA2B ; set both LEDs (indicating a wait state) MOS48 0049 EA29 v76 MOS48 0051 EA2B A0 07 LDYIM &07 MOS48 0049 EA29 v76 MOS48 0052 EA2D 8C 40 FE STY PBQ ;PBQ:=$07 MOS48 0049 EA29 v76 MOS48 0053 EA30 88 DEY MOS48 0049 EA29 v76 MOS48 0054 EA31 8C 40 FE STY PBQ ;PBQ:=$06 MOS48 0049 EA29 v76 MOS48 0055 EA34 LEDS0 ;set escape status MOS48 0049 EA29 v76 MOS48 0056 EA34 24 FF BIT ESCFLG -- MOS48 0057 EA36 60 RTS -- MOS48 0058 EA37 -- MOS48 0059 EA37 CREG ;called by VDU module -- MOS48 0060 EA37 ; interrupts are disabled in order that a spurious -- MOS48 0061 EA37 ; ADC interrupt does not occur -- MOS48 0062 EA37 08 PHP ;save interrupt state -- MOS48 0063 EA38 78 SEI -- MOS48 0064 EA39 8D 40 FE STA PBQ ;set addressable latch value -- MOS48 0065 EA3C 28 PLP ;restore interrupt state -- MOS48 0066 EA3D 60 RTS -- MOS48 0067 EA3E -- MOS48 0068 EA3E -- MOS48 0069 EA3E VP0 ;program vidproc register 0 (FX entry) -- MOS48 0070 EA3E 8A TXA -- MOS48 0071 EA3F MVPRC0 ;set video processor register 0 -- MOS48 0072 EA3F 08 PHP -- MOS48 0073 EA40 78 SEI ;**** DISABLE INTERRUPTS **** -- MOS48 0074 EA41 8D 48 02 STA VPREGA ;update RAM image -- MOS48 0075 EA44 8D 20 FE STA VPROC0 ;update ULA -- MOS48 0076 EA47 AD 53 02 LDA FLMRK -- MOS48 0077 EA4A 8D 51 02 STA FLCNT ;reset flash count to mark value -- MOS48 0078 EA4D 28 PLP -- MOS48 0079 EA4E 60 RTS -- MOS48 0080 EA4F -- MOS48 0081 EA4F VP1 ;program vidproc register 1 (FX entry) -- MOS48 0082 EA4F 8A TXA -- MOS48 0083 EA50 MVPRC1 ;set video processor register 1 -- MOS48 0084 EA50 49 07 EORIM &07 ;adjust value accounting for ULA bug -- MOS48 0085 EA52 [ MOS125 = &FF -- MOS48 0088 EA52 | -- MOS48 0089 EA52 ;interrupts were disabled at BYTE -- MOS48 0090 EA52 ] -- MOS48 0091 EA52 8D 49 02 STA VPREGB ;update RAM image -- MOS48 0092 EA55 8D 21 FE STA VPROC1 ;update ULA -- MOS48 0093 EA58 [ MOS125 = &FF -- MOS48 0095 EA58 ] -- MOS48 0096 EA58 60 RTS -- MOS48 0097 EA59 -- MOS48 0098 EA59 [ MOS125 = &FF -- MOS48 0099 EA59 | -- MOS48 0100 EA59 ; fetch/store byte from MMIO without dummy read cycle -- MOS48 0101 EA59 ; on entry A=OSBYTE call no. X=addr lo Y=byte C=1 -- MOS48 0102 EA59 69 65 CHEQUE ADCIM &65 ;C=1; A=&FC..FE -- MOS48 0103 EA5B 38 SEC -- MOS48 0104 EA5C 6A RORA ;C=0 read memory C=1 write -- MOS48 0105 EA5D ; fetch/store byte from I/O mem without dummy read -- MOS48 0106 EA5D ; on entry A=addr hi X=addr lo Y=byte C=0 read C=1 write -- MOS48 0107 EA5D BOUNCE -- MOS48 0108 EA5D 85 FB STA PEEKHI ;MSB address -- MOS48 0109 EA5F 86 FA STX PEEKLO ;LSB address -- MOS48 0110 EA61 A2 00 LDXIM &00 -- MOS48 0111 EA63 90 04 BCC BREAD MOS48 0111 EA63 v7B MOS48 0112 EA65 98 TYA MOS48 0111 EA63 v7B MOS48 0113 EA66 81 FA STAIX PEEKLO MOS48 0111 EA63 v7B MOS48 0114 EA68 60 RTS MOS48 0111 EA63 v7B MOS48 0115 EA69 BREAD MOS48 0111 EA63 v7B MOS48 0116 EA69 A1 FA LDAIX PEEKLO -- MOS48 0117 EA6B A8 TAY -- MOS48 0118 EA6C 38 SEC ;return C=1 from OSBYTE/OSWORD -- MOS48 0119 EA6D 60 RTS -- MOS48 0120 EA6E -- MOS48 0121 EA6E MSGON ;used by CFS -- MOS48 0122 EA6E ;Return EQ if messages off and not doing catalogue -- MOS48 0123 EA6E ;or during EXEC/SPOOL (during which messages cannot occur -- MOS48 0124 EA6E ;since this implies writing chars while within RDCH or WRCH) -- MOS48 0125 EA6E -- MOS48 0126 EA6E A5 EB LDA ESSEMA -- MOS48 0127 EA70 30 22 BMI MSGONY ;Inside RDCH/WRCH -> msgs OFF MOS48 0127 EA70 v5D MOS48 0128 EA72 MOS48 0127 EA70 v5D MOS48 0129 EA72 A9 08 LDAIM CATBIT MOS48 0127 EA70 v5D MOS48 0130 EA74 25 E2 AND CFSTAT MOS48 0127 EA70 v5D MOS48 0131 EA76 D0 04 BNE MSGONX ;Out with msgs set. MOS48 0127 EA70 v5D MOS48 0132 EA78 MOS48 0127 EA70 v5D MOS48 0133 EA78 A9 88 LDAIM MONBIT MOS48 0127 EA70 v5D MOS48 0134 EA7A 25 BB AND USFLGS MOS48 0127 EA70 v5D MOS48 0135 EA7C 60 MSGONX RTS MOS48 0127 EA70 v5D MOS48 0136 EA7D MOS48 0127 EA70 v5D MOS48 0137 EA7D PEEK ;read byte from I/O processor MOS48 0127 EA70 v5D MOS48 0138 EA7D 18 CLC MOS48 0127 EA70 v5D MOS48 0139 EA7E POKE ;write byte to I/O processor MOS48 0127 EA70 v5D MOS48 0140 EA7E AA TAX ;hold address lo-byte MOS48 0127 EA70 v5D MOS48 0141 EA7F C8 INY ;Y=1 MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 107 MOS48 MOS48 External interface routines MOS48 MOS48 0127 EA70 v5D MOS48 0142 EA80 B1 F0 LDAIY WORDX ;get address hi-byte MOS48 0127 EA70 v5D MOS48 0143 EA82 48 PHA ;address in X and 1,S MOS48 0127 EA70 v5D MOS48 0144 EA83 A0 04 LDYIM &04 ;point to byte to write MOS48 0127 EA70 v5D MOS48 0145 EA85 B1 F0 LDAIY WORDX MOS48 0127 EA70 v5D MOS48 0146 EA87 A8 TAY ;hold byte to write MOS48 0127 EA70 v5D MOS48 0147 EA88 68 PLA ;restore MSB of address MOS48 0127 EA70 v5D MOS48 0148 EA89 20 5D EA JSR BOUNCE ;write byte in Y/read byte into A MOS48 0127 EA70 v5D MOS48 0149 EA8C A0 04 LDYIM &04 MOS48 0127 EA70 v5D MOS48 0150 EA8E 91 F0 STAIY WORDX ;store byte read in OSWORD block MOS48 0127 EA70 v5D MOS48 0151 EA90 VER MOS48 0127 EA70 v5D MOS48 0152 EA90 F0 31 BEQ PVER MOS48 0152 EA90 v4E MOS48 0153 EA92 A2 01 LDXIM MCVER ;X=1 for OSBYTE 0,1 MOS version 1 MOS48 0152 EA90 v4E MOS48 0154 EA94 MSGONY ;used by MSGON below MOS48 0152 EA90 v4E MOS48 0155 EA94 A9 00 LDAIM ZERO MOS48 0152 EA90 v4E MOS48 0156 EA96 60 RTS MOS48 0152 EA90 v4E MOS48 0157 EA97 ] MOS48 0152 EA90 v4E MOS48 0158 EA97 MOS48 0152 EA90 v4E MOS48 0159 EA97 GSINTC ;intialise for string access (read item) MOS48 0152 EA90 v4E MOS48 0160 EA97 MOS48 0152 EA90 v4E MOS48 0161 EA97 18 CLC MOS48 0152 EA90 v4E MOS48 0162 EA98 GSINTS ;initialise for string access (read item/rest of line) MOS48 0152 EA90 v4E MOS48 0163 EA98 66 E4 ROR KQUOTE MOS48 0152 EA90 v4E MOS48 0164 EA9A 20 CA E0 JSR SKIPSP ;A := LDAIY WORK MOS48 0152 EA90 v4E MOS48 0165 EA9D C8 INY ;skip possible opening quote MOS48 0152 EA90 v4E MOS48 0166 EA9E C9 22 CMPIM DQUOTE MOS48 0152 EA90 v4E MOS48 0167 EAA0 F0 02 BEQ CLIOQ ;[opening quote, C=1] MOS48 0152 EA90 v4E MOS48 0168 EAA2 ; no opening quote MOS48 0152 EA90 v4E MOS48 0169 EAA2 88 DEY ;adjust for erroneous skip MOS48 0152 EA90 v4E MOS48 0170 EAA3 18 CLC MOS48 0152 EA90 v4E MOS48 0171 EAA4 CLIOQ MOS48 0152 EA90 v4E MOS48 0172 EAA4 66 E4 ROR KQUOTE ;PL => not a quoted string, MI => a quoted string MOS48 0152 EA90 v4E MOS48 0173 EAA6 C9 0D CMPIM MCR ;return EQ => end-of-string, NEQ => not end-of-string MOS48 0152 EA90 v4E MOS48 0174 EAA8 60 RTS MOS48 0152 EA90 v4E MOS48 0175 EAA9 ; MOS48 0152 EA90 v4E MOS48 0176 EAA9 GSREAD ;read character from string MOS48 0152 EA90 v4E MOS48 0177 EAA9 MOS48 0152 EA90 v4E MOS48 0178 EAA9 ; reset key mask (used in top bit option) MOS48 0152 EA90 v4E MOS48 0179 EAA9 A9 00 LDAIM ZERO MOS48 0152 EA90 v4E MOS48 0180 EAAB GSRA ;used by |! option, entered with A=$80 MOS48 0152 EA90 v4E MOS48 0181 EAAB 85 E5 STA KMASK ;KMASK := 0000 0000 (or KMASK := 1000 0000) MOS48 0254 EB01 ^28 MOS48 0182 EAAD B1 F2 LDAIY WORK ;A := next character MOS48 0254 EB01 ^28 MOS48 0183 EAAF C9 0D CMPIM MCR MOS48 0254 EB01 ^28 MOS48 0184 EAB1 D0 1A BNE KEYNCR ;[not CR] MOS48 0254 EB01 ^28 MOS48 0185 EAB3 ; CR found, C=1 MOS48 0254 EB01 ^28 MOS48 0186 EAB3 ; check that string did not open with double quote MOS48 0254 EB01 ^28 MOS48 0187 EAB3 24 E4 BIT KQUOTE MOS48 0254 EB01 ^28 MOS48 0188 EAB5 [ MOS125 = &FF MOS48 0254 EB01 ^28 MOS48 0191 EAB5 | MOS48 0254 EB01 ^28 MOS48 0192 EAB5 10 2F BPL GSR1 ;[no unpaired double quote, return C=1 and EQ=>CR] MOS48 0254 EB01 ^28 MOS48 0193 EAB7 BADSTR MOS48 0254 EB01 ^28 MOS48 0194 EAB7 00 BRK ;report error 'Bad string' MOS48 0254 EB01 ^28 MOS48 0195 EAB8 FD = BADST MOS48 0254 EB01 ^28 MOS48 0196 EAB9 42 61 64 = "Bad string" ;BRK forms terminator MOS48 0254 EB01 ^28 MOS48 0197 EAC3 00 PVER BRK MOS48 0254 EB01 ^28 MOS48 0198 EAC4 F7 = FX0MSG MOS48 0254 EB01 ^28 MOS48 0199 EAC5 4F 53 20 = "OS " MOS48 0254 EB01 ^28 MOS48 0200 EAC8 31 = VERA MOS48 0254 EB01 ^28 MOS48 0201 EAC9 2E = "." MOS48 0254 EB01 ^28 MOS48 0202 EACA 32 = VERB MOS48 0254 EB01 ^28 MOS48 0203 EACB 36 = VERC MOS48 0254 EB01 ^28 MOS48 0204 EACC 00 = ZERO MOS48 0254 EB01 ^28 MOS48 0205 EACD ] MOS48 0254 EB01 ^28 MOS48 0206 EACD KEYNCR ;character not CR MOS48 0254 EB01 ^28 MOS48 0207 EACD C9 20 CMPIM SPACE MOS48 0254 EB01 ^28 MOS48 0208 EACF 90 E6 BCC BADSTR ;[control character in string] MOS48 0254 EB01 ^28 MOS48 0209 EAD1 D0 06 BNE KEYNSP ;[not space] MOS48 0254 EB01 ^28 MOS48 0210 EAD3 ; space character MOS48 0254 EB01 ^28 MOS48 0211 EAD3 24 E4 BIT KQUOTE MOS48 0254 EB01 ^28 MOS48 0212 EAD5 30 3E BMI GSR0 ;[in quoted string] MOS48 0254 EB01 ^28 MOS48 0213 EAD7 50 0D BVC GSR1 ;[not in quoted string and not read line, so space is terminator] MOS48 0254 EB01 ^28 MOS48 0214 EAD9 ; fall thru, space will be returned as a valid character MOS48 0254 EB01 ^28 MOS48 0215 EAD9 KEYNSP MOS48 0254 EB01 ^28 MOS48 0216 EAD9 C9 22 CMPIM DQUOTE MOS48 0254 EB01 ^28 MOS48 0217 EADB D0 0E BNE KEYNDQ ;[not double quote] MOS48 0254 EB01 ^28 MOS48 0218 EADD ; double quote found MOS48 0254 EB01 ^28 MOS48 0219 EADD 24 E4 BIT KQUOTE MOS48 0254 EB01 ^28 MOS48 0220 EADF 10 34 BPL GSR0 ;[not in quoted string] MOS48 0254 EB01 ^28 MOS48 0221 EAE1 ; in quoted string MOS48 0254 EB01 ^28 MOS48 0222 EAE1 C8 INY MOS48 0254 EB01 ^28 MOS48 0223 EAE2 [ MOS125 = &FF MOS48 0254 EB01 ^28 MOS48 0226 EAE2 | MOS48 0254 EB01 ^28 MOS48 0227 EAE2 D1 F2 CMPIY WORK ;A = DQUOTE, compare with next character MOS48 0254 EB01 ^28 MOS48 0228 EAE4 ] MOS48 0254 EB01 ^28 MOS48 0229 EAE4 F0 2F BEQ GSR0 ;["" found in quoted string] MOS48 0254 EB01 ^28 MOS48 0230 EAE6 GSR1 ;closing quote of quoted string MOS48 0254 EB01 ^28 MOS48 0231 EAE6 20 CA E0 JSR SKIPSP ;skip spaces MOS48 0254 EB01 ^28 MOS48 0232 EAE9 38 SEC MOS48 0254 EB01 ^28 MOS48 0233 EAEA 60 RTS MOS48 0254 EB01 ^28 MOS48 0234 EAEB MOS48 0254 EB01 ^28 MOS48 0235 EAEB KEYNDQ ;character not CR or " MOS48 0254 EB01 ^28 MOS48 0236 EAEB C9 7C CMPIM "|" ;check for pseudo-escape MOS48 0254 EB01 ^28 MOS48 0237 EAED D0 26 BNE GSR0 ;[valid string character] MOS48 0254 EB01 ^28 MOS48 0238 EAEF ; MOS48 0254 EB01 ^28 MOS48 0239 EAEF C8 INY MOS48 0254 EB01 ^28 MOS48 0240 EAF0 B1 F2 LDAIY WORK MOS48 0254 EB01 ^28 MOS48 0241 EAF2 C9 7C CMPIM "|" MOS48 0254 EB01 ^28 MOS48 0242 EAF4 F0 1F BEQ GSR0 ;[|| found] MOS48 0254 EB01 ^28 MOS48 0243 EAF6 ; MOS48 0254 EB01 ^28 MOS48 0244 EAF6 C9 22 CMPIM DQUOTE MOS48 0254 EB01 ^28 MOS48 0245 EAF8 F0 1B BEQ GSR0 ;[|" found] MOS48 0254 EB01 ^28 MOS48 0246 EAFA ; MOS48 0254 EB01 ^28 MOS48 0247 EAFA C9 21 CMPIM "!" MOS48 0254 EB01 ^28 MOS48 0248 EAFC D0 05 BNE KEYNPL ;[not |!] MOS48 0254 EB01 ^28 MOS48 0249 EAFE ; C=1 MOS48 0254 EB01 ^28 MOS48 0250 EAFE ; |! found - top bit option MOS48 0254 EB01 ^28 MOS48 0251 EAFE C8 INY ;step to next character MOS48 0254 EB01 ^28 MOS48 0252 EAFF ; C=1 MOS48 0254 EB01 ^28 MOS48 0253 EAFF A9 80 LDAIM &80 ;KMASK := 1000 0000 MOS48 0254 EB01 ^28 MOS48 0254 EB01 D0 A8 BNE GSRA ;[ALWAYS jump, get next character reseting key mask] MOS48 0259 EB05 ^30 MOS48 0255 EB03 ; NEVER fall thru MOS48 0259 EB05 ^30 MOS48 0256 EB03 MOS48 0259 EB05 ^30 MOS48 0257 EB03 KEYNPL ;check for control character MOS48 0259 EB05 ^30 MOS48 0258 EB03 C9 20 CMPIM SPACE MOS48 0259 EB05 ^30 MOS48 0259 EB05 90 B0 BCC BADSTR ;[string contains a control character] MOS48 0212 EAD5 v41 MOS48 0260 EB07 ; convert to CTRL character MOS48 0212 EAD5 v41 MOS48 0261 EB07 C9 3F CMPIM "?" MOS48 0212 EAD5 v41 MOS48 0262 EB09 F0 08 BEQ KEYDEL MOS48 0212 EAD5 v41 MOS48 0263 EB0B 20 3E EB JSR CTRLCH MOS48 0212 EAD5 v41 MOS48 0264 EB0E ; fall thru with adjusted character MOS48 0212 EAD5 v41 MOS48 0265 EB0E 2C 55 D9 BIT FFBYT ;indicate character was escaped MOS48 0212 EAD5 v41 MOS48 0266 EB11 70 03 BVS GSRX ;[ALWAYS jump] MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 108 MOS48 MOS48 External interface routines MOS48 MOS48 0212 EAD5 v41 MOS48 0267 EB13 ; MOS48 0212 EAD5 v41 MOS48 0268 EB13 KEYDEL ;|? MOS48 0212 EAD5 v41 MOS48 0269 EB13 A9 7F LDAIM MDEL MOS48 0212 EAD5 v41 MOS48 0270 EB15 ; MOS48 0212 EAD5 v41 MOS48 0271 EB15 GSR0 ;valid character MOS48 0212 EAD5 v41 MOS48 0272 EB15 B8 CLV MOS48 0266 EB11 v7C MOS48 0273 EB16 ; MOS48 0266 EB11 v7C MOS48 0274 EB16 GSRX ;exit with valid character MOS48 0266 EB11 v7C MOS48 0275 EB16 ; rotate in selected top bit MOS48 0266 EB11 v7C MOS48 0276 EB16 C8 INY ;skip to next character -- MOS48 0277 EB17 05 E5 ORA KMASK ;test character for filing system applications -- MOS48 0278 EB19 18 CLC -- MOS48 0279 EB1A ; C=0, V=0 => not escaped, V=1 => escaped -- MOS48 0280 EB1A 60 RTS -- MOS48 0281 EB1B -- MOS48 0282 EB1B -- MOS48 0283 EB1B [ MOS125 = &FF -- MOS48 0289 EB1B ] -- MOS48 0290 EB1B -- MOS48 0291 EB1B SHIFT ;perform shift inversion -- MOS48 0292 EB1B ; -- MOS48 0293 EB1B ; check for '0' character explicitly -- MOS48 0294 EB1B ; -- MOS48 0295 EB1B C9 30 CMPIM "0" -- MOS48 0296 EB1D F0 1E BEQ SHIFT0 ;[character is '0', shift '0' is '0', no action] MOS48 0296 EB1D v61 MOS48 0297 EB1F MOS48 0296 EB1D v61 MOS48 0298 EB1F ; convert characters in range ['A',DEL) MOS48 0296 EB1D v61 MOS48 0299 EB1F ; MOS48 0296 EB1D v61 MOS48 0300 EB1F C9 40 CMPIM AT MOS48 0296 EB1D v61 MOS48 0301 EB21 F0 1A BEQ SHIFT0 ;[AT, no action] MOS48 0296 EB1D v61 MOS48 0302 EB23 90 12 BCC SHIFT1 ;[ch= 'A' MOS48 0296 EB1D v61 MOS48 0305 EB25 ; MOS48 0296 EB1D v61 MOS48 0306 EB25 C9 7F CMPIM MDEL MOS48 0296 EB1D v61 MOS48 0307 EB27 F0 14 BEQ SHIFT0 ;[ch=DEL, no action] MOS48 0296 EB1D v61 MOS48 0308 EB29 B0 10 BCS SHFLIP ;[ch>DEL, is softkey code] MOS48 0296 EB1D v61 MOS48 0309 EB2B ; MOS48 0296 EB1D v61 MOS48 0310 EB2B ; 'A' <= character < DEL MOS48 0296 EB1D v61 MOS48 0311 EB2B ; MOS48 0296 EB1D v61 MOS48 0312 EB2B CTRLSK ;used by CTRLCH for CTRL/softkey MOS48 0296 EB1D v61 MOS48 0313 EB2B 49 30 EORIM &30 ;flip bit to effect shift (N.B. EORIM $10 later) MOS48 0296 EB1D v61 MOS48 0314 EB2D ; MOS48 0296 EB1D v61 MOS48 0315 EB2D ; N.B. this has mapped '_' to $6F and POUND to $50 MOS48 0296 EB1D v61 MOS48 0316 EB2D ; swop underline and pound characters MOS48 0296 EB1D v61 MOS48 0317 EB2D ; MOS48 0296 EB1D v61 MOS48 0318 EB2D C9 6F CMPIM &6F ;i.e. mapped '_' MOS48 0296 EB1D v61 MOS48 0319 EB2F F0 04 BEQ SHIFT2 ;[underline character] MOS48 0296 EB1D v61 MOS48 0320 EB31 C9 50 CMPIM &50 ;i.e. mapped POUND (not altered by EORIM $20 anyway) MOS48 0296 EB1D v61 MOS48 0321 EB33 D0 02 BNE SHIFT1 ;[neither underline nor pound character] MOS48 0296 EB1D v61 MOS48 0322 EB35 ; MOS48 0296 EB1D v61 MOS48 0323 EB35 SHIFT2 ;swop underline and pound characters MOS48 0296 EB1D v61 MOS48 0324 EB35 49 1F EORIM &1F MOS48 0296 EB1D v61 MOS48 0325 EB37 ; MOS48 0296 EB1D v61 MOS48 0326 EB37 SHIFT1 MOS48 0296 EB1D v61 MOS48 0327 EB37 MOS48 0296 EB1D v61 MOS48 0328 EB37 ; convert characters above '!' MOS48 0296 EB1D v61 MOS48 0329 EB37 ; MOS48 0296 EB1D v61 MOS48 0330 EB37 C9 21 CMPIM "!" MOS48 0296 EB1D v61 MOS48 0331 EB39 90 02 BCC SHIFT0 ;[ch<'!', no action] MOS48 0296 EB1D v61 MOS48 0332 EB3B ; MOS48 0296 EB1D v61 MOS48 0333 EB3B ; '!' <= ch < AT MOS48 0296 EB1D v61 MOS48 0334 EB3B ; MOS48 0296 EB1D v61 MOS48 0335 EB3B SHFLIP MOS48 0296 EB1D v61 MOS48 0336 EB3B 49 10 EORIM &10 ;$80..$8F -> $90..$9F and vice-versa MOS48 0296 EB1D v61 MOS48 0337 EB3D MOS48 0296 EB1D v61 MOS48 0338 EB3D SHIFT0 MOS48 0296 EB1D v61 MOS48 0339 EB3D 60 RTS MOS48 0345 EB42 ^67 MOS48 0340 EB3E MOS48 0345 EB42 ^67 MOS48 0341 EB3E MOS48 0345 EB42 ^67 MOS48 0342 EB3E CTRLCH ;compute CTRL version of character MOS48 0345 EB42 ^67 MOS48 0343 EB3E C9 7F CMPIM MDEL MOS48 0345 EB42 ^67 MOS48 0344 EB40 F0 0E BEQ CTRL0 ;[CTRL/DEL = DEL] MOS48 0345 EB42 ^67 MOS48 0345 EB42 B0 E7 BCS CTRLSK ;[top bit set, therefore softkey needing EORIM $20] MOS48 0344 EB40 v71 MOS48 0346 EB44 MOS48 0344 EB40 v71 MOS48 0347 EB44 ; pound & underline MOS48 0344 EB40 v71 MOS48 0348 EB44 ; MOS48 0344 EB40 v71 MOS48 0349 EB44 C9 60 CMPIM POUND ;make CTRL/pound = CTRL/underline MOS48 0344 EB40 v71 MOS48 0350 EB46 D0 02 BNE CTRL1 ;[not pound character] MOS48 0344 EB40 v71 MOS48 0351 EB48 A9 5F LDAIM "_" ;substitute underline for pound MOS48 0344 EB40 v71 MOS48 0352 EB4A CTRL1 MOS48 0344 EB40 v71 MOS48 0353 EB4A MOS48 0344 EB40 v71 MOS48 0354 EB4A [ FALSE=0 MOS48 0344 EB40 v71 MOS48 0360 EB4A ] MOS48 0344 EB40 v71 MOS48 0361 EB4A MOS48 0344 EB40 v71 MOS48 0362 EB4A [ FALSE=0 MOS48 0344 EB40 v71 MOS48 0368 EB4A ] MOS48 0344 EB40 v71 MOS48 0369 EB4A MOS48 0344 EB40 v71 MOS48 0370 EB4A C9 40 CMPIM AT MOS48 0344 EB40 v71 MOS48 0371 EB4C 90 02 BCC CTRL4 ;[character < AT so do not convert] MOS48 0344 EB40 v71 MOS48 0372 EB4E ; AT <= character < DEL, so convert MOS48 0344 EB40 v71 MOS48 0373 EB4E 29 1F ANDIM &1F ;convert to ctrl value MOS48 0344 EB40 v71 MOS48 0374 EB50 CTRL4 MOS48 0344 EB40 v71 MOS48 0375 EB50 MOS48 0344 EB40 v71 MOS48 0376 EB50 CTRL0 MOS48 0344 EB40 v71 MOS48 0377 EB50 60 RTS -- MOS48 0378 EB51 -- MOS48 0379 EB51 [ FALSE=0 -- MOS48 0382 EB51 ] -- MOS48 0383 EB51 -- MOS48 0384 EB51 SLBOOT ;'/!BOOT' auto-boot string -- MOS48 0385 EB51 2F 21 42 = "/!BOOT" -- MOS48 0386 EB57 0D = MCR -- MOS48 0387 EB58 -- MOS48 0388 EB58 -- MOS48 0389 EB58 BREAK ;conditionally intercept BREAK -- MOS48 0390 EB58 ; type of interception is in C -- MOS48 0391 EB58 AD 87 02 LDA BREAKI -- MOS48 0392 EB5B 49 4C EORIM &4C -- MOS48 0393 EB5D D0 13 BNE BREAK0 ;[not a JMP instruction] MOS48 0393 EB5D v6C MOS48 0394 EB5F 4C 87 02 JMP BREAKI MOS48 0393 EB5D v6C MOS48 0395 EB62 MOS48 0393 EB5D v6C MOS48 0396 EB62 MOS48 0393 EB5D v6C MOS48 0397 EB62 TV ;alter TV characteristics MOS48 0393 EB5D v6C MOS48 0398 EB62 AD 90 02 LDA VERTIC MOS48 0393 EB5D v6C MOS48 0399 EB65 8E 90 02 STX VERTIC ;vertical height adjust MOS48 0393 EB5D v6C MOS48 0400 EB68 AA TAX ;X := old state MOS48 0393 EB5D v6C MOS48 0401 EB69 98 TYA MOS48 0393 EB5D v6C MOS48 0402 EB6A 29 01 ANDIM &01 MOS48 0393 EB5D v6C MOS48 0403 EB6C AC 91 02 LDY INTERL ;Y := old state MOS48 0393 EB5D v6C MOS48 0404 EB6F 8D 91 02 STA INTERL ;interlace invert MOS48 MOS48 MOS48 MOS48 Acorn macro assembler Page 109 MOS48 MOS48 External interface routines MOS48 MOS48 0393 EB5D v6C MOS48 0405 EB72 BREAK0 MOS48 0393 EB5D v6C MOS48 0406 EB72 60 RTS -- MOS48 0407 EB73 -- MOS48 0408 EB73 [ MOS125 = &FF -- MOS48 0423 EB73 ] -- MOS48 0424 EB73 -- MOS48 0425 EB73 LNK MOS52 -- MOS52 0001 EB73 -- MOS52 0002 EB73 ; MOS52 -- MOS52 0003 EB73 TTL MOS52 Sound generator -- MOS52 0004 EB73 OPT MOS52 MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 110 MOS52 MOS52 Sound generator MOS52 -- MOS52 0005 EB73 ;(c) 1981 ACORN Computers Limited -- MOS52 0006 EB73 ;BBC Microcomputer Machine Operating System (MOS) -- MOS52 0007 EB73 ;Change record: -- MOS52 0008 EB73 ;Prototype version 14/1/82 -- MOS52 0009 EB73 ;Author(s): -- MOS52 0010 EB73 ;PBM Peter Miller -- MOS52 0011 EB73 ;Internal variable allocation $0800 to $08C0 -- MOS52 0012 EB73 08C0 ENV * ENVEL ;envelope table 16 bytes per envelope -- MOS52 0013 EB73 0804 ATTN * SNDWRK+&04 ;current attenuation -- MOS52 0014 EB73 0808 EPERD * ATTN +&04 ;current envelope period -- MOS52 0015 EB73 080C SNOTE * EPERD +&04 ;base note -- MOS52 0016 EB73 0810 NPERD * SNOTE +&04 ;the current frequency envelope period 0-3 -- MOS52 0017 EB73 0814 NCONT * NPERD +&04 ;number of ticks left in current frequency period -- MOS52 0018 EB73 0818 DUR * NCONT +&04 ;remaining number of ticks in the current note -- MOS52 0019 EB73 081C DRDIV * DUR +&04 ;division of 1/100 sewc to 1/20 sec -- MOS52 0020 EB73 0820 ENVLP * DRDIV +&04 ;current envelope ( TIMES 16) -- MOS52 0021 EB73 0824 SCONT * ENVLP +&04 ;number of 1/100th secs before next envelope tick -- MOS52 0022 EB73 0828 WAIT * SCONT +&04 ;channel waiting for sWATGO flag -- MOS52 0023 EB73 082C OLDNTE * WAIT +&04 ;current note in chip -- MOS52 0024 EB73 0830 NTADD * OLDNTE +&04 ;current offset from base note -- MOS52 0025 EB73 -- MOS52 0026 EB73 -- MOS52 0027 EB73 0838 NOWAT * NTADD +&08 ;number of other channels required for chord -- MOS52 0028 EB73 0839 ATINC * NOWAT +&01 ;current rate of attn change -- MOS52 0029 EB73 083A PEAK * ATINC +&01 ;peak of amplitude envelope -- MOS52 0030 EB73 083B WATGO * PEAK +&01 ;flag <>0 => play chord -- MOS52 0031 EB73 083C FRACT * WATGO +&01 ;fractional part of current note -- MOS52 0032 EB73 083D PRDL * FRACT +&01 ;low period during convert -- MOS52 0033 EB73 083E PRDH * PRDL +&01 ;hign period during convert -- MOS52 0034 EB73 083F NOTDIF * PRDH +&01 ;Note difference used in interpolation -- MOS52 0035 EB73 -- MOS52 0036 EB73 02CF FLUSH * SFLUSH -&04 -- MOS52 0037 EB73 0800 ACTIV * MACTIV -&04 -- MOS52 0038 EB73 -- MOS52 0039 EB73 -- MOS52 0040 EB73 ;Externally referenced data -- MOS52 0041 EB73 ;ACTIV -- MOS52 0042 EB73 ;FLUSH -- MOS52 0043 EB73 ;ENVEL -- MOS52 0044 EB73 ;SNDWRK -- MOS52 0045 EB73 ;Externally referenced routines -- MOS52 0046 EB73 ;EXAM -- MOS52 0047 EB73 ;REMOV -- MOS52 0048 EB73 ;Entry points -- MOS52 0049 EB73 ;SNDRST Initialise sound system, shut sound chip up -- MOS52 0050 EB73 ; Acc,X,Y ,P destroyed -- MOS52 0051 EB73 ;SNDIRQ Service entry point 1/100th second -- MOS52 0052 EB73 ; only use after initialisation -- MOS52 0053 EB73 ; Acc,X ,Y and P destroyed -- MOS52 0054 EB73 ;; A,X,P preserved, Y set to zero on exit -- MOS52 0055 EB73 -- MOS52 0056 EB73 -- MOS52 0057 EB73 MINATN ;set minimum attenuation -- MOS52 0058 EB73 A9 04 LDAIM &04 -- MOS52 0059 EB75 9D 08 08 STAAX EPERD -- MOS52 0060 EB78 A9 C0 LDAIM &C0 -- MOS52 0061 EB7A -- MOS52 0062 EB7A -- MOS52 0063 EB7A UPATN ;update attenuation -- MOS52 0064 EB7A 9D 04 08 STAAX ATTN -- MOS52 0065 EB7D ; -- MOS52 0066 EB7D ; shut up mode ? -- MOS52 0067 EB7D ; -- MOS52 0068 EB7D AC 62 02 LDY SHUTUP -- MOS52 0069 EB80 F0 02 BEQ NOISY ;[sound allowed] MOS52 0069 EB80 v7D MOS52 0070 EB82 ; sound suppressed MOS52 0069 EB80 v7D MOS52 0071 EB82 A9 C0 LDAIM &C0 ;force minimum attenuation MOS52 0069 EB80 v7D MOS52 0072 EB84 NOISY MOS52 0069 EB80 v7D MOS52 0073 EB84 ; MOS52 0069 EB80 v7D MOS52 0074 EB84 [ MOS125 = &FF MOS52 0069 EB80 v7D MOS52 0083 EB84 | MOS52 0069 EB80 v7D MOS52 0084 EB84 ; in: x ~b3 b2 b1 b0 x x x MOS52 0069 EB80 v7D MOS52 0085 EB84 ;out: c2 c1 c0 1 ~b3 ~b2 ~b1 ~b0 MOS52 0069 EB80 v7D MOS52 0086 EB84 4A LSRA -- MOS52 0087 EB85 4A LSRA -- MOS52 0088 EB86 4A LSRA -- MOS52 0089 EB87 1D A8 EB ORAAX CHAN -- MOS52 0090 EB8A 29 EF ANDIM &EF -- MOS52 0091 EB8C 49 17 EORIM &17 -- MOS52 0092 EB8E ] -- MOS52 0093 EB8E ;fall into the send routine -- MOS52 0094 EB8E SNDOUT -- MOS52 0095 EB8E SEND -- MOS52 0096 EB8E 08 PHP -- MOS52 0097 EB8F SENDX ;entered by code which has already done a PHP -- MOS52 0098 EB8F 78 SEI -- MOS52 0099 EB90 A0 FF LDYIM &FF -- MOS52 0100 EB92 8C 43 FE STY &FE43 -- MOS52 0101 EB95 8D 4F FE STA &FE4F -- MOS52 0102 EB98 C8 INY -- MOS52 0103 EB99 8C 40 FE STY &FE40 -- MOS52 0104 EB9C [ MOS125 = &FF -- MOS52 0109 EB9C | -- MOS52 0110 EB9C C8 INY ;Y=1 -- MOS52 0111 EB9D SWAIT -- MOS52 0112 EB9D 88 DEY MOS52 0113 EB9E ^7D MOS52 0113 EB9E F0 FD BEQ SWAIT -- MOS52 0114 EBA0 ] -- MOS52 0115 EBA0 A0 08 LDYIM &08 -- MOS52 0116 EBA2 8C 40 FE STY &FE40 -- MOS52 0117 EBA5 A0 04 LDYIM &04 -- MOS52 0118 EBA7 SWAT2 -- MOS52 0119 EBA7 88 DEY MOS52 0120 EBA8 ^7D MOS52 0120 EBA8 D0 FD BNE SWAT2 -- MOS52 0121 EBAA 28 PLP -- MOS52 0122 EBAB 60 RTS -- MOS52 0123 EBAC RCHAN -- MOS52 0124 EBAC EBA8 CHAN * RCHAN -&04 -- MOS52 0125 EBAC E0 = &E0 -- MOS52 0126 EBAD C0 = &C0 -- MOS52 0127 EBAE A0 = &A0 -- MOS52 0128 EBAF 80 = &80 -- MOS52 0129 EBB0 -- MOS52 0130 EBB0 -- MOS52 0131 EBB0 HENDS -- MOS52 0132 EBB0 4C AD EC JMP ENDSW ;finished all envelope processing MOS52 0179 EC01 ^2D MOS52 0133 EBB3 MOS52 0179 EC01 ^2D MOS52 0134 EBB3 SNDIRQ MOS52 0179 EC01 ^2D MOS52 0135 EBB3 A9 00 LDAIM ZERO MOS52 0179 EC01 ^2D MOS52 0136 EBB5 8D 3B 08 STA WATGO MOS52 0179 EC01 ^2D MOS52 0137 EBB8 AD 38 08 LDA NOWAT MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 111 MOS52 MOS52 Sound generator MOS52 MOS52 0179 EC01 ^2D MOS52 0138 EBBB D0 06 BNE MAN2 MOS52 0179 EC01 ^2D MOS52 0139 EBBD EE 3B 08 INC WATGO MOS52 0179 EC01 ^2D MOS52 0140 EBC0 CE 38 08 DEC NOWAT MOS52 0179 EC01 ^2D MOS52 0141 EBC3 MAN2 MOS52 0179 EC01 ^2D MOS52 0142 EBC3 A2 08 LDXIM &08 ;X always contains current channel MOS52 0179 EC01 ^2D MOS52 0143 EBC5 MNLOP MOS52 0179 EC01 ^2D MOS52 0144 EBC5 CA DEX ;first real channel is 3 MOS52 0179 EC01 ^2D MOS52 0145 EBC6 BD 00 08 LDAAX ACTIV ;check if channel X is doing anything MOS52 0179 EC01 ^2D MOS52 0146 EBC9 F0 E5 BEQ HENDS ;[channel not active so take quick route] MOS52 0179 EC01 ^2D MOS52 0147 EBCB BD CF 02 LDAAX FLUSH MOS52 0179 EC01 ^2D MOS52 0148 EBCE 30 05 BMI MAN8 ;[must abort current note] MOS52 0179 EC01 ^2D MOS52 0149 EBD0 BD 18 08 LDAAX DUR MOS52 0179 EC01 ^2D MOS52 0150 EBD3 D0 03 BNE MAN10 ;[note finished] MOS52 0179 EC01 ^2D MOS52 0151 EBD5 MAN8 MOS52 0179 EC01 ^2D MOS52 0152 EBD5 20 B4 EC JSR NXTNT ;[get new note from queue if it exists] MOS52 0179 EC01 ^2D MOS52 0153 EBD8 MAN10 MOS52 0179 EC01 ^2D MOS52 0154 EBD8 BD 18 08 LDAAX DUR MOS52 0179 EC01 ^2D MOS52 0155 EBDB F0 13 BEQ MAN13 ;next note now MOS52 0179 EC01 ^2D MOS52 0156 EBDD C9 FF CMPIM &FF MOS52 0179 EC01 ^2D MOS52 0157 EBDF F0 12 BEQ MAN12 MOS52 0179 EC01 ^2D MOS52 0158 EBE1 DE 1C 08 DECAX DRDIV MOS52 0179 EC01 ^2D MOS52 0159 EBE4 D0 0D BNE MAN12 ;[not 1/20th sec tick] MOS52 0179 EC01 ^2D MOS52 0160 EBE6 A9 05 LDAIM &05 MOS52 0179 EC01 ^2D MOS52 0161 EBE8 9D 1C 08 STAAX DRDIV ; set counter to wait for further 1/20th sec MOS52 0179 EC01 ^2D MOS52 0162 EBEB DE 18 08 DECAX DUR MOS52 0179 EC01 ^2D MOS52 0163 EBEE D0 03 BNE MAN12 MOS52 0179 EC01 ^2D MOS52 0164 EBF0 MAN13 MOS52 0179 EC01 ^2D MOS52 0165 EBF0 20 B4 EC JSR NXTNT ;try to get a new note MOS52 0179 EC01 ^2D MOS52 0166 EBF3 MAN12 MOS52 0179 EC01 ^2D MOS52 0167 EBF3 BD 24 08 LDAAX SCONT MOS52 0179 EC01 ^2D MOS52 0168 EBF6 F0 05 BEQ MAN11 MOS52 0179 EC01 ^2D MOS52 0169 EBF8 DE 24 08 DECAX SCONT ;dec envelope scaling counter MOS52 0179 EC01 ^2D MOS52 0170 EBFB D0 B3 BNE HENDS ;[not time for new envelope tick] MOS52 0179 EC01 ^2D MOS52 0171 EBFD MAN11 MOS52 0179 EC01 ^2D MOS52 0172 EBFD BC 20 08 LDYAX ENVLP ;get envelope offset into Y MOS52 0179 EC01 ^2D MOS52 0173 EC00 [ MOS125 = &FF MOS52 0179 EC01 ^2D MOS52 0177 EC00 | MOS52 0179 EC01 ^2D MOS52 0178 EC00 C8 INY MOS52 0179 EC01 ^2D MOS52 0179 EC01 F0 AD BEQ HENDS -- MOS52 0180 EC03 B9 BF 08 LDAAY ENV-&01 ;get first envelope parameter -- MOS52 0181 EC06 ] -- MOS52 0182 EC06 29 7F ANDIM &7F ;mask off sweep repeat bit -- MOS52 0183 EC08 9D 24 08 STAAX SCONT ;set up scaling counter again -- MOS52 0184 EC0B BD 08 08 LDAAX EPERD ;envelope period -- MOS52 0185 EC0E C9 04 CMPIM &04 ;check for 'finished' period -- MOS52 0186 EC10 F0 4E BEQ ENDEV ;[no longer in middle of envelope] MOS52 0186 EC10 v31 MOS52 0187 EC12 ; MOS52 0186 EC10 v31 MOS52 0188 EC12 [ MOS125 = &FF MOS52 0186 EC10 v31 MOS52 0190 EC12 ] MOS52 0186 EC10 v31 MOS52 0191 EC12 18 CLC MOS52 0186 EC10 v31 MOS52 0192 EC13 7D 20 08 ADCAX ENVLP ;get offset to current amplitude envelope parameters MOS52 0186 EC10 v31 MOS52 0193 EC16 A8 TAY ;ENV+7,Y now point to attninc rate and sENV+11 to attnlevel MOS52 0186 EC10 v31 MOS52 0194 EC17 B9 CB 08 LDAAY ENV+&0B ;atenuation level MOS52 0186 EC10 v31 MOS52 0195 EC1A 38 SEC MOS52 0186 EC10 v31 MOS52 0196 EC1B E9 3F SBCIM &3F MOS52 0186 EC10 v31 MOS52 0197 EC1D 8D 3A 08 STA PEAK ;temp data for following calculations MOS52 0186 EC10 v31 MOS52 0198 EC20 B9 C7 08 LDAAY ENV+&7 ;amount by which attenuation is changed each tick MOS52 0186 EC10 v31 MOS52 0199 EC23 8D 39 08 STA ATINC ;temp data for calculations MOS52 0186 EC10 v31 MOS52 0200 EC26 BD 04 08 LDAAX ATTN MOS52 0186 EC10 v31 MOS52 0201 EC29 48 PHA MOS52 0186 EC10 v31 MOS52 0202 EC2A 18 CLC MOS52 0186 EC10 v31 MOS52 0203 EC2B 6D 39 08 ADC ATINC ;add incremnet to attenuation MOS52 0186 EC10 v31 MOS52 0204 EC2E [ MOS125 = &FF MOS52 0186 EC10 v31 MOS52 0223 EC2E | MOS52 0186 EC10 v31 MOS52 0224 EC2E 70 06 BVS NOK8 ;if overflow, carry=~b7. generate &C0 if b7=0 or &3F if b7=1 MOS52 0186 EC10 v31 MOS52 0225 EC30 C9 C0 CMPIM &C0 ;else compare b7 and b6 (thanks again Woz) MOS52 0186 EC10 v31 MOS52 0226 EC32 10 06 BPL ATOK ;if b7=b6 then value in range MOS52 0186 EC10 v31 MOS52 0227 EC34 69 80 ADCIM &80 ;else overflow. carry=0. generate &3F if b7=0 or &C0 if b7=1 MOS52 0186 EC10 v31 MOS52 0228 EC36 NOK8 MOS52 0186 EC10 v31 MOS52 0229 EC36 09 7F ORAIM &7F ;n111 1111 C=~n MOS52 0186 EC10 v31 MOS52 0230 EC38 69 40 ADCIM &40 ;~~nn nnnn C=n MOS52 0186 EC10 v31 MOS52 0231 EC3A ATOK MOS52 0186 EC10 v31 MOS52 0232 EC3A 9D 04 08 STAAX ATTN ;store as new attenuation MOS52 0186 EC10 v31 MOS52 0233 EC3D CE 39 08 DEC ATINC MOS52 0186 EC10 v31 MOS52 0234 EC40 ;the following code checks that (ATTN-PEAK)*SIGN(increment)>=0 MOS52 0186 EC10 v31 MOS52 0235 EC40 ] MOS52 0186 EC10 v31 MOS52 0236 EC40 38 SEC MOS52 0186 EC10 v31 MOS52 0237 EC41 ED 3A 08 SBC PEAK MOS52 0186 EC10 v31 MOS52 0238 EC44 4D 39 08 EOR ATINC MOS52 0186 EC10 v31 MOS52 0239 EC47 30 09 BMI SMPER ;[attenuation has not reached limit yet] MOS52 0186 EC10 v31 MOS52 0240 EC49 AD 3A 08 LDA PEAK ;attn was too large therefore set to peak MOS52 0186 EC10 v31 MOS52 0241 EC4C 9D 04 08 STAAX ATTN MOS52 0186 EC10 v31 MOS52 0242 EC4F FE 08 08 INCAX EPERD ;next envelope period MOS52 0186 EC10 v31 MOS52 0243 EC52 SMPER ;same envelope period MOS52 0186 EC10 v31 MOS52 0244 EC52 68 PLA MOS52 0186 EC10 v31 MOS52 0245 EC53 5D 04 08 EORAX ATTN MOS52 0186 EC10 v31 MOS52 0246 EC56 29 F8 ANDIM &F8 MOS52 0186 EC10 v31 MOS52 0247 EC58 F0 06 BEQ NNEWA ;no new chip attenuation output (hasn't changed)] MOS52 0186 EC10 v31 MOS52 0248 EC5A BD 04 08 LDAAX ATTN MOS52 0186 EC10 v31 MOS52 0249 EC5D 20 7A EB JSR UPATN ;update chip attenuation MOS52 0186 EC10 v31 MOS52 0250 EC60 NNEWA MOS52 0186 EC10 v31 MOS52 0251 EC60 ENDEV MOS52 0186 EC10 v31 MOS52 0252 EC60 ;frequency sweeping part of envelope MOS52 0186 EC10 v31 MOS52 0253 EC60 BD 10 08 LDAAX NPERD -- MOS52 0254 EC63 C9 03 CMPIM &03 -- MOS52 0255 EC65 F0 46 BEQ ENDSW MOS52 0255 EC65 v39 MOS52 0256 EC67 [ MOS125 = &FF MOS52 0255 EC65 v39 MOS52 0262 EC67 | MOS52 0255 EC65 v39 MOS52 0263 EC67 BC 14 08 LDYAX NCONT ;number of ticks left in this frequency period MOS52 0255 EC65 v39 MOS52 0264 EC6A D0 25 BNE GTPRD MOS52 0255 EC65 v39 MOS52 0265 EC6C FE 10 08 INCAX NPERD ;next period MOS52 0255 EC65 v39 MOS52 0266 EC6F C9 02 CMPIM &03-&01 ;check for period=3 =>end of all periods MOS52 0255 EC65 v39 MOS52 0267 EC71 38 SEC ;A=next period - 1, increment it before forming pointer MOS52 0255 EC65 v39 MOS52 0268 EC72 ] MOS52 0255 EC65 v39 MOS52 0269 EC72 D0 11 BNE NTLF ;[not last period] MOS52 0255 EC65 v39 MOS52 0270 EC74 BC 20 08 LDYAX ENVLP ;the following checks for bit 8 set in the first envelope byte=> no sweep repeat MOS52 0255 EC65 v39 MOS52 0271 EC77 B9 C0 08 LDAAY ENV MOS52 0255 EC65 v39 MOS52 0272 EC7A 30 31 BMI ENDSW ;[not a repeating sweep therefore jump to end] MOS52 0255 EC65 v39 MOS52 0273 EC7C A9 00 LDAIM ZERO MOS52 0255 EC65 v39 MOS52 0274 EC7E 9D 30 08 STAAX NTADD ;reset amount added to note to zero for next sweep MOS52 0255 EC65 v39 MOS52 0275 EC81 9D 10 08 STAAX NPERD ;first sweep period MOS52 0255 EC65 v39 MOS52 0276 EC84 [ MOS125 = &FF MOS52 0255 EC65 v39 MOS52 0280 EC84 | MOS52 0255 EC65 v39 MOS52 0281 EC84 18 CLC ;A=next period, do not adjust MOS52 0255 EC65 v39 MOS52 0282 EC85 NTLF MOS52 0255 EC65 v39 MOS52 0283 EC85 ;the following points Y to the sweep parameters of the current envelope/period MOS52 0255 EC65 v39 MOS52 0284 EC85 ] MOS52 0255 EC65 v39 MOS52 0285 EC85 7D 20 08 ADCAX ENVLP MOS52 0255 EC65 v39 MOS52 0286 EC88 A8 TAY MOS52 0255 EC65 v39 MOS52 0287 EC89 B9 C4 08 LDAAY ENV+&04 MOS52 0255 EC65 v39 MOS52 0288 EC8C 9D 14 08 STAAX NCONT ;number of cycles for this frequency period MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 112 MOS52 MOS52 Sound generator MOS52 MOS52 0255 EC65 v39 MOS52 0289 EC8F F0 1C BEQ ENDSW ;zero frequency period MOS52 0255 EC65 v39 MOS52 0290 EC91 GTPRD MOS52 0255 EC65 v39 MOS52 0291 EC91 DE 14 08 DECAX NCONT MOS52 0255 EC65 v39 MOS52 0292 EC94 BD 20 08 LDAAX ENVLP MOS52 0255 EC65 v39 MOS52 0293 EC97 18 CLC MOS52 0255 EC65 v39 MOS52 0294 EC98 7D 10 08 ADCAX NPERD MOS52 0255 EC65 v39 MOS52 0295 EC9B A8 TAY MOS52 0255 EC65 v39 MOS52 0296 EC9C B9 C1 08 LDAAY ENV+&01 ;note increment for this frequency period MOS52 0255 EC65 v39 MOS52 0297 EC9F 18 CLC MOS52 0255 EC65 v39 MOS52 0298 ECA0 7D 30 08 ADCAX NTADD MOS52 0255 EC65 v39 MOS52 0299 ECA3 9D 30 08 STAAX NTADD ;add increment to the note offset MOS52 0255 EC65 v39 MOS52 0300 ECA6 18 CLC MOS52 0255 EC65 v39 MOS52 0301 ECA7 7D 0C 08 ADCAX SNOTE MOS52 0255 EC65 v39 MOS52 0302 ECAA 20 47 ED JSR CNVRT ;convert note to period and output MOS52 0255 EC65 v39 MOS52 0303 ECAD ENDSW MOS52 0255 EC65 v39 MOS52 0304 ECAD E0 04 CPXIM &04 ;'test channel number for zero' -- MOS52 0305 ECAF F0 5B BEQ EDUP ;[channel was zero therefore leave loop] MOS52 0305 ECAF v24 MOS52 0306 ECB1 4C C5 EB JMP MNLOP MOS52 0305 ECAF v24 MOS52 0307 ECB4 MOS52 0305 ECAF v24 MOS52 0308 ECB4 MOS52 0305 ECAF v24 MOS52 0309 ECB4 [ MOS125 = &FF MOS52 0305 ECAF v24 MOS52 0321 ECB4 ] MOS52 0305 ECAF v24 MOS52 0322 ECB4 MOS52 0305 ECAF v24 MOS52 0323 ECB4 MOS52 0305 ECAF v24 MOS52 0324 ECB4 NXTNT MOS52 0305 ECAF v24 MOS52 0325 ECB4 BD 08 08 LDAAX EPERD ;get current amplitude period MOS52 0305 ECAF v24 MOS52 0326 ECB7 C9 04 CMPIM &04 ;period 4 => note has fully released MOS52 0305 ECAF v24 MOS52 0327 ECB9 F0 05 BEQ ELDDN MOS52 0305 ECAF v24 MOS52 0328 ECBB A9 03 LDAIM &03 MOS52 0305 ECAF v24 MOS52 0329 ECBD 9D 08 08 STAAX EPERD ;put note in the release phase of the envelope MOS52 0305 ECAF v24 MOS52 0330 ECC0 ELDDN MOS52 0305 ECAF v24 MOS52 0331 ECC0 BD CF 02 LDAAX FLUSH MOS52 0305 ECAF v24 MOS52 0332 ECC3 F0 13 BEQ NOFL ;[no flush has been flagged] MOS52 0305 ECAF v24 MOS52 0333 ECC5 A9 00 LDAIM ZERO MOS52 0305 ECAF v24 MOS52 0334 ECC7 9D CF 02 STAAX FLUSH ;clear the flush flag MOS52 0305 ECAF v24 MOS52 0335 ECCA [ MOS125 = &FF MOS52 0305 ECAF v24 MOS52 0350 ECCA | MOS52 0305 ECAF v24 MOS52 0351 ECCA A0 03 LDYIM &03 ;the following clears all wait variables MOS52 0305 ECAF v24 MOS52 0352 ECCC SWTLOP MOS52 0305 ECAF v24 MOS52 0353 ECCC 99 2C 08 STAAY WAIT +&04 MOS52 0305 ECAF v24 MOS52 0354 ECCF 88 DEY MOS52 0305 ECAF v24 MOS52 0355 ECD0 10 FA BPL SWTLOP MOS52 0305 ECAF v24 MOS52 0356 ECD2 9D 18 08 STAAX DUR ;set duration to zero => note finished MOS52 0305 ECAF v24 MOS52 0357 ECD5 8C 38 08 STY NOWAT ;reset chord building status MOS52 0305 ECAF v24 MOS52 0358 ECD8 NOFL ;A=0 MOS52 0305 ECAF v24 MOS52 0359 ECD8 DD 28 08 CMPAX WAIT ;check it channel waiting for chord MOS52 0305 ECAF v24 MOS52 0360 ECDB F0 4D BEQ NOTWT MOS52 0305 ECAF v24 MOS52 0361 ECDD CD 3B 08 CMP WATGO ;check if chord now ready to play MOS52 0305 ECAF v24 MOS52 0362 ECE0 F0 3F BEQ NOTGO ;[chord not ready yet] else C=0 MOS52 0305 ECAF v24 MOS52 0363 ECE2 ] MOS52 0305 ECAF v24 MOS52 0364 ECE2 9D 28 08 STAAX WAIT ;clear waiting for chord status MOS52 0305 ECAF v24 MOS52 0365 ECE5 NNWAT MOS52 0305 ECAF v24 MOS52 0366 ECE5 4C DA ED JMP STRNT ;start playing note MOS52 0305 ECAF v24 MOS52 0367 ECE8 SCRST ;reset sound channel X MOS52 0305 ECAF v24 MOS52 0368 ECE8 20 73 EB JSR MINATN MOS52 0305 ECAF v24 MOS52 0369 ECEB 98 TYA MOS52 0305 ECAF v24 MOS52 0370 ECEC 9D 18 08 STAAX DUR MOS52 0305 ECAF v24 MOS52 0371 ECEF 9D CF 02 STAAX FLUSH MOS52 0305 ECAF v24 MOS52 0372 ECF2 9D 00 08 STAAX ACTIV MOS52 0305 ECAF v24 MOS52 0373 ECF5 ; MOS52 0305 ECAF v24 MOS52 0374 ECF5 ;clear wait periods to zero MOS52 0305 ECAF v24 MOS52 0375 ECF5 ; MOS52 0305 ECAF v24 MOS52 0376 ECF5 A0 03 LDYIM &03 MOS52 0305 ECAF v24 MOS52 0377 ECF7 CWP MOS52 0305 ECAF v24 MOS52 0378 ECF7 99 2C 08 STAAY WAIT+&04 MOS52 0305 ECAF v24 MOS52 0379 ECFA 88 DEY MOS52 0305 ECAF v24 MOS52 0380 ECFB 10 FA BPL CWP ;[more wait periods to clear] MOS52 0305 ECAF v24 MOS52 0381 ECFD ; Y=$FF MOS52 0305 ECAF v24 MOS52 0382 ECFD ; MI true MOS52 0305 ECAF v24 MOS52 0383 ECFD ; MOS52 0305 ECAF v24 MOS52 0384 ECFD ; indicate no channels waiting MOS52 0305 ECAF v24 MOS52 0385 ECFD ; MOS52 0305 ECAF v24 MOS52 0386 ECFD 8C 38 08 STY NOWAT MOS52 0305 ECAF v24 MOS52 0387 ED00 ; MOS52 0305 ECAF v24 MOS52 0388 ED00 30 4A BMI FCNVRT ;[ALWAYS JUMP, set period of chip to zero] MOS52 0305 ECAF v24 MOS52 0389 ED02 MOS52 0305 ECAF v24 MOS52 0390 ED02 MOS52 0305 ECAF v24 MOS52 0391 ED02 [ MOS125 = &FF MOS52 0305 ECAF v24 MOS52 0392 ED02 | MOS52 0305 ECAF v24 MOS52 0393 ED02 SNDRST MOS52 0305 ECAF v24 MOS52 0394 ED02 A2 08 LDXIM &08 MOS52 0305 ECAF v24 MOS52 0395 ED04 ; MOS52 0305 ECAF v24 MOS52 0396 ED04 RLOP MOS52 0305 ECAF v24 MOS52 0397 ED04 CA DEX MOS52 0305 ECAF v24 MOS52 0398 ED05 20 E8 EC JSR SCRST ;reset sound channel X MOS52 0305 ECAF v24 MOS52 0399 ED08 E0 04 CPXIM &04 MOS52 0305 ECAF v24 MOS52 0400 ED0A D0 F8 BNE RLOP MOS52 0305 ECAF v24 MOS52 0401 ED0C ; MOS52 0305 ECAF v24 MOS52 0402 ED0C PROG MOS52 0305 ECAF v24 MOS52 0403 ED0C PRTS ;rts pointer MOS52 0305 ECAF v24 MOS52 0404 ED0C EDUP ;end of 1/100th sec processing MOS52 0305 ECAF v24 MOS52 0405 ED0C 60 RTS MOS52 0360 ECDB v32 MOS52 0406 ED0D ] MOS52 0360 ECDB v32 MOS52 0407 ED0D MOS52 0360 ECDB v32 MOS52 0408 ED0D NGONG MOS52 0360 ECDB v32 MOS52 0409 ED0D 08 PHP MOS52 0360 ECDB v32 MOS52 0410 ED0E 78 SEI MOS52 0360 ECDB v32 MOS52 0411 ED0F BD 08 08 LDAAX EPERD ;while irq disabled check if active can be cleared MOS52 0360 ECDB v32 MOS52 0412 ED12 C9 04 CMPIM &04 ;if envelope period=4 then note finished MOS52 0360 ECDB v32 MOS52 0413 ED14 D0 0A BNE NOGO2 ;[note not yet released] MOS52 0360 ECDB v32 MOS52 0414 ED16 20 94 E5 JSR EXAM ;check for recent arrival of note MOS52 0360 ECDB v32 MOS52 0415 ED19 90 05 BCC NOGO2 ;queue no longer empty MOS52 0360 ECDB v32 MOS52 0416 ED1B A9 00 LDAIM ZERO MOS52 0360 ECDB v32 MOS52 0417 ED1D 9D 00 08 STAAX ACTIV ;set channel as inactive MOS52 0360 ECDB v32 MOS52 0418 ED20 NOGO2 MOS52 0360 ECDB v32 MOS52 0419 ED20 28 PLP MOS52 0360 ECDB v32 MOS52 0420 ED21 [ MOS125 = &FF MOS52 0360 ECDB v32 MOS52 0429 ED21 | MOS52 0360 ECDB v32 MOS52 0430 ED21 SRTS ;must point to RTS command MOS52 0360 ECDB v32 MOS52 0431 ED21 LNOTGO MOS52 0360 ECDB v32 MOS52 0432 ED21 NOTGO MOS52 0360 ECDB v32 MOS52 0433 ED21 BC 20 08 LDYAX ENVLP MOS52 0360 ECDB v32 MOS52 0434 ED24 C8 INY MOS52 0360 ECDB v32 MOS52 0435 ED25 D0 E5 BNE PROG MOS52 0360 ECDB v32 MOS52 0436 ED27 4C 73 EB JMP MINATN ;update attenuation of box envelopes MOS52 0360 ECDB v32 MOS52 0437 ED2A ] MOS52 0360 ECDB v32 MOS52 0438 ED2A MOS52 0360 ECDB v32 MOS52 0439 ED2A MOS52 0360 ECDB v32 MOS52 0440 ED2A NOTWT MOS52 0360 ECDB v32 MOS52 0441 ED2A 20 94 E5 JSR EXAM ;examine byte at head of queue MOS52 0444 ED31 ^32 MOS52 0442 ED2D B0 DE BCS NGONG ;[queue empty] MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 113 MOS52 MOS52 Sound generator MOS52 MOS52 0444 ED31 ^32 MOS52 0443 ED2F 29 03 ANDIM &03 MOS52 0444 ED31 ^32 MOS52 0444 ED31 F0 B2 BEQ NNWAT ;[no chord commands for next note] MOS52 0388 ED00 v35 MOS52 0445 ED33 [ MOS125 = &FF MOS52 0388 ED00 v35 MOS52 0460 ED33 | MOS52 0388 ED00 v35 MOS52 0461 ED33 ;NB NNWAT->STRNT now relies on C=0 MOS52 0388 ED00 v35 MOS52 0462 ED33 ;Y undefined after EXAM (NAUG p.137) MOS52 0388 ED00 v35 MOS52 0463 ED33 AC 38 08 LDY NOWAT MOS52 0388 ED00 v35 MOS52 0464 ED36 F0 E9 BEQ SRTS ;[full chord already accepted,ignore this channel for now] MOS52 0388 ED00 v35 MOS52 0465 ED38 10 05 BPL SMCRD ;chord already being built MOS52 0388 ED00 v35 MOS52 0466 ED3A 69 01 ADCIM &01 ;compensate for DEC NOWAT below (different V returned) MOS52 0388 ED00 v35 MOS52 0467 ED3C 8D 38 08 STA NOWAT ;new chord so set number of other channels required MOS52 0388 ED00 v35 MOS52 0468 ED3F SMCRD MOS52 0388 ED00 v35 MOS52 0469 ED3F CE 38 08 DEC NOWAT ;decrement the number of channels still required for chord MOS52 0388 ED00 v35 MOS52 0470 ED42 FE 28 08 INCAX WAIT ;set waiting flag MOS52 0388 ED00 v35 MOS52 0471 ED45 90 DA BCC NOTGO ;always branch MOS52 0388 ED00 v35 MOS52 0472 ED47 ] MOS52 0388 ED00 v35 MOS52 0473 ED47 MOS52 0388 ED00 v35 MOS52 0474 ED47 MOS52 0388 ED00 v35 MOS52 0475 ED47 ;routine to convert note to period MOS52 0388 ED00 v35 MOS52 0476 ED47 ;and output to the chip MOS52 0388 ED00 v35 MOS52 0477 ED47 CNVRT MOS52 0388 ED00 v35 MOS52 0478 ED47 DD 2C 08 CMPAX OLDNTE MOS52 0388 ED00 v35 MOS52 0479 ED4A F0 C0 BEQ PRTS ;no need to update chip MOS52 0388 ED00 v35 MOS52 0480 ED4C FCNVRT ;force note output MOS52 0388 ED00 v35 MOS52 0481 ED4C 9D 2C 08 STAAX OLDNTE -- MOS52 0482 ED4F E0 04 CPXIM &04 ;check if noise channel -- MOS52 0483 ED51 D0 08 BNE TONE MOS52 0483 ED51 v77 MOS52 0484 ED53 29 0F ANDIM &0F ;noise input is only 4 bits MOS52 0483 ED51 v77 MOS52 0485 ED55 1D A8 EB ORAAX CHAN ;add channel information MOS52 0483 ED51 v77 MOS52 0486 ED58 08 PHP ;push P (will immediately be pulled) MOS52 0483 ED51 v77 MOS52 0487 ED59 [ MOS125 = &FF MOS52 0483 ED51 v77 MOS52 0489 ED59 | MOS52 0483 ED51 v77 MOS52 0490 ED59 B0 7C BCS CDONE ;output and return MOS52 0490 ED59 v03 MOS52 0491 ED5B ] MOS52 0490 ED59 v03 MOS52 0492 ED5B TONE ;tone channel MOS52 0490 ED59 v03 MOS52 0493 ED5B 48 PHA MOS52 0490 ED59 v03 MOS52 0494 ED5C 29 03 ANDIM &03 MOS52 0490 ED59 v03 MOS52 0495 ED5E 8D 3C 08 STA FRACT ;low 2 bits give fraction of semitone MOS52 0490 ED59 v03 MOS52 0496 ED61 [ MOS125 = &FF MOS52 0490 ED59 v03 MOS52 0508 ED61 | MOS52 0490 ED59 v03 MOS52 0509 ED61 68 PLA MOS52 0490 ED59 v03 MOS52 0510 ED62 4A LSRA MOS52 0490 ED59 v03 MOS52 0511 ED63 4A LSRA MOS52 0490 ED59 v03 MOS52 0512 ED64 8D 3D 08 STA PRDL MOS52 0490 ED59 v03 MOS52 0513 ED67 OCTL MOS52 0490 ED59 v03 MOS52 0514 ED67 C9 0C CMPIM &0C ;check if note > one octave MOS52 0490 ED59 v03 MOS52 0515 ED69 90 07 BCC ENDOL MOS52 0490 ED59 v03 MOS52 0516 ED6B E9 0C SBCIM &0C MOS52 0490 ED59 v03 MOS52 0517 ED6D 6E 3D 08 ROR PRDL ;use PRDL as octave counter for division MOS52 0490 ED59 v03 MOS52 0518 ED70 30 F5 BMI OCTL ;branch always taken MOS52 0490 ED59 v03 MOS52 0519 ED72 ] MOS52 0490 ED59 v03 MOS52 0520 ED72 ENDOL MOS52 0490 ED59 v03 MOS52 0521 ED72 A8 TAY MOS52 0490 ED59 v03 MOS52 0522 ED73 AD 3D 08 LDA PRDL ;number octaves up MOS52 0490 ED59 v03 MOS52 0523 ED76 48 PHA MOS52 0490 ED59 v03 MOS52 0524 ED77 B9 38 EE LDAAY NTABL ;low period from table MOS52 0490 ED59 v03 MOS52 0525 ED7A 8D 3D 08 STA PRDL MOS52 0490 ED59 v03 MOS52 0526 ED7D B9 44 EE LDAAY NTABH ;high period for lowest octave MOS52 0490 ED59 v03 MOS52 0527 ED80 48 PHA MOS52 0490 ED59 v03 MOS52 0528 ED81 29 03 ANDIM &03 MOS52 0490 ED59 v03 MOS52 0529 ED83 8D 3E 08 STA PRDH MOS52 0490 ED59 v03 MOS52 0530 ED86 68 PLA ;get semitone difference from top bits of NTABH MOS52 0490 ED59 v03 MOS52 0531 ED87 4A LSRA MOS52 0490 ED59 v03 MOS52 0532 ED88 4A LSRA MOS52 0490 ED59 v03 MOS52 0533 ED89 4A LSRA MOS52 0490 ED59 v03 MOS52 0534 ED8A 4A LSRA MOS52 0490 ED59 v03 MOS52 0535 ED8B 8D 3F 08 STA NOTDIF MOS52 0490 ED59 v03 MOS52 0536 ED8E AD 3D 08 LDA PRDL MOS52 0490 ED59 v03 MOS52 0537 ED91 AC 3C 08 LDY FRACT ;number of times NOTDIF has to be added MOS52 0490 ED59 v03 MOS52 0538 ED94 F0 0C BEQ INTRPE ;[true semitone] MOS52 0490 ED59 v03 MOS52 0539 ED96 INTRPL MOS52 0490 ED59 v03 MOS52 0540 ED96 ;following subtracts NOTDIF from period MOS52 0490 ED59 v03 MOS52 0541 ED96 38 SEC MOS52 0490 ED59 v03 MOS52 0542 ED97 ED 3F 08 SBC NOTDIF MOS52 0490 ED59 v03 MOS52 0543 ED9A B0 03 BCS INTRPO MOS52 0490 ED59 v03 MOS52 0544 ED9C CE 3E 08 DEC PRDH MOS52 0490 ED59 v03 MOS52 0545 ED9F INTRPO MOS52 0490 ED59 v03 MOS52 0546 ED9F 88 DEY MOS52 0490 ED59 v03 MOS52 0547 EDA0 D0 F4 BNE INTRPL ;[add another fraction] MOS52 0490 ED59 v03 MOS52 0548 EDA2 INTRPE MOS52 0490 ED59 v03 MOS52 0549 EDA2 8D 3D 08 STA PRDL MOS52 0490 ED59 v03 MOS52 0550 EDA5 68 PLA MOS52 0490 ED59 v03 MOS52 0551 EDA6 [ MOS125 = &FF MOS52 0490 ED59 v03 MOS52 0559 EDA6 | MOS52 0490 ED59 v03 MOS52 0560 EDA6 10 09 BPL ODONE ;if lowest octave then no shifts MOS52 0490 ED59 v03 MOS52 0561 EDA8 SSHIFT MOS52 0490 ED59 v03 MOS52 0562 EDA8 4E 3E 08 LSR PRDH ;divide period by 2 MOS52 0490 ED59 v03 MOS52 0563 EDAB 6E 3D 08 ROR PRDL MOS52 0490 ED59 v03 MOS52 0564 EDAE 0A ASLA MOS52 0490 ED59 v03 MOS52 0565 EDAF 30 F7 BMI SSHIFT ;[up another octave] MOS52 0490 ED59 v03 MOS52 0566 EDB1 ] MOS52 0490 ED59 v03 MOS52 0567 EDB1 ODONE MOS52 0490 ED59 v03 MOS52 0568 EDB1 AD 3D 08 LDA PRDL ;extract low four bits of period MOS52 0490 ED59 v03 MOS52 0569 EDB4 18 CLC MOS52 0490 ED59 v03 MOS52 0570 EDB5 7D 3D C4 ADCAX SCHOFF MOS52 0490 ED59 v03 MOS52 0571 EDB8 8D 3D 08 STA PRDL MOS52 0490 ED59 v03 MOS52 0572 EDBB 90 03 BCC NOFOV MOS52 0490 ED59 v03 MOS52 0573 EDBD EE 3E 08 INC PRDH MOS52 0490 ED59 v03 MOS52 0574 EDC0 NOFOV MOS52 0490 ED59 v03 MOS52 0575 EDC0 29 0F ANDIM &0F MOS52 0490 ED59 v03 MOS52 0576 EDC2 1D A8 EB ORAAX CHAN ;add channel address MOS52 0490 ED59 v03 MOS52 0577 EDC5 08 PHP MOS52 0490 ED59 v03 MOS52 0578 EDC6 78 SEI ;make sure another request does not mess up sequence MOS52 0490 ED59 v03 MOS52 0579 EDC7 20 8E EB JSR SEND ;output to chip MOS52 0490 ED59 v03 MOS52 0580 EDCA AD 3D 08 LDA PRDL ;get next 6 bits of period MOS52 0490 ED59 v03 MOS52 0581 EDCD 4E 3E 08 LSR PRDH MOS52 0490 ED59 v03 MOS52 0582 EDD0 6A RORA MOS52 0490 ED59 v03 MOS52 0583 EDD1 4E 3E 08 LSR PRDH MOS52 0490 ED59 v03 MOS52 0584 EDD4 6A RORA MOS52 0490 ED59 v03 MOS52 0585 EDD5 4A LSRA ;transfer to low 6 bits of Acc MOS52 0490 ED59 v03 MOS52 0586 EDD6 4A LSRA MOS52 0490 ED59 v03 MOS52 0587 EDD7 CDONE MOS52 0490 ED59 v03 MOS52 0588 EDD7 4C 8F EB JMP SENDX ;output period to chip -- MOS52 0589 EDDA ;routine to start note at head of queue -- MOS52 0590 EDDA STRNT -- MOS52 0591 EDDA 08 PHP ;start indivisible section to stop new -- MOS52 0592 EDDB 78 SEI ;note being added to queue half way through extraction -- MOS52 0593 EDDC 20 99 E5 JSR REMOV ;get byte at head queue -- MOS52 0594 EDDF [ MOS125 = &FF -- MOS52 0601 EDDF | -- MOS52 0602 EDDF A8 TAY ;save byte at head queue MOS52 MOS52 MOS52 MOS52 Acorn macro assembler Page 114 MOS52 MOS52 Sound generator MOS52 -- MOS52 0603 EDE0 29 04 ANDIM &04 ;extract 'continue' bit -- MOS52 0604 EDE2 F0 12 BEQ NOCONT ;[not continue] MOS52 0604 EDE2 v6D MOS52 0605 EDE4 BC 20 08 LDYAX ENVLP ;must check for continue to auto envelope MOS52 0604 EDE2 v6D MOS52 0606 EDE7 C8 INY MOS52 0604 EDE2 v6D MOS52 0607 EDE8 ] MOS52 0604 EDE2 v6D MOS52 0608 EDE8 D0 03 BNE SCON1 MOS52 0604 EDE2 v6D MOS52 0609 EDEA 20 73 EB JSR MINATN ;update attenuation MOS52 0604 EDE2 v6D MOS52 0610 EDED SCON1 MOS52 0604 EDE2 v6D MOS52 0611 EDED 20 99 E5 JSR REMOV ;throw away note MOS52 0604 EDE2 v6D MOS52 0612 EDF0 20 99 E5 JSR REMOV ;get duration MOS52 0604 EDE2 v6D MOS52 0613 EDF3 28 PLP ;end of indivisible section MOS52 0604 EDE2 v6D MOS52 0614 EDF4 [ MOS125 = &FF MOS52 0604 EDE2 v6D MOS52 0618 EDF4 | MOS52 0604 EDE2 v6D MOS52 0619 EDF4 90 3E BCC DODUR ;C=0 from NNWAT->STRNT; always branch to update duration MOS52 0619 EDF4 v41 MOS52 0620 EDF6 NOCONT MOS52 0619 EDF4 v41 MOS52 0621 EDF6 98 TYA ;restore header byte MOS52 0619 EDF4 v41 MOS52 0622 EDF7 ] MOS52 0619 EDF4 v41 MOS52 0623 EDF7 29 F8 ANDIM &F8 ;extract 5 envelope bits MOS52 0619 EDF4 v41 MOS52 0624 EDF9 0A ASLA ;programmable envelope select bit >carry MOS52 0619 EDF4 v41 MOS52 0625 EDFA 90 0A BCC PENV ;[programmed envelope] MOS52 0619 EDF4 v41 MOS52 0626 EDFC [ MOS125 = &FF MOS52 0619 EDF4 v41 MOS52 0631 EDFC | MOS52 0619 EDF4 v41 MOS52 0632 EDFC ; in: ~b3 ~b2 ~b1 ~b0 0 0 0 x MOS52 0619 EDF4 v41 MOS52 0633 EDFC ;out: ~b3 ~b3 b2 b1 b0 1 1 1 MOS52 0619 EDF4 v41 MOS52 0634 EDFC C9 80 CMPIM &80 ;convert box envelope to signed amplitude MOS52 0619 EDF4 v41 MOS52 0635 EDFE 6A RORA MOS52 0619 EDF4 v41 MOS52 0636 EDFF 49 3F EORIM &3F MOS52 0619 EDF4 v41 MOS52 0637 EE01 ] MOS52 0619 EDF4 v41 MOS52 0638 EE01 20 7A EB JSR UPATN MOS52 0619 EDF4 v41 MOS52 0639 EE04 A9 FF LDAIM &FF ;flag box envelope by setting top bit of ENVLP MOS52 0619 EDF4 v41 MOS52 0640 EE06 PENV MOS52 0619 EDF4 v41 MOS52 0641 EE06 9D 20 08 STAAX ENVLP ;envelope pointer,envelope*16 MOS52 0619 EDF4 v41 MOS52 0642 EE09 A9 05 LDAIM &05 ;start timing first 1/20th second from now MOS52 0619 EDF4 v41 MOS52 0643 EE0B 9D 1C 08 STAAX DRDIV MOS52 0619 EDF4 v41 MOS52 0644 EE0E A9 01 LDAIM &01 MOS52 0619 EDF4 v41 MOS52 0645 EE10 9D 24 08 STAAX SCONT ;first envelope update next tick MOS52 0619 EDF4 v41 MOS52 0646 EE13 [ MOS125 = &FF MOS52 0619 EDF4 v41 MOS52 0648 EE13 | MOS52 0619 EDF4 v41 MOS52 0649 EE13 4A LSRA MOS52 0619 EDF4 v41 MOS52 0650 EE14 ] MOS52 0619 EDF4 v41 MOS52 0651 EE14 9D 14 08 STAAX NCONT MOS52 0619 EDF4 v41 MOS52 0652 EE17 9D 08 08 STAAX EPERD ;first amplittude envelope MOS52 0619 EDF4 v41 MOS52 0653 EE1A 9D 30 08 STAAX NTADD ;note add envelope starts at 0 MOS52 0619 EDF4 v41 MOS52 0654 EE1D A9 FF LDAIM &FF MOS52 0619 EDF4 v41 MOS52 0655 EE1F 9D 10 08 STAAX NPERD ;set frequency envelope to -1,incremented on first tick MOS52 0619 EDF4 v41 MOS52 0656 EE22 20 99 E5 JSR REMOV ;extract note byte from queue MOS52 0619 EDF4 v41 MOS52 0657 EE25 9D 0C 08 STAAX SNOTE ;store note MOS52 0619 EDF4 v41 MOS52 0658 EE28 20 99 E5 JSR REMOV ;Remove duration MOS52 0619 EDF4 v41 MOS52 0659 EE2B 28 PLP ;end of indivisible section MOS52 0619 EDF4 v41 MOS52 0660 EE2C 48 PHA ;remember duration MOS52 0619 EDF4 v41 MOS52 0661 EE2D BD 0C 08 LDAAX SNOTE MOS52 0619 EDF4 v41 MOS52 0662 EE30 20 47 ED JSR CNVRT ;convert to period and output MOS52 0619 EDF4 v41 MOS52 0663 EE33 68 PLA ;get duration back MOS52 0619 EDF4 v41 MOS52 0664 EE34 DODUR MOS52 0619 EDF4 v41 MOS52 0665 EE34 9D 18 08 STAAX DUR ;set up duration -- MOS52 0666 EE37 60 RTS -- MOS52 0667 EE38 [ MOS125 = &FF -- MOS52 0668 EE38 | -- MOS52 0669 EE38 ;NB swapping JSR CNVRT and STAAX DUR (to save PHA/PLA) -- MOS52 0670 EE38 ;would cause an interrupt occurring during CNVRT to decrement -- MOS52 0671 EE38 ;the new count instead of the old. Preserving current order. -- MOS52 0672 EE38 ] -- MOS52 0673 EE38 -- MOS52 0674 EE38 -- MOS52 0675 EE38 NTABL ;lookup table for low 8 bit of period -- MOS52 0676 EE38 F0 = &F0 -- MOS52 0677 EE39 B7 = &B7 -- MOS52 0678 EE3A 82 = &82 -- MOS52 0679 EE3B 4F = &4F -- MOS52 0680 EE3C 20 = &20 -- MOS52 0681 EE3D F3 = &F3 -- MOS52 0682 EE3E C8 = &C8 -- MOS52 0683 EE3F A0 = &A0 -- MOS52 0684 EE40 7B = &7B -- MOS52 0685 EE41 57 = &57 -- MOS52 0686 EE42 35 = &35 -- MOS52 0687 EE43 16 = &16 -- MOS52 0688 EE44 NTABH ;lookup table for high 2 bits of period -- MOS52 0689 EE44 E7 = &E7 ;and 6 bits of note difference being the difference -- MOS52 0690 EE45 D7 = &D7 ;between this and the next note -- MOS52 0691 EE46 CB = &CB -- MOS52 0692 EE47 C3 = &C3 -- MOS52 0693 EE48 B7 = &B7 -- MOS52 0694 EE49 AA = &AA -- MOS52 0695 EE4A A2 = &A2 -- MOS52 0696 EE4B 9A = &9A -- MOS52 0697 EE4C 92 = &92 -- MOS52 0698 EE4D 8A = &8A -- MOS52 0699 EE4E 82 = &82 -- MOS52 0700 EE4F 7A = &7A -- MOS52 0701 EE50 -- MOS52 0702 EE50 -- MOS52 0703 EE50 LNK MOS54 -- MOS54 0001 EE50 ; MOS54 -- MOS54 0002 EE50 TTL MOS54 SPEECH DRIVING -- MOS54 0003 EE50 OPT MOS54 MOS54 MOS54 MOS54 MOS54 Acorn macro assembler Page 115 MOS54 MOS54 SPEECH DRIVING MOS54 -- MOS54 0004 EE50 ;(c) 1981 ACORN Computers Limited -- MOS54 0005 EE50 ;BBC Microcomputer Machine Operating System (MOS) -- MOS54 0006 EE50 ;Change record: -- MOS54 0007 EE50 ;004 07-Nov-81 PBM Prototype version -- MOS54 0008 EE50 ;Author(s): -- MOS54 0009 EE50 ;Paul Bond -- MOS54 0010 EE50 -- MOS54 0011 EE50 -- MOS54 0012 EE50 SRINIT ;initialise SEROM environment for CFS -- MOS54 0013 EE50 [ NOSP = &00 -- MOS54 0016 EE50 | -- MOS54 0017 EE50 A9 EF LDAIM &F0-&01 ;$01 adjusts for future INC SEROM -- MOS54 0018 EE52 ] -- MOS54 0019 EE52 ; SEROM will cycle $F0 ... $FF ... $00 ... $10 (max) -- MOS54 0020 EE52 85 F5 STA SEROM -- MOS54 0021 EE54 [ MOS125 = &FF -- MOS54 0023 EE54 ] -- MOS54 0024 EE54 -- MOS54 0025 EE54 -- MOS54 0026 EE54 SRNEXT ;move on to next SEROM -- MOS54 0027 EE54 ; -- MOS54 0028 EE54 ; scans phrase ROM first, then paged ROM -- MOS54 0029 EE54 ; -- MOS54 0030 EE54 SPCPYF ;entry point from failed copyright message test -- MOS54 0031 EE54 A2 0D LDXIM SVISFS MOS54 0071 EE73 ^5F MOS54 0032 EE56 E6 F5 INC SEROM MOS54 0071 EE73 ^5F MOS54 0033 EE58 A4 F5 LDY SEROM MOS54 0071 EE73 ^5F MOS54 0034 EE5A [ NOSP = &00 MOS54 0071 EE73 ^5F MOS54 0039 EE5A | MOS54 0071 EE73 ^5F MOS54 0040 EE5A [ MOS125 = &7F MOS54 0071 EE73 ^5F MOS54 0041 EE5A 30 05 BMI SPPH ;[process PHROM, V not altered] MOS54 0071 EE73 ^5F MOS54 0042 EE5C C0 10 CPYIM NROM ;if we get here with SEROM >= NROM, MOS54 0071 EE73 ^5F MOS54 0043 EE5E 90 39 BCC SPSV ;then no paged ROM is to respond MOS54 0043 EE5E v46 MOS54 0044 EE60 60 RTS ;so exit C=1, call unclaimed MOS54 0043 EE5E v46 MOS54 0045 EE61 SPPH MOS54 0043 EE5E v46 MOS54 0046 EE61 | MOS54 0043 EE5E v46 MOS54 0048 EE61 ] MOS54 0043 EE5E v46 MOS54 0049 EE61 ; MOS54 0043 EE5E v46 MOS54 0050 EE61 ; process PHROM, V not altered MOS54 0043 EE5E v46 MOS54 0051 EE61 ; MOS54 0043 EE5E v46 MOS54 0052 EE61 ; no need to check for speech chip present MOS54 0043 EE5E v46 MOS54 0053 EE61 ; reads from chip will not indicate copyright message MOS54 0043 EE5E v46 MOS54 0054 EE61 ; MOS54 0043 EE5E v46 MOS54 0055 EE61 ; check for existence of speech SEROM MOS54 0043 EE5E v46 MOS54 0056 EE61 ; MOS54 0043 EE5E v46 MOS54 0057 EE61 ; set pointer to 1 MOS54 0043 EE5E v46 MOS54 0058 EE61 ; MOS54 0043 EE5E v46 MOS54 0059 EE61 A2 00 LDXIM ZERO MOS54 0043 EE5E v46 MOS54 0060 EE63 86 F7 STX ROMPTR+&01 MOS54 0043 EE5E v46 MOS54 0061 EE65 E8 INX ;X := 1 MOS54 0043 EE5E v46 MOS54 0062 EE66 86 F6 STX ROMPTR+&00 MOS54 0043 EE5E v46 MOS54 0063 EE68 20 FB EE JSR SPLOAD ;set address MOS54 0043 EE5E v46 MOS54 0064 EE6B ; MOS54 0043 EE5E v46 MOS54 0065 EE6B ; check for copyright (C) MOS54 0043 EE5E v46 MOS54 0066 EE6B ; MOS54 0043 EE5E v46 MOS54 0067 EE6B A2 03 LDXIM &03 MOS54 0043 EE5E v46 MOS54 0068 EE6D SPCPY ;V not altered MOS54 0043 EE5E v46 MOS54 0069 EE6D 20 A2 EE JSR RDBYTE ;does not alter X MOS54 0043 EE5E v46 MOS54 0070 EE70 DD 3F F5 CMPAX COPYR MOS54 0043 EE5E v46 MOS54 0071 EE73 D0 DF BNE SPCPYF ;[failed test for copyright message] MOS54 0043 EE5E v46 MOS54 0072 EE75 ; C=1 MOS54 0043 EE5E v46 MOS54 0073 EE75 CA DEX MOS54 0043 EE5E v46 MOS54 0074 EE76 10 F5 BPL SPCPY MOS54 0043 EE5E v46 MOS54 0075 EE78 ; MOS54 0043 EE5E v46 MOS54 0076 EE78 ; C=1 MOS54 0043 EE5E v46 MOS54 0077 EE78 ; MOS54 0043 EE5E v46 MOS54 0078 EE78 ; copyright message is present MOS54 0043 EE5E v46 MOS54 0079 EE78 ; MOS54 0043 EE5E v46 MOS54 0080 EE78 ; we have read 5 bytes so far MOS54 0043 EE5E v46 MOS54 0081 EE78 ; skip more bytes allowing for copyright/title strings MOS54 0043 EE5E v46 MOS54 0082 EE78 ; MOS54 0043 EE5E v46 MOS54 0083 EE78 ; position serial ROM to cassette image data MOS54 0043 EE5E v46 MOS54 0084 EE78 ; (indirect pointer held at offset $3E) MOS54 0043 EE5E v46 MOS54 0085 EE78 ; MOS54 0043 EE5E v46 MOS54 0086 EE78 A9 3E LDAIM &3E MOS54 0043 EE5E v46 MOS54 0087 EE7A 85 F6 STA ROMPTR+&00 MOS54 0043 EE5E v46 MOS54 0088 EE7C ; MOS54 0043 EE5E v46 MOS54 0089 EE7C ; C=1 MOS54 0043 EE5E v46 MOS54 0090 EE7C ; MOS54 0043 EE5E v46 MOS54 0091 EE7C SPLIND ;load address indirect, V not altered, returns C=0 MOS54 0043 EE5E v46 MOS54 0092 EE7C 20 FB EE JSR SPLOAD MOS54 0043 EE5E v46 MOS54 0093 EE7F [ TRUE=0 MOS54 0043 EE5E v46 MOS54 0094 EE7F ; perform soft version of read-and-branch MOS54 0043 EE5E v46 MOS54 0095 EE7F ; MOS54 0043 EE5E v46 MOS54 0096 EE7F A2 FF LDXIM &FF MOS54 0043 EE5E v46 MOS54 0097 EE81 RABLP MOS54 0043 EE5E v46 MOS54 0098 EE81 ; read lo byte when X=0, hi byte when X=1 MOS54 0043 EE5E v46 MOS54 0099 EE81 20 A2 EE JSR RDBYTE ;does not corrupt X MOS54 0043 EE5E v46 MOS54 0100 EE84 ; MOS54 0043 EE5E v46 MOS54 0101 EE84 [ MOS125 = &FF MOS54 0043 EE5E v46 MOS54 0108 EE84 | MOS54 0043 EE5E v46 MOS54 0109 EE84 38 SEC ;C undefined if entered at SPLIND MOS54 0043 EE5E v46 MOS54 0110 EE85 2A ROLA MOS54 0043 EE5E v46 MOS54 0111 EE86 RABLO ;reverse bits in A into ROMPTR+(0/1) MOS54 0043 EE5E v46 MOS54 0112 EE86 76 F7 RORAX ROMPTR+&01 MOS54 0043 EE5E v46 MOS54 0113 EE88 0A ASLA MOS54 0043 EE5E v46 MOS54 0114 EE89 D0 FB BNE RABLO ;[process 8 bits] MOS54 0043 EE5E v46 MOS54 0115 EE8B ; C=1, Y clobbered in SPLOAD->SPL->SPL1 MOS54 0043 EE5E v46 MOS54 0116 EE8B ] MOS54 0043 EE5E v46 MOS54 0117 EE8B ; MOS54 0043 EE5E v46 MOS54 0118 EE8B E8 INX MOS54 0043 EE5E v46 MOS54 0119 EE8C F0 F3 BEQ RABLP ;repeat loop once more with X=0 MOS54 0043 EE5E v46 MOS54 0120 EE8E ; MOS54 0043 EE5E v46 MOS54 0121 EE8E 18 CLC ;indicate next successful MOS54 0043 EE5E v46 MOS54 0122 EE8F 90 6A BCC SPLOAD ;[ALWAYS jump, set indirected address AND return] MOS54 0122 EE8F v15 MOS54 0123 EE91 | MOS54 0122 EE8F v15 MOS54 0136 EE91 ] MOS54 0122 EE8F v15 MOS54 0137 EE91 ] MOS54 0122 EE8F v15 MOS54 0138 EE91 MOS54 0122 EE8F v15 MOS54 0139 EE91 MOS54 0122 EE8F v15 MOS54 0140 EE91 RDSPCH ;read byte from SEROM MOS54 0122 EE8F v15 MOS54 0141 EE91 A2 0E LDXIM SVRSFS MOS54 0122 EE8F v15 MOS54 0142 EE93 [ NOSP = &00 MOS54 0122 EE8F v15 MOS54 0144 EE93 | MOS54 0122 EE8F v15 MOS54 0145 EE93 A4 F5 LDY SEROM MOS54 0122 EE8F v15 MOS54 0146 EE95 30 0B BMI RDBYTE ;[reading from PHROM, V not altered] MOS54 0122 EE8F v15 MOS54 0147 EE97 ] MOS54 0122 EE8F v15 MOS54 0148 EE97 ; MOS54 0122 EE8F v15 MOS54 0149 EE97 ; reading from paged ROM MOS54 0122 EE8F v15 MOS54 0150 EE97 ; MOS54 0122 EE8F v15 MOS54 0151 EE97 A0 FF LDYIM 0-MCVER ;enter paged ROM with M/C indicator in Y MOS54 MOS54 MOS54 MOS54 Acorn macro assembler Page 116 MOS54 MOS54 SPEECH DRIVING MOS54 MOS54 0122 EE8F v15 MOS54 0152 EE99 ; MOS54 0122 EE8F v15 MOS54 0153 EE99 SPSV ;used by read byte routine, V not altered MOS54 0122 EE8F v15 MOS54 0154 EE99 08 PHP MOS54 0122 EE8F v15 MOS54 0155 EE9A 20 75 F1 JSR SVOP ;search for paged SEROM (N.B. SVOPSP) MOS54 0122 EE8F v15 MOS54 0156 EE9D ; MOS54 0122 EE8F v15 MOS54 0157 EE9D 28 PLP ;restore V-flag MOS54 0122 EE8F v15 MOS54 0158 EE9E C9 01 CMPIM &01 ;claimed => C=0, not claimed => C=1 MOS54 0122 EE8F v15 MOS54 0159 EEA0 98 TYA ;A := read character (useful for read byte routine only) MOS54 0122 EE8F v15 MOS54 0160 EEA1 60 RTS MOS54 0122 EE8F v15 MOS54 0161 EEA2 MOS54 0122 EE8F v15 MOS54 0162 EEA2 MOS54 0122 EE8F v15 MOS54 0163 EEA2 [ NOSP = &00 MOS54 0122 EE8F v15 MOS54 0166 EEA2 | MOS54 0122 EE8F v15 MOS54 0167 EEA2 RDBYTE ;read byte from speech ROM, V not altered MOS54 0122 EE8F v15 MOS54 0168 EEA2 08 PHP MOS54 0122 EE8F v15 MOS54 0169 EEA3 78 SEI MOS54 0122 EE8F v15 MOS54 0170 EEA4 A0 10 LDYIM SPOPRB ;set to read byte MOS54 0122 EE8F v15 MOS54 0171 EEA6 20 BF EE JSR WSPECH MOS54 0122 EE8F v15 MOS54 0172 EEA9 ; read byte (following code shorter than JSR RSPECH; PLP; RTS) MOS54 0122 EE8F v15 MOS54 0173 EEA9 A0 00 LDYIM ZERO MOS54 0122 EE8F v15 MOS54 0174 EEAB F0 17 BEQ SENDSX ;[ALWAYS JUMP, N.B. does PLP & RTS, SEI already active] MOS54 0122 EE8F v15 MOS54 0175 EEAD MOS54 0122 EE8F v15 MOS54 0176 EEAD MOS54 0122 EE8F v15 MOS54 0177 EEAD RSPECH ;read from speech processor, must not corrupt X MOS54 0122 EE8F v15 MOS54 0178 EEAD A0 00 LDYIM ZERO MOS54 0122 EE8F v15 MOS54 0179 EEAF F0 11 BEQ SENDSP ;[ALWAYS jump] MOS54 0122 EE8F v15 MOS54 0180 EEB1 ; MOS54 0122 EE8F v15 MOS54 0181 EEB1 ; MOS54 0122 EE8F v15 MOS54 0182 EEB1 SPL ;send load address nibbles MOS54 0122 EE8F v15 MOS54 0183 EEB1 ; A = hl MOS54 0122 EE8F v15 MOS54 0184 EEB1 ; h is hi-nibble MOS54 0122 EE8F v15 MOS54 0185 EEB1 ; l is lo-nibble MOS54 0122 EE8F v15 MOS54 0186 EEB1 48 PHA MOS54 0122 EE8F v15 MOS54 0187 EEB2 20 BA EE JSR SPL1 ;send lo-nibble MOS54 0122 EE8F v15 MOS54 0188 EEB5 68 PLA MOS54 0122 EE8F v15 MOS54 0189 EEB6 6A RORA MOS54 0122 EE8F v15 MOS54 0190 EEB7 6A RORA MOS54 0122 EE8F v15 MOS54 0191 EEB8 6A RORA MOS54 0122 EE8F v15 MOS54 0192 EEB9 6A RORA MOS54 0122 EE8F v15 MOS54 0193 EEBA ; MOS54 0122 EE8F v15 MOS54 0194 EEBA ; send hi-nibble MOS54 0122 EE8F v15 MOS54 0195 EEBA ; MOS54 0122 EE8F v15 MOS54 0196 EEBA SPL1 MOS54 0122 EE8F v15 MOS54 0197 EEBA 29 0F ANDIM &0F ;isolate lo-nibble MOS54 0122 EE8F v15 MOS54 0198 EEBC 09 40 ORAIM SPOPLA MOS54 0122 EE8F v15 MOS54 0199 EEBE ; MOS54 0122 EE8F v15 MOS54 0200 EEBE A8 TAY ;Y := command MOS54 0122 EE8F v15 MOS54 0201 EEBF ; MOS54 0122 EE8F v15 MOS54 0202 EEBF WSPECH ;write to speech processor, must not corrupt X MOS54 0122 EE8F v15 MOS54 0203 EEBF 98 TYA ;A := command MOS54 0122 EE8F v15 MOS54 0204 EEC0 A0 01 LDYIM &01 MOS54 0122 EE8F v15 MOS54 0205 EEC2 ; MOS54 0122 EE8F v15 MOS54 0206 EEC2 SENDSP ;read/write from/to speech processor MOS54 0122 EE8F v15 MOS54 0207 EEC2 ; Y=0 => read MOS54 0122 EE8F v15 MOS54 0208 EEC2 ; Y=1 => write MOS54 0122 EE8F v15 MOS54 0209 EEC2 08 PHP MOS54 0122 EE8F v15 MOS54 0210 EEC3 78 SEI MOS54 0122 EE8F v15 MOS54 0211 EEC4 SENDSX ;entry used by routines which have done a PHP & SEI MOS54 0122 EE8F v15 MOS54 0212 EEC4 2C 7B 02 BIT SPFLAG MOS54 0122 EE8F v15 MOS54 0213 EEC7 10 21 BPL SNDSX0 ;[speech chip not present] MOS54 0122 EE8F v15 MOS54 0214 EEC9 ; MOS54 0122 EE8F v15 MOS54 0215 EEC9 48 PHA ;save command MOS54 0122 EE8F v15 MOS54 0216 EECA ; MOS54 0122 EE8F v15 MOS54 0217 EECA ; select PA7-0 as inputs/outputs MOS54 0122 EE8F v15 MOS54 0218 EECA ; MOS54 0122 EE8F v15 MOS54 0219 EECA B9 A8 F0 LDAAY SENDD MOS54 0122 EE8F v15 MOS54 0220 EECD 8D 43 FE STA DDRAQ MOS54 0122 EE8F v15 MOS54 0221 EED0 ; MOS54 0122 EE8F v15 MOS54 0222 EED0 ; place command onto data bus MOS54 0122 EE8F v15 MOS54 0223 EED0 ; MOS54 0122 EE8F v15 MOS54 0224 EED0 68 PLA ;restore command MOS54 0122 EE8F v15 MOS54 0225 EED1 8D 4F FE STA PAPQ MOS54 0122 EE8F v15 MOS54 0226 EED4 ; MOS54 0122 EE8F v15 MOS54 0227 EED4 ; speech enable MOS54 0122 EE8F v15 MOS54 0228 EED4 ; MOS54 0122 EE8F v15 MOS54 0229 EED4 B9 AA F0 LDAAY SENDS MOS54 0122 EE8F v15 MOS54 0230 EED7 8D 40 FE STA PBQ MOS54 0122 EE8F v15 MOS54 0231 EEDA ; MOS54 0122 EE8F v15 MOS54 0232 EEDA ; wait for speech ready MOS54 0122 EE8F v15 MOS54 0233 EEDA ; MOS54 0122 EE8F v15 MOS54 0234 EEDA SPWAIT MOS54 0122 EE8F v15 MOS54 0235 EEDA 2C 40 FE BIT PBQ MOS54 0122 EE8F v15 MOS54 0236 EEDD 30 FB BMI SPWAIT ;[not ready] MOS54 0122 EE8F v15 MOS54 0237 EEDF ; MOS54 0122 EE8F v15 MOS54 0238 EEDF ; read possible speech data MOS54 0122 EE8F v15 MOS54 0239 EEDF ; MOS54 0122 EE8F v15 MOS54 0240 EEDF AD 4F FE LDA PAPQ MOS54 0122 EE8F v15 MOS54 0241 EEE2 48 PHA MOS54 0122 EE8F v15 MOS54 0242 EEE3 ; MOS54 0122 EE8F v15 MOS54 0243 EEE3 ; speech disable MOS54 0122 EE8F v15 MOS54 0244 EEE3 ; MOS54 0122 EE8F v15 MOS54 0245 EEE3 B9 AC F0 LDAAY SENDF MOS54 0122 EE8F v15 MOS54 0246 EEE6 8D 40 FE STA PBQ MOS54 0122 EE8F v15 MOS54 0247 EEE9 ; MOS54 0122 EE8F v15 MOS54 0248 EEE9 ; return MOS54 0122 EE8F v15 MOS54 0249 EEE9 ; MOS54 0122 EE8F v15 MOS54 0250 EEE9 68 PLA ;restore speech data (not relevant if write) MOS54 0122 EE8F v15 MOS54 0251 EEEA ; MOS54 0122 EE8F v15 MOS54 0252 EEEA SNDSX0 MOS54 0122 EE8F v15 MOS54 0253 EEEA 28 PLP MOS54 0122 EE8F v15 MOS54 0254 EEEB A8 TAY ;set processor status flags (useful for RSPECH) and Y (for FX calls) MOS54 0122 EE8F v15 MOS54 0255 EEEC 60 RTS MOS54 0122 EE8F v15 MOS54 0256 EEED ] MOS54 0122 EE8F v15 MOS54 0257 EEED MOS54 0122 EE8F v15 MOS54 0258 EEED MOS54 0122 EE8F v15 MOS54 0259 EEED SRSKIP ;skip to SEROM pointer indicated by SRPTR MOS54 0122 EE8F v15 MOS54 0260 EEED AD CB 03 LDA SRPTR+&00 MOS54 0122 EE8F v15 MOS54 0261 EEF0 85 F6 STA ROMPTR+&00 MOS54 0122 EE8F v15 MOS54 0262 EEF2 AD CC 03 LDA SRPTR+&01 MOS54 0122 EE8F v15 MOS54 0263 EEF5 85 F7 STA ROMPTR+&01 MOS54 0122 EE8F v15 MOS54 0264 EEF7 [ NOSP = &00 MOS54 0122 EE8F v15 MOS54 0265 EEF7 | MOS54 0122 EE8F v15 MOS54 0266 EEF7 A5 F5 LDA SEROM MOS54 0122 EE8F v15 MOS54 0267 EEF9 10 1B BPL SRSK0 ;[skipping within paged ROM] MOS54 0122 EE8F v15 MOS54 0268 EEFB ; MOS54 0122 EE8F v15 MOS54 0269 EEFB ; skipping within speech SEROM MOS54 0122 EE8F v15 MOS54 0270 EEFB ; load address from SEROM/ROMPTR MOS54 0122 EE8F v15 MOS54 0271 EEFB ; MOS54 0122 EE8F v15 MOS54 0272 EEFB SPLOAD ;load address, must not corrupt V MOS54 0122 EE8F v15 MOS54 0273 EEFB ; address given in SEROM/ROMPTR MOS54 0122 EE8F v15 MOS54 0274 EEFB 08 PHP MOS54 MOS54 MOS54 MOS54 Acorn macro assembler Page 117 MOS54 MOS54 SPEECH DRIVING MOS54 MOS54 0267 EEF9 v64 MOS54 0275 EEFC 78 SEI ;N.B. uses SPWK1 MOS54 0267 EEF9 v64 MOS54 0276 EEFD A5 F6 LDA ROMPTR+&00 MOS54 0267 EEF9 v64 MOS54 0277 EEFF 20 B1 EE JSR SPL ;send address lo-byte MOS54 0267 EEF9 v64 MOS54 0278 EF02 [ MOS125 = &FF MOS54 0267 EEF9 v64 MOS54 0291 EF02 | MOS54 0267 EEF9 v64 MOS54 0292 EF02 A5 F5 LDA SEROM MOS54 0267 EEF9 v64 MOS54 0293 EF04 4A LSRA MOS54 0267 EEF9 v64 MOS54 0294 EF05 6A RORA MOS54 0267 EEF9 v64 MOS54 0295 EF06 48 PHA MOS54 0267 EEF9 v64 MOS54 0296 EF07 6A RORA MOS54 0267 EEF9 v64 MOS54 0297 EF08 45 F7 EOR ROMPTR+&01 MOS54 0267 EEF9 v64 MOS54 0298 EF0A 29 C0 ANDIM &C0 MOS54 0267 EEF9 v64 MOS54 0299 EF0C 45 F7 EOR ROMPTR+&01 MOS54 0267 EEF9 v64 MOS54 0300 EF0E 20 B1 EE JSR SPL ;send address hi-byte MOS54 0267 EEF9 v64 MOS54 0301 EF11 68 PLA MOS54 0267 EEF9 v64 MOS54 0302 EF12 20 BA EE JSR SPL1 ;send address hi-nibble MOS54 0267 EEF9 v64 MOS54 0303 EF15 ] MOS54 0267 EEF9 v64 MOS54 0304 EF15 28 PLP MOS54 0267 EEF9 v64 MOS54 0305 EF16 SRSK0 MOS54 0267 EEF9 v64 MOS54 0306 EF16 ] MOS54 0267 EEF9 v64 MOS54 0307 EF16 60 RTS -- MOS54 0308 EF17 -- MOS54 0309 EF17 -- MOS54 0310 EF17 [ FALSE=0 -- MOS54 0323 EF17 ] -- MOS54 0324 EF17 -- MOS54 0325 EF17 -- MOS54 0326 EF17 < &0001 -- MOS54 0327 EF17 -- MOS54 0328 EF17 -- MOS54 0329 EF17 LNK MOS56 -- MOS56 0001 EF17 -- MOS56 0002 EF17 ; > MOS56 -- MOS56 0003 EF17 TTL MOS56 Keyboard management -- MOS56 0004 EF17 OPT MOS56 MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 118 MOS56 MOS56 Keyboard management MOS56 -- MOS56 0005 EF17 ;(c) 1981 ACORN Computers Limited -- MOS56 0006 EF17 ;BBC Microcomputer Machine Operating System (MOS) -- MOS56 0007 EF17 ;Change record: -- MOS56 0008 EF17 ;202 01-May-82 PB Programmable TAB key -- MOS56 0009 EF17 ;.05 16-Nov-81 PB Fix CTRL/SHIFT matrix h/w problem -- MOS56 0010 EF17 ;100 04-Sep-81 PB Remove SHIFT and CTRL debounce -- MOS56 0011 EF17 ;Author(s): -- MOS56 0012 EF17 ;PB Paul Bond -- MOS56 0013 EF17 ;MP Mike Prees -- MOS56 0014 EF17 ; STATUS BYTE USES (KSTAT) -- MOS56 0015 EF17 ; N.B. status byte is NEVER zero -- MOS56 0016 EF17 ; (CAPITALS and SHIFT lock never concurrent) -- MOS56 0017 EF17 ; BIT 0 not used -- MOS56 0018 EF17 ; BIT 1 not used -- MOS56 0019 EF17 ; BIT 2 not used -- MOS56 0020 EF17 ; BIT 3 SHIFT -- MOS56 0021 EF17 ; BIT 4 not CAPITALS lock -- MOS56 0022 EF17 ; BIT 5 not SHIFT lock -- MOS56 0023 EF17 ; BIT 6 CTRL -- MOS56 0024 EF17 ; BIT 7 shift enable (only meaningful if a lock is active) -- MOS56 0025 EF17 ; SEQUENCE OF EVENTS :- -- MOS56 0026 EF17 ; 1. CHECK SHIFT KEY -- MOS56 0027 EF17 ; 2. CHECK CONTROL KEY -- MOS56 0028 EF17 ; 3. PROCESS CURRENT KEY -- MOS56 0029 EF17 ; 4. PROCESS OLD KEY -- MOS56 0030 EF17 ; 5. SCAN KEYS IF REQ'D -- MOS56 0031 EF17 ; 6. ENABLE CA2 IF REQ'D -- MOS56 0032 EF17 -- MOS56 0033 EF17 -- MOS56 0034 EF17 KBDAW -- MOS56 0035 EF17 A2 FF LDXIM &FF ;prepare to enable keyboard timer interrupts -- MOS56 0036 EF19 ; -- MOS56 0037 EF19 ; IF ALL KEYS UP & FORGOTTEN, RESTORE INTERRUPTS -- MOS56 0038 EF19 ; -- MOS56 0039 EF19 A5 EC LDA CKEY -- MOS56 0040 EF1B 05 ED ORA OKEY -- MOS56 0041 EF1D D0 06 BNE KBDISX ;[at least one active key, so keep keyboard interrupt disabled] MOS56 0041 EF1D v79 MOS56 0042 EF1F ; MOS56 0041 EF1D v79 MOS56 0043 EF1F ; enable keyboard interrupt MOS56 0041 EF1D v79 MOS56 0044 EF1F ; MOS56 0041 EF1D v79 MOS56 0045 EF1F A9 81 LDAIM &81 MOS56 0041 EF1D v79 MOS56 0046 EF21 8D 4E FE STA IERQ MOS56 0041 EF1D v79 MOS56 0047 EF24 E8 INX ;X:=0, disable keyboard timer interrupts MOS56 0041 EF1D v79 MOS56 0048 EF25 ; MOS56 0041 EF1D v79 MOS56 0049 EF25 KBDISX MOS56 0041 EF1D v79 MOS56 0050 EF25 8E 42 02 STX KSEMA ;set keyboard timer interrupt control flag -- MOS56 0051 EF28 ; $00 => disabled, $FF => enabled -- MOS56 0052 EF28 ; -- MOS56 0053 EF28 KBDIS -- MOS56 0054 EF28 08 PHP MOS56 0127 EF6B ^3B MOS56 0055 EF29 ; disable keyboard, coping with CAPITALS & SHIFT lock LEDs MOS56 0127 EF6B ^3B MOS56 0056 EF29 AD 5A 02 LDA KSTAT MOS56 0127 EF6B ^3B MOS56 0057 EF2C ; isolate CAPITALS lock and SHIFT lock states MOS56 0127 EF6B ^3B MOS56 0058 EF2C 4A LSRA MOS56 0127 EF6B ^3B MOS56 0059 EF2D 29 18 ANDIM &18 MOS56 0127 EF6B ^3B MOS56 0060 EF2F ; update LED1 (CAPITALS lock) MOS56 0127 EF6B ^3B MOS56 0061 EF2F 09 06 ORAIM &06 ;use addressable latch output 6 MOS56 0127 EF6B ^3B MOS56 0062 EF31 8D 40 FE STA PBQ ;store LED1 MOS56 0127 EF6B ^3B MOS56 0063 EF34 ; update LED2 (SHIFT lock) MOS56 0127 EF6B ^3B MOS56 0064 EF34 4A LSRA ;move state into bit3 MOS56 0127 EF6B ^3B MOS56 0065 EF35 09 07 ORAIM &07 ;use addressable latch output 7 MOS56 0127 EF6B ^3B MOS56 0066 EF37 8D 40 FE STA PBQ ;store LED2 MOS56 0127 EF6B ^3B MOS56 0067 EF3A ; MOS56 0127 EF6B ^3B MOS56 0068 EF3A [ TRUE=0 MOS56 0127 EF6B ^3B MOS56 0069 EF3A 20 3D F1 JSR KALLOX MOS56 0127 EF6B ^3B MOS56 0070 EF3D | MOS56 0127 EF6B ^3B MOS56 0073 EF3D ] MOS56 0127 EF6B ^3B MOS56 0074 EF3D ; MOS56 0127 EF6B ^3B MOS56 0075 EF3D 68 PLA MOS56 0127 EF6B ^3B MOS56 0076 EF3E 60 RTS MOS56 0127 EF6B ^3B MOS56 0077 EF3F MOS56 0127 EF6B ^3B MOS56 0078 EF3F DEFKEY ;keyboard control effect MOS56 0127 EF6B ^3B MOS56 0079 EF3F ; MOS56 0127 EF6B ^3B MOS56 0080 EF3F ; entered with: MOS56 0127 EF6B ^3B MOS56 0081 EF3F ; C=0, V=0 => SHIFT/CTRL test MOS56 0127 EF6B ^3B MOS56 0082 EF3F ; C=1, V=0 => keyboard scan MOS56 0127 EF6B ^3B MOS56 0083 EF3F ; C=0, V=1 => keyboard interrupt MOS56 0127 EF6B ^3B MOS56 0084 EF3F ; C=1, V=1 => timer interrupt MOS56 0127 EF6B ^3B MOS56 0085 EF3F ; MOS56 0127 EF6B ^3B MOS56 0086 EF3F ; route keyboard entry reason MOS56 0127 EF6B ^3B MOS56 0087 EF3F ; MOS56 0127 EF6B ^3B MOS56 0088 EF3F 50 0A BVC KEYV0 ;[V=0] MOS56 0127 EF6B ^3B MOS56 0089 EF41 ; MOS56 0127 EF6B ^3B MOS56 0090 EF41 A9 01 LDAIM &01 MOS56 0127 EF6B ^3B MOS56 0091 EF43 8D 4E FE STA IERQ MOS56 0127 EF6B ^3B MOS56 0092 EF46 ; MOS56 0127 EF6B ^3B MOS56 0093 EF46 B0 08 BCS KYBD ;[timer interrupt entry] MOS56 0127 EF6B ^3B MOS56 0094 EF48 4C 42 F0 JMP KBDAT ;[keyboard interrupt] MOS56 0127 EF6B ^3B MOS56 0095 EF4B ; MOS56 0127 EF6B ^3B MOS56 0096 EF4B KEYV0 MOS56 0127 EF6B ^3B MOS56 0097 EF4B 90 06 BCC TSHIFT ;[SHIFT/CTRL test] MOS56 0127 EF6B ^3B MOS56 0098 EF4D 4C E0 F0 JMP SKFMA ;C=1, scan keyboard MOS56 0127 EF6B ^3B MOS56 0099 EF50 MOS56 0127 EF6B ^3B MOS56 0100 EF50 KYBD ;C=1 MOS56 0127 EF6B ^3B MOS56 0101 EF50 ; entered when key(s) active AND timer interrupt MOS56 0127 EF6B ^3B MOS56 0102 EF50 ; MOS56 0127 EF6B ^3B MOS56 0103 EF50 ; ensure no more keyboard timer interrupts MOS56 0127 EF6B ^3B MOS56 0104 EF50 EE 42 02 INC KSEMA ;KSEMA := 0 MOS56 0127 EF6B ^3B MOS56 0105 EF53 ; MOS56 0127 EF6B ^3B MOS56 0106 EF53 TSHIFT ;C=0 MOS56 0127 EF6B ^3B MOS56 0107 EF53 ; entry point used by test shift routine (uses C=1) MOS56 0127 EF6B ^3B MOS56 0108 EF53 ; clear SHIFT and CTRL status MOS56 0127 EF6B ^3B MOS56 0109 EF53 AD 5A 02 LDA KSTAT MOS56 0127 EF6B ^3B MOS56 0110 EF56 29 B7 ANDIM CTLSHI ;N.B. A will accumulate new state MOS56 0127 EF6B ^3B MOS56 0111 EF58 ; set SHIFT key status MOS56 0127 EF6B ^3B MOS56 0112 EF58 A2 00 LDXIM ZERO ;N.B. SHIFT key is at matrix entry 0 MOS56 0127 EF6B ^3B MOS56 0113 EF5A 20 5D F0 JSR KC ;get state of SHIFT key MOS56 0127 EF6B ^3B MOS56 0114 EF5D ; N.B. C not corrupted MOS56 0127 EF6B ^3B MOS56 0115 EF5D 86 FA STX KTEMP ;save state of SHIFT key for SHIFT/CAPS invert feature MOS56 0127 EF6B ^3B MOS56 0116 EF5F ; KTEMP = 1xxx xxxx => SHIFT MOS56 0127 EF6B ^3B MOS56 0117 EF5F ; KTEMP = 0xxx xxxx => no SHIFT MOS56 0127 EF6B ^3B MOS56 0118 EF5F B8 CLV MOS56 0127 EF6B ^3B MOS56 0119 EF60 10 05 BPL KYBD1 ;[SHIFT key not active] MOS56 0127 EF6B ^3B MOS56 0120 EF62 ; shift key active and within timer interrupt routine MOS56 0127 EF6B ^3B MOS56 0121 EF62 2C 55 D9 BIT FFBYT MOS56 0127 EF6B ^3B MOS56 0122 EF65 09 08 ORAIM SHFT MOS56 0127 EF6B ^3B MOS56 0123 EF67 KYBD1 MOS56 0127 EF6B ^3B MOS56 0124 EF67 ; set CTRL key status MOS56 0127 EF6B ^3B MOS56 0125 EF67 E8 INX ;X := 1, N.B. CTRL key is at matrix entry 1 MOS56 0127 EF6B ^3B MOS56 0126 EF68 20 5D F0 JSR KC ;get state of CTRL key MOS56 0127 EF6B ^3B MOS56 0127 EF6B 90 BB BCC KBDIS ;[testing CTRL and SHIFT, MI=>CTRL, V=>SHIFT] MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 119 MOS56 MOS56 Keyboard management MOS56 -- MOS56 0128 EF6D 10 02 BPL KYBD2 ;[CTRL key not active] MOS56 0128 EF6D v7D MOS56 0129 EF6F ; CTRL key active MOS56 0128 EF6D v7D MOS56 0130 EF6F 09 40 ORAIM CTRL MOS56 0128 EF6D v7D MOS56 0131 EF71 KYBD2 ;A has accumulated new keyboard status MOS56 0128 EF6D v7D MOS56 0132 EF71 8D 5A 02 STA KSTAT ;update keyboard status -- MOS56 0133 EF74 ; evaluate status of the current key -- MOS56 0134 EF74 ; IF IT IS & WAS OPEN, THEN FORGET IT -- MOS56 0135 EF74 ; IF OPEN & WAS CLOSED, MARK AS OPEN -- MOS56 0136 EF74 ; IF CLOSED & WAS OPEN, MARK AS CLOSED -- MOS56 0137 EF74 ; IF CLOSED & WAS CLOSED, THEN DECREMENT -- MOS56 0138 EF74 ; AUTO-REPEAT COUNTER. IF THIS GOES TO -- MOS56 0139 EF74 ; ZERO (IT STARTS AT 1 INITIALLY) THEN -- MOS56 0140 EF74 ; TRANSMIT CHARACTER TO RDCH BUFFER -- MOS56 0141 EF74 ; (UNLESS IT IS SHF LOCK OR CAPS LOCK) -- MOS56 0142 EF74 ; IF AUTO REPEAT PERMANENTLY DISABLED -- MOS56 0143 EF74 ; THEN DON'T RESET THIS COUNTER. -- MOS56 0144 EF74 A6 EC LDX CKEY -- MOS56 0145 EF76 F0 12 BEQ KBDWU ;[no current key] MOS56 0145 EF76 v6D MOS56 0146 EF78 ; current key exists MOS56 0145 EF76 v6D MOS56 0147 EF78 20 5D F0 JSR KC ;get status of current key MOS56 0145 EF76 v6D MOS56 0148 EF7B 30 10 BMI KBDX ;[current key closed] MOS56 0145 EF76 v6D MOS56 0149 EF7D ; current key open MOS56 0145 EF76 v6D MOS56 0150 EF7D E4 EC CPX CKEY MOS56 0145 EF76 v6D MOS56 0151 EF7F KBDW MOS56 0145 EF76 v6D MOS56 0152 EF7F 86 EC STX CKEY ;update open/closed state of current key MOS56 0145 EF76 v6D MOS56 0153 EF81 D0 07 BNE KBDWU ;[current key: is open was closed, or is closed was open] MOS56 0145 EF76 v6D MOS56 0154 EF83 ; CURRENT KEY HAS BEEN OPEN FOR TWO CLOCK MOS56 0145 EF76 v6D MOS56 0155 EF83 ; CYCLES, SO 'FORGET' IT BY ZEROING CKEY MOS56 0145 EF76 v6D MOS56 0156 EF83 ; (KEY VALUES START AT 16 IN THIS RTNE) MOS56 0145 EF76 v6D MOS56 0157 EF83 ; ALSO SET COUNTER TO 1 MOS56 0145 EF76 v6D MOS56 0158 EF83 ; indicate no current key MOS56 0145 EF76 v6D MOS56 0159 EF83 A2 00 LDXIM ZERO MOS56 0145 EF76 v6D MOS56 0160 EF85 86 EC STX CKEY MOS56 0145 EF76 v6D MOS56 0161 EF87 FCSP ;fix to CTRL/SHIFT h/w problem MOS56 0145 EF76 v6D MOS56 0162 EF87 20 52 F0 JSR AR ;update auto-repeat intervals MOS56 0267 EFDF ^26 MOS56 0163 EF8A KBDWU MOS56 0267 EFDF ^26 MOS56 0164 EF8A 4C 1C F0 JMP KBDY MOS56 0267 EFDF ^26 MOS56 0165 EF8D KBDX ;current KEY IS CLOSED:IF WAS OPEN,SIMPLY MOS56 0267 EFDF ^26 MOS56 0166 EF8D ; UPDATE STATUS,ELSE CHECK COUNTER MOS56 0267 EFDF ^26 MOS56 0167 EF8D ; AND PROCESS CHAR IF REQ'D. MOS56 0267 EFDF ^26 MOS56 0168 EF8D E4 EC CPX CKEY MOS56 0267 EFDF ^26 MOS56 0169 EF8F D0 EE BNE KBDW ;[current key: is closed, was open] MOS56 0267 EFDF ^26 MOS56 0170 EF91 ; current key is closed and was closed MOS56 0267 EFDF ^26 MOS56 0171 EF91 A5 E7 LDA ARCTR MOS56 0267 EFDF ^26 MOS56 0172 EF93 F0 23 BEQ KBDXS ;[auto-repeat suppressed] MOS56 0267 EFDF ^26 MOS56 0173 EF95 ; decrement auto-repeat countdown MOS56 0267 EFDF ^26 MOS56 0174 EF95 C6 E7 DEC ARCTR MOS56 0267 EFDF ^26 MOS56 0175 EF97 D0 1F BNE KBDXS ;[auto-repeat interval not exhausted] MOS56 0267 EFDF ^26 MOS56 0176 EF99 ; auto-repeat interval exhausted MOS56 0267 EFDF ^26 MOS56 0177 EF99 ; auto-repeat countdown := delay/repeat period MOS56 0267 EFDF ^26 MOS56 0178 EF99 AD CA 02 LDA FARCTR MOS56 0267 EFDF ^26 MOS56 0179 EF9C 85 E7 STA ARCTR MOS56 0267 EFDF ^26 MOS56 0180 EF9E ; next auto-repeat interval := repeat period MOS56 0267 EFDF ^26 MOS56 0181 EF9E AD 55 02 LDA ARSET MOS56 0267 EFDF ^26 MOS56 0182 EFA1 8D CA 02 STA FARCTR MOS56 0267 EFDF ^26 MOS56 0183 EFA4 ; MOS56 0267 EFDF ^26 MOS56 0184 EFA4 AD 5A 02 LDA KSTAT MOS56 0267 EFDF ^26 MOS56 0185 EFA7 ; test for shift lock key MOS56 0267 EFDF ^26 MOS56 0186 EFA7 A6 EC LDX CKEY MOS56 0267 EFDF ^26 MOS56 0187 EFA9 E0 D0 CPXIM SHLKKY ;IS THIS THE SHIFT LOCK? MOS56 0267 EFDF ^26 MOS56 0188 EFAB D0 0D BNE KCPLK ;[key is not SHIFT lock] MOS56 0267 EFDF ^26 MOS56 0189 EFAD ; MOS56 0267 EFDF ^26 MOS56 0190 EFAD ; SHIFT LOCK key processing MOS56 0267 EFDF ^26 MOS56 0191 EFAD 09 90 ORAIM CAPSL+INVERT ;clear CAPITALS lock state MOS56 0267 EFDF ^26 MOS56 0192 EFAF 49 A0 EORIM SHFTL+INVERT ;flip SHIFT lock state and clear invert MOS56 0267 EFDF ^26 MOS56 0193 EFB1 KEYBD3 ;update keyboard status MOS56 0267 EFDF ^26 MOS56 0194 EFB1 8D 5A 02 STA KSTAT ;store SHIFT lock state MOS56 0267 EFDF ^26 MOS56 0195 EFB4 ; suppress auto-repeat MOS56 0267 EFDF ^26 MOS56 0196 EFB4 A9 00 LDAIM ZERO MOS56 0267 EFDF ^26 MOS56 0197 EFB6 85 E7 STA ARCTR MOS56 0267 EFDF ^26 MOS56 0198 EFB8 KBDXS MOS56 0267 EFDF ^26 MOS56 0199 EFB8 [ MOS125 = &FF MOS56 0267 EFDF ^26 MOS56 0201 EFB8 | MOS56 0267 EFDF ^26 MOS56 0202 EFB8 B0 62 BCS KBDY ;always branch MOS56 0202 EFB8 v1D MOS56 0203 EFBA ] MOS56 0202 EFB8 v1D MOS56 0204 EFBA MOS56 0202 EFB8 v1D MOS56 0205 EFBA KCPLK ;CAPS key processing MOS56 0202 EFB8 v1D MOS56 0206 EFBA E0 C0 CPXIM CPLKKY MOS56 0202 EFB8 v1D MOS56 0207 EFBC D0 0E BNE KCPLK1 ;[not CAPITALS lock] MOS56 0202 EFB8 v1D MOS56 0208 EFBE ; clear SHIFT lock state MOS56 0202 EFB8 v1D MOS56 0209 EFBE 09 A0 ORAIM SHFTL+INVERT MOS56 0202 EFB8 v1D MOS56 0210 EFC0 ; add in SHIFT invert status MOS56 0202 EFB8 v1D MOS56 0211 EFC0 24 FA BIT KTEMP MOS56 0202 EFB8 v1D MOS56 0212 EFC2 10 04 BPL KCPLK2 ;[not SHIFT/CAPS] MOS56 0202 EFB8 v1D MOS56 0213 EFC4 ; SHIFT/CAPS - force CAPS invert MOS56 0202 EFB8 v1D MOS56 0214 EFC4 09 10 ORAIM CAPSL MOS56 0202 EFB8 v1D MOS56 0215 EFC6 49 80 EORIM INVERT MOS56 0202 EFB8 v1D MOS56 0216 EFC8 KCPLK2 MOS56 0202 EFB8 v1D MOS56 0217 EFC8 ; flip CAPITALS lock state MOS56 0202 EFB8 v1D MOS56 0218 EFC8 49 90 EORIM CAPSL+INVERT MOS56 0202 EFB8 v1D MOS56 0219 EFCA ; set CAPITALS lock state and disable auto-repeat MOS56 0202 EFB8 v1D MOS56 0220 EFCA [ MOS125 = &FF MOS56 0202 EFB8 v1D MOS56 0222 EFCA | MOS56 0202 EFB8 v1D MOS56 0223 EFCA B0 E5 BCS KEYBD3 ;C=1 from CPXIM MOS56 0202 EFB8 v1D MOS56 0224 EFCC ] MOS56 0202 EFB8 v1D MOS56 0225 EFCC MOS56 0202 EFB8 v1D MOS56 0226 EFCC KCPLK1 MOS56 0202 EFB8 v1D MOS56 0227 EFCC ; AT THIS POINT, WE HAVE A CHARACTER FOR RDCH MOS56 0202 EFB8 v1D MOS56 0228 EFCC ; NOW LOOK UP CODE AND MODIFY BY SHIFT MOS56 0202 EFB8 v1D MOS56 0229 EFCC ; CONTROL OR CAPS LOCK AS APPROPRIATE MOS56 0202 EFB8 v1D MOS56 0230 EFCC ; convert current key code to ASCII MOS56 0202 EFB8 v1D MOS56 0231 EFCC BD DE EF LDAAX KTBL -&80 MOS56 0202 EFB8 v1D MOS56 0232 EFCF D0 03 BNE NTAB ;[not TAB key] MOS56 0202 EFB8 v1D MOS56 0233 EFD1 ; TAB key MOS56 0202 EFB8 v1D MOS56 0234 EFD1 AD 6B 02 LDA TABCOD MOS56 0202 EFB8 v1D MOS56 0235 EFD4 NTAB MOS56 0202 EFB8 v1D MOS56 0236 EFD4 MOS56 0202 EFB8 v1D MOS56 0237 EFD4 [ FALSE=0 MOS56 0202 EFB8 v1D MOS56 0256 EFD4 ] MOS56 0202 EFB8 v1D MOS56 0257 EFD4 MOS56 0202 EFB8 v1D MOS56 0258 EFD4 ; setup for KSTAT tests MOS56 0202 EFB8 v1D MOS56 0259 EFD4 AE 5A 02 LDX KSTAT MOS56 0202 EFB8 v1D MOS56 0260 EFD7 86 FA STX KTEMP MOS56 0202 EFB8 v1D MOS56 0261 EFD9 ; check for CTRL MOS56 0202 EFB8 v1D MOS56 0262 EFD9 26 FA ROL KTEMP MOS56 0202 EFB8 v1D MOS56 0263 EFDB 10 07 BPL KCONV6 ;[no CTRL] MOS56 0202 EFB8 v1D MOS56 0264 EFDD ; cannot support two-key rollover with CTRL (h/w constraint) MOS56 0202 EFB8 v1D MOS56 0265 EFDD A6 ED LDX OKEY MOS56 0202 EFB8 v1D MOS56 0266 EFDF FCSP1 ;chained branch MOS56 0202 EFB8 v1D MOS56 0267 EFDF D0 A6 BNE FCSP ;[at least two keys pressed] MOS56 0202 EFB8 v1D MOS56 0268 EFE1 ; convert character to associated control character MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 120 MOS56 MOS56 Keyboard management MOS56 MOS56 0202 EFB8 v1D MOS56 0269 EFE1 20 3E EB JSR CTRLCH MOS56 0202 EFB8 v1D MOS56 0270 EFE4 KCONV6 MOS56 0202 EFB8 v1D MOS56 0271 EFE4 ; check for SHIFT lock MOS56 0202 EFB8 v1D MOS56 0272 EFE4 [ MOS125 = &FF MOS56 0202 EFB8 v1D MOS56 0290 EFE4 | MOS56 0202 EFB8 v1D MOS56 0291 EFE4 26 FA ROL KTEMP MOS56 0202 EFB8 v1D MOS56 0292 EFE6 26 FA ROL KTEMP ;skip over CAPITALS lock state MOS56 0202 EFB8 v1D MOS56 0293 EFE8 90 07 BCC KCONV4 ;[SHIFT lock] MOS56 0202 EFB8 v1D MOS56 0294 EFEA ; check for CAPS lock MOS56 0202 EFB8 v1D MOS56 0295 EFEA 30 0D BMI KCONV2 ;[no CAPS lock or SHIFT lock] MOS56 0202 EFB8 v1D MOS56 0296 EFEC ; convert character to upper case MOS56 0202 EFB8 v1D MOS56 0297 EFEC ; check for character in the range 'A' to 'Z' or 'a' to 'z' MOS56 0202 EFB8 v1D MOS56 0298 EFEC 20 9D E5 JSR CAPS MOS56 0202 EFB8 v1D MOS56 0299 EFEF B0 08 BCS KCONV2 ;[not alpha] MOS56 0202 EFB8 v1D MOS56 0300 EFF1 ; character is an alpha MOS56 0202 EFB8 v1D MOS56 0301 EFF1 KCONV4 MOS56 0202 EFB8 v1D MOS56 0302 EFF1 20 1B EB JSR SHIFT ;invert case of alpha MOS56 0202 EFB8 v1D MOS56 0303 EFF4 ] MOS56 0202 EFB8 v1D MOS56 0304 EFF4 ; check for shift disabled MOS56 0202 EFB8 v1D MOS56 0305 EFF4 AE 5A 02 LDX KSTAT MOS56 0202 EFB8 v1D MOS56 0306 EFF7 10 0B BPL KCONV1 ;[shift disabled] MOS56 0202 EFB8 v1D MOS56 0307 EFF9 KCONV2 ;check for SHIFT MOS56 0202 EFB8 v1D MOS56 0308 EFF9 26 FA ROL KTEMP MOS56 0202 EFB8 v1D MOS56 0309 EFFB 10 07 BPL KCONV1 ;[no SHIFT] MOS56 0202 EFB8 v1D MOS56 0310 EFFD ; cannot support two-key rollover with SHIFT (h/w constraint) MOS56 0202 EFB8 v1D MOS56 0311 EFFD A6 ED LDX OKEY MOS56 0202 EFB8 v1D MOS56 0312 EFFF D0 DE BNE FCSP1 ;[at least two keys pressed] MOS56 0202 EFB8 v1D MOS56 0313 F001 ; shift character MOS56 0202 EFB8 v1D MOS56 0314 F001 20 1B EB JSR SHIFT MOS56 0202 EFB8 v1D MOS56 0315 F004 KCONV1 MOS56 0202 EFB8 v1D MOS56 0316 F004 ; MOS56 0202 EFB8 v1D MOS56 0317 F004 ; check for interrupt character MOS56 0202 EFB8 v1D MOS56 0318 F004 ; MOS56 0202 EFB8 v1D MOS56 0319 F004 CD 6C 02 CMP INTCH MOS56 0202 EFB8 v1D MOS56 0320 F007 D0 07 BNE KESC1 ;[not interrupt character] MOS56 0202 EFB8 v1D MOS56 0321 F009 AE 75 02 LDX ESCHAR MOS56 0202 EFB8 v1D MOS56 0322 F00C D0 02 BNE KESC1 ;[treat as normal character] MOS56 0202 EFB8 v1D MOS56 0323 F00E ; MOS56 0202 EFB8 v1D MOS56 0324 F00E ; X=0, Z=1 MOS56 0202 EFB8 v1D MOS56 0325 F00E ; MOS56 0202 EFB8 v1D MOS56 0326 F00E 86 E7 STX ARCTR ;suppress auto-repeat for escape if escape condition enabled MOS56 0202 EFB8 v1D MOS56 0327 F010 KESC1 MOS56 0202 EFB8 v1D MOS56 0328 F010 ; MOS56 0202 EFB8 v1D MOS56 0329 F010 ; allow interrupts MOS56 0202 EFB8 v1D MOS56 0330 F010 ; MOS56 0202 EFB8 v1D MOS56 0331 F010 A8 TAY ;Y := character (will be passed to RDCHS) MOS56 0202 EFB8 v1D MOS56 0332 F011 20 38 F1 JSR KALLOW MOS56 0202 EFB8 v1D MOS56 0333 F014 ; MOS56 0202 EFB8 v1D MOS56 0334 F014 ; insert character into RDCH buffer MOS56 0202 EFB8 v1D MOS56 0335 F014 ; MOS56 0202 EFB8 v1D MOS56 0336 F014 AD 59 02 LDA NETKDS MOS56 0202 EFB8 v1D MOS56 0337 F017 D0 03 BNE KBDY ;[keyboard disabled] MOS56 0202 EFB8 v1D MOS56 0338 F019 20 A5 E1 JSR RDCHS MOS56 0202 EFB8 v1D MOS56 0339 F01C ; MOS56 0202 EFB8 v1D MOS56 0340 F01C KBDY ; NOW WE EVALUATE THE OLD KEY STATUS. MOS56 0202 EFB8 v1D MOS56 0341 F01C ; IF OPEN FOR 2 CLOCK CYCLES, FORGET IT MOS56 0202 EFB8 v1D MOS56 0342 F01C ; OTHERWISE, SIMPLY MEMORISE IT! MOS56 0202 EFB8 v1D MOS56 0343 F01C A6 ED LDX OKEY -- MOS56 0344 F01E F0 0B BEQ KBDA ;[old key does not exist] MOS56 0344 F01E v74 MOS56 0345 F020 ; MOS56 0344 F01E v74 MOS56 0346 F020 ; old key exists MOS56 0344 F01E v74 MOS56 0347 F020 20 5D F0 JSR KC MOS56 0344 F01E v74 MOS56 0348 F023 86 ED STX OKEY ;remember old key state MOS56 0344 F01E v74 MOS56 0349 F025 30 04 BMI KBDA ;[old key closed] MOS56 0344 F01E v74 MOS56 0350 F027 ; MOS56 0344 F01E v74 MOS56 0351 F027 ; old key open MOS56 0344 F01E v74 MOS56 0352 F027 [ FALSE=0 MOS56 0344 F01E v74 MOS56 0356 F027 ] MOS56 0344 F01E v74 MOS56 0357 F027 ; MOS56 0344 F01E v74 MOS56 0358 F027 ; old key: is open, was open MOS56 0344 F01E v74 MOS56 0359 F027 A2 00 LDXIM ZERO MOS56 0344 F01E v74 MOS56 0360 F029 86 ED STX OKEY ;indicate no old key MOS56 0344 F01E v74 MOS56 0361 F02B KBDA ; NOW CHECK TO SEE IF A SCAN IS NEEDED. MOS56 0344 F01E v74 MOS56 0362 F02B ; IF OLD KEY ZERO, DO SCAN. IF KEY DOWN & MOS56 0344 F01E v74 MOS56 0363 F02B ; NOT EQUAL CKEY THEN SET OLD=CURRENT, & THIS MOS56 0344 F01E v74 MOS56 0364 F02B ; ONE = CURRENT, RESET STATUS CHANGE BITS MOS56 0344 F01E v74 MOS56 0365 F02B A6 ED LDX OKEY -- MOS56 0366 F02D D0 16 BNE KBDAU ;[old key exists] MOS56 0366 F02D v69 MOS56 0367 F02F ; no old key so scan keyboard MOS56 0366 F02D v69 MOS56 0368 F02F A0 EC LDYIM CKEY MOS56 0366 F02D v69 MOS56 0369 F031 20 DB F0 JSR ISCAN MOS56 0366 F02D v69 MOS56 0370 F034 30 09 BMI KBDAS ;[all keys searched] MOS56 0366 F02D v69 MOS56 0371 F036 ; closed key found other than current key MOS56 0366 F02D v69 MOS56 0372 F036 ; new current key found MOS56 0366 F02D v69 MOS56 0373 F036 ; set old key = current key MOS56 0366 F02D v69 MOS56 0374 F036 A5 EC LDA CKEY MOS56 0366 F02D v69 MOS56 0375 F038 85 ED STA OKEY MOS56 0366 F02D v69 MOS56 0376 F03A KBDAR ;set new current key MOS56 0366 F02D v69 MOS56 0377 F03A 86 EC STX CKEY ;current key := new key number MOS56 0394 F050 ^68 MOS56 0378 F03C 20 52 F0 JSR AR ;update auto-repeat intervals MOS56 0394 F050 ^68 MOS56 0379 F03F 4C 17 EF KBDAS JMP KBDAW MOS56 0394 F050 ^68 MOS56 0380 F042 KBDAT MOS56 0394 F050 ^68 MOS56 0381 F042 ; ENTRY POINT FROM ANY KEY MOS56 0394 F050 ^68 MOS56 0382 F042 ; DOWN INTERRUPT MOS56 0394 F050 ^68 MOS56 0383 F042 ; enable keyboard by scanning random key (X) MOS56 0394 F050 ^68 MOS56 0384 F042 20 5D F0 JSR KC MOS56 0394 F050 ^68 MOS56 0385 F045 KBDAU ;find new current key MOS56 0394 F050 ^68 MOS56 0386 F045 A5 EC LDA CKEY MOS56 0394 F050 ^68 MOS56 0387 F047 D0 F6 BNE KBDAS ;[current key exists, should only exist during power up] MOS56 0394 F050 ^68 MOS56 0388 F049 ; scan keyboard matrix entries MOS56 0394 F050 ^68 MOS56 0389 F049 A0 ED LDYIM OKEY MOS56 0394 F050 ^68 MOS56 0390 F04B 20 DB F0 JSR ISCAN MOS56 0394 F050 ^68 MOS56 0391 F04E 30 EF BMI KBDAS ;[processed all keys] MOS56 0394 F050 ^68 MOS56 0392 F050 ; pressed key found other than old key MOS56 0394 F050 ^68 MOS56 0393 F050 ; new current key identified MOS56 0394 F050 ^68 MOS56 0394 F050 10 E8 BPL KBDAR ;[ALWAYS JUMP] -- MOS56 0395 F052 ; NEVER fall thru -- MOS56 0396 F052 -- MOS56 0397 F052 -- MOS56 0398 F052 AR ;set auto-repeat interval to reflect next character -- MOS56 0399 F052 A2 01 LDXIM &01 -- MOS56 0400 F054 86 E7 STX ARCTR -- MOS56 0401 F056 ; set next auto-repeat interval to delay period -- MOS56 0402 F056 AE 54 02 LDX FARSET -- MOS56 0403 F059 8E CA 02 STX FARCTR -- MOS56 0404 F05C 60 RTS -- MOS56 0405 F05D -- MOS56 0406 F05D -- MOS56 0407 F05D [ FALSE=0 -- MOS56 0414 F05D ] -- MOS56 0415 F05D MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 121 MOS56 MOS56 Keyboard management MOS56 -- MOS56 0416 F05D KC -- MOS56 0417 F05D ; KEYBOARD ACCESS SUBROUTINE -- MOS56 0418 F05D ; read state of key -- MOS56 0419 F05D ; X = 0rrrcccc -- MOS56 0420 F05D ; r = row, c = column -- MOS56 0421 F05D ; N.B. A and C not corrupted -- MOS56 0422 F05D [ 1=0 ;$Tutu -- MOS56 0434 F05D | -- MOS56 0435 F05D ; enable keyboard -- MOS56 0436 F05D A0 03 LDYIM &03 -- MOS56 0437 F05F 8C 40 FE STY PBQ -- MOS56 0438 F062 ; select VIAA PA6-PA0 as outputs -- MOS56 0439 F062 A0 7F LDYIM &7F -- MOS56 0440 F064 8C 43 FE STY DDRAQ -- MOS56 0441 F067 8E 4F FE STX PAPQ ;select matrix element -- MOS56 0442 F06A AE 4F FE LDX PAPQ ;read element status: N=0 => open, N=1 => closed -- MOS56 0443 F06D 60 RTS -- MOS56 0444 F06E ] -- MOS56 0445 F06E -- MOS56 0446 F06E -- MOS56 0447 F06E -- MOS56 0448 F06E -- MOS56 0449 F06E ; KEY CONVERSION TABLE -- MOS56 0450 F06E ; ROW 0 -- MOS56 0451 F06E ; not relevant -- MOS56 0452 F06E ; (consists of SHIFT, CTRL and start-up options) -- MOS56 0453 F06E KTBL0 -- MOS56 0454 F06E F05E KTBL * KTBL0 -&10 -- MOS56 0455 F06E ; ROW 1 -- MOS56 0456 F06E 71 = "q" -- MOS56 0457 F06F 33 = "3" ;shift '#' -- MOS56 0458 F070 34 = "4" ;shift '$' -- MOS56 0459 F071 35 = "5" ;shift '%' -- MOS56 0460 F072 84 = SOFTK4 ;f4 -- MOS56 0461 F073 38 = "8" ;shift '(' -- MOS56 0462 F074 87 = SOFTK7 ;f7 -- MOS56 0463 F075 2D = "-" ;shift '=' -- MOS56 0464 F076 5E = "^" ;shift '~' -- MOS56 0465 F077 8C = CURLFT ;cursor left (fC) -- MOS56 0466 F078 -- MOS56 0467 F078 ; 'hide' 6 bytes -- MOS56 0468 F078 [ MOS125 = &FF -- MOS56 0474 F078 | -- MOS56 0475 F078 PUTCHK -- MOS56 0476 F078 -- MOS56 0477 F078 ;Output byte to cassette and add to check sum. -- MOS56 0478 F078 -- MOS56 0479 F078 20 C7 F8 JSR PUTCAS -- MOS56 0480 F07B 4C 02 F8 JMP ADDCRC -- MOS56 0481 F07E ] -- MOS56 0482 F07E -- MOS56 0483 F07E ; ROW 2 -- MOS56 0484 F07E 80 = SOFTK0 ;f0 -- MOS56 0485 F07F 77 = "w" -- MOS56 0486 F080 65 = "e" -- MOS56 0487 F081 74 = "t" -- MOS56 0488 F082 37 = "7" ;shift single quote -- MOS56 0489 F083 69 = "i" -- MOS56 0490 F084 39 = "9" ;shift ')' -- MOS56 0491 F085 30 = "0" ;same shifted -- MOS56 0492 F086 POUNDM -- MOS56 0493 F086 5F = "_" ;shift POUND -- MOS56 0494 F087 8E = CURDWN ;cursor down (fE) -- MOS56 0495 F088 -- MOS56 0496 F088 ; 'hide' 6 bytes -- MOS56 0497 F088 6C FE FD JMITST JMI TSTSFT -- MOS56 0498 F08B 6C FA 00 JMI JMI JMILO ;jump to specific OSBYTE routine, C=1 -- MOS56 0499 F08E -- MOS56 0500 F08E ; ROW 3 -- MOS56 0501 F08E 31 = "1" ;shift '!' -- MOS56 0502 F08F 32 = "2" ;shift double quote -- MOS56 0503 F090 64 = "d" -- MOS56 0504 F091 72 = "r" -- MOS56 0505 F092 36 = "6" ;shift '&' -- MOS56 0506 F093 75 = "u" -- MOS56 0507 F094 6F = "o" -- MOS56 0508 F095 70 = "p" -- MOS56 0509 F096 5B = "[" ;shift curly left bracket -- MOS56 0510 F097 8F = CURUP ;cursor up (fF) -- MOS56 0511 F098 -- MOS56 0512 F098 ; 'hide' 6 bytes -- MOS56 0513 F098 2C 55 D9 JMIKYV BIT FFBYT -- MOS56 0514 F09B 6C 28 02 JMIKEY JMI KEYVEC MOS56 0663 F0DE ^3B MOS56 0515 F09E MOS56 0663 F0DE ^3B MOS56 0516 F09E ; ROW 4 MOS56 0663 F0DE ^3B MOS56 0517 F09E 01 = &01 ;CAPS lock MOS56 0663 F0DE ^3B MOS56 0518 F09F 61 = "a" MOS56 0663 F0DE ^3B MOS56 0519 F0A0 78 = "x" MOS56 0663 F0DE ^3B MOS56 0520 F0A1 66 = "f" MOS56 0663 F0DE ^3B MOS56 0521 F0A2 79 = "y" MOS56 0663 F0DE ^3B MOS56 0522 F0A3 6A = "j" MOS56 0663 F0DE ^3B MOS56 0523 F0A4 6B = "k" MOS56 0663 F0DE ^3B MOS56 0524 F0A5 40 = AT ;same shifted MOS56 0663 F0DE ^3B MOS56 0525 F0A6 3A = ":" ;shift '*' MOS56 0663 F0DE ^3B MOS56 0526 F0A7 0D = MCR ;same shifted MOS56 0663 F0DE ^3B MOS56 0527 F0A8 MOS56 0663 F0DE ^3B MOS56 0528 F0A8 [ NOSP = &00 MOS56 0663 F0DE ^3B MOS56 0538 F0A8 | MOS56 0663 F0DE ^3B MOS56 0539 F0A8 ; 'hide' 6 bytes MOS56 0663 F0DE ^3B MOS56 0540 F0A8 SENDD MOS56 0663 F0DE ^3B MOS56 0541 F0A8 00 = &00 ;inputs MOS56 0663 F0DE ^3B MOS56 0542 F0A9 FF = &FF ;outputs MOS56 0663 F0DE ^3B MOS56 0543 F0AA SENDS MOS56 0663 F0DE ^3B MOS56 0544 F0AA 01 = &01 ;read enable MOS56 0663 F0DE ^3B MOS56 0545 F0AB 02 = &02 ;write enable MOS56 0663 F0DE ^3B MOS56 0546 F0AC SENDF MOS56 0663 F0DE ^3B MOS56 0547 F0AC 09 = &09 ;read disable MOS56 0663 F0DE ^3B MOS56 0548 F0AD 0A = &0A ;write disable MOS56 0663 F0DE ^3B MOS56 0549 F0AE ] MOS56 0663 F0DE ^3B MOS56 0550 F0AE MOS56 0663 F0DE ^3B MOS56 0551 F0AE ; ROW 5 MOS56 0663 F0DE ^3B MOS56 0552 F0AE 02 = &02 ;SHIFT lock MOS56 0663 F0DE ^3B MOS56 0553 F0AF 73 = "s" MOS56 0663 F0DE ^3B MOS56 0554 F0B0 63 = "c" MOS56 0663 F0DE ^3B MOS56 0555 F0B1 67 = "g" MOS56 0663 F0DE ^3B MOS56 0556 F0B2 68 = "h" MOS56 0663 F0DE ^3B MOS56 0557 F0B3 6E = "n" MOS56 0663 F0DE ^3B MOS56 0558 F0B4 6C = "l" MOS56 0663 F0DE ^3B MOS56 0559 F0B5 3B = ";" ;shift '+' MOS56 0663 F0DE ^3B MOS56 0560 F0B6 5D = "]" ;shift curly right bracket MOS56 0663 F0DE ^3B MOS56 0561 F0B7 7F = MDEL ;same shifted MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 122 MOS56 MOS56 Keyboard management MOS56 MOS56 0663 F0DE ^3B MOS56 0562 F0B8 MOS56 0663 F0DE ^3B MOS56 0563 F0B8 ; 'hide' 6 bytes MOS56 0663 F0DE ^3B MOS56 0564 F0B8 RMLA ;read machine low memory address MOS56 0663 F0DE ^3B MOS56 0565 F0B8 AC 44 02 LDY HWM MOS56 0663 F0DE ^3B MOS56 0566 F0BB A2 00 LDXIM ZERO MOS56 0663 F0DE ^3B MOS56 0567 F0BD 60 RTS MOS56 0663 F0DE ^3B MOS56 0568 F0BE MOS56 0663 F0DE ^3B MOS56 0569 F0BE ; ROW 6 MOS56 0663 F0DE ^3B MOS56 0570 F0BE 00 = ZERO ;TAB - programmable TAB key MOS56 0663 F0DE ^3B MOS56 0571 F0BF 7A = "z" MOS56 0663 F0DE ^3B MOS56 0572 F0C0 20 = SPACE ;same shifted MOS56 0663 F0DE ^3B MOS56 0573 F0C1 76 = "v" MOS56 0663 F0DE ^3B MOS56 0574 F0C2 62 = "b" MOS56 0663 F0DE ^3B MOS56 0575 F0C3 6D = "m" MOS56 0663 F0DE ^3B MOS56 0576 F0C4 2C = "," ;shift '<' MOS56 0663 F0DE ^3B MOS56 0577 F0C5 2E = "." ;shift '>' MOS56 0663 F0DE ^3B MOS56 0578 F0C6 2F = "/" ; shift '?' MOS56 0663 F0DE ^3B MOS56 0579 F0C7 8B = MCOPY ;copy character at cursor (fB) MOS56 0663 F0DE ^3B MOS56 0580 F0C8 MOS56 0663 F0DE ^3B MOS56 0581 F0C8 ; 'hide' 6 bytes MOS56 0663 F0DE ^3B MOS56 0582 F0C8 [ MOS125 = &FF MOS56 0663 F0DE ^3B MOS56 0587 F0C8 | MOS56 0663 F0DE ^3B MOS56 0588 F0C8 OPT MOS56 0663 F0DE ^3B MOS56 0589 F0C8 0A ASLA ;lsb(A) := 0 MOS56 0663 F0DE ^3B MOS56 0590 F0C9 ;* LDAIM $00 MOS56 0663 F0DE ^3B MOS56 0591 F0C9 EOF MOS56 0663 F0DE ^3B MOS56 0592 F0C9 29 01 ANDIM &01 ;$00 => OPT, $01 => EOF MOS56 0663 F0DE ^3B MOS56 0593 F0CB 4C C6 E0 JMP JMIFSC ;[ALWAYS JUMP, present option to file system AND return] MOS56 0663 F0DE ^3B MOS56 0594 F0CE ] MOS56 0663 F0DE ^3B MOS56 0595 F0CE MOS56 0663 F0DE ^3B MOS56 0596 F0CE ; ROW 7 MOS56 0663 F0DE ^3B MOS56 0597 F0CE 1B = ESC ;same shifted MOS56 0663 F0DE ^3B MOS56 0598 F0CF 81 = SOFTK1 ;f1 MOS56 0663 F0DE ^3B MOS56 0599 F0D0 82 = SOFTK2 ;f2 MOS56 0663 F0DE ^3B MOS56 0600 F0D1 83 = SOFTK3 ;f3 MOS56 0663 F0DE ^3B MOS56 0601 F0D2 85 = SOFTK5 ;f5 MOS56 0663 F0DE ^3B MOS56 0602 F0D3 86 = SOFTK6 ;f6 MOS56 0663 F0DE ^3B MOS56 0603 F0D4 88 = SOFTK8 ;f8 MOS56 0663 F0DE ^3B MOS56 0604 F0D5 89 = SOFTK9 ;f9 MOS56 0663 F0DE ^3B MOS56 0605 F0D6 5C = "\" ;shift '|' MOS56 0663 F0DE ^3B MOS56 0606 F0D7 8D = CURRHT ;cursor right (fD) MOS56 0663 F0DE ^3B MOS56 0607 F0D8 ENDKT MOS56 0663 F0DE ^3B MOS56 0608 F0D8 MOS56 0663 F0DE ^3B MOS56 0609 F0D8 MOS56 0663 F0DE ^3B MOS56 0610 F0D8 6C 20 02 JMIEVT JMI EVTVEC ;user event MOS56 0663 F0DE ^3B MOS56 0611 F0DB MOS56 0663 F0DE ^3B MOS56 0612 F0DB MOS56 0663 F0DE ^3B MOS56 0613 F0DB [ MOS125 = &FF MOS56 0663 F0DE ^3B MOS56 0653 F0DB ] MOS56 0663 F0DE ^3B MOS56 0654 F0DB MOS56 0663 F0DE ^3B MOS56 0655 F0DB MOS56 0663 F0DE ^3B MOS56 0656 F0DB ISCAN ;scan keys from matrix address $10 MOS56 0663 F0DE ^3B MOS56 0657 F0DB 18 CLC ;ignore key addressed by Y MOS56 0663 F0DE ^3B MOS56 0658 F0DC ; MOS56 0663 F0DE ^3B MOS56 0659 F0DC XSCANA ;FX entry, scan keys from matrix address $10, C=1 (ignore no keys) MOS56 0663 F0DE ^3B MOS56 0660 F0DC A2 10 LDXIM &10 MOS56 0663 F0DE ^3B MOS56 0661 F0DE ; MOS56 0663 F0DE ^3B MOS56 0662 F0DE XSCANB ;FX entry, scan keys from matrix address X, C=1 (ignore no keys) MOS56 0663 F0DE ^3B MOS56 0663 F0DE B0 BB BCS JMIKEY ;[route FX entries thru indirection] -- MOS56 0664 F0E0 ; -- MOS56 0665 F0E0 SKFMA ;scan keys from matrix address (should have C=1) -- MOS56 0666 F0E0 ; start scan address in X -- MOS56 0667 F0E0 ; X>=0 => scan keys starting at X -- MOS56 0668 F0E0 ; X<0 => investigate key NOT(X) -- MOS56 0669 F0E0 ; -- MOS56 0670 F0E0 8A TXA -- MOS56 0671 F0E1 10 05 BPL SKFMA2 ;[scan keys] MOS56 0671 F0E1 v7A MOS56 0672 F0E3 ; C=1 MOS56 0671 F0E1 v7A MOS56 0673 F0E3 ; look at key MOS56 0671 F0E1 v7A MOS56 0674 F0E3 ; MOS56 0671 F0E1 v7A MOS56 0675 F0E3 20 5D F0 JSR KC ;result in top bit of X (N.B. does not alter C) MOS56 0671 F0E1 v7A MOS56 0676 F0E6 ; C=1 MOS56 0671 F0E1 v7A MOS56 0677 F0E6 B0 55 BCS KALLOX ;return result in A MOS56 0677 F0E6 v2A MOS56 0678 F0E8 ; MOS56 0677 F0E6 v2A MOS56 0679 F0E8 SKFMA2 MOS56 0677 F0E6 v2A MOS56 0680 F0E8 ; MOS56 0677 F0E6 v2A MOS56 0681 F0E8 08 PHP ;save request source indicator (in C) MOS56 0677 F0E6 v2A MOS56 0682 F0E9 90 02 BCC SKFMA1 ;[CKEY or OKEY entry] MOS56 0677 F0E6 v2A MOS56 0683 F0EB A0 EE LDYIM CKEY+&02 MOS56 0677 F0E6 v2A MOS56 0684 F0ED SKFMA1 MOS56 0677 F0E6 v2A MOS56 0685 F0ED ; MOS56 0677 F0E6 v2A MOS56 0686 F0ED 99 DF 01 STAAY KSCSTA-CKEY ;save scan start address MOS56 0677 F0E6 v2A MOS56 0687 F0F0 ; return MI => no keys, otherwise X = key MOS56 0677 F0E6 v2A MOS56 0688 F0F0 A2 09 LDXIM &09 MOS56 0677 F0E6 v2A MOS56 0689 F0F2 ; MOS56 0677 F0E6 v2A MOS56 0690 F0F2 ISCAN1 MOS56 0677 F0E6 v2A MOS56 0691 F0F2 ; allow interrupts MOS56 0677 F0E6 v2A MOS56 0692 F0F2 ; MOS56 0677 F0E6 v2A MOS56 0693 F0F2 20 38 F1 JSR KALLOW MOS56 0677 F0E6 v2A MOS56 0694 F0F5 ; MOS56 0677 F0E6 v2A MOS56 0695 F0F5 ; select VIAA PA6-PA0 as outputs MOS56 0677 F0E6 v2A MOS56 0696 F0F5 ; MOS56 0677 F0E6 v2A MOS56 0697 F0F5 A9 7F LDAIM &7F MOS56 0677 F0E6 v2A MOS56 0698 F0F7 8D 43 FE STA DDRAQ MOS56 0677 F0E6 v2A MOS56 0699 F0FA ; MOS56 0677 F0E6 v2A MOS56 0700 F0FA ; claim keyboard MOS56 0677 F0E6 v2A MOS56 0701 F0FA ; MOS56 0677 F0E6 v2A MOS56 0702 F0FA A9 03 LDAIM &03 MOS56 0677 F0E6 v2A MOS56 0703 F0FC 8D 40 FE STA PBQ MOS56 0677 F0E6 v2A MOS56 0704 F0FF ; MOS56 0677 F0E6 v2A MOS56 0705 F0FF ; reset keyboard interrupt line MOS56 0677 F0E6 v2A MOS56 0706 F0FF ; MOS56 0677 F0E6 v2A MOS56 0707 F0FF A9 0F LDAIM &0F ;N.B. use non-existent group which does not interrupt MOS56 0677 F0E6 v2A MOS56 0708 F101 8D 4F FE STA PAPQ MOS56 0677 F0E6 v2A MOS56 0709 F104 ; MOS56 0677 F0E6 v2A MOS56 0710 F104 ; clear latched event MOS56 0677 F0E6 v2A MOS56 0711 F104 ; MOS56 0677 F0E6 v2A MOS56 0712 F104 A9 01 LDAIM &01 MOS56 0677 F0E6 v2A MOS56 0713 F106 8D 4D FE STA IFRQ MOS56 0677 F0E6 v2A MOS56 0714 F109 ; MOS56 0677 F0E6 v2A MOS56 0715 F109 8E 4F FE STX PAPQ ;select key (force no key first time thru loop) MOS56 0677 F0E6 v2A MOS56 0716 F10C MOS56 0677 F0E6 v2A MOS56 0717 F10C 2C 4D FE BIT IFRQ ;test for latched event MOS56 0677 F0E6 v2A MOS56 0718 F10F F0 21 BEQ ISCAND ;[no group key pressed] MOS56 0677 F0E6 v2A MOS56 0719 F111 ; MOS56 0677 F0E6 v2A MOS56 0720 F111 ; key pressed in this group MOS56 0677 F0E6 v2A MOS56 0721 F111 ; MOS56 0677 F0E6 v2A MOS56 0722 F111 8A TXA ;A := key at start of group MOS56 0677 F0E6 v2A MOS56 0723 F112 ; MOS56 0677 F0E6 v2A MOS56 0724 F112 ISCANC ;scan group to find pressed key within group MOS56 0677 F0E6 v2A MOS56 0725 F112 ; check key against start scan address MOS56 MOS56 MOS56 MOS56 Acorn macro assembler Page 123 MOS56 MOS56 Keyboard management MOS56 MOS56 0677 F0E6 v2A MOS56 0726 F112 ; MOS56 0677 F0E6 v2A MOS56 0727 F112 D9 DF 01 CMPAY KSCSTA-CKEY MOS56 0677 F0E6 v2A MOS56 0728 F115 90 16 BCC ISCANE ;[ignore key] MOS56 0677 F0E6 v2A MOS56 0729 F117 ; MOS56 0677 F0E6 v2A MOS56 0730 F117 8D 4F FE STA PAPQ MOS56 0677 F0E6 v2A MOS56 0731 F11A 2C 4F FE BIT PAPQ MOS56 0677 F0E6 v2A MOS56 0732 F11D 10 0E BPL ISCANE ;[individual key not pressed] MOS56 0677 F0E6 v2A MOS56 0733 F11F ; MOS56 0677 F0E6 v2A MOS56 0734 F11F ; individual key pressed MOS56 0677 F0E6 v2A MOS56 0735 F11F ; MOS56 0677 F0E6 v2A MOS56 0736 F11F ISCANB ;key press detected at key A MOS56 0677 F0E6 v2A MOS56 0737 F11F ; MOS56 0677 F0E6 v2A MOS56 0738 F11F ; key found MOS56 0677 F0E6 v2A MOS56 0739 F11F ; MOS56 0677 F0E6 v2A MOS56 0740 F11F 28 PLP MOS56 0677 F0E6 v2A MOS56 0741 F120 08 PHP MOS56 0677 F0E6 v2A MOS56 0742 F121 B0 13 BCS ISCAN9 ;[ignore no character] MOS56 0677 F0E6 v2A MOS56 0743 F123 ; MOS56 0677 F0E6 v2A MOS56 0744 F123 48 PHA ;save key code MOS56 0677 F0E6 v2A MOS56 0745 F124 ; MOS56 0677 F0E6 v2A MOS56 0746 F124 ; check whether to ignore character MOS56 0677 F0E6 v2A MOS56 0747 F124 ; MOS56 0677 F0E6 v2A MOS56 0748 F124 59 00 00 EORAY ZERO MOS56 0677 F0E6 v2A MOS56 0749 F127 0A ASLA ;ignore top bit MOS56 0677 F0E6 v2A MOS56 0750 F128 C9 01 CMPIM &01 MOS56 0677 F0E6 v2A MOS56 0751 F12A 68 PLA ;restore key code MOS56 0677 F0E6 v2A MOS56 0752 F12B B0 09 BCS ISCAN9 ;[accept key] MOS56 0677 F0E6 v2A MOS56 0753 F12D ; MOS56 0677 F0E6 v2A MOS56 0754 F12D ; ignore key MOS56 0677 F0E6 v2A MOS56 0755 F12D ; MOS56 0677 F0E6 v2A MOS56 0756 F12D ISCANE ;ignore key MOS56 0677 F0E6 v2A MOS56 0757 F12D 18 CLC MOS56 0677 F0E6 v2A MOS56 0758 F12E 69 10 ADCIM &10 MOS56 0677 F0E6 v2A MOS56 0759 F130 10 E0 BPL ISCANC ;[step to next key within group] MOS56 0677 F0E6 v2A MOS56 0760 F132 ; MOS56 0677 F0E6 v2A MOS56 0761 F132 ; key group exhausted MOS56 0677 F0E6 v2A MOS56 0762 F132 ; MOS56 0677 F0E6 v2A MOS56 0763 F132 ISCAND ;scan within group failed MOS56 0677 F0E6 v2A MOS56 0764 F132 CA DEX MOS56 0677 F0E6 v2A MOS56 0765 F133 10 BD BPL ISCAN1 ;[try next group] MOS56 0677 F0E6 v2A MOS56 0766 F135 ; no key found, X<0 MOS56 0677 F0E6 v2A MOS56 0767 F135 8A TXA ;set up to negate effect of TAX MOS56 0677 F0E6 v2A MOS56 0768 F136 ; MOS56 0677 F0E6 v2A MOS56 0769 F136 ISCAN9 ;accept key MOS56 0677 F0E6 v2A MOS56 0770 F136 AA TAX ;X := key address MOS56 0677 F0E6 v2A MOS56 0771 F137 ; MOS56 0677 F0E6 v2A MOS56 0772 F137 28 PLP MOS56 0677 F0E6 v2A MOS56 0773 F138 ; MOS56 0677 F0E6 v2A MOS56 0774 F138 KALLOW ;release keyboard and allow interrupts MOS56 0677 F0E6 v2A MOS56 0775 F138 ; **** MUST NOT CORRUPT Y **** MOS56 0677 F0E6 v2A MOS56 0776 F138 ; release keyboard MOS56 0677 F0E6 v2A MOS56 0777 F138 ; MOS56 0677 F0E6 v2A MOS56 0778 F138 20 3D F1 JSR KALLOX ;release keyboard MOS56 0677 F0E6 v2A MOS56 0779 F13B ; MOS56 0677 F0E6 v2A MOS56 0780 F13B ; allow interrupts MOS56 0677 F0E6 v2A MOS56 0781 F13B ; MOS56 0677 F0E6 v2A MOS56 0782 F13B 58 CLI MOS56 0677 F0E6 v2A MOS56 0783 F13C 78 SEI MOS56 0677 F0E6 v2A MOS56 0784 F13D ; MOS56 0677 F0E6 v2A MOS56 0785 F13D KALLOX ;release keyboard MOS56 0677 F0E6 v2A MOS56 0786 F13D A9 0B LDAIM &0B -- MOS56 0787 F13F 8D 40 FE STA PBQ -- MOS56 0788 F142 ; -- MOS56 0789 F142 ; return result in N -- MOS56 0790 F142 ; -- MOS56 0791 F142 8A TXA ;N=1 => no new key, N=0 => new key in X -- MOS56 0792 F143 60 RTS -- MOS56 0793 F144 -- MOS56 0794 F144 -- MOS56 0795 F144 -- MOS56 0796 F144 < 3 -- MOS56 0797 F144 -- MOS56 0798 F144 LNK MOS70 -- MOS70 0001 F144 TTL C.F.S. Manifest File - MOS70 -- MOS70 0002 F144 OPT &01 -- MOS70 0003 F144 -- MOS70 0004 F144 0005 MOS70 * DEFOPT -- MOS70 0005 F144 0005 MOS72 * DEFOPT -- MOS70 0006 F144 0005 MOS74 * DEFOPT -- MOS70 0007 F144 0005 MOS76 * DEFOPT -- MOS70 0008 F144 -- MOS70 0009 F144 OPT MOS70 MOS70 MOS70 MOS70 MOS70 Acorn macro assembler Page 124 MOS70 C.F.S. Manifest File - MOS70 MOS70 -- MOS70 0010 F144 -- MOS70 0011 F144 < &0003 -- MOS70 0012 F144 > &0002 -- MOS70 0013 F144 -- MOS70 0014 F144 -- MOS70 0015 F144 ;****** C.F.S HEADER FILE ****** -- MOS70 0016 F144 -- MOS70 0017 F144 -- MOS70 0018 F144 -- MOS70 0019 F144 ;cIOBYTS * $00 ;No longer used -- MOS70 0020 F144 0000 LENSW * &00 ;Zero => LOAD modify's OSFILE block -- MOS70 0021 F144 0001 DEBUG * &01 ;zero => messages. +ve => no messages -- MOS70 0022 F144 0000 TUBESW * &00 ;Zero => tube, +ve => no tube -- MOS70 0023 F144 00FF PREMRG * &FF ;Zero => entry indirections, +ve => none -- MOS70 0024 F144 00FF GLYN * &FF ;Zero => special IBG code for -- MOS70 0025 F144 ;Glynn. +ve => as per spec. -- MOS70 0026 F144 -- MOS70 0027 F144 ;MANIFESTS -- MOS70 0028 F144 -- MOS70 0029 F144 00FE ENDBYT * &FE ;Byte after end of file (GETBYT) -- MOS70 0030 F144 -- MOS70 0031 F144 0091 FXCDRV * &0091 ;FX call number -- MOS70 0032 F144 00FF READFX * &FF -- MOS70 0033 F144 0000 WRITFX * &00 -- MOS70 0034 F144 -- MOS70 0035 F144 0001 INHAND * &0001 ;Input handle -- MOS70 0036 F144 0002 OUTHND * &0002 ;Output handle -- MOS70 0037 F144 0003 HNDS * &03 ;Both handles -- MOS70 0038 F144 00FD NOUTHD * &FD -- MOS70 0039 F144 000B FTSIZE * &000B ;File title size (incl. CR) -- MOS70 0040 F144 -- MOS70 0041 F144 ;Note that the 6850 status bytes (following) -- MOS70 0042 F144 ;have their bottom nybble modified according to -- MOS70 0043 F144 ;the setting of SPEED in the routines RXINIT and TXINIT -- MOS70 0044 F144 -- MOS70 0045 F144 0030 TXSTAT * &30 ;6850 TX status -- MOS70 0046 F144 ;TXSTAT = ~RTS lo;TXI enabled;8 bits + 1 stop -- MOS70 0047 F144 00D0 RXSTAT * &D0 -- MOS70 0048 F144 ;RXSTAT = ~RTS hi;TXI disabled;8 bits + 1 stop -- MOS70 0049 F144 -- MOS70 0050 F144 0002 TXBIT * &02 -- MOS70 0051 F144 0001 RXBIT * &01 -- MOS70 0052 F144 0004 DCDBIT * &04 -- MOS70 0053 F144 -- MOS70 0054 F144 0085 SERON * &85 ;Motor on/cass. on/RXCLK=0/TXCLK= 1,0,1 -- MOS70 0055 F144 0005 SEROFF * &05 ;As SERON but motor off -- MOS70 0056 F144 ;ERRORS -- MOS70 0057 F144 -- MOS70 0058 F144 00DF ERRBAS * &DF -- MOS70 0059 F144 -- MOS70 0060 F144 00DF CFSERD * ERRBAS -&00 ;EOF -- MOS70 0061 F144 00DE CFSERB * ERRBAS -&01 ;Channel -- MOS70 0062 F144 00DD CFSERK * ERRBAS -&02 ;Address -- MOS70 0063 F144 00DC SYNXER * ERRBAS -&03 ;Syntax -- MOS70 0064 F144 00DB CFSERF * ERRBAS -&04 ;File -- MOS70 0065 F144 00DA CFSERH * ERRBAS -&05 ;Block -- MOS70 0066 F144 00D9 CFSERI * ERRBAS -&06 ;Header -- MOS70 0067 F144 00D8 CFSERJ * ERRBAS -&07 ;Data -- MOS70 0068 F144 00D8 CFSERR * CFSERJ ;Bad tape -- MOS70 0069 F144 -- MOS70 0070 F144 00D7 SFSERR * ERRBAS -&08 ;Bad ROM -- MOS70 0071 F144 00D6 SFSER1 * ERRBAS -&09 ;File not found -- MOS70 0072 F144 -- MOS70 0073 F144 00D5 CFSERL * ERRBAS -&0A ;Locked -- MOS70 0074 F144 -- MOS70 0075 F144 -- MOS70 0076 F144 ;STATUS BYTE MASKS -- MOS70 0077 F144 -- MOS70 0078 F144 0001 INOPEN * &01 -- MOS70 0079 F144 0002 OUTOPN * &02 -- MOS70 0080 F144 0040 LSTBYT * &40 ;Last byte read (GETBYTE) -- MOS70 0081 F144 0080 EOFBIT * &80 ;Last byte +1 read (GETBYTE) -- MOS70 0082 F144 00C0 LSTEOF * &C0 ;Last byte & EOF -- MOS70 0083 F144 -- MOS70 0084 F144 00F7 NCTBIT * &F7 ;Complement of CATBIT -- MOS70 0085 F144 003F NEFBIT * &3F ;Complement of EOFBIT/lastbyte -- MOS70 0086 F144 00FE NINHND * &FE ;Complement of INHAND -- MOS70 0087 F144 003E NECBIT * &3E ;Complement of EOFBIT/lastbyte/openin bit -- MOS70 0088 F144 -- MOS70 0089 F144 -- MOS70 0090 F144 -- MOS70 0091 F144 ;MESSAGE/ERROR SELECTION MASKS -- MOS70 0092 F144 -- MOS70 0093 F144 -- MOS70 0094 F144 00CC ERRMSK * &CC ;Error bits to zero -- MOS70 0095 F144 0033 MSGMSK * &33 ;Message bits to zero -- MOS70 0096 F144 0088 MSGS1 * &88 ;Short messages -- MOS70 0097 F144 00CC MSGS2 * &CC ;Long messages -- MOS70 0098 F144 -- MOS70 0099 F144 0011 ABTBIT * &11 ;Abort set -- MOS70 0100 F144 0022 RETBIT * &22 ;Retry set -- MOS70 0101 F144 0000 IGBIT * &00 ;Both error bits off => ignore -- MOS70 0102 F144 0030 NIGBIT * &30 ;Complement of ignore bits -- MOS70 0103 F144 -- MOS70 0104 F144 00A1 DEFLT * &A1 -- MOS70 0105 F144 -- MOS70 0106 F144 ;Default is retry/messages for loaded and saved -- MOS70 0107 F144 ;files, abort/no messages for sequential files. -- MOS70 0108 F144 -- MOS70 0109 F144 -- MOS70 0110 F144 ;INFO FIELDS -- MOS70 0111 F144 -- MOS70 0112 F144 000C BKINFO * FTSIZE +&01 -- MOS70 0113 F144 000C BKLOAD * BKINFO -- MOS70 0114 F144 000C BKLDLO * BKLOAD -- MOS70 0115 F144 000D BKLDHI * BKLDLO +&01 -- MOS70 0116 F144 0010 BKEXEC * BKLOAD +&04 -- MOS70 0117 F144 0014 BKNOLO * BKEXEC +&04 -- MOS70 0118 F144 0015 BKNOHI * BKNOLO +&01 ;Block no. (lo & hi) -- MOS70 0119 F144 0016 BKSZEL * BKNOHI +&01 -- MOS70 0120 F144 0017 BKSZEH * BKSZEL +&01 -- MOS70 0121 F144 0018 BKFLAG * BKSZEH +&01 ;b7 => last block -- MOS70 0122 F144 0019 BKSPAR * BKFLAG +&01 -- MOS70 0123 F144 001D BKLAST * BKSPAR +&04 ;Length of info. -- MOS70 0124 F144 -- MOS70 0125 F144 001D BKWORKK * BKLAST -- MOS70 0126 F144 001E BKWRK1 * BKWORKK +&01 -- MOS70 0127 F144 001F BKWRK2 * BKWRK1 +&01 -- MOS70 0128 F144 -- MOS70 0129 F144 -- MOS70 0130 F144 MOS70 MOS70 MOS70 MOS70 Acorn macro assembler Page 125 MOS70 C.F.S. Manifest File - MOS70 MOS70 -- MOS70 0131 F144 -- MOS70 0132 F144 ;BLOCK FLAG MASKS -- MOS70 0133 F144 -- MOS70 0134 F144 0080 LASTBK * &80 ;NOTE - don't change, BMI and BVS etc. used -- MOS70 0135 F144 -- MOS70 0136 F144 -- MOS70 0137 F144 -- MOS70 0138 F144 ;TIMES -- MOS70 0139 F144 -- MOS70 0140 F144 0019 DEFGAP * &19 ;25/10 Secs inter block gap -- MOS70 0141 F144 0006 GAP * &06 ;SAVE/LOAD gap -- MOS70 0142 F144 -- MOS70 0143 F144 -- MOS70 0144 F144 ;BITS AND PIECES -- MOS70 0145 F144 -- MOS70 0146 F144 -- MOS70 0147 F144 -- MOS70 0148 F144 -- MOS70 0149 F144 0008 CATBIT * &08 ;Doing a CAT -- MOS70 0150 F144 0088 MONBIT * &88 ;Messages on/off -- MOS70 0151 F144 -- MOS70 0152 F144 -- MOS70 0153 F144 02EA INBSZE * CFSA ;GBYT block size (retained over FS change) -- MOS70 0154 F144 02EC BUFFLG * INBSZE +&02 ;Note BUFFLG & INBZSE must be contig. -- MOS70 0155 F144 -- MOS70 0156 F144 02ED FINBYT * CFSD ;Last byte in GETBYT buffer -- MOS70 0157 F144 -- MOS70 0158 F144 ;BUFFERS -- MOS70 0159 F144 -- MOS70 0160 F144 0A00 INBUFR * &0A00 -- MOS70 0161 F144 0900 OUTBFR * &0900 ;Sequential access I/O buffers -- MOS70 0162 F144 -- MOS70 0163 F144 ;VARS -- MOS70 0164 F144 -- MOS70 0165 F144 0380 VARSS * &0380 -- MOS70 0166 F144 0300 VARPGE * &0300 -- MOS70 0167 F144 -- MOS70 0168 F144 0380 OUTHDR * VARSS ;Header buffer for PUTBYTE -- MOS70 0169 F144 039D OUTPTR * OUTHDR +BKLAST -- MOS70 0170 F144 039E INPTR * OUTPTR +&01 -- MOS70 0171 F144 039F INLDEX * INPTR +&01 ;8 bytes load/exec for input file -- MOS70 0172 F144 03A7 INFILE * INLDEX +&08 ;GETBYTE file name -- MOS70 0173 F144 03B2 INFO * INFILE +FTSIZE ;Header buffer -- MOS70 0174 F144 03CF WORKK * INFO +BKWORKK ;Space to read CRC during RDHEAD -- MOS70 0175 F144 03D1 SEQGAP * WORKK +&02 -- MOS70 0176 F144 03D2 FILNAM * SEQGAP +&01 -- MOS70 0177 F144 03DD NEXTIN * FILNAM +FTSIZE ;Next expected block (GETBYTE) -- MOS70 0178 F144 03DF OLDFLG * NEXTIN +&02 -- MOS70 0179 F144 -- MOS70 0180 F144 03CB SRPTR * INFO +BKSPAR -- MOS70 0181 F144 -- MOS70 0182 F144 -- MOS70 0183 F144 ;CHIP LOCATIONS -- MOS70 0184 F144 -- MOS70 0185 F144 FE08 STATUS * &FE08 -- MOS70 0186 F144 FE09 PORT * &FE09 -- MOS70 0187 F144 -- MOS70 0188 F144 -- MOS70 0189 F144 -- MOS70 0190 F144 ;DOS/MOS ROUTINES & ADDRESSES -- MOS70 0191 F144 -- MOS70 0192 F144 -- MOS70 0193 F144 00FF ESCADD * &00FF ;b7 = 1 if ESCAPE occured -- MOS70 0194 F144 -- MOS70 0195 F144 -- MOS70 0196 F144 ;TUBE THINGS -- MOS70 0197 F144 -- MOS70 0198 F144 0000 TUBER * &00 ;Value in A for tube READ initialisation -- MOS70 0199 F144 0001 TUBEW * &01 ;Value in A for tube WRITE initialisation -- MOS70 0200 F144 0004 TUBEX * &04 ;Value in A for tube execute -- MOS70 0201 F144 -- MOS70 0202 F144 0080 TUBERL * &80 ;A reg. for tube RELEASE -- MOS70 0203 F144 00C0 TUBECL * &C0 ;A reg. for tube CLAIM -- MOS70 0204 F144 -- MOS70 0205 F144 002B SFSEND * "+" ;Marker for end of SERROM -- MOS70 0206 F144 -- MOS70 0207 F144 ; interface to code in MOS -- MOS70 0208 F144 ; -- MOS70 0209 F144 -- MOS70 0210 F144 -- MOS70 0211 F144 LNK MOS72 -- MOS72 0001 F144 ; FILE -> MOS72 -- MOS72 0002 F144 -- MOS72 0003 F144 [ MOS125 = &FF -- MOS72 0005 F144 ] -- MOS72 0006 F144 -- MOS72 0007 F144 TTL C.F.S. Main Routines - INIT -- MOS72 0008 F144 OPT MOS72 MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 126 MOS72 C.F.S. Main Routines - INIT MOS72 -- MOS72 0009 F144 -- MOS72 0010 F144 -- MOS72 0011 F144 [ MOS125 = &FF -- MOS72 0045 F144 | -- MOS72 0046 F144 INIT -- MOS72 0047 F144 -- MOS72 0048 F144 ;Initialises CLI and file operation -- MOS72 0049 F144 ;vectors. Motor turned OFF -- MOS72 0050 F144 -- MOS72 0051 F144 ;Z set => 300 baud => speed nybble = 6 -- MOS72 0052 F144 ;Z unset => 1200 baud => speed nybble = 5 -- MOS72 0053 F144 -- MOS72 0054 F144 ;Speed nybble is OR'd in with -- MOS72 0055 F144 ;6850 status byte during TX/RXinit -- MOS72 0056 F144 -- MOS72 0057 F144 08 PHP -- MOS72 0058 F145 A9 A1 LDAIM DEFLT -- MOS72 0059 F147 85 E3 STA OPTS ;User status = retry & msgs on -- MOS72 0060 F149 A9 19 LDAIM DEFGAP -- MOS72 0061 F14B 8D D1 03 STA SEQGAP -- MOS72 0062 F14E D0 09 BNE SOFTPT MOS72 0062 F14E v76 MOS72 0063 F150 MOS72 0062 F14E v76 MOS72 0064 F150 MOS72 0062 F14E v76 MOS72 0065 F150 CROM ;A=$8D, V=0 MOS72 0062 F14E v76 MOS72 0066 F150 TAPE ;A=$8C, V=0 MOS72 0062 F14E v76 MOS72 0067 F150 49 8C EORIM &8C MOS72 0062 F14E v76 MOS72 0068 F152 TAPE12 ;used by RESET, A=X=$00 MOS72 0062 F14E v76 MOS72 0069 F152 0A ASLA MOS72 0062 F14E v76 MOS72 0070 F153 8D 47 02 STA SROMSW ;A=0 => *TAPE, A=2 => *ROM MOS72 0062 F14E v76 MOS72 0071 F156 E0 03 CPXIM &03 ;test for *TAPE3 MOS72 0062 F14E v76 MOS72 0072 F158 08 PHP MOS72 0062 F14E v76 MOS72 0073 F159 MOS72 0062 F14E v76 MOS72 0074 F159 MOS72 0062 F14E v76 MOS72 0075 F159 ;Note CFSTAT (CFS0) set to zero by MOS free of charge MOS72 0062 F14E v76 MOS72 0076 F159 ;on hard reset MOS72 0062 F14E v76 MOS72 0077 F159 MOS72 0062 F14E v76 MOS72 0078 F159 SOFTPT ;Soft entry point (*TAPE) MOS72 0062 F14E v76 MOS72 0079 F159 ] MOS72 0062 F14E v76 MOS72 0080 F159 A9 06 LDAIM FSDIE -- MOS72 0081 F15B 20 C6 E0 JSR JMIFSC ;present command to file system -- MOS72 0082 F15E A2 06 LDXIM &06 -- MOS72 0083 F160 28 PLP -- MOS72 0084 F161 F0 01 BEQ INITON MOS72 0084 F161 v7E MOS72 0085 F163 CA DEX MOS72 0084 F161 v7E MOS72 0086 F164 86 C6 INITON STX SPEED -- MOS72 0087 F166 ; -- MOS72 0088 F166 ; initialise filing system indirection table -- MOS72 0089 F166 ; -- MOS72 0090 F166 A2 0E LDXIM &0E -- MOS72 0091 F168 BD EF D8 INITLP LDAAX CFSTAB -&01 MOS72 0094 F16F ^77 MOS72 0092 F16B 9D 11 02 STAAX FILVEC -&01 MOS72 0094 F16F ^77 MOS72 0093 F16E CA DEX MOS72 0094 F16F ^77 MOS72 0094 F16F D0 F7 BNE INITLP -- MOS72 0095 F171 86 C2 STX ITYPE ;No i'rupts pending -- MOS72 0096 F173 ; -- MOS72 0097 F173 ; inform paged ROMs of change -- MOS72 0098 F173 ; -- MOS72 0099 F173 A2 0F LDXIM SVFSIC -- MOS72 0100 F175 ; -- MOS72 0101 F175 SVOP ;issue service ROM operati -- MOS72 0102 F175 ; optype in X -- MOS72 0103 F175 A5 F4 LDA ROMID ;save current ROM id -- MOS72 0104 F177 48 PHA -- MOS72 0105 F178 8A TXA ;A = optype -- MOS72 0106 F179 ; -- MOS72 0107 F179 A2 0F LDXIM NROM-&1 -- MOS72 0108 F17B SVOP1 -- MOS72 0109 F17B [ $Tutu ; Less farting about with page 02 -- MOS72 0115 F17B | -- MOS72 0116 F17B FE A1 02 INCAX ROMS ;test MOS72 0135 F18F ^6A MOS72 0117 F17E DE A1 02 DECAX ROMS ;ROMS MOS72 0135 F18F ^6A MOS72 0118 F181 10 0B BPL SVOP2 ;[not a service ROM] MOS72 0135 F18F ^6A MOS72 0119 F183 ] MOS72 0135 F18F ^6A MOS72 0120 F183 ; found a service ROM MOS72 0135 F18F ^6A MOS72 0121 F183 [ MOS125 = &FF MOS72 0135 F18F ^6A MOS72 0124 F183 | MOS72 0135 F18F ^6A MOS72 0125 F183 20 E7 DB JSR STXROM MOS72 0135 F18F ^6A MOS72 0126 F186 ] MOS72 0135 F18F ^6A MOS72 0127 F186 ; call service routine MOS72 0135 F18F ^6A MOS72 0128 F186 20 03 80 JSR ROMSFT ;initialise service ROM MOS72 0135 F18F ^6A MOS72 0129 F189 AA TAX MOS72 0135 F18F ^6A MOS72 0130 F18A F0 05 BEQ SVOP3 ;[service claimed, do not offer to other ROMs] MOS72 0135 F18F ^6A MOS72 0131 F18C ; MOS72 0135 F18F ^6A MOS72 0132 F18C A6 F4 LDX ROMID ;restore ROM id MOS72 0135 F18F ^6A MOS72 0133 F18E SVOP2 MOS72 0135 F18F ^6A MOS72 0134 F18E CA DEX MOS72 0135 F18F ^6A MOS72 0135 F18F 10 EA BPL SVOP1 MOS72 0130 F18A v7A MOS72 0136 F191 ; X<>0 MOS72 0130 F18A v7A MOS72 0137 F191 SVOP3 ;C = return code MOS72 0130 F18A v7A MOS72 0138 F191 ; restore caller's ROMid MOS72 0130 F18A v7A MOS72 0139 F191 68 PLA -- MOS72 0140 F192 85 F4 STA ROMID -- MOS72 0141 F194 8D 30 FE STA ROM -- MOS72 0142 F197 ; restore return code -- MOS72 0143 F197 8A TXA ;A=0 => claimed, A<>0 => not claimed -- MOS72 0144 F198 60 RTS -- MOS72 0145 F199 -- MOS72 0146 F199 -- MOS72 0147 F199 TTL C.F.S. Main Routines - ARGGO -- MOS72 0148 F199 OPT &01 -- MOS72 0149 F199 -- MOS72 0150 F199 -- MOS72 0151 F199 ;Returns 1 if in 1200 baud cassette -- MOS72 0152 F199 ;2 300 -- MOS72 0153 F199 ;3 if in SERROM filing system -- MOS72 0154 F199 -- MOS72 0155 F199 ;Note SPEED is 5 if in 1200 and 6 in 300 -- MOS72 0156 F199 -- MOS72 0157 F199 -- MOS72 0158 F199 ARGGO -- MOS72 0159 F199 09 00 ORAIM 0 -- MOS72 0160 F19B D0 0D BNE INTRTS ;No action on non-zero entry condition MOS72 0160 F19B v72 MOS72 0161 F19D C0 00 CPYIM &00 MOS72 0160 F19B v72 MOS72 0162 F19F D0 09 BNE INTRTS ;If handle not zero -> don't do MOS72 0160 F19B v72 MOS72 0163 F1A1 [ MOS125 = &FF MOS72 0160 F19B v72 MOS72 0170 F1A1 | MOS72 0160 F19B v72 MOS72 0171 F1A1 A9 03 LDAIM &03 MOS72 0160 F19B v72 MOS72 0172 F1A3 2C 47 02 BIT SROMSW MOS72 0160 F19B v72 MOS72 0173 F1A6 D0 02 BNE INTRTS MOS72 0160 F19B v72 MOS72 0174 F1A8 25 C6 AND SPEED MOS72 0160 F19B v72 MOS72 0175 F1AA ] MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 127 MOS72 C.F.S. Main Routines - ARGGO MOS72 MOS72 0160 F19B v72 MOS72 0176 F1AA 60 INTRTS RTS MOS72 0215 F1AD ^7B MOS72 0177 F1AB MOS72 0215 F1AD ^7B MOS72 0178 F1AB MOS72 0215 F1AD ^7B MOS72 0179 F1AB TTL C.F.S Main Routines - FSFUNC MOS72 0215 F1AD ^7B MOS72 0180 F1AB OPT &01 MOS72 0215 F1AD ^7B MOS72 0181 F1AB MOS72 0215 F1AD ^7B MOS72 0182 F1AB [ MOS125 = &FF MOS72 0215 F1AD ^7B MOS72 0209 F1AB | MOS72 0215 F1AD ^7B MOS72 0210 F1AB FSFUNC MOS72 0215 F1AD ^7B MOS72 0211 F1AB MOS72 0215 F1AD ^7B MOS72 0212 F1AB ;File system operation entry pt. MOS72 0215 F1AD ^7B MOS72 0213 F1AB MOS72 0215 F1AD ^7B MOS72 0214 F1AB C9 07 CMPIM NOTAB MOS72 0215 F1AD ^7B MOS72 0215 F1AD B0 FB BCS INTRTS ;Check call legal otherwise, exit -- MOS72 0216 F1AF -- MOS72 0217 F1AF 86 BC STX TEMP -- MOS72 0218 F1B1 AA TAX ;Get address from table -- MOS72 0219 F1B2 BD F9 FB LDAAX JMPTAB +NOTAB -- MOS72 0220 F1B5 48 PHA ;push hi byte -- MOS72 0221 F1B6 BD F2 FB LDAAX JMPTAB -- MOS72 0222 F1B9 48 PHA ;push lo byte -- MOS72 0223 F1BA A6 BC LDX TEMP ;Restore argument -- MOS72 0224 F1BC 60 RTS ;enter routine -- MOS72 0225 F1BD ] -- MOS72 0226 F1BD -- MOS72 0227 F1BD TTL C.F.S. Main Routines - LOAD -- MOS72 0228 F1BD OPT &01 -- MOS72 0229 F1BD -- MOS72 0230 F1BD -- MOS72 0231 F1BD ;*********** -- MOS72 0232 F1BD ;* L O A D * -- MOS72 0233 F1BD ;*********** -- MOS72 0234 F1BD -- MOS72 0235 F1BD -- MOS72 0236 F1BD ;On entry A NZ => load from OSFILE -- MOS72 0237 F1BD ; A =0 => load and run -- MOS72 0238 F1BD ;Differentiating between these is necessary -- MOS72 0239 F1BD ;so that the protection bit in the flags -- MOS72 0240 F1BD ;byte can be checked. -- MOS72 0241 F1BD -- MOS72 0242 F1BD -- MOS72 0243 F1BD [ MOS125 = &FF -- MOS72 0358 F1BD ] -- MOS72 0359 F1BD -- MOS72 0360 F1BD -- MOS72 0361 F1BD -- MOS72 0362 F1BD TTL C.F.S. Main Routines - FILEGO -- MOS72 0363 F1BD OPT &01 -- MOS72 0364 F1BD -- MOS72 0365 F1BD -- MOS72 0366 F1BD GETFLN -- MOS72 0367 F1BD -- MOS72 0368 F1BD ;X/Y -> start of file name -- MOS72 0369 F1BD -- MOS72 0370 F1BD -- MOS72 0371 F1BD MOVFT -- MOS72 0372 F1BD -- MOS72 0373 F1BD ;Moves file title from ptr. pointed to by X,Y (lo,hi) -- MOS72 0374 F1BD ;to FILNAM. -- MOS72 0375 F1BD -- MOS72 0376 F1BD ; SEI -- MOS72 0377 F1BD 86 F2 STX WORK -- MOS72 0378 F1BF 84 F3 STY WORK +&01 -- MOS72 0379 F1C1 A0 00 LDYIM &00 -- MOS72 0380 F1C3 20 97 EA JSR GSINTC ;Initialise -- MOS72 0381 F1C6 A2 00 LDXIM &00 -- MOS72 0382 F1C8 20 A9 EA MOVFTL JSR GSREAD MOS72 0388 F1D5 ^71 MOS72 0383 F1CB B0 0D BCS MOVFTX MOS72 0388 F1D5 ^71 MOS72 0384 F1CD F0 08 BEQ STRERR MOS72 0388 F1D5 ^71 MOS72 0385 F1CF 9D D2 03 STAAX FILNAM MOS72 0388 F1D5 ^71 MOS72 0386 F1D2 E8 INX MOS72 0388 F1D5 ^71 MOS72 0387 F1D3 E0 0B CPXIM FTSIZE MOS72 0388 F1D5 ^71 MOS72 0388 F1D5 D0 F1 BNE MOVFTL MOS72 0383 F1CB v72 MOS72 0389 F1D7 MOS72 0383 F1CB v72 MOS72 0390 F1D7 STRNG0 MOS72 0383 F1CB v72 MOS72 0391 F1D7 4C B7 EA STRERR JMP BADSTR MOS72 0445 F214 ^41 MOS72 0392 F1DA MOS72 0445 F214 ^41 MOS72 0393 F1DA A9 00 MOVFTX LDAIM &00 MOS72 0445 F214 ^41 MOS72 0394 F1DC 9D D2 03 STAAX FILNAM MOS72 0445 F214 ^41 MOS72 0395 F1DF ; CLI MOS72 0445 F214 ^41 MOS72 0396 F1DF 60 RTS MOS72 0445 F214 ^41 MOS72 0397 F1E0 MOS72 0445 F214 ^41 MOS72 0398 F1E0 MOS72 0445 F214 ^41 MOS72 0399 F1E0 FILEGO MOS72 0445 F214 ^41 MOS72 0400 F1E0 MOS72 0445 F214 ^41 MOS72 0401 F1E0 ;Entry here from OSFILE. MOS72 0445 F214 ^41 MOS72 0402 F1E0 MOS72 0445 F214 ^41 MOS72 0403 F1E0 48 PHA ;Store load/save indication MOS72 0445 F214 ^41 MOS72 0404 F1E1 86 C8 STX GENPTR MOS72 0445 F214 ^41 MOS72 0405 F1E3 84 C9 STY GENPTR +&01 MOS72 0445 F214 ^41 MOS72 0406 F1E5 MOS72 0445 F214 ^41 MOS72 0407 F1E5 A0 00 LDYIM &00 MOS72 0445 F214 ^41 MOS72 0408 F1E7 B1 C8 LDAIY GENPTR MOS72 0445 F214 ^41 MOS72 0409 F1E9 AA TAX ;Set ptr. to file name for MOVFT MOS72 0445 F214 ^41 MOS72 0410 F1EA C8 INY MOS72 0445 F214 ^41 MOS72 0411 F1EB B1 C8 LDAIY GENPTR MOS72 0445 F214 ^41 MOS72 0412 F1ED A8 TAY MOS72 0445 F214 ^41 MOS72 0413 F1EE MOS72 0445 F214 ^41 MOS72 0414 F1EE 20 BD F1 JSR MOVFT ;File title -> FILNAM MOS72 0445 F214 ^41 MOS72 0415 F1F1 A0 02 LDYIM &02 MOS72 0445 F214 ^41 MOS72 0416 F1F3 B1 C8 FILELP LDAIY GENPTR MOS72 0445 F214 ^41 MOS72 0417 F1F5 99 BC 03 STAAY INFO +BKLOAD -&02 ;Set LOAD/EXEC address in header buffer MOS72 0445 F214 ^41 MOS72 0418 F1F8 99 AE 00 STAAY BKADDR -&02 ;Optional load address stored for LOAD MOS72 0445 F214 ^41 MOS72 0419 F1FB C8 INY MOS72 0445 F214 ^41 MOS72 0420 F1FC C0 0A CPYIM &0A ;Ten coz 2*4 + 2 initially MOS72 0445 F214 ^41 MOS72 0421 F1FE D0 F3 BNE FILELP MOS72 0445 F214 ^41 MOS72 0422 F200 MOS72 0445 F214 ^41 MOS72 0423 F200 68 PLA MOS72 0445 F214 ^41 MOS72 0424 F201 [ MOS125 = &FF MOS72 0445 F214 ^41 MOS72 0429 F201 | MOS72 0445 F214 ^41 MOS72 0430 F201 D0 5D BNE FILENE MOS72 0430 F201 v22 MOS72 0431 F203 ] MOS72 0430 F201 v22 MOS72 0432 F203 MOS72 0430 F201 v22 MOS72 0433 F203 ;Now doing save MOS72 0430 F201 v22 MOS72 0434 F203 MOS72 0430 F201 v22 MOS72 0435 F203 8D C6 03 FILEL2 STA INFO +BKNOLO ;Set block number in header MOS72 0430 F201 v22 MOS72 0436 F206 8D C7 03 STA INFO +BKNOHI ;while A is zero MOS72 0430 F201 v22 MOS72 0437 F209 B1 C8 FILEL3 LDAIY GENPTR MOS72 0430 F201 v22 MOS72 0438 F20B 99 A6 00 STAAY BKADDR -&0A ;BKADDR := data start MOS72 0430 F201 v22 MOS72 0439 F20E C8 INY ;Also sets HIADDR which MOS72 0430 F201 v22 MOS72 0440 F20F ;must be contiguous with BKADDR MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 128 MOS72 C.F.S. Main Routines - FILEGO MOS72 MOS72 0430 F201 v22 MOS72 0441 F20F C0 12 CPYIM &12 MOS72 0430 F201 v22 MOS72 0442 F211 D0 F6 BNE FILEL3 MOS72 0430 F201 v22 MOS72 0443 F213 MOS72 0430 F201 v22 MOS72 0444 F213 8A TXA ;X preserved from MOVFT MOS72 0430 F201 v22 MOS72 0445 F214 F0 C1 BEQ STRNG0 ;Drops through to SAVE if string OK MOS72 0430 F201 v22 MOS72 0446 F216 MOS72 0430 F201 v22 MOS72 0447 F216 MOS72 0430 F201 v22 MOS72 0448 F216 TTL C.F.S Main Routines - SAVE MOS72 0430 F201 v22 MOS72 0449 F216 OPT &01 MOS72 0430 F201 v22 MOS72 0450 F216 MOS72 0430 F201 v22 MOS72 0451 F216 ;*********** MOS72 0430 F201 v22 MOS72 0452 F216 ;* S A V E * MOS72 0430 F201 v22 MOS72 0453 F216 ;*********** MOS72 0430 F201 v22 MOS72 0454 F216 MOS72 0430 F201 v22 MOS72 0455 F216 MOS72 0430 F201 v22 MOS72 0456 F216 MOS72 0430 F201 v22 MOS72 0457 F216 ;Entry here from OSFILE call MOS72 0430 F201 v22 MOS72 0458 F216 MOS72 0430 F201 v22 MOS72 0459 F216 20 37 FB JSR SETDEF MOS72 0430 F201 v22 MOS72 0460 F219 MOS72 0430 F201 v22 MOS72 0461 F219 20 7D F5 JSR RECORD ;Prompt and motor ON MOS72 0430 F201 v22 MOS72 0462 F21C MOS72 0430 F201 v22 MOS72 0463 F21C [ TUBESW=0 MOS72 0430 F201 v22 MOS72 0464 F21C A9 00 LDAIM TUBER ;initialise tube for reading MOS72 0430 F201 v22 MOS72 0465 F21E 20 B0 FB JSR TBINIT MOS72 0430 F201 v22 MOS72 0466 F221 ] MOS72 0430 F201 v22 MOS72 0467 F221 MOS72 0430 F201 v22 MOS72 0468 F221 20 D5 FB JSR BUGFIX ;Put out extra char MOS72 0430 F201 v22 MOS72 0469 F224 MOS72 0430 F201 v22 MOS72 0470 F224 38 SAVELP SEC MOS72 0430 F201 v22 MOS72 0471 F225 A2 FD LDXIM &FD MOS72 0430 F201 v22 MOS72 0472 F227 [ MOS125 = &FF MOS72 0430 F201 v22 MOS72 0475 F227 | MOS72 0430 F201 v22 MOS72 0476 F227 B5 B7 SAVEL1 LDAZX (HIADDR -&FD):AND:&FF MOS72 0430 F201 v22 MOS72 0477 F229 F5 B3 SBCZX (BKADDR -&FD):AND:&FF MOS72 0430 F201 v22 MOS72 0478 F22B ] MOS72 0430 F201 v22 MOS72 0479 F22B 9D CB 02 STAAX INFO +BKSZEL-&FD ;Note corrupts Flags byte MOS72 0430 F201 v22 MOS72 0480 F22E E8 INX MOS72 0430 F201 v22 MOS72 0481 F22F D0 F6 BNE SAVEL1 ;Do HIADDR - BKADDR MOS72 0430 F201 v22 MOS72 0482 F231 A8 TAY MOS72 0430 F201 v22 MOS72 0483 F232 D0 0A BNE SAVEL2 ;Msb non-zero => not last block MOS72 0430 F201 v22 MOS72 0484 F234 MOS72 0430 F201 v22 MOS72 0485 F234 ;Now: IF $0100 < block size THEN block size := $0100, MOS72 0430 F201 v22 MOS72 0486 F234 ; not last block MOS72 0430 F201 v22 MOS72 0487 F234 ; ELSE last block MOS72 0430 F201 v22 MOS72 0488 F234 MOS72 0430 F201 v22 MOS72 0489 F234 [ MOS125 = &FF MOS72 0430 F201 v22 MOS72 0502 F234 | MOS72 0430 F201 v22 MOS72 0503 F234 CD C8 03 CMP INFO +BKSZEL ;Note A = X = Y = 0 MOS72 0430 F201 v22 MOS72 0504 F237 2A ROLA ;if L=0 then C := (H<=1) else C := (H==0) MOS72 0430 F201 v22 MOS72 0505 F238 CD C9 03 CMP INFO +BKSZEH ;use constant C=1 from CMP MOS72 0430 F201 v22 MOS72 0506 F23B 6A RORA ;A = $80 if <=$0100, A = 0 if more MOS72 0430 F201 v22 MOS72 0507 F23C 30 08 BMI SAVEL3 ;if last block then don't clamp block size MOS72 0430 F201 v22 MOS72 0508 F23E SAVEL2 ;X = 0, A = Y = undefined MOS72 0430 F201 v22 MOS72 0509 F23E 8A TXA ;clear last block flag MOS72 0430 F201 v22 MOS72 0510 F23F 8E C8 03 STX INFO +BKSZEL ;Default block size = $0100 MOS72 0430 F201 v22 MOS72 0511 F242 E8 INX MOS72 0430 F201 v22 MOS72 0512 F243 8E C9 03 STX INFO +BKSZEH ;Note N=0 preserved by WRBLOK MOS72 0430 F201 v22 MOS72 0513 F246 8D CA 03 SAVEL3 STA INFO +BKFLAG ;WRBLOK clobbers A, X MOS72 0430 F201 v22 MOS72 0514 F249 ] MOS72 0430 F201 v22 MOS72 0515 F249 MOS72 0430 F201 v22 MOS72 0516 F249 20 38 F8 JSR WRBLOK ;Write out data + header MOS72 0430 F201 v22 MOS72 0517 F24C 30 11 BMI SAVFIN ;Last block => finished MOS72 0430 F201 v22 MOS72 0518 F24E MOS72 0430 F201 v22 MOS72 0519 F24E 20 7D F9 JSR ADDBKA ;Add block size to address MOS72 0430 F201 v22 MOS72 0520 F251 MOS72 0430 F201 v22 MOS72 0521 F251 EE C6 03 INC INFO +BKNOLO MOS72 0430 F201 v22 MOS72 0522 F254 D0 CE BNE SAVELP MOS72 0430 F201 v22 MOS72 0523 F256 EE C7 03 INC INFO +BKNOHI ;Inc. block no. for next time MOS72 0430 F201 v22 MOS72 0524 F259 D0 C9 BNE SAVELP ;Assumed always +ve MOS72 0430 F201 v22 MOS72 0525 F25B MOS72 0430 F201 v22 MOS72 0526 F25B [ MOS125 = &FF MOS72 0430 F201 v22 MOS72 0527 F25B | MOS72 0430 F201 v22 MOS72 0528 F25B OLDKEY ;force old key state MOS72 0430 F201 v22 MOS72 0529 F25B 84 EC STY CKEY ;CKEY := 0 MOS72 0430 F201 v22 MOS72 0530 F25D 86 ED STX OKEY ;force old key state MOS72 0430 F201 v22 MOS72 0531 F25F SAVFIN ;Exit from SAVE MOS72 0430 F201 v22 MOS72 0532 F25F 60 RTS MOS72 0430 F201 v22 MOS72 0533 F260 MOS72 0430 F201 v22 MOS72 0534 F260 C9 FF FILENE CMPIM &FF MOS72 0535 F262 ^7B MOS72 0535 F262 D0 FB BNE SAVFIN -- MOS72 0536 F264 -- MOS72 0537 F264 LOADGO -- MOS72 0538 F264 -- MOS72 0539 F264 08 PHP ;Store interrupt status -- MOS72 0540 F265 48 PHA ;Store indication of load or load/run -- MOS72 0541 F266 20 37 FB JSR SETDEF ;Set defaults if nesc. -- MOS72 0542 F269 -- MOS72 0543 F269 AD C2 03 LDA INFO +BKEXEC -- MOS72 0544 F26C 48 PHA ;EQ=> use addr. from C.line or OSFILE -- MOS72 0545 F26D -- MOS72 0546 F26D 20 82 F6 JSR SRCH0 ;Find file on tape. -- MOS72 0547 F270 LOADL6 -- MOS72 0548 F270 -- MOS72 0549 F270 68 PLA -- MOS72 0550 F271 F0 17 BEQ LOADLB ;Use load address from command line or OSFILE MOS72 0550 F271 v68 MOS72 0551 F273 MOS72 0550 F271 v68 MOS72 0552 F273 ;Move load address from OSFILE command block MOS72 0550 F271 v68 MOS72 0553 F273 ;and check if is $FFFFFFFF, in which case MOS72 0550 F271 v68 MOS72 0554 F273 ;give BAD ADDRESS error MOS72 0550 F271 v68 MOS72 0555 F273 MOS72 0550 F271 v68 MOS72 0556 F273 A2 03 LDXIM &03 MOS72 0550 F271 v68 MOS72 0557 F275 38 SEC MOS72 0550 F271 v68 MOS72 0558 F276 LOADL1 MOS72 0550 F271 v68 MOS72 0559 F276 BD BE 03 LDAAX INFO +BKLOAD ;Address from command block MOS72 0550 F271 v68 MOS72 0560 F279 95 B0 STAAX BKADDR MOS72 0550 F271 v68 MOS72 0561 F27B 90 02 BCC LOADL2 ;not ADCIM &00 as V may be in use MOS72 0550 F271 v68 MOS72 0562 F27D C9 FF CMPIM &FF MOS72 0550 F271 v68 MOS72 0563 F27F LOADL2 MOS72 0550 F271 v68 MOS72 0564 F27F CA DEX MOS72 0550 F271 v68 MOS72 0565 F280 10 F4 BPL LOADL1 MOS72 0550 F271 v68 MOS72 0566 F282 MOS72 0550 F271 v68 MOS72 0567 F282 90 06 BCC LOADLB ;If CS, all bytes are $FF => error MOS72 0550 F271 v68 MOS72 0568 F284 MOS72 0550 F271 v68 MOS72 0569 F284 20 F8 FA JSR BEEPOF ;Motor off/beep MOS72 0550 F271 v68 MOS72 0570 F287 4C B8 E3 JMP MBADHX MOS72 0550 F271 v68 MOS72 0571 F28A MOS72 0550 F271 v68 MOS72 0572 F28A AD CA 03 LOADLB LDA INFO +BKFLAG ;Check protection bit -- MOS72 0573 F28D 4A LSRA ;CS -> prot. CC -> unprot -- MOS72 0574 F28E 68 PLA ;Check if loading and running -- MOS72 0575 F28F 90 18 BCC LOADLA ;Not protected -> carry on MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 129 MOS72 C.F.S Main Routines - SAVE MOS72 MOS72 0575 F28F v67 MOS72 0576 F291 F0 0C BEQ LOADLC ;Yes => carry on MOS72 0575 F28F v67 MOS72 0577 F293 MOS72 0575 F28F v67 MOS72 0578 F293 20 02 FB PROTER JSR CASMOF ;Turn motor off MOS72 0575 F28F v67 MOS72 0579 F296 ;Also called from RDBFER MOS72 0575 F28F v67 MOS72 0580 F296 MOS72 0575 F28F v67 MOS72 0581 F296 00 BRK MOS72 0575 F28F v67 MOS72 0582 F297 D5 = CFSERL MOS72 0575 F28F v67 MOS72 0583 F298 4C 6F 63 = "Locked" MOS72 0575 F28F v67 MOS72 0584 F29E 00 = &00 MOS72 0575 F28F v67 MOS72 0585 F29F MOS72 0575 F28F v67 MOS72 0586 F29F LOADLC MOS72 0575 F28F v67 MOS72 0587 F29F A9 03 LDAIM &03 MOS72 0575 F28F v67 MOS72 0588 F2A1 8D 58 02 STA CRIT ;Loading/running & prot., so disable ESCAPE and trap BREAK MOS72 0575 F28F v67 MOS72 0589 F2A4 D0 03 BNE LOADLA ;always branch MOS72 0575 F28F v67 MOS72 0590 F2A6 MOS72 0575 F28F v67 MOS72 0591 F2A6 20 88 F6 LODRTR JSR SEARCH ;Search for current block (BLOKNO) MOS72 0609 F2C0 ^64 MOS72 0592 F2A9 LOADLA MOS72 0609 F2C0 ^64 MOS72 0593 F2A9 A9 30 LDAIM NIGBIT MOS72 0618 F2D0 ^57 MOS72 0594 F2AB 25 BB AND USFLGS MOS72 0618 F2D0 ^57 MOS72 0595 F2AD F0 04 BEQ LOADL8 ;If ignore set, just read block MOS72 0618 F2D0 ^57 MOS72 0596 F2AF A5 C1 LDA HDRCRC ;Check hdr. checksum MOS72 0618 F2D0 ^57 MOS72 0597 F2B1 MOS72 0618 F2D0 ^57 MOS72 0598 F2B1 ;Don't start bg job if header CRC is no good, MOS72 0618 F2D0 ^57 MOS72 0599 F2B1 ;otherwise data may be loaded somewhere strange MOS72 0618 F2D0 ^57 MOS72 0600 F2B1 MOS72 0618 F2D0 ^57 MOS72 0601 F2B1 D0 0A BNE LOADL7 MOS72 0618 F2D0 ^57 MOS72 0602 F2B3 98 LOADL8 TYA MOS72 0618 F2D0 ^57 MOS72 0603 F2B4 48 PHA ;Store "Loading" flag MOS72 0618 F2D0 ^57 MOS72 0604 F2B5 20 AE FB JSR TWINIT ;Initialise tube for writing if nesc. MOS72 0618 F2D0 ^57 MOS72 0605 F2B8 68 PLA MOS72 0618 F2D0 ^57 MOS72 0606 F2B9 A8 TAY ;Restore "Loading" flag MOS72 0618 F2D0 ^57 MOS72 0607 F2BA 20 21 F8 JSR RDBLOK MOS72 0618 F2D0 ^57 MOS72 0608 F2BD 20 C6 F9 LOADL7 JSR LODHDR ;Print header and error msgs. MOS72 0618 F2D0 ^57 MOS72 0609 F2C0 D0 E4 BNE LODRTR ;=> retry MOS72 0618 F2D0 ^57 MOS72 0610 F2C2 MOS72 0618 F2D0 ^57 MOS72 0611 F2C2 20 79 FB JSR NXTBLK ;Next block := blk. found + 1 MOS72 0618 F2D0 ^57 MOS72 0612 F2C5 2C CA 03 BIT INFO +BKFLAG MOS72 0618 F2D0 ^57 MOS72 0613 F2C8 30 08 BMI LOADEX ;Just loaded last block => finish MOS72 0618 F2D0 ^57 MOS72 0614 F2CA MOS72 0618 F2D0 ^57 MOS72 0615 F2CA 20 7D F9 JSR ADDBKA ;Add block size to BKADDR MOS72 0618 F2D0 ^57 MOS72 0616 F2CD MOS72 0618 F2D0 ^57 MOS72 0617 F2CD 20 CD F7 JSR RDHEAD MOS72 0618 F2D0 ^57 MOS72 0618 F2D0 D0 D7 BNE LOADLA ;Always jump MOS72 0613 F2C8 v77 MOS72 0619 F2D2 MOS72 0613 F2C8 v77 MOS72 0620 F2D2 LOADEX MOS72 0613 F2C8 v77 MOS72 0621 F2D2 [ LENSW =0 ;Alter OSFILE control block MOS72 0613 F2C8 v77 MOS72 0622 F2D2 A0 0A LDYIM &0A ;Length offset in OSFILE block -- MOS72 0623 F2D4 A5 CC LDA FSIZE ;File size set in PRTHDR -- MOS72 0624 F2D6 91 C8 STAIY GENPTR ;Note GENPTR kept from OSFILE -- MOS72 0625 F2D8 C8 INY -- MOS72 0626 F2D9 A5 CD LDA FSIZE + 1 -- MOS72 0627 F2DB 91 C8 STAIY GENPTR -- MOS72 0628 F2DD A9 00 LDAIM &00 ;Set high bytes of length = 0 -- MOS72 0629 F2DF C8 INY -- MOS72 0630 F2E0 91 C8 STAIY GENPTR -- MOS72 0631 F2E2 C8 INY -- MOS72 0632 F2E3 91 C8 STAIY GENPTR -- MOS72 0633 F2E5 ] -- MOS72 0634 F2E5 -- MOS72 0635 F2E5 28 PLP ;Restore interrupt status -- MOS72 0636 F2E6 -- MOS72 0637 F2E6 FINOP -- MOS72 0638 F2E6 -- MOS72 0639 F2E6 20 F8 FA JSR BEEPOF ;Motor OFF/BEEP -- MOS72 0640 F2E9 -- MOS72 0641 F2E9 24 BA NOOLN1 BIT ERRSW ;If error taken place, already new line -- MOS72 0642 F2EB 30 07 BMI FINOPX MOS72 0642 F2EB v78 MOS72 0643 F2ED 08 NOOLIN PHP MOS72 0642 F2EB v78 MOS72 0644 F2EE 20 57 FA JSR MSGOUT MOS72 0642 F2EB v78 MOS72 0645 F2F1 0D = MCR MOS72 0642 F2EB v78 MOS72 0646 F2F2 00 = &00 ;Print new line if msgs on MOS72 0642 F2EB v78 MOS72 0647 F2F3 28 PLP MOS72 0642 F2EB v78 MOS72 0648 F2F4 60 FINOPX RTS -- MOS72 0649 F2F5 -- MOS72 0650 F2F5 -- MOS72 0651 F2F5 -- MOS72 0652 F2F5 ] -- MOS72 0653 F2F5 -- MOS72 0654 F2F5 -- MOS72 0655 F2F5 TTL C.F.S. Main Routines - RUN -- MOS72 0656 F2F5 OPT &01 -- MOS72 0657 F2F5 -- MOS72 0658 F2F5 RUN -- MOS72 0659 F2F5 20 BD F1 JSR GETFLN -- MOS72 0660 F2F8 [ MOS125 = &FF -- MOS72 0663 F2F8 | -- MOS72 0664 F2F8 ;initialise GENPTR as this is not an OSFILE load -- MOS72 0665 F2F8 A2 C2 LDXIM FSIZE - &0A ;note value assumed nonzero -- MOS72 0666 F2FA 86 C8 STX GENPTR ;so LOADEX overwrites FSIZE with itself -- MOS72 0667 F2FC 85 C9 STA GENPTR+1 ;A=0 from GETFLN -- MOS72 0668 F2FE 8E C2 03 STX INFO +BKEXEC ;=> >0 loads file to header addr -- MOS72 0669 F301 ] -- MOS72 0670 F301 -- MOS72 0671 F301 ;Note, is assumed here that A = 0 from GETFLN -- MOS72 0672 F301 ;since LOADGO tests A -- MOS72 0673 F301 -- MOS72 0674 F301 [ MOS125 = &7F -- MOS72 0675 F301 [ STARGO = &00 -- MOS72 0676 F301 84 E6 STY CLIRY ;use temp, stack is snooped by CompROMs during LOADGO -- MOS72 0677 F303 20 64 F2 JSR LOADGO ;Load file from tape -- MOS72 0678 F306 A4 E6 LDY CLIRY -- MOS72 0679 F308 RUNGO -- MOS72 0680 F308 98 TYA -- MOS72 0681 F309 20 99 E0 JSR CLIXY2 ;XY = tail ptr, A = Y on entry = offset -- MOS72 0682 F30C 8E D0 02 STX TAILLO ;save pointer to command line tail -- MOS72 0683 F30F C8 INY ;permute so a page of OS ROM becomes zero -- MOS72 0684 F310 8C D1 02 STY TAILHI ;marking all other addresses valid -- MOS72 0685 F313 A8 TAY ;set up registers to simulate entry from Acorn DFS -- MOS72 0686 F314 A2 FF LDXIM &FF ;from filename comparison -- MOS72 0687 F316 38 SEC -- MOS72 0688 F317 [ TUBESW=0 -- MOS72 0689 F317 2C 7A 02 BIT TUBE -- MOS72 0690 F31A 10 0A BPL NOTUB1 ;No tube - jump to IO proc. address MOS72 0690 F31A v75 MOS72 0691 F31C MOS72 0690 F31A v75 MOS72 0692 F31C AD C4 03 LDA INFO +BKEXEC +&02 ;Check if execution address MOS72 0690 F31A v75 MOS72 0693 F31F 2D C5 03 AND INFO +BKEXEC +&03 ;of file is accross tube MOS72 0690 F31A v75 MOS72 0694 F322 C9 FF CMPIM &FF MOS72 0690 F31A v75 MOS72 0695 F324 D0 05 BNE RUNL1 ;Yes, set up tube call MOS72 0690 F31A v75 MOS72 0696 F326 A9 01 NOTUB1 LDAIM &01 ;enter with A=1, X=&FF, Y=arg offset, C=1 MOS72 0695 F324 v7A MOS72 0697 F328 6C C2 03 JMI INFO +BKEXEC ;No, just jump MOS72 0695 F324 v7A MOS72 0698 F32B MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 130 MOS72 C.F.S. Main Routines - RUN MOS72 MOS72 0695 F324 v7A MOS72 0699 F32B A2 C2 RUNL1 LDXIM INFO +BKEXEC ;Point to exec. address -- MOS72 0700 F32D A0 03 LDYIM /(INFO +BKEXEC ) -- MOS72 0701 F32F A9 04 LDAIM TUBEX ;=> execute to tube -- MOS72 0702 F331 4C BA FB JMP TBINT1 ;Claim tube and jump to address -- MOS72 0703 F334 | -- MOS72 0706 F334 ] -- MOS72 0707 F334 | -- MOS72 0729 F334 ] -- MOS72 0730 F334 | -- MOS72 0752 F334 ] -- MOS72 0753 F334 -- MOS72 0754 F334 -- MOS72 0755 F334 TTL C.F.S Main Routines - CAT -- MOS72 0756 F334 OPT &01 -- MOS72 0757 F334 -- MOS72 0758 F334 -- MOS72 0759 F334 ;********* -- MOS72 0760 F334 ;* C A T * -- MOS72 0761 F334 ;********* -- MOS72 0762 F334 -- MOS72 0763 F334 -- MOS72 0764 F334 -- MOS72 0765 F334 CAT -- MOS72 0766 F334 -- MOS72 0767 F334 ;Entered from MOS with two args -- MOS72 0768 F334 ;in X and Y as per OPT. These are not used. -- MOS72 0769 F334 -- MOS72 0770 F334 A9 08 LDAIM CATBIT -- MOS72 0771 F336 20 4D F3 JSR ORSTAT -- MOS72 0772 F339 20 37 FB JSR SETDEF ;Set message type etc. -- MOS72 0773 F33C A9 00 LDAIM &00 ;Indicate verify only -- MOS72 0774 F33E 20 6E F3 JSR LOOK ;In CFS, will never return -- MOS72 0775 F341 ;In SFS, will return -- MOS72 0776 F341 20 0C FB JSR RELEAS ;So in SFS release RS423 -- MOS72 0777 F344 ;NOTE - only release call outside CASMOF -- MOS72 0778 F344 -- MOS72 0779 F344 -- MOS72 0780 F344 A9 F7 CATOFF LDAIM NCTBIT -- MOS72 0781 F346 -- MOS72 0782 F346 25 E2 ANDSTA AND CFSTAT MOS72 0815 F36C ^58 MOS72 0783 F348 85 E2 ANDSTB STA CFSTAT MOS72 0815 F36C ^58 MOS72 0784 F34A MOS72 0815 F36C ^58 MOS72 0785 F34A [ MOS125 = &FF MOS72 0815 F36C ^58 MOS72 0787 F34A | MOS72 0815 F36C ^58 MOS72 0788 F34A FINDXX MOS72 0815 F36C ^58 MOS72 0789 F34A ] MOS72 0815 F36C ^58 MOS72 0790 F34A 60 RTS MOS72 0815 F36C ^58 MOS72 0791 F34B MOS72 0815 F36C ^58 MOS72 0792 F34B ORLST MOS72 0815 F36C ^58 MOS72 0793 F34B A9 40 LDAIM LSTBYT MOS72 0815 F36C ^58 MOS72 0794 F34D ; MOS72 0815 F36C ^58 MOS72 0795 F34D 05 E2 ORSTAT ORA CFSTAT MOS72 0815 F36C ^58 MOS72 0796 F34F D0 F7 BNE ANDSTB ;Assumed always non-zero MOS72 0815 F36C ^58 MOS72 0797 F351 MOS72 0815 F36C ^58 MOS72 0798 F351 [ MOS125 = &FF MOS72 0815 F36C ^58 MOS72 0799 F351 | MOS72 0815 F36C ^58 MOS72 0800 F351 SHUTW MOS72 0815 F36C ^58 MOS72 0801 F351 MOS72 0815 F36C ^58 MOS72 0802 F351 A9 02 LDAIM OUTHND MOS72 0815 F36C ^58 MOS72 0803 F353 25 E2 AND CFSTAT MOS72 0815 F36C ^58 MOS72 0804 F355 F0 F3 BEQ FINDXX ;If already shut, dont bother MOS72 0815 F36C ^58 MOS72 0805 F357 MOS72 0815 F36C ^58 MOS72 0806 F357 A9 00 LDAIM &00 MOS72 0815 F36C ^58 MOS72 0807 F359 8D 97 03 STA OUTHDR +BKSZEH MOS72 0815 F36C ^58 MOS72 0808 F35C MOS72 0815 F36C ^58 MOS72 0809 F35C A9 80 LDAIM LASTBK MOS72 0815 F36C ^58 MOS72 0810 F35E AE 9D 03 LDX OUTPTR MOS72 0815 F36C ^58 MOS72 0811 F361 8E 96 03 STX OUTHDR +BKSZEL MOS72 0815 F36C ^58 MOS72 0812 F364 8D 98 03 STA OUTHDR +BKFLAG MOS72 0815 F36C ^58 MOS72 0813 F367 20 B2 F4 JSR WRTBFR ;Write out block MOS72 0815 F36C ^58 MOS72 0814 F36A A9 FD LDAIM NOUTHD MOS72 0815 F36C ^58 MOS72 0815 F36C D0 D8 BNE ANDSTA ;Mark file as closed -- MOS72 0816 F36E ] -- MOS72 0817 F36E -- MOS72 0818 F36E -- MOS72 0819 F36E -- MOS72 0820 F36E -- MOS72 0821 F36E 48 LOOK PHA -- MOS72 0822 F36F AD 47 02 LDA SROMSW -- MOS72 0823 F372 F0 08 BEQ LOOKLR ;No SFS -> don't call SFS routines MOS72 0823 F372 v77 MOS72 0824 F374 MOS72 0823 F372 v77 MOS72 0825 F374 20 50 EE JSR SRINIT ;Initialise SERROM ptr. MOS72 0823 F372 v77 MOS72 0826 F377 [ MOS125 = &FF MOS72 0823 F372 v77 MOS72 0828 F377 ] MOS72 0823 F372 v77 MOS72 0829 F377 90 03 BCC LOOKLR MOS72 0823 F372 v77 MOS72 0830 F379 MOS72 0823 F372 v77 MOS72 0831 F379 B8 CLV ;Indicate end of rom to outside world MOS72 0823 F372 v77 MOS72 0832 F37A 50 5B BVC LOOKEX MOS72 0832 F37A v24 MOS72 0833 F37C MOS72 0832 F37A v24 MOS72 0834 F37C 20 CD F7 LOOKLR JSR RDHEAD MOS72 0832 F37A v24 MOS72 0835 F37F AD C6 03 LDA INFO +BKNOLO MOS72 0832 F37A v24 MOS72 0836 F382 85 B4 STA BLOKNO MOS72 0832 F37A v24 MOS72 0837 F384 AD C7 03 LDA INFO +BKNOHI MOS72 0832 F37A v24 MOS72 0838 F387 85 B5 STA BLOKNO +&01 MOS72 0832 F37A v24 MOS72 0839 F389 A2 FF LDXIM &FF MOS72 0832 F37A v24 MOS72 0840 F38B 8E DF 03 STX OLDFLG MOS72 0832 F37A v24 MOS72 0841 F38E E8 INX MOS72 0832 F37A v24 MOS72 0842 F38F 86 BA STX ERRSW MOS72 0832 F37A v24 MOS72 0843 F391 F0 20 BEQ LOOKL5 ;Always new line MOS72 0832 F37A v24 MOS72 0844 F393 MOS72 0832 F37A v24 MOS72 0845 F393 [ MOS125 = &FF MOS72 0832 F37A v24 MOS72 0846 F393 | MOS72 0832 F37A v24 MOS72 0847 F393 50 05 LOOKL4 BVC LOOKL3 ;Header interrupted MOS72 0832 F37A v24 MOS72 0848 F395 A9 FF LDAIM &FF MOS72 0832 F37A v24 MOS72 0849 F397 20 23 F8 JSR CHKBIN ;Check data MOS72 0832 F37A v24 MOS72 0850 F39A MOS72 0832 F37A v24 MOS72 0851 F39A A2 00 LOOKL3 LDXIM &00 MOS72 0832 F37A v24 MOS72 0852 F39C 20 EB F9 JSR CATERR ;Print errors and header MOS72 0832 F37A v24 MOS72 0853 F39F MOS72 0832 F37A v24 MOS72 0854 F39F AD 47 02 LDA SROMSW MOS72 0832 F37A v24 MOS72 0855 F3A2 F0 04 BEQ LOOKL9 ;In CFS -> continue MOS72 0832 F37A v24 MOS72 0856 F3A4 24 BB BIT USFLGS MOS72 0832 F37A v24 MOS72 0857 F3A6 50 36 BVC LOOKL8 ;=> short msgs and skip beween files MOS72 0832 F37A v24 MOS72 0858 F3A8 MOS72 0832 F37A v24 MOS72 0859 F3A8 2C CA 03 LOOKL9 BIT INFO +BKFLAG MOS72 0832 F37A v24 MOS72 0860 F3AB 30 34 BMI LOOKLA ;Look for block zero MOS72 0832 F37A v24 MOS72 0861 F3AD ] MOS72 0832 F37A v24 MOS72 0862 F3AD MOS72 0832 F37A v24 MOS72 0863 F3AD 20 79 FB LOOKL1 JSR NXTBLK ;Blokno := INFO +BKNO + 1 MOS72 0832 F37A v24 MOS72 0864 F3B0 MOS72 0832 F37A v24 MOS72 0865 F3B0 20 CD F7 JSR RDHEAD ;Read header MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 131 MOS72 C.F.S Main Routines - CAT MOS72 MOS72 0832 F37A v24 MOS72 0866 F3B3 AD 47 02 LOOKL5 LDA SROMSW MOS72 0832 F37A v24 MOS72 0867 F3B6 F0 02 BEQ LOOKL7 MOS72 0832 F37A v24 MOS72 0868 F3B8 MOS72 0832 F37A v24 MOS72 0869 F3B8 ;Check V from RDHEAD MOS72 0832 F37A v24 MOS72 0870 F3B8 MOS72 0832 F37A v24 MOS72 0871 F3B8 50 1D BVC LOOKEX ;In SFS and VC => end of all ROMs MOS72 0832 F37A v24 MOS72 0872 F3BA MOS72 0832 F37A v24 MOS72 0873 F3BA 68 LOOKL7 PLA MOS72 0832 F37A v24 MOS72 0874 F3BB 48 PHA ;Check if just verifying MOS72 0832 F37A v24 MOS72 0875 F3BC F0 D5 BEQ LOOKL4 ;If just verifying, continue MOS72 0832 F37A v24 MOS72 0876 F3BE 20 82 FA JSR CMPFT ;Otherwise, check file titles MOS72 0832 F37A v24 MOS72 0877 F3C1 D0 16 BNE LOOKL2 ;Not the same, continue MOS72 0832 F37A v24 MOS72 0878 F3C3 A9 30 LDAIM NIGBIT MOS72 0832 F37A v24 MOS72 0879 F3C5 25 BB AND USFLGS MOS72 0832 F37A v24 MOS72 0880 F3C7 F0 0E BEQ LOOKEX ;If ignore set, just exit MOS72 0832 F37A v24 MOS72 0881 F3C9 MOS72 0832 F37A v24 MOS72 0882 F3C9 AD C6 03 LDA INFO +BKNOLO ;Otherwise, check block no. MOS72 0832 F37A v24 MOS72 0883 F3CC C5 B6 CMP SRCHBK MOS72 0832 F37A v24 MOS72 0884 F3CE D0 09 BNE LOOKL2 ;Not found ... MOS72 0832 F37A v24 MOS72 0885 F3D0 AD C7 03 LDA INFO +BKNOHI MOS72 0832 F37A v24 MOS72 0886 F3D3 C5 B7 CMP SRCHBK +&01 MOS72 0832 F37A v24 MOS72 0887 F3D5 D0 02 BNE LOOKL2 MOS72 0832 F37A v24 MOS72 0888 F3D7 68 LOOKEX PLA MOS72 0903 F3DC ^35 MOS72 0889 F3D8 MOS72 0903 F3DC ^35 MOS72 0890 F3D8 ;On exit, V indicates in CFS if header MOS72 0903 F3DC ^35 MOS72 0891 F3D8 ;interrupted by DCD. In SFS, indicates MOS72 0903 F3DC ^35 MOS72 0892 F3D8 ;if end of ROM filing system reached. MOS72 0903 F3DC ^35 MOS72 0893 F3D8 MOS72 0903 F3DC ^35 MOS72 0894 F3D8 60 RTS MOS72 0903 F3DC ^35 MOS72 0895 F3D9 MOS72 0903 F3DC ^35 MOS72 0896 F3D9 LOOKL2 MOS72 0903 F3DC ^35 MOS72 0897 F3D9 MOS72 0903 F3DC ^35 MOS72 0898 F3D9 ;Here, file not recognised. In CFS, just MOS72 0903 F3DC ^35 MOS72 0899 F3D9 ;carry on reading next block. In SFS, MOS72 0903 F3DC ^35 MOS72 0900 F3D9 ;skip to block zero of next file. MOS72 0903 F3DC ^35 MOS72 0901 F3D9 MOS72 0903 F3DC ^35 MOS72 0902 F3D9 AD 47 02 LDA SROMSW MOS72 0903 F3DC ^35 MOS72 0903 F3DC F0 B5 BEQ LOOKL4 ;In CFS, carry on MOS72 0908 F3E9 ^42 MOS72 0904 F3DE 20 ED EE LOOKL8 JSR SRSKIP ;Not recognised => skip MOS72 0908 F3E9 ^42 MOS72 0905 F3E1 A9 FF LOOKLA LDAIM &FF MOS72 0908 F3E9 ^42 MOS72 0906 F3E3 8D C6 03 STA INFO +BKNOLO ;Look for block zero of next file MOS72 0908 F3E9 ^42 MOS72 0907 F3E6 8D C7 03 STA INFO +BKNOHI MOS72 0908 F3E9 ^42 MOS72 0908 F3E9 D0 C2 BNE LOOKL1 -- MOS72 0909 F3EB -- MOS72 0910 F3EB [ MOS125 = &FF -- MOS72 0926 F3EB ] -- MOS72 0927 F3EB -- MOS72 0928 F3EB -- MOS72 0929 F3EB TTL C.F.S Main Routines - FIND -- MOS72 0930 F3EB OPT &01 -- MOS72 0931 F3EB -- MOS72 0932 F3EB ;****** SEQUENTIAL ACCESS ****** -- MOS72 0933 F3EB -- MOS72 0934 F3EB -- MOS72 0935 F3EB -- MOS72 0936 F3EB ;*********** -- MOS72 0937 F3EB ;* F I N D * -- MOS72 0938 F3EB ;*********** -- MOS72 0939 F3EB -- MOS72 0940 F3EB -- MOS72 0941 F3EB FIND ;FIND -- MOS72 0942 F3EB -- MOS72 0943 F3EB -- MOS72 0944 F3EB ;Entered from OSFIND: -- MOS72 0945 F3EB -- MOS72 0946 F3EB ;A NZ => open -- MOS72 0947 F3EB ;b6 => file already exists and opened for read/ud -- MOS72 0948 F3EB ;A EQ => shut -- MOS72 0949 F3EB -- MOS72 0950 F3EB ;For open: X,Y -> file name lo,hi -- MOS72 0951 F3EB -- MOS72 0952 F3EB ;For shut: Y = handle. If zero, all files shut. -- MOS72 0953 F3EB -- MOS72 0954 F3EB -- MOS72 0955 F3EB -- MOS72 0956 F3EB 85 BC STA TEMP -- MOS72 0957 F3ED 8A TXA -- MOS72 0958 F3EE 48 PHA -- MOS72 0959 F3EF 98 TYA -- MOS72 0960 F3F0 48 PHA -- MOS72 0961 F3F1 A5 BC LDA TEMP -- MOS72 0962 F3F3 D0 37 BNE FINDON MOS72 0962 F3F3 v48 MOS72 0963 F3F5 MOS72 0962 F3F3 v48 MOS72 0964 F3F5 98 TYA MOS72 0962 F3F3 v48 MOS72 0965 F3F6 D0 0C BNE SHUTL1 ;Y non-zero => shut one file MOS72 0962 F3F3 v48 MOS72 0966 F3F8 ; MOS72 0962 F3F3 v48 MOS72 0967 F3F8 20 C6 E3 JSR SHUTES ;shut EXEC and SPOOL files opened by CFS MOS72 0962 F3F3 v48 MOS72 0968 F3FB 20 51 F3 JSR SHUTW ;Else shut write file MOS72 0962 F3F3 v48 MOS72 0969 F3FE ; Shut read file and exit MOS72 0962 F3F3 v48 MOS72 0970 F3FE 46 E2 SHUTR LSR CFSTAT MOS72 0962 F3F3 v48 MOS72 0971 F400 06 E2 ASL CFSTAT ;Note assumes input bit = b0 MOS72 0962 F3F3 v48 MOS72 0972 F402 ; C=0 MOS72 0962 F3F3 v48 MOS72 0973 F402 90 25 BCC JFINDEX ;[ALWAYS jump] MOS72 0962 F3F3 v48 MOS72 0974 F404 ; MOS72 0962 F3F3 v48 MOS72 0975 F404 ; MOS72 0962 F3F3 v48 MOS72 0976 F404 4A SHUTL1 LSRA MOS72 0962 F3F3 v48 MOS72 0977 F405 B0 F7 BCS SHUTR ;Shut input file MOS72 0962 F3F3 v48 MOS72 0978 F407 4A LSRA MOS72 0962 F3F3 v48 MOS72 0979 F408 B0 1C BCS SHUTL2 ;Shut output file MOS72 0962 F3F3 v48 MOS72 0980 F40A MOS72 0962 F3F3 v48 MOS72 0981 F40A [ MOS125 = &FF MOS72 0962 F3F3 v48 MOS72 0983 F40A | MOS72 0962 F3F3 v48 MOS72 0984 F40A 00 HNDERR BRK MOS72 0962 F3F3 v48 MOS72 0985 F40B DE = CFSERB MOS72 0962 F3F3 v48 MOS72 0986 F40C 43 68 61 = "Channel",0 MOS72 0962 F3F3 v48 MOS72 0987 F414 MOS72 0962 F3F3 v48 MOS72 0988 F414 CHKHND MOS72 0962 F3F3 v48 MOS72 0989 F414 MOS72 0962 F3F3 v48 MOS72 0990 F414 ;Check handle in Y is open MOS72 0962 F3F3 v48 MOS72 0991 F414 ;and corresponds to mask in A MOS72 0962 F3F3 v48 MOS72 0992 F414 MOS72 0962 F3F3 v48 MOS72 0993 F414 ;squash and bugfix: Y=0 not accepted by RFS when OUTHND open in CFS MOS72 0962 F3F3 v48 MOS72 0994 F414 25 E2 AND CFSTAT MOS72 0962 F3F3 v48 MOS72 0995 F416 C0 02 CPYIM OUTHND MOS72 0962 F3F3 v48 MOS72 0996 F418 D0 02 BNE CHKHN1 MOS72 0962 F3F3 v48 MOS72 0997 F41A 4A LSRA MOS72 0962 F3F3 v48 MOS72 0998 F41B 88 DEY MOS72 0962 F3F3 v48 MOS72 0999 F41C CHKHN1 MOS72 0962 F3F3 v48 MOS72 1000 F41C 88 DEY MOS72 0962 F3F3 v48 MOS72 1001 F41D CC 47 02 CPY SROMSW MOS72 0962 F3F3 v48 MOS72 1002 F420 D0 E8 BNE HNDERR MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 132 MOS72 C.F.S Main Routines - FIND MOS72 MOS72 0962 F3F3 v48 MOS72 1003 F422 4A LSRA MOS72 0962 F3F3 v48 MOS72 1004 F423 90 E5 BCC HNDERR MOS72 0962 F3F3 v48 MOS72 1005 F425 60 RTS MOS72 0962 F3F3 v48 MOS72 1006 F426 ] MOS72 0962 F3F3 v48 MOS72 1007 F426 MOS72 0962 F3F3 v48 MOS72 1008 F426 20 51 F3 SHUTL2 JSR SHUTW MOS72 0962 F3F3 v48 MOS72 1009 F429 JFINDEX MOS72 0962 F3F3 v48 MOS72 1010 F429 4C AB F4 JMP FINDEX MOS72 0962 F3F3 v48 MOS72 1011 F42C MOS72 0962 F3F3 v48 MOS72 1012 F42C MOS72 0962 F3F3 v48 MOS72 1013 F42C MOS72 0962 F3F3 v48 MOS72 1014 F42C 20 BD F1 FINDON JSR MOVFT -- MOS72 1015 F42F -- MOS72 1016 F42F 24 BC BIT TEMP -- MOS72 1017 F431 50 3D BVC FINDO ;Find for output if b.6 = 0 MOS72 1017 F431 v42 MOS72 1018 F433 MOS72 1017 F431 v42 MOS72 1019 F433 ;Opening files already open MOS72 1017 F431 v42 MOS72 1020 F433 ;is the same as if not already open MOS72 1017 F431 v42 MOS72 1021 F433 MOS72 1017 F431 v42 MOS72 1022 F433 MOS72 1017 F431 v42 MOS72 1023 F433 ;Open for reading MOS72 1017 F431 v42 MOS72 1024 F433 ;Set handle and read in first buffer MOS72 1017 F431 v42 MOS72 1025 F433 MOS72 1017 F431 v42 MOS72 1026 F433 A9 00 LDAIM &00 MOS72 1017 F431 v42 MOS72 1027 F435 8D 9E 03 STA INPTR ;Set buffer ptr. := 0 MOS72 1017 F431 v42 MOS72 1028 F438 8D DD 03 STA NEXTIN MOS72 1017 F431 v42 MOS72 1029 F43B 8D DE 03 STA NEXTIN +&01 ;Set expected block := 0 MOS72 1017 F431 v42 MOS72 1030 F43E MOS72 1017 F431 v42 MOS72 1031 F43E A9 3E LDAIM NECBIT ;End of file/last byte unset/input file closed MOS72 1017 F431 v42 MOS72 1032 F440 20 46 F3 JSR ANDSTA MOS72 1017 F431 v42 MOS72 1033 F443 MOS72 1017 F431 v42 MOS72 1034 F443 20 2A FB JSR SETSDF ;Set seq. access default MOS72 1017 F431 v42 MOS72 1035 F446 MOS72 1017 F431 v42 MOS72 1036 F446 08 PHP ;Store interrupt status MOS72 1017 F431 v42 MOS72 1037 F447 20 82 F6 JSR SRCH0 ;Find file, first block. MOS72 1017 F431 v42 MOS72 1038 F44A 20 0A F7 JSR RDBFRS ;Check hdr. read ok, and get first bfr. MOS72 1017 F431 v42 MOS72 1039 F44D 28 PLP ;Restore interrupt status MOS72 1017 F431 v42 MOS72 1040 F44E MOS72 1017 F431 v42 MOS72 1041 F44E A2 FF LDXIM &FF MOS72 1017 F431 v42 MOS72 1042 F450 E8 FINDL5 INX ;Make file name found = file name MOS72 1017 F431 v42 MOS72 1043 F451 BD B2 03 LDAAX INFO ;for subsequent block reads MOS72 1017 F431 v42 MOS72 1044 F454 9D A7 03 STAAX INFILE ;so that OPENIN "" locks onto one filet block. MOS72 1017 F431 v42 MOS72 1045 F457 D0 F7 BNE FINDL5 MOS72 1017 F431 v42 MOS72 1046 F459 MOS72 1017 F431 v42 MOS72 1047 F459 A9 01 LDAIM INOPEN MOS72 1017 F431 v42 MOS72 1048 F45B 20 4D F3 JSR ORSTAT MOS72 1017 F431 v42 MOS72 1049 F45E AD EA 02 LDA INBSZE MOS72 1017 F431 v42 MOS72 1050 F461 0D EB 02 ORA INBSZE +&01 MOS72 1017 F431 v42 MOS72 1051 F464 D0 03 BNE FINDL6 ;If non-empty, don't worry MOS72 1017 F431 v42 MOS72 1052 F466 20 4B F3 JSR ORLST ;Otherwise, at end of file MOS72 1017 F431 v42 MOS72 1053 F469 MOS72 1017 F431 v42 MOS72 1054 F469 A9 01 FINDL6 LDAIM INHAND MOS72 1017 F431 v42 MOS72 1055 F46B 0D 47 02 ORA SROMSW ;If in SFS, return 3 MOS72 1017 F431 v42 MOS72 1056 F46E D0 39 BNE OPENEX ;Return input handle MOS72 1017 F431 v42 MOS72 1057 F470 MOS72 1017 F431 v42 MOS72 1058 F470 MOS72 1017 F431 v42 MOS72 1059 F470 MOS72 1017 F431 v42 MOS72 1060 F470 8A FINDO TXA ;Can't openout "" MOS72 1056 F46E v46 MOS72 1061 F471 D0 03 BNE FINABC MOS72 1056 F46E v46 MOS72 1062 F473 4C B7 EA JMP BADSTR MOS72 1056 F46E v46 MOS72 1063 F476 MOS72 1056 F46E v46 MOS72 1064 F476 A2 FF FINABC LDXIM &FF MOS72 1056 F46E v46 MOS72 1065 F478 E8 FINDL2 INX MOS72 1056 F46E v46 MOS72 1066 F479 BD D2 03 LDAAX FILNAM ;Store output file name MOS72 1056 F46E v46 MOS72 1067 F47C 9D 80 03 STAAX OUTHDR MOS72 1056 F46E v46 MOS72 1068 F47F D0 F7 BNE FINDL2 MOS72 1056 F46E v46 MOS72 1069 F481 MOS72 1056 F46E v46 MOS72 1070 F481 A9 FF LDAIM &FF MOS72 1056 F46E v46 MOS72 1071 F483 A2 08 LDXIM &08 MOS72 1056 F46E v46 MOS72 1072 F485 9D 8B 03 FINDL4 STAAX OUTHDR +BKLOAD -&01 MOS72 1056 F46E v46 MOS72 1073 F488 CA DEX MOS72 1056 F46E v46 MOS72 1074 F489 D0 FA BNE FINDL4 ;Set load/EXEC address to default value MOS72 1056 F46E v46 MOS72 1075 F48B MOS72 1056 F46E v46 MOS72 1076 F48B 8A TXA MOS72 1056 F46E v46 MOS72 1077 F48C A2 14 LDXIM BKNOLO MOS72 1056 F46E v46 MOS72 1078 F48E MOS72 1056 F46E v46 MOS72 1079 F48E ;Set block no./block len./last bk. =0 MOS72 1056 F46E v46 MOS72 1080 F48E ;Note also sets OUTPTR which must MOS72 1056 F46E v46 MOS72 1081 F48E ;be contiguous with OUTHDR MOS72 1056 F46E v46 MOS72 1082 F48E MOS72 1056 F46E v46 MOS72 1083 F48E 9D 80 03 FINDL3 STAAX OUTHDR MOS72 1056 F46E v46 MOS72 1084 F491 E8 INX MOS72 1056 F46E v46 MOS72 1085 F492 E0 1E CPXIM BKLAST +&01 MOS72 1056 F46E v46 MOS72 1086 F494 D0 F8 BNE FINDL3 ;Note carry set MOS72 1056 F46E v46 MOS72 1087 F496 2E 97 03 ROL OUTHDR +BKSZEH ;Set hi byte of size MOS72 1056 F46E v46 MOS72 1088 F499 MOS72 1056 F46E v46 MOS72 1089 F499 20 37 FB JSR SETDEF ;If default, print prompt MOS72 1056 F46E v46 MOS72 1090 F49C 20 7D F5 JSR RECORD MOS72 1056 F46E v46 MOS72 1091 F49F 20 02 FB JSR CASMOF ;OFF for putbyte call MOS72 1056 F46E v46 MOS72 1092 F4A2 MOS72 1056 F46E v46 MOS72 1093 F4A2 A9 02 LDAIM OUTOPN MOS72 1056 F46E v46 MOS72 1094 F4A4 20 4D F3 JSR ORSTAT ;Indicate file open for output MOS72 1056 F46E v46 MOS72 1095 F4A7 MOS72 1056 F46E v46 MOS72 1096 F4A7 A9 02 LDAIM OUTHND MOS72 1056 F46E v46 MOS72 1097 F4A9 MOS72 1056 F46E v46 MOS72 1098 F4A9 85 BC OPENEX STA TEMP -- MOS72 1099 F4AB FINDEX ;Common exit for PUT/GETBYTE and FIND -- MOS72 1100 F4AB 68 GBEXX PLA -- MOS72 1101 F4AC A8 TAY -- MOS72 1102 F4AD 68 PLA -- MOS72 1103 F4AE AA TAX -- MOS72 1104 F4AF A5 BC LDA TEMP -- MOS72 1105 F4B1 [ MOS125 = &FF -- MOS72 1107 F4B1 ] -- MOS72 1108 F4B1 60 RTS -- MOS72 1109 F4B2 -- MOS72 1110 F4B2 -- MOS72 1111 F4B2 -- MOS72 1112 F4B2 -- MOS72 1113 F4B2 -- MOS72 1114 F4B2 -- MOS72 1115 F4B2 [ MOS125 = &FF -- MOS72 1132 F4B2 ] -- MOS72 1133 F4B2 -- MOS72 1134 F4B2 -- MOS72 1135 F4B2 WRTBFR ;Write out buffer -- MOS72 1136 F4B2 -- MOS72 1137 F4B2 20 2A FB JSR SETSDF ;Set sequential defaults -- MOS72 1138 F4B5 -- MOS72 1139 F4B5 A2 11 LDXIM BKLAST -BKLOAD -- MOS72 1140 F4B7 BD 8C 03 WRTBL3 LDAAX OUTHDR +BKLOAD MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 133 MOS72 C.F.S Main Routines - FIND MOS72 MOS72 1143 F4BE ^77 MOS72 1141 F4BA 9D BE 03 STAAX INFO +BKLOAD MOS72 1143 F4BE ^77 MOS72 1142 F4BD CA DEX MOS72 1143 F4BE ^77 MOS72 1143 F4BE 10 F7 BPL WRTBL3 -- MOS72 1144 F4C0 -- MOS72 1145 F4C0 ; Set buffer address for WBLOCK call -- MOS72 1146 F4C0 -- MOS72 1147 F4C0 86 B2 STX BKADDR +&02 -- MOS72 1148 F4C2 86 B3 STX BKADDR +&03 ;Output buffer is in IO proc. -- MOS72 1149 F4C4 -- MOS72 1150 F4C4 0000 T * OUTBFR:SHL: 8 -- MOS72 1151 F4C4 [ T=0 -- MOS72 1152 F4C4 E8 INX -- MOS72 1153 F4C5 86 B0 STX BKADDR ;If OUTBFR on page boundary, set lo byte = 0 -- MOS72 1154 F4C7 | -- MOS72 1157 F4C7 ] -- MOS72 1158 F4C7 -- MOS72 1159 F4C7 A9 09 LDAIM /(OUTBFR ) -- MOS72 1160 F4C9 85 B1 STA BKADDR +&01 -- MOS72 1161 F4CB -- MOS72 1162 F4CB A2 7F LDXIM OUTHDR -&01 -- MOS72 1163 F4CD 20 93 FB JSR MOVFN ;File name -> FILNAM etc. -- MOS72 1164 F4D0 8D DF 03 STA OLDFLG -- MOS72 1165 F4D3 -- MOS72 1166 F4D3 20 A0 FB JSR MOTONW ;Motor on and select output drive -- MOS72 1167 F4D6 20 D5 FB JSR BUGFIX -- MOS72 1168 F4D9 20 38 F8 JSR WBLOCK ;Write out block -- MOS72 1169 F4DC EE 94 03 INC OUTHDR +BKNOLO ;Next block -- MOS72 1170 F4DF D0 03 BNE WRTBL4 MOS72 1170 F4DF v7C MOS72 1171 F4E1 EE 95 03 INC OUTHDR +BKNOHI MOS72 1170 F4DF v7C MOS72 1172 F4E4 60 WRTBL4 RTS -- MOS72 1173 F4E5 -- MOS72 1174 F4E5 -- MOS72 1175 F4E5 -- MOS72 1176 F4E5 -- MOS72 1177 F4E5 -- MOS72 1178 F4E5 -- MOS72 1179 F4E5 -- MOS72 1180 F4E5 -- MOS72 1181 F4E5 TTL C.F.S. Main Routines - GETBYTE -- MOS72 1182 F4E5 OPT &01 -- MOS72 1183 F4E5 -- MOS72 1184 F4E5 -- MOS72 1185 F4E5 ;****************** -- MOS72 1186 F4E5 ;* G E T B Y T E * -- MOS72 1187 F4E5 ;****************** -- MOS72 1188 F4E5 -- MOS72 1189 F4E5 -- MOS72 1190 F4E5 GETBYT -- MOS72 1191 F4E5 -- MOS72 1192 F4E5 8A TXA -- MOS72 1193 F4E6 48 PHA -- MOS72 1194 F4E7 98 TYA -- MOS72 1195 F4E8 48 PHA -- MOS72 1196 F4E9 A9 01 LDAIM INHAND -- MOS72 1197 F4EB 20 14 F4 JSR CHKHND ;Is handle open ? -- MOS72 1198 F4EE -- MOS72 1199 F4EE A5 E2 LDA CFSTAT -- MOS72 1200 F4F0 0A ASLA -- MOS72 1201 F4F1 B0 4F BCS GBEOF ;=> Going past end of file MOS72 1201 F4F1 v30 MOS72 1202 F4F3 0A ASLA MOS72 1201 F4F1 v30 MOS72 1203 F4F4 90 09 BCC GBLF ;=> Not getting last byte MOS72 1201 F4F1 v30 MOS72 1204 F4F6 MOS72 1201 F4F1 v30 MOS72 1205 F4F6 ;Here indicate next GB call MOS72 1201 F4F1 v30 MOS72 1206 F4F6 ;goes off end of file MOS72 1201 F4F1 v30 MOS72 1207 F4F6 MOS72 1201 F4F1 v30 MOS72 1208 F4F6 A9 80 LDAIM EOFBIT MOS72 1201 F4F1 v30 MOS72 1209 F4F8 20 4D F3 JSR ORSTAT MOS72 1201 F4F1 v30 MOS72 1210 F4FB MOS72 1201 F4F1 v30 MOS72 1211 F4FB ;Carry still set from above MOS72 1201 F4F1 v30 MOS72 1212 F4FB MOS72 1201 F4F1 v30 MOS72 1213 F4FB A9 FE LDAIM ENDBYT ;Byte after end of file MOS72 1201 F4F1 v30 MOS72 1214 F4FD B0 38 BCS GBEXY MOS72 1201 F4F1 v30 MOS72 1215 F4FF MOS72 1201 F4F1 v30 MOS72 1216 F4FF AE 9E 03 GBLF LDX INPTR MOS72 1201 F4F1 v30 MOS72 1217 F502 E8 INX MOS72 1201 F4F1 v30 MOS72 1218 F503 EC EA 02 CPX INBSZE ;Is last byte of buffer ? MOS72 1201 F4F1 v30 MOS72 1219 F506 D0 2A BNE GBLDE ;Nope -> continue MOS72 1201 F4F1 v30 MOS72 1220 F508 MOS72 1201 F4F1 v30 MOS72 1221 F508 MOS72 1201 F4F1 v30 MOS72 1222 F508 2C EC 02 BIT BUFFLG ;Check if in last block. If so, are reading MOS72 1201 F4F1 v30 MOS72 1223 F50B 30 22 BMI GBLH ;last byte of last block => exit MOS72 1201 F4F1 v30 MOS72 1224 F50D MOS72 1201 F4F1 v30 MOS72 1225 F50D ;Read last byte of block. NOTE this is kept in a location MOS72 1201 F4F1 v30 MOS72 1226 F50D ;separate from the rest of the block buffer, so that if the MOS72 1201 F4F1 v30 MOS72 1227 F50D ;next block being read aborts and corrupts the block buffer, MOS72 1201 F4F1 v30 MOS72 1228 F50D ;a subsequent retry will still provide the last byte of the MOS72 1201 F4F1 v30 MOS72 1229 F50D ;previous block. The variable FINBYT is updated in RDBFER after MOS72 1201 F4F1 v30 MOS72 1230 F50D ;the background block read has succesfully completed. MOS72 1201 F4F1 v30 MOS72 1231 F50D MOS72 1201 F4F1 v30 MOS72 1232 F50D AD ED 02 LDA FINBYT MOS72 1201 F4F1 v30 MOS72 1233 F510 48 PHA ;Store final byte of this block MOS72 1201 F4F1 v30 MOS72 1234 F511 20 2A FB JSR SETSDF ;Set sequential defaults MOS72 1201 F4F1 v30 MOS72 1235 F514 08 PHP ;Store I'rupt status MOS72 1201 F4F1 v30 MOS72 1236 F515 20 02 F7 JSR RDBFER ;Read buffer for next GETBYTE call MOS72 1201 F4F1 v30 MOS72 1237 F518 28 PLP ;Restore I'rupt status MOS72 1201 F4F1 v30 MOS72 1238 F519 68 PLA ;Restore final byte of previous buffer MOS72 1201 F4F1 v30 MOS72 1239 F51A 85 BC STA TEMP ;Store for later use MOS72 1201 F4F1 v30 MOS72 1240 F51C MOS72 1201 F4F1 v30 MOS72 1241 F51C 18 CLC ;Prepare for non-end of file exit MOS72 1201 F4F1 v30 MOS72 1242 F51D 2C EC 02 BIT BUFFLG MOS72 1201 F4F1 v30 MOS72 1243 F520 10 17 BPL GBEXIT ;Exit, result = TEMP, carry clear MOS72 1201 F4F1 v30 MOS72 1244 F522 MOS72 1201 F4F1 v30 MOS72 1245 F522 AD EA 02 LDA INBSZE ;If here, is last block MOS72 1201 F4F1 v30 MOS72 1246 F525 0D EB 02 ORA INBSZE +&01 MOS72 1201 F4F1 v30 MOS72 1247 F528 D0 0F BNE GBEXIT ;Last block, is not empty MOS72 1201 F4F1 v30 MOS72 1248 F52A 20 4B F3 JSR ORLST ;If is last block, and empty MOS72 1201 F4F1 v30 MOS72 1249 F52D D0 0A BNE GBEXIT ;then this is the last byte MOS72 1201 F4F1 v30 MOS72 1250 F52F ;So set last byte bit and exit, C = 0 MOS72 1201 F4F1 v30 MOS72 1251 F52F MOS72 1201 F4F1 v30 MOS72 1252 F52F GBLH MOS72 1201 F4F1 v30 MOS72 1253 F52F 20 4B F3 JSR ORLST ;Otherwise, reading last byte. MOS72 1201 F4F1 v30 MOS72 1254 F532 MOS72 1201 F4F1 v30 MOS72 1255 F532 ;So exit, carry clear MOS72 1201 F4F1 v30 MOS72 1256 F532 MOS72 1201 F4F1 v30 MOS72 1257 F532 CA GBLDE DEX MOS72 1201 F4F1 v30 MOS72 1258 F533 18 CLC ;Carry clear unless byte AFTER last byte of file MOS72 1201 F4F1 v30 MOS72 1259 F534 BD 00 0A LDAAX INBUFR ;GET BYTE ! MOS72 1201 F4F1 v30 MOS72 1260 F537 85 BC GBEXY STA TEMP MOS72 1201 F4F1 v30 MOS72 1261 F539 EE 9E 03 GBEXIT INC INPTR ;Inc. buffer ptr. for next time MOS72 1201 F4F1 v30 MOS72 1262 F53C 4C AB F4 JMP GBEXX ;Share exit with PUTBYT MOS72 1201 F4F1 v30 MOS72 1263 F53F MOS72 MOS72 MOS72 MOS72 Acorn macro assembler Page 134 MOS72 C.F.S. Main Routines - GETBYTE MOS72 MOS72 1201 F4F1 v30 MOS72 1264 F53F [ MOS125 = &FF MOS72 1201 F4F1 v30 MOS72 1265 F53F | MOS72 1201 F4F1 v30 MOS72 1266 F53F COPYR ;here to save a byte MOS72 1201 F4F1 v30 MOS72 1267 F53F 29 = ")" MOS72 1201 F4F1 v30 MOS72 1268 F540 43 = "C" MOS72 1201 F4F1 v30 MOS72 1269 F541 28 = "(" ;BRK forms terminator MOS72 1201 F4F1 v30 MOS72 1270 F542 ] MOS72 1201 F4F1 v30 MOS72 1271 F542 MOS72 1201 F4F1 v30 MOS72 1272 F542 00 GBEOF BRK -- MOS72 1273 F543 DF = CFSERD -- MOS72 1274 F544 45 = "E" -- MOS72 1275 F545 4F = "O" -- MOS72 1276 F546 46 = "F" -- MOS72 1277 F547 00 = &00 -- MOS72 1278 F548 -- MOS72 1279 F548 TTL C.F.S. Main Routines - PUTBYTE -- MOS72 1280 F548 OPT &01 -- MOS72 1281 F548 -- MOS72 1282 F548 -- MOS72 1283 F548 ;****************** -- MOS72 1284 F548 ;* P U T B Y T E * -- MOS72 1285 F548 ;****************** -- MOS72 1286 F548 -- MOS72 1287 F548 -- MOS72 1288 F548 [ MOS125 = &FF -- MOS72 1319 F548 | -- MOS72 1320 F548 PUTBYT -- MOS72 1321 F548 -- MOS72 1322 F548 ;Note, IADDR not used in this -- MOS72 1323 F548 ;function coz RX interrupts are "disabled" -- MOS72 1324 F548 ;by TXFLAG (see IRUPT) -- MOS72 1325 F548 -- MOS72 1326 F548 85 BC STA TEMP -- MOS72 1327 F54A 8A TXA -- MOS72 1328 F54B 48 PHA -- MOS72 1329 F54C 98 TYA -- MOS72 1330 F54D 48 PHA -- MOS72 1331 F54E A9 02 LDAIM OUTHND -- MOS72 1332 F550 20 14 F4 JSR CHKHND ;Check handle open -- MOS72 1333 F553 -- MOS72 1334 F553 A5 BC LDA TEMP -- MOS72 1335 F555 AE 9D 03 LDX OUTPTR -- MOS72 1336 F558 9D 00 09 STAAX OUTBFR -- MOS72 1337 F55B E8 INX -- MOS72 1338 F55C D0 06 BNE PBEXIT ;Test if last byte of buffer MOS72 1338 F55C v79 MOS72 1339 F55E 20 B2 F4 JSR WRTBFR ;Buffer full, write out. MOS72 1338 F55C v79 MOS72 1340 F561 20 02 FB JSR CASMOF MOS72 1338 F55C v79 MOS72 1341 F564 MOS72 1338 F55C v79 MOS72 1342 F564 EE 9D 03 PBEXIT INC OUTPTR -- MOS72 1343 F567 -- MOS72 1344 F567 ;Increment pointer after writing block out so that -- MOS72 1345 F567 ;user can retry if block is interrupted -- MOS72 1346 F567 ;by ESCAPE. -- MOS72 1347 F567 -- MOS72 1348 F567 4C AB F4 JMP GBEXX ;restores A from TEMP -- MOS72 1349 F56A ;and now IADDR is not used at all. -- MOS72 1350 F56A ] -- MOS72 1351 F56A -- MOS72 1352 F56A -- MOS72 1353 F56A -- MOS72 1354 F56A -- MOS72 1355 F56A LNK MOS74 -- MOS74 0001 F56A -- MOS74 0002 F56A ;File - MOS74 -- MOS74 0003 F56A -- MOS74 0004 F56A TTL C.F.S Main Routines - OPT -- MOS74 0005 F56A OPT &01 -- MOS74 0006 F56A -- MOS74 0007 F56A [ MOS125 = &FF -- MOS74 0037 F56A | -- MOS74 0038 F56A HELP ;*HELP command -- MOS74 0039 F56A A2 09 LDXIM SVHELP -- MOS74 0040 F56C 20 75 F1 JSR SVOP ;Y = offset within line of arguments -- MOS74 0041 F56F ; -- MOS74 0042 F56F ; Y preserved, therefore Y>=2 on return -- MOS74 0043 F56F ; -- MOS74 0044 F56F ;STROUT uses FTPTR, clobbered during OSASCI->OSBPUT -- MOS74 0045 F56F A9 0D LDAIM MCR ;start by printing CR -- MOS74 0046 F571 A8 TAY ;initialise offset -- MOS74 0047 F572 20 E3 FF HELOP JSR OSASCI MOS74 0050 F579 ^77 MOS74 0048 F575 C8 INY MOS74 0050 F579 ^77 MOS74 0049 F576 B9 B7 EA LDAAY PVER +&01 -MCR MOS74 0050 F579 ^77 MOS74 0050 F579 D0 F7 BNE HELOP -- MOS74 0051 F57B F0 30 BEQ HELOO MOS74 0051 F57B v4F MOS74 0052 F57D MOS74 0051 F57B v4F MOS74 0053 F57D RECORD MOS74 0051 F57B v4F MOS74 0054 F57D MOS74 0051 F57B v4F MOS74 0055 F57D AD 47 02 LDA SROMSW MOS74 0051 F57B v4F MOS74 0056 F580 D0 2E BNE OPTERR ;OK if not in SFS MOS74 0051 F57B v4F MOS74 0057 F582 20 A0 FB JSR MOTONW ;Motor ON for OUTPUT MOS74 0051 F57B v4F MOS74 0058 F585 20 D5 FB JSR BUGFIX MOS74 0051 F57B v4F MOS74 0059 F588 20 6E EA JSR MSGON MOS74 0051 F57B v4F MOS74 0060 F58B F0 45 BEQ RECEXX MOS74 0060 F58B v3A MOS74 0061 F58D MOS74 0060 F58B v3A MOS74 0062 F58D 20 57 FA JSR MSGOUT ;If messages ON, prompt MOS74 0060 F58B v3A MOS74 0063 F590 52 45 43 = "RECORD then RETURN" MOS74 0060 F58B v3A MOS74 0064 F5A2 00 = &00 MOS74 0060 F58B v3A MOS74 0065 F5A3 MOS74 0060 F58B v3A MOS74 0066 F5A3 20 A7 F9 GETCR1 JSR ESCAPE MOS74 0060 F58B v3A MOS74 0067 F5A6 20 E0 FF JSR OSRDCH MOS74 0060 F58B v3A MOS74 0068 F5A9 C9 0D CMPIM MCR MOS74 0060 F58B v3A MOS74 0069 F5AB D0 F6 BNE GETCR1 MOS74 0060 F58B v3A MOS74 0070 F5AD 4C E7 FF HELOO JMP OSNEWL MOS74 0060 F58B v3A MOS74 0071 F5B0 MOS74 0060 F58B v3A MOS74 0072 F5B0 MOS74 0060 F58B v3A MOS74 0073 F5B0 4C 4A E4 OPTERR JMP MBDCMD MOS74 0060 F58B v3A MOS74 0074 F5B3 MOS74 0060 F58B v3A MOS74 0075 F5B3 ;Entered with two args in X & Y decoded from MOS74 0060 F58B v3A MOS74 0076 F5B3 ;command line by MOS. MOS74 0060 F58B v3A MOS74 0077 F5B3 MOS74 0060 F58B v3A MOS74 0078 F5B3 E0 03 CFSOPT CPXIM &03 MOS74 0060 F58B v3A MOS74 0079 F5B5 F0 1C BEQ SETGAP MOS74 0060 F58B v3A MOS74 0080 F5B7 B0 F7 BCS OPTERR MOS74 0060 F58B v3A MOS74 0081 F5B9 A9 A1 LDAIM DEFLT MOS74 0060 F58B v3A MOS74 0082 F5BB C0 03 CPYIM &03 MOS74 0060 F58B v3A MOS74 0083 F5BD CA DEX MOS74 0060 F58B v3A MOS74 0084 F5BE 30 10 BMI SETFL1 MOS74 0060 F58B v3A MOS74 0085 F5C0 B0 EE BCS OPTERR MOS74 0060 F58B v3A MOS74 0086 F5C2 F0 05 BEQ MSGS MOS74 0060 F58B v3A MOS74 0087 F5C4 ERRS MOS74 0060 F58B v3A MOS74 0088 F5C4 C8 INY MOS74 MOS74 MOS74 MOS74 Acorn macro assembler Page 135 MOS74 C.F.S Main Routines - OPT MOS74 MOS74 0060 F58B v3A MOS74 0089 F5C5 C8 INY MOS74 0060 F58B v3A MOS74 0090 F5C6 C8 INY MOS74 0060 F58B v3A MOS74 0091 F5C7 49 FF EORIM MSGMSK:EOR:ERRMSK ;Mask out error and default bits MOS74 0060 F58B v3A MOS74 0092 F5C9 49 92 MSGS EORIM DEFLT:EOR:MSGMSK MOS74 0060 F58B v3A MOS74 0093 F5CB XSETFLG MOS74 0060 F58B v3A MOS74 0094 F5CB 25 E3 AND OPTS MOS74 0060 F58B v3A MOS74 0095 F5CD 19 D5 F6 ORAAY OPTTAB MOS74 0060 F58B v3A MOS74 0096 F5D0 SETFL1 MOS74 0060 F58B v3A MOS74 0097 F5D0 85 E3 STA OPTS MOS74 0060 F58B v3A MOS74 0098 F5D2 RECEXX MOS74 0060 F58B v3A MOS74 0099 F5D2 60 RTS MOS74 0079 F5B5 v63 MOS74 0100 F5D3 ] MOS74 0079 F5B5 v63 MOS74 0101 F5D3 MOS74 0079 F5B5 v63 MOS74 0102 F5D3 98 SETGAP TYA -- MOS74 0103 F5D4 30 02 BMI SETGP2 ; >127 => default MOS74 0103 F5D4 v7D MOS74 0104 F5D6 D0 02 BNE SETGP1 ; 0 < gap < 128 => OK MOS74 0103 F5D4 v7D MOS74 0105 F5D8 A9 19 SETGP2 LDAIM DEFGAP MOS74 0104 F5D6 v7D MOS74 0106 F5DA 8D D1 03 SETGP1 STA SEQGAP -- MOS74 0107 F5DD 60 RTS -- MOS74 0108 F5DE -- MOS74 0109 F5DE [ MOS125 = &FF -- MOS74 0120 F5DE ] -- MOS74 0121 F5DE -- MOS74 0122 F5DE TTL Main Routines - Interrupt routine -- MOS74 0123 F5DE OPT &01 -- MOS74 0124 F5DE -- MOS74 0125 F5DE IRUPT -- MOS74 0126 F5DE -- MOS74 0127 F5DE C6 C0 DEC IFLAG -- MOS74 0128 F5E0 AD 47 02 LDA SROMSW ;Is SFS active ? -- MOS74 0129 F5E3 F0 06 BEQ NOTSPK ;Nope MOS74 0129 F5E3 v79 MOS74 0130 F5E5 ;GoMMC tape patch has F58D NOP;NOP MOS74 0129 F5E3 v79 MOS74 0131 F5E5 MOS74 0129 F5E3 v79 MOS74 0132 F5E5 20 91 EE JSR RDSPCH ;Yes, get next byte from ROM MOS74 0129 F5E3 v79 MOS74 0133 F5E8 [ MOS125 = &FF MOS74 0129 F5E3 v79 MOS74 0135 F5E8 ] MOS74 0129 F5E3 v79 MOS74 0136 F5E8 18 CLC ;Clear carry => no DCD MOS74 0129 F5E3 v79 MOS74 0137 F5E9 90 1A BCC DOIRPT ;Do as per cassette irupt MOS74 0137 F5E9 v65 MOS74 0138 F5EB MOS74 0137 F5E9 v65 MOS74 0139 F5EB AD 08 FE NOTSPK LDA STATUS MOS74 0137 F5E9 v65 MOS74 0140 F5EE 48 PHA MOS74 0137 F5E9 v65 MOS74 0141 F5EF 29 02 ANDIM TXBIT MOS74 0137 F5E9 v65 MOS74 0142 F5F1 F0 0B BEQ ITXON ;No TX interrupt MOS74 0137 F5E9 v65 MOS74 0143 F5F3 A4 CA LDY TXFLAG MOS74 0137 F5E9 v65 MOS74 0144 F5F5 F0 07 BEQ ITXON ;0 => receiving MOS74 0137 F5E9 v65 MOS74 0145 F5F7 MOS74 0137 F5E9 v65 MOS74 0146 F5F7 ;Here, transmiting byte .... MOS74 0137 F5E9 v65 MOS74 0147 F5F7 MOS74 0137 F5E9 v65 MOS74 0148 F5F7 68 PLA ;Restore stack MOS74 0137 F5E9 v65 MOS74 0149 F5F8 A5 BD LDA IBUF MOS74 0137 F5E9 v65 MOS74 0150 F5FA 8D 09 FE STA PORT MOS74 0137 F5E9 v65 MOS74 0151 F5FD 60 RTS MOS74 0137 F5E9 v65 MOS74 0152 F5FE MOS74 0137 F5E9 v65 MOS74 0153 F5FE MOS74 0137 F5E9 v65 MOS74 0154 F5FE ITXON MOS74 0137 F5E9 v65 MOS74 0155 F5FE MOS74 0137 F5E9 v65 MOS74 0156 F5FE ;If receiving byte, check IFLAG to see MOS74 0137 F5E9 v65 MOS74 0157 F5FE ;where to put it. MOS74 0137 F5E9 v65 MOS74 0158 F5FE MOS74 0137 F5E9 v65 MOS74 0159 F5FE AC 09 FE LDY PORT ;Cancel interrupt MOS74 0137 F5E9 v65 MOS74 0160 F601 68 PLA ;Pull status MOS74 0137 F5E9 v65 MOS74 0161 F602 4A LSRA MOS74 0137 F5E9 v65 MOS74 0162 F603 4A LSRA MOS74 0137 F5E9 v65 MOS74 0163 F604 4A LSRA ;C = 1 => DCD; C = 0 => no DCD MOS74 0137 F5E9 v65 MOS74 0164 F605 A6 C2 DOIRPT LDX ITYPE -- MOS74 0165 F607 F0 65 BEQ IEX ;0 => no task pending MOS74 0165 F607 v1A MOS74 0166 F609 MOS74 0165 F607 v1A MOS74 0167 F609 MOS74 0165 F607 v1A MOS74 0168 F609 CA DEX MOS74 0165 F607 v1A MOS74 0169 F60A D0 06 BNE FNDHDR ;X <> 1 => not DCD task MOS74 0165 F607 v1A MOS74 0170 F60C 90 60 BCC IEX ;=> DCD Not yet found MOS74 0165 F607 v1A MOS74 0171 F60E A0 02 LDYIM &02 MOS74 0165 F607 v1A MOS74 0172 F610 D0 5A BNE NEWINT ;Go on to look find hdr. MOS74 0165 F607 v1A MOS74 0173 F612 MOS74 0165 F607 v1A MOS74 0174 F612 CA FNDHDR DEX MOS74 0165 F607 v1A MOS74 0175 F613 D0 13 BNE RDCHAR ;X <> 2 => not header task MOS74 0165 F607 v1A MOS74 0176 F615 B0 57 BCS IEX ;Ignore DCD if present MOS74 0165 F607 v1A MOS74 0177 F617 98 TYA ;Get stuff from port MOS74 0165 F607 v1A MOS74 0178 F618 20 88 FB JSR SETJOB ;Set CHKSUM etc. MOS74 0165 F607 v1A MOS74 0179 F61B A0 03 LDYIM &03 ;New task MOS74 0165 F607 v1A MOS74 0180 F61D MOS74 0165 F607 v1A MOS74 0181 F61D [ GLYN=0 MOS74 0165 F607 v1A MOS74 0185 F61D ] MOS74 0165 F607 v1A MOS74 0186 F61D MOS74 0165 F607 v1A MOS74 0187 F61D C9 2A CMPIM "*" MOS74 0165 F607 v1A MOS74 0188 F61F F0 4B BEQ NEWINT ;Set read chars MOS74 0165 F607 v1A MOS74 0189 F621 20 60 FB JSR RXINIT ;Reset ULA (should be BLIP) MOS74 0165 F607 v1A MOS74 0190 F624 A0 01 LDYIM &01 MOS74 0165 F607 v1A MOS74 0191 F626 D0 44 BNE NEWINT ;Otherwise, wait for DCD MOS74 0165 F607 v1A MOS74 0192 F628 MOS74 0165 F607 v1A MOS74 0193 F628 CA RDCHAR DEX MOS74 0165 F607 v1A MOS74 0194 F629 D0 0A BNE RDBLK ;X <> 3 => not RDCHAR task MOS74 0165 F607 v1A MOS74 0195 F62B B0 03 BCS GOTDCD ;DCD found, not char MOS74 0165 F607 v1A MOS74 0196 F62D 84 BD STY IBUF ;Store char read MOS74 0165 F607 v1A MOS74 0197 F62F [ MOS125 = &FF MOS74 0165 F607 v1A MOS74 0199 F62F | MOS74 0165 F607 v1A MOS74 0200 F62F 60 RTS MOS74 0165 F607 v1A MOS74 0201 F630 ] MOS74 0165 F607 v1A MOS74 0202 F630 A9 80 GOTDCD LDAIM &80 MOS74 0165 F607 v1A MOS74 0203 F632 85 C0 STA IFLAG ;Indicate DCD MOS74 0165 F607 v1A MOS74 0204 F634 [ MOS125 = &FF MOS74 0165 F607 v1A MOS74 0206 F634 | MOS74 0165 F607 v1A MOS74 0207 F634 60 RTS MOS74 0165 F607 v1A MOS74 0208 F635 ] MOS74 0165 F607 v1A MOS74 0209 F635 MOS74 0165 F607 v1A MOS74 0210 F635 CA RDBLK DEX ;X <> 4=> not RDBLK MOS74 0165 F607 v1A MOS74 0211 F636 D0 27 BNE SUMIN MOS74 0165 F607 v1A MOS74 0212 F638 B0 2D BCS IFIN ;If DCD, finish immediately MOS74 0165 F607 v1A MOS74 0213 F63A 98 TYA MOS74 0165 F607 v1A MOS74 0214 F63B 20 02 F8 JSR ADDCRC MOS74 0165 F607 v1A MOS74 0215 F63E A4 BC LDY TEMP ;(pointer) MOS74 0165 F607 v1A MOS74 0216 F640 E6 BC INC TEMP MOS74 0165 F607 v1A MOS74 0217 F642 24 BD BIT IBUF MOS74 0165 F607 v1A MOS74 0218 F644 30 0D BMI RDBLKA ;=> just verify, don't store MOS74 0165 F607 v1A MOS74 0219 F646 MOS74 0165 F607 v1A MOS74 0220 F646 [ TUBESW=0 MOS74 0165 F607 v1A MOS74 0221 F646 20 C6 FB JSR TUBCHK ;Check tube present and top bytes of address MOS74 0165 F607 v1A MOS74 0222 F649 F0 05 BEQ RDBLKB ;No need to tube. (NOTE TUBCHK DOES TAX to preserve A) MOS74 0165 F607 v1A MOS74 0223 F64B MOS74 0165 F607 v1A MOS74 0224 F64B 8E E5 FE STX TREG3 ;Otherwise, push to tube R3 MOS74 0165 F607 v1A MOS74 0225 F64E D0 03 BNE RDBLKA ;And continue MOS74 MOS74 MOS74 MOS74 Acorn macro assembler Page 136 MOS74 Main Routines - Interrupt routine MOS74 MOS74 0165 F607 v1A MOS74 0226 F650 MOS74 0165 F607 v1A MOS74 0227 F650 8A RDBLKB TXA MOS74 0165 F607 v1A MOS74 0228 F651 91 B0 STAIY BKADDR ;Store in IO proc. MOS74 0165 F607 v1A MOS74 0229 F653 | MOS74 0165 F607 v1A MOS74 0231 F653 ] MOS74 0165 F607 v1A MOS74 0232 F653 MOS74 0165 F607 v1A MOS74 0233 F653 C8 RDBLKA INY MOS74 0165 F607 v1A MOS74 0234 F654 CC C8 03 CPY INFO +BKSZEL ;** 1 BYTE SIZE ONLY ** MOS74 0165 F607 v1A MOS74 0235 F657 D0 15 BNE IEX ;Keep going MOS74 0165 F607 v1A MOS74 0236 F659 MOS74 0165 F607 v1A MOS74 0237 F659 ;Have here finished reading data, so MOS74 0165 F607 v1A MOS74 0238 F659 ;read two more bytes of CRC without storing MOS74 0165 F607 v1A MOS74 0239 F659 MOS74 0165 F607 v1A MOS74 0240 F659 [ MOS125 = &FF MOS74 0165 F607 v1A MOS74 0244 F659 | MOS74 0165 F607 v1A MOS74 0245 F659 A0 05 LDYIM &05 ;NB bit 1 <> bit 0 MOS74 0165 F607 v1A MOS74 0246 F65B 84 BC STY TEMP ;Set counter MOS74 0165 F607 v1A MOS74 0247 F65D ] MOS74 0165 F607 v1A MOS74 0248 F65D D0 0D BNE NEWINT MOS74 0165 F607 v1A MOS74 0249 F65F MOS74 0165 F607 v1A MOS74 0250 F65F MOS74 0165 F607 v1A MOS74 0251 F65F SUMIN MOS74 0165 F607 v1A MOS74 0252 F65F MOS74 0165 F607 v1A MOS74 0253 F65F ;Here, assumed X = 5 MOS74 0165 F607 v1A MOS74 0254 F65F MOS74 0165 F607 v1A MOS74 0255 F65F 98 TYA MOS74 0165 F607 v1A MOS74 0256 F660 20 02 F8 JSR ADDCRC MOS74 0165 F607 v1A MOS74 0257 F663 [ MOS125 = &FF MOS74 0165 F607 v1A MOS74 0260 F663 | MOS74 0165 F607 v1A MOS74 0261 F663 46 BC LSR TEMP ;NB alters returned C MOS74 0165 F607 v1A MOS74 0262 F665 B0 07 BCS IEX ;One more to go MOS74 0165 F607 v1A MOS74 0263 F667 ] MOS74 0165 F607 v1A MOS74 0264 F667 MOS74 0165 F607 v1A MOS74 0265 F667 ;If here, finished, so mark BG job finished MOS74 0165 F607 v1A MOS74 0266 F667 MOS74 0165 F607 v1A MOS74 0267 F667 20 56 FB IFIN JSR CRESET MOS74 0165 F607 v1A MOS74 0268 F66A A0 00 LDYIM &00 MOS74 0165 F607 v1A MOS74 0269 F66C 84 C2 NEWINT STY ITYPE MOS74 0165 F607 v1A MOS74 0270 F66E 60 IEX RTS -- MOS74 0271 F66F -- MOS74 0272 F66F TTL C.F.S. Main routines - EOF -- MOS74 0273 F66F OPT MOS74 MOS74 MOS74 MOS74 MOS74 Acorn macro assembler Page 137 MOS74 C.F.S. Main routines - EOF MOS74 -- MOS74 0274 F66F -- MOS74 0275 F66F 48 CFSEOF PHA ;First store Y and A -- MOS74 0276 F670 98 TYA -- MOS74 0277 F671 48 PHA -- MOS74 0278 F672 8A TXA ;Transfer handle to Y -- MOS74 0279 F673 A8 TAY ;for checking. -- MOS74 0280 F674 A9 03 LDAIM HNDS ;Both handles -- MOS74 0281 F676 20 14 F4 JSR CHKHND ;NOTE - CORRUPTS Y -- MOS74 0282 F679 -- MOS74 0283 F679 A5 E2 LDA CFSTAT -- MOS74 0284 F67B 29 40 ANDIM LSTBYT -- MOS74 0285 F67D AA TAX ;Result (zero or non-zero) in X -- MOS74 0286 F67E 68 PLA -- MOS74 0287 F67F A8 TAY -- MOS74 0288 F680 68 PLA ;Restore A and Y -- MOS74 0289 F681 60 RTS -- MOS74 0290 F682 -- MOS74 0291 F682 TTL C.F.S. UTILITIES - MOS74 -- MOS74 0292 F682 OPT &01 -- MOS74 0293 F682 -- MOS74 0294 F682 ;****** CASSETTE UTILITIES ****** -- MOS74 0295 F682 -- MOS74 0296 F682 -- MOS74 0297 F682 A9 00 SRCH0 LDAIM &00 -- MOS74 0298 F684 85 B4 STA BLOKNO -- MOS74 0299 F686 85 B5 STA BLOKNO +&01 -- MOS74 0300 F688 -- MOS74 0301 F688 SEARCH -- MOS74 0302 F688 -- MOS74 0303 F688 -- MOS74 0304 F688 ;File title pointed to by FTPTR. -- MOS74 0305 F688 ;Block number in BLOKNO. -- MOS74 0306 F688 -- MOS74 0307 F688 ;Tool through tape until found. If messages -- MOS74 0308 F688 ;on, print header info and checksum messages. -- MOS74 0309 F688 -- MOS74 0310 F688 A5 B4 LDA BLOKNO -- MOS74 0311 F68A 48 PHA -- MOS74 0312 F68B 85 B6 STA SRCHBK -- MOS74 0313 F68D A5 B5 LDA BLOKNO +&01 -- MOS74 0314 F68F 48 PHA -- MOS74 0315 F690 85 B7 STA SRCHBK +&01 ;Set block to search for -- MOS74 0316 F692 20 57 FA JSR MSGOUT -- MOS74 0317 F695 53 65 61 = "Searching",MCR,&00 -- MOS74 0318 F6A0 A9 FF LDAIM &FF ;=> search and validate -- MOS74 0319 F6A2 20 6E F3 JSR LOOK -- MOS74 0320 F6A5 68 PLA -- MOS74 0321 F6A6 85 B5 STA BLOKNO +&01 -- MOS74 0322 F6A8 68 PLA -- MOS74 0323 F6A9 85 B4 STA BLOKNO -- MOS74 0324 F6AB A5 B6 LDA SRCHBK -- MOS74 0325 F6AD 05 B7 ORA SRCHBK+&01 -- MOS74 0326 F6AF D0 0D BNE SRCHXX MOS74 0326 F6AF v72 MOS74 0327 F6B1 MOS74 0326 F6AF v72 MOS74 0328 F6B1 ;If finding first block, set next expected MOS74 0326 F6AF v72 MOS74 0329 F6B1 ;block to zero so that a load will not MOS74 0326 F6AF v72 MOS74 0330 F6B1 ;fail because of a new file breaking into MOS74 0326 F6AF v72 MOS74 0331 F6B1 ;a previous one thus causing non-sequential MOS74 0326 F6AF v72 MOS74 0332 F6B1 ;blocks and therefore a block? error. MOS74 0326 F6AF v72 MOS74 0333 F6B1 MOS74 0326 F6AF v72 MOS74 0334 F6B1 85 B4 STA BLOKNO ;If first block, no block error MOS74 0326 F6AF v72 MOS74 0335 F6B3 85 B5 STA BLOKNO +&01 MOS74 0326 F6AF v72 MOS74 0336 F6B5 MOS74 0326 F6AF v72 MOS74 0337 F6B5 ;Check header CRC so that we only latch MOS74 0326 F6AF v72 MOS74 0338 F6B5 ;onto non-corrupt file names MOS74 0326 F6AF v72 MOS74 0339 F6B5 MOS74 0326 F6AF v72 MOS74 0340 F6B5 A5 C1 LDA HDRCRC MOS74 0326 F6AF v72 MOS74 0341 F6B7 D0 05 BNE SRCHXX MOS74 0326 F6AF v72 MOS74 0342 F6B9 A2 B1 LDXIM INFO -&01 ;Make sure looking for MOS74 0326 F6AF v72 MOS74 0343 F6BB 20 93 FB JSR MOVFN ;file name found in subsequent blocks MOS74 0326 F6AF v72 MOS74 0344 F6BE SRCHXX ;Check if run off the end of SROM system MOS74 0326 F6AF v72 MOS74 0345 F6BE MOS74 0326 F6AF v72 MOS74 0346 F6BE AD 47 02 LDA SROMSW -- MOS74 0347 F6C1 F0 18 BEQ SRCHYY ;In CFS, carry on MOS74 0347 F6C1 v67 MOS74 0348 F6C3 70 16 BVS SRCHYY ;Not end of ROM => continue MOS74 0347 F6C1 v67 MOS74 0349 F6C5 FNF MOS74 0347 F6C1 v67 MOS74 0350 F6C5 00 BRK MOS74 0398 F6FC ^47 MOS74 0351 F6C6 D6 = SFSER1 MOS74 0398 F6FC ^47 MOS74 0352 F6C7 [ MOS125 = &FF MOS74 0398 F6FC ^47 MOS74 0354 F6C7 | MOS74 0398 F6FC ^47 MOS74 0355 F6C7 46 69 6C = "File not found" MOS74 0398 F6FC ^47 MOS74 0356 F6D5 OPTTAB MOS74 0398 F6FC ^47 MOS74 0357 F6D5 00 = &00 ;Messages off MOS74 0398 F6FC ^47 MOS74 0358 F6D6 88 = MSGS1 ;Short messages MOS74 0398 F6FC ^47 MOS74 0359 F6D7 CC = MSGS2 ;Long messages MOS74 0398 F6FC ^47 MOS74 0360 F6D8 00 = IGBIT MOS74 0398 F6FC ^47 MOS74 0361 F6D9 22 = RETBIT MOS74 0398 F6FC ^47 MOS74 0362 F6DA 11 = ABTBIT MOS74 0398 F6FC ^47 MOS74 0363 F6DB ] MOS74 0398 F6FC ^47 MOS74 0364 F6DB MOS74 0398 F6FC ^47 MOS74 0365 F6DB A0 FF SRCHYY LDYIM &FF ;For LOAD and RDBFER MOS74 0398 F6FC ^47 MOS74 0366 F6DD 8C DF 03 STY OLDFLG ;Fool PRTHDR to print MOS74 0398 F6FC ^47 MOS74 0367 F6E0 ;extra blank line after "Loading" message MOS74 0398 F6FC ^47 MOS74 0368 F6E0 60 RTS MOS74 0398 F6FC ^47 MOS74 0369 F6E1 MOS74 0398 F6FC ^47 MOS74 0370 F6E1 MOS74 0398 F6FC ^47 MOS74 0371 F6E1 ECLOSE ;close EXEC file MOS74 0398 F6FC ^47 MOS74 0372 F6E1 MOS74 0398 F6FC ^47 MOS74 0373 F6E1 A9 00 LDAIM ZERO MOS74 0398 F6FC ^47 MOS74 0374 F6E3 ; MOS74 0398 F6FC ^47 MOS74 0375 F6E3 EXEC ; EXEC MOS74 0398 F6FC ^47 MOS74 0376 F6E3 MOS74 0398 F6FC ^47 MOS74 0377 F6E3 ; XY -> filename MOS74 0398 F6FC ^47 MOS74 0378 F6E3 ; A = $00 MOS74 0398 F6FC ^47 MOS74 0379 F6E3 ; MOS74 0398 F6FC ^47 MOS74 0380 F6E3 ; does not corrupt Y if just closing file (used by SHUTES) MOS74 0398 F6FC ^47 MOS74 0381 F6E3 ; MOS74 0398 F6FC ^47 MOS74 0382 F6E3 08 PHP ;remember whether to just close exec file MOS74 0398 F6FC ^47 MOS74 0383 F6E4 84 E6 STY EXECY ;save Y MOS74 0398 F6FC ^47 MOS74 0384 F6E6 ; close any previous exec file MOS74 0398 F6FC ^47 MOS74 0385 F6E6 AC 56 02 LDY EXECH MOS74 0398 F6FC ^47 MOS74 0386 F6E9 8D 56 02 STA EXECH ;clear execing MOS74 0398 F6FC ^47 MOS74 0387 F6EC F0 03 BEQ EXEC2 ;[no current exec file, avoid closing all files] MOS74 0398 F6FC ^47 MOS74 0388 F6EE ; A=0 MOS74 0398 F6FC ^47 MOS74 0389 F6EE 20 CE FF JSR OSFIND ;close previous exec file (assumes X not corrupted) MOS74 0398 F6FC ^47 MOS74 0390 F6F1 EXEC2 MOS74 0398 F6FC ^47 MOS74 0391 F6F1 A4 E6 LDY EXECY ;restore Y MOS74 0398 F6FC ^47 MOS74 0392 F6F3 28 PLP MOS74 0398 F6FC ^47 MOS74 0393 F6F4 F0 0B BEQ EXEC0 ;[just stop execing] MOS74 0398 F6FC ^47 MOS74 0394 F6F6 ; try opening specified file MOS74 0398 F6FC ^47 MOS74 0395 F6F6 A9 40 LDAIM &40 ;open file for input MOS74 MOS74 MOS74 MOS74 Acorn macro assembler Page 138 MOS74 C.F.S. UTILITIES - MOS74 MOS74 MOS74 0398 F6FC ^47 MOS74 0396 F6F8 20 CE FF JSR OSFIND MOS74 0398 F6FC ^47 MOS74 0397 F6FB A8 TAY MOS74 0398 F6FC ^47 MOS74 0398 F6FC F0 C7 BEQ FNF ;[file not found] MOS74 0393 F6F4 v74 MOS74 0399 F6FE 8D 56 02 STA EXECH ;remember exec file handle MOS74 0393 F6F4 v74 MOS74 0400 F701 EXEC0 ;Z=1 MOS74 0393 F6F4 v74 MOS74 0401 F701 60 RTS -- MOS74 0402 F702 -- MOS74 0403 F702 -- MOS74 0404 F702 RDBFER -- MOS74 0405 F702 -- MOS74 0406 F702 -- MOS74 0407 F702 ;Read a block into input buffer. Used in GETBYTE -- MOS74 0408 F702 -- MOS74 0409 F702 A2 A6 LDXIM INFILE -&01 -- MOS74 0410 F704 20 93 FB JSR MOVFN ;Set file searching for -- MOS74 0411 F707 20 CD F7 JSR RDHEAD -- MOS74 0412 F70A -- MOS74 0413 F70A RDBFRS -- MOS74 0414 F70A -- MOS74 0415 F70A AD CA 03 LDA INFO +BKFLAG ;Check protection bit MOS74 0469 F75B ^2D MOS74 0416 F70D 4A LSRA MOS74 0469 F75B ^2D MOS74 0417 F70E 90 03 BCC RDBFLL ;Not protected -> continue MOS74 0469 F75B ^2D MOS74 0418 F710 4C 93 F2 JMP PROTER ;Protected -> error MOS74 0469 F75B ^2D MOS74 0419 F713 MOS74 0469 F75B ^2D MOS74 0420 F713 AD DD 03 RDBFLL LDA NEXTIN MOS74 0469 F75B ^2D MOS74 0421 F716 85 B4 STA BLOKNO MOS74 0469 F75B ^2D MOS74 0422 F718 AD DE 03 LDA NEXTIN +&01 MOS74 0469 F75B ^2D MOS74 0423 F71B 85 B5 STA BLOKNO +&01 ;Set block no. to check MOS74 0469 F75B ^2D MOS74 0424 F71D MOS74 0469 F75B ^2D MOS74 0425 F71D A9 00 LDAIM INBUFR MOS74 0469 F75B ^2D MOS74 0426 F71F 85 B0 STA BKADDR MOS74 0469 F75B ^2D MOS74 0427 F721 A9 0A LDAIM /(INBUFR ) MOS74 0469 F75B ^2D MOS74 0428 F723 85 B1 STA BKADDR +&01 MOS74 0469 F75B ^2D MOS74 0429 F725 A9 FF LDAIM &FF MOS74 0469 F75B ^2D MOS74 0430 F727 85 B2 STA BKADDR +&02 MOS74 0469 F75B ^2D MOS74 0431 F729 85 B3 STA BKADDR +&03 ;Input buffer is in IO proc. MOS74 0469 F75B ^2D MOS74 0432 F72B 20 21 F8 JSR READBK ;Read data into buffer MOS74 0469 F75B ^2D MOS74 0433 F72E 20 C6 F9 JSR LODHDR MOS74 0469 F75B ^2D MOS74 0434 F731 D0 25 BNE RDBERR MOS74 0469 F75B ^2D MOS74 0435 F733 MOS74 0469 F75B ^2D MOS74 0436 F733 ;Data read ok, inc. next expected block. MOS74 0469 F75B ^2D MOS74 0437 F733 MOS74 0469 F75B ^2D MOS74 0438 F733 AD FF 0A LDA INBUFR +&FF MOS74 0469 F75B ^2D MOS74 0439 F736 8D ED 02 STA FINBYT ;Store final byte of this buffer in safe place MOS74 0469 F75B ^2D MOS74 0440 F739 MOS74 0469 F75B ^2D MOS74 0441 F739 20 79 FB JSR NXTBLK ;Next block = current block + 1 MOS74 0469 F75B ^2D MOS74 0442 F73C ;NOTE - corrupts BLOKNO MOS74 0469 F75B ^2D MOS74 0443 F73C MOS74 0469 F75B ^2D MOS74 0444 F73C 8E DD 03 STX NEXTIN MOS74 0469 F75B ^2D MOS74 0445 F73F 8C DE 03 STY NEXTIN +&01 MOS74 0469 F75B ^2D MOS74 0446 F742 MOS74 0469 F75B ^2D MOS74 0447 F742 A2 02 LDXIM &02 MOS74 0469 F75B ^2D MOS74 0448 F744 MOS74 0469 F75B ^2D MOS74 0449 F744 ;Set block size and flag byte MOS74 0469 F75B ^2D MOS74 0450 F744 MOS74 0469 F75B ^2D MOS74 0451 F744 BD C8 03 RDBFL1 LDAAX INFO +BKSZEL MOS74 0469 F75B ^2D MOS74 0452 F747 9D EA 02 STAAX INBSZE MOS74 0469 F75B ^2D MOS74 0453 F74A CA DEX MOS74 0469 F75B ^2D MOS74 0454 F74B 10 F7 BPL RDBFL1 MOS74 0469 F75B ^2D MOS74 0455 F74D 2C EC 02 BIT BUFFLG MOS74 0469 F75B ^2D MOS74 0456 F750 10 03 BPL RDBFL8 MOS74 0469 F75B ^2D MOS74 0457 F752 20 E9 F2 JSR NOOLN1 ;If last block, new line MOS74 0469 F75B ^2D MOS74 0458 F755 MOS74 0469 F75B ^2D MOS74 0459 F755 4C 02 FB RDBFL8 JMP CASMOF ;Motor off, exit MOS74 0469 F75B ^2D MOS74 0460 F758 MOS74 0469 F75B ^2D MOS74 0461 F758 ;From here down, dealing with errors MOS74 0469 F75B ^2D MOS74 0462 F758 MOS74 0469 F75B ^2D MOS74 0463 F758 RDBERR MOS74 0469 F75B ^2D MOS74 0464 F758 MOS74 0469 F75B ^2D MOS74 0465 F758 ;Retry - search for block number, and MOS74 0469 F75B ^2D MOS74 0466 F758 ;then go back to RDBFRS. MOS74 0469 F75B ^2D MOS74 0467 F758 MOS74 0469 F75B ^2D MOS74 0468 F758 20 88 F6 JSR SEARCH ;FTPTR already set by RDHEAD. MOS74 0469 F75B ^2D MOS74 0469 F75B D0 AD BNE RDBFRS ;Restart (always jump back) -- MOS74 0470 F75D -- MOS74 0471 F75D -- MOS74 0472 F75D -- MOS74 0473 F75D -- MOS74 0474 F75D -- MOS74 0475 F75D C9 2A RDHDLC CMPIM "*" MOS74 0575 F7D7 ^04 MOS74 0476 F75F F0 35 BEQ RDHDLA ;Char OK, go on to rest of block MOS74 0575 F7D7 ^04 MOS74 0477 F761 C9 23 CMPIM "#" ;Is this a short header ?? MOS74 0575 F7D7 ^04 MOS74 0478 F763 D0 0D BNE ROMER ;No -> illegal char -> error MOS74 0575 F7D7 ^04 MOS74 0479 F765 EE C6 03 INC INFO +BKNOLO ;Have "read" short block header, so MOS74 0575 F7D7 ^04 MOS74 0480 F768 D0 03 BNE RDHDX2 ;increment block number as if we have read whole header MOS74 0575 F7D7 ^04 MOS74 0481 F76A EE C7 03 INC INFO +BKNOHI MOS74 0575 F7D7 ^04 MOS74 0482 F76D [ MOS125 = &FF MOS74 0575 F7D7 ^04 MOS74 0485 F76D | MOS74 0575 F7D7 ^04 MOS74 0486 F76D 69 7F RDHDX2 ADCIM &7F ;C=1, A=&23; set V:=1 => not end of SFS, A:=&A3 MOS74 0575 F7D7 ^04 MOS74 0487 F76F AA TAX ;Prepare for non-DCD exit (X:=&A3, HW=4; was X:=&FF) MOS74 0575 F7D7 ^04 MOS74 0488 F770 ] MOS74 0575 F7D7 ^04 MOS74 0489 F770 D0 53 BNE RDHDX1 ;Assumed always +ve MOS74 0575 F7D7 ^04 MOS74 0490 F772 MOS74 0575 F7D7 ^04 MOS74 0491 F772 A9 F7 ROMER LDAIM NCTBIT MOS74 0575 F7D7 ^04 MOS74 0492 F774 MOS74 0575 F7D7 ^04 MOS74 0493 F774 ;Switch CAT bit off so messages not in a funny MOS74 0575 F7D7 ^04 MOS74 0494 F774 ;state if error occurs in *CAT MOS74 0575 F7D7 ^04 MOS74 0495 F774 MOS74 0575 F7D7 ^04 MOS74 0496 F774 20 46 F3 JSR ANDSTA MOS74 0575 F7D7 ^04 MOS74 0497 F777 00 BRK MOS74 0575 F7D7 ^04 MOS74 0498 F778 D7 = SFSERR MOS74 0575 F7D7 ^04 MOS74 0499 F779 42 61 64 = "Bad ROM" MOS74 0575 F7D7 ^04 MOS74 0500 F780 00 = &00 MOS74 0575 F7D7 ^04 MOS74 0501 F781 MOS74 0575 F7D7 ^04 MOS74 0502 F781 RDHDL2 MOS74 0575 F7D7 ^04 MOS74 0503 F781 MOS74 0575 F7D7 ^04 MOS74 0504 F781 ;Here, set motor on and 6850 init etc. MOS74 0575 F7D7 ^04 MOS74 0505 F781 MOS74 0575 F7D7 ^04 MOS74 0506 F781 A0 FF LDYIM READFX ;Indicate read MOS74 0575 F7D7 ^04 MOS74 0507 F783 20 A2 FB JSR MOTON ;Motor ON and drive select MOS74 0575 F7D7 ^04 MOS74 0508 F786 A9 01 LDAIM &01 MOS74 0575 F7D7 ^04 MOS74 0509 F788 85 C2 STA ITYPE MOS74 0575 F7D7 ^04 MOS74 0510 F78A 20 60 FB JSR RXINIT ;Init 6850 and blip motor MOS74 0575 F7D7 ^04 MOS74 0511 F78D MOS74 0575 F7D7 ^04 MOS74 0512 F78D ;Wait for DCD and '* character indicating MOS74 0575 F7D7 ^04 MOS74 0513 F78D ;start of block. MOS74 0575 F7D7 ^04 MOS74 0514 F78D MOS74 0575 F7D7 ^04 MOS74 0515 F78D 20 A7 F9 GETHLP JSR ESCAPE MOS74 0575 F7D7 ^04 MOS74 0516 F790 A9 03 LDAIM &03 MOS74 0575 F7D7 ^04 MOS74 0517 F792 C5 C2 CMP ITYPE MOS74 0575 F7D7 ^04 MOS74 0518 F794 D0 F7 BNE GETHLP MOS74 MOS74 MOS74 MOS74 Acorn macro assembler Page 139 MOS74 C.F.S. UTILITIES - MOS74 MOS74 MOS74 0575 F7D7 ^04 MOS74 0519 F796 MOS74 0575 F7D7 ^04 MOS74 0520 F796 [ MOS125 = &FF MOS74 0575 F7D7 ^04 MOS74 0522 F796 | MOS74 0575 F7D7 ^04 MOS74 0523 F796 RDHDLA MOS74 0575 F7D7 ^04 MOS74 0524 F796 ] MOS74 0575 F7D7 ^04 MOS74 0525 F796 20 8C FB JSR SETJB1 ;Set cheksum etc. MOS74 0575 F7D7 ^04 MOS74 0526 F799 MOS74 0575 F7D7 ^04 MOS74 0527 F799 20 E9 F7 RDHDL1 JSR CASIN ;Read and add to checksum MOS74 0575 F7D7 ^04 MOS74 0528 F79C 50 1A BVC RDHDEX ;Header interrupted by DCD MOS74 0575 F7D7 ^04 MOS74 0529 F79E 99 B2 03 STAAY INFO ;Store in INFO MOS74 0575 F7D7 ^04 MOS74 0530 F7A1 F0 06 BEQ RDHDL3 ;End of file title (Z set in CASIN) MOS74 0575 F7D7 ^04 MOS74 0531 F7A3 C8 INY MOS74 0575 F7D7 ^04 MOS74 0532 F7A4 C0 0B CPYIM FTSIZE ;Attempting to read over f.t. end MOS74 0575 F7D7 ^04 MOS74 0533 F7A6 D0 F1 BNE RDHDL1 ;No, => continue MOS74 0575 F7D7 ^04 MOS74 0534 F7A8 88 DEY MOS74 0575 F7D7 ^04 MOS74 0535 F7A9 MOS74 0575 F7D7 ^04 MOS74 0536 F7A9 A2 0C RDHDL3 LDXIM BKINFO ;Now read all info. MOS74 0575 F7D7 ^04 MOS74 0537 F7AB 20 E9 F7 RDHDL4 JSR CASIN MOS74 0575 F7D7 ^04 MOS74 0538 F7AE 50 08 BVC RDHDEX ;Header interrupted by DCD MOS74 0575 F7D7 ^04 MOS74 0539 F7B0 9D B2 03 STAAX INFO MOS74 0575 F7D7 ^04 MOS74 0540 F7B3 E8 INX MOS74 0575 F7D7 ^04 MOS74 0541 F7B4 E0 1F CPXIM BKLAST +&02 MOS74 0575 F7D7 ^04 MOS74 0542 F7B6 D0 F3 BNE RDHDL4 MOS74 0575 F7D7 ^04 MOS74 0543 F7B8 MOS74 0575 F7D7 ^04 MOS74 0544 F7B8 98 RDHDEX TYA MOS74 0575 F7D7 ^04 MOS74 0545 F7B9 AA TAX ;Preserve Y for exit MOS74 0575 F7D7 ^04 MOS74 0546 F7BA A9 00 LDAIM &00 MOS74 0575 F7D7 ^04 MOS74 0547 F7BC 99 B2 03 STAAY INFO ;Terminate f.t. MOS74 0575 F7D7 ^04 MOS74 0548 F7BF A5 BE LDA CHKSUM MOS74 0575 F7D7 ^04 MOS74 0549 F7C1 05 BF ORA CHKSUM +&01 MOS74 0575 F7D7 ^04 MOS74 0550 F7C3 85 C1 STA HDRCRC ;Store CRC indication MOS74 0575 F7D7 ^04 MOS74 0551 F7C5 20 88 FB RDHDX1 JSR SETJOB MOS74 0575 F7D7 ^04 MOS74 0552 F7C8 84 C2 STY ITYPE ;If header interrupted => block fin. MOS74 0575 F7D7 ^04 MOS74 0553 F7CA MOS74 0575 F7D7 ^04 MOS74 0554 F7CA 8A TXA MOS74 0575 F7D7 ^04 MOS74 0555 F7CB D0 1B BNE RDHDXX MOS74 0575 F7D7 ^04 MOS74 0556 F7CD MOS74 0575 F7D7 ^04 MOS74 0557 F7CD RDHEAD MOS74 0575 F7D7 ^04 MOS74 0558 F7CD MOS74 0575 F7D7 ^04 MOS74 0559 F7CD ;Read header info into INFO. Check file title MOS74 0575 F7D7 ^04 MOS74 0560 F7CD ;against FTPTR, and print header info. MOS74 0575 F7D7 ^04 MOS74 0561 F7CD MOS74 0575 F7D7 ^04 MOS74 0562 F7CD ;First, wait for DCD followed by "*" MOS74 0575 F7D7 ^04 MOS74 0563 F7CD MOS74 0575 F7D7 ^04 MOS74 0564 F7CD AD 47 02 LDA SROMSW MOS74 0575 F7D7 ^04 MOS74 0565 F7D0 F0 AF BEQ RDHDL2 ;SFS not enabled, carry on MOS74 0575 F7D7 ^04 MOS74 0566 F7D2 ;GoMMC tape patch has F77E NOP;NOP MOS74 0575 F7D7 ^04 MOS74 0567 F7D2 MOS74 0575 F7D7 ^04 MOS74 0568 F7D2 ;Here, SFS enabled, so read first char MOS74 0575 F7D7 ^04 MOS74 0569 F7D2 ;(assumed to be "*") and go on to read MOS74 0575 F7D7 ^04 MOS74 0570 F7D2 ;rest of block. MOS74 0575 F7D7 ^04 MOS74 0571 F7D2 MOS74 0575 F7D7 ^04 MOS74 0572 F7D2 RDHDLD MOS74 0575 F7D7 ^04 MOS74 0573 F7D2 20 91 EE JSR RDSPCH MOS74 0575 F7D7 ^04 MOS74 0574 F7D5 C9 2B CMPIM SFSEND ;Is "end of ROM" char ? MOS74 0575 F7D7 ^04 MOS74 0575 F7D7 D0 84 BNE RDHDLC MOS74 0555 F7CB v64 MOS74 0576 F7D9 A9 08 LDAIM CATBIT MOS74 0555 F7CB v64 MOS74 0577 F7DB 25 E2 AND CFSTAT MOS74 0555 F7CB v64 MOS74 0578 F7DD F0 03 BEQ RDHDL5 ;If not in CAT, don't do new line MOS74 0555 F7CB v64 MOS74 0579 F7DF MOS74 0555 F7CB v64 MOS74 0580 F7DF 20 ED F2 JSR NOOLIN ;New line between ROMs MOS74 0555 F7CB v64 MOS74 0581 F7E2 20 54 EE RDHDL5 JSR SRNEXT MOS74 0555 F7CB v64 MOS74 0582 F7E5 MOS74 0555 F7CB v64 MOS74 0583 F7E5 ;Carry clear => not at end of filing system, so MOS74 0555 F7CB v64 MOS74 0584 F7E5 ;read next character, assumed still to be start MOS74 0555 F7CB v64 MOS74 0585 F7E5 ;of header although in new rom. MOS74 0555 F7CB v64 MOS74 0586 F7E5 MOS74 0555 F7CB v64 MOS74 0587 F7E5 90 EB BCC RDHDLD MOS74 0555 F7CB v64 MOS74 0588 F7E7 MOS74 0555 F7CB v64 MOS74 0589 F7E7 ;Carry set => end of filing system, so MOS74 0555 F7CB v64 MOS74 0590 F7E7 ;indicate to outside world in V flag MOS74 0555 F7CB v64 MOS74 0591 F7E7 B8 CLV MOS74 0555 F7CB v64 MOS74 0592 F7E8 [ MOS125 = &FF MOS74 0555 F7CB v64 MOS74 0593 F7E8 | MOS74 0555 F7CB v64 MOS74 0594 F7E8 RDHDXX MOS74 0555 F7CB v64 MOS74 0595 F7E8 ] MOS74 0555 F7CB v64 MOS74 0596 F7E8 60 RTS -- MOS74 0597 F7E9 -- MOS74 0598 F7E9 ;Note assumed exit with Y = 0 -- MOS74 0599 F7E9 ;for LOAD and RDBFRS -- MOS74 0600 F7E9 -- MOS74 0601 F7E9 -- MOS74 0602 F7E9 -- MOS74 0603 F7E9 -- MOS74 0604 F7E9 -- MOS74 0605 F7E9 CASIN -- MOS74 0606 F7E9 AD 47 02 LDA SROMSW ;is SFS on ? -- MOS74 0607 F7EC F0 11 BEQ CASIN1 ;Nope, read from tape MOS74 0607 F7EC v6E MOS74 0608 F7EE ;GoMMC tape patch has F79A NOP;NOP MOS74 0607 F7EC v6E MOS74 0609 F7EE MOS74 0607 F7EC v6E MOS74 0610 F7EE ;Force a read from ROM & set IRUPT flag MOS74 0607 F7EC v6E MOS74 0611 F7EE MOS74 0607 F7EC v6E MOS74 0612 F7EE 8A TXA MOS74 0607 F7EC v6E MOS74 0613 F7EF 48 PHA MOS74 0607 F7EC v6E MOS74 0614 F7F0 98 TYA MOS74 0607 F7EC v6E MOS74 0615 F7F1 48 PHA MOS74 0607 F7EC v6E MOS74 0616 F7F2 20 91 EE JSR RDSPCH MOS74 0607 F7EC v6E MOS74 0617 F7F5 85 BD STA IBUF MOS74 0607 F7EC v6E MOS74 0618 F7F7 A9 FF LDAIM &FF MOS74 0607 F7EC v6E MOS74 0619 F7F9 85 C0 STA IFLAG ;=> irupt occurred, no DCD MOS74 0607 F7EC v6E MOS74 0620 F7FB 68 PLA MOS74 0607 F7EC v6E MOS74 0621 F7FC A8 TAY MOS74 0607 F7EC v6E MOS74 0622 F7FD 68 PLA MOS74 0607 F7EC v6E MOS74 0623 F7FE AA TAX MOS74 0607 F7EC v6E MOS74 0624 F7FF MOS74 0607 F7EC v6E MOS74 0625 F7FF 20 C9 F8 CASIN1 JSR IWAIT -- MOS74 0626 F802 -- MOS74 0627 F802 ;Note A=IBUF after IWAIT -- MOS74 0628 F802 -- MOS74 0629 F802 [ DEBUG=0 -- MOS74 0635 F802 ] -- MOS74 0636 F802 -- MOS74 0637 F802 [ MOS125 = &FF -- MOS74 0667 F802 | -- MOS74 0668 F802 ;Can't move to MOS05 to branch to OCSREX, fallthrough from CASIN1! -- MOS74 0669 F802 08 ADDCRC PHP -- MOS74 0670 F803 48 PHA -- MOS74 0671 F804 -- MOS74 0672 F804 0021 CCITTL * &21 -- MOS74 0673 F804 0010 CCITTH * &10 -- MOS74 0674 F804 MOS74 MOS74 MOS74 MOS74 Acorn macro assembler Page 140 MOS74 C.F.S. UTILITIES - MOS74 MOS74 -- MOS74 0675 F804 45 BF EOR CHKSUM +&01 -- MOS74 0676 F806 38 SEC -- MOS74 0677 F807 66 BF ROR CHKSUM +&01 -- MOS74 0678 F809 06 BE CRC1 ASL CHKSUM MOS74 0688 F81A ^6D MOS74 0679 F80B 2A ROLA MOS74 0688 F81A ^6D MOS74 0680 F80C 90 0A BCC CRC2 MOS74 0688 F81A ^6D MOS74 0681 F80E 48 PHA MOS74 0688 F81A ^6D MOS74 0682 F80F A5 BE LDA CHKSUM MOS74 0688 F81A ^6D MOS74 0683 F811 49 21 EORIM CCITTL MOS74 0688 F81A ^6D MOS74 0684 F813 85 BE STA CHKSUM MOS74 0688 F81A ^6D MOS74 0685 F815 68 PLA MOS74 0688 F81A ^6D MOS74 0686 F816 49 10 EORIM CCITTH MOS74 0688 F81A ^6D MOS74 0687 F818 46 BF CRC2 LSR CHKSUM +&01 MOS74 0688 F81A ^6D MOS74 0688 F81A D0 ED BNE CRC1 -- MOS74 0689 F81C 85 BF STA CHKSUM +&01 -- MOS74 0690 F81E 68 PLA -- MOS74 0691 F81F 28 PLP -- MOS74 0692 F820 60 RTS -- MOS74 0693 F821 ] -- MOS74 0694 F821 -- MOS74 0695 F821 -- MOS74 0696 F821 -- MOS74 0697 F821 -- MOS74 0698 F821 RDBLOK -- MOS74 0699 F821 -- MOS74 0700 F821 READBK -- MOS74 0701 F821 -- MOS74 0702 F821 ;Sets up BG job to read data into BKADDR -- MOS74 0703 F821 ;and read CRC. -- MOS74 0704 F821 -- MOS74 0705 F821 ;Note: must not corrupt Y ! -- MOS74 0706 F821 -- MOS74 0707 F821 A9 00 LDAIM &00 -- MOS74 0708 F823 85 BD CHKBIN STA IBUF ;Indicate read to memory -- MOS74 0709 F825 A2 00 LDXIM &00 -- MOS74 0710 F827 86 BC STX TEMP ;Pointer into data -- MOS74 0711 F829 ;If empty, data read finished, X=$00 -- MOS74 0712 F829 50 0A BVC RDBKEM ;If V clear from header read MOS74 0712 F829 v75 MOS74 0713 F82B ;just ignore all data (since hdr. MOS74 0712 F829 v75 MOS74 0714 F82B ;interrupted by DCD). MOS74 0712 F829 v75 MOS74 0715 F82B MOS74 0712 F829 v75 MOS74 0716 F82B AD C8 03 LDA INFO +BKSZEL MOS74 0712 F829 v75 MOS74 0717 F82E 0D C9 03 ORA INFO +BKSZEH MOS74 0712 F829 v75 MOS74 0718 F831 F0 02 BEQ RDBKEM ;Empty block => no BG job MOS74 0712 F829 v75 MOS74 0719 F833 MOS74 0712 F829 v75 MOS74 0720 F833 A2 04 LDXIM &04 MOS74 0712 F829 v75 MOS74 0721 F835 86 C2 RDBKEM STX ITYPE -- MOS74 0722 F837 -- MOS74 0723 F837 ;V not important from here on -- MOS74 0724 F837 -- MOS74 0725 F837 60 RTS -- MOS74 0726 F838 -- MOS74 0727 F838 -- MOS74 0728 F838 -- MOS74 0729 F838 -- MOS74 0730 F838 WRBLOK -- MOS74 0731 F838 -- MOS74 0732 F838 WBLOCK -- MOS74 0733 F838 -- MOS74 0734 F838 ;Write block pointed to by BKADDR. Expects header info -- MOS74 0735 F838 ;to be in INFO and file name in FILNAM. -- MOS74 0736 F838 -- MOS74 0737 F838 ;Assumes 6850 is in reset state, and SERPROC -- MOS74 0738 F838 ;is set with motor on. -- MOS74 0739 F838 -- MOS74 0740 F838 08 PHP ;Save I'rupt state -- MOS74 0741 F839 A2 03 LDXIM &03 ;Set spare bytes -- MOS74 0742 F83B A9 00 LDAIM &00 -- MOS74 0743 F83D 9D CB 03 SETSPR STAAX INFO +BKSPAR MOS74 0745 F841 ^7A MOS74 0744 F840 CA DEX MOS74 0745 F841 ^7A MOS74 0745 F841 10 FA BPL SETSPR -- MOS74 0746 F843 -- MOS74 0747 F843 AD C6 03 LDA INFO +BKNOLO -- MOS74 0748 F846 0D C7 03 ORA INFO +BKNOHI -- MOS74 0749 F849 D0 05 BNE WRBKL5 ;Not first block, continue MOS74 0749 F849 v7A MOS74 0750 F84B 20 D7 F8 JSR LEADER MOS74 0749 F849 v7A MOS74 0751 F84E F0 03 BEQ WRBKL4 ;Always Z exit MOS74 0749 F849 v7A MOS74 0752 F850 MOS74 0749 F849 v7A MOS74 0753 F850 20 DB F8 WRBKL5 JSR PUTGAP ;Put out inter-block gap MOS74 0751 F84E v7C MOS74 0754 F853 MOS74 0751 F84E v7C MOS74 0755 F853 A9 2A WRBKL4 LDAIM "*" -- MOS74 0756 F855 85 BD STA IBUF ;Start of block char is output IMMEDIATELY -- MOS74 0757 F857 ;on TXINIT. -- MOS74 0758 F857 -- MOS74 0759 F857 20 88 FB JSR SETJOB -- MOS74 0760 F85A -- MOS74 0761 F85A 20 5A FB JSR TXINIT ;Get 6850 ready -- MOS74 0762 F85D 20 C9 F8 JSR IWAIT ;Wait for * to go out -- MOS74 0763 F860 -- MOS74 0764 F860 88 DEY ;Set zero by SETJOB -- MOS74 0765 F861 C8 WRBKL1 INY MOS74 0772 F86B ^74 MOS74 0766 F862 B9 D2 03 LDAAY FILNAM ;Set Z flag if file terminator MOS74 0772 F86B ^74 MOS74 0767 F865 99 B2 03 STAAY INFO ;PRTHDR expects INFO to have f.t. in it MOS74 0772 F86B ^74 MOS74 0768 F868 20 78 F0 JSR PUTCHK MOS74 0772 F86B ^74 MOS74 0769 F86B MOS74 0772 F86B ^74 MOS74 0770 F86B ;Note Z flag kept over PUTCHK MOS74 0772 F86B ^74 MOS74 0771 F86B MOS74 0772 F86B ^74 MOS74 0772 F86B D0 F4 BNE WRBKL1 ;File title out. -- MOS74 0773 F86D -- MOS74 0774 F86D A2 0C LDXIM BKINFO -- MOS74 0775 F86F BD B2 03 WRBKL2 LDAAX INFO ;Rest of header to tape MOS74 0779 F878 ^75 MOS74 0776 F872 20 78 F0 JSR PUTCHK MOS74 0779 F878 ^75 MOS74 0777 F875 E8 INX MOS74 0779 F878 ^75 MOS74 0778 F876 E0 1D CPXIM BKLAST MOS74 0779 F878 ^75 MOS74 0779 F878 D0 F5 BNE WRBKL2 -- MOS74 0780 F87A -- MOS74 0781 F87A 20 C0 F8 JSR PUTCRC -- MOS74 0782 F87D -- MOS74 0783 F87D AD C8 03 LDA INFO +BKSZEL -- MOS74 0784 F880 0D C9 03 ORA INFO +BKSZEH -- MOS74 0785 F883 F0 1B BEQ WRBKEM ;Empty block MOS74 0785 F883 v64 MOS74 0786 F885 MOS74 0785 F883 v64 MOS74 0787 F885 [ MOS125 = &FF MOS74 0785 F883 v64 MOS74 0789 F885 ] MOS74 0785 F883 v64 MOS74 0790 F885 20 8C FB JSR SETJB1 MOS74 0785 F883 v64 MOS74 0791 F888 WRBKL3 MOS74 0785 F883 v64 MOS74 0792 F888 [ MOS125 = &FF MOS74 0785 F883 v64 MOS74 0804 F888 | MOS74 0785 F883 v64 MOS74 0805 F888 [ TUBESW=0 MOS74 0785 F883 v64 MOS74 0806 F888 20 C6 FB JSR TUBCHK ;Check tube present and top two bytes of address MOS74 0785 F883 v64 MOS74 0807 F88B F0 05 BEQ WRBKL6 ;Yes, continue. (Note TAX done in TUBCHK) MOS74 MOS74 MOS74 MOS74 Acorn macro assembler Page 141 MOS74 C.F.S. UTILITIES - MOS74 MOS74 MOS74 0785 F883 v64 MOS74 0808 F88D AD E5 FE LDA TREG3 ;No, get from tube MOS74 0785 F883 v64 MOS74 0809 F890 90 02 BCC WRBKL7 ;skip IO read (always; TUBCHK returns CC if Tube) MOS74 0785 F883 v64 MOS74 0810 F892 MOS74 0785 F883 v64 MOS74 0811 F892 WRBKL6 MOS74 0785 F883 v64 MOS74 0812 F892 B1 B0 LDAIY BKADDR ;Load byte from IO proc. MOS74 0785 F883 v64 MOS74 0813 F894 WRBKL7 MOS74 0785 F883 v64 MOS74 0814 F894 | MOS74 0785 F883 v64 MOS74 0816 F894 ] MOS74 0785 F883 v64 MOS74 0817 F894 ] MOS74 0785 F883 v64 MOS74 0818 F894 MOS74 0785 F883 v64 MOS74 0819 F894 20 78 F0 JSR PUTCHK ;Output data MOS74 0785 F883 v64 MOS74 0820 F897 C8 INY MOS74 0785 F883 v64 MOS74 0821 F898 CC C8 03 CPY INFO +BKSZEL MOS74 0785 F883 v64 MOS74 0822 F89B D0 EB BNE WRBKL3 MOS74 0785 F883 v64 MOS74 0823 F89D MOS74 0785 F883 v64 MOS74 0824 F89D 20 C0 F8 JSR PUTCRC MOS74 0785 F883 v64 MOS74 0825 F8A0 20 C9 F8 WRBKEM JSR IWAIT ;Wait for irupt => char on tape -- MOS74 0826 F8A3 20 C9 F8 JSR IWAIT -- MOS74 0827 F8A6 20 56 FB JSR CRESET ;Reset for interblock gap -- MOS74 0828 F8A9 A9 01 LDAIM &01 -- MOS74 0829 F8AB 20 DD F8 JSR PAUSE ;1/10 sec delay to clear heads -- MOS74 0830 F8AE 28 PLP ;Restore I'rupt status -- MOS74 0831 F8AF -- MOS74 0832 F8AF 20 FE F8 JSR SAVHDR ;Finally, print info -- MOS74 0833 F8B2 2C CA 03 BIT INFO +BKFLAG -- MOS74 0834 F8B5 10 08 BPL WRBKEX ;Not last block MOS74 0834 F8B5 v77 MOS74 0835 F8B7 08 PHP MOS74 0834 F8B5 v77 MOS74 0836 F8B8 20 D7 F8 JSR TAIL MOS74 0834 F8B5 v77 MOS74 0837 F8BB 20 E6 F2 JSR FINOP MOS74 0834 F8B5 v77 MOS74 0838 F8BE 28 PLP MOS74 0834 F8B5 v77 MOS74 0839 F8BF MOS74 0834 F8B5 v77 MOS74 0840 F8BF ;Exit MI if last block, PL otherwise MOS74 0834 F8B5 v77 MOS74 0841 F8BF 60 WRBKEX RTS -- MOS74 0842 F8C0 -- MOS74 0843 F8C0 -- MOS74 0844 F8C0 -- MOS74 0845 F8C0 -- MOS74 0846 F8C0 -- MOS74 0847 F8C0 -- MOS74 0848 F8C0 [ MOS125 = &FF -- MOS74 0855 F8C0 ] -- MOS74 0856 F8C0 -- MOS74 0857 F8C0 -- MOS74 0858 F8C0 -- MOS74 0859 F8C0 -- MOS74 0860 F8C0 A5 BF PUTCRC LDA CHKSUM +&01 -- MOS74 0861 F8C2 20 C7 F8 JSR PUTCAS -- MOS74 0862 F8C5 A5 BE LDA CHKSUM -- MOS74 0863 F8C7 -- MOS74 0864 F8C7 -- MOS74 0865 F8C7 PUTCAS -- MOS74 0866 F8C7 -- MOS74 0867 F8C7 ;Put byte to cassette -- MOS74 0868 F8C7 -- MOS74 0869 F8C7 85 BD STA IBUF -- MOS74 0870 F8C9 -- MOS74 0871 F8C9 20 A7 F9 IWAIT JSR ESCAPE MOS74 0873 F8CE ^79 MOS74 0872 F8CC 24 C0 BIT IFLAG MOS74 0873 F8CE ^79 MOS74 0873 F8CE 10 F9 BPL IWAIT -- MOS74 0874 F8D0 -- MOS74 0875 F8D0 A9 00 LDAIM &00 -- MOS74 0876 F8D2 85 C0 STA IFLAG ;Zero IFLAG -- MOS74 0877 F8D4 A5 BD LDA IBUF ;Restore A -- MOS74 0878 F8D6 60 RTS ;Note V preserved -- MOS74 0879 F8D7 -- MOS74 0880 F8D7 -- MOS74 0881 F8D7 -- MOS74 0882 F8D7 LEADER -- MOS74 0883 F8D7 -- MOS74 0884 F8D7 TAIL -- MOS74 0885 F8D7 -- MOS74 0886 F8D7 ;Assumes RESET done by WRBLOK -- MOS74 0887 F8D7 -- MOS74 0888 F8D7 A9 32 LDAIM &32 -- MOS74 0889 F8D9 D0 02 BNE PAUSE ;5 secs hitone altogether. MOS74 0889 F8D9 v7D MOS74 0890 F8DB MOS74 0889 F8D9 v7D MOS74 0891 F8DB MOS74 0889 F8D9 v7D MOS74 0892 F8DB MOS74 0889 F8D9 v7D MOS74 0893 F8DB PUTGAP MOS74 0889 F8D9 v7D MOS74 0894 F8DB MOS74 0889 F8D9 v7D MOS74 0895 F8DB ;Note is assumed indivisible by PUTBYT MOS74 0889 F8D9 v7D MOS74 0896 F8DB MOS74 0889 F8D9 v7D MOS74 0897 F8DB A5 C7 LDA GAPTIM MOS74 0889 F8D9 v7D MOS74 0898 F8DD MOS74 0889 F8D9 v7D MOS74 0899 F8DD PAUSE MOS74 0889 F8D9 v7D MOS74 0900 F8DD MOS74 0889 F8D9 v7D MOS74 0901 F8DD ;Pause for A/10 secs (while putting out MOS74 0889 F8D9 v7D MOS74 0902 F8DD ;leaders and gaps mainly). MOS74 0889 F8D9 v7D MOS74 0903 F8DD MOS74 0889 F8D9 v7D MOS74 0904 F8DD A2 05 LDXIM &05 -- MOS74 0905 F8DF 8D 40 02 PSLOP1 STA CYCLE MOS74 0910 F8EB ^72 MOS74 0906 F8E2 20 A7 F9 PSLOOP JSR ESCAPE MOS74 0910 F8EB ^72 MOS74 0907 F8E5 2C 40 02 BIT CYCLE MOS74 0910 F8EB ^72 MOS74 0908 F8E8 10 F8 BPL PSLOOP MOS74 0910 F8EB ^72 MOS74 0909 F8EA CA DEX MOS74 0910 F8EB ^72 MOS74 0910 F8EB D0 F2 BNE PSLOP1 -- MOS74 0911 F8ED 60 RTS -- MOS74 0912 F8EE -- MOS74 0913 F8EE -- MOS74 0914 F8EE -- MOS74 0915 F8EE PRTHDR -- MOS74 0916 F8EE -- MOS74 0917 F8EE ;Print header details. -- MOS74 0918 F8EE ;Keeps count of file size and prints -- MOS74 0919 F8EE ;total file length when last block is indicated. -- MOS74 0920 F8EE ;Expects block info to be in INFO. -- MOS74 0921 F8EE -- MOS74 0922 F8EE -- MOS74 0923 F8EE AD C6 03 LDA INFO +BKNOLO -- MOS74 0924 F8F1 0D C7 03 ORA INFO +BKNOHI -- MOS74 0925 F8F4 F0 05 BEQ PRTHL8 ;If first block, is new file MOS74 0925 F8F4 v7A MOS74 0926 F8F6 2C DF 03 BIT OLDFLG ;If previous block = last block MOS74 0925 F8F4 v7A MOS74 0927 F8F9 10 03 BPL PRTHL3 ;then new line MOS74 0925 F8F4 v7A MOS74 0928 F8FB MOS74 0925 F8F4 v7A MOS74 0929 F8FB PRTHDL MOS74 0925 F8F4 v7A MOS74 0930 F8FB 20 E9 F2 PRTHL8 JSR NOOLN1 ;New line if messages on and no error MOS74 0927 F8F9 v7C MOS74 0931 F8FE MOS74 0927 F8F9 v7C MOS74 0932 F8FE SAVHDR MOS74 0927 F8F9 v7C MOS74 0933 F8FE MOS74 0927 F8F9 v7C MOS74 0934 F8FE ;Entry from WRBLOK MOS74 0927 F8F9 v7C MOS74 0935 F8FE MOS74 MOS74 MOS74 MOS74 Acorn macro assembler Page 142 MOS74 C.F.S. UTILITIES - MOS74 MOS74 MOS74 0927 F8F9 v7C MOS74 0936 F8FE [ MOS125 = &7F MOS74 0927 F8F9 v7C MOS74 0937 F8FE ;Set FSIZE here for correct OSFILE block whether messages on/off MOS74 0927 F8F9 v7C MOS74 0938 F8FE PRTHL3 MOS74 0927 F8F9 v7C MOS74 0939 F8FE AD C8 03 LDA INFO +BKSZEL -- MOS74 0940 F901 85 CC STA FSIZE -- MOS74 0941 F903 AD C6 03 LDA INFO +BKNOLO -- MOS74 0942 F906 18 CLC -- MOS74 0943 F907 6D C9 03 ADC INFO +BKSZEH -- MOS74 0944 F90A 85 CD STA FSIZE + 1 -- MOS74 0945 F90C A0 00 LDYIM &00 -- MOS74 0946 F90E | -- MOS74 0948 F90E ] -- MOS74 0949 F90E 84 BA STY ERRSW -- MOS74 0950 F910 AD CA 03 LDA INFO +BKFLAG -- MOS74 0951 F913 8D DF 03 STA OLDFLG ;Set prev. flag -- MOS74 0952 F916 -- MOS74 0953 F916 -- MOS74 0954 F916 20 6E EA JSR MSGON -- MOS74 0955 F919 F0 61 BEQ PRTHLX ;Messages off => exit MOS74 0955 F919 v1E MOS74 0956 F91B MOS74 0955 F919 v1E MOS74 0957 F91B [ MOS125 = &FF MOS74 0955 F919 v1E MOS74 0960 F91B | MOS74 0955 F919 v1E MOS74 0961 F91B 20 EC FF JSR WRCR MOS74 0955 F919 v1E MOS74 0962 F91E ] MOS74 0955 F919 v1E MOS74 0963 F91E MOS74 0955 F919 v1E MOS74 0964 F91E ; Note assumed here Y is preserved over MOS74 0955 F919 v1E MOS74 0965 F91E ;calls to MSGON and OSWRCH. MOS74 0955 F919 v1E MOS74 0966 F91E MOS74 0955 F919 v1E MOS74 0967 F91E B9 B2 03 PRTHL1 LDAAY INFO MOS74 0955 F919 v1E MOS74 0968 F921 F0 10 BEQ PRTHL2 ;Zero terminator for filename MOS74 0955 F919 v1E MOS74 0969 F923 MOS74 0955 F919 v1E MOS74 0970 F923 C9 20 CMPIM &20 MOS74 0955 F919 v1E MOS74 0971 F925 90 04 BCC PRTHLD ;A<$20 => control char => invalid MOS74 0955 F919 v1E MOS74 0972 F927 C9 7F CMPIM &7F MOS74 0955 F919 v1E MOS74 0973 F929 90 02 BCC PRTHLC ;$20<=A<$7F => Valid MOS74 0955 F919 v1E MOS74 0974 F92B MOS74 0955 F919 v1E MOS74 0975 F92B A9 3F PRTHLD LDAIM "?" ;Otherwise, print ?? MOS74 0955 F919 v1E MOS74 0976 F92D 20 EE FF PRTHLC JSR OSWRCH ;Write file title MOS74 0955 F919 v1E MOS74 0977 F930 C8 INY MOS74 0955 F919 v1E MOS74 0978 F931 D0 EB BNE PRTHL1 MOS74 0955 F919 v1E MOS74 0979 F933 MOS74 0955 F919 v1E MOS74 0980 F933 AD 47 02 PRTHL2 LDA SROMSW MOS74 0955 F919 v1E MOS74 0981 F936 F0 04 BEQ PRTHLF ;In CFS -> continue MOS74 0955 F919 v1E MOS74 0982 F938 24 BB BIT USFLGS MOS74 0955 F919 v1E MOS74 0983 F93A 50 40 BVC PRTHLX ;SFS short msgs => file name only MOS74 0955 F919 v1E MOS74 0984 F93C MOS74 0955 F919 v1E MOS74 0985 F93C 20 A3 F9 PRTHLF JSR PRTSP MOS74 0955 F919 v1E MOS74 0986 F93F C8 INY MOS74 0955 F919 v1E MOS74 0987 F940 C0 0B CPYIM FTSIZE MOS74 0955 F919 v1E MOS74 0988 F942 90 EF BCC PRTHL2 MOS74 0955 F919 v1E MOS74 0989 F944 MOS74 0955 F919 v1E MOS74 0990 F944 AD C6 03 LDA INFO +BKNOLO MOS74 0955 F919 v1E MOS74 0991 F947 AA TAX ;Store for final length MOS74 0955 F919 v1E MOS74 0992 F948 20 8D F9 JSR WHEX ;Write block no. lo MOS74 0955 F919 v1E MOS74 0993 F94B MOS74 0955 F919 v1E MOS74 0994 F94B 2C CA 03 BIT INFO +BKFLAG MOS74 0955 F919 v1E MOS74 0995 F94E 10 2C BPL PRTHLX ;Not last block -> finish MOS74 0955 F919 v1E MOS74 0996 F950 MOS74 0955 F919 v1E MOS74 0997 F950 ;Here, is last block -> print total length MOS74 0955 F919 v1E MOS74 0998 F950 MOS74 0955 F919 v1E MOS74 0999 F950 [ MOS125 = &7F MOS74 0955 F919 v1E MOS74 1000 F950 A5 CD LDA FSIZE + 1 MOS74 0955 F919 v1E MOS74 1001 F952 20 88 F9 JSR WSPHEX MOS74 0955 F919 v1E MOS74 1002 F955 A5 CC LDA FSIZE MOS74 0955 F919 v1E MOS74 1003 F957 | MOS74 0955 F919 v1E MOS74 1015 F957 ] MOS74 0955 F919 v1E MOS74 1016 F957 20 8D F9 JSR WHEX MOS74 0955 F919 v1E MOS74 1017 F95A MOS74 0955 F919 v1E MOS74 1018 F95A 24 BB BIT USFLGS MOS74 0955 F919 v1E MOS74 1019 F95C 50 1E BVC PRTHLX ;=> Short messages => exit MOS74 0955 F919 v1E MOS74 1020 F95E MOS74 0955 F919 v1E MOS74 1021 F95E ;Here doing long messages MOS74 0955 F919 v1E MOS74 1022 F95E MOS74 0955 F919 v1E MOS74 1023 F95E A2 04 LDXIM &04 MOS74 0955 F919 v1E MOS74 1024 F960 20 A3 F9 PRTHLV JSR PRTSP MOS74 0955 F919 v1E MOS74 1025 F963 CA DEX MOS74 0955 F919 v1E MOS74 1026 F964 D0 FA BNE PRTHLV MOS74 0955 F919 v1E MOS74 1027 F966 MOS74 0955 F919 v1E MOS74 1028 F966 A2 0F LDXIM BKLOAD +&03 MOS74 0955 F919 v1E MOS74 1029 F968 20 70 F9 JSR PRTHLT MOS74 0955 F919 v1E MOS74 1030 F96B 20 A3 F9 JSR PRTSP MOS74 0955 F919 v1E MOS74 1031 F96E A2 13 LDXIM BKEXEC +&03 MOS74 0955 F919 v1E MOS74 1032 F970 MOS74 0955 F919 v1E MOS74 1033 F970 A0 04 PRTHLT LDYIM &04 MOS74 0955 F919 v1E MOS74 1034 F972 BD B2 03 PRTHLU LDAAX INFO MOS74 0955 F919 v1E MOS74 1035 F975 20 8D F9 JSR WHEX MOS74 0955 F919 v1E MOS74 1036 F978 CA DEX MOS74 0955 F919 v1E MOS74 1037 F979 88 DEY MOS74 0955 F919 v1E MOS74 1038 F97A D0 F6 BNE PRTHLU MOS74 0955 F919 v1E MOS74 1039 F97C MOS74 0955 F919 v1E MOS74 1040 F97C [ MOS125 = &FF MOS74 0955 F919 v1E MOS74 1042 F97C ] MOS74 0955 F919 v1E MOS74 1043 F97C 60 PRTHLX RTS -- MOS74 1044 F97D -- MOS74 1045 F97D -- MOS74 1046 F97D -- MOS74 1047 F97D -- MOS74 1048 F97D [ MOS125 = &FF -- MOS74 1070 F97D ] -- MOS74 1071 F97D -- MOS74 1072 F97D -- MOS74 1073 F97D LNK MOS76 -- MOS76 0001 F97D -- MOS76 0002 F97D TTL C.F.S. - I/O Utilities -> MOS76 -- MOS76 0003 F97D OPT MOS76 MOS76 MOS76 MOS76 MOS76 Acorn macro assembler Page 143 MOS76 C.F.S. - I/O Utilities -> MOS76 MOS76 -- MOS76 0004 F97D -- MOS76 0005 F97D -- MOS76 0006 F97D ;****** UTILITIES II ****** -- MOS76 0007 F97D -- MOS76 0008 F97D ADDBKA -- MOS76 0009 F97D -- MOS76 0010 F97D ;Increment block pointer by 256 bytes, assuming that -- MOS76 0011 F97D ;block received is 256 bytes long. Note BKADDR is 4 bytes -- MOS76 0012 F97D -- MOS76 0013 F97D E6 B1 INC BKADDR +&01 -- MOS76 0014 F97F D0 06 BNE ADDBK1 MOS76 0014 F97F v79 MOS76 0015 F981 E6 B2 INC BKADDR +&02 MOS76 0014 F97F v79 MOS76 0016 F983 D0 02 BNE ADDBK1 MOS76 0014 F97F v79 MOS76 0017 F985 E6 B3 INC BKADDR +&03 MOS76 0014 F97F v79 MOS76 0018 F987 60 ADDBK1 RTS -- MOS76 0019 F988 -- MOS76 0020 F988 -- MOS76 0021 F988 -- MOS76 0022 F988 -- MOS76 0023 F988 48 WSPHEX PHA -- MOS76 0024 F989 20 A3 F9 JSR PRTSP -- MOS76 0025 F98C 68 PLA -- MOS76 0026 F98D 48 WHEX PHA -- MOS76 0027 F98E 4A LSRA -- MOS76 0028 F98F 4A LSRA -- MOS76 0029 F990 4A LSRA -- MOS76 0030 F991 4A LSRA -- MOS76 0031 F992 20 96 F9 JSR WDIGIT -- MOS76 0032 F995 68 PLA -- MOS76 0033 F996 [ MOS125 = &FF -- MOS76 0037 F996 | -- MOS76 0038 F996 29 0F WDIGIT ANDIM &0F -- MOS76 0039 F998 09 30 ORAIM "0" -- MOS76 0040 F99A ] -- MOS76 0041 F99A C9 3A CMPIM &3A -- MOS76 0042 F99C 90 02 BCC HXDSKP MOS76 0042 F99C v7D MOS76 0043 F99E 69 06 ADCIM &06 MOS76 0042 F99C v7D MOS76 0044 F9A0 4C EE FF HXDSKP JMP OSWRCH MOS76 0050 F9A5 ^79 MOS76 0045 F9A3 MOS76 0050 F9A5 ^79 MOS76 0046 F9A3 MOS76 0050 F9A5 ^79 MOS76 0047 F9A3 MOS76 0050 F9A5 ^79 MOS76 0048 F9A3 MOS76 0050 F9A5 ^79 MOS76 0049 F9A3 A9 20 PRTSP LDAIM SPACE MOS76 0050 F9A5 ^79 MOS76 0050 F9A5 D0 F9 BNE HXDSKP -- MOS76 0051 F9A7 -- MOS76 0052 F9A7 -- MOS76 0053 F9A7 ESCAPE -- MOS76 0054 F9A7 -- MOS76 0055 F9A7 ;Checks ESCAPE happened. If so, does error -- MOS76 0056 F9A7 ;break with appropriate message after -- MOS76 0057 F9A7 ;acknowldging the ESCAPE. -- MOS76 0058 F9A7 -- MOS76 0059 F9A7 ;Also switches off various status bits -- MOS76 0060 F9A7 ;Motor switched OFF -- MOS76 0061 F9A7 -- MOS76 0062 F9A7 ;Note, no test is done if inside WRCH or RDCH -- MOS76 0063 F9A7 ;so that ESCAPE cannot occur inside EXEC/SPOOL -- MOS76 0064 F9A7 -- MOS76 0065 F9A7 08 PHP -- MOS76 0066 F9A8 24 EB BIT ESSEMA -- MOS76 0067 F9AA 30 04 BMI ESCLL0 ;Inside WRCH or RDCH -> no ESCAPE MOS76 0067 F9AA v7B MOS76 0068 F9AC 24 FF BIT ESCADD MOS76 0067 F9AA v7B MOS76 0069 F9AE 30 02 BMI ESCERR MOS76 0067 F9AA v7B MOS76 0070 F9B0 ESCLL0 MOS76 0067 F9AA v7B MOS76 0071 F9B0 28 PLP MOS76 0069 F9AE v7D MOS76 0072 F9B1 60 RTS MOS76 0069 F9AE v7D MOS76 0073 F9B2 MOS76 0069 F9AE v7D MOS76 0074 F9B2 ESCERR MOS76 0069 F9AE v7D MOS76 0075 F9B2 MOS76 0069 F9AE v7D MOS76 0076 F9B2 20 44 F3 JSR CATOFF ;Switch CAT bit off -- MOS76 0077 F9B5 20 02 FB JSR CASMOF ;Motor OFF/release -- MOS76 0078 F9B8 -- MOS76 0079 F9B8 A9 7E LDAIM &7E -- MOS76 0080 F9BA 20 F4 FF JSR OSBYTE ;Acknowledge ESC to MOS -- MOS76 0081 F9BD -- MOS76 0082 F9BD 00 BRK ;Then error -- MOS76 0083 F9BE 11 45 73 = &11,"Escape",0 -- MOS76 0084 F9C6 -- MOS76 0085 F9C6 -- MOS76 0086 F9C6 -- MOS76 0087 F9C6 -- MOS76 0088 F9C6 -- MOS76 0089 F9C6 98 LODHDR TYA -- MOS76 0090 F9C7 F0 0D BEQ LODHD1 ;Print message depending on Y MOS76 0090 F9C7 v72 MOS76 0091 F9C9 20 57 FA JSR MSGOUT MOS76 0090 F9C7 v72 MOS76 0092 F9CC 0D 4C 6F = MCR,"Loading",MCR,0 MOS76 0090 F9C7 v72 MOS76 0093 F9D6 MOS76 0090 F9C7 v72 MOS76 0094 F9D6 MOS76 0090 F9C7 v72 MOS76 0095 F9D6 MOS76 0090 F9C7 v72 MOS76 0096 F9D6 LODHD1 MOS76 0090 F9C7 v72 MOS76 0097 F9D6 MOS76 0090 F9C7 v72 MOS76 0098 F9D6 85 BA STA ERRSW ;A always zero at this point -- MOS76 0099 F9D8 ;Set ERRSW so always extra line after "Loading" -- MOS76 0100 F9D8 ;and before file name. -- MOS76 0101 F9D8 -- MOS76 0102 F9D8 -- MOS76 0103 F9D8 A2 FF LDXIM &FF ;Set "abort if nesc." flag -- MOS76 0104 F9DA A5 C1 LDA HDRCRC -- MOS76 0105 F9DC D0 0D BNE HDRCHK ;Header CRC error takes precedence over MOS76 0105 F9DC v72 MOS76 0106 F9DE ;file and block errors, since a header error may MOS76 0105 F9DC v72 MOS76 0107 F9DE ;spuriously cause either or both of these. MOS76 0105 F9DC v72 MOS76 0108 F9DE MOS76 0105 F9DC v72 MOS76 0109 F9DE 20 82 FA JSR CMPFT MOS76 0105 F9DC v72 MOS76 0110 F9E1 MOS76 0105 F9DC v72 MOS76 0111 F9E1 08 PHP ;Store EQ bit from CMPFT MOS76 0105 F9DC v72 MOS76 0112 F9E2 A2 FF LDXIM &FF ;Set "abort if nesc." flag MOS76 0105 F9DC v72 MOS76 0113 F9E4 A0 A9 LDYIM FILEER MOS76 0105 F9DC v72 MOS76 0114 F9E6 A9 FA LDAIM /(FILEER ) ;Set error pointers MOS76 0105 F9DC v72 MOS76 0115 F9E8 28 PLP MOS76 0105 F9DC v72 MOS76 0116 F9E9 MOS76 0105 F9DC v72 MOS76 0117 F9E9 D0 1C BNE TAPER0 ;Files don't match MOS76 0117 F9E9 v63 MOS76 0118 F9EB MOS76 0117 F9E9 v63 MOS76 0119 F9EB CATERR ;Entry from catalogue here MOS76 0117 F9E9 v63 MOS76 0120 F9EB HDRCHK MOS76 0117 F9E9 v63 MOS76 0121 F9EB A0 9E LDYIM DATAER ;Set lo byte of error pointer MOS76 0117 F9E9 v63 MOS76 0122 F9ED A5 C1 LDA HDRCRC ;Was header CRC ok ? MOS76 0117 F9E9 v63 MOS76 0123 F9EF F0 04 BEQ CHKBKN ;Yes, check block no. MOS76 0117 F9E9 v63 MOS76 0124 F9F1 A9 FA LDAIM /(DATAER ) ;No, do error MOS76 0117 F9E9 v63 MOS76 0125 F9F3 D0 12 BNE TAPER0 MOS76 0117 F9E9 v63 MOS76 0126 F9F5 MOS76 0117 F9E9 v63 MOS76 0127 F9F5 MOS76 MOS76 MOS76 MOS76 Acorn macro assembler Page 144 MOS76 C.F.S. - I/O Utilities -> MOS76 MOS76 MOS76 0117 F9E9 v63 MOS76 0128 F9F5 AD C6 03 CHKBKN LDA INFO +BKNOLO ;Is expected block ?? MOS76 0117 F9E9 v63 MOS76 0129 F9F8 C5 B4 CMP BLOKNO MOS76 0117 F9E9 v63 MOS76 0130 F9FA D0 07 BNE BLKERR MOS76 0117 F9E9 v63 MOS76 0131 F9FC AD C7 03 LDA INFO +BKNOHI MOS76 0117 F9E9 v63 MOS76 0132 F9FF C5 B5 CMP BLOKNO +&01 MOS76 0117 F9E9 v63 MOS76 0133 FA01 F0 13 BEQ CHEKSM ;No error -> go on MOS76 0117 F9E9 v63 MOS76 0134 FA03 MOS76 0117 F9E9 v63 MOS76 0135 FA03 A0 B4 BLKERR LDYIM BLOKER MOS76 0117 F9E9 v63 MOS76 0136 FA05 A9 FA LDAIM /(BLOKER ) MOS76 0117 F9E9 v63 MOS76 0137 FA07 MOS76 0117 F9E9 v63 MOS76 0138 FA07 48 TAPER0 PHA ;Store error ptr. MOS76 0133 FA01 v6C MOS76 0139 FA08 98 TYA MOS76 0133 FA01 v6C MOS76 0140 FA09 48 PHA MOS76 0133 FA01 v6C MOS76 0141 FA0A 8A TXA ;Store "abort if nesc." flag MOS76 0133 FA01 v6C MOS76 0142 FA0B 48 PHA MOS76 0133 FA01 v6C MOS76 0143 FA0C 20 FB F8 JSR PRTHDL ;Print header ON NEW LINE MOS76 0133 FA01 v6C MOS76 0144 FA0F 68 PLA MOS76 0133 FA01 v6C MOS76 0145 FA10 AA TAX MOS76 0133 FA01 v6C MOS76 0146 FA11 68 PLA MOS76 0133 FA01 v6C MOS76 0147 FA12 A8 TAY MOS76 0133 FA01 v6C MOS76 0148 FA13 68 PLA MOS76 0133 FA01 v6C MOS76 0149 FA14 D0 14 BNE TAPERR MOS76 0149 FA14 v6B MOS76 0150 FA16 MOS76 0149 FA14 v6B MOS76 0151 FA16 8A CHEKSM TXA MOS76 0149 FA14 v6B MOS76 0152 FA17 48 PHA ;Store X over possible IRUPT call MOS76 0149 FA14 v6B MOS76 0153 FA18 20 EE F8 JSR PRTHDR ; Print header info. MOS76 0149 FA14 v6B MOS76 0154 FA1B MOS76 0149 FA14 v6B MOS76 0155 FA1B 20 E6 FA JSR CHEKLP ;Wait for end of BG job MOS76 0149 FA14 v6B MOS76 0156 FA1E ;In SFS, CHEKLP reads next SFS block MOS76 0149 FA14 v6B MOS76 0157 FA1E MOS76 0149 FA14 v6B MOS76 0158 FA1E ;Note X & Y corrupted by IRUPT, which MOS76 0149 FA14 v6B MOS76 0159 FA1E ;is only called when SROM system active. MOS76 0149 FA14 v6B MOS76 0160 FA1E ;Y is restored at ERREXT. MOS76 0149 FA14 v6B MOS76 0161 FA1E ; MOS76 0149 FA14 v6B MOS76 0162 FA1E 68 PLA MOS76 0149 FA14 v6B MOS76 0163 FA1F AA TAX ;Restore "abort if nesc." flag MOS76 0149 FA14 v6B MOS76 0164 FA20 MOS76 0149 FA14 v6B MOS76 0165 FA20 A5 BE LDA CHKSUM MOS76 0149 FA14 v6B MOS76 0166 FA22 05 BF ORA CHKSUM +&01 MOS76 0149 FA14 v6B MOS76 0167 FA24 F0 77 BEQ ERREXX ;No errors, tape ok, exit MOS76 0167 FA24 v08 MOS76 0168 FA26 MOS76 0167 FA24 v08 MOS76 0169 FA26 A0 9E LDYIM DATAER ;Set message ptr. MOS76 0167 FA24 v08 MOS76 0170 FA28 A9 FA LDAIM /(DATAER ) MOS76 0167 FA24 v08 MOS76 0171 FA2A MOS76 0167 FA24 v08 MOS76 0172 FA2A C6 BA TAPERR DEC ERRSW MOS76 0167 FA24 v08 MOS76 0173 FA2C 48 PHA ;Store hi byte of error pointer MOS76 0167 FA24 v08 MOS76 0174 FA2D MOS76 0167 FA24 v08 MOS76 0175 FA2D 24 EB BIT ESSEMA MOS76 0167 FA24 v08 MOS76 0176 FA2F 30 0D BMI ERRABT ;During EXEC/SPOOL can ABORT ONLY ! MOS76 0167 FA24 v08 MOS76 0177 FA31 MOS76 0167 FA24 v08 MOS76 0178 FA31 8A TXA ;If X = 0 => print only, X = $FF abort if nesc. MOS76 0167 FA24 v08 MOS76 0179 FA32 2D 47 02 AND SROMSW ;If not cataloging, and SROM => abort MOS76 0167 FA24 v08 MOS76 0180 FA35 D0 07 BNE ERRABT MOS76 0167 FA24 v08 MOS76 0181 FA37 8A TXA ;Otherwise, check if "abort on error" option set MOS76 0167 FA24 v08 MOS76 0182 FA38 ;If so, do BRK MOS76 0167 FA24 v08 MOS76 0183 FA38 MOS76 0167 FA24 v08 MOS76 0184 FA38 29 11 ANDIM ABTBIT MOS76 0167 FA24 v08 MOS76 0185 FA3A 25 BB AND USFLGS MOS76 0167 FA24 v08 MOS76 0186 FA3C F0 10 BEQ PRTERR ;Abort not set => print MOS76 0167 FA24 v08 MOS76 0187 FA3E MOS76 0167 FA24 v08 MOS76 0188 FA3E 68 ERRABT PLA MOS76 0167 FA24 v08 MOS76 0189 FA3F 85 B9 STA FTPTR +&01 ;Set error pointer MOS76 0167 FA24 v08 MOS76 0190 FA41 84 B8 STY FTPTR MOS76 0167 FA24 v08 MOS76 0191 FA43 20 E1 F6 JSR ECLOSE ;close EXEC file MOS76 0167 FA24 v08 MOS76 0192 FA46 46 EB LSR ESSEMA ;Switch off critical region MOS76 0167 FA24 v08 MOS76 0193 FA48 20 F8 FA JSR BEEPOF ;Motor off/BEEP MOS76 0167 FA24 v08 MOS76 0194 FA4B [ MOS125 = &FF MOS76 0167 FA24 v08 MOS76 0195 FA4B | MOS76 0167 FA24 v08 MOS76 0196 FA4B VSTREZ MOS76 0167 FA24 v08 MOS76 0197 FA4B ] MOS76 0167 FA24 v08 MOS76 0198 FA4B 6C B8 00 JMI FTPTR ;Abort = break with error msg. MOS76 0167 FA24 v08 MOS76 0199 FA4E MOS76 0167 FA24 v08 MOS76 0200 FA4E 68 PRTERR PLA ;Restore hi byte of pointer MOS76 0167 FA24 v08 MOS76 0201 FA4F MOS76 0167 FA24 v08 MOS76 0202 FA4F ;Now must add ONE to pointer to get past BRK MOS76 0167 FA24 v08 MOS76 0203 FA4F ;at front of message. Note MSGOUT does an INC MOS76 0167 FA24 v08 MOS76 0204 FA4F ;before printing, so don't have to add 2. MOS76 0167 FA24 v08 MOS76 0205 FA4F MOS76 0167 FA24 v08 MOS76 0206 FA4F [ MOS125 = &FF MOS76 0167 FA24 v08 MOS76 0211 FA4F | MOS76 0167 FA24 v08 MOS76 0212 FA4F C0 FF CPYIM &FF MOS76 0167 FA24 v08 MOS76 0213 FA51 C8 INY ;Inc lo byte past BRK instruction MOS76 0167 FA24 v08 MOS76 0214 FA52 69 00 ADCIM &00 MOS76 0167 FA24 v08 MOS76 0215 FA54 ] MOS76 0167 FA24 v08 MOS76 0216 FA54 48 PRTEON PHA ;Set stack for MSGOUT MOS76 0167 FA24 v08 MOS76 0217 FA55 98 TYA MOS76 0167 FA24 v08 MOS76 0218 FA56 48 PHA MOS76 0167 FA24 v08 MOS76 0219 FA57 ; Print message and enter code MOS76 0167 FA24 v08 MOS76 0220 FA57 ; directly AFTER message MOS76 0167 FA24 v08 MOS76 0221 FA57 ; MOS76 0167 FA24 v08 MOS76 0222 FA57 MSGOUT MOS76 0167 FA24 v08 MOS76 0223 FA57 MOS76 0167 FA24 v08 MOS76 0224 FA57 ;Enter here for messages printed if MSGON MOS76 0167 FA24 v08 MOS76 0225 FA57 ;Note, X must be preserved MOS76 0167 FA24 v08 MOS76 0226 FA57 MOS76 0167 FA24 v08 MOS76 0227 FA57 20 6E EA JSR MSGON MOS76 0167 FA24 v08 MOS76 0228 FA5A A8 TAY ;Store for STROUT MOS76 0167 FA24 v08 MOS76 0229 FA5B MOS76 0167 FA24 v08 MOS76 0230 FA5B STROUT MOS76 0167 FA24 v08 MOS76 0231 FA5B MOS76 0167 FA24 v08 MOS76 0232 FA5B MOS76 0167 FA24 v08 MOS76 0233 FA5B 68 PLA MOS76 0167 FA24 v08 MOS76 0234 FA5C 85 B8 STA FTPTR MOS76 0167 FA24 v08 MOS76 0235 FA5E 68 PLA MOS76 0167 FA24 v08 MOS76 0236 FA5F 85 B9 STA FTPTR +&01 MOS76 0167 FA24 v08 MOS76 0237 FA61 98 TYA MOS76 0167 FA24 v08 MOS76 0238 FA62 08 PHP ;Z bit => print MOS76 0167 FA24 v08 MOS76 0239 FA63 E6 B8 VSTRLP INC FTPTR MOS76 0167 FA24 v08 MOS76 0240 FA65 D0 02 BNE VSTRL1 MOS76 0167 FA24 v08 MOS76 0241 FA67 E6 B9 INC FTPTR +&01 MOS76 0167 FA24 v08 MOS76 0242 FA69 A0 00 VSTRL1 LDYIM &00 MOS76 0167 FA24 v08 MOS76 0243 FA6B B1 B8 LDAIY FTPTR MOS76 0167 FA24 v08 MOS76 0244 FA6D F0 0A BEQ VSTREX MOS76 0167 FA24 v08 MOS76 0245 FA6F 28 PLP MOS76 0167 FA24 v08 MOS76 0246 FA70 08 PHP MOS76 0167 FA24 v08 MOS76 0247 FA71 F0 F0 BEQ VSTRLP ;If Z set => don't print MOS76 0167 FA24 v08 MOS76 0248 FA73 20 E3 FF JSR OSASCI MOS76 0167 FA24 v08 MOS76 0249 FA76 4C 63 FA JMP VSTRLP MOS76 0167 FA24 v08 MOS76 0250 FA79 28 VSTREX PLP ;Restore stack MOS76 0167 FA24 v08 MOS76 0251 FA7A E6 B8 INC FTPTR MOS76 0167 FA24 v08 MOS76 0252 FA7C D0 CD BNE VSTREZ MOS76 MOS76 MOS76 MOS76 Acorn macro assembler Page 145 MOS76 C.F.S. - I/O Utilities -> MOS76 MOS76 MOS76 0167 FA24 v08 MOS76 0253 FA7E E6 B9 INC FTPTR +&01 MOS76 0167 FA24 v08 MOS76 0254 FA80 MOS76 0167 FA24 v08 MOS76 0255 FA80 ;Exit always with Z CLEAR MOS76 0167 FA24 v08 MOS76 0256 FA80 MOS76 0167 FA24 v08 MOS76 0257 FA80 [ MOS125 = &FF MOS76 0167 FA24 v08 MOS76 0259 FA80 | MOS76 0167 FA24 v08 MOS76 0260 FA80 D0 C9 BNE VSTREZ MOS76 0167 FA24 v08 MOS76 0261 FA82 ] MOS76 0167 FA24 v08 MOS76 0262 FA82 MOS76 0167 FA24 v08 MOS76 0263 FA82 MOS76 0167 FA24 v08 MOS76 0264 FA82 CMPFT MOS76 0167 FA24 v08 MOS76 0265 FA82 A2 FF LDXIM &FF MOS76 0167 FA24 v08 MOS76 0266 FA84 CMPFT2 MOS76 0167 FA24 v08 MOS76 0267 FA84 E8 INX MOS76 0167 FA24 v08 MOS76 0268 FA85 CMPFT1 ;match filename, equating cases MOS76 0167 FA24 v08 MOS76 0269 FA85 BD D2 03 LDAAX FILNAM MOS76 0167 FA24 v08 MOS76 0270 FA88 D0 07 BNE CMPFT3 ;[not at end of filename] MOS76 0167 FA24 v08 MOS76 0271 FA8A ; MOS76 0167 FA24 v08 MOS76 0272 FA8A ; at end of filename, either: MOS76 0167 FA24 v08 MOS76 0273 FA8A ; X=0 => match on filename "" (null filename) MOS76 0167 FA24 v08 MOS76 0274 FA8A ; X<>0 => INFO(X)=0 => match, <>0 => no match MOS76 0167 FA24 v08 MOS76 0275 FA8A ; MOS76 0167 FA24 v08 MOS76 0276 FA8A 8A TXA MOS76 0167 FA24 v08 MOS76 0277 FA8B F0 03 BEQ CMPFT0 ;[match on filename "", return EQ status] MOS76 0167 FA24 v08 MOS76 0278 FA8D BD B2 03 LDAAX INFO MOS76 0167 FA24 v08 MOS76 0279 FA90 CMPFT0 ;EQ => match, NE => no match MOS76 0167 FA24 v08 MOS76 0280 FA90 60 RTS MOS76 0167 FA24 v08 MOS76 0281 FA91 MOS76 0167 FA24 v08 MOS76 0282 FA91 CMPFT3 ;not at end of filename MOS76 0167 FA24 v08 MOS76 0283 FA91 20 9D E5 JSR CAPS MOS76 0167 FA24 v08 MOS76 0284 FA94 5D B2 03 EORAX INFO MOS76 0167 FA24 v08 MOS76 0285 FA97 B0 02 BCS NALPHA MOS76 0167 FA24 v08 MOS76 0286 FA99 ; filename character is a letter MOS76 0167 FA24 v08 MOS76 0287 FA99 29 DF ANDIM &DF ;equate cases MOS76 0167 FA24 v08 MOS76 0288 FA9B NALPHA MOS76 0167 FA24 v08 MOS76 0289 FA9B F0 E7 BEQ CMPFT2 MOS76 0167 FA24 v08 MOS76 0290 FA9D ; filenames not equal MOS76 0167 FA24 v08 MOS76 0291 FA9D ; return NE status MOS76 0167 FA24 v08 MOS76 0292 FA9D ERREXX ;Called from around CSON1 MOS76 0167 FA24 v08 MOS76 0293 FA9D 60 RTS -- MOS76 0294 FA9E -- MOS76 0295 FA9E -- MOS76 0296 FA9E -- MOS76 0297 FA9E 00 DATAER BRK -- MOS76 0298 FA9F D8 = CFSERJ -- MOS76 0299 FAA0 0D 44 61 = MCR,"Data?",0 -- MOS76 0300 FAA7 -- MOS76 0301 FAA7 D0 15 BNE REWIND ;Z always CLEAR after MSGOUT MOS76 0301 FAA7 v6A MOS76 0302 FAA9 00 FILEER BRK MOS76 0301 FAA7 v6A MOS76 0303 FAAA DB = CFSERF MOS76 0301 FAA7 v6A MOS76 0304 FAAB 0D 46 69 = MCR,"File?",0 MOS76 0301 FAA7 v6A MOS76 0305 FAB2 MOS76 0301 FAA7 v6A MOS76 0306 FAB2 D0 0A BNE REWIND ;Z always CLEAR after MSGOUT MOS76 0301 FAA7 v6A MOS76 0307 FAB4 00 BLOKER BRK MOS76 0301 FAA7 v6A MOS76 0308 FAB5 DA = CFSERH MOS76 0301 FAA7 v6A MOS76 0309 FAB6 0D 42 6C = MCR,"Block?",0 MOS76 0301 FAA7 v6A MOS76 0310 FABE MOS76 0301 FAA7 v6A MOS76 0311 FABE MOS76 0301 FAA7 v6A MOS76 0312 FABE A5 BA REWIND LDA ERRSW -- MOS76 0313 FAC0 F0 21 BEQ ERROEX ;If no error, leave MOS76 0313 FAC0 v5E MOS76 0314 FAC2 8A TXA MOS76 0313 FAC0 v5E MOS76 0315 FAC3 F0 1E BEQ ERROEX ;If only printing, no retry MOS76 0313 FAC0 v5E MOS76 0316 FAC5 A9 22 LDAIM RETBIT ;Otherwise, see if RETRY set MOS76 0313 FAC0 v5E MOS76 0317 FAC7 24 BB BIT USFLGS MOS76 0313 FAC0 v5E MOS76 0318 FAC9 F0 18 BEQ ERROEX MOS76 0313 FAC0 v5E MOS76 0319 FACB 20 56 FB JSR CRESET MOS76 0313 FAC0 v5E MOS76 0320 FACE A8 TAY ;Assume A is non-zero from RESET MOS76 0313 FAC0 v5E MOS76 0321 FACF 20 5B FA JSR STROUT MOS76 0313 FAC0 v5E MOS76 0322 FAD2 0D 07 52 = MCR,BEL,"Rewind tape",MCR,MCR,0 MOS76 0313 FAC0 v5E MOS76 0323 FAE2 MOS76 0313 FAC0 v5E MOS76 0324 FAE2 MOS76 0313 FAC0 v5E MOS76 0325 FAE2 ;Note NZ set by VSTRIN here MOS76 0313 FAC0 v5E MOS76 0326 FAE2 60 CSON1 RTS MOS76 0313 FAC0 v5E MOS76 0327 FAE3 MOS76 0313 FAC0 v5E MOS76 0328 FAE3 MOS76 0313 FAC0 v5E MOS76 0329 FAE3 20 ED F2 ERROEX JSR NOOLIN ;New line if msgs on MOS76 0335 FAE8 ^78 MOS76 0330 FAE6 MOS76 0335 FAE8 ^78 MOS76 0331 FAE6 ;Wait for BG job to finish since if IGNORE set, must MOS76 0335 FAE8 ^78 MOS76 0332 FAE6 ;allow LOADs etc. to complete. MOS76 0335 FAE8 ^78 MOS76 0333 FAE6 MOS76 0335 FAE8 ^78 MOS76 0334 FAE6 A5 C2 CHEKLP LDA ITYPE MOS76 0343 FAF0 ^74 MOS76 0335 FAE8 F0 F8 BEQ CSON1 ;If BG job finished exit with EQ status MOS76 0343 FAF0 ^74 MOS76 0336 FAEA MOS76 0343 FAF0 ^74 MOS76 0337 FAEA ;Note: loop must check ITYPE first, coz may be no MOS76 0343 FAF0 ^74 MOS76 0338 FAEA ;BG job in the case of zero length file. Therefore MOS76 0343 FAF0 ^74 MOS76 0339 FAEA ;don't want to read next SROM byte. MOS76 0343 FAF0 ^74 MOS76 0340 FAEA MOS76 0343 FAF0 ^74 MOS76 0341 FAEA 20 A7 F9 JSR ESCAPE MOS76 0343 FAF0 ^74 MOS76 0342 FAED AD 47 02 LDA SROMSW MOS76 0343 FAF0 ^74 MOS76 0343 FAF0 F0 F4 BEQ CHEKLP ;If no speech, wait for end -- MOS76 0344 FAF2 ;GoMMC tape patch has FAE0 NOP;NOP -- MOS76 0345 FAF2 20 DE F5 JSR IRUPT ;Otherwise, get next byte -- MOS76 0346 FAF5 4C E6 FA JMP CHEKLP ;And loop -- MOS76 0347 FAF8 -- MOS76 0348 FAF8 -- MOS76 0349 FAF8 -- MOS76 0350 FAF8 ;CHIP CONTROL -- MOS76 0351 FAF8 -- MOS76 0352 FAF8 20 6E EA BEEPOF JSR MSGON -- MOS76 0353 FAFB F0 05 BEQ CASMOF MOS76 0353 FAFB v7A MOS76 0354 FAFD A9 07 LDAIM &07 MOS76 0353 FAFB v7A MOS76 0355 FAFF 20 EE FF JSR OSWRCH ;Cannot use MSGOUT, coz called from inside it MOS76 0353 FAFB v7A MOS76 0356 FB02 A9 80 CASMOF LDAIM TUBERL ;Tube release number -- MOS76 0357 FB04 20 B0 FB JSR TBINIT ;Release tube -- MOS76 0358 FB07 -- MOS76 0359 FB07 ;NOTE - TBINIT checks BKADDR. However, either at this point -- MOS76 0360 FB07 ;the tube has been claimed, in which case BKADDR is still a -- MOS76 0361 FB07 ;tube address and the release will go through; or the tube -- MOS76 0362 FB07 ;has not been claimed, in which case it don't matter if the -- MOS76 0363 FB07 ;release don't happen. NOTE also that a claim is done in -- MOS76 0364 FB07 ;TBINIT before the release, so that spurious claims may -- MOS76 0365 FB07 ;result depending on the values in BKADDR. These will, however -- MOS76 0366 FB07 ;be immediately released again. -- MOS76 0367 FB07 -- MOS76 0368 FB07 A2 00 LDXIM &00 -- MOS76 0369 FB09 20 A7 FB JSR CMOTOR ;Motor off: drive set in MOTOR. -- MOS76 0370 FB0C ; -- MOS76 0371 FB0C RELEAS -- MOS76 0372 FB0C ; called by CFS on exit from any cassette operation -- MOS76 0373 FB0C ; N.B. RS423 might not have been claimed beforehand -- MOS76 0374 FB0C ; MOS76 MOS76 MOS76 MOS76 Acorn macro assembler Page 146 MOS76 C.F.S. - I/O Utilities -> MOS76 MOS76 -- MOS76 0375 FB0C 08 PHP -- MOS76 0376 FB0D 78 SEI ;must disable interrupts -- MOS76 0377 FB0E ; -- MOS76 0378 FB0E ; restore MOS 6850 and serproc byte -- MOS76 0379 FB0E ; -- MOS76 0380 FB0E AD 82 02 LDA SPREGA -- MOS76 0381 FB11 8D 10 FE STA SERPRC -- MOS76 0382 FB14 ; -- MOS76 0383 FB14 A9 00 LDAIM ZERO -- MOS76 0384 FB16 85 EA STA RSTUT -- MOS76 0385 FB18 F0 01 BEQ RELX ;[ALWAYS jump] MOS76 0385 FB18 v7E MOS76 0386 FB1A ; MOS76 0385 FB18 v7E MOS76 0387 FB1A MC6850 MOS76 0385 FB18 v7E MOS76 0388 FB1A 08 PHP MOS76 0385 FB18 v7E MOS76 0389 FB1B ; MOS76 0385 FB18 v7E MOS76 0390 FB1B RELX MOS76 0385 FB18 v7E MOS76 0391 FB1B ; CORRUPTS A MOS76 0385 FB18 v7E MOS76 0392 FB1B ; setup MC6850 MOS76 0385 FB18 v7E MOS76 0393 FB1B ; disable Rx/Tx interrupts MOS76 0385 FB18 v7E MOS76 0394 FB1B ; divide by 64, 7 data bits + 1 stop bit, even parity MOS76 0385 FB18 v7E MOS76 0395 FB1B ; or 8 bits, one stop bit, no parity!! MOS76 0385 FB18 v7E MOS76 0396 FB1B ; MOS76 0385 FB18 v7E MOS76 0397 FB1B 20 56 FB JSR CRESET ;master reset -- MOS76 0398 FB1E ; -- MOS76 0399 FB1E ; reset data format bits -- MOS76 0400 FB1E ; -- MOS76 0401 FB1E AD 50 02 LDA RSCTFL -- MOS76 0402 FB21 ; -- MOS76 0403 FB21 4C E6 E2 JMP STARSC ;share code with 'RS423' -- MOS76 0404 FB24 -- MOS76 0405 FB24 -- MOS76 0406 FB24 RSWT1 -- MOS76 0407 FB24 28 PLP MOS76 0446 FB4B ^57 MOS76 0408 FB25 24 FF BIT ESCFLG MOS76 0446 FB4B ^57 MOS76 0409 FB27 10 18 BPL CLAIM ;[no escape, ALWAYS jump] MOS76 0446 FB4B ^57 MOS76 0410 FB29 ; MOS76 0446 FB4B ^57 MOS76 0411 FB29 ; escape condition MOS76 0446 FB4B ^57 MOS76 0412 FB29 ; MOS76 0446 FB4B ^57 MOS76 0413 FB29 60 RTS MOS76 0446 FB4B ^57 MOS76 0414 FB2A MOS76 0446 FB4B ^57 MOS76 0415 FB2A MOS76 0446 FB4B ^57 MOS76 0416 FB2A A5 E3 SETSDF LDA OPTS ;Set options for sequential access MOS76 0446 FB4B ^57 MOS76 0417 FB2C 0A ASLA ;=> bottom nybble of OPTS MOS76 0446 FB4B ^57 MOS76 0418 FB2D 0A ASLA MOS76 0446 FB4B ^57 MOS76 0419 FB2E 0A ASLA MOS76 0446 FB4B ^57 MOS76 0420 FB2F 0A ASLA MOS76 0446 FB4B ^57 MOS76 0421 FB30 85 BB STA USFLGS MOS76 0446 FB4B ^57 MOS76 0422 FB32 AD D1 03 LDA SEQGAP ;Set (variable) PUTBYTE gap time MOS76 0446 FB4B ^57 MOS76 0423 FB35 D0 08 BNE GAPOUT ;[ALWAYS JUMP] MOS76 0446 FB4B ^57 MOS76 0424 FB37 ; MOS76 0446 FB4B ^57 MOS76 0425 FB37 A5 E3 SETDEF LDA OPTS MOS76 0446 FB4B ^57 MOS76 0426 FB39 29 F0 ANDIM &F0 ;Chop out seq. opts MOS76 0446 FB4B ^57 MOS76 0427 FB3B 85 BB STA USFLGS ;Set options for load/save operation MOS76 0446 FB4B ^57 MOS76 0428 FB3D [ GLYN =0 ;If special system for glyn MOS76 0446 FB4B ^57 MOS76 0430 FB3D | MOS76 0446 FB4B ^57 MOS76 0431 FB3D A9 06 LDAIM GAP ;Set SAVE gap -> unchangeable MOS76 0446 FB4B ^57 MOS76 0432 FB3F ] MOS76 0446 FB4B ^57 MOS76 0433 FB3F 85 C7 GAPOUT STA GAPTIM MOS76 0446 FB4B ^57 MOS76 0434 FB41 ; MOS76 0446 FB4B ^57 MOS76 0435 FB41 ; fall thru into CLAIM MOS76 0446 FB4B ^57 MOS76 0436 FB41 ; MOS76 0446 FB4B ^57 MOS76 0437 FB41 CLAIM MOS76 0446 FB4B ^57 MOS76 0438 FB41 ; Claim RS423 h/w interface MOS76 0446 FB4B ^57 MOS76 0439 FB41 ; Called by CFS MOS76 0446 FB4B ^57 MOS76 0440 FB41 58 CLI MOS76 0446 FB4B ^57 MOS76 0441 FB42 08 PHP MOS76 0446 FB4B ^57 MOS76 0442 FB43 78 SEI MOS76 0446 FB4B ^57 MOS76 0443 FB44 2C 4F 02 BIT RSFLAG MOS76 0446 FB4B ^57 MOS76 0444 FB47 10 DB BPL RSWT1 ;[RS423 busy] MOS76 0446 FB4B ^57 MOS76 0445 FB49 A5 EA LDA RSTUT MOS76 0446 FB4B ^57 MOS76 0446 FB4B 30 D7 BMI RSWT1 ;[RS423 dormant, but still timing out] -- MOS76 0447 FB4D ; RS423 dormant and timed out OR claimed => RS423 available -- MOS76 0448 FB4D ; RSTUT>=0 -- MOS76 0449 FB4D ; headline: 'CFS Claims RS423' -- MOS76 0450 FB4D A9 01 LDAIM &01 ;allow for many call claims -- MOS76 0451 FB4F 85 EA STA RSTUT ;RSTUT := 1 -- MOS76 0452 FB51 -- MOS76 0453 FB51 [ &00=0 -- MOS76 0454 FB51 20 56 FB JSR CRESET -- MOS76 0455 FB54 28 PLP -- MOS76 0456 FB55 60 RTS -- MOS76 0457 FB56 | -- MOS76 0460 FB56 ] -- MOS76 0461 FB56 -- MOS76 0462 FB56 -- MOS76 0463 FB56 A9 03 CRESET LDAIM &03 -- MOS76 0464 FB58 D0 1B BNE SETCHP MOS76 0464 FB58 v64 MOS76 0465 FB5A MOS76 0464 FB58 v64 MOS76 0466 FB5A MOS76 0464 FB58 v64 MOS76 0467 FB5A TXINIT MOS76 0464 FB58 v64 MOS76 0468 FB5A A9 30 LDAIM TXSTAT MOS76 0464 FB58 v64 MOS76 0469 FB5C 85 CA STA TXFLAG MOS76 0464 FB58 v64 MOS76 0470 FB5E D0 13 BNE CHPINT MOS76 0464 FB58 v64 MOS76 0471 FB60 MOS76 0464 FB58 v64 MOS76 0472 FB60 A9 05 RXINIT LDAIM SEROFF MOS76 0464 FB58 v64 MOS76 0473 FB62 MOS76 0464 FB58 v64 MOS76 0474 FB62 ;Switch motor off without going through OS MOS76 0464 FB58 v64 MOS76 0475 FB62 ;coz don't want user to be bothered with each MOS76 0464 FB58 v64 MOS76 0476 FB62 ;motor blip MOS76 0464 FB58 v64 MOS76 0477 FB62 MOS76 0464 FB58 v64 MOS76 0478 FB62 8D 10 FE STA SERPRC MOS76 0464 FB58 v64 MOS76 0479 FB65 MOS76 0464 FB58 v64 MOS76 0480 FB65 A2 FF LDXIM &FF ;250 * 2.5 usecs = 1 millisec MOS76 0464 FB58 v64 MOS76 0481 FB67 CA RXINL1 DEX MOS76 0464 FB58 v64 MOS76 0482 FB68 D0 FD BNE RXINL1 MOS76 0464 FB58 v64 MOS76 0483 FB6A 86 CA STX TXFLAG MOS76 0464 FB58 v64 MOS76 0484 FB6C MOS76 0464 FB58 v64 MOS76 0485 FB6C A9 85 LDAIM SERON MOS76 0464 FB58 v64 MOS76 0486 FB6E 8D 10 FE STA SERPRC ;Motor on again MOS76 0464 FB58 v64 MOS76 0487 FB71 MOS76 0464 FB58 v64 MOS76 0488 FB71 A9 D0 LDAIM RXSTAT MOS76 0464 FB58 v64 MOS76 0489 FB73 05 C6 CHPINT ORA SPEED ;Put in bottom bit, set in INIT from MOS MOS76 0464 FB58 v64 MOS76 0490 FB75 8D 08 FE SETCHP STA STATUS -- MOS76 0491 FB78 60 RTS -- MOS76 0492 FB79 -- MOS76 0493 FB79 -- MOS76 0494 FB79 AE C6 03 NXTBLK LDX INFO +BKNOLO -- MOS76 0495 FB7C AC C7 03 LDY INFO +BKNOHI -- MOS76 0496 FB7F E8 INX -- MOS76 0497 FB80 86 B4 STX BLOKNO -- MOS76 0498 FB82 D0 01 BNE NXTBLX MOS76 MOS76 MOS76 MOS76 Acorn macro assembler Page 147 MOS76 C.F.S. - I/O Utilities -> MOS76 MOS76 MOS76 0498 FB82 v7E MOS76 0499 FB84 C8 INY MOS76 0498 FB82 v7E MOS76 0500 FB85 84 B5 NXTBLX STY BLOKNO +&01 -- MOS76 0501 FB87 60 RTS -- MOS76 0502 FB88 -- MOS76 0503 FB88 A0 00 SETJOB LDYIM &00 -- MOS76 0504 FB8A 84 C0 STY IFLAG -- MOS76 0505 FB8C [ MOS125 = &FF -- MOS76 0507 FB8C | -- MOS76 0508 FB8C A0 00 SETJB1 LDYIM &00 -- MOS76 0509 FB8E 84 BE STY CHKSUM -- MOS76 0510 FB90 ] -- MOS76 0511 FB90 84 BF STY CHKSUM +&01 -- MOS76 0512 FB92 60 RTS -- MOS76 0513 FB93 -- MOS76 0514 FB93 -- MOS76 0515 FB93 A0 FF MOVFN LDYIM &FF -- MOS76 0516 FB95 C8 MOVFNL INY MOS76 0520 FB9D ^76 MOS76 0517 FB96 E8 INX MOS76 0520 FB9D ^76 MOS76 0518 FB97 BD 00 03 LDAAX VARPGE MOS76 0520 FB9D ^76 MOS76 0519 FB9A 99 D2 03 STAAY FILNAM MOS76 0520 FB9D ^76 MOS76 0520 FB9D D0 F6 BNE MOVFNL -- MOS76 0521 FB9F 60 RTS -- MOS76 0522 FBA0 -- MOS76 0523 FBA0 -- MOS76 0524 FBA0 A0 00 MOTONW LDYIM WRITFX ;Motor on for output -- MOS76 0525 FBA2 58 MOTON CLI ;Ensure can talk to tape -- MOS76 0526 FBA3 A2 01 LDXIM &01 ;Motor on -- MOS76 0527 FBA5 84 C3 STY CURDRV ;Store current drive -- MOS76 0528 FBA7 A9 89 CMOTOR LDAIM FXMOTR ;=> motor function -- MOS76 0529 FBA9 -- MOS76 0530 FBA9 ;Load drive number into Y, so switching motor -- MOS76 0531 FBA9 ;off is always done with the drive most recently -- MOS76 0532 FBA9 ;switched on (seems logical). -- MOS76 0533 FBA9 -- MOS76 0534 FBA9 A4 C3 LDY CURDRV -- MOS76 0535 FBAB 4C F4 FF JMP OSBYTE -- MOS76 0536 FBAE -- MOS76 0537 FBAE [ MOS125 = &FF -- MOS76 0561 FBAE ] -- MOS76 0562 FBAE -- MOS76 0563 FBAE -- MOS76 0564 FBAE -- MOS76 0565 FBAE TWINIT -- MOS76 0566 FBAE A9 01 LDAIM TUBEW ;Write init. for tube -- MOS76 0567 FBB0 TBINIT -- MOS76 0568 FBB0 ;Check the address at BKADDR is accross tube -- MOS76 0569 FBB0 ;and that tube is present. If so, claim tube, and call -- MOS76 0570 FBB0 ;address routine with value origionally in A on entry. -- MOS76 0571 FBB0 -- MOS76 0572 FBB0 20 C6 FB JSR TUBCHK ;Check address + tube present. -- MOS76 0573 FBB3 F0 3C BEQ TINIT0 ;Don't tube. (NOTE TAX done in TUBCHK) MOS76 0573 FBB3 v43 MOS76 0574 FBB5 8A TXA ;Restore tube reason code MOS76 0573 FBB3 v43 MOS76 0575 FBB6 A2 B0 LDXIM BKADDR MOS76 0573 FBB3 v43 MOS76 0576 FBB8 A0 00 LDYIM /(BKADDR ) ;Address for tube routine MOS76 0573 FBB3 v43 MOS76 0577 FBBA 48 TBINT1 PHA ;Entry from RUN with non-BKADDR address MOS76 0573 FBB3 v43 MOS76 0578 FBBB A9 C0 LDAIM TUBECL ;"Claim" reason code MOS76 0573 FBB3 v43 MOS76 0579 FBBD 20 06 04 TUBELP JSR TBADDR ;Attempt claim MOS76 0573 FBB3 v43 MOS76 0580 FBC0 90 FB BCC TUBELP ;Continue to try and claim MOS76 0573 FBB3 v43 MOS76 0581 FBC2 68 PLA ;Restore address reason code MOS76 0573 FBB3 v43 MOS76 0582 FBC3 4C 06 04 JMP TBADDR MOS76 0573 FBB3 v43 MOS76 0583 FBC6 MOS76 0573 FBB3 v43 MOS76 0584 FBC6 MOS76 0573 FBB3 v43 MOS76 0585 FBC6 MOS76 0573 FBB3 v43 MOS76 0586 FBC6 AA TUBCHK TAX ;Store A MOS76 0573 FBB3 v43 MOS76 0587 FBC7 A5 B2 LDA BKADDR +&02 MOS76 0573 FBB3 v43 MOS76 0588 FBC9 25 B3 AND BKADDR +&03 MOS76 0573 FBB3 v43 MOS76 0589 FBCB C9 FF CMPIM &FF ;If $FF, address is IO proc., so exit MOS76 0573 FBB3 v43 MOS76 0590 FBCD F0 05 BEQ TUBCHX MOS76 0573 FBB3 v43 MOS76 0591 FBCF AD 7A 02 LDA TUBE MOS76 0573 FBB3 v43 MOS76 0592 FBD2 29 80 ANDIM &80 ;Returns NZ if tube present, EQ if not MOS76 0573 FBB3 v43 MOS76 0593 FBD4 60 TUBCHX RTS MOS76 0573 FBB3 v43 MOS76 0594 FBD5 MOS76 0573 FBB3 v43 MOS76 0595 FBD5 MOS76 0573 FBB3 v43 MOS76 0596 FBD5 MOS76 0573 FBB3 v43 MOS76 0597 FBD5 BUGFIX MOS76 0573 FBB3 v43 MOS76 0598 FBD5 MOS76 0573 FBB3 v43 MOS76 0599 FBD5 ;When the 6850 counter divide bits are reset, it MOS76 0573 FBB3 v43 MOS76 0600 FBD5 ;is possible for the SERPROC to get out of synch. MOS76 0573 FBB3 v43 MOS76 0601 FBD5 ;for a few bits. This has the effect of corrupting MOS76 0573 FBB3 v43 MOS76 0602 FBD5 ;the first character of the first block of a SAVE, MOS76 0573 FBB3 v43 MOS76 0603 FBD5 ;or the first character of ANY block during sequential MOS76 0573 FBB3 v43 MOS76 0604 FBD5 ;access (since the 6850 is reset for every block MOS76 0573 FBB3 v43 MOS76 0605 FBD5 ;during putbytes). MOS76 0573 FBB3 v43 MOS76 0606 FBD5 ; The cure is to write a dummy byte to tape at the MOS76 0573 FBB3 v43 MOS76 0607 FBD5 ;start of a SAVE, and at the start of every block MOS76 0573 FBB3 v43 MOS76 0608 FBD5 ;during putbytes. This must be done by polling, MOS76 0573 FBB3 v43 MOS76 0609 FBD5 ;since there must be a period of high-tone after MOS76 0573 FBB3 v43 MOS76 0610 FBD5 ;the dummy byte, which is difficult to accomplish MOS76 0573 FBB3 v43 MOS76 0611 FBD5 ;if the 6850 is interrupting all the time. MOS76 0573 FBB3 v43 MOS76 0612 FBD5 ; BUGFIX is thus called after the SERPROC is set MOS76 0573 FBB3 v43 MOS76 0613 FBD5 ;and before the 6850 is set to interrupt during MOS76 0573 FBB3 v43 MOS76 0614 FBD5 ;a block write operation. MOS76 0573 FBB3 v43 MOS76 0615 FBD5 MOS76 0573 FBB3 v43 MOS76 0616 FBD5 A9 85 LDAIM SERON MOS76 0573 FBB3 v43 MOS76 0617 FBD7 8D 10 FE STA SERPRC ;Set SERPROC on MOS76 0573 FBB3 v43 MOS76 0618 FBDA 20 56 FB JSR CRESET ;Reset 6850 to be on safe side MOS76 0573 FBB3 v43 MOS76 0619 FBDD A9 10 LDAIM &10 MOS76 0573 FBB3 v43 MOS76 0620 FBDF 20 73 FB JSR CHPINT ;Set 6850 at appropriate clock rate MOS76 0573 FBB3 v43 MOS76 0621 FBE2 MOS76 0573 FBB3 v43 MOS76 0622 FBE2 20 A7 F9 BUGLP JSR ESCAPE MOS76 0573 FBB3 v43 MOS76 0623 FBE5 AD 08 FE LDA STATUS MOS76 0573 FBB3 v43 MOS76 0624 FBE8 29 02 ANDIM &02 ;Ready to TX ? MOS76 0573 FBB3 v43 MOS76 0625 FBEA F0 F6 BEQ BUGLP ;Nope -> loop MOS76 0573 FBB3 v43 MOS76 0626 FBEC A9 AA LDAIM &AA MOS76 0573 FBB3 v43 MOS76 0627 FBEE 8D 09 FE STA PORT ;Shove out the dummy byte MOS76 0573 FBB3 v43 MOS76 0628 FBF1 CHKHXX MOS76 0573 FBB3 v43 MOS76 0629 FBF1 TINIT0 MOS76 0573 FBB3 v43 MOS76 0630 FBF1 60 RTS -- MOS76 0631 FBF2 -- MOS76 0632 FBF2 [ MOS125 = &FF -- MOS76 0633 FBF2 | -- MOS76 0634 FBF2 ;FSC jump table moved to end of main section. -- MOS76 0635 FBF2 ;This displaces the free space into the middle -- MOS76 0636 FBF2 ;of the ROM where it can be used for any purpose -- MOS76 0637 FBF2 ;(an opcode or branch address at &FBFF would cause -- MOS76 0638 FBF2 ;a dummy read cycle in FRED.) -- MOS76 0639 FBF2 -- MOS76 0640 FBF2 JMPTAB -- MOS76 0641 FBF2 B2 = CFSOPT-&01 -- MOS76 0642 FBF3 6E = CFSEOF-&01 -- MOS76 0643 FBF4 F4 = RUN-&01 ;"*." MOS76 MOS76 MOS76 MOS76 Acorn macro assembler Page 148 MOS76 C.F.S. - I/O Utilities -> MOS76 MOS76 -- MOS76 0644 FBF5 49 = MBDCMD-&01 ;"*" = Bad command -- MOS76 0645 FBF6 F4 = RUN-&01 ;"*RUN " -- MOS76 0646 FBF7 33 = CAT-&01 -- MOS76 0647 FBF8 C5 = SHUTES-&01 ;die -- MOS76 0648 FBF9 0007 NOTAB * .-JMPTAB -- MOS76 0649 FBF9 F5 = /(CFSOPT-&01) -- MOS76 0650 FBFA F6 = /(CFSEOF-&01) -- MOS76 0651 FBFB F2 = /(RUN-&01) -- MOS76 0652 FBFC E4 = /(MBDCMD-&01) -- MOS76 0653 FBFD F2 = /(RUN-&01) -- MOS76 0654 FBFE F3 = /(CAT-&01) -- MOS76 0655 FBFF E3 = /(SHUTES-&01) -- MOS76 0656 FC00 -- MOS76 0657 FC00 ;MOS 1.25: Adjust padding in MOS38 to hit &FC00 here -- MOS76 0658 FC00 ] -- MOS76 0659 FC00 -- MOS76 0660 FC00 END -- MOS76 0661 FC00 -- MOS76 0662 FC00 [ $Tutu -- MOS76 0664 FC00 ] -- MOS76 0665 FC00 -- MOS76 0666 FC00 ; pad with zero bytes to ensure ROM CRCs consistent -- MOS76 0667 FC00 00 00 00 % &100 -- MOS76 0668 FD00 -- MOS76 0669 FD00 [ . > &FC00+&100 -- MOS76 0671 FD00 ] -- MOS76 0672 FD00 -- MOS76 0673 FD00 < 1 -- MOS76 0674 FD00 -- MOS76 0675 FD00 LNK MOS99 -- MOS99 0001 FD00 ; MOS99 -- MOS99 0002 FD00 TTL MOS99 Operating system ROM entry points and hardware vectors -- MOS99 0003 FD00 OPT MOS99 MOS99 MOS99 MOS99 MOS99 Acorn macro assembler Page 149 MOS99 MOS99 Operating system ROM entry points and hardware vectors MOS99 -- MOS99 0004 FD00 -- MOS99 0005 FD00 ;(c) 1981 ACORN Computers Limited -- MOS99 0006 FD00 ;BBC Microcomputer Machine Operating System (MOS) -- MOS99 0007 FD00 -- MOS99 0008 FD00 ;Change record: -- MOS99 0009 FD00 -- MOS99 0010 FD00 ;Author(s): -- MOS99 0011 FD00 ;PB Paul Bond -- MOS99 0012 FD00 -- MOS99 0013 FD00 ORG &FC00 -- MOS99 0014 FC00 -- MOS99 0015 FC00 28 43 29 = "(C) 1981 Acorn Computers Ltd." -- MOS99 0016 FC1D 54 68 61 = "Thanks are due to the following contributors to the development of the BBC Computer " -- MOS99 0017 FC71 28 61 6D = "(among others too numerous to mention):- " -- MOS99 0018 FC9A 44 61 76 = "David Allen," -- MOS99 0019 FCA6 42 6F 62 = "Bob Austin," -- MOS99 0020 FCB1 52 61 6D = "Ram Banerjee," -- MOS99 0021 FCBE 50 61 75 = "Paul Bond," -- MOS99 0022 FCC8 41 6C 6C = "Allen Boothroyd," -- MOS99 0023 FCD8 43 61 6D = "Cambridge," -- MOS99 0024 FCE2 43 6C 65 = "Cleartone," -- MOS99 0025 FCEC 4A 6F 68 = "John Coll," -- MOS99 0026 FCF6 4A 6F 68 = "John Cox," -- MOS99 0027 FCFF 41 6E 64 = "Andy Cripps," -- MOS99 0028 FD0B 43 68 72 = "Chris Curry," -- MOS99 0029 FD17 36 35 30 = "6502 designers," -- MOS99 0030 FD26 4A 65 72 = "Jeremy Dion," -- MOS99 0031 FD32 54 69 6D = "Tim Dobson," -- MOS99 0032 FD3D 4A 6F 65 = "Joe Dunn," -- MOS99 0033 FD46 50 61 75 = "Paul Farrell," -- MOS99 0034 FD53 46 65 72 = "Ferranti," -- MOS99 0035 FD5C 53 74 65 = "Steve Furber," -- MOS99 0036 FD69 4A 6F 6E = "Jon Gibbons," -- MOS99 0037 FD75 41 6E 64 = "Andrew Gordon," -- MOS99 0038 FD83 4C 61 77 = "Lawrence Hardwick," -- MOS99 0039 FD95 44 79 6C = "Dylan Harris," -- MOS99 0040 FDA2 48 65 72 = "Hermann Hauser," -- MOS99 0041 FDB1 48 69 74 = "Hitachi," -- MOS99 0042 FDB9 41 6E 64 = "Andy Hopper," -- MOS99 0043 FDC5 49 43 4C = "ICL," -- MOS99 0044 FDC9 4D 61 72 = "Martin Jackson," -- MOS99 0045 FDD8 42 72 69 = "Brian Jones," -- MOS99 0046 FDE4 43 68 72 = "Chris Jordan," -- MOS99 0047 FDF1 44 61 76 = "David King," -- MOS99 0048 FDFC 44 61 76 = "David Kitson," -- MOS99 0049 FE09 50 61 75 = "Paul Kriwaczek," -- MOS99 0050 FE18 43 6F 6D = "Computer Laboratory," -- MOS99 0051 FE2C 50 65 74 = "Peter Miller," -- MOS99 0052 FE39 41 72 74 = "Arthur Norman," -- MOS99 0053 FE47 47 6C 79 = "Glyn Phillips," -- MOS99 0054 FE55 4D 69 6B = "Mike Prees," -- MOS99 0055 FE60 4A 6F 68 = "John Radcliffe," -- MOS99 0056 FE6F 57 69 6C = "Wilberforce Road," -- MOS99 0057 FE80 50 65 74 = "Peter Robinson," -- MOS99 0058 FE8F 52 69 63 = "Richard Russell," -- MOS99 0059 FE9F 4B 69 6D = "Kim Spence-Jones," -- MOS99 0060 FEB0 47 72 61 = "Graham Tebby," -- MOS99 0061 FEBD 4A 6F 6E = "Jon Thackray," -- MOS99 0062 FECA 43 68 72 = "Chris Turner," -- MOS99 0063 FED7 41 64 72 = "Adrian Warner," -- MOS99 0064 FEE5 52 6F 67 = "Roger Wilson," -- MOS99 0065 FEF2 41 6C 61 = "Alan Wright." -- MOS99 0066 FEFE ; -- MOS99 0067 FEFE ; test ROM indirection -- MOS99 0068 FEFE 6B = MRESET -- MOS99 0069 FEFF D9 = /(MRESET ) -- MOS99 0070 FF00 -- MOS99 0071 FF00 ; ORG $FF00 -- MOS99 0072 FF00 ; Page $FF contains code which has to be located at a fixed -- MOS99 0073 FF00 ; place in memory. Two main types of code come into this -- MOS99 0074 FF00 ; category: -- MOS99 0075 FF00 ; (a) Code to call a routine located in a paged ROM -- MOS99 0076 FF00 ; (b) Fixed OS calls -- MOS99 0077 FF00 -- MOS99 0078 FF00 ; Calls to the operating system are normally made by calling -- MOS99 0079 FF00 ; JMIs located at the top of the address space of the m/c. -- MOS99 0080 FF00 ; The indirection vectors are located in page 2 starting at -- MOS99 0081 FF00 ; $0200. To redirect an OS call which indirects thru location -- MOS99 0082 FF00 ; $0200+2*x: -- MOS99 0083 FF00 ; (a) Set up a 3-byte tuple at location ROMVEC+3*x to refer -- MOS99 0084 FF00 ; to the paged ROM entry point -- MOS99 0085 FF00 ; (b) Set the OS indirection at location $0200+2*x to value -- MOS99 0086 FF00 ; $FF00+3*x -- MOS99 0087 FF00 ; A JMI $0200+2*x will then result in the routine in paged ROM -- MOS99 0088 FF00 ; being called. The routine is entered with A, X, Y and P -- MOS99 0089 FF00 ; unaltered since the point of call. Similarly, no registers -- MOS99 0090 FF00 ; are corrupted on return from the routine. -- MOS99 0091 FF00 ; -- MOS99 0092 FF00 ; Locations $FF00 onwards contain JSRs to the same location (OSROM); -- MOS99 0093 FF00 ; thus when OSROM is entered the top entry on the stack determines -- MOS99 0094 FF00 ; which JSR OSROM was called, enabling the OS call made to be -- MOS99 0095 FF00 ; identified (by convention paged ROM routed indirections thru -- MOS99 0096 FF00 ; $0200+2*x jump to location $FF00+3*x). -- MOS99 0097 FF00 -- MOS99 0098 FF00 ROMUSR -- MOS99 0099 FF00 20 92 FF JSR OSROM -- MOS99 0100 FF03 -- MOS99 0101 FF03 ROMBRK -- MOS99 0102 FF03 20 92 FF JSR OSROM -- MOS99 0103 FF06 -- MOS99 0104 FF06 ROMIRA -- MOS99 0105 FF06 20 92 FF JSR OSROM -- MOS99 0106 FF09 -- MOS99 0107 FF09 ROMIRB -- MOS99 0108 FF09 20 92 FF JSR OSROM -- MOS99 0109 FF0C -- MOS99 0110 FF0C ROMCOM -- MOS99 0111 FF0C 20 92 FF JSR OSROM -- MOS99 0112 FF0F -- MOS99 0113 FF0F ROMBYT -- MOS99 0114 FF0F 20 92 FF JSR OSROM -- MOS99 0115 FF12 -- MOS99 0116 FF12 ROMWRD -- MOS99 0117 FF12 20 92 FF JSR OSROM -- MOS99 0118 FF15 -- MOS99 0119 FF15 ROMWRC -- MOS99 0120 FF15 20 92 FF JSR OSROM -- MOS99 0121 FF18 -- MOS99 0122 FF18 ROMRDC -- MOS99 0123 FF18 20 92 FF JSR OSROM -- MOS99 0124 FF1B MOS99 MOS99 MOS99 MOS99 Acorn macro assembler Page 150 MOS99 MOS99 Operating system ROM entry points and hardware vectors MOS99 -- MOS99 0125 FF1B ROMFIL -- MOS99 0126 FF1B 20 92 FF JSR OSROM -- MOS99 0127 FF1E -- MOS99 0128 FF1E ROMARG -- MOS99 0129 FF1E 20 92 FF JSR OSROM -- MOS99 0130 FF21 -- MOS99 0131 FF21 ROMBGT -- MOS99 0132 FF21 20 92 FF JSR OSROM -- MOS99 0133 FF24 -- MOS99 0134 FF24 ROMBPT -- MOS99 0135 FF24 20 92 FF JSR OSROM -- MOS99 0136 FF27 -- MOS99 0137 FF27 ROMGPB -- MOS99 0138 FF27 20 92 FF JSR OSROM -- MOS99 0139 FF2A -- MOS99 0140 FF2A ROMFND -- MOS99 0141 FF2A 20 92 FF JSR OSROM -- MOS99 0142 FF2D -- MOS99 0143 FF2D ROMFSC -- MOS99 0144 FF2D 20 92 FF JSR OSROM -- MOS99 0145 FF30 -- MOS99 0146 FF30 ROMEVT -- MOS99 0147 FF30 20 92 FF JSR OSROM -- MOS99 0148 FF33 -- MOS99 0149 FF33 ROMUPT -- MOS99 0150 FF33 20 92 FF JSR OSROM -- MOS99 0151 FF36 -- MOS99 0152 FF36 ROMNET -- MOS99 0153 FF36 20 92 FF JSR OSROM -- MOS99 0154 FF39 -- MOS99 0155 FF39 ROMVDU -- MOS99 0156 FF39 20 92 FF JSR OSROM -- MOS99 0157 FF3C -- MOS99 0158 FF3C ROMKEY -- MOS99 0159 FF3C 20 92 FF JSR OSROM -- MOS99 0160 FF3F -- MOS99 0161 FF3F ROMINS -- MOS99 0162 FF3F 20 92 FF JSR OSROM -- MOS99 0163 FF42 -- MOS99 0164 FF42 ROMREM -- MOS99 0165 FF42 20 92 FF JSR OSROM -- MOS99 0166 FF45 -- MOS99 0167 FF45 ROMCNP -- MOS99 0168 FF45 20 92 FF JSR OSROM -- MOS99 0169 FF48 -- MOS99 0170 FF48 20 92 FF JSR OSROM -- MOS99 0171 FF4B -- MOS99 0172 FF4B 20 92 FF JSR OSROM -- MOS99 0173 FF4E -- MOS99 0174 FF4E 20 92 FF JSR OSROM -- MOS99 0175 FF51 -- MOS99 0176 FF51 [ MOS125 = &FF -- MOS99 0276 FF51 ] -- MOS99 0277 FF51 -- MOS99 0278 FF51 [ MOS125 = &7F -- MOS99 0279 FF51 [ STARGO = &00 -- MOS99 0280 FF51 00 % 1 ;1 byte padding -- MOS99 0281 FF52 -- MOS99 0282 FF52 ARGSW -- MOS99 0283 FF52 C9 01 CMPIM &01 -- MOS99 0284 FF54 D0 0D BNE UPARGS MOS99 0284 FF54 v72 MOS99 0285 FF56 C0 00 CPYIM &00 MOS99 0284 FF54 v72 MOS99 0286 FF58 D0 09 BNE UPARGS MOS99 0284 FF54 v72 MOS99 0287 FF5A AC D1 02 LDY TAILHI ;OSARGS A=1, Y=0 return command line tail MOS99 0284 FF54 v72 MOS99 0288 FF5D F0 04 BEQ UPARGS ;return *GO/CFS pointer if valid MOS99 0284 FF54 v72 MOS99 0289 FF5F 88 DEY MOS99 0284 FF54 v72 MOS99 0290 FF60 4C CB DF JMP RETAIL MOS99 0284 FF54 v72 MOS99 0291 FF63 UPARGS ;call upstream OSARGS MOS99 0284 FF54 v72 MOS99 0292 FF63 6C 14 02 JMI ARGVEC -- MOS99 0293 FF66 | -- MOS99 0295 FF66 ] -- MOS99 0296 FF66 FXBPUT ;FX entry, C=1 -- MOS99 0297 FF66 8A TXA ;A = character -- MOS99 0298 FF67 B0 6B BCS OSBPUT ;[ALWAYS jump] MOS99 0298 FF67 v14 MOS99 0299 FF69 ] MOS99 0298 FF67 v14 MOS99 0300 FF69 MOS99 0298 FF67 v14 MOS99 0301 FF69 [ MOS125 = &00 MOS99 0298 FF67 v14 MOS99 0303 FF69 ] MOS99 0298 FF67 v14 MOS99 0304 FF69 MOS99 0298 FF67 v14 MOS99 0305 FF69 [ MOS125 = &FF MOS99 0298 FF67 v14 MOS99 0306 FF69 | MOS99 0298 FF67 v14 MOS99 0307 FF69 48 FUDGE PHA MOS99 0298 FF67 v14 MOS99 0308 FF6A 48 PHA MOS99 0298 FF67 v14 MOS99 0309 FF6B 08 PHP MOS99 0298 FF67 v14 MOS99 0310 FF6C 48 PHA MOS99 0298 FF67 v14 MOS99 0311 FF6D 8A TXA MOS99 0298 FF67 v14 MOS99 0312 FF6E 48 PHA MOS99 0298 FF67 v14 MOS99 0313 FF6F 98 TYA MOS99 0298 FF67 v14 MOS99 0314 FF70 48 PHA MOS99 0298 FF67 v14 MOS99 0315 FF71 BA TSX ;y x a p a a 88 FF el eh cl ch MOS99 0298 FF67 v14 MOS99 0316 FF72 BC 09 01 LDYAX &0109 ;get vector offset+2 MOS99 0298 FF67 v14 MOS99 0317 FF75 B9 9D 0D LDAAY ROMVEC-&02+&00 MOS99 0298 FF67 v14 MOS99 0318 FF78 9D 05 01 STAAX &0105 ;copy LSB vector over placeholder MOS99 0298 FF67 v14 MOS99 0319 FF7B B9 9E 0D LDAAY ROMVEC-&02+&01 MOS99 0298 FF67 v14 MOS99 0320 FF7E 9D 06 01 STAAX &0106 ;copy MSB vector over placeholder MOS99 0298 FF67 v14 MOS99 0321 FF81 A5 F4 LDA ROMID ;copy ROM slot over MSB vector offset MOS99 0298 FF67 v14 MOS99 0322 FF83 9D 0A 01 STAAX &010A ;y x a p vl vh 88 FF el r cl ch MOS99 0298 FF67 v14 MOS99 0323 FF86 68 PLA ;Y in A ready to restore MOS99 0298 FF67 v14 MOS99 0324 FF87 BE 9F 0D LDXAY ROMVEC-&02+&02 ;get vector ROM slot MOS99 0298 FF67 v14 MOS99 0325 FF8A A8 TAY ;restore Y MOS99 0298 FF67 v14 MOS99 0326 FF8B 68 PLA ;X in A ready to restore MOS99 0298 FF67 v14 MOS99 0327 FF8C 20 E7 DB JSR STXROM ;set destination ROM slot MOS99 0298 FF67 v14 MOS99 0328 FF8F AA TAX ;restore X MOS99 0298 FF67 v14 MOS99 0329 FF90 68 PLA ;restore A MOS99 0298 FF67 v14 MOS99 0330 FF91 40 RTI ;restore P and jump to vector MOS99 0298 FF67 v14 MOS99 0331 FF92 MOS99 0298 FF67 v14 MOS99 0332 FF92 20 69 FF OSROM JSR FUDGE ;push restore address on stack, RTS returns below MOS99 0298 FF67 v14 MOS99 0333 FF95 ;routine to restore ROM slot from indirection MOS99 0298 FF67 v14 MOS99 0334 FF95 08 PHP MOS99 0298 FF67 v14 MOS99 0335 FF96 48 PHA MOS99 0298 FF67 v14 MOS99 0336 FF97 8A TXA MOS99 0298 FF67 v14 MOS99 0337 FF98 48 PHA MOS99 0298 FF67 v14 MOS99 0338 FF99 BA TSX ;x a p el r cl ch MOS99 0298 FF67 v14 MOS99 0339 FF9A BD 05 01 LDAAX &0105 MOS99 0298 FF67 v14 MOS99 0340 FF9D 85 F4 STA ROMID MOS99 0298 FF67 v14 MOS99 0341 FF9F 8D 30 FE STA ROM ;restore ROM slot MOS99 0298 FF67 v14 MOS99 0342 FFA2 BD 03 01 LDAAX &0103 MOS99 0298 FF67 v14 MOS99 0343 FFA5 9D 04 01 STAAX &0104 MOS99 0298 FF67 v14 MOS99 0344 FFA8 9D 05 01 STAAX &0105 ;copy status over vec offset and ROM slot MOS99 0298 FF67 v14 MOS99 0345 FFAB 68 PLA MOS99 0298 FF67 v14 MOS99 0346 FFAC AA TAX ;restore X MOS99 MOS99 MOS99 MOS99 Acorn macro assembler Page 151 MOS99 MOS99 Operating system ROM entry points and hardware vectors MOS99 MOS99 0298 FF67 v14 MOS99 0347 FFAD 68 PLA ;restore A MOS99 0298 FF67 v14 MOS99 0348 FFAE 28 PLP MOS99 0298 FF67 v14 MOS99 0349 FFAF 28 PLP MOS99 0298 FF67 v14 MOS99 0350 FFB0 28 PLP ;restore status (and discard 2 copies) MOS99 0298 FF67 v14 MOS99 0351 FFB1 VINUSE ;target of vectors in use by a client waiting for a server MOS99 0298 FF67 v14 MOS99 0352 FFB1 EA NOP MOS99 0298 FF67 v14 MOS99 0353 FFB2 DEFEVT ;default EVENT routine MOS99 0298 FF67 v14 MOS99 0354 FFB2 DEFUPT ;default user print routine (simulate printer busy) MOS99 0298 FF67 v14 MOS99 0355 FFB2 DEFNET ;default net routine (simulate printer busy) MOS99 0298 FF67 v14 MOS99 0356 FFB2 RTS MOS99 0298 FF67 v14 MOS99 0357 FFB2 60 RTS MOS99 0298 FF67 v14 MOS99 0358 FFB3 ] MOS99 0298 FF67 v14 MOS99 0359 FFB3 MOS99 0298 FF67 v14 MOS99 0360 FFB3 [ MOS125 = &7F MOS99 0298 FF67 v14 MOS99 0361 FFB3 ;FXBPUT gives up its place to OSWRSC MOS99 0298 FF67 v14 MOS99 0362 FFB3 ;to keep VINUSE and RTS in the same place MOS99 0298 FF67 v14 MOS99 0363 FFB3 | MOS99 0298 FF67 v14 MOS99 0367 FFB3 ] MOS99 0298 FF67 v14 MOS99 0368 FFB3 MOS99 0298 FF67 v14 MOS99 0369 FFB3 [ MOS125 = &FF MOS99 0298 FF67 v14 MOS99 0381 FFB3 ] MOS99 0298 FF67 v14 MOS99 0382 FFB3 MOS99 0298 FF67 v14 MOS99 0383 FFB3 [ MOS125 = &7F MOS99 0298 FF67 v14 MOS99 0384 FFB3 4C 3E D1 OSWRSC JMP WRSC MOS99 0298 FF67 v14 MOS99 0385 FFB6 ] MOS99 0298 FF67 v14 MOS99 0386 FFB6 MOS99 0298 FF67 v14 MOS99 0387 FFB6 ; security copy of indirection data MOS99 0298 FF67 v14 MOS99 0388 FFB6 36 = VLEN MOS99 0298 FF67 v14 MOS99 0389 FFB7 DE = IPAGE2 MOS99 0298 FF67 v14 MOS99 0390 FFB8 D8 = /(IPAGE2 ) MOS99 0298 FF67 v14 MOS99 0391 FFB9 ; MOS99 0298 FF67 v14 MOS99 0392 FFB9 4C DC DB JMP RPROM ;read byte from paged ROM MOS99 0298 FF67 v14 MOS99 0393 FFBC 4C C0 C4 JMP VDU ;raw VDU WRCH (corrupts A, X and Y) MOS99 0298 FF67 v14 MOS99 0394 FFBF 4C 86 E1 JMP EVENT ;signal event MOS99 0298 FF67 v14 MOS99 0395 FFC2 4C 98 EA JMP GSINTS ;used by paged ROMs MOS99 0298 FF67 v14 MOS99 0396 FFC5 4C A9 EA JMP GSREAD ;used by paged ROMs MOS99 0298 FF67 v14 MOS99 0397 FFC8 4C 7D DE JMP RDCH ;used by tube MOS99 0298 FF67 v14 MOS99 0398 FFCB 4C C9 E1 JMP WRCH ;used by tube MOS99 0298 FF67 v14 MOS99 0399 FFCE 6C 1C 02 OSFIND JMI FNDVEC MOS99 0298 FF67 v14 MOS99 0400 FFD1 MOS99 0298 FF67 v14 MOS99 0401 FFD1 6C 1A 02 OSBGPB JMI GPBVEC MOS99 0298 FF67 v14 MOS99 0402 FFD4 6C 18 02 OSBPUT JMI BPTVEC -- MOS99 0403 FFD7 6C 16 02 OSBGET JMI BGTVEC -- MOS99 0404 FFDA [ MOS125 = &7F -- MOS99 0405 FFDA [ STARGO = &00 -- MOS99 0406 FFDA 4C 52 FF OSARGS JMP ARGSW -- MOS99 0407 FFDD | -- MOS99 0409 FFDD ] -- MOS99 0410 FFDD | -- MOS99 0412 FFDD ] -- MOS99 0413 FFDD 6C 12 02 OSFILE JMI FILVEC -- MOS99 0414 FFE0 6C 10 02 OSRDCH JMI RDCVEC -- MOS99 0415 FFE3 C9 0D OSASCI CMPIM MCR -- MOS99 0416 FFE5 D0 07 BNE OSWRCH MOS99 0416 FFE5 v78 MOS99 0417 FFE7 A9 0A OSNEWL LDAIM MLF MOS99 0416 FFE5 v78 MOS99 0418 FFE9 20 EE FF JSR OSWRCH MOS99 0416 FFE5 v78 MOS99 0419 FFEC [ MOS125 = &FF MOS99 0416 FFE5 v78 MOS99 0420 FFEC | MOS99 0416 FFE5 v78 MOS99 0421 FFEC WRCR MOS99 0416 FFE5 v78 MOS99 0422 FFEC ] MOS99 0416 FFE5 v78 MOS99 0423 FFEC A9 0D LDAIM MCR MOS99 0416 FFE5 v78 MOS99 0424 FFEE 6C 0E 02 OSWRCH JMI WRCVEC -- MOS99 0425 FFF1 6C 0C 02 OSWORD JMI WORVEC -- MOS99 0426 FFF4 6C 0A 02 OSBYTE JMI BYTVEC -- MOS99 0427 FFF7 6C 08 02 OSCLI JMI COMVEC -- MOS99 0428 FFFA -- MOS99 0429 FFFA ; hardware vectors -- MOS99 0430 FFFA 00 = NMI ;non-maskable interrupt -- MOS99 0431 FFFB 0D = /(NMI ) -- MOS99 0432 FFFC 6B = MRESET ;hardware reset -- MOS99 0433 FFFD D9 = /(MRESET ) -- MOS99 0434 FFFE ED = IRQ ;interrupt -- MOS99 0435 FFFF DB = /(IRQ ) -- MOS99 0436 0000 ENDROM ;end of ROM -- MOS99 0437 0000 -- MOS99 0438 0000 [ ENDROM=0 -- MOS99 0439 0000 | -- MOS99 0441 0000 ] -- MOS99 0442 0000 -- MOS99 0443 0000 TTL BBC Microcomputer Machine Operating System (MOS) -- MOS99 0444 0000 -- MOS99 0445 0000 OPT OPPON -- MOS99 0446 0000 -- MOS99 0447 0000 END Assembly finished, no errors 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 stargo.asm.txt >stargo-slack.txt -------->8--- #!/usr/bin/perl $base=0xc000; @slack = (0x80) x 0x4001; open(ASM,'<'.shift(@ARGV))or die; while(){ 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(){ 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 stargo-slack.txt